@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,22 @@
1
+ import React from 'react';
2
+ import { videoTypography } from '../../design/typography';
3
+ import type { VideoTypeStyle } from '../../design/typography';
4
+ export interface AnimatedTextProps {
5
+ /** The text content to display */
6
+ text: string;
7
+ /** Typography style key or custom style */
8
+ variant?: keyof typeof videoTypography;
9
+ /** Custom style override */
10
+ style?: Partial<VideoTypeStyle>;
11
+ /** Frame at which text enters (relative to composition start) */
12
+ enterAt?: number;
13
+ /** Frame at which text exits. Omit to keep visible. */
14
+ exitAt?: number;
15
+ /** Color */
16
+ color?: string;
17
+ /** Text alignment */
18
+ align?: 'left' | 'center' | 'right';
19
+ /** Additional CSS styles */
20
+ className?: string;
21
+ }
22
+ export declare const AnimatedText: React.FC<AnimatedTextProps>;
@@ -0,0 +1,139 @@
1
+ // @bun
2
+ var __require = import.meta.require;
3
+
4
+ // src/design/motion.ts
5
+ import { Easing } from "remotion";
6
+ var videoEasing = {
7
+ entrance: Easing.out(Easing.exp),
8
+ exit: Easing.in(Easing.exp),
9
+ emphasis: Easing.out(Easing.back(1.4)),
10
+ linear: Easing.linear,
11
+ gentle: Easing.bezier(0.25, 0.1, 0.25, 1),
12
+ spring: Easing.out(Easing.back(1.7))
13
+ };
14
+ var videoDurations = {
15
+ sceneTransition: 20,
16
+ textEntrance: 15,
17
+ textExit: 12,
18
+ codeTypingPerChar: 2,
19
+ sectionPause: 30,
20
+ emphasisPause: 15,
21
+ brandReveal: 25,
22
+ minScene: 60,
23
+ shortScene: 60,
24
+ mediumScene: 120,
25
+ longScene: 240
26
+ };
27
+ var videoTransitions = {
28
+ fade: { type: "fade", durationInFrames: 20 },
29
+ slideLeft: { type: "slide-left", durationInFrames: 20 },
30
+ slideRight: { type: "slide-right", durationInFrames: 20 },
31
+ wipe: { type: "wipe", durationInFrames: 15 },
32
+ none: { type: "none", durationInFrames: 0 }
33
+ };
34
+
35
+ // src/design/typography.ts
36
+ var videoTypography = {
37
+ title: {
38
+ fontSize: 72,
39
+ lineHeight: 1.1,
40
+ fontWeight: 700,
41
+ letterSpacing: -1
42
+ },
43
+ heading: {
44
+ fontSize: 56,
45
+ lineHeight: 1.2,
46
+ fontWeight: 600,
47
+ letterSpacing: -0.5
48
+ },
49
+ subheading: {
50
+ fontSize: 40,
51
+ lineHeight: 1.25,
52
+ fontWeight: 500
53
+ },
54
+ body: {
55
+ fontSize: 32,
56
+ lineHeight: 1.5,
57
+ fontWeight: 400
58
+ },
59
+ code: {
60
+ fontSize: 28,
61
+ lineHeight: 1.6,
62
+ fontWeight: 400
63
+ },
64
+ caption: {
65
+ fontSize: 24,
66
+ lineHeight: 1.4,
67
+ fontWeight: 400
68
+ },
69
+ label: {
70
+ fontSize: 20,
71
+ lineHeight: 1.3,
72
+ fontWeight: 600,
73
+ letterSpacing: 1
74
+ }
75
+ };
76
+ function scaleTypography(style, targetWidth) {
77
+ const scale = targetWidth / 1920;
78
+ return {
79
+ ...style,
80
+ fontSize: Math.round(style.fontSize * scale),
81
+ letterSpacing: style.letterSpacing ? Math.round(style.letterSpacing * scale * 10) / 10 : undefined
82
+ };
83
+ }
84
+
85
+ // src/compositions/primitives/animated-text.tsx
86
+ import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
87
+ import { jsxDEV } from "react/jsx-dev-runtime";
88
+ var AnimatedText = ({
89
+ text,
90
+ variant = "body",
91
+ style: styleOverride,
92
+ enterAt = 0,
93
+ exitAt,
94
+ color = "#ffffff",
95
+ align = "left"
96
+ }) => {
97
+ const frame = useCurrentFrame();
98
+ const { width } = useVideoConfig();
99
+ const baseStyle = videoTypography[variant];
100
+ const scaled = scaleTypography(baseStyle, width);
101
+ const finalStyle = { ...scaled, ...styleOverride };
102
+ const enterProgress = interpolate(frame, [enterAt, enterAt + videoDurations.textEntrance], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
103
+ const enterOpacity = interpolate(enterProgress, [0, 1], [0, 1], {
104
+ easing: videoEasing.entrance
105
+ });
106
+ const enterTranslateY = interpolate(enterProgress, [0, 1], [30, 0], {
107
+ easing: videoEasing.entrance
108
+ });
109
+ let exitOpacity = 1;
110
+ let exitTranslateY = 0;
111
+ if (exitAt !== undefined) {
112
+ const exitProgress = interpolate(frame, [exitAt, exitAt + videoDurations.textExit], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
113
+ exitOpacity = interpolate(exitProgress, [0, 1], [1, 0], {
114
+ easing: videoEasing.exit
115
+ });
116
+ exitTranslateY = interpolate(exitProgress, [0, 1], [0, -20], {
117
+ easing: videoEasing.exit
118
+ });
119
+ }
120
+ const opacity = enterOpacity * exitOpacity;
121
+ const translateY = enterTranslateY + exitTranslateY;
122
+ return /* @__PURE__ */ jsxDEV("div", {
123
+ style: {
124
+ fontSize: finalStyle.fontSize,
125
+ lineHeight: finalStyle.lineHeight,
126
+ fontWeight: finalStyle.fontWeight,
127
+ letterSpacing: finalStyle.letterSpacing,
128
+ color,
129
+ textAlign: align,
130
+ opacity,
131
+ transform: `translateY(${translateY}px)`,
132
+ willChange: "opacity, transform"
133
+ },
134
+ children: text
135
+ }, undefined, false, undefined, this);
136
+ };
137
+ export {
138
+ AnimatedText
139
+ };
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { VideoStyleOverrides } from '@contractspec/lib.contracts-integrations/integrations/providers/video';
3
+ export interface BrandFrameProps {
4
+ /** Override style tokens */
5
+ styleOverrides?: VideoStyleOverrides;
6
+ /** Show the ContractSpec logo/brand in bottom-right */
7
+ showBranding?: boolean;
8
+ /** Animate entrance */
9
+ animateEntrance?: boolean;
10
+ /** Background variant */
11
+ variant?: 'solid' | 'gradient' | 'dark';
12
+ children: React.ReactNode;
13
+ }
14
+ export declare const BrandFrame: React.FC<BrandFrameProps>;
@@ -0,0 +1,176 @@
1
+ // @bun
2
+ var __require = import.meta.require;
3
+
4
+ // src/design/motion.ts
5
+ import { Easing } from "remotion";
6
+ var videoEasing = {
7
+ entrance: Easing.out(Easing.exp),
8
+ exit: Easing.in(Easing.exp),
9
+ emphasis: Easing.out(Easing.back(1.4)),
10
+ linear: Easing.linear,
11
+ gentle: Easing.bezier(0.25, 0.1, 0.25, 1),
12
+ spring: Easing.out(Easing.back(1.7))
13
+ };
14
+ var videoDurations = {
15
+ sceneTransition: 20,
16
+ textEntrance: 15,
17
+ textExit: 12,
18
+ codeTypingPerChar: 2,
19
+ sectionPause: 30,
20
+ emphasisPause: 15,
21
+ brandReveal: 25,
22
+ minScene: 60,
23
+ shortScene: 60,
24
+ mediumScene: 120,
25
+ longScene: 240
26
+ };
27
+ var videoTransitions = {
28
+ fade: { type: "fade", durationInFrames: 20 },
29
+ slideLeft: { type: "slide-left", durationInFrames: 20 },
30
+ slideRight: { type: "slide-right", durationInFrames: 20 },
31
+ wipe: { type: "wipe", durationInFrames: 15 },
32
+ none: { type: "none", durationInFrames: 0 }
33
+ };
34
+
35
+ // src/design/tokens.ts
36
+ import { defaultTokens } from "@contractspec/lib.design-system";
37
+ var defaultVideoColors = {
38
+ canvasBackground: defaultTokens.colors.background,
39
+ codeBackground: "#1e1e2e",
40
+ terminalBackground: "#0d1117",
41
+ terminalForeground: "#c9d1d9",
42
+ highlight: defaultTokens.colors.accent,
43
+ gradientStart: defaultTokens.colors.primary,
44
+ gradientEnd: defaultTokens.colors.accent
45
+ };
46
+ var defaultVideoTheme = {
47
+ ...defaultTokens,
48
+ video: defaultVideoColors
49
+ };
50
+
51
+ // src/design/layouts.ts
52
+ import { VIDEO_FORMATS } from "@contractspec/lib.contracts-integrations/integrations/providers/video";
53
+ var DEFAULT_FPS = 30;
54
+ var videoSafeZone = {
55
+ horizontal: 120,
56
+ vertical: 80,
57
+ contentWidth: 1680,
58
+ contentHeight: 920
59
+ };
60
+ function scaleSafeZone(format) {
61
+ const scaleX = format.width / 1920;
62
+ const scaleY = format.height / 1080;
63
+ return {
64
+ horizontal: Math.round(videoSafeZone.horizontal * scaleX),
65
+ vertical: Math.round(videoSafeZone.vertical * scaleY),
66
+ contentWidth: Math.round(videoSafeZone.contentWidth * scaleX),
67
+ contentHeight: Math.round(videoSafeZone.contentHeight * scaleY)
68
+ };
69
+ }
70
+ var videoPositions = {
71
+ center: { x: 960, y: 540 },
72
+ topLeft: { x: 120, y: 80 },
73
+ topRight: { x: 1800, y: 80 },
74
+ bottomLeft: { x: 120, y: 1000 },
75
+ bottomRight: { x: 1800, y: 1000 },
76
+ bottomCenter: { x: 960, y: 960 }
77
+ };
78
+ function getAllFormatVariants() {
79
+ return [
80
+ VIDEO_FORMATS.landscape,
81
+ VIDEO_FORMATS.square,
82
+ VIDEO_FORMATS.portrait
83
+ ];
84
+ }
85
+
86
+ // src/compositions/primitives/brand-frame.tsx
87
+ import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
88
+ import { jsxDEV } from "react/jsx-dev-runtime";
89
+ var BrandFrame = ({
90
+ styleOverrides,
91
+ showBranding = true,
92
+ animateEntrance = true,
93
+ variant = "gradient",
94
+ children
95
+ }) => {
96
+ const frame = useCurrentFrame();
97
+ const { width, height } = useVideoConfig();
98
+ const theme = defaultVideoTheme;
99
+ const safeZone = scaleSafeZone({ type: "custom", width, height });
100
+ const primaryColor = styleOverrides?.primaryColor ?? theme.colors.primary;
101
+ const _accentColor = styleOverrides?.accentColor ?? theme.colors.accent;
102
+ const isDark = styleOverrides?.darkMode ?? true;
103
+ let background;
104
+ switch (variant) {
105
+ case "solid":
106
+ background = isDark ? "#0a0a0a" : theme.colors.background;
107
+ break;
108
+ case "gradient":
109
+ background = isDark ? `linear-gradient(135deg, #0a0a14 0%, #0f172a 50%, #0a0a14 100%)` : `linear-gradient(135deg, ${theme.colors.background} 0%, ${theme.colors.muted} 100%)`;
110
+ break;
111
+ case "dark":
112
+ background = "#000000";
113
+ break;
114
+ }
115
+ const entranceOpacity = animateEntrance ? interpolate(frame, [0, 15], [0, 1], {
116
+ extrapolateLeft: "clamp",
117
+ extrapolateRight: "clamp",
118
+ easing: videoEasing.entrance
119
+ }) : 1;
120
+ const brandOpacity = showBranding ? interpolate(frame, [videoDurations.brandReveal, videoDurations.brandReveal + 15], [0, 0.3], {
121
+ extrapolateLeft: "clamp",
122
+ extrapolateRight: "clamp"
123
+ }) : 0;
124
+ return /* @__PURE__ */ jsxDEV("div", {
125
+ style: {
126
+ width,
127
+ height,
128
+ background,
129
+ position: "relative",
130
+ overflow: "hidden",
131
+ opacity: entranceOpacity
132
+ },
133
+ children: [
134
+ variant === "gradient" && /* @__PURE__ */ jsxDEV("div", {
135
+ style: {
136
+ position: "absolute",
137
+ top: "-20%",
138
+ right: "-10%",
139
+ width: "50%",
140
+ height: "50%",
141
+ background: `radial-gradient(circle, ${primaryColor}15 0%, transparent 70%)`,
142
+ borderRadius: "50%",
143
+ pointerEvents: "none"
144
+ }
145
+ }, undefined, false, undefined, this),
146
+ /* @__PURE__ */ jsxDEV("div", {
147
+ style: {
148
+ position: "absolute",
149
+ left: safeZone.horizontal,
150
+ top: safeZone.vertical,
151
+ width: safeZone.contentWidth,
152
+ height: safeZone.contentHeight,
153
+ display: "flex",
154
+ flexDirection: "column"
155
+ },
156
+ children
157
+ }, undefined, false, undefined, this),
158
+ showBranding && /* @__PURE__ */ jsxDEV("div", {
159
+ style: {
160
+ position: "absolute",
161
+ bottom: safeZone.vertical / 2,
162
+ right: safeZone.horizontal,
163
+ opacity: brandOpacity,
164
+ color: isDark ? "#ffffff" : "#000000",
165
+ fontSize: Math.round(16 * (width / 1920)),
166
+ fontWeight: 500,
167
+ letterSpacing: 1
168
+ },
169
+ children: "ContractSpec"
170
+ }, undefined, false, undefined, this)
171
+ ]
172
+ }, undefined, true, undefined, this);
173
+ };
174
+ export {
175
+ BrandFrame
176
+ };
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ export interface CodeBlockProps {
3
+ /** Code string to display */
4
+ code: string;
5
+ /** Language label shown in the top bar */
6
+ language?: string;
7
+ /** Frame at which typing starts */
8
+ startAt?: number;
9
+ /** Whether to animate typing or show all at once */
10
+ typeAnimation?: boolean;
11
+ /** Background color */
12
+ backgroundColor?: string;
13
+ /** Text color */
14
+ textColor?: string;
15
+ /** Filename to show in the title bar */
16
+ filename?: string;
17
+ }
18
+ export declare const CodeBlock: React.FC<CodeBlockProps>;
@@ -0,0 +1,221 @@
1
+ // @bun
2
+ var __require = import.meta.require;
3
+
4
+ // src/design/motion.ts
5
+ import { Easing } from "remotion";
6
+ var videoEasing = {
7
+ entrance: Easing.out(Easing.exp),
8
+ exit: Easing.in(Easing.exp),
9
+ emphasis: Easing.out(Easing.back(1.4)),
10
+ linear: Easing.linear,
11
+ gentle: Easing.bezier(0.25, 0.1, 0.25, 1),
12
+ spring: Easing.out(Easing.back(1.7))
13
+ };
14
+ var videoDurations = {
15
+ sceneTransition: 20,
16
+ textEntrance: 15,
17
+ textExit: 12,
18
+ codeTypingPerChar: 2,
19
+ sectionPause: 30,
20
+ emphasisPause: 15,
21
+ brandReveal: 25,
22
+ minScene: 60,
23
+ shortScene: 60,
24
+ mediumScene: 120,
25
+ longScene: 240
26
+ };
27
+ var videoTransitions = {
28
+ fade: { type: "fade", durationInFrames: 20 },
29
+ slideLeft: { type: "slide-left", durationInFrames: 20 },
30
+ slideRight: { type: "slide-right", durationInFrames: 20 },
31
+ wipe: { type: "wipe", durationInFrames: 15 },
32
+ none: { type: "none", durationInFrames: 0 }
33
+ };
34
+
35
+ // src/design/tokens.ts
36
+ import { defaultTokens } from "@contractspec/lib.design-system";
37
+ var defaultVideoColors = {
38
+ canvasBackground: defaultTokens.colors.background,
39
+ codeBackground: "#1e1e2e",
40
+ terminalBackground: "#0d1117",
41
+ terminalForeground: "#c9d1d9",
42
+ highlight: defaultTokens.colors.accent,
43
+ gradientStart: defaultTokens.colors.primary,
44
+ gradientEnd: defaultTokens.colors.accent
45
+ };
46
+ var defaultVideoTheme = {
47
+ ...defaultTokens,
48
+ video: defaultVideoColors
49
+ };
50
+
51
+ // src/design/typography.ts
52
+ var videoTypography = {
53
+ title: {
54
+ fontSize: 72,
55
+ lineHeight: 1.1,
56
+ fontWeight: 700,
57
+ letterSpacing: -1
58
+ },
59
+ heading: {
60
+ fontSize: 56,
61
+ lineHeight: 1.2,
62
+ fontWeight: 600,
63
+ letterSpacing: -0.5
64
+ },
65
+ subheading: {
66
+ fontSize: 40,
67
+ lineHeight: 1.25,
68
+ fontWeight: 500
69
+ },
70
+ body: {
71
+ fontSize: 32,
72
+ lineHeight: 1.5,
73
+ fontWeight: 400
74
+ },
75
+ code: {
76
+ fontSize: 28,
77
+ lineHeight: 1.6,
78
+ fontWeight: 400
79
+ },
80
+ caption: {
81
+ fontSize: 24,
82
+ lineHeight: 1.4,
83
+ fontWeight: 400
84
+ },
85
+ label: {
86
+ fontSize: 20,
87
+ lineHeight: 1.3,
88
+ fontWeight: 600,
89
+ letterSpacing: 1
90
+ }
91
+ };
92
+ function scaleTypography(style, targetWidth) {
93
+ const scale = targetWidth / 1920;
94
+ return {
95
+ ...style,
96
+ fontSize: Math.round(style.fontSize * scale),
97
+ letterSpacing: style.letterSpacing ? Math.round(style.letterSpacing * scale * 10) / 10 : undefined
98
+ };
99
+ }
100
+
101
+ // src/compositions/primitives/code-block.tsx
102
+ import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
103
+ import { jsxDEV } from "react/jsx-dev-runtime";
104
+ var CodeBlock = ({
105
+ code,
106
+ language = "typescript",
107
+ startAt = 0,
108
+ typeAnimation = true,
109
+ backgroundColor = defaultVideoColors.codeBackground,
110
+ textColor = "#abb2bf",
111
+ filename
112
+ }) => {
113
+ const frame = useCurrentFrame();
114
+ const { width } = useVideoConfig();
115
+ const codeStyle = scaleTypography(videoTypography.code, width);
116
+ const totalChars = code.length;
117
+ const typingDuration = totalChars * videoDurations.codeTypingPerChar;
118
+ const charsVisible = typeAnimation ? Math.floor(interpolate(frame, [startAt, startAt + typingDuration], [0, totalChars], {
119
+ extrapolateLeft: "clamp",
120
+ extrapolateRight: "clamp"
121
+ })) : totalChars;
122
+ const visibleCode = code.slice(0, charsVisible);
123
+ const opacity = interpolate(frame, [startAt, startAt + 10], [0, 1], {
124
+ extrapolateLeft: "clamp",
125
+ extrapolateRight: "clamp",
126
+ easing: videoEasing.entrance
127
+ });
128
+ const showCursor = typeAnimation && charsVisible < totalChars && frame % 16 < 10;
129
+ return /* @__PURE__ */ jsxDEV("div", {
130
+ style: {
131
+ backgroundColor,
132
+ borderRadius: 16,
133
+ padding: 0,
134
+ opacity,
135
+ overflow: "hidden",
136
+ boxShadow: "0 8px 32px rgba(0,0,0,0.3)"
137
+ },
138
+ children: [
139
+ /* @__PURE__ */ jsxDEV("div", {
140
+ style: {
141
+ display: "flex",
142
+ alignItems: "center",
143
+ padding: "12px 20px",
144
+ backgroundColor: "rgba(0,0,0,0.2)",
145
+ gap: 8
146
+ },
147
+ children: [
148
+ /* @__PURE__ */ jsxDEV("div", {
149
+ style: { display: "flex", gap: 8 },
150
+ children: [
151
+ /* @__PURE__ */ jsxDEV("div", {
152
+ style: {
153
+ width: 12,
154
+ height: 12,
155
+ borderRadius: "50%",
156
+ backgroundColor: "#ff5f57"
157
+ }
158
+ }, undefined, false, undefined, this),
159
+ /* @__PURE__ */ jsxDEV("div", {
160
+ style: {
161
+ width: 12,
162
+ height: 12,
163
+ borderRadius: "50%",
164
+ backgroundColor: "#febc2e"
165
+ }
166
+ }, undefined, false, undefined, this),
167
+ /* @__PURE__ */ jsxDEV("div", {
168
+ style: {
169
+ width: 12,
170
+ height: 12,
171
+ borderRadius: "50%",
172
+ backgroundColor: "#28c840"
173
+ }
174
+ }, undefined, false, undefined, this)
175
+ ]
176
+ }, undefined, true, undefined, this),
177
+ /* @__PURE__ */ jsxDEV("div", {
178
+ style: {
179
+ flex: 1,
180
+ textAlign: "center",
181
+ color: "#666",
182
+ fontSize: codeStyle.fontSize * 0.7,
183
+ fontFamily: "monospace"
184
+ },
185
+ children: filename ?? language
186
+ }, undefined, false, undefined, this)
187
+ ]
188
+ }, undefined, true, undefined, this),
189
+ /* @__PURE__ */ jsxDEV("div", {
190
+ style: { padding: "24px 32px" },
191
+ children: /* @__PURE__ */ jsxDEV("pre", {
192
+ style: {
193
+ margin: 0,
194
+ fontFamily: "'SF Mono', 'Fira Code', 'JetBrains Mono', monospace",
195
+ fontSize: codeStyle.fontSize,
196
+ lineHeight: codeStyle.lineHeight,
197
+ color: textColor,
198
+ whiteSpace: "pre-wrap",
199
+ wordBreak: "break-word"
200
+ },
201
+ children: [
202
+ visibleCode,
203
+ showCursor && /* @__PURE__ */ jsxDEV("span", {
204
+ style: {
205
+ backgroundColor: textColor,
206
+ width: "2px",
207
+ display: "inline-block",
208
+ height: "1.2em",
209
+ verticalAlign: "text-bottom"
210
+ },
211
+ children: "\xA0"
212
+ }, undefined, false, undefined, this)
213
+ ]
214
+ }, undefined, true, undefined, this)
215
+ }, undefined, false, undefined, this)
216
+ ]
217
+ }, undefined, true, undefined, this);
218
+ };
219
+ export {
220
+ CodeBlock
221
+ };
@@ -0,0 +1,12 @@
1
+ export { AnimatedText } from './animated-text';
2
+ export type { AnimatedTextProps } from './animated-text';
3
+ export { CodeBlock } from './code-block';
4
+ export type { CodeBlockProps } from './code-block';
5
+ export { Terminal } from './terminal';
6
+ export type { TerminalProps, TerminalLine } from './terminal';
7
+ export { SceneTransitionWrapper } from './transition';
8
+ export type { SceneTransitionProps } from './transition';
9
+ export { BrandFrame } from './brand-frame';
10
+ export type { BrandFrameProps } from './brand-frame';
11
+ export { ProgressBar } from './progress-bar';
12
+ export type { ProgressBarProps } from './progress-bar';