Portfolio avec Docker

This commit is contained in:
2025-12-08 00:06:03 +01:00
commit 52f3de74b7
12 changed files with 1161 additions and 0 deletions

384
style.css Normal file
View 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;
}