getraw 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/video/index.html DELETED
@@ -1,684 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
6
- <style>
7
- * { margin: 0; padding: 0; box-sizing: border-box; }
8
- body {
9
- width: 1920px;
10
- height: 1080px;
11
- overflow: hidden;
12
- background: #0c0c0f;
13
- font-family: "Space Grotesk", sans-serif;
14
- }
15
- .scene {
16
- position: absolute;
17
- top: 0; left: 0;
18
- width: 1920px;
19
- height: 1080px;
20
- overflow: hidden;
21
- background: #0c0c0f;
22
- }
23
- #scene1 { z-index: 1; }
24
- #scene2 { z-index: 2; opacity: 0; }
25
- #scene3 { z-index: 3; opacity: 0; }
26
- #scene4 { z-index: 4; opacity: 0; }
27
- #scene5 { z-index: 5; opacity: 0; }
28
- #scene6 { z-index: 6; opacity: 0; }
29
-
30
- /* ===== SHARED ===== */
31
- .mono { font-family: "JetBrains Mono", monospace; }
32
- .label {
33
- font-family: "JetBrains Mono", monospace;
34
- font-size: 18px;
35
- font-weight: 500;
36
- text-transform: uppercase;
37
- letter-spacing: 0.08em;
38
- color: #6b6b80;
39
- }
40
- .accent { color: #00ff88; }
41
- .muted { color: #6b6b80; }
42
- .scan-lines {
43
- position: absolute;
44
- top: 0; left: 0;
45
- width: 100%; height: 100%;
46
- background: repeating-linear-gradient(
47
- 0deg,
48
- transparent,
49
- transparent 2px,
50
- rgba(255,255,255,0.015) 2px,
51
- rgba(255,255,255,0.015) 4px
52
- );
53
- pointer-events: none;
54
- }
55
- .grid-dots {
56
- position: absolute;
57
- top: 0; left: 0;
58
- width: 100%; height: 100%;
59
- background-image: radial-gradient(circle, #2a2a3a 1px, transparent 1px);
60
- background-size: 40px 40px;
61
- opacity: 0.3;
62
- pointer-events: none;
63
- }
64
-
65
- /* ===== SCENE 1: HOOK ===== */
66
- .s1-content {
67
- display: flex;
68
- flex-direction: column;
69
- justify-content: center;
70
- width: 100%; height: 100%;
71
- padding: 200px 160px;
72
- }
73
- .s1-prompt {
74
- font-family: "JetBrains Mono", monospace;
75
- font-size: 36px;
76
- color: #e8e8ec;
77
- white-space: nowrap;
78
- }
79
- .s1-prompt .dollar { color: #00ff88; }
80
- .s1-cursor {
81
- display: inline-block;
82
- width: 16px; height: 40px;
83
- background: #00ff88;
84
- vertical-align: middle;
85
- margin-left: 4px;
86
- }
87
- .s1-output {
88
- margin-top: 32px;
89
- font-family: "JetBrains Mono", monospace;
90
- font-size: 20px;
91
- color: #6b6b80;
92
- line-height: 1.8;
93
- }
94
- .s1-output .format-line { opacity: 0; }
95
- .s1-output .highlight { color: #00ff88; }
96
- .s1-version {
97
- position: absolute;
98
- top: 40px; right: 60px;
99
- }
100
- .s1-frame {
101
- position: absolute;
102
- top: 0; left: 0;
103
- width: 100%; height: 100%;
104
- border: 1px solid #2a2a3a;
105
- pointer-events: none;
106
- }
107
-
108
- /* ===== SCENE 2: NAME DROP ===== */
109
- .s2-content {
110
- display: flex;
111
- flex-direction: column;
112
- justify-content: center;
113
- align-items: center;
114
- width: 100%; height: 100%;
115
- padding: 100px;
116
- text-align: center;
117
- }
118
- .s2-glow {
119
- position: absolute;
120
- top: 50%; left: 50%;
121
- transform: translate(-50%, -50%);
122
- width: 800px; height: 800px;
123
- border-radius: 50%;
124
- background: radial-gradient(circle, rgba(0,255,136,0.12) 0%, transparent 70%);
125
- pointer-events: none;
126
- }
127
- .s2-ghost {
128
- position: absolute;
129
- top: 50%; left: 50%;
130
- transform: translate(-50%, -50%);
131
- font-family: "Space Grotesk", sans-serif;
132
- font-size: 200px;
133
- font-weight: 700;
134
- color: rgba(255,255,255,0.03);
135
- white-space: nowrap;
136
- pointer-events: none;
137
- letter-spacing: 0.1em;
138
- }
139
- .s2-title {
140
- font-size: 160px;
141
- font-weight: 700;
142
- color: #00ff88;
143
- letter-spacing: -0.03em;
144
- line-height: 1;
145
- }
146
- .s2-subtitle {
147
- font-family: "JetBrains Mono", monospace;
148
- font-size: 32px;
149
- color: #6b6b80;
150
- margin-top: 24px;
151
- }
152
- .s2-rule-top, .s2-rule-bottom {
153
- position: absolute;
154
- left: 0;
155
- width: 100%;
156
- height: 1px;
157
- background: #2a2a3a;
158
- transform: scaleX(0);
159
- }
160
- .s2-rule-top { top: 80px; }
161
- .s2-rule-bottom { bottom: 80px; }
162
- .s2-badge {
163
- position: absolute;
164
- bottom: 40px; right: 60px;
165
- }
166
-
167
- /* ===== SCENE 3: THE PROBLEM ===== */
168
- .s3-content {
169
- display: flex;
170
- width: 100%; height: 100%;
171
- padding: 120px 160px;
172
- }
173
- .s3-left {
174
- flex: 1;
175
- display: flex;
176
- flex-direction: column;
177
- gap: 20px;
178
- }
179
- .s3-right {
180
- flex: 1;
181
- }
182
- .s3-divider {
183
- position: absolute;
184
- left: 50%; top: 0;
185
- width: 1px; height: 100%;
186
- background: #2a2a3a;
187
- }
188
- .s3-heading {
189
- font-family: "Space Grotesk", sans-serif;
190
- font-size: 72px;
191
- font-weight: 700;
192
- color: #e8e8ec;
193
- margin-bottom: 40px;
194
- }
195
- .s3-pain {
196
- font-family: "JetBrains Mono", monospace;
197
- font-size: 28px;
198
- color: #e8e8ec;
199
- padding: 16px 24px;
200
- background: #161620;
201
- border: 1px solid #2a2a3a;
202
- border-radius: 4px;
203
- position: relative;
204
- opacity: 0;
205
- }
206
- .s3-strike {
207
- position: absolute;
208
- top: 50%; left: 16px; right: 16px;
209
- height: 2px;
210
- background: #ff4444;
211
- transform: scaleX(0);
212
- transform-origin: left;
213
- }
214
- .s3-label-top {
215
- position: absolute;
216
- top: 40px;
217
- left: 0;
218
- width: 100%;
219
- text-align: center;
220
- }
221
-
222
- /* ===== SCENE 4: THE SOLUTION ===== */
223
- .s4-content {
224
- display: flex;
225
- flex-direction: column;
226
- justify-content: center;
227
- width: 100%; height: 100%;
228
- padding: 120px 160px;
229
- gap: 40px;
230
- }
231
- .s4-heading {
232
- font-size: 64px;
233
- font-weight: 700;
234
- color: #00ff88;
235
- letter-spacing: -0.03em;
236
- }
237
- .s4-cards {
238
- display: flex;
239
- gap: 32px;
240
- }
241
- .s4-card {
242
- flex: 1;
243
- background: #161620;
244
- border: 1px solid #2a2a3a;
245
- border-radius: 8px;
246
- padding: 40px;
247
- opacity: 0;
248
- }
249
- .s4-card-label {
250
- font-family: "JetBrains Mono", monospace;
251
- font-size: 16px;
252
- font-weight: 500;
253
- text-transform: uppercase;
254
- letter-spacing: 0.08em;
255
- color: #00ff88;
256
- margin-bottom: 16px;
257
- }
258
- .s4-card-text {
259
- font-family: "Space Grotesk", sans-serif;
260
- font-size: 28px;
261
- font-weight: 500;
262
- color: #e8e8ec;
263
- line-height: 1.4;
264
- }
265
- .s4-arrow {
266
- color: #00ff88;
267
- font-size: 24px;
268
- margin-top: 20px;
269
- opacity: 0;
270
- }
271
- .s4-circuit {
272
- position: absolute;
273
- bottom: 0; left: 0;
274
- width: 100%; height: 200px;
275
- background: linear-gradient(0deg, rgba(0,255,136,0.03) 0%, transparent 100%);
276
- pointer-events: none;
277
- }
278
-
279
- /* ===== SCENE 5: STATS ===== */
280
- .s5-content {
281
- display: flex;
282
- justify-content: center;
283
- align-items: center;
284
- width: 100%; height: 100%;
285
- padding: 120px 120px;
286
- gap: 80px;
287
- }
288
- .s5-stat {
289
- text-align: center;
290
- flex: 1;
291
- }
292
- .s5-number {
293
- font-family: "Space Grotesk", sans-serif;
294
- font-size: 120px;
295
- font-weight: 700;
296
- color: #00ff88;
297
- line-height: 1;
298
- letter-spacing: -0.03em;
299
- font-variant-numeric: tabular-nums;
300
- }
301
- .s5-stat-label {
302
- font-family: "JetBrains Mono", monospace;
303
- font-size: 22px;
304
- color: #6b6b80;
305
- margin-top: 16px;
306
- text-transform: uppercase;
307
- letter-spacing: 0.08em;
308
- opacity: 0;
309
- }
310
- .s5-line {
311
- position: absolute;
312
- top: 0;
313
- width: 2px; height: 100%;
314
- background: rgba(0,255,136,0.08);
315
- pointer-events: none;
316
- }
317
- .s5-line-1 { left: 33.3%; }
318
- .s5-line-2 { left: 66.6%; }
319
- .s5-label-top {
320
- position: absolute;
321
- top: 50px;
322
- left: 0;
323
- width: 100%;
324
- text-align: center;
325
- }
326
-
327
- /* ===== SCENE 6: CTA ===== */
328
- .s6-content {
329
- display: flex;
330
- flex-direction: column;
331
- justify-content: center;
332
- align-items: center;
333
- width: 100%; height: 100%;
334
- padding: 200px 160px;
335
- gap: 32px;
336
- text-align: center;
337
- }
338
- .s6-terminal {
339
- background: #161620;
340
- border: 1px solid #2a2a3a;
341
- border-radius: 8px;
342
- padding: 48px 64px;
343
- min-width: 900px;
344
- }
345
- .s6-command {
346
- font-family: "JetBrains Mono", monospace;
347
- font-size: 36px;
348
- color: #00ff88;
349
- white-space: nowrap;
350
- }
351
- .s6-info {
352
- font-family: "JetBrains Mono", monospace;
353
- font-size: 22px;
354
- color: #6b6b80;
355
- opacity: 0;
356
- }
357
- .s6-brand {
358
- position: absolute;
359
- bottom: 50px;
360
- left: 0;
361
- width: 100%;
362
- text-align: center;
363
- font-family: "JetBrains Mono", monospace;
364
- font-size: 20px;
365
- color: #6b6b80;
366
- letter-spacing: 0.05em;
367
- opacity: 0;
368
- }
369
- .s6-glow {
370
- position: absolute;
371
- top: 50%; left: 50%;
372
- transform: translate(-50%, -50%);
373
- width: 600px; height: 600px;
374
- border-radius: 50%;
375
- background: radial-gradient(circle, rgba(0,255,136,0.06) 0%, transparent 70%);
376
- pointer-events: none;
377
- }
378
- </style>
379
- </head>
380
- <body>
381
- <div data-hf-id="hf-j7pz" id="root" data-composition-id="main" data-width="1920" data-height="1080" data-start="0" data-duration="30">
382
-
383
- <!-- ===== SCENE 1: HOOK ===== -->
384
- <div data-hf-id="hf-zet7" id="scene1" class="scene">
385
- <div data-hf-id="hf-w55g" class="grid-dots" data-layout-ignore=""></div>
386
- <div data-hf-id="hf-8lzs" class="scan-lines" data-layout-ignore=""></div>
387
- <div data-hf-id="hf-91dh" class="s1-frame" data-layout-ignore=""></div>
388
- <div data-hf-id="hf-c714" class="s1-version label">v0.1.0</div>
389
- <div data-hf-id="hf-kwf4" class="s1-content">
390
- <div data-hf-id="hf-1exr" class="s1-prompt">
391
- <span data-hf-id="hf-gnnh" class="dollar">$</span> <span data-hf-id="hf-xajh" id="s1-typed"></span><span data-hf-id="hf-82m5" class="s1-cursor" id="s1-cursor"></span>
392
- </div>
393
- <div data-hf-id="hf-m07e" class="s1-output" id="s1-output">
394
- <div data-hf-id="hf-ugfk" class="format-line">[info] Extracting URL: youtube.com/watch?v=dQw4...</div>
395
- <div data-hf-id="hf-n2cs" class="format-line">[info] <span data-hf-id="hf-c5od" class="highlight">8 formats found</span></div>
396
- <div data-hf-id="hf-mp1k" class="format-line"> 137 mp4 1920x1080 <span data-hf-id="hf-vk0g" class="highlight">DASH video</span> 2.5MiB</div>
397
- <div data-hf-id="hf-45w0" class="format-line"> 248 webm 1920x1080 DASH video 1.8MiB</div>
398
- <div data-hf-id="hf-i2qz" class="format-line"> 140 m4a audio only <span data-hf-id="hf-6kt1" class="highlight">DASH audio</span> 128k</div>
399
- <div data-hf-id="hf-hvgl" class="format-line"> 251 opus audio only DASH audio 160k</div>
400
- <div data-hf-id="hf-fp6o" class="format-line">[download] <span data-hf-id="hf-duwl" class="highlight">100%</span> of 4.3MiB in 0.8s</div>
401
- </div>
402
- </div>
403
- </div>
404
-
405
- <!-- ===== SCENE 2: NAME DROP ===== -->
406
- <div data-hf-id="hf-qqxc" id="scene2" class="scene">
407
- <div data-hf-id="hf-rvx2" class="s2-glow" data-layout-ignore=""></div>
408
- <div data-hf-id="hf-fuxz" class="s2-ghost" data-layout-ignore="">MEDIA DOWNLOADER</div>
409
- <div data-hf-id="hf-lacw" class="scan-lines" data-layout-ignore=""></div>
410
- <div data-hf-id="hf-jfzh" class="s2-rule-top" data-layout-ignore=""></div>
411
- <div data-hf-id="hf-l86j" class="s2-rule-bottom" data-layout-ignore=""></div>
412
- <div data-hf-id="hf-wwfv" class="s2-content">
413
- <div data-hf-id="hf-st90" class="s2-title">getraw</div>
414
- <div data-hf-id="hf-jlcw" class="s2-subtitle" id="s2-sub"></div>
415
- </div>
416
- <div data-hf-id="hf-ayze" class="s2-badge label">v0.1.0</div>
417
- </div>
418
-
419
- <!-- ===== SCENE 3: THE PROBLEM ===== -->
420
- <div data-hf-id="hf-ril5" id="scene3" class="scene">
421
- <div data-hf-id="hf-yjvw" class="grid-dots" data-layout-ignore=""></div>
422
- <div data-hf-id="hf-0mm3" class="s3-divider" data-layout-ignore=""></div>
423
- <div data-hf-id="hf-7erp" class="s3-label-top label">THE PROBLEM</div>
424
- <div data-hf-id="hf-2tii" class="s3-content">
425
- <div data-hf-id="hf-vf04" class="s3-left">
426
- <div data-hf-id="hf-kpqz" class="s3-heading">yt-dlp</div>
427
- <div data-hf-id="hf-6vcd" class="s3-pain" id="pain1">Python dependency<div data-hf-id="hf-ap5l" class="s3-strike"></div></div>
428
- <div data-hf-id="hf-2om2" class="s3-pain" id="pain2">External JS runtime required<div data-hf-id="hf-drql" class="s3-strike"></div></div>
429
- <div data-hf-id="hf-1nwg" class="s3-pain" id="pain3">36K-line JS interpreter<div data-hf-id="hf-eyno" class="s3-strike"></div></div>
430
- <div data-hf-id="hf-gl4j" class="s3-pain" id="pain4">~2s cold startup<div data-hf-id="hf-ekcn" class="s3-strike"></div></div>
431
- </div>
432
- <div data-hf-id="hf-ya97" class="s3-right"></div>
433
- </div>
434
- </div>
435
-
436
- <!-- ===== SCENE 4: THE SOLUTION ===== -->
437
- <div data-hf-id="hf-gn3i" id="scene4" class="scene">
438
- <div data-hf-id="hf-15ia" class="s4-circuit" data-layout-ignore=""></div>
439
- <div data-hf-id="hf-k3ft" class="scan-lines" data-layout-ignore=""></div>
440
- <div data-hf-id="hf-eq11" class="s4-content">
441
- <div data-hf-id="hf-d1mq" class="s4-heading">getraw</div>
442
- <div data-hf-id="hf-1rcn" class="s4-cards">
443
- <div data-hf-id="hf-0ng5" class="s4-card" id="card1">
444
- <div data-hf-id="hf-hp9a" class="s4-card-label">01 — RUNTIME</div>
445
- <div data-hf-id="hf-98t4" class="s4-card-text">Native JS execution in Bun. No external runtime.</div>
446
- <div data-hf-id="hf-w2c8" class="s4-arrow mono">→</div>
447
- </div>
448
- <div data-hf-id="hf-4lk6" class="s4-card" id="card2">
449
- <div data-hf-id="hf-rmcw" class="s4-card-label">02 — EXTRACTORS</div>
450
- <div data-hf-id="hf-5anw" class="s4-card-text">30+ sites. YouTube, Twitter, TikTok, and more.</div>
451
- <div data-hf-id="hf-dtm8" class="s4-arrow mono">→</div>
452
- </div>
453
- <div data-hf-id="hf-ar9z" class="s4-card" id="card3">
454
- <div data-hf-id="hf-obhb" class="s4-card-label">03 — SPEED</div>
455
- <div data-hf-id="hf-7jxz" class="s4-card-text">50ms startup. Concurrent HLS/DASH segments.</div>
456
- <div data-hf-id="hf-cmp5" class="s4-arrow mono">→</div>
457
- </div>
458
- </div>
459
- </div>
460
- </div>
461
-
462
- <!-- ===== SCENE 5: STATS ===== -->
463
- <div data-hf-id="hf-kl7j" id="scene5" class="scene">
464
- <div data-hf-id="hf-pww7" class="s5-line s5-line-1" data-layout-ignore=""></div>
465
- <div data-hf-id="hf-bt0c" class="s5-line s5-line-2" data-layout-ignore=""></div>
466
- <div data-hf-id="hf-khqu" class="scan-lines" data-layout-ignore=""></div>
467
- <div data-hf-id="hf-42s5" class="s5-label-top label">BENCHMARKS</div>
468
- <div data-hf-id="hf-kry4" class="s5-content">
469
- <div data-hf-id="hf-fsi3" class="s5-stat">
470
- <div data-hf-id="hf-vcgd" class="s5-number" id="stat1">30+</div>
471
- <div data-hf-id="hf-wl0o" class="s5-stat-label" id="stat1-label">Sites Supported</div>
472
- </div>
473
- <div data-hf-id="hf-rlgr" class="s5-stat">
474
- <div data-hf-id="hf-mfsr" class="s5-number" id="stat2">386</div>
475
- <div data-hf-id="hf-3tit" class="s5-stat-label" id="stat2-label">Tests Passing</div>
476
- </div>
477
- <div data-hf-id="hf-r75q" class="s5-stat">
478
- <div data-hf-id="hf-1pj0" class="s5-number" id="stat3">50ms</div>
479
- <div data-hf-id="hf-mnx3" class="s5-stat-label" id="stat3-label">Cold Startup</div>
480
- </div>
481
- </div>
482
- </div>
483
-
484
- <!-- ===== SCENE 6: CTA ===== -->
485
- <div data-hf-id="hf-bxbo" id="scene6" class="scene">
486
- <div data-hf-id="hf-2tai" class="s6-glow" data-layout-ignore=""></div>
487
- <div data-hf-id="hf-jatr" class="scan-lines" data-layout-ignore=""></div>
488
- <div data-hf-id="hf-3cuv" class="s6-content">
489
- <div data-hf-id="hf-njlu" class="s6-terminal" id="s6-terminal">
490
- <div data-hf-id="hf-ji8z" class="s6-command"><span data-hf-id="hf-k8e2" class="muted">$</span> <span data-hf-id="hf-ws7m" id="s6-typed"></span><span data-hf-id="hf-pteo" class="s1-cursor" id="s6-cursor"></span></div>
491
- </div>
492
- <div data-hf-id="hf-bpsp" class="s6-info" id="s6-npm">npm i -g getraw &#160;·&#160; npmjs.com/package/getraw</div>
493
- <div data-hf-id="hf-4wmn" class="s6-info" id="s6-gh">github.com/web3mikee/getraw</div>
494
- </div>
495
- <div data-hf-id="hf-6yh5" class="s6-brand" id="s6-brand">getraw.dev</div>
496
- </div>
497
-
498
- </div>
499
-
500
- <script>
501
- window.__timelines = window.__timelines || {};
502
- var tl = gsap.timeline({ paused: true });
503
-
504
- /* ===== HELPERS ===== */
505
- function typeText(targetId, text, startTime, charDelay) {
506
- for (var i = 0; i <= text.length; i++) {
507
- (function(idx) {
508
- tl.call(function() {
509
- document.getElementById(targetId).textContent = text.substring(0, idx);
510
- }, null, startTime + idx * charDelay);
511
- })(i);
512
- }
513
- }
514
-
515
- /* ===== SCENE 1: HOOK (0-5s) ===== */
516
- // Scan lines drift
517
- tl.to("#scene1 .scan-lines", { y: -20, duration: 5, ease: "none" }, 0);
518
- // Grid dots pulse
519
- tl.fromTo("#scene1 .grid-dots", { opacity: 0.2 }, { opacity: 0.4, duration: 2, ease: "sine.inOut", repeat: 1, yoyo: true }, 0);
520
-
521
- // Cursor blink before typing
522
- tl.fromTo("#s1-cursor", { opacity: 1 }, { opacity: 0, duration: 0.4, ease: "steps(1)", repeat: 3, yoyo: true }, 0.2);
523
-
524
- // Type command
525
- var cmd = 'getraw "https://youtube.com/watch?v=dQw4..."';
526
- typeText("s1-typed", cmd, 0.8, 0.04);
527
-
528
- // Hide cursor after typing
529
- tl.to("#s1-cursor", { opacity: 0, duration: 0.01 }, 0.8 + cmd.length * 0.04 + 0.1);
530
-
531
- // Format lines cascade
532
- var lines = document.querySelectorAll(".format-line");
533
- for (var li = 0; li < lines.length; li++) {
534
- tl.from(lines[li], { y: -15, duration: 0.2, ease: "power2.out" }, 3.0 + li * 0.08);
535
- tl.to(lines[li], { opacity: 1, duration: 0.15, ease: "power1.out" }, 3.0 + li * 0.08);
536
- }
537
-
538
- /* ===== TRANSITION 1→2: GLITCH (at 4.7s) ===== */
539
- // Glitch effect: RGB split flash + scene swap
540
- tl.to("#scene1", { filter: "hue-rotate(90deg) saturate(3)", duration: 0.08, ease: "steps(1)" }, 4.7);
541
- tl.to("#scene1", { filter: "hue-rotate(-60deg) saturate(2)", duration: 0.08, ease: "steps(1)" }, 4.78);
542
- tl.to("#scene1", { filter: "none", duration: 0.01 }, 4.86);
543
- tl.to("#scene2", { opacity: 1, duration: 0.01 }, 4.87);
544
- tl.to("#scene1", { opacity: 0, duration: 0.01 }, 4.87);
545
- tl.set("#scene1", { visibility: "hidden" }, 4.88);
546
- tl.fromTo("#scene2", { filter: "hue-rotate(45deg) saturate(2)" }, { filter: "none", duration: 0.13, ease: "steps(2)" }, 4.87);
547
-
548
- /* ===== SCENE 2: NAME DROP (5-10s) ===== */
549
- // Glow breathe
550
- tl.fromTo(".s2-glow", { scale: 1 }, { scale: 1.08, duration: 3, ease: "sine.inOut", repeat: 1, yoyo: true }, 5);
551
-
552
- // Title SLAMS
553
- tl.from(".s2-title", { y: 80, scale: 1.06, opacity: 0, duration: 0.5, ease: "expo.out" }, 5.3);
554
-
555
- // Rules draw from center
556
- tl.to(".s2-rule-top", { scaleX: 1, duration: 0.6, ease: "power3.out" }, 5.5);
557
- tl.to(".s2-rule-bottom", { scaleX: 1, duration: 0.6, ease: "power3.out" }, 5.6);
558
-
559
- // Subtitle types on
560
- typeText("s2-sub", "yt-dlp replacement. Built in Bun.", 6.2, 0.035);
561
-
562
- // Badge fades
563
- tl.from(".s2-badge", { opacity: 0, duration: 0.4, ease: "power2.out" }, 5.8);
564
-
565
- // Scan lines
566
- tl.to("#scene2 .scan-lines", { y: -15, duration: 5, ease: "none" }, 5);
567
-
568
- /* ===== TRANSITION 2→3: STAGGERED BLOCKS (at 9.5s) ===== */
569
- tl.to("#scene3", { opacity: 1, duration: 0.01 }, 9.5);
570
- tl.to("#scene2", { x: -60, filter: "blur(8px)", opacity: 0, duration: 0.25, ease: "power3.in" }, 9.5);
571
-
572
- /* ===== SCENE 3: THE PROBLEM (10-15s) ===== */
573
- // Label
574
- tl.from(".s3-label-top", { opacity: 0, y: -10, duration: 0.3, ease: "power2.out" }, 10.0);
575
-
576
- // Heading slides in
577
- tl.from(".s3-heading", { x: -60, opacity: 0, duration: 0.5, ease: "expo.out" }, 10.2);
578
-
579
- // Pain points drop in
580
- var pains = ["#pain1", "#pain2", "#pain3", "#pain4"];
581
- for (var pi = 0; pi < pains.length; pi++) {
582
- tl.to(pains[pi], { opacity: 1, duration: 0.01 }, 10.7 + pi * 0.5);
583
- tl.from(pains[pi], { y: -25, duration: 0.35, ease: "back.out(1.5)" }, 10.7 + pi * 0.5);
584
- // Strikethrough draws after landing
585
- tl.to(pains[pi] + " .s3-strike", { scaleX: 1, duration: 0.3, ease: "power2.out" }, 10.7 + pi * 0.5 + 0.35);
586
- }
587
-
588
- // Grid dots
589
- tl.fromTo("#scene3 .grid-dots", { opacity: 0.2 }, { opacity: 0.4, duration: 2.5, ease: "sine.inOut", repeat: 1, yoyo: true }, 10);
590
-
591
- /* ===== TRANSITION 3→4: GLITCH (at 14.5s) ===== */
592
- tl.to("#scene3", { filter: "hue-rotate(90deg) saturate(3)", duration: 0.08, ease: "steps(1)" }, 14.5);
593
- tl.to("#scene3", { filter: "hue-rotate(-60deg) saturate(2)", duration: 0.08, ease: "steps(1)" }, 14.58);
594
- tl.to("#scene4", { opacity: 1, duration: 0.01 }, 14.66);
595
- tl.to("#scene3", { opacity: 0, duration: 0.01 }, 14.66);
596
- tl.set("#scene3", { visibility: "hidden" }, 14.67);
597
- tl.fromTo("#scene4", { filter: "hue-rotate(30deg) saturate(1.5)" }, { filter: "none", duration: 0.14, ease: "steps(2)" }, 14.66);
598
-
599
- /* ===== SCENE 4: THE SOLUTION (15-21s) ===== */
600
- // Heading slides in
601
- tl.from(".s4-heading", { x: -50, opacity: 0, duration: 0.5, ease: "expo.out" }, 15.2);
602
-
603
- // Cards cascade
604
- var cards = ["#card1", "#card2", "#card3"];
605
- for (var ci = 0; ci < cards.length; ci++) {
606
- tl.to(cards[ci], { opacity: 1, duration: 0.01 }, 15.8 + ci * 0.2);
607
- tl.from(cards[ci], { x: 50, duration: 0.5, ease: "expo.out" }, 15.8 + ci * 0.2);
608
- // Arrow pops
609
- tl.to(cards[ci] + " .s4-arrow", { opacity: 1, duration: 0.01 }, 16.0 + ci * 0.2);
610
- tl.from(cards[ci] + " .s4-arrow", { scale: 0.5, duration: 0.2, ease: "back.out(3)" }, 16.0 + ci * 0.2);
611
- }
612
-
613
- // Circuit glow drift
614
- tl.fromTo(".s4-circuit", { x: -40 }, { x: 40, duration: 6, ease: "sine.inOut" }, 15);
615
-
616
- // Scan lines
617
- tl.to("#scene4 .scan-lines", { y: -10, duration: 6, ease: "none" }, 15);
618
-
619
- /* ===== TRANSITION 4→5: GLITCH (at 20.5s) ===== */
620
- tl.to("#scene4", { filter: "hue-rotate(90deg) saturate(3)", duration: 0.08, ease: "steps(1)" }, 20.5);
621
- tl.to("#scene4", { filter: "hue-rotate(-60deg)", duration: 0.08, ease: "steps(1)" }, 20.58);
622
- tl.to("#scene5", { opacity: 1, duration: 0.01 }, 20.66);
623
- tl.to("#scene4", { opacity: 0, duration: 0.01 }, 20.66);
624
- tl.set("#scene4", { visibility: "hidden" }, 20.67);
625
- tl.fromTo("#scene5", { filter: "hue-rotate(20deg) saturate(1.5)" }, { filter: "none", duration: 0.14, ease: "steps(2)" }, 20.66);
626
-
627
- /* ===== SCENE 5: STATS (21-26s) ===== */
628
- // Label
629
- tl.from(".s5-label-top", { opacity: 0, duration: 0.3, ease: "power2.out" }, 21.1);
630
-
631
- // Numbers SLAM in simultaneously
632
- tl.from("#stat1", { y: 60, scale: 1.1, opacity: 0, duration: 0.45, ease: "expo.out" }, 21.3);
633
- tl.from("#stat2", { y: 60, scale: 1.1, opacity: 0, duration: 0.45, ease: "back.out(1.5)" }, 21.35);
634
- tl.from("#stat3", { y: 60, scale: 1.1, opacity: 0, duration: 0.45, ease: "power4.out" }, 21.4);
635
-
636
- // Accent lines pulse on impact
637
- tl.fromTo(".s5-line", { opacity: 0.08 }, { opacity: 0.2, duration: 0.3, ease: "power2.out" }, 21.3);
638
- tl.to(".s5-line", { opacity: 0.08, duration: 0.5, ease: "sine.inOut" }, 21.6);
639
-
640
- // Labels type on
641
- var statLabels = ["#stat1-label", "#stat2-label", "#stat3-label"];
642
- for (var si = 0; si < statLabels.length; si++) {
643
- tl.to(statLabels[si], { opacity: 1, duration: 0.3, ease: "power2.out" }, 22.0 + si * 0.15);
644
- }
645
-
646
- // Scan lines
647
- tl.to("#scene5 .scan-lines", { y: -10, duration: 5, ease: "none" }, 21);
648
-
649
- /* ===== TRANSITION 5→6: STAGGERED BLOCKS (at 25.5s) ===== */
650
- tl.to("#scene6", { opacity: 1, duration: 0.01 }, 25.5);
651
- tl.to("#scene5", { x: 60, filter: "blur(8px)", opacity: 0, duration: 0.3, ease: "power3.in" }, 25.5);
652
-
653
- /* ===== SCENE 6: CTA (26-30s) ===== */
654
- // Terminal frame draws in
655
- tl.from("#s6-terminal", { opacity: 0, scale: 0.95, duration: 0.4, ease: "power3.out" }, 26.1);
656
-
657
- // Command types on
658
- typeText("s6-typed", "bun install -g getraw", 26.6, 0.05);
659
-
660
- // Cursor blink (ends before final fade at 29.4)
661
- var cursorStart = 26.6 + 21 * 0.05 + 0.2;
662
- tl.fromTo("#s6-cursor", { opacity: 1 }, { opacity: 0, duration: 0.4, ease: "steps(1)", repeat: 3, yoyo: true }, cursorStart);
663
-
664
- // Info lines
665
- tl.to("#s6-npm", { opacity: 1, duration: 0.4, ease: "power2.out" }, 28.0);
666
- tl.to("#s6-gh", { opacity: 1, duration: 0.4, ease: "power2.out" }, 28.3);
667
- tl.to("#s6-brand", { opacity: 1, duration: 0.5, ease: "power2.out" }, 28.5);
668
-
669
- // Glow breathe
670
- tl.fromTo(".s6-glow", { scale: 1 }, { scale: 1.06, duration: 2, ease: "sine.inOut", repeat: 1, yoyo: true }, 26);
671
-
672
- // Scan lines
673
- tl.to("#scene6 .scan-lines", { y: -10, duration: 4, ease: "none" }, 26);
674
-
675
- // FINAL SCENE EXIT: fade to black
676
- tl.to("#scene6 .s6-content", { opacity: 0, duration: 0.6, ease: "power2.in" }, 29.4);
677
- tl.to("#s6-brand", { opacity: 0, duration: 0.4, ease: "power2.in" }, 29.5);
678
- // Cursor is the last thing visible
679
- tl.to("#s6-cursor", { opacity: 0, duration: 0.3, ease: "power1.in" }, 29.7);
680
-
681
- window.__timelines["main"] = tl;
682
- </script>
683
- </body>
684
- </html>
@@ -1 +0,0 @@
1
- {"status":"complete","durationMs":90213}