From 77e5daaa7a2aeaa09d67126645f781cd6e7f0025 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Tue, 6 Oct 2026 11:50:28 +0200 Subject: [PATCH] =?UTF-8?q?Caratteri=20pi=C3=B9=20grandi=20in=20tutta=20l'?= =?UTF-8?q?app=20(DD-049);=20etichetta=20=C2=ABCacche=C2=BB=20nella=20rosa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ogni testo sotto i 16 px sale di un passo in tutte le pagine (12→13, 13→14, 14→15, 15→16); restano invariate le barre a pillola dei menu (navigazione in basso e sottosezioni) e i badge da 10-11 px. Nella scheda giocatore di Squadra l'etichetta «Cacche/partita» diventa «Cacche» (il valore resta la media). Documentazione: DD-049, CHANGELOG, ARCHITECTURE, PROJECT_STATE, moduli squadra e allenatore. Co-Authored-By: Claude Sonnet 5.5 --- PROJECT_STATE.md | 2 +- docs/ARCHITECTURE.md | 4 + docs/CHANGELOG.md | 3 + docs/decisions/DD-049.md | 53 ++++++++++++++ docs/decisions/README.md | 1 + docs/modules/allenatore.md | 2 +- docs/modules/squadra.md | 2 +- src/components/crapp/BadgeDrawer.tsx | 24 +++--- src/components/crapp/CelebrazioneBadge.tsx | 6 +- src/components/crapp/CollezioneBadge.tsx | 52 +++++++------ src/components/crapp/DettaglioCsi.tsx | 36 ++++----- src/components/crapp/EventoCard.tsx | 18 ++--- src/components/crapp/ObiettivoDrawer.tsx | 22 +++--- src/components/crapp/Pagelle.tsx | 22 +++--- .../crapp/ProfiloAmministrativo.tsx | 24 +++--- src/components/crapp/RosaPresenze.tsx | 22 +++--- src/components/crapp/ScoutEntry.tsx | 2 +- src/components/crapp/SerieCard.tsx | 12 +-- src/components/crapp/SondaggioCacche.tsx | 16 ++-- src/components/crapp/TurnoPalloni.tsx | 12 +-- src/components/crapp/VotazioneMvp.tsx | 18 ++--- src/components/crapp/VotoSocial.tsx | 18 +++-- src/components/crapp/ui-bits.tsx | 16 ++-- src/components/ui/drawer.tsx | 2 +- src/routes/__root.tsx | 10 +-- src/routes/admin.tsx | 46 ++++++------ src/routes/allenamento.$id.tsx | 12 +-- src/routes/benvenuto.tsx | 10 +-- src/routes/calendario.tsx | 16 ++-- src/routes/classifica.tsx | 30 ++++---- src/routes/eventi.tsx | 50 +++++++------ src/routes/evento.$id.tsx | 10 +-- src/routes/index.tsx | 38 +++++----- src/routes/partita-csi.$id.tsx | 6 +- src/routes/partita.$id.tsx | 28 +++---- src/routes/profilo.tsx | 20 ++--- src/routes/scout.tsx | 46 ++++++------ src/routes/squadra.tsx | 73 ++++++++++--------- 38 files changed, 437 insertions(+), 347 deletions(-) create mode 100644 docs/decisions/DD-049.md diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index b94e869..57b0d6f 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -20,7 +20,7 @@ schema in [docs/DATABASE.md](docs/DATABASE.md), le procedure in `foto_path`: il codice che non la legge più (1.2.2) va rilasciato. - **Su `develop`, non ancora rilasciato:** obiettivi cliccabili con card di dettaglio, presenze del mese calcolate sui convocati, obiettivi «Presenze collettive» e «evento di squadra al mese» (ora dell'evento), - tessera CSI tolta dalla dashboard (DD-048), notifica di compleanno (DD-047, migration `m31`). Dettaglio in + tessera CSI tolta dalla dashboard (DD-048), avvisi in Home ridisegnati e caratteri più grandi in tutta l'app (DD-049), notifica di compleanno (DD-047, migration `m31`). Dettaglio in [docs/CHANGELOG.md](docs/CHANGELOG.md). - **Worker delle notifiche** (`mailer/`): in funzione su un Raspberry Pi con Docker dal 29/09/2026 ([docs/WORKER_EMAIL.md](docs/WORKER_EMAIL.md)). Il codice con l'interruttore «Email» in Profilo diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 614a699..febec84 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -88,6 +88,10 @@ Componenti condivisi in `src/components/crapp/` (`ui-bits.tsx` per `Card`, `Page `Section`, `StatTile`; `Avviso.tsx` per gli avvisi colorati in Home; i drawer di dettaglio `BadgeDrawer` e `ObiettivoDrawer`), animazioni in `src/components/motion/`. Mobile-first (DD-005): poche schermate, pochi click. +**Caratteri** (DD-049): niente testo sotto i 13 px, tranne la navigazione a pillola e i badge +da 10-11 px. Scala in uso: 13 px note, 15 px corpo, 16 px titoli di card; si usano le misure +fisse `text-[13px]`…`text-[16px]`, non `text-xs` e `text-sm`. + In `src/components/ui/` restano solo le due primitive shadcn davvero usate, `drawer` (vaul) e `sonner`: le altre 43 non erano importate da nessuna parte (DD-021). Il resto dell'interfaccia è composto con Tailwind e la primitiva `Card`, che è l'unica definizione di raggio, sfondo e diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2c855e6..573596c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -25,6 +25,9 @@ versioni `0.y.z` erano pre-release. ### Modificato +- **Caratteri più grandi in tutta l'app** — ogni testo sotto i 16 px sale di un passo (12→13, 14→15, ecc.), nelle + card, negli elenchi, nelle statistiche e nei drawer. Restano uguali le barre a pillola dei menu (navigazione in + basso e sottosezioni) e i badge minuscoli. Solo aspetto, nessuna migration (DD-049). - **Avvisi in Home più leggibili** — certificati e turno palloni usano lo stesso componente (`Avviso`): icona propria per ogni caso (non solo il colore), titolo e testo più grandi, elenchi di persone in righe con il dettaglio a destra e il conteggio, freccia dove la card porta ai documenti, comparsa graduale. Solo aspetto: testi e regole diff --git a/docs/decisions/DD-049.md b/docs/decisions/DD-049.md new file mode 100644 index 0000000..3401e11 --- /dev/null +++ b/docs/decisions/DD-049.md @@ -0,0 +1,53 @@ +# DD-049 — Caratteri più grandi in tutta l'app + +**Data:** 6 ottobre 2026 +**Stato:** Accettata (solo interfaccia, nessuna migration) + +**Contesto** +L'app si usa soprattutto dal telefono, anche da chi non è pratico. Molti testi erano a 12 px +(`text-xs`) e 14 px (`text-sm`): faticosi da leggere, soprattutto in Home, dove le card di +avvisi, eventi e statistiche hanno quasi solo testo piccolo. + +**Decisione** + +1. Tutti i testi sotto i 16 px salgono di **un passo**, in ogni pagina: + + | Prima | Dopo | + | ----------------- | ----- | + | `text-xs` (12 px) | 13 px | + | 13 px | 14 px | + | 14 px | 15 px | + | `text-sm` (14 px) | 15 px | + | 15 px | 16 px | + + Si usano le misure fisse `text-[13px]`, `text-[14px]`, `text-[15px]`, `text-[16px]`, già + presenti nel codice. `text-base` (16 px) e i titoli grandi non cambiano. + +2. **Restano invariati** i testi delle barre a pillola dei menu, cioè la navigazione in basso + (`BottomNav`) e le sottosezioni (`BarraSottosezioni`), e i testi minuscoli da 10 e 11 px + (conteggio sulla campanella). +3. **Avvisi in Home** (certificati e turno palloni): un solo componente, `Avviso` + (`src/components/crapp/Avviso.tsx`), con titolo da 18 px, testi da 15 px, icona propria per + ogni caso (il colore non è l'unico segnale), elenchi in righe con il dettaglio a destra. Il + turno palloni ha in più la pillola «Oggi» o «In arrivo» e i messaggi in riquadri. Cambia solo + l'aspetto, non i testi né le regole su quando un avviso compare. + +**Alternative scartate** + +- Alzare la dimensione base del browser (`rem`) → scartata: ingrandirebbe anche icone, spazi e + barre a pillola, e ogni schermata andrebbe ricontrollata. +- Ingrandire solo la Home → scartata: le altre pagine avevano gli stessi testi piccoli. +- Salire di due passi → scartata: in contenitori stretti (badge, tessere, righe di classifica) + il testo andrebbe a capo o verrebbe troncato. + +**Conseguenze** + +- Un testo che stava stretto può andare a capo o troncarsi: non c'è un controllo visivo + automatico, va guardato sul telefono. Chi vede un punto rotto segnala la schermata. +- Per un testo nuovo, la scala di partenza è 13 px per le note, 15 px per il corpo, 16 px per i + titoli di card. +- Le card degli eventi sono condivise tra Home e Calendario: crescono insieme. + +**Riesame** +Se dopo l'uso sul telefono compaiono testi troncati in più punti, tornare a un passo solo nei +contenitori stretti, senza toccare il resto. diff --git a/docs/decisions/README.md b/docs/decisions/README.md index 5fa5128..9166d4b 100644 --- a/docs/decisions/README.md +++ b/docs/decisions/README.md @@ -86,6 +86,7 @@ Una decisione sostituita non si cancella: si cambia il suo **Stato** e si rimand | [DD-038](DD-038.md) | Tre canali per ogni notifica | | [DD-039](DD-039.md) | Niente promemoria all'allenatore | | [DD-040](DD-040.md) | Palloni e solleciti automatici | +| [DD-049](DD-049.md) | Caratteri più grandi in tutta l'app | | [DD-048](DD-048.md) | Via la tessera dalla dashboard | | [DD-047](DD-047.md) | Notifica di compleanno | | [DD-046](DD-046.md) | Avviso certificati mancanti | diff --git a/docs/modules/allenatore.md b/docs/modules/allenatore.md index c885cd9..2ceeae3 100644 --- a/docs/modules/allenatore.md +++ b/docs/modules/allenatore.md @@ -97,7 +97,7 @@ nessuna schermata: | Dove | Cosa si nasconde all'allenatore | | ----------------------------------- | -------------------------------------------------------------------------------- | | `/squadra` → Stats | il criterio di ordinamento «Cacche» (`cacchePartita`) | -| `/squadra` → Rosa, scheda giocatore | la riga «Cacche/partita 💩» | +| `/squadra` → Rosa, scheda giocatore | la riga «Cacche 💩» | | `/partita/$id` | la sezione «Badge votati dai compagni» e il sondaggio cacche (`SondaggioCacche`) | | push «Sondaggio pre-partita aperto» | non parte verso i dispositivi degli allenatori (`apri-sondaggio.ts`) | | `/profilo`, `/squadra` | le tab Badge (già escluse sopra) | diff --git a/docs/modules/squadra.md b/docs/modules/squadra.md index 65cf7c6..ffbb90f 100644 --- a/docs/modules/squadra.md +++ b/docs/modules/squadra.md @@ -48,7 +48,7 @@ gli allenatori (`tipo = 'allenatore'`, DD-034): hanno uno slot ma non giocano. Nella tab Rosa gli allenatori attivi compaiono in cima, con foto, nome e la dicitura «Allenatore» dove i giocatori hanno il ruolo in campo (`ruoloVisibile()`); niente numero, statistiche né badge, e niente posto nella tab Stats. Chi usa l'app da allenatore vede solo -Rosa e Stats, senza badge e senza cacche (criterio «Cacche» e riga «Cacche/partita»). La +Rosa e Stats, senza badge e senza cacche (criterio «Cacche» e riga «Cacche»). La specifica completa sta in [allenatore.md](allenatore.md). ## Gestione dati squadra (solo amministratore) diff --git a/src/components/crapp/BadgeDrawer.tsx b/src/components/crapp/BadgeDrawer.tsx index f923156..41d2cfe 100644 --- a/src/components/crapp/BadgeDrawer.tsx +++ b/src/components/crapp/BadgeDrawer.tsx @@ -33,7 +33,7 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) {
{def.nome} - + {def.descrizione}
@@ -42,13 +42,15 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) { {stato ? (
-

+

Stato attuale

{grado ? ( - {meta?.label} + + {meta?.label} + ) : ( - + In progresso )} @@ -59,19 +61,19 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) { {stato.prossimaSoglia ? ( <> -

+

Mancano {stato.prossimaSoglia - stato.valore} {def.unita} per il{" "} {gradoMeta[stato.prossimo as Grado].label.toLowerCase()}

) : ( -

Hai raggiunto il livello massimo.

+

Hai raggiunto il livello massimo.

)}
) : null}
-

+

Soglie

@@ -88,7 +90,7 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) { >

@@ -102,7 +104,7 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) { > {def.soglie[g]}

-

{def.unita}

+

{def.unita}

); })} @@ -110,7 +112,7 @@ function DettaglioBadge({ def, stato }: { def: BadgeDef; stato?: BadgeStato }) {
{def.celebrazione ? ( -

+

“{def.celebrazione}”

) : null} @@ -142,7 +144,7 @@ export function BadgeDrawer({ diff --git a/src/components/crapp/CelebrazioneBadge.tsx b/src/components/crapp/CelebrazioneBadge.tsx index e6df35d..a7d2497 100644 --- a/src/components/crapp/CelebrazioneBadge.tsx +++ b/src/components/crapp/CelebrazioneBadge.tsx @@ -51,11 +51,11 @@ export function CelebrazioneBadge() { {notifica.emoji}
-

+

{notifica.tono === "segreto" ? "Badge segreto sbloccato" : "Traguardo raggiunto"}

{notifica.titolo}

-

{notifica.testo}

+

{notifica.testo}

diff --git a/src/components/crapp/CollezioneBadge.tsx b/src/components/crapp/CollezioneBadge.tsx index 32bbdf1..eb604ff 100644 --- a/src/components/crapp/CollezioneBadge.tsx +++ b/src/components/crapp/CollezioneBadge.tsx @@ -45,21 +45,21 @@ function CardBadge({ b, opaco, indice = 0 }: { b: BadgeStato; opaco?: boolean; i
{meta ? ( - {meta.label} + {meta.label} ) : null}
-

{b.def.nome}

-

+

{b.def.nome}

+

{b.valore} {b.def.unita}

{b.prossimaSoglia ? ( <> -

{mancanoPer(b)}

-

{microcopyBadge(b)}

+

{mancanoPer(b)}

+

{microcopyBadge(b)}

) : ( -

{microcopyBadge(b)}

+

{microcopyBadge(b)}

)} ); @@ -90,13 +90,15 @@ function SocialDrawer({
{cat.nome} - + {cat.descrizione}
-

Vinto

+

+ Vinto +

{conteggio}{" "} @@ -109,7 +111,7 @@ function SocialDrawer({ @@ -139,7 +141,7 @@ export function CollezioneBadge({

-

+

Collezione badge

@@ -147,7 +149,7 @@ export function CollezioneBadge({ /{c.totali}

-

+

completata

@@ -156,12 +158,12 @@ export function CollezioneBadge({ {vicino ? (
-

+

Prossimo traguardo

-

{vicino.def.nome}

+

{vicino.def.nome}

-

+

{mancanoPer(vicino)} · {microcopyBadge(vicino)}

@@ -169,7 +171,7 @@ export function CollezioneBadge({ {c.sbloccati.length > 0 ? (
-

+

Sbloccati ({c.sbloccati.length})

@@ -184,7 +186,7 @@ export function CollezioneBadge({ {c.inProgresso.length > 0 ? (
-

+

In progresso ({c.inProgresso.length})

@@ -199,7 +201,7 @@ export function CollezioneBadge({ {socialVinti.length > 0 ? (
-

+

Votati dai compagni

@@ -207,8 +209,8 @@ export function CollezioneBadge({

{cat.emoji}

-

{cat.nome}

-

+

{cat.nome}

+

Vinto {social[cat.id]} {social[cat.id] === 1 ? "volta" : "volte"}

@@ -219,7 +221,7 @@ export function CollezioneBadge({ ) : null}
-

+

Badge segreti

@@ -229,8 +231,8 @@ export function CollezioneBadge({
-

{b.def.nome}

-

+

{b.def.nome}

+

{b.def.celebrazione ?? "Badge segreto sbloccato."}

@@ -243,8 +245,10 @@ export function CollezioneBadge({ className="grid place-items-center rounded-2xl bg-secondary/60 p-3 text-center" > -

???

-

Badge segreto da scoprire

+

+ ??? +

+

Badge segreto da scoprire

))}
diff --git a/src/components/crapp/DettaglioCsi.tsx b/src/components/crapp/DettaglioCsi.tsx index f7ba10c..c2d934f 100644 --- a/src/components/crapp/DettaglioCsi.tsx +++ b/src/components/crapp/DettaglioCsi.tsx @@ -49,7 +49,7 @@ export function MetaPartitaCsi({ .join(" · "); if (!voci && !link) return null; return ( -
+
{voci ? {voci} : null} {link ? ( -

+

{squadra.squadra}

{squadra.titolari.map((g, i) => ( -
- +
+ {g.numero} {g.nome} - {g.ruolo ? {g.ruolo} : null} + {g.ruolo ? {g.ruolo} : null}
))}
@@ -89,7 +89,7 @@ function ListaFormazione({ squadra }: { squadra: FormazioneSquadra }) {

{squadra.panchina.map((g, i) => ( -
+
{g.numero} {g.nome}
@@ -98,7 +98,7 @@ function ListaFormazione({ squadra }: { squadra: FormazioneSquadra }) { ) : null} {squadra.staff.length > 0 ? ( -
+
{squadra.staff.map((s, i) => (
{s.nome} · {s.ruolo} @@ -121,7 +121,7 @@ function BarraPrecedenti({ }) { const totale = noi + avversario || 1; return ( -
+
{noi} {label} @@ -139,7 +139,7 @@ const NOME_NOI = "CRAP Volley"; /** Intestazione con i nomi delle due squadre, per non dover ripeterli su ogni barra sotto. */ function TestataSquadre({ avversario }: { avversario: string }) { return ( -
+
{NOME_NOI} {avversario}
@@ -158,7 +158,7 @@ function BarraProbabilita({ const favoritaNoi = noi >= avversarioPct; return (
-

+

Probabilità di vittoria (calcolo CSI):{" "} {favoritaNoi ? NOME_NOI : avversario}{" "} favorita al {Math.max(noi, avversarioPct).toFixed(0)}%. @@ -171,13 +171,13 @@ function BarraProbabilita({

{noi.toFixed(0)}%
{avversarioPct.toFixed(0)}% @@ -197,7 +197,7 @@ function BloccoPrecedenti({ return (
-

+

{precedenti.totale > 0 ? `${precedenti.totale} precedenti in archivio sul portale CSI.` : "Nessun precedente in archivio sul portale CSI: primo confronto tra le due squadre."} @@ -248,20 +248,22 @@ export function DettaglioCsiEsteso({ const { data, isLoading } = useCsiPartita(matchId); if (isLoading) { - return

Carico i dati dal CSI…

; + return ( +

Carico i dati dal CSI…

+ ); } if (!data || (!data.formazioni && !data.precedenti)) return null; return (
{data.giornata || data.nota ? ( -

+

{[data.giornata, data.nota].filter(Boolean).join(" · ")}

) : null} {data.formazioni ? ( -
+
Formazioni
@@ -272,7 +274,7 @@ export function DettaglioCsiEsteso({ ) : null} {data.precedenti ? ( -
+
Scontri diretti
diff --git a/src/components/crapp/EventoCard.tsx b/src/components/crapp/EventoCard.tsx index 7b6cb51..36be015 100644 --- a/src/components/crapp/EventoCard.tsx +++ b/src/components/crapp/EventoCard.tsx @@ -101,10 +101,10 @@ export function EventoCard({
-

{evento.titolo}

-

{evento.luogo}

+

{evento.titolo}

+

{evento.luogo}

-
+
{etichettaData(evento.data)}
@@ -139,13 +139,13 @@ export function EventoCard({
{tipo.label} - + {etichettaData(evento.data)} {linkTo ? : null} @@ -153,10 +153,10 @@ export function EventoCard({

{evento.titolo}

{sottotitoloPartita ? ( -

{sottotitoloPartita}

+

{sottotitoloPartita}

) : null} -
+
{evento.ora} @@ -174,12 +174,12 @@ export function EventoCard({
{noteCard ? ( -

📝 {noteCard}

+

📝 {noteCard}

) : null} {metaStato ? (

{metaStato.emoji} diff --git a/src/components/crapp/ObiettivoDrawer.tsx b/src/components/crapp/ObiettivoDrawer.tsx index 2662f1b..90d7803 100644 --- a/src/components/crapp/ObiettivoDrawer.tsx +++ b/src/components/crapp/ObiettivoDrawer.tsx @@ -17,12 +17,12 @@ import { function Elenco({ titolo, voci, segno }: { titolo: string; voci: string[]; segno: string }) { return (

-

+

{titolo}

    {voci.map((v) => ( -
  • +
  • {segno} @@ -37,10 +37,10 @@ function Elenco({ titolo, voci, segno }: { titolo: string; voci: string[]; segno function Blocco({ titolo, testo }: { titolo: string; testo: string }) { return (
    -

    +

    {titolo}

    -

    {testo}

    +

    {testo}

    ); } @@ -58,7 +58,7 @@ export function SchedaObiettivo({ o }: { o: ObiettivoSquadra }) {
    {o.titolo} - + {o.descrizione}
    @@ -66,12 +66,12 @@ export function SchedaObiettivo({ o }: { o: ObiettivoSquadra }) {
    -

    +

    Stato attuale

    @@ -83,10 +83,10 @@ export function SchedaObiettivo({ o }: { o: ObiettivoSquadra }) { {o.unita}

    -

    +

    {pct}%{o.scadenza ? ` · entro il ${formatData(o.scadenza)}` : ""}

    -

    {microcopyObiettivo(o)}

    +

    {microcopyObiettivo(o)}

    @@ -101,7 +101,7 @@ export function SchedaObiettivo({ o }: { o: ObiettivoSquadra }) { -

    +

    {o.impatto}

    @@ -130,7 +130,7 @@ export function ObiettivoDrawer({ diff --git a/src/components/crapp/Pagelle.tsx b/src/components/crapp/Pagelle.tsx index 484074e..9d24f22 100644 --- a/src/components/crapp/Pagelle.tsx +++ b/src/components/crapp/Pagelle.tsx @@ -45,19 +45,19 @@ export function Pagelle({ return (
    -

    +

    Pagelle anonime

    - + {chiuse ? "Votazioni chiuse" : `${fatti}/${daVotare.length} votati`}
    -

    +

    Dai un voto da 1 a 10 ai compagni: nessuno vedrà chi ha votato cosa, solo la media.

    {isPending ? ( -

    +

    Carico le pagelle…

    ) : ( @@ -70,15 +70,17 @@ export function Pagelle({ return (
    - + - {g.nome} - + + {g.nome} + + {media ? `Media ${media.media} · ${media.voti} voti` : "Nessun voto"} {sonoIo ? ( - + Sei tu ) : chiuse ? ( @@ -89,7 +91,7 @@ export function Pagelle({ disabled={!io || vota.isPending} onClick={() => setApertoPer(aperto ? null : g.id)} className={cn( - "shrink-0 rounded-full px-3 py-1 text-xs font-bold uppercase transition-colors disabled:opacity-50", + "shrink-0 rounded-full px-3 py-1 text-[13px] font-bold uppercase transition-colors disabled:opacity-50", mio !== undefined ? "bg-accent text-accent-foreground" : "bg-card text-foreground", @@ -107,7 +109,7 @@ export function Pagelle({ type="button" onClick={() => invia(g.id, v)} className={cn( - "rounded-lg py-1.5 text-xs font-bold tabular-nums transition-transform active:scale-90", + "rounded-lg py-1.5 text-[13px] font-bold tabular-nums transition-transform active:scale-90", mio === v ? "bg-accent text-accent-foreground" : "bg-card text-foreground", diff --git a/src/components/crapp/ProfiloAmministrativo.tsx b/src/components/crapp/ProfiloAmministrativo.tsx index 17cfdee..60bc5e6 100644 --- a/src/components/crapp/ProfiloAmministrativo.tsx +++ b/src/components/crapp/ProfiloAmministrativo.tsx @@ -27,7 +27,7 @@ const TIPI_DOCUMENTO = ["Carta d'identità", "Patente", "Passaporto"]; function Intestazione({ titolo, completa }: { titolo: string; completa: boolean }) { return (
    -

    {titolo}

    +

    {titolo}

    {completa ? : null}
    ); @@ -67,7 +67,7 @@ function CampoFile({ return (
    - + input.current?.click()} disabled={inCorso} - className="premi rounded-xl bg-primary px-3 py-2 text-xs font-bold text-primary-foreground disabled:opacity-60" + className="premi rounded-xl bg-primary px-3 py-2 text-[13px] font-bold text-primary-foreground disabled:opacity-60" > {inCorso ? : path ? "Sostituisci" : "Carica"} @@ -336,7 +336,7 @@ export function ProfiloAllenatore({ g }: { g: GiocatoreSquadra }) { style={{ width: `${perc}%` }} />
    - + {perc}%
    @@ -366,7 +366,7 @@ export function ProfiloAllenatore({ g }: { g: GiocatoreSquadra }) { type="button" onClick={() => void salva()} disabled={!sporco || inCorso} - className="premi flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="premi flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {inCorso ? : null} {sporco ? "Salva" : "Salvato"} @@ -430,7 +430,7 @@ export function ProfiloAmministrativo({ style={{ width: `${perc}%` }} />
    - + {perc}%
@@ -472,7 +472,7 @@ export function ProfiloAmministrativo({ type="button" onClick={salvaBozza} disabled={!sporco || salva.isPending} - className="premi flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="premi flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {salva.isPending ? : null} {sporco ? "Salva" : "Salvato"} @@ -486,7 +486,9 @@ export function ProfiloAmministrativo({ {perc}%} + azione={ + {perc}% + } > {corpo} @@ -521,10 +523,10 @@ export function CompletaProfilo({ className="premi block rounded-3xl bg-card p-4 shadow-card" >
- + Completa il tuo profilo - {perc}% + {perc}%
-

+

{allenatore ? "Data e luogo di nascita, telefono ed email." : "Documento e certificato medico servono per il tesseramento CSI."} diff --git a/src/components/crapp/RosaPresenze.tsx b/src/components/crapp/RosaPresenze.tsx index f02d065..ad9c9cf 100644 --- a/src/components/crapp/RosaPresenze.tsx +++ b/src/components/crapp/RosaPresenze.tsx @@ -70,7 +70,7 @@ export function RosaPresenze({

-

+

Hanno risposto {risposteN}/{rosa.length}

{perc}% @@ -84,7 +84,7 @@ export function RosaPresenze({ 0 ? statoMeta[s].className : "bg-secondary text-muted-foreground", )} > @@ -92,14 +92,14 @@ export function RosaPresenze({ ); })} - + ❔ {mancanti.length} da rispondere
{io ? (
-

+

La tua risposta

@@ -114,7 +114,7 @@ export function RosaPresenze({ salva.mutate({ eventoId, giocatoreId: io.id, stato: attivo ? null : s }) } className={cn( - "rounded-full border border-border px-2.5 py-1.5 text-xs font-semibold transition-all active:scale-95 disabled:opacity-50", + "rounded-full border border-border px-2.5 py-1.5 text-[13px] font-semibold transition-all active:scale-95 disabled:opacity-50", attivo ? cn(statoMeta[s].className, "border-transparent shadow-card") : "bg-background text-muted-foreground", @@ -133,7 +133,7 @@ export function RosaPresenze({ type="button" onClick={sollecita} disabled={sollecito || daSollecitare === 0 || passato} - className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-primary px-4 py-3 text-sm font-bold text-primary-foreground disabled:opacity-50" + className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-primary px-4 py-3 text-[15px] font-bold text-primary-foreground disabled:opacity-50" > {sollecito ? ( @@ -146,7 +146,7 @@ export function RosaPresenze({ {isPending ? ( -

+

Carico le risposte…

) : null} @@ -194,16 +194,16 @@ function Gruppo({ attenzione && "border border-dashed border-warning", )} > -

+

{titolo} · {n} {attenzione ? : null}

{lista.map((g) => (
- - {g.nome} - {g.ruolo} + + {g.nome} + {g.ruolo}
))}
diff --git a/src/components/crapp/ScoutEntry.tsx b/src/components/crapp/ScoutEntry.tsx index 6caa845..d67cb79 100644 --- a/src/components/crapp/ScoutEntry.tsx +++ b/src/components/crapp/ScoutEntry.tsx @@ -37,7 +37,7 @@ export function ScoutEntry({ {occupato ? : } {titolo} - {sottotitolo} + {sottotitolo} {disponibile ? : null} diff --git a/src/components/crapp/SerieCard.tsx b/src/components/crapp/SerieCard.tsx index 474e841..395ae44 100644 --- a/src/components/crapp/SerieCard.tsx +++ b/src/components/crapp/SerieCard.tsx @@ -28,8 +28,8 @@ export function SerieGriglia({ g }: { g: Giocatore }) {
-

{s.def.label}

-

{s.def.descrizione}

+

{s.def.label}

+

{s.def.descrizione}

-

+

{s.prossimo ? `${s.valore}/${s.prossimo} · ` : ""} {s.messaggio}

@@ -61,17 +61,17 @@ export function SerieHome({ g }: { g: Giocatore }) {
-

+

Serie {top.def.label.toLowerCase()}: {top.valore}

-

{top.messaggio}

+

{top.messaggio}

{serieGiocatore(g).map((s) => (

{s.valore}

-

+

{s.def.label}

diff --git a/src/components/crapp/SondaggioCacche.tsx b/src/components/crapp/SondaggioCacche.tsx index 59a0213..ef5b58a 100644 --- a/src/components/crapp/SondaggioCacche.tsx +++ b/src/components/crapp/SondaggioCacche.tsx @@ -81,10 +81,10 @@ export function SondaggioCacche({ if (!sondaggioAperto(dataEvento, oraEvento)) { return ( -

+

💩 Sondaggio pre-partita

-

+

{sondaggioTerminato(dataEvento, oraEvento) ? "Sondaggio chiuso: era aperto fino al fischio d'inizio." : "Apre alle 8:00 del giorno della partita: riceverai una notifica."} @@ -96,14 +96,14 @@ export function SondaggioCacche({ return (

-

+

💩 Sondaggio pre-partita

- + {dellaPartita.length} risposte
-

+

Quante cacche hai fatto prima di questa partita? Dato scientifico fondamentale.

@@ -115,7 +115,7 @@ export function SondaggioCacche({ disabled={!io || salva.isPending} onClick={() => rispondi(n)} className={cn( - "min-w-11 rounded-xl px-3 py-2 text-sm font-bold tabular-nums transition-transform active:scale-90 disabled:opacity-50", + "min-w-11 rounded-xl px-3 py-2 text-[15px] font-bold tabular-nums transition-transform active:scale-90 disabled:opacity-50", mia?.quantita === n ? "bg-accent text-accent-foreground shadow-pop" : "bg-secondary text-foreground", @@ -126,7 +126,7 @@ export function SondaggioCacche({ ))}
-
+
Media squadra {media} @@ -145,7 +145,7 @@ export function SondaggioCacche({ type="button" onClick={avvisaTutti} disabled={avviso} - className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-primary px-4 py-3 text-sm font-bold text-primary-foreground disabled:opacity-50" + className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-primary px-4 py-3 text-[15px] font-bold text-primary-foreground disabled:opacity-50" > {avviso ? : } Avvisa tutti del sondaggio diff --git a/src/components/crapp/TurnoPalloni.tsx b/src/components/crapp/TurnoPalloni.tsx index ff4bfb5..59e289d 100644 --- a/src/components/crapp/TurnoPalloni.tsx +++ b/src/components/crapp/TurnoPalloni.tsx @@ -74,16 +74,16 @@ export function TurnoPalloni({ eventoId }: { eventoId: string }) { - + Palloni - + {isPending || assegna.isPending ? ( ) : null} {giocatore ? nomeCompleto(giocatore) : "Da assegnare"} {proposto && giocatore ? ( - + proposto ) : null} @@ -100,11 +100,11 @@ export function TurnoPalloni({ eventoId }: { eventoId: string }) { type="button" onClick={() => scegli(g.id)} className={cn( - "flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-sm transition-colors", + "flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-[15px] transition-colors", g.id === id ? "bg-accent/10 font-bold" : "hover:bg-secondary", )} > - + {nomeCompleto(g)} {g.id === id ? : null} @@ -117,7 +117,7 @@ export function TurnoPalloni({ eventoId }: { eventoId: string }) { type="button" onClick={avvisa} disabled={avviso} - className="premi mt-2.5 flex w-full items-center justify-center gap-2 rounded-xl bg-card px-3 py-2 text-xs font-bold uppercase text-foreground disabled:opacity-50" + className="premi mt-2.5 flex w-full items-center justify-center gap-2 rounded-xl bg-card px-3 py-2 text-[13px] font-bold uppercase text-foreground disabled:opacity-50" > {avviso ? ( diff --git a/src/components/crapp/VotazioneMvp.tsx b/src/components/crapp/VotazioneMvp.tsx index 3de0a90..08adfb7 100644 --- a/src/components/crapp/VotazioneMvp.tsx +++ b/src/components/crapp/VotazioneMvp.tsx @@ -46,10 +46,10 @@ export function VotazioneMvp({ evento }: { evento: Evento }) { if (!votoMvpAperto(evento.data, evento.ora)) { return (
-

+

Voto MVP

-

+

Apre {ORE_ATTESA_MVP} ore dopo l'inizio della partita.

@@ -75,20 +75,20 @@ export function VotazioneMvp({ evento }: { evento: Evento }) { return (
-

+

Voto MVP · {totale} {totale === 1 ? "voto" : "voti"}

-

+

{testa && !pareggio ? ( {testa.nome} ({testa.voti}) @@ -100,9 +100,9 @@ export function VotazioneMvp({ evento }: { evento: Evento }) { )}

{mio ? ( -

Hai votato {mio.votato_nome}

+

Hai votato {mio.votato_nome}

) : !puoVotare ? ( -

+

Vota chi era presente a questa partita.

) : null} @@ -120,7 +120,7 @@ export function VotazioneMvp({ evento }: { evento: Evento }) { disabled={vota.isPending} onClick={() => invia(g.id, nomeCompleto(g))} className={cn( - "truncate rounded-xl px-2.5 py-2 text-left text-xs font-semibold transition-colors", + "truncate rounded-xl px-2.5 py-2 text-left text-[13px] font-semibold transition-colors", mio?.votato_id === g.id ? "bg-accent text-accent-foreground" : "bg-card text-foreground", @@ -133,7 +133,7 @@ export function VotazioneMvp({ evento }: { evento: Evento }) { ) : conteggio.length > 0 ? (
{conteggio.map((c) => ( - + {c.nome} · {c.voti} ))} diff --git a/src/components/crapp/VotoSocial.tsx b/src/components/crapp/VotoSocial.tsx index 60468ab..c38f63d 100644 --- a/src/components/crapp/VotoSocial.tsx +++ b/src/components/crapp/VotoSocial.tsx @@ -51,7 +51,7 @@ export function VotoSocial({ matchId }: { matchId: string }) { return (
-
+
Hai votato {fatti}/{categorieSocial.length} categorie · un solo voto per categoria @@ -79,14 +79,16 @@ export function VotoSocial({ matchId }: { matchId: string }) { {cat.emoji} - {cat.nome} - + + {cat.nome} + + {mio ? `Hai votato ${mio.votato_nome}` : cat.descrizione} @@ -105,7 +107,7 @@ export function VotoSocial({ matchId }: { matchId: string }) { disabled={vota.isPending} onClick={() => invia(cat.id, g.id, nomeCompleto(g))} className={cn( - "truncate rounded-xl px-2.5 py-2 text-left text-xs font-semibold transition-colors", + "truncate rounded-xl px-2.5 py-2 text-left text-[13px] font-semibold transition-colors", mio?.votato_id === g.id ? "bg-accent text-accent-foreground" : "bg-secondary text-foreground", @@ -118,17 +120,17 @@ export function VotoSocial({ matchId }: { matchId: string }) { ) : (
{totale === 0 ? ( -

+

Nessun voto ancora: apri e scegli un compagno.

) : vincitore ? ( -

+

{vincitore.nome} · {vincitore.voti} {vincitore.voti === 1 ? "voto" : "voti"}

) : ( -

+

Parità con {totale} voti: servono altri voti per assegnare il badge.

)} diff --git a/src/components/crapp/ui-bits.tsx b/src/components/crapp/ui-bits.tsx index 9080813..3310eda 100644 --- a/src/components/crapp/ui-bits.tsx +++ b/src/components/crapp/ui-bits.tsx @@ -107,13 +107,13 @@ function RigaNotifica({ const arrivo = info.offset.x + proietta(info.velocity.x); if (arrivo < -60) onElimina(notifica.id); }} - className="touch-pan-y bg-card p-3 pr-8 text-sm" + className="touch-pan-y bg-card p-3 pr-8 text-[15px]" >

{notifica.titolo}

{notifica.corpo ? (

{notifica.corpo}

) : null} -

{tempoRelativo(notifica.creataIl)}

+

{tempoRelativo(notifica.creataIl)}

{azione ?? } @@ -338,7 +338,7 @@ export function SezioneTendina({ * parità di padding — un'altezza esplicita allinea tutti i campi tra loro. */ export const classiInput = - "h-10 w-full min-w-0 rounded-xl border border-border bg-background px-3 py-2 text-sm"; + "h-10 w-full min-w-0 rounded-xl border border-border bg-background px-3 py-2 text-[15px]"; /** * Etichetta + controllo di un form. `min-w-0`: dentro `grid-cols-2` questa label @@ -349,7 +349,7 @@ export const classiInput = export function Campo({ label, children }: { label: string; children: ReactNode }) { return (
); } diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx index fc12725..b3a1e2c 100644 --- a/src/components/ui/drawer.tsx +++ b/src/components/ui/drawer.tsx @@ -78,7 +78,7 @@ const DrawerDescription = React.forwardRef< >(({ className, ...props }, ref) => ( )); diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 3171510..ea89f5c 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -27,13 +27,13 @@ function NotFoundComponent() {

404

Pagina non trovata

-

+

La pagina che cerchi non esiste o è stata spostata.

Torna alla home @@ -53,7 +53,7 @@ function ErrorComponent({ error, reset }: { error: unknown; reset: () => void })

Questa pagina non si è caricata

-

+

Qualcosa è andato storto da parte nostra. Puoi riprovare o tornare alla home.

@@ -63,13 +63,13 @@ function ErrorComponent({ error, reset }: { error: unknown; reset: () => void }) router.invalidate(); reset(); }} - className="premi inline-flex min-h-11 items-center justify-center rounded-2xl bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground" + className="premi inline-flex min-h-11 items-center justify-center rounded-2xl bg-primary px-4 py-2 text-[15px] font-semibold text-primary-foreground" > Riprova Torna alla home diff --git a/src/routes/admin.tsx b/src/routes/admin.tsx index 038a0ee..1c9226d 100644 --- a/src/routes/admin.tsx +++ b/src/routes/admin.tsx @@ -184,7 +184,7 @@ function ModificaGiocatore({ g, profilo }: { g: GiocatoreSquadra; profilo: Profi return (
-

Dati squadra

+

Dati squadra

Salva dati squadra {allenatore ? ( <> -

Dati personali

+

Dati personali

setBozza({ ...profiloCorrente, ...patch })} @@ -268,12 +268,12 @@ function ModificaGiocatore({ g, profilo }: { g: GiocatoreSquadra; profilo: Profi type="button" onClick={confermaProfilo} disabled={!bozza || salvaProfilo.isPending} - className="premi w-full rounded-2xl bg-primary py-2.5 text-xs font-bold uppercase text-primary-foreground disabled:opacity-50" + className="premi w-full rounded-2xl bg-primary py-2.5 text-[13px] font-bold uppercase text-primary-foreground disabled:opacity-50" > Salva dati personali -
+
{g.authUserId ? "Account collegato" : "Nessun account collegato"} @@ -344,7 +344,7 @@ function Documento({ onClick={scarica} disabled={!path || inCorso} className={cn( - "premi flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-bold uppercase disabled:opacity-60", + "premi flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[13px] font-bold uppercase disabled:opacity-60", statoClasse[stato], )} > @@ -382,12 +382,12 @@ function SchedaGiocatore({ return ( @@ -489,7 +489,7 @@ function AggiungiGiocatore({ righe }: { righe: GiocatoreSquadra[] }) { return (
-

+

{allenatore ? "Nuovo allenatore" : "Nuovo giocatore"}

@@ -563,7 +563,7 @@ function AggiungiGiocatore({ righe }: { righe: GiocatoreSquadra[] }) { setAperto(false); setDati(datiVuoti); }} - className="premi flex-1 rounded-2xl bg-secondary py-2.5 text-xs font-bold uppercase" + className="premi flex-1 rounded-2xl bg-secondary py-2.5 text-[13px] font-bold uppercase" > Annulla @@ -571,7 +571,7 @@ function AggiungiGiocatore({ righe }: { righe: GiocatoreSquadra[] }) { type="button" onClick={() => void conferma()} disabled={aggiungi.isPending} - className="premi flex-1 rounded-2xl bg-primary py-2.5 text-xs font-bold uppercase text-primary-foreground disabled:opacity-50" + className="premi flex-1 rounded-2xl bg-primary py-2.5 text-[13px] font-bold uppercase text-primary-foreground disabled:opacity-50" > Aggiungi @@ -598,7 +598,7 @@ function GiocatoreDisattivato({ g }: { g: GiocatoreSquadra }) {

{nomeCompleto(g)}

-

+

{isAllenatore(g) ? ruoloVisibile(g) : `#${g.numero} · ${g.ruolo}`}

@@ -606,7 +606,7 @@ function GiocatoreDisattivato({ g }: { g: GiocatoreSquadra }) { type="button" onClick={() => void riattiva()} disabled={impostaAttivo.isPending} - className="premi flex shrink-0 items-center gap-1.5 rounded-xl bg-success px-3 py-2 text-xs font-bold text-success-foreground disabled:opacity-50" + className="premi flex shrink-0 items-center gap-1.5 rounded-xl bg-success px-3 py-2 text-[13px] font-bold text-success-foreground disabled:opacity-50" > Riattiva @@ -653,7 +653,7 @@ function Dashboard() { <>
-

+

Riservata agli amministratori della squadra.

@@ -689,7 +689,7 @@ function Dashboard() { @@ -698,7 +698,7 @@ function Dashboard() { ); const contenutoProfili = isPending ? ( -

+

Caricamento…

) : ( @@ -715,7 +715,7 @@ function Dashboard() { /> ))} {allenatori.length > 0 ? ( -

Allenatori

+

Allenatori

) : null} {allenatori.map((g, i) => ( setDestinatarioMessaggio({ nome: "tutta la squadra" })} - className="premi mt-3 flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop" + className="premi mt-3 flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop" > Invia messaggio a tutti @@ -764,7 +764,7 @@ function Dashboard() { )}

@@ -784,7 +784,7 @@ function Dashboard() {

) : ( -

+

Caricamento…

); @@ -838,7 +838,7 @@ function Dashboard() { type="button" onClick={inviaMessaggio} disabled={inviaNotifica.isPending || !messaggio.trim()} - className="flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {inviaNotifica.isPending ? ( @@ -850,7 +850,7 @@ function Dashboard() { diff --git a/src/routes/allenamento.$id.tsx b/src/routes/allenamento.$id.tsx index 72bf46e..2a6e031 100644 --- a/src/routes/allenamento.$id.tsx +++ b/src/routes/allenamento.$id.tsx @@ -43,7 +43,9 @@ function AllenamentoDetail() { if (!evento) { return (
-

Allenamento non trovato

+

+ Allenamento non trovato +

); } @@ -59,14 +61,14 @@ function AllenamentoDetail() {
-

+

Allenamento di squadra

{evento.titolo}

-
+
{evento.ora} @@ -76,12 +78,12 @@ function AllenamentoDetail() {
{evento.note ? ( -

+

{evento.note}

) : null} -
+
Conferme: {presentiVeri}/{convocatiEvento(evento, rosa).length}
diff --git a/src/routes/benvenuto.tsx b/src/routes/benvenuto.tsx index c20cda0..ab3dd7d 100644 --- a/src/routes/benvenuto.tsx +++ b/src/routes/benvenuto.tsx @@ -107,34 +107,34 @@ function Benvenuto() { {!pronta ? null : !utenteId ? ( <> -

+

Accedi con il tuo account Google per collegare il profilo giocatore.

) : erroreCollegamento ? ( <> -

+

Nessun profilo trovato per la tua email. Contatta un amministratore per collegare il tuo account.

) : inAttesaCollegamento ? ( -

+

Ti stiamo collegando al tuo profilo...

) : null} diff --git a/src/routes/calendario.tsx b/src/routes/calendario.tsx index 3a35251..d8e0120 100644 --- a/src/routes/calendario.tsx +++ b/src/routes/calendario.tsx @@ -119,7 +119,7 @@ function Calendario() {
-
+
{giorniIT.map((g, i) => ( {g} ))} @@ -192,7 +192,7 @@ function Calendario() { onClick={haEventi ? () => apriGiorno(giorno) : undefined} style={sfondo ? { backgroundImage: sfondo } : undefined} className={cn( - "relative grid aspect-square place-items-center rounded-xl text-sm font-semibold", + "relative grid aspect-square place-items-center rounded-xl text-[15px] font-semibold", tipo === "partita" && "bg-accent text-accent-foreground", tipo === "allenamento" && "bg-training text-training-foreground", tipo === "evento" && "bg-warning text-warning-foreground", @@ -224,10 +224,10 @@ function Calendario() {
-

+

Scorri a destra o sinistra per cambiare mese.

-
+
Partita @@ -248,7 +248,7 @@ function Calendario() {
Gestisci eventi @@ -263,7 +263,7 @@ function Calendario() { return ; }) ) : ( -

+

Nessun evento in programma

)} @@ -275,7 +275,7 @@ function Calendario() { {compleanniMese.length > 0 ? ( compleanniMese.map((c) => ) ) : ( -

+

Nessun compleanno in {mesiIT[mese]!.toLowerCase()}

)} @@ -300,7 +300,7 @@ function Calendario() { return ; }) ) : ( -

+

Nessun evento in questa data

)} diff --git a/src/routes/classifica.tsx b/src/routes/classifica.tsx index c0208ba..a06abed 100644 --- a/src/routes/classifica.tsx +++ b/src/routes/classifica.tsx @@ -82,7 +82,7 @@ export const Route = createFileRoute("/classifica")({ function TabellaClassifica({ righe, vuoto }: { righe: RigaClassifica[]; vuoto: string }) { return (
-
+
# Squadra G @@ -90,7 +90,7 @@ function TabellaClassifica({ righe, vuoto }: { righe: RigaClassifica[]; vuoto: s Pt
{righe.length === 0 ? ( -

{vuoto}

+

{vuoto}

) : ( righe.map((r) => { const noi = isNostraSquadra(r.squadra) || r.squadra === "CRAP Volley"; @@ -98,14 +98,14 @@ function TabellaClassifica({ righe, vuoto }: { righe: RigaClassifica[]; vuoto: s
{r.pos} {r.squadra} - {r.giocate} - + {r.giocate} + {r.setFatti}:{r.setSubiti} {r.punti} @@ -171,7 +171,7 @@ function Classifica() { <>
{classificaCoppa.length > 0 ? ( <> -

Coppa

+

Coppa

-

Girone

+

Girone

) : null} @@ -204,14 +204,14 @@ function Classifica() { const contenutoStorico = useMemo( () => tuttiMatch.length === 0 ? ( -

+

Nessuna partita disponibile.

) : (
{raggruppaPerStagione(tuttiMatch).map(({ stagione, match }) => (
-

Stagione {stagione}

+

Stagione {stagione}

{match.map((m) => { const vinta = m.setNostri > m.setLoro; const eventoId = eventoIdPerData.get(m.data); @@ -237,7 +237,7 @@ function Classifica() { logoAvversario={m.logoAvversario} avversario={m.avversario} /> -

{casa.nome}

+

{casa.nome}

-

{trasferta.nome}

+

{trasferta.nome}

-

+

{formatData(m.data)} · MVP {m.mvp || "da votare"} {m.scout ? " · scoutata" : ""}

@@ -278,7 +278,7 @@ function Classifica() { @@ -287,7 +287,7 @@ function Classifica() { ); })} {eventoId && !m.mvp ? ( - + Vota MVP ) : null} diff --git a/src/routes/eventi.tsx b/src/routes/eventi.tsx index 8f485c7..0bfd065 100644 --- a/src/routes/eventi.tsx +++ b/src/routes/eventi.tsx @@ -91,7 +91,7 @@ function GestioneEventi() { <>
-

+

Solo i referenti della squadra possono creare o modificare gli eventi.

@@ -207,7 +207,7 @@ function GestioneEventi() {
-
+
{giorniIT.map((g, i) => ( {g} ))} @@ -248,7 +248,7 @@ function GestioneEventi() { type="button" onClick={() => apriGiorno(giorno)} className={cn( - "relative grid aspect-square place-items-center rounded-xl text-sm font-semibold transition-transform active:scale-90", + "relative grid aspect-square place-items-center rounded-xl text-[15px] font-semibold transition-transform active:scale-90", haEventi ? "bg-accent text-accent-foreground" : "bg-secondary text-foreground", @@ -265,11 +265,11 @@ function GestioneEventi() {
{isPending ? ( -

+

Carico gli eventi…

) : isError ? ( -
+

Non sono riuscito a caricare gli eventi {error instanceof Error ? `: ${error.message}` : ""}. @@ -277,13 +277,13 @@ function GestioneEventi() {

) : ( -

+

Scorri a destra o sinistra per cambiare mese. Tocca un giorno per aggiungere, modificare o eliminare.

@@ -303,7 +303,7 @@ function GestioneEventi() { type="button" onClick={() => aggiorna(daCategoria(t.id))} className={cn( - "rounded-full py-2 text-xs font-bold uppercase transition-colors", + "rounded-full py-2 text-[13px] font-bold uppercase transition-colors", categoriaEvento(bozza) === t.id ? "bg-card shadow-card text-foreground" : "text-muted-foreground", @@ -337,15 +337,17 @@ function GestioneEventi() { ) : (
- + Giorno
- {formatData(bozza.data)} + + {formatData(bozza.data)} + @@ -394,7 +396,7 @@ function GestioneEventi() { type="button" onClick={() => aggiorna({ casa: o.casa })} className={cn( - "flex-1 rounded-full py-2 text-xs font-bold uppercase transition-colors", + "flex-1 rounded-full py-2 text-[13px] font-bold uppercase transition-colors", bozza.casa === o.casa ? "bg-card shadow-card text-foreground" : "text-muted-foreground", @@ -433,7 +435,7 @@ function GestioneEventi() { }) } className={cn( - "truncate rounded-xl px-2.5 py-2 text-left text-xs font-semibold transition-colors", + "truncate rounded-xl px-2.5 py-2 text-left text-[13px] font-semibold transition-colors", scelto ? "bg-accent text-accent-foreground" : "bg-secondary text-muted-foreground", @@ -450,7 +452,7 @@ function GestioneEventi() { @@ -458,7 +460,7 @@ function GestioneEventi() { type="button" onClick={chiediConferma} disabled={salva.isPending} - className="flex flex-1 items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="flex flex-1 items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {salva.isPending ? : null} Salva @@ -489,8 +491,8 @@ function GestioneEventi() { className="flex items-center gap-2 rounded-2xl bg-card p-3 shadow-card" >
-

{e.titolo}

-

+

{e.titolo}

+

{e.ora} · {e.luogo || "luogo da definire"}

@@ -513,7 +515,7 @@ function GestioneEventi() {
)) ) : ( -

+

Nessun evento in programma

)} @@ -521,7 +523,7 @@ function GestioneEventi() { @@ -544,14 +546,14 @@ function GestioneEventi() { type="button" onClick={conferma} disabled={salva.isPending} - className="flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {salva.isPending ? : null} Conferma @@ -573,14 +575,14 @@ function GestioneEventi() { type="button" onClick={() => daEliminare && rimuovi(daEliminare.id)} disabled={elimina.isPending} - className="flex w-full items-center justify-center gap-2 rounded-2xl bg-destructive py-3 text-sm font-bold uppercase text-destructive-foreground disabled:opacity-50" + className="flex w-full items-center justify-center gap-2 rounded-2xl bg-destructive py-3 text-[15px] font-bold uppercase text-destructive-foreground disabled:opacity-50" > {elimina.isPending ? : null} Elimina @@ -606,7 +608,7 @@ function Interruttore({ type="button" onClick={onClick} className={cn( - "rounded-full px-3 py-1.5 text-xs font-bold uppercase transition-colors", + "rounded-full px-3 py-1.5 text-[13px] font-bold uppercase transition-colors", attivo ? "bg-accent text-accent-foreground" : "bg-secondary text-muted-foreground", )} > diff --git a/src/routes/evento.$id.tsx b/src/routes/evento.$id.tsx index 68a302e..a3bf16a 100644 --- a/src/routes/evento.$id.tsx +++ b/src/routes/evento.$id.tsx @@ -42,7 +42,7 @@ function EventoDetail() { if (!evento) { return (
-

Evento non trovato

+

Evento non trovato

); } @@ -58,14 +58,14 @@ function EventoDetail() {
-

+

Evento extra-campo

{evento.titolo}

-
+
{evento.ora} @@ -75,12 +75,12 @@ function EventoDetail() {
{evento.note ? ( -

+

{evento.note}

) : null} -
+
Conferme: {presentiVeri}/{convocatiEvento(evento, rosa).length}
diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 6506de1..83cde7c 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -86,7 +86,7 @@ function Index() { className="h-14 w-14 rounded-full shadow-pop ring-2 ring-primary-foreground/25" />
-

+

Ciao {nome.split(" ")[0]}

CRAP Volley

@@ -100,13 +100,13 @@ function Index() { >

{noi ? `${noi.pos}º` : "—"}

-

In classifica

+

In classifica

{noi ? `${noi.vinte}-${noi.perse}` : "—"}

-

Bilancio W-L

+

Bilancio W-L

{giocatore ? (
@@ -114,7 +114,7 @@ function Index() { {giocatore.streak}

-

Streak

+

Streak

) : null}
@@ -132,7 +132,7 @@ function Index() { azione={ Calendario @@ -141,7 +141,7 @@ function Index() { {prossimo ? ( ) : ( -

+

Nessun impegno in programma.

)} @@ -156,7 +156,7 @@ function Index() { return ; }) ) : ( -

+

Nient'altro da confermare: sei in pari.

)} @@ -171,7 +171,7 @@ function Index() { Storico @@ -183,8 +183,10 @@ function Index() { <>
-

CRAP Volley vs {ultima.avversario}

-

+

+ CRAP Volley vs {ultima.avversario} +

+

{ultima.casa ? "In casa" : "Trasferta"} {ultima.mvp ? ` · MVP ${ultima.mvp}` : " · MVP da votare"}

@@ -197,7 +199,7 @@ function Index() { {ultima.parziali.map((p, i) => ( {p[0]}-{p[1]} @@ -218,7 +220,7 @@ function Index() { ); })() ) : ( -

+

Nessun risultato disponibile.

)} @@ -231,7 +233,7 @@ function Index() { azione={ Tutti @@ -245,20 +247,20 @@ function Index() { className="block w-full text-left" > -
+
{obiettivo.emoji}{" "} {obiettivo.titolo}
-

+

Siamo al —{" "} {obiettivo.valore}/{obiettivo.target} {obiettivo.unita}.

-

+

{microcopyObiettivo(obiettivo)}

-

{obiettivo.impatto}

-

+

{obiettivo.impatto}

+

Come funziona

diff --git a/src/routes/partita-csi.$id.tsx b/src/routes/partita-csi.$id.tsx index 0409ef9..cbdd917 100644 --- a/src/routes/partita-csi.$id.tsx +++ b/src/routes/partita-csi.$id.tsx @@ -40,7 +40,7 @@ function PartitaCsiDetail() { if (!partita) { return (
-

Partita non trovata

+

Partita non trovata

); } @@ -69,7 +69,7 @@ function PartitaCsiDetail() { className="h-10 w-10" />
-

+

{partita.casa ? "In casa" : "Fuori casa"}

{partita.avversario}

@@ -93,7 +93,7 @@ function PartitaCsiDetail() { {partita.parziali.map(([noi, loro], i) => ( {noi}-{loro} diff --git a/src/routes/partita.$id.tsx b/src/routes/partita.$id.tsx index 714f966..b79972d 100644 --- a/src/routes/partita.$id.tsx +++ b/src/routes/partita.$id.tsx @@ -60,7 +60,7 @@ function PartitaDetail() { if (!evento) { return (
-

Partita non trovata

+

Partita non trovata

); } @@ -118,7 +118,7 @@ function PartitaDetail() { ) : null}
-

+

{casa ? "In casa" : "Fuori casa"} {evento.campionato ? " · Campionato" : " · Amichevole"}

@@ -126,7 +126,7 @@ function PartitaDetail() {
-
+
{evento.ora} @@ -136,12 +136,12 @@ function PartitaDetail() {
{evento.note ? ( -

+

{evento.note}

) : null} -
+
Conferme: {presentiVeri}/{convocati.length}
@@ -163,7 +163,7 @@ function PartitaDetail() {
- CRAP Volley + CRAP Volley {match.setNostri} - {match.setLoro} - {avversario} + {avversario}
{match.parziali.map(([noi, loro], i) => ( @@ -183,7 +183,9 @@ function PartitaDetail() { className="flex items-center justify-between rounded-xl bg-secondary px-3 py-2" > {noi} - Set {i + 1} + + Set {i + 1} + {loro}
))} @@ -213,7 +215,7 @@ function PartitaDetail() { ) ) : (
-

+

La partita non è ancora stata disputata. Torna qui dopo il fischio finale per vedere il risultato.

@@ -248,13 +250,13 @@ function PartitaDetail() { ].map((t) => (

{t.v}

-

+

{t.l}

))}
-

+

Dettaglio giocatori (uso interno allenatori)

@@ -264,7 +266,7 @@ function PartitaDetail() { return (
#{g.numero} {g.nome} @@ -285,7 +287,7 @@ function PartitaDetail() { csvScoutMatch(scout, rosa), ) } - className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop" + className="premi mt-4 flex w-full items-center justify-center gap-2 rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop" > Esporta CSV diff --git a/src/routes/profilo.tsx b/src/routes/profilo.tsx index 9d4ce5b..a6af7e3 100644 --- a/src/routes/profilo.tsx +++ b/src/routes/profilo.tsx @@ -220,7 +220,7 @@ function CardAvatar({ id, fallback }: { id: string; fallback: string }) { @@ -312,11 +312,11 @@ function TabOpzioni({ giocatoreId }: { giocatoreId: string }) { type="button" onClick={cambiaNotifiche} disabled={!supportate || inCorso} - className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-left text-sm disabled:opacity-60" + className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-left text-[15px] disabled:opacity-60" > Notifiche - + {supportate ? notifiche ? "Attive su questo dispositivo" @@ -339,11 +339,11 @@ function TabOpzioni({ giocatoreId }: { giocatoreId: string }) { type="button" onClick={cambiaEmail} disabled={!email.pronta || email.imposta.isPending} - className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-left text-sm disabled:opacity-60" + className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-left text-[15px] disabled:opacity-60" > Email - + {email.attive ? "Le notifiche arrivano anche via email" : "Nessuna email, solo notifiche in app"} @@ -363,7 +363,7 @@ function TabOpzioni({ giocatoreId }: { giocatoreId: string }) { {admin ? ( Dashboard amministratore @@ -373,7 +373,7 @@ function TabOpzioni({ giocatoreId }: { giocatoreId: string }) { href="https://github.com/ivancacciari1995-a11y/CRAPP/issues/new?template=bug_report.yml" target="_blank" rel="noopener noreferrer" - className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-sm transition-colors hover:bg-accent/5" + className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-[15px] transition-colors hover:bg-accent/5" > Segnala un bug @@ -382,17 +382,17 @@ function TabOpzioni({ giocatoreId }: { giocatoreId: string }) { href="https://github.com/ivancacciari1995-a11y/CRAPP/issues/new?template=feature_request.yml" target="_blank" rel="noopener noreferrer" - className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-sm transition-colors hover:bg-accent/5" + className="flex min-h-11 w-full items-center justify-between gap-3 px-4 py-3 text-[15px] transition-colors hover:bg-accent/5" > Suggerisci una nuova funzionalità
-

CrAPP v{APP_VERSION}

+

CrAPP v{APP_VERSION}

{titolo}

-

{testo}

+

{testo}

{children}
@@ -138,7 +138,7 @@ function Scout() { @@ -156,7 +156,7 @@ function Scout() { if (ok) setControllo(true); else toast.error("Un altro compagno ha appena preso lo scout"); }} - className="mt-5 w-full rounded-2xl bg-accent-grad py-3 text-sm font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" + className="mt-5 w-full rounded-2xl bg-accent-grad py-3 text-[15px] font-bold uppercase text-accent-foreground shadow-pop disabled:opacity-50" > {ripresa ? "Riprendi lo scout" : "Prendi il controllo"} @@ -313,7 +313,7 @@ function ScoutBoard({ <>
- + Scout live · Set {setCorrente}
@@ -321,14 +321,14 @@ function ScoutBoard({ type="button" onClick={annulla} disabled={azioniSet.length === 0} - className="inline-flex items-center gap-1 rounded-full bg-primary-foreground/10 px-3 py-1.5 text-xs font-bold disabled:opacity-40" + className="inline-flex items-center gap-1 rounded-full bg-primary-foreground/10 px-3 py-1.5 text-[13px] font-bold disabled:opacity-40" > Annulla @@ -337,14 +337,14 @@ function ScoutBoard({
-

CRAP Volley

+

CRAP Volley

{puntiNoi}

{setNostri}-{setLoro}

-

+

{avversario || "Avversario"}

{puntiLoro}

@@ -356,7 +356,7 @@ function ScoutBoard({ {setChiusi.map((p, i) => ( {p[0]}-{p[1]} @@ -366,7 +366,7 @@ function ScoutBoard({
-

+

1. Tocca il giocatore

@@ -384,10 +384,10 @@ function ScoutBoard({ )} >

{g.numero}

-

{g.nome}

+

{g.nome}

@@ -400,7 +400,7 @@ function ScoutBoard({

-

+

2. Tocca l'azione

@@ -426,7 +426,7 @@ function ScoutBoard({ type="button" onClick={() => registra(tipo)} className={cn( - "rounded-2xl py-3 text-sm font-bold uppercase shadow-card transition-transform active:scale-95", + "rounded-2xl py-3 text-[15px] font-bold uppercase shadow-card transition-transform active:scale-95", azioniMeta[tipo].className, )} > @@ -438,11 +438,11 @@ function ScoutBoard({
-

+

Ultime azioni

{ultime.length === 0 ? ( -

Nessuna azione registrata.

+

Nessuna azione registrata.

) : (
    {ultime.map((a, i) => { @@ -451,14 +451,14 @@ function ScoutBoard({
  • {g ? `#${g.numero} ${g.nome}` : "Avversario"} @@ -474,14 +474,14 @@ function ScoutBoard({
    -