@contractspec/lib.video-gen 1.42.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.
Files changed (137) hide show
  1. package/dist/browser/compositions/api-overview.js +645 -0
  2. package/dist/browser/compositions/index.js +1133 -0
  3. package/dist/browser/compositions/primitives/animated-text.js +144 -0
  4. package/dist/browser/compositions/primitives/brand-frame.js +181 -0
  5. package/dist/browser/compositions/primitives/code-block.js +226 -0
  6. package/dist/browser/compositions/primitives/index.js +656 -0
  7. package/dist/browser/compositions/primitives/progress-bar.js +59 -0
  8. package/dist/browser/compositions/primitives/terminal.js +265 -0
  9. package/dist/browser/compositions/primitives/transition.js +98 -0
  10. package/dist/browser/compositions/social-clip.js +500 -0
  11. package/dist/browser/compositions/terminal-demo.js +558 -0
  12. package/dist/browser/design/index.js +155 -0
  13. package/dist/browser/design/layouts.js +50 -0
  14. package/dist/browser/design/motion.js +43 -0
  15. package/dist/browser/design/tokens.js +28 -0
  16. package/dist/browser/design/typography.js +61 -0
  17. package/dist/browser/docs/compositions.docblock.js +182 -0
  18. package/dist/browser/docs/design.docblock.js +187 -0
  19. package/dist/browser/docs/generators.docblock.js +187 -0
  20. package/dist/browser/docs/rendering.docblock.js +197 -0
  21. package/dist/browser/docs/video-gen.docblock.js +141 -0
  22. package/dist/browser/generators/index.js +416 -0
  23. package/dist/browser/generators/scene-planner.js +205 -0
  24. package/dist/browser/generators/script-generator.js +147 -0
  25. package/dist/browser/generators/video-generator.js +414 -0
  26. package/dist/browser/index.js +1550 -0
  27. package/dist/browser/player/demo-player.js +1136 -0
  28. package/dist/browser/player/index.js +1136 -0
  29. package/dist/browser/remotion/Root.js +1189 -0
  30. package/dist/browser/remotion/index.js +1190 -0
  31. package/dist/browser/renderers/config.js +40 -0
  32. package/dist/browser/renderers/index.js +160 -0
  33. package/dist/browser/renderers/local.js +156 -0
  34. package/dist/browser/types.js +13 -0
  35. package/dist/compositions/api-overview.d.ts +16 -0
  36. package/dist/compositions/api-overview.js +640 -0
  37. package/dist/compositions/index.d.ts +7 -0
  38. package/dist/compositions/index.js +1128 -0
  39. package/dist/compositions/primitives/animated-text.d.ts +22 -0
  40. package/dist/compositions/primitives/animated-text.js +139 -0
  41. package/dist/compositions/primitives/brand-frame.d.ts +14 -0
  42. package/dist/compositions/primitives/brand-frame.js +176 -0
  43. package/dist/compositions/primitives/code-block.d.ts +18 -0
  44. package/dist/compositions/primitives/code-block.js +221 -0
  45. package/dist/compositions/primitives/index.d.ts +12 -0
  46. package/dist/compositions/primitives/index.js +651 -0
  47. package/dist/compositions/primitives/progress-bar.d.ts +12 -0
  48. package/dist/compositions/primitives/progress-bar.js +54 -0
  49. package/dist/compositions/primitives/terminal.d.ts +24 -0
  50. package/dist/compositions/primitives/terminal.js +260 -0
  51. package/dist/compositions/primitives/transition.d.ts +14 -0
  52. package/dist/compositions/primitives/transition.js +93 -0
  53. package/dist/compositions/social-clip.d.ts +16 -0
  54. package/dist/compositions/social-clip.js +495 -0
  55. package/dist/compositions/terminal-demo.d.ts +17 -0
  56. package/dist/compositions/terminal-demo.js +553 -0
  57. package/dist/design/index.d.ts +4 -0
  58. package/dist/design/index.js +150 -0
  59. package/dist/design/layouts.d.ts +69 -0
  60. package/dist/design/layouts.js +45 -0
  61. package/dist/design/motion.d.ts +72 -0
  62. package/dist/design/motion.js +38 -0
  63. package/dist/design/tokens.d.ts +31 -0
  64. package/dist/design/tokens.js +23 -0
  65. package/dist/design/typography.d.ts +61 -0
  66. package/dist/design/typography.js +56 -0
  67. package/dist/docs/compositions.docblock.d.ts +1 -0
  68. package/dist/docs/compositions.docblock.js +183 -0
  69. package/dist/docs/design.docblock.d.ts +1 -0
  70. package/dist/docs/design.docblock.js +188 -0
  71. package/dist/docs/generators.docblock.d.ts +1 -0
  72. package/dist/docs/generators.docblock.js +188 -0
  73. package/dist/docs/rendering.docblock.d.ts +1 -0
  74. package/dist/docs/rendering.docblock.js +198 -0
  75. package/dist/docs/video-gen.docblock.d.ts +1 -0
  76. package/dist/docs/video-gen.docblock.js +142 -0
  77. package/dist/generators/index.d.ts +5 -0
  78. package/dist/generators/index.js +411 -0
  79. package/dist/generators/scene-planner.d.ts +23 -0
  80. package/dist/generators/scene-planner.js +200 -0
  81. package/dist/generators/script-generator.d.ts +49 -0
  82. package/dist/generators/script-generator.js +142 -0
  83. package/dist/generators/video-generator.d.ts +20 -0
  84. package/dist/generators/video-generator.js +409 -0
  85. package/dist/index.d.ts +6 -0
  86. package/dist/index.js +1545 -0
  87. package/dist/node/compositions/api-overview.js +640 -0
  88. package/dist/node/compositions/index.js +1128 -0
  89. package/dist/node/compositions/primitives/animated-text.js +139 -0
  90. package/dist/node/compositions/primitives/brand-frame.js +176 -0
  91. package/dist/node/compositions/primitives/code-block.js +221 -0
  92. package/dist/node/compositions/primitives/index.js +651 -0
  93. package/dist/node/compositions/primitives/progress-bar.js +54 -0
  94. package/dist/node/compositions/primitives/terminal.js +260 -0
  95. package/dist/node/compositions/primitives/transition.js +93 -0
  96. package/dist/node/compositions/social-clip.js +495 -0
  97. package/dist/node/compositions/terminal-demo.js +553 -0
  98. package/dist/node/design/index.js +150 -0
  99. package/dist/node/design/layouts.js +45 -0
  100. package/dist/node/design/motion.js +38 -0
  101. package/dist/node/design/tokens.js +23 -0
  102. package/dist/node/design/typography.js +56 -0
  103. package/dist/node/docs/compositions.docblock.js +182 -0
  104. package/dist/node/docs/design.docblock.js +187 -0
  105. package/dist/node/docs/generators.docblock.js +187 -0
  106. package/dist/node/docs/rendering.docblock.js +197 -0
  107. package/dist/node/docs/video-gen.docblock.js +141 -0
  108. package/dist/node/generators/index.js +411 -0
  109. package/dist/node/generators/scene-planner.js +200 -0
  110. package/dist/node/generators/script-generator.js +142 -0
  111. package/dist/node/generators/video-generator.js +409 -0
  112. package/dist/node/index.js +1545 -0
  113. package/dist/node/player/demo-player.js +1131 -0
  114. package/dist/node/player/index.js +1131 -0
  115. package/dist/node/remotion/Root.js +1184 -0
  116. package/dist/node/remotion/index.js +1185 -0
  117. package/dist/node/renderers/config.js +35 -0
  118. package/dist/node/renderers/index.js +155 -0
  119. package/dist/node/renderers/local.js +151 -0
  120. package/dist/node/types.js +8 -0
  121. package/dist/player/demo-player.d.ts +55 -0
  122. package/dist/player/demo-player.js +1131 -0
  123. package/dist/player/index.d.ts +2 -0
  124. package/dist/player/index.js +1131 -0
  125. package/dist/remotion/Root.d.ts +2 -0
  126. package/dist/remotion/Root.js +1184 -0
  127. package/dist/remotion/index.d.ts +1 -0
  128. package/dist/remotion/index.js +1185 -0
  129. package/dist/renderers/config.d.ts +28 -0
  130. package/dist/renderers/config.js +35 -0
  131. package/dist/renderers/index.d.ts +3 -0
  132. package/dist/renderers/index.js +155 -0
  133. package/dist/renderers/local.d.ts +17 -0
  134. package/dist/renderers/local.js +151 -0
  135. package/dist/types.d.ts +63 -0
  136. package/dist/types.js +8 -0
  137. package/package.json +637 -0
@@ -0,0 +1,1136 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined")
5
+ return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+
9
+ // src/design/motion.ts
10
+ import { Easing } from "remotion";
11
+ var videoEasing = {
12
+ entrance: Easing.out(Easing.exp),
13
+ exit: Easing.in(Easing.exp),
14
+ emphasis: Easing.out(Easing.back(1.4)),
15
+ linear: Easing.linear,
16
+ gentle: Easing.bezier(0.25, 0.1, 0.25, 1),
17
+ spring: Easing.out(Easing.back(1.7))
18
+ };
19
+ var videoDurations = {
20
+ sceneTransition: 20,
21
+ textEntrance: 15,
22
+ textExit: 12,
23
+ codeTypingPerChar: 2,
24
+ sectionPause: 30,
25
+ emphasisPause: 15,
26
+ brandReveal: 25,
27
+ minScene: 60,
28
+ shortScene: 60,
29
+ mediumScene: 120,
30
+ longScene: 240
31
+ };
32
+ var videoTransitions = {
33
+ fade: { type: "fade", durationInFrames: 20 },
34
+ slideLeft: { type: "slide-left", durationInFrames: 20 },
35
+ slideRight: { type: "slide-right", durationInFrames: 20 },
36
+ wipe: { type: "wipe", durationInFrames: 15 },
37
+ none: { type: "none", durationInFrames: 0 }
38
+ };
39
+
40
+ // src/design/tokens.ts
41
+ import { defaultTokens } from "@contractspec/lib.design-system";
42
+ var defaultVideoColors = {
43
+ canvasBackground: defaultTokens.colors.background,
44
+ codeBackground: "#1e1e2e",
45
+ terminalBackground: "#0d1117",
46
+ terminalForeground: "#c9d1d9",
47
+ highlight: defaultTokens.colors.accent,
48
+ gradientStart: defaultTokens.colors.primary,
49
+ gradientEnd: defaultTokens.colors.accent
50
+ };
51
+ var defaultVideoTheme = {
52
+ ...defaultTokens,
53
+ video: defaultVideoColors
54
+ };
55
+
56
+ // src/design/layouts.ts
57
+ import { VIDEO_FORMATS } from "@contractspec/lib.contracts-integrations/integrations/providers/video";
58
+ var DEFAULT_FPS = 30;
59
+ var videoSafeZone = {
60
+ horizontal: 120,
61
+ vertical: 80,
62
+ contentWidth: 1680,
63
+ contentHeight: 920
64
+ };
65
+ function scaleSafeZone(format) {
66
+ const scaleX = format.width / 1920;
67
+ const scaleY = format.height / 1080;
68
+ return {
69
+ horizontal: Math.round(videoSafeZone.horizontal * scaleX),
70
+ vertical: Math.round(videoSafeZone.vertical * scaleY),
71
+ contentWidth: Math.round(videoSafeZone.contentWidth * scaleX),
72
+ contentHeight: Math.round(videoSafeZone.contentHeight * scaleY)
73
+ };
74
+ }
75
+ var videoPositions = {
76
+ center: { x: 960, y: 540 },
77
+ topLeft: { x: 120, y: 80 },
78
+ topRight: { x: 1800, y: 80 },
79
+ bottomLeft: { x: 120, y: 1000 },
80
+ bottomRight: { x: 1800, y: 1000 },
81
+ bottomCenter: { x: 960, y: 960 }
82
+ };
83
+ function getAllFormatVariants() {
84
+ return [
85
+ VIDEO_FORMATS.landscape,
86
+ VIDEO_FORMATS.square,
87
+ VIDEO_FORMATS.portrait
88
+ ];
89
+ }
90
+
91
+ // src/compositions/primitives/brand-frame.tsx
92
+ import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
93
+ import { jsxDEV } from "react/jsx-dev-runtime";
94
+ var BrandFrame = ({
95
+ styleOverrides,
96
+ showBranding = true,
97
+ animateEntrance = true,
98
+ variant = "gradient",
99
+ children
100
+ }) => {
101
+ const frame = useCurrentFrame();
102
+ const { width, height } = useVideoConfig();
103
+ const theme = defaultVideoTheme;
104
+ const safeZone = scaleSafeZone({ type: "custom", width, height });
105
+ const primaryColor = styleOverrides?.primaryColor ?? theme.colors.primary;
106
+ const _accentColor = styleOverrides?.accentColor ?? theme.colors.accent;
107
+ const isDark = styleOverrides?.darkMode ?? true;
108
+ let background;
109
+ switch (variant) {
110
+ case "solid":
111
+ background = isDark ? "#0a0a0a" : theme.colors.background;
112
+ break;
113
+ case "gradient":
114
+ background = isDark ? `linear-gradient(135deg, #0a0a14 0%, #0f172a 50%, #0a0a14 100%)` : `linear-gradient(135deg, ${theme.colors.background} 0%, ${theme.colors.muted} 100%)`;
115
+ break;
116
+ case "dark":
117
+ background = "#000000";
118
+ break;
119
+ }
120
+ const entranceOpacity = animateEntrance ? interpolate(frame, [0, 15], [0, 1], {
121
+ extrapolateLeft: "clamp",
122
+ extrapolateRight: "clamp",
123
+ easing: videoEasing.entrance
124
+ }) : 1;
125
+ const brandOpacity = showBranding ? interpolate(frame, [videoDurations.brandReveal, videoDurations.brandReveal + 15], [0, 0.3], {
126
+ extrapolateLeft: "clamp",
127
+ extrapolateRight: "clamp"
128
+ }) : 0;
129
+ return /* @__PURE__ */ jsxDEV("div", {
130
+ style: {
131
+ width,
132
+ height,
133
+ background,
134
+ position: "relative",
135
+ overflow: "hidden",
136
+ opacity: entranceOpacity
137
+ },
138
+ children: [
139
+ variant === "gradient" && /* @__PURE__ */ jsxDEV("div", {
140
+ style: {
141
+ position: "absolute",
142
+ top: "-20%",
143
+ right: "-10%",
144
+ width: "50%",
145
+ height: "50%",
146
+ background: `radial-gradient(circle, ${primaryColor}15 0%, transparent 70%)`,
147
+ borderRadius: "50%",
148
+ pointerEvents: "none"
149
+ }
150
+ }, undefined, false, undefined, this),
151
+ /* @__PURE__ */ jsxDEV("div", {
152
+ style: {
153
+ position: "absolute",
154
+ left: safeZone.horizontal,
155
+ top: safeZone.vertical,
156
+ width: safeZone.contentWidth,
157
+ height: safeZone.contentHeight,
158
+ display: "flex",
159
+ flexDirection: "column"
160
+ },
161
+ children
162
+ }, undefined, false, undefined, this),
163
+ showBranding && /* @__PURE__ */ jsxDEV("div", {
164
+ style: {
165
+ position: "absolute",
166
+ bottom: safeZone.vertical / 2,
167
+ right: safeZone.horizontal,
168
+ opacity: brandOpacity,
169
+ color: isDark ? "#ffffff" : "#000000",
170
+ fontSize: Math.round(16 * (width / 1920)),
171
+ fontWeight: 500,
172
+ letterSpacing: 1
173
+ },
174
+ children: "ContractSpec"
175
+ }, undefined, false, undefined, this)
176
+ ]
177
+ }, undefined, true, undefined, this);
178
+ };
179
+
180
+ // src/design/typography.ts
181
+ var videoTypography = {
182
+ title: {
183
+ fontSize: 72,
184
+ lineHeight: 1.1,
185
+ fontWeight: 700,
186
+ letterSpacing: -1
187
+ },
188
+ heading: {
189
+ fontSize: 56,
190
+ lineHeight: 1.2,
191
+ fontWeight: 600,
192
+ letterSpacing: -0.5
193
+ },
194
+ subheading: {
195
+ fontSize: 40,
196
+ lineHeight: 1.25,
197
+ fontWeight: 500
198
+ },
199
+ body: {
200
+ fontSize: 32,
201
+ lineHeight: 1.5,
202
+ fontWeight: 400
203
+ },
204
+ code: {
205
+ fontSize: 28,
206
+ lineHeight: 1.6,
207
+ fontWeight: 400
208
+ },
209
+ caption: {
210
+ fontSize: 24,
211
+ lineHeight: 1.4,
212
+ fontWeight: 400
213
+ },
214
+ label: {
215
+ fontSize: 20,
216
+ lineHeight: 1.3,
217
+ fontWeight: 600,
218
+ letterSpacing: 1
219
+ }
220
+ };
221
+ function scaleTypography(style, targetWidth) {
222
+ const scale = targetWidth / 1920;
223
+ return {
224
+ ...style,
225
+ fontSize: Math.round(style.fontSize * scale),
226
+ letterSpacing: style.letterSpacing ? Math.round(style.letterSpacing * scale * 10) / 10 : undefined
227
+ };
228
+ }
229
+
230
+ // src/compositions/primitives/animated-text.tsx
231
+ import { interpolate as interpolate2, useCurrentFrame as useCurrentFrame2, useVideoConfig as useVideoConfig2 } from "remotion";
232
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
233
+ var AnimatedText = ({
234
+ text,
235
+ variant = "body",
236
+ style: styleOverride,
237
+ enterAt = 0,
238
+ exitAt,
239
+ color = "#ffffff",
240
+ align = "left"
241
+ }) => {
242
+ const frame = useCurrentFrame2();
243
+ const { width } = useVideoConfig2();
244
+ const baseStyle = videoTypography[variant];
245
+ const scaled = scaleTypography(baseStyle, width);
246
+ const finalStyle = { ...scaled, ...styleOverride };
247
+ const enterProgress = interpolate2(frame, [enterAt, enterAt + videoDurations.textEntrance], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
248
+ const enterOpacity = interpolate2(enterProgress, [0, 1], [0, 1], {
249
+ easing: videoEasing.entrance
250
+ });
251
+ const enterTranslateY = interpolate2(enterProgress, [0, 1], [30, 0], {
252
+ easing: videoEasing.entrance
253
+ });
254
+ let exitOpacity = 1;
255
+ let exitTranslateY = 0;
256
+ if (exitAt !== undefined) {
257
+ const exitProgress = interpolate2(frame, [exitAt, exitAt + videoDurations.textExit], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
258
+ exitOpacity = interpolate2(exitProgress, [0, 1], [1, 0], {
259
+ easing: videoEasing.exit
260
+ });
261
+ exitTranslateY = interpolate2(exitProgress, [0, 1], [0, -20], {
262
+ easing: videoEasing.exit
263
+ });
264
+ }
265
+ const opacity = enterOpacity * exitOpacity;
266
+ const translateY = enterTranslateY + exitTranslateY;
267
+ return /* @__PURE__ */ jsxDEV2("div", {
268
+ style: {
269
+ fontSize: finalStyle.fontSize,
270
+ lineHeight: finalStyle.lineHeight,
271
+ fontWeight: finalStyle.fontWeight,
272
+ letterSpacing: finalStyle.letterSpacing,
273
+ color,
274
+ textAlign: align,
275
+ opacity,
276
+ transform: `translateY(${translateY}px)`,
277
+ willChange: "opacity, transform"
278
+ },
279
+ children: text
280
+ }, undefined, false, undefined, this);
281
+ };
282
+
283
+ // src/compositions/primitives/code-block.tsx
284
+ import { interpolate as interpolate3, useCurrentFrame as useCurrentFrame3, useVideoConfig as useVideoConfig3 } from "remotion";
285
+ import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
286
+ var CodeBlock = ({
287
+ code,
288
+ language = "typescript",
289
+ startAt = 0,
290
+ typeAnimation = true,
291
+ backgroundColor = defaultVideoColors.codeBackground,
292
+ textColor = "#abb2bf",
293
+ filename
294
+ }) => {
295
+ const frame = useCurrentFrame3();
296
+ const { width } = useVideoConfig3();
297
+ const codeStyle = scaleTypography(videoTypography.code, width);
298
+ const totalChars = code.length;
299
+ const typingDuration = totalChars * videoDurations.codeTypingPerChar;
300
+ const charsVisible = typeAnimation ? Math.floor(interpolate3(frame, [startAt, startAt + typingDuration], [0, totalChars], {
301
+ extrapolateLeft: "clamp",
302
+ extrapolateRight: "clamp"
303
+ })) : totalChars;
304
+ const visibleCode = code.slice(0, charsVisible);
305
+ const opacity = interpolate3(frame, [startAt, startAt + 10], [0, 1], {
306
+ extrapolateLeft: "clamp",
307
+ extrapolateRight: "clamp",
308
+ easing: videoEasing.entrance
309
+ });
310
+ const showCursor = typeAnimation && charsVisible < totalChars && frame % 16 < 10;
311
+ return /* @__PURE__ */ jsxDEV3("div", {
312
+ style: {
313
+ backgroundColor,
314
+ borderRadius: 16,
315
+ padding: 0,
316
+ opacity,
317
+ overflow: "hidden",
318
+ boxShadow: "0 8px 32px rgba(0,0,0,0.3)"
319
+ },
320
+ children: [
321
+ /* @__PURE__ */ jsxDEV3("div", {
322
+ style: {
323
+ display: "flex",
324
+ alignItems: "center",
325
+ padding: "12px 20px",
326
+ backgroundColor: "rgba(0,0,0,0.2)",
327
+ gap: 8
328
+ },
329
+ children: [
330
+ /* @__PURE__ */ jsxDEV3("div", {
331
+ style: { display: "flex", gap: 8 },
332
+ children: [
333
+ /* @__PURE__ */ jsxDEV3("div", {
334
+ style: {
335
+ width: 12,
336
+ height: 12,
337
+ borderRadius: "50%",
338
+ backgroundColor: "#ff5f57"
339
+ }
340
+ }, undefined, false, undefined, this),
341
+ /* @__PURE__ */ jsxDEV3("div", {
342
+ style: {
343
+ width: 12,
344
+ height: 12,
345
+ borderRadius: "50%",
346
+ backgroundColor: "#febc2e"
347
+ }
348
+ }, undefined, false, undefined, this),
349
+ /* @__PURE__ */ jsxDEV3("div", {
350
+ style: {
351
+ width: 12,
352
+ height: 12,
353
+ borderRadius: "50%",
354
+ backgroundColor: "#28c840"
355
+ }
356
+ }, undefined, false, undefined, this)
357
+ ]
358
+ }, undefined, true, undefined, this),
359
+ /* @__PURE__ */ jsxDEV3("div", {
360
+ style: {
361
+ flex: 1,
362
+ textAlign: "center",
363
+ color: "#666",
364
+ fontSize: codeStyle.fontSize * 0.7,
365
+ fontFamily: "monospace"
366
+ },
367
+ children: filename ?? language
368
+ }, undefined, false, undefined, this)
369
+ ]
370
+ }, undefined, true, undefined, this),
371
+ /* @__PURE__ */ jsxDEV3("div", {
372
+ style: { padding: "24px 32px" },
373
+ children: /* @__PURE__ */ jsxDEV3("pre", {
374
+ style: {
375
+ margin: 0,
376
+ fontFamily: "'SF Mono', 'Fira Code', 'JetBrains Mono', monospace",
377
+ fontSize: codeStyle.fontSize,
378
+ lineHeight: codeStyle.lineHeight,
379
+ color: textColor,
380
+ whiteSpace: "pre-wrap",
381
+ wordBreak: "break-word"
382
+ },
383
+ children: [
384
+ visibleCode,
385
+ showCursor && /* @__PURE__ */ jsxDEV3("span", {
386
+ style: {
387
+ backgroundColor: textColor,
388
+ width: "2px",
389
+ display: "inline-block",
390
+ height: "1.2em",
391
+ verticalAlign: "text-bottom"
392
+ },
393
+ children: " "
394
+ }, undefined, false, undefined, this)
395
+ ]
396
+ }, undefined, true, undefined, this)
397
+ }, undefined, false, undefined, this)
398
+ ]
399
+ }, undefined, true, undefined, this);
400
+ };
401
+
402
+ // src/compositions/primitives/progress-bar.tsx
403
+ import { useCurrentFrame as useCurrentFrame4, useVideoConfig as useVideoConfig4 } from "remotion";
404
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
405
+ var ProgressBar = ({
406
+ height = 4,
407
+ color = defaultVideoTheme.colors.primary,
408
+ backgroundColor = "rgba(255,255,255,0.1)",
409
+ position = "bottom"
410
+ }) => {
411
+ const frame = useCurrentFrame4();
412
+ const { durationInFrames, width } = useVideoConfig4();
413
+ const progress = frame / durationInFrames;
414
+ return /* @__PURE__ */ jsxDEV4("div", {
415
+ style: {
416
+ position: "absolute",
417
+ [position]: 0,
418
+ left: 0,
419
+ width,
420
+ height,
421
+ backgroundColor,
422
+ zIndex: 100
423
+ },
424
+ children: /* @__PURE__ */ jsxDEV4("div", {
425
+ style: {
426
+ width: `${progress * 100}%`,
427
+ height: "100%",
428
+ backgroundColor: color,
429
+ transition: "none"
430
+ }
431
+ }, undefined, false, undefined, this)
432
+ }, undefined, false, undefined, this);
433
+ };
434
+
435
+ // src/compositions/api-overview.tsx
436
+ import {
437
+ AbsoluteFill,
438
+ Sequence,
439
+ interpolate as interpolate4,
440
+ useCurrentFrame as useCurrentFrame5,
441
+ useVideoConfig as useVideoConfig5
442
+ } from "remotion";
443
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
444
+ var ApiOverview = ({
445
+ specName,
446
+ method = "POST",
447
+ endpoint = "/api/users",
448
+ specCode,
449
+ generatedOutputs = [
450
+ "REST Endpoint",
451
+ "GraphQL Mutation",
452
+ "Prisma Model",
453
+ "TypeScript SDK",
454
+ "MCP Tool",
455
+ "OpenAPI Spec"
456
+ ],
457
+ tagline = "One spec. Every surface."
458
+ }) => {
459
+ const { durationInFrames } = useVideoConfig5();
460
+ const theme = defaultVideoTheme;
461
+ const INTRO_END = 60;
462
+ const CODE_START = 45;
463
+ const CODE_END = INTRO_END + 150;
464
+ const OUTPUTS_START = CODE_END - 30;
465
+ const TAGLINE_START = durationInFrames - 90;
466
+ return /* @__PURE__ */ jsxDEV5(AbsoluteFill, {
467
+ children: [
468
+ /* @__PURE__ */ jsxDEV5(BrandFrame, {
469
+ variant: "gradient",
470
+ showBranding: true,
471
+ children: [
472
+ /* @__PURE__ */ jsxDEV5(Sequence, {
473
+ from: 0,
474
+ durationInFrames: CODE_END,
475
+ children: /* @__PURE__ */ jsxDEV5("div", {
476
+ style: {
477
+ flex: 1,
478
+ display: "flex",
479
+ flexDirection: "column",
480
+ gap: 16
481
+ },
482
+ children: [
483
+ /* @__PURE__ */ jsxDEV5("div", {
484
+ style: { display: "flex", alignItems: "center", gap: 16 },
485
+ children: [
486
+ /* @__PURE__ */ jsxDEV5(MethodBadge, {
487
+ method,
488
+ enterAt: 10
489
+ }, undefined, false, undefined, this),
490
+ /* @__PURE__ */ jsxDEV5(AnimatedText, {
491
+ text: endpoint,
492
+ variant: "subheading",
493
+ enterAt: 15,
494
+ color: theme.colors.mutedForeground
495
+ }, undefined, false, undefined, this)
496
+ ]
497
+ }, undefined, true, undefined, this),
498
+ /* @__PURE__ */ jsxDEV5(AnimatedText, {
499
+ text: specName,
500
+ variant: "title",
501
+ enterAt: 5,
502
+ color: "#ffffff"
503
+ }, undefined, false, undefined, this),
504
+ /* @__PURE__ */ jsxDEV5("div", {
505
+ style: { flex: 1, marginTop: 24 },
506
+ children: /* @__PURE__ */ jsxDEV5(CodeBlock, {
507
+ code: specCode,
508
+ language: "typescript",
509
+ filename: `${specName.toLowerCase()}.contract.ts`,
510
+ startAt: CODE_START,
511
+ typeAnimation: true
512
+ }, undefined, false, undefined, this)
513
+ }, undefined, false, undefined, this)
514
+ ]
515
+ }, undefined, true, undefined, this)
516
+ }, undefined, false, undefined, this),
517
+ /* @__PURE__ */ jsxDEV5(Sequence, {
518
+ from: OUTPUTS_START,
519
+ durationInFrames: durationInFrames - OUTPUTS_START,
520
+ children: /* @__PURE__ */ jsxDEV5("div", {
521
+ style: {
522
+ flex: 1,
523
+ display: "flex",
524
+ flexDirection: "column",
525
+ justifyContent: "center",
526
+ alignItems: "center",
527
+ gap: 24
528
+ },
529
+ children: [
530
+ /* @__PURE__ */ jsxDEV5(AnimatedText, {
531
+ text: "Generates:",
532
+ variant: "heading",
533
+ enterAt: 0,
534
+ color: "#ffffff",
535
+ align: "center"
536
+ }, undefined, false, undefined, this),
537
+ /* @__PURE__ */ jsxDEV5("div", {
538
+ style: {
539
+ display: "flex",
540
+ flexWrap: "wrap",
541
+ gap: 16,
542
+ justifyContent: "center",
543
+ maxWidth: "80%",
544
+ marginTop: 32
545
+ },
546
+ children: generatedOutputs.map((output, i) => /* @__PURE__ */ jsxDEV5(OutputChip, {
547
+ label: output,
548
+ index: i,
549
+ startFrame: 20 + i * 8
550
+ }, output, false, undefined, this))
551
+ }, undefined, false, undefined, this),
552
+ /* @__PURE__ */ jsxDEV5(Sequence, {
553
+ from: TAGLINE_START - OUTPUTS_START,
554
+ children: /* @__PURE__ */ jsxDEV5("div", {
555
+ style: { marginTop: 48 },
556
+ children: /* @__PURE__ */ jsxDEV5(AnimatedText, {
557
+ text: tagline,
558
+ variant: "heading",
559
+ enterAt: 0,
560
+ color: theme.colors.accent,
561
+ align: "center"
562
+ }, undefined, false, undefined, this)
563
+ }, undefined, false, undefined, this)
564
+ }, undefined, false, undefined, this)
565
+ ]
566
+ }, undefined, true, undefined, this)
567
+ }, undefined, false, undefined, this)
568
+ ]
569
+ }, undefined, true, undefined, this),
570
+ /* @__PURE__ */ jsxDEV5(ProgressBar, {}, undefined, false, undefined, this)
571
+ ]
572
+ }, undefined, true, undefined, this);
573
+ };
574
+ var MethodBadge = ({
575
+ method,
576
+ enterAt
577
+ }) => {
578
+ const frame = useCurrentFrame5();
579
+ const opacity = interpolate4(frame, [enterAt, enterAt + 10], [0, 1], {
580
+ extrapolateLeft: "clamp",
581
+ extrapolateRight: "clamp",
582
+ easing: videoEasing.entrance
583
+ });
584
+ const scale = interpolate4(frame, [enterAt, enterAt + 12], [0.8, 1], {
585
+ extrapolateLeft: "clamp",
586
+ extrapolateRight: "clamp",
587
+ easing: videoEasing.emphasis
588
+ });
589
+ const methodColors = {
590
+ GET: "#61afef",
591
+ POST: "#98c379",
592
+ PUT: "#e5c07b",
593
+ PATCH: "#d19a66",
594
+ DELETE: "#e06c75"
595
+ };
596
+ return /* @__PURE__ */ jsxDEV5("div", {
597
+ style: {
598
+ opacity,
599
+ transform: `scale(${scale})`,
600
+ backgroundColor: methodColors[method] ?? "#61afef",
601
+ color: "#000",
602
+ padding: "8px 20px",
603
+ borderRadius: 8,
604
+ fontSize: 24,
605
+ fontWeight: 700,
606
+ fontFamily: "monospace",
607
+ letterSpacing: 1
608
+ },
609
+ children: method
610
+ }, undefined, false, undefined, this);
611
+ };
612
+ var OutputChip = ({ label, startFrame }) => {
613
+ const frame = useCurrentFrame5();
614
+ const opacity = interpolate4(frame, [startFrame, startFrame + 12], [0, 1], {
615
+ extrapolateLeft: "clamp",
616
+ extrapolateRight: "clamp"
617
+ });
618
+ const translateY = interpolate4(frame, [startFrame, startFrame + 15], [20, 0], {
619
+ extrapolateLeft: "clamp",
620
+ extrapolateRight: "clamp",
621
+ easing: videoEasing.emphasis
622
+ });
623
+ const scale = interpolate4(frame, [startFrame, startFrame + 15], [0.9, 1], {
624
+ extrapolateLeft: "clamp",
625
+ extrapolateRight: "clamp",
626
+ easing: videoEasing.emphasis
627
+ });
628
+ return /* @__PURE__ */ jsxDEV5("div", {
629
+ style: {
630
+ opacity,
631
+ transform: `translateY(${translateY}px) scale(${scale})`,
632
+ backgroundColor: "rgba(255,255,255,0.08)",
633
+ border: "1px solid rgba(255,255,255,0.15)",
634
+ color: "#ffffff",
635
+ padding: "16px 32px",
636
+ borderRadius: 12,
637
+ fontSize: 28,
638
+ fontWeight: 500
639
+ },
640
+ children: label
641
+ }, undefined, false, undefined, this);
642
+ };
643
+
644
+ // src/compositions/primitives/terminal.tsx
645
+ import { interpolate as interpolate5, useCurrentFrame as useCurrentFrame6, useVideoConfig as useVideoConfig6 } from "remotion";
646
+ import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
647
+ var LINE_TYPE_COLORS = {
648
+ command: "#c9d1d9",
649
+ output: "#8b949e",
650
+ error: "#f85149",
651
+ success: "#3fb950",
652
+ comment: "#6e7681"
653
+ };
654
+ var Terminal = ({
655
+ lines,
656
+ startAt = 0,
657
+ prompt = "$ ",
658
+ title = "Terminal",
659
+ backgroundColor = defaultVideoColors.terminalBackground,
660
+ typingSpeed = videoDurations.codeTypingPerChar
661
+ }) => {
662
+ const frame = useCurrentFrame6();
663
+ const { width } = useVideoConfig6();
664
+ const codeStyle = scaleTypography(videoTypography.code, width);
665
+ const lineTimings = [];
666
+ let currentFrame = startAt;
667
+ for (const line of lines) {
668
+ const delay = line.delay ?? 10;
669
+ const lineStart = currentFrame + delay;
670
+ if (line.type === "command") {
671
+ const typeDuration = line.text.length * typingSpeed;
672
+ lineTimings.push({
673
+ startFrame: lineStart,
674
+ endFrame: lineStart + typeDuration
675
+ });
676
+ currentFrame = lineStart + typeDuration;
677
+ } else {
678
+ lineTimings.push({ startFrame: lineStart, endFrame: lineStart + 5 });
679
+ currentFrame = lineStart + 5;
680
+ }
681
+ }
682
+ const opacity = interpolate5(frame, [startAt, startAt + 10], [0, 1], {
683
+ extrapolateLeft: "clamp",
684
+ extrapolateRight: "clamp",
685
+ easing: videoEasing.entrance
686
+ });
687
+ return /* @__PURE__ */ jsxDEV6("div", {
688
+ style: {
689
+ backgroundColor,
690
+ borderRadius: 16,
691
+ overflow: "hidden",
692
+ opacity,
693
+ boxShadow: "0 8px 32px rgba(0,0,0,0.3)"
694
+ },
695
+ children: [
696
+ /* @__PURE__ */ jsxDEV6("div", {
697
+ style: {
698
+ display: "flex",
699
+ alignItems: "center",
700
+ padding: "12px 20px",
701
+ backgroundColor: "rgba(255,255,255,0.05)",
702
+ gap: 8
703
+ },
704
+ children: [
705
+ /* @__PURE__ */ jsxDEV6("div", {
706
+ style: { display: "flex", gap: 8 },
707
+ children: [
708
+ /* @__PURE__ */ jsxDEV6("div", {
709
+ style: {
710
+ width: 12,
711
+ height: 12,
712
+ borderRadius: "50%",
713
+ backgroundColor: "#ff5f57"
714
+ }
715
+ }, undefined, false, undefined, this),
716
+ /* @__PURE__ */ jsxDEV6("div", {
717
+ style: {
718
+ width: 12,
719
+ height: 12,
720
+ borderRadius: "50%",
721
+ backgroundColor: "#febc2e"
722
+ }
723
+ }, undefined, false, undefined, this),
724
+ /* @__PURE__ */ jsxDEV6("div", {
725
+ style: {
726
+ width: 12,
727
+ height: 12,
728
+ borderRadius: "50%",
729
+ backgroundColor: "#28c840"
730
+ }
731
+ }, undefined, false, undefined, this)
732
+ ]
733
+ }, undefined, true, undefined, this),
734
+ /* @__PURE__ */ jsxDEV6("div", {
735
+ style: {
736
+ flex: 1,
737
+ textAlign: "center",
738
+ color: "#484f58",
739
+ fontSize: codeStyle.fontSize * 0.7,
740
+ fontFamily: "monospace"
741
+ },
742
+ children: title
743
+ }, undefined, false, undefined, this)
744
+ ]
745
+ }, undefined, true, undefined, this),
746
+ /* @__PURE__ */ jsxDEV6("div", {
747
+ style: { padding: "24px 32px", minHeight: 200 },
748
+ children: lines.map((line, i) => {
749
+ const timing = lineTimings[i];
750
+ if (!timing || frame < timing.startFrame)
751
+ return null;
752
+ const isCommand = line.type === "command";
753
+ const lineColor = LINE_TYPE_COLORS[line.type];
754
+ let visibleText = line.text;
755
+ if (isCommand) {
756
+ const typingProgress = interpolate5(frame, [timing.startFrame, timing.endFrame], [0, line.text.length], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
757
+ visibleText = line.text.slice(0, Math.floor(typingProgress));
758
+ }
759
+ const lineOpacity = isCommand ? 1 : interpolate5(frame, [timing.startFrame, timing.startFrame + 5], [0, 1], {
760
+ extrapolateLeft: "clamp",
761
+ extrapolateRight: "clamp"
762
+ });
763
+ const isTyping = isCommand && frame >= timing.startFrame && frame <= timing.endFrame;
764
+ const showCursor = isTyping && frame % 16 < 10;
765
+ return /* @__PURE__ */ jsxDEV6("div", {
766
+ style: {
767
+ fontFamily: "'SF Mono', 'Fira Code', 'JetBrains Mono', monospace",
768
+ fontSize: codeStyle.fontSize,
769
+ lineHeight: 1.8,
770
+ color: lineColor,
771
+ opacity: lineOpacity,
772
+ whiteSpace: "pre-wrap"
773
+ },
774
+ children: [
775
+ isCommand && /* @__PURE__ */ jsxDEV6("span", {
776
+ style: { color: "#3fb950" },
777
+ children: prompt
778
+ }, undefined, false, undefined, this),
779
+ line.type === "comment" && /* @__PURE__ */ jsxDEV6("span", {
780
+ style: { color: LINE_TYPE_COLORS.comment },
781
+ children: "# "
782
+ }, undefined, false, undefined, this),
783
+ visibleText,
784
+ showCursor && /* @__PURE__ */ jsxDEV6("span", {
785
+ style: {
786
+ backgroundColor: "#c9d1d9",
787
+ width: "2px",
788
+ display: "inline-block",
789
+ height: "1.2em",
790
+ verticalAlign: "text-bottom"
791
+ },
792
+ children: " "
793
+ }, undefined, false, undefined, this)
794
+ ]
795
+ }, `${i}-${line.text.slice(0, 20)}`, true, undefined, this);
796
+ })
797
+ }, undefined, false, undefined, this)
798
+ ]
799
+ }, undefined, true, undefined, this);
800
+ };
801
+
802
+ // src/compositions/social-clip.tsx
803
+ import {
804
+ AbsoluteFill as AbsoluteFill2,
805
+ Sequence as Sequence2,
806
+ interpolate as interpolate6,
807
+ useCurrentFrame as useCurrentFrame7,
808
+ useVideoConfig as useVideoConfig7
809
+ } from "remotion";
810
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
811
+ var SocialClip = ({
812
+ hook,
813
+ message,
814
+ points = [],
815
+ cta = "Learn more",
816
+ ctaUrl = "contractspec.dev",
817
+ accentColor
818
+ }) => {
819
+ const { durationInFrames, width, height } = useVideoConfig7();
820
+ const theme = defaultVideoTheme;
821
+ const accent = accentColor ?? theme.colors.accent;
822
+ const isPortrait = height > width;
823
+ const HOOK_DURATION = 75;
824
+ const MESSAGE_START = 60;
825
+ const POINTS_START = MESSAGE_START + 60;
826
+ const CTA_START = durationInFrames - 90;
827
+ return /* @__PURE__ */ jsxDEV7(AbsoluteFill2, {
828
+ children: [
829
+ /* @__PURE__ */ jsxDEV7(BrandFrame, {
830
+ variant: "gradient",
831
+ showBranding: true,
832
+ children: /* @__PURE__ */ jsxDEV7("div", {
833
+ style: {
834
+ flex: 1,
835
+ display: "flex",
836
+ flexDirection: "column",
837
+ justifyContent: "center",
838
+ alignItems: "center",
839
+ gap: isPortrait ? 48 : 32,
840
+ textAlign: "center",
841
+ padding: isPortrait ? "0 20px" : 0
842
+ },
843
+ children: [
844
+ /* @__PURE__ */ jsxDEV7(Sequence2, {
845
+ from: 0,
846
+ durationInFrames: HOOK_DURATION + 30,
847
+ children: /* @__PURE__ */ jsxDEV7("div", {
848
+ style: { width: "100%" },
849
+ children: /* @__PURE__ */ jsxDEV7(AnimatedText, {
850
+ text: hook,
851
+ variant: "title",
852
+ enterAt: 5,
853
+ exitAt: HOOK_DURATION,
854
+ color: "#ffffff",
855
+ align: "center"
856
+ }, undefined, false, undefined, this)
857
+ }, undefined, false, undefined, this)
858
+ }, undefined, false, undefined, this),
859
+ /* @__PURE__ */ jsxDEV7(Sequence2, {
860
+ from: MESSAGE_START,
861
+ children: /* @__PURE__ */ jsxDEV7("div", {
862
+ style: { width: "100%" },
863
+ children: /* @__PURE__ */ jsxDEV7(AnimatedText, {
864
+ text: message,
865
+ variant: isPortrait ? "subheading" : "heading",
866
+ enterAt: 0,
867
+ color: "#ffffff",
868
+ align: "center"
869
+ }, undefined, false, undefined, this)
870
+ }, undefined, false, undefined, this)
871
+ }, undefined, false, undefined, this),
872
+ points.length > 0 && /* @__PURE__ */ jsxDEV7(Sequence2, {
873
+ from: POINTS_START,
874
+ children: /* @__PURE__ */ jsxDEV7("div", {
875
+ style: {
876
+ display: "flex",
877
+ flexDirection: "column",
878
+ gap: 16,
879
+ alignItems: isPortrait ? "flex-start" : "center",
880
+ width: "100%",
881
+ maxWidth: isPortrait ? "100%" : "80%",
882
+ marginTop: 16
883
+ },
884
+ children: points.map((point, i) => /* @__PURE__ */ jsxDEV7(PointItem, {
885
+ text: point,
886
+ index: i,
887
+ startFrame: i * 15,
888
+ accent
889
+ }, point, false, undefined, this))
890
+ }, undefined, false, undefined, this)
891
+ }, undefined, false, undefined, this),
892
+ /* @__PURE__ */ jsxDEV7(Sequence2, {
893
+ from: CTA_START,
894
+ children: /* @__PURE__ */ jsxDEV7(CTABlock, {
895
+ cta,
896
+ url: ctaUrl,
897
+ accent
898
+ }, undefined, false, undefined, this)
899
+ }, undefined, false, undefined, this)
900
+ ]
901
+ }, undefined, true, undefined, this)
902
+ }, undefined, false, undefined, this),
903
+ /* @__PURE__ */ jsxDEV7(ProgressBar, {
904
+ color: accent
905
+ }, undefined, false, undefined, this)
906
+ ]
907
+ }, undefined, true, undefined, this);
908
+ };
909
+ var PointItem = ({ text, startFrame, accent }) => {
910
+ const frame = useCurrentFrame7();
911
+ const opacity = interpolate6(frame, [startFrame, startFrame + 12], [0, 1], {
912
+ extrapolateLeft: "clamp",
913
+ extrapolateRight: "clamp"
914
+ });
915
+ const translateX = interpolate6(frame, [startFrame, startFrame + 15], [-30, 0], {
916
+ extrapolateLeft: "clamp",
917
+ extrapolateRight: "clamp",
918
+ easing: videoEasing.entrance
919
+ });
920
+ return /* @__PURE__ */ jsxDEV7("div", {
921
+ style: {
922
+ opacity,
923
+ transform: `translateX(${translateX}px)`,
924
+ display: "flex",
925
+ alignItems: "center",
926
+ gap: 16,
927
+ fontSize: 28,
928
+ color: "#ffffff"
929
+ },
930
+ children: [
931
+ /* @__PURE__ */ jsxDEV7("div", {
932
+ style: {
933
+ width: 8,
934
+ height: 8,
935
+ borderRadius: "50%",
936
+ backgroundColor: accent,
937
+ flexShrink: 0
938
+ }
939
+ }, undefined, false, undefined, this),
940
+ text
941
+ ]
942
+ }, undefined, true, undefined, this);
943
+ };
944
+ var CTABlock = ({ cta, url, accent }) => {
945
+ const frame = useCurrentFrame7();
946
+ const opacity = interpolate6(frame, [0, 15], [0, 1], {
947
+ extrapolateLeft: "clamp",
948
+ extrapolateRight: "clamp"
949
+ });
950
+ const scale = interpolate6(frame, [0, 18], [0.9, 1], {
951
+ extrapolateLeft: "clamp",
952
+ extrapolateRight: "clamp",
953
+ easing: videoEasing.emphasis
954
+ });
955
+ return /* @__PURE__ */ jsxDEV7("div", {
956
+ style: {
957
+ opacity,
958
+ transform: `scale(${scale})`,
959
+ display: "flex",
960
+ flexDirection: "column",
961
+ alignItems: "center",
962
+ gap: 12,
963
+ marginTop: 24
964
+ },
965
+ children: [
966
+ /* @__PURE__ */ jsxDEV7("div", {
967
+ style: {
968
+ backgroundColor: accent,
969
+ color: "#ffffff",
970
+ padding: "16px 48px",
971
+ borderRadius: 12,
972
+ fontSize: 28,
973
+ fontWeight: 600
974
+ },
975
+ children: cta
976
+ }, undefined, false, undefined, this),
977
+ /* @__PURE__ */ jsxDEV7("div", {
978
+ style: { color: "rgba(255,255,255,0.5)", fontSize: 20 },
979
+ children: url
980
+ }, undefined, false, undefined, this)
981
+ ]
982
+ }, undefined, true, undefined, this);
983
+ };
984
+
985
+ // src/compositions/terminal-demo.tsx
986
+ import { AbsoluteFill as AbsoluteFill3, Sequence as Sequence3, useVideoConfig as useVideoConfig8 } from "remotion";
987
+ import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
988
+ var TerminalDemo = ({
989
+ title,
990
+ subtitle,
991
+ lines,
992
+ terminalTitle = "Terminal",
993
+ prompt = "$ ",
994
+ summary
995
+ }) => {
996
+ const { durationInFrames } = useVideoConfig8();
997
+ const theme = defaultVideoTheme;
998
+ const TERMINAL_START = 40;
999
+ const SUMMARY_START = durationInFrames - 90;
1000
+ return /* @__PURE__ */ jsxDEV8(AbsoluteFill3, {
1001
+ children: [
1002
+ /* @__PURE__ */ jsxDEV8(BrandFrame, {
1003
+ variant: "dark",
1004
+ showBranding: true,
1005
+ children: /* @__PURE__ */ jsxDEV8("div", {
1006
+ style: {
1007
+ flex: 1,
1008
+ display: "flex",
1009
+ flexDirection: "column",
1010
+ gap: 24
1011
+ },
1012
+ children: [
1013
+ /* @__PURE__ */ jsxDEV8("div", {
1014
+ children: [
1015
+ /* @__PURE__ */ jsxDEV8(AnimatedText, {
1016
+ text: title,
1017
+ variant: "heading",
1018
+ enterAt: 5,
1019
+ color: "#ffffff"
1020
+ }, undefined, false, undefined, this),
1021
+ subtitle && /* @__PURE__ */ jsxDEV8("div", {
1022
+ style: { marginTop: 8 },
1023
+ children: /* @__PURE__ */ jsxDEV8(AnimatedText, {
1024
+ text: subtitle,
1025
+ variant: "body",
1026
+ enterAt: 15,
1027
+ color: theme.colors.mutedForeground
1028
+ }, undefined, false, undefined, this)
1029
+ }, undefined, false, undefined, this)
1030
+ ]
1031
+ }, undefined, true, undefined, this),
1032
+ /* @__PURE__ */ jsxDEV8(Sequence3, {
1033
+ from: TERMINAL_START,
1034
+ children: /* @__PURE__ */ jsxDEV8("div", {
1035
+ style: { flex: 1 },
1036
+ children: /* @__PURE__ */ jsxDEV8(Terminal, {
1037
+ lines,
1038
+ startAt: 0,
1039
+ prompt,
1040
+ title: terminalTitle
1041
+ }, undefined, false, undefined, this)
1042
+ }, undefined, false, undefined, this)
1043
+ }, undefined, false, undefined, this),
1044
+ summary && /* @__PURE__ */ jsxDEV8(Sequence3, {
1045
+ from: SUMMARY_START,
1046
+ children: /* @__PURE__ */ jsxDEV8("div", {
1047
+ style: {
1048
+ marginTop: "auto",
1049
+ paddingTop: 24
1050
+ },
1051
+ children: /* @__PURE__ */ jsxDEV8(AnimatedText, {
1052
+ text: summary,
1053
+ variant: "subheading",
1054
+ enterAt: 0,
1055
+ color: theme.colors.accent,
1056
+ align: "center"
1057
+ }, undefined, false, undefined, this)
1058
+ }, undefined, false, undefined, this)
1059
+ }, undefined, false, undefined, this)
1060
+ ]
1061
+ }, undefined, true, undefined, this)
1062
+ }, undefined, false, undefined, this),
1063
+ /* @__PURE__ */ jsxDEV8(ProgressBar, {}, undefined, false, undefined, this)
1064
+ ]
1065
+ }, undefined, true, undefined, this);
1066
+ };
1067
+
1068
+ // src/player/demo-player.tsx
1069
+ import { useMemo } from "react";
1070
+ import { Player } from "@remotion/player";
1071
+ import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
1072
+ var COMPOSITIONS = {
1073
+ ApiOverview: {
1074
+ component: ApiOverview,
1075
+ durationInFrames: 450,
1076
+ fps: 30,
1077
+ width: 1920,
1078
+ height: 1080
1079
+ },
1080
+ SocialClip: {
1081
+ component: SocialClip,
1082
+ durationInFrames: 300,
1083
+ fps: 30,
1084
+ width: 1920,
1085
+ height: 1080
1086
+ },
1087
+ TerminalDemo: {
1088
+ component: TerminalDemo,
1089
+ durationInFrames: 600,
1090
+ fps: 30,
1091
+ width: 1920,
1092
+ height: 1080
1093
+ }
1094
+ };
1095
+ function DemoPlayer({
1096
+ compositionId,
1097
+ inputProps,
1098
+ controls = true,
1099
+ autoPlay = false,
1100
+ loop = false,
1101
+ width = "100%",
1102
+ height,
1103
+ style,
1104
+ className,
1105
+ clickToPlay = true,
1106
+ doubleClickToFullscreen = true
1107
+ }) {
1108
+ const composition = COMPOSITIONS[compositionId];
1109
+ const playerStyle = useMemo(() => ({
1110
+ width,
1111
+ height: height ?? "auto",
1112
+ borderRadius: 12,
1113
+ overflow: "hidden",
1114
+ ...style
1115
+ }), [width, height, style]);
1116
+ return /* @__PURE__ */ jsxDEV9("div", {
1117
+ className,
1118
+ children: /* @__PURE__ */ jsxDEV9(Player, {
1119
+ component: composition.component,
1120
+ durationInFrames: composition.durationInFrames,
1121
+ fps: composition.fps,
1122
+ compositionWidth: composition.width,
1123
+ compositionHeight: composition.height,
1124
+ inputProps,
1125
+ controls,
1126
+ autoPlay,
1127
+ loop,
1128
+ style: playerStyle,
1129
+ clickToPlay,
1130
+ doubleClickToFullscreen
1131
+ }, undefined, false, undefined, this)
1132
+ }, undefined, false, undefined, this);
1133
+ }
1134
+ export {
1135
+ DemoPlayer
1136
+ };