import { useId, useState, type ComponentPropsWithoutRef, type ReactNode } from "react"; import { Link } from "@tanstack/react-router"; import { ChevronDown } from "lucide-react"; import { cn } from "@/lib/utils"; import { statoMeta, type Stato } from "@/lib/crapp-data"; import { useIo } from "@/lib/rosa"; import { Avatar } from "@/components/crapp/Avatar"; import { Reveal } from "@/components/motion/Reveal"; import { Numero } from "@/components/motion/Numero"; export function TeamLogo({ className, /** * Di default l'icona della PWA, che ha dentro il nome dell'app. Dove serve lo * stemma della squadra e basta si passa `/logo-nerorosso.svg`. */ src = "/icon-192.png", }: { className?: string; src?: string; }) { return ( CRAP Volley ); } /** * Superficie standard dell'app: era ripetuta a mano una ventina di volte come * `rounded-3xl bg-card p-4 shadow-card`, quindi cambiare raggio od ombra * voleva dire toccare venti file. * * Gerarchia dei raggi: contenitore `3xl` → elemento interno `2xl` → * controllo `full`. */ export function Card({ className, as: Tag = "div", ...props }: ComponentPropsWithoutRef<"div"> & { as?: "div" | "article" | "section" }) { return ; } /** * Accesso al profilo in alto a destra: la BottomNav ha quattro voci e questa è * l'unica porta verso `/profilo`. Sulla pagina del profilo si passa `azione` a * `PageHeader` per rimetterci il logo — sarebbe un link a sé stessa. */ export function LinkProfilo() { const g = useIo(); if (!g) return ; return ( ); } export function PageHeader({ titolo, sottotitolo, azione, }: { titolo: string; sottotitolo?: string; /** Sostituisce il link al profilo in alto a destra. */ azione?: ReactNode; }) { return (

{titolo}

{sottotitolo ? (

{sottotitolo}

) : null}
{azione ?? }
); } export function Section({ titolo, azione, children, indice = 0, }: { titolo: string; azione?: ReactNode; children: ReactNode; indice?: number; }) { return (

{titolo}

{azione}
{children}
); } /** Sezione con titolo cliccabile: il contenuto si apre e chiude. `anteprima` resta sempre visibile. */ export function SezioneTendina({ titolo, children, anteprima, azione, defaultAperta = false, indice = 0, }: { titolo: string; children: ReactNode; anteprima?: ReactNode; azione?: ReactNode; defaultAperta?: boolean; indice?: number; }) { const [aperta, setAperta] = useState(defaultAperta); const id = useId(); return ( {anteprima}
{aperta ? children : null}
); } export function StatoBadge({ stato, className }: { stato: Stato; className?: string }) { const meta = statoMeta[stato]; return ( {meta.label} ); } export function StatTile({ valore, label, hint, }: { valore: ReactNode; label: string; hint?: string; }) { return (

{typeof valore === "number" ? : valore}

{label}

{hint ?

{hint}

: null}
); }