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.
- package/README.md +3 -3
- package/dist/cli.js +3968 -3297
- package/dist/skills/hyperframes-captions/SKILL.md +1 -1
- package/dist/skills/hyperframes-compose/SKILL.md +1 -0
- package/dist/studio/assets/index-Bkp9HQbo.css +1 -0
- package/dist/studio/assets/index-DfhSlTti.js +93 -0
- package/dist/studio/index.html +2 -2
- package/dist/templates/_shared/CLAUDE.md +1 -1
- package/package.json +3 -2
- package/dist/studio/assets/index-CLmYRLY-.css +0 -1
- package/dist/studio/assets/index-CRvFpc0E.js +0 -84
- package/dist/templates/decision-tree/compositions/decision_tree.html +0 -420
- package/dist/templates/decision-tree/index.html +0 -56
- package/dist/templates/generators.ts +0 -32
- package/dist/templates/kinetic-type/compositions/main-graphics.html +0 -588
- package/dist/templates/kinetic-type/index.html +0 -61
- package/dist/templates/nyt-graph/compositions/nyt-chart.html +0 -450
- package/dist/templates/nyt-graph/index.html +0 -51
- package/dist/templates/play-mode/compositions/captions.html +0 -163
- package/dist/templates/play-mode/compositions/intro.html +0 -107
- package/dist/templates/play-mode/compositions/stats.html +0 -388
- package/dist/templates/play-mode/index.html +0 -239
- package/dist/templates/product-promo/assets/figma-cursors.svg +0 -30
- package/dist/templates/product-promo/assets/figma-logo-pieces.svg +0 -15
- package/dist/templates/product-promo/assets/figma-logo-pills.svg +0 -6
- package/dist/templates/product-promo/compositions/scene1-logo-intro.html +0 -189
- package/dist/templates/product-promo/compositions/scene2-4-canvas.html +0 -570
- package/dist/templates/product-promo/compositions/scene5-logo-outro.html +0 -226
- package/dist/templates/product-promo/index.html +0 -158
- package/dist/templates/swiss-grid/assets/swiss-grid.svg +0 -116
- package/dist/templates/swiss-grid/compositions/captions.html +0 -148
- package/dist/templates/swiss-grid/compositions/graphics.html +0 -207
- package/dist/templates/swiss-grid/compositions/intro.html +0 -131
- package/dist/templates/swiss-grid/index.html +0 -234
- package/dist/templates/vignelli/compositions/captions.html +0 -181
- package/dist/templates/vignelli/compositions/overlays.html +0 -323
- package/dist/templates/vignelli/index.html +0 -190
- package/dist/templates/warm-grain/compositions/captions.html +0 -147
- package/dist/templates/warm-grain/compositions/graphics.html +0 -164
- package/dist/templates/warm-grain/compositions/intro.html +0 -86
- 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>
|