Portfolio avec Docker
This commit is contained in:
384
style.css
Normal file
384
style.css
Normal file
@@ -0,0 +1,384 @@
|
||||
/* ======================================= */
|
||||
/* 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 <a> 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;
|
||||
}
|
||||
Reference in New Issue
Block a user