hyperframes 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +5 -1
  2. package/dist/cli.js +940 -380
  3. package/dist/hyperframe-runtime.js +8 -4
  4. package/dist/hyperframe.manifest.json +1 -1
  5. package/dist/hyperframe.runtime.iife.js +8 -4
  6. package/dist/skills/hyperframes-captions/SKILL.md +195 -29
  7. package/dist/skills/hyperframes-compose/SKILL.md +1 -0
  8. package/dist/skills/hyperframes-compose/house-style.md +2 -2
  9. package/dist/studio/assets/index-CLmYRLY-.css +1 -0
  10. package/dist/studio/assets/index-CRvFpc0E.js +84 -0
  11. package/dist/studio/index.html +2 -2
  12. package/dist/templates/_shared/CLAUDE.md +14 -2
  13. package/dist/templates/blank/compositions/captions.html +3 -0
  14. package/dist/templates/blank/index.html +1 -1
  15. package/dist/templates/decision-tree/compositions/decision_tree.html +420 -0
  16. package/dist/templates/decision-tree/index.html +56 -0
  17. package/dist/templates/generators.ts +32 -0
  18. package/dist/templates/kinetic-type/compositions/main-graphics.html +588 -0
  19. package/dist/templates/kinetic-type/index.html +61 -0
  20. package/dist/templates/nyt-graph/compositions/nyt-chart.html +450 -0
  21. package/dist/templates/nyt-graph/index.html +51 -0
  22. package/dist/templates/product-promo/assets/figma-cursors.svg +30 -0
  23. package/dist/templates/product-promo/assets/figma-logo-pieces.svg +15 -0
  24. package/dist/templates/product-promo/assets/figma-logo-pills.svg +6 -0
  25. package/dist/templates/product-promo/compositions/scene1-logo-intro.html +189 -0
  26. package/dist/templates/product-promo/compositions/scene2-4-canvas.html +570 -0
  27. package/dist/templates/product-promo/compositions/scene5-logo-outro.html +226 -0
  28. package/dist/templates/product-promo/index.html +158 -0
  29. package/package.json +2 -2
  30. package/dist/studio/assets/index-2uBPlHR_.css +0 -1
  31. package/dist/studio/assets/index-uQ8cgxb3.js +0 -92
@@ -0,0 +1,570 @@
1
+ <template id="scene2-4-canvas-template">
2
+ <div
3
+ data-composition-id="scene2-4-canvas"
4
+ data-width="1920"
5
+ data-height="1080"
6
+ data-duration="12.5"
7
+ >
8
+ <div class="canvas">
9
+ <div class="dot-grid"></div>
10
+
11
+ <!-- Web Frame -->
12
+ <div class="web-frame">
13
+ <div class="ui-content">
14
+ <div class="nav-bar">
15
+ <div class="nav-logo"></div>
16
+ <div class="nav-links">
17
+ <div class="nav-link"></div>
18
+ <div class="nav-link"></div>
19
+ <div class="nav-link"></div>
20
+ </div>
21
+ </div>
22
+ <div class="hero-section">
23
+ <h1 class="hero-heading">Design without limits</h1>
24
+ <div class="subtitle-lines">
25
+ <div class="subtitle-line"></div>
26
+ <div class="subtitle-line"></div>
27
+ </div>
28
+ <div class="cta-button">Get Started</div>
29
+ </div>
30
+ </div>
31
+ <!-- Dimension Labels -->
32
+ <div class="dimension-label width-label">1440</div>
33
+ <div class="dimension-label height-label">900</div>
34
+ <!-- Selection Handles (Engineer) -->
35
+ <div class="selection-handles">
36
+ <div class="handle tl"></div>
37
+ <div class="handle tr"></div>
38
+ <div class="handle bl"></div>
39
+ <div class="handle br"></div>
40
+ </div>
41
+ </div>
42
+
43
+ <!-- Assets Panel -->
44
+ <div class="assets-panel">
45
+ <div class="panel-header">Assets</div>
46
+ <div class="asset-list">
47
+ <div class="asset-item">
48
+ <span class="asset-icon">◆</span>
49
+ <span class="asset-text">Button/Primary</span>
50
+ </div>
51
+ <div class="asset-item">
52
+ <span class="asset-icon">◆</span>
53
+ <span class="asset-text">Card/Product</span>
54
+ </div>
55
+ <div class="asset-item">
56
+ <span class="asset-icon">◆</span>
57
+ <span class="asset-text">Nav/Header</span>
58
+ </div>
59
+ </div>
60
+ </div>
61
+
62
+ <!-- Draggable Component (Scene 4) -->
63
+ <div class="dragged-card">
64
+ <div class="card-content"></div>
65
+ </div>
66
+
67
+ <!-- Stamped Cards (Scene 4) -->
68
+ <div class="stamped-cards">
69
+ <div class="stamped-card card-1"></div>
70
+ <div class="stamped-card card-2"></div>
71
+ <div class="stamped-card card-3"></div>
72
+ </div>
73
+
74
+ <!-- Comment Pin & Bubble -->
75
+ <div class="comment-container">
76
+ <div class="comment-pin">
77
+ <div class="checkmark">✓</div>
78
+ </div>
79
+ <div class="comment-bubble">
80
+ <div class="comment-text"></div>
81
+ </div>
82
+ </div>
83
+
84
+ <!-- Cursors -->
85
+ <div class="cursor designer-cursor">
86
+ <svg width="24" height="24" viewBox="0 0 24 24">
87
+ <path d="M0 0 L 16 16 L 9.5 16 L 6.5 23 L 6.5 16 L 0 16 Z" fill="white" stroke="black" />
88
+ </svg>
89
+ <div class="cursor-label">Designer</div>
90
+ </div>
91
+ <div class="cursor engineer-cursor">
92
+ <svg width="24" height="24" viewBox="0 0 24 24">
93
+ <path d="M0 0 L 16 16 L 9.5 16 L 6.5 23 L 6.5 16 L 0 16 Z" fill="white" stroke="black" />
94
+ </svg>
95
+ <div class="cursor-label">Engineer</div>
96
+ </div>
97
+ <div class="cursor pm-cursor">
98
+ <svg width="24" height="24" viewBox="0 0 24 24">
99
+ <path d="M0 0 L 16 16 L 9.5 16 L 6.5 23 L 6.5 16 L 0 16 Z" fill="white" stroke="black" />
100
+ </svg>
101
+ <div class="cursor-label">PM</div>
102
+ </div>
103
+ </div>
104
+
105
+ <style>
106
+ [data-composition-id="scene2-4-canvas"] {
107
+ background-color: #1e1e1e;
108
+ font-family: "Inter", sans-serif;
109
+ color: white;
110
+ overflow: hidden;
111
+ }
112
+
113
+ .canvas {
114
+ width: 100%;
115
+ height: 100%;
116
+ position: relative;
117
+ }
118
+
119
+ .dot-grid {
120
+ position: absolute;
121
+ top: 0;
122
+ left: 0;
123
+ width: 100%;
124
+ height: 100%;
125
+ background-image: radial-gradient(#2c2c2c 1px, transparent 1px);
126
+ background-size: 24px 24px;
127
+ }
128
+
129
+ .web-frame {
130
+ position: absolute;
131
+ top: 50%;
132
+ left: 50%;
133
+ width: 1440px;
134
+ height: 900px;
135
+ transform: translate(-50%, -50%) scale(0);
136
+ background: white;
137
+ border: 1px solid rgba(255, 255, 255, 0.2);
138
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3);
139
+ overflow: hidden;
140
+ opacity: 0;
141
+ }
142
+
143
+ .ui-content {
144
+ width: 100%;
145
+ height: 100%;
146
+ background: white;
147
+ display: flex;
148
+ flex-direction: column;
149
+ opacity: 0;
150
+ }
151
+
152
+ .nav-bar {
153
+ height: 80px;
154
+ padding: 0 60px;
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: space-between;
158
+ border-bottom: 1px solid #e6e6e6;
159
+ }
160
+
161
+ .nav-logo {
162
+ width: 40px;
163
+ height: 40px;
164
+ background: #a259ff;
165
+ border-radius: 8px;
166
+ opacity: 0.8;
167
+ }
168
+
169
+ .nav-links {
170
+ display: flex;
171
+ gap: 32px;
172
+ }
173
+
174
+ .nav-link {
175
+ width: 80px;
176
+ height: 12px;
177
+ background: #cccccc;
178
+ border-radius: 6px;
179
+ }
180
+
181
+ .hero-section {
182
+ flex: 1;
183
+ display: flex;
184
+ flex-direction: column;
185
+ align-items: center;
186
+ justify-content: center;
187
+ padding-bottom: 100px;
188
+ transition: transform 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
189
+ }
190
+
191
+ .hero-heading {
192
+ font-size: 84px;
193
+ font-weight: 800;
194
+ color: #1e1e1e;
195
+ margin-bottom: 24px;
196
+ opacity: 0;
197
+ letter-spacing: -0.02em;
198
+ transform-origin: center;
199
+ }
200
+
201
+ .subtitle-lines {
202
+ display: flex;
203
+ flex-direction: column;
204
+ align-items: center;
205
+ gap: 12px;
206
+ margin-bottom: 48px;
207
+ transform-origin: center;
208
+ }
209
+
210
+ .subtitle-line {
211
+ width: 400px;
212
+ height: 16px;
213
+ background: #e6e6e6;
214
+ border-radius: 8px;
215
+ opacity: 0;
216
+ }
217
+
218
+ .cta-button {
219
+ padding: 20px 48px;
220
+ background: #0acf83;
221
+ color: white;
222
+ font-size: 24px;
223
+ font-weight: 600;
224
+ border-radius: 12px;
225
+ opacity: 0;
226
+ position: relative;
227
+ transform-origin: center;
228
+ }
229
+
230
+ .dimension-label {
231
+ position: absolute;
232
+ background: #1abcfe;
233
+ color: white;
234
+ padding: 4px 8px;
235
+ font-size: 14px;
236
+ font-weight: 600;
237
+ border-radius: 4px;
238
+ transform: scale(0);
239
+ }
240
+
241
+ .width-label {
242
+ top: -30px;
243
+ left: 50%;
244
+ transform: translateX(-50%) scale(0);
245
+ }
246
+
247
+ .height-label {
248
+ right: -45px;
249
+ top: 50%;
250
+ transform: translateY(-50%) rotate(90deg) scale(0);
251
+ }
252
+
253
+ .selection-handles {
254
+ position: absolute;
255
+ top: 0;
256
+ left: 0;
257
+ width: 100%;
258
+ height: 100%;
259
+ pointer-events: none;
260
+ opacity: 0;
261
+ }
262
+
263
+ .handle {
264
+ position: absolute;
265
+ width: 12px;
266
+ height: 12px;
267
+ background: white;
268
+ border: 2px solid #1abcfe;
269
+ border-radius: 2px;
270
+ }
271
+
272
+ .handle.tl {
273
+ top: -6px;
274
+ left: -6px;
275
+ }
276
+ .handle.tr {
277
+ top: -6px;
278
+ right: -6px;
279
+ }
280
+ .handle.bl {
281
+ bottom: -6px;
282
+ left: -6px;
283
+ }
284
+ .handle.br {
285
+ bottom: -6px;
286
+ right: -6px;
287
+ }
288
+
289
+ .assets-panel {
290
+ position: absolute;
291
+ top: 0;
292
+ left: 0;
293
+ width: 320px;
294
+ height: 100%;
295
+ background: rgba(44, 44, 44, 0.9);
296
+ backdrop-filter: blur(12px);
297
+ -webkit-backdrop-filter: blur(12px);
298
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
299
+ transform: translateX(-320px);
300
+ padding: 24px;
301
+ z-index: 10;
302
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.2);
303
+ }
304
+
305
+ .panel-header {
306
+ font-size: 18px;
307
+ font-weight: 600;
308
+ margin-bottom: 32px;
309
+ color: #aaa;
310
+ }
311
+
312
+ .asset-item {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 12px;
316
+ padding: 12px;
317
+ border-radius: 8px;
318
+ margin-bottom: 8px;
319
+ background: rgba(255, 255, 255, 0.05);
320
+ }
321
+
322
+ .asset-icon {
323
+ color: #a259ff;
324
+ font-size: 18px;
325
+ }
326
+
327
+ .asset-text {
328
+ font-size: 14px;
329
+ color: #eee;
330
+ }
331
+
332
+ .dragged-card {
333
+ position: absolute;
334
+ width: 300px;
335
+ height: 200px;
336
+ background: white;
337
+ border-radius: 12px;
338
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
339
+ opacity: 0;
340
+ transform: scale(0.9);
341
+ z-index: 20;
342
+ pointer-events: none;
343
+ }
344
+
345
+ .card-content {
346
+ width: 100%;
347
+ height: 100%;
348
+ background: linear-gradient(45deg, #f0f0f0, #fff);
349
+ border-radius: 12px;
350
+ }
351
+
352
+ .stamped-cards {
353
+ position: absolute;
354
+ top: 50%;
355
+ left: 50%;
356
+ transform: translate(-50%, -50%);
357
+ width: 1440px;
358
+ height: 900px;
359
+ pointer-events: none;
360
+ display: flex;
361
+ justify-content: center;
362
+ align-items: center;
363
+ gap: 40px;
364
+ }
365
+
366
+ .stamped-card {
367
+ position: relative;
368
+ width: 300px;
369
+ height: 200px;
370
+ background: white;
371
+ border-radius: 12px;
372
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
373
+ opacity: 0;
374
+ transform: translateY(50px);
375
+ }
376
+
377
+ .card-1,
378
+ .card-2,
379
+ .card-3 {
380
+ top: auto;
381
+ left: auto;
382
+ }
383
+
384
+ .comment-container {
385
+ position: absolute;
386
+ top: 420px;
387
+ left: 960px;
388
+ z-index: 30;
389
+ opacity: 0;
390
+ }
391
+
392
+ .comment-pin {
393
+ width: 32px;
394
+ height: 32px;
395
+ background: #f24e1e;
396
+ border-radius: 16px 16px 16px 0;
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: center;
400
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
401
+ transform-origin: bottom left;
402
+ }
403
+
404
+ .checkmark {
405
+ color: white;
406
+ font-size: 18px;
407
+ font-weight: bold;
408
+ transform: scale(0);
409
+ }
410
+
411
+ .comment-bubble {
412
+ position: absolute;
413
+ left: 40px;
414
+ top: -20px;
415
+ background: white;
416
+ padding: 12px 16px;
417
+ border-radius: 12px;
418
+ color: #1e1e1e;
419
+ font-size: 14px;
420
+ font-weight: 500;
421
+ white-space: nowrap;
422
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
423
+ opacity: 0;
424
+ transform: translateX(-10px);
425
+ }
426
+
427
+ .cursor {
428
+ position: absolute;
429
+ display: flex;
430
+ flex-direction: column;
431
+ align-items: flex-start;
432
+ z-index: 100;
433
+ pointer-events: none;
434
+ }
435
+
436
+ .cursor-label {
437
+ padding: 4px 8px;
438
+ font-size: 12px;
439
+ font-weight: 600;
440
+ color: white;
441
+ border-radius: 0 4px 4px 4px;
442
+ margin-top: -4px;
443
+ margin-left: 12px;
444
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
445
+ }
446
+
447
+ .designer-cursor .cursor-label {
448
+ background: #a259ff;
449
+ }
450
+ .engineer-cursor .cursor-label {
451
+ background: #1abcfe;
452
+ }
453
+ .pm-cursor .cursor-label {
454
+ background: #f24e1e;
455
+ }
456
+ </style>
457
+
458
+ <script>
459
+ (function () {
460
+ const tl = gsap.timeline({ paused: true });
461
+
462
+ // Organic Cursor Ease
463
+ const cursorEase = "back.out(1.2)";
464
+
465
+ gsap.set(".designer-cursor", { x: 200, y: 200 });
466
+ gsap.set(".engineer-cursor", { x: -100, y: 500 });
467
+ gsap.set(".pm-cursor", { x: 2000, y: 1100 });
468
+
469
+ // Designer enters
470
+ tl.to(".designer-cursor", { x: 960, y: 540, duration: 1.0, ease: cursorEase }, 0);
471
+
472
+ // Frame appears
473
+ tl.to(".web-frame", { opacity: 1, scale: 1, duration: 0.6, ease: "back.out(1.4)" }, 0.5);
474
+
475
+ // UI Stagger
476
+ tl.to(".ui-content", { opacity: 1, duration: 0.4 }, 1.0);
477
+ tl.to(".hero-heading", { opacity: 1, y: 0, duration: 0.7, ease: "back.out(1.2)" }, 1.2);
478
+ tl.to(
479
+ ".subtitle-line",
480
+ { opacity: 1, y: 0, duration: 0.5, stagger: 0.08, ease: "power2.out" },
481
+ 1.4,
482
+ );
483
+ tl.to(".cta-button", { opacity: 1, scale: 1, duration: 0.5, ease: "back.out(1.7)" }, 1.7);
484
+
485
+ // Labels
486
+ tl.to(".width-label", { scale: 1, duration: 0.4, ease: "back.out(2)" }, 1.9);
487
+ tl.to(".height-label", { scale: 1, rotation: 90, duration: 0.4, ease: "back.out(2)" }, 2.0);
488
+
489
+ // Collaboration
490
+ tl.to(".engineer-cursor", { x: 400, y: 400, duration: 1.2, ease: cursorEase }, 3.5);
491
+ tl.to(".pm-cursor", { x: 1500, y: 800, duration: 1.5, ease: cursorEase }, 3.7);
492
+ tl.to(".engineer-cursor", { x: 960, y: 680, duration: 0.9, ease: cursorEase }, 4.5);
493
+ tl.to(".selection-handles", { opacity: 1, duration: 0.2 }, 5.3);
494
+ tl.to(".cta-button", { outline: "2px solid #1ABCFE", duration: 0.1 }, 5.3);
495
+
496
+ tl.to(".pm-cursor", { x: 960, y: 420, duration: 1.1, ease: cursorEase }, 5.5);
497
+ tl.to(".comment-container", { opacity: 1, duration: 0.1 }, 6.5);
498
+ tl.from(".comment-pin", { scale: 0, duration: 0.5, ease: "back.out(1.2)" }, 6.5);
499
+ tl.to(".comment-bubble", { opacity: 1, x: 0, duration: 0.4, ease: "back.out(1.5)" }, 6.9);
500
+
501
+ const commentText = "Let's use the product shot here";
502
+ const textObj = { val: 0 };
503
+ tl.to(
504
+ textObj,
505
+ {
506
+ val: commentText.length,
507
+ duration: commentText.length / 30,
508
+ ease: "none",
509
+ onUpdate: () => {
510
+ const el = document.querySelector(
511
+ '[data-composition-id="scene2-4-canvas"] .comment-text',
512
+ );
513
+ if (el) el.innerText = commentText.substring(0, Math.ceil(textObj.val));
514
+ },
515
+ },
516
+ 7.1,
517
+ );
518
+
519
+ // Assets Panel
520
+ tl.to(".assets-panel", { x: 0, duration: 0.4, ease: "power3.out" }, 8.0);
521
+ tl.to(".engineer-cursor", { x: 160, y: 150, duration: 0.7, ease: cursorEase }, 8.3);
522
+ tl.to(".dragged-card", { opacity: 1, scale: 1, x: 160, y: 150, duration: 0.2 }, 8.9);
523
+ tl.to(
524
+ [".engineer-cursor", ".dragged-card"],
525
+ { x: 960, y: 700, duration: 0.9, ease: cursorEase },
526
+ 9.1,
527
+ );
528
+
529
+ // Reformat UI as card is dragged in
530
+ tl.to(".hero-section", { y: -150, duration: 0.8, ease: "power3.inOut" }, 9.1);
531
+ tl.to(".hero-heading", { scale: 0.8, duration: 0.8, ease: "power3.inOut" }, 9.1);
532
+ tl.to(".subtitle-lines", { scale: 0.8, duration: 0.8, ease: "power3.inOut" }, 9.1);
533
+ tl.to(".cta-button", { scale: 0.8, duration: 0.8, ease: "power3.inOut" }, 9.1);
534
+
535
+ // Stamping into Grid/Row
536
+ tl.to(".stamped-cards", { y: 200, duration: 0.1 }, 9.1); // Position the container
537
+ tl.to(".card-1", { opacity: 1, y: 0, duration: 0.6, ease: "back.out(1.5)" }, 9.9);
538
+ tl.to(".card-2", { opacity: 1, y: 0, duration: 0.6, ease: "back.out(1.5)" }, 10.1);
539
+ tl.to(".card-3", { opacity: 1, y: 0, duration: 0.6, ease: "back.out(1.5)" }, 10.3);
540
+
541
+ tl.to(".dragged-card", { opacity: 0, scale: 0.8, duration: 0.2 }, 10.5);
542
+ tl.to(".checkmark", { scale: 1, duration: 0.4, ease: "back.out(1.8)" }, 10.7);
543
+ tl.to(".comment-pin", { backgroundColor: "#0ACF83", duration: 0.3 }, 10.7);
544
+ tl.to(".assets-panel", { x: -320, duration: 0.4, ease: "power3.in" }, 11.5);
545
+
546
+ // Scene 5 Transition: Wipe everything to the left
547
+ tl.to(
548
+ [
549
+ ".web-frame",
550
+ ".cursor",
551
+ ".dragged-card",
552
+ ".stamped-cards",
553
+ ".comment-container",
554
+ ".assets-panel",
555
+ ],
556
+ {
557
+ x: -2000,
558
+ duration: 0.5,
559
+ ease: "expo.in",
560
+ stagger: 0.02,
561
+ },
562
+ 12.0,
563
+ );
564
+
565
+ window.__timelines = window.__timelines || {};
566
+ window.__timelines["scene2-4-canvas"] = tl;
567
+ })();
568
+ </script>
569
+ </div>
570
+ </template>