# Spec di design — Fase 3.4: Vetrina dal DB (classifiche live + ranking pubblico)

**Data:** 2026-06-12 · **Stato:** deciso in autonomia · **Autore:** Claude
**Base:** F3.0–F3.3. Master spec §1 (vetrina: classifiche live, ranking, albo).

## 1. Obiettivo
Pagine **pubbliche** (no auth) che leggono il DB: **classifiche live** degli eventi in corso/conclusi e **ranking persistente** corrente. L'albo d'oro resta statico (dipende dalla migrazione F3.5; lo si potrà derivare dal DB in seguito).

## 2. Decisioni
1. **Pagine dinamiche** (no prerender): leggono il DB a ogni richiesta (`export const prerender = false`).
2. **Solo eventi pubblici**: `in_corso` o `concluso` (gli eventi in bozza/iscrizioni non si mostrano in vetrina).
3. **Ranking corrente** = la stagione più recente (per `anno`) che ha righe di ranking; vuoto → empty state.
4. **Empty state grazioso**: finché non ci sono eventi/ranking (pre-lancio o pre-migrazione) le pagine mostrano un messaggio, non errori. Nessun fallback ai moduli statici (l'albo statico resta su `/albo`).
5. **Service dedicato** `src/lib/server/public-view.ts` (read-only, niente dati sensibili: solo nick, punti, posizioni).
6. **Nav**: aggiungo "Classifiche" e "Ranking" all'header.

## 3. Architettura
- `src/lib/server/public-view.ts`: `listEventsWithStandings()`, `getPublicEventStandings(slug)`, `getCurrentRanking()`.
- Rotte: `/classifiche` (lista), `/classifiche/[slug]` (gironi + classifiche di un evento), `/ranking` (ranking corrente). Header aggiornato.

## 4. Test
- Integration `public-view.integration.test.ts`: evento concluso con standing → compare in lista e in dettaglio; ranking corrente preso dalla stagione giusta. Cleanup.
- Gate check/build.
</content>
