hyperframes 0.1.15 → 0.2.0-alpha.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.
Files changed (41) hide show
  1. package/README.md +3 -3
  2. package/dist/cli.js +3968 -3297
  3. package/dist/skills/hyperframes-captions/SKILL.md +1 -1
  4. package/dist/skills/hyperframes-compose/SKILL.md +1 -0
  5. package/dist/studio/assets/index-Bkp9HQbo.css +1 -0
  6. package/dist/studio/assets/index-DfhSlTti.js +93 -0
  7. package/dist/studio/index.html +2 -2
  8. package/dist/templates/_shared/CLAUDE.md +1 -1
  9. package/package.json +3 -2
  10. package/dist/studio/assets/index-CLmYRLY-.css +0 -1
  11. package/dist/studio/assets/index-CRvFpc0E.js +0 -84
  12. package/dist/templates/decision-tree/compositions/decision_tree.html +0 -420
  13. package/dist/templates/decision-tree/index.html +0 -56
  14. package/dist/templates/generators.ts +0 -32
  15. package/dist/templates/kinetic-type/compositions/main-graphics.html +0 -588
  16. package/dist/templates/kinetic-type/index.html +0 -61
  17. package/dist/templates/nyt-graph/compositions/nyt-chart.html +0 -450
  18. package/dist/templates/nyt-graph/index.html +0 -51
  19. package/dist/templates/play-mode/compositions/captions.html +0 -163
  20. package/dist/templates/play-mode/compositions/intro.html +0 -107
  21. package/dist/templates/play-mode/compositions/stats.html +0 -388
  22. package/dist/templates/play-mode/index.html +0 -239
  23. package/dist/templates/product-promo/assets/figma-cursors.svg +0 -30
  24. package/dist/templates/product-promo/assets/figma-logo-pieces.svg +0 -15
  25. package/dist/templates/product-promo/assets/figma-logo-pills.svg +0 -6
  26. package/dist/templates/product-promo/compositions/scene1-logo-intro.html +0 -189
  27. package/dist/templates/product-promo/compositions/scene2-4-canvas.html +0 -570
  28. package/dist/templates/product-promo/compositions/scene5-logo-outro.html +0 -226
  29. package/dist/templates/product-promo/index.html +0 -158
  30. package/dist/templates/swiss-grid/assets/swiss-grid.svg +0 -116
  31. package/dist/templates/swiss-grid/compositions/captions.html +0 -148
  32. package/dist/templates/swiss-grid/compositions/graphics.html +0 -207
  33. package/dist/templates/swiss-grid/compositions/intro.html +0 -131
  34. package/dist/templates/swiss-grid/index.html +0 -234
  35. package/dist/templates/vignelli/compositions/captions.html +0 -181
  36. package/dist/templates/vignelli/compositions/overlays.html +0 -323
  37. package/dist/templates/vignelli/index.html +0 -190
  38. package/dist/templates/warm-grain/compositions/captions.html +0 -147
  39. package/dist/templates/warm-grain/compositions/graphics.html +0 -164
  40. package/dist/templates/warm-grain/compositions/intro.html +0 -86
  41. package/dist/templates/warm-grain/index.html +0 -294
@@ -1,226 +0,0 @@
1
- <template id="scene5-logo-outro-template">
2
- <div
3
- data-composition-id="scene5-logo-outro"
4
- data-width="1920"
5
- data-height="1080"
6
- data-duration="6"
7
- >
8
- <div class="canvas">
9
- <!-- Glow effect behind the logo -->
10
- <div class="logo-glow"></div>
11
-
12
- <!-- Logo Container -->
13
- <div class="logo-container">
14
- <svg viewBox="0 0 160 240" width="160" height="240" class="logo-svg">
15
- <!-- Figma Logo Pieces -->
16
- <!-- Top-left: Red (#F24E1E) -->
17
- <path
18
- class="logo-piece logo-tl"
19
- d="M 0 40 C 0 17.9 17.9 0 40 0 L 80 0 L 80 80 L 40 80 C 17.9 80 0 62.1 0 40 Z"
20
- fill="#F24E1E"
21
- />
22
- <!-- Top-right: Purple (#A259FF) -->
23
- <path
24
- class="logo-piece logo-tr"
25
- d="M 80 0 L 120 0 C 142.1 0 160 17.9 160 40 C 160 62.1 142.1 80 120 80 L 80 80 L 80 0 Z"
26
- fill="#A259FF"
27
- />
28
- <!-- Middle-left: Pink (#FF7262) -->
29
- <path
30
- class="logo-piece logo-ml"
31
- d="M 0 120 C 0 97.9 17.9 80 40 80 L 80 80 L 80 160 L 40 160 C 17.9 160 0 142.1 0 120 Z"
32
- fill="#FF7262"
33
- />
34
- <!-- Middle-right: Blue (#1ABCFE) -->
35
- <circle class="logo-piece logo-mr" cx="120" cy="120" r="40" fill="#1ABCFE" />
36
- <!-- Bottom-left: Green (#0ACF83) -->
37
- <path
38
- class="logo-piece logo-bl"
39
- d="M 0 200 C 0 177.9 17.9 160 40 160 L 80 160 L 80 200 C 80 222.1 62.1 240 40 240 C 17.9 240 0 222.1 0 200 Z"
40
- fill="#0ACF83"
41
- />
42
- </svg>
43
- </div>
44
-
45
- <div class="text-container">
46
- <div class="tagline">Nothing great is made alone.</div>
47
- <div class="url-pill">
48
- <span class="url-text">figma.com</span>
49
- </div>
50
- </div>
51
- </div>
52
-
53
- <style>
54
- [data-composition-id="scene5-logo-outro"] .canvas {
55
- width: 1920px;
56
- height: 1080px;
57
- background: #0a0a0f;
58
- position: relative;
59
- overflow: hidden;
60
- font-family: "Inter", sans-serif;
61
- }
62
-
63
- [data-composition-id="scene5-logo-outro"] .logo-container {
64
- position: absolute;
65
- left: 880px; /* Center X: 960 - 80 */
66
- top: 380px; /* Adjusted for tagline space: 540 - 120 - 40 */
67
- width: 160px;
68
- height: 240px;
69
- z-index: 2;
70
- }
71
-
72
- [data-composition-id="scene5-logo-outro"] .logo-piece {
73
- transform-origin: center center;
74
- opacity: 0;
75
- }
76
-
77
- [data-composition-id="scene5-logo-outro"] .logo-glow {
78
- position: absolute;
79
- left: 760px; /* 960 - 200 */
80
- top: 300px; /* 500 - 200 */
81
- width: 400px;
82
- height: 400px;
83
- background: radial-gradient(circle, rgba(162, 89, 255, 0.25) 0%, rgba(10, 10, 15, 0) 70%);
84
- border-radius: 50%;
85
- opacity: 0;
86
- pointer-events: none;
87
- z-index: 1;
88
- }
89
-
90
- [data-composition-id="scene5-logo-outro"] .text-container {
91
- position: absolute;
92
- top: 720px;
93
- width: 100%;
94
- display: flex;
95
- flex-direction: column;
96
- align-items: center;
97
- z-index: 3;
98
- }
99
-
100
- [data-composition-id="scene5-logo-outro"] .tagline {
101
- font-size: 44px;
102
- font-weight: 500;
103
- color: white;
104
- opacity: 0;
105
- margin-bottom: 32px;
106
- text-align: center;
107
- }
108
-
109
- [data-composition-id="scene5-logo-outro"] .url-pill {
110
- background: #1a1a1f;
111
- border: 1px solid #2c2c2c;
112
- border-radius: 100px;
113
- padding: 8px 24px;
114
- opacity: 0;
115
- display: flex;
116
- align-items: center;
117
- justify-content: center;
118
- }
119
-
120
- [data-composition-id="scene5-logo-outro"] .url-text {
121
- font-size: 18px;
122
- color: #666;
123
- letter-spacing: 0.5px;
124
- }
125
- </style>
126
-
127
- <script>
128
- (function () {
129
- const tl = gsap.timeline({ paused: true });
130
-
131
- const pieces = {
132
- tl: '[data-composition-id="scene5-logo-outro"] .logo-tl',
133
- tr: '[data-composition-id="scene5-logo-outro"] .logo-tr',
134
- ml: '[data-composition-id="scene5-logo-outro"] .logo-ml',
135
- mr: '[data-composition-id="scene5-logo-outro"] .logo-mr',
136
- bl: '[data-composition-id="scene5-logo-outro"] .logo-bl',
137
- };
138
-
139
- const pieceArray = [pieces.tl, pieces.tr, pieces.ml, pieces.mr, pieces.bl];
140
- const logoGlow = '[data-composition-id="scene5-logo-outro"] .logo-glow';
141
- const tagline = '[data-composition-id="scene5-logo-outro"] .tagline';
142
- const urlPill = '[data-composition-id="scene5-logo-outro"] .url-pill';
143
-
144
- // 1. Pieces slide in from the RIGHT (x: 1920 -> 0) with a ripple stagger (0.08s). Duration: 1.2s.
145
- pieceArray.forEach((piece, i) => {
146
- tl.fromTo(
147
- piece,
148
- { x: 1920, opacity: 0 },
149
- { x: 0, opacity: 1, duration: 1.2, ease: "power4.out" },
150
- i * 0.08,
151
- );
152
- });
153
-
154
- // 2. Once at the center (960, 540), the pieces should simply EXPAND (scale 1 -> 1.15)
155
- // and then CLOSE back to their done state (scale 1.15 -> 1).
156
- // NO positional 'explode' or pushing to corners.
157
- const expandTime = 1.2; // Start right after the first piece arrives, or after all?
158
- // Let's start it after the last piece has arrived or is near arrival for a fluid motion.
159
- // The last piece starts at 0.32s and takes 1.2s to arrive (1.52s total).
160
- // Let's trigger the expand at 1.2s so it feels like a continuous flow.
161
-
162
- tl.to(
163
- pieceArray,
164
- {
165
- scale: 1.15,
166
- duration: 0.5,
167
- ease: "back.out(1.7)",
168
- stagger: 0.02,
169
- },
170
- expandTime,
171
- );
172
-
173
- tl.to(
174
- pieceArray,
175
- {
176
- scale: 1,
177
- duration: 0.4,
178
- ease: "power2.inOut",
179
- },
180
- expandTime + 0.3,
181
- );
182
-
183
- // 3. Subtle glow bloom effect (optional but adds polish, keeping it from original as it fits the 'expand')
184
- tl.fromTo(
185
- logoGlow,
186
- { opacity: 0, scale: 0.5 },
187
- { opacity: 1, scale: 1.2, duration: 0.4, ease: "power2.out" },
188
- expandTime,
189
- );
190
- tl.to(
191
- logoGlow,
192
- {
193
- opacity: 0,
194
- scale: 1.8,
195
- duration: 1.2,
196
- ease: "power2.out",
197
- },
198
- expandTime + 0.4,
199
- );
200
-
201
- // 4. Tagline and URL pill fade in as before.
202
- const textStartTime = expandTime + 0.8;
203
- tl.fromTo(
204
- tagline,
205
- { opacity: 0, y: 20 },
206
- { opacity: 1, y: 0, duration: 1, ease: "power3.out" },
207
- textStartTime,
208
- );
209
-
210
- tl.fromTo(
211
- urlPill,
212
- { opacity: 0, y: 15 },
213
- { opacity: 1, y: 0, duration: 0.8, ease: "power3.out" },
214
- textStartTime + 0.4,
215
- );
216
-
217
- // 5. Remove the final pulse animation. (Omitted)
218
- // 6. After they return to the done state, there should be NO MORE movement for the logo. (Ensured)
219
-
220
- // Register timeline
221
- window.__timelines = window.__timelines || {};
222
- window.__timelines["scene5-logo-outro"] = tl;
223
- })();
224
- </script>
225
- </div>
226
- </template>
@@ -1,158 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=1920, height=1080" />
6
- <title>Product Promo</title>
7
- <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
8
- <link
9
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;800&display=block"
10
- rel="stylesheet"
11
- />
12
- <style>
13
- * {
14
- margin: 0;
15
- padding: 0;
16
- box-sizing: border-box;
17
- }
18
- html,
19
- body {
20
- margin: 0;
21
- width: 1920px;
22
- height: 1080px;
23
- overflow: hidden;
24
- background: #0a0a0f;
25
- font-family: "Inter", sans-serif;
26
- }
27
- .scene {
28
- position: absolute;
29
- top: 0;
30
- left: 0;
31
- width: 100%;
32
- height: 100%;
33
- }
34
- .caption-text-wrapper {
35
- position: absolute;
36
- bottom: 150px;
37
- left: 0;
38
- right: 0;
39
- display: flex;
40
- justify-content: center;
41
- pointer-events: none;
42
- overflow: hidden;
43
- padding: 10px 0;
44
- }
45
- .caption-line {
46
- color: white;
47
- font-size: 48px;
48
- font-weight: 600;
49
- letter-spacing: -0.02em;
50
- text-align: center;
51
- text-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
52
- transform: translateY(100%);
53
- opacity: 0;
54
- }
55
- </style>
56
- </head>
57
- <body>
58
- <div
59
- id="root"
60
- data-composition-id="main"
61
- data-start="0"
62
- data-duration="20"
63
- data-width="1920"
64
- data-height="1080"
65
- >
66
- <!-- Scene 1: Logo Intro -->
67
- <div
68
- id="scene-1"
69
- class="scene"
70
- data-composition-id="scene1-logo-intro"
71
- data-composition-src="compositions/scene1-logo-intro.html"
72
- data-start="0"
73
- data-duration="1.5"
74
- data-track-index="1"
75
- data-width="1920"
76
- data-height="1080"
77
- ></div>
78
-
79
- <!-- Scene 2-4: Continuous Canvas -->
80
- <div
81
- id="scene-2-4"
82
- class="scene"
83
- data-composition-id="scene2-4-canvas"
84
- data-composition-src="compositions/scene2-4-canvas.html"
85
- data-start="1.5"
86
- data-duration="12.5"
87
- data-track-index="1"
88
- data-width="1920"
89
- data-height="1080"
90
- ></div>
91
-
92
- <!-- Scene 5: Logo Outro -->
93
- <div
94
- id="scene-5"
95
- class="scene"
96
- data-composition-id="scene5-logo-outro"
97
- data-composition-src="compositions/scene5-logo-outro.html"
98
- data-start="14"
99
- data-duration="6"
100
- data-track-index="1"
101
- data-width="1920"
102
- data-height="1080"
103
- ></div>
104
-
105
- <!-- Captions -->
106
- <div
107
- id="captions-comp"
108
- data-composition-id="captions"
109
- data-start="1.5"
110
- data-duration="12.5"
111
- data-track-index="2"
112
- data-width="1920"
113
- data-height="1080"
114
- >
115
- <div class="caption-text-wrapper">
116
- <div id="caption-text" class="caption-line">Starting with a blank canvas.</div>
117
- </div>
118
-
119
- <script>
120
- (function () {
121
- const tl = gsap.timeline({ paused: true });
122
- const text = document.querySelector("#caption-text");
123
-
124
- tl.to(text, { opacity: 1, y: 0, duration: 0.8, ease: "power3.out" }, 0);
125
- tl.to(text, { opacity: 0, y: -20, duration: 0.3, ease: "power3.in" }, 3.2);
126
- tl.set(text, { innerText: "Three cursors. One file. Zero meetings.", y: 40 }, 3.5);
127
- tl.to(text, { opacity: 1, y: 0, duration: 0.6, ease: "power3.out" }, 3.5);
128
- tl.to(text, { opacity: 0, y: -20, duration: 0.3, ease: "power3.in" }, 7.7);
129
- tl.set(
130
- text,
131
- { innerText: "Components in. Feedback resolved. No one waited.", y: 40 },
132
- 8.0,
133
- );
134
- tl.to(text, { opacity: 1, y: 0, duration: 0.6, ease: "power3.out" }, 8.0);
135
- tl.to(text, { opacity: 0, y: -20, duration: 0.4, ease: "power3.in" }, 12.1);
136
-
137
- window.__timelines = window.__timelines || {};
138
- window.__timelines["captions"] = tl;
139
- })();
140
- </script>
141
- </div>
142
- </div>
143
-
144
- <script>
145
- window.__timelines = window.__timelines || {};
146
- const mainTl = gsap.timeline({ paused: true });
147
-
148
- mainTl.set("#scene-2-4", { scale: 1, filter: "blur(0px)" }, 1.5);
149
- mainTl.to(
150
- "#scene-2-4",
151
- { duration: 0.25, scale: 0.94, filter: "blur(6px)", opacity: 0, ease: "power2.in" },
152
- 13.75,
153
- );
154
-
155
- window.__timelines["main"] = mainTl;
156
- </script>
157
- </body>
158
- </html>
@@ -1,116 +0,0 @@
1
- <svg viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="1920" height="1080" fill="#F2F2F2" />
3
-
4
- <g id="thin-grid-lines" stroke="#0A1E3D" stroke-width="1" opacity="0.1">
5
- <line id="v-thin-1" x1="60" y1="0" x2="60" y2="1080" />
6
- <line id="v-thin-2" x1="120" y1="0" x2="120" y2="1080" />
7
- <line id="v-thin-3" x1="180" y1="0" x2="180" y2="1080" />
8
- <line id="v-thin-5" x1="300" y1="0" x2="300" y2="1080" />
9
- <line id="v-thin-6" x1="360" y1="0" x2="360" y2="1080" />
10
- <line id="v-thin-7" x1="420" y1="0" x2="420" y2="1080" />
11
- <line id="v-thin-9" x1="540" y1="0" x2="540" y2="1080" />
12
- <line id="v-thin-10" x1="600" y1="0" x2="600" y2="1080" />
13
- <line id="v-thin-11" x1="660" y1="0" x2="660" y2="1080" />
14
- <line id="v-thin-13" x1="780" y1="0" x2="780" y2="1080" />
15
- <line id="v-thin-14" x1="840" y1="0" x2="840" y2="1080" />
16
- <line id="v-thin-15" x1="900" y1="0" x2="900" y2="1080" />
17
- <line id="v-thin-17" x1="1020" y1="0" x2="1020" y2="1080" />
18
- <line id="v-thin-18" x1="1080" y1="0" x2="1080" y2="1080" />
19
- <line id="v-thin-19" x1="1140" y1="0" x2="1140" y2="1080" />
20
- <line id="v-thin-21" x1="1260" y1="0" x2="1260" y2="1080" />
21
- <line id="v-thin-22" x1="1320" y1="0" x2="1320" y2="1080" />
22
- <line id="v-thin-23" x1="1380" y1="0" x2="1380" y2="1080" />
23
- <line id="v-thin-25" x1="1500" y1="0" x2="1500" y2="1080" />
24
- <line id="v-thin-26" x1="1560" y1="0" x2="1560" y2="1080" />
25
- <line id="v-thin-27" x1="1620" y1="0" x2="1620" y2="1080" />
26
- <line id="v-thin-29" x1="1740" y1="0" x2="1740" y2="1080" />
27
- <line id="v-thin-30" x1="1800" y1="0" x2="1800" y2="1080" />
28
- <line id="v-thin-31" x1="1860" y1="0" x2="1860" y2="1080" />
29
- <line id="h-thin-1" x1="0" y1="60" x2="1920" y2="60" />
30
- <line id="h-thin-2" x1="0" y1="120" x2="1920" y2="120" />
31
- <line id="h-thin-3" x1="0" y1="180" x2="1920" y2="180" />
32
- <line id="h-thin-5" x1="0" y1="300" x2="1920" y2="300" />
33
- <line id="h-thin-6" x1="0" y1="360" x2="1920" y2="360" />
34
- <line id="h-thin-7" x1="0" y1="420" x2="1920" y2="420" />
35
- <line id="h-thin-9" x1="0" y1="540" x2="1920" y2="540" />
36
- <line id="h-thin-10" x1="0" y1="600" x2="1920" y2="600" />
37
- <line id="h-thin-11" x1="0" y1="660" x2="1920" y2="660" />
38
- <line id="h-thin-13" x1="0" y1="780" x2="1920" y2="780" />
39
- <line id="h-thin-14" x1="0" y1="840" x2="1920" y2="840" />
40
- <line id="h-thin-15" x1="0" y1="900" x2="1920" y2="900" />
41
- <line id="h-thin-17" x1="0" y1="1020" x2="1920" y2="1020" />
42
- </g>
43
-
44
- <g id="thick-grid-lines" stroke="#0A1E3D" stroke-width="3" opacity="0.2">
45
- <line id="v-thick-1" x1="240" y1="0" x2="240" y2="1080" />
46
- <line id="v-thick-2" x1="480" y1="0" x2="480" y2="1080" />
47
- <line id="v-thick-3" x1="720" y1="0" x2="720" y2="1080" />
48
- <line id="v-thick-4" x1="960" y1="0" x2="960" y2="1080" />
49
- <line id="v-thick-5" x1="1200" y1="0" x2="1200" y2="1080" />
50
- <line id="v-thick-6" x1="1440" y1="0" x2="1440" y2="1080" />
51
- <line id="v-thick-7" x1="1680" y1="0" x2="1680" y2="1080" />
52
- <line id="h-thick-1" x1="0" y1="240" x2="1920" y2="240" />
53
- <line id="h-thick-2" x1="0" y1="480" x2="1920" y2="480" />
54
- <line id="h-thick-3" x1="0" y1="720" x2="1920" y2="720" />
55
- <line id="h-thick-4" x1="0" y1="960" x2="1920" y2="960" />
56
- </g>
57
-
58
- <g id="intersections" stroke="#0A1E3D" stroke-width="2" opacity="0.3">
59
- <line x1="230" y1="240" x2="250" y2="240" />
60
- <line x1="240" y1="230" x2="240" y2="250" />
61
- <line x1="230" y1="480" x2="250" y2="480" />
62
- <line x1="240" y1="470" x2="240" y2="490" />
63
- <line x1="230" y1="720" x2="250" y2="720" />
64
- <line x1="240" y1="710" x2="240" y2="730" />
65
- <line x1="230" y1="960" x2="250" y2="960" />
66
- <line x1="240" y1="950" x2="240" y2="970" />
67
- <line x1="470" y1="240" x2="490" y2="240" />
68
- <line x1="480" y1="230" x2="480" y2="250" />
69
- <line x1="470" y1="480" x2="490" y2="480" />
70
- <line x1="480" y1="470" x2="480" y2="490" />
71
- <line x1="470" y1="720" x2="490" y2="720" />
72
- <line x1="480" y1="710" x2="480" y2="730" />
73
- <line x1="470" y1="960" x2="490" y2="960" />
74
- <line x1="480" y1="950" x2="480" y2="970" />
75
- <line x1="710" y1="240" x2="730" y2="240" />
76
- <line x1="720" y1="230" x2="720" y2="250" />
77
- <line x1="710" y1="480" x2="730" y2="480" />
78
- <line x1="720" y1="470" x2="720" y2="490" />
79
- <line x1="710" y1="720" x2="730" y2="720" />
80
- <line x1="720" y1="710" x2="720" y2="730" />
81
- <line x1="710" y1="960" x2="730" y2="960" />
82
- <line x1="720" y1="950" x2="720" y2="970" />
83
- <line x1="950" y1="240" x2="970" y2="240" />
84
- <line x1="960" y1="230" x2="960" y2="250" />
85
- <line x1="950" y1="480" x2="970" y2="480" />
86
- <line x1="960" y1="470" x2="960" y2="490" />
87
- <line x1="950" y1="720" x2="970" y2="720" />
88
- <line x1="960" y1="710" x2="960" y2="730" />
89
- <line x1="950" y1="960" x2="970" y2="960" />
90
- <line x1="960" y1="950" x2="960" y2="970" />
91
- <line x1="1190" y1="240" x2="1210" y2="240" />
92
- <line x1="1200" y1="230" x2="1200" y2="250" />
93
- <line x1="1190" y1="480" x2="1210" y2="480" />
94
- <line x1="1200" y1="470" x2="1200" y2="490" />
95
- <line x1="1190" y1="720" x2="1210" y2="720" />
96
- <line x1="1200" y1="710" x2="1200" y2="730" />
97
- <line x1="1190" y1="960" x2="1210" y2="960" />
98
- <line x1="1200" y1="950" x2="1200" y2="970" />
99
- <line x1="1430" y1="240" x2="1450" y2="240" />
100
- <line x1="1440" y1="230" x2="1440" y2="250" />
101
- <line x1="1430" y1="480" x2="1450" y2="480" />
102
- <line x1="1440" y1="470" x2="1440" y2="490" />
103
- <line x1="1430" y1="720" x2="1450" y2="720" />
104
- <line x1="1440" y1="710" x2="1440" y2="730" />
105
- <line x1="1430" y1="960" x2="1450" y2="960" />
106
- <line x1="1440" y1="950" x2="1440" y2="970" />
107
- <line x1="1670" y1="240" x2="1690" y2="240" />
108
- <line x1="1680" y1="230" x2="1680" y2="250" />
109
- <line x1="1670" y1="480" x2="1690" y2="480" />
110
- <line x1="1680" y1="470" x2="1680" y2="490" />
111
- <line x1="1670" y1="720" x2="1690" y2="720" />
112
- <line x1="1680" y1="710" x2="1680" y2="730" />
113
- <line x1="1670" y1="960" x2="1690" y2="960" />
114
- <line x1="1680" y1="950" x2="1680" y2="970" />
115
- </g>
116
- </svg>
@@ -1,148 +0,0 @@
1
- <template id="captions-template">
2
- <div
3
- data-composition-id="captions"
4
- data-width="1920"
5
- data-height="1080"
6
- data-duration="__VIDEO_DURATION__"
7
- >
8
- <div id="caption-container"></div>
9
-
10
- <style>
11
- [data-composition-id="captions"] {
12
- width: 1920px;
13
- height: 1080px;
14
- position: relative;
15
- font-family: "Helvetica", "Arial", sans-serif;
16
- font-weight: bold;
17
- overflow: hidden;
18
- }
19
-
20
- [data-composition-id="captions"] #caption-container {
21
- position: absolute;
22
- bottom: 120px; /* Consistent bottom positioning */
23
- left: 50%;
24
- transform: translateX(-50%);
25
- display: flex;
26
- justify-content: center;
27
- align-items: center;
28
- width: 100%;
29
- }
30
-
31
- [data-composition-id="captions"] .caption-box {
32
- background-color: #0a1e3d; /* Solid navy */
33
- padding: 20px 40px;
34
- display: none; /* Hidden by default, shown via GSAP */
35
- justify-content: center;
36
- align-items: center;
37
- /* Swiss Grid: sharp corners, solid block */
38
- }
39
-
40
- [data-composition-id="captions"] .caption-text {
41
- color: #f2f2f2; /* Off-white */
42
- font-size: 72px;
43
- text-transform: uppercase; /* Swiss style often uses uppercase for impact */
44
- letter-spacing: -2px;
45
- line-height: 1;
46
- white-space: nowrap;
47
- text-align: center;
48
- }
49
- </style>
50
-
51
- <script>
52
- (function () {
53
- const TRANSCRIPT = [
54
- { text: "We", start: 0.119, end: 0.259 },
55
- { text: "asked", start: 0.319, end: 0.479 },
56
- { text: "what", start: 0.519, end: 0.659 },
57
- { text: "you", start: 0.699, end: 0.819 },
58
- { text: "needed.", start: 0.859, end: 1.819 },
59
- { text: "Forty-seven", start: 1.86, end: 2.299 },
60
- { text: "percent", start: 2.399, end: 2.679 },
61
- { text: "of", start: 2.7, end: 2.799 },
62
- { text: "you", start: 2.839, end: 2.939 },
63
- { text: "said", start: 3.039, end: 3.179 },
64
- { text: "motion", start: 3.24, end: 3.559 },
65
- { text: "graphics,", start: 3.579, end: 4.599 },
66
- { text: "sixty-two", start: 4.679, end: 5.179 },
67
- { text: "percent", start: 5.299, end: 5.759 },
68
- { text: "said", start: 5.859, end: 5.98 },
69
- { text: "static", start: 6.079, end: 6.399 },
70
- { text: "content", start: 6.46, end: 6.879 },
71
- { text: "was", start: 6.92, end: 7.079 },
72
- { text: "costing", start: 7.099, end: 7.48 },
73
- { text: "you", start: 7.5, end: 7.579 },
74
- { text: "attention,", start: 7.679, end: 8.659 },
75
- { text: "and", start: 8.699, end: 8.86 },
76
- { text: "three", start: 8.88, end: 9.06 },
77
- { text: "out", start: 9.079, end: 9.18 },
78
- { text: "of", start: 9.199, end: 9.34 },
79
- { text: "four", start: 9.38, end: 9.799 },
80
- { text: "said", start: 9.84, end: 10.0 },
81
- { text: "you", start: 10.019, end: 10.159 },
82
- { text: "know", start: 10.179, end: 10.36 },
83
- { text: "the", start: 10.38, end: 10.42 },
84
- { text: "look", start: 10.519, end: 10.699 },
85
- { text: "you", start: 10.739, end: 10.859 },
86
- { text: "want", start: 10.98, end: 11.34 },
87
- { text: "but", start: 11.359, end: 11.52 },
88
- { text: "don't", start: 11.56, end: 11.779 },
89
- { text: "have", start: 11.819, end: 11.94 },
90
- { text: "the", start: 11.96, end: 12.06 },
91
- { text: "editing", start: 12.079, end: 12.4 },
92
- { text: "skills", start: 12.52, end: 12.86 },
93
- { text: "to", start: 12.88, end: 13.0 },
94
- { text: "get", start: 13.019, end: 13.18 },
95
- { text: "there.", start: 13.22, end: 14.22 },
96
- { text: "So", start: 14.239, end: 14.399 },
97
- { text: "we", start: 14.42, end: 14.52 },
98
- { text: "built", start: 14.619, end: 14.88 },
99
- { text: "Hyperframes", start: 15.079, end: 15.42 },
100
- ];
101
- const container = document.getElementById("caption-container");
102
- const tl = gsap.timeline({ paused: true });
103
-
104
- if (!TRANSCRIPT || TRANSCRIPT.length === 0) {
105
- window.__timelines = window.__timelines || {};
106
- window.__timelines["captions"] = tl;
107
- return;
108
- }
109
-
110
- // Group transcript into max 5 words per group
111
- const groups = [];
112
- let currentGroup = [];
113
-
114
- TRANSCRIPT.forEach((word, index) => {
115
- currentGroup.push(word);
116
- // Group by 5 words OR if it's the last word
117
- if (currentGroup.length === 5 || index === TRANSCRIPT.length - 1) {
118
- groups.push([...currentGroup]);
119
- currentGroup = [];
120
- }
121
- });
122
-
123
- // Create DOM elements and timeline for each group
124
- groups.forEach((group, i) => {
125
- const box = document.createElement("div");
126
- box.className = "caption-box";
127
- box.id = `group-${i}`;
128
-
129
- const text = document.createElement("div");
130
- text.className = "caption-text";
131
- text.textContent = group.map((w) => w.text).join(" ");
132
-
133
- box.appendChild(text);
134
- container.appendChild(box);
135
-
136
- const startTime = group[0].start;
137
- const endTime = group[group.length - 1].end;
138
-
139
- // Hard cut animation (no fades) as requested
140
- tl.set(box, { display: "flex" }, startTime);
141
- tl.set(box, { display: "none" }, endTime);
142
- });
143
-
144
- window.__timelines["captions"] = tl;
145
- })();
146
- </script>
147
- </div>
148
- </template>