--- phase: 22-pagina-pubblica-preventivo plan: "01" status: complete completed_at: "2026-06-20" requirements_satisfied: - PUB-01 - PUB-02 known_gaps: - PUB-03 (email Resend — non implementata, deferred to backlog) --- # Plan 22-01 Summary: Pagina Pubblica Preventivo + Deck ## What Was Built Pagina pubblica `/preventivo/[slug]` che presenta la proposta generata come deck interattivo di 20+ slide navigabili (frecce, tasti keyboard, dot navigator). Il cliente sceglie il tier A/B/C e accetta/rifiuta dalla pagina; l'esito si riflette nel DB con `accepted_at` immutabile. PUB-03 (invio email Resend) non implementato — il link va condiviso manualmente. ## Key Files ### Created - `src/app/preventivo/[slug]/page.tsx` — server component pubblico; gestisce stati: draft (blocca accesso), published (mostra + accept), accepted/rejected (mostra con stato) - `src/app/preventivo/[slug]/actions.ts` — `acceptProposal` (guard `accepted_at` immutabile + `selected_tier` validato A/B/C), `rejectProposal` - `src/components/public/proposal/ProposalDeck.tsx` — deck client component: navigazione keyboard (←/→), dot cliccabili, topbar fissa (titolo + counter), bottombar fissa (frecce + dots); `h-screen overflow-hidden` per 100vh per slide - `src/components/public/proposal/sections/` — 20 componenti slide: - CoverSection, VisionSection, IndexSection - ChapterDivider (×5), StrategistSection, FactsSection, TestimonialsSection - ProblemNodeSection, SynthesisDiagramSection - SolutionNodeSection, SolutionSynthesisSection - ScopeSection, DeliverablesSection, TimelineSection - PricingSection, StagesRecapSection, ComparisonMatrixSection - NextStepsSection, AcceptSection, ClosingSection ## Architecture Decisions | Decisione | Scelta | Motivo | |-----------|--------|--------| | Layout | `h-screen overflow-hidden` per slide | Nessun scroll di pagina, navigazione slide-by-slide | | Navigazione | Keyboard + dots + click frecce | Universale, funziona su desktop e touch | | Accettazione | `accepted_at` immutabile (guard server action) | Pattern coerente con `deliverables.approved_at` | | Tier selezione | Radio A/B/C prima dell'accettazione | Cliente sceglie l'opzione, l'esito è univoco | | Email | Non implementata (PUB-03) | Scope minimo, link condiviso manualmente per ora | ## Requirements Verified - PUB-01: ✅ Proposta visibile come pagina pubblica HTML a `/preventivo/[slug]`, deck 20+ slide - PUB-02: ✅ Cliente accetta/rifiuta dalla pagina; `state` + `accepted_at` + `selected_tier` aggiornati nel DB; admin vede esito nella lista preventivi ## Known Gap - **PUB-03 — Email Resend**: il link preventivo non viene inviato automaticamente. Va copiato dall'admin e condiviso manualmente (es. via WhatsApp/email). Da implementare nella prossima milestone come prima feature. ## Fix Post-Deploy - 2026-06-20: fix `h-screen overflow-hidden` su tutte le slide (erano `min-h-screen`, causavano scroll di pagina) - 2026-06-20: `ANTHROPIC_API_KEY` mancante in Coolify — aggiunta via PHP artisan + redeploy