/* ======================================= */ /* 1. RÉINITIALISATION ET STYLES DE BASE */ /* ======================================= */ :root { --primary: #6a11cb; --secondary: #2575fc; --accent: cyan; --highlight: #ffd700; --bg-light: #f4f4f4; --text-dark: #333; --bg-dark-header: linear-gradient(135deg, #1f104c, #03296b); --bg-dark-footer: #1f104c; } html { scroll-behavior: smooth; } body { font-family: 'Poppins', sans-serif; margin: 0; background: var(--bg-light); color: var(--text-dark); transition: background 0.3s, color 0.3s; /* Correction principale pour le HEADER fixe */ /* Ajustement basé sur la hauteur de la navbar (environ 56px) + padding (py-3) */ padding-top: 80px; } /* ======================================= */ /* 2. NAVIGATION ET EN-TÊTE FIXE */ /* ======================================= */ /* Cibler le nav à l'intérieur du header pour appliquer le dégradé, car le nav a la classe Bootstrap py-3 */ header .navbar { background: var(--bg-dark-header); } nav a { position: relative; text-decoration: none; color: #fff; font-weight: 500; } nav a::after { content: ''; position: absolute; width: 0%; height: 2px; bottom: -3px; left: 0; background-color: var(--highlight); transition: width 0.3s; } nav a:hover::after { width: 100%; } nav a:hover { color: var(--highlight); transition: color 0.3s; } /* ======================================= */ /* 3. SECTION HÉRO (#hero) */ /* ======================================= */ #hero { position: relative; text-align: center; padding: 6rem 2rem; background: linear-gradient(135deg, var(--primary), var(--secondary)); background-size: 200% 200%; animation: gradientMove 8s ease infinite; color: white; min-height: calc(122vh - 120px); /* 100% de la fenêtre moins la hauteur du header */ display: flex; /* Assure que le contenu est centré verticalement (d-flex dans HTML) */ align-items: center; } #hero::after { content: ""; position: absolute; inset: 0; background: rgba(0, 255, 255, 0.15); /* voile cyan */ pointer-events: none; } @keyframes gradientMove { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* ======================================= */ /* 4. TYPOGRAPHIE ET HIERARCHIE */ /* ======================================= */ h1 { font-size: 2.5rem; font-weight: 700; } h2 { font-size: 1.8rem; margin-bottom: 1rem; } p { line-height: 1.6; } /* Styles spécifiques pour les sections */ #about { background-color: var(--bg-light); /* Override Bootstrap's bg-light if needed */ } /* ======================================= */ /* 5. SECTION PROJETS (#projects) */ /* ======================================= */ #projects { padding-top: 5rem !important; /* Pour compenser le padding-top du body qui masque le titre */ padding-bottom: 5rem !important; background: #f9f9f9; /* S'assurer de la couleur de fond */ } /* Le système de grille Bootstrap gère le display et flex-wrap */ /* On cible la classe project-card que vous aviez dans l'HTML */ .project-card { /* Utilisation de l'effet glassmorphism sur les cartes */ background: rgba(255, 255, 255, 0.85); backdrop-filter: blur(10px); border-radius: 16px; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); transition: transform 0.3s ease, box-shadow 0.3s ease; text-align: left; /* Aligne le texte à gauche dans les cartes */ } .project-card:hover { transform: translateY(-8px) scale(1.01); /* Moins agressif que 1.05 */ box-shadow: 0 16px 32px rgba(0, 0, 0, 0.25); } .card a { text-decoration: none; color: var(--secondary); font-weight: 600; display: inline-block; /* Pour un lien plus contenu */ } /* Supprime le bleu/violet par défaut */ .card a:visited { color: var(--secondary); } .card a:hover { color: var(--highlight); transition: color 0.3s; } /* ======================================= */ /* 6. BOUTON DU THÈME (#themeToggle) */ /* ======================================= */ #themeToggle { background: #fff; color: var(--secondary); border: none; padding: 0.8rem 1.2rem; border-radius: 25px; cursor: pointer; transition: background 0.3s, color 0.3s; } #themeToggle:hover { background: var(--secondary); color: #fff; } /* ======================================= */ /* 7. FOOTER */ /* ======================================= */ footer { background: var(--bg-dark-footer); color: #fff; text-align: center; /* Bootstrap's py-4 is used, we keep padding here just in case */ } /* ======================================= */ /* 8. DARK MODE (Structure pour JS) */ /* ======================================= */ .dark-mode { --bg-light: #121212; --text-dark: #f0f0f0; --bg-dark-header: linear-gradient(135deg, #0a0a0a, #1f1f1f); --bg-dark-footer: #1f1f1f; } .dark-mode .project-card { background: rgba(30, 30, 30, 0.85); /* Fond de carte sombre et transparent */ box-shadow: 0 8px 20px rgba(255, 255, 255, 0.05); color: var(--text-dark); } /* ======================================= */ /* 5. SECTION PROJETS (#projects)          */ /* ======================================= */ /* ... (autres styles project-card) ... */ /* Styles pour les liens généraux dans les cartes (sauf les boutons) */ /* C'est cette règle qui est trop forte. Nous allons la laisser mais la surclasser. */ .card a {   text-decoration: none;   color: var(--secondary); /* Garde les autres liens bleus si vous en avez */   font-weight: 600;   display: inline-block; } /* 🏆 CORRECTION DÉFINITIVE : Rendre le texte des boutons blanc */ /* Cibler le lien AVEC la classe btn-primary */ .card a.btn-primary { /* Ceci force le texte à être BLANC. Le !important est souvent nécessaire ici pour écraser la règle générique .card a */ color: #fff !important; transition: color 0.3s, background-color 0.3s; } /* Et au survol, le texte redevient jaune comme vous le souhaitez */ .card a.btn-primary:hover { color: var(--highlight) !important; } /* Supprime le bleu/violet par défaut */ .card a:visited {   color: var(--secondary); } .card a:hover {   color: var(--highlight);   transition: color 0.3s; } .dark-mode .card-text.text-muted { color: #b0b0b0 !important; } .dark-mode #about { background-color: #1a1a1a !important; color: var(--text-dark); } .dark-mode #projects { background-color: #212121; } .dark-mode .navbar { background: var(--bg-dark-header); } .dark-mode .navbar-brand { color: #fff !important; } #preloader { position: fixed; top: 0; left: 0; width: 100%; height: 100%; /* Utilisation du dégradé du header pour un look cohérent */ background: var(--bg-dark-header); z-index: 9999; /* Toujours au-dessus de tout */ display: flex; flex-direction: column; justify-content: center; align-items: center; opacity: 0; visibility: hidden; /* Transition douce pour la disparition */ transition: opacity 0.5s ease-out, visibility 0.5s ease-out; } /* Classe active (visible au début du chargement) */ #preloader.preloader-active { opacity: 1; visibility: visible; } /* Styles pour le texte/logo sur l'écran de chargement */ #preloader h1 { font-size: 3rem; /* Petite animation d'entrée */ animation: pulse 1s infinite alternate; } @keyframes pulse { from { transform: scale(1); } to { transform: scale(1.05); } } img { transition: transform 0.4s ease, box-shadow 0.4s ease; } img:hover { transform: scale(1.05) rotate(-2deg); box-shadow: 0 16px 40px rgba(72, 56, 255, 0.4); } .fade-section { opacity: 0; transform: translateY(20px); transition: opacity 0.8s ease, transform 0.8s ease; } .fade-section.visible { opacity: 1; transform: translateY(0); } /* ======================================= */ /* 9. DÉTAIL DU PROJET ET VIDÉOS           */ /* ======================================= */ .video-container { position: relative; padding-bottom: 56.25%; /* Ratio 16:9 */ height: 0; overflow: hidden; border-radius: 12px; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); transition: transform 0.3s ease, box-shadow 0.3s ease; } .video-container:hover { transform: translateY(-4px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); } .video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; } /* Style pour le logo Gitea dans la barre de navigation */ .gitea-icon-nav { height: 1.5rem; /* Ajuste la hauteur de l'image (environ la taille d'une icône de texte) */ width: auto; /* Optionnel : ajoute un filtre pour qu'il soit blanc dans le Dark Mode, si ton logo PNG n'est pas déjà blanc/transparent */ /* filter: invert(1); */ } /* Ajustement pour que le bouton contienne bien l'image */ .gitea-link-button { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; }