@contractspec/lib.video-gen 2.7.16 → 2.7.18

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 (127) hide show
  1. package/dist/browser/compositions/api-overview.js +1 -645
  2. package/dist/browser/compositions/index.js +1 -1133
  3. package/dist/browser/compositions/primitives/animated-text.js +1 -144
  4. package/dist/browser/compositions/primitives/brand-frame.js +1 -181
  5. package/dist/browser/compositions/primitives/code-block.js +1 -226
  6. package/dist/browser/compositions/primitives/index.js +1 -656
  7. package/dist/browser/compositions/primitives/progress-bar.js +1 -59
  8. package/dist/browser/compositions/primitives/terminal.js +1 -265
  9. package/dist/browser/compositions/primitives/transition.js +1 -98
  10. package/dist/browser/compositions/social-clip.js +1 -500
  11. package/dist/browser/compositions/terminal-demo.js +1 -558
  12. package/dist/browser/design/index.js +1 -155
  13. package/dist/browser/design/layouts.js +1 -50
  14. package/dist/browser/design/motion.js +1 -43
  15. package/dist/browser/design/tokens.js +1 -28
  16. package/dist/browser/design/typography.js +1 -61
  17. package/dist/browser/docs/compositions.docblock.js +1 -182
  18. package/dist/browser/docs/design.docblock.js +2 -17
  19. package/dist/browser/docs/generators.docblock.js +2 -24
  20. package/dist/browser/docs/rendering.docblock.js +2 -24
  21. package/dist/browser/docs/video-gen.docblock.js +2 -17
  22. package/dist/browser/generators/index.js +7 -769
  23. package/dist/browser/generators/scene-planner.js +7 -651
  24. package/dist/browser/generators/script-generator.js +7 -599
  25. package/dist/browser/generators/video-generator.js +7 -768
  26. package/dist/browser/i18n/catalogs/en.js +3 -135
  27. package/dist/browser/i18n/catalogs/es.js +3 -135
  28. package/dist/browser/i18n/catalogs/fr.js +3 -135
  29. package/dist/browser/i18n/catalogs/index.js +7 -387
  30. package/dist/browser/i18n/index.js +7 -459
  31. package/dist/browser/i18n/keys.js +1 -54
  32. package/dist/browser/i18n/locale.js +1 -21
  33. package/dist/browser/i18n/messages.js +7 -399
  34. package/dist/browser/index.js +7 -1903
  35. package/dist/browser/player/demo-player.js +1 -1136
  36. package/dist/browser/player/index.js +1 -1136
  37. package/dist/browser/remotion/Root.js +2 -1172
  38. package/dist/browser/remotion/index.js +2 -1173
  39. package/dist/browser/renderers/config.js +1 -40
  40. package/dist/browser/renderers/index.js +1 -160
  41. package/dist/browser/renderers/local.js +1 -156
  42. package/dist/browser/types.js +1 -13
  43. package/dist/compositions/api-overview.js +1 -639
  44. package/dist/compositions/index.js +1 -1127
  45. package/dist/compositions/primitives/animated-text.js +1 -138
  46. package/dist/compositions/primitives/brand-frame.js +1 -175
  47. package/dist/compositions/primitives/code-block.js +1 -220
  48. package/dist/compositions/primitives/index.js +1 -650
  49. package/dist/compositions/primitives/progress-bar.js +1 -53
  50. package/dist/compositions/primitives/terminal.js +1 -259
  51. package/dist/compositions/primitives/transition.js +1 -92
  52. package/dist/compositions/social-clip.js +1 -494
  53. package/dist/compositions/terminal-demo.js +1 -552
  54. package/dist/design/index.js +1 -149
  55. package/dist/design/layouts.js +1 -44
  56. package/dist/design/motion.js +1 -37
  57. package/dist/design/tokens.js +1 -22
  58. package/dist/design/typography.js +1 -55
  59. package/dist/docs/compositions.docblock.js +1 -182
  60. package/dist/docs/design.docblock.js +2 -17
  61. package/dist/docs/generators.docblock.js +2 -24
  62. package/dist/docs/rendering.docblock.js +2 -24
  63. package/dist/docs/video-gen.docblock.js +2 -17
  64. package/dist/generators/index.js +7 -763
  65. package/dist/generators/scene-planner.js +7 -645
  66. package/dist/generators/script-generator.js +7 -593
  67. package/dist/generators/video-generator.js +7 -762
  68. package/dist/i18n/catalogs/en.js +3 -129
  69. package/dist/i18n/catalogs/es.js +3 -129
  70. package/dist/i18n/catalogs/fr.js +3 -129
  71. package/dist/i18n/catalogs/index.js +7 -381
  72. package/dist/i18n/index.js +7 -453
  73. package/dist/i18n/keys.js +1 -48
  74. package/dist/i18n/locale.js +1 -15
  75. package/dist/i18n/messages.js +7 -393
  76. package/dist/index.js +7 -1897
  77. package/dist/node/compositions/api-overview.js +1 -640
  78. package/dist/node/compositions/index.js +1 -1128
  79. package/dist/node/compositions/primitives/animated-text.js +1 -139
  80. package/dist/node/compositions/primitives/brand-frame.js +1 -176
  81. package/dist/node/compositions/primitives/code-block.js +1 -221
  82. package/dist/node/compositions/primitives/index.js +1 -651
  83. package/dist/node/compositions/primitives/progress-bar.js +1 -54
  84. package/dist/node/compositions/primitives/terminal.js +1 -260
  85. package/dist/node/compositions/primitives/transition.js +1 -93
  86. package/dist/node/compositions/social-clip.js +1 -495
  87. package/dist/node/compositions/terminal-demo.js +1 -553
  88. package/dist/node/design/index.js +1 -150
  89. package/dist/node/design/layouts.js +1 -45
  90. package/dist/node/design/motion.js +1 -38
  91. package/dist/node/design/tokens.js +1 -23
  92. package/dist/node/design/typography.js +1 -56
  93. package/dist/node/docs/compositions.docblock.js +1 -182
  94. package/dist/node/docs/design.docblock.js +2 -17
  95. package/dist/node/docs/generators.docblock.js +2 -24
  96. package/dist/node/docs/rendering.docblock.js +2 -24
  97. package/dist/node/docs/video-gen.docblock.js +2 -17
  98. package/dist/node/generators/index.js +7 -764
  99. package/dist/node/generators/scene-planner.js +7 -646
  100. package/dist/node/generators/script-generator.js +7 -594
  101. package/dist/node/generators/video-generator.js +7 -763
  102. package/dist/node/i18n/catalogs/en.js +3 -130
  103. package/dist/node/i18n/catalogs/es.js +3 -130
  104. package/dist/node/i18n/catalogs/fr.js +3 -130
  105. package/dist/node/i18n/catalogs/index.js +7 -382
  106. package/dist/node/i18n/index.js +7 -454
  107. package/dist/node/i18n/keys.js +1 -49
  108. package/dist/node/i18n/locale.js +1 -16
  109. package/dist/node/i18n/messages.js +7 -394
  110. package/dist/node/index.js +7 -1898
  111. package/dist/node/player/demo-player.js +1 -1131
  112. package/dist/node/player/index.js +1 -1131
  113. package/dist/node/remotion/Root.js +2 -1167
  114. package/dist/node/remotion/index.js +2 -1168
  115. package/dist/node/renderers/config.js +1 -35
  116. package/dist/node/renderers/index.js +1 -155
  117. package/dist/node/renderers/local.js +1 -151
  118. package/dist/node/types.js +1 -8
  119. package/dist/player/demo-player.js +1 -1130
  120. package/dist/player/index.js +1 -1130
  121. package/dist/remotion/Root.js +2 -1166
  122. package/dist/remotion/index.js +2 -1167
  123. package/dist/renderers/config.js +1 -34
  124. package/dist/renderers/index.js +1 -154
  125. package/dist/renderers/local.js +1 -150
  126. package/dist/types.js +1 -7
  127. package/package.json +18 -18
@@ -1,1078 +1,4 @@
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/typography.ts
57
- var videoTypography = {
58
- title: {
59
- fontSize: 72,
60
- lineHeight: 1.1,
61
- fontWeight: 700,
62
- letterSpacing: -1
63
- },
64
- heading: {
65
- fontSize: 56,
66
- lineHeight: 1.2,
67
- fontWeight: 600,
68
- letterSpacing: -0.5
69
- },
70
- subheading: {
71
- fontSize: 40,
72
- lineHeight: 1.25,
73
- fontWeight: 500
74
- },
75
- body: {
76
- fontSize: 32,
77
- lineHeight: 1.5,
78
- fontWeight: 400
79
- },
80
- code: {
81
- fontSize: 28,
82
- lineHeight: 1.6,
83
- fontWeight: 400
84
- },
85
- caption: {
86
- fontSize: 24,
87
- lineHeight: 1.4,
88
- fontWeight: 400
89
- },
90
- label: {
91
- fontSize: 20,
92
- lineHeight: 1.3,
93
- fontWeight: 600,
94
- letterSpacing: 1
95
- }
96
- };
97
- function scaleTypography(style, targetWidth) {
98
- const scale = targetWidth / 1920;
99
- return {
100
- ...style,
101
- fontSize: Math.round(style.fontSize * scale),
102
- letterSpacing: style.letterSpacing ? Math.round(style.letterSpacing * scale * 10) / 10 : undefined
103
- };
104
- }
105
-
106
- // src/compositions/primitives/animated-text.tsx
107
- import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
108
- import { jsxDEV } from "react/jsx-dev-runtime";
109
- var AnimatedText = ({
110
- text,
111
- variant = "body",
112
- style: styleOverride,
113
- enterAt = 0,
114
- exitAt,
115
- color = "#ffffff",
116
- align = "left"
117
- }) => {
118
- const frame = useCurrentFrame();
119
- const { width } = useVideoConfig();
120
- const baseStyle = videoTypography[variant];
121
- const scaled = scaleTypography(baseStyle, width);
122
- const finalStyle = { ...scaled, ...styleOverride };
123
- const enterProgress = interpolate(frame, [enterAt, enterAt + videoDurations.textEntrance], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
124
- const enterOpacity = interpolate(enterProgress, [0, 1], [0, 1], {
125
- easing: videoEasing.entrance
126
- });
127
- const enterTranslateY = interpolate(enterProgress, [0, 1], [30, 0], {
128
- easing: videoEasing.entrance
129
- });
130
- let exitOpacity = 1;
131
- let exitTranslateY = 0;
132
- if (exitAt !== undefined) {
133
- const exitProgress = interpolate(frame, [exitAt, exitAt + videoDurations.textExit], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
134
- exitOpacity = interpolate(exitProgress, [0, 1], [1, 0], {
135
- easing: videoEasing.exit
136
- });
137
- exitTranslateY = interpolate(exitProgress, [0, 1], [0, -20], {
138
- easing: videoEasing.exit
139
- });
140
- }
141
- const opacity = enterOpacity * exitOpacity;
142
- const translateY = enterTranslateY + exitTranslateY;
143
- return /* @__PURE__ */ jsxDEV("div", {
144
- style: {
145
- fontSize: finalStyle.fontSize,
146
- lineHeight: finalStyle.lineHeight,
147
- fontWeight: finalStyle.fontWeight,
148
- letterSpacing: finalStyle.letterSpacing,
149
- color,
150
- textAlign: align,
151
- opacity,
152
- transform: `translateY(${translateY}px)`,
153
- willChange: "opacity, transform"
154
- },
155
- children: text
156
- }, undefined, false, undefined, this);
157
- };
158
-
159
- // src/design/layouts.ts
160
- import { VIDEO_FORMATS } from "@contractspec/lib.contracts-integrations/integrations/providers/video";
161
- var DEFAULT_FPS = 30;
162
- var videoSafeZone = {
163
- horizontal: 120,
164
- vertical: 80,
165
- contentWidth: 1680,
166
- contentHeight: 920
167
- };
168
- function scaleSafeZone(format) {
169
- const scaleX = format.width / 1920;
170
- const scaleY = format.height / 1080;
171
- return {
172
- horizontal: Math.round(videoSafeZone.horizontal * scaleX),
173
- vertical: Math.round(videoSafeZone.vertical * scaleY),
174
- contentWidth: Math.round(videoSafeZone.contentWidth * scaleX),
175
- contentHeight: Math.round(videoSafeZone.contentHeight * scaleY)
176
- };
177
- }
178
- var videoPositions = {
179
- center: { x: 960, y: 540 },
180
- topLeft: { x: 120, y: 80 },
181
- topRight: { x: 1800, y: 80 },
182
- bottomLeft: { x: 120, y: 1000 },
183
- bottomRight: { x: 1800, y: 1000 },
184
- bottomCenter: { x: 960, y: 960 }
185
- };
186
- function getAllFormatVariants() {
187
- return [
188
- VIDEO_FORMATS.landscape,
189
- VIDEO_FORMATS.square,
190
- VIDEO_FORMATS.portrait
191
- ];
192
- }
193
-
194
- // src/compositions/primitives/brand-frame.tsx
195
- import { interpolate as interpolate2, useCurrentFrame as useCurrentFrame2, useVideoConfig as useVideoConfig2 } from "remotion";
196
- import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
197
- var BrandFrame = ({
198
- styleOverrides,
199
- showBranding = true,
200
- animateEntrance = true,
201
- variant = "gradient",
202
- children
203
- }) => {
204
- const frame = useCurrentFrame2();
205
- const { width, height } = useVideoConfig2();
206
- const theme = defaultVideoTheme;
207
- const safeZone = scaleSafeZone({ type: "custom", width, height });
208
- const primaryColor = styleOverrides?.primaryColor ?? theme.colors.primary;
209
- const _accentColor = styleOverrides?.accentColor ?? theme.colors.accent;
210
- const isDark = styleOverrides?.darkMode ?? true;
211
- let background;
212
- switch (variant) {
213
- case "solid":
214
- background = isDark ? "#0a0a0a" : theme.colors.background;
215
- break;
216
- case "gradient":
217
- background = isDark ? `linear-gradient(135deg, #0a0a14 0%, #0f172a 50%, #0a0a14 100%)` : `linear-gradient(135deg, ${theme.colors.background} 0%, ${theme.colors.muted} 100%)`;
218
- break;
219
- case "dark":
220
- background = "#000000";
221
- break;
222
- }
223
- const entranceOpacity = animateEntrance ? interpolate2(frame, [0, 15], [0, 1], {
224
- extrapolateLeft: "clamp",
225
- extrapolateRight: "clamp",
226
- easing: videoEasing.entrance
227
- }) : 1;
228
- const brandOpacity = showBranding ? interpolate2(frame, [videoDurations.brandReveal, videoDurations.brandReveal + 15], [0, 0.3], {
229
- extrapolateLeft: "clamp",
230
- extrapolateRight: "clamp"
231
- }) : 0;
232
- return /* @__PURE__ */ jsxDEV2("div", {
233
- style: {
234
- width,
235
- height,
236
- background,
237
- position: "relative",
238
- overflow: "hidden",
239
- opacity: entranceOpacity
240
- },
241
- children: [
242
- variant === "gradient" && /* @__PURE__ */ jsxDEV2("div", {
243
- style: {
244
- position: "absolute",
245
- top: "-20%",
246
- right: "-10%",
247
- width: "50%",
248
- height: "50%",
249
- background: `radial-gradient(circle, ${primaryColor}15 0%, transparent 70%)`,
250
- borderRadius: "50%",
251
- pointerEvents: "none"
252
- }
253
- }, undefined, false, undefined, this),
254
- /* @__PURE__ */ jsxDEV2("div", {
255
- style: {
256
- position: "absolute",
257
- left: safeZone.horizontal,
258
- top: safeZone.vertical,
259
- width: safeZone.contentWidth,
260
- height: safeZone.contentHeight,
261
- display: "flex",
262
- flexDirection: "column"
263
- },
264
- children
265
- }, undefined, false, undefined, this),
266
- showBranding && /* @__PURE__ */ jsxDEV2("div", {
267
- style: {
268
- position: "absolute",
269
- bottom: safeZone.vertical / 2,
270
- right: safeZone.horizontal,
271
- opacity: brandOpacity,
272
- color: isDark ? "#ffffff" : "#000000",
273
- fontSize: Math.round(16 * (width / 1920)),
274
- fontWeight: 500,
275
- letterSpacing: 1
276
- },
277
- children: "ContractSpec"
278
- }, undefined, false, undefined, this)
279
- ]
280
- }, undefined, true, 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
- interpolate as interpolate4,
439
- Sequence,
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
- interpolate as interpolate6,
806
- Sequence as Sequence2,
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/remotion/Root.tsx
1069
- import { Composition } from "remotion";
1070
- import { jsxDEV as jsxDEV9, Fragment } from "react/jsx-dev-runtime";
1071
- var defaultApiOverviewProps = {
1072
- specName: "CreateUser",
1073
- method: "POST",
1074
- endpoint: "/api/users",
1075
- specCode: `export const createUser = defineCommand({
1
+ var xH=((J)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(J,{get:(H,K)=>(typeof require<"u"?require:H)[K]}):J)(function(J){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+J+'" is not supported')});import{Easing as w}from"remotion";var M={entrance:w.out(w.exp),exit:w.in(w.exp),emphasis:w.out(w.back(1.4)),linear:w.linear,gentle:w.bezier(0.25,0.1,0.25,1),spring:w.out(w.back(1.7))},V={sceneTransition:20,textEntrance:15,textExit:12,codeTypingPerChar:2,sectionPause:30,emphasisPause:15,brandReveal:25,minScene:60,shortScene:60,mediumScene:120,longScene:240},dH={fade:{type:"fade",durationInFrames:20},slideLeft:{type:"slide-left",durationInFrames:20},slideRight:{type:"slide-right",durationInFrames:20},wipe:{type:"wipe",durationInFrames:15},none:{type:"none",durationInFrames:0}};import{defaultTokens as C}from"@contractspec/lib.design-system";var h={canvasBackground:C.colors.background,codeBackground:"#1e1e2e",terminalBackground:"#0d1117",terminalForeground:"#c9d1d9",highlight:C.colors.accent,gradientStart:C.colors.primary,gradientEnd:C.colors.accent},P={...C,video:h};var b={title:{fontSize:72,lineHeight:1.1,fontWeight:700,letterSpacing:-1},heading:{fontSize:56,lineHeight:1.2,fontWeight:600,letterSpacing:-0.5},subheading:{fontSize:40,lineHeight:1.25,fontWeight:500},body:{fontSize:32,lineHeight:1.5,fontWeight:400},code:{fontSize:28,lineHeight:1.6,fontWeight:400},caption:{fontSize:24,lineHeight:1.4,fontWeight:400},label:{fontSize:20,lineHeight:1.3,fontWeight:600,letterSpacing:1}};function F(J,H){let K=H/1920;return{...J,fontSize:Math.round(J.fontSize*K),letterSpacing:J.letterSpacing?Math.round(J.letterSpacing*K*10)/10:void 0}}import{interpolate as S,useCurrentFrame as RH,useVideoConfig as YH}from"remotion";import{jsx as ZH}from"react/jsx-runtime";var B=({text:J,variant:H="body",style:K,enterAt:Q=0,exitAt:z,color:$="#ffffff",align:W="left"})=>{let X=RH(),{width:q}=YH(),L=b[H],Y={...F(L,q),...K},U=S(X,[Q,Q+V.textEntrance],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}),N=S(U,[0,1],[0,1],{easing:M.entrance}),G=S(U,[0,1],[30,0],{easing:M.entrance}),Z=1,k=0;if(z!==void 0){let n=S(X,[z,z+V.textExit],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"});Z=S(n,[0,1],[1,0],{easing:M.exit}),k=S(n,[0,1],[0,-20],{easing:M.exit})}let E=N*Z,o=G+k;return ZH("div",{style:{fontSize:Y.fontSize,lineHeight:Y.lineHeight,fontWeight:Y.fontWeight,letterSpacing:Y.letterSpacing,color:$,textAlign:W,opacity:E,transform:`translateY(${o}px)`,willChange:"opacity, transform"},children:J})};import{VIDEO_FORMATS as s}from"@contractspec/lib.contracts-integrations/integrations/providers/video";var HJ=30,u={horizontal:120,vertical:80,contentWidth:1680,contentHeight:920};function HH(J){let H=J.width/1920,K=J.height/1080;return{horizontal:Math.round(u.horizontal*H),vertical:Math.round(u.vertical*K),contentWidth:Math.round(u.contentWidth*H),contentHeight:Math.round(u.contentHeight*K)}}var JJ={center:{x:960,y:540},topLeft:{x:120,y:80},topRight:{x:1800,y:80},bottomLeft:{x:120,y:1000},bottomRight:{x:1800,y:1000},bottomCenter:{x:960,y:960}};function KJ(){return[s.landscape,s.square,s.portrait]}import{interpolate as JH,useCurrentFrame as _H,useVideoConfig as IH}from"remotion";import{jsx as r,jsxs as BH}from"react/jsx-runtime";var T=({styleOverrides:J,showBranding:H=!0,animateEntrance:K=!0,variant:Q="gradient",children:z})=>{let $=_H(),{width:W,height:X}=IH(),q=P,L=HH({type:"custom",width:W,height:X}),R=J?.primaryColor??q.colors.primary,Y=J?.accentColor??q.colors.accent,U=J?.darkMode??!0,N;switch(Q){case"solid":N=U?"#0a0a0a":q.colors.background;break;case"gradient":N=U?"linear-gradient(135deg, #0a0a14 0%, #0f172a 50%, #0a0a14 100%)":`linear-gradient(135deg, ${q.colors.background} 0%, ${q.colors.muted} 100%)`;break;case"dark":N="#000000";break}let G=K?JH($,[0,15],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.entrance}):1,Z=H?JH($,[V.brandReveal,V.brandReveal+15],[0,0.3],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}):0;return BH("div",{style:{width:W,height:X,background:N,position:"relative",overflow:"hidden",opacity:G},children:[Q==="gradient"&&r("div",{style:{position:"absolute",top:"-20%",right:"-10%",width:"50%",height:"50%",background:`radial-gradient(circle, ${R}15 0%, transparent 70%)`,borderRadius:"50%",pointerEvents:"none"}}),r("div",{style:{position:"absolute",left:L.horizontal,top:L.vertical,width:L.contentWidth,height:L.contentHeight,display:"flex",flexDirection:"column"},children:z}),H&&r("div",{style:{position:"absolute",bottom:L.vertical/2,right:L.horizontal,opacity:Z,color:U?"#ffffff":"#000000",fontSize:Math.round(16*(W/1920)),fontWeight:500,letterSpacing:1},children:"ContractSpec"})]})};import{interpolate as KH,useCurrentFrame as DH,useVideoConfig as wH}from"remotion";import{jsx as A,jsxs as x}from"react/jsx-runtime";var QH=({code:J,language:H="typescript",startAt:K=0,typeAnimation:Q=!0,backgroundColor:z=h.codeBackground,textColor:$="#abb2bf",filename:W})=>{let X=DH(),{width:q}=wH(),L=F(b.code,q),R=J.length,Y=R*V.codeTypingPerChar,U=Q?Math.floor(KH(X,[K,K+Y],[0,R],{extrapolateLeft:"clamp",extrapolateRight:"clamp"})):R,N=J.slice(0,U),G=KH(X,[K,K+10],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.entrance}),Z=Q&&U<R&&X%16<10;return x("div",{style:{backgroundColor:z,borderRadius:16,padding:0,opacity:G,overflow:"hidden",boxShadow:"0 8px 32px rgba(0,0,0,0.3)"},children:[x("div",{style:{display:"flex",alignItems:"center",padding:"12px 20px",backgroundColor:"rgba(0,0,0,0.2)",gap:8},children:[x("div",{style:{display:"flex",gap:8},children:[A("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#ff5f57"}}),A("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#febc2e"}}),A("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#28c840"}})]}),A("div",{style:{flex:1,textAlign:"center",color:"#666",fontSize:L.fontSize*0.7,fontFamily:"monospace"},children:W??H})]}),A("div",{style:{padding:"24px 32px"},children:x("pre",{style:{margin:0,fontFamily:"'SF Mono', 'Fira Code', 'JetBrains Mono', monospace",fontSize:L.fontSize,lineHeight:L.lineHeight,color:$,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[N,Z&&A("span",{style:{backgroundColor:$,width:"2px",display:"inline-block",height:"1.2em",verticalAlign:"text-bottom"},children:" "})]})})]})};import{useCurrentFrame as VH,useVideoConfig as PH}from"remotion";import{jsx as $H}from"react/jsx-runtime";var v=({height:J=4,color:H=P.colors.primary,backgroundColor:K="rgba(255,255,255,0.1)",position:Q="bottom"})=>{let z=VH(),{durationInFrames:$,width:W}=PH(),X=z/$;return $H("div",{style:{position:"absolute",[Q]:0,left:0,width:W,height:J,backgroundColor:K,zIndex:100},children:$H("div",{style:{width:`${X*100}%`,height:"100%",backgroundColor:H,transition:"none"}})})};import{AbsoluteFill as OH,interpolate as f,Sequence as a,useCurrentFrame as zH,useVideoConfig as kH}from"remotion";import{jsx as _,jsxs as y}from"react/jsx-runtime";var GH=({specName:J,method:H="POST",endpoint:K="/api/users",specCode:Q,generatedOutputs:z=["REST Endpoint","GraphQL Mutation","Prisma Model","TypeScript SDK","MCP Tool","OpenAPI Spec"],tagline:$="One spec. Every surface."})=>{let{durationInFrames:W}=kH(),X=P,q=60,L=45,R=210,Y=180,U=W-90;return y(OH,{children:[y(T,{variant:"gradient",showBranding:!0,children:[_(a,{from:0,durationInFrames:210,children:y("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:16},children:[y("div",{style:{display:"flex",alignItems:"center",gap:16},children:[_(EH,{method:H,enterAt:10}),_(B,{text:K,variant:"subheading",enterAt:15,color:X.colors.mutedForeground})]}),_(B,{text:J,variant:"title",enterAt:5,color:"#ffffff"}),_("div",{style:{flex:1,marginTop:24},children:_(QH,{code:Q,language:"typescript",filename:`${J.toLowerCase()}.contract.ts`,startAt:45,typeAnimation:!0})})]})}),_(a,{from:180,durationInFrames:W-180,children:y("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",gap:24},children:[_(B,{text:"Generates:",variant:"heading",enterAt:0,color:"#ffffff",align:"center"}),_("div",{style:{display:"flex",flexWrap:"wrap",gap:16,justifyContent:"center",maxWidth:"80%",marginTop:32},children:z.map((N,G)=>_(bH,{label:N,index:G,startFrame:20+G*8},N))}),_(a,{from:U-180,children:_("div",{style:{marginTop:48},children:_(B,{text:$,variant:"heading",enterAt:0,color:X.colors.accent,align:"center"})})})]})})]}),_(v,{})]})},EH=({method:J,enterAt:H})=>{let K=zH(),Q=f(K,[H,H+10],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.entrance}),z=f(K,[H,H+12],[0.8,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.emphasis}),$={GET:"#61afef",POST:"#98c379",PUT:"#e5c07b",PATCH:"#d19a66",DELETE:"#e06c75"};return _("div",{style:{opacity:Q,transform:`scale(${z})`,backgroundColor:$[J]??"#61afef",color:"#000",padding:"8px 20px",borderRadius:8,fontSize:24,fontWeight:700,fontFamily:"monospace",letterSpacing:1},children:J})},bH=({label:J,startFrame:H})=>{let K=zH(),Q=f(K,[H,H+12],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}),z=f(K,[H,H+15],[20,0],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.emphasis}),$=f(K,[H,H+15],[0.9,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.emphasis});return _("div",{style:{opacity:Q,transform:`translateY(${z}px) scale(${$})`,backgroundColor:"rgba(255,255,255,0.08)",border:"1px solid rgba(255,255,255,0.15)",color:"#ffffff",padding:"16px 32px",borderRadius:12,fontSize:28,fontWeight:500},children:J})};import{interpolate as i,useCurrentFrame as FH,useVideoConfig as SH}from"remotion";import{jsx as O,jsxs as p}from"react/jsx-runtime";var WH={command:"#c9d1d9",output:"#8b949e",error:"#f85149",success:"#3fb950",comment:"#6e7681"},UH=({lines:J,startAt:H=0,prompt:K="$ ",title:Q="Terminal",backgroundColor:z=h.terminalBackground,typingSpeed:$=V.codeTypingPerChar})=>{let W=FH(),{width:X}=SH(),q=F(b.code,X),L=[],R=H;for(let U of J){let N=U.delay??10,G=R+N;if(U.type==="command"){let Z=U.text.length*$;L.push({startFrame:G,endFrame:G+Z}),R=G+Z}else L.push({startFrame:G,endFrame:G+5}),R=G+5}let Y=i(W,[H,H+10],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.entrance});return p("div",{style:{backgroundColor:z,borderRadius:16,overflow:"hidden",opacity:Y,boxShadow:"0 8px 32px rgba(0,0,0,0.3)"},children:[p("div",{style:{display:"flex",alignItems:"center",padding:"12px 20px",backgroundColor:"rgba(255,255,255,0.05)",gap:8},children:[p("div",{style:{display:"flex",gap:8},children:[O("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#ff5f57"}}),O("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#febc2e"}}),O("div",{style:{width:12,height:12,borderRadius:"50%",backgroundColor:"#28c840"}})]}),O("div",{style:{flex:1,textAlign:"center",color:"#484f58",fontSize:q.fontSize*0.7,fontFamily:"monospace"},children:Q})]}),O("div",{style:{padding:"24px 32px",minHeight:200},children:J.map((U,N)=>{let G=L[N];if(!G||W<G.startFrame)return null;let Z=U.type==="command",k=WH[U.type],E=U.text;if(Z){let qH=i(W,[G.startFrame,G.endFrame],[0,U.text.length],{extrapolateLeft:"clamp",extrapolateRight:"clamp"});E=U.text.slice(0,Math.floor(qH))}let o=Z?1:i(W,[G.startFrame,G.startFrame+5],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}),NH=Z&&W>=G.startFrame&&W<=G.endFrame&&W%16<10;return p("div",{style:{fontFamily:"'SF Mono', 'Fira Code', 'JetBrains Mono', monospace",fontSize:q.fontSize,lineHeight:1.8,color:k,opacity:o,whiteSpace:"pre-wrap"},children:[Z&&O("span",{style:{color:"#3fb950"},children:K}),U.type==="comment"&&O("span",{style:{color:WH.comment},children:"# "}),E,NH&&O("span",{style:{backgroundColor:"#c9d1d9",width:"2px",display:"inline-block",height:"1.2em",verticalAlign:"text-bottom"},children:" "})]},`${N}-${U.text.slice(0,20)}`)})})]})};import{AbsoluteFill as TH,interpolate as d,Sequence as c,useCurrentFrame as XH,useVideoConfig as AH}from"remotion";import{jsx as I,jsxs as m}from"react/jsx-runtime";var l=({hook:J,message:H,points:K=[],cta:Q="Learn more",ctaUrl:z="contractspec.dev",accentColor:$})=>{let{durationInFrames:W,width:X,height:q}=AH(),R=$??P.colors.accent,Y=q>X,U=75,N=60,G=120,Z=W-90;return m(TH,{children:[I(T,{variant:"gradient",showBranding:!0,children:m("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",gap:Y?48:32,textAlign:"center",padding:Y?"0 20px":0},children:[I(c,{from:0,durationInFrames:105,children:I("div",{style:{width:"100%"},children:I(B,{text:J,variant:"title",enterAt:5,exitAt:75,color:"#ffffff",align:"center"})})}),I(c,{from:60,children:I("div",{style:{width:"100%"},children:I(B,{text:H,variant:Y?"subheading":"heading",enterAt:0,color:"#ffffff",align:"center"})})}),K.length>0&&I(c,{from:120,children:I("div",{style:{display:"flex",flexDirection:"column",gap:16,alignItems:Y?"flex-start":"center",width:"100%",maxWidth:Y?"100%":"80%",marginTop:16},children:K.map((k,E)=>I(vH,{text:k,index:E,startFrame:E*15,accent:R},k))})}),I(c,{from:Z,children:I(CH,{cta:Q,url:z,accent:R})})]})}),I(v,{color:R})]})},vH=({text:J,startFrame:H,accent:K})=>{let Q=XH(),z=d(Q,[H,H+12],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}),$=d(Q,[H,H+15],[-30,0],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.entrance});return m("div",{style:{opacity:z,transform:`translateX(${$}px)`,display:"flex",alignItems:"center",gap:16,fontSize:28,color:"#ffffff"},children:[I("div",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:K,flexShrink:0}}),J]})},CH=({cta:J,url:H,accent:K})=>{let Q=XH(),z=d(Q,[0,15],[0,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp"}),$=d(Q,[0,18],[0.9,1],{extrapolateLeft:"clamp",extrapolateRight:"clamp",easing:M.emphasis});return m("div",{style:{opacity:z,transform:`scale(${$})`,display:"flex",flexDirection:"column",alignItems:"center",gap:12,marginTop:24},children:[I("div",{style:{backgroundColor:K,color:"#ffffff",padding:"16px 48px",borderRadius:12,fontSize:28,fontWeight:600},children:J}),I("div",{style:{color:"rgba(255,255,255,0.5)",fontSize:20},children:H})]})};import{AbsoluteFill as hH,Sequence as LH,useVideoConfig as yH}from"remotion";import{jsx as D,jsxs as t}from"react/jsx-runtime";var MH=({title:J,subtitle:H,lines:K,terminalTitle:Q="Terminal",prompt:z="$ ",summary:$})=>{let{durationInFrames:W}=yH(),X=P,q=40,L=W-90;return t(hH,{children:[D(T,{variant:"dark",showBranding:!0,children:t("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:24},children:[t("div",{children:[D(B,{text:J,variant:"heading",enterAt:5,color:"#ffffff"}),H&&D("div",{style:{marginTop:8},children:D(B,{text:H,variant:"body",enterAt:15,color:X.colors.mutedForeground})})]}),D(LH,{from:40,children:D("div",{style:{flex:1},children:D(UH,{lines:K,startAt:0,prompt:z,title:Q})})}),$&&D(LH,{from:L,children:D("div",{style:{marginTop:"auto",paddingTop:24},children:D(B,{text:$,variant:"subheading",enterAt:0,color:X.colors.accent,align:"center"})})})]})}),D(v,{})]})};import{Composition as j}from"remotion";import{jsx as g,jsxs as uH,Fragment as gH}from"react/jsx-runtime";var fH={specName:"CreateUser",method:"POST",endpoint:"/api/users",specCode:`export const createUser = defineCommand({
1076
2
  meta: {
1077
3
  name: 'CreateUser',
1078
4
  version: '1.0.0',
@@ -1090,100 +16,4 @@ var defaultApiOverviewProps = {
1090
16
  createdAt: z.date(),
1091
17
  }),
1092
18
  },
1093
- });`,
1094
- generatedOutputs: [
1095
- "REST Endpoint",
1096
- "GraphQL Mutation",
1097
- "Prisma Model",
1098
- "TypeScript SDK",
1099
- "MCP Tool",
1100
- "OpenAPI Spec"
1101
- ],
1102
- tagline: "One spec. Every surface."
1103
- };
1104
- var defaultSocialClipProps = {
1105
- hook: "Stop rewriting the same API logic.",
1106
- message: "ContractSpec generates REST, GraphQL, DB, SDK, and MCP from a single spec.",
1107
- points: [
1108
- "Deterministic output",
1109
- "Fully ejectable",
1110
- "Standard tech, no lock-in"
1111
- ],
1112
- cta: "Try ContractSpec",
1113
- ctaUrl: "contractspec.dev"
1114
- };
1115
- var defaultTerminalDemoProps = {
1116
- title: "Getting Started with ContractSpec",
1117
- subtitle: "Define once, generate everything.",
1118
- lines: [
1119
- { type: "comment", text: "Initialize a new ContractSpec project" },
1120
- { type: "command", text: "npx contractspec init my-api" },
1121
- { type: "output", text: "Created my-api/ with 3 sample contracts" },
1122
- { type: "command", text: "cd my-api && npx contractspec build" },
1123
- { type: "success", text: "Built 3 contracts -> 18 generated files" },
1124
- { type: "output", text: " REST endpoints: 3" },
1125
- { type: "output", text: " GraphQL types: 3" },
1126
- { type: "output", text: " Prisma models: 3" },
1127
- { type: "output", text: " TypeScript SDK: 3" },
1128
- { type: "output", text: " MCP tools: 3" },
1129
- { type: "output", text: " OpenAPI specs: 3" },
1130
- { type: "command", text: "npx contractspec validate" },
1131
- { type: "success", text: "All contracts valid. 0 warnings." }
1132
- ],
1133
- terminalTitle: "contractspec",
1134
- summary: "Ship faster. Stay coherent."
1135
- };
1136
- var RemotionRoot = () => {
1137
- return /* @__PURE__ */ jsxDEV9(Fragment, {
1138
- children: [
1139
- /* @__PURE__ */ jsxDEV9(Composition, {
1140
- id: "ApiOverview",
1141
- component: ApiOverview,
1142
- durationInFrames: 450,
1143
- fps: 30,
1144
- width: 1920,
1145
- height: 1080,
1146
- defaultProps: defaultApiOverviewProps
1147
- }, undefined, false, undefined, this),
1148
- /* @__PURE__ */ jsxDEV9(Composition, {
1149
- id: "SocialClip",
1150
- component: SocialClip,
1151
- durationInFrames: 300,
1152
- fps: 30,
1153
- width: 1920,
1154
- height: 1080,
1155
- defaultProps: defaultSocialClipProps
1156
- }, undefined, false, undefined, this),
1157
- /* @__PURE__ */ jsxDEV9(Composition, {
1158
- id: "SocialClipSquare",
1159
- component: SocialClip,
1160
- durationInFrames: 300,
1161
- fps: 30,
1162
- width: 1080,
1163
- height: 1080,
1164
- defaultProps: defaultSocialClipProps
1165
- }, undefined, false, undefined, this),
1166
- /* @__PURE__ */ jsxDEV9(Composition, {
1167
- id: "SocialClipPortrait",
1168
- component: SocialClip,
1169
- durationInFrames: 300,
1170
- fps: 30,
1171
- width: 1080,
1172
- height: 1920,
1173
- defaultProps: defaultSocialClipProps
1174
- }, undefined, false, undefined, this),
1175
- /* @__PURE__ */ jsxDEV9(Composition, {
1176
- id: "TerminalDemo",
1177
- component: TerminalDemo,
1178
- durationInFrames: 600,
1179
- fps: 30,
1180
- width: 1920,
1181
- height: 1080,
1182
- defaultProps: defaultTerminalDemoProps
1183
- }, undefined, false, undefined, this)
1184
- ]
1185
- }, undefined, true, undefined, this);
1186
- };
1187
- export {
1188
- RemotionRoot
1189
- };
19
+ });`,generatedOutputs:["REST Endpoint","GraphQL Mutation","Prisma Model","TypeScript SDK","MCP Tool","OpenAPI Spec"],tagline:"One spec. Every surface."},e={hook:"Stop rewriting the same API logic.",message:"ContractSpec generates REST, GraphQL, DB, SDK, and MCP from a single spec.",points:["Deterministic output","Fully ejectable","Standard tech, no lock-in"],cta:"Try ContractSpec",ctaUrl:"contractspec.dev"},jH={title:"Getting Started with ContractSpec",subtitle:"Define once, generate everything.",lines:[{type:"comment",text:"Initialize a new ContractSpec project"},{type:"command",text:"npx contractspec init my-api"},{type:"output",text:"Created my-api/ with 3 sample contracts"},{type:"command",text:"cd my-api && npx contractspec build"},{type:"success",text:"Built 3 contracts -> 18 generated files"},{type:"output",text:" REST endpoints: 3"},{type:"output",text:" GraphQL types: 3"},{type:"output",text:" Prisma models: 3"},{type:"output",text:" TypeScript SDK: 3"},{type:"output",text:" MCP tools: 3"},{type:"output",text:" OpenAPI specs: 3"},{type:"command",text:"npx contractspec validate"},{type:"success",text:"All contracts valid. 0 warnings."}],terminalTitle:"contractspec",summary:"Ship faster. Stay coherent."},JK=()=>{return uH(gH,{children:[g(j,{id:"ApiOverview",component:GH,durationInFrames:450,fps:30,width:1920,height:1080,defaultProps:fH}),g(j,{id:"SocialClip",component:l,durationInFrames:300,fps:30,width:1920,height:1080,defaultProps:e}),g(j,{id:"SocialClipSquare",component:l,durationInFrames:300,fps:30,width:1080,height:1080,defaultProps:e}),g(j,{id:"SocialClipPortrait",component:l,durationInFrames:300,fps:30,width:1080,height:1920,defaultProps:e}),g(j,{id:"TerminalDemo",component:MH,durationInFrames:600,fps:30,width:1920,height:1080,defaultProps:jH})]})};export{JK as RemotionRoot};