@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.
- package/cli/scaffold.js +124 -16
- package/docs/buyers-guide.md +1 -1
- package/docs/family-galleries/dark.md +1 -1
- package/docs/family-galleries/forbidden.md +1 -1
- package/docs/family-galleries/glass.md +1 -1
- package/docs/family-galleries/paper.md +1 -1
- package/docs/family-galleries/warm.md +1 -1
- package/package.json +1 -1
- package/reference/dark/codedrop.tsx +908 -0
- package/reference/dark/gpt55.tsx +2608 -0
- package/reference/dark/resourcescta.tsx +609 -0
- package/reference/dark/skills.tsx +1460 -0
- package/reference/dark/stitch2.tsx +162 -0
- package/reference/glass/claudewatchcta.tsx +599 -0
- package/reference/glass/gstack.tsx +3020 -0
- package/reference/glass/jcode.tsx +2267 -0
- package/reference/glass/lilagents.tsx +2649 -0
- package/reference/paper/devini3d.tsx +1799 -0
- package/skill/SKILL.md +25 -16
|
@@ -0,0 +1,2267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REFERENCE — JcodeReel (Family: glass)
|
|
3
|
+
*
|
|
4
|
+
* Canonical example of the glass 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/JcodeReel.tsx
|
|
15
|
+
* Bundled at: 2026-05-12T19:40:04.825Z
|
|
16
|
+
*/
|
|
17
|
+
import React from "react";
|
|
18
|
+
import {
|
|
19
|
+
AbsoluteFill,
|
|
20
|
+
Img,
|
|
21
|
+
OffthreadVideo,
|
|
22
|
+
Sequence,
|
|
23
|
+
interpolate,
|
|
24
|
+
spring,
|
|
25
|
+
staticFile,
|
|
26
|
+
useCurrentFrame,
|
|
27
|
+
useVideoConfig,
|
|
28
|
+
} from "remotion";
|
|
29
|
+
import {
|
|
30
|
+
C,
|
|
31
|
+
ease,
|
|
32
|
+
glassBase,
|
|
33
|
+
CausticBlobs,
|
|
34
|
+
HairlineGrid,
|
|
35
|
+
IridescentRing,
|
|
36
|
+
GlassCard,
|
|
37
|
+
EyebrowPill,
|
|
38
|
+
StaggeredWords,
|
|
39
|
+
ScrambleText,
|
|
40
|
+
Counter,
|
|
41
|
+
SonarRings,
|
|
42
|
+
ParticleBurst,
|
|
43
|
+
LightBeam,
|
|
44
|
+
FONT,
|
|
45
|
+
MONO,
|
|
46
|
+
} from "./GraphifyReel";
|
|
47
|
+
|
|
48
|
+
// ═══════════════════════════════════════════════════════════════
|
|
49
|
+
// TIMING — 72.13s @ 30fps = 2164 frames, audio-locked
|
|
50
|
+
// BEATs derived from /tmp/jcode.srt sentence boundaries (whisper-cli base.en)
|
|
51
|
+
// ═══════════════════════════════════════════════════════════════
|
|
52
|
+
export const JCODE_TOTAL = 2164;
|
|
53
|
+
|
|
54
|
+
export const BEAT = {
|
|
55
|
+
hook: 0, // 0.00s — "63 times faster than Codex…"
|
|
56
|
+
intro: 348, // 11.60s — "Welcome back guys"
|
|
57
|
+
harness: 554, // 18.46s — "So here's the thing…"
|
|
58
|
+
rust: 907, // 30.22s — "And jcode just rebuilt…in Rust"
|
|
59
|
+
memory: 1154, // 38.45s — "Now about that built-in memory system"
|
|
60
|
+
parallel: 1463, // 48.78s — "Parallel sessions are native too"
|
|
61
|
+
swarms: 1660, // 55.35s — "And the craziest part?"
|
|
62
|
+
cta: 1995, // 66.51s — "If you want the repo link"
|
|
63
|
+
end: 2164, // 72.13s
|
|
64
|
+
} as const;
|
|
65
|
+
|
|
66
|
+
// jcode brand accent — the ONLY non-iridescent color, single accent per leonxinx Rule 2
|
|
67
|
+
const JC = {
|
|
68
|
+
rust: "#E55A1A",
|
|
69
|
+
rustSoft: "#F9C5A5",
|
|
70
|
+
rustDeep: "#9B3A0E",
|
|
71
|
+
rustHaze: "rgba(229,90,26,0.18)",
|
|
72
|
+
} as const;
|
|
73
|
+
|
|
74
|
+
const SAFE_TOP = 290; // 15% of 1920
|
|
75
|
+
const SAFE_BOTTOM = 1500; // bottom 22% begins
|
|
76
|
+
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════
|
|
78
|
+
// FILM GRAIN — copy of GraphifyReel's overlay (it's not exported)
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════
|
|
80
|
+
const FilmGrain: React.FC = () => (
|
|
81
|
+
<AbsoluteFill
|
|
82
|
+
style={{
|
|
83
|
+
backgroundImage:
|
|
84
|
+
"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E\")",
|
|
85
|
+
opacity: 0.06,
|
|
86
|
+
pointerEvents: "none",
|
|
87
|
+
mixBlendMode: "multiply",
|
|
88
|
+
}}
|
|
89
|
+
/>
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// ═══════════════════════════════════════════════════════════════
|
|
93
|
+
// FLOATING GLYPHS — code-symbol pills drifting on sine paths (Scene 1)
|
|
94
|
+
// Anti-emoji per leonxinx — uses Unicode math/code symbols only
|
|
95
|
+
// ═══════════════════════════════════════════════════════════════
|
|
96
|
+
const FloatingGlyphs: React.FC<{ startFrame?: number }> = ({ startFrame = 0 }) => {
|
|
97
|
+
const frame = useCurrentFrame();
|
|
98
|
+
const local = Math.max(0, frame - startFrame);
|
|
99
|
+
const glyphs = [
|
|
100
|
+
{ ch: "</>", x: 120, y: 360, phase: 0.0, speed: 0.025, size: 36, color: C.iriCyan },
|
|
101
|
+
{ ch: "{ }", x: 880, y: 480, phase: 1.1, speed: 0.022, size: 38, color: C.iriViolet },
|
|
102
|
+
{ ch: "λ", x: 200, y: 1240, phase: 2.0, speed: 0.028, size: 44, color: C.iriRose },
|
|
103
|
+
{ ch: "∞", x: 920, y: 1140, phase: 3.2, speed: 0.024, size: 40, color: JC.rust },
|
|
104
|
+
{ ch: "Σ", x: 100, y: 760, phase: 0.8, speed: 0.030, size: 42, color: C.iriGold },
|
|
105
|
+
{ ch: "∇", x: 940, y: 1380, phase: 4.5, speed: 0.026, size: 38, color: C.iriCyan },
|
|
106
|
+
];
|
|
107
|
+
return (
|
|
108
|
+
<AbsoluteFill style={{ pointerEvents: "none" }}>
|
|
109
|
+
{glyphs.map((g, i) => {
|
|
110
|
+
const birth = i * 6;
|
|
111
|
+
const lo = Math.max(0, local - birth);
|
|
112
|
+
const intro = interpolate(lo, [0, 30], [0, 1], {
|
|
113
|
+
extrapolateRight: "clamp",
|
|
114
|
+
easing: ease.expoOut,
|
|
115
|
+
});
|
|
116
|
+
const driftX = Math.sin(local * g.speed + g.phase) * 26;
|
|
117
|
+
const driftY = Math.cos(local * g.speed * 1.3 + g.phase) * 22;
|
|
118
|
+
const rot = Math.sin(local * g.speed * 0.8 + g.phase) * 6;
|
|
119
|
+
return (
|
|
120
|
+
<div
|
|
121
|
+
key={i}
|
|
122
|
+
style={{
|
|
123
|
+
position: "absolute",
|
|
124
|
+
left: g.x + driftX,
|
|
125
|
+
top: g.y + driftY,
|
|
126
|
+
padding: "8px 14px",
|
|
127
|
+
borderRadius: 14,
|
|
128
|
+
...glassBase,
|
|
129
|
+
opacity: intro * 0.85,
|
|
130
|
+
transform: `translate(-50%,-50%) scale(${0.7 + intro * 0.3}) rotate(${rot}deg)`,
|
|
131
|
+
fontFamily: MONO,
|
|
132
|
+
fontSize: g.size,
|
|
133
|
+
fontWeight: 600,
|
|
134
|
+
color: g.color,
|
|
135
|
+
willChange: "transform, opacity",
|
|
136
|
+
}}
|
|
137
|
+
>
|
|
138
|
+
{g.ch}
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
})}
|
|
142
|
+
</AbsoluteFill>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// ═══════════════════════════════════════════════════════════════
|
|
147
|
+
// CHIP — small glass capsule with optional dot
|
|
148
|
+
// ═══════════════════════════════════════════════════════════════
|
|
149
|
+
const Chip: React.FC<{
|
|
150
|
+
children: React.ReactNode;
|
|
151
|
+
dotColor?: string;
|
|
152
|
+
style?: React.CSSProperties;
|
|
153
|
+
}> = ({ children, dotColor, style }) => (
|
|
154
|
+
<div
|
|
155
|
+
style={{
|
|
156
|
+
...glassBase,
|
|
157
|
+
borderRadius: 9999,
|
|
158
|
+
padding: "10px 22px",
|
|
159
|
+
display: "inline-flex",
|
|
160
|
+
alignItems: "center",
|
|
161
|
+
gap: 10,
|
|
162
|
+
fontFamily: MONO,
|
|
163
|
+
fontSize: 18,
|
|
164
|
+
fontWeight: 500,
|
|
165
|
+
color: C.inkSoft,
|
|
166
|
+
letterSpacing: "0.18em",
|
|
167
|
+
textTransform: "uppercase",
|
|
168
|
+
...style,
|
|
169
|
+
}}
|
|
170
|
+
>
|
|
171
|
+
{dotColor && (
|
|
172
|
+
<div
|
|
173
|
+
style={{
|
|
174
|
+
width: 8,
|
|
175
|
+
height: 8,
|
|
176
|
+
borderRadius: "50%",
|
|
177
|
+
background: dotColor,
|
|
178
|
+
boxShadow: `0 0 12px ${dotColor}`,
|
|
179
|
+
}}
|
|
180
|
+
/>
|
|
181
|
+
)}
|
|
182
|
+
{children}
|
|
183
|
+
</div>
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// ═══════════════════════════════════════════════════════════════
|
|
187
|
+
// FLOW ARROW — animated SVG path with strokeDashoffset cycle
|
|
188
|
+
// ═══════════════════════════════════════════════════════════════
|
|
189
|
+
const FlowArrow: React.FC<{
|
|
190
|
+
d: string;
|
|
191
|
+
stroke?: string;
|
|
192
|
+
strokeWidth?: number;
|
|
193
|
+
speed?: number;
|
|
194
|
+
startFrame?: number;
|
|
195
|
+
}> = ({ d, stroke = C.iriViolet, strokeWidth = 3, speed = 1.2, startFrame = 0 }) => {
|
|
196
|
+
const frame = useCurrentFrame();
|
|
197
|
+
const local = Math.max(0, frame - startFrame);
|
|
198
|
+
// Continuous flow — dashoffset cycles every 40 frames
|
|
199
|
+
const dashCycle = (local * speed) % 40;
|
|
200
|
+
const drawIn = interpolate(local, [0, 24], [0, 1], {
|
|
201
|
+
extrapolateRight: "clamp",
|
|
202
|
+
easing: ease.expoOut,
|
|
203
|
+
});
|
|
204
|
+
return (
|
|
205
|
+
<svg
|
|
206
|
+
style={{ position: "absolute", inset: 0, width: "100%", height: "100%", pointerEvents: "none" }}
|
|
207
|
+
viewBox="0 0 1080 1920"
|
|
208
|
+
preserveAspectRatio="none"
|
|
209
|
+
>
|
|
210
|
+
<path
|
|
211
|
+
d={d}
|
|
212
|
+
fill="none"
|
|
213
|
+
stroke={stroke}
|
|
214
|
+
strokeWidth={strokeWidth}
|
|
215
|
+
strokeLinecap="round"
|
|
216
|
+
strokeDasharray="20 8"
|
|
217
|
+
strokeDashoffset={-dashCycle}
|
|
218
|
+
opacity={drawIn * 0.85}
|
|
219
|
+
style={{ filter: `drop-shadow(0 0 8px ${stroke})` }}
|
|
220
|
+
/>
|
|
221
|
+
</svg>
|
|
222
|
+
);
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// ═══════════════════════════════════════════════════════════════
|
|
226
|
+
// HARNESS DIAGRAM (Scene 3)
|
|
227
|
+
// Vertical stack: [Claude Code] [Codex CLI] → HARNESS → AI MODEL
|
|
228
|
+
// ═══════════════════════════════════════════════════════════════
|
|
229
|
+
const HarnessDiagram: React.FC<{ startFrame: number }> = ({ startFrame }) => {
|
|
230
|
+
const frame = useCurrentFrame();
|
|
231
|
+
const local = Math.max(0, frame - startFrame);
|
|
232
|
+
|
|
233
|
+
const tile = (delay: number) => {
|
|
234
|
+
const lo = Math.max(0, local - delay);
|
|
235
|
+
return {
|
|
236
|
+
opacity: interpolate(lo, [0, 24], [0, 1], { extrapolateRight: "clamp", easing: ease.expoOut }),
|
|
237
|
+
y: interpolate(lo, [0, 24], [40, 0], { extrapolateRight: "clamp", easing: ease.power3Out }),
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
const top = tile(0);
|
|
242
|
+
const mid = tile(20);
|
|
243
|
+
const bot = tile(40);
|
|
244
|
+
|
|
245
|
+
// pulsing border on harness layer (perpetual)
|
|
246
|
+
const pulse = (Math.sin(local * 0.08) + 1) * 0.5;
|
|
247
|
+
const harnessGlow = interpolate(pulse, [0, 1], [0.35, 0.85]);
|
|
248
|
+
|
|
249
|
+
// labels reveal inside harness layer (prompts / tools / memory / sessions)
|
|
250
|
+
const labels = ["prompts", "tools", "memory", "sessions"];
|
|
251
|
+
const labelStart = 70;
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
<AbsoluteFill style={{ pointerEvents: "none" }}>
|
|
255
|
+
{/* Top row: source pills (Claude Code + Codex CLI) */}
|
|
256
|
+
<div
|
|
257
|
+
style={{
|
|
258
|
+
position: "absolute",
|
|
259
|
+
top: 460,
|
|
260
|
+
left: 0,
|
|
261
|
+
right: 0,
|
|
262
|
+
display: "flex",
|
|
263
|
+
gap: 24,
|
|
264
|
+
justifyContent: "center",
|
|
265
|
+
opacity: top.opacity,
|
|
266
|
+
transform: `translateY(${top.y}px)`,
|
|
267
|
+
willChange: "transform, opacity",
|
|
268
|
+
}}
|
|
269
|
+
>
|
|
270
|
+
<div
|
|
271
|
+
style={{
|
|
272
|
+
...glassBase,
|
|
273
|
+
borderRadius: 24,
|
|
274
|
+
padding: "20px 28px",
|
|
275
|
+
display: "flex",
|
|
276
|
+
alignItems: "center",
|
|
277
|
+
gap: 14,
|
|
278
|
+
fontFamily: FONT,
|
|
279
|
+
fontSize: 26,
|
|
280
|
+
fontWeight: 600,
|
|
281
|
+
color: C.ink,
|
|
282
|
+
}}
|
|
283
|
+
>
|
|
284
|
+
<Img src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)} style={{ width: 36, height: 36 }} />
|
|
285
|
+
Claude Code
|
|
286
|
+
</div>
|
|
287
|
+
<div
|
|
288
|
+
style={{
|
|
289
|
+
...glassBase,
|
|
290
|
+
borderRadius: 24,
|
|
291
|
+
padding: "20px 28px",
|
|
292
|
+
display: "flex",
|
|
293
|
+
alignItems: "center",
|
|
294
|
+
gap: 14,
|
|
295
|
+
fontFamily: FONT,
|
|
296
|
+
fontSize: 26,
|
|
297
|
+
fontWeight: 600,
|
|
298
|
+
color: C.ink,
|
|
299
|
+
}}
|
|
300
|
+
>
|
|
301
|
+
<Img src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)} style={{ width: 36, height: 36 }} />
|
|
302
|
+
Codex CLI
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
|
|
306
|
+
{/* Arrow from sources → harness */}
|
|
307
|
+
<FlowArrow
|
|
308
|
+
d="M 540 580 L 540 720"
|
|
309
|
+
stroke={C.iriViolet}
|
|
310
|
+
strokeWidth={4}
|
|
311
|
+
startFrame={startFrame + 14}
|
|
312
|
+
/>
|
|
313
|
+
|
|
314
|
+
{/* Middle: HARNESS layer (the glowing intermediary) */}
|
|
315
|
+
<div
|
|
316
|
+
style={{
|
|
317
|
+
position: "absolute",
|
|
318
|
+
top: 760,
|
|
319
|
+
left: 80,
|
|
320
|
+
right: 80,
|
|
321
|
+
padding: "32px 36px",
|
|
322
|
+
...glassBase,
|
|
323
|
+
borderRadius: 36,
|
|
324
|
+
opacity: mid.opacity,
|
|
325
|
+
transform: `translateY(${mid.y}px)`,
|
|
326
|
+
boxShadow: [
|
|
327
|
+
"0 24px 48px -12px rgba(120,100,180,0.22)",
|
|
328
|
+
"inset 0 1.5px 0 rgba(255,255,255,0.95)",
|
|
329
|
+
`0 0 ${24 + 24 * pulse}px ${C.iriViolet}${Math.round(harnessGlow * 60)
|
|
330
|
+
.toString(16)
|
|
331
|
+
.padStart(2, "0")}`,
|
|
332
|
+
].join(", "),
|
|
333
|
+
willChange: "transform, opacity",
|
|
334
|
+
}}
|
|
335
|
+
>
|
|
336
|
+
<div
|
|
337
|
+
style={{
|
|
338
|
+
fontFamily: MONO,
|
|
339
|
+
fontSize: 16,
|
|
340
|
+
color: C.inkMuted,
|
|
341
|
+
letterSpacing: "0.18em",
|
|
342
|
+
textTransform: "uppercase",
|
|
343
|
+
marginBottom: 14,
|
|
344
|
+
}}
|
|
345
|
+
>
|
|
346
|
+
The Harness
|
|
347
|
+
</div>
|
|
348
|
+
<div
|
|
349
|
+
style={{
|
|
350
|
+
display: "flex",
|
|
351
|
+
flexWrap: "wrap",
|
|
352
|
+
gap: 12,
|
|
353
|
+
fontFamily: FONT,
|
|
354
|
+
}}
|
|
355
|
+
>
|
|
356
|
+
{labels.map((l, i) => {
|
|
357
|
+
const lo = Math.max(0, local - (labelStart + i * 14));
|
|
358
|
+
const op = interpolate(lo, [0, 18], [0, 1], { extrapolateRight: "clamp" });
|
|
359
|
+
const sc = interpolate(lo, [0, 18], [0.7, 1], {
|
|
360
|
+
extrapolateRight: "clamp",
|
|
361
|
+
easing: ease.backOut,
|
|
362
|
+
});
|
|
363
|
+
return (
|
|
364
|
+
<div
|
|
365
|
+
key={l}
|
|
366
|
+
style={{
|
|
367
|
+
...glassBase,
|
|
368
|
+
borderRadius: 9999,
|
|
369
|
+
padding: "10px 22px",
|
|
370
|
+
fontSize: 22,
|
|
371
|
+
fontWeight: 600,
|
|
372
|
+
color: C.ink,
|
|
373
|
+
opacity: op,
|
|
374
|
+
transform: `scale(${sc})`,
|
|
375
|
+
willChange: "transform, opacity",
|
|
376
|
+
}}
|
|
377
|
+
>
|
|
378
|
+
{l}
|
|
379
|
+
</div>
|
|
380
|
+
);
|
|
381
|
+
})}
|
|
382
|
+
</div>
|
|
383
|
+
</div>
|
|
384
|
+
|
|
385
|
+
{/* Arrow from harness → AI model */}
|
|
386
|
+
<FlowArrow
|
|
387
|
+
d="M 540 1070 L 540 1200"
|
|
388
|
+
stroke={C.iriCyan}
|
|
389
|
+
strokeWidth={4}
|
|
390
|
+
startFrame={startFrame + 32}
|
|
391
|
+
/>
|
|
392
|
+
|
|
393
|
+
{/* Bottom: AI MODEL sphere */}
|
|
394
|
+
<div
|
|
395
|
+
style={{
|
|
396
|
+
position: "absolute",
|
|
397
|
+
top: 1250,
|
|
398
|
+
left: 0,
|
|
399
|
+
right: 0,
|
|
400
|
+
display: "flex",
|
|
401
|
+
justifyContent: "center",
|
|
402
|
+
opacity: bot.opacity,
|
|
403
|
+
transform: `translateY(${bot.y}px)`,
|
|
404
|
+
willChange: "transform, opacity",
|
|
405
|
+
}}
|
|
406
|
+
>
|
|
407
|
+
<div
|
|
408
|
+
style={{
|
|
409
|
+
position: "relative",
|
|
410
|
+
width: 220,
|
|
411
|
+
height: 220,
|
|
412
|
+
}}
|
|
413
|
+
>
|
|
414
|
+
<IridescentRing size={220} thickness={3} speed={1.2} borderRadius={9999} />
|
|
415
|
+
<div
|
|
416
|
+
style={{
|
|
417
|
+
position: "absolute",
|
|
418
|
+
inset: 4,
|
|
419
|
+
borderRadius: "50%",
|
|
420
|
+
background: `radial-gradient(circle at 35% 30%, #fff 0%, ${C.iriCyan} 35%, ${C.iriViolet} 80%)`,
|
|
421
|
+
boxShadow: `0 12px 40px ${C.iriViolet}80`,
|
|
422
|
+
display: "flex",
|
|
423
|
+
alignItems: "center",
|
|
424
|
+
justifyContent: "center",
|
|
425
|
+
fontFamily: MONO,
|
|
426
|
+
fontSize: 22,
|
|
427
|
+
fontWeight: 600,
|
|
428
|
+
color: "#fff",
|
|
429
|
+
letterSpacing: "0.18em",
|
|
430
|
+
textTransform: "uppercase",
|
|
431
|
+
}}
|
|
432
|
+
>
|
|
433
|
+
AI Model
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
</div>
|
|
437
|
+
</AbsoluteFill>
|
|
438
|
+
);
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// ═══════════════════════════════════════════════════════════════
|
|
442
|
+
// MEMORY CONSTELLATION (Scene 5)
|
|
443
|
+
// 8 glass nodes connected by drawing-in lines, breathing pulses
|
|
444
|
+
// ═══════════════════════════════════════════════════════════════
|
|
445
|
+
const MemoryConstellation: React.FC<{ startFrame: number }> = ({ startFrame }) => {
|
|
446
|
+
const frame = useCurrentFrame();
|
|
447
|
+
const local = Math.max(0, frame - startFrame);
|
|
448
|
+
|
|
449
|
+
// 8 nodes positioned around a soft elliptical orbit centered at (540, 960)
|
|
450
|
+
const nodes = [
|
|
451
|
+
{ x: 540, y: 720, label: "ctx" },
|
|
452
|
+
{ x: 760, y: 800, label: "files" },
|
|
453
|
+
{ x: 860, y: 980, label: "decisions" },
|
|
454
|
+
{ x: 760, y: 1160, label: "user" },
|
|
455
|
+
{ x: 540, y: 1220, label: "goals" },
|
|
456
|
+
{ x: 320, y: 1160, label: "stack" },
|
|
457
|
+
{ x: 220, y: 980, label: "errors" },
|
|
458
|
+
{ x: 320, y: 800, label: "diffs" },
|
|
459
|
+
];
|
|
460
|
+
|
|
461
|
+
// edges (subset — neural-map look without overcrowding)
|
|
462
|
+
const edges: Array<[number, number]> = [
|
|
463
|
+
[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 0],
|
|
464
|
+
[0, 4], [2, 6], [1, 5], [3, 7],
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
return (
|
|
468
|
+
<AbsoluteFill style={{ pointerEvents: "none" }}>
|
|
469
|
+
{/* Edges — SVG, drawing in via strokeDashoffset */}
|
|
470
|
+
<svg
|
|
471
|
+
style={{ position: "absolute", inset: 0, width: "100%", height: "100%" }}
|
|
472
|
+
viewBox="0 0 1080 1920"
|
|
473
|
+
preserveAspectRatio="none"
|
|
474
|
+
>
|
|
475
|
+
{edges.map(([a, b], i) => {
|
|
476
|
+
const A = nodes[a];
|
|
477
|
+
const B = nodes[b];
|
|
478
|
+
const len = Math.hypot(B.x - A.x, B.y - A.y);
|
|
479
|
+
const drawIn = interpolate(
|
|
480
|
+
local,
|
|
481
|
+
[10 + i * 5, 40 + i * 5],
|
|
482
|
+
[len, 0],
|
|
483
|
+
{ extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: ease.expoOut },
|
|
484
|
+
);
|
|
485
|
+
const op = interpolate(local, [10 + i * 5, 40 + i * 5], [0, 0.6], {
|
|
486
|
+
extrapolateLeft: "clamp",
|
|
487
|
+
extrapolateRight: "clamp",
|
|
488
|
+
});
|
|
489
|
+
return (
|
|
490
|
+
<line
|
|
491
|
+
key={i}
|
|
492
|
+
x1={A.x}
|
|
493
|
+
y1={A.y}
|
|
494
|
+
x2={B.x}
|
|
495
|
+
y2={B.y}
|
|
496
|
+
stroke={i % 2 === 0 ? C.iriViolet : C.iriCyan}
|
|
497
|
+
strokeWidth={2}
|
|
498
|
+
strokeDasharray={len}
|
|
499
|
+
strokeDashoffset={drawIn}
|
|
500
|
+
opacity={op}
|
|
501
|
+
/>
|
|
502
|
+
);
|
|
503
|
+
})}
|
|
504
|
+
</svg>
|
|
505
|
+
|
|
506
|
+
{/* Nodes — glass orbs with breathing pulse */}
|
|
507
|
+
{nodes.map((n, i) => {
|
|
508
|
+
const birth = i * 5;
|
|
509
|
+
const lo = Math.max(0, local - birth);
|
|
510
|
+
const intro = interpolate(lo, [0, 24], [0, 1], {
|
|
511
|
+
extrapolateRight: "clamp",
|
|
512
|
+
easing: ease.backOut,
|
|
513
|
+
});
|
|
514
|
+
const breath = (Math.sin(local * 0.06 + i * 0.7) + 1) * 0.5;
|
|
515
|
+
const scale = intro * (1 + breath * 0.08);
|
|
516
|
+
return (
|
|
517
|
+
<div
|
|
518
|
+
key={i}
|
|
519
|
+
style={{
|
|
520
|
+
position: "absolute",
|
|
521
|
+
left: n.x,
|
|
522
|
+
top: n.y,
|
|
523
|
+
transform: `translate(-50%,-50%) scale(${scale})`,
|
|
524
|
+
willChange: "transform",
|
|
525
|
+
opacity: intro,
|
|
526
|
+
}}
|
|
527
|
+
>
|
|
528
|
+
<div
|
|
529
|
+
style={{
|
|
530
|
+
...glassBase,
|
|
531
|
+
borderRadius: 9999,
|
|
532
|
+
width: 110,
|
|
533
|
+
height: 110,
|
|
534
|
+
display: "flex",
|
|
535
|
+
alignItems: "center",
|
|
536
|
+
justifyContent: "center",
|
|
537
|
+
fontFamily: MONO,
|
|
538
|
+
fontSize: 16,
|
|
539
|
+
fontWeight: 600,
|
|
540
|
+
color: C.ink,
|
|
541
|
+
boxShadow: [
|
|
542
|
+
"0 12px 30px -8px rgba(120,100,180,0.25)",
|
|
543
|
+
"inset 0 1.5px 0 rgba(255,255,255,0.95)",
|
|
544
|
+
`0 0 ${14 + breath * 14}px ${i % 3 === 0 ? JC.rust : i % 2 === 0 ? C.iriViolet : C.iriCyan}55`,
|
|
545
|
+
].join(", "),
|
|
546
|
+
}}
|
|
547
|
+
>
|
|
548
|
+
{n.label}
|
|
549
|
+
</div>
|
|
550
|
+
</div>
|
|
551
|
+
);
|
|
552
|
+
})}
|
|
553
|
+
|
|
554
|
+
{/* Center heart — "memory" core */}
|
|
555
|
+
<div
|
|
556
|
+
style={{
|
|
557
|
+
position: "absolute",
|
|
558
|
+
left: 540,
|
|
559
|
+
top: 970,
|
|
560
|
+
transform: "translate(-50%,-50%)",
|
|
561
|
+
}}
|
|
562
|
+
>
|
|
563
|
+
<div
|
|
564
|
+
style={{
|
|
565
|
+
position: "relative",
|
|
566
|
+
width: 140,
|
|
567
|
+
height: 140,
|
|
568
|
+
}}
|
|
569
|
+
>
|
|
570
|
+
<IridescentRing size={140} thickness={3} speed={0.8} borderRadius={9999} />
|
|
571
|
+
<div
|
|
572
|
+
style={{
|
|
573
|
+
position: "absolute",
|
|
574
|
+
inset: 4,
|
|
575
|
+
borderRadius: "50%",
|
|
576
|
+
background: `radial-gradient(circle at 35% 35%, ${JC.rustSoft} 0%, ${JC.rust} 60%, ${JC.rustDeep} 100%)`,
|
|
577
|
+
display: "flex",
|
|
578
|
+
alignItems: "center",
|
|
579
|
+
justifyContent: "center",
|
|
580
|
+
color: "#fff",
|
|
581
|
+
fontFamily: MONO,
|
|
582
|
+
fontSize: 14,
|
|
583
|
+
fontWeight: 700,
|
|
584
|
+
letterSpacing: "0.2em",
|
|
585
|
+
textTransform: "uppercase",
|
|
586
|
+
boxShadow: `0 0 32px ${JC.rust}88`,
|
|
587
|
+
}}
|
|
588
|
+
>
|
|
589
|
+
mem
|
|
590
|
+
</div>
|
|
591
|
+
</div>
|
|
592
|
+
</div>
|
|
593
|
+
</AbsoluteFill>
|
|
594
|
+
);
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
// ═══════════════════════════════════════════════════════════════
|
|
598
|
+
// AGENT SWARM DIAGRAM (Scene 7)
|
|
599
|
+
// Coordinator orb center + 6 worker orbs spawning outward + connections
|
|
600
|
+
// ═══════════════════════════════════════════════════════════════
|
|
601
|
+
const AgentSwarmDiagram: React.FC<{ startFrame: number; fps: number }> = ({
|
|
602
|
+
startFrame,
|
|
603
|
+
fps,
|
|
604
|
+
}) => {
|
|
605
|
+
const frame = useCurrentFrame();
|
|
606
|
+
const local = Math.max(0, frame - startFrame);
|
|
607
|
+
|
|
608
|
+
// 6 workers in circular orbit
|
|
609
|
+
const workers = Array.from({ length: 6 }, (_, i) => {
|
|
610
|
+
const angle = (i / 6) * Math.PI * 2 - Math.PI / 2;
|
|
611
|
+
return {
|
|
612
|
+
angle,
|
|
613
|
+
orbit: 360,
|
|
614
|
+
birth: 18 + i * 14,
|
|
615
|
+
label: `agent ${i + 1}`,
|
|
616
|
+
};
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
// Centralize on viewport center: x=540, y=960 (true center of 1080x1920)
|
|
620
|
+
const CX = 540;
|
|
621
|
+
const CY = 960;
|
|
622
|
+
const ORBIT = 320;
|
|
623
|
+
const WORKER_SIZE = 100;
|
|
624
|
+
const COORD_SIZE = 200;
|
|
625
|
+
|
|
626
|
+
return (
|
|
627
|
+
<AbsoluteFill style={{ pointerEvents: "none" }}>
|
|
628
|
+
{/* Orbit ring (faint, perfectly centered) */}
|
|
629
|
+
<div
|
|
630
|
+
style={{
|
|
631
|
+
position: "absolute",
|
|
632
|
+
left: CX - ORBIT,
|
|
633
|
+
top: CY - ORBIT,
|
|
634
|
+
width: ORBIT * 2,
|
|
635
|
+
height: ORBIT * 2,
|
|
636
|
+
border: `1px dashed ${C.hairline}`,
|
|
637
|
+
borderRadius: "50%",
|
|
638
|
+
opacity: interpolate(local, [10, 30], [0, 0.6], { extrapolateRight: "clamp" }),
|
|
639
|
+
}}
|
|
640
|
+
/>
|
|
641
|
+
|
|
642
|
+
{/* Connection lines via SVG positioned at viewport center */}
|
|
643
|
+
<svg
|
|
644
|
+
style={{
|
|
645
|
+
position: "absolute",
|
|
646
|
+
left: 0,
|
|
647
|
+
top: 0,
|
|
648
|
+
width: "100%",
|
|
649
|
+
height: "100%",
|
|
650
|
+
pointerEvents: "none",
|
|
651
|
+
}}
|
|
652
|
+
viewBox="0 0 1080 1920"
|
|
653
|
+
preserveAspectRatio="none"
|
|
654
|
+
>
|
|
655
|
+
<defs>
|
|
656
|
+
<linearGradient id="conn-grad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
657
|
+
<stop offset="0%" stopColor={JC.rust} stopOpacity="0.9" />
|
|
658
|
+
<stop offset="100%" stopColor={C.iriCyan} stopOpacity="0.6" />
|
|
659
|
+
</linearGradient>
|
|
660
|
+
</defs>
|
|
661
|
+
{workers.map((w, i) => {
|
|
662
|
+
const lo = Math.max(0, local - w.birth);
|
|
663
|
+
const draw = interpolate(lo, [0, 24], [0, 1], {
|
|
664
|
+
extrapolateRight: "clamp",
|
|
665
|
+
easing: ease.expoOut,
|
|
666
|
+
});
|
|
667
|
+
const x2 = CX + Math.cos(w.angle) * ORBIT * draw;
|
|
668
|
+
const y2 = CY + Math.sin(w.angle) * ORBIT * draw;
|
|
669
|
+
const dashCycle = (local * 1.4 + i * 5) % 24;
|
|
670
|
+
return (
|
|
671
|
+
<line
|
|
672
|
+
key={i}
|
|
673
|
+
x1={CX}
|
|
674
|
+
y1={CY}
|
|
675
|
+
x2={x2}
|
|
676
|
+
y2={y2}
|
|
677
|
+
stroke="url(#conn-grad)"
|
|
678
|
+
strokeWidth={2.5}
|
|
679
|
+
strokeDasharray="12 6"
|
|
680
|
+
strokeDashoffset={-dashCycle}
|
|
681
|
+
opacity={draw * 0.85}
|
|
682
|
+
/>
|
|
683
|
+
);
|
|
684
|
+
})}
|
|
685
|
+
</svg>
|
|
686
|
+
|
|
687
|
+
{/* Workers — glass orbs spawn outward via spring, centered around (CX, CY) */}
|
|
688
|
+
{workers.map((w, i) => {
|
|
689
|
+
const lo = Math.max(0, local - w.birth);
|
|
690
|
+
const sp = spring({
|
|
691
|
+
frame: lo,
|
|
692
|
+
fps,
|
|
693
|
+
from: 0,
|
|
694
|
+
to: 1,
|
|
695
|
+
config: { damping: 14, stiffness: 95, mass: 0.7 },
|
|
696
|
+
});
|
|
697
|
+
const x = CX + Math.cos(w.angle) * ORBIT * sp;
|
|
698
|
+
const y = CY + Math.sin(w.angle) * ORBIT * sp;
|
|
699
|
+
const breath = (Math.sin(local * 0.1 + i * 1.1) + 1) * 0.5;
|
|
700
|
+
return (
|
|
701
|
+
<div
|
|
702
|
+
key={i}
|
|
703
|
+
style={{
|
|
704
|
+
position: "absolute",
|
|
705
|
+
left: x - WORKER_SIZE / 2,
|
|
706
|
+
top: y - WORKER_SIZE / 2,
|
|
707
|
+
width: WORKER_SIZE,
|
|
708
|
+
height: WORKER_SIZE,
|
|
709
|
+
transform: `scale(${sp})`,
|
|
710
|
+
transformOrigin: "center",
|
|
711
|
+
willChange: "transform",
|
|
712
|
+
}}
|
|
713
|
+
>
|
|
714
|
+
<div
|
|
715
|
+
style={{
|
|
716
|
+
...glassBase,
|
|
717
|
+
borderRadius: "50%",
|
|
718
|
+
width: "100%",
|
|
719
|
+
height: "100%",
|
|
720
|
+
display: "flex",
|
|
721
|
+
alignItems: "center",
|
|
722
|
+
justifyContent: "center",
|
|
723
|
+
fontFamily: MONO,
|
|
724
|
+
fontSize: 14,
|
|
725
|
+
fontWeight: 600,
|
|
726
|
+
color: C.ink,
|
|
727
|
+
boxShadow: [
|
|
728
|
+
"0 12px 24px -6px rgba(120,100,180,0.25)",
|
|
729
|
+
"inset 0 1.5px 0 rgba(255,255,255,0.95)",
|
|
730
|
+
`0 0 ${10 + breath * 14}px ${C.iriCyan}55`,
|
|
731
|
+
].join(", "),
|
|
732
|
+
}}
|
|
733
|
+
>
|
|
734
|
+
{w.label}
|
|
735
|
+
</div>
|
|
736
|
+
</div>
|
|
737
|
+
);
|
|
738
|
+
})}
|
|
739
|
+
|
|
740
|
+
{/* Inner sonar pulses — centered on (CX, CY) */}
|
|
741
|
+
{[0, 30, 60].map((p, i) => {
|
|
742
|
+
const cycle = (local + p) % 90;
|
|
743
|
+
const sc = interpolate(cycle, [0, 90], [0.6, 2.0], { easing: ease.expoOut });
|
|
744
|
+
const op = interpolate(cycle, [0, 30, 90], [0, 0.45, 0]);
|
|
745
|
+
return (
|
|
746
|
+
<div
|
|
747
|
+
key={i}
|
|
748
|
+
style={{
|
|
749
|
+
position: "absolute",
|
|
750
|
+
left: CX - COORD_SIZE / 2,
|
|
751
|
+
top: CY - COORD_SIZE / 2,
|
|
752
|
+
width: COORD_SIZE,
|
|
753
|
+
height: COORD_SIZE,
|
|
754
|
+
borderRadius: "50%",
|
|
755
|
+
border: `2px solid ${JC.rust}`,
|
|
756
|
+
transform: `scale(${sc})`,
|
|
757
|
+
transformOrigin: "center",
|
|
758
|
+
opacity: op,
|
|
759
|
+
}}
|
|
760
|
+
/>
|
|
761
|
+
);
|
|
762
|
+
})}
|
|
763
|
+
|
|
764
|
+
{/* Coordinator orb — exact viewport-centered */}
|
|
765
|
+
<div
|
|
766
|
+
style={{
|
|
767
|
+
position: "absolute",
|
|
768
|
+
left: CX - COORD_SIZE / 2,
|
|
769
|
+
top: CY - COORD_SIZE / 2,
|
|
770
|
+
width: COORD_SIZE,
|
|
771
|
+
height: COORD_SIZE,
|
|
772
|
+
}}
|
|
773
|
+
>
|
|
774
|
+
<IridescentRing size={COORD_SIZE} thickness={4} speed={1.4} borderRadius={9999} />
|
|
775
|
+
<div
|
|
776
|
+
style={{
|
|
777
|
+
position: "absolute",
|
|
778
|
+
inset: 4,
|
|
779
|
+
borderRadius: "50%",
|
|
780
|
+
background: `radial-gradient(circle at 35% 30%, #fff 0%, ${JC.rustSoft} 30%, ${JC.rust} 80%)`,
|
|
781
|
+
display: "flex",
|
|
782
|
+
flexDirection: "column",
|
|
783
|
+
alignItems: "center",
|
|
784
|
+
justifyContent: "center",
|
|
785
|
+
fontFamily: MONO,
|
|
786
|
+
color: "#fff",
|
|
787
|
+
boxShadow: `0 12px 40px ${JC.rust}80`,
|
|
788
|
+
}}
|
|
789
|
+
>
|
|
790
|
+
<div style={{ fontSize: 12, letterSpacing: "0.22em", opacity: 0.85, textTransform: "uppercase" }}>
|
|
791
|
+
coordinator
|
|
792
|
+
</div>
|
|
793
|
+
<div style={{ fontSize: 24, fontWeight: 700, marginTop: 4 }}>0</div>
|
|
794
|
+
</div>
|
|
795
|
+
</div>
|
|
796
|
+
</AbsoluteFill>
|
|
797
|
+
);
|
|
798
|
+
};
|
|
799
|
+
|
|
800
|
+
// ═══════════════════════════════════════════════════════════════
|
|
801
|
+
// COMMENT MORPH CHIP (Scene 8)
|
|
802
|
+
// Speech bubble with "AI" → morphs into DM envelope
|
|
803
|
+
// ═══════════════════════════════════════════════════════════════
|
|
804
|
+
const CommentMorphChip: React.FC<{ startFrame: number }> = ({ startFrame }) => {
|
|
805
|
+
const frame = useCurrentFrame();
|
|
806
|
+
const local = Math.max(0, frame - startFrame);
|
|
807
|
+
|
|
808
|
+
// Phase 1: speech-bubble scale-pop (0-30)
|
|
809
|
+
// Phase 2: settle (30-90)
|
|
810
|
+
// Phase 3: crossfade to envelope (90-120)
|
|
811
|
+
// Phase 4: envelope holds (120+)
|
|
812
|
+
const popIn = interpolate(local, [0, 24], [0, 1], {
|
|
813
|
+
extrapolateRight: "clamp",
|
|
814
|
+
easing: ease.backOut,
|
|
815
|
+
});
|
|
816
|
+
const bubbleOpacity = interpolate(local, [0, 24, 90, 110], [0, 1, 1, 0], {
|
|
817
|
+
extrapolateLeft: "clamp",
|
|
818
|
+
extrapolateRight: "clamp",
|
|
819
|
+
});
|
|
820
|
+
const envelopeOpacity = interpolate(local, [90, 110], [0, 1], {
|
|
821
|
+
extrapolateLeft: "clamp",
|
|
822
|
+
extrapolateRight: "clamp",
|
|
823
|
+
});
|
|
824
|
+
const envelopeScale = interpolate(local, [90, 110], [0.7, 1], {
|
|
825
|
+
extrapolateLeft: "clamp",
|
|
826
|
+
extrapolateRight: "clamp",
|
|
827
|
+
easing: ease.backOut,
|
|
828
|
+
});
|
|
829
|
+
|
|
830
|
+
return (
|
|
831
|
+
<div style={{ position: "relative", width: 280, height: 220 }}>
|
|
832
|
+
{/* Bubble */}
|
|
833
|
+
<div
|
|
834
|
+
style={{
|
|
835
|
+
position: "absolute",
|
|
836
|
+
inset: 0,
|
|
837
|
+
opacity: bubbleOpacity,
|
|
838
|
+
transform: `scale(${popIn})`,
|
|
839
|
+
willChange: "transform, opacity",
|
|
840
|
+
}}
|
|
841
|
+
>
|
|
842
|
+
<svg viewBox="0 0 280 220" style={{ width: "100%", height: "100%", overflow: "visible" }}>
|
|
843
|
+
<defs>
|
|
844
|
+
<linearGradient id="bubble-fill" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
845
|
+
<stop offset="0%" stopColor="#FFFFFFE6" />
|
|
846
|
+
<stop offset="100%" stopColor="#FFFFFFB3" />
|
|
847
|
+
</linearGradient>
|
|
848
|
+
</defs>
|
|
849
|
+
<path
|
|
850
|
+
d="M 30 30 H 250 a 24 24 0 0 1 24 24 v 100 a 24 24 0 0 1 -24 24 H 130 l -36 36 v -36 H 30 a 24 24 0 0 1 -24 -24 V 54 a 24 24 0 0 1 24 -24 z"
|
|
851
|
+
fill="url(#bubble-fill)"
|
|
852
|
+
stroke={C.glassBorder}
|
|
853
|
+
strokeWidth={2}
|
|
854
|
+
style={{ filter: `drop-shadow(0 12px 32px ${C.iriViolet}55)` }}
|
|
855
|
+
/>
|
|
856
|
+
</svg>
|
|
857
|
+
<div
|
|
858
|
+
style={{
|
|
859
|
+
position: "absolute",
|
|
860
|
+
top: 56,
|
|
861
|
+
left: 0,
|
|
862
|
+
right: 30,
|
|
863
|
+
textAlign: "center",
|
|
864
|
+
fontFamily: FONT,
|
|
865
|
+
fontSize: 84,
|
|
866
|
+
fontWeight: 800,
|
|
867
|
+
color: JC.rust,
|
|
868
|
+
letterSpacing: "-0.04em",
|
|
869
|
+
lineHeight: 1,
|
|
870
|
+
}}
|
|
871
|
+
>
|
|
872
|
+
AI
|
|
873
|
+
</div>
|
|
874
|
+
</div>
|
|
875
|
+
|
|
876
|
+
{/* Envelope (DM) */}
|
|
877
|
+
<div
|
|
878
|
+
style={{
|
|
879
|
+
position: "absolute",
|
|
880
|
+
inset: 0,
|
|
881
|
+
opacity: envelopeOpacity,
|
|
882
|
+
transform: `scale(${envelopeScale})`,
|
|
883
|
+
willChange: "transform, opacity",
|
|
884
|
+
}}
|
|
885
|
+
>
|
|
886
|
+
<svg viewBox="0 0 280 220" style={{ width: "100%", height: "100%", overflow: "visible" }}>
|
|
887
|
+
<defs>
|
|
888
|
+
<linearGradient id="env-fill" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
889
|
+
<stop offset="0%" stopColor={JC.rust} />
|
|
890
|
+
<stop offset="100%" stopColor={JC.rustDeep} />
|
|
891
|
+
</linearGradient>
|
|
892
|
+
</defs>
|
|
893
|
+
<rect
|
|
894
|
+
x={20}
|
|
895
|
+
y={50}
|
|
896
|
+
width={240}
|
|
897
|
+
height={140}
|
|
898
|
+
rx={20}
|
|
899
|
+
fill="url(#env-fill)"
|
|
900
|
+
style={{ filter: `drop-shadow(0 16px 36px ${JC.rust}80)` }}
|
|
901
|
+
/>
|
|
902
|
+
<path
|
|
903
|
+
d="M 20 60 L 140 140 L 260 60"
|
|
904
|
+
fill="none"
|
|
905
|
+
stroke="#fff"
|
|
906
|
+
strokeWidth={4}
|
|
907
|
+
strokeLinecap="round"
|
|
908
|
+
strokeLinejoin="round"
|
|
909
|
+
/>
|
|
910
|
+
<text
|
|
911
|
+
x={140}
|
|
912
|
+
y={172}
|
|
913
|
+
textAnchor="middle"
|
|
914
|
+
fontFamily={MONO}
|
|
915
|
+
fontSize={18}
|
|
916
|
+
fontWeight={600}
|
|
917
|
+
fill="#fff"
|
|
918
|
+
letterSpacing="0.18em"
|
|
919
|
+
>
|
|
920
|
+
DM SENT
|
|
921
|
+
</text>
|
|
922
|
+
</svg>
|
|
923
|
+
</div>
|
|
924
|
+
</div>
|
|
925
|
+
);
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
// ═══════════════════════════════════════════════════════════════
|
|
929
|
+
// CHROMATIC STREAK NUMBER — number with R/G/B channel offset
|
|
930
|
+
// (used in Scene 4 corner re-callbacks)
|
|
931
|
+
// ═══════════════════════════════════════════════════════════════
|
|
932
|
+
const ChromaticStat: React.FC<{
|
|
933
|
+
text: string;
|
|
934
|
+
startFrame: number;
|
|
935
|
+
size: number;
|
|
936
|
+
color?: string;
|
|
937
|
+
}> = ({ text, startFrame, size, color = C.ink }) => {
|
|
938
|
+
const frame = useCurrentFrame();
|
|
939
|
+
const local = Math.max(0, frame - startFrame);
|
|
940
|
+
const slide = interpolate(local, [0, 30], [120, 0], {
|
|
941
|
+
extrapolateLeft: "clamp",
|
|
942
|
+
extrapolateRight: "clamp",
|
|
943
|
+
easing: ease.expoOut,
|
|
944
|
+
});
|
|
945
|
+
const op = interpolate(local, [0, 18], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
946
|
+
const offset = interpolate(local, [0, 30], [10, 0], {
|
|
947
|
+
extrapolateLeft: "clamp",
|
|
948
|
+
extrapolateRight: "clamp",
|
|
949
|
+
easing: ease.expoOut,
|
|
950
|
+
});
|
|
951
|
+
return (
|
|
952
|
+
<div style={{ position: "relative", opacity: op, transform: `translateX(${slide}px)` }}>
|
|
953
|
+
<span
|
|
954
|
+
style={{
|
|
955
|
+
position: "absolute",
|
|
956
|
+
left: -offset,
|
|
957
|
+
top: 0,
|
|
958
|
+
fontFamily: MONO,
|
|
959
|
+
fontSize: size,
|
|
960
|
+
fontWeight: 700,
|
|
961
|
+
color: "#FF3344",
|
|
962
|
+
mixBlendMode: "multiply",
|
|
963
|
+
opacity: 0.7,
|
|
964
|
+
}}
|
|
965
|
+
>
|
|
966
|
+
{text}
|
|
967
|
+
</span>
|
|
968
|
+
<span
|
|
969
|
+
style={{
|
|
970
|
+
position: "absolute",
|
|
971
|
+
left: offset,
|
|
972
|
+
top: 0,
|
|
973
|
+
fontFamily: MONO,
|
|
974
|
+
fontSize: size,
|
|
975
|
+
fontWeight: 700,
|
|
976
|
+
color: "#22DDFF",
|
|
977
|
+
mixBlendMode: "multiply",
|
|
978
|
+
opacity: 0.7,
|
|
979
|
+
}}
|
|
980
|
+
>
|
|
981
|
+
{text}
|
|
982
|
+
</span>
|
|
983
|
+
<span
|
|
984
|
+
style={{
|
|
985
|
+
position: "relative",
|
|
986
|
+
fontFamily: MONO,
|
|
987
|
+
fontSize: size,
|
|
988
|
+
fontWeight: 700,
|
|
989
|
+
color,
|
|
990
|
+
}}
|
|
991
|
+
>
|
|
992
|
+
{text}
|
|
993
|
+
</span>
|
|
994
|
+
</div>
|
|
995
|
+
);
|
|
996
|
+
};
|
|
997
|
+
|
|
998
|
+
// ═══════════════════════════════════════════════════════════════
|
|
999
|
+
// SCENE 1 — HOOK (0–348, 11.6s)
|
|
1000
|
+
// VO: "63 times faster than Codex. 20 times more memory efficient
|
|
1001
|
+
// than Claude Code. Built-in memory, parallel sessions, agent
|
|
1002
|
+
// swarms... and it's completely free. Built by one guy."
|
|
1003
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1004
|
+
const HookScene: React.FC = () => {
|
|
1005
|
+
const frame = useCurrentFrame();
|
|
1006
|
+
const { fps } = useVideoConfig();
|
|
1007
|
+
const local = frame - BEAT.hook;
|
|
1008
|
+
|
|
1009
|
+
// Beat-aligned reveals (timed against subtitle 1: 0-6.82s, 16 words)
|
|
1010
|
+
// 63 → 0s, 20 → ~2.6s (frame 78), built-in memory chip → ~5.6s (frame 168),
|
|
1011
|
+
// FREE → ~6.5s (frame 195), built by one guy → ~10.7s (frame 320)
|
|
1012
|
+
const F_63 = 8;
|
|
1013
|
+
const F_20 = 78;
|
|
1014
|
+
const F_KEYWORDS = 168;
|
|
1015
|
+
const F_FREE = 220;
|
|
1016
|
+
const F_TAG = 320;
|
|
1017
|
+
|
|
1018
|
+
return (
|
|
1019
|
+
<AbsoluteFill>
|
|
1020
|
+
{/* Layer 1: Sonar rings */}
|
|
1021
|
+
<SonarRings />
|
|
1022
|
+
|
|
1023
|
+
{/* Layer 2: Three light beams */}
|
|
1024
|
+
<LightBeam delay={F_63 + 6} angle={-18} />
|
|
1025
|
+
<LightBeam delay={F_20 + 6} angle={22} />
|
|
1026
|
+
<LightBeam delay={F_KEYWORDS + 6} angle={-12} />
|
|
1027
|
+
|
|
1028
|
+
{/* Layer 3: Particle burst */}
|
|
1029
|
+
<ParticleBurst />
|
|
1030
|
+
|
|
1031
|
+
{/* Layer 4: Floating code glyphs */}
|
|
1032
|
+
<FloatingGlyphs startFrame={20} />
|
|
1033
|
+
|
|
1034
|
+
{/* Layer 6 — Stat counter "63×" */}
|
|
1035
|
+
<div
|
|
1036
|
+
style={{
|
|
1037
|
+
position: "absolute",
|
|
1038
|
+
left: 80,
|
|
1039
|
+
top: 440,
|
|
1040
|
+
opacity: interpolate(local, [F_63, F_63 + 12], [0, 1], {
|
|
1041
|
+
extrapolateLeft: "clamp",
|
|
1042
|
+
extrapolateRight: "clamp",
|
|
1043
|
+
}),
|
|
1044
|
+
transform: `translateY(${interpolate(local, [F_63, F_63 + 24], [40, 0], {
|
|
1045
|
+
extrapolateLeft: "clamp",
|
|
1046
|
+
extrapolateRight: "clamp",
|
|
1047
|
+
easing: ease.expoOut,
|
|
1048
|
+
})}px)`,
|
|
1049
|
+
}}
|
|
1050
|
+
>
|
|
1051
|
+
<div style={{ display: "flex", alignItems: "baseline", gap: 12 }}>
|
|
1052
|
+
<ScrambleText
|
|
1053
|
+
text="63"
|
|
1054
|
+
startFrame={F_63}
|
|
1055
|
+
duration={20}
|
|
1056
|
+
fontSize={240}
|
|
1057
|
+
fontWeight={800}
|
|
1058
|
+
fontFamily={MONO}
|
|
1059
|
+
color={JC.rust}
|
|
1060
|
+
letterSpacing="-0.06em"
|
|
1061
|
+
/>
|
|
1062
|
+
<span
|
|
1063
|
+
style={{
|
|
1064
|
+
fontFamily: MONO,
|
|
1065
|
+
fontSize: 120,
|
|
1066
|
+
fontWeight: 600,
|
|
1067
|
+
color: C.inkSoft,
|
|
1068
|
+
letterSpacing: "-0.04em",
|
|
1069
|
+
}}
|
|
1070
|
+
>
|
|
1071
|
+
×
|
|
1072
|
+
</span>
|
|
1073
|
+
</div>
|
|
1074
|
+
<div
|
|
1075
|
+
style={{
|
|
1076
|
+
fontFamily: MONO,
|
|
1077
|
+
fontSize: 22,
|
|
1078
|
+
fontWeight: 600,
|
|
1079
|
+
color: C.inkMuted,
|
|
1080
|
+
letterSpacing: "0.18em",
|
|
1081
|
+
textTransform: "uppercase",
|
|
1082
|
+
marginTop: 4,
|
|
1083
|
+
}}
|
|
1084
|
+
>
|
|
1085
|
+
faster than codex
|
|
1086
|
+
</div>
|
|
1087
|
+
</div>
|
|
1088
|
+
|
|
1089
|
+
{/* Stat counter "20×" — slides in from right */}
|
|
1090
|
+
<div
|
|
1091
|
+
style={{
|
|
1092
|
+
position: "absolute",
|
|
1093
|
+
right: 60,
|
|
1094
|
+
top: 800,
|
|
1095
|
+
textAlign: "right",
|
|
1096
|
+
opacity: interpolate(local, [F_20, F_20 + 14], [0, 1], {
|
|
1097
|
+
extrapolateLeft: "clamp",
|
|
1098
|
+
extrapolateRight: "clamp",
|
|
1099
|
+
}),
|
|
1100
|
+
transform: `translateX(${interpolate(local, [F_20, F_20 + 28], [80, 0], {
|
|
1101
|
+
extrapolateLeft: "clamp",
|
|
1102
|
+
extrapolateRight: "clamp",
|
|
1103
|
+
easing: ease.expoOut,
|
|
1104
|
+
})}px)`,
|
|
1105
|
+
}}
|
|
1106
|
+
>
|
|
1107
|
+
<div style={{ display: "flex", alignItems: "baseline", gap: 12, justifyContent: "flex-end" }}>
|
|
1108
|
+
<ScrambleText
|
|
1109
|
+
text="20"
|
|
1110
|
+
startFrame={F_20}
|
|
1111
|
+
duration={20}
|
|
1112
|
+
fontSize={220}
|
|
1113
|
+
fontWeight={800}
|
|
1114
|
+
fontFamily={MONO}
|
|
1115
|
+
color={C.iriViolet}
|
|
1116
|
+
letterSpacing="-0.06em"
|
|
1117
|
+
/>
|
|
1118
|
+
<span
|
|
1119
|
+
style={{
|
|
1120
|
+
fontFamily: MONO,
|
|
1121
|
+
fontSize: 110,
|
|
1122
|
+
fontWeight: 600,
|
|
1123
|
+
color: C.inkSoft,
|
|
1124
|
+
letterSpacing: "-0.04em",
|
|
1125
|
+
}}
|
|
1126
|
+
>
|
|
1127
|
+
×
|
|
1128
|
+
</span>
|
|
1129
|
+
</div>
|
|
1130
|
+
<div
|
|
1131
|
+
style={{
|
|
1132
|
+
fontFamily: MONO,
|
|
1133
|
+
fontSize: 22,
|
|
1134
|
+
fontWeight: 600,
|
|
1135
|
+
color: C.inkMuted,
|
|
1136
|
+
letterSpacing: "0.18em",
|
|
1137
|
+
textTransform: "uppercase",
|
|
1138
|
+
marginTop: 4,
|
|
1139
|
+
}}
|
|
1140
|
+
>
|
|
1141
|
+
less ram than claude code
|
|
1142
|
+
</div>
|
|
1143
|
+
</div>
|
|
1144
|
+
|
|
1145
|
+
{/* Keyword chips reveal: MEMORY · PARALLEL · SWARMS */}
|
|
1146
|
+
<div
|
|
1147
|
+
style={{
|
|
1148
|
+
position: "absolute",
|
|
1149
|
+
left: 0,
|
|
1150
|
+
right: 0,
|
|
1151
|
+
top: 1100,
|
|
1152
|
+
display: "flex",
|
|
1153
|
+
flexWrap: "wrap",
|
|
1154
|
+
gap: 12,
|
|
1155
|
+
justifyContent: "center",
|
|
1156
|
+
padding: "0 60px",
|
|
1157
|
+
}}
|
|
1158
|
+
>
|
|
1159
|
+
{[
|
|
1160
|
+
{ label: "memory", color: C.iriCyan, delay: 0 },
|
|
1161
|
+
{ label: "parallel", color: C.iriViolet, delay: 16 },
|
|
1162
|
+
{ label: "swarms", color: JC.rust, delay: 32 },
|
|
1163
|
+
].map((k) => {
|
|
1164
|
+
const lo = Math.max(0, local - (F_KEYWORDS + k.delay));
|
|
1165
|
+
const sp = spring({
|
|
1166
|
+
frame: lo,
|
|
1167
|
+
fps,
|
|
1168
|
+
from: 0,
|
|
1169
|
+
to: 1,
|
|
1170
|
+
config: { damping: 12, stiffness: 100 },
|
|
1171
|
+
});
|
|
1172
|
+
return (
|
|
1173
|
+
<Chip
|
|
1174
|
+
key={k.label}
|
|
1175
|
+
dotColor={k.color}
|
|
1176
|
+
style={{
|
|
1177
|
+
opacity: sp,
|
|
1178
|
+
transform: `scale(${0.6 + sp * 0.4})`,
|
|
1179
|
+
fontSize: 22,
|
|
1180
|
+
}}
|
|
1181
|
+
>
|
|
1182
|
+
{k.label}
|
|
1183
|
+
</Chip>
|
|
1184
|
+
);
|
|
1185
|
+
})}
|
|
1186
|
+
</div>
|
|
1187
|
+
|
|
1188
|
+
{/* Built by one guy tag */}
|
|
1189
|
+
<div
|
|
1190
|
+
style={{
|
|
1191
|
+
position: "absolute",
|
|
1192
|
+
left: 0,
|
|
1193
|
+
right: 0,
|
|
1194
|
+
top: 1430,
|
|
1195
|
+
textAlign: "center",
|
|
1196
|
+
opacity: interpolate(local, [F_TAG, F_TAG + 18], [0, 1], {
|
|
1197
|
+
extrapolateLeft: "clamp",
|
|
1198
|
+
extrapolateRight: "clamp",
|
|
1199
|
+
}),
|
|
1200
|
+
transform: `translateY(${interpolate(local, [F_TAG, F_TAG + 24], [20, 0], {
|
|
1201
|
+
extrapolateLeft: "clamp",
|
|
1202
|
+
extrapolateRight: "clamp",
|
|
1203
|
+
easing: ease.expoOut,
|
|
1204
|
+
})}px)`,
|
|
1205
|
+
}}
|
|
1206
|
+
>
|
|
1207
|
+
<Chip dotColor={C.iriRose} style={{ fontSize: 18 }}>
|
|
1208
|
+
built by one guy
|
|
1209
|
+
</Chip>
|
|
1210
|
+
</div>
|
|
1211
|
+
</AbsoluteFill>
|
|
1212
|
+
);
|
|
1213
|
+
};
|
|
1214
|
+
|
|
1215
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1216
|
+
// SCENE 2 — INTRO (348–554, 6.9s)
|
|
1217
|
+
// VO: "Welcome back guys. The tool's called jcode...
|
|
1218
|
+
// and once you see what it actually does, you might never
|
|
1219
|
+
// go back to the others."
|
|
1220
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1221
|
+
const IntroScene: React.FC = () => {
|
|
1222
|
+
const frame = useCurrentFrame();
|
|
1223
|
+
const { fps } = useVideoConfig();
|
|
1224
|
+
const local = frame - BEAT.intro;
|
|
1225
|
+
|
|
1226
|
+
// jcode logotype — letters scale-blur entry, stagger 4 frames
|
|
1227
|
+
const letters = "jcode".split("");
|
|
1228
|
+
const F_WELCOME = 0;
|
|
1229
|
+
const F_LOGO = 30;
|
|
1230
|
+
const F_SUBTITLE = 96;
|
|
1231
|
+
|
|
1232
|
+
// logo halo pulse (perpetual)
|
|
1233
|
+
const haloPulse = (Math.sin(local * 0.06) + 1) * 0.5;
|
|
1234
|
+
|
|
1235
|
+
return (
|
|
1236
|
+
<AbsoluteFill>
|
|
1237
|
+
{/* Floating glyphs continue from hook */}
|
|
1238
|
+
<FloatingGlyphs startFrame={-300} />
|
|
1239
|
+
|
|
1240
|
+
{/* "Welcome back" eyebrow */}
|
|
1241
|
+
<div
|
|
1242
|
+
style={{
|
|
1243
|
+
position: "absolute",
|
|
1244
|
+
top: 460,
|
|
1245
|
+
left: 0,
|
|
1246
|
+
right: 0,
|
|
1247
|
+
display: "flex",
|
|
1248
|
+
justifyContent: "center",
|
|
1249
|
+
opacity: interpolate(local, [F_WELCOME, F_WELCOME + 18], [0, 1], {
|
|
1250
|
+
extrapolateLeft: "clamp",
|
|
1251
|
+
extrapolateRight: "clamp",
|
|
1252
|
+
}),
|
|
1253
|
+
transform: `translateY(${interpolate(
|
|
1254
|
+
local,
|
|
1255
|
+
[F_WELCOME, F_WELCOME + 24],
|
|
1256
|
+
[16, 0],
|
|
1257
|
+
{ extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: ease.expoOut },
|
|
1258
|
+
)}px)`,
|
|
1259
|
+
}}
|
|
1260
|
+
>
|
|
1261
|
+
<EyebrowPill>Welcome back · the tool</EyebrowPill>
|
|
1262
|
+
</div>
|
|
1263
|
+
|
|
1264
|
+
{/* jcode logotype — center */}
|
|
1265
|
+
<div
|
|
1266
|
+
style={{
|
|
1267
|
+
position: "absolute",
|
|
1268
|
+
inset: 0,
|
|
1269
|
+
display: "flex",
|
|
1270
|
+
alignItems: "center",
|
|
1271
|
+
justifyContent: "center",
|
|
1272
|
+
}}
|
|
1273
|
+
>
|
|
1274
|
+
{/* halo behind logo */}
|
|
1275
|
+
<div
|
|
1276
|
+
style={{
|
|
1277
|
+
position: "absolute",
|
|
1278
|
+
width: 900,
|
|
1279
|
+
height: 320,
|
|
1280
|
+
borderRadius: "50%",
|
|
1281
|
+
background: `radial-gradient(ellipse at center, ${JC.rust}40 0%, ${JC.rust}10 40%, transparent 70%)`,
|
|
1282
|
+
filter: "blur(40px)",
|
|
1283
|
+
opacity: 0.4 + haloPulse * 0.4,
|
|
1284
|
+
}}
|
|
1285
|
+
/>
|
|
1286
|
+
<div
|
|
1287
|
+
style={{
|
|
1288
|
+
position: "relative",
|
|
1289
|
+
display: "flex",
|
|
1290
|
+
gap: "0.04em",
|
|
1291
|
+
fontFamily: FONT,
|
|
1292
|
+
fontSize: 280,
|
|
1293
|
+
fontWeight: 800,
|
|
1294
|
+
letterSpacing: "-0.06em",
|
|
1295
|
+
lineHeight: 1,
|
|
1296
|
+
color: C.ink,
|
|
1297
|
+
}}
|
|
1298
|
+
>
|
|
1299
|
+
{letters.map((ch, i) => {
|
|
1300
|
+
const lo = Math.max(0, local - (F_LOGO + i * 4));
|
|
1301
|
+
const op = interpolate(lo, [0, 22], [0, 1], {
|
|
1302
|
+
extrapolateRight: "clamp",
|
|
1303
|
+
easing: ease.expoOut,
|
|
1304
|
+
});
|
|
1305
|
+
const sc = interpolate(lo, [0, 22], [0.4, 1], {
|
|
1306
|
+
extrapolateRight: "clamp",
|
|
1307
|
+
easing: ease.backOut,
|
|
1308
|
+
});
|
|
1309
|
+
const blur = interpolate(lo, [0, 22], [16, 0], { extrapolateRight: "clamp" });
|
|
1310
|
+
return (
|
|
1311
|
+
<span
|
|
1312
|
+
key={i}
|
|
1313
|
+
style={{
|
|
1314
|
+
display: "inline-block",
|
|
1315
|
+
opacity: op,
|
|
1316
|
+
transform: `scale(${sc})`,
|
|
1317
|
+
filter: `blur(${blur}px)`,
|
|
1318
|
+
willChange: "transform, opacity, filter",
|
|
1319
|
+
// last char gets rust accent
|
|
1320
|
+
color: i === 0 ? JC.rust : C.ink,
|
|
1321
|
+
}}
|
|
1322
|
+
>
|
|
1323
|
+
{ch}
|
|
1324
|
+
</span>
|
|
1325
|
+
);
|
|
1326
|
+
})}
|
|
1327
|
+
</div>
|
|
1328
|
+
</div>
|
|
1329
|
+
|
|
1330
|
+
{/* Subtitle */}
|
|
1331
|
+
<div
|
|
1332
|
+
style={{
|
|
1333
|
+
position: "absolute",
|
|
1334
|
+
left: 80,
|
|
1335
|
+
right: 80,
|
|
1336
|
+
top: 1180,
|
|
1337
|
+
textAlign: "center",
|
|
1338
|
+
}}
|
|
1339
|
+
>
|
|
1340
|
+
<StaggeredWords
|
|
1341
|
+
text="the harness you might never go back from"
|
|
1342
|
+
startFrame={BEAT.intro + F_SUBTITLE}
|
|
1343
|
+
fontSize={42}
|
|
1344
|
+
fontWeight={500}
|
|
1345
|
+
color={C.inkSoft}
|
|
1346
|
+
align="center"
|
|
1347
|
+
perWordDelay={3}
|
|
1348
|
+
duration={20}
|
|
1349
|
+
letterSpacing="-0.02em"
|
|
1350
|
+
highlight="harness"
|
|
1351
|
+
highlightColor={JC.rust}
|
|
1352
|
+
/>
|
|
1353
|
+
</div>
|
|
1354
|
+
</AbsoluteFill>
|
|
1355
|
+
);
|
|
1356
|
+
};
|
|
1357
|
+
|
|
1358
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1359
|
+
// SCENE 3 — HARNESS EXPLAIN (554–907, 11.8s)
|
|
1360
|
+
// VO: "So here's the thing. Tools like Claude Code and Codex CLI
|
|
1361
|
+
// have a layer sitting between you and the AI model. It handles
|
|
1362
|
+
// your prompts, your tools, your memory, your sessions.
|
|
1363
|
+
// It's called a harness."
|
|
1364
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1365
|
+
const HarnessScene: React.FC = () => {
|
|
1366
|
+
const frame = useCurrentFrame();
|
|
1367
|
+
const local = frame - BEAT.harness;
|
|
1368
|
+
|
|
1369
|
+
return (
|
|
1370
|
+
<AbsoluteFill>
|
|
1371
|
+
<FloatingGlyphs startFrame={-500} />
|
|
1372
|
+
|
|
1373
|
+
{/* eyebrow */}
|
|
1374
|
+
<div
|
|
1375
|
+
style={{
|
|
1376
|
+
position: "absolute",
|
|
1377
|
+
top: 320,
|
|
1378
|
+
left: 0,
|
|
1379
|
+
right: 0,
|
|
1380
|
+
display: "flex",
|
|
1381
|
+
justifyContent: "center",
|
|
1382
|
+
opacity: interpolate(local, [0, 18], [0, 1], {
|
|
1383
|
+
extrapolateLeft: "clamp",
|
|
1384
|
+
extrapolateRight: "clamp",
|
|
1385
|
+
}),
|
|
1386
|
+
}}
|
|
1387
|
+
>
|
|
1388
|
+
<EyebrowPill>How they work today</EyebrowPill>
|
|
1389
|
+
</div>
|
|
1390
|
+
|
|
1391
|
+
{/* Diagram */}
|
|
1392
|
+
<HarnessDiagram startFrame={BEAT.harness + 12} />
|
|
1393
|
+
|
|
1394
|
+
{/* "It's called a harness" payoff line — appears late in scene */}
|
|
1395
|
+
<div
|
|
1396
|
+
style={{
|
|
1397
|
+
position: "absolute",
|
|
1398
|
+
left: 80,
|
|
1399
|
+
right: 80,
|
|
1400
|
+
top: 1500,
|
|
1401
|
+
textAlign: "center",
|
|
1402
|
+
opacity: interpolate(local, [240, 270], [0, 1], {
|
|
1403
|
+
extrapolateLeft: "clamp",
|
|
1404
|
+
extrapolateRight: "clamp",
|
|
1405
|
+
}),
|
|
1406
|
+
transform: `translateY(${interpolate(local, [240, 270], [16, 0], {
|
|
1407
|
+
extrapolateLeft: "clamp",
|
|
1408
|
+
extrapolateRight: "clamp",
|
|
1409
|
+
easing: ease.expoOut,
|
|
1410
|
+
})}px)`,
|
|
1411
|
+
}}
|
|
1412
|
+
>
|
|
1413
|
+
<div
|
|
1414
|
+
style={{
|
|
1415
|
+
fontFamily: FONT,
|
|
1416
|
+
fontSize: 38,
|
|
1417
|
+
fontWeight: 600,
|
|
1418
|
+
color: C.inkSoft,
|
|
1419
|
+
letterSpacing: "-0.02em",
|
|
1420
|
+
}}
|
|
1421
|
+
>
|
|
1422
|
+
it's called <span style={{ color: JC.rust, fontWeight: 800 }}>a harness</span>.
|
|
1423
|
+
</div>
|
|
1424
|
+
</div>
|
|
1425
|
+
</AbsoluteFill>
|
|
1426
|
+
);
|
|
1427
|
+
};
|
|
1428
|
+
|
|
1429
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1430
|
+
// SCENE 4 — RUST REBUILD (907–1154, 8.2s)
|
|
1431
|
+
// VO: "And jcode just rebuilt that entire harness from scratch in
|
|
1432
|
+
// Rust. [exhale] Which is exactly why those numbers are even
|
|
1433
|
+
// possible."
|
|
1434
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1435
|
+
const RustRebuildScene: React.FC = () => {
|
|
1436
|
+
const frame = useCurrentFrame();
|
|
1437
|
+
const { fps } = useVideoConfig();
|
|
1438
|
+
const local = frame - BEAT.rust;
|
|
1439
|
+
|
|
1440
|
+
// Particles converging inward (reverse of ParticleBurst)
|
|
1441
|
+
const ConvergingParticles = () => {
|
|
1442
|
+
const particles = Array.from({ length: 60 }, (_, i) => {
|
|
1443
|
+
const angle = (i / 60) * Math.PI * 2 + (i * 0.31);
|
|
1444
|
+
const distance = 200 + (i % 6) * 90;
|
|
1445
|
+
const size = 4 + (i % 4) * 3;
|
|
1446
|
+
const colorIdx = i % 4;
|
|
1447
|
+
const color = [JC.rust, JC.rustSoft, C.iriCyan, C.iriViolet][colorIdx];
|
|
1448
|
+
const delay = (i * 0.6) % 18;
|
|
1449
|
+
return { angle, distance, size, color, delay };
|
|
1450
|
+
});
|
|
1451
|
+
return (
|
|
1452
|
+
<AbsoluteFill style={{ alignItems: "center", justifyContent: "center" }}>
|
|
1453
|
+
{particles.map((p, i) => {
|
|
1454
|
+
const lo = Math.max(0, local - p.delay);
|
|
1455
|
+
const conv = interpolate(lo, [0, 60], [1, 0], {
|
|
1456
|
+
extrapolateLeft: "clamp",
|
|
1457
|
+
extrapolateRight: "clamp",
|
|
1458
|
+
easing: ease.expoOut,
|
|
1459
|
+
});
|
|
1460
|
+
const x = Math.cos(p.angle) * p.distance * conv;
|
|
1461
|
+
const y = Math.sin(p.angle) * p.distance * conv;
|
|
1462
|
+
const op = interpolate(lo, [0, 12, 60, 90], [0, 0.85, 0.4, 0]);
|
|
1463
|
+
return (
|
|
1464
|
+
<div
|
|
1465
|
+
key={i}
|
|
1466
|
+
style={{
|
|
1467
|
+
position: "absolute",
|
|
1468
|
+
width: p.size,
|
|
1469
|
+
height: p.size,
|
|
1470
|
+
borderRadius: "50%",
|
|
1471
|
+
background: p.color,
|
|
1472
|
+
boxShadow: `0 0 ${p.size * 2}px ${p.color}`,
|
|
1473
|
+
transform: `translate(${x}px, ${y}px)`,
|
|
1474
|
+
opacity: op,
|
|
1475
|
+
willChange: "transform, opacity",
|
|
1476
|
+
}}
|
|
1477
|
+
/>
|
|
1478
|
+
);
|
|
1479
|
+
})}
|
|
1480
|
+
</AbsoluteFill>
|
|
1481
|
+
);
|
|
1482
|
+
};
|
|
1483
|
+
|
|
1484
|
+
const F_EYEBROW = 0;
|
|
1485
|
+
const F_RUST = 30;
|
|
1486
|
+
const F_HEADLINE = 76;
|
|
1487
|
+
const F_STATS = 138;
|
|
1488
|
+
const F_TAG = 188;
|
|
1489
|
+
|
|
1490
|
+
const headlineWords = ["rebuilt", "from", "scratch"];
|
|
1491
|
+
|
|
1492
|
+
return (
|
|
1493
|
+
<AbsoluteFill>
|
|
1494
|
+
<ConvergingParticles />
|
|
1495
|
+
|
|
1496
|
+
{/* Eyebrow */}
|
|
1497
|
+
<div
|
|
1498
|
+
style={{
|
|
1499
|
+
position: "absolute",
|
|
1500
|
+
top: 340,
|
|
1501
|
+
left: 0,
|
|
1502
|
+
right: 0,
|
|
1503
|
+
display: "flex",
|
|
1504
|
+
justifyContent: "center",
|
|
1505
|
+
opacity: interpolate(local, [F_EYEBROW, F_EYEBROW + 18], [0, 1], {
|
|
1506
|
+
extrapolateLeft: "clamp",
|
|
1507
|
+
extrapolateRight: "clamp",
|
|
1508
|
+
}),
|
|
1509
|
+
transform: `translateY(${interpolate(local, [F_EYEBROW, F_EYEBROW + 24], [12, 0], {
|
|
1510
|
+
extrapolateLeft: "clamp",
|
|
1511
|
+
extrapolateRight: "clamp",
|
|
1512
|
+
easing: ease.expoOut,
|
|
1513
|
+
})}px)`,
|
|
1514
|
+
}}
|
|
1515
|
+
>
|
|
1516
|
+
<EyebrowPill>rebuilt in rust</EyebrowPill>
|
|
1517
|
+
</div>
|
|
1518
|
+
|
|
1519
|
+
{/* Rust logo — center */}
|
|
1520
|
+
<div
|
|
1521
|
+
style={{
|
|
1522
|
+
position: "absolute",
|
|
1523
|
+
left: 0,
|
|
1524
|
+
right: 0,
|
|
1525
|
+
top: 500,
|
|
1526
|
+
display: "flex",
|
|
1527
|
+
justifyContent: "center",
|
|
1528
|
+
}}
|
|
1529
|
+
>
|
|
1530
|
+
{(() => {
|
|
1531
|
+
const lo = Math.max(0, local - F_RUST);
|
|
1532
|
+
const sp = spring({
|
|
1533
|
+
frame: lo,
|
|
1534
|
+
fps,
|
|
1535
|
+
from: 0,
|
|
1536
|
+
to: 1,
|
|
1537
|
+
config: { damping: 12, stiffness: 90, mass: 0.9 },
|
|
1538
|
+
});
|
|
1539
|
+
const rot = interpolate(lo, [0, 50], [-90, 0], {
|
|
1540
|
+
extrapolateLeft: "clamp",
|
|
1541
|
+
extrapolateRight: "clamp",
|
|
1542
|
+
easing: ease.expoOut,
|
|
1543
|
+
});
|
|
1544
|
+
const breath = (Math.sin(local * 0.05) + 1) * 0.5;
|
|
1545
|
+
return (
|
|
1546
|
+
<div
|
|
1547
|
+
style={{
|
|
1548
|
+
position: "relative",
|
|
1549
|
+
width: 280,
|
|
1550
|
+
height: 280,
|
|
1551
|
+
opacity: sp,
|
|
1552
|
+
transform: `scale(${sp}) rotate(${rot}deg)`,
|
|
1553
|
+
willChange: "transform, opacity",
|
|
1554
|
+
}}
|
|
1555
|
+
>
|
|
1556
|
+
<div
|
|
1557
|
+
style={{
|
|
1558
|
+
position: "absolute",
|
|
1559
|
+
inset: -50,
|
|
1560
|
+
borderRadius: "50%",
|
|
1561
|
+
background: `radial-gradient(circle, ${JC.rust}55 0%, ${JC.rust}18 32%, transparent 70%)`,
|
|
1562
|
+
filter: "blur(40px)",
|
|
1563
|
+
opacity: 0.6 + breath * 0.4,
|
|
1564
|
+
}}
|
|
1565
|
+
/>
|
|
1566
|
+
<Img
|
|
1567
|
+
src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
|
|
1568
|
+
style={{ width: "100%", height: "100%", position: "relative" }}
|
|
1569
|
+
/>
|
|
1570
|
+
</div>
|
|
1571
|
+
);
|
|
1572
|
+
})()}
|
|
1573
|
+
</div>
|
|
1574
|
+
|
|
1575
|
+
{/* Headline — per-WORD entrance, single line via nowrap */}
|
|
1576
|
+
<div
|
|
1577
|
+
style={{
|
|
1578
|
+
position: "absolute",
|
|
1579
|
+
left: 0,
|
|
1580
|
+
right: 0,
|
|
1581
|
+
top: 920,
|
|
1582
|
+
display: "flex",
|
|
1583
|
+
justifyContent: "center",
|
|
1584
|
+
alignItems: "baseline",
|
|
1585
|
+
gap: "0.32em",
|
|
1586
|
+
whiteSpace: "nowrap",
|
|
1587
|
+
fontFamily: FONT,
|
|
1588
|
+
fontSize: 92,
|
|
1589
|
+
fontWeight: 800,
|
|
1590
|
+
letterSpacing: "-0.045em",
|
|
1591
|
+
lineHeight: 1,
|
|
1592
|
+
color: C.ink,
|
|
1593
|
+
}}
|
|
1594
|
+
>
|
|
1595
|
+
{headlineWords.map((w, i) => {
|
|
1596
|
+
const lo = Math.max(0, local - (F_HEADLINE + i * 8));
|
|
1597
|
+
const op = interpolate(lo, [0, 22], [0, 1], { extrapolateRight: "clamp" });
|
|
1598
|
+
const y = interpolate(lo, [0, 28], [36, 0], {
|
|
1599
|
+
extrapolateRight: "clamp",
|
|
1600
|
+
easing: ease.expoOut,
|
|
1601
|
+
});
|
|
1602
|
+
const blur = interpolate(lo, [0, 22], [10, 0], { extrapolateRight: "clamp" });
|
|
1603
|
+
const isRust = w === "scratch";
|
|
1604
|
+
return (
|
|
1605
|
+
<span
|
|
1606
|
+
key={i}
|
|
1607
|
+
style={{
|
|
1608
|
+
display: "inline-block",
|
|
1609
|
+
opacity: op,
|
|
1610
|
+
transform: `translateY(${y}px)`,
|
|
1611
|
+
filter: `blur(${blur}px)`,
|
|
1612
|
+
color: isRust ? JC.rust : C.ink,
|
|
1613
|
+
willChange: "transform, opacity, filter",
|
|
1614
|
+
}}
|
|
1615
|
+
>
|
|
1616
|
+
{w}
|
|
1617
|
+
</span>
|
|
1618
|
+
);
|
|
1619
|
+
})}
|
|
1620
|
+
</div>
|
|
1621
|
+
|
|
1622
|
+
{/* Speed-callback row: 63x faster + 20x less RAM (visual proof of "those numbers") */}
|
|
1623
|
+
<div
|
|
1624
|
+
style={{
|
|
1625
|
+
position: "absolute",
|
|
1626
|
+
left: 0,
|
|
1627
|
+
right: 0,
|
|
1628
|
+
top: 1080,
|
|
1629
|
+
display: "flex",
|
|
1630
|
+
justifyContent: "center",
|
|
1631
|
+
alignItems: "center",
|
|
1632
|
+
gap: 56,
|
|
1633
|
+
opacity: interpolate(local, [F_STATS, F_STATS + 24], [0, 1], {
|
|
1634
|
+
extrapolateLeft: "clamp",
|
|
1635
|
+
extrapolateRight: "clamp",
|
|
1636
|
+
}),
|
|
1637
|
+
transform: `translateY(${interpolate(local, [F_STATS, F_STATS + 28], [20, 0], {
|
|
1638
|
+
extrapolateLeft: "clamp",
|
|
1639
|
+
extrapolateRight: "clamp",
|
|
1640
|
+
easing: ease.expoOut,
|
|
1641
|
+
})}px)`,
|
|
1642
|
+
}}
|
|
1643
|
+
>
|
|
1644
|
+
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }}>
|
|
1645
|
+
<div style={{ fontFamily: MONO, fontSize: 110, fontWeight: 800, color: JC.rust, letterSpacing: "-0.06em", lineHeight: 1 }}>63×</div>
|
|
1646
|
+
<div style={{ fontFamily: MONO, fontSize: 18, fontWeight: 600, color: C.inkMuted, letterSpacing: "0.18em", textTransform: "uppercase" }}>faster</div>
|
|
1647
|
+
</div>
|
|
1648
|
+
<div style={{ width: 1, height: 90, background: C.hairline }} />
|
|
1649
|
+
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }}>
|
|
1650
|
+
<div style={{ fontFamily: MONO, fontSize: 110, fontWeight: 800, color: C.iriViolet, letterSpacing: "-0.06em", lineHeight: 1 }}>20×</div>
|
|
1651
|
+
<div style={{ fontFamily: MONO, fontSize: 18, fontWeight: 600, color: C.inkMuted, letterSpacing: "0.18em", textTransform: "uppercase" }}>less ram</div>
|
|
1652
|
+
</div>
|
|
1653
|
+
</div>
|
|
1654
|
+
|
|
1655
|
+
{/* Closing tag */}
|
|
1656
|
+
<div
|
|
1657
|
+
style={{
|
|
1658
|
+
position: "absolute",
|
|
1659
|
+
left: 0,
|
|
1660
|
+
right: 0,
|
|
1661
|
+
top: 1320,
|
|
1662
|
+
display: "flex",
|
|
1663
|
+
justifyContent: "center",
|
|
1664
|
+
opacity: interpolate(local, [F_TAG, F_TAG + 24], [0, 1], {
|
|
1665
|
+
extrapolateLeft: "clamp",
|
|
1666
|
+
extrapolateRight: "clamp",
|
|
1667
|
+
}),
|
|
1668
|
+
}}
|
|
1669
|
+
>
|
|
1670
|
+
<Chip dotColor={JC.rust} style={{ fontSize: 14 }}>
|
|
1671
|
+
why those numbers happen
|
|
1672
|
+
</Chip>
|
|
1673
|
+
</div>
|
|
1674
|
+
</AbsoluteFill>
|
|
1675
|
+
);
|
|
1676
|
+
};
|
|
1677
|
+
|
|
1678
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1679
|
+
// SCENE 5 — MEMORY (1154–1463, 10.3s)
|
|
1680
|
+
// VO: "Now about that built-in memory system... zero extra setup.
|
|
1681
|
+
// It just remembers stuff naturally, kinda like a human would.
|
|
1682
|
+
// No more re-explaining your codebase every session."
|
|
1683
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1684
|
+
const MemoryScene: React.FC = () => {
|
|
1685
|
+
const frame = useCurrentFrame();
|
|
1686
|
+
const { fps } = useVideoConfig();
|
|
1687
|
+
const local = frame - BEAT.memory;
|
|
1688
|
+
|
|
1689
|
+
return (
|
|
1690
|
+
<AbsoluteFill>
|
|
1691
|
+
{/* eyebrow */}
|
|
1692
|
+
<div
|
|
1693
|
+
style={{
|
|
1694
|
+
position: "absolute",
|
|
1695
|
+
top: 320,
|
|
1696
|
+
left: 0,
|
|
1697
|
+
right: 0,
|
|
1698
|
+
display: "flex",
|
|
1699
|
+
justifyContent: "center",
|
|
1700
|
+
opacity: interpolate(local, [0, 18], [0, 1], {
|
|
1701
|
+
extrapolateLeft: "clamp",
|
|
1702
|
+
extrapolateRight: "clamp",
|
|
1703
|
+
}),
|
|
1704
|
+
}}
|
|
1705
|
+
>
|
|
1706
|
+
<EyebrowPill>built-in memory</EyebrowPill>
|
|
1707
|
+
</div>
|
|
1708
|
+
|
|
1709
|
+
{/* "ZERO SETUP" badge */}
|
|
1710
|
+
<div
|
|
1711
|
+
style={{
|
|
1712
|
+
position: "absolute",
|
|
1713
|
+
left: 0,
|
|
1714
|
+
right: 0,
|
|
1715
|
+
top: 410,
|
|
1716
|
+
display: "flex",
|
|
1717
|
+
justifyContent: "center",
|
|
1718
|
+
}}
|
|
1719
|
+
>
|
|
1720
|
+
{(() => {
|
|
1721
|
+
const lo = Math.max(0, local - 30);
|
|
1722
|
+
const sp = spring({
|
|
1723
|
+
frame: lo,
|
|
1724
|
+
fps,
|
|
1725
|
+
from: 0,
|
|
1726
|
+
to: 1,
|
|
1727
|
+
config: { damping: 11, stiffness: 95 },
|
|
1728
|
+
});
|
|
1729
|
+
return (
|
|
1730
|
+
<div
|
|
1731
|
+
style={{
|
|
1732
|
+
...glassBase,
|
|
1733
|
+
borderRadius: 9999,
|
|
1734
|
+
padding: "16px 36px",
|
|
1735
|
+
display: "flex",
|
|
1736
|
+
alignItems: "center",
|
|
1737
|
+
gap: 12,
|
|
1738
|
+
opacity: sp,
|
|
1739
|
+
transform: `scale(${0.6 + sp * 0.4})`,
|
|
1740
|
+
fontFamily: FONT,
|
|
1741
|
+
fontSize: 38,
|
|
1742
|
+
fontWeight: 800,
|
|
1743
|
+
color: JC.rust,
|
|
1744
|
+
letterSpacing: "-0.02em",
|
|
1745
|
+
boxShadow: [
|
|
1746
|
+
"0 16px 32px -8px rgba(229,90,26,0.25)",
|
|
1747
|
+
"inset 0 1.5px 0 rgba(255,255,255,0.95)",
|
|
1748
|
+
].join(", "),
|
|
1749
|
+
}}
|
|
1750
|
+
>
|
|
1751
|
+
<div
|
|
1752
|
+
style={{
|
|
1753
|
+
width: 10,
|
|
1754
|
+
height: 10,
|
|
1755
|
+
borderRadius: "50%",
|
|
1756
|
+
background: JC.rust,
|
|
1757
|
+
boxShadow: `0 0 14px ${JC.rust}`,
|
|
1758
|
+
}}
|
|
1759
|
+
/>
|
|
1760
|
+
ZERO SETUP
|
|
1761
|
+
</div>
|
|
1762
|
+
);
|
|
1763
|
+
})()}
|
|
1764
|
+
</div>
|
|
1765
|
+
|
|
1766
|
+
{/* Constellation */}
|
|
1767
|
+
<MemoryConstellation startFrame={BEAT.memory + 50} />
|
|
1768
|
+
|
|
1769
|
+
{/* Quote-styled phrase below */}
|
|
1770
|
+
<div
|
|
1771
|
+
style={{
|
|
1772
|
+
position: "absolute",
|
|
1773
|
+
left: 80,
|
|
1774
|
+
right: 80,
|
|
1775
|
+
top: 1400,
|
|
1776
|
+
textAlign: "center",
|
|
1777
|
+
}}
|
|
1778
|
+
>
|
|
1779
|
+
<StaggeredWords
|
|
1780
|
+
text="remembers your codebase, naturally."
|
|
1781
|
+
startFrame={BEAT.memory + 180}
|
|
1782
|
+
fontSize={40}
|
|
1783
|
+
fontWeight={500}
|
|
1784
|
+
color={C.inkSoft}
|
|
1785
|
+
align="center"
|
|
1786
|
+
perWordDelay={4}
|
|
1787
|
+
duration={22}
|
|
1788
|
+
letterSpacing="-0.02em"
|
|
1789
|
+
highlight="naturally"
|
|
1790
|
+
highlightColor={JC.rust}
|
|
1791
|
+
/>
|
|
1792
|
+
</div>
|
|
1793
|
+
</AbsoluteFill>
|
|
1794
|
+
);
|
|
1795
|
+
};
|
|
1796
|
+
|
|
1797
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1798
|
+
// SCENE 6 — PARALLEL SESSIONS (1463–1660, 6.6s) — CLIP SCENE
|
|
1799
|
+
// VO: "Parallel sessions are native too. So you can run multiple
|
|
1800
|
+
// agents side by side without melting your laptop."
|
|
1801
|
+
// Wrapped in <Sequence> at root so OffthreadVideo timing works.
|
|
1802
|
+
// useCurrentFrame() inside this scene returns LOCAL frames.
|
|
1803
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1804
|
+
const ParallelScene: React.FC = () => {
|
|
1805
|
+
const local = useCurrentFrame(); // LOCAL — Sequence.from = BEAT.parallel
|
|
1806
|
+
const { fps } = useVideoConfig();
|
|
1807
|
+
|
|
1808
|
+
// Top frame entrance (jcode-repo)
|
|
1809
|
+
const topSp = spring({
|
|
1810
|
+
frame: local,
|
|
1811
|
+
fps,
|
|
1812
|
+
from: 0,
|
|
1813
|
+
to: 1,
|
|
1814
|
+
config: { damping: 14, stiffness: 100 },
|
|
1815
|
+
});
|
|
1816
|
+
// Bottom frame entrance (parallel-jscode), staggered
|
|
1817
|
+
const botSp = spring({
|
|
1818
|
+
frame: Math.max(0, local - 8),
|
|
1819
|
+
fps,
|
|
1820
|
+
from: 0,
|
|
1821
|
+
to: 1,
|
|
1822
|
+
config: { damping: 14, stiffness: 100 },
|
|
1823
|
+
});
|
|
1824
|
+
|
|
1825
|
+
// Connecting line pulse
|
|
1826
|
+
const linePulse = (Math.sin(local * 0.18) + 1) * 0.5;
|
|
1827
|
+
|
|
1828
|
+
return (
|
|
1829
|
+
<AbsoluteFill>
|
|
1830
|
+
{/* Header eyebrow */}
|
|
1831
|
+
<div
|
|
1832
|
+
style={{
|
|
1833
|
+
position: "absolute",
|
|
1834
|
+
top: 80,
|
|
1835
|
+
left: 0,
|
|
1836
|
+
right: 0,
|
|
1837
|
+
display: "flex",
|
|
1838
|
+
justifyContent: "center",
|
|
1839
|
+
}}
|
|
1840
|
+
>
|
|
1841
|
+
<EyebrowPill>parallel sessions · native</EyebrowPill>
|
|
1842
|
+
</div>
|
|
1843
|
+
|
|
1844
|
+
{/* Top frame: jcode-repo.mov */}
|
|
1845
|
+
<div
|
|
1846
|
+
style={{
|
|
1847
|
+
position: "absolute",
|
|
1848
|
+
top: 200,
|
|
1849
|
+
left: 60,
|
|
1850
|
+
width: 960,
|
|
1851
|
+
height: 720,
|
|
1852
|
+
borderRadius: 28,
|
|
1853
|
+
overflow: "hidden",
|
|
1854
|
+
...glassBase,
|
|
1855
|
+
opacity: topSp,
|
|
1856
|
+
transform: `translateY(${(1 - topSp) * -40}px)`,
|
|
1857
|
+
willChange: "transform, opacity",
|
|
1858
|
+
}}
|
|
1859
|
+
>
|
|
1860
|
+
{/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
|
|
1861
|
+
{/* glass tint overlay */}
|
|
1862
|
+
<div
|
|
1863
|
+
style={{
|
|
1864
|
+
position: "absolute",
|
|
1865
|
+
inset: 0,
|
|
1866
|
+
background: "linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(120,100,180,0.08) 100%)",
|
|
1867
|
+
pointerEvents: "none",
|
|
1868
|
+
}}
|
|
1869
|
+
/>
|
|
1870
|
+
</div>
|
|
1871
|
+
|
|
1872
|
+
{/* Caption: agent · 1 */}
|
|
1873
|
+
<div
|
|
1874
|
+
style={{
|
|
1875
|
+
position: "absolute",
|
|
1876
|
+
top: 940,
|
|
1877
|
+
left: 60,
|
|
1878
|
+
opacity: topSp,
|
|
1879
|
+
}}
|
|
1880
|
+
>
|
|
1881
|
+
<Chip dotColor={C.iriCyan} style={{ fontSize: 16 }}>
|
|
1882
|
+
agent · 1
|
|
1883
|
+
</Chip>
|
|
1884
|
+
</div>
|
|
1885
|
+
|
|
1886
|
+
{/* Connecting glow line */}
|
|
1887
|
+
<div
|
|
1888
|
+
style={{
|
|
1889
|
+
position: "absolute",
|
|
1890
|
+
top: 990,
|
|
1891
|
+
left: 60,
|
|
1892
|
+
width: 960,
|
|
1893
|
+
height: 2,
|
|
1894
|
+
background: `linear-gradient(90deg, ${C.iriCyan}, ${JC.rust}, ${C.iriViolet})`,
|
|
1895
|
+
opacity: 0.3 + linePulse * 0.5,
|
|
1896
|
+
boxShadow: `0 0 ${8 + linePulse * 14}px ${JC.rust}`,
|
|
1897
|
+
}}
|
|
1898
|
+
/>
|
|
1899
|
+
|
|
1900
|
+
{/* "running 2 sessions in parallel" status */}
|
|
1901
|
+
<div
|
|
1902
|
+
style={{
|
|
1903
|
+
position: "absolute",
|
|
1904
|
+
top: 1010,
|
|
1905
|
+
left: 0,
|
|
1906
|
+
right: 0,
|
|
1907
|
+
display: "flex",
|
|
1908
|
+
justifyContent: "center",
|
|
1909
|
+
opacity: interpolate(local, [12, 28], [0, 1], {
|
|
1910
|
+
extrapolateLeft: "clamp",
|
|
1911
|
+
extrapolateRight: "clamp",
|
|
1912
|
+
}),
|
|
1913
|
+
}}
|
|
1914
|
+
>
|
|
1915
|
+
<div
|
|
1916
|
+
style={{
|
|
1917
|
+
...glassBase,
|
|
1918
|
+
borderRadius: 9999,
|
|
1919
|
+
padding: "8px 18px",
|
|
1920
|
+
fontFamily: MONO,
|
|
1921
|
+
fontSize: 14,
|
|
1922
|
+
fontWeight: 600,
|
|
1923
|
+
color: JC.rust,
|
|
1924
|
+
letterSpacing: "0.18em",
|
|
1925
|
+
textTransform: "uppercase",
|
|
1926
|
+
display: "flex",
|
|
1927
|
+
alignItems: "center",
|
|
1928
|
+
gap: 8,
|
|
1929
|
+
}}
|
|
1930
|
+
>
|
|
1931
|
+
<div
|
|
1932
|
+
style={{
|
|
1933
|
+
width: 8,
|
|
1934
|
+
height: 8,
|
|
1935
|
+
borderRadius: "50%",
|
|
1936
|
+
background: JC.rust,
|
|
1937
|
+
boxShadow: `0 0 10px ${JC.rust}`,
|
|
1938
|
+
}}
|
|
1939
|
+
/>
|
|
1940
|
+
2 sessions · 0ms sync
|
|
1941
|
+
</div>
|
|
1942
|
+
</div>
|
|
1943
|
+
|
|
1944
|
+
{/* Bottom frame: parallel-jscode.mp4 */}
|
|
1945
|
+
<div
|
|
1946
|
+
style={{
|
|
1947
|
+
position: "absolute",
|
|
1948
|
+
top: 1060,
|
|
1949
|
+
left: 60,
|
|
1950
|
+
width: 960,
|
|
1951
|
+
height: 720,
|
|
1952
|
+
borderRadius: 28,
|
|
1953
|
+
overflow: "hidden",
|
|
1954
|
+
...glassBase,
|
|
1955
|
+
opacity: botSp,
|
|
1956
|
+
transform: `translateY(${(1 - botSp) * 40}px)`,
|
|
1957
|
+
willChange: "transform, opacity",
|
|
1958
|
+
}}
|
|
1959
|
+
>
|
|
1960
|
+
{/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
|
|
1961
|
+
<div
|
|
1962
|
+
style={{
|
|
1963
|
+
position: "absolute",
|
|
1964
|
+
inset: 0,
|
|
1965
|
+
background: "linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(229,90,26,0.08) 100%)",
|
|
1966
|
+
pointerEvents: "none",
|
|
1967
|
+
}}
|
|
1968
|
+
/>
|
|
1969
|
+
</div>
|
|
1970
|
+
|
|
1971
|
+
{/* Caption: agent · 2 */}
|
|
1972
|
+
<div
|
|
1973
|
+
style={{
|
|
1974
|
+
position: "absolute",
|
|
1975
|
+
bottom: 80,
|
|
1976
|
+
right: 60,
|
|
1977
|
+
opacity: botSp,
|
|
1978
|
+
}}
|
|
1979
|
+
>
|
|
1980
|
+
<Chip dotColor={JC.rust} style={{ fontSize: 16 }}>
|
|
1981
|
+
agent · 2
|
|
1982
|
+
</Chip>
|
|
1983
|
+
</div>
|
|
1984
|
+
</AbsoluteFill>
|
|
1985
|
+
);
|
|
1986
|
+
};
|
|
1987
|
+
|
|
1988
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1989
|
+
// SCENE 7 — SWARMS (1660–1995, 11.2s)
|
|
1990
|
+
// VO: "And the craziest part? Agents can spawn their own teammates.
|
|
1991
|
+
// One becomes the coordinator, the others become workers...
|
|
1992
|
+
// and they all collab on the same codebase, in real time."
|
|
1993
|
+
// ═══════════════════════════════════════════════════════════════
|
|
1994
|
+
const SwarmsScene: React.FC = () => {
|
|
1995
|
+
const frame = useCurrentFrame();
|
|
1996
|
+
const { fps } = useVideoConfig();
|
|
1997
|
+
const local = frame - BEAT.swarms;
|
|
1998
|
+
|
|
1999
|
+
return (
|
|
2000
|
+
<AbsoluteFill>
|
|
2001
|
+
{/* eyebrow */}
|
|
2002
|
+
<div
|
|
2003
|
+
style={{
|
|
2004
|
+
position: "absolute",
|
|
2005
|
+
top: 320,
|
|
2006
|
+
left: 0,
|
|
2007
|
+
right: 0,
|
|
2008
|
+
display: "flex",
|
|
2009
|
+
justifyContent: "center",
|
|
2010
|
+
opacity: interpolate(local, [0, 18], [0, 1], {
|
|
2011
|
+
extrapolateLeft: "clamp",
|
|
2012
|
+
extrapolateRight: "clamp",
|
|
2013
|
+
}),
|
|
2014
|
+
}}
|
|
2015
|
+
>
|
|
2016
|
+
<EyebrowPill>agents spawn agents</EyebrowPill>
|
|
2017
|
+
</div>
|
|
2018
|
+
|
|
2019
|
+
{/* Headline */}
|
|
2020
|
+
<div
|
|
2021
|
+
style={{
|
|
2022
|
+
position: "absolute",
|
|
2023
|
+
left: 80,
|
|
2024
|
+
right: 80,
|
|
2025
|
+
top: 410,
|
|
2026
|
+
textAlign: "center",
|
|
2027
|
+
}}
|
|
2028
|
+
>
|
|
2029
|
+
<StaggeredWords
|
|
2030
|
+
text="agents that spawn teammates"
|
|
2031
|
+
startFrame={BEAT.swarms + 6}
|
|
2032
|
+
fontSize={62}
|
|
2033
|
+
fontWeight={800}
|
|
2034
|
+
color={C.ink}
|
|
2035
|
+
align="center"
|
|
2036
|
+
perWordDelay={4}
|
|
2037
|
+
duration={22}
|
|
2038
|
+
letterSpacing="-0.04em"
|
|
2039
|
+
highlight="spawn"
|
|
2040
|
+
highlightColor={JC.rust}
|
|
2041
|
+
/>
|
|
2042
|
+
</div>
|
|
2043
|
+
|
|
2044
|
+
{/* Swarm diagram */}
|
|
2045
|
+
<AgentSwarmDiagram startFrame={BEAT.swarms + 60} fps={fps} />
|
|
2046
|
+
|
|
2047
|
+
{/* Bottom row of role chips */}
|
|
2048
|
+
<div
|
|
2049
|
+
style={{
|
|
2050
|
+
position: "absolute",
|
|
2051
|
+
left: 0,
|
|
2052
|
+
right: 0,
|
|
2053
|
+
top: 1480,
|
|
2054
|
+
display: "flex",
|
|
2055
|
+
justifyContent: "center",
|
|
2056
|
+
gap: 16,
|
|
2057
|
+
opacity: interpolate(local, [200, 230], [0, 1], {
|
|
2058
|
+
extrapolateLeft: "clamp",
|
|
2059
|
+
extrapolateRight: "clamp",
|
|
2060
|
+
}),
|
|
2061
|
+
}}
|
|
2062
|
+
>
|
|
2063
|
+
<Chip dotColor={JC.rust}>1 coordinator</Chip>
|
|
2064
|
+
<Chip dotColor={C.iriCyan}>n workers</Chip>
|
|
2065
|
+
<Chip dotColor={C.iriViolet}>shared codebase</Chip>
|
|
2066
|
+
</div>
|
|
2067
|
+
</AbsoluteFill>
|
|
2068
|
+
);
|
|
2069
|
+
};
|
|
2070
|
+
|
|
2071
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2072
|
+
// SCENE 8 — CTA (1995–2164, 5.6s)
|
|
2073
|
+
// VO: "If you want the repo link, just comment 'AI' below and
|
|
2074
|
+
// I'll slide it straight into your DMs"
|
|
2075
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2076
|
+
const CTAScene: React.FC = () => {
|
|
2077
|
+
const frame = useCurrentFrame();
|
|
2078
|
+
const { fps } = useVideoConfig();
|
|
2079
|
+
const local = frame - BEAT.cta;
|
|
2080
|
+
|
|
2081
|
+
return (
|
|
2082
|
+
<AbsoluteFill>
|
|
2083
|
+
{/* Sonar rings continue at heightened intensity */}
|
|
2084
|
+
<SonarRings />
|
|
2085
|
+
|
|
2086
|
+
{/* Particle burst kick at scene start */}
|
|
2087
|
+
<ParticleBurst />
|
|
2088
|
+
|
|
2089
|
+
{/* Eyebrow */}
|
|
2090
|
+
<div
|
|
2091
|
+
style={{
|
|
2092
|
+
position: "absolute",
|
|
2093
|
+
top: 380,
|
|
2094
|
+
left: 0,
|
|
2095
|
+
right: 0,
|
|
2096
|
+
display: "flex",
|
|
2097
|
+
justifyContent: "center",
|
|
2098
|
+
opacity: interpolate(local, [0, 18], [0, 1], {
|
|
2099
|
+
extrapolateLeft: "clamp",
|
|
2100
|
+
extrapolateRight: "clamp",
|
|
2101
|
+
}),
|
|
2102
|
+
}}
|
|
2103
|
+
>
|
|
2104
|
+
<EyebrowPill>want the repo?</EyebrowPill>
|
|
2105
|
+
</div>
|
|
2106
|
+
|
|
2107
|
+
{/* Big "COMMENT 'AI'" headline with iridescent fill */}
|
|
2108
|
+
<div
|
|
2109
|
+
style={{
|
|
2110
|
+
position: "absolute",
|
|
2111
|
+
left: 0,
|
|
2112
|
+
right: 0,
|
|
2113
|
+
top: 480,
|
|
2114
|
+
textAlign: "center",
|
|
2115
|
+
fontFamily: FONT,
|
|
2116
|
+
fontWeight: 800,
|
|
2117
|
+
letterSpacing: "-0.04em",
|
|
2118
|
+
lineHeight: 1.0,
|
|
2119
|
+
opacity: interpolate(local, [10, 36], [0, 1], {
|
|
2120
|
+
extrapolateLeft: "clamp",
|
|
2121
|
+
extrapolateRight: "clamp",
|
|
2122
|
+
}),
|
|
2123
|
+
transform: `translateY(${interpolate(local, [10, 36], [30, 0], {
|
|
2124
|
+
extrapolateLeft: "clamp",
|
|
2125
|
+
extrapolateRight: "clamp",
|
|
2126
|
+
easing: ease.expoOut,
|
|
2127
|
+
})}px)`,
|
|
2128
|
+
}}
|
|
2129
|
+
>
|
|
2130
|
+
<div style={{ fontSize: 72, color: C.ink }}>comment</div>
|
|
2131
|
+
<div
|
|
2132
|
+
style={{
|
|
2133
|
+
fontSize: 220,
|
|
2134
|
+
background: `linear-gradient(90deg, ${C.iriCyan}, ${JC.rust}, ${C.iriViolet})`,
|
|
2135
|
+
WebkitBackgroundClip: "text",
|
|
2136
|
+
WebkitTextFillColor: "transparent",
|
|
2137
|
+
backgroundClip: "text",
|
|
2138
|
+
color: "transparent",
|
|
2139
|
+
marginTop: -10,
|
|
2140
|
+
}}
|
|
2141
|
+
>
|
|
2142
|
+
"AI"
|
|
2143
|
+
</div>
|
|
2144
|
+
</div>
|
|
2145
|
+
|
|
2146
|
+
{/* Comment → DM morph chip, center */}
|
|
2147
|
+
<div
|
|
2148
|
+
style={{
|
|
2149
|
+
position: "absolute",
|
|
2150
|
+
left: 0,
|
|
2151
|
+
right: 0,
|
|
2152
|
+
top: 950,
|
|
2153
|
+
display: "flex",
|
|
2154
|
+
justifyContent: "center",
|
|
2155
|
+
}}
|
|
2156
|
+
>
|
|
2157
|
+
<CommentMorphChip startFrame={BEAT.cta + 40} />
|
|
2158
|
+
</div>
|
|
2159
|
+
|
|
2160
|
+
{/* "and i'll DM you" caption */}
|
|
2161
|
+
<div
|
|
2162
|
+
style={{
|
|
2163
|
+
position: "absolute",
|
|
2164
|
+
left: 0,
|
|
2165
|
+
right: 0,
|
|
2166
|
+
top: 1240,
|
|
2167
|
+
textAlign: "center",
|
|
2168
|
+
fontFamily: FONT,
|
|
2169
|
+
fontSize: 36,
|
|
2170
|
+
fontWeight: 500,
|
|
2171
|
+
color: C.inkSoft,
|
|
2172
|
+
letterSpacing: "-0.02em",
|
|
2173
|
+
opacity: interpolate(local, [80, 110], [0, 1], {
|
|
2174
|
+
extrapolateLeft: "clamp",
|
|
2175
|
+
extrapolateRight: "clamp",
|
|
2176
|
+
}),
|
|
2177
|
+
}}
|
|
2178
|
+
>
|
|
2179
|
+
i'll slide it straight into your DMs
|
|
2180
|
+
</div>
|
|
2181
|
+
|
|
2182
|
+
{/* Bottom logo lockup */}
|
|
2183
|
+
<div
|
|
2184
|
+
style={{
|
|
2185
|
+
position: "absolute",
|
|
2186
|
+
left: 0,
|
|
2187
|
+
right: 0,
|
|
2188
|
+
top: 1380,
|
|
2189
|
+
display: "flex",
|
|
2190
|
+
flexDirection: "column",
|
|
2191
|
+
alignItems: "center",
|
|
2192
|
+
gap: 12,
|
|
2193
|
+
opacity: interpolate(local, [100, 130], [0, 1], {
|
|
2194
|
+
extrapolateLeft: "clamp",
|
|
2195
|
+
extrapolateRight: "clamp",
|
|
2196
|
+
}),
|
|
2197
|
+
}}
|
|
2198
|
+
>
|
|
2199
|
+
<div
|
|
2200
|
+
style={{
|
|
2201
|
+
fontFamily: FONT,
|
|
2202
|
+
fontSize: 100,
|
|
2203
|
+
fontWeight: 800,
|
|
2204
|
+
letterSpacing: "-0.06em",
|
|
2205
|
+
color: C.ink,
|
|
2206
|
+
}}
|
|
2207
|
+
>
|
|
2208
|
+
<span style={{ color: JC.rust }}>j</span>code
|
|
2209
|
+
</div>
|
|
2210
|
+
<Chip dotColor={JC.rust} style={{ fontSize: 14 }}>
|
|
2211
|
+
free · open source
|
|
2212
|
+
</Chip>
|
|
2213
|
+
</div>
|
|
2214
|
+
</AbsoluteFill>
|
|
2215
|
+
);
|
|
2216
|
+
};
|
|
2217
|
+
|
|
2218
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2219
|
+
// MAIN COMPOSITION
|
|
2220
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2221
|
+
export const JcodeReel: React.FC = () => {
|
|
2222
|
+
const frame = useCurrentFrame();
|
|
2223
|
+
const { width, height } = useVideoConfig();
|
|
2224
|
+
|
|
2225
|
+
return (
|
|
2226
|
+
<AbsoluteFill
|
|
2227
|
+
style={{
|
|
2228
|
+
background: `radial-gradient(ellipse at 50% 30%, ${C.bgWarm} 0%, ${C.bg} 50%, ${C.bgCool} 100%)`,
|
|
2229
|
+
width,
|
|
2230
|
+
height,
|
|
2231
|
+
overflow: "hidden",
|
|
2232
|
+
}}
|
|
2233
|
+
>
|
|
2234
|
+
{/* === Persistent overlays (run all 72s) === */}
|
|
2235
|
+
<CausticBlobs />
|
|
2236
|
+
<HairlineGrid opacity={0.04} />
|
|
2237
|
+
<FilmGrain />
|
|
2238
|
+
|
|
2239
|
+
{/* === Scenes (conditional render at root → useCurrentFrame() returns global) === */}
|
|
2240
|
+
{frame >= BEAT.hook && frame < BEAT.intro && <HookScene />}
|
|
2241
|
+
{frame >= BEAT.intro && frame < BEAT.harness && <IntroScene />}
|
|
2242
|
+
{frame >= BEAT.harness && frame < BEAT.rust && <HarnessScene />}
|
|
2243
|
+
{frame >= BEAT.rust && frame < BEAT.memory && <RustRebuildScene />}
|
|
2244
|
+
{frame >= BEAT.memory && frame < BEAT.parallel && <MemoryScene />}
|
|
2245
|
+
{frame >= BEAT.swarms && frame < BEAT.cta && <SwarmsScene />}
|
|
2246
|
+
{frame >= BEAT.cta && frame < BEAT.end && <CTAScene />}
|
|
2247
|
+
|
|
2248
|
+
{/* === Parallel scene wrapped in Sequence so OffthreadVideo timing works
|
|
2249
|
+
(per memory: useCurrentFrame() inside is LOCAL) === */}
|
|
2250
|
+
<Sequence from={BEAT.parallel} durationInFrames={BEAT.swarms - BEAT.parallel}>
|
|
2251
|
+
<ParallelScene />
|
|
2252
|
+
</Sequence>
|
|
2253
|
+
|
|
2254
|
+
{/* === Vignette === */}
|
|
2255
|
+
<AbsoluteFill
|
|
2256
|
+
style={{
|
|
2257
|
+
background:
|
|
2258
|
+
"radial-gradient(ellipse at center, transparent 50%, rgba(14,14,18,0.18) 100%)",
|
|
2259
|
+
pointerEvents: "none",
|
|
2260
|
+
}}
|
|
2261
|
+
/>
|
|
2262
|
+
|
|
2263
|
+
{/* === Audio === */}
|
|
2264
|
+
{/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}
|
|
2265
|
+
</AbsoluteFill>
|
|
2266
|
+
);
|
|
2267
|
+
};
|