# Vetrina pubblica e onboarding

Status: validated (2026-09-15, 13/13 criteri incl. Stripe, registrazioni, inviti, join, chiusura stanze)

## Context

EasyForma ha già la parte applicativa (dashboard, aule, billing) e le pagine pubbliche per discenti (`/join`, `/m`).
La home `/` è ancora la welcome dello starter kit e un nuovo utente non è guidato dopo la registrazione.

## Requirements

- Landing `/` in italiano: hero, come funziona (3 passi), conformità FAD sincrona Forma.Temp, anteprima pacchetti, FAQ, CTA registrazione.
- Pagina prezzi `/prezzi` che legge i pacchetti attivi dal DB, con CTA "Inizia" → `/register?package=<slug>`.
- Pagine `/privacy` e `/termini` (testo placeholder strutturato, chiaramente da far validare a un legale).
- Layout marketing condiviso (header con nav e login/registrati, footer) senza sidebar dell'app.
- Onboarding: dopo la registrazione l'utente entra in un wizard guidato (`/onboarding`, pattern gestionale8108: progresso JSON + completed, nessun blocco forzato) e la dashboard mostra una checklist (abbonamento, pacchetto, prima aula, partecipanti, credenziali Forma.Temp) con link alle azioni; il pacchetto scelto su `/prezzi` viene ricordato e proposto.

## Acceptance criteria

1. GET / restituisce 200 con il componente Inertia `marketing/home` e contiene i nomi dei pacchetti attivi.
2. GET /prezzi restituisce 200 con `marketing/pricing`, elenca i 3 pacchetti seed con prezzo e un link a `/register?package=pro`.
3. GET /privacy e GET /termini restituiscono 200 con i componenti `marketing/privacy` e `marketing/terms`.
4. Registrazione via POST /register con `package=pro` reindirizza a /onboarding (wizard in 3 passi: profilo ente, credenziali Forma.Temp, scelta pacchetto, con "Salta"); la successiva GET /dashboard ha props `onboarding.steps` con 5 step tutti `done=false`, `onboarding.package.slug = "pro"` e `onboarding.wizard_completed = false`.
5. Per l'utente demo (abbonamento assente, crediti presenti, aula e partecipanti presenti, credenziali Forma.Temp presenti) `onboarding.steps` riporta done=true per pacchetto, aula, partecipanti, Forma.Temp e done=false per abbonamento.
6. Le pagine `/`, `/prezzi`, `/privacy`, `/termini` non rendono la sidebar dell'app e passano `npm run types:check`, `npm run check`, `npm run build`.

## Out of scope

Blog, multilingua, cookie banner, testi legali definitivi, SEO avanzata.
