docs: plano Fase 5 - polish visual (hero, carrossel, skeletons, confetti)

This commit is contained in:
Rodribm10 2026-04-14 22:05:19 -03:00
parent e55f793ffc
commit 69f0b124bb

View File

@ -0,0 +1,133 @@
# Reserva 1001 — Fase 5: Polish visual
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development
**Goal:** Transformar a página pública num produto premium com animações, carrossel, skeletons e micro-interações. A base funcional está toda pronta (fases 1-4); esta fase é exclusivamente sobre percepção de qualidade.
**Tech stack adicional:** framer-motion (já instalado) · animejs (já instalado) · canvas-confetti (instalar) · embla-carousel-react (instalar — pro carrossel de fotos)
**Spec:** `docs/superpowers/specs/2026-04-13-reserva-1001-design.md` seção 10
**Fases anteriores:** 1, 2, 3, 3.5, 4 completas
---
## Escopo
### ✅ Entra nesta fase
1. **Hero section** no topo da página pública com reveal escalonado (framer-motion)
2. **Carrossel de fotos** substitui o grid atual — com swipe, indicadores, lightbox em tela cheia
3. **Stagger entrance** nas opções de categoria/unidade quando muda a marca (framer-motion `staggerChildren`)
4. **Price pulse** — animação de escala quando o preço recalcula (anime.js)
5. **QR code glow** — borda animada pulsando na tela de checkout (CSS + motion)
6. **Skeleton screens** em vez de spinners no form e galeria
7. **SuccessScreen upgrade** — confetti + check SVG desenhado com anime.js
8. **Micro-interactions** em botões (hover scale, subtle glow)
9. **AnimatePresence** pras transições entre etapas (form → checkout → success)
### ❌ Fora de escopo
- Mudanças de layout (ex: hero "parallax" com scroll) — só reveal
- Mudança de fontes/cores (é editável no admin)
- Mexer em lógica de negócio
---
## Tasks
### Task 1: Hero section com reveal
**Files:**
- Create: `src/components/reservation/HeroSection.tsx`
- Modify: `src/pages/ReservationPage.tsx` (usa HeroSection no topo)
Cria um hero mais impactante: stagger entrance dos elementos (subtítulo → título → tagline) com `motion.div` e `variants`. Timeline: 0ms subtítulo, 200ms título, 400ms tagline.
### Task 2: Carrossel de fotos com lightbox
**Files:**
- Install: `pnpm add embla-carousel-react`
- Modify: `src/components/reservation/ImageGallery.tsx` (substitui grid por carrossel)
Swipe horizontal, dots indicadores, autoplay 4s (pausa no hover). Click numa foto abre lightbox em tela cheia (overlay escuro + `<img>` centralizado + botão X + ←/→ pra navegar + ESC pra fechar).
### Task 3: Stagger entrance nos selects de categoria/unidade
**Files:**
- Modify: `src/components/reservation/StayDetailsStep.tsx`
Quando a marca muda e as unidades/categorias re-renderizam, cada `<option>` (ou melhor, cada card visual de opção se virar custom dropdown) aparece com delay escalonado. Usar `AnimatePresence` + `motion.li` com `initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0 }}` e delay por índice.
Como o HTML `<select>` não anima filhos, vou fazer um **chip group** por baixo do select mostrando as opções selecionáveis com hover state animado. O select mantido pra acessibilidade.
### Task 4: Price pulse quando recalcula
**Files:**
- Modify: `src/components/reservation/PriceSummary.tsx`
`useEffect` que dispara `anime({ targets: ref.current, scale: [1, 1.08, 1], duration: 400 })` toda vez que `totalCents` muda. Ref no `<div>` principal.
### Task 5: QR code glow animation
**Files:**
- Modify: `src/components/checkout/PixCheckout.tsx`
Animação CSS infinita na borda do container do QR code: `@keyframes` alternando `box-shadow` entre `0 0 30px rgba(201,169,97,0.4)` e `0 0 60px rgba(201,169,97,0.7)`. Usar via classe ou `motion.div` com `animate={{ boxShadow: [...] }}` loop.
### Task 6: Skeleton screens
**Files:**
- Create: `src/components/ui/skeleton.tsx`
- Modify: `src/components/reservation/StayDetailsStep.tsx`, `ImageGallery.tsx`, `PriceSummary.tsx` (mostram skeleton quando dados estão carregando)
Skeleton reutilizável com shimmer animado (CSS keyframes). Cada componente que hoje mostra "Carregando..." ganha um skeleton com o formato do conteúdo final.
### Task 7: SuccessScreen upgrade
**Files:**
- Install: `pnpm add canvas-confetti @types/canvas-confetti`
- Modify: `src/components/checkout/SuccessScreen.tsx`
- Confetti burst com cores da paleta do tenant (champagne + rose-gold + emerald)
- Check SVG desenhado com anime.js (`stroke-dashoffset` 0 → 1)
- Texto com reveal escalonado
### Task 8: Micro-interactions em botões
**Files:**
- Modify: `src/components/ui/button.tsx`
Adiciona `hover:scale-[1.02]` ao primary/secondary (já tem), e subtle `hover:glow-champagne` animado. Adiciona `active:scale-[0.98]` pra tactile feedback.
### Task 9: AnimatePresence entre fases do ReservationFlow
**Files:**
- Modify: `src/components/reservation/ReservationFlow.tsx`
Envolve o conteúdo de cada fase (form/checkout/success) com `<AnimatePresence mode="wait">` e `<motion.div key={phase} initial={{ opacity: 0, x: 20 }} animate={{ opacity: 1, x: 0 }} exit={{ opacity: 0, x: -20 }} />` — slide + fade suave na transição.
---
## Validação
Ao final, tudo deve continuar passando:
```bash
pnpm typecheck
pnpm lint
pnpm test
pnpm build
```
Testes existentes continuam no verde. Novos testes não são obrigatórios (polish visual é difícil de testar automaticamente — QA visual manual).
## Critério de conclusão
- [ ] Hero aparece com stagger no boot
- [ ] Fotos viram carrossel swipable + lightbox
- [ ] Selecionar uma nova marca faz as opções "entrarem" em escalado
- [ ] Preço pulsa quando recalcula
- [ ] QR code tem glow pulsante
- [ ] Skeletons aparecem no lugar de "Carregando..."
- [ ] Tela de sucesso com confetti + check animado
- [ ] Transições entre etapas com slide suave
- [ ] Build < 700 KB (meta de não estourar com as libs novas)