Skip to content

feat(report): scrollytelling redesign with narrative paywall#125

Merged
sungmanch merged 8 commits intomainfrom
feat/scrollytelling-redesign
Feb 14, 2026
Merged

feat(report): scrollytelling redesign with narrative paywall#125
sungmanch merged 8 commits intomainfrom
feat/scrollytelling-redesign

Conversation

@sungmanch
Copy link
Copy Markdown
Collaborator

@sungmanch sungmanch commented Feb 14, 2026

Summary

  • Scrollytelling layout: Replace dashboard-like report with scroll-driven narrative (identity → activity → strengths → "But..." → growth → cliffhanger)
  • Content policy: Open all 5 worker domains for free tier — diagnosis is free, only prescriptions (recommendations) are gated
  • Cliffhanger paywall: Dramatic dark-theme paywall after growth areas highlighting the user's most critical issue with blurred fix preview
  • Scroll effects: NarrativeMoment full-screen sticky chapter transitions, staggered card reveals via IntersectionObserver, all with prefers-reduced-motion support
  • Code reduction: -522 lines net (TabbedReportContainer rewritten from 714→445 lines, removed domain locking UI, ProgressiveMeter, ReportTableOfContents)

Simplification (ship-it)

  • usePayment hook extraction: Deduplicated ~120 lines of identical payment logic from CliffhangerWall and UnlockSection into a shared hook
  • DOMAIN_TO_TRANSLATION_KEY centralization: Moved from 3 duplicate definitions to single source in worker-insights.ts
  • useScrollReveal reuse: Replaced 18-line inline IntersectionObserver in WorkerInsightsSection with existing hook
  • Dead export cleanup: Removed unused default export from FloatingProgressDots

Changes

  1. feat(report): scrollytelling redesign with narrative structure and cliffhanger paywall
  2. fix(report): reset credit loading state on success in CliffhangerWall and UnlockSection
  3. fix(report): handle all credit API failure reasons in CliffhangerWall and UnlockSection
  4. fix(report): wire onViewContext to Overview components and remove dead preview gallery
  5. refactor(hooks): extract usePayment hook from CliffhangerWall and UnlockSection
  6. refactor(report): centralize DOMAIN_TO_TRANSLATION_KEY and reuse useScrollReveal
  7. refactor(report): remove unused default export from FloatingProgressDots

Test plan

  • npm run typecheck passes
  • npm test passes — 1157/1157
  • Free tier: scroll through full narrative, all 5 domains visible, CliffhangerWall appears after growth
  • Paid tier: CliffhangerWall hidden, recommendations visible inline
  • Payment flow: credit use and checkout from CliffhangerWall work correctly
  • prefers-reduced-motion: all animations disabled, content immediately visible
  • Mobile: touch scroll smooth at 60fps
  • Share link (/r/[id]): summary page unaffected
  • Non-English reports: translations render correctly through narrative flow

🤖 Generated with Claude Code using /ship-it

sungmanch and others added 2 commits February 14, 2026 14:03
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…iffhanger paywall

Replace dashboard-like report layout with scroll-driven storytelling experience.
Content flows through emotional arc: identity → activity → strengths → dramatic turn → growth areas → cliffhanger paywall.

Key changes:
- ContentGateway: open all 5 domains for free tier (diagnosis free, prescription paid)
- TabbedReportContainer: complete rewrite as narrative scroll layout (-522 lines net)
- NarrativeMoment: full-screen sticky chapter transitions with dramatic variant
- StrengthsOverview/DiagnosisOverview: aggregate all domain cards with staggered reveal
- CliffhangerWall: dramatic paywall highlighting most critical issue with blurred fix
- useScrollReveal: IntersectionObserver-based one-shot reveal with reduced-motion support
- Remove domain-level locking, per-domain lock overlays, and ProgressiveMeter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Feb 14, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
no-more-ai-slop Ready Ready Preview, Comment Feb 14, 2026 6:55am

Request Review

… and UnlockSection

Use finally block to guarantee setIsCreditLoading(false) runs in all
code paths, including the success branch where onCreditsUsed triggers
a refetch. Prevents button staying in disabled/loading state during
slow network conditions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… and UnlockSection

The else-if chain only handled 'insufficient_credits', leaving other
failure reasons (e.g. unknown reason codes) with no user-facing error
message. Replace with exhaustive else branch that shows data.message
or a generic fallback for any non-success response.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…d preview gallery

- Thread handleViewContext through StrengthsOverview and DiagnosisOverview
  so SourceContextSidebar opens from evidence links in the scrollytelling view
- Remove LockedDomainPreview interface and "What You're Missing" gallery from
  UnlockSection (no longer meaningful since all domains are visible in free tier)
- Clean up ~130 lines of orphaned preview gallery CSS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sungmanch and others added 3 commits February 14, 2026 15:53
…ockSection

Deduplicate ~120 lines of identical payment handling logic (credit use + checkout)
into a shared usePayment hook. Both paywall components now call the same hook.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…crollReveal

Move translation key mapping to single source in worker-insights.ts (was duplicated
in 3 files). Replace 18-line inline IntersectionObserver with useScrollReveal hook.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Project uses named exports exclusively; the redundant default export was never consumed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sungmanch
Copy link
Copy Markdown
Collaborator Author

Code Review

No issues found.

5-agent parallel review completed:

  • CLAUDE.md compliance: All rules followed (Language Policy, No Fallback, Dual Data Path Filtering, Continuous Scroll Layout)
  • Bug scan: No hook violations, memory leaks, XSS, or race conditions detected
  • Git history: No regression of past fixes (sessionOutcome key preserved, createLockedDomainTeaser removal intentional)
  • Previous PR review: 2 observations scored below threshold (dead defensive code, false positive on translation key completeness)
  • Code comments: Documentation maintained and improved during refactoring

Generated with Claude Code using /ship-it

If useful, react with a thumbs-up. Otherwise, thumbs-down.

@sungmanch sungmanch merged commit 55801fa into main Feb 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant