En-tête/pied de page partagés et cohérents + retrait du bloc métiers

- Menu identique sur toutes les pages publiques (Accueil, Annuaire, Promotions,
  L'association, Espace adhérent) via SiteHeader/SiteFooter : on peut toujours
  revenir à l'accueil depuis l'annuaire et inversement (page courante en gras).
- Retire la section « Parcourir par métier » de la page d'accueil.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
This commit is contained in:
Claude committed 2026-06-26 21:34:30 +00:00
1 parent ef6b233c95
commit 5b6445b571
5 files changed
+101 -193

No files matched your search

+4 -27
View File
@@ -2,6 +2,8 @@ import Link from "next/link";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Sparkle } from "@/components/Sparkle"; import { Sparkle } from "@/components/Sparkle";
import { SiteHeader } from "@/components/SiteHeader";
import { SiteFooter } from "@/components/SiteFooter";
import { getMemberLivePromotions, getPublicMember } from "@/lib/queries"; import { getMemberLivePromotions, getPublicMember } from "@/lib/queries";
export const dynamic = "force-dynamic"; export const dynamic = "force-dynamic";
@@ -81,20 +83,7 @@ export default async function FicheAdherentPage({
return ( return (
<div style={{ background: "#F6F2E8", minHeight: "100vh", fontFamily: "'Public Sans',sans-serif", color: "#33291D" }}> <div style={{ background: "#F6F2E8", minHeight: "100vh", fontFamily: "'Public Sans',sans-serif", color: "#33291D" }}>
{/* header */} <SiteHeader active="annuaire" />
<header className="container" style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "18px 56px", gap: 20 }}>
<Link href="/" style={{ display: "flex", alignItems: "center", gap: 10, textDecoration: "none" }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 44, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 20, color: "#13324F" }}>Plein R</span>
</Link>
<nav style={{ display: "flex", alignItems: "center", gap: 30, flexWrap: "wrap" }}>
<Link href="/" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>Accueil</Link>
<Link href="/annuaire" style={{ textDecoration: "none", color: "#3c3322", fontWeight: 600, fontSize: 15 }}>Annuaire</Link>
<Link href="/#promotions" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>Promotions</Link>
<Link href="/backend" style={{ textDecoration: "none", color: "#fff", background: "#9a6638", fontWeight: 600, fontSize: 14.5, padding: "10px 18px", borderRadius: 999 }}>Espace adhérent</Link>
</nav>
</header>
<div className="container" style={{ paddingBottom: 56 }}> <div className="container" style={{ paddingBottom: 56 }}>
{/* breadcrumb */} {/* breadcrumb */}
@@ -305,19 +294,7 @@ export default async function FicheAdherentPage({
</div> </div>
</div> </div>
{/* footer */} <SiteFooter />
<footer style={{ background: "#EFE9DA", borderTop: "1px solid #e2d6bd", padding: "28px 56px" }}>
<div className="container" style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 16, flexWrap: "wrap" }}>
<div style={{ display: "flex", alignItems: "center", gap: 10 }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 36, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 16, color: "#13324F" }}>Plein R</span>
</div>
<div style={{ fontSize: 13, color: "#8c8068", textAlign: "right", lineHeight: 1.7 }}>
contact@plein-r.fr · Bassin de Pompey<br />Réseau · Rencontre · Réussite
</div>
</div>
</footer>
</div> </div>
); );
} }
+4 -47
View File
@@ -1,6 +1,8 @@
import Link from "next/link"; import Link from "next/link";
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Sparkle } from "@/components/Sparkle"; import { Sparkle } from "@/components/Sparkle";
import { SiteHeader } from "@/components/SiteHeader";
import { SiteFooter } from "@/components/SiteFooter";
import { import {
getActiveMembersWithCategory, getActiveMembersWithCategory,
getAllCategories, getAllCategories,
@@ -43,36 +45,7 @@ export default async function AnnuairePage({
return ( return (
<div style={{ background: "#F6F2E8", minHeight: "100vh", fontFamily: "'Public Sans',sans-serif", color: "#33291D" }}> <div style={{ background: "#F6F2E8", minHeight: "100vh", fontFamily: "'Public Sans',sans-serif", color: "#33291D" }}>
{/* header */} <SiteHeader active="annuaire" />
<header
className="container"
style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "18px 56px", gap: 20 }}
>
<Link href="/" style={{ display: "flex", alignItems: "center", gap: 10, textDecoration: "none" }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 44, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 20, color: "#13324F" }}>
Plein R
</span>
</Link>
<nav style={{ display: "flex", alignItems: "center", gap: 30, flexWrap: "wrap" }}>
<Link href="/" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>
Accueil
</Link>
<Link href="/annuaire" style={{ textDecoration: "none", color: "#3c3322", fontWeight: 600, fontSize: 15 }}>
Annuaire
</Link>
<Link href="/#promotions" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>
Promotions
</Link>
<Link
href="/backend"
style={{ textDecoration: "none", color: "#fff", background: "#9a6638", fontWeight: 600, fontSize: 14.5, padding: "10px 18px", borderRadius: 999 }}
>
Espace adhérent
</Link>
</nav>
</header>
<div className="container" style={{ paddingBottom: 56 }}> <div className="container" style={{ paddingBottom: 56 }}>
{/* title block */} {/* title block */}
@@ -144,23 +117,7 @@ export default async function AnnuairePage({
</section> </section>
</div> </div>
{/* footer */} <SiteFooter />
<footer style={{ background: "#EFE9DA", borderTop: "1px solid #e2d6bd", padding: "28px 56px" }}>
<div className="container" style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 16, flexWrap: "wrap" }}>
<div style={{ display: "flex", alignItems: "center", gap: 10 }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 36, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 16, color: "#13324F" }}>
Plein R
</span>
</div>
<div style={{ fontSize: 13, color: "#8c8068", textAlign: "right", lineHeight: 1.7 }}>
contact@plein-r.fr · Bassin de Pompey
<br />
Réseau · Rencontre · Réussite
</div>
</div>
</footer>
</div> </div>
); );
} }
+6 -119
View File
@@ -1,10 +1,8 @@
import Link from "next/link"; import Link from "next/link";
import { Sparkle } from "@/components/Sparkle"; import { Sparkle } from "@/components/Sparkle";
import { import { SiteHeader } from "@/components/SiteHeader";
getCategoriesWithCounts, import { SiteFooter } from "@/components/SiteFooter";
getHighlightedMembers, import { getHighlightedMembers, getLivePromotions } from "@/lib/queries";
getLivePromotions,
} from "@/lib/queries";
export const dynamic = "force-dynamic"; export const dynamic = "force-dynamic";
@@ -19,8 +17,7 @@ function badgeColor(badge: string | null) {
} }
export default async function AccueilPage() { export default async function AccueilPage() {
const [cats, promos, highlighted] = await Promise.all([ const [promos, highlighted] = await Promise.all([
getCategoriesWithCounts(6),
getLivePromotions(6), getLivePromotions(6),
getHighlightedMembers(3), getHighlightedMembers(3),
]); ]);
@@ -34,53 +31,7 @@ export default async function AccueilPage() {
color: "#33291D", color: "#33291D",
}} }}
> >
{/* header */} <SiteHeader active="accueil" />
<header
className="container"
style={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
padding: "18px 56px",
gap: 20,
}}
>
<Link href="/" style={{ display: "flex", alignItems: "center", gap: 10, textDecoration: "none" }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 44, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 20, color: "#13324F" }}>
Plein R
</span>
</Link>
<nav style={{ display: "flex", alignItems: "center", gap: 30, flexWrap: "wrap" }}>
<a href="/annuaire" style={{ textDecoration: "none", color: "#3c3322", fontWeight: 600, fontSize: 15 }}>
Annuaire
</a>
<a href="#promotions" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>
Promotions
</a>
<a href="#" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>
L&apos;association
</a>
<a href="#" style={{ textDecoration: "none", color: "#6f6450", fontWeight: 500, fontSize: 15 }}>
Adhérer
</a>
<Link
href="/backend"
style={{
textDecoration: "none",
color: "#fff",
background: "#9a6638",
fontWeight: 600,
fontSize: 14.5,
padding: "10px 18px",
borderRadius: 999,
}}
>
Espace adhérent
</Link>
</nav>
</header>
<div className="container"> <div className="container">
{/* hero */} {/* hero */}
@@ -198,51 +149,6 @@ export default async function AccueilPage() {
</div> </div>
</section> </section>
{/* category tiles */}
<section id="annuaire" style={{ padding: "6px 0 8px" }}>
<h2
className="font-display"
style={{ fontWeight: 700, fontSize: 18, textAlign: "center", margin: "0 0 18px", color: "#3c3322" }}
>
Parcourir par métier
</h2>
<div className="grid grid-6">
{cats.map((c) => (
<div
key={c.id}
className="lift"
style={{
background: "#fff",
border: "1px solid #e6dcc6",
borderRadius: 16,
padding: "18px 12px",
textAlign: "center",
cursor: "pointer",
}}
>
<span
style={{
display: "inline-flex",
width: 46,
height: 46,
borderRadius: "50%",
background: c.tint,
alignItems: "center",
justifyContent: "center",
marginBottom: 10,
}}
>
<span className="sparkle" style={{ width: 18, height: 18, background: c.accent }} />
</span>
<div style={{ fontSize: 13, fontWeight: 600, color: "#3c3322" }}>{c.label}</div>
<div style={{ fontSize: 11.5, color: "#a99c82", marginTop: 2 }}>
{c.memberCount} adhérent{c.memberCount > 1 ? "s" : ""}
</div>
</div>
))}
</div>
</section>
{/* promotions */} {/* promotions */}
<section <section
id="promotions" id="promotions"
@@ -565,26 +471,7 @@ export default async function AccueilPage() {
</section> </section>
</div> </div>
{/* footer */} <SiteFooter />
<footer style={{ background: "#EFE9DA", borderTop: "1px solid #e2d6bd", padding: "28px 56px" }}>
<div
className="container"
style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 16, flexWrap: "wrap" }}
>
<div style={{ display: "flex", alignItems: "center", gap: 10 }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 36, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 16, color: "#13324F" }}>
Plein R
</span>
</div>
<div style={{ fontSize: 13, color: "#8c8068", textAlign: "right", lineHeight: 1.7 }}>
contact@plein-r.fr · Bassin de Pompey
<br />
Réseau · Rencontre · Réussite
</div>
</div>
</footer>
</div> </div>
); );
} }
+23
View File
@@ -0,0 +1,23 @@
export function SiteFooter() {
return (
<footer style={{ background: "#EFE9DA", borderTop: "1px solid #e2d6bd", padding: "28px 56px" }}>
<div
className="container"
style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 16, flexWrap: "wrap" }}
>
<div style={{ display: "flex", alignItems: "center", gap: 10 }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 36, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 16, color: "#13324F" }}>
Plein R
</span>
</div>
<div style={{ fontSize: 13, color: "#8c8068", textAlign: "right", lineHeight: 1.7 }}>
contact@plein-r.fr · Bassin de Pompey
<br />
Réseau · Rencontre · Réussite
</div>
</div>
</footer>
);
}
+64
View File
@@ -0,0 +1,64 @@
import Link from "next/link";
const NAV = [
{ key: "accueil", label: "Accueil", href: "/" },
{ key: "annuaire", label: "Annuaire", href: "/annuaire" },
{ key: "promotions", label: "Promotions", href: "/#promotions" },
{ key: "association", label: "L'association", href: "#" },
];
export function SiteHeader({ active }: { active?: string }) {
return (
<header
className="container"
style={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
padding: "18px 56px",
gap: 20,
}}
>
<Link href="/" style={{ display: "flex", alignItems: "center", gap: 10, textDecoration: "none" }}>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src="/assets/logo.png" alt="Plein R" style={{ height: 44, width: "auto" }} />
<span className="font-display" style={{ fontWeight: 800, fontSize: 20, color: "#13324F" }}>
Plein R
</span>
</Link>
<nav style={{ display: "flex", alignItems: "center", gap: 30, flexWrap: "wrap" }}>
{NAV.map((n) => {
const isActive = active === n.key;
return (
<Link
key={n.key}
href={n.href}
style={{
textDecoration: "none",
color: isActive ? "#3c3322" : "#6f6450",
fontWeight: isActive ? 600 : 500,
fontSize: 15,
}}
>
{n.label}
</Link>
);
})}
<Link
href="/backend"
style={{
textDecoration: "none",
color: "#fff",
background: "#9a6638",
fontWeight: 600,
fontSize: 14.5,
padding: "10px 18px",
borderRadius: 999,
}}
>
Espace adhérent
</Link>
</nav>
</header>
);
}