|
|
@@ -71,14 +71,23 @@ MovieDice solves group decision paralysis by combining collaborative curation (e
|
|
|
|
|
|
```
|
|
|
1. Visitor lands on the root URL — no login required
|
|
|
+ NOTE: src/app/page.tsx was a duplicate stub that shadowed (public)/page.tsx; removed (2026-05-02).
|
|
|
+ The canonical landing is src/app/(public)/page.tsx; TMDBFooter is mounted in (public)/layout.tsx.
|
|
|
2. Centered "Movie Dice" header/logo displayed
|
|
|
3. Splash text describes the site briefly (1-2 sentences)
|
|
|
4. "Roll the Dice" button is visible — tapping it triggers the slot-machine reel animation:
|
|
|
- a. Three side-by-side reels spin through ~20 movie poster images pulled automatically
|
|
|
- from TMDB popular/top-rated endpoints (no manual curation; replaced on each periodic refresh)
|
|
|
- Reel posters use aria-hidden (decorative during animation)
|
|
|
- b. Reels decelerate and land on a single movie result
|
|
|
- (the final result can be any TMDB movie, not constrained to the reel poster set)
|
|
|
+ a. Three side-by-side reels spin through poster images sourced from the landing_reel_posters table
|
|
|
+ (populated by seed.sql; cron refresh is a pending TODO — see 5.2).
|
|
|
+ The /api/tmdb/reel-posters route currently fetches TMDB live on each request and ignores the
|
|
|
+ table; PINNED_REEL_POSTERS constant always prepends hard-coded entries (e.g., tmdb_id 615).
|
|
|
+ Reel posters use aria-hidden (decorative during animation).
|
|
|
+ TWO DISTINCT POOLS — do not conflate:
|
|
|
+ - Carousel/reel posters: landing_reel_posters table + PINNED_REEL_POSTERS fallback (curated)
|
|
|
+ - Roll the Dice result: live /api/tmdb/popular?page=N, random page 1–50 (~1000-movie pool)
|
|
|
+ b. Reels decelerate and land on a single movie result drawn from /api/tmdb/popular?page=N
|
|
|
+ (random page 1–50; pool of ~1000 movies). The result is NOT constrained to the reel poster set.
|
|
|
+ KNOWN BUG (U9): modulo wrap missing in spinning branch causes scroll offset to drift on
|
|
|
+ repeated rolls; fix tracked in research/PHASE5_UI_FIXES_PLAN.md U9.
|
|
|
c. Result is displayed as a static teaser card showing the movie poster (with alt text),
|
|
|
title, and genres. No link, no tap action.
|
|
|
d. Animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2)
|
|
|
@@ -92,7 +101,8 @@ MovieDice solves group decision paralysis by combining collaborative curation (e
|
|
|
- Step 1: left-aligned
|
|
|
- Step 2: right-aligned
|
|
|
- Step 3: left-aligned (zigzag visual rhythm)
|
|
|
-8. Footer on all pages: TMDB attribution (logo + link + disclaimer), privacy policy link
|
|
|
+8. Footer on all pages (mounted in (public)/layout.tsx): TMDB attribution (logo + link + disclaimer),
|
|
|
+ privacy policy link
|
|
|
```
|
|
|
|
|
|
### Onboarding (New User)
|
|
|
@@ -497,10 +507,11 @@ Configure HTTP security headers at the Caddy reverse proxy level (not in next.co
|
|
|
|
|
|
### Phase 5: Landing Page and MVP Polish (April 23-26, 2026) — MVP CUTOFF
|
|
|
|
|
|
-- [ ] 5.1 — Build landing page structure: centered logo, splash text, Roll + Genre Roll buttons, Login button, scrolling About section, 3-step how-it-works demo (Step 1 left, Step 2 right, Step 3 left); add site-wide footer with TMDB attribution (logo + link + disclaimer) and privacy policy link; build privacy policy page with required sections (controller identity, lawful basis, data inventory, third-party recipients including Sentry, international transfers, user rights, children's disclaimer, cookie/localStorage disclosure, change notification procedure)
|
|
|
-- [ ] 5.2 — Build and seed landing_reel_posters table: implement periodic refresh job in the Node.js cron container on bi-weekly cadence that automatically fetches ~20 posters from TMDB popular or top-rated endpoints (with `include_adult=false`) and replaces the full set in the DB on each run
|
|
|
-- [ ] 5.3 — Build slot-machine reel animation for the landing page Roll the Dice button: 3 side-by-side reels that spin through the automatically fetched poster set (using w185 size, `aria-hidden` on spinning posters), decelerate, and land on a single TMDB movie result with alt text (the final result is fetched live from TMDB via server proxy — not constrained to the reel poster set); animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2); respect `prefers-reduced-motion` (instant reveal or simple fade-in when enabled)
|
|
|
-- [ ] 5.4 — Wire landing page Roll the Dice and Genre Roll to TMDB via server proxy (no login required); display result as a static teaser card showing poster (with alt text), title, and genres — no link, no tap action
|
|
|
+- [x] 5.1 — Build landing page structure: centered logo, splash text, Roll + Genre Roll buttons, Login button, scrolling About section, 3-step how-it-works demo (Step 1 left, Step 2 right, Step 3 left); add site-wide footer with TMDB attribution (logo + link + disclaimer) and privacy policy link; build privacy policy page with required sections (controller identity, lawful basis, data inventory, third-party recipients including Sentry, international transfers, user rights, children's disclaimer, cookie/localStorage disclosure, change notification procedure). NOTE (2026-05-02): Hero, Carousel, About, HowItWorks, Login link, and TMDBFooter all present in `src/app/(public)/page.tsx` + `(public)/layout.tsx`. Duplicate stub `src/app/page.tsx` removed so (public)/page.tsx is no longer shadowed.
|
|
|
+- [~] 5.2 — Build and seed landing_reel_posters table; implement periodic refresh job in the Node.js cron container on bi-weekly cadence that automatically fetches ~20 posters from TMDB popular or top-rated endpoints (with `include_adult=false`) and replaces the full set in the DB on each run. NOTE (2026-05-02): Table exists and is populated by seed.sql. `PINNED_REEL_POSTERS` constant in the API route always prepends hard-coded entries (e.g., tmdb_id 615 "The Passion of the Christ"). OUTSTANDING: `cron/index.ts` reel-refresh handler is still a TODO — the `/api/tmdb/reel-posters` route currently fetches TMDB live on each request and ignores the DB table. Cron wiring is the remaining gap for this task.
|
|
|
+- [~] 5.3 — Build slot-machine reel animation for the landing page Roll the Dice button: 3 side-by-side reels that spin through the automatically fetched poster set (using w185 size, `aria-hidden` on spinning posters), decelerate, and land on a single TMDB movie result with alt text (the final result is fetched live from TMDB via server proxy — not constrained to the reel poster set); animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2); respect `prefers-reduced-motion` (instant reveal or simple fade-in when enabled). NOTE (2026-05-02): Continuous carousel and slot-machine spin on roll are implemented. KNOWN BUG (U9): modulo wrap missing in spinning branch causes scroll offset to drift on repeated rolls; fix tracked in `research/PHASE5_UI_FIXES_PLAN.md`.
|
|
|
+- [x] 5.3a — Wire landing page Roll the Dice to TMDB via `/api/tmdb/popular?page=N` (random page 1–50, pool ~1000 movies). Result displayed as a static teaser card (poster with alt text, title, genres) — no link, no tap action. NOTE: this is a distinct pool from the carousel reel — see Feature Flow section 5 for the two-pool distinction.
|
|
|
+- [x] 5.4 — Wire landing page Genre Roll to TMDB via server proxy (no login required); display result as a static teaser card showing poster (with alt text), title, and genres — no link, no tap action.
|
|
|
- [ ] 5.5 — Loading and empty states for all major views (empty list, no search results, no genre matches, empty home page for new users)
|
|
|
- [ ] 5.6 — Error handling: invalid invite code, TMDB API failure, network errors
|
|
|
- [ ] 5.7 — Configure HTTP security headers in Caddyfile: CSP (with self-hosted URLs, not \*.supabase.co), X-Frame-Options, X-Content-Type-Options, Referrer-Policy, HSTS (start with max-age=86400, increase before launch), Permissions-Policy; use Report-Only mode during testing
|