@devinilabs/reelstack 1.2.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 (145) hide show
  1. package/LICENSE +128 -0
  2. package/README.md +125 -0
  3. package/cli/beats.js +124 -0
  4. package/cli/bootstrap.js +124 -0
  5. package/cli/capture.js +34 -0
  6. package/cli/direction.js +114 -0
  7. package/cli/icons.js +49 -0
  8. package/cli/index.js +101 -0
  9. package/cli/init.js +253 -0
  10. package/cli/license.js +168 -0
  11. package/cli/lint.js +865 -0
  12. package/cli/preview.js +59 -0
  13. package/cli/render.js +404 -0
  14. package/cli/scaffold.js +239 -0
  15. package/cli/smoke.js +76 -0
  16. package/cli/update.js +26 -0
  17. package/cli/utils.js +184 -0
  18. package/docs/buyers-guide.md +220 -0
  19. package/docs/design-discipline.md +130 -0
  20. package/docs/family-galleries/dark.md +95 -0
  21. package/docs/family-galleries/forbidden.md +78 -0
  22. package/docs/family-galleries/glass.md +98 -0
  23. package/docs/family-galleries/paper.md +82 -0
  24. package/docs/family-galleries/warm.md +86 -0
  25. package/docs/superpowers/plans/2026-05-09-reelstack-init-readiness-gate.md +1166 -0
  26. package/docs/superpowers/specs/2026-05-09-reelstack-init-readiness-gate-design.md +233 -0
  27. package/families/dark/components/DriftingSpotlights.tsx +59 -0
  28. package/families/dark/components/FilmGrain.tsx +44 -0
  29. package/families/dark/components/ForestCard.tsx +43 -0
  30. package/families/dark/components/GridBackground.tsx +29 -0
  31. package/families/dark/components/RadialVignette.tsx +21 -0
  32. package/families/dark/components/Scanlines.tsx +35 -0
  33. package/families/dark/components/SegmentOpacity.ts +37 -0
  34. package/families/dark/components/index.ts +13 -0
  35. package/families/dark/index.ts +31 -0
  36. package/families/dark/palette.ts +98 -0
  37. package/families/dark/presets/claudedispatch.ts +46 -0
  38. package/families/dark/presets/codedrop.ts +37 -0
  39. package/families/dark/presets/gpt55.ts +54 -0
  40. package/families/dark/presets/notebooklm.ts +50 -0
  41. package/families/dark/presets/resourcescta.ts +35 -0
  42. package/families/dark/presets/skills.ts +40 -0
  43. package/families/dark/presets/stitch.ts +46 -0
  44. package/families/dark/presets/stitch2.ts +43 -0
  45. package/families/dark/typography.ts +16 -0
  46. package/families/forbidden/components/ForbiddenCausticBlobs.tsx +52 -0
  47. package/families/forbidden/components/NewsprintTexture.tsx +28 -0
  48. package/families/forbidden/components/TintedShadow.tsx +36 -0
  49. package/families/forbidden/components/index.ts +38 -0
  50. package/families/forbidden/index.ts +17 -0
  51. package/families/forbidden/palette.ts +88 -0
  52. package/families/forbidden/presets/heretic.ts +44 -0
  53. package/families/forbidden/typography.ts +18 -0
  54. package/families/glass/components/BreakdownCard.tsx +158 -0
  55. package/families/glass/components/CausticBlobs.tsx +49 -0
  56. package/families/glass/components/Counter.tsx +72 -0
  57. package/families/glass/components/EyebrowPill.tsx +59 -0
  58. package/families/glass/components/FilmStrip.tsx +202 -0
  59. package/families/glass/components/FloatingGlyphs.tsx +78 -0
  60. package/families/glass/components/GlassCard.tsx +58 -0
  61. package/families/glass/components/GlassCardBezel.tsx +45 -0
  62. package/families/glass/components/HairlineGrid.tsx +30 -0
  63. package/families/glass/components/IridescentRing.tsx +114 -0
  64. package/families/glass/components/IridescentText.tsx +98 -0
  65. package/families/glass/components/LightBeam.tsx +46 -0
  66. package/families/glass/components/ParticleBurst.tsx +62 -0
  67. package/families/glass/components/SonarRings.tsx +81 -0
  68. package/families/glass/components/StaggeredWords.tsx +74 -0
  69. package/families/glass/components/index.ts +20 -0
  70. package/families/glass/index.ts +31 -0
  71. package/families/glass/palette.ts +93 -0
  72. package/families/glass/presets/claudewatch.ts +64 -0
  73. package/families/glass/presets/claudewatchcta.ts +43 -0
  74. package/families/glass/presets/graphify.ts +45 -0
  75. package/families/glass/presets/gstack.ts +48 -0
  76. package/families/glass/presets/jcode.ts +50 -0
  77. package/families/glass/presets/lilagents.ts +52 -0
  78. package/families/glass/presets/paperclip.ts +43 -0
  79. package/families/glass/typography.ts +15 -0
  80. package/families/index.ts +49 -0
  81. package/families/paper/components/CardSpring.tsx +42 -0
  82. package/families/paper/components/CreamGrid.tsx +26 -0
  83. package/families/paper/components/EditorialSerifText.tsx +51 -0
  84. package/families/paper/components/GreenAccentCard.tsx +10 -0
  85. package/families/paper/components/PaperShadow.tsx +30 -0
  86. package/families/paper/components/ScaleBlurText.tsx +40 -0
  87. package/families/paper/components/index.ts +11 -0
  88. package/families/paper/index.ts +23 -0
  89. package/families/paper/palette.ts +102 -0
  90. package/families/paper/presets/designreel.ts +32 -0
  91. package/families/paper/presets/devini3d.ts +45 -0
  92. package/families/paper/presets/justdrop.ts +39 -0
  93. package/families/paper/presets/opus.ts +48 -0
  94. package/families/paper/typography.ts +17 -0
  95. package/families/warm/components/AccentGlow.tsx +60 -0
  96. package/families/warm/components/BentoCell.tsx +56 -0
  97. package/families/warm/components/BentoGrid.tsx +30 -0
  98. package/families/warm/components/FilmGrain.tsx +36 -0
  99. package/families/warm/components/ScaleBlurCounter.tsx +71 -0
  100. package/families/warm/components/WarmSurface.tsx +35 -0
  101. package/families/warm/components/index.ts +11 -0
  102. package/families/warm/index.ts +19 -0
  103. package/families/warm/palette.ts +81 -0
  104. package/families/warm/presets/huashu.ts +49 -0
  105. package/families/warm/presets/mempalace.ts +51 -0
  106. package/families/warm/typography.ts +17 -0
  107. package/package.json +85 -0
  108. package/reference/dark/claudedispatch.tsx +2441 -0
  109. package/reference/dark/notebooklm.tsx +2316 -0
  110. package/reference/dark/stitch.tsx +3040 -0
  111. package/reference/forbidden/heretic.tsx +2636 -0
  112. package/reference/glass/claudewatch.tsx +3827 -0
  113. package/reference/glass/graphify.tsx +2418 -0
  114. package/reference/glass/paperclip.tsx +2218 -0
  115. package/reference/paper/designreel.tsx +883 -0
  116. package/reference/paper/justdrop.tsx +1898 -0
  117. package/reference/paper/opus.tsx +1770 -0
  118. package/reference/warm/huashu.tsx +3413 -0
  119. package/reference/warm/mempalace.tsx +2909 -0
  120. package/skill/SKILL.md +229 -0
  121. package/skill/commands/reelstack-beats.md +20 -0
  122. package/skill/commands/reelstack-capture.md +24 -0
  123. package/skill/commands/reelstack-critique.md +15 -0
  124. package/skill/commands/reelstack-dark.md +40 -0
  125. package/skill/commands/reelstack-direction.md +17 -0
  126. package/skill/commands/reelstack-forbidden.md +25 -0
  127. package/skill/commands/reelstack-glass.md +39 -0
  128. package/skill/commands/reelstack-icons.md +22 -0
  129. package/skill/commands/reelstack-init.md +17 -0
  130. package/skill/commands/reelstack-lint.md +22 -0
  131. package/skill/commands/reelstack-paper.md +36 -0
  132. package/skill/commands/reelstack-render.md +20 -0
  133. package/skill/commands/reelstack-warm.md +36 -0
  134. package/templates/dark/template.tsx +115 -0
  135. package/templates/forbidden/template.tsx +111 -0
  136. package/templates/glass/template.tsx +201 -0
  137. package/templates/paper/template.tsx +133 -0
  138. package/templates/warm/template.tsx +210 -0
  139. package/utils/ai-purple-blocklist.ts +13 -0
  140. package/utils/banned-fonts.ts +11 -0
  141. package/utils/cubic-bezier.ts +36 -0
  142. package/utils/easing.ts +84 -0
  143. package/utils/grid.ts +13 -0
  144. package/utils/render-presets.json +56 -0
  145. package/utils/safe-zones.tsx +57 -0
@@ -0,0 +1,220 @@
1
+ # ReelStack — Buyer's Guide
2
+
3
+ Welcome. This guide walks you from a fresh laptop to your first rendered ReelStack reel in under 15 minutes.
4
+
5
+ ## 1. Prerequisites
6
+
7
+ You don't need to install everything by hand — `init`'s readiness gate (v1.2+) detects what's missing and either offers to install it (macOS + Homebrew) or prints the exact command for your platform. The table below is for reference if you'd rather pre-install.
8
+
9
+ | Tool | Why | macOS | Linux | Windows |
10
+ |---|---|---|---|---|
11
+ | **Node ≥ 20** | ReelStack CLI runtime | `nvm install 20` or [nodejs.org](https://nodejs.org/) | `nvm install 20` / [nodejs.org](https://nodejs.org/) | [nodejs.org](https://nodejs.org/) installer |
12
+ | **Remotion 4** | Video framework | auto-bootstrapped by `init`, or `npm create video@latest` | same | same |
13
+ | **ffmpeg** | Audio resample + render mux | `brew install ffmpeg` (init can run this for you) | `apt-get install ffmpeg` (Debian/Ubuntu) · `dnf install ffmpeg` (Fedora) · `pacman -S ffmpeg` (Arch) | `choco install ffmpeg` · `scoop install ffmpeg` |
14
+ | **whisper-cpp** | Frame-accurate beat extraction (only required for `/reelstack-beats`) | `brew install whisper-cpp` (init can run this) | build from source: [github.com/ggerganov/whisper.cpp](https://github.com/ggerganov/whisper.cpp) | build from source, or `scoop install whisper.cpp` |
15
+ | **Whisper model** | The `base.en` model file (only `/reelstack-beats`) | `curl -L -o /tmp/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin` | same | (PowerShell) `Invoke-WebRequest -Uri https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin -OutFile $env:TEMP\ggml-base.en.bin` |
16
+ | **Claude Code** | Where you invoke the slash commands | [claude.com/claude-code](https://claude.com/claude-code) | same | same |
17
+
18
+ **Platform note:** if you're on Linux or Windows, plan on running `init` twice — once to detect what's missing (it will print the right install command and exit), then again after you've installed. macOS+Homebrew users can stay in a single session because `init` will offer to run `brew install` directly.
19
+
20
+ ## 2. Buy a license
21
+
22
+ - Visit [devini.io/reelstack](https://devini.io/reelstack).
23
+ - Pay ₹149 INR (India) / $3 USD (elsewhere). Region is detected at checkout. You'll receive a license key by email within ~30 seconds.
24
+ - Keep the key — you'll paste it during `init`.
25
+
26
+ ## 3. Install
27
+
28
+ In any Remotion project, or in any folder where you want a fresh one created:
29
+
30
+ ```bash
31
+ npx @devinilabs/reelstack init
32
+ ```
33
+
34
+ `init` runs a **4-tier readiness gate** — every tier is a hard precondition for the next, and the success banner only prints if all four pass.
35
+
36
+ ```
37
+ 1. License verify
38
+ 2. Tier 1: Node ≥ 20 (exits with nvm/fnm guide if not)
39
+ 3. Tier 2: ffmpeg + whisper-cpp (auto-install on macOS+brew;
40
+ prints platform-specific
41
+ command on Linux/Windows)
42
+ 4. Install ~/.reelstack/ runtime
43
+ Install ~/.claude/skills/reelstack/
44
+ Install 13 slash command stubs
45
+ 5. Tier 3: Remotion project bootstrap (npx create-video@latest --yes
46
+ --blank reelstack-project,
47
+ unless --no-bootstrap)
48
+ 6. Tier 4: smoke test (scaffolds Demo.tsx, runs
49
+ `npx remotion compositions`,
50
+ runs `ffmpeg -version`,
51
+ skip with --skip-smoke)
52
+ 7. Success banner
53
+ ```
54
+
55
+ State is recorded at `~/.reelstack/state.json` so subcommands like `/reelstack-beats` know whether the dep was previously declined and can fail-fast with a clear message.
56
+
57
+ ### Flags
58
+
59
+ ```bash
60
+ npx @devinilabs/reelstack init # full flow
61
+ npx @devinilabs/reelstack init --name=my-reels # bootstrap dir name (Tier 3)
62
+ npx @devinilabs/reelstack init --skip-smoke # skip Tier 4 (CI re-runs)
63
+ npx @devinilabs/reelstack init --no-bootstrap # skip Tier 3
64
+ # (already-Remotion projects)
65
+ ```
66
+
67
+ ### What you'll see on each platform
68
+
69
+ **macOS + Homebrew (the magic-experience path):**
70
+ ```
71
+ ✗ ffmpeg not found.
72
+ ? Run `brew install ffmpeg`? (Y/n) y
73
+ [brew output…]
74
+ ✓ ffmpeg installed
75
+ ```
76
+
77
+ **macOS without Homebrew, Linux, Windows:**
78
+ ```
79
+ ✗ ffmpeg not found.
80
+ Install ffmpeg via:
81
+ apt-get install ffmpeg # Debian/Ubuntu
82
+ dnf install ffmpeg # Fedora
83
+ pacman -S ffmpeg # Arch
84
+ Then re-run: reelstack init
85
+ ```
86
+
87
+ (Linux is shown above; Windows prints `choco install ffmpeg` / `scoop install ffmpeg`; macOS-without-brew prints the Homebrew install URL.)
88
+
89
+ If anything's missing, the CLI will tell you exactly what to install — and on macOS+Homebrew, do it for you.
90
+
91
+ ## 4. Make your first reel
92
+
93
+ In Claude Code, type:
94
+
95
+ ```
96
+ /reelstack-glass
97
+ ```
98
+
99
+ ReelStack will:
100
+
101
+ - Print a 7-preset menu with one-line use-cases (default `claudewatch` for long-form skill drops; `graphify` for premium product reveals; `paperclip` for open-source launches; `gstack` for long-form toolkits; `lilagents` for mascot reveals; `jcode` for benchmark narratives; `claudewatchcta` for an 8s outro). Reply with a number or preset key.
102
+ - Ask for a reel name.
103
+ - Ask for an optional voiceover path (skip if you'll record later).
104
+ - Create `src/<Name>Reel.tsx` pre-wired with the family's palette, primitives, BEAT skeleton, and IG safe zones.
105
+ - Register the new composition in `src/Root.tsx`.
106
+ - Print the family reference doc so you can see exactly what tools are available.
107
+ - Offer to launch Remotion Studio.
108
+
109
+ The other 4 family commands (`/reelstack-paper`, `/reelstack-dark`, `/reelstack-warm`, `/reelstack-forbidden`) follow the same flow with their own preset menus. Forbidden auto-defaults silently — it has only one preset (`heretic`) at v1.1.1.
110
+
111
+ That's it — you're inside a real ReelStack reel.
112
+
113
+ ## 5. Lock motion to voiceover
114
+
115
+ If you have a voiceover .wav, run:
116
+
117
+ ```
118
+ /reelstack-beats public/my-vo.wav
119
+ ```
120
+
121
+ ReelStack will:
122
+
123
+ - Resample to 16kHz mono via ffmpeg.
124
+ - Run whisper-cli to produce an SRT.
125
+ - Parse the SRT into frame-accurate `BEAT` constants.
126
+ - Print the const block ready to paste.
127
+
128
+ **Important:** whisper base.en mishears tech jargon ("Claude" → "Cloud", "Remotion" → "Re-motion"). Use the timings exactly, but copy on-screen text from your script. ReelStack reminds you of this every time you run `/reelstack-beats`.
129
+
130
+ ## 6. Iterate
131
+
132
+ Open Remotion Studio:
133
+
134
+ ```bash
135
+ npm run dev
136
+ ```
137
+
138
+ Pick your reel from the comp list. Scrub the timeline, tune motion, swap palette accents.
139
+
140
+ Common moves:
141
+
142
+ - **Add a primitive.** Import from `~/.reelstack/families/<family>/components/`.
143
+ - **Tune a spring.** Reach for `springs.snappy`, `springs.gentle`, `springs.bouncy`, `springs.glass` in `~/.reelstack/utils/easing.ts`.
144
+ - **Fix overlap with Instagram chrome.** Toggle `<SafeZones visible={true} />` to see the reserved bands.
145
+ - **Pull a brand logo.** Run `/reelstack-icons logos:react` (or any Iconify ID).
146
+ - **Capture a product UI.** Run `/reelstack-capture https://example.com`.
147
+
148
+ **Reference reels.** ReelStack ships 12 reference reels at `~/.reelstack/reference/<family>/<preset>.tsx`. After scaffolding, your AI agent (Claude Code, etc.) can study these to give better iteration advice. To force a specific reference, pass `--reference=<preset>` to the scaffold command. See `~/.reelstack/docs/design-discipline.md` for the full catalog.
149
+
150
+ ## 7. Validate before posting
151
+
152
+ ```
153
+ /reelstack-lint src/MyReel.tsx
154
+ ```
155
+
156
+ ReelStack will check:
157
+
158
+ - **Safe zone breaches.** No hero copy under top 290px or above bottom 422px.
159
+ - **Motion floors.** Each scene has ≥3 simultaneous animation layers (≥4 in the opener).
160
+ - **Hero text fit.** Counters and hero text don't overflow the canvas.
161
+ - **Audio lock.** If you import `<Audio>`, you've defined `BEATS`.
162
+ - **Hand-drawn brand SVGs.** Inline `<svg>` longer than 800 chars gets flagged — pull the real one via `/reelstack-icons`.
163
+
164
+ Lint must pass before render. Pass `--force` to skip if you know what you're doing.
165
+
166
+ ## 8. Render
167
+
168
+ ```
169
+ /reelstack-render MyReel --platform=ig
170
+ ```
171
+
172
+ Or directly:
173
+
174
+ ```bash
175
+ npx reelstack render MyReel --platform=ig
176
+ ```
177
+
178
+ Platform presets:
179
+
180
+ - **ig / tiktok:** 1080×1920, H.264, CRF 18, 8 Mbps.
181
+ - **shorts:** 1080×1920, H.264, CRF 17, 9 Mbps.
182
+
183
+ Output lands in `out/<Name>-<platform>.mp4`. Preview before posting.
184
+
185
+ ## 9. Update
186
+
187
+ ```bash
188
+ npx @devinilabs/reelstack@latest init
189
+ ```
190
+
191
+ Re-runs the full readiness gate against the latest npm release. New presets shipped in v1.x are pulled automatically — your purchase covers all v1.x updates. Your license key and `~/.reelstack/state.json` are preserved across updates.
192
+
193
+ ## Troubleshooting
194
+
195
+ | Symptom | Fix |
196
+ |---|---|
197
+ | `License missing or expired` | Run `npx @devinilabs/reelstack init` again. |
198
+ | `ffmpeg not found` | macOS: `brew install ffmpeg`. Linux: `apt-get install ffmpeg` / `dnf install ffmpeg` / `pacman -S ffmpeg`. Windows: `choco install ffmpeg` or `scoop install ffmpeg`. |
199
+ | `whisper-cli is not installed (init flagged this)` | You declined or skipped whisper during `init`. macOS: `brew install whisper-cpp`. Linux/Windows: build from [github.com/ggerganov/whisper.cpp](https://github.com/ggerganov/whisper.cpp) (or `scoop install whisper.cpp` on Windows). Then re-run `npx @devinilabs/reelstack init`. |
200
+ | `whisper-cli not found` (when init never ran) | Same as above, then re-run `init`. |
201
+ | `Whisper model not found` | macOS/Linux: `curl -L -o /tmp/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin`. Windows (PowerShell): `Invoke-WebRequest -Uri https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin -OutFile $env:TEMP\ggml-base.en.bin`. |
202
+ | `ReelStack is NOT ready — smoke test failed at <step>` | The named step tells you which check failed: `scaffold-demo` = your `Root.tsx` is wrong; `remotion-compositions` = Remotion CLI couldn't load the project; `ffmpeg-version` = ffmpeg binary not executable. Fix and re-run `init` (or pass `--skip-smoke` to bypass). |
203
+ | `Found a package.json in this folder, but it doesn't parse as valid JSON` | Your project's `package.json` has a syntax error. Fix it, or run `init` from a different directory. |
204
+ | Reel scaffold registered but Studio shows blank | Wait 10s for HMR; if still blank, delete `node_modules/.cache` and `npm run dev` again. |
205
+ | Whisper SRT mishears tech terms | Use timings as-is; replace on-screen text from your script. |
206
+
207
+ ## Support
208
+
209
+ - Bugs: GitHub issues at the private repo (your license email contains the URL).
210
+ - Licensing: licensing@devinilabs.com.
211
+ - Updates: announced on [reelstack.dev](https://reelstack.dev).
212
+
213
+ ## Acknowledgments
214
+
215
+ ReelStack v1.1+ stands on the shoulders of two outside skills, fully baked in (no peer install required):
216
+
217
+ - **[leonxlnx/taste-skill](https://github.com/leonxlnx/taste-skill)** (MIT) — UI design-discipline ruleset by `@leonxlnx`. ReelStack bakes the master rules and per-family variant overlays (Soft / Minimalist / Brutalist) directly into its components, palettes, and lint. Anti-emoji, font lockdown, max-1-accent rule, hardware-accel-only animation, `prefers-reduced-motion` parity, 4-px grid alignment — all enforced by default. Full rule citations at [`docs/design-discipline.md`](design-discipline.md).
218
+ - **[alchaincyf/huashu-design](https://github.com/alchaincyf/huashu-design)** (Personal Use Only) — design productivity skill by `@AlchainHust` (花叔). ReelStack adopts huashu-design's UX patterns (Design Direction Advisor, 5-dimension critique, multi-format export) without copying any code or text. The Warm Signature family's `huashu` preset is named for this same project as a credit hook.
219
+
220
+ If ReelStack helps you ship, please consider starring both upstream skills.
@@ -0,0 +1,130 @@
1
+ # ReelStack — Design Discipline
2
+
3
+ > The canonical reference of which taste-skill rules ReelStack enforces, with line-numbered citations to where each rule is implemented. v1.1+.
4
+
5
+ ReelStack inherits design discipline from two outside skills, fully baked in (no peer install required):
6
+
7
+ | Influence | License | How it's incorporated |
8
+ |---|---|---|
9
+ | [`leonxlnx/taste-skill`](https://github.com/leonxlnx/taste-skill) | MIT | Rules baked into components, palettes, and lint. Per-family variant overlays (Soft / Minimalist / Brutalist) ship as additional components. |
10
+ | [`alchaincyf/huashu-design`](https://github.com/alchaincyf/huashu-design) | Personal Use Only | UX patterns adapted (Design Direction Advisor, 5-dim critique, multi-format render). **No code or text copied** — patterns only, with credit. |
11
+
12
+ ---
13
+
14
+ ## Master rules — universal across all 5 families
15
+
16
+ These rules apply to every scaffolded reel, regardless of family.
17
+
18
+ ### 1. Font lockdown — Geist / Geist Mono only
19
+
20
+ - **Banned at lint time**: Inter, Roboto, Helvetica, Arial, Open Sans, Lato, Source Sans Pro, Nunito, Poppins, Montserrat, Raleway, PT Sans, Ubuntu.
21
+ - **Allowed**: Geist Sans, Geist Mono, system-ui (fallback). Editorial-serif options for Cream Paper / Warm Signature variants: Lyon Text, Newsreader, Playfair Display.
22
+ - **Implementation**: `utils/banned-fonts.ts` + `BANNED_FONT` lint rule in `cli/lint.js`.
23
+
24
+ ### 2. No pure `#000000` text
25
+
26
+ - Every family palette declares family-specific ink colors with WCAG AA+ contrast comments.
27
+ - **Allowed inks**: Glass `#0E0E12`, Paper `#1a1a1a`, Dark `#f5f5f7` (fg), Warm `#fafafa` (fg), Forbidden `#0E0B12`.
28
+ - **Lint rule**: `PURE_BLACK_TEXT` (flags `color: "#000"` or `"#000000"`).
29
+
30
+ ### 3. Max one accent per family at <80% saturation (Dark exception)
31
+
32
+ - Glass, Paper, Warm, Forbidden each export `ALLOWED_ACCENTS` arrays — lint flags any color outside the allowlist as `ACCENT_ALLOWLIST_VIOLATION`.
33
+ - Dark Cinematic intentionally allows multi-brand (Stitch rose + Gemini blue + Claude terracotta + NotebookLM blue can coexist) — documented in `families/dark/palette.ts`.
34
+ - **Implementation**: `families/<x>/palette.ts` `ALLOWED_ACCENTS` exports.
35
+
36
+ ### 4. Hardware-accelerated animation only
37
+
38
+ - Every animated component uses `transform` + `opacity` only. Never `top`, `left`, `width`, `height`.
39
+ - Perpetual-motion components (e.g. `IridescentText`'s rotating gradient) opt into `will-change: transform, opacity, filter`.
40
+ - **Implementation**: enforced by component design; verified during template generation.
41
+
42
+ ### 5. Spring-physics defaults
43
+
44
+ - Named spring configs in `utils/easing.ts`: `springs.snappy / gentle / bouncy / glass / smooth`.
45
+ - Linear easing requires explicit justification.
46
+ - **Easings exported**: `power2In/Out`, `power3In/Out`, `power4In/Out`, `power5In/Out`, `expoIn/Out/InOut`, `backIn/Out`, `linear`.
47
+ - Soft variant adds: `softInOut`, `softElastic`, `softSnappy` cubic-beziers (`utils/cubic-bezier.ts`).
48
+
49
+ ### 6. Anti-emoji
50
+
51
+ - `FloatingGlyphs` uses unicode math/code symbols only: `± ∞ ∑ ⟨ ⟩ ∫ ≠ ∂ ∇ ⊕ ⊗`.
52
+ - **Lint rule**: `EMOJI_GLYPH` (flags any unicode emoji in JSX text).
53
+
54
+ ### 7. Anti-AI-purple
55
+
56
+ - `utils/ai-purple-blocklist.ts` exports `AI_PURPLE_HEXES = ["#7c3aed", "#8b5cf6", "#6366f1", "#a78bfa", "#c084fc", "#9333ea", "#7e22ce", "#a855f7"]`.
57
+ - **Lint rule**: `AI_PURPLE_ACCENT` (flags any of these hexes anywhere in scaffolded code).
58
+ - **Note**: Forbidden's ultraviolet `#6B5BD9` and plasma `#A87FE8` are family-specific overrides, NOT in the blocklist; they live in the Forbidden palette explicitly.
59
+
60
+ ### 8. Complete-output discipline
61
+
62
+ - Scaffolded files compile cleanly. No `// ...rest of code`, no `// TODO`, no truncation.
63
+ - **Lint rule**: `GENERIC_PLACEHOLDER` (flags `Lorem ipsum`, `John Doe`, `Acme Corp`, etc. in non-template files).
64
+
65
+ ### 9. Anti-generic content
66
+
67
+ - Banned in shipped reels: `Lorem ipsum`, `John Doe`, `Acme Corp`, `placeholder text`. Templates use `__PLACEHOLDER__` syntax which the scaffolder replaces — those are exempt.
68
+
69
+ ### 10. `prefers-reduced-motion` parity
70
+
71
+ - Every animated component accepts a `reduceMotion?: boolean` prop. Default `false`.
72
+ - Templates read `reduceMotion` from Remotion's `getInputProps()` at module load — buyers can render a low-motion variant via `npx remotion render <id> out/x.mp4 --props='{"reduceMotion":true}'`.
73
+ - **Lint rule**: `MISSING_REDUCE_MOTION` (flags components that import `useCurrentFrame` but don't accept `reduceMotion`).
74
+
75
+ ### 11. 4-px grid alignment
76
+
77
+ - `utils/grid.ts` exports `GRID = 4` plus `GRID_2 / 4 / 6 / 8 / 12 / 16 / 24` named multiples.
78
+ - Every padding / margin / gap should be a multiple of 4.
79
+ - **Lint rule**: `SPACING_NON_GRID` (flags non-grid values; allows 1, 2 for hairlines).
80
+
81
+ ---
82
+
83
+ ## Per-family variant overlays
84
+
85
+ | Family | Variant overlay(s) | Concrete additions |
86
+ |---|---|---|
87
+ | **Glass Iridescent** | Soft + General | `<GlassCardBezel />` (Double-Bezel inner-1px glass border), `softInOut / softElastic / softSnappy` cubic-bezier easings, diffused multi-layer shadow stack via `bezel` prop on `<GlassCard />`. |
88
+ | **Cream Paper** | Minimalist + Soft | `<EditorialSerifText />` (Lyon Text → Newsreader → Playfair Display fallback), generous py-24+ padding multiplier, ultra-flat Minimalist card variant. |
89
+ | **Dark Cinematic** | Brutalist Tactical + General | `<Scanlines />` (CRT scanline overlay, perpetual scroll), monospace-dominant micro-typography variant, hazard-red `#E61919` accent option (within multi-brand allowance). |
90
+ | **Warm Signature** | Minimalist + Soft | Editorial-serif optional Warm hero variant (via `<EditorialSerifText />` import — works across families), diffused warm shadow stack. Single-accent rule already enforced via `ALLOWED_ACCENTS`. |
91
+ | **Forbidden** | Brutalist Swiss Industrial | `<NewsprintTexture />` (halftone grain on cream-rose paper), no-border-radius GlassCard variant via `radius={0}` prop, asymmetric negative-space layout. |
92
+
93
+ ---
94
+
95
+ ## Productivity patterns (huashu-inspired, license-safe)
96
+
97
+ These are UX patterns adapted from `alchaincyf/huashu-design` — no code/text copied; pattern only.
98
+
99
+ | Pattern | ReelStack implementation |
100
+ |---|---|
101
+ | One-sentence brief → deliverable | Slash commands accept natural-language ARGUMENTS or `--brief="…"` flag. The skill parses, infers family + preset + duration, asks 1-2 confirmation questions max. |
102
+ | Design Direction Advisor | `/reelstack-direction "<brief>"` returns 3 differentiated family picks with reasoning. `cli/direction.js` keyword-scores the brief against family profiles. |
103
+ | 5-dimension expert critique | `/reelstack-lint <file> --critique` renders a radar across **palette · motion · timing · hierarchy · brand fit** with a Keep/Fix/Quick punch list. Heuristic scoring in `cli/lint.js`. |
104
+ | Multi-format export | `/reelstack-render --format=mp4,gif` produces both. `--bgm=<path>` mixes background music. `--interpolate=60` requests 60fps. `--palette-optimize` quantizes GIF to 64 colors. |
105
+ | Pre-delivery render verification | Before `/reelstack-render` calls `npx remotion render`, the CLI renders frames 0 / mid / last via `npx remotion still` and checks each PNG > 30 KB. Warns if any frame looks all-black. |
106
+ | Style direction × design philosophy registry | `cli/direction.js` maps each ReelStack family to a profile (mood, best-for cases, presets, slash command). Powers the advisor. |
107
+
108
+ ---
109
+
110
+ ## Skip list — taste-skill rules that DON'T apply to a video product
111
+
112
+ These are deliberately not enforced because they're UI/website-specific:
113
+
114
+ - Scroll-based animation rules (no scroll in a rendered MP4).
115
+ - Hover / active interactive states (viewers can't interact with playback).
116
+ - Form input rules (no forms in a reel).
117
+ - Navigation routing (no multi-page).
118
+ - Responsive breakpoint rules — reels are fixed 9:16, no breakpoints.
119
+ - `min-h-[100dvh]` viewport fixes (Remotion canvas is fixed).
120
+ - Keyboard nav & ARIA tab order (no keyboard input on a rendered reel).
121
+ - Viewport-relative typography (`clamp()`) — fixed canvas, fixed `px` values.
122
+
123
+ ---
124
+
125
+ ## Acknowledgments
126
+
127
+ - **leonxlnx/taste-skill** — MIT-licensed design-discipline ruleset by `@leonxlnx`. ReelStack v1.1+ bakes its master rules and per-family variant overlays directly into the package. Thank you for the canonical reference.
128
+ - **alchaincyf/huashu-design** — Personal-Use-Only design skill by `@AlchainHust` (花叔). ReelStack's `huashu` preset (Warm Signature family) is named for this project; v1.1+ adopts huashu-design's UX patterns (Design Direction Advisor, 5-dim critique, multi-format export) without copying code or text.
129
+
130
+ If you're shipping content with ReelStack, please consider checking out both upstream skills.
@@ -0,0 +1,95 @@
1
+ # Dark Cinematic — Family Reference
2
+
3
+ > Late-night ad-film mood. Mood-lit cards. Multi-brand accents allowed.
4
+
5
+ The family for premium product narratives — partnership reveals, integration showcases, "secret" reveals. Where Glass is a daylight reveal, Dark is the after-hours telecine.
6
+
7
+ ## Palette
8
+
9
+ ```
10
+ bg #0a0a0b Zinc void.
11
+ bgLift #141416
12
+ surface #1a1a1d
13
+ surfaceLift #222226
14
+
15
+ cardForest #1a2e1f Dark forest green for embedded UI / terminal cards.
16
+ cardForestLift #243a28
17
+
18
+ fg #f5f5f7 Foreground text.
19
+ fgSoft #d1d1d6
20
+ fgMuted #8e8e93
21
+ fgDim #5a5a60
22
+
23
+ claude #D4663A Claude terracotta. Default accent.
24
+ claudeSoft #e07a54
25
+ stitch #ff4d9b Stitch rose (allowed in cross-product reels).
26
+ stitchSoft #ff7fb8
27
+ gemini #4285f4 Gemini blue.
28
+ notebookBlue #4F7DF3 NotebookLM blue.
29
+
30
+ safe #4fc46a
31
+ danger #e25822
32
+ amber #fcbb00
33
+ violet #8d54ff
34
+
35
+ terminalGreen #5be8a0 For embedded terminal blocks.
36
+ ```
37
+
38
+ ## Primitives
39
+
40
+ | Component | Purpose |
41
+ |---|---|
42
+ | `DriftingSpotlights` | Two overlapping radial gradients drifting on sine/cosine. Family's signature ambient. |
43
+ | `RadialVignette` | Edge-darkening gradient. Adds the "telecine" feel. |
44
+ | `GridBackground` | 60×60 grid at 4% opacity with radial mask. |
45
+ | `SegmentOpacity` (`so()` helper) | Inline scene-fade controller. The family's editing model. |
46
+ | `Crossfade` | 0.45s in / 0.55s out — the family's standard timing. |
47
+ | `ForestCard` | Dark-green card surface for UI/terminal embeds. Used heavily in claudedispatch. |
48
+
49
+ ## Presets
50
+
51
+ | Preset | Source | Frames | Use when |
52
+ |---|---|---|---|
53
+ | `stitch` | StitchReel | 2297 (76.6s) | Cross-product workflow demo. Multi-brand. PaletteChips legend. |
54
+ | `stitch2` | Stitch2Reel | 600 (20s) | 20s teaser variant with letterboxed hero clip. |
55
+ | `codedrop` | CodeDropReel | 1110 (37s) | Short-form drop with overlay-friendly first 20s. |
56
+ | `claudedispatch` | ClaudeDispatchReel | 2220 (74s) | Hero narrative with embedded UI cards. ForestCard heavy. |
57
+ | `notebooklm` | NotebookLMReel | 1680 (56s) | Product integration narrative. NotebookLM blue dominant. |
58
+ | `gpt55` | GPT55Reel | 2900 (97s) | Benchmark-thesis reel. OpenAI green vs. rival purple. |
59
+ | `resourcescta` | ResourcesCTAReel | 210 (7s) | Outro CTA. Append to other Dark reels. |
60
+ | `skills` | SkillsReel | 1260 (42s) | Ecosystem showcase. Bento grid (categories × platforms). |
61
+
62
+ ## House rules (Dark-specific)
63
+
64
+ 1. **Crossfades 0.45s in / 0.55s out.** Don't hard-cut between scenes. The `so()` helper enforces this.
65
+ 2. **Drifting spotlights at 0.003-0.004 sine drift.** Slower = stillness; faster = nervous energy. Stay in this band.
66
+ 3. **Multi-brand accents are allowed** — Stitch rose + Gemini blue + Claude terracotta can coexist in one reel. The single-accent rule does NOT apply.
67
+ 4. **ForestCard is the embedded-UI surface.** When showing a UI screenshot, terminal block, or benchmark table, frame it with a ForestCard.
68
+ 5. **Vignette is non-negotiable.** Always compose a `<RadialVignette />` over the background. Without it the reel reads "flat" instead of "cinematic".
69
+
70
+ ## Motion vocabulary
71
+
72
+ - **Scene transitions:** `so(frame, fps, startSec, endSec)` — fades in over 0.45s, fades out over 0.55s.
73
+ - **Spotlight drift:** sine on x-axis at rate 0.004, cosine on y-axis at rate 0.003.
74
+ - **Card entrance:** spring snappy (damping 20, stiffness 200) — same as Paper, different palette.
75
+ - **Color reveals:** Crossfade between accents over 12 frames; never instant swap.
76
+
77
+ ## Variant overlay (v1.1+)
78
+
79
+ Dark Cinematic inherits from **leonxlnx/taste-skill-brutalist** (Tactical Telemetry mode) + **leonxlnx/taste-skill (master)**. The Brutalist Tactical overlay adds:
80
+
81
+ - **`<Scanlines />`** — perpetual CRT scanline overlay. Configurable `spacing` (default 4px), `opacity` (default 0.06), `scrollSpeed` (default 0.5px/frame). Drops the reel into "declassified telemetry" feel.
82
+ - **`reduceMotion` prop** on `DriftingSpotlights`, `FilmGrain` (dampens grain opacity), and `Scanlines` (freezes scroll).
83
+ - **Multi-brand allowance documented** — Dark intentionally has NO `ALLOWED_ACCENTS` export. Stitch rose, Gemini blue, NotebookLM blue, Claude terracotta can coexist by design. The lint command treats Dark as the multi-brand exception.
84
+ - **WCAG AA+ contrast** documented inline in `palette.ts` (fg: 18.7:1, fgSoft: 13.4:1, fgMuted: 6.4:1).
85
+ - **Optional hazard-red `#E61919` accent** — pull from the Brutalist tactical-telemetry palette for "hold / abort / kill switch" callouts.
86
+
87
+ ## Reference reels (v1.1.1+)
88
+
89
+ 3 reference reels ship for this family at `~/.reelstack/reference/dark/<preset>.tsx`:
90
+
91
+ - **stitch** — Multi-brand workflow demo (Stitch rose + Gemini blue + Claude terracotta).
92
+ - **claudedispatch** — Hero-narrative reel with ForestCard surfaces + drifting spotlights.
93
+ - **notebooklm** — Product-integration narrative (Claude × NotebookLM). Eleven scenes.
94
+
95
+ These are the actual Devini Labs reels (asset-stripped). Read them when iterating on your scaffolded reel. Pattern adaptation is encouraged; verbatim re-publication is not.
@@ -0,0 +1,78 @@
1
+ # Forbidden — Family Reference
2
+
3
+ > Forbidden, mysterious, slightly off-kilter. Desaturated palette suggests something declassified.
4
+
5
+ Inherits primitives from Glass but with rose-purple tinted shadows for the cream-rose paper background. **Never use iridescent gold here** — that hue belongs to Glass.
6
+
7
+ ## Palette
8
+
9
+ ```
10
+ bg #F2EBE5 Cream-rose paper.
11
+ bgWarm #EFE3DB
12
+ bgCool #ECE6E8
13
+
14
+ ink #0E0B12 Slightly darker than Glass for contrast on rose-cream.
15
+ inkSoft #26222A
16
+ inkMuted #5A5560
17
+ inkDim #8A848F
18
+
19
+ ember #D97757 Burning orange.
20
+ crimson #C4506B Deep rose / refusal.
21
+ ultraviolet #6B5BD9 Nightshade / mechanism.
22
+ plasma #A87FE8 Electric violet / stars.
23
+
24
+ shadowSoft rgba(120,80,120,0.10) The family's secret weapon. Never pure black.
25
+ shadowMid rgba(120,80,120,0.18)
26
+ shadowDeep rgba(120,80,120,0.28)
27
+
28
+ glassFill rgba(255,248,245,0.46) Warmer than Glass — rose-tinted whites.
29
+ glassFillStrong rgba(255,248,245,0.66)
30
+ glassBorder rgba(255,248,245,0.88)
31
+ ```
32
+
33
+ ## Primitives
34
+
35
+ Inherited from Glass family, with two preset-specific additions:
36
+
37
+ | Component | Purpose |
38
+ |---|---|
39
+ | `ForbiddenCausticBlobs` (template-inline) | Same as Glass `CausticBlobs` but with ember/crimson/ultraviolet/plasma stops. Multiply blend (not screen). |
40
+ | `tintedShadow(depth)` (template helper) | Returns rose-purple tinted box-shadows at soft / mid / deep depths. |
41
+ | All Glass primitives | Imported directly: `HairlineGrid`, `GlassCard`, `EyebrowPill`, `StaggeredWords`, `Counter`, `SonarRings`, `ParticleBurst`, `FloatingGlyphs`. |
42
+
43
+ ## Presets
44
+
45
+ | Preset | Source | Frames | Use when |
46
+ |---|---|---|---|
47
+ | `heretic` | HereticReel | 1639 (54.6s) | Forbidden product reveal. The reference (and only) preset. |
48
+
49
+ ## House rules (Forbidden-specific)
50
+
51
+ 1. **NO iridescent gold.** Gold is Glass-only. Forbidden uses ember/crimson/ultraviolet/plasma — period.
52
+ 2. **Shadows are tinted rose-purple, never pure black.** Use `palette.shadowSoft / shadowMid / shadowDeep`. The lint command will flag pure-black shadows.
53
+ 3. **Caustic blobs use multiply blend (not screen).** Multiply darkens the rose-cream bg into deeper rose tones — that's the look. Screen would wash it out.
54
+ 4. **Particle bursts use the Forbidden palette.** Pass `colors={[ember, crimson, ultraviolet, plasma]}` — never the Glass iridescent set.
55
+ 5. **EyebrowPill tints flip.** Use `tint="violet"` (which now reads as ultraviolet on cream-rose). `tint="teal"` reads as plasma — both work.
56
+
57
+ ## Motion vocabulary
58
+
59
+ - **Same as Glass** — gentle springs, power4Out reveals, sonar rings at 300-frame periods. Forbidden is a **palette + shadow** family, not a motion-language family. Reuse Glass motion confidently.
60
+ - **Camera feel:** slightly slower transitions than Glass. Adds the "uneasy" feel. Try multiplying typical animation durations by 1.15×.
61
+
62
+ ## Variant overlay (v1.1+)
63
+
64
+ Forbidden inherits from **leonxlnx/taste-skill-brutalist** (Swiss Industrial Print mode) + **leonxlnx/taste-skill (master)**. The Brutalist Swiss overlay adds:
65
+
66
+ - **`<NewsprintTexture />`** — pure-SVG halftone grain overlay tuned for cream-rose paper (multiply blend, ember-rose tinted noise). Drops the reel into "declassified document on newsprint" feel. Configurable `opacity` (default 0.08).
67
+ - **`reduceMotion` prop** on `ForbiddenCausticBlobs` (pins blobs at center), `EyebrowPill`, `StaggeredWords`, `Counter`, `SonarRings`, `ParticleBurst`, `FloatingGlyphs`. NewsprintTexture has no motion to reduce.
68
+ - **`ALLOWED_ACCENTS`** export — lint allows only `[ink, ember, crimson, ultraviolet, plasma]`. Forbidden's `ultraviolet` and `plasma` are the only family-allowed exceptions to the global anti-AI-purple rule; nowhere else in ReelStack are those hues permitted.
69
+ - **WCAG AA+ contrast** documented inline in `palette.ts` (ink: 17.6:1, inkSoft: 13.0:1, inkMuted: 6.8:1).
70
+ - **No-border-radius variant** — pass `radius={0}` to `<GlassCard />` for the Brutalist Swiss "rigid grid" look.
71
+
72
+ ## Reference reels (v1.1.1+)
73
+
74
+ 1 reference reel ships for this family at `~/.reelstack/reference/forbidden/<preset>.tsx`:
75
+
76
+ - **heretic** — Cream-rose paper + ember/crimson/plasma. The only Forbidden reel.
77
+
78
+ These are the actual Devini Labs reels (asset-stripped). Read them when iterating on your scaffolded reel. Pattern adaptation is encouraged; verbatim re-publication is not.
@@ -0,0 +1,98 @@
1
+ # Glass Iridescent — Family Reference
2
+
3
+ > Premium product reveal. Underwater-light caustics, glass surfaces, iridescent text shimmer.
4
+
5
+ The foundational ReelStack family. Most other families inherit primitives from here. When in doubt, scaffold Glass.
6
+
7
+ ## Palette
8
+
9
+ ```
10
+ bg #EFEAF2 Lavender cream — the family's signature background.
11
+ bgWarm #E9E2EE
12
+ bgCool #E4E9F2
13
+
14
+ ink #0E0E12 Body text on light backgrounds.
15
+ inkSoft #26242C
16
+ inkMuted #5A5867
17
+ inkDim #86848F
18
+
19
+ iriCyan #7FE8D4 Iridescent stops. Used by CausticBlobs,
20
+ iriViolet #8B7FE8 ParticleBurst, FloatingGlyphs.
21
+ iriRose #E89BC4
22
+ iriGold #F2D88F
23
+
24
+ violetPill #9D8BF2 EyebrowPill tints.
25
+ tealPill #85DDC9
26
+
27
+ glassFill rgba(255,255,255,0.42) Default GlassCard fill.
28
+ glassFillStrong rgba(255,255,255,0.62) Strong / heavy variants.
29
+ glassBorder rgba(255,255,255,0.86)
30
+ ```
31
+
32
+ ## Primitives
33
+
34
+ | Component | Purpose | Frame cost |
35
+ |---|---|---|
36
+ | `CausticBlobs` | Animated radial gradients drifting on sine paths. The signature ambient bg. | Cheap (CSS only). |
37
+ | `HairlineGrid` | Subtle 72×72 grid with radial mask fade. Provides "environment". | Free (static CSS). |
38
+ | `GlassCard` | Frosted glass surface. Variants: default / strong / heavy. | Free (CSS). |
39
+ | `EyebrowPill` | Small contextual labels. Spring entrance (gentle). | Cheap. |
40
+ | `StaggeredWords` | Word-by-word text reveal with spring easing. | Per-word spring. |
41
+ | `Counter` | Numeric ticker with scale + blur entrance. Power4Out easing. | Cheap. |
42
+ | `SonarRings` | Concentric expanding circles. Period ~300 frames. | Cheap (SVG). |
43
+ | `ParticleBurst` | 12-20 particles radiating with velocity + gravity. Lifetime 60-120 frames. | Cheap (SVG). |
44
+ | `LightBeam` | Rotating radial gradient with screen blend. For hero-moment emphasis. | Free (CSS rotation). |
45
+ | `FloatingGlyphs` | Drifting unicode math symbols. NEVER emojis. | Cheap. |
46
+ | `FilmStrip` | Perforated 35mm film roll with colored play-button thumbnails. Optional vertical scrubber playhead. | Cheap (CSS). |
47
+ | `IridescentRing` | Concentric chromatic halo rings — multi-stop gradient strokes that rotate as they expand. | Cheap (SVG). |
48
+ | `IridescentText` | Hero-word gradient treatment. 5-stop iridescent `background-clip: text` with rotating angle. | Free. |
49
+ | `BreakdownCard` | Glass card with mono filename header, accent dot, 1–4 arrow rows, optional blinking cursor. | Cheap. |
50
+
51
+ ## Presets
52
+
53
+ | Preset | Source | Frames | Use when |
54
+ |---|---|---|---|
55
+ | `graphify` | GraphifyReel | 1956 (65.2s) | Default. Multimodal product reveal. The reference build. |
56
+ | `paperclip` | PaperclipReel | 1650 (55s) | Open-source product launch. PaperclipGlyph is the signature element. |
57
+ | `gstack` | GstackReel | 2820 (94s) | Long-form feature-callout reel. Heavy GlassCard usage. |
58
+ | `lilagents` | LilAgentsReel | 2160 (72s) | Character-driven (Bruce + Jazz). Dark dock-bg variant. ThoughtBubbles. |
59
+ | `jcode` | JcodeReel | 2164 (72s) | Performance-claim reel. Single rust accent. ScrambleText + film grain. |
60
+ | `claudewatch` | ClaudeWatchReel | 3156 (105.2s) | Longest in catalog. FilmStrip + IridescentText + BreakdownCard centerpiece — the deluxe preset. |
61
+ | `claudewatchcta` | ClaudeWatchCTAReel | 240 (8s) | Standalone CTA cut. Append to longer reels as outro. |
62
+
63
+ ## House rules (Glass-specific)
64
+
65
+ 1. **Glass cards always over textured background.** Caustics + grid mandatory beneath every GlassCard.
66
+ 2. **FloatingGlyphs use unicode math/code symbols only.** Never emojis. The set: `± ∞ ∑ ⟨ ⟩ ∫ ≠ ∂ ∇ ⊕ ⊗`.
67
+ 3. **Iridescent stops named, not free-mixed.** Pull from `palette.iriCyan / iriViolet / iriRose / iriGold` — don't hand-mix.
68
+ 4. **Counter caps at 256px width on 5-digit numbers.** Default fontSize 144 is safe; don't go bigger without checking.
69
+ 5. **Tinted shadows on cream variants only (Forbidden).** Glass uses neutral shadows: `rgba(20,20,32,0.10–0.14)`.
70
+
71
+ ## Motion vocabulary
72
+
73
+ - **Springs:** `springs.gentle` (damping 15, stiffness 80) for text entrances. `springs.snappy` (damping 20, stiffness 200) for cards.
74
+ - **Easings:** `ease.power4Out` for hero reveals. `ease.expoOut` for camera moves. `ease.backOut` for playful elements.
75
+ - **SonarRings period:** 300 frames default (10s). Reduce to 240 for faster anchor scenes.
76
+ - **ParticleBurst lifespan:** 80 frames default. Spread 360px is the family standard.
77
+ - **Audio lock:** `BEAT` constants from `/reelstack-beats`. Never eyeball.
78
+
79
+ ## Variant overlay (v1.1+)
80
+
81
+ Glass Iridescent inherits from **leonxlnx/taste-skill-soft** + **leonxlnx/taste-skill (master)**. The Soft overlay adds:
82
+
83
+ - **`<GlassCardBezel />`** — Soft Double-Bezel inner-1px glass border. Outer shell + inner core for "expensive nested glass" feel.
84
+ - **`bezel?: boolean` prop on `<GlassCard />`** — quick toggle for the inner-1px white border without the full nested wrapper.
85
+ - **Soft cubic-bezier easings** in `utils/cubic-bezier.ts`: `softInOut` `(0.32, 0.72, 0, 1)`, `softElastic` `(0.16, 1, 0.3, 1)`, `softSnappy` `(0.22, 1, 0.36, 1)` — drop-in replacements for Remotion's `interpolate({easing})`.
86
+ - **`reduceMotion` prop** on every motion component (CausticBlobs, EyebrowPill, StaggeredWords, Counter, SonarRings, ParticleBurst, LightBeam, FloatingGlyphs, IridescentText, IridescentRing). Buyers passing `inputProps: { reduceMotion: true }` get a low-motion variant.
87
+ - **`ALLOWED_ACCENTS`** export — lint flags any color outside `[iriCyan, iriViolet, iriRose, iriGold, violetPill, tealPill, ink]` as a hue bleed.
88
+ - **WCAG AA+ contrast** documented inline in `palette.ts` (ink: 16.8:1, inkSoft: 12.4:1, etc.).
89
+
90
+ ## Reference reels (v1.1.1+)
91
+
92
+ 3 reference reels ship for this family at `~/.reelstack/reference/glass/<preset>.tsx`:
93
+
94
+ - **graphify** — Multi-modal product reveal, the family's motion-vocabulary reference.
95
+ - **paperclip** — Open-source reveal with PaperclipGlyph stroke draw-in. Tight 55s pacing.
96
+ - **claudewatch** — Longest reel in the catalog (105s). Dual-narration, FilmStrip + IridescentText centerpiece.
97
+
98
+ These are the actual Devini Labs reels (asset-stripped). Read them when iterating on your scaffolded reel. Pattern adaptation is encouraged; verbatim re-publication is not.