mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-11 17:27:54 +02:00
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:
5 files changed
+101
-193
No files matched your search
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -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
@@ -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'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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user