Promotions : la page publique suit le gabarit des pages internes

La première version reprenait le style d'une *section* de l'accueil — un grand
cartouche blanc arrondi — qui détonnait à côté de l'annuaire et de
« L'association ». Elle suit maintenant le même gabarit que l'annuaire :

- `SiteHeader … logo` : toutes les pages internes affichent le logo, seule
  l'accueil s'en passe.
- Bloc de titre sur le fond beige (pastille « N offres en cours », `<h1>` au
  même `clamp`, chapeau, étincelles) au lieu du cartouche.
- Grille de cartes à même la page, `gap` aligné sur les autres listes.
- Bandeau d'adhésion bleu en pied de page, identique à celui de l'annuaire.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
This commit is contained in:
Claude committed 2026-09-06 14:50:41 +00:00
1 parent a52e13e623
commit 353d38bebf
1 file changed
+74 -66
+74 -66
View File
@@ -3,6 +3,7 @@ import Link from "next/link";
import { Sparkle } from "@/components/Sparkle"; import { Sparkle } from "@/components/Sparkle";
import { SiteHeader } from "@/components/SiteHeader"; import { SiteHeader } from "@/components/SiteHeader";
import { SiteFooter } from "@/components/SiteFooter"; import { SiteFooter } from "@/components/SiteFooter";
import { MembershipModalButton } from "@/components/MembershipModalButton";
import { PromoCard } from "@/components/PromoCard"; import { PromoCard } from "@/components/PromoCard";
import { JsonLd } from "@/components/JsonLd"; import { JsonLd } from "@/components/JsonLd";
import { getLivePromotions } from "@/lib/queries"; import { getLivePromotions } from "@/lib/queries";
@@ -31,7 +32,7 @@ export default async function PromotionsPage() {
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" }}>
<SiteHeader active="promotions" /> <SiteHeader active="promotions" logo />
<JsonLd <JsonLd
data={[ data={[
breadcrumbJsonLd(baseUrl, [ breadcrumbJsonLd(baseUrl, [
@@ -42,28 +43,18 @@ export default async function PromotionsPage() {
]} ]}
/> />
<main className="container"> <main className="container" style={{ paddingBottom: 56 }}>
<section {/* title block */}
style={{ <section style={{ position: "relative", padding: "14px 0 22px", overflow: "hidden" }}>
position: "relative", <Sparkle color="#E0A63C" size={18} style={{ top: 22, right: 30 }} duration={3.2} />
margin: "30px 0 10px", <Sparkle color="#6FB0C6" size={12} style={{ top: 60, right: 90 }} duration={2.7} delay={0.5} />
background: "#fff",
border: "1px solid #e6dcc6",
borderRadius: 24,
padding: "38px 36px 42px",
overflow: "hidden",
boxShadow: "0 26px 60px -40px rgba(40,30,15,0.5)",
}}
>
<Sparkle color="#E0A63C" size={20} style={{ top: 28, right: 44 }} duration={3.4} />
<Sparkle color="#6FB0C6" size={13} style={{ top: 64, right: 96 }} duration={2.7} delay={0.5} />
<div <div
style={{ style={{
display: "inline-flex", display: "inline-flex",
alignItems: "center", alignItems: "center",
gap: 8, gap: 9,
background: "#fdeccd", background: "#fff",
border: "1px solid #e6dcc6",
color: "#9a6638", color: "#9a6638",
fontSize: 12, fontSize: 12,
letterSpacing: "0.12em", letterSpacing: "0.12em",
@@ -71,62 +62,79 @@ export default async function PromotionsPage() {
fontWeight: 800, fontWeight: 800,
padding: "6px 13px", padding: "6px 13px",
borderRadius: 999, borderRadius: 999,
marginBottom: 12, marginBottom: 14,
}} }}
> >
Bons plans <span style={{ width: 7, height: 7, borderRadius: "50%", background: "#E0A63C" }} />
{promos.length} offre{promos.length > 1 ? "s" : ""} en cours
</div> </div>
<h1 <h1 className="font-display" style={{ fontWeight: 800, fontSize: "clamp(26px, 6vw, 40px)", letterSpacing: "-0.02em", margin: "0 0 8px", color: "#26201a" }}>
className="font-display" Les bons plans de nos adhérents
style={{ fontWeight: 800, fontSize: "clamp(24px, 5vw, 34px)", letterSpacing: "-0.02em", margin: 0, color: "#26201a" }}
>
Les promotions de nos adhérents
</h1> </h1>
<p style={{ margin: "8px 0 0", color: "#8c8068", fontSize: 15, maxWidth: 640, lineHeight: 1.6 }}> <p style={{ margin: 0, fontSize: 16.5, color: "#6c6150", maxWidth: 560 }}>
Toutes les offres en cours chez les commerçants, artisans et entreprises du réseau. Toutes les offres en cours chez les commerçants, artisans et entreprises du réseau.
Chaque promotion renvoie vers la fiche de son commerce. Chaque promotion renvoie vers la fiche de son commerce.
</p> </p>
{promos.length === 0 ? (
<div
style={{
marginTop: 26,
border: "1px dashed #d8cdb4",
borderRadius: 16,
padding: "34px 20px",
textAlign: "center",
color: "#8c8068",
fontSize: 14.5,
lineHeight: 1.6,
}}
>
Aucune promotion en cours pour le moment.
<br />
<Link href="/annuaire" style={{ color: "#9a6638", fontWeight: 700 }}>
Parcourir l&apos;annuaire des adhérents →
</Link>
</div>
) : (
<>
<div style={{ marginTop: 22, fontSize: 13, color: "#a99c82", fontWeight: 600 }}>
{promos.length} offre{promos.length > 1 ? "s" : ""} en cours
</div>
<div className="grid grid-3" style={{ marginTop: 14 }}>
{promos.map((p) => (
<PromoCard key={p.id} promo={p} />
))}
</div>
</>
)}
</section> </section>
<p style={{ margin: "22px 0 40px", fontSize: 14, color: "#8c8068" }}> {promos.length === 0 ? (
Vous êtes commerçant du Bassin de Pompey ?{" "} <section
<Link href="/association" style={{ color: "#9a6638", fontWeight: 700 }}> style={{
Rejoignez Plein R background: "#fff",
</Link>{" "} border: "1px solid #e6dcc6",
pour publier vos offres ici. borderRadius: 18,
</p> padding: "38px 24px",
textAlign: "center",
color: "#8c8068",
fontSize: 15,
lineHeight: 1.7,
}}
>
Aucune promotion en cours pour le moment.
<br />
<Link href="/annuaire" style={{ color: "#9a6638", fontWeight: 700 }}>
Parcourir l&apos;annuaire des adhérents →
</Link>
</section>
) : (
<div className="grid grid-3" style={{ gap: 20 }}>
{promos.map((p) => (
<PromoCard key={p.id} promo={p} />
))}
</div>
)}
{/* join CTA */}
<section
style={{
marginTop: 34,
position: "relative",
background: "linear-gradient(120deg,#13324F,#1d4a72)",
borderRadius: 20,
padding: "34px 40px",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
gap: 28,
overflow: "hidden",
flexWrap: "wrap",
}}
>
<Sparkle color="#E0A63C" size={18} style={{ top: 20, right: 40 }} duration={3.2} />
<div>
<div style={{ fontSize: 12.5, letterSpacing: "0.12em", textTransform: "uppercase", color: "#9fc6e6", fontWeight: 700, marginBottom: 8 }}>
Vous êtes commerçant du Bassin de Pompey ?
</div>
<h2 className="font-display" style={{ fontWeight: 800, fontSize: 26, margin: 0, color: "#fff" }}>
Publiez vos offres sur Plein R
</h2>
</div>
<MembershipModalButton
label="Adhérer à l'association"
className="font-display"
style={{ border: "none", background: "#E0A63C", color: "#33291D", fontWeight: 700, fontSize: 15.5, padding: "14px 26px", borderRadius: 12, whiteSpace: "nowrap" }}
/>
</section>
</main> </main>
<SiteFooter /> <SiteFooter />