@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap'); @import "tailwindcss"; /* ================================================ DA OBC Maçonnerie — Rouge brique + Gris ardoise + Blanc cassé Évoque la brique du Nord, le béton, la pierre, le sérieux artisan ================================================ */ @theme inline { /* ── Couleur sombre (sections hero, navbar, CTA band) ── */ /* Charbon chaud : quasi-noir avec légère tonalité terreuse */ --color-navy: #1C1A18; --color-navy-light: #2E2B28; --color-navy-dark: #100F0D; /* ── Accent principal : Rouge brique du logo ── */ --color-orange: #8B1A1A; --color-orange-hover: #6B1414; --color-orange-light: #A52424; /* ── Ardoise (gris secondaire du logo) ── */ --color-stone: #6B7B7A; --color-stone-light: #8B9A9A; --color-stone-bg: #F0EDEA; /* ── Fonds ── */ --color-bg: #F8F6F4; --color-bg-white: #FFFFFF; --color-bg-card: #FFFFFF; --color-bg-muted: #F0EDEA; /* ── Texte ── */ --color-text: #1C1C1C; --color-text-light: #4A4A4A; --color-text-muted: #6B7B7A; /* ── Bordures ── */ --color-border: #DDD8D3; --color-border-light: #EAE7E4; /* ── Statuts ── */ --color-success: #4A7C59; --color-warning: #C9832A; --color-error: #C0392B; /* ── Aliases ── */ --color-primary: #8B1A1A; --color-primary-hover: #6B1414; /* ── Typographie ── */ --font-sans: "Inter", sans-serif; } /* ================================================ BASE ================================================ */ body { background: var(--color-bg); color: var(--color-text); font-family: var(--font-sans); -webkit-font-smoothing: antialiased; } html { scroll-behavior: smooth; } /* ================================================ CARD HOVER — ombre teintée brique ================================================ */ .card-hover { transition: transform 0.3s ease, box-shadow 0.3s ease; } .card-hover:hover { transform: translateY(-4px); box-shadow: 0 12px 32px rgba(139, 26, 26, 0.10); } /* ================================================ CTA PULSE — glow rouge brique ================================================ */ @keyframes pulse-glow { 0%, 100% { box-shadow: 0 0 16px rgba(139, 26, 26, 0.35); } 50% { box-shadow: 0 0 36px rgba(139, 26, 26, 0.55); } } .pulse-glow { animation: pulse-glow 2.5s ease-in-out infinite; } /* ================================================ SÉLECTION DE TEXTE ================================================ */ ::selection { background: rgba(139, 26, 26, 0.15); color: var(--color-text); } /* ================================================ SKIP TO CONTENT ================================================ */ .skip-to-content { position: absolute; left: -9999px; z-index: 999; padding: 0.75rem 1.5rem; background: var(--color-navy); color: #ffffff; font-weight: 600; border-radius: 0 0 8px 0; text-decoration: none; } .skip-to-content:focus { left: 0; top: 0; } /* ================================================ FOCUS VISIBLE ================================================ */ *:focus-visible { outline: 2px solid var(--color-orange); outline-offset: 2px; } /* ================================================ SCROLLBAR ================================================ */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: var(--color-bg); } ::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--color-stone); } /* ================================================ ACCENT DIAGONALE — élément décoratif hero Évoque une maçonnerie en brique posée en diagonale ================================================ */ .hero-accent { position: absolute; top: 0; right: 0; width: 45%; height: 100%; background: linear-gradient(135deg, transparent 40%, rgba(139, 26, 26, 0.07) 100%); pointer-events: none; } .hero-accent-line { position: absolute; top: 0; bottom: 0; width: 4px; background: linear-gradient(180deg, transparent, #8B1A1A 30%, #8B1A1A 70%, transparent); opacity: 0.5; } /* ================================================ SECTION LABEL — étiquette catégorie ================================================ */ .section-label { display: inline-block; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--color-orange); margin-bottom: 0.5rem; } .section-label-light { color: rgba(139, 26, 26, 0.75); } /* ================================================ BRICK DIVIDER — séparateur rouge brique ================================================ */ .brick-divider { width: 3rem; height: 3px; background: var(--color-orange); border-radius: 2px; } /* ================================================ STAT GLOW — compteur chiffres clés ================================================ */ @keyframes stat-glow { 0%, 100% { text-shadow: 0 0 10px rgba(139, 26, 26, 0.25); } 50% { text-shadow: 0 0 22px rgba(139, 26, 26, 0.45); } } .animate-stat-glow { animation: stat-glow 2.5s ease-in-out infinite; } /* ================================================ HERO TEXT ANIMATIONS — staggered reveal ================================================ */ @keyframes hero-text-appear { 0% { opacity: 0; transform: translateY(30px); filter: blur(4px); } 100% { opacity: 1; transform: translateY(0); filter: blur(0); } } .animate-hero-text-1 { opacity: 0; animation: hero-text-appear 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.1s forwards; } .animate-hero-text-2 { opacity: 0; animation: hero-text-appear 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.3s forwards; } .animate-hero-text-3 { opacity: 0; animation: hero-text-appear 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.5s forwards; } /* ================================================ FADE IN ANIMATIONS ================================================ */ @keyframes fade-in-down { 0% { opacity: 0; transform: translateY(-20px); } 100% { opacity: 1; transform: translateY(0); } } @keyframes fade-in-up { 0% { opacity: 0; transform: translateY(20px); } 100% { opacity: 1; transform: translateY(0); } } .animate-fade-in-down { opacity: 0; animation: fade-in-down 0.6s ease-out forwards; } .animate-fade-in-up { opacity: 0; animation: fade-in-up 0.6s ease-out forwards; } /* Animation delays */ .animation-delay-200 { animation-delay: 200ms; } .animation-delay-400 { animation-delay: 400ms; } .animation-delay-600 { animation-delay: 600ms; } .animation-delay-800 { animation-delay: 800ms; } .animation-delay-1000 { animation-delay: 1000ms; } /* ================================================ UNDERLINE GROW ================================================ */ @keyframes underline-grow { 0% { width: 0; } 100% { width: 100%; } } .animate-underline-grow { animation: underline-grow 1s cubic-bezier(0.16, 1, 0.3, 1) 0.8s forwards; width: 0; } /* ================================================ BOUNCE SLOW ================================================ */ @keyframes bounce-slow { 0%, 100% { transform: translate(-50%, 0); } 50% { transform: translate(-50%, 8px); } } .animate-bounce-slow { animation: bounce-slow 2s ease-in-out infinite; } /* ================================================ SCROLL REVEAL ================================================ */ .scroll-reveal-up, .scroll-reveal-down, .scroll-reveal-left, .scroll-reveal-right, .scroll-reveal-fade { opacity: 0; transition-property: opacity, transform; transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1); } .scroll-reveal-up { transform: translateY(40px); } .scroll-reveal-down { transform: translateY(-40px); } .scroll-reveal-left { transform: translateX(-40px); } .scroll-reveal-right { transform: translateX(40px); } .scroll-reveal-fade { transform: scale(0.95); } .scroll-revealed { opacity: 1 !important; transform: translateY(0) translateX(0) scale(1) !important; } /* ================================================ TEXTURE BÉTON — overlay sur sections sombres Subtile granularité qui évoque le béton brut ================================================ */ .texture-dark { position: relative; } .texture-dark::before { content: ""; position: absolute; inset: 0; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E"); background-size: 200px 200px; opacity: 0.4; pointer-events: none; z-index: 0; } .texture-dark > * { position: relative; z-index: 1; } /* ================================================ GRADIENT UTILITIES (legacy — non utilisé OBC) ================================================ */ .gradient-text { background: linear-gradient(135deg, #8B1A1A, #C0392B); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ================================================ BOUTONS — animations premium slide-fill ================================================ */ .btn { position: relative; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; font-weight: 700; cursor: pointer; text-decoration: none; transition: transform 0.2s ease, box-shadow 0.3s ease; } .btn:active { transform: scale(0.97) !important; } .btn > span, .btn > svg { position: relative; z-index: 1; } /* Primaire rouge brique — slide depuis la gauche */ .btn-fill { background: var(--color-orange); color: #fff; } .btn-fill::before { content: ""; position: absolute; inset: 0; background: var(--color-orange-hover); transform: translateX(-101%); transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); z-index: 0; } .btn-fill:hover::before { transform: translateX(0); } .btn-fill:hover { transform: translateY(-3px); box-shadow: 0 12px 32px rgba(139, 26, 26, 0.40); } /* Outline dark — s'inverse en navy */ .btn-outline-dark { background: transparent; color: var(--color-navy); border: 2px solid var(--color-navy); } .btn-outline-dark::before { content: ""; position: absolute; inset: 0; background: var(--color-navy); transform: translateX(-101%); transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); z-index: 0; } .btn-outline-dark:hover::before { transform: translateX(0); } .btn-outline-dark:hover { color: #fff; transform: translateY(-2px); } .btn-outline-dark > span, .btn-outline-dark > svg { position: relative; z-index: 1; } /* Outline light — pour fonds sombres */ .btn-outline-light { background: transparent; color: #fff; border: 2px solid rgba(255,255,255,0.35); } .btn-outline-light::before { content: ""; position: absolute; inset: 0; background: rgba(255,255,255,0.12); transform: translateX(-101%); transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); z-index: 0; } .btn-outline-light:hover::before { transform: translateX(0); } .btn-outline-light:hover { border-color: rgba(255,255,255,0.65); transform: translateY(-2px); } .btn-outline-light > span, .btn-outline-light > svg { position: relative; z-index: 1; } /* Fill blanc — pour sections colorées */ .btn-fill-white { background: #fff; color: var(--color-navy); } .btn-fill-white::before { content: ""; position: absolute; inset: 0; background: var(--color-bg-muted); transform: translateX(-101%); transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); z-index: 0; } .btn-fill-white:hover::before { transform: translateX(0); } .btn-fill-white:hover { transform: translateY(-3px); box-shadow: 0 10px 28px rgba(0,0,0,0.25); } .btn-fill-white > span, .btn-fill-white > svg { position: relative; z-index: 1; } /* Lien-flèche animé */ .btn-arrow { display: inline-flex; align-items: center; gap: 0.5rem; font-weight: 700; transition: color 0.2s ease; } .btn-arrow .arrow-icon { display: inline-flex; transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1); } .btn-arrow:hover .arrow-icon { transform: translateX(7px); } /* ================================================ NAVBAR — underline animé ================================================ */ .nav-link { position: relative; } .nav-link::after { content: ""; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: var(--color-orange); transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .nav-link:hover::after, .nav-link.active::after { width: 100%; } /* ================================================ RÉALISATION CARD — slide-up overlay ================================================ */ .realisation-overlay { transform: translateY(100%); transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); } .realisation-card:hover .realisation-overlay { transform: translateY(0); } /* ================================================ HERO — panneau diagonal brique ================================================ */ .hero-diagonal-panel { position: absolute; top: 0; right: 0; width: 44%; height: 100%; background: var(--color-orange); clip-path: polygon(14% 0%, 100% 0%, 100% 100%, 0% 100%); opacity: 0.13; pointer-events: none; } .hero-diagonal-border { position: absolute; top: 0; right: 0; width: 44%; height: 100%; clip-path: polygon(14% 0%, 100% 0%, 100% 100%, 0% 100%); border-left: 3px solid rgba(139,26,26,0.5); pointer-events: none; } /* ================================================ SERVICE CARD — bordure top rouge brique ================================================ */ .service-card-dark { border-top: 3px solid var(--color-orange); transition: background 0.3s ease, transform 0.2s ease; } .service-card-dark:hover { background: rgba(255,255,255,0.04); transform: translateY(-4px); } /* ================================================ FAQ — icône rotation ================================================ */ .faq-icon { transition: transform 0.3s ease; } details[open] .faq-icon { transform: rotate(45deg); }