@devinilabs/reelstack 1.3.2 → 1.4.1

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.
@@ -0,0 +1,2608 @@
1
+ /**
2
+ * REFERENCE — GPT55Reel (Family: dark)
3
+ *
4
+ * Canonical example of the dark family's motion vocabulary, frame-locked
5
+ * BEAT structure, and scene choreography. Bundled with ReelStack v1.4+
6
+ * for STUDY and as the source for the scaffold-from-reference flow.
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/GPT55Reel.tsx
15
+ * Bundled at: 2026-05-12T19:40:04.831Z
16
+ */
17
+ import React from "react";
18
+ import {
19
+ useCurrentFrame,
20
+ useVideoConfig,
21
+ interpolate,
22
+ spring,
23
+ Easing,
24
+ AbsoluteFill,
25
+ Sequence,
26
+ Img,
27
+ OffthreadVideo,
28
+ staticFile,
29
+ } from "remotion";
30
+ import { ds } from "./designSystem";
31
+
32
+ // ═══════════════════════════════════════════════════════════════
33
+ // CONSTANTS
34
+ // ═══════════════════════════════════════════════════════════════
35
+
36
+ const FPS = 30;
37
+ const W = 1080;
38
+ const H = 1920;
39
+ const SAFE_TOP = 280;
40
+ const SAFE_BOT_Y = 1510; // bottom = H - 410 = 1510 content limit
41
+ const SAFE_L = 60;
42
+ const SAFE_R = 60;
43
+
44
+ const SCENES = {
45
+ S1: { from: 0, dur: 180 },
46
+ S2: { from: 180, dur: 240 },
47
+ S3: { from: 420, dur: 180 },
48
+ S4: { from: 600, dur: 330 },
49
+ S5: { from: 930, dur: 210 },
50
+ S6: { from: 1140, dur: 180 },
51
+ S7: { from: 1320, dur: 240 },
52
+ S8: { from: 1560, dur: 360 },
53
+ S9: { from: 1920, dur: 300 },
54
+ S10: { from: 2220, dur: 180 },
55
+ S11: { from: 2400, dur: 287 },
56
+ S12: { from: 2687, dur: 213 },
57
+ };
58
+
59
+ export const GPT55_TOTAL_FRAMES = 2900;
60
+
61
+ const FONT = ds.font.sans;
62
+ const MONO = ds.font.mono;
63
+
64
+ const C = {
65
+ bg: "#0a0a0b",
66
+ surface: "#14141a",
67
+ surfaceLift: "#1c1c24",
68
+ border: "rgba(255,255,255,0.08)",
69
+ borderLoud: "rgba(255,255,255,0.14)",
70
+ fg: "#f5f5f7",
71
+ fgSoft: "#d1d1d6",
72
+ fgMuted: "#8e8e93",
73
+ fgDim: "#5a5a60",
74
+ oai: "#10a37f",
75
+ oaiSoft: "#1ac997",
76
+ oaiDeep: "#0a6e55",
77
+ rival: "#6466f1",
78
+ warn: "#fcbb00",
79
+ red: "#ff3b46",
80
+ yt: "#FF0033",
81
+ } as const;
82
+
83
+ // ═══════════════════════════════════════════════════════════════
84
+ // HELPERS
85
+ // ═══════════════════════════════════════════════════════════════
86
+
87
+ const gs = (
88
+ frame: number,
89
+ fps: number,
90
+ delaySec: number,
91
+ kind: "bouncy" | "snappy" | "gentle" | "glass" = "snappy",
92
+ ) =>
93
+ spring({
94
+ frame,
95
+ fps,
96
+ delay: Math.round(delaySec * fps),
97
+ config: ds.spring[kind],
98
+ });
99
+
100
+ const fadeIn = (frame: number, at: number, len = 12) =>
101
+ interpolate(frame, [at, at + len], [0, 1], {
102
+ extrapolateLeft: "clamp",
103
+ extrapolateRight: "clamp",
104
+ });
105
+
106
+ const fadeOut = (frame: number, at: number, len = 12) =>
107
+ interpolate(frame, [at, at + len], [1, 0], {
108
+ extrapolateLeft: "clamp",
109
+ extrapolateRight: "clamp",
110
+ });
111
+
112
+ // ═══════════════════════════════════════════════════════════════
113
+ // BACKGROUND — drifting green spotlight + grain + vignette
114
+ // ═══════════════════════════════════════════════════════════════
115
+
116
+ const Background: React.FC<{ frame: number; tint?: "oai" | "rival" | "yt" }> = ({
117
+ frame,
118
+ tint = "oai",
119
+ }) => {
120
+ const drift = (Math.sin(frame * 0.003) + 1) * 0.5;
121
+ const drift2 = (Math.cos(frame * 0.0025) + 1) * 0.5;
122
+ const vignettePulse = 0.4 + Math.sin(frame * 0.007) * 0.04;
123
+ const tintColor =
124
+ tint === "oai" ? "16,163,127" : tint === "rival" ? "100,102,241" : "255,0,51";
125
+
126
+ return (
127
+ <AbsoluteFill>
128
+ <div style={{ width: "100%", height: "100%", background: C.bg }} />
129
+ <div
130
+ style={{
131
+ position: "absolute",
132
+ inset: 0,
133
+ background: `radial-gradient(ellipse 900px 1000px at ${15 + drift * 70}% ${20 + drift2 * 45}%, rgba(${tintColor},0.14) 0%, transparent 60%)`,
134
+ }}
135
+ />
136
+ <div
137
+ style={{
138
+ position: "absolute",
139
+ inset: 0,
140
+ background: `radial-gradient(ellipse 700px 900px at ${85 - drift * 55}% ${75 + drift2 * 20}%, rgba(${tintColor},0.07) 0%, transparent 55%)`,
141
+ }}
142
+ />
143
+ {/* Grid */}
144
+ <div
145
+ style={{
146
+ position: "absolute",
147
+ inset: 0,
148
+ backgroundImage: `
149
+ linear-gradient(rgba(255,255,255,0.035) 1px, transparent 1px),
150
+ linear-gradient(90deg, rgba(255,255,255,0.035) 1px, transparent 1px)
151
+ `,
152
+ backgroundSize: "72px 72px",
153
+ maskImage: "radial-gradient(ellipse at 50% 50%, black 30%, transparent 85%)",
154
+ WebkitMaskImage:
155
+ "radial-gradient(ellipse at 50% 50%, black 30%, transparent 85%)",
156
+ }}
157
+ />
158
+ {/* Noise grain (static, pointer-events-none) */}
159
+ <div
160
+ style={{
161
+ position: "absolute",
162
+ inset: 0,
163
+ opacity: 0.06,
164
+ mixBlendMode: "overlay",
165
+ backgroundImage: `url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9'/></filter><rect width='200' height='200' filter='url(%23n)' opacity='0.7'/></svg>")`,
166
+ }}
167
+ />
168
+ <div
169
+ style={{
170
+ position: "absolute",
171
+ inset: 0,
172
+ background: `radial-gradient(ellipse at 50% 50%, transparent 40%, rgba(0,0,0,${vignettePulse}) 100%)`,
173
+ }}
174
+ />
175
+ </AbsoluteFill>
176
+ );
177
+ };
178
+
179
+ // ═══════════════════════════════════════════════════════════════
180
+ // S1 — COLD OPEN: OpenAI logo + "GPT 5.5 JUST DROPPED"
181
+ // ═══════════════════════════════════════════════════════════════
182
+
183
+ const Scene1: React.FC = () => {
184
+ const frame = useCurrentFrame();
185
+ const { fps } = useVideoConfig();
186
+
187
+ const logoSpring = gs(frame, fps, 0.1, "bouncy");
188
+ const logoScale = interpolate(logoSpring, [0, 1], [0.3, 1]);
189
+ const logoRot = interpolate(logoSpring, [0, 1], [-140, 0]);
190
+ const logoOp = interpolate(logoSpring, [0, 0.3], [0, 1], {
191
+ extrapolateLeft: "clamp",
192
+ extrapolateRight: "clamp",
193
+ });
194
+
195
+ // "GPT 5.5" letter-by-letter
196
+ const gptChars = "GPT 5.5".split("");
197
+ const dropSpring = gs(frame, fps, 1.8, "bouncy");
198
+ const dropOp = interpolate(dropSpring, [0, 0.4], [0, 1], {
199
+ extrapolateLeft: "clamp",
200
+ extrapolateRight: "clamp",
201
+ });
202
+ const dropScale = interpolate(dropSpring, [0, 0.6, 1], [0.7, 1.12, 1]);
203
+ const dropGlow = 0.3 + Math.sin(frame * 0.12) * 0.15;
204
+
205
+ const subOp = fadeIn(frame, 75);
206
+ const subY = interpolate(frame, [75, 95], [20, 0], {
207
+ extrapolateLeft: "clamp",
208
+ extrapolateRight: "clamp",
209
+ });
210
+
211
+ const tickerOp = fadeIn(frame, 90);
212
+ const tickerY = interpolate(frame, [90, 110], [15, 0], {
213
+ extrapolateLeft: "clamp",
214
+ extrapolateRight: "clamp",
215
+ });
216
+
217
+ // Exit fade last 12f
218
+ const exit = fadeOut(frame, SCENES.S1.dur - 18, 12);
219
+
220
+ return (
221
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
222
+ {/* Logo — big, center-top */}
223
+ <div
224
+ style={{
225
+ position: "absolute",
226
+ top: 360,
227
+ left: 0,
228
+ right: 0,
229
+ display: "flex",
230
+ justifyContent: "center",
231
+ opacity: logoOp,
232
+ transform: `scale(${logoScale}) rotate(${logoRot}deg)`,
233
+ }}
234
+ >
235
+ <div
236
+ style={{
237
+ width: 280,
238
+ height: 280,
239
+ borderRadius: 48,
240
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiDeep})`,
241
+ display: "flex",
242
+ alignItems: "center",
243
+ justifyContent: "center",
244
+ boxShadow: `0 30px 80px -10px rgba(16,163,127,0.55), inset 0 1px 0 rgba(255,255,255,0.12)`,
245
+ }}
246
+ >
247
+ <Img
248
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
249
+ style={{ width: 180, height: 180, filter: "invert(1)" }}
250
+ />
251
+ </div>
252
+ </div>
253
+
254
+ {/* Headline */}
255
+ <div
256
+ style={{
257
+ position: "absolute",
258
+ top: 760,
259
+ left: 0,
260
+ right: 0,
261
+ textAlign: "center",
262
+ padding: "0 40px",
263
+ }}
264
+ >
265
+ {/* GPT 5.5 letter-by-letter */}
266
+ <div
267
+ style={{
268
+ display: "flex",
269
+ justifyContent: "center",
270
+ fontSize: 168,
271
+ fontWeight: 800,
272
+ color: C.fg,
273
+ letterSpacing: "-0.05em",
274
+ lineHeight: 1,
275
+ }}
276
+ >
277
+ {gptChars.map((ch, i) => {
278
+ const s = gs(frame, fps, 0.6 + i * 0.07, "snappy");
279
+ const y = interpolate(s, [0, 1], [60, 0]);
280
+ const op = interpolate(s, [0, 0.4], [0, 1], {
281
+ extrapolateLeft: "clamp",
282
+ extrapolateRight: "clamp",
283
+ });
284
+ return (
285
+ <span
286
+ key={`${ch}-${i}`}
287
+ style={{
288
+ display: "inline-block",
289
+ transform: `translateY(${y}px)`,
290
+ opacity: op,
291
+ width: ch === " " ? 36 : "auto",
292
+ }}
293
+ >
294
+ {ch === " " ? "\u00A0" : ch}
295
+ </span>
296
+ );
297
+ })}
298
+ </div>
299
+
300
+ {/* JUST DROPPED gradient slam */}
301
+ <div
302
+ style={{
303
+ marginTop: 24,
304
+ opacity: dropOp,
305
+ transform: `scale(${dropScale})`,
306
+ fontSize: 88,
307
+ fontWeight: 800,
308
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiSoft})`,
309
+ WebkitBackgroundClip: "text",
310
+ backgroundClip: "text",
311
+ WebkitTextFillColor: "transparent",
312
+ letterSpacing: "-0.04em",
313
+ filter: `drop-shadow(0 0 30px rgba(16,163,127,${dropGlow}))`,
314
+ }}
315
+ >
316
+ JUST DROPPED
317
+ </div>
318
+
319
+ {/* Subtitle */}
320
+ <div
321
+ style={{
322
+ marginTop: 28,
323
+ opacity: subOp,
324
+ transform: `translateY(${subY}px)`,
325
+ fontSize: 36,
326
+ fontWeight: 500,
327
+ color: C.fgSoft,
328
+ letterSpacing: "-0.02em",
329
+ lineHeight: 1.3,
330
+ }}
331
+ >
332
+ <span style={{ color: C.fg, fontWeight: 700 }}>smartest</span>,{" "}
333
+ <span style={{ color: C.fg, fontWeight: 700 }}>most intuitive</span>
334
+ <br />
335
+ model yet.
336
+ </div>
337
+
338
+ {/* Date ticker */}
339
+ <div
340
+ style={{
341
+ marginTop: 36,
342
+ opacity: tickerOp,
343
+ transform: `translateY(${tickerY}px)`,
344
+ display: "inline-flex",
345
+ gap: 14,
346
+ padding: "12px 24px",
347
+ borderRadius: 9999,
348
+ background: "rgba(16,163,127,0.08)",
349
+ border: `1px solid rgba(16,163,127,0.35)`,
350
+ fontFamily: MONO,
351
+ fontSize: 22,
352
+ fontWeight: 600,
353
+ color: C.oaiSoft,
354
+ letterSpacing: "0.1em",
355
+ }}
356
+ >
357
+ <span style={{ color: C.oai }}>●</span> APR 23 · 2026
358
+ </div>
359
+ </div>
360
+ </AbsoluteFill>
361
+ );
362
+ };
363
+
364
+ // ═══════════════════════════════════════════════════════════════
365
+ // S2 — INTELLIGENCE INDEX chart reveal
366
+ // ═══════════════════════════════════════════════════════════════
367
+
368
+ const Scene2: React.FC = () => {
369
+ const frame = useCurrentFrame();
370
+ const { fps } = useVideoConfig();
371
+
372
+ // Title in
373
+ const titleOp = fadeIn(frame, 0, 10);
374
+ const titleY = interpolate(frame, [0, 15], [20, 0], {
375
+ extrapolateLeft: "clamp",
376
+ extrapolateRight: "clamp",
377
+ });
378
+
379
+ // Chart reveal: left-to-right wipe
380
+ const wipeT = interpolate(frame, [15, 60], [0, 1], {
381
+ extrapolateLeft: "clamp",
382
+ extrapolateRight: "clamp",
383
+ easing: Easing.bezier(...ds.easing.standard),
384
+ });
385
+
386
+ // Stamp slam
387
+ const stampSpring = gs(frame, fps, 2.2, "bouncy");
388
+ const stampOp = interpolate(stampSpring, [0, 0.4], [0, 1], {
389
+ extrapolateLeft: "clamp",
390
+ extrapolateRight: "clamp",
391
+ });
392
+ const stampScale = interpolate(stampSpring, [0, 0.5, 1], [1.8, 0.9, 1]);
393
+ const stampRot = interpolate(stampSpring, [0, 1], [-20, -8]);
394
+
395
+ // Cost pill
396
+ const pillSpring = gs(frame, fps, 3.2, "snappy");
397
+ const pillOp = interpolate(pillSpring, [0, 0.4], [0, 1], {
398
+ extrapolateLeft: "clamp",
399
+ extrapolateRight: "clamp",
400
+ });
401
+ const pillY = interpolate(pillSpring, [0, 1], [30, 0]);
402
+
403
+ const exit = fadeOut(frame, SCENES.S2.dur - 15, 12);
404
+
405
+ return (
406
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
407
+ {/* Title */}
408
+ <div
409
+ style={{
410
+ position: "absolute",
411
+ top: SAFE_TOP + 20,
412
+ left: SAFE_L,
413
+ right: SAFE_R,
414
+ opacity: titleOp,
415
+ transform: `translateY(${titleY}px)`,
416
+ }}
417
+ >
418
+ <div
419
+ style={{
420
+ fontFamily: MONO,
421
+ fontSize: 22,
422
+ fontWeight: 600,
423
+ color: C.oai,
424
+ letterSpacing: "0.14em",
425
+ textTransform: "uppercase",
426
+ marginBottom: 16,
427
+ }}
428
+ >
429
+ Artificial Analysis · Intelligence Index
430
+ </div>
431
+ <div
432
+ style={{
433
+ fontSize: 64,
434
+ fontWeight: 700,
435
+ color: C.fg,
436
+ letterSpacing: "-0.035em",
437
+ lineHeight: 1.0,
438
+ }}
439
+ >
440
+ GPT-5.5 leads.
441
+ <br />
442
+ <span style={{ color: C.oai }}>Across the board.</span>
443
+ </div>
444
+ </div>
445
+
446
+ {/* Chart image with wipe mask */}
447
+ <div
448
+ style={{
449
+ position: "absolute",
450
+ top: 660,
451
+ left: SAFE_L,
452
+ right: SAFE_R,
453
+ height: 560,
454
+ borderRadius: 24,
455
+ overflow: "hidden",
456
+ background: C.surface,
457
+ border: `1px solid ${C.border}`,
458
+ boxShadow: `0 30px 80px -20px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.04)`,
459
+ }}
460
+ >
461
+ <div
462
+ style={{
463
+ position: "absolute",
464
+ inset: 0,
465
+ clipPath: `inset(0 ${100 - wipeT * 100}% 0 0)`,
466
+ }}
467
+ >
468
+ <Img
469
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
470
+ style={{
471
+ width: "100%",
472
+ height: "100%",
473
+ objectFit: "contain",
474
+ padding: 16,
475
+ background: "#000",
476
+ }}
477
+ />
478
+ </div>
479
+ {/* wipe line */}
480
+ <div
481
+ style={{
482
+ position: "absolute",
483
+ top: 0,
484
+ bottom: 0,
485
+ left: 0,
486
+ width: 3,
487
+ background: C.oai,
488
+ boxShadow: `0 0 24px rgba(16,163,127,0.8)`,
489
+ opacity: wipeT > 0.98 ? 0 : 1,
490
+ transform: `translateX(${wipeT * 100}vw)`,
491
+ willChange: "transform, opacity",
492
+ }}
493
+ />
494
+ </div>
495
+
496
+ {/* STATE-OF-THE-ART stamp */}
497
+ <div
498
+ style={{
499
+ position: "absolute",
500
+ top: 540,
501
+ right: 80,
502
+ opacity: stampOp,
503
+ transform: `rotate(${stampRot}deg) scale(${stampScale})`,
504
+ }}
505
+ >
506
+ <div
507
+ style={{
508
+ padding: "16px 24px",
509
+ borderRadius: 8,
510
+ background: C.oai,
511
+ color: "#fff",
512
+ fontFamily: MONO,
513
+ fontSize: 28,
514
+ fontWeight: 800,
515
+ letterSpacing: "0.05em",
516
+ textTransform: "uppercase",
517
+ border: `3px solid ${C.oaiSoft}`,
518
+ boxShadow: `0 15px 40px -10px rgba(16,163,127,0.65)`,
519
+ }}
520
+ >
521
+ State of
522
+ <br />
523
+ the Art
524
+ </div>
525
+ </div>
526
+
527
+ {/* 1/2 THE COST pill */}
528
+ <div
529
+ style={{
530
+ position: "absolute",
531
+ bottom: H - SAFE_BOT_Y + 60,
532
+ left: 0,
533
+ right: 0,
534
+ textAlign: "center",
535
+ opacity: pillOp,
536
+ transform: `translateY(${pillY}px)`,
537
+ }}
538
+ >
539
+ <div
540
+ style={{
541
+ display: "inline-flex",
542
+ alignItems: "center",
543
+ gap: 16,
544
+ padding: "22px 40px",
545
+ borderRadius: 22,
546
+ background: `linear-gradient(135deg, rgba(16,163,127,0.18), rgba(16,163,127,0.08))`,
547
+ border: `1.5px solid ${C.oai}`,
548
+ boxShadow: `0 18px 50px -12px rgba(16,163,127,0.4)`,
549
+ }}
550
+ >
551
+ <span
552
+ style={{
553
+ fontSize: 52,
554
+ fontWeight: 800,
555
+ color: C.oaiSoft,
556
+ letterSpacing: "-0.03em",
557
+ }}
558
+ >
559
+ ½
560
+ </span>
561
+ <span
562
+ style={{
563
+ fontSize: 40,
564
+ fontWeight: 600,
565
+ color: C.fg,
566
+ letterSpacing: "-0.02em",
567
+ }}
568
+ >
569
+ the cost of frontier rivals
570
+ </span>
571
+ </div>
572
+ </div>
573
+ </AbsoluteFill>
574
+ );
575
+ };
576
+
577
+ // ═══════════════════════════════════════════════════════════════
578
+ // S3 — PIVOT: "The headline isn't the benchmark." → "It's what it's built to DO."
579
+ // ═══════════════════════════════════════════════════════════════
580
+
581
+ const Scene3: React.FC = () => {
582
+ const frame = useCurrentFrame();
583
+ const { fps } = useVideoConfig();
584
+
585
+ const line1Op = fadeIn(frame, 0, 14);
586
+ const line1Y = interpolate(frame, [0, 18], [40, 0], {
587
+ extrapolateLeft: "clamp",
588
+ extrapolateRight: "clamp",
589
+ });
590
+
591
+ // Strike through "benchmark" from 45-75
592
+ const strikeT = interpolate(frame, [45, 75], [0, 1], {
593
+ extrapolateLeft: "clamp",
594
+ extrapolateRight: "clamp",
595
+ });
596
+
597
+ // Line 2 appears after strike
598
+ const line2Op = fadeIn(frame, 80, 14);
599
+ const line2Y = interpolate(frame, [80, 100], [40, 0], {
600
+ extrapolateLeft: "clamp",
601
+ extrapolateRight: "clamp",
602
+ });
603
+
604
+ // DO scales up
605
+ const doSpring = gs(frame, fps, 3.7, "bouncy");
606
+ const doScale = interpolate(doSpring, [0, 0.5, 1], [0.5, 1.3, 1.15]);
607
+ const doOp = interpolate(doSpring, [0, 0.4], [0, 1], {
608
+ extrapolateLeft: "clamp",
609
+ extrapolateRight: "clamp",
610
+ });
611
+
612
+ const exit = fadeOut(frame, SCENES.S3.dur - 15, 12);
613
+
614
+ return (
615
+ <AbsoluteFill
616
+ style={{
617
+ fontFamily: FONT,
618
+ opacity: exit,
619
+ padding: `${SAFE_TOP}px ${SAFE_L}px 410px ${SAFE_L}px`,
620
+ display: "flex",
621
+ flexDirection: "column",
622
+ justifyContent: "center",
623
+ alignItems: "center",
624
+ gap: 80,
625
+ }}
626
+ >
627
+ {/* Line 1 */}
628
+ <div
629
+ style={{
630
+ opacity: line1Op,
631
+ transform: `translateY(${line1Y}px)`,
632
+ fontSize: 78,
633
+ fontWeight: 600,
634
+ color: C.fgSoft,
635
+ letterSpacing: "-0.04em",
636
+ lineHeight: 1.0,
637
+ textAlign: "center",
638
+ }}
639
+ >
640
+ The headline isn't the{" "}
641
+ <span style={{ position: "relative", color: C.fg, fontWeight: 700 }}>
642
+ benchmark.
643
+ {/* strike line */}
644
+ <span
645
+ style={{
646
+ position: "absolute",
647
+ top: "52%",
648
+ left: 0,
649
+ height: 8,
650
+ width: "100%",
651
+ background: C.red,
652
+ borderRadius: 4,
653
+ boxShadow: `0 0 16px ${C.red}`,
654
+ transform: `scaleX(${strikeT})`,
655
+ transformOrigin: "left center",
656
+ willChange: "transform",
657
+ }}
658
+ />
659
+ </span>
660
+ </div>
661
+
662
+ {/* Line 2 */}
663
+ <div
664
+ style={{
665
+ opacity: line2Op,
666
+ transform: `translateY(${line2Y}px)`,
667
+ fontSize: 72,
668
+ fontWeight: 600,
669
+ color: C.fg,
670
+ letterSpacing: "-0.035em",
671
+ lineHeight: 1.1,
672
+ textAlign: "center",
673
+ display: "flex",
674
+ flexDirection: "column",
675
+ alignItems: "center",
676
+ gap: 12,
677
+ }}
678
+ >
679
+ <span>It's what 5.5 is</span>
680
+ <span>
681
+ built to{" "}
682
+ <span
683
+ style={{
684
+ display: "inline-block",
685
+ opacity: doOp,
686
+ transform: `scale(${doScale})`,
687
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiSoft})`,
688
+ WebkitBackgroundClip: "text",
689
+ backgroundClip: "text",
690
+ WebkitTextFillColor: "transparent",
691
+ fontWeight: 800,
692
+ letterSpacing: "-0.05em",
693
+ padding: "0 12px",
694
+ }}
695
+ >
696
+ DO.
697
+ </span>
698
+ </span>
699
+ </div>
700
+ </AbsoluteFill>
701
+ );
702
+ };
703
+
704
+ // ═══════════════════════════════════════════════════════════════
705
+ // S4 — 5 POWERS BENTO
706
+ // ═══════════════════════════════════════════════════════════════
707
+
708
+ type Power = {
709
+ label: string;
710
+ sub: string;
711
+ accent: string;
712
+ icon: React.ReactNode;
713
+ };
714
+
715
+ const POWERS: Power[] = [
716
+ {
717
+ label: "Write & debug code",
718
+ sub: "pulls PRs, fixes tests",
719
+ accent: C.oai,
720
+ icon: (
721
+ <svg width="56" height="56" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
722
+ <polyline points="16 18 22 12 16 6" />
723
+ <polyline points="8 6 2 12 8 18" />
724
+ </svg>
725
+ ),
726
+ },
727
+ {
728
+ label: "Research online",
729
+ sub: "reads, cites, decides",
730
+ accent: C.oai,
731
+ icon: (
732
+ <svg width="56" height="56" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
733
+ <circle cx="12" cy="12" r="10" />
734
+ <path d="M2 12h20M12 2a15 15 0 0 1 0 20M12 2a15 15 0 0 0 0 20" />
735
+ </svg>
736
+ ),
737
+ },
738
+ {
739
+ label: "Analyze data",
740
+ sub: "pivots, charts, infers",
741
+ accent: C.oai,
742
+ icon: (
743
+ <svg width="56" height="56" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
744
+ <path d="M3 3v18h18" />
745
+ <rect x="7" y="12" width="3" height="6" />
746
+ <rect x="12" y="8" width="3" height="10" />
747
+ <rect x="17" y="4" width="3" height="14" />
748
+ </svg>
749
+ ),
750
+ },
751
+ {
752
+ label: "Docs & sheets",
753
+ sub: "drafts, edits, formats",
754
+ accent: C.oai,
755
+ icon: (
756
+ <svg width="56" height="56" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
757
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
758
+ <polyline points="14 2 14 8 20 8" />
759
+ <line x1="8" y1="13" x2="16" y2="13" />
760
+ <line x1="8" y1="17" x2="13" y2="17" />
761
+ </svg>
762
+ ),
763
+ },
764
+ {
765
+ label: "Operate software",
766
+ sub: "clicks, types, navigates",
767
+ accent: C.oai,
768
+ icon: (
769
+ <svg width="56" height="56" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
770
+ <path d="M13 2L3 14h7l-1 8 10-12h-7z" />
771
+ </svg>
772
+ ),
773
+ },
774
+ ];
775
+
776
+ const PowerCard: React.FC<{
777
+ power: Power;
778
+ frame: number;
779
+ fps: number;
780
+ delay: number;
781
+ }> = ({ power, frame, fps, delay }) => {
782
+ const s = gs(frame, fps, delay, "snappy");
783
+ const op = interpolate(s, [0, 0.4], [0, 1], {
784
+ extrapolateLeft: "clamp",
785
+ extrapolateRight: "clamp",
786
+ });
787
+ const y = interpolate(s, [0, 1], [40, 0]);
788
+ const scale = interpolate(s, [0, 0.7, 1], [0.9, 1.02, 1]);
789
+
790
+ // Subtle breathe
791
+ const breathe = 1 + Math.sin((frame - delay * fps) * 0.05) * 0.008;
792
+
793
+ return (
794
+ <div
795
+ style={{
796
+ opacity: op,
797
+ transform: `translateY(${y}px) scale(${scale * breathe})`,
798
+ padding: "28px 28px",
799
+ borderRadius: 22,
800
+ background: `linear-gradient(145deg, ${C.surfaceLift}, ${C.surface})`,
801
+ border: `1px solid ${C.border}`,
802
+ boxShadow: `0 20px 40px -15px rgba(0,0,0,0.5), inset 0 1px 0 rgba(255,255,255,0.05)`,
803
+ display: "flex",
804
+ alignItems: "center",
805
+ gap: 24,
806
+ }}
807
+ >
808
+ <div
809
+ style={{
810
+ width: 96,
811
+ height: 96,
812
+ borderRadius: 18,
813
+ background: `rgba(16,163,127,0.12)`,
814
+ border: `1px solid rgba(16,163,127,0.3)`,
815
+ display: "flex",
816
+ alignItems: "center",
817
+ justifyContent: "center",
818
+ color: power.accent,
819
+ flexShrink: 0,
820
+ }}
821
+ >
822
+ {power.icon}
823
+ </div>
824
+ <div style={{ flex: 1, minWidth: 0 }}>
825
+ <div
826
+ style={{
827
+ fontSize: 38,
828
+ fontWeight: 700,
829
+ color: C.fg,
830
+ letterSpacing: "-0.03em",
831
+ lineHeight: 1.1,
832
+ marginBottom: 6,
833
+ }}
834
+ >
835
+ {power.label}
836
+ </div>
837
+ <div
838
+ style={{
839
+ fontFamily: MONO,
840
+ fontSize: 18,
841
+ fontWeight: 500,
842
+ color: C.fgMuted,
843
+ letterSpacing: "0.02em",
844
+ }}
845
+ >
846
+ {power.sub}
847
+ </div>
848
+ </div>
849
+ </div>
850
+ );
851
+ };
852
+
853
+ const Scene4: React.FC = () => {
854
+ const frame = useCurrentFrame();
855
+ const { fps } = useVideoConfig();
856
+
857
+ const titleOp = fadeIn(frame, 0, 10);
858
+ const titleY = interpolate(frame, [0, 15], [16, 0], {
859
+ extrapolateLeft: "clamp",
860
+ extrapolateRight: "clamp",
861
+ });
862
+
863
+ // Finished banner
864
+ const finSpring = gs(frame, fps, 7.5, "bouncy");
865
+ const finOp = interpolate(finSpring, [0, 0.4], [0, 1], {
866
+ extrapolateLeft: "clamp",
867
+ extrapolateRight: "clamp",
868
+ });
869
+ const finScale = interpolate(finSpring, [0, 0.6, 1], [0.7, 1.08, 1]);
870
+
871
+ const exit = fadeOut(frame, SCENES.S4.dur - 15, 12);
872
+
873
+ return (
874
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
875
+ {/* Title */}
876
+ <div
877
+ style={{
878
+ position: "absolute",
879
+ top: SAFE_TOP + 10,
880
+ left: SAFE_L,
881
+ right: SAFE_R,
882
+ opacity: titleOp,
883
+ transform: `translateY(${titleY}px)`,
884
+ }}
885
+ >
886
+ <div
887
+ style={{
888
+ fontFamily: MONO,
889
+ fontSize: 20,
890
+ fontWeight: 600,
891
+ color: C.oai,
892
+ letterSpacing: "0.14em",
893
+ textTransform: "uppercase",
894
+ marginBottom: 12,
895
+ }}
896
+ >
897
+ What it's built to do
898
+ </div>
899
+ <div
900
+ style={{
901
+ fontSize: 54,
902
+ fontWeight: 700,
903
+ color: C.fg,
904
+ letterSpacing: "-0.035em",
905
+ lineHeight: 1.05,
906
+ }}
907
+ >
908
+ Five jobs. One model.
909
+ </div>
910
+ </div>
911
+
912
+ {/* 5 cards */}
913
+ <div
914
+ style={{
915
+ position: "absolute",
916
+ top: 560,
917
+ left: SAFE_L,
918
+ right: SAFE_R,
919
+ display: "flex",
920
+ flexDirection: "column",
921
+ gap: 16,
922
+ }}
923
+ >
924
+ {POWERS.map((p, i) => (
925
+ <PowerCard
926
+ key={p.label}
927
+ power={p}
928
+ frame={frame}
929
+ fps={fps}
930
+ delay={0.5 + i * 0.35}
931
+ />
932
+ ))}
933
+ </div>
934
+
935
+ {/* Finished chip */}
936
+ <div
937
+ style={{
938
+ position: "absolute",
939
+ bottom: H - SAFE_BOT_Y + 40,
940
+ left: 0,
941
+ right: 0,
942
+ textAlign: "center",
943
+ opacity: finOp,
944
+ transform: `scale(${finScale})`,
945
+ }}
946
+ >
947
+ <div
948
+ style={{
949
+ display: "inline-flex",
950
+ alignItems: "center",
951
+ gap: 14,
952
+ padding: "18px 32px",
953
+ borderRadius: 9999,
954
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiDeep})`,
955
+ boxShadow: `0 15px 40px -10px rgba(16,163,127,0.55), inset 0 1px 0 rgba(255,255,255,0.12)`,
956
+ }}
957
+ >
958
+ <svg width="36" height="36" viewBox="0 0 24 24" fill="none" stroke="#fff" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round">
959
+ <polyline points="20 6 9 17 4 12" />
960
+ </svg>
961
+ <span
962
+ style={{
963
+ fontSize: 34,
964
+ fontWeight: 700,
965
+ color: "#fff",
966
+ letterSpacing: "-0.02em",
967
+ }}
968
+ >
969
+ until the task is finished
970
+ </span>
971
+ </div>
972
+ </div>
973
+ </AbsoluteFill>
974
+ );
975
+ };
976
+
977
+ // ═══════════════════════════════════════════════════════════════
978
+ // S5 — DEMO MONITOR (plays demo.mp4 inside a bezel)
979
+ // ═══════════════════════════════════════════════════════════════
980
+
981
+ const Scene5: React.FC = () => {
982
+ const frame = useCurrentFrame();
983
+ const { fps } = useVideoConfig();
984
+
985
+ const titleOp = fadeIn(frame, 0, 10);
986
+ const titleY = interpolate(frame, [0, 15], [16, 0], {
987
+ extrapolateLeft: "clamp",
988
+ extrapolateRight: "clamp",
989
+ });
990
+
991
+ // Monitor entry
992
+ const monSpring = gs(frame, fps, 0.4, "snappy");
993
+ const monOp = interpolate(monSpring, [0, 0.4], [0, 1], {
994
+ extrapolateLeft: "clamp",
995
+ extrapolateRight: "clamp",
996
+ });
997
+ const monScale = interpolate(monSpring, [0, 1], [0.92, 1]);
998
+ const monY = interpolate(monSpring, [0, 1], [40, 0]);
999
+
1000
+ // Label chips stagger
1001
+ const labels = ["Agentic coding", "Computer use", "Knowledge work", "Science research"];
1002
+
1003
+ const exit = fadeOut(frame, SCENES.S5.dur - 15, 12);
1004
+
1005
+ return (
1006
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
1007
+ {/* Title */}
1008
+ <div
1009
+ style={{
1010
+ position: "absolute",
1011
+ top: SAFE_TOP + 10,
1012
+ left: SAFE_L,
1013
+ right: SAFE_R,
1014
+ opacity: titleOp,
1015
+ transform: `translateY(${titleY}px)`,
1016
+ }}
1017
+ >
1018
+ <div
1019
+ style={{
1020
+ fontFamily: MONO,
1021
+ fontSize: 20,
1022
+ fontWeight: 600,
1023
+ color: C.oai,
1024
+ letterSpacing: "0.14em",
1025
+ textTransform: "uppercase",
1026
+ marginBottom: 12,
1027
+ }}
1028
+ >
1029
+ Where the gains show up
1030
+ </div>
1031
+ <div
1032
+ style={{
1033
+ fontSize: 52,
1034
+ fontWeight: 700,
1035
+ color: C.fg,
1036
+ letterSpacing: "-0.035em",
1037
+ lineHeight: 1.0,
1038
+ }}
1039
+ >
1040
+ Operating software.
1041
+ <br />
1042
+ <span style={{ color: C.oai }}>Tool-first thinking.</span>
1043
+ </div>
1044
+ </div>
1045
+
1046
+ {/* Monitor */}
1047
+ <div
1048
+ style={{
1049
+ position: "absolute",
1050
+ top: 620,
1051
+ left: SAFE_L,
1052
+ right: SAFE_R,
1053
+ opacity: monOp,
1054
+ transform: `translateY(${monY}px) scale(${monScale})`,
1055
+ }}
1056
+ >
1057
+ <div
1058
+ style={{
1059
+ borderRadius: 20,
1060
+ overflow: "hidden",
1061
+ background: "#000",
1062
+ border: `1px solid ${C.borderLoud}`,
1063
+ boxShadow: `0 30px 80px -20px rgba(0,0,0,0.7), inset 0 1px 0 rgba(255,255,255,0.06)`,
1064
+ }}
1065
+ >
1066
+ {/* Chrome bar */}
1067
+ <div
1068
+ style={{
1069
+ height: 36,
1070
+ background: C.surface,
1071
+ display: "flex",
1072
+ alignItems: "center",
1073
+ gap: 8,
1074
+ padding: "0 16px",
1075
+ borderBottom: `1px solid ${C.border}`,
1076
+ }}
1077
+ >
1078
+ <div style={{ width: 10, height: 10, borderRadius: 5, background: "#ff5f56" }} />
1079
+ <div style={{ width: 10, height: 10, borderRadius: 5, background: "#ffbd2e" }} />
1080
+ <div style={{ width: 10, height: 10, borderRadius: 5, background: "#27c93f" }} />
1081
+ <div
1082
+ style={{
1083
+ marginLeft: 16,
1084
+ fontFamily: MONO,
1085
+ fontSize: 14,
1086
+ color: C.fgMuted,
1087
+ letterSpacing: "0.05em",
1088
+ }}
1089
+ >
1090
+ mission-control · live
1091
+ </div>
1092
+ </div>
1093
+ {/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
1094
+ </div>
1095
+ </div>
1096
+
1097
+ {/* Label chips */}
1098
+ <div
1099
+ style={{
1100
+ position: "absolute",
1101
+ bottom: H - SAFE_BOT_Y + 30,
1102
+ left: 0,
1103
+ right: 0,
1104
+ display: "flex",
1105
+ justifyContent: "center",
1106
+ flexWrap: "wrap",
1107
+ gap: 12,
1108
+ padding: `0 ${SAFE_L}px`,
1109
+ }}
1110
+ >
1111
+ {labels.map((l, i) => {
1112
+ const s = gs(frame, fps, 1.5 + i * 0.25, "snappy");
1113
+ const op = interpolate(s, [0, 0.4], [0, 1], {
1114
+ extrapolateLeft: "clamp",
1115
+ extrapolateRight: "clamp",
1116
+ });
1117
+ const yy = interpolate(s, [0, 1], [18, 0]);
1118
+ return (
1119
+ <div
1120
+ key={l}
1121
+ style={{
1122
+ opacity: op,
1123
+ transform: `translateY(${yy}px)`,
1124
+ padding: "12px 22px",
1125
+ borderRadius: 9999,
1126
+ background: "rgba(16,163,127,0.1)",
1127
+ border: `1px solid rgba(16,163,127,0.35)`,
1128
+ fontFamily: MONO,
1129
+ fontSize: 18,
1130
+ fontWeight: 600,
1131
+ color: C.oaiSoft,
1132
+ letterSpacing: "0.04em",
1133
+ textTransform: "uppercase",
1134
+ }}
1135
+ >
1136
+ {l}
1137
+ </div>
1138
+ );
1139
+ })}
1140
+ </div>
1141
+ </AbsoluteFill>
1142
+ );
1143
+ };
1144
+
1145
+ // ═══════════════════════════════════════════════════════════════
1146
+ // S6 — BROCKMAN QUOTE
1147
+ // ═══════════════════════════════════════════════════════════════
1148
+
1149
+ const Scene6: React.FC = () => {
1150
+ const frame = useCurrentFrame();
1151
+ const { fps } = useVideoConfig();
1152
+
1153
+ const quoteMarkSpring = gs(frame, fps, 0.1, "bouncy");
1154
+ const quoteMarkOp = interpolate(quoteMarkSpring, [0, 0.4], [0, 1], {
1155
+ extrapolateLeft: "clamp",
1156
+ extrapolateRight: "clamp",
1157
+ });
1158
+ const quoteMarkScale = interpolate(quoteMarkSpring, [0, 0.7, 1], [0.3, 1.15, 1]);
1159
+
1160
+ // Quote words staggered
1161
+ const words = [
1162
+ { t: "A", em: false },
1163
+ { t: "faster,", em: true },
1164
+ { t: "sharper", em: true },
1165
+ { t: "thinker", em: false },
1166
+ { t: "for", em: false },
1167
+ { t: "fewer", em: false },
1168
+ { t: "tokens.", em: false },
1169
+ ];
1170
+
1171
+ const attrOp = fadeIn(frame, 110, 14);
1172
+ const attrY = interpolate(frame, [110, 130], [16, 0], {
1173
+ extrapolateLeft: "clamp",
1174
+ extrapolateRight: "clamp",
1175
+ });
1176
+
1177
+ const exit = fadeOut(frame, SCENES.S6.dur - 15, 12);
1178
+
1179
+ return (
1180
+ <AbsoluteFill
1181
+ style={{
1182
+ fontFamily: FONT,
1183
+ opacity: exit,
1184
+ padding: `${SAFE_TOP}px ${SAFE_L}px ${H - SAFE_BOT_Y}px ${SAFE_L}px`,
1185
+ display: "flex",
1186
+ flexDirection: "column",
1187
+ justifyContent: "center",
1188
+ alignItems: "center",
1189
+ }}
1190
+ >
1191
+ {/* Giant quote mark */}
1192
+ <div
1193
+ style={{
1194
+ opacity: quoteMarkOp,
1195
+ transform: `scale(${quoteMarkScale})`,
1196
+ fontFamily: ds.font.serif,
1197
+ fontSize: 280,
1198
+ fontWeight: 700,
1199
+ color: C.oai,
1200
+ lineHeight: 0.6,
1201
+ marginBottom: 30,
1202
+ }}
1203
+ >
1204
+
1205
+ </div>
1206
+
1207
+ {/* Quote text — stagger words */}
1208
+ <div
1209
+ style={{
1210
+ display: "flex",
1211
+ flexWrap: "wrap",
1212
+ justifyContent: "center",
1213
+ gap: "0 0.3em",
1214
+ fontSize: 68,
1215
+ fontWeight: 500,
1216
+ color: C.fgSoft,
1217
+ letterSpacing: "-0.035em",
1218
+ lineHeight: 1.15,
1219
+ textAlign: "center",
1220
+ maxWidth: 960,
1221
+ }}
1222
+ >
1223
+ {words.map((w, i) => {
1224
+ const s = gs(frame, fps, 0.7 + i * 0.12, "snappy");
1225
+ const op = interpolate(s, [0, 0.4], [0, 1], {
1226
+ extrapolateLeft: "clamp",
1227
+ extrapolateRight: "clamp",
1228
+ });
1229
+ const y = interpolate(s, [0, 1], [30, 0]);
1230
+ return (
1231
+ <span
1232
+ key={`${w.t}-${i}`}
1233
+ style={{
1234
+ display: "inline-block",
1235
+ transform: `translateY(${y}px)`,
1236
+ opacity: op,
1237
+ color: w.em ? C.fg : C.fgSoft,
1238
+ fontWeight: w.em ? 800 : 500,
1239
+ }}
1240
+ >
1241
+ {w.t}
1242
+ </span>
1243
+ );
1244
+ })}
1245
+ </div>
1246
+
1247
+ {/* Attribution */}
1248
+ <div
1249
+ style={{
1250
+ marginTop: 60,
1251
+ opacity: attrOp,
1252
+ transform: `translateY(${attrY}px)`,
1253
+ display: "flex",
1254
+ alignItems: "center",
1255
+ gap: 16,
1256
+ }}
1257
+ >
1258
+ <div
1259
+ style={{
1260
+ width: 3,
1261
+ height: 40,
1262
+ background: C.oai,
1263
+ }}
1264
+ />
1265
+ <div>
1266
+ <div
1267
+ style={{
1268
+ fontSize: 26,
1269
+ fontWeight: 700,
1270
+ color: C.fg,
1271
+ letterSpacing: "-0.01em",
1272
+ }}
1273
+ >
1274
+ Greg Brockman
1275
+ </div>
1276
+ <div
1277
+ style={{
1278
+ fontFamily: MONO,
1279
+ fontSize: 16,
1280
+ fontWeight: 500,
1281
+ color: C.fgMuted,
1282
+ letterSpacing: "0.05em",
1283
+ textTransform: "uppercase",
1284
+ }}
1285
+ >
1286
+ President · OpenAI
1287
+ </div>
1288
+ </div>
1289
+ </div>
1290
+ </AbsoluteFill>
1291
+ );
1292
+ };
1293
+
1294
+ // ═══════════════════════════════════════════════════════════════
1295
+ // S7 — AGENT LOOP (PLAN → USE TOOLS → CHECK → KEEP GOING)
1296
+ // ═══════════════════════════════════════════════════════════════
1297
+
1298
+ const STEPS = ["Plan", "Use tools", "Check its work", "Keep going"];
1299
+
1300
+ const Scene7: React.FC = () => {
1301
+ const frame = useCurrentFrame();
1302
+ const { fps } = useVideoConfig();
1303
+
1304
+ const titleOp = fadeIn(frame, 0, 10);
1305
+ const titleY = interpolate(frame, [0, 15], [16, 0], {
1306
+ extrapolateLeft: "clamp",
1307
+ extrapolateRight: "clamp",
1308
+ });
1309
+
1310
+ const exit = fadeOut(frame, SCENES.S7.dur - 15, 12);
1311
+
1312
+ // Traveling dot 0..1 across steps
1313
+ const dotT = interpolate(frame, [60, SCENES.S7.dur - 30], [0, 1], {
1314
+ extrapolateLeft: "clamp",
1315
+ extrapolateRight: "clamp",
1316
+ });
1317
+ const activeIdx = Math.min(STEPS.length - 1, Math.floor(dotT * STEPS.length));
1318
+
1319
+ const stepStartY = 560;
1320
+ const stepGap = 150;
1321
+
1322
+ return (
1323
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
1324
+ <div
1325
+ style={{
1326
+ position: "absolute",
1327
+ top: SAFE_TOP + 10,
1328
+ left: SAFE_L,
1329
+ right: SAFE_R,
1330
+ opacity: titleOp,
1331
+ transform: `translateY(${titleY}px)`,
1332
+ }}
1333
+ >
1334
+ <div
1335
+ style={{
1336
+ fontFamily: MONO,
1337
+ fontSize: 20,
1338
+ fontWeight: 600,
1339
+ color: C.oai,
1340
+ letterSpacing: "0.14em",
1341
+ textTransform: "uppercase",
1342
+ marginBottom: 12,
1343
+ }}
1344
+ >
1345
+ Hand it a messy, multi-part task
1346
+ </div>
1347
+ <div
1348
+ style={{
1349
+ fontSize: 56,
1350
+ fontWeight: 700,
1351
+ color: C.fg,
1352
+ letterSpacing: "-0.035em",
1353
+ lineHeight: 1.0,
1354
+ }}
1355
+ >
1356
+ Trust the loop.
1357
+ </div>
1358
+ </div>
1359
+
1360
+ {/* Connector line */}
1361
+ <div
1362
+ style={{
1363
+ position: "absolute",
1364
+ left: 170,
1365
+ top: stepStartY + 50,
1366
+ width: 3,
1367
+ height: stepGap * (STEPS.length - 1),
1368
+ background: `linear-gradient(180deg, ${C.border} 0%, ${C.borderLoud} 100%)`,
1369
+ }}
1370
+ />
1371
+ {/* Traveling active segment */}
1372
+ <div
1373
+ style={{
1374
+ position: "absolute",
1375
+ left: 170,
1376
+ top: stepStartY + 50,
1377
+ width: 3,
1378
+ height: stepGap * (STEPS.length - 1),
1379
+ background: C.oai,
1380
+ boxShadow: `0 0 16px ${C.oai}`,
1381
+ transform: `scaleY(${dotT})`,
1382
+ transformOrigin: "top center",
1383
+ willChange: "transform",
1384
+ }}
1385
+ />
1386
+
1387
+ {/* Steps */}
1388
+ {STEPS.map((step, i) => {
1389
+ const inSpring = gs(frame, fps, 0.3 + i * 0.2, "snappy");
1390
+ const op = interpolate(inSpring, [0, 0.4], [0, 1], {
1391
+ extrapolateLeft: "clamp",
1392
+ extrapolateRight: "clamp",
1393
+ });
1394
+ const x = interpolate(inSpring, [0, 1], [40, 0]);
1395
+ const isActive = i <= activeIdx;
1396
+ const isPulse = i === activeIdx;
1397
+ const pulseScale = isPulse ? 1 + Math.sin(frame * 0.18) * 0.03 : 1;
1398
+
1399
+ return (
1400
+ <div
1401
+ key={step}
1402
+ style={{
1403
+ position: "absolute",
1404
+ top: stepStartY + i * stepGap,
1405
+ left: SAFE_L,
1406
+ right: SAFE_R,
1407
+ opacity: op,
1408
+ transform: `translateX(${x}px)`,
1409
+ display: "flex",
1410
+ alignItems: "center",
1411
+ gap: 32,
1412
+ }}
1413
+ >
1414
+ {/* Dot */}
1415
+ <div
1416
+ style={{
1417
+ width: 100,
1418
+ height: 100,
1419
+ borderRadius: "50%",
1420
+ border: `3px solid ${isActive ? C.oai : C.borderLoud}`,
1421
+ background: isActive ? `rgba(16,163,127,0.18)` : C.surface,
1422
+ display: "flex",
1423
+ alignItems: "center",
1424
+ justifyContent: "center",
1425
+ fontFamily: MONO,
1426
+ fontSize: 28,
1427
+ fontWeight: 700,
1428
+ color: isActive ? C.oaiSoft : C.fgMuted,
1429
+ flexShrink: 0,
1430
+ transform: `scale(${pulseScale})`,
1431
+ boxShadow: isActive
1432
+ ? `0 0 30px -5px rgba(16,163,127,0.55), inset 0 1px 0 rgba(255,255,255,0.06)`
1433
+ : "inset 0 1px 0 rgba(255,255,255,0.04)",
1434
+ }}
1435
+ >
1436
+ 0{i + 1}
1437
+ </div>
1438
+
1439
+ {/* Label */}
1440
+ <div
1441
+ style={{
1442
+ fontSize: 56,
1443
+ fontWeight: 700,
1444
+ color: isActive ? C.fg : C.fgDim,
1445
+ letterSpacing: "-0.03em",
1446
+ transition: "color 0.3s",
1447
+ }}
1448
+ >
1449
+ {step}
1450
+ {i === STEPS.length - 1 && isPulse ? (
1451
+ <span
1452
+ style={{
1453
+ color: C.oai,
1454
+ marginLeft: 8,
1455
+ display: "inline-block",
1456
+ animation: "blink 0.8s infinite",
1457
+ }}
1458
+ >
1459
+
1460
+ </span>
1461
+ ) : null}
1462
+ </div>
1463
+ </div>
1464
+ );
1465
+ })}
1466
+ </AbsoluteFill>
1467
+ );
1468
+ };
1469
+
1470
+ // ═══════════════════════════════════════════════════════════════
1471
+ // S8 — THE SPEED WIN (bar race)
1472
+ // ═══════════════════════════════════════════════════════════════
1473
+
1474
+ type Metric = {
1475
+ label: string;
1476
+ subA: string;
1477
+ subB: string;
1478
+ valA: number; // relative, 0..1
1479
+ valB: number;
1480
+ delta: string;
1481
+ deltaKind: "same" | "up" | "down";
1482
+ };
1483
+
1484
+ const METRICS: Metric[] = [
1485
+ { label: "Per-token latency", subA: "GPT-5.4", subB: "GPT-5.5", valA: 0.92, valB: 0.92, delta: "IDENTICAL", deltaKind: "same" },
1486
+ { label: "Output quality", subA: "GPT-5.4", subB: "GPT-5.5", valA: 0.62, valB: 0.88, delta: "+42%", deltaKind: "up" },
1487
+ { label: "Tokens used", subA: "GPT-5.4", subB: "GPT-5.5", valA: 0.88, valB: 0.55, delta: "−38%", deltaKind: "down" },
1488
+ { label: "Retries", subA: "GPT-5.4", subB: "GPT-5.5", valA: 0.80, valB: 0.28, delta: "−65%", deltaKind: "down" },
1489
+ ];
1490
+
1491
+ const Scene8: React.FC = () => {
1492
+ const frame = useCurrentFrame();
1493
+ const { fps } = useVideoConfig();
1494
+
1495
+ const titleOp = fadeIn(frame, 0, 10);
1496
+ const titleY = interpolate(frame, [0, 15], [16, 0], {
1497
+ extrapolateLeft: "clamp",
1498
+ extrapolateRight: "clamp",
1499
+ });
1500
+
1501
+ const exit = fadeOut(frame, SCENES.S8.dur - 15, 12);
1502
+
1503
+ return (
1504
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
1505
+ <div
1506
+ style={{
1507
+ position: "absolute",
1508
+ top: SAFE_TOP + 10,
1509
+ left: SAFE_L,
1510
+ right: SAFE_R,
1511
+ opacity: titleOp,
1512
+ transform: `translateY(${titleY}px)`,
1513
+ }}
1514
+ >
1515
+ <div
1516
+ style={{
1517
+ fontFamily: MONO,
1518
+ fontSize: 20,
1519
+ fontWeight: 600,
1520
+ color: C.warn,
1521
+ letterSpacing: "0.14em",
1522
+ textTransform: "uppercase",
1523
+ marginBottom: 12,
1524
+ }}
1525
+ >
1526
+ Genuinely impressive
1527
+ </div>
1528
+ <div
1529
+ style={{
1530
+ fontSize: 56,
1531
+ fontWeight: 700,
1532
+ color: C.fg,
1533
+ letterSpacing: "-0.035em",
1534
+ lineHeight: 1.0,
1535
+ }}
1536
+ >
1537
+ Same speed.
1538
+ <br />
1539
+ <span style={{ color: C.oai }}>Better everything.</span>
1540
+ </div>
1541
+ </div>
1542
+
1543
+ {/* Bars */}
1544
+ <div
1545
+ style={{
1546
+ position: "absolute",
1547
+ top: 540,
1548
+ left: SAFE_L,
1549
+ right: SAFE_R,
1550
+ display: "flex",
1551
+ flexDirection: "column",
1552
+ gap: 32,
1553
+ }}
1554
+ >
1555
+ {METRICS.map((m, i) => {
1556
+ const inS = gs(frame, fps, 0.5 + i * 0.5, "snappy");
1557
+ const op = interpolate(inS, [0, 0.4], [0, 1], {
1558
+ extrapolateLeft: "clamp",
1559
+ extrapolateRight: "clamp",
1560
+ });
1561
+ const y = interpolate(inS, [0, 1], [20, 0]);
1562
+
1563
+ // Bars animate width
1564
+ const barT = interpolate(frame, [15 + i * 15, 60 + i * 15], [0, 1], {
1565
+ extrapolateLeft: "clamp",
1566
+ extrapolateRight: "clamp",
1567
+ easing: Easing.bezier(...ds.easing.standard),
1568
+ });
1569
+ const barAW = m.valA * barT * 100;
1570
+ const barBW = m.valB * barT * 100;
1571
+
1572
+ const deltaColor =
1573
+ m.deltaKind === "same" ? C.warn : m.deltaKind === "up" ? C.oai : C.red;
1574
+
1575
+ return (
1576
+ <div
1577
+ key={m.label}
1578
+ style={{
1579
+ opacity: op,
1580
+ transform: `translateY(${y}px)`,
1581
+ padding: "20px 24px",
1582
+ borderRadius: 18,
1583
+ background: C.surface,
1584
+ border: `1px solid ${C.border}`,
1585
+ boxShadow: `inset 0 1px 0 rgba(255,255,255,0.04)`,
1586
+ }}
1587
+ >
1588
+ {/* Header: label + delta */}
1589
+ <div
1590
+ style={{
1591
+ display: "flex",
1592
+ justifyContent: "space-between",
1593
+ alignItems: "center",
1594
+ marginBottom: 14,
1595
+ }}
1596
+ >
1597
+ <div
1598
+ style={{
1599
+ fontSize: 30,
1600
+ fontWeight: 700,
1601
+ color: C.fg,
1602
+ letterSpacing: "-0.02em",
1603
+ }}
1604
+ >
1605
+ {m.label}
1606
+ </div>
1607
+ <div
1608
+ style={{
1609
+ padding: "6px 14px",
1610
+ borderRadius: 9999,
1611
+ background: `rgba(${m.deltaKind === "same" ? "252,187,0" : m.deltaKind === "up" ? "16,163,127" : "255,59,70"},0.15)`,
1612
+ border: `1px solid ${deltaColor}`,
1613
+ fontFamily: MONO,
1614
+ fontSize: 18,
1615
+ fontWeight: 700,
1616
+ color: deltaColor,
1617
+ letterSpacing: "0.04em",
1618
+ }}
1619
+ >
1620
+ {m.delta}
1621
+ </div>
1622
+ </div>
1623
+
1624
+ {/* Bar A (5.4) */}
1625
+ <div style={{ marginBottom: 8 }}>
1626
+ <div
1627
+ style={{
1628
+ display: "flex",
1629
+ alignItems: "center",
1630
+ gap: 12,
1631
+ }}
1632
+ >
1633
+ <div
1634
+ style={{
1635
+ width: 80,
1636
+ fontFamily: MONO,
1637
+ fontSize: 14,
1638
+ fontWeight: 500,
1639
+ color: C.fgMuted,
1640
+ letterSpacing: "0.05em",
1641
+ }}
1642
+ >
1643
+ {m.subA}
1644
+ </div>
1645
+ <div style={{ flex: 1, height: 14, background: "rgba(255,255,255,0.05)", borderRadius: 7, overflow: "hidden" }}>
1646
+ <div
1647
+ style={{
1648
+ height: "100%",
1649
+ width: `${barAW}%`,
1650
+ background: C.fgDim,
1651
+ borderRadius: 7,
1652
+ }}
1653
+ />
1654
+ </div>
1655
+ </div>
1656
+ </div>
1657
+ {/* Bar B (5.5) */}
1658
+ <div
1659
+ style={{
1660
+ display: "flex",
1661
+ alignItems: "center",
1662
+ gap: 12,
1663
+ }}
1664
+ >
1665
+ <div
1666
+ style={{
1667
+ width: 80,
1668
+ fontFamily: MONO,
1669
+ fontSize: 14,
1670
+ fontWeight: 600,
1671
+ color: C.oaiSoft,
1672
+ letterSpacing: "0.05em",
1673
+ }}
1674
+ >
1675
+ {m.subB}
1676
+ </div>
1677
+ <div style={{ flex: 1, height: 14, background: "rgba(255,255,255,0.05)", borderRadius: 7, overflow: "hidden" }}>
1678
+ <div
1679
+ style={{
1680
+ height: "100%",
1681
+ width: `${barBW}%`,
1682
+ background: `linear-gradient(90deg, ${C.oai}, ${C.oaiSoft})`,
1683
+ borderRadius: 7,
1684
+ boxShadow: `0 0 20px rgba(16,163,127,0.4)`,
1685
+ }}
1686
+ />
1687
+ </div>
1688
+ </div>
1689
+ </div>
1690
+ );
1691
+ })}
1692
+ </div>
1693
+ </AbsoluteFill>
1694
+ );
1695
+ };
1696
+
1697
+ // ═══════════════════════════════════════════════════════════════
1698
+ // S9 — RARE COMBO + benchmark stats
1699
+ // ═══════════════════════════════════════════════════════════════
1700
+
1701
+ const Scene9: React.FC = () => {
1702
+ const frame = useCurrentFrame();
1703
+ const { fps } = useVideoConfig();
1704
+
1705
+ const titleOp = fadeIn(frame, 0, 10);
1706
+ const titleY = interpolate(frame, [0, 15], [20, 0], {
1707
+ extrapolateLeft: "clamp",
1708
+ extrapolateRight: "clamp",
1709
+ });
1710
+
1711
+ // Equation entries
1712
+ const eq1S = gs(frame, fps, 0.5, "bouncy");
1713
+ const eq2S = gs(frame, fps, 1.0, "bouncy");
1714
+ const eq3S = gs(frame, fps, 1.5, "bouncy");
1715
+
1716
+ // Stats image slides in
1717
+ const statsS = gs(frame, fps, 2.0, "snappy");
1718
+ const statsOp = interpolate(statsS, [0, 0.4], [0, 1], {
1719
+ extrapolateLeft: "clamp",
1720
+ extrapolateRight: "clamp",
1721
+ });
1722
+ const statsY = interpolate(statsS, [0, 1], [40, 0]);
1723
+
1724
+ // Final punch "rare."
1725
+ const rareS = gs(frame, fps, 6.0, "bouncy");
1726
+ const rareOp = interpolate(rareS, [0, 0.4], [0, 1], {
1727
+ extrapolateLeft: "clamp",
1728
+ extrapolateRight: "clamp",
1729
+ });
1730
+ const rareScale = interpolate(rareS, [0, 0.6, 1], [0.5, 1.15, 1]);
1731
+ const rareGlow = 0.3 + Math.sin(frame * 0.14) * 0.15;
1732
+
1733
+ const exit = fadeOut(frame, SCENES.S9.dur - 15, 12);
1734
+
1735
+ const EqCell: React.FC<{
1736
+ s: number;
1737
+ label: string;
1738
+ arrow: string;
1739
+ color: string;
1740
+ }> = ({ s, label, arrow, color }) => {
1741
+ const op = interpolate(s, [0, 0.4], [0, 1], {
1742
+ extrapolateLeft: "clamp",
1743
+ extrapolateRight: "clamp",
1744
+ });
1745
+ const sc = interpolate(s, [0, 0.6, 1], [0.6, 1.1, 1]);
1746
+ return (
1747
+ <div
1748
+ style={{
1749
+ opacity: op,
1750
+ transform: `scale(${sc})`,
1751
+ padding: "20px 16px",
1752
+ borderRadius: 16,
1753
+ background: C.surface,
1754
+ border: `1px solid ${C.border}`,
1755
+ textAlign: "center",
1756
+ flex: 1,
1757
+ }}
1758
+ >
1759
+ <div
1760
+ style={{
1761
+ fontFamily: MONO,
1762
+ fontSize: 14,
1763
+ fontWeight: 600,
1764
+ color: C.fgMuted,
1765
+ letterSpacing: "0.1em",
1766
+ textTransform: "uppercase",
1767
+ marginBottom: 8,
1768
+ }}
1769
+ >
1770
+ {label}
1771
+ </div>
1772
+ <div
1773
+ style={{
1774
+ fontSize: 64,
1775
+ fontWeight: 800,
1776
+ color,
1777
+ lineHeight: 1,
1778
+ letterSpacing: "-0.04em",
1779
+ }}
1780
+ >
1781
+ {arrow}
1782
+ </div>
1783
+ </div>
1784
+ );
1785
+ };
1786
+
1787
+ return (
1788
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
1789
+ {/* Title */}
1790
+ <div
1791
+ style={{
1792
+ position: "absolute",
1793
+ top: SAFE_TOP + 10,
1794
+ left: SAFE_L,
1795
+ right: SAFE_R,
1796
+ opacity: titleOp,
1797
+ transform: `translateY(${titleY}px)`,
1798
+ }}
1799
+ >
1800
+ <div
1801
+ style={{
1802
+ fontFamily: MONO,
1803
+ fontSize: 20,
1804
+ fontWeight: 600,
1805
+ color: C.warn,
1806
+ letterSpacing: "0.14em",
1807
+ textTransform: "uppercase",
1808
+ marginBottom: 12,
1809
+ }}
1810
+ >
1811
+ Efficiency win
1812
+ </div>
1813
+ <div
1814
+ style={{
1815
+ fontSize: 54,
1816
+ fontWeight: 700,
1817
+ color: C.fg,
1818
+ letterSpacing: "-0.035em",
1819
+ lineHeight: 1.0,
1820
+ }}
1821
+ >
1822
+ Capability up.
1823
+ <br />
1824
+ Cost down.
1825
+ </div>
1826
+ </div>
1827
+
1828
+ {/* Equation row */}
1829
+ <div
1830
+ style={{
1831
+ position: "absolute",
1832
+ top: 540,
1833
+ left: SAFE_L,
1834
+ right: SAFE_R,
1835
+ display: "flex",
1836
+ gap: 14,
1837
+ }}
1838
+ >
1839
+ <EqCell s={eq1S} label="Capability" arrow="↑" color={C.oai} />
1840
+ <EqCell s={eq2S} label="Speed" arrow="=" color={C.warn} />
1841
+ <EqCell s={eq3S} label="Cost" arrow="↓" color={C.oaiSoft} />
1842
+ </div>
1843
+
1844
+ {/* Stats table image */}
1845
+ <div
1846
+ style={{
1847
+ position: "absolute",
1848
+ top: 800,
1849
+ left: SAFE_L,
1850
+ right: SAFE_R,
1851
+ opacity: statsOp,
1852
+ transform: `translateY(${statsY}px)`,
1853
+ }}
1854
+ >
1855
+ <div
1856
+ style={{
1857
+ borderRadius: 20,
1858
+ overflow: "hidden",
1859
+ background: "#000",
1860
+ border: `1px solid ${C.border}`,
1861
+ boxShadow: `0 30px 60px -20px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.04)`,
1862
+ }}
1863
+ >
1864
+ <Img
1865
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
1866
+ style={{ width: "100%", display: "block", objectFit: "contain", padding: 12 }}
1867
+ />
1868
+ </div>
1869
+ </div>
1870
+
1871
+ {/* "That's rare." punch */}
1872
+ <div
1873
+ style={{
1874
+ position: "absolute",
1875
+ bottom: H - SAFE_BOT_Y + 20,
1876
+ left: 0,
1877
+ right: 0,
1878
+ textAlign: "center",
1879
+ opacity: rareOp,
1880
+ transform: `scale(${rareScale})`,
1881
+ }}
1882
+ >
1883
+ <div
1884
+ style={{
1885
+ display: "inline-block",
1886
+ fontSize: 78,
1887
+ fontWeight: 800,
1888
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiSoft})`,
1889
+ WebkitBackgroundClip: "text",
1890
+ backgroundClip: "text",
1891
+ WebkitTextFillColor: "transparent",
1892
+ letterSpacing: "-0.05em",
1893
+ filter: `drop-shadow(0 0 30px rgba(16,163,127,${rareGlow}))`,
1894
+ }}
1895
+ >
1896
+ That's rare.
1897
+ </div>
1898
+ </div>
1899
+ </AbsoluteFill>
1900
+ );
1901
+ };
1902
+
1903
+ // ═══════════════════════════════════════════════════════════════
1904
+ // S10 — CURIOUS TAKE
1905
+ // ═══════════════════════════════════════════════════════════════
1906
+
1907
+ const Scene10: React.FC = () => {
1908
+ const frame = useCurrentFrame();
1909
+ const { fps } = useVideoConfig();
1910
+
1911
+ const line1 = fadeIn(frame, 0, 14);
1912
+ const line1Y = interpolate(frame, [0, 18], [40, 0], {
1913
+ extrapolateLeft: "clamp",
1914
+ extrapolateRight: "clamp",
1915
+ });
1916
+
1917
+ const line2 = fadeIn(frame, 30, 14);
1918
+ const line2Y = interpolate(frame, [30, 48], [40, 0], {
1919
+ extrapolateLeft: "clamp",
1920
+ extrapolateRight: "clamp",
1921
+ });
1922
+
1923
+ // Marquee scroll
1924
+ const marqueeX = interpolate(frame, [45, SCENES.S10.dur], [W, -W * 1.2], {
1925
+ extrapolateLeft: "clamp",
1926
+ });
1927
+
1928
+ const dates = [
1929
+ "APR 24",
1930
+ "APR 25",
1931
+ "APR 26",
1932
+ "APR 27",
1933
+ "APR 28",
1934
+ "MAY 01",
1935
+ "MAY 05",
1936
+ "MAY 10",
1937
+ "MAY 15",
1938
+ ];
1939
+
1940
+ const exit = fadeOut(frame, SCENES.S10.dur - 15, 12);
1941
+
1942
+ return (
1943
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
1944
+ <div
1945
+ style={{
1946
+ position: "absolute",
1947
+ top: 700,
1948
+ left: SAFE_L,
1949
+ right: SAFE_R,
1950
+ textAlign: "center",
1951
+ }}
1952
+ >
1953
+ <div
1954
+ style={{
1955
+ opacity: line1,
1956
+ transform: `translateY(${line1Y}px)`,
1957
+ fontFamily: MONO,
1958
+ fontSize: 22,
1959
+ fontWeight: 600,
1960
+ color: C.oai,
1961
+ letterSpacing: "0.14em",
1962
+ textTransform: "uppercase",
1963
+ marginBottom: 24,
1964
+ }}
1965
+ >
1966
+ The next few weeks
1967
+ </div>
1968
+ <div
1969
+ style={{
1970
+ opacity: line2,
1971
+ transform: `translateY(${line2Y}px)`,
1972
+ fontSize: 70,
1973
+ fontWeight: 700,
1974
+ color: C.fg,
1975
+ letterSpacing: "-0.04em",
1976
+ lineHeight: 1.05,
1977
+ }}
1978
+ >
1979
+ Let's see what
1980
+ <br />
1981
+ people <span style={{ color: C.oai }}>build.</span>
1982
+ </div>
1983
+ </div>
1984
+
1985
+ {/* Date marquee */}
1986
+ <div
1987
+ style={{
1988
+ position: "absolute",
1989
+ bottom: H - SAFE_BOT_Y + 40,
1990
+ left: 0,
1991
+ right: 0,
1992
+ height: 80,
1993
+ overflow: "hidden",
1994
+ }}
1995
+ >
1996
+ <div
1997
+ style={{
1998
+ position: "absolute",
1999
+ top: 0,
2000
+ left: 0,
2001
+ display: "flex",
2002
+ gap: 22,
2003
+ whiteSpace: "nowrap",
2004
+ transform: `translateX(${marqueeX}px)`,
2005
+ willChange: "transform",
2006
+ }}
2007
+ >
2008
+ {dates.map((d, i) => (
2009
+ <div
2010
+ key={`${d}-${i}`}
2011
+ style={{
2012
+ padding: "16px 28px",
2013
+ borderRadius: 9999,
2014
+ background: i === 0 ? `rgba(16,163,127,0.18)` : C.surface,
2015
+ border: `1px solid ${i === 0 ? C.oai : C.border}`,
2016
+ fontFamily: MONO,
2017
+ fontSize: 26,
2018
+ fontWeight: 700,
2019
+ color: i === 0 ? C.oaiSoft : C.fgMuted,
2020
+ letterSpacing: "0.1em",
2021
+ }}
2022
+ >
2023
+ {d}
2024
+ </div>
2025
+ ))}
2026
+ </div>
2027
+ </div>
2028
+ </AbsoluteFill>
2029
+ );
2030
+ };
2031
+
2032
+ // ═══════════════════════════════════════════════════════════════
2033
+ // S11 — ANTHROPIC BEAT (split + sharper moment)
2034
+ // ═══════════════════════════════════════════════════════════════
2035
+
2036
+ const Scene11: React.FC = () => {
2037
+ const frame = useCurrentFrame();
2038
+ const { fps } = useVideoConfig();
2039
+
2040
+ // Split-in: left (Anthropic) slides from left, right (OpenAI) from right
2041
+ const splitS = gs(frame, fps, 0.1, "snappy");
2042
+ const leftX = interpolate(splitS, [0, 1], [-W / 2, 0]);
2043
+ const rightX = interpolate(splitS, [0, 1], [W / 2, 0]);
2044
+
2045
+ // Mythos line
2046
+ const mythosOp = fadeIn(frame, 55, 14);
2047
+ const mythosY = interpolate(frame, [55, 75], [20, 0], {
2048
+ extrapolateLeft: "clamp",
2049
+ extrapolateRight: "clamp",
2050
+ });
2051
+ // red underline draw
2052
+ const mythosU = interpolate(frame, [85, 115], [0, 1], {
2053
+ extrapolateLeft: "clamp",
2054
+ extrapolateRight: "clamp",
2055
+ });
2056
+
2057
+ // SHARPER MOMENT final
2058
+ const sharpS = gs(frame, fps, 4.4, "bouncy");
2059
+ const sharpOp = interpolate(sharpS, [0, 0.4], [0, 1], {
2060
+ extrapolateLeft: "clamp",
2061
+ extrapolateRight: "clamp",
2062
+ });
2063
+ const sharpScale = interpolate(sharpS, [0, 0.5, 1], [0.4, 1.2, 1.05]);
2064
+ const sharpGlow = 0.4 + Math.sin(frame * 0.14) * 0.15;
2065
+
2066
+ const exit = fadeOut(frame, SCENES.S11.dur - 15, 12);
2067
+
2068
+ return (
2069
+ <AbsoluteFill style={{ fontFamily: FONT, opacity: exit }}>
2070
+ {/* SPLIT LOGOS row */}
2071
+ <div
2072
+ style={{
2073
+ position: "absolute",
2074
+ top: 340,
2075
+ left: 0,
2076
+ right: 0,
2077
+ height: 280,
2078
+ display: "flex",
2079
+ }}
2080
+ >
2081
+ {/* Anthropic panel */}
2082
+ <div
2083
+ style={{
2084
+ flex: 1,
2085
+ display: "flex",
2086
+ flexDirection: "column",
2087
+ alignItems: "center",
2088
+ justifyContent: "center",
2089
+ gap: 16,
2090
+ transform: `translateX(${leftX}px)`,
2091
+ background: `linear-gradient(135deg, rgba(245,161,126,0.08), rgba(245,161,126,0.02))`,
2092
+ borderRight: `1px solid ${C.border}`,
2093
+ padding: "20px 40px",
2094
+ }}
2095
+ >
2096
+ <div
2097
+ style={{
2098
+ color: "#f5a17e",
2099
+ width: 240,
2100
+ height: 48,
2101
+ display: "flex",
2102
+ alignItems: "center",
2103
+ justifyContent: "center",
2104
+ }}
2105
+ >
2106
+ <Img
2107
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
2108
+ style={{
2109
+ width: "100%",
2110
+ height: "100%",
2111
+ objectFit: "contain",
2112
+ filter: "brightness(0) invert(1) sepia(1) saturate(3) hue-rotate(340deg)",
2113
+ }}
2114
+ />
2115
+ </div>
2116
+ <div
2117
+ style={{
2118
+ fontFamily: MONO,
2119
+ fontSize: 14,
2120
+ fontWeight: 600,
2121
+ color: "#f5a17e",
2122
+ letterSpacing: "0.12em",
2123
+ textTransform: "uppercase",
2124
+ opacity: 0.75,
2125
+ }}
2126
+ >
2127
+ dealing with Mythos
2128
+ </div>
2129
+ </div>
2130
+
2131
+ {/* OpenAI panel */}
2132
+ <div
2133
+ style={{
2134
+ flex: 1,
2135
+ display: "flex",
2136
+ flexDirection: "column",
2137
+ alignItems: "center",
2138
+ justifyContent: "center",
2139
+ gap: 16,
2140
+ transform: `translateX(${rightX}px)`,
2141
+ background: `linear-gradient(135deg, rgba(16,163,127,0.12), rgba(16,163,127,0.02))`,
2142
+ padding: "20px 40px",
2143
+ }}
2144
+ >
2145
+ <div
2146
+ style={{
2147
+ color: C.oai,
2148
+ width: 80,
2149
+ height: 80,
2150
+ }}
2151
+ >
2152
+ <Img
2153
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
2154
+ style={{
2155
+ width: "100%",
2156
+ height: "100%",
2157
+ objectFit: "contain",
2158
+ filter: "invert(1)",
2159
+ }}
2160
+ />
2161
+ </div>
2162
+ <div
2163
+ style={{
2164
+ fontFamily: MONO,
2165
+ fontSize: 14,
2166
+ fontWeight: 600,
2167
+ color: C.oaiSoft,
2168
+ letterSpacing: "0.12em",
2169
+ textTransform: "uppercase",
2170
+ }}
2171
+ >
2172
+ shipping GPT-5.5
2173
+ </div>
2174
+ </div>
2175
+ </div>
2176
+
2177
+ {/* Subtext */}
2178
+ <div
2179
+ style={{
2180
+ position: "absolute",
2181
+ top: 680,
2182
+ left: SAFE_L,
2183
+ right: SAFE_R,
2184
+ textAlign: "center",
2185
+ opacity: mythosOp,
2186
+ transform: `translateY(${mythosY}px)`,
2187
+ fontSize: 42,
2188
+ fontWeight: 500,
2189
+ color: C.fgSoft,
2190
+ letterSpacing: "-0.02em",
2191
+ lineHeight: 1.25,
2192
+ }}
2193
+ >
2194
+ Given everything Anthropic's been dealing with around{" "}
2195
+ <span style={{ position: "relative", color: C.fg, fontWeight: 700 }}>
2196
+ Mythos
2197
+ <span
2198
+ style={{
2199
+ position: "absolute",
2200
+ bottom: -6,
2201
+ left: 0,
2202
+ height: 5,
2203
+ width: "100%",
2204
+ background: C.red,
2205
+ borderRadius: 3,
2206
+ boxShadow: `0 0 12px ${C.red}`,
2207
+ transform: `scaleX(${mythosU})`,
2208
+ transformOrigin: "left center",
2209
+ willChange: "transform",
2210
+ }}
2211
+ />
2212
+ </span>{" "}
2213
+ lately…
2214
+ </div>
2215
+
2216
+ {/* SHARPER MOMENT big close */}
2217
+ <div
2218
+ style={{
2219
+ position: "absolute",
2220
+ bottom: H - SAFE_BOT_Y + 40,
2221
+ left: 0,
2222
+ right: 0,
2223
+ textAlign: "center",
2224
+ opacity: sharpOp,
2225
+ transform: `scale(${sharpScale})`,
2226
+ }}
2227
+ >
2228
+ <div
2229
+ style={{
2230
+ fontFamily: MONO,
2231
+ fontSize: 18,
2232
+ fontWeight: 600,
2233
+ color: C.fgMuted,
2234
+ letterSpacing: "0.14em",
2235
+ textTransform: "uppercase",
2236
+ marginBottom: 10,
2237
+ }}
2238
+ >
2239
+ OpenAI picked a
2240
+ </div>
2241
+ <div
2242
+ style={{
2243
+ fontSize: 120,
2244
+ fontWeight: 900,
2245
+ background: `linear-gradient(135deg, ${C.oai}, ${C.oaiSoft})`,
2246
+ WebkitBackgroundClip: "text",
2247
+ backgroundClip: "text",
2248
+ WebkitTextFillColor: "transparent",
2249
+ letterSpacing: "-0.05em",
2250
+ lineHeight: 0.95,
2251
+ filter: `drop-shadow(0 0 40px rgba(16,163,127,${sharpGlow}))`,
2252
+ }}
2253
+ >
2254
+ SHARPER
2255
+ <br />
2256
+ MOMENT.
2257
+ </div>
2258
+ </div>
2259
+ </AbsoluteFill>
2260
+ );
2261
+ };
2262
+
2263
+ // ═══════════════════════════════════════════════════════════════
2264
+ // S12 — LIKE + SUBSCRIBE CTA
2265
+ // ═══════════════════════════════════════════════════════════════
2266
+
2267
+ const Scene12: React.FC = () => {
2268
+ const frame = useCurrentFrame();
2269
+ const { fps } = useVideoConfig();
2270
+ const f = frame;
2271
+
2272
+ const heroWords = ["Follow", "for", "more"];
2273
+
2274
+ const belowSpring = gs(f, fps, 1.0, "bouncy");
2275
+ const belowOp = interpolate(belowSpring, [0, 0.4], [0, 1], {
2276
+ extrapolateLeft: "clamp",
2277
+ extrapolateRight: "clamp",
2278
+ });
2279
+ const belowScale = interpolate(belowSpring, [0, 0.6, 1], [0.6, 1.15, 1]);
2280
+
2281
+ const likeSpring = gs(f, fps, 1.8, "snappy");
2282
+ const subSpring = gs(f, fps, 2.1, "snappy");
2283
+
2284
+ const likeOp = interpolate(likeSpring, [0, 0.4], [0, 1], {
2285
+ extrapolateLeft: "clamp",
2286
+ extrapolateRight: "clamp",
2287
+ });
2288
+ const likeY = interpolate(likeSpring, [0, 1], [22, 0]);
2289
+
2290
+ const subOp = interpolate(subSpring, [0, 0.4], [0, 1], {
2291
+ extrapolateLeft: "clamp",
2292
+ extrapolateRight: "clamp",
2293
+ });
2294
+ const subY = interpolate(subSpring, [0, 1], [22, 0]);
2295
+
2296
+ const subGlow = 0.4 + Math.sin(f * 0.15) * 0.2;
2297
+
2298
+ const heartFilled = f > 2.8 * fps;
2299
+ const heartScaleSpring = gs(f, fps, 2.8, "bouncy");
2300
+ const heartScale = interpolate(heartScaleSpring, [0, 0.5, 1], [1, 1.4, 1.1]);
2301
+
2302
+ const subActive = f > 3.3 * fps;
2303
+ const bellRingT = interpolate(f, [3.3 * fps, 4.0 * fps], [0, 1], {
2304
+ extrapolateLeft: "clamp",
2305
+ extrapolateRight: "clamp",
2306
+ });
2307
+ const bellTilt = Math.sin(bellRingT * Math.PI * 4) * (1 - bellRingT) * 14;
2308
+
2309
+ // Particle burst when heart fills
2310
+ const particleT = interpolate(f, [2.8 * fps, 3.8 * fps], [0, 1], {
2311
+ extrapolateLeft: "clamp",
2312
+ extrapolateRight: "clamp",
2313
+ });
2314
+
2315
+ // Handle
2316
+ const handleOp = fadeIn(f, 4.3 * fps, 12);
2317
+
2318
+ return (
2319
+ <AbsoluteFill style={{ fontFamily: FONT, backgroundColor: C.bg }}>
2320
+ <Background frame={frame} tint="yt" />
2321
+
2322
+ <div
2323
+ style={{
2324
+ position: "absolute",
2325
+ top: SAFE_TOP,
2326
+ left: SAFE_L,
2327
+ right: SAFE_R,
2328
+ bottom: H - SAFE_BOT_Y,
2329
+ }}
2330
+ >
2331
+ {/* HERO HEADLINE */}
2332
+ <div
2333
+ style={{
2334
+ position: "absolute",
2335
+ top: 40,
2336
+ width: "100%",
2337
+ display: "flex",
2338
+ flexWrap: "wrap",
2339
+ gap: "0 0.32em",
2340
+ justifyContent: "center",
2341
+ fontSize: 96,
2342
+ fontWeight: 700,
2343
+ color: C.fg,
2344
+ letterSpacing: "-0.04em",
2345
+ lineHeight: 1.0,
2346
+ textAlign: "center",
2347
+ }}
2348
+ >
2349
+ {heroWords.map((w, i) => {
2350
+ const s = gs(f, fps, 0.1 + i * 0.08, "snappy");
2351
+ const y = interpolate(s, [0, 1], [40, 0]);
2352
+ const op = interpolate(s, [0, 0.4], [0, 1], {
2353
+ extrapolateLeft: "clamp",
2354
+ extrapolateRight: "clamp",
2355
+ });
2356
+ return (
2357
+ <span
2358
+ key={`${w}-${i}`}
2359
+ style={{
2360
+ display: "inline-block",
2361
+ transform: `translateY(${y}px)`,
2362
+ opacity: op,
2363
+ }}
2364
+ >
2365
+ {w}
2366
+ </span>
2367
+ );
2368
+ })}
2369
+ </div>
2370
+
2371
+ {/* AI */}
2372
+ <div
2373
+ style={{
2374
+ position: "absolute",
2375
+ top: 180,
2376
+ width: "100%",
2377
+ textAlign: "center",
2378
+ opacity: belowOp,
2379
+ transform: `scale(${belowScale})`,
2380
+ fontSize: 156,
2381
+ fontWeight: 900,
2382
+ background: `linear-gradient(135deg, ${C.yt}, #ff5577)`,
2383
+ WebkitBackgroundClip: "text",
2384
+ backgroundClip: "text",
2385
+ WebkitTextFillColor: "transparent",
2386
+ letterSpacing: "-0.05em",
2387
+ textShadow: `0 0 60px rgba(255,0,51,0.4)`,
2388
+ filter: `drop-shadow(0 0 30px rgba(255,0,51,${0.3 + Math.sin(f * 0.1) * 0.15}))`,
2389
+ lineHeight: 1,
2390
+ }}
2391
+ >
2392
+ AI DROPS
2393
+ </div>
2394
+
2395
+ {/* Action pills */}
2396
+ <div
2397
+ style={{
2398
+ position: "absolute",
2399
+ bottom: 30,
2400
+ left: 0,
2401
+ right: 0,
2402
+ display: "flex",
2403
+ flexDirection: "column",
2404
+ gap: 18,
2405
+ }}
2406
+ >
2407
+ {/* LIKE pill */}
2408
+ <div
2409
+ style={{
2410
+ opacity: likeOp,
2411
+ transform: `translateY(${likeY}px)`,
2412
+ padding: "20px 28px",
2413
+ borderRadius: 22,
2414
+ background: heartFilled
2415
+ ? `linear-gradient(135deg, rgba(255,0,51,0.15), ${C.surface})`
2416
+ : C.surface,
2417
+ border: `1.5px solid ${heartFilled ? C.yt : C.borderLoud}`,
2418
+ display: "flex",
2419
+ alignItems: "center",
2420
+ gap: 22,
2421
+ position: "relative",
2422
+ boxShadow: heartFilled
2423
+ ? `0 0 30px -8px rgba(255,0,51,0.5), inset 0 1px 0 rgba(255,255,255,0.04)`
2424
+ : `inset 0 1px 0 rgba(255,255,255,0.04)`,
2425
+ }}
2426
+ >
2427
+ <div style={{ position: "relative" }}>
2428
+ <svg
2429
+ width={56}
2430
+ height={56}
2431
+ viewBox="0 0 24 24"
2432
+ fill={heartFilled ? C.yt : "none"}
2433
+ stroke={heartFilled ? C.yt : C.fg}
2434
+ strokeWidth="2"
2435
+ style={{ transform: `scale(${heartScale})` }}
2436
+ >
2437
+ <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
2438
+ </svg>
2439
+ {[0, 1, 2, 3, 4, 5].map((i) => {
2440
+ const angle = (i / 6) * Math.PI * 2;
2441
+ const dist = particleT * 60;
2442
+ const px = Math.cos(angle) * dist;
2443
+ const py = Math.sin(angle) * dist;
2444
+ const pOp = interpolate(particleT, [0, 0.2, 1], [0, 1, 0], {
2445
+ extrapolateLeft: "clamp",
2446
+ extrapolateRight: "clamp",
2447
+ });
2448
+ return (
2449
+ <div
2450
+ key={i}
2451
+ style={{
2452
+ position: "absolute",
2453
+ top: 24,
2454
+ left: 24,
2455
+ width: 7,
2456
+ height: 7,
2457
+ borderRadius: "50%",
2458
+ background: C.yt,
2459
+ transform: `translate(${px}px, ${py}px)`,
2460
+ opacity: pOp,
2461
+ }}
2462
+ />
2463
+ );
2464
+ })}
2465
+ </div>
2466
+ <span
2467
+ style={{
2468
+ fontSize: 42,
2469
+ fontWeight: 700,
2470
+ color: C.fg,
2471
+ letterSpacing: "-0.03em",
2472
+ flex: 1,
2473
+ }}
2474
+ >
2475
+ {heartFilled ? "Liked" : "Like"}
2476
+ </span>
2477
+ </div>
2478
+
2479
+ {/* SUBSCRIBE pill */}
2480
+ <div
2481
+ style={{
2482
+ opacity: subOp,
2483
+ transform: `translateY(${subY}px)`,
2484
+ padding: "22px 28px",
2485
+ borderRadius: 22,
2486
+ background: subActive
2487
+ ? `linear-gradient(135deg, ${C.yt}, #ff2d5a)`
2488
+ : `linear-gradient(135deg, ${C.yt}, #cc0029)`,
2489
+ border: `1.5px solid ${subActive ? "#ff5577" : C.yt}`,
2490
+ display: "flex",
2491
+ alignItems: "center",
2492
+ gap: 22,
2493
+ boxShadow: `0 18px 40px -10px rgba(255,0,51,${subGlow}), 0 0 60px rgba(255,0,51,${subGlow * 0.4})`,
2494
+ }}
2495
+ >
2496
+ <svg
2497
+ width={56}
2498
+ height={56}
2499
+ viewBox="0 0 24 24"
2500
+ fill="none"
2501
+ stroke="#fff"
2502
+ strokeWidth="2.4"
2503
+ strokeLinejoin="round"
2504
+ strokeLinecap="round"
2505
+ style={{ transform: `rotate(${bellTilt}deg)`, flexShrink: 0 }}
2506
+ >
2507
+ <path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" />
2508
+ <path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" />
2509
+ </svg>
2510
+ <span
2511
+ style={{
2512
+ fontSize: 44,
2513
+ fontWeight: 800,
2514
+ color: "#fff",
2515
+ letterSpacing: "-0.03em",
2516
+ flex: 1,
2517
+ textTransform: "uppercase",
2518
+ }}
2519
+ >
2520
+ {subActive ? "Subscribed" : "Subscribe"}
2521
+ </span>
2522
+ </div>
2523
+ </div>
2524
+ </div>
2525
+
2526
+ {/* @DeviniLabs handle */}
2527
+ <div
2528
+ style={{
2529
+ position: "absolute",
2530
+ bottom: H - SAFE_BOT_Y + 10,
2531
+ left: 0,
2532
+ right: 0,
2533
+ textAlign: "center",
2534
+ opacity: handleOp,
2535
+ fontFamily: MONO,
2536
+ fontSize: 22,
2537
+ fontWeight: 600,
2538
+ color: C.fgMuted,
2539
+ letterSpacing: "0.08em",
2540
+ }}
2541
+ >
2542
+ @DeviniLabs
2543
+ </div>
2544
+ </AbsoluteFill>
2545
+ );
2546
+ };
2547
+
2548
+ // ═══════════════════════════════════════════════════════════════
2549
+ // MAIN COMPOSITION
2550
+ // ═══════════════════════════════════════════════════════════════
2551
+
2552
+ export const GPT55Reel: React.FC = () => {
2553
+ const frame = useCurrentFrame();
2554
+
2555
+ // Choose background tint based on active scene
2556
+ const tint: "oai" | "rival" | "yt" =
2557
+ frame >= SCENES.S11.from && frame < SCENES.S12.from
2558
+ ? "rival"
2559
+ : frame >= SCENES.S12.from
2560
+ ? "yt"
2561
+ : "oai";
2562
+
2563
+ return (
2564
+ <AbsoluteFill style={{ backgroundColor: C.bg, fontFamily: FONT }}>
2565
+ {/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}
2566
+
2567
+ {/* Global background (Scene 12 draws its own) */}
2568
+ {frame < SCENES.S12.from ? <Background frame={frame} tint={tint} /> : null}
2569
+
2570
+ <Sequence from={SCENES.S1.from} durationInFrames={SCENES.S1.dur}>
2571
+ <Scene1 />
2572
+ </Sequence>
2573
+ <Sequence from={SCENES.S2.from} durationInFrames={SCENES.S2.dur}>
2574
+ <Scene2 />
2575
+ </Sequence>
2576
+ <Sequence from={SCENES.S3.from} durationInFrames={SCENES.S3.dur}>
2577
+ <Scene3 />
2578
+ </Sequence>
2579
+ <Sequence from={SCENES.S4.from} durationInFrames={SCENES.S4.dur}>
2580
+ <Scene4 />
2581
+ </Sequence>
2582
+ <Sequence from={SCENES.S5.from} durationInFrames={SCENES.S5.dur}>
2583
+ <Scene5 />
2584
+ </Sequence>
2585
+ <Sequence from={SCENES.S6.from} durationInFrames={SCENES.S6.dur}>
2586
+ <Scene6 />
2587
+ </Sequence>
2588
+ <Sequence from={SCENES.S7.from} durationInFrames={SCENES.S7.dur}>
2589
+ <Scene7 />
2590
+ </Sequence>
2591
+ <Sequence from={SCENES.S8.from} durationInFrames={SCENES.S8.dur}>
2592
+ <Scene8 />
2593
+ </Sequence>
2594
+ <Sequence from={SCENES.S9.from} durationInFrames={SCENES.S9.dur}>
2595
+ <Scene9 />
2596
+ </Sequence>
2597
+ <Sequence from={SCENES.S10.from} durationInFrames={SCENES.S10.dur}>
2598
+ <Scene10 />
2599
+ </Sequence>
2600
+ <Sequence from={SCENES.S11.from} durationInFrames={SCENES.S11.dur}>
2601
+ <Scene11 />
2602
+ </Sequence>
2603
+ <Sequence from={SCENES.S12.from} durationInFrames={SCENES.S12.dur}>
2604
+ <Scene12 />
2605
+ </Sequence>
2606
+ </AbsoluteFill>
2607
+ );
2608
+ };