Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f46c179a6a | ||
|
|
d9e1cef279 | ||
|
|
99c9ccf77d | ||
|
|
00959bd8de | ||
|
|
fbae301eec | ||
|
|
81137bf50f | ||
|
|
3995a3e939 | ||
|
|
c211acdb3d | ||
|
|
ea3e492f6a | ||
|
|
960596871e | ||
|
|
9d7e0b54a6 | ||
|
|
812e5734f2 | ||
|
|
cb92f1146c | ||
|
|
cb8172dfcc | ||
|
|
2d75c27a43 | ||
|
|
936711bf2c | ||
|
|
626e7c8f42 | ||
|
|
5ffe6d9201 | ||
|
|
daca48e6ca | ||
|
|
44d8d495e7 | ||
|
|
878ff25dba | ||
|
|
bb42d856cc | ||
|
|
84d4acd791 | ||
|
|
4c47fa5601 | ||
|
|
3ff29ac7c1 | ||
|
|
d256392ad5 | ||
|
|
36afc56fb3 | ||
|
|
3c04687fbf | ||
|
|
61129d6625 | ||
|
|
942ae1d1f9 | ||
|
|
18b32d1892 | ||
|
|
436d57081e | ||
|
|
3ed27deca8 | ||
|
|
6d6cb1e727 | ||
|
|
4a5eca446c | ||
|
|
a0aa148c35 | ||
|
|
818ab0b6f9 | ||
|
|
58cb9bfcf7 | ||
|
|
dedc9a261e | ||
|
|
4302503af3 | ||
|
|
52541b5eca | ||
|
|
983d110233 | ||
|
|
f238d983e9 | ||
|
|
2e22a520db | ||
|
|
059fe35431 | ||
|
|
243b84b4af | ||
|
|
f5a2d63341 | ||
|
|
914db2a695 | ||
|
|
4755c19221 |
@@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
npm-debug.log
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
FROM node:18
|
|
||||||
WORKDIR /usr/src/app
|
|
||||||
COPY package*.json ./
|
|
||||||
RUN npm install
|
|
||||||
COPY . .
|
|
||||||
EXPOSE 8080
|
|
||||||
CMD [ "node", "ljdp.js" ]
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# le journal d'un podcast
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ton journal quoitidien.
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
secret: "P94ZN8XEZjDUy2LLvV7b569QEKGXgp4pepik7Jj9LXbp3qsnz"
|
|
||||||
};
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
const config = require("../config/auth.config");
|
|
||||||
const db = require("../models");
|
|
||||||
const User = db.user;
|
|
||||||
const Role = db.role;
|
|
||||||
|
|
||||||
var jwt = require("jsonwebtoken");
|
|
||||||
var bcrypt = require("bcryptjs");
|
|
||||||
|
|
||||||
exports.signup = (req, res) => {
|
|
||||||
const user = new User({
|
|
||||||
username: req.body.username,
|
|
||||||
email: req.body.email,
|
|
||||||
password: bcrypt.hashSync(req.body.password, 8),
|
|
||||||
active: false,
|
|
||||||
balance: 0,
|
|
||||||
walletid: null
|
|
||||||
});
|
|
||||||
|
|
||||||
user.save((err, user) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.body.roles) {
|
|
||||||
Role.find(
|
|
||||||
{
|
|
||||||
name: { $in: req.body.roles }
|
|
||||||
},
|
|
||||||
(err, roles) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
user.roles = roles.map(role => role._id);
|
|
||||||
user.save(err => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send({ message: "l'utilisateur à été créé avec succès" });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Role.findOne({ name: "user" }, (err, role) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
user.roles = [role._id];
|
|
||||||
user.save(err => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send({ message: "l'utilisateur à été créé avec succès. vous pouvez maintenant vous identifiez" });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.signin = (req, res) => {
|
|
||||||
User.findOne({
|
|
||||||
username: req.body.username
|
|
||||||
})
|
|
||||||
.populate("roles", "-__v")
|
|
||||||
.exec((err, user) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
return res.status(404).send({ message: "rip utilisateur introuvable" });
|
|
||||||
}
|
|
||||||
|
|
||||||
var passwordIsValid = bcrypt.compareSync(
|
|
||||||
req.body.password,
|
|
||||||
user.password
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
if (!passwordIsValid) {
|
|
||||||
return res.status(401).send({
|
|
||||||
accessToken: null,
|
|
||||||
message: "oof! mauvais mot de passe"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user.active) {
|
|
||||||
return res.status(401).send({
|
|
||||||
accessToken: null,
|
|
||||||
message: "oof! ta pas activé ton compte my brother in christ"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var token = jwt.sign({ id: user.id, name: user.username }, config.secret, {
|
|
||||||
expiresIn: 86400 // 24 hours
|
|
||||||
});
|
|
||||||
|
|
||||||
var authorities = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < user.roles.length; i++) {
|
|
||||||
authorities.push("ROLE_" + user.roles[i].name.toUpperCase());
|
|
||||||
}
|
|
||||||
res.status(200).send({
|
|
||||||
id: user._id,
|
|
||||||
username: user.username,
|
|
||||||
email: user.email,
|
|
||||||
roles: authorities,
|
|
||||||
accessToken: token,
|
|
||||||
message: "utilisateur authentifié"
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
exports.allAccess = (req, res) => {
|
|
||||||
res.status(200).send({ message: "ljdp.ca"});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.userBoard = (req, res) => {
|
|
||||||
res.status(200).send({ message: "bienvenue "+req.userName });
|
|
||||||
console.log(req.userId);
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.adminBoard = (req, res) => {
|
|
||||||
res.status(200).send({ message: "admin btw" });
|
|
||||||
};
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
const jwt = require("jsonwebtoken");
|
|
||||||
const config = require("../config/auth.config.js");
|
|
||||||
const db = require("../models");
|
|
||||||
const User = db.user;
|
|
||||||
const Role = db.role;
|
|
||||||
|
|
||||||
verifyToken = (req, res, next) => {
|
|
||||||
let token = req.headers["x-access-token"];
|
|
||||||
|
|
||||||
if (!token) {
|
|
||||||
return res.status(403).send({ message: "token introuvable :*(" });
|
|
||||||
}
|
|
||||||
|
|
||||||
jwt.verify(token, config.secret, (err, decoded) => {
|
|
||||||
if (err) {
|
|
||||||
return res.status(401).send({ message: "non autorisé lol" });
|
|
||||||
}
|
|
||||||
req.userId = decoded.id;
|
|
||||||
req.userName = decoded.name;
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
isAdmin = (req, res, next) => {
|
|
||||||
User.findById(req.userId).exec((err, user) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Role.find(
|
|
||||||
{
|
|
||||||
_id: { $in: user.roles }
|
|
||||||
},
|
|
||||||
(err, roles) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < roles.length; i++) {
|
|
||||||
if (roles[i].name === "admin") {
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res.status(403).send({ message: "yo t'es pas admin :(" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const authJwt = {
|
|
||||||
verifyToken,
|
|
||||||
isAdmin,
|
|
||||||
};
|
|
||||||
module.exports = authJwt;
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
const authJwt = require("./authJwt");
|
|
||||||
const verifySignUp = require("./verifySignUp");
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
authJwt,
|
|
||||||
verifySignUp
|
|
||||||
};
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
const db = require("../models");
|
|
||||||
const dev = require("deep-email-validator");
|
|
||||||
const ROLES = db.ROLES;
|
|
||||||
const User = db.user;
|
|
||||||
|
|
||||||
checkDuplicateUsernameOrEmail = (req, res, next) => {
|
|
||||||
// Username
|
|
||||||
User.findOne({
|
|
||||||
username: req.body.username
|
|
||||||
}).exec((err, user) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
res.status(400).send({ message: "oof! ce nom d'utilisateur est déjà utilisé" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Email
|
|
||||||
User.findOne({
|
|
||||||
email: req.body.email
|
|
||||||
}).exec((err, user) => {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send({ message: err });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
res.status(400).send({ message: "oof! cette addresse courriel est déjà utilisé" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
checkRolesExisted = (req, res, next) => {
|
|
||||||
if (req.body.roles) {
|
|
||||||
for (let i = 0; i < req.body.roles.length; i++) {
|
|
||||||
if (!ROLES.includes(req.body.roles[i])) {
|
|
||||||
res.status(400).send({
|
|
||||||
message: `oof! ce role ${req.body.roles[i]} n'existe pas`
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next();
|
|
||||||
};
|
|
||||||
|
|
||||||
validateEmail = async (req, res, next) => {
|
|
||||||
if (req.body.email) {
|
|
||||||
const emailRes = await dev.validate({
|
|
||||||
email: req.body.email,
|
|
||||||
sender: req.body.email,
|
|
||||||
validateRegex: true,
|
|
||||||
valideMx: true,
|
|
||||||
validateTypo: true,
|
|
||||||
validateDisposable: true,
|
|
||||||
validateSMTP: false,
|
|
||||||
})
|
|
||||||
console.log((emailRes.valid))
|
|
||||||
if (!emailRes.valid) {
|
|
||||||
res.status(400).send({
|
|
||||||
message: "oof! ton email est pas valide loco"
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
checkPassLimit = (req, res, next) => {
|
|
||||||
|
|
||||||
function isUpperCase(str) {
|
|
||||||
return str === str.toUpperCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.body.password) {
|
|
||||||
if (req.body.password.length <= 8) {
|
|
||||||
res.status(400).send({
|
|
||||||
message: "oof! ce password ne respecte pas la longueur minimal."
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var upper = 0;
|
|
||||||
for (let c of req.body.password) {
|
|
||||||
if (isUpperCase(c))
|
|
||||||
{
|
|
||||||
upper = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (upper != 1)
|
|
||||||
{
|
|
||||||
res.status(400).send({
|
|
||||||
message: "oof! ce password n'a aucune majuscule."
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next();
|
|
||||||
};
|
|
||||||
|
|
||||||
const verifySignUp = {
|
|
||||||
checkDuplicateUsernameOrEmail,
|
|
||||||
checkRolesExisted,
|
|
||||||
validateEmail,
|
|
||||||
checkPassLimit
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = verifySignUp;
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
const mongoose = require('mongoose');
|
|
||||||
mongoose.Promise = global.Promise;
|
|
||||||
|
|
||||||
const db = {};
|
|
||||||
|
|
||||||
db.mongoose = mongoose;
|
|
||||||
|
|
||||||
db.user = require("./user.model");
|
|
||||||
db.role = require("./role.model");
|
|
||||||
|
|
||||||
db.ROLES = ["user", "admin"];
|
|
||||||
|
|
||||||
module.exports = db;
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
const mongoose = require("mongoose");
|
|
||||||
|
|
||||||
const Role = mongoose.model(
|
|
||||||
"Role",
|
|
||||||
new mongoose.Schema({
|
|
||||||
name: String
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
module.exports = Role;
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
const mongoose = require("mongoose");
|
|
||||||
|
|
||||||
const User = mongoose.model(
|
|
||||||
"User",
|
|
||||||
new mongoose.Schema({
|
|
||||||
username: String,
|
|
||||||
email: String,
|
|
||||||
password: String,
|
|
||||||
active: Boolean,
|
|
||||||
balance: Number,
|
|
||||||
walletid: String,
|
|
||||||
roles: [
|
|
||||||
{
|
|
||||||
type: mongoose.Schema.Types.ObjectId,
|
|
||||||
ref: "Role"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
module.exports = User;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
const { verifySignUp } = require("../middlewares");
|
|
||||||
const controller = require("../controllers/auth.controller");
|
|
||||||
|
|
||||||
module.exports = function(app) {
|
|
||||||
app.use(function(req, res, next) {
|
|
||||||
res.header(
|
|
||||||
"Access-Control-Allow-Headers",
|
|
||||||
"x-access-token, Origin, Content-Type, Accept"
|
|
||||||
);
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
|
|
||||||
app.post(
|
|
||||||
"/api/auth/signup",
|
|
||||||
[
|
|
||||||
verifySignUp.checkDuplicateUsernameOrEmail,
|
|
||||||
verifySignUp.checkRolesExisted,
|
|
||||||
verifySignUp.validateEmail,
|
|
||||||
verifySignUp.checkPassLimit
|
|
||||||
],
|
|
||||||
controller.signup
|
|
||||||
);
|
|
||||||
|
|
||||||
app.post("/api/auth/signin", controller.signin);
|
|
||||||
};
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
const { authJwt } = require("../middlewares");
|
|
||||||
const controller = require("../controllers/user.controller");
|
|
||||||
|
|
||||||
module.exports = function(app) {
|
|
||||||
app.use(function(req, res, next) {
|
|
||||||
res.header(
|
|
||||||
"Access-Control-Allow-Headers",
|
|
||||||
"x-access-token, Origin, Content-Type, Accept"
|
|
||||||
);
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/api/all", controller.allAccess);
|
|
||||||
|
|
||||||
app.get("/api/user", [authJwt.verifyToken], controller.userBoard);
|
|
||||||
|
|
||||||
app.get(
|
|
||||||
"/api/admin",
|
|
||||||
[authJwt.verifyToken, authJwt.isAdmin],
|
|
||||||
controller.adminBoard
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
border: 3px solid #4B0082;
|
border: 3px solid #4B0082;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root { background-attachment: fixed; }
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background-image: url("../img/winxp.jpg");
|
background-image: url("../img/winxp.jpg");
|
||||||
@@ -62,11 +60,6 @@ body {
|
|||||||
text-shadow: 4px 0px var(--teal);
|
text-shadow: 4px 0px var(--teal);
|
||||||
}
|
}
|
||||||
|
|
||||||
.typebox {
|
|
||||||
margin-top: 2%;
|
|
||||||
margin-bottom: 2%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sbody {
|
#sbody {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
@@ -112,55 +105,22 @@ body {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#bjlogin {
|
#ws:link {
|
||||||
margin: 0 auto;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
text-align:center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#reg_status {
|
|
||||||
margin: 0 auto;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
text-align:center;
|
|
||||||
padding-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#bjmenu {
|
|
||||||
margin-bottom: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tab1bj {
|
|
||||||
margin-right: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bjbuttons {
|
|
||||||
margin: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mainbj {
|
|
||||||
padding: 3%;
|
|
||||||
border: 1px solid black;
|
|
||||||
background-color: #F3F3EF;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ws:link {
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ws:visited {
|
#ws:visited {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ws:hover {
|
#ws:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: coral;
|
color: coral;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ws:active {
|
#ws:active {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
@@ -543,7 +543,7 @@ legend {
|
|||||||
|
|
||||||
menu[role=tablist] {
|
menu[role=tablist] {
|
||||||
position: relative;
|
position: relative;
|
||||||
margin: 0 0 0;
|
margin: 0 0 -2px;
|
||||||
text-indent: 0;
|
text-indent: 0;
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -551,7 +551,6 @@ menu[role=tablist] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button {
|
menu[role=tablist] button {
|
||||||
background: #d0d0bf;
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
display: block;
|
display: block;
|
||||||
color: #222;
|
color: #222;
|
||||||
@@ -560,11 +559,19 @@ menu[role=tablist] button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button[aria-selected=true] {
|
menu[role=tablist] button[aria-selected=true] {
|
||||||
|
padding-bottom: 2px;
|
||||||
|
margin-top: -2px;
|
||||||
|
background-color: #ece9d8;
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-bottom: -2px;
|
|
||||||
z-index: 8;
|
z-index: 8;
|
||||||
|
margin-left: -3px;
|
||||||
|
margin-bottom: 1px
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menu[role=tablist] button:focus {
|
||||||
|
outline: 1px dotted #222;
|
||||||
|
outline-offset: -4px
|
||||||
|
}
|
||||||
|
|
||||||
menu[role=tablist].justified button {
|
menu[role=tablist].justified button {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
@@ -991,8 +998,14 @@ legend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button {
|
menu[role=tablist] button {
|
||||||
padding: 0 12px 3px;
|
background: linear-gradient(180deg, #fff, #fafaf9 26%, #f0f0ea 95%, #ecebe5);
|
||||||
border-bottom: 1px solid black;
|
margin-left: -1px;
|
||||||
|
margin-right: 2px;
|
||||||
|
border-radius: 0;
|
||||||
|
border-color: #91a7b4;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
padding: 0 12px 3px
|
||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button:hover {
|
menu[role=tablist] button:hover {
|
||||||
@@ -1002,17 +1015,23 @@ menu[role=tablist] button:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button[aria-selected=true] {
|
menu[role=tablist] button[aria-selected=true] {
|
||||||
background: #F3F3EF;
|
border-color: #919b9c;
|
||||||
|
margin-right: -1px;
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
border-top: 1px solid #e68b2c;
|
border-top: 1px solid #e68b2c;
|
||||||
box-shadow: inset 0 2px #ffc73c;
|
box-shadow: inset 0 2px #ffc73c
|
||||||
border-bottom: 1px solid #F3F3EF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menu[role=tablist] button[aria-selected=true]:first-of-type:before {
|
menu[role=tablist] button[aria-selected=true]:first-of-type:before {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
z-index: -1;
|
||||||
|
top: 100%;
|
||||||
|
left: -1px;
|
||||||
|
height: 2px;
|
||||||
width: 0;
|
width: 0;
|
||||||
|
border-left: 1px solid #919b9c
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.tree-view {
|
ul.tree-view {
|
||||||
|
Before Width: | Height: | Size: 662 KiB After Width: | Height: | Size: 662 KiB |
|
Before Width: | Height: | Size: 572 B After Width: | Height: | Size: 572 B |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 912 KiB After Width: | Height: | Size: 912 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 855 KiB After Width: | Height: | Size: 855 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |