import { Link } from "@tanstack/react-router"; import { ChevronRight, type LucideIcon } from "lucide-react"; import { Reveal } from "@/components/motion/Reveal"; import { cn } from "@/lib/utils"; /** * Gravità di un avviso in Home. Il colore non è l'unico segnale: ogni avviso ha anche un'icona * sua e un titolo, così si distingue anche senza vedere i colori. */ export type TonoAvviso = "critico" | "attenzione" | "scaduto" | "azione"; const toni: Record = { critico: "bg-destructive text-destructive-foreground", attenzione: "bg-warning text-warning-foreground", scaduto: "bg-primary text-primary-foreground", azione: "bg-accent-grad text-accent-foreground", }; /** Una riga di un elenco: a sinistra chi, a destra il dettaglio (es. la scadenza). */ export type RigaAvviso = { chi: string; cosa: string }; type ProprietaCorpo = { tono: TonoAvviso; icona: LucideIcon; titolo: string; /** Frasi di spiegazione, una per paragrafo. */ testi?: string[]; /** Elenco di persone con il loro dettaglio; con più di una riga compare il conteggio. */ elenco?: RigaAvviso[]; /** Mostra la freccia: tutta la card porta a un'altra schermata. */ cliccabile?: boolean; /** Parola breve accanto al titolo (es. «Oggi»), per dire subito quando riguarda. */ etichetta?: string; /** I testi in riquadri propri, uno per messaggio: per chi deve fare una cosa precisa. */ riquadri?: boolean; }; /** Contenuto dell'avviso, senza margini né link: è la parte che si può verificare nei test. */ export function CorpoAvviso({ tono, icona: Icona, titolo, testi = [], elenco = [], cliccabile = false, etichetta, riquadri = false, }: ProprietaCorpo) { return (

{titolo}

{etichetta ? ( {etichetta} ) : null} {elenco.length > 1 ? ( {elenco.length} ) : null} {cliccabile ? : null}
{testi.map((t) => (

{t}

))} {elenco.length > 0 ? ( ) : null}
); } /** * Avviso in Home: comparsa graduale, margini della colonna e, se serve, link ai documenti del * profilo. Tutti gli avvisi (certificati, turno palloni) passano da qui per avere lo stesso aspetto. */ export function Avviso({ indice = 0, ...corpo }: ProprietaCorpo & { indice?: number }) { const card = ; return ( {corpo.cliccabile ? ( {card} ) : (
{card}
)}
); }