/** * Karten-Darstellung eines Kalenders (gemeinsames Design). * * Wird vom Dashboard und von der Kalenderverwaltung verwendet, damit * beide Stellen identische Karten ausgeben (Designvorlage: Farbverlauf, * Titel unten links, Mitgliederzahl mit Gruppen-Icon unten rechts). * Die ganze Karte ist ein Link; optional kann ein Bearbeiten-Button * (Stift) eingeblendet werden. * * Bewusst ohne 'use client': Die Komponente ist rein darstellend und * funktioniert sowohl in Server- als auch in Client-Komponenten. Der * optionale onEdit-Handler wird nur von Client-Komponenten uebergeben. */ import Link from 'next/link'; /** Graue Verlaufspalette fuer die Karten (Designvorgabe: Grautoene). */ const CARD_GRADIENTS = [ 'from-slate-600 to-slate-800', 'from-slate-500 to-slate-700', 'from-zinc-600 to-zinc-800', 'from-neutral-600 to-neutral-800', 'from-stone-600 to-stone-800', 'from-gray-600 to-gray-800', ] as const; /** * Liefert den Gradienten fuer den Karten-Index (zyklisch). * Fallback auf den ersten Gradienten, falls die Palette leer ist * (noUncheckedIndexedAccess-sicher). */ export function getCardGradient(index: number): string { return CARD_GRADIENTS[index % CARD_GRADIENTS.length] ?? CARD_GRADIENTS[0]!; } /** Eigenschaften der Kalender-Karte. */ export interface CalendarCardProps { title: string; /** Kleine Zeile ueber dem Titel (z. B. Besitzer-E-Mail). */ subtitle?: string | null; isActive: boolean; memberCount: number; /** Ziel des Karten-Links (die ganze Karte ist klickbar). */ href: string; /** Accessibility-Beschriftung des Karten-Links. */ linkLabel: string; /** Gradient-Klassen (siehe getCardGradient). */ gradient: string; /** Optionales title-Attribut am Mitglieder-Icon (z. B. mit Reservierungen). */ iconTitle?: string; /** Optional: Bearbeiten-Button (Stift) mit Handler. */ editLabel?: string; onEdit?: () => void; /** Optional: Karten-Klick oeffnet ein Modal statt dem Link. */ onOpen?: () => void; } /** Einzige Darstellungslogik fuer Kalender-Karten (DRY). */ export function CalendarCard({ title, subtitle, isActive, memberCount, href, linkLabel, gradient, iconTitle, editLabel, onEdit, onOpen, }: CalendarCardProps) { return (
{subtitle}
}