cinematic-scroll-skill 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/COMPATIBILITY.md +244 -0
  2. package/LICENSE +21 -0
  3. package/MODELS.md +92 -0
  4. package/README.md +250 -0
  5. package/SKILL.md +1003 -0
  6. package/audit-mode.md +497 -0
  7. package/bin/install.mjs +91 -0
  8. package/compile-choreography.mjs +296 -0
  9. package/decision-log.md +241 -0
  10. package/examples/GETTING_STARTED.md +279 -0
  11. package/examples/KNOWN_ISSUES.md +50 -0
  12. package/examples/PROMPTS.md +166 -0
  13. package/examples/luxe/README.md +88 -0
  14. package/examples/luxe/index.html +662 -0
  15. package/examples/noir/README.md +72 -0
  16. package/examples/noir/index.html +634 -0
  17. package/examples/pop/README.md +81 -0
  18. package/examples/pop/index.html +711 -0
  19. package/examples/renaissance/README.md +39 -0
  20. package/examples/renaissance/index.html +648 -0
  21. package/examples/studio/README.md +77 -0
  22. package/examples/studio/chapters.js +105 -0
  23. package/examples/studio/index.html +520 -0
  24. package/manifest.json +92 -0
  25. package/manifest.md +136 -0
  26. package/package.json +56 -0
  27. package/references/film-archetypes.md +211 -0
  28. package/references/performance-budget.md +499 -0
  29. package/references/scroll-patterns.md +693 -0
  30. package/scroll-choreography-compilation.md +543 -0
  31. package/scroll-choreography.json +1512 -0
  32. package/taste-guardrails.md +164 -0
  33. package/templates/nextjs/.env.example +41 -0
  34. package/templates/nextjs/app/api/fal/proxy/route.ts +33 -0
  35. package/templates/nextjs/app/api/fal/webhook/route.ts +132 -0
  36. package/templates/nextjs/app/api/generate-edition-asset/route.ts +66 -0
  37. package/templates/nextjs/app/globals.css +80 -0
  38. package/templates/nextjs/app/layout.tsx +21 -0
  39. package/templates/nextjs/app/page.tsx +10 -0
  40. package/templates/nextjs/components/ChapterDemoVisual.tsx +212 -0
  41. package/templates/nextjs/components/ChapterScene.tsx +373 -0
  42. package/templates/nextjs/components/EditionsPage.tsx +116 -0
  43. package/templates/nextjs/components/SmoothScrollProvider.tsx +8 -0
  44. package/templates/nextjs/lib/api-guard.ts +110 -0
  45. package/templates/nextjs/lib/editions-manifest.ts +224 -0
  46. package/templates/nextjs/lib/fal-client.ts +12 -0
  47. package/templates/nextjs/lib/fal-generate.ts +86 -0
  48. package/templates/nextjs/lib/fal-models.ts +213 -0
  49. package/templates/nextjs/lib/prompt-contract.ts +97 -0
  50. package/templates/nextjs/lib/use-device.ts +42 -0
  51. package/templates/nextjs/lib/use-lenis.ts +35 -0
  52. package/templates/nextjs/next.config.ts +29 -0
  53. package/templates/nextjs/package-lock.json +6455 -0
  54. package/templates/nextjs/package.json +41 -0
  55. package/templates/nextjs/package.patch.json +28 -0
  56. package/templates/nextjs/postcss.config.js +6 -0
  57. package/templates/nextjs/scripts/generate-chapter-assets.mjs +243 -0
  58. package/templates/nextjs/scripts/setup.mjs +170 -0
  59. package/templates/nextjs/tailwind.config.ts +37 -0
  60. package/templates/nextjs/tsconfig.json +23 -0
  61. package/troubleshooting.md +1284 -0
@@ -0,0 +1,77 @@
1
+ # Studio — brutalist creative-director portfolio
2
+
3
+ A second worked example for **cinematic-scroll**, in a deliberately different
4
+ world from the Renaissance demo: **Swiss / brutalist editorial** — oversized
5
+ grotesk type, monochrome + one electric-blue accent, generated stills that
6
+ parallax *under* the type. Fictional persona (**Maya Torres**), no real people
7
+ or brands. Inspired by the spare, type-as-hero language of sites like
8
+ ianaldous.com.
9
+
10
+ Single self-contained `index.html` — no build step, GitHub-Pages-native.
11
+
12
+ ## Effects
13
+
14
+ The hand-rolled rAF engine drives the chapter scroll (CSS-sticky pins, giant
15
+ per-word type reveals, figure parallax, grey→white→ink background morph). On
16
+ top of that, **GSAP ScrollTrigger** now powers ONE dedicated showcase beat —
17
+ the **"Selected Work" contact sheet** (`#selected`, inserted after *The Work*):
18
+
19
+ - **Montage snap** (taste-guardrails §2 *Montage* / scroll-patterns *Landing
20
+ Sequence*) — the only GSAP-pinned section. A brutalist row of work-cards is
21
+ advanced by `transform: translateX` on the scrubbed pin timeline and **snaps
22
+ card→card** (`snapTo: 1/(n-1)`).
23
+ - **Velocity-reactive typography** (scroll-patterns #3) — the section's large
24
+ display heading **compresses** (`letter-spacing` + `scaleY`) on fast scroll,
25
+ driven by a lerped velocity tracker via `gsap.quickTo`.
26
+
27
+ Everything degrades gracefully: with GSAP absent, reduced-motion, or on mobile,
28
+ the contact sheet renders as a static wrapped/stacked grid — no pin, no snap, no
29
+ velocity — and the rest of the page runs on the rAF engine alone.
30
+
31
+ ## Run it
32
+
33
+ ```bash
34
+ python3 -m http.server 8099 # then open http://localhost:8099/examples/studio/
35
+ # …or just open index.html directly.
36
+ ```
37
+
38
+ The page works **immediately at $0** using CSS/SVG placeholder visuals. To
39
+ upgrade to real AI-generated stills:
40
+
41
+ ## Generate the images (needs fal.ai access)
42
+
43
+ The Cowork sandbox can't reach fal.ai, so run this on a machine that can
44
+ (e.g. Claude Code on your Mac):
45
+
46
+ ```bash
47
+ # 1. put your key in a gitignored .env.local (this folder or repo root):
48
+ echo 'FAL_KEY=xxxxxxxx:xxxxxxxx' > .env.local
49
+
50
+ # 2. preview the prompts (no cost):
51
+ node generate.mjs --dry-run
52
+
53
+ # 3. generate all 6 (~$0.90 on Nano Banana Pro):
54
+ node generate.mjs
55
+
56
+ # regenerate just one if a still has baked-in text/logo:
57
+ node generate.mjs --only 4-recognition
58
+ ```
59
+
60
+ Images land in `assets/<id>.jpg` and the page picks them up automatically
61
+ (it prefers a real `assets/<id>.jpg`, falls back to the CSS placeholder).
62
+
63
+ - **Model:** Nano Banana Pro (`fal-ai/gemini-3-pro-image-preview`), ~$0.15/img.
64
+ Use the cheaper Nano Banana 2 with `MODEL=fal-ai/gemini-3.1-flash-image-preview node generate.mjs`.
65
+ - **Prompts** live in `chapters.js` — the single source of truth for both the
66
+ generator and the page. Edit copy or prompts in one place.
67
+ - **Hygiene:** every prompt forces pure B&W and forbids text/logos/real brands.
68
+ Still, eyeball each result — regenerate any that slip.
69
+
70
+ ## Files
71
+
72
+ | File | What |
73
+ |------|------|
74
+ | `index.html` | The page — self-contained motion engine + layout |
75
+ | `chapters.js` | Chapter copy + image prompts (shared source of truth) |
76
+ | `generate.mjs` | fal.ai image generator (run on a networked machine) |
77
+ | `assets/` | Generated stills (`<id>.jpg`) — gitignored until you add them |
@@ -0,0 +1,105 @@
1
+ /* ============================================================================
2
+ Maya Torres — Creative Director portfolio (brutalist / Swiss editorial)
3
+ Single source of truth for BOTH the page (index.html) and the image
4
+ generator (generate.mjs). Fictional persona — no real people or brands.
5
+
6
+ Aesthetic: monochrome (ink / greys / white) + one electric-blue accent.
7
+ Motion: full cinematic scroll — pinned chapters, giant-grotesk type reveals,
8
+ imagery parallaxing UNDER the type, grey→white→ink background morph.
9
+ ========================================================================== */
10
+
11
+ export const ACCENT = '#0F4CFF'; // electric blue — accent words + CTA
12
+ export const PALETTE = {
13
+ ink: '#111113',
14
+ grey: '#E6E6E6',
15
+ grey2: '#D4D4D6',
16
+ white: '#FFFFFF',
17
+ muted: '#6B6B70',
18
+ accent: ACCENT,
19
+ };
20
+
21
+ /* Each chapter:
22
+ - id folder-safe slug → asset filename (assets/<id>.jpg)
23
+ - eyebrow small mono label
24
+ - title array of [word, accent?] (accent:1 → electric-blue word)
25
+ - body supporting paragraph (creative-director voice)
26
+ - card floating mono UI artifact { tag, body }
27
+ - fig / figLabel bottom caption for the framed still
28
+ - morph background colour this chapter morphs TO (grey↔white↔ink)
29
+ - depthTextDark true → type is white on dark morph; false → ink on light
30
+ - prompt Nano Banana Pro image prompt (monochrome, NO text/logos)
31
+ */
32
+ export const CHAPTERS = [
33
+ {
34
+ id: '0-hero',
35
+ eyebrow: 'CREATIVE DIRECTION · PORTFOLIO MMXXVI',
36
+ title: [['MAYA', 0], ['TORRES', 1]],
37
+ body: 'Global Creative Director. Two decades turning products into culture — and the last twelve years shaping how the world feels about the objects in its pockets.',
38
+ card: { tag: '/role', body: 'Global Creative Director · Brand, film, product. Blank page to final cut.' },
39
+ fig: 'FIG. 00', figLabel: 'PORTRAIT, UNTITLED',
40
+ morph: '#E6E6E6', depthTextDark: false,
41
+ prompt: 'High-contrast black-and-white editorial portrait of a confident creative director in their late 30s, dramatic single-source studio light, deep shadows, fine film grain, minimalist grey seamless background, shot on medium format, no text, no logos, fashion-editorial restraint, cinematic monochrome'
42
+ },
43
+ {
44
+ id: '1-belief',
45
+ eyebrow: 'THE BELIEF',
46
+ title: [['Great work earns', 0], ['its place in culture.', 1]],
47
+ body: 'Creative that does not enter the conversation is decoration. Every brief starts with one question: will anyone outside this room care? If not, we start again.',
48
+ card: { tag: '/principle', body: 'Earn attention. Never assume it. Culture is the only real KPI.' },
49
+ fig: 'FIG. 01', figLabel: 'THE STUDIO FLOOR',
50
+ morph: '#FFFFFF', depthTextDark: false,
51
+ prompt: 'Black-and-white documentary photograph of an empty modern creative studio at dawn, raw concrete floor, large windows, a single chair, long shadows, high contrast, fine grain, architectural minimalism, vast negative space, no people, no text, no logos, monochrome editorial'
52
+ },
53
+ {
54
+ id: '2-work',
55
+ eyebrow: 'THE WORK',
56
+ title: [['Twelve years.', 0], ['One obsession.', 1]],
57
+ body: 'Wearables, audio, the small devices that became extensions of the body. Launch films, platform campaigns, the kind of product storytelling that turns a spec sheet into a feeling.',
58
+ card: { tag: '/output', body: '40+ global launches · film, OOH, platform. Synced across 28 markets.' },
59
+ fig: 'FIG. 02', figLabel: 'PRODUCT STUDY, ABSTRACT',
60
+ morph: '#111113', depthTextDark: true,
61
+ prompt: 'Abstract macro photograph of a sculptural premium consumer-electronics form in brushed aluminium and matte black, floating on pure black, single dramatic rim light, glossy reflections, no recognisable brand, no logos, no text, high-contrast monochrome product photography, museum lighting, fine grain'
62
+ },
63
+ {
64
+ id: '3-craft',
65
+ eyebrow: 'THE CRAFT',
66
+ title: [['The messy,', 0], ['meaningful middle.', 1]],
67
+ body: 'I live between the blank page and the final release — leading multidisciplinary teams that feel safe taking real creative risks. Storytelling, positioning, design direction, and the trust that lets a team be brave.',
68
+ card: { tag: '/process', body: 'Multidisciplinary team of 14 · safe to fail, built to ship.' },
69
+ fig: 'FIG. 03', figLabel: 'PROCESS, IN MOTION',
70
+ morph: '#D4D4D6', depthTextDark: false,
71
+ prompt: 'Black-and-white motion-blurred photograph of hands arranging printed storyboards and contact sheets on a large table, overhead light, scattered film stills, intense focus, documentary grain, high contrast, no faces, no text, no logos, monochrome editorial reportage'
72
+ },
73
+ {
74
+ id: '4-recognition',
75
+ eyebrow: 'RECOGNITION',
76
+ title: [['Grand', 0], ['Prix.', 1]],
77
+ body: 'A Grand Prix at the world’s largest creative festival. A Pencil for cultural impact. The recognition matters only because of what it represents — work that moved people, at scale.',
78
+ card: { tag: '/awards', body: 'Grand Prix · Pencil for impact · 11 metals across film + craft.' },
79
+ fig: 'FIG. 04', figLabel: 'THE TROPHY, BACKLIT',
80
+ morph: '#111113', depthTextDark: true,
81
+ prompt: 'Dramatic black-and-white still life of an abstract minimalist award trophy form, a tall geometric monolith, single hard backlight creating a halo, deep black surroundings, glossy reflections, fine grain, no text, no logos, no engraving, high-contrast monochrome, gallery lighting'
82
+ },
83
+ {
84
+ id: '5-invitation',
85
+ eyebrow: 'THE INVITATION',
86
+ title: [['Let’s make work', 0], ['that matters.', 1]],
87
+ body: 'I’m looking to partner with ambitious brands and collaborators who believe in brave ideas. If that’s you, the page is blank and the cursor is blinking.',
88
+ card: { tag: '/contact', body: 'Open to select partnerships · global · remote-first.' },
89
+ fig: 'FIG. 05', figLabel: 'THE OPEN PAGE',
90
+ morph: '#FFFFFF', depthTextDark: false,
91
+ prompt: 'Minimalist black-and-white photograph of a single blank sheet of heavy paper on a vast empty desk, one shaft of hard window light, long shadow, immense negative space, fine grain, high contrast, no text, no logos, no writing, monochrome editorial, quiet and confident'
92
+ },
93
+ ];
94
+
95
+ /* MONTAGE — a brutalist "contact sheet" of selected work, shown as a single
96
+ GSAP-pinned + snap section (cinematic "Montage", taste-guardrails §2;
97
+ scroll-patterns.md "Landing Sequence" snap config). CSS-only numbered tiles,
98
+ no image assets. Index = filing number; year + discipline as mono metadata. */
99
+ export const MONTAGE = [
100
+ { idx: '01', year: '2014', label: 'Wearable launch film', meta: 'FILM · GLOBAL' },
101
+ { idx: '02', year: '2017', label: 'Audio platform identity', meta: 'BRAND · 28 MKTS' },
102
+ { idx: '03', year: '2020', label: 'Pocket-device campaign', meta: 'OOH · PLATFORM' },
103
+ { idx: '04', year: '2023', label: 'Grand Prix anthem', meta: 'FILM · CRAFT' },
104
+ { idx: '05', year: '2026', label: 'The next blank page', meta: 'OPEN · TBD' },
105
+ ];