@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; }