@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,1770 @@
1
+ /**
2
+ * REFERENCE — OpusReel (Family: paper)
3
+ *
4
+ * Canonical example of the paper family's motion vocabulary, frame-locked
5
+ * BEAT structure, and scene choreography. Bundled with ReelStack v1.1.1+
6
+ * for STUDY and pattern adaptation.
7
+ *
8
+ * Asset imports stripped (look for REFERENCE-STRIP markers). Bring your own
9
+ * voiceover, brand SVGs, captures.
10
+ *
11
+ * License: study + adapt patterns OK. Verbatim re-publication as your own
12
+ * template NOT OK. See ReelStack LICENSE.
13
+ *
14
+ * Source: my-video/src/OpusReel.tsx
15
+ * Bundled at: 2026-05-08T18:50:39.511Z
16
+ */
17
+ import {
18
+ useCurrentFrame,
19
+ useVideoConfig,
20
+ interpolate,
21
+ spring,
22
+ Easing,
23
+ AbsoluteFill,
24
+ staticFile,
25
+ } from "remotion";
26
+ import { Audio } from "@remotion/media";
27
+ import { ds } from "./designSystem";
28
+
29
+ // ═══════════════════════════════════════════════════════════════
30
+ // CONSTANTS
31
+ // ═══════════════════════════════════════════════════════════════
32
+
33
+ const FONT = ds.font.sans;
34
+ const MONO = ds.font.mono;
35
+ const G = ds.card3d.green;
36
+
37
+ // Light-mode text palette (cream paper background)
38
+ const T = {
39
+ heading: "#1a1a1a",
40
+ body: "#2d2d2d",
41
+ muted: "#6b6b6b",
42
+ accent: ds.color.claude, // #D4663A terracotta
43
+ accentDark: "#1e3a27", // dark green for cards
44
+ danger: "#c0392b",
45
+ success: "#1e7a45",
46
+ } as const;
47
+
48
+ // Scene timeline: [startSec, endSec] — synced to 111s voiceover
49
+ // 11 segments mapped to audio pacing
50
+ const SEGS = [
51
+ { s: 0, e: 8, text: "Hook" }, // 1: Opus 4.7 just dropped
52
+ { s: 7.5, e: 18, text: "Mythos" }, // 2: Mythos preview reveal
53
+ { s: 17.5, e: 28, text: "Half-step" }, // 3: Half-step theory
54
+ { s: 27.5, e: 38, text: "Distilled" }, // 4: Distilled down theory
55
+ { s: 37.5, e: 52, text: "Wins" }, // 5: Benchmark wins
56
+ { s: 51.5, e: 60, text: "Speed" }, // 6: Speed / parallelism
57
+ { s: 59.5, e: 72, text: "Nerfed" }, // 7: Nerfed benchmarks
58
+ { s: 71.5, e: 82, text: "Thesis" }, // 8: Doesn't change anything
59
+ { s: 81.5, e: 92, text: "GPT3" }, // 9: Zero-to-one was GPT-3
60
+ { s: 91.5, e: 102, text: "Advice" }, // 10: Stop switching models
61
+ { s: 101.5, e: 111, text: "Close" }, // 11: Ship something
62
+ ] as const;
63
+
64
+ // Screenshot placement: 5 screenshots, ~10s each, at key moments
65
+ // ss1: Benchmark table (during Wins scene)
66
+ // ss2: Agents.md dark card (during Distilled scene)
67
+ // ss3: Claude referencing agents.md (during Nerfed scene)
68
+ // ss4: What you do / How you sound (during Thesis scene)
69
+ // ss5: Brand details card (during Advice scene)
70
+
71
+ // ═══════════════════════════════════════════════════════════════
72
+ // UTILITIES
73
+ // ═══════════════════════════════════════════════════════════════
74
+
75
+ const so = (
76
+ frame: number,
77
+ fps: number,
78
+ startS: number,
79
+ endS: number,
80
+ fadeIn = 0.6,
81
+ fadeOut = 0.6,
82
+ ) =>
83
+ interpolate(
84
+ frame,
85
+ [startS * fps, (startS + fadeIn) * fps, (endS - fadeOut) * fps, endS * fps],
86
+ [0, 1, 1, 0],
87
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" },
88
+ );
89
+
90
+ const lf = (frame: number, fps: number, startSec: number) =>
91
+ Math.max(0, frame - startSec * fps);
92
+
93
+ interface SP {
94
+ frame: number;
95
+ fps: number;
96
+ }
97
+
98
+ // ═══════════════════════════════════════════════════════════════
99
+ // BACKGROUND — dark with subtle green tint
100
+ // ═══════════════════════════════════════════════════════════════
101
+
102
+ const Background: React.FC<{ frame: number }> = ({ frame }) => {
103
+ // Warm paper cream — matched from Context.md reference image
104
+ const paperBase = "#e8e4de";
105
+ const paperLight = "#edeae4";
106
+ const gridLine = "rgba(180,175,165,0.25)";
107
+
108
+ // Subtle vignette pulse
109
+ const vignetteOp = 0.12 + Math.sin(frame * 0.006) * 0.03;
110
+
111
+ return (
112
+ <AbsoluteFill>
113
+ {/* Warm cream base with subtle radial gradient */}
114
+ <div
115
+ style={{
116
+ width: "100%",
117
+ height: "100%",
118
+ background: `radial-gradient(ellipse at 50% 40%, ${paperLight} 0%, ${paperBase} 55%, #d9d4cc 100%)`,
119
+ }}
120
+ />
121
+ {/* Fine grid lines — matches Context.md paper grid */}
122
+ <div
123
+ style={{
124
+ position: "absolute",
125
+ inset: 0,
126
+ backgroundImage: `
127
+ linear-gradient(${gridLine} 1px, transparent 1px),
128
+ linear-gradient(90deg, ${gridLine} 1px, transparent 1px)
129
+ `,
130
+ backgroundSize: "48px 48px",
131
+ }}
132
+ />
133
+ {/* Soft center vignette — lighter in the middle */}
134
+ <div
135
+ style={{
136
+ position: "absolute",
137
+ inset: 0,
138
+ background: `radial-gradient(ellipse at 50% 45%, rgba(255,255,255,0.3) 0%, transparent 60%)`,
139
+ }}
140
+ />
141
+ {/* Edge vignette — slightly darker corners */}
142
+ <div
143
+ style={{
144
+ position: "absolute",
145
+ inset: 0,
146
+ background: `radial-gradient(ellipse at 50% 50%, transparent 50%, rgba(0,0,0,${vignetteOp}) 100%)`,
147
+ }}
148
+ />
149
+ </AbsoluteFill>
150
+ );
151
+ };
152
+
153
+ // ═══════════════════════════════════════════════════════════════
154
+ // 3D FLOATING CARD — reusable component
155
+ // ═══════════════════════════════════════════════════════════════
156
+
157
+ const FloatingCard: React.FC<{
158
+ children: React.ReactNode;
159
+ width?: number | string;
160
+ rotateX?: number;
161
+ rotateY?: number;
162
+ scale?: number;
163
+ opacity?: number;
164
+ style?: React.CSSProperties;
165
+ }> = ({
166
+ children,
167
+ width = "85%",
168
+ rotateX = 2,
169
+ rotateY = -1,
170
+ scale = 1,
171
+ opacity = 1,
172
+ style,
173
+ }) => (
174
+ <div
175
+ style={{
176
+ width,
177
+ maxWidth: 900,
178
+ perspective: 1200,
179
+ opacity,
180
+ ...style,
181
+ }}
182
+ >
183
+ <div
184
+ style={{
185
+ ...ds.card3d.cardStyle,
186
+ transform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`,
187
+ transformStyle: "preserve-3d",
188
+ padding: "32px 36px",
189
+ position: "relative",
190
+ overflow: "hidden",
191
+ }}
192
+ >
193
+ {/* Top edge highlight */}
194
+ <div
195
+ style={{
196
+ position: "absolute",
197
+ top: 0,
198
+ left: 20,
199
+ right: 20,
200
+ height: 1,
201
+ background:
202
+ "linear-gradient(90deg, transparent, rgba(255,255,255,0.12), transparent)",
203
+ }}
204
+ />
205
+ {children}
206
+ </div>
207
+ </div>
208
+ );
209
+
210
+ // ═══════════════════════════════════════════════════════════════
211
+ // STAT BADGE — animated number with label
212
+ // ═══════════════════════════════════════════════════════════════
213
+
214
+ const StatBadge: React.FC<{
215
+ value: string;
216
+ label: string;
217
+ color?: string;
218
+ delay?: number;
219
+ frame: number;
220
+ fps: number;
221
+ }> = ({ value, label, color = ds.color.claude, delay = 0, frame, fps }) => {
222
+ const s = spring({ frame, fps, delay, config: ds.spring.snappy });
223
+ const scale = interpolate(s, [0, 1], [0.7, 1]);
224
+ const op = interpolate(s, [0, 0.3], [0, 1], {
225
+ extrapolateLeft: "clamp",
226
+ extrapolateRight: "clamp",
227
+ });
228
+ return (
229
+ <div
230
+ style={{
231
+ textAlign: "center",
232
+ opacity: op,
233
+ transform: `scale(${scale})`,
234
+ }}
235
+ >
236
+ <div
237
+ style={{
238
+ fontFamily: FONT,
239
+ fontSize: 44,
240
+ fontWeight: ds.text.bold,
241
+ color,
242
+ lineHeight: 1,
243
+ letterSpacing: ds.text.tighter,
244
+ }}
245
+ >
246
+ {value}
247
+ </div>
248
+ <div
249
+ style={{
250
+ fontFamily: FONT,
251
+ fontSize: 14,
252
+ fontWeight: ds.text.medium,
253
+ color: T.muted,
254
+ marginTop: 6,
255
+ letterSpacing: ds.text.wide,
256
+ textTransform: "uppercase",
257
+ }}
258
+ >
259
+ {label}
260
+ </div>
261
+ </div>
262
+ );
263
+ };
264
+
265
+ // ═══════════════════════════════════════════════════════════════
266
+ // SCENE 1: HOOK — "Opus 4.7 just dropped"
267
+ // ═══════════════════════════════════════════════════════════════
268
+
269
+ const HookScene: React.FC<SP> = ({ frame, fps }) => {
270
+ const op = so(frame, fps, SEGS[0].s, SEGS[0].e);
271
+ if (op === 0) return null;
272
+ const f = lf(frame, fps, SEGS[0].s);
273
+
274
+ const titleSpring = spring({ frame: f, fps, config: ds.spring.gentle });
275
+ const titleScale = interpolate(titleSpring, [0, 1], [0.85, 1]);
276
+ const subOp = interpolate(f, [1 * fps, 1.8 * fps], [0, 1], {
277
+ extrapolateLeft: "clamp",
278
+ extrapolateRight: "clamp",
279
+ });
280
+ const subY = interpolate(f, [1 * fps, 1.8 * fps], [30, 0], {
281
+ extrapolateLeft: "clamp",
282
+ extrapolateRight: "clamp",
283
+ easing: Easing.out(Easing.quad),
284
+ });
285
+
286
+ // Version badge
287
+ const badgeSpring = spring({
288
+ frame: f,
289
+ fps,
290
+ delay: Math.round(0.5 * fps),
291
+ config: ds.spring.bouncy,
292
+ });
293
+
294
+ return (
295
+ <AbsoluteFill style={{ opacity: op }}>
296
+ {/* Version badge */}
297
+ <div
298
+ style={{
299
+ position: "absolute",
300
+ top: "18%",
301
+ left: "50%",
302
+ transform: `translate(-50%, 0) scale(${interpolate(badgeSpring, [0, 1], [0.5, 1])})`,
303
+ opacity: interpolate(badgeSpring, [0, 0.3], [0, 1], {
304
+ extrapolateLeft: "clamp",
305
+ extrapolateRight: "clamp",
306
+ }),
307
+ ...ds.card3d.pillStyle,
308
+ display: "flex",
309
+ alignItems: "center",
310
+ gap: 10,
311
+ }}
312
+ >
313
+ <div
314
+ style={{
315
+ width: 8,
316
+ height: 8,
317
+ borderRadius: "50%",
318
+ background: ds.color.success,
319
+ boxShadow: `0 0 8px ${ds.color.success}`,
320
+ }}
321
+ />
322
+ <span
323
+ style={{
324
+ fontFamily: MONO,
325
+ fontSize: 16,
326
+ fontWeight: ds.text.medium,
327
+ color: G.text,
328
+ letterSpacing: 1,
329
+ }}
330
+ >
331
+ NEW RELEASE
332
+ </span>
333
+ </div>
334
+
335
+ {/* Title */}
336
+ <div
337
+ style={{
338
+ position: "absolute",
339
+ top: "30%",
340
+ width: "100%",
341
+ textAlign: "center",
342
+ padding: "0 48px",
343
+ transform: `scale(${titleScale})`,
344
+ opacity: interpolate(titleSpring, [0, 0.2], [0, 1], {
345
+ extrapolateLeft: "clamp",
346
+ extrapolateRight: "clamp",
347
+ }),
348
+ }}
349
+ >
350
+ <div
351
+ style={{
352
+ fontFamily: FONT,
353
+ fontSize: 80,
354
+ fontWeight: ds.text.bold,
355
+ color: T.heading,
356
+ lineHeight: ds.text.lineTight,
357
+ letterSpacing: ds.text.tighter,
358
+ }}
359
+ >
360
+ Claude
361
+ <br />
362
+ <span style={{ color: ds.color.claude }}>Opus 4.7</span>
363
+ </div>
364
+ </div>
365
+
366
+ {/* Subtitle */}
367
+ <div
368
+ style={{
369
+ position: "absolute",
370
+ top: "60%",
371
+ width: "100%",
372
+ textAlign: "center",
373
+ padding: "0 60px",
374
+ opacity: subOp,
375
+ transform: `translateY(${subY}px)`,
376
+ }}
377
+ >
378
+ <div
379
+ style={{
380
+ fontFamily: FONT,
381
+ fontSize: 28,
382
+ fontWeight: ds.text.regular,
383
+ color: T.muted,
384
+ lineHeight: ds.text.lineNormal,
385
+ }}
386
+ >
387
+ It's good... but it's not
388
+ <br />
389
+ what you think it is.
390
+ </div>
391
+ </div>
392
+ </AbsoluteFill>
393
+ );
394
+ };
395
+
396
+ // ═══════════════════════════════════════════════════════════════
397
+ // SCENE 2: MYTHOS REVEAL — "galaxy-brain model"
398
+ // ═══════════════════════════════════════════════════════════════
399
+
400
+ const MythosScene: React.FC<SP> = ({ frame, fps }) => {
401
+ const op = so(frame, fps, SEGS[1].s, SEGS[1].e);
402
+ if (op === 0) return null;
403
+ const f = lf(frame, fps, SEGS[1].s);
404
+
405
+ const cardSpring = spring({
406
+ frame: f,
407
+ fps,
408
+ delay: Math.round(0.5 * fps),
409
+ config: ds.spring.glass,
410
+ });
411
+ const cardY = interpolate(cardSpring, [0, 1], [80, 0]);
412
+
413
+ return (
414
+ <AbsoluteFill style={{ opacity: op }}>
415
+ {/* Title */}
416
+ <div
417
+ style={{
418
+ position: "absolute",
419
+ top: "12%",
420
+ width: "100%",
421
+ textAlign: "center",
422
+ padding: "0 48px",
423
+ }}
424
+ >
425
+ <div
426
+ style={{
427
+ fontFamily: FONT,
428
+ fontSize: 24,
429
+ fontWeight: ds.text.medium,
430
+ color: T.muted,
431
+ letterSpacing: ds.text.wider,
432
+ textTransform: "uppercase",
433
+ opacity: interpolate(f, [0.3 * fps, 0.8 * fps], [0, 1], {
434
+ extrapolateLeft: "clamp",
435
+ extrapolateRight: "clamp",
436
+ }),
437
+ }}
438
+ >
439
+ The hidden model
440
+ </div>
441
+ <div
442
+ style={{
443
+ fontFamily: FONT,
444
+ fontSize: 64,
445
+ fontWeight: ds.text.bold,
446
+ color: T.heading,
447
+ marginTop: 12,
448
+ letterSpacing: ds.text.tighter,
449
+ opacity: interpolate(f, [0.5 * fps, 1 * fps], [0, 1], {
450
+ extrapolateLeft: "clamp",
451
+ extrapolateRight: "clamp",
452
+ }),
453
+ }}
454
+ >
455
+ Mythos Preview
456
+ </div>
457
+ </div>
458
+
459
+ {/* Info card */}
460
+ <div
461
+ style={{
462
+ position: "absolute",
463
+ top: "38%",
464
+ left: "50%",
465
+ transform: `translate(-50%, ${cardY}px)`,
466
+ opacity: interpolate(cardSpring, [0, 0.3], [0, 1], {
467
+ extrapolateLeft: "clamp",
468
+ extrapolateRight: "clamp",
469
+ }),
470
+ width: "85%",
471
+ }}
472
+ >
473
+ <FloatingCard rotateX={3} rotateY={-2}>
474
+ <div
475
+ style={{
476
+ fontFamily: FONT,
477
+ fontSize: 26,
478
+ fontWeight: ds.text.semibold,
479
+ color: G.text,
480
+ lineHeight: 1.6,
481
+ }}
482
+ >
483
+ Hacked Chrome and entire
484
+ <br />
485
+ operating systems.
486
+ </div>
487
+ <div
488
+ style={{
489
+ fontFamily: FONT,
490
+ fontSize: 20,
491
+ fontWeight: ds.text.regular,
492
+ color: G.textMuted,
493
+ marginTop: 16,
494
+ lineHeight: 1.5,
495
+ }}
496
+ >
497
+ They're terrified to release it.
498
+ </div>
499
+ {/* Danger badge */}
500
+ <div
501
+ style={{
502
+ display: "inline-flex",
503
+ alignItems: "center",
504
+ gap: 8,
505
+ marginTop: 20,
506
+ background: "rgba(251,44,54,0.15)",
507
+ border: "1px solid rgba(251,44,54,0.3)",
508
+ borderRadius: ds.radius.pill,
509
+ padding: "6px 16px",
510
+ }}
511
+ >
512
+ <div
513
+ style={{
514
+ width: 6,
515
+ height: 6,
516
+ borderRadius: "50%",
517
+ background: "#fb2c36",
518
+ }}
519
+ />
520
+ <span
521
+ style={{
522
+ fontFamily: MONO,
523
+ fontSize: 13,
524
+ fontWeight: ds.text.medium,
525
+ color: "#ff6568",
526
+ letterSpacing: 1,
527
+ }}
528
+ >
529
+ RESTRICTED
530
+ </span>
531
+ </div>
532
+ </FloatingCard>
533
+ </div>
534
+ </AbsoluteFill>
535
+ );
536
+ };
537
+
538
+ // ═══════════════════════════════════════════════════════════════
539
+ // SCENE 3: HALF-STEP — "50% between 4.6 and Mythos"
540
+ // ═══════════════════════════════════════════════════════════════
541
+
542
+ const HalfStepScene: React.FC<SP> = ({ frame, fps }) => {
543
+ const op = so(frame, fps, SEGS[2].s, SEGS[2].e);
544
+ if (op === 0) return null;
545
+ const f = lf(frame, fps, SEGS[2].s);
546
+
547
+ // Animated progress bar
548
+ const barProgress = interpolate(f, [1 * fps, 3 * fps], [0, 0.5], {
549
+ extrapolateLeft: "clamp",
550
+ extrapolateRight: "clamp",
551
+ easing: Easing.out(Easing.quad),
552
+ });
553
+
554
+ const labelOp = interpolate(f, [2.5 * fps, 3.2 * fps], [0, 1], {
555
+ extrapolateLeft: "clamp",
556
+ extrapolateRight: "clamp",
557
+ });
558
+
559
+ return (
560
+ <AbsoluteFill style={{ opacity: op }}>
561
+ <div
562
+ style={{
563
+ position: "absolute",
564
+ top: "15%",
565
+ width: "100%",
566
+ textAlign: "center",
567
+ padding: "0 48px",
568
+ }}
569
+ >
570
+ <div
571
+ style={{
572
+ fontFamily: FONT,
573
+ fontSize: 48,
574
+ fontWeight: ds.text.bold,
575
+ color: T.heading,
576
+ letterSpacing: ds.text.tighter,
577
+ opacity: interpolate(f, [0.3 * fps, 0.8 * fps], [0, 1], {
578
+ extrapolateLeft: "clamp",
579
+ extrapolateRight: "clamp",
580
+ }),
581
+ }}
582
+ >
583
+ A calculated
584
+ <br />
585
+ <span style={{ color: ds.color.claude }}>half-step</span>
586
+ </div>
587
+ </div>
588
+
589
+ {/* Progress visualization */}
590
+ <div
591
+ style={{
592
+ position: "absolute",
593
+ top: "40%",
594
+ left: "50%",
595
+ transform: "translate(-50%, 0)",
596
+ width: "80%",
597
+ maxWidth: 700,
598
+ }}
599
+ >
600
+ {/* Labels */}
601
+ <div
602
+ style={{
603
+ display: "flex",
604
+ justifyContent: "space-between",
605
+ marginBottom: 16,
606
+ fontFamily: MONO,
607
+ fontSize: 14,
608
+ fontWeight: ds.text.medium,
609
+ color: T.muted,
610
+ }}
611
+ >
612
+ <span>Opus 4.6</span>
613
+ <span style={{ opacity: labelOp, color: ds.color.claude }}>
614
+ 4.7 sits here
615
+ </span>
616
+ <span>Mythos</span>
617
+ </div>
618
+
619
+ {/* Bar track */}
620
+ <div
621
+ style={{
622
+ width: "100%",
623
+ height: 12,
624
+ borderRadius: 6,
625
+ background: "rgba(0,0,0,0.08)",
626
+ position: "relative",
627
+ overflow: "hidden",
628
+ }}
629
+ >
630
+ {/* Fill */}
631
+ <div
632
+ style={{
633
+ width: `${barProgress * 100}%`,
634
+ height: "100%",
635
+ borderRadius: 6,
636
+ background: `linear-gradient(90deg, ${ds.color.accent}, ${ds.color.claude})`,
637
+ boxShadow: `0 0 20px rgba(212,102,58,0.3)`,
638
+ }}
639
+ />
640
+ {/* Marker */}
641
+ <div
642
+ style={{
643
+ position: "absolute",
644
+ left: `${barProgress * 100}%`,
645
+ top: -6,
646
+ width: 24,
647
+ height: 24,
648
+ borderRadius: "50%",
649
+ background: ds.color.claude,
650
+ border: "3px solid #1a2e1f",
651
+ transform: "translateX(-50%)",
652
+ boxShadow: "0 2px 8px rgba(212,102,58,0.4)",
653
+ opacity: labelOp,
654
+ }}
655
+ />
656
+ </div>
657
+
658
+ {/* Percentage labels */}
659
+ <div
660
+ style={{
661
+ display: "flex",
662
+ justifyContent: "space-between",
663
+ marginTop: 12,
664
+ fontFamily: MONO,
665
+ fontSize: 12,
666
+ color: "rgba(0,0,0,0.25)",
667
+ }}
668
+ >
669
+ <span>0%</span>
670
+ <span
671
+ style={{
672
+ color: ds.color.claude,
673
+ fontWeight: ds.text.bold,
674
+ fontSize: 16,
675
+ opacity: labelOp,
676
+ }}
677
+ >
678
+ ~50%
679
+ </span>
680
+ <span>100%</span>
681
+ </div>
682
+ </div>
683
+
684
+ {/* Suspicious note */}
685
+ <div
686
+ style={{
687
+ position: "absolute",
688
+ bottom: "18%",
689
+ width: "100%",
690
+ textAlign: "center",
691
+ opacity: interpolate(f, [4 * fps, 4.8 * fps], [0, 1], {
692
+ extrapolateLeft: "clamp",
693
+ extrapolateRight: "clamp",
694
+ }),
695
+ }}
696
+ >
697
+ <div
698
+ style={{
699
+ fontFamily: FONT,
700
+ fontSize: 32,
701
+ fontWeight: ds.text.semibold,
702
+ color: T.heading,
703
+ fontStyle: "italic",
704
+ }}
705
+ >
706
+ Suspicious, right?
707
+ </div>
708
+ </div>
709
+ </AbsoluteFill>
710
+ );
711
+ };
712
+
713
+ // ═══════════════════════════════════════════════════════════════
714
+ // SCENE 4: DISTILLED — "Mythos, dumbed down" + Screenshot
715
+ // ═══════════════════════════════════════════════════════════════
716
+
717
+ const DistilledScene: React.FC<SP> = ({ frame, fps }) => {
718
+ const op = so(frame, fps, SEGS[3].s, SEGS[3].e);
719
+ if (op === 0) return null;
720
+ const f = lf(frame, fps, SEGS[3].s);
721
+
722
+ const cardSpring = spring({
723
+ frame: f,
724
+ fps,
725
+ delay: Math.round(0.8 * fps),
726
+ config: ds.spring.glass,
727
+ });
728
+
729
+ return (
730
+ <AbsoluteFill style={{ opacity: op }}>
731
+ <div
732
+ style={{
733
+ position: "absolute",
734
+ top: "10%",
735
+ width: "100%",
736
+ textAlign: "center",
737
+ padding: "0 48px",
738
+ }}
739
+ >
740
+ <div
741
+ style={{
742
+ fontFamily: FONT,
743
+ fontSize: 22,
744
+ fontWeight: ds.text.medium,
745
+ color: T.muted,
746
+ letterSpacing: ds.text.wider,
747
+ textTransform: "uppercase",
748
+ opacity: interpolate(f, [0.2 * fps, 0.6 * fps], [0, 1], {
749
+ extrapolateLeft: "clamp",
750
+ extrapolateRight: "clamp",
751
+ }),
752
+ }}
753
+ >
754
+ My theory
755
+ </div>
756
+ <div
757
+ style={{
758
+ fontFamily: FONT,
759
+ fontSize: 44,
760
+ fontWeight: ds.text.bold,
761
+ color: T.heading,
762
+ marginTop: 12,
763
+ letterSpacing: ds.text.tighter,
764
+ lineHeight: 1.2,
765
+ opacity: interpolate(f, [0.4 * fps, 0.9 * fps], [0, 1], {
766
+ extrapolateLeft: "clamp",
767
+ extrapolateRight: "clamp",
768
+ }),
769
+ }}
770
+ >
771
+ Mythos, <span style={{ color: ds.color.claude }}>distilled</span>
772
+ </div>
773
+ </div>
774
+
775
+ {/* Properties card */}
776
+ <div
777
+ style={{
778
+ position: "absolute",
779
+ top: "32%",
780
+ left: "50%",
781
+ transform: `translate(-50%, 0) scale(${interpolate(cardSpring, [0, 1], [0.85, 1])})`,
782
+ opacity: interpolate(cardSpring, [0, 0.3], [0, 1], {
783
+ extrapolateLeft: "clamp",
784
+ extrapolateRight: "clamp",
785
+ }),
786
+ width: "85%",
787
+ }}
788
+ >
789
+ <FloatingCard rotateX={2} rotateY={-1}>
790
+ {[
791
+ { icon: "~", label: "Scary stuff stripped out" },
792
+ { icon: ">", label: "Runs faster" },
793
+ { icon: "$", label: "Costs less" },
794
+ ].map((item, i) => {
795
+ const itemSpring = spring({
796
+ frame: f,
797
+ fps,
798
+ delay: Math.round((1.2 + i * 0.3) * fps),
799
+ config: ds.spring.snappy,
800
+ });
801
+ return (
802
+ <div
803
+ key={item.label}
804
+ style={{
805
+ display: "flex",
806
+ alignItems: "center",
807
+ gap: 16,
808
+ padding: "14px 0",
809
+ borderBottom:
810
+ i < 2 ? "1px solid rgba(255,255,255,0.06)" : "none",
811
+ opacity: interpolate(itemSpring, [0, 0.3], [0, 1], {
812
+ extrapolateLeft: "clamp",
813
+ extrapolateRight: "clamp",
814
+ }),
815
+ transform: `translateX(${interpolate(itemSpring, [0, 1], [30, 0])}px)`,
816
+ }}
817
+ >
818
+ <div
819
+ style={{
820
+ fontFamily: MONO,
821
+ fontSize: 22,
822
+ color: ds.color.claude,
823
+ width: 36,
824
+ textAlign: "center",
825
+ }}
826
+ >
827
+ {item.icon}
828
+ </div>
829
+ <div
830
+ style={{
831
+ fontFamily: FONT,
832
+ fontSize: 22,
833
+ fontWeight: ds.text.medium,
834
+ color: G.text,
835
+ }}
836
+ >
837
+ {item.label}
838
+ </div>
839
+ </div>
840
+ );
841
+ })}
842
+ </FloatingCard>
843
+ </div>
844
+ </AbsoluteFill>
845
+ );
846
+ };
847
+
848
+ // ═══════════════════════════════════════════════════════════════
849
+ // SCENE 5: WINS — benchmark improvements + Screenshot 1
850
+ // ═══════════════════════════════════════════════════════════════
851
+
852
+ const WinsScene: React.FC<SP> = ({ frame, fps }) => {
853
+ const op = so(frame, fps, SEGS[4].s, SEGS[4].e);
854
+ if (op === 0) return null;
855
+ const f = lf(frame, fps, SEGS[4].s);
856
+
857
+ return (
858
+ <AbsoluteFill style={{ opacity: op }}>
859
+ <div
860
+ style={{
861
+ position: "absolute",
862
+ top: "6%",
863
+ width: "100%",
864
+ textAlign: "center",
865
+ }}
866
+ >
867
+ <div
868
+ style={{
869
+ fontFamily: FONT,
870
+ fontSize: 42,
871
+ fontWeight: ds.text.bold,
872
+ color: T.heading,
873
+ letterSpacing: ds.text.tighter,
874
+ opacity: interpolate(f, [0.2 * fps, 0.7 * fps], [0, 1], {
875
+ extrapolateLeft: "clamp",
876
+ extrapolateRight: "clamp",
877
+ }),
878
+ }}
879
+ >
880
+ The wins are{" "}
881
+ <span style={{ color: T.success }}>real</span>
882
+ </div>
883
+ </div>
884
+
885
+ {/* Stat grid */}
886
+ <div
887
+ style={{
888
+ position: "absolute",
889
+ top: "18%",
890
+ left: "50%",
891
+ transform: "translate(-50%, 0)",
892
+ display: "grid",
893
+ gridTemplateColumns: "1fr 1fr 1fr",
894
+ gap: 24,
895
+ width: "90%",
896
+ maxWidth: 800,
897
+ }}
898
+ >
899
+ <StatBadge
900
+ value="82%"
901
+ label="Visual Reasoning"
902
+ color={T.success}
903
+ delay={Math.round(0.8 * fps)}
904
+ frame={f}
905
+ fps={fps}
906
+ />
907
+ <StatBadge
908
+ value="+10pt"
909
+ label="Software Eng"
910
+ color={ds.color.claude}
911
+ delay={Math.round(1.2 * fps)}
912
+ frame={f}
913
+ fps={fps}
914
+ />
915
+ <StatBadge
916
+ value="94.6%"
917
+ label="Grad Reasoning"
918
+ color={ds.color.accent}
919
+ delay={Math.round(1.6 * fps)}
920
+ frame={f}
921
+ fps={fps}
922
+ />
923
+ </div>
924
+
925
+ {/* Screenshot: Benchmark table */}
926
+ <div
927
+ style={{
928
+ position: "absolute",
929
+ top: "40%",
930
+ left: "50%",
931
+ transform: `translate(-50%, 0)`,
932
+ width: "92%",
933
+ perspective: 1000,
934
+ opacity: interpolate(f, [2 * fps, 3 * fps], [0, 1], {
935
+ extrapolateLeft: "clamp",
936
+ extrapolateRight: "clamp",
937
+ }),
938
+ }}
939
+ >
940
+ <div
941
+ style={{
942
+ borderRadius: ds.radius.xl,
943
+ overflow: "hidden",
944
+ boxShadow: ds.card3d.shadowTable,
945
+ transform: `rotateX(3deg) scale(${interpolate(f, [2 * fps, 3.5 * fps], [0.92, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: Easing.out(Easing.quad) })})`,
946
+ border: "1px solid rgba(255,255,255,0.06)",
947
+ }}
948
+ >
949
+ <div
950
+ style={{
951
+ width: "100%",
952
+ aspectRatio: "16 / 10",
953
+ background: G.bg,
954
+ borderRadius: ds.radius.xl,
955
+ padding: "28px 32px",
956
+ display: "flex",
957
+ flexDirection: "column",
958
+ gap: 14,
959
+ boxSizing: "border-box",
960
+ }}
961
+ >
962
+ <div style={{ fontFamily: MONO, fontSize: 16, fontWeight: ds.text.semibold, color: "#fff", letterSpacing: 0.5 }}>
963
+ Opus 4.7 Benchmarks
964
+ </div>
965
+ {[0.82, 0.71, 0.94, 0.65].map((w, i) => (
966
+ <div key={i} style={{ display: "flex", alignItems: "center", gap: 12 }}>
967
+ <div style={{ width: 80, fontFamily: MONO, fontSize: 11, color: "rgba(255,255,255,0.45)" }}>
968
+ {["Visual", "SWE", "Grad", "Safety"][i]}
969
+ </div>
970
+ <div style={{ flex: 1, height: 10, borderRadius: 5, background: "rgba(255,255,255,0.06)" }}>
971
+ <div style={{ width: `${w * 100}%`, height: "100%", borderRadius: 5, background: `linear-gradient(90deg, ${ds.color.accent}, ${ds.color.claude})` }} />
972
+ </div>
973
+ <div style={{ width: 40, fontFamily: MONO, fontSize: 11, color: "rgba(255,255,255,0.5)", textAlign: "right" }}>
974
+ {`${Math.round(w * 100)}%`}
975
+ </div>
976
+ </div>
977
+ ))}
978
+ </div>
979
+ </div>
980
+ </div>
981
+ </AbsoluteFill>
982
+ );
983
+ };
984
+
985
+ // ═══════════════════════════════════════════════════════════════
986
+ // SCENE 6: SPEED — "thousands of times faster"
987
+ // ═══════════════════════════════════════════════════════════════
988
+
989
+ const SpeedScene: React.FC<SP> = ({ frame, fps }) => {
990
+ const op = so(frame, fps, SEGS[5].s, SEGS[5].e);
991
+ if (op === 0) return null;
992
+ const f = lf(frame, fps, SEGS[5].s);
993
+
994
+ const numSpring = spring({
995
+ frame: f,
996
+ fps,
997
+ delay: Math.round(0.4 * fps),
998
+ config: ds.spring.bouncy,
999
+ });
1000
+
1001
+ return (
1002
+ <AbsoluteFill style={{ opacity: op }}>
1003
+ <div
1004
+ style={{
1005
+ position: "absolute",
1006
+ top: "25%",
1007
+ width: "100%",
1008
+ textAlign: "center",
1009
+ padding: "0 48px",
1010
+ }}
1011
+ >
1012
+ {/* Big number */}
1013
+ <div
1014
+ style={{
1015
+ fontFamily: FONT,
1016
+ fontSize: 140,
1017
+ fontWeight: ds.text.bold,
1018
+ color: ds.color.claude,
1019
+ lineHeight: 1,
1020
+ letterSpacing: ds.text.tighter,
1021
+ transform: `scale(${interpolate(numSpring, [0, 1], [0.5, 1])})`,
1022
+ opacity: interpolate(numSpring, [0, 0.2], [0, 1], {
1023
+ extrapolateLeft: "clamp",
1024
+ extrapolateRight: "clamp",
1025
+ }),
1026
+ textShadow: "0 0 60px rgba(212,102,58,0.3)",
1027
+ }}
1028
+ >
1029
+ 1000x
1030
+ </div>
1031
+ <div
1032
+ style={{
1033
+ fontFamily: FONT,
1034
+ fontSize: 30,
1035
+ fontWeight: ds.text.medium,
1036
+ color: T.muted,
1037
+ marginTop: 16,
1038
+ opacity: interpolate(f, [1 * fps, 1.6 * fps], [0, 1], {
1039
+ extrapolateLeft: "clamp",
1040
+ extrapolateRight: "clamp",
1041
+ }),
1042
+ }}
1043
+ >
1044
+ faster than your brain
1045
+ </div>
1046
+ </div>
1047
+
1048
+ {/* Bottom text */}
1049
+ <div
1050
+ style={{
1051
+ position: "absolute",
1052
+ bottom: "20%",
1053
+ width: "100%",
1054
+ textAlign: "center",
1055
+ opacity: interpolate(f, [2 * fps, 2.8 * fps], [0, 1], {
1056
+ extrapolateLeft: "clamp",
1057
+ extrapolateRight: "clamp",
1058
+ }),
1059
+ }}
1060
+ >
1061
+ <FloatingCard width="75%">
1062
+ <div
1063
+ style={{
1064
+ fontFamily: FONT,
1065
+ fontSize: 24,
1066
+ fontWeight: ds.text.semibold,
1067
+ color: G.text,
1068
+ textAlign: "center",
1069
+ }}
1070
+ >
1071
+ One person with this
1072
+ <br />
1073
+ <span style={{ color: ds.color.claude }}>
1074
+ = a whole team
1075
+ </span>
1076
+ </div>
1077
+ </FloatingCard>
1078
+ </div>
1079
+ </AbsoluteFill>
1080
+ );
1081
+ };
1082
+
1083
+ // ═══════════════════════════════════════════════════════════════
1084
+ // SCENE 7: NERFED — "some benchmarks got worse" + Screenshot
1085
+ // ═══════════════════════════════════════════════════════════════
1086
+
1087
+ const NerfedScene: React.FC<SP> = ({ frame, fps }) => {
1088
+ const op = so(frame, fps, SEGS[6].s, SEGS[6].e);
1089
+ if (op === 0) return null;
1090
+ const f = lf(frame, fps, SEGS[6].s);
1091
+
1092
+ return (
1093
+ <AbsoluteFill style={{ opacity: op }}>
1094
+ <div
1095
+ style={{
1096
+ position: "absolute",
1097
+ top: "8%",
1098
+ width: "100%",
1099
+ textAlign: "center",
1100
+ padding: "0 48px",
1101
+ }}
1102
+ >
1103
+ <div
1104
+ style={{
1105
+ fontFamily: FONT,
1106
+ fontSize: 44,
1107
+ fontWeight: ds.text.bold,
1108
+ color: T.heading,
1109
+ letterSpacing: ds.text.tighter,
1110
+ opacity: interpolate(f, [0.2 * fps, 0.7 * fps], [0, 1], {
1111
+ extrapolateLeft: "clamp",
1112
+ extrapolateRight: "clamp",
1113
+ }),
1114
+ }}
1115
+ >
1116
+ Some things got{" "}
1117
+ <span style={{ color: T.danger }}>worse</span>
1118
+ </div>
1119
+ <div
1120
+ style={{
1121
+ fontFamily: FONT,
1122
+ fontSize: 22,
1123
+ fontWeight: ds.text.regular,
1124
+ color: T.muted,
1125
+ marginTop: 12,
1126
+ opacity: interpolate(f, [0.8 * fps, 1.4 * fps], [0, 1], {
1127
+ extrapolateLeft: "clamp",
1128
+ extrapolateRight: "clamp",
1129
+ }),
1130
+ }}
1131
+ >
1132
+ Nerfed on purpose. Safety stuff.
1133
+ </div>
1134
+ </div>
1135
+
1136
+ {/* Nerfed items */}
1137
+ <div
1138
+ style={{
1139
+ position: "absolute",
1140
+ top: "28%",
1141
+ left: "50%",
1142
+ transform: "translate(-50%, 0)",
1143
+ width: "85%",
1144
+ display: "flex",
1145
+ flexDirection: "column",
1146
+ gap: 16,
1147
+ }}
1148
+ >
1149
+ {["Agentic browsing", "Cybersecurity reproduction"].map((item, i) => {
1150
+ const itemSpring = spring({
1151
+ frame: f,
1152
+ fps,
1153
+ delay: Math.round((1.2 + i * 0.4) * fps),
1154
+ config: ds.spring.snappy,
1155
+ });
1156
+ return (
1157
+ <div
1158
+ key={item}
1159
+ style={{
1160
+ ...ds.card3d.cardStyle,
1161
+ padding: "20px 28px",
1162
+ display: "flex",
1163
+ alignItems: "center",
1164
+ justifyContent: "space-between",
1165
+ opacity: interpolate(itemSpring, [0, 0.3], [0, 1], {
1166
+ extrapolateLeft: "clamp",
1167
+ extrapolateRight: "clamp",
1168
+ }),
1169
+ transform: `translateX(${interpolate(itemSpring, [0, 1], [-40, 0])}px)`,
1170
+ }}
1171
+ >
1172
+ <span
1173
+ style={{
1174
+ fontFamily: FONT,
1175
+ fontSize: 22,
1176
+ fontWeight: ds.text.medium,
1177
+ color: G.text,
1178
+ }}
1179
+ >
1180
+ {item}
1181
+ </span>
1182
+ <span
1183
+ style={{
1184
+ fontFamily: MONO,
1185
+ fontSize: 16,
1186
+ color: "#ff6568",
1187
+ fontWeight: ds.text.bold,
1188
+ }}
1189
+ >
1190
+ NERFED
1191
+ </span>
1192
+ </div>
1193
+ );
1194
+ })}
1195
+ </div>
1196
+
1197
+ {/* Screenshot 2: Agents.md card */}
1198
+ <div
1199
+ style={{
1200
+ position: "absolute",
1201
+ bottom: "6%",
1202
+ left: "50%",
1203
+ transform: "translate(-50%, 0)",
1204
+ width: "75%",
1205
+ perspective: 1000,
1206
+ opacity: interpolate(f, [3 * fps, 4 * fps], [0, 1], {
1207
+ extrapolateLeft: "clamp",
1208
+ extrapolateRight: "clamp",
1209
+ }),
1210
+ }}
1211
+ >
1212
+ <div
1213
+ style={{
1214
+ borderRadius: ds.radius.xl,
1215
+ overflow: "hidden",
1216
+ boxShadow: ds.card3d.shadow3d,
1217
+ transform: `rotateX(4deg) rotateY(-2deg) scale(${interpolate(f, [3 * fps, 4.5 * fps], [0.9, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" })})`,
1218
+ border: "1px solid rgba(255,255,255,0.06)",
1219
+ }}
1220
+ >
1221
+ <div
1222
+ style={{
1223
+ width: "100%",
1224
+ aspectRatio: "16 / 10",
1225
+ background: G.bg,
1226
+ borderRadius: ds.radius.xl,
1227
+ padding: "28px 32px",
1228
+ display: "flex",
1229
+ flexDirection: "column",
1230
+ gap: 10,
1231
+ boxSizing: "border-box",
1232
+ }}
1233
+ >
1234
+ <div style={{ fontFamily: MONO, fontSize: 16, fontWeight: ds.text.semibold, color: "#fff", letterSpacing: 0.5 }}>
1235
+ Agents.md
1236
+ </div>
1237
+ <div style={{ height: 1, background: "rgba(255,255,255,0.08)", margin: "4px 0" }} />
1238
+ {[0.9, 0.6, 0.75, 0.5, 0.85, 0.4].map((w, i) => (
1239
+ <div
1240
+ key={i}
1241
+ style={{
1242
+ height: 8,
1243
+ width: `${w * 100}%`,
1244
+ borderRadius: 4,
1245
+ background: i === 0 ? "rgba(212,102,58,0.35)" : "rgba(255,255,255,0.1)",
1246
+ }}
1247
+ />
1248
+ ))}
1249
+ </div>
1250
+ </div>
1251
+ </div>
1252
+ </AbsoluteFill>
1253
+ );
1254
+ };
1255
+
1256
+ // ═══════════════════════════════════════════════════════════════
1257
+ // SCENE 8: THESIS — "doesn't change anything"
1258
+ // ═══════════════════════════════════════════════════════════════
1259
+
1260
+ const ThesisScene: React.FC<SP> = ({ frame, fps }) => {
1261
+ const op = so(frame, fps, SEGS[7].s, SEGS[7].e);
1262
+ if (op === 0) return null;
1263
+ const f = lf(frame, fps, SEGS[7].s);
1264
+
1265
+ return (
1266
+ <AbsoluteFill style={{ opacity: op }}>
1267
+ <div
1268
+ style={{
1269
+ position: "absolute",
1270
+ top: "12%",
1271
+ width: "100%",
1272
+ textAlign: "center",
1273
+ padding: "0 48px",
1274
+ }}
1275
+ >
1276
+ <div
1277
+ style={{
1278
+ fontFamily: FONT,
1279
+ fontSize: 52,
1280
+ fontWeight: ds.text.bold,
1281
+ color: T.heading,
1282
+ letterSpacing: ds.text.tighter,
1283
+ lineHeight: 1.15,
1284
+ opacity: interpolate(f, [0.3 * fps, 0.8 * fps], [0, 1], {
1285
+ extrapolateLeft: "clamp",
1286
+ extrapolateRight: "clamp",
1287
+ }),
1288
+ }}
1289
+ >
1290
+ This doesn't
1291
+ <br />
1292
+ <span style={{ color: T.muted }}>change anything.</span>
1293
+ </div>
1294
+ </div>
1295
+
1296
+ {/* Screenshot 3 */}
1297
+ <div
1298
+ style={{
1299
+ position: "absolute",
1300
+ top: "34%",
1301
+ left: "50%",
1302
+ transform: "translate(-50%, 0)",
1303
+ width: "80%",
1304
+ perspective: 1000,
1305
+ opacity: interpolate(f, [1.5 * fps, 2.5 * fps], [0, 1], {
1306
+ extrapolateLeft: "clamp",
1307
+ extrapolateRight: "clamp",
1308
+ }),
1309
+ }}
1310
+ >
1311
+ <div
1312
+ style={{
1313
+ borderRadius: ds.radius.xl,
1314
+ overflow: "hidden",
1315
+ boxShadow: ds.card3d.shadow3d,
1316
+ transform: `rotateX(2deg) rotateY(1deg) scale(${interpolate(f, [1.5 * fps, 3 * fps], [0.9, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" })})`,
1317
+ border: "1px solid rgba(255,255,255,0.06)",
1318
+ }}
1319
+ >
1320
+ <div
1321
+ style={{
1322
+ width: "100%",
1323
+ aspectRatio: "16 / 10",
1324
+ background: G.bg,
1325
+ borderRadius: ds.radius.xl,
1326
+ padding: "28px 32px",
1327
+ display: "flex",
1328
+ flexDirection: "column",
1329
+ gap: 10,
1330
+ boxSizing: "border-box",
1331
+ }}
1332
+ >
1333
+ <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
1334
+ <div style={{ width: 8, height: 8, borderRadius: "50%", background: ds.color.success, boxShadow: `0 0 6px ${ds.color.success}` }} />
1335
+ <div style={{ fontFamily: MONO, fontSize: 14, color: "rgba(255,255,255,0.6)" }}>
1336
+ Referencing agents.md...
1337
+ </div>
1338
+ </div>
1339
+ <div style={{ height: 1, background: "rgba(255,255,255,0.08)", margin: "4px 0" }} />
1340
+ {[0.7, 0.55, 0.85, 0.45, 0.65].map((w, i) => (
1341
+ <div
1342
+ key={i}
1343
+ style={{
1344
+ height: 8,
1345
+ width: `${w * 100}%`,
1346
+ borderRadius: 4,
1347
+ background: "rgba(255,255,255,0.1)",
1348
+ }}
1349
+ />
1350
+ ))}
1351
+ </div>
1352
+ </div>
1353
+ </div>
1354
+
1355
+ {/* Bottom text */}
1356
+ <div
1357
+ style={{
1358
+ position: "absolute",
1359
+ bottom: "8%",
1360
+ width: "100%",
1361
+ textAlign: "center",
1362
+ padding: "0 60px",
1363
+ opacity: interpolate(f, [3 * fps, 3.8 * fps], [0, 1], {
1364
+ extrapolateLeft: "clamp",
1365
+ extrapolateRight: "clamp",
1366
+ }),
1367
+ }}
1368
+ >
1369
+ <div
1370
+ style={{
1371
+ fontFamily: FONT,
1372
+ fontSize: 24,
1373
+ fontWeight: ds.text.regular,
1374
+ color: T.muted,
1375
+ lineHeight: 1.5,
1376
+ }}
1377
+ >
1378
+ AI just makes things
1379
+ <br />
1380
+ <span style={{ fontWeight: ds.text.semibold, color: T.heading }}>
1381
+ slightly more profitable.
1382
+ </span>
1383
+ </div>
1384
+ </div>
1385
+ </AbsoluteFill>
1386
+ );
1387
+ };
1388
+
1389
+ // ═══════════════════════════════════════════════════════════════
1390
+ // SCENE 9: GPT-3 — "zero-to-one was 2020" + Screenshot
1391
+ // ═══════════════════════════════════════════════════════════════
1392
+
1393
+ const GPT3Scene: React.FC<SP> = ({ frame, fps }) => {
1394
+ const op = so(frame, fps, SEGS[8].s, SEGS[8].e);
1395
+ if (op === 0) return null;
1396
+ const f = lf(frame, fps, SEGS[8].s);
1397
+
1398
+ return (
1399
+ <AbsoluteFill style={{ opacity: op }}>
1400
+ <div
1401
+ style={{
1402
+ position: "absolute",
1403
+ top: "8%",
1404
+ width: "100%",
1405
+ textAlign: "center",
1406
+ padding: "0 48px",
1407
+ }}
1408
+ >
1409
+ <div
1410
+ style={{
1411
+ fontFamily: FONT,
1412
+ fontSize: 44,
1413
+ fontWeight: ds.text.bold,
1414
+ color: T.heading,
1415
+ letterSpacing: ds.text.tighter,
1416
+ opacity: interpolate(f, [0.2 * fps, 0.7 * fps], [0, 1], {
1417
+ extrapolateLeft: "clamp",
1418
+ extrapolateRight: "clamp",
1419
+ }),
1420
+ }}
1421
+ >
1422
+ The zero-to-one?
1423
+ </div>
1424
+ <div
1425
+ style={{
1426
+ fontFamily: FONT,
1427
+ fontSize: 72,
1428
+ fontWeight: ds.text.bold,
1429
+ color: ds.color.claude,
1430
+ marginTop: 8,
1431
+ letterSpacing: ds.text.tighter,
1432
+ opacity: interpolate(f, [0.6 * fps, 1.2 * fps], [0, 1], {
1433
+ extrapolateLeft: "clamp",
1434
+ extrapolateRight: "clamp",
1435
+ }),
1436
+ }}
1437
+ >
1438
+ GPT-3, 2020
1439
+ </div>
1440
+ <div
1441
+ style={{
1442
+ fontFamily: FONT,
1443
+ fontSize: 24,
1444
+ fontWeight: ds.text.regular,
1445
+ color: T.muted,
1446
+ marginTop: 16,
1447
+ opacity: interpolate(f, [1.2 * fps, 1.8 * fps], [0, 1], {
1448
+ extrapolateLeft: "clamp",
1449
+ extrapolateRight: "clamp",
1450
+ }),
1451
+ }}
1452
+ >
1453
+ Everything since has been horizontal.
1454
+ </div>
1455
+ </div>
1456
+
1457
+ {/* Screenshot 4: What you do / How you sound */}
1458
+ <div
1459
+ style={{
1460
+ position: "absolute",
1461
+ top: "42%",
1462
+ left: "50%",
1463
+ transform: "translate(-50%, 0)",
1464
+ width: "78%",
1465
+ perspective: 1000,
1466
+ opacity: interpolate(f, [2 * fps, 3 * fps], [0, 1], {
1467
+ extrapolateLeft: "clamp",
1468
+ extrapolateRight: "clamp",
1469
+ }),
1470
+ }}
1471
+ >
1472
+ <div
1473
+ style={{
1474
+ borderRadius: ds.radius.xl,
1475
+ overflow: "hidden",
1476
+ boxShadow: ds.card3d.shadow3d,
1477
+ transform: `rotateX(3deg) rotateY(-1deg) scale(${interpolate(f, [2 * fps, 3.5 * fps], [0.9, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" })})`,
1478
+ border: "1px solid rgba(255,255,255,0.06)",
1479
+ }}
1480
+ >
1481
+ <div
1482
+ style={{
1483
+ width: "100%",
1484
+ aspectRatio: "16 / 10",
1485
+ background: G.bg,
1486
+ borderRadius: ds.radius.xl,
1487
+ padding: "28px 32px",
1488
+ display: "flex",
1489
+ flexDirection: "column",
1490
+ gap: 12,
1491
+ boxSizing: "border-box",
1492
+ }}
1493
+ >
1494
+ <div style={{ display: "flex", gap: 24 }}>
1495
+ <div style={{ flex: 1 }}>
1496
+ <div style={{ fontFamily: MONO, fontSize: 13, fontWeight: ds.text.semibold, color: ds.color.claude, letterSpacing: 0.5, marginBottom: 10 }}>
1497
+ What you do
1498
+ </div>
1499
+ {[0.8, 0.6, 0.9, 0.5].map((w, i) => (
1500
+ <div key={i} style={{ height: 7, width: `${w * 100}%`, borderRadius: 4, background: "rgba(255,255,255,0.1)", marginBottom: 6 }} />
1501
+ ))}
1502
+ </div>
1503
+ <div style={{ width: 1, background: "rgba(255,255,255,0.08)" }} />
1504
+ <div style={{ flex: 1 }}>
1505
+ <div style={{ fontFamily: MONO, fontSize: 13, fontWeight: ds.text.semibold, color: ds.color.claude, letterSpacing: 0.5, marginBottom: 10 }}>
1506
+ How you sound
1507
+ </div>
1508
+ {[0.7, 0.85, 0.5, 0.75].map((w, i) => (
1509
+ <div key={i} style={{ height: 7, width: `${w * 100}%`, borderRadius: 4, background: "rgba(255,255,255,0.1)", marginBottom: 6 }} />
1510
+ ))}
1511
+ </div>
1512
+ </div>
1513
+ </div>
1514
+ </div>
1515
+ </div>
1516
+ </AbsoluteFill>
1517
+ );
1518
+ };
1519
+
1520
+ // ═══════════════════════════════════════════════════════════════
1521
+ // SCENE 10: ADVICE — "stop switching models" + Screenshot
1522
+ // ═══════════════════════════════════════════════════════════════
1523
+
1524
+ const AdviceScene: React.FC<SP> = ({ frame, fps }) => {
1525
+ const op = so(frame, fps, SEGS[9].s, SEGS[9].e);
1526
+ if (op === 0) return null;
1527
+ const f = lf(frame, fps, SEGS[9].s);
1528
+
1529
+ return (
1530
+ <AbsoluteFill style={{ opacity: op }}>
1531
+ <div
1532
+ style={{
1533
+ position: "absolute",
1534
+ top: "8%",
1535
+ width: "100%",
1536
+ textAlign: "center",
1537
+ padding: "0 48px",
1538
+ }}
1539
+ >
1540
+ <div
1541
+ style={{
1542
+ fontFamily: FONT,
1543
+ fontSize: 44,
1544
+ fontWeight: ds.text.bold,
1545
+ color: T.heading,
1546
+ letterSpacing: ds.text.tighter,
1547
+ lineHeight: 1.2,
1548
+ opacity: interpolate(f, [0.3 * fps, 0.8 * fps], [0, 1], {
1549
+ extrapolateLeft: "clamp",
1550
+ extrapolateRight: "clamp",
1551
+ }),
1552
+ }}
1553
+ >
1554
+ Stop chasing
1555
+ <br />
1556
+ <span style={{ color: ds.color.claude }}>3% bumps</span>
1557
+ </div>
1558
+ </div>
1559
+
1560
+ {/* Screenshot 5: Brand details */}
1561
+ <div
1562
+ style={{
1563
+ position: "absolute",
1564
+ top: "28%",
1565
+ left: "50%",
1566
+ transform: "translate(-50%, 0)",
1567
+ width: "78%",
1568
+ perspective: 1000,
1569
+ opacity: interpolate(f, [1 * fps, 2 * fps], [0, 1], {
1570
+ extrapolateLeft: "clamp",
1571
+ extrapolateRight: "clamp",
1572
+ }),
1573
+ }}
1574
+ >
1575
+ <div
1576
+ style={{
1577
+ borderRadius: ds.radius.xl,
1578
+ overflow: "hidden",
1579
+ boxShadow: ds.card3d.shadow3d,
1580
+ transform: `rotateX(3deg) rotateY(-2deg) scale(${interpolate(f, [1 * fps, 2.5 * fps], [0.9, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" })})`,
1581
+ border: "1px solid rgba(255,255,255,0.06)",
1582
+ }}
1583
+ >
1584
+ <div
1585
+ style={{
1586
+ width: "100%",
1587
+ aspectRatio: "16 / 10",
1588
+ background: G.bg,
1589
+ borderRadius: ds.radius.xl,
1590
+ padding: "28px 32px",
1591
+ display: "flex",
1592
+ flexDirection: "column",
1593
+ gap: 10,
1594
+ boxSizing: "border-box",
1595
+ }}
1596
+ >
1597
+ {[
1598
+ { label: "Brand details", widths: [0.85, 0.6, 0.7] },
1599
+ { label: "ICP", widths: [0.75, 0.5] },
1600
+ { label: "Buying triggers", widths: [0.9, 0.65, 0.55] },
1601
+ ].map((section, si) => (
1602
+ <div key={si} style={{ marginBottom: si < 2 ? 4 : 0 }}>
1603
+ <div style={{ fontFamily: MONO, fontSize: 12, fontWeight: ds.text.semibold, color: ds.color.claude, letterSpacing: 0.5, marginBottom: 6 }}>
1604
+ {section.label}
1605
+ </div>
1606
+ {section.widths.map((w, i) => (
1607
+ <div key={i} style={{ height: 6, width: `${w * 100}%`, borderRadius: 3, background: "rgba(255,255,255,0.1)", marginBottom: 4 }} />
1608
+ ))}
1609
+ </div>
1610
+ ))}
1611
+ </div>
1612
+ </div>
1613
+ </div>
1614
+
1615
+ {/* Bottom advice */}
1616
+ <div
1617
+ style={{
1618
+ position: "absolute",
1619
+ bottom: "10%",
1620
+ left: "50%",
1621
+ transform: "translate(-50%, 0)",
1622
+ width: "85%",
1623
+ opacity: interpolate(f, [3.5 * fps, 4.3 * fps], [0, 1], {
1624
+ extrapolateLeft: "clamp",
1625
+ extrapolateRight: "clamp",
1626
+ }),
1627
+ }}
1628
+ >
1629
+ <FloatingCard>
1630
+ <div
1631
+ style={{
1632
+ fontFamily: FONT,
1633
+ fontSize: 22,
1634
+ fontWeight: ds.text.medium,
1635
+ color: G.text,
1636
+ textAlign: "center",
1637
+ lineHeight: 1.6,
1638
+ }}
1639
+ >
1640
+ Pick one that works.
1641
+ <br />
1642
+ Build around it.
1643
+ <br />
1644
+ <span style={{ color: ds.color.claude, fontWeight: ds.text.bold }}>
1645
+ Ignore the noise.
1646
+ </span>
1647
+ </div>
1648
+ </FloatingCard>
1649
+ </div>
1650
+ </AbsoluteFill>
1651
+ );
1652
+ };
1653
+
1654
+ // ═══════════════════════════════════════════════════════════════
1655
+ // SCENE 11: CLOSE — "ship something"
1656
+ // ═══════════════════════════════════════════════════════════════
1657
+
1658
+ const CloseScene: React.FC<SP> = ({ frame, fps }) => {
1659
+ const op = so(frame, fps, SEGS[10].s, SEGS[10].e, 0.6, 0.8);
1660
+ if (op === 0) return null;
1661
+ const f = lf(frame, fps, SEGS[10].s);
1662
+
1663
+ const mainSpring = spring({
1664
+ frame: f,
1665
+ fps,
1666
+ delay: Math.round(0.3 * fps),
1667
+ config: ds.spring.gentle,
1668
+ });
1669
+
1670
+ return (
1671
+ <AbsoluteFill style={{ opacity: op }}>
1672
+ <div
1673
+ style={{
1674
+ position: "absolute",
1675
+ top: "30%",
1676
+ width: "100%",
1677
+ textAlign: "center",
1678
+ padding: "0 48px",
1679
+ transform: `scale(${interpolate(mainSpring, [0, 1], [0.9, 1])})`,
1680
+ opacity: interpolate(mainSpring, [0, 0.2], [0, 1], {
1681
+ extrapolateLeft: "clamp",
1682
+ extrapolateRight: "clamp",
1683
+ }),
1684
+ }}
1685
+ >
1686
+ <div
1687
+ style={{
1688
+ fontFamily: FONT,
1689
+ fontSize: 56,
1690
+ fontWeight: ds.text.bold,
1691
+ color: T.heading,
1692
+ letterSpacing: ds.text.tighter,
1693
+ lineHeight: 1.2,
1694
+ }}
1695
+ >
1696
+ Save your energy.
1697
+ </div>
1698
+ <div
1699
+ style={{
1700
+ fontFamily: FONT,
1701
+ fontSize: 56,
1702
+ fontWeight: ds.text.bold,
1703
+ color: ds.color.claude,
1704
+ marginTop: 16,
1705
+ letterSpacing: ds.text.tighter,
1706
+ textShadow: "0 0 40px rgba(212,102,58,0.3)",
1707
+ }}
1708
+ >
1709
+ Ship something.
1710
+ </div>
1711
+ </div>
1712
+
1713
+ {/* Devini branding */}
1714
+ <div
1715
+ style={{
1716
+ position: "absolute",
1717
+ bottom: "12%",
1718
+ width: "100%",
1719
+ textAlign: "center",
1720
+ opacity: interpolate(f, [2 * fps, 2.8 * fps], [0, 1], {
1721
+ extrapolateLeft: "clamp",
1722
+ extrapolateRight: "clamp",
1723
+ }),
1724
+ }}
1725
+ >
1726
+ <div
1727
+ style={{
1728
+ fontFamily: FONT,
1729
+ fontSize: 18,
1730
+ fontWeight: ds.text.medium,
1731
+ color: T.muted,
1732
+ letterSpacing: 2,
1733
+ textTransform: "uppercase",
1734
+ }}
1735
+ >
1736
+ devini.io
1737
+ </div>
1738
+ </div>
1739
+ </AbsoluteFill>
1740
+ );
1741
+ };
1742
+
1743
+ // ═══════════════════════════════════════════════════════════════
1744
+ // MAIN COMPOSITION
1745
+ // ═══════════════════════════════════════════════════════════════
1746
+
1747
+ export const OpusReel: React.FC = () => {
1748
+ const frame = useCurrentFrame();
1749
+ const { fps } = useVideoConfig();
1750
+
1751
+ return (
1752
+ <AbsoluteFill style={{ backgroundColor: "#e8e4de", fontFamily: FONT }}>
1753
+ {/* Voiceover audio */}
1754
+ {/* REFERENCE-STRIP: <Audio> tag removed — bring your own voiceover */}
1755
+
1756
+ <Background frame={frame} />
1757
+ <HookScene frame={frame} fps={fps} />
1758
+ <MythosScene frame={frame} fps={fps} />
1759
+ <HalfStepScene frame={frame} fps={fps} />
1760
+ <DistilledScene frame={frame} fps={fps} />
1761
+ <WinsScene frame={frame} fps={fps} />
1762
+ <SpeedScene frame={frame} fps={fps} />
1763
+ <NerfedScene frame={frame} fps={fps} />
1764
+ <ThesisScene frame={frame} fps={fps} />
1765
+ <GPT3Scene frame={frame} fps={fps} />
1766
+ <AdviceScene frame={frame} fps={fps} />
1767
+ <CloseScene frame={frame} fps={fps} />
1768
+ </AbsoluteFill>
1769
+ );
1770
+ };