feat: nouvelle DA rouge brique + domaine obc-maconnerie.fr

- Palette DA : rouge brique #8B1A1A, gris ardoise #6B7B7A, blanc cassé #F8F6F4
- globals.css : refonte complète @theme inline avec toutes les variables de couleur
- Ajout utilitaires CSS : .texture-dark, .hero-accent, .brick-divider, .section-label
- Animations pulse-glow et stat-glow adaptées au rouge brique
- app/page.tsx : hero amélioré (font-black, texture béton, accent diagonal brique)
- Correction domaine : obc-terrassement.fr → obc-maconnerie.fr dans tous les fichiers
- ContactForm : couleurs état erreur corrigées (variables CSS)

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
This commit is contained in:
Claude
2026-02-27 13:17:02 +00:00
parent 15c60a274c
commit a133f195c2
17 changed files with 218 additions and 271 deletions

View File

@@ -31,8 +31,8 @@ export async function POST(request: Request) {
const { Resend } = await import("resend"); const { Resend } = await import("resend");
const resend = new Resend(process.env.RESEND_API_KEY); const resend = new Resend(process.env.RESEND_API_KEY);
const fromEmail = process.env.RESEND_FROM_EMAIL || "OBC Maçonnerie <contact@obc-terrassement.fr>"; const fromEmail = process.env.RESEND_FROM_EMAIL || "OBC Maçonnerie <contact@obc-maconnerie.fr>";
const adminEmail = process.env.ADMIN_EMAIL || "contact@obc-terrassement.fr"; const adminEmail = process.env.ADMIN_EMAIL || "contact@obc-maconnerie.fr";
await resend.emails.send({ await resend.emails.send({
from: fromEmail, from: fromEmail,

View File

@@ -7,7 +7,7 @@ export const metadata: Metadata = {
title: "Conditions Générales de Vente | OBC Maçonnerie", title: "Conditions Générales de Vente | OBC Maçonnerie",
description: description:
"Conditions générales de vente d'OBC Maçonnerie — Benoît Colin, maçon à Mouchin (59310). Prestations de construction, rénovation et gros œuvre.", "Conditions générales de vente d'OBC Maçonnerie — Benoît Colin, maçon à Mouchin (59310). Prestations de construction, rénovation et gros œuvre.",
alternates: { canonical: "https://obc-terrassement.fr/cgv" }, alternates: { canonical: "https://obc-maconnerie.fr/cgv" },
robots: { index: false, follow: false }, robots: { index: false, follow: false },
}; };

View File

@@ -8,7 +8,7 @@ export const metadata: Metadata = {
title: "Politique de Confidentialité | OBC Maçonnerie", title: "Politique de Confidentialité | OBC Maçonnerie",
description: description:
"Politique de confidentialité et protection des données personnelles du site OBC Maçonnerie, conformément au RGPD.", "Politique de confidentialité et protection des données personnelles du site OBC Maçonnerie, conformément au RGPD.",
alternates: { canonical: "https://obc-terrassement.fr/confidentialite" }, alternates: { canonical: "https://obc-maconnerie.fr/confidentialite" },
robots: { index: false, follow: false }, robots: { index: false, follow: false },
}; };
@@ -36,7 +36,7 @@ export default function Confidentialite() {
<p>SIREN : 531 827 871</p> <p>SIREN : 531 827 871</p>
<p>221 Route de Saint-Amand, 59310 Mouchin</p> <p>221 Route de Saint-Amand, 59310 Mouchin</p>
<p>Tél : <a href={`tel:${siteConfig.phoneRaw}`} className="text-orange hover:underline">{siteConfig.phone}</a></p> <p>Tél : <a href={`tel:${siteConfig.phoneRaw}`} className="text-orange hover:underline">{siteConfig.phone}</a></p>
<p>Email : <a href="mailto:contact@obc-terrassement.fr" className="text-orange hover:underline">contact@obc-terrassement.fr</a></p> <p>Email : <a href="mailto:contact@obc-maconnerie.fr" className="text-orange hover:underline">contact@obc-maconnerie.fr</a></p>
</div> </div>
</section> </section>
@@ -101,8 +101,8 @@ export default function Confidentialite() {
Conformément au RGPD, vous disposez d&apos;un droit d&apos;accès, de rectification, d&apos;effacement et de portabilité de vos données. Pour exercer ces droits, contactez-nous : Conformément au RGPD, vous disposez d&apos;un droit d&apos;accès, de rectification, d&apos;effacement et de portabilité de vos données. Pour exercer ces droits, contactez-nous :
</p> </p>
<p className="mt-3"> <p className="mt-3">
<a href="mailto:contact@obc-terrassement.fr" className="text-orange font-semibold hover:underline"> <a href="mailto:contact@obc-maconnerie.fr" className="text-orange font-semibold hover:underline">
contact@obc-terrassement.fr contact@obc-maconnerie.fr
</a> </a>
</p> </p>
</section> </section>

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie intervient à Douai pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.", "OBC Maçonnerie intervient à Douai pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.",
keywords: ["construction maison Douai", "maçon Douai", "rénovation Douai", "gros oeuvre Douai", "maçon rénovation Douai"], keywords: ["construction maison Douai", "maçon Douai", "rénovation Douai", "gros oeuvre Douai", "maçon rénovation Douai"],
alternates: { canonical: "https://obc-terrassement.fr/construction-maison-douai" }, alternates: { canonical: "https://obc-maconnerie.fr/construction-maison-douai" },
}; };
export default function ConstructionMaisonDouaiPage() { export default function ConstructionMaisonDouaiPage() {

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie intervient à Orchies pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.", "OBC Maçonnerie intervient à Orchies pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.",
keywords: ["construction maison Orchies", "maçon Orchies", "rénovation Orchies", "gros oeuvre Orchies"], keywords: ["construction maison Orchies", "maçon Orchies", "rénovation Orchies", "gros oeuvre Orchies"],
alternates: { canonical: "https://obc-terrassement.fr/construction-maison-orchies" }, alternates: { canonical: "https://obc-maconnerie.fr/construction-maison-orchies" },
}; };
export default function ConstructionMaisonOrchiesPage() { export default function ConstructionMaisonOrchiesPage() {

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie intervient à Valenciennes pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.", "OBC Maçonnerie intervient à Valenciennes pour vos travaux de construction de maison, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.",
keywords: ["construction maison Valenciennes", "maçon Valenciennes", "rénovation Valenciennes", "gros oeuvre Valenciennes"], keywords: ["construction maison Valenciennes", "maçon Valenciennes", "rénovation Valenciennes", "gros oeuvre Valenciennes"],
alternates: { canonical: "https://obc-terrassement.fr/construction-maison-valenciennes" }, alternates: { canonical: "https://obc-maconnerie.fr/construction-maison-valenciennes" },
}; };
export default function ConstructionMaisonValenciennesPage() { export default function ConstructionMaisonValenciennesPage() {

View File

@@ -1,86 +1,91 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap');
@import "tailwindcss"; @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 { @theme inline {
--color-navy: #1B2A4A; /* ── Couleur sombre (sections hero, navbar, CTA band) ── */
--color-navy-light: #2A3D66; /* Charbon chaud : quasi-noir avec légère tonalité terreuse */
--color-navy-dark: #111D36; --color-navy: #1C1A18;
--color-navy-light: #2E2B28;
--color-navy-dark: #100F0D;
--color-orange: #E8772E; /* ── Accent principal : Rouge brique du logo ── */
--color-orange-hover: #D06522; --color-orange: #8B1A1A;
--color-orange-light: #F5A623; --color-orange-hover: #6B1414;
--color-orange-light: #A52424;
--color-stone: #8B7355; /* ── Ardoise (gris secondaire du logo) ── */
--color-stone-light: #C4A882; --color-stone: #6B7B7A;
--color-stone-bg: #F5F0EA; --color-stone-light: #8B9A9A;
--color-stone-bg: #F0EDEA;
--color-bg: #F7F8FA; /* ── Fonds ── */
--color-bg: #F8F6F4;
--color-bg-white: #FFFFFF; --color-bg-white: #FFFFFF;
--color-bg-card: #FFFFFF; --color-bg-card: #FFFFFF;
--color-bg-muted: #F0F2F5; --color-bg-muted: #F0EDEA;
--color-text: #1A1A2E; /* ── Texte ── */
--color-text-light: #6B7280; --color-text: #1C1C1C;
--color-text-muted: #9CA3AF; --color-text-light: #4A4A4A;
--color-text-muted: #6B7B7A;
--color-border: #E5E7EB; /* ── Bordures ── */
--color-border-light: #F3F4F6; --color-border: #DDD8D3;
--color-border-light: #EAE7E4;
--color-success: #10B981; /* ── Statuts ── */
--color-warning: #F59E0B; --color-success: #4A7C59;
--color-error: #EF4444; --color-warning: #C9832A;
--color-error: #C0392B;
--color-primary: #E8772E; /* ── Aliases ── */
--color-primary-hover: #D06522; --color-primary: #8B1A1A;
--color-primary-hover: #6B1414;
--color-dark: #0B0F19;
--color-dark-bg: #0B0F19;
--color-dark-light: #1A1F2E;
--color-dark-lighter: #252A3A;
--color-dark-border: #2A2F3F;
/* ── Typographie ── */
--font-sans: "Inter", sans-serif; --font-sans: "Inter", sans-serif;
} }
/* ================================================
BASE
================================================ */
body { body {
background: var(--color-bg); background: var(--color-bg);
color: var(--color-text); color: var(--color-text);
font-family: var(--font-sans); font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
} }
html { html {
scroll-behavior: smooth; scroll-behavior: smooth;
} }
/* Gradient utilities (used by login, admin, candidature pages) */ /* ================================================
.gradient-text { CARD HOVER — ombre teintée brique
background: linear-gradient(135deg, #6D5EF6, #9D8FF9); ================================================ */
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.gradient-bg {
background: linear-gradient(135deg, #6D5EF6, #9D8FF9);
}
/* Card hover */
.card-hover { .card-hover {
transition: transform 0.3s ease, box-shadow 0.3s ease; transition: transform 0.3s ease, box-shadow 0.3s ease;
} }
.card-hover:hover { .card-hover:hover {
transform: translateY(-4px); transform: translateY(-4px);
box-shadow: 0 12px 32px rgba(27, 42, 74, 0.12); box-shadow: 0 12px 32px rgba(139, 26, 26, 0.10);
} }
/* Orange CTA glow */ /* ================================================
CTA PULSE — glow rouge brique
================================================ */
@keyframes pulse-glow { @keyframes pulse-glow {
0%, 100% { 0%, 100% {
box-shadow: 0 0 16px rgba(232, 119, 46, 0.3); box-shadow: 0 0 16px rgba(139, 26, 26, 0.35);
} }
50% { 50% {
box-shadow: 0 0 32px rgba(232, 119, 46, 0.5); box-shadow: 0 0 36px rgba(139, 26, 26, 0.55);
} }
} }
@@ -88,13 +93,17 @@ html {
animation: pulse-glow 2.5s ease-in-out infinite; animation: pulse-glow 2.5s ease-in-out infinite;
} }
/* Selection */ /* ================================================
SÉLECTION DE TEXTE
================================================ */
::selection { ::selection {
background: rgba(27, 42, 74, 0.15); background: rgba(139, 26, 26, 0.15);
color: var(--color-text); color: var(--color-text);
} }
/* Skip to content */ /* ================================================
SKIP TO CONTENT
================================================ */
.skip-to-content { .skip-to-content {
position: absolute; position: absolute;
left: -9999px; left: -9999px;
@@ -112,13 +121,17 @@ html {
top: 0; top: 0;
} }
/* Focus visible */ /* ================================================
FOCUS VISIBLE
================================================ */
*:focus-visible { *:focus-visible {
outline: 2px solid var(--color-orange); outline: 2px solid var(--color-orange);
outline-offset: 2px; outline-offset: 2px;
} }
/* Scrollbar */ /* ================================================
SCROLLBAR
================================================ */
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 6px; width: 6px;
} }
@@ -133,11 +146,77 @@ html {
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: var(--color-navy); background: var(--color-stone);
} }
/* ================================================ /* ================================================
HERO ANIMATIONS - Staggered text reveal 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 { @keyframes hero-text-appear {
0% { 0% {
@@ -171,25 +250,13 @@ html {
FADE IN ANIMATIONS FADE IN ANIMATIONS
================================================ */ ================================================ */
@keyframes fade-in-down { @keyframes fade-in-down {
0% { 0% { opacity: 0; transform: translateY(-20px); }
opacity: 0; 100% { opacity: 1; transform: translateY(0); }
transform: translateY(-20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
} }
@keyframes fade-in-up { @keyframes fade-in-up {
0% { 0% { opacity: 0; transform: translateY(20px); }
opacity: 0; 100% { opacity: 1; transform: translateY(0); }
transform: translateY(20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
} }
.animate-fade-in-down { .animate-fade-in-down {
@@ -210,15 +277,11 @@ html {
.animation-delay-1000 { animation-delay: 1000ms; } .animation-delay-1000 { animation-delay: 1000ms; }
/* ================================================ /* ================================================
UNDERLINE GROW ANIMATION UNDERLINE GROW
================================================ */ ================================================ */
@keyframes underline-grow { @keyframes underline-grow {
0% { 0% { width: 0; }
width: 0; 100% { width: 100%; }
}
100% {
width: 100%;
}
} }
.animate-underline-grow { .animate-underline-grow {
@@ -227,15 +290,11 @@ html {
} }
/* ================================================ /* ================================================
BOUNCE SLOW (scroll indicator) BOUNCE SLOW
================================================ */ ================================================ */
@keyframes bounce-slow { @keyframes bounce-slow {
0%, 100% { 0%, 100% { transform: translate(-50%, 0); }
transform: translate(-50%, 0); 50% { transform: translate(-50%, 8px); }
}
50% {
transform: translate(-50%, 8px);
}
} }
.animate-bounce-slow { .animate-bounce-slow {
@@ -243,126 +302,7 @@ html {
} }
/* ================================================ /* ================================================
FLOATING ELEMENTS SCROLL REVEAL
================================================ */
@keyframes float-slow {
0%, 100% {
transform: translateY(0) scale(1);
opacity: 0.4;
}
50% {
transform: translateY(-20px) scale(1.1);
opacity: 0.7;
}
}
@keyframes float-medium {
0%, 100% {
transform: translateY(0) translateX(0);
opacity: 0.3;
}
33% {
transform: translateY(-15px) translateX(10px);
opacity: 0.6;
}
66% {
transform: translateY(-25px) translateX(-5px);
opacity: 0.5;
}
}
@keyframes float-fast {
0%, 100% {
transform: translateY(0) rotate(0deg);
opacity: 0.3;
}
50% {
transform: translateY(-12px) rotate(180deg);
opacity: 0.6;
}
}
.animate-float-slow {
animation: float-slow 6s ease-in-out infinite;
}
.animate-float-medium {
animation: float-medium 5s ease-in-out infinite;
}
.animate-float-fast {
animation: float-fast 4s ease-in-out infinite;
}
/* ================================================
ROCKET FLAME ANIMATION
================================================ */
@keyframes flame-flicker {
0%, 100% {
transform: scaleY(1) scaleX(1);
opacity: 0.9;
}
25% {
transform: scaleY(1.1) scaleX(0.95);
opacity: 0.8;
}
50% {
transform: scaleY(0.9) scaleX(1.05);
opacity: 1;
}
75% {
transform: scaleY(1.05) scaleX(0.97);
opacity: 0.85;
}
}
.animate-flame {
transform-origin: center top;
animation: flame-flicker 0.3s ease-in-out infinite;
}
/* ================================================
PARTICLE ANIMATIONS (rocket trail)
================================================ */
@keyframes particle-1 {
0%, 100% {
transform: translateY(0) scale(1);
opacity: 0.6;
}
50% {
transform: translateY(8px) scale(0.5);
opacity: 0;
}
}
@keyframes particle-2 {
0%, 100% {
transform: translateY(0) scale(1);
opacity: 0.4;
}
50% {
transform: translateY(12px) scale(0.3);
opacity: 0;
}
}
@keyframes particle-3 {
0%, 100% {
transform: translateY(0) scale(1);
opacity: 0.5;
}
50% {
transform: translateY(10px) scale(0.4);
opacity: 0;
}
}
.animate-particle-1 { animation: particle-1 1.2s ease-in-out infinite; }
.animate-particle-2 { animation: particle-2 1.5s ease-in-out infinite 0.2s; }
.animate-particle-3 { animation: particle-3 1.3s ease-in-out infinite 0.4s; }
/* ================================================
SCROLL REVEAL ANIMATIONS
================================================ */ ================================================ */
.scroll-reveal-up, .scroll-reveal-up,
.scroll-reveal-down, .scroll-reveal-down,
@@ -374,44 +314,47 @@ html {
transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1); transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
} }
.scroll-reveal-up { .scroll-reveal-up { transform: translateY(40px); }
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-reveal-down {
transform: translateY(-40px);
}
.scroll-reveal-left {
transform: translateX(-40px);
}
.scroll-reveal-right {
transform: translateX(40px);
}
.scroll-reveal-fade {
transform: scale(0.95);
}
/* Revealed state */
.scroll-revealed { .scroll-revealed {
opacity: 1 !important; opacity: 1 !important;
transform: translateY(0) translateX(0) scale(1) !important; transform: translateY(0) translateX(0) scale(1) !important;
} }
/* ================================================ /* ================================================
ANIMATED COUNTER GLOW TEXTURE BÉTON — overlay sur sections sombres
Subtile granularité qui évoque le béton brut
================================================ */ ================================================ */
@keyframes stat-glow { .texture-dark {
0%, 100% { position: relative;
text-shadow: 0 0 10px rgba(232, 119, 46, 0.3);
}
50% {
text-shadow: 0 0 20px rgba(232, 119, 46, 0.6);
}
} }
.animate-stat-glow { .texture-dark::before {
animation: stat-glow 2s ease-in-out infinite; 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;
} }

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie intervient à Flines-lès-Raches pour vos travaux de construction, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.", "OBC Maçonnerie intervient à Flines-lès-Raches pour vos travaux de construction, rénovation et gros œuvre. Benoît Colin, maçon expert. Devis gratuit.",
keywords: ["maçon Flines-lès-Raches", "construction Flines Raches", "rénovation Flines Raches", "maçon Flines Nord"], keywords: ["maçon Flines-lès-Raches", "construction Flines Raches", "rénovation Flines Raches", "maçon Flines Nord"],
alternates: { canonical: "https://obc-terrassement.fr/macon-flines-lez-raches" }, alternates: { canonical: "https://obc-maconnerie.fr/macon-flines-lez-raches" },
}; };
export default function MaconFlinesPage() { export default function MaconFlinesPage() {

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie est basée à Mouchin (59310). Benoît Colin, maçon expert local. Construction, rénovation, assainissement, gros œuvre. Devis gratuit.", "OBC Maçonnerie est basée à Mouchin (59310). Benoît Colin, maçon expert local. Construction, rénovation, assainissement, gros œuvre. Devis gratuit.",
keywords: ["maçon Mouchin", "entreprise maçonnerie Mouchin", "construction Mouchin", "rénovation Mouchin"], keywords: ["maçon Mouchin", "entreprise maçonnerie Mouchin", "construction Mouchin", "rénovation Mouchin"],
alternates: { canonical: "https://obc-terrassement.fr/macon-mouchin" }, alternates: { canonical: "https://obc-maconnerie.fr/macon-mouchin" },
}; };
export default function MaconMouchinPage() { export default function MaconMouchinPage() {

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"OBC Maçonnerie intervient à Saint-Amand-les-Eaux pour vos travaux de construction, rénovation, assainissement et gros œuvre. Devis gratuit.", "OBC Maçonnerie intervient à Saint-Amand-les-Eaux pour vos travaux de construction, rénovation, assainissement et gros œuvre. Devis gratuit.",
keywords: ["maçon Saint-Amand-les-Eaux", "construction Saint-Amand", "rénovation Saint-Amand les Eaux", "maçon Saint-Amand Nord"], keywords: ["maçon Saint-Amand-les-Eaux", "construction Saint-Amand", "rénovation Saint-Amand les Eaux", "maçon Saint-Amand Nord"],
alternates: { canonical: "https://obc-terrassement.fr/macon-saint-amand-les-eaux" }, alternates: { canonical: "https://obc-maconnerie.fr/macon-saint-amand-les-eaux" },
}; };
export default function MaconSaintAmandPage() { export default function MaconSaintAmandPage() {

View File

@@ -8,7 +8,7 @@ export const metadata: Metadata = {
title: "Mentions Légales | OBC Maçonnerie", title: "Mentions Légales | OBC Maçonnerie",
description: description:
"Mentions légales du site OBC Maçonnerie — Benoît Colin, maçon à Mouchin (59310). SIREN 531 827 871.", "Mentions légales du site OBC Maçonnerie — Benoît Colin, maçon à Mouchin (59310). SIREN 531 827 871.",
alternates: { canonical: "https://obc-terrassement.fr/mentions-legales" }, alternates: { canonical: "https://obc-maconnerie.fr/mentions-legales" },
robots: { index: false, follow: false }, robots: { index: false, follow: false },
}; };
@@ -32,7 +32,7 @@ export default function MentionsLegales() {
<div className="space-y-10 text-text-light text-sm leading-relaxed"> <div className="space-y-10 text-text-light text-sm leading-relaxed">
<p className="italic text-text-muted"> <p className="italic text-text-muted">
Conformément aux dispositions de la loi n° 2004-575 du 21 juin 2004 pour la confiance en l&apos;économie numérique (LCEN), voici les informations légales du site <strong className="text-text">obc-terrassement.fr</strong>. Conformément aux dispositions de la loi n° 2004-575 du 21 juin 2004 pour la confiance en l&apos;économie numérique (LCEN), voici les informations légales du site <strong className="text-text">obc-maconnerie.fr</strong>.
</p> </p>
<section> <section>
@@ -45,7 +45,7 @@ export default function MentionsLegales() {
<li><strong className="text-text">SIREN :</strong> 531 827 871</li> <li><strong className="text-text">SIREN :</strong> 531 827 871</li>
<li><strong className="text-text">Siège social :</strong> 221 Route de Saint-Amand, 59310 Mouchin, France</li> <li><strong className="text-text">Siège social :</strong> 221 Route de Saint-Amand, 59310 Mouchin, France</li>
<li><strong className="text-text">Téléphone :</strong> <a href={`tel:${siteConfig.phoneRaw}`} className="text-orange hover:underline">{siteConfig.phone}</a></li> <li><strong className="text-text">Téléphone :</strong> <a href={`tel:${siteConfig.phoneRaw}`} className="text-orange hover:underline">{siteConfig.phone}</a></li>
<li><strong className="text-text">Email :</strong> <a href="mailto:contact@obc-terrassement.fr" className="text-orange hover:underline">contact@obc-terrassement.fr</a></li> <li><strong className="text-text">Email :</strong> <a href="mailto:contact@obc-maconnerie.fr" className="text-orange hover:underline">contact@obc-maconnerie.fr</a></li>
</ul> </ul>
<p className="mt-3"><strong className="text-text">Directeur de la publication :</strong> Benoît COLIN</p> <p className="mt-3"><strong className="text-text">Directeur de la publication :</strong> Benoît COLIN</p>
</div> </div>

View File

@@ -113,20 +113,24 @@ export default async function HomePage() {
<Navbar /> <Navbar />
{/* ── SECTION 1 — HERO ── */} {/* ── SECTION 1 — HERO ── */}
<section className="relative bg-navy overflow-hidden pt-20 pb-24 md:pt-28 md:pb-32"> <section className="relative bg-navy overflow-hidden texture-dark pt-20 pb-24 md:pt-28 md:pb-32">
<div className="absolute inset-0 opacity-5" style={{ backgroundImage: "repeating-linear-gradient(45deg,#fff 0,#fff 1px,transparent 0,transparent 50%)", backgroundSize: "20px 20px" }} /> {/* Accent diagonal brique */}
<div className="hero-accent" />
<div className="hero-accent-line" style={{ right: "30%" }} />
<div className="relative max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 text-center"> <div className="relative max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<div className="inline-flex items-center gap-2 bg-white/10 border border-white/20 rounded-full px-4 py-1.5 mb-6"> <div className="inline-flex items-center gap-2 bg-white/8 border border-white/15 rounded-full px-4 py-1.5 mb-8">
<span className="w-2 h-2 bg-green-400 rounded-full animate-pulse" /> <span className="w-1.5 h-1.5 bg-orange rounded-full" />
<span className="text-white/80 text-sm">{hero.badge}</span> <span className="text-white/70 text-xs font-medium tracking-wide uppercase">{hero.badge}</span>
</div> </div>
<h1 className="text-4xl md:text-6xl font-bold text-white leading-tight mb-6"> <h1 className="text-5xl md:text-7xl font-black text-white leading-none tracking-tight mb-6">
Maçon &amp; Constructeur<br /> Maçon &amp;<br />
<span className="text-orange">dans le Nord</span> <span className="text-orange">Constructeur</span><br />
<span className="text-white/60 text-3xl md:text-4xl font-bold tracking-normal">dans le Nord (59)</span>
</h1> </h1>
<p className="text-white/70 text-lg md:text-xl max-w-2xl mx-auto mb-8">{hero.subtitle}</p> <p className="text-white/60 text-base md:text-lg max-w-xl mx-auto mb-10 leading-relaxed">{hero.subtitle}</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center"> <div className="flex flex-col sm:flex-row gap-4 justify-center">
<Link href="/contact" className="inline-flex items-center justify-center gap-2 bg-orange hover:bg-orange-hover text-white font-bold px-8 py-4 rounded-xl text-base transition-colors pulse-glow"> <Link href="/contact" className="inline-flex items-center justify-center gap-2 bg-orange hover:bg-orange-hover text-white font-bold px-8 py-4 rounded-xl text-base transition-colors pulse-glow">
@@ -135,16 +139,16 @@ export default async function HomePage() {
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" /> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg> </svg>
</Link> </Link>
<Link href="/realisations" className="inline-flex items-center justify-center gap-2 bg-white/10 hover:bg-white/20 text-white font-semibold px-8 py-4 rounded-xl text-base transition-colors border border-white/20"> <Link href="/realisations" className="inline-flex items-center justify-center gap-2 bg-transparent hover:bg-white/8 text-white font-semibold px-8 py-4 rounded-xl text-base transition-colors border border-white/25">
{hero.ctaSecondary} {hero.ctaSecondary}
</Link> </Link>
</div> </div>
<div className="mt-14 grid grid-cols-3 gap-6 max-w-lg mx-auto border-t border-white/10 pt-10"> <div className="mt-16 grid grid-cols-3 gap-8 max-w-md mx-auto border-t border-white/10 pt-10">
{hero.stats.map((s) => ( {hero.stats.map((s) => (
<div key={s.label} className="text-center"> <div key={s.label} className="text-center">
<div className="text-2xl md:text-3xl font-bold text-orange">{s.val}</div> <div className="text-3xl md:text-4xl font-black text-orange animate-stat-glow">{s.val}</div>
<div className="text-white/50 text-xs mt-1">{s.label}</div> <div className="text-white/40 text-xs mt-1 uppercase tracking-wider">{s.label}</div>
</div> </div>
))} ))}
</div> </div>

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"Rénovation de maison et appartement à Douai. OBC Maçonnerie, maçon expert en rénovation dans le Nord (59). Devis gratuit.", "Rénovation de maison et appartement à Douai. OBC Maçonnerie, maçon expert en rénovation dans le Nord (59). Devis gratuit.",
keywords: ["rénovation maison Douai", "maçon rénovation Douai", "rénovation appartement Douai", "travaux rénovation Douai"], keywords: ["rénovation maison Douai", "maçon rénovation Douai", "rénovation appartement Douai", "travaux rénovation Douai"],
alternates: { canonical: "https://obc-terrassement.fr/renovation-maison-douai" }, alternates: { canonical: "https://obc-maconnerie.fr/renovation-maison-douai" },
}; };
export default function RenovationMaisonDouaiPage() { export default function RenovationMaisonDouaiPage() {

View File

@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description: description:
"Rénovation de maison et appartement à Orchies. OBC Maçonnerie, maçon expert en rénovation dans le Nord (59). Devis gratuit.", "Rénovation de maison et appartement à Orchies. OBC Maçonnerie, maçon expert en rénovation dans le Nord (59). Devis gratuit.",
keywords: ["rénovation maison Orchies", "maçon rénovation Orchies", "rénovation appartement Orchies"], keywords: ["rénovation maison Orchies", "maçon rénovation Orchies", "rénovation appartement Orchies"],
alternates: { canonical: "https://obc-terrassement.fr/renovation-maison-orchies" }, alternates: { canonical: "https://obc-maconnerie.fr/renovation-maison-orchies" },
}; };
export default function RenovationMaisonOrchiesPage() { export default function RenovationMaisonOrchiesPage() {

View File

@@ -9,7 +9,7 @@ export const metadata: Metadata = {
title: "Nos Services | Construction, Rénovation, Assainissement", title: "Nos Services | Construction, Rénovation, Assainissement",
description: description:
"Tous les services d'OBC Maçonnerie : construction de maison, rénovation, assainissement, création d'accès et démolition dans le Nord (59). Devis gratuit.", "Tous les services d'OBC Maçonnerie : construction de maison, rénovation, assainissement, création d'accès et démolition dans le Nord (59). Devis gratuit.",
alternates: { canonical: "https://obc-terrassement.fr/services" }, alternates: { canonical: "https://obc-maconnerie.fr/services" },
}; };
export default async function ServicesPage() { export default async function ServicesPage() {

View File

@@ -192,7 +192,7 @@ export default function ContactForm() {
</div> </div>
{error && ( {error && (
<p className="text-error text-sm bg-red-50 border border-red-200 rounded-xl px-4 py-3"> <p className="text-error text-sm bg-stone-bg border border-error/30 rounded-xl px-4 py-3">
{error} {error}
</p> </p>
)} )}

View File

@@ -8,7 +8,7 @@ export const siteConfig = {
dirigeant: "Benoît Colin", dirigeant: "Benoît Colin",
phone: "06 74 45 30 89", phone: "06 74 45 30 89",
phoneRaw: "0674453089", phoneRaw: "0674453089",
email: "contact@obc-terrassement.fr", email: "contact@obc-maconnerie.fr",
address: "221 Route de Saint-Amand, 59310 Mouchin", address: "221 Route de Saint-Amand, 59310 Mouchin",
addressLine1: "221 Route de Saint-Amand", addressLine1: "221 Route de Saint-Amand",
addressLocality: "Mouchin", addressLocality: "Mouchin",
@@ -16,7 +16,7 @@ export const siteConfig = {
addressRegion: "Hauts-de-France", addressRegion: "Hauts-de-France",
addressCountry: "FR", addressCountry: "FR",
siren: "531827871", siren: "531827871",
url: "https://obc-terrassement.fr", url: "https://obc-maconnerie.fr",
zones: [ zones: [
"Orchies", "Orchies",