import Link from "next/link"; import { VitrineImage } from "@/components/VitrineImage"; import { memberPath } from "@/lib/seo"; import type { MemberContact } from "@/lib/member-contact"; export type MemberCardData = { id: number; name: string; description: string | null; city: string | null; address: string | null; coverUrl: string | null; logoUrl: string | null; categoryLabel: string | null; accent: string | null; hasPromo?: boolean; promoBadge?: string | null; }; const STRIPE_WARM = "repeating-linear-gradient(45deg,#efe9da,#efe9da 12px,#e6ddc9 12px,#e6ddc9 24px)"; const STRIPE_COOL = "repeating-linear-gradient(45deg,#eef0ec,#eef0ec 12px,#e2e8e6 12px,#e2e8e6 24px)"; /** * Hauteurs figées des deux blocs de texte : une description longue ne doit pas * étirer la carte (donc toute la rangée de la grille). Titre et description * sont tronqués en fin de ligne et occupent toujours la même place, ce qui * aligne les cartes entre elles quel que soit le texte saisi par l'adhérent. */ const TITLE_LINE = 1.25; const TITLE_LINES = 2; const DESC_FONT = 13; const DESC_LINE = 1.5; const DESC_LINES = 4; const clampLines = (lines: number) => ({ display: "-webkit-box", WebkitLineClamp: lines, WebkitBoxOrient: "vertical" as const, overflow: "hidden", }) as const; /** * Carte d'un adhérent dans une grille (annuaire, page métier). Composant sans * état : il se rend aussi bien côté serveur que dans le filtre client. * * `contact` (nom du référent, ligne directe) n'est passé qu'aux visiteurs * connectés : la page ne le rapatrie pas du tout pour un visiteur anonyme, il * n'y a donc rien à masquer en CSS. Le numéro reste en texte simple — un * `tel:` imbriqué dans le lien de la carte serait un lien dans un lien. */ export function MemberCard({ m, index = 0, contact = null, }: { m: MemberCardData; index?: number; contact?: MemberContact | null; }) { const location = [m.address, m.city].filter(Boolean).join(" · "); return ( {m.categoryLabel && ( {m.categoryLabel} )} {m.hasPromo && m.promoBadge && ( {m.promoBadge} )}

{m.name}

{m.description}

{location}
{contact && (
Contact adhérent
{contact.name && (
{contact.name}
)} {contact.phone && (
{contact.phone}
)}
)}
); }