Skip to content
Snippets Groups Projects
Commit 2a483b68 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

deleted all Marmiuton content

parent 099dac7b
Branches
No related tags found
No related merge requests found
Showing
with 24 additions and 1305 deletions
......@@ -47,56 +47,11 @@ function loadPage(){
}
}
// Générer les liens
function genPageLink($path="/"){
global $localSettings;
if (substr($path, 0, 1) != '/') {
$path = '/' . $path;
}
$pages = explode("/", $path);
array_shift($pages);
$return = "index.php?";
// Ici on va vérifier le mode de récupération de l'url
// On prend l'exemple de ces appels:
// /login, /recettes?search=valeur, /admin/recettes?filterBy=DESC
//
if($localSettings["urlMode"] == "parameters"){
// est-ce que c'est une page admin?
if($pages[0]=="admin"){
// Oui
if(isset($pages[1]) && !empty($pages[1])){
$return = $return . "page=".$pages[1];
}else{
$return = $return . "page=index";
}
$return = $return . "&admin";
if(isset($pages[2]) && !empty($pages[2])){
$return = $return . "&".str_replace("?", "", $pages[2]);
}
}else{
// Non
if(isset($pages[0]) && !empty($pages[0])){
$return = $return . "page=".$pages[0];
}
if(isset($pages[1]) && !empty($pages[1])){
$return = $return . "&".str_replace("?", "", $pages[1]);
}
}
}else{
// Pas besoin de travailler, on donne les alias par défaut
$path = ltrim($path, '/');
$return = $path;
}
return $return;
}
// Vérifie si un username ou un email existe dans la bdd
function checkUsernameEmail($data){
$pos = strpos($data, "@");
if ($pos !== false) {
$response = Connexion::pdo()->prepare("SELECT * FROM m_userSetting WHERE name='email' AND value=?");
$response = Connexion::pdo()->prepare("SELECT * FROM site_userSetting WHERE name='email' AND value=?");
$response->execute([strtolower($data)]);
if (empty($response->fetch())) {
return false;
......@@ -104,7 +59,7 @@ function checkUsernameEmail($data){
return true;
}
} else {
$response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE username=?");
$response = Connexion::pdo()->prepare("SELECT * FROM site_user WHERE username=?");
$response->execute([strtolower($data)]);
if (empty($response->fetch())) {
return false;
......@@ -118,32 +73,32 @@ function login($usernameEmail, $password){
$usernameEmail = strtolower($usernameEmail);
$pos = strpos($usernameEmail, "@");
if ($pos !== false) {
$response = Connexion::pdo()->prepare("SELECT userId FROM m_userSetting WHERE name='email' AND value=?");
$response = Connexion::pdo()->prepare("SELECT userId FROM site_userSetting WHERE name='email' AND value=?");
$response->execute([$usernameEmail]);
$supposedUserId = $response->fetchColumn();
$response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE id=?");
$response = Connexion::pdo()->prepare("SELECT * FROM site_user WHERE id=?");
$response->execute([$supposedUserId]);
} else {
$response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE username=?");
$response = Connexion::pdo()->prepare("SELECT * FROM site_user WHERE username=?");
$response->execute([$usernameEmail]);
}
$user=$response->fetch(PDO::FETCH_ASSOC);
if (!empty($user)) {
if(password_verify($password, $user["password"])){
// On vérifie l'ip
$response = Connexion::pdo()->prepare("SELECT * FROM m_userSetting WHERE userId=? AND name='lastIp'");
$response = Connexion::pdo()->prepare("SELECT * FROM site_userSetting WHERE userId=? AND name='lastIp'");
$response->execute([$user['id']]);
$result = $response->fetch(PDO::FETCH_ASSOC);
if (empty($result)) {
// Aucun champ d'ip n'existe
$response = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$response = Connexion::pdo()->prepare("INSERT INTO site_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$response->execute([$user['id'], 'lastIp', $ip]);
}else{
if($result["value"]!=$ip){
// Il existe un champ, on va le comparer
$response = Connexion::pdo()->prepare("UPDATE m_userSetting SET `value`=? WHERE `userId`=? AND name='lastIp'");
$response = Connexion::pdo()->prepare("UPDATE site_userSetting SET `value`=? WHERE `userId`=? AND name='lastIp'");
$response->execute([$ip, $user['id']]);
}
......@@ -153,7 +108,7 @@ function login($usernameEmail, $password){
$_SESSION['userName'] = $user['username'];
$_SESSION['userGroupId'] = $user['groupId'];
$userProfilPic = Connexion::pdo()->prepare("SELECT value FROM m_userSetting WHERE userId=? AND name='profilPic'");
$userProfilPic = Connexion::pdo()->prepare("SELECT value FROM site_userSetting WHERE userId=? AND name='profilPic'");
$userProfilPic->execute([$user['id']]);
$userProfilPic = $userProfilPic->fetchColumn();
......@@ -180,23 +135,23 @@ function registerUser($username, $password, $email){
$password = password_hash($password, PASSWORD_DEFAULT);
// Ici on récupère l'id du groupe des utilisateurs
$userGroupId = Connexion::pdo()->query("SELECT id FROM m_groupeUtilisateur WHERE nom='utilisateur'")->fetchColumn();
$userGroupId = Connexion::pdo()->query("SELECT id FROM site_userGroup WHERE nom='utilisateur'")->fetchColumn();
// Là on va insérer l'utilisateur dans la table des utilisateurs
$query = Connexion::pdo()->prepare("INSERT INTO m_utilisateur (id, groupId, username, password) VALUES (?,?, ?, ?)");
$query = Connexion::pdo()->prepare("INSERT INTO site_user (id, groupId, username, password) VALUES (?,?, ?, ?)");
$query->execute([null, $userGroupId, $username, $password]);
// Maintenant on va récuper son id
$query = Connexion::pdo()->prepare("SELECT id FROM m_utilisateur WHERE username=?");
$query = Connexion::pdo()->prepare("SELECT id FROM site_user WHERE username=?");
$query->execute([$username]);
$userId = $query->fetchColumn();
// On va insérer son adresse mail
$query = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$query = Connexion::pdo()->prepare("INSERT INTO site_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$query->execute([$userId, 'email', $email]);
// Sa date d'inscription
$query = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$query = Connexion::pdo()->prepare("INSERT INTO site_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
$query->execute([$userId, 'joinedDate', date("Y-m-d H:i:s")]);
$return["success"] = "Inscription réussie, tu peux désormais te connecter! 🥳";
......@@ -206,84 +161,6 @@ function registerUser($username, $password, $email){
return $return;
}
// Recettes
function getRecettes($search=""){
// C'est gitcopilot qui écrit 75% de cette fonction
// On va récupérer les recettes selon la recherche
// Si $search est une liste, on va chercher selon son contenu
// $search["categoryId"], $search["name"], ["ingredientId"], ["difficulte"], ["time"], ["auteurId"]
if(is_array($search) && !empty($search)){
// https://stackoverflow.com/a/18603279
$categoryId = $search["categoryId"] ?? "";
$name = $search["name"] ?? "";
$ingredients = $search["ingredients"] ?? "";
$difficulte = $search["difficulte"] ?? "";
$tempsPreparation = $search["tempsPreparation"] ?? "";
$auteurId = $search["auteurId"] ?? "";
// On construit la requête
$queryString = "SELECT * FROM m_recette INNER JOIN m_recetteIngredient ON m_recette.id=m_recetteIngredient.recetteId WHERE 1=1";
if(!empty($categoryId)){
$queryString .= " AND categoryId=:categoryId";
}
if(!empty($name)){
$queryString .= " AND nom LIKE :name";
}
if(!empty($ingredients)){
$ingredientsIn = implode(',', $ingredients);
$queryString .= " AND ingredientId IN (:ingredients)";
}
if(!empty($difficulte)){
$queryString .= " AND difficulte=:difficulte";
}
if(!empty($tempsPreparation)){
$queryString .= " AND tempsPreparation=:tempsPreparation";
}
if(!empty($auteurId)){
$queryString .= " AND auteurId=:auteurId";
}
// On la prépare
$query = Connexion::pdo()->prepare($queryString." ORDER BY nom");
// On rempli les paramètres
if(!empty($categoryId)){
$query->bindParam(':categoryId', $categoryId);
}
if(!empty($name)){
$name = "%".$name."%";
$query->bindParam(':name', $name);
}
if(!empty($ingredientId)){
$query->bindParam(':ingredients', $ingredientsIn);
}
if(!empty($difficulte)){
$query->bindParam(':difficulte', $difficulte);
}
if(!empty($tempsPreparation)){
$query->bindParam(':tempsPreparation', $tempsPreparation);
}
if(!empty($auteurId)){
$query->bindParam(':auteurId', $auteurId);
}
// On exécute
$query->execute();
// Et on retourne le résultat
return $query->fetchAll(PDO::FETCH_ASSOC);
}else{
// Si $search n'est pas un array, on va chercher toutes les recettes
$query = Connexion::pdo()->prepare("SELECT * FROM m_recette ORDER BY nom");
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
}
function getRecette($recetteId){
$query = Connexion::pdo()->prepare("SELECT * FROM m_recette WHERE id=?");
$query->execute([$recetteId]);
return $query->fetch(PDO::FETCH_ASSOC);
}
// Vérifie les permissions
function verifyUserPermission($userId, $permission){
// $permission peut être un tableau ou un string
......@@ -306,7 +183,7 @@ function verifyUserPermission($userId, $permission){
}
}
// On peut maintenant vérifier dans la bdd
$response = Connexion::pdo()->prepare("SELECT m_permission.id FROM m_permissionGroup INNER JOIN m_permission ON m_permissionGroup.id=m_permission.groupId WHERE m_permissionGroup.name=? AND m_permission.name=?");
$response = Connexion::pdo()->prepare("SELECT site_permission.id FROM site_permissionGroup INNER JOIN site_permission ON site_permissionGroup.id=site_permission.groupId WHERE site_permissionGroup.name=? AND site_permission.name=?");
$response->execute([$groupName, $permissionName]);
$targetPermId = $response->fetchColumn();
......@@ -318,7 +195,7 @@ function verifyUserPermission($userId, $permission){
if(isSuperAdmin($userId)){
return true;
}else{
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_permissionUtilisateur WHERE userId=? AND permId=?");
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM site_userPermission WHERE userId=? AND permId=?");
$response->execute([$userId, $targetPermId]);
$hasPermission = $response->fetchColumn();
if($hasPermission == 0)$hasPermission = false;
......@@ -328,7 +205,7 @@ function verifyUserPermission($userId, $permission){
// Si l'utilisateur n'a pas la permission, on va vérifier si le groupe l'a
if(!$hasPermission){
$response = Connexion::pdo()->prepare("SELECT groupId FROM m_utilisateur WHERE id=?");
$response = Connexion::pdo()->prepare("SELECT groupId FROM site_user WHERE id=?");
$response->execute([$userId]);
$userGroupId = $response->fetchColumn();
......@@ -336,7 +213,7 @@ function verifyUserPermission($userId, $permission){
throw new Exception('Erreur! L\'utilisateur n\'existe pas.');
}
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_permissionGroupeUtilisateur WHERE groupId=? AND permId=?");
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM site_userGroupPermission WHERE groupId=? AND permId=?");
$response->execute([$userGroupId, $targetPermId]);
$hasPermission = $response->fetchColumn();
if($hasPermission == 0)$hasPermission = false;
......@@ -348,8 +225,8 @@ function verifyUserPermission($userId, $permission){
// Check si l'utilisateur est surper utilisateur
function isSuperAdmin($userId){
$superAdminGroupId = Connexion::pdo()->query("SELECT id FROM m_groupeUtilisateur WHERE nom='superAdmin'")->fetchColumn();
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_utilisateur WHERE id=? AND groupId=?");
$superAdminGroupId = Connexion::pdo()->query("SELECT id FROM site_userGroup WHERE nom='superAdmin'")->fetchColumn();
$response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM site_user WHERE id=? AND groupId=?");
$response->execute([$userId, $superAdminGroupId]);
$isSuperAdmin = $response->fetchColumn();
if($isSuperAdmin == 0) return false;
......@@ -358,7 +235,7 @@ function isSuperAdmin($userId){
// Récupère les paramètres du site
function getWebsiteSetting($setting){
$response = Connexion::pdo()->prepare("SELECT value FROM m_siteSetting WHERE name=?");
$response = Connexion::pdo()->prepare("SELECT value FROM site_siteSetting WHERE name=?");
$response->execute([$setting]);
$settingValue = $response->fetchColumn();
return $settingValue; // Retourne null si le paramètre n'existe pas
......@@ -377,7 +254,7 @@ function getUtilisateur($search=""){
$username = $search["username"] ?? "";
$queryString = "SELECT * FROM m_utilisateur WHERE 1=1";
$queryString = "SELECT * FROM site_user WHERE 1=1";
if(!empty($userId)){
$queryString .= " AND id=:userId";
}
......@@ -402,7 +279,7 @@ function getUtilisateur($search=""){
return $query->fetch(PDO::FETCH_ASSOC);
}else{
// Si $search n'est pas un array, on va chercher tous les utilisateurs
$query = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur ORDER BY username");
$query = Connexion::pdo()->prepare("SELECT * FROM site_user ORDER BY username");
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
......@@ -415,67 +292,3 @@ function isConnected(){
exit();
}
}
// Récupréation diverses infos relatives aux recettes
function getCategories(){
$query = Connexion::pdo()->prepare("SELECT * FROM m_categorie ORDER BY nom");
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
function getUstensiles(){
$query = Connexion::pdo()->prepare("SELECT * FROM m_ustensile ORDER BY nom");
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
function getIngredients($recetteId=""){
if(empty($recetteId)){
$query = Connexion::pdo()->prepare("SELECT * FROM m_ingredient ORDER BY nom");
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}else{
$query = Connexion::pdo()->prepare("SELECT * FROM m_ingredient WHERE id IN (SELECT ingredientId FROM m_recetteIngredient WHERE recetteId=:recetteId) ORDER BY nom");
$query->bindParam(':recetteId', $recetteId);
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
}
// Envoyer une recette
function sendRecette($recetteTitle, $recetteContent, $recetteDescription, $recetteCategory, $recetteIngredients, $recettePreparation, $recetteUstensiles, $recetteHeaderPic, $recetteDifficulte){
$recetteTitle = utf8_encode(htmlspecialchars($recetteTitle));
$recetteContent = utf8_encode(htmlspecialchars($recetteContent));
$recetteDescription = utf8_encode(htmlspecialchars($recetteDescription));
$quantite = 1; // Je suis un boulet j'ai oublié ça xD
// On insert la recette
$query = Connexion::pdo()->prepare("INSERT INTO m_recette (id, categoryId, auteurId, nom, description, contenu, image, tempsPreparation, difficulte, datePost, dateModif) VALUES (NULL, :categoryId, :auteurId, :nom, :description, :contenu, :image, :tempsPreparation, :difficulte, NOW(), NOW())");
$query->bindParam(':categoryId', $recetteCategory);
$query->bindParam(':auteurId', $_SESSION["userId"]);
$query->bindParam(':nom', $recetteTitle);
$query->bindParam(':description', $recetteDescription);
$query->bindParam(':contenu', $recetteContent);
$query->bindParam(':image', $recetteHeaderPic);
$query->bindParam(':tempsPreparation', $recettePreparation);
$query->bindParam(':difficulte', $recetteDifficulte);
$query->execute();
// Puis on répertorie les ingrédients
$recetteId = Connexion::pdo()->lastInsertId();
foreach($recetteIngredients as $ingredient){
$query = Connexion::pdo()->prepare("INSERT INTO m_recetteIngredient (recetteId, ingredientId, quantite) VALUES (:recetteId, :ingredientId, :quantite)");
$query->bindParam(':recetteId', $recetteId);
$query->bindParam(':ingredientId', $ingredient);
$query->bindParam(':quantite', $quantite);
$query->execute();
}
// Et on termine par les ustensiles
foreach($recetteUstensiles as $ustensile){
$query = Connexion::pdo()->prepare("INSERT INTO m_recetteUstensile (recetteId, ustensileId) VALUES (:recetteId, :ustensileId)");
$query->bindParam(':recetteId', $recetteId);
$query->bindParam(':ustensileId', $ustensile);
$query->execute();
}
// On retourne l'id de la recette
return $recetteId;
}
\ No newline at end of file
data/images/illustration-fruits.png

437 KiB

data/images/logo/favicon.ico

192 KiB

data/images/logo/favicon.png

4.52 KiB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 217.5 217.5"><g id="m"><path d="M40.58,74.41a12.74,12.74,0,0,1,1.18-5.9,9.51,9.51,0,0,1,2.81-3.45,10.26,10.26,0,0,1,3.36-1.64,12.13,12.13,0,0,1,3-.45,12.12,12.12,0,0,1,3,.45,10.26,10.26,0,0,1,3.36,1.64,9.63,9.63,0,0,1,2.82,3.45,12.86,12.86,0,0,1,1.18,5.9v4.17h.36a25.74,25.74,0,0,1,3.91-6.17,30.39,30.39,0,0,1,5.81-5.26,27.53,27.53,0,0,1,7.72-3.73,32.36,32.36,0,0,1,9.62-1.36q10.17,0,16.89,4.54a30.15,30.15,0,0,1,10.35,12,31.16,31.16,0,0,1,11.62-12.25,33.15,33.15,0,0,1,17.07-4.27,32.75,32.75,0,0,1,14.62,3,28.75,28.75,0,0,1,10,7.89A32.07,32.07,0,0,1,175,84.21a47.42,47.42,0,0,1,1.82,13.07v43.94a14.61,14.61,0,0,1-1.18,6.27,9.84,9.84,0,0,1-2.91,3.72,10.07,10.07,0,0,1-3.63,1.72,14.41,14.41,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.72,9.72,0,0,1-2.9-3.72,14.46,14.46,0,0,1-1.18-6.27V103.46a62.42,62.42,0,0,0-.55-8,21.56,21.56,0,0,0-2.36-7.54,15.75,15.75,0,0,0-5-5.53,14.65,14.65,0,0,0-8.45-2.18,16.58,16.58,0,0,0-8.72,2.18,19.06,19.06,0,0,0-6,5.62,24.42,24.42,0,0,0-3.45,7.72,33.89,33.89,0,0,0-1.09,8.44v37a14.46,14.46,0,0,1-1.18,6.27,9.82,9.82,0,0,1-2.9,3.72,10.19,10.19,0,0,1-3.64,1.72,14.42,14.42,0,0,1-3.17.46,13.71,13.71,0,0,1-3.27-.46,10,10,0,0,1-3.54-1.72,9.74,9.74,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V99.1c0-5.45-1.3-9.95-3.91-13.53S87,80.22,81.44,80.22a16.86,16.86,0,0,0-8.54,2.09A17.89,17.89,0,0,0,67,87.66a24.24,24.24,0,0,0-3.45,7.54,32.05,32.05,0,0,0-1.18,8.62v37.4a14.61,14.61,0,0,1-1.18,6.27,9.84,9.84,0,0,1-2.91,3.72,10.07,10.07,0,0,1-3.63,1.72,14.41,14.41,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.72,9.72,0,0,1-2.9-3.72,14.46,14.46,0,0,1-1.18-6.27Z" transform="translate(0 0.5)" fill="#ed8930"/></g><g id="Ellipse_1" data-name="Ellipse 1" style="isolation:isolate"><g id="Ellipse_1-2" data-name="Ellipse 1"><path d="M108.75,21.5A86.75,86.75,0,1,1,22,108.25,86.85,86.85,0,0,1,108.75,21.5m0-22A108.75,108.75,0,1,0,217.5,108.25,108.75,108.75,0,0,0,108.75-.5Z" transform="translate(0 0.5)" fill="#ed8930"/></g></g></svg>
\ No newline at end of file
data/images/logo/large.png

12.1 KiB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 951.23 217.5"><g id="m_armiuton" data-name="m armiuton"><path d="M42.13,73.41a12.74,12.74,0,0,1,1.18-5.9,9.61,9.61,0,0,1,2.81-3.45,10.26,10.26,0,0,1,3.36-1.64,12.13,12.13,0,0,1,3-.45,12.13,12.13,0,0,1,3,.45,10.26,10.26,0,0,1,3.36,1.64,9.61,9.61,0,0,1,2.81,3.45,12.74,12.74,0,0,1,1.18,5.9v4.17h.37a25.69,25.69,0,0,1,3.9-6.17,30.39,30.39,0,0,1,5.81-5.26,27.53,27.53,0,0,1,7.72-3.73,32.36,32.36,0,0,1,9.62-1.36q10.17,0,16.89,4.54a30.15,30.15,0,0,1,10.35,12,31.11,31.11,0,0,1,11.63-12.25,33.12,33.12,0,0,1,17.07-4.27,32.78,32.78,0,0,1,14.62,3,28.94,28.94,0,0,1,10,7.89,32.24,32.24,0,0,1,5.72,11.26,47.79,47.79,0,0,1,1.81,13.07v43.94a14.46,14.46,0,0,1-1.18,6.27,9.82,9.82,0,0,1-2.9,3.72,10.11,10.11,0,0,1-3.64,1.72,14.42,14.42,0,0,1-3.17.46,13.78,13.78,0,0,1-3.27-.46,10.09,10.09,0,0,1-3.54-1.72,9.74,9.74,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V102.46a60.66,60.66,0,0,0-.55-8,21.56,21.56,0,0,0-2.36-7.54,15.66,15.66,0,0,0-5-5.53,14.61,14.61,0,0,0-8.44-2.18,16.55,16.55,0,0,0-8.72,2.18,19.06,19.06,0,0,0-6,5.62A24.22,24.22,0,0,0,122,94.74a34.34,34.34,0,0,0-1.08,8.44v37a14.45,14.45,0,0,1-1.19,6.27,9.72,9.72,0,0,1-2.9,3.72,10.07,10.07,0,0,1-3.63,1.72,14.49,14.49,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.84,9.84,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V98.1c0-5.45-1.3-9.95-3.9-13.53S88.56,79.22,83,79.22a16.89,16.89,0,0,0-8.54,2.09,17.89,17.89,0,0,0-5.9,5.35A24.71,24.71,0,0,0,65.1,94.2a32.05,32.05,0,0,0-1.18,8.62v37.4a14.46,14.46,0,0,1-1.18,6.27,9.92,9.92,0,0,1-2.9,3.72,10.19,10.19,0,0,1-3.64,1.72,14.42,14.42,0,0,1-3.17.46,13.78,13.78,0,0,1-3.27-.46,10,10,0,0,1-3.54-1.72,9.74,9.74,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M316.35,141a13.63,13.63,0,0,1-1.09,5.9,9.77,9.77,0,0,1-2.72,3.54,8.31,8.31,0,0,1-3.36,1.63,12.35,12.35,0,0,1-6,0,8.31,8.31,0,0,1-3.36-1.63,9.88,9.88,0,0,1-2.72-3.54A13.63,13.63,0,0,1,296,141v-1.27h-.54a24.37,24.37,0,0,1-10.54,9.53,35.72,35.72,0,0,1-16.52,3.72,47.25,47.25,0,0,1-11-1.36A32.66,32.66,0,0,1,246.89,147a26.29,26.29,0,0,1-8-8.35,24,24,0,0,1-3.18-12.8q0-9.81,5.54-15.62a35.83,35.83,0,0,1,14.25-8.89,80.47,80.47,0,0,1,19.34-4.09q10.63-1,20.8-1V94.1q0-8.16-5.9-12.07a25,25,0,0,0-14.08-3.9,25.63,25.63,0,0,0-9.62,1.81,61.48,61.48,0,0,0-9.27,4.72A11.46,11.46,0,0,1,251,86.48a7.9,7.9,0,0,1-5.81-2.36,8.12,8.12,0,0,1-2.36-6,10,10,0,0,1,1-4.18,10.57,10.57,0,0,1,4.09-4.17,49.69,49.69,0,0,1,13.8-6.45,55.18,55.18,0,0,1,15.8-2.27q11.61,0,19.16,3.27a31.18,31.18,0,0,1,11.89,8.53,30.66,30.66,0,0,1,6.09,11.8,51.54,51.54,0,0,1,1.72,13.08Zm-25.61-30q-5.26,0-11.07.45a48.46,48.46,0,0,0-10.72,2,22.82,22.82,0,0,0-8.17,4.36,9.65,9.65,0,0,0-3.27,7.71,9.35,9.35,0,0,0,1.36,5.18,10.54,10.54,0,0,0,3.54,3.36,15.72,15.72,0,0,0,4.91,1.81,27.16,27.16,0,0,0,5.45.55q11.25,0,17.07-6t5.81-16.34V111Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M358.75,146.49a9.82,9.82,0,0,1-2.9,3.72,10.07,10.07,0,0,1-3.63,1.72,14.57,14.57,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.74,9.74,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V73.59a12.74,12.74,0,0,1,1.18-5.9,10.66,10.66,0,0,1,2.82-3.54,9.38,9.38,0,0,1,3.36-1.73,12.05,12.05,0,0,1,3-.45,13.19,13.19,0,0,1,3.09.45A9.35,9.35,0,0,1,355,64.15a10.52,10.52,0,0,1,2.81,3.54,12.73,12.73,0,0,1,1.19,5.9v4.54h.36A27.41,27.41,0,0,1,368,66.05a21.6,21.6,0,0,1,14.08-5,12.87,12.87,0,0,1,8.08,2.45,8.51,8.51,0,0,1,3.18,7.17A11,11,0,0,1,390.62,78q-2.72,3.18-9.08,3.17-10.35,0-16,7t-5.63,17.89v34.13A14.46,14.46,0,0,1,358.75,146.49Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M400.61,73.41a12.74,12.74,0,0,1,1.18-5.9,9.63,9.63,0,0,1,2.82-3.45A10.26,10.26,0,0,1,408,62.42a10.19,10.19,0,0,1,6,0,10.26,10.26,0,0,1,3.36,1.64,9.51,9.51,0,0,1,2.81,3.45,12.73,12.73,0,0,1,1.19,5.9v4.17h.36a26,26,0,0,1,3.9-6.17,30.69,30.69,0,0,1,5.81-5.26,27.67,27.67,0,0,1,7.72-3.73,32.43,32.43,0,0,1,9.63-1.36q10.17,0,16.89,4.54a30.31,30.31,0,0,1,10.35,12A31.09,31.09,0,0,1,487.6,65.33a33.12,33.12,0,0,1,17.07-4.27,32.78,32.78,0,0,1,14.62,3,28.84,28.84,0,0,1,10,7.89A32.07,32.07,0,0,1,535,83.21a47.42,47.42,0,0,1,1.82,13.07v43.94a14.45,14.45,0,0,1-1.19,6.27,9.72,9.72,0,0,1-2.9,3.72,10.07,10.07,0,0,1-3.63,1.72,14.49,14.49,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.84,9.84,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V102.46a62.35,62.35,0,0,0-.54-8,21.56,21.56,0,0,0-2.36-7.54,15.69,15.69,0,0,0-5-5.53,14.61,14.61,0,0,0-8.44-2.18A16.58,16.58,0,0,0,490,81.4,19.06,19.06,0,0,0,484,87a24.2,24.2,0,0,0-3.45,7.72,33.89,33.89,0,0,0-1.09,8.44v37a14.61,14.61,0,0,1-1.18,6.27,9.84,9.84,0,0,1-2.91,3.72,10.07,10.07,0,0,1-3.63,1.72,14.41,14.41,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.72,9.72,0,0,1-2.9-3.72,14.46,14.46,0,0,1-1.18-6.27V98.1c0-5.45-1.31-9.95-3.91-13.53s-6.69-5.35-12.26-5.35a16.82,16.82,0,0,0-8.53,2.09,17.8,17.8,0,0,0-5.9,5.35,24.24,24.24,0,0,0-3.45,7.54,32.05,32.05,0,0,0-1.18,8.62v37.4a14.45,14.45,0,0,1-1.19,6.27,9.72,9.72,0,0,1-2.9,3.72,10.07,10.07,0,0,1-3.63,1.72,14.49,14.49,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.84,9.84,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M583.85,34a12.1,12.1,0,0,1-4.09,9.35,14.4,14.4,0,0,1-10.07,3.72,13.41,13.41,0,0,1-9.9-3.9,12.71,12.71,0,0,1,0-18.34,13.41,13.41,0,0,1,9.9-3.9,14.4,14.4,0,0,1,10.07,3.72A12.1,12.1,0,0,1,583.85,34Zm-3.09,106.21a14.46,14.46,0,0,1-1.18,6.27,9.82,9.82,0,0,1-2.9,3.72,10,10,0,0,1-3.64,1.72,14.42,14.42,0,0,1-3.17.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.84,9.84,0,0,1-2.91-3.72,14.46,14.46,0,0,1-1.18-6.27V74.13a14.38,14.38,0,0,1,1.18-6.26,9.84,9.84,0,0,1,2.91-3.72,10.2,10.2,0,0,1,3.54-1.73,13.73,13.73,0,0,1,3.27-.45,14.32,14.32,0,0,1,3.17.45,10.06,10.06,0,0,1,3.64,1.73,9.82,9.82,0,0,1,2.9,3.72,14.38,14.38,0,0,1,1.18,6.26Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M683.19,141a12.86,12.86,0,0,1-1.18,5.9,10.66,10.66,0,0,1-2.82,3.54,8.31,8.31,0,0,1-3.36,1.63,12.31,12.31,0,0,1-6,0,8.31,8.31,0,0,1-3.36-1.63,10.66,10.66,0,0,1-2.82-3.54,12.86,12.86,0,0,1-1.18-5.9v-4.18h-.36A28.21,28.21,0,0,1,652,148.3a29,29,0,0,1-17,5,32.92,32.92,0,0,1-14.62-3,28.87,28.87,0,0,1-10-7.9,32,32,0,0,1-5.72-11.26,47.3,47.3,0,0,1-1.81-13.07V74.13a14.38,14.38,0,0,1,1.18-6.26,9.72,9.72,0,0,1,2.9-3.72,10.2,10.2,0,0,1,3.54-1.73,13.73,13.73,0,0,1,3.27-.45,14.32,14.32,0,0,1,3.18.45,10.09,10.09,0,0,1,3.63,1.73,9.84,9.84,0,0,1,2.91,3.72,14.38,14.38,0,0,1,1.18,6.26V111.9a62.47,62.47,0,0,0,.54,8,21.52,21.52,0,0,0,2.37,7.53,15.51,15.51,0,0,0,5,5.54,14.69,14.69,0,0,0,8.44,2.18,18.77,18.77,0,0,0,15.35-7.45,23.89,23.89,0,0,0,3.72-7.53,29.94,29.94,0,0,0,1.27-8.62V74.13a14.53,14.53,0,0,1,1.18-6.26,9.84,9.84,0,0,1,2.91-3.72A10.2,10.2,0,0,1,669,62.42a13.73,13.73,0,0,1,3.27-.45,14.32,14.32,0,0,1,3.18.45,10.09,10.09,0,0,1,3.63,1.73A9.84,9.84,0,0,1,682,67.87a14.53,14.53,0,0,1,1.18,6.26Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M747.29,150.21a23.69,23.69,0,0,1-10.71,2.36q-8.73,0-14.17-2.45a20.8,20.8,0,0,1-8.53-6.72,25.28,25.28,0,0,1-4.27-9.81,56.73,56.73,0,0,1-1.18-11.89V81h-7.09a11.59,11.59,0,0,1-5-.91,8.42,8.42,0,0,1-3-2.26A7.38,7.38,0,0,1,691.9,75a11.93,11.93,0,0,1-.36-2.63,10.73,10.73,0,0,1,.36-2.54A7.45,7.45,0,0,1,693.35,67a9.37,9.37,0,0,1,3-2.36,10.82,10.82,0,0,1,5-1h7.09V48.53a13.23,13.23,0,0,1,1.18-6.08,10.52,10.52,0,0,1,2.81-3.54,9.32,9.32,0,0,1,3.45-1.72,13.78,13.78,0,0,1,3.27-.46,14.41,14.41,0,0,1,3.18.46,9.25,9.25,0,0,1,3.54,1.72,10.66,10.66,0,0,1,2.82,3.54,13.36,13.36,0,0,1,1.18,6.08V63.6h13.62a10.84,10.84,0,0,1,5,1,9.37,9.37,0,0,1,3,2.36,7.45,7.45,0,0,1,1.45,2.82,10.73,10.73,0,0,1,.36,2.54,11.93,11.93,0,0,1-.36,2.63,7.38,7.38,0,0,1-1.45,2.91,8.42,8.42,0,0,1-3,2.26,11.62,11.62,0,0,1-5,.91H729.86v40.49q0,13.08,8.35,13.07c.48,0,1,0,1.63-.09s1.21-.15,1.82-.27a11.06,11.06,0,0,1,1.54-.18h1c2.79,0,4.87.85,6.27,2.54a8.68,8.68,0,0,1,2.09,5.63Q752.56,147.67,747.29,150.21Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M853.53,106.81a46.8,46.8,0,0,1-3.73,18.89,44.69,44.69,0,0,1-10.07,14.61,45.86,45.86,0,0,1-15.08,9.53,51.46,51.46,0,0,1-37,0,45.81,45.81,0,0,1-15.07-9.53,44.56,44.56,0,0,1-10.08-14.61,46.79,46.79,0,0,1-3.72-18.89A46.14,46.14,0,0,1,762.45,88a43.8,43.8,0,0,1,10.08-14.43,44.39,44.39,0,0,1,15.07-9.26,54.11,54.11,0,0,1,37,0,44.43,44.43,0,0,1,15.08,9.26A43.92,43.92,0,0,1,849.8,88,46.14,46.14,0,0,1,853.53,106.81Zm-22.16,0a34.24,34.24,0,0,0-1.54-10.07,28.31,28.31,0,0,0-4.63-9,23.23,23.23,0,0,0-7.81-6.44,27,27,0,0,0-22.52,0,23.23,23.23,0,0,0-7.81,6.44,28.11,28.11,0,0,0-4.63,9,33.92,33.92,0,0,0-1.54,10.07A34.77,34.77,0,0,0,782.43,117a28,28,0,0,0,4.63,9.08,24.35,24.35,0,0,0,7.81,6.54,26.23,26.23,0,0,0,22.52,0,24.35,24.35,0,0,0,7.81-6.54,28.15,28.15,0,0,0,4.63-9.08A35.1,35.1,0,0,0,831.37,106.81Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M871,73.41a12.74,12.74,0,0,1,1.18-5.9A9.51,9.51,0,0,1,875,64.06a10.26,10.26,0,0,1,3.36-1.64,10.22,10.22,0,0,1,6,0,10.26,10.26,0,0,1,3.36,1.64,9.61,9.61,0,0,1,2.81,3.45,12.74,12.74,0,0,1,1.18,5.9v4.17H892A28.28,28.28,0,0,1,902.1,66.05a29,29,0,0,1,17-5,32.78,32.78,0,0,1,14.62,3,28.75,28.75,0,0,1,10,7.89,32.07,32.07,0,0,1,5.72,11.26,47.42,47.42,0,0,1,1.82,13.07v43.94a14.61,14.61,0,0,1-1.18,6.27,9.84,9.84,0,0,1-2.91,3.72,10.07,10.07,0,0,1-3.63,1.72,14.41,14.41,0,0,1-3.18.46,13.78,13.78,0,0,1-3.27-.46,10.17,10.17,0,0,1-3.54-1.72,9.72,9.72,0,0,1-2.9-3.72,14.45,14.45,0,0,1-1.19-6.27V102.46a62.35,62.35,0,0,0-.54-8,21.56,21.56,0,0,0-2.36-7.54,15.75,15.75,0,0,0-5-5.53,14.65,14.65,0,0,0-8.45-2.18A18.66,18.66,0,0,0,904,81.31a19.18,19.18,0,0,0-6.26,5.35A23.64,23.64,0,0,0,894,94.2a29.94,29.94,0,0,0-1.27,8.62v37.4a14.46,14.46,0,0,1-1.18,6.27,9.92,9.92,0,0,1-2.9,3.72,10.19,10.19,0,0,1-3.64,1.72,14.41,14.41,0,0,1-3.18.46,13.64,13.64,0,0,1-3.26-.46,10.13,10.13,0,0,1-3.55-1.72,9.72,9.72,0,0,1-2.9-3.72,14.46,14.46,0,0,1-1.18-6.27Z" transform="translate(0 0.5)" fill="#ed8930"/></g><g id="par_Université_Paris_Saclay" data-name="par Université Paris Saclay"><path d="M415.66,205.23a4.53,4.53,0,0,1-3.82-1.77h-.17c.11,1.1.17,1.76.17,2v5.31h-2.76V192h2.23c.06.24.19.82.39,1.73h.14a4.32,4.32,0,0,1,3.87-2,4.49,4.49,0,0,1,3.77,1.76,9.61,9.61,0,0,1,0,9.89A4.53,4.53,0,0,1,415.66,205.23ZM415,194.05a2.89,2.89,0,0,0-2.4,1,5,5,0,0,0-.75,3.07v.41a6,6,0,0,0,.75,3.42A2.78,2.78,0,0,0,415,203a2.49,2.49,0,0,0,2.2-1.17,6,6,0,0,0,.77-3.34,5.88,5.88,0,0,0-.76-3.3A2.59,2.59,0,0,0,415,194.05Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M431.67,205l-.55-1.8H431a5.42,5.42,0,0,1-1.88,1.61,6.11,6.11,0,0,1-2.44.42,4.09,4.09,0,0,1-3-1,3.83,3.83,0,0,1-1.08-2.91,3.44,3.44,0,0,1,1.49-3,8.55,8.55,0,0,1,4.54-1.11l2.23-.07v-.69a2.61,2.61,0,0,0-.58-1.86,2.34,2.34,0,0,0-1.79-.62,6.06,6.06,0,0,0-1.91.3,12.86,12.86,0,0,0-1.76.69l-.89-2a9.32,9.32,0,0,1,2.31-.84,10.63,10.63,0,0,1,2.36-.29,5.62,5.62,0,0,1,3.74,1.08,4.26,4.26,0,0,1,1.26,3.39V205Zm-4.11-1.88a3.4,3.4,0,0,0,2.41-.83,3,3,0,0,0,.91-2.35v-1.13l-1.66.07a5.79,5.79,0,0,0-2.83.65,2,2,0,0,0-.89,1.78,1.71,1.71,0,0,0,.52,1.34A2.18,2.18,0,0,0,427.56,203.12Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M443.57,191.8a6.44,6.44,0,0,1,1.37.12l-.27,2.57a4.83,4.83,0,0,0-1.21-.14,3.51,3.51,0,0,0-2.68,1.08,3.85,3.85,0,0,0-1,2.8V205H437V192h2.16l.36,2.28h.14a5.23,5.23,0,0,1,1.68-1.84A4,4,0,0,1,443.57,191.8Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M482,170.73v22.18a13.2,13.2,0,0,1-1.63,6.64,10.86,10.86,0,0,1-4.71,4.38,16.34,16.34,0,0,1-7.38,1.54q-6.37,0-9.91-3.38t-3.54-9.28V170.73h5.63v21.68q0,4.25,2,6.26c1.32,1.35,3.33,2,6.05,2q7.92,0,7.92-8.32V170.73Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M512.06,205h-5.53V189.06a6.91,6.91,0,0,0-1.21-4.47,4.64,4.64,0,0,0-3.83-1.48q-3.5,0-5.11,2.06c-1.08,1.38-1.62,3.68-1.62,6.92V205h-5.51V179.08h4.32l.77,3.4h.28a7.61,7.61,0,0,1,3.33-2.86,11.18,11.18,0,0,1,4.78-1q9.33,0,9.33,9.49Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M518.44,172.21a3.08,3.08,0,0,1,.8-2.27,3.16,3.16,0,0,1,2.31-.8,2.8,2.8,0,0,1,3.07,3.07,3,3,0,0,1-.81,2.22,3.07,3.07,0,0,1-2.26.8,3.16,3.16,0,0,1-2.31-.8A3,3,0,0,1,518.44,172.21ZM524.27,205h-5.51V179.08h5.51Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M537.09,205l-9.84-25.92h5.81l5.27,15.07a29.93,29.93,0,0,1,1.65,6.14h.18a41.41,41.41,0,0,1,1.64-6.14l5.28-15.07h5.86L543.05,205Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M567.23,205.47q-6,0-9.45-3.53t-3.41-9.71q0-6.36,3.16-10a10.94,10.94,0,0,1,8.7-3.63,10.69,10.69,0,0,1,8.11,3.12q3,3.11,3,8.57v3H560a8.52,8.52,0,0,0,2,5.8,7.1,7.1,0,0,0,5.41,2,20.62,20.62,0,0,0,4.28-.43,21.84,21.84,0,0,0,4.25-1.45v4.48a17.09,17.09,0,0,1-4.07,1.36A24.74,24.74,0,0,1,567.23,205.47Zm-1-22.69a5.54,5.54,0,0,0-4.21,1.67,7.84,7.84,0,0,0-1.89,4.85H571.9a7.2,7.2,0,0,0-1.55-4.87A5.28,5.28,0,0,0,566.23,182.78Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M595.76,178.61a13.73,13.73,0,0,1,2.74.23L598,184a10.25,10.25,0,0,0-2.44-.28,7,7,0,0,0-5.35,2.15,7.79,7.79,0,0,0-2,5.6V205h-5.51V179.08h4.31l.73,4.57h.28a10.3,10.3,0,0,1,3.36-3.68A8,8,0,0,1,595.76,178.61Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M619.76,197.62a6.76,6.76,0,0,1-2.77,5.82q-2.76,2-7.92,2a18.67,18.67,0,0,1-8.32-1.57v-4.76a20.37,20.37,0,0,0,8.51,2.11q5.09,0,5.09-3.07a2.41,2.41,0,0,0-.57-1.64,6.54,6.54,0,0,0-1.85-1.36,31,31,0,0,0-3.58-1.59q-4.49-1.74-6.06-3.47a6.41,6.41,0,0,1-1.58-4.5,5.91,5.91,0,0,1,2.68-5.17,12.7,12.7,0,0,1,7.3-1.84,20.75,20.75,0,0,1,8.65,1.85l-1.78,4.15a19.16,19.16,0,0,0-7.06-1.73c-2.9,0-4.36.82-4.36,2.48a2.49,2.49,0,0,0,1.14,2.06,24.92,24.92,0,0,0,5,2.32A22.57,22.57,0,0,1,616.9,192a6.79,6.79,0,0,1,2.16,2.37A6.91,6.91,0,0,1,619.76,197.62Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M624.42,172.21a3,3,0,0,1,.81-2.27,3.16,3.16,0,0,1,2.31-.8,3.09,3.09,0,0,1,2.26.8,3,3,0,0,1,.81,2.27,3,3,0,0,1-.81,2.22,3.09,3.09,0,0,1-2.26.8,3.16,3.16,0,0,1-2.31-.8A3,3,0,0,1,624.42,172.21ZM630.26,205h-5.51V179.08h5.51Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M646.83,201a13.46,13.46,0,0,0,4-.64v4.15a10.84,10.84,0,0,1-2.35.67,16.22,16.22,0,0,1-3,.27q-7.83,0-7.83-8.25v-14h-3.54v-2.44l3.8-2,1.87-5.49h3.4v5.77h7.39v4.17h-7.39v13.87a3.9,3.9,0,0,0,1,2.95A3.63,3.63,0,0,0,646.83,201Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M666.4,205.47q-6,0-9.45-3.53t-3.41-9.71q0-6.36,3.16-10a10.93,10.93,0,0,1,8.69-3.63,10.66,10.66,0,0,1,8.11,3.12q3,3.11,3,8.57v3H659.21a8.47,8.47,0,0,0,2,5.8,7.1,7.1,0,0,0,5.41,2,20.62,20.62,0,0,0,4.28-.43,21.84,21.84,0,0,0,4.25-1.45v4.48a17,17,0,0,1-4.08,1.36A24.56,24.56,0,0,1,666.4,205.47Zm-1-22.69a5.51,5.51,0,0,0-4.2,1.67,7.84,7.84,0,0,0-1.89,4.85h11.77a7.2,7.2,0,0,0-1.55-4.87A5.31,5.31,0,0,0,665.39,182.78Zm-3.51-6.87v-.58c.89-1.1,1.81-2.31,2.75-3.66s1.69-2.49,2.24-3.44h6.4v.49a48.39,48.39,0,0,1-3.65,3.69,49.61,49.61,0,0,1-4.08,3.5Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M716.56,181.09q0,5.37-3.52,8.23t-10,2.86h-3.57V205h-5.6V170.73h9.87q6.42,0,9.62,2.63T716.56,181.09Zm-17.09,6.38h3q4.32,0,6.33-1.5a5.46,5.46,0,0,0,2-4.69,5.3,5.3,0,0,0-1.8-4.4c-1.2-1-3.08-1.46-5.62-1.46h-3.9Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M738.08,205l-1.1-3.61h-.19a10.56,10.56,0,0,1-3.78,3.22,11.9,11.9,0,0,1-4.87.86,8.28,8.28,0,0,1-6-2.06,7.76,7.76,0,0,1-2.14-5.84,6.85,6.85,0,0,1,3-6q3-2,9.07-2.22l4.47-.14v-1.39a5.21,5.21,0,0,0-1.16-3.71,4.72,4.72,0,0,0-3.59-1.23,12.4,12.4,0,0,0-3.82.58,28.63,28.63,0,0,0-3.52,1.39l-1.78-3.94a19,19,0,0,1,4.62-1.68,21.38,21.38,0,0,1,4.73-.57q5,0,7.47,2.16t2.51,6.77V205Zm-8.21-3.75a6.82,6.82,0,0,0,4.82-1.68,6.06,6.06,0,0,0,1.82-4.69v-2.26l-3.33.15a11.26,11.26,0,0,0-5.66,1.3,3.94,3.94,0,0,0-1.77,3.55,3.45,3.45,0,0,0,1,2.68A4.45,4.45,0,0,0,729.87,201.25Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M761.89,178.61a13.73,13.73,0,0,1,2.74.23l-.54,5.14a10.23,10.23,0,0,0-2.43-.28,7,7,0,0,0-5.36,2.15,7.79,7.79,0,0,0-2,5.6V205h-5.51V179.08h4.31l.73,4.57h.28a10.24,10.24,0,0,1,3.37-3.68A8,8,0,0,1,761.89,178.61Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M768.15,172.21a3,3,0,0,1,.81-2.27,3.16,3.16,0,0,1,2.31-.8,3.09,3.09,0,0,1,2.26.8,3,3,0,0,1,.81,2.27,3,3,0,0,1-.81,2.22,3.09,3.09,0,0,1-2.26.8,3.16,3.16,0,0,1-2.31-.8A3,3,0,0,1,768.15,172.21ZM774,205h-5.51V179.08H774Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M798.31,197.62a6.78,6.78,0,0,1-2.76,5.82c-1.84,1.35-4.49,2-7.92,2a18.64,18.64,0,0,1-8.32-1.57v-4.76a20.33,20.33,0,0,0,8.5,2.11c3.4,0,5.09-1,5.09-3.07a2.45,2.45,0,0,0-.56-1.64,6.69,6.69,0,0,0-1.85-1.36,31.32,31.32,0,0,0-3.59-1.59q-4.47-1.74-6.06-3.47a6.45,6.45,0,0,1-1.58-4.5,5.91,5.91,0,0,1,2.68-5.17,12.73,12.73,0,0,1,7.3-1.84,20.75,20.75,0,0,1,8.65,1.85l-1.78,4.15a19.16,19.16,0,0,0-7.05-1.73c-2.91,0-4.36.82-4.36,2.48a2.51,2.51,0,0,0,1.13,2.06,24.92,24.92,0,0,0,5,2.32,22.71,22.71,0,0,1,4.67,2.28,6.29,6.29,0,0,1,2.85,5.6Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M835.16,195.7a8.64,8.64,0,0,1-3.3,7.17q-3.32,2.59-9.12,2.6a21.66,21.66,0,0,1-9.52-1.81v-5.29a26.39,26.39,0,0,0,5,1.73,21.26,21.26,0,0,0,4.91.63,7.82,7.82,0,0,0,4.91-1.26,4.13,4.13,0,0,0,1.59-3.4,4.27,4.27,0,0,0-1.46-3.26,22,22,0,0,0-6-3.16c-3.12-1.27-5.33-2.71-6.61-4.34a9.17,9.17,0,0,1-1.92-5.86,8.21,8.21,0,0,1,3-6.75,12.64,12.64,0,0,1,8.18-2.46,24,24,0,0,1,9.79,2.16L832.86,177a21.37,21.37,0,0,0-8.15-1.92,6.26,6.26,0,0,0-4.13,1.18,3.87,3.87,0,0,0-1.4,3.13,4.33,4.33,0,0,0,.56,2.28,5.6,5.6,0,0,0,1.85,1.8,31.78,31.78,0,0,0,4.64,2.22,25.64,25.64,0,0,1,5.53,2.93,8.71,8.71,0,0,1,2.58,3.07A9.22,9.22,0,0,1,835.16,195.7Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M856.47,205l-1.11-3.61h-.18a10.56,10.56,0,0,1-3.78,3.22,11.9,11.9,0,0,1-4.87.86,8.28,8.28,0,0,1-6-2.06,7.72,7.72,0,0,1-2.14-5.84,6.85,6.85,0,0,1,3-6q3-2,9.07-2.22l4.47-.14v-1.39a5.21,5.21,0,0,0-1.16-3.71,4.73,4.73,0,0,0-3.6-1.23,12.5,12.5,0,0,0-3.82.58,29.12,29.12,0,0,0-3.51,1.39l-1.78-3.94a19.12,19.12,0,0,1,4.61-1.68,21.46,21.46,0,0,1,4.74-.57c3.3,0,5.78.72,7.46,2.16s2.52,3.69,2.52,6.77V205Zm-8.21-3.75a6.82,6.82,0,0,0,4.82-1.68,6.06,6.06,0,0,0,1.82-4.69v-2.26l-3.33.15a11.26,11.26,0,0,0-5.66,1.3,3.94,3.94,0,0,0-1.77,3.55,3.45,3.45,0,0,0,1,2.68A4.45,4.45,0,0,0,848.26,201.25Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M877.58,205.47q-5.88,0-8.94-3.43t-3.06-9.86q0-6.54,3.2-10.06t9.25-3.51a17.42,17.42,0,0,1,7.38,1.52l-1.66,4.43A16.84,16.84,0,0,0,878,183.2q-6.72,0-6.72,8.93c0,2.91.55,5.09,1.67,6.55a5.82,5.82,0,0,0,4.91,2.2,14.06,14.06,0,0,0,7-1.83v4.8a10.73,10.73,0,0,1-3.15,1.24A18.9,18.9,0,0,1,877.58,205.47Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M895.44,205h-5.5V168.53h5.5Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M918.58,205l-1.1-3.61h-.19a10.63,10.63,0,0,1-3.77,3.22,12,12,0,0,1-4.88.86,8.25,8.25,0,0,1-6-2.06,7.73,7.73,0,0,1-2.15-5.84,6.85,6.85,0,0,1,3-6c2-1.36,5-2.1,9.07-2.22l4.47-.14v-1.39a5.21,5.21,0,0,0-1.16-3.71,4.72,4.72,0,0,0-3.59-1.23,12.45,12.45,0,0,0-3.82.58A29.27,29.27,0,0,0,905,184.8l-1.78-3.94a19.2,19.2,0,0,1,4.62-1.68,21.38,21.38,0,0,1,4.73-.57q5,0,7.47,2.16t2.52,6.77V205Zm-8.2-3.75a6.79,6.79,0,0,0,4.81-1.68,6.06,6.06,0,0,0,1.82-4.69v-2.26l-3.33.15a11.29,11.29,0,0,0-5.66,1.3,3.94,3.94,0,0,0-1.77,3.55,3.45,3.45,0,0,0,1,2.68A4.46,4.46,0,0,0,910.38,201.25Z" transform="translate(0 0.5)" fill="#ed8930"/><path d="M925.31,179.08h6l5.27,14.69a27.53,27.53,0,0,1,1.59,5.91h.19a25.45,25.45,0,0,1,.77-3.13q.57-1.85,6-17.47H951L940,208.45q-3,8.09-10.07,8.08a15.69,15.69,0,0,1-3.57-.4v-4.36a12.83,12.83,0,0,0,2.84.28c2.66,0,4.52-1.53,5.6-4.61l1-2.44Z" transform="translate(0 0.5)" fill="#ed8930"/></g><g id="Ellipse_1" data-name="Ellipse 1" style="isolation:isolate"><g id="Ellipse_1-2" data-name="Ellipse 1"><path d="M108.75,21.5A86.75,86.75,0,1,1,22,108.25,86.85,86.85,0,0,1,108.75,21.5m0-22A108.75,108.75,0,1,0,217.5,108.25,108.75,108.75,0,0,0,108.75-.5Z" transform="translate(0 0.5)" fill="#ed8930"/></g></g></svg>
\ No newline at end of file
data/images/planche-bois-aliments.jpg

788 KiB

data/images/plat-delicieux1.jpg

410 KiB

body {
background-color: #95c2de;
}
.mainbox {
background-color: #95c2de;
margin: auto;
height: 600px;
width: 600px;
position: relative;
}
.err {
color: #ffffff;
font-family: 'Nunito Sans', sans-serif;
font-size: 11rem;
position:absolute;
left: 20%;
top: 8%;
}
.far {
position: absolute;
font-size: 8.5rem;
left: 42%;
top: 15%;
color: #ffffff;
}
.err2 {
color: #ffffff;
font-family: 'Nunito Sans', sans-serif;
font-size: 11rem;
position:absolute;
left: 68%;
top: 8%;
}
.msg {
text-align: center;
font-family: 'Nunito Sans', sans-serif;
font-size: 1.6rem;
position:absolute;
left: 16%;
top: 45%;
width: 75%;
}
a {
text-decoration: none;
color: white;
}
a:hover {
text-decoration: underline;
}
\ No newline at end of file
body
{
margin: 0;
padding: 0;
height: 100%;
}
.user_card {
width: 350px;
background: #f39c12;
position: relative;
display: flex;
justify-content: center;
flex-direction: column;
padding: 10px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
border-radius: 5px;
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.brand_logo_container {
position: absolute;
height: 170px;
width: 170px;
top: -75px;
border-radius: 50%;
background: white;
padding: 10px;
text-align: center;
}
.brand_logo {
height: 150px;
width: 150px;
border-radius: 50%;
border: 2px solid white;
}
.form_container {
margin-top: 100px;
}
.login_btn {
width: 100%;
background: #c0392b !important;
color: white !important;
}
.login_btn:focus {
box-shadow: none !important;
outline: 0px !important;
}
.login_container {
padding: 0 2rem;
}
.input-group-text {
background: #c0392b !important;
color: white !important;
border: 0 !important;
border-radius: 0.25rem 0 0 0.25rem !important;
}
.input_user,
.input_pass:focus {
box-shadow: none !important;
outline: 0px !important;
}
.custom-checkbox .custom-control-input:checked~.custom-control-label::before {
background-color: #c0392b !important;
}
\ No newline at end of file
@import 'base.css';
#topBarInfos{
color: white !important;
background: linear-gradient(0deg, rgba(236, 111, 32, 0.75), rgba(236, 111, 32, 0.75)), url("/data/images/plat-delicieux1.jpg");
background-position: center;
background-size: cover;
background-repeat: no-repeat;
}
/* Carroussel vitrine */
.carrousselVitrine {
}
.carrousselVitrine .item {
width: 100%;
height: 536px;
margin-right: 10px;
background: var(--mainColor);
counter-increment: item;
}
.item:before {
display: block;
text-align: center;
content: counter(item);
line-height: 536px;
font-size: 80px;
color: white;
}
@media (min-width: 576px) {
.carrousselVitrine .item {
max-width: 540px;
}
}
@media (min-width: 768px) {
.carrousselVitrine .item {
max-width: 720px;
}
}
@media (min-width: 992px) {
.carrousselVitrine .item {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.carrousselVitrine .item {
max-width: 1140px;
}
}
/* newsletter */
.newsletter{
background-color: var(--lightMainColor);
background-image: url("/data/images/illustration-fruits.png");
background-repeat: no-repeat;
background-position: left bottom;
background-size: cover;
background-attachment: scroll;
}
/* Blocs de construction du site */
.block-titres{
border-bottom: 3px solid var(--color-border-grey);
padding: 15px 0;
padding-top: 0;
}
.block-titres.orange{
border-bottom: 3px solid var(--mainColor);
}
/* Cartes des recettes */
.carte-recette{
display: flex;
margin-top: 3rem;
}
.carte-recette-img{
width: 160px;
height: 100%;
border-radius: 5px;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
.carte-recette-infos{
margin-left: 1rem;
}
/*footer*/
footer{
position: relative;
bottom: 0;
background-color: var(--lightMainColor);
padding: 3rem 0;
}
footer a{
color: var(--mainColor)!important;
}
/* Barre de navigation utilisateur connecté */
.memberNavbar{
display: flex;
justify-content: space-between;
align-items: center;
padding: 1px 15px;
background-color: var(--mainColor);
color:white!important;
}
.memberNavbar .userProfilPic{
width: 32px;
height: 32px;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
}
/* Editeur de recette */
.col-editor-content {
flex: 0 0 calc(100% - 280px);
max-width: calc(100% - 280px);
}
.col-editor-sidebar {
flex: 0 0 280px;
max-width: 280px;
}
.vbcard .card-header, .vbcard .card-body{
padding: .75rem !important;
}
.vbcard .editor-headerPic{
width: 100%;
height: 126px;
background-color: var(--lightMainColor);
background-size: cover!important;
background-repeat: no-repeat!important;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.vbcard .editor-headerPic i{
font-size: 2.5em;
}
.rowSubText{
font-size: 0.8em;
}
/* étoiles */
.rating {
--dir: right;
--fill: var(--mainColor);
--fillbg: rgba(100, 100, 100, 0.15);
--heart: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 21.328l-1.453-1.313q-2.484-2.25-3.609-3.328t-2.508-2.672-1.898-2.883-0.516-2.648q0-2.297 1.57-3.891t3.914-1.594q2.719 0 4.5 2.109 1.781-2.109 4.5-2.109 2.344 0 3.914 1.594t1.57 3.891q0 1.828-1.219 3.797t-2.648 3.422-4.664 4.359z"/></svg>');
--star: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z"/></svg>');
--stars: 5;
--starsize: 1.5rem;
--symbol: var(--star);
--value: 1;
--w: calc(var(--stars) * var(--starsize));
--x: calc(100% * (var(--value) / var(--stars)));
block-size: var(--starsize);
inline-size: var(--w);
position: relative;
touch-action: manipulation;
-webkit-appearance: none;
}
[dir="rtl"] .rating {
--dir: left;
}
.rating::-moz-range-track {
background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
block-size: 100%;
mask: repeat left center/var(--starsize) var(--symbol);
}
.rating::-webkit-slider-runnable-track {
background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
block-size: 100%;
mask: repeat left center/var(--starsize) var(--symbol);
-webkit-mask: repeat left center/var(--starsize) var(--symbol);
}
.rating::-moz-range-thumb {
height: var(--starsize);
opacity: 0;
width: var(--starsize);
}
.rating::-webkit-slider-thumb {
height: var(--starsize);
opacity: 0;
width: var(--starsize);
-webkit-appearance: none;
}
/* NO JS */
.rating--nojs::-moz-range-track {
background: var(--fillbg);
}
.rating--nojs::-moz-range-progress {
background: var(--fill);
block-size: 100%;
mask: repeat left center/var(--starsize) var(--star);
}
.rating--nojs::-webkit-slider-runnable-track {
background: var(--fillbg);
}
.rating--nojs::-webkit-slider-thumb {
background-color: var(--fill);
box-shadow: calc(0rem - var(--w)) 0 0 var(--w) var(--fill);
opacity: 1;
width: 1px;
}
/* contenu recette */
.recetteHeaderPic{
width: 100%;
height: 300px;
background-position: center!important;
background-size: cover!important;
background-repeat: no-repeat!important;
border-radius: 5px;
}
.receipe-content-area{
margin-top: 3rem;
}
/* filtre recette */
.filtreRecettes{
border-radius: 5px;
}
\ No newline at end of file
@font-face {
font-family: "Linotype Kaliber Bold";
src: url("ltkaliber-bold.eot"); /* IE9*/
src: url("ltkaliber-bold.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
url("ltkaliber-bold.woff") format("woff"), /* chrome、firefox */
url("ltkaliber-bold.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url("ltkaliber-bold.svg#Linotype Kaliber Bold") format("svg"); /* iOS 4.1- */
}
@font-face {
font-family: 'Inter Regular';
font-style: normal;
......
File deleted
This diff is collapsed.
File deleted
File deleted
File deleted
<html lang="fr">
<head>
<meta charset="UTF-8">
<!-- Dépendances -->
<?=Client::getDependencies()?>
<title>404</title>
<link rel="stylesheet" href="<?=getWebsiteSetting("websiteUrl")?>pages/assets/css/404.css">
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@600;900&display=swap" rel="stylesheet">
<script src="https://kit.fontawesome.com/4b9ba14b0f.js" crossorigin="anonymous"></script>
</head>
<body>
<?=Client::getNavbar()?>
<div class="mainbox">
<div class="err">4</div>
<i class="far fa-question-circle fa-spin"></i>
<div class="err2">4</div>
<div class="msg">Maybe this page moved? Got deleted? Is hiding out in quarantine? Never existed in the first place?<p>Let's go <a href="vitrine">home</a> and try from there.</p></div>
</div>
<?=Client::getFooter()?>
</body>
</html>
\ No newline at end of file
404
\ No newline at end of file
......@@ -12,9 +12,6 @@
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>
<!-- Polices d'écriture -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
<!-- Font Awesome -->
<link rel="stylesheet" type="text/css" href="<?=getWebsiteSetting("websiteUrl")?>pages/assets/vendors/fontawesome/css/all.min.css">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment