Rinomina le tab del profilo in Documenti e Opzioni.

«Tesseramento» nominava lo scopo invece del contenuto (dati personali,
documento, certificato medico, foto tessera); cambia anche la rotta in
/profilo?tab=documenti. «Impostazioni» diventa «Opzioni» così le quattro
etichette stanno in uno schermo da telefono: le voci della barra si
dividono la riga in parti uguali (grow basis-0) e tornano a scorrere solo
se non ci stanno, quindi vale anche per Squadra e Classifica.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 23:37:41 +02:00
co-authored by Claude Opus 5
parent 366928b61f
commit 107407b854
6 changed files with 22 additions and 10 deletions
+10
View File
@@ -6,6 +6,16 @@ qui: sta in [ROADMAP.md](ROADMAP.md).
## Versione attuale — agosto 2026 ## Versione attuale — agosto 2026
### Profilo: tab Documenti e Opzioni, barra senza scroll
- L'etichetta nominava lo scopo (il tesseramento CSI) invece del contenuto: dentro ci sono
dati personali, documento, certificato medico e foto tessera. Cambia anche la rotta
(`/profilo?tab=documenti`): i vecchi link `?tab=tesseramento` aprono la tab Stagione.
- «Impostazioni» diventa «Opzioni»: con le quattro etichette accorciate la barra delle
sottosezioni ci sta in uno schermo da telefono. Le voci ora si dividono la riga in parti
uguali (`grow basis-0`) e tornano a scorrere solo se non ci stanno, quindi vale anche per
le barre di Squadra e Classifica.
### Palloni: allenamenti senza proposta automatica ### Palloni: allenamenti senza proposta automatica
- `completaTurni` non assegna più gli allenamenti: restano «da assegnare» finché non si - `completaTurni` non assegna più gli allenamenti: restano «da assegnare» finché non si
+1 -1
View File
@@ -29,7 +29,7 @@ persistente: la riga viene eliminata non appena letta dal service worker).
## Iscrizione alle notifiche push ## Iscrizione alle notifiche push
In Profilo → Impostazioni c’è **un solo interruttore** («Notifiche»). Non esistono preferenze In Profilo → Opzioni c’è **un solo interruttore** («Notifiche»). Non esistono preferenze
separate per tipo di messaggio: liscrizione registra il dispositivo e lo rende destinatario separate per tipo di messaggio: liscrizione registra il dispositivo e lo rende destinatario
di **tutte** le push (promemoria palloni, solleciti presenze) e abilita anche le notifiche di **tutte** le push (promemoria palloni, solleciti presenze) e abilita anche le notifiche
smart in app, che usano lo stesso service worker. smart in app, che usano lo stesso service worker.
+3 -3
View File
@@ -67,7 +67,7 @@ Viene mostrata una barra di avanzamento (esempio: _Profilo completato — 85%_),
Quando tutte le sezioni sono complete il widget scompare automaticamente. Quando tutte le sezioni sono complete il widget scompare automaticamente.
Il tap apre Profilo sulla sottosezione **Tesseramento** (`/profilo?tab=tesseramento`), non Il tap apre Profilo sulla sottosezione **Documenti** (`/profilo?tab=documenti`), non
sulla tab Stagione. sulla tab Stagione.
## Profilo ## Profilo
@@ -142,7 +142,7 @@ Sezione già presente.
Contiene tutti i badge ottenuti e quelli ancora da sbloccare. Contiene tutti i badge ottenuti e quelli ancora da sbloccare.
### Impostazioni ### Opzioni
Contiene. Contiene.
@@ -159,7 +159,7 @@ Contiene.
## Dashboard amministratore ## Dashboard amministratore
Gli amministratori dispongono di una schermata dedicata (`/admin`, raggiungibile da Gli amministratori dispongono di una schermata dedicata (`/admin`, raggiungibile da
Profilo → Impostazioni). Profilo → Opzioni).
Per ogni giocatore vengono mostrati. Per ogni giocatore vengono mostrati.
+3 -1
View File
@@ -80,7 +80,9 @@ export function BarraSottosezioni({
vaiA(i); vaiA(i);
}} }}
className={cn( className={cn(
"snap-center shrink-0 rounded-full px-3.5 py-2 text-xs font-bold uppercase tracking-wide transition-colors", // grow+basis-0: se le voci ci stanno riempiono la riga in parti uguali,
// altrimenti shrink-0 le tiene leggibili e la barra torna a scorrere.
"snap-center shrink-0 grow basis-0 rounded-full px-3.5 py-2 text-xs font-bold uppercase tracking-wide transition-colors",
"min-h-11 touch-manipulation whitespace-nowrap", "min-h-11 touch-manipulation whitespace-nowrap",
selezionata selezionata
? "bg-accent text-accent-foreground shadow-pop" ? "bg-accent text-accent-foreground shadow-pop"
@@ -418,7 +418,7 @@ export function CompletaProfilo({
<Reveal indice={indice} className="px-5 pt-4"> <Reveal indice={indice} className="px-5 pt-4">
<Link <Link
to="/profilo" to="/profilo"
search={{ tab: "tesseramento" }} search={{ tab: "documenti" }}
className="premi block rounded-3xl bg-card p-4 shadow-card" className="premi block rounded-3xl bg-card p-4 shadow-card"
> >
<div className="flex items-center justify-between gap-3"> <div className="flex items-center justify-between gap-3">
+4 -4
View File
@@ -29,7 +29,7 @@ import { esci } from "@/lib/auth";
import { useIsAdmin } from "@/lib/ruoli"; import { useIsAdmin } from "@/lib/ruoli";
import { Reveal } from "@/components/motion/Reveal"; import { Reveal } from "@/components/motion/Reveal";
const TAB_PROFILO = ["stagione", "badge", "tesseramento", "impostazioni"] as const; const TAB_PROFILO = ["stagione", "badge", "documenti", "impostazioni"] as const;
type TabProfilo = (typeof TAB_PROFILO)[number]; type TabProfilo = (typeof TAB_PROFILO)[number];
function isTabProfilo(v: unknown): v is TabProfilo { function isTabProfilo(v: unknown): v is TabProfilo {
@@ -233,13 +233,13 @@ function Profilo() {
contenuto: <CollezioneBadge g={g} votiSocial={votiSocial.data ?? []} />, contenuto: <CollezioneBadge g={g} votiSocial={votiSocial.data ?? []} />,
}, },
{ {
id: "tesseramento", id: "documenti",
label: "Tesseramento", label: "Documenti",
contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />, contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />,
}, },
{ {
id: "impostazioni", id: "impostazioni",
label: "Impostazioni", label: "Opzioni",
contenuto: ( contenuto: (
<div className="space-y-3"> <div className="space-y-3">
<div className="divide-y divide-border overflow-hidden rounded-3xl bg-card shadow-card"> <div className="divide-y divide-border overflow-hidden rounded-3xl bg-card shadow-card">