From aa63462eff34ee1d22aa7459fc8ce485a7d96732 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Sat, 27 Jun 2026 10:53:19 +0200 Subject: [PATCH] Logo en remplacement de la vitrine : centre et reduit (contain) Quand un adherent n'a pas de photo de couverture mais un logo, le logo n'est plus etire en plein cadre : il est centre et contenu (~80%) sur fond blanc. Composant partage VitrineImage applique a l'annuaire, au carrousel d'accueil et a la fiche adherent. Co-Authored-By: Claude Opus 4.8 --- src/app/adherents/[id]/page.tsx | 25 ++++------- src/app/annuaire/AnnuaireClient.tsx | 25 +++-------- src/components/MembersCarousel.tsx | 23 ++-------- src/components/VitrineImage.tsx | 67 +++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 55 deletions(-) create mode 100644 src/components/VitrineImage.tsx diff --git a/src/app/adherents/[id]/page.tsx b/src/app/adherents/[id]/page.tsx index 77b8d48..ad51e95 100644 --- a/src/app/adherents/[id]/page.tsx +++ b/src/app/adherents/[id]/page.tsx @@ -4,6 +4,7 @@ import type { Metadata } from "next"; import { Sparkle } from "@/components/Sparkle"; import { SiteHeader } from "@/components/SiteHeader"; import { SiteFooter } from "@/components/SiteFooter"; +import { VitrineImage } from "@/components/VitrineImage"; import { getMemberLivePromotions, getPublicMember } from "@/lib/queries"; export const dynamic = "force-dynamic"; @@ -96,25 +97,15 @@ export default async function FicheAdherentPage({ {/* cover + identity */}
-
- {!(member.coverUrl || member.logoUrl) && ( - photo de couverture - )} -
+
0 ? (
{list.map((m, i) => { - const image = m.coverUrl || m.logoUrl; return ( -
- {!image && ( - - photo vitrine - - )} {m.categoryLabel && ( {m.categoryLabel} @@ -225,7 +214,7 @@ export function AnnuaireClient({ {m.promoBadge} )} -
+

{m.name} diff --git a/src/components/MembersCarousel.tsx b/src/components/MembersCarousel.tsx index f43588c..3bc8c49 100644 --- a/src/components/MembersCarousel.tsx +++ b/src/components/MembersCarousel.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import Link from "next/link"; +import { VitrineImage } from "./VitrineImage"; export type CarouselMember = { id: number; @@ -15,16 +16,12 @@ export type CarouselMember = { accent: string | null; }; -const STRIPE_WARM = - "repeating-linear-gradient(45deg,#efe9da,#efe9da 12px,#e6ddc9 12px,#e6ddc9 24px)"; - const VISIBLE = 3; const INTERVAL_MS = 20_000; const STAGGER_MS = 220; // décalage de disparition/apparition entre cartes const FADE_MS = 450; function Card({ m, visible, index }: { m: CarouselMember; visible: boolean; index: number }) { - const image = m.coverUrl || m.logoUrl; return ( -
- {!image && ( - - photo vitrine - - )} + {m.categoryLabel && ( {m.categoryLabel} )} -
+

{m.name} diff --git a/src/components/VitrineImage.tsx b/src/components/VitrineImage.tsx new file mode 100644 index 0000000..bd5fe49 --- /dev/null +++ b/src/components/VitrineImage.tsx @@ -0,0 +1,67 @@ +import type { CSSProperties, ReactNode } from "react"; + +const STRIPE_WARM = + "repeating-linear-gradient(45deg,#efe9da,#efe9da 12px,#e6ddc9 12px,#e6ddc9 24px)"; + +/** + * Zone d'image "vitrine" d'un adhérent. + * - Photo de couverture présente -> affichée en plein cadre (cover). + * - Sinon, le logo est affiché centré et réduit (contain ~80%), pas étiré. + * - Sinon, fond rayé + texte placeholder. + */ +export function VitrineImage({ + coverUrl, + logoUrl, + height, + stripe = STRIPE_WARM, + placeholder = "photo vitrine", + children, +}: { + coverUrl?: string | null; + logoUrl?: string | null; + height: number; + stripe?: string; + placeholder?: string; + children?: ReactNode; +}) { + const cover = coverUrl || null; + const logoOnly = !cover && logoUrl ? logoUrl : null; + + const base: CSSProperties = { + position: "relative", + height, + display: "flex", + alignItems: "center", + justifyContent: "center", + overflow: "hidden", + }; + + if (cover) { + return ( +
{children}
+ ); + } + + if (logoOnly) { + return ( +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + + {children} +
+ ); + } + + return ( +
+ + {placeholder} + + {children} +
+ ); +}