Affina Profilo e Squadra: logo home, tab Docs uguali, separatore classifica.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Cacciari
2026-09-09 09:10:22 +02:00
co-authored by Cursor
parent b0c1e2f826
commit dbf60d3a7e
4 changed files with 27 additions and 14 deletions
+17 -8
View File
@@ -21,8 +21,9 @@ const transizioneTab = { type: "tween" as const, duration: 0.16, ease: [0.25, 0.
* *
* `variante="sottolineatura"`: pillola piena sulla tab attiva (Squadra e Classifica CSI); * `variante="sottolineatura"`: pillola piena sulla tab attiva (Squadra e Classifica CSI);
* su mobile la sola barra tab scorre in orizzontale senza allargare la pagina. * su mobile la sola barra tab scorre in orizzontale senza allargare la pagina.
* Default `pillole`: tab a larghezza naturale (Profilo). Il titolo ripetuto sotto la * Default `pillole`: tab a larghezza uguale (basata sulla etichetta più lunga); se non
* barra non viene mai mostrato: letichetta è già nella tab. * entrano nella viewport la barra scorre in orizzontale (Profilo). Il titolo ripetuto sotto
* la barra non viene mai mostrato: letichetta è già nella tab.
*/ */
export function BarraSottosezioni({ export function BarraSottosezioni({
voci, voci,
@@ -33,7 +34,7 @@ export function BarraSottosezioni({
voci: VoceSottosezione[]; voci: VoceSottosezione[];
defaultId?: string; defaultId?: string;
variante?: "pillole" | "sottolineatura"; variante?: "pillole" | "sottolineatura";
/** Tab a larghezza uguale che riempiono la barra (es. Campionato). */ /** Tab a larghezza uguale che riempiono la barra (es. Campionato, Squadra). */
riempiLarghezza?: boolean; riempiLarghezza?: boolean;
}) { }) {
const [attiva, setAttiva] = useState(defaultId ?? voci[0]?.id ?? ""); const [attiva, setAttiva] = useState(defaultId ?? voci[0]?.id ?? "");
@@ -89,9 +90,13 @@ export function BarraSottosezioni({
role="tablist" role="tablist"
aria-label="Sottosezioni" aria-label="Sottosezioni"
className={cn( className={cn(
"flex flex-nowrap", riempiLarghezza
riempiLarghezza ? "w-full" : "w-max min-w-full", ? "flex w-full flex-nowrap"
sottolineatura ? "gap-1 px-2 py-1.5" : "snap-x snap-mandatory gap-1.5 px-5", : sottolineatura
? "flex w-max min-w-full flex-nowrap"
: // Pillole: colonne uguali alla voce più lunga; overflow → scroll sul wrapper.
"grid w-max min-w-full grid-flow-col auto-cols-[1fr]",
sottolineatura ? "gap-1 px-2 py-1.5" : "gap-1.5 px-5",
)} )}
> >
{voci.map((v) => { {voci.map((v) => {
@@ -111,7 +116,11 @@ export function BarraSottosezioni({
}} }}
className={cn( className={cn(
"min-h-11 touch-manipulation whitespace-nowrap text-sm font-bold uppercase tracking-wide transition-colors", "min-h-11 touch-manipulation whitespace-nowrap text-sm font-bold uppercase tracking-wide transition-colors",
riempiLarghezza ? "min-w-0 flex-1" : "shrink-0", riempiLarghezza
? "min-w-0 flex-1"
: sottolineatura
? "shrink-0"
: "w-full",
sottolineatura sottolineatura
? cn( ? cn(
"rounded-xl px-1 py-2.5 text-center", "rounded-xl px-1 py-2.5 text-center",
@@ -120,7 +129,7 @@ export function BarraSottosezioni({
: "text-muted-foreground", : "text-muted-foreground",
) )
: cn( : cn(
"snap-center rounded-full px-3.5 py-2", "rounded-full px-3.5 py-2 text-center",
selezionata selezionata
? "bg-accent text-accent-foreground shadow-pop" ? "bg-accent text-accent-foreground shadow-pop"
: "bg-secondary text-muted-foreground", : "bg-secondary text-muted-foreground",
+1 -1
View File
@@ -51,7 +51,7 @@ export function Card({
/** /**
* Accesso al profilo in alto a destra: la BottomNav ha quattro voci e questa è * 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 * l'unica porta verso `/profilo`. Sulla pagina del profilo si passa `azione` a
* `PageHeader` per rimetterci il logo — sarebbe un link a sé stessa. * `PageHeader` con il logo che porta alla home.
* *
* Usa `useGiocatoreBase` (sola anagrafica) e non `useIo`: qui serve solo id e * Usa `useGiocatoreBase` (sola anagrafica) e non `useIo`: qui serve solo id e
* iniziali, mentre `useIo` calcola l'intera rosa con statistiche (MVP, pagelle, * iniziali, mentre `useIo` calcola l'intera rosa con statistiche (MVP, pagelle,
+7 -3
View File
@@ -130,11 +130,15 @@ function Profilo() {
return ( return (
<> <>
{/* Qui il link al profilo sarebbe un link a sé stessa: torna il logo. */} {/* Sul profilo il logo torna in home al posto del link al profilo. */}
<PageHeader <PageHeader
titolo={g.nome} titolo={g.nome}
sottotitolo={`#${g.numero} · ${g.ruolo}`} sottotitolo={`#${g.numero} · ${g.ruolo}`}
azione={<TeamLogo src="/logo-nerorosso.svg" className="h-14 w-14" />} azione={
<Link to="/" aria-label="Vai alla home" className="premi shrink-0 rounded-2xl">
<TeamLogo src="/logo-nerorosso.svg" className="h-14 w-14" />
</Link>
}
/> />
<Reveal className="-mt-6 px-5"> <Reveal className="-mt-6 px-5">
@@ -225,7 +229,7 @@ function Profilo() {
}, },
{ {
id: "documenti", id: "documenti",
label: "Documenti", label: "Docs",
contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />, contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />,
}, },
{ {
+2 -2
View File
@@ -241,7 +241,7 @@ function Squadra() {
<StatTile valore={team.muri} label="Muri squadra" /> <StatTile valore={team.muri} label="Muri squadra" />
</div> </div>
<div> <div className="border-t border-border pt-4">
<button <button
type="button" type="button"
onClick={() => setFiltroAperto(true)} onClick={() => setFiltroAperto(true)}
@@ -287,7 +287,7 @@ function Squadra() {
<div key={g.id} className="rounded-2xl bg-card p-3 shadow-card"> <div key={g.id} className="rounded-2xl bg-card p-3 shadow-card">
<div className="grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3"> <div className="grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3">
<div className="flex min-w-0 items-center gap-3"> <div className="flex min-w-0 items-center gap-3">
<span className="grid h-9 w-9 shrink-0 place-items-center rounded-full bg-secondary font-display text-base"> <span className="grid h-10 w-10 shrink-0 place-items-center rounded-full bg-secondary font-display text-lg">
{i + 1} {i + 1}
</span> </span>
<div className="min-w-0"> <div className="min-w-0">