@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,139 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
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,176 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
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,221 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
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: " "
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
+ };