@lssm-tech/lib.video-gen 3.0.10 → 5.0.2

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 (175) hide show
  1. package/README.md +8 -8
  2. package/package.json +240 -328
  3. package/dist/browser/compositions/api-overview.js +0 -1
  4. package/dist/browser/compositions/index.js +0 -1
  5. package/dist/browser/compositions/primitives/animated-text.js +0 -1
  6. package/dist/browser/compositions/primitives/brand-frame.js +0 -1
  7. package/dist/browser/compositions/primitives/code-block.js +0 -1
  8. package/dist/browser/compositions/primitives/index.js +0 -1
  9. package/dist/browser/compositions/primitives/progress-bar.js +0 -1
  10. package/dist/browser/compositions/primitives/terminal.js +0 -1
  11. package/dist/browser/compositions/primitives/transition.js +0 -1
  12. package/dist/browser/compositions/social-clip.js +0 -1
  13. package/dist/browser/compositions/terminal-demo.js +0 -1
  14. package/dist/browser/design/index.js +0 -1
  15. package/dist/browser/design/layouts.js +0 -1
  16. package/dist/browser/design/motion.js +0 -1
  17. package/dist/browser/design/tokens.js +0 -1
  18. package/dist/browser/design/typography.js +0 -1
  19. package/dist/browser/docs/compositions.docblock.js +0 -1
  20. package/dist/browser/docs/design.docblock.js +0 -172
  21. package/dist/browser/docs/generators.docblock.js +0 -165
  22. package/dist/browser/docs/rendering.docblock.js +0 -175
  23. package/dist/browser/docs/video-gen.docblock.js +0 -126
  24. package/dist/browser/generators/index.js +0 -82
  25. package/dist/browser/generators/scene-planner.js +0 -82
  26. package/dist/browser/generators/script-generator.js +0 -82
  27. package/dist/browser/generators/video-generator.js +0 -82
  28. package/dist/browser/i18n/catalogs/en.js +0 -28
  29. package/dist/browser/i18n/catalogs/es.js +0 -28
  30. package/dist/browser/i18n/catalogs/fr.js +0 -28
  31. package/dist/browser/i18n/catalogs/index.js +0 -82
  32. package/dist/browser/i18n/index.js +0 -82
  33. package/dist/browser/i18n/keys.js +0 -1
  34. package/dist/browser/i18n/locale.js +0 -1
  35. package/dist/browser/i18n/messages.js +0 -82
  36. package/dist/browser/index.js +0 -82
  37. package/dist/browser/player/demo-player.js +0 -1
  38. package/dist/browser/player/index.js +0 -1
  39. package/dist/browser/remotion/Root.js +0 -19
  40. package/dist/browser/remotion/index.js +0 -19
  41. package/dist/browser/renderers/config.js +0 -1
  42. package/dist/browser/renderers/index.js +0 -1
  43. package/dist/browser/renderers/local.js +0 -1
  44. package/dist/browser/types.js +0 -1
  45. package/dist/browser/video-gen.feature.js +0 -1
  46. package/dist/compositions/api-overview.d.ts +0 -16
  47. package/dist/compositions/api-overview.js +0 -2
  48. package/dist/compositions/index.d.ts +0 -7
  49. package/dist/compositions/index.js +0 -2
  50. package/dist/compositions/primitives/animated-text.d.ts +0 -22
  51. package/dist/compositions/primitives/animated-text.js +0 -2
  52. package/dist/compositions/primitives/brand-frame.d.ts +0 -14
  53. package/dist/compositions/primitives/brand-frame.js +0 -2
  54. package/dist/compositions/primitives/code-block.d.ts +0 -18
  55. package/dist/compositions/primitives/code-block.js +0 -2
  56. package/dist/compositions/primitives/index.d.ts +0 -12
  57. package/dist/compositions/primitives/index.js +0 -2
  58. package/dist/compositions/primitives/progress-bar.d.ts +0 -12
  59. package/dist/compositions/primitives/progress-bar.js +0 -2
  60. package/dist/compositions/primitives/terminal.d.ts +0 -24
  61. package/dist/compositions/primitives/terminal.js +0 -2
  62. package/dist/compositions/primitives/transition.d.ts +0 -14
  63. package/dist/compositions/primitives/transition.js +0 -2
  64. package/dist/compositions/social-clip.d.ts +0 -16
  65. package/dist/compositions/social-clip.js +0 -2
  66. package/dist/compositions/terminal-demo.d.ts +0 -17
  67. package/dist/compositions/terminal-demo.js +0 -2
  68. package/dist/design/index.d.ts +0 -4
  69. package/dist/design/index.js +0 -2
  70. package/dist/design/layouts.d.ts +0 -69
  71. package/dist/design/layouts.js +0 -2
  72. package/dist/design/motion.d.ts +0 -72
  73. package/dist/design/motion.js +0 -2
  74. package/dist/design/tokens.d.ts +0 -31
  75. package/dist/design/tokens.js +0 -2
  76. package/dist/design/typography.d.ts +0 -61
  77. package/dist/design/typography.js +0 -2
  78. package/dist/docs/compositions.docblock.d.ts +0 -1
  79. package/dist/docs/compositions.docblock.js +0 -2
  80. package/dist/docs/design.docblock.d.ts +0 -1
  81. package/dist/docs/design.docblock.js +0 -173
  82. package/dist/docs/generators.docblock.d.ts +0 -1
  83. package/dist/docs/generators.docblock.js +0 -166
  84. package/dist/docs/rendering.docblock.d.ts +0 -1
  85. package/dist/docs/rendering.docblock.js +0 -176
  86. package/dist/docs/video-gen.docblock.d.ts +0 -1
  87. package/dist/docs/video-gen.docblock.js +0 -127
  88. package/dist/generators/index.d.ts +0 -3
  89. package/dist/generators/index.js +0 -83
  90. package/dist/generators/scene-planner.d.ts +0 -31
  91. package/dist/generators/scene-planner.js +0 -83
  92. package/dist/generators/script-generator.d.ts +0 -57
  93. package/dist/generators/script-generator.js +0 -83
  94. package/dist/generators/video-generator.d.ts +0 -21
  95. package/dist/generators/video-generator.js +0 -83
  96. package/dist/i18n/catalogs/en.d.ts +0 -8
  97. package/dist/i18n/catalogs/en.js +0 -29
  98. package/dist/i18n/catalogs/es.d.ts +0 -6
  99. package/dist/i18n/catalogs/es.js +0 -29
  100. package/dist/i18n/catalogs/fr.d.ts +0 -6
  101. package/dist/i18n/catalogs/fr.js +0 -29
  102. package/dist/i18n/catalogs/index.d.ts +0 -8
  103. package/dist/i18n/catalogs/index.js +0 -83
  104. package/dist/i18n/i18n.test.d.ts +0 -1
  105. package/dist/i18n/index.d.ts +0 -22
  106. package/dist/i18n/index.js +0 -83
  107. package/dist/i18n/keys.d.ts +0 -116
  108. package/dist/i18n/keys.js +0 -2
  109. package/dist/i18n/locale.d.ts +0 -8
  110. package/dist/i18n/locale.js +0 -2
  111. package/dist/i18n/messages.d.ts +0 -14
  112. package/dist/i18n/messages.js +0 -83
  113. package/dist/index.d.ts +0 -7
  114. package/dist/index.js +0 -83
  115. package/dist/node/compositions/api-overview.js +0 -1
  116. package/dist/node/compositions/index.js +0 -1
  117. package/dist/node/compositions/primitives/animated-text.js +0 -1
  118. package/dist/node/compositions/primitives/brand-frame.js +0 -1
  119. package/dist/node/compositions/primitives/code-block.js +0 -1
  120. package/dist/node/compositions/primitives/index.js +0 -1
  121. package/dist/node/compositions/primitives/progress-bar.js +0 -1
  122. package/dist/node/compositions/primitives/terminal.js +0 -1
  123. package/dist/node/compositions/primitives/transition.js +0 -1
  124. package/dist/node/compositions/social-clip.js +0 -1
  125. package/dist/node/compositions/terminal-demo.js +0 -1
  126. package/dist/node/design/index.js +0 -1
  127. package/dist/node/design/layouts.js +0 -1
  128. package/dist/node/design/motion.js +0 -1
  129. package/dist/node/design/tokens.js +0 -1
  130. package/dist/node/design/typography.js +0 -1
  131. package/dist/node/docs/compositions.docblock.js +0 -1
  132. package/dist/node/docs/design.docblock.js +0 -172
  133. package/dist/node/docs/generators.docblock.js +0 -165
  134. package/dist/node/docs/rendering.docblock.js +0 -175
  135. package/dist/node/docs/video-gen.docblock.js +0 -126
  136. package/dist/node/generators/index.js +0 -82
  137. package/dist/node/generators/scene-planner.js +0 -82
  138. package/dist/node/generators/script-generator.js +0 -82
  139. package/dist/node/generators/video-generator.js +0 -82
  140. package/dist/node/i18n/catalogs/en.js +0 -28
  141. package/dist/node/i18n/catalogs/es.js +0 -28
  142. package/dist/node/i18n/catalogs/fr.js +0 -28
  143. package/dist/node/i18n/catalogs/index.js +0 -82
  144. package/dist/node/i18n/index.js +0 -82
  145. package/dist/node/i18n/keys.js +0 -1
  146. package/dist/node/i18n/locale.js +0 -1
  147. package/dist/node/i18n/messages.js +0 -82
  148. package/dist/node/index.js +0 -82
  149. package/dist/node/player/demo-player.js +0 -1
  150. package/dist/node/player/index.js +0 -1
  151. package/dist/node/remotion/Root.js +0 -19
  152. package/dist/node/remotion/index.js +0 -19
  153. package/dist/node/renderers/config.js +0 -1
  154. package/dist/node/renderers/index.js +0 -1
  155. package/dist/node/renderers/local.js +0 -1
  156. package/dist/node/types.js +0 -1
  157. package/dist/node/video-gen.feature.js +0 -1
  158. package/dist/player/demo-player.d.ts +0 -55
  159. package/dist/player/demo-player.js +0 -2
  160. package/dist/player/index.d.ts +0 -2
  161. package/dist/player/index.js +0 -2
  162. package/dist/remotion/Root.d.ts +0 -2
  163. package/dist/remotion/Root.js +0 -20
  164. package/dist/remotion/index.d.ts +0 -1
  165. package/dist/remotion/index.js +0 -20
  166. package/dist/renderers/config.d.ts +0 -28
  167. package/dist/renderers/config.js +0 -2
  168. package/dist/renderers/index.d.ts +0 -3
  169. package/dist/renderers/index.js +0 -2
  170. package/dist/renderers/local.d.ts +0 -17
  171. package/dist/renderers/local.js +0 -2
  172. package/dist/types.d.ts +0 -85
  173. package/dist/types.js +0 -2
  174. package/dist/video-gen.feature.d.ts +0 -1
  175. package/dist/video-gen.feature.js +0 -2
@@ -1,172 +0,0 @@
1
- import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.video-gen.design",title:"Video Design System",summary:"Design tokens, motion primitives, typography scale, and layout system optimized for programmatic video.",kind:"reference",visibility:"public",route:"/docs/video-gen/design",tags:["video","design-tokens","motion","typography","layout"],owners:["@contractspec/lib.video-gen"],body:`# Video Design System
2
-
3
- The design layer bridges \`@contractspec/lib.design-system\` brand tokens with video-specific extensions for motion, typography, and spatial layout. All values are optimized for 1920x1080 (landscape) and scale proportionally for other formats.
4
-
5
- \`\`\`ts
6
- import {
7
- defaultVideoTheme,
8
- videoEasing,
9
- videoDurations,
10
- videoTypography,
11
- videoSafeZone,
12
- scaleSafeZone,
13
- } from "@contractspec/lib.video-gen/design";
14
- \`\`\`
15
-
16
- ## Tokens
17
-
18
- ### Brand Bridge
19
-
20
- \`VideoThemeTokens\` extends the design-system \`ThemeTokens\` with a \`video\` namespace for video-specific colors:
21
-
22
- \`\`\`ts
23
- import { defaultVideoTheme } from "@contractspec/lib.video-gen/design/tokens";
24
-
25
- // Brand tokens (from @contractspec/lib.design-system)
26
- defaultVideoTheme.colors.primary; // brand primary
27
- defaultVideoTheme.colors.accent; // brand accent
28
-
29
- // Video-specific extensions
30
- defaultVideoTheme.video.canvasBackground; // frame background
31
- defaultVideoTheme.video.codeBackground; // "#1e1e2e"
32
- defaultVideoTheme.video.terminalBackground; // "#0d1117"
33
- defaultVideoTheme.video.terminalForeground; // "#c9d1d9"
34
- defaultVideoTheme.video.highlight; // accent color
35
- defaultVideoTheme.video.gradientStart; // primary
36
- defaultVideoTheme.video.gradientEnd; // accent
37
- \`\`\`
38
-
39
- > Do not duplicate brand color values. Import and extend from \`@contractspec/lib.design-system\`.
40
-
41
- ## Motion
42
-
43
- ### Easing Functions
44
-
45
- Pre-configured easing curves for use with Remotion's \`interpolate()\`:
46
-
47
- | Key | Easing | Use Case |
48
- |-----|--------|----------|
49
- | \`entrance\` | \`Easing.out(Easing.exp)\` | Objects appearing |
50
- | \`exit\` | \`Easing.in(Easing.exp)\` | Objects disappearing |
51
- | \`emphasis\` | \`Easing.out(Easing.back(1.4))\` | Drawing attention, bounce |
52
- | \`linear\` | \`Easing.linear\` | Progress bars, typing |
53
- | \`gentle\` | \`Easing.bezier(0.25, 0.1, 0.25, 1)\` | Subtle movements |
54
- | \`spring\` | \`Easing.out(Easing.back(1.7))\` | Playful movements |
55
-
56
- \`\`\`ts
57
- import { interpolate } from "remotion";
58
- import { videoEasing } from "@contractspec/lib.video-gen/design/motion";
59
-
60
- const opacity = interpolate(frame, [0, 15], [0, 1], {
61
- easing: videoEasing.entrance,
62
- extrapolateLeft: "clamp",
63
- extrapolateRight: "clamp",
64
- });
65
- \`\`\`
66
-
67
- ### Durations (frames at 30fps)
68
-
69
- | Key | Frames | Seconds | Use Case |
70
- |-----|--------|---------|----------|
71
- | \`sceneTransition\` | 20 | 0.67s | Between scenes |
72
- | \`textEntrance\` | 15 | 0.5s | Text slide-in |
73
- | \`textExit\` | 12 | 0.4s | Text slide-out |
74
- | \`codeTypingPerChar\` | 2 | 0.07s | Code typing speed |
75
- | \`sectionPause\` | 30 | 1.0s | Pause after concept |
76
- | \`emphasisPause\` | 15 | 0.5s | Brief emphasis |
77
- | \`brandReveal\` | 25 | 0.83s | Logo/watermark |
78
- | \`minScene\` | 60 | 2.0s | Minimum scene length |
79
- | \`shortScene\` | 60 | 2.0s | Short scene |
80
- | \`mediumScene\` | 120 | 4.0s | Medium scene |
81
- | \`longScene\` | 240 | 8.0s | Long scene |
82
-
83
- ### Transition Presets
84
-
85
- \`\`\`ts
86
- import { videoTransitions } from "@contractspec/lib.video-gen/design/motion";
87
-
88
- // { type: "fade", durationInFrames: 20 }
89
- videoTransitions.fade;
90
-
91
- // { type: "slide-left", durationInFrames: 20 }
92
- videoTransitions.slideLeft;
93
- \`\`\`
94
-
95
- ## Typography
96
-
97
- ### Type Scale (1920x1080 baseline)
98
-
99
- | Key | Size | Weight | Use Case |
100
- |-----|------|--------|----------|
101
- | \`title\` | 72px | 700 | Main title |
102
- | \`heading\` | 56px | 600 | Section heading |
103
- | \`subheading\` | 40px | 500 | Subheading |
104
- | \`body\` | 32px | 400 | Body text |
105
- | \`code\` | 28px | 400 | Monospace code |
106
- | \`caption\` | 24px | 400 | Small caption |
107
- | \`label\` | 20px | 600 | Badge / label |
108
-
109
- ### Scaling for Other Formats
110
-
111
- Use \`scaleTypography()\` to proportionally scale for non-landscape formats:
112
-
113
- \`\`\`ts
114
- import {
115
- videoTypography,
116
- scaleTypography,
117
- } from "@contractspec/lib.video-gen/design/typography";
118
-
119
- // Scale heading for 1080x1080 (square)
120
- const squareHeading = scaleTypography(videoTypography.heading, 1080);
121
- // -> fontSize: 32, lineHeight: 1.2, fontWeight: 600
122
- \`\`\`
123
-
124
- ## Layouts
125
-
126
- ### Safe Zones
127
-
128
- Content-safe padding for text within video frames (1920x1080 baseline):
129
-
130
- \`\`\`ts
131
- import {
132
- videoSafeZone,
133
- scaleSafeZone,
134
- } from "@contractspec/lib.video-gen/design/layouts";
135
-
136
- videoSafeZone.horizontal; // 120px
137
- videoSafeZone.vertical; // 80px
138
- videoSafeZone.contentWidth; // 1680px
139
- videoSafeZone.contentHeight; // 920px
140
-
141
- // Scale for portrait (1080x1920)
142
- const portrait = scaleSafeZone({ type: "portrait", width: 1080, height: 1920 });
143
- \`\`\`
144
-
145
- ### Standard Positions
146
-
147
- \`\`\`ts
148
- import { videoPositions } from "@contractspec/lib.video-gen/design/layouts";
149
-
150
- videoPositions.center; // { x: 960, y: 540 }
151
- videoPositions.topLeft; // { x: 120, y: 80 }
152
- videoPositions.bottomRight; // { x: 1800, y: 1000 } -- logos, watermarks
153
- videoPositions.bottomCenter; // { x: 960, y: 960 } -- captions
154
- \`\`\`
155
-
156
- ### Format Variants
157
-
158
- \`\`\`ts
159
- import {
160
- VIDEO_FORMATS,
161
- getAllFormatVariants,
162
- DEFAULT_FPS,
163
- } from "@contractspec/lib.video-gen/design/layouts";
164
-
165
- VIDEO_FORMATS.landscape; // { type: "landscape", width: 1920, height: 1080 }
166
- VIDEO_FORMATS.portrait; // { type: "portrait", width: 1080, height: 1920 }
167
- VIDEO_FORMATS.square; // { type: "square", width: 1080, height: 1080 }
168
-
169
- getAllFormatVariants(); // [landscape, square, portrait]
170
- DEFAULT_FPS; // 30
171
- \`\`\`
172
- `}];f(h);
@@ -1,165 +0,0 @@
1
- import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.video-gen.generators",title:"Video Generation Pipeline",summary:"VideoGenerator, ScenePlanner, and ScriptGenerator -- from content brief to video project with optional LLM enhancement.",kind:"reference",visibility:"public",route:"/docs/video-gen/generators",tags:["video","generators","scene-planner","script-generator","llm","content-pipeline"],owners:["@contractspec/lib.video-gen"],body:`# Video Generation Pipeline
2
-
3
- The generators layer converts a \`VideoBrief\` (content brief + video config) into a fully specified \`VideoProject\` (scene graph ready for rendering). It follows the \`@contractspec/lib.content-gen\` pattern: optional LLM, deterministic fallback.
4
-
5
- \`\`\`
6
- VideoBrief
7
- |
8
- v
9
- ScenePlanner.plan(brief) --> ScenePlan (scenes + durations)
10
- |
11
- v
12
- ScriptGenerator.generate(brief) --> NarrationScript (text + segments)
13
- |
14
- v
15
- VoiceProvider.synthesize(text) --> AudioTrack (optional)
16
- |
17
- v
18
- VideoGenerator.generate(brief) --> VideoProject (complete scene graph)
19
- \`\`\`
20
-
21
- ## VideoGenerator
22
-
23
- The main orchestrator. Wires ScenePlanner, ScriptGenerator, and optional VoiceProvider into a single pipeline.
24
-
25
- \`\`\`ts
26
- import { VideoGenerator } from "@contractspec/lib.video-gen/generators";
27
- import type { VideoBrief } from "@contractspec/lib.video-gen/types";
28
-
29
- // Minimal (deterministic, no LLM, no voice)
30
- const generator = new VideoGenerator({ fps: 30 });
31
-
32
- // Full (with LLM for richer scenes + voice narration)
33
- const generator = new VideoGenerator({
34
- llm: myLLMProvider,
35
- voice: myVoiceProvider,
36
- model: "gpt-4o",
37
- temperature: 0.4,
38
- defaultVoiceId: "rachel",
39
- fps: 30,
40
- });
41
-
42
- const project = await generator.generate(brief);
43
- \`\`\`
44
-
45
- ### Pipeline Steps
46
-
47
- 1. **Scene planning** -- \`ScenePlanner.plan(brief)\` breaks the brief into concrete \`PlannedScene[]\` with composition IDs, props, and durations.
48
- 2. **Script generation** -- If \`brief.narration.enabled\`, \`ScriptGenerator.generate()\` produces a \`NarrationScript\` with per-scene text segments.
49
- 3. **Voice synthesis** -- If a \`VoiceProvider\` is configured and narration is enabled, synthesizes audio via \`voice.synthesize()\`.
50
- 4. **Assembly** -- Combines scenes, audio, and metadata into a \`VideoProject\`.
51
-
52
- ### Constructor Options
53
-
54
- | Option | Type | Default | Description |
55
- |--------|------|---------|-------------|
56
- | \`llm\` | \`LLMProvider\` | -- | Optional LLM for enhanced generation |
57
- | \`voice\` | \`VoiceProvider\` | -- | Optional voice synthesis provider |
58
- | \`model\` | \`string\` | -- | LLM model override |
59
- | \`temperature\` | \`number\` | \`0.4\` | LLM temperature (lower = more deterministic) |
60
- | \`defaultVoiceId\` | \`string\` | -- | Default voice for narration |
61
- | \`fps\` | \`number\` | \`30\` | Frames per second |
62
-
63
- ## ScenePlanner
64
-
65
- Breaks a \`VideoBrief\` into concrete scenes mapped to registered compositions.
66
-
67
- \`\`\`ts
68
- import { ScenePlanner } from "@contractspec/lib.video-gen/generators";
69
-
70
- const planner = new ScenePlanner({ fps: 30 });
71
- const plan = await planner.plan(brief);
72
-
73
- plan.scenes; // PlannedScene[]
74
- plan.estimatedDurationSeconds; // total estimated duration
75
- plan.narrationScript; // combined narration text
76
- \`\`\`
77
-
78
- ### Deterministic Path (no LLM)
79
-
80
- Maps brief sections to \`SocialClip\` compositions:
81
-
82
- | Brief Section | Scene | Duration |
83
- |---------------|-------|----------|
84
- | \`title\` + \`summary\` | Hook / title | 3s |
85
- | \`problems\` | Problem statement | 4s |
86
- | \`solutions\` | Solution showcase | 5s |
87
- | \`metrics\` | Proof / results | 3s |
88
- | \`callToAction\` | CTA | 2s |
89
-
90
- If \`brief.targetDurationSeconds\` is set, all scene durations are scaled proportionally.
91
-
92
- ### LLM-Enhanced Path
93
-
94
- With an \`LLMProvider\`, the planner sends the brief to the LLM and requests a scene breakdown as JSON. The LLM can choose from \`ApiOverview\`, \`SocialClip\`, or \`TerminalDemo\` compositions. Falls back to deterministic on any failure.
95
-
96
- ## ScriptGenerator
97
-
98
- Produces narration text from a \`ContentBrief\` with style control.
99
-
100
- \`\`\`ts
101
- import { ScriptGenerator } from "@contractspec/lib.video-gen/generators";
102
-
103
- const scriptGen = new ScriptGenerator({ temperature: 0.5 });
104
- const script = await scriptGen.generate(brief.content, brief.narration);
105
-
106
- script.fullText; // complete narration
107
- script.segments; // NarrationSegment[] (per-scene text)
108
- script.estimatedDurationSeconds; // at ~150 words/min
109
- script.style; // "professional" | "casual" | "technical"
110
- \`\`\`
111
-
112
- ### Narration Styles
113
-
114
- | Style | Tone |
115
- |-------|------|
116
- | \`professional\` | Clear, authoritative, concise |
117
- | \`casual\` | Friendly, conversational, approachable |
118
- | \`technical\` | Precise, detailed, accurate |
119
-
120
- ### NarrationSegment
121
-
122
- Each segment maps to a scene and provides timing estimates:
123
-
124
- \`\`\`ts
125
- interface NarrationSegment {
126
- sceneId: string; // "intro", "problems", "solutions", "metrics", "cta"
127
- text: string; // narration text for this segment
128
- estimatedDurationSeconds: number; // at ~150 words/min
129
- }
130
- \`\`\`
131
-
132
- ## Input Types
133
-
134
- ### VideoBrief
135
-
136
- \`\`\`ts
137
- interface VideoBrief {
138
- content: ContentBrief; // from @contractspec/lib.content-gen
139
- format: VideoFormat; // landscape, portrait, square, or custom
140
- targetDurationSeconds?: number; // auto-calculated if omitted
141
- narration?: NarrationConfig; // { enabled, voiceId, language, style }
142
- style?: VideoStyleOverrides; // colors, fonts, dark mode
143
- compositionId?: string; // force a specific composition
144
- }
145
- \`\`\`
146
-
147
- ### PlannedScene
148
-
149
- \`\`\`ts
150
- interface PlannedScene {
151
- compositionId: string; // maps to a registered Remotion composition
152
- props: Record<string, unknown>; // input props for the composition
153
- durationInFrames: number; // scene duration
154
- narrationText?: string; // narrator text for this scene
155
- notes?: string; // planning notes (LLM path only)
156
- }
157
- \`\`\`
158
-
159
- ## Guardrails
160
-
161
- - Generators are **stateless** -- no side effects, no caching. Call \`generate()\` / \`plan()\` for each video.
162
- - LLM responses are parsed as JSON; any parse failure falls back to deterministic.
163
- - Temperature defaults are conservative (0.3-0.5) for reproducibility.
164
- - Duration estimates use 150 words/min speaking rate.
165
- `}];f(h);
@@ -1,175 +0,0 @@
1
- import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.video-gen.rendering",title:"Video Rendering & Playback",summary:"LocalRenderer for MP4 output, render configuration, quality presets, DemoPlayer for web embedding, and Remotion Studio setup.",kind:"reference",visibility:"public",route:"/docs/video-gen/rendering",tags:["video","rendering","remotion","player","mp4","quality-presets"],owners:["@contractspec/lib.video-gen"],body:`# Video Rendering & Playback
2
-
3
- The rendering layer wraps \`@remotion/renderer\` for MP4/WebM output and \`@remotion/player\` for interactive web embedding. It implements the \`VideoProvider\` contract from \`@contractspec/lib.contracts-integrations\`.
4
-
5
- ## LocalRenderer
6
-
7
- Renders a \`VideoProject\` to a video file using the local Remotion renderer. Works with **Node.js** and **Bun** (via \`remotionb\`). Bun caveat: SSR scripts may not auto-quit (see [Remotion Bun docs](https://www.remotion.dev/docs/bun)).
8
-
9
- \`\`\`ts
10
- import { LocalRenderer } from "@contractspec/lib.video-gen/renderers/local";
11
-
12
- const renderer = new LocalRenderer({
13
- entryPoint: "./src/remotion/index.ts",
14
- });
15
-
16
- const result = await renderer.render(project, {
17
- outputPath: "out/video.mp4",
18
- codec: "h264",
19
- crf: 18,
20
- });
21
-
22
- result.outputPath; // "out/video.mp4"
23
- result.format; // "mp4"
24
- result.durationSeconds; // total duration
25
- result.fileSizeBytes; // file size
26
- result.dimensions; // { width: 1920, height: 1080 }
27
- \`\`\`
28
-
29
- > **Important**: Import \`LocalRenderer\` from the \`/renderers/local\` subpath, not from the main entry. It dynamically imports \`@remotion/bundler\` and \`@remotion/renderer\` to avoid bundling them in browser builds.
30
-
31
- ### Auto-Variants
32
-
33
- Set \`autoVariants: true\` to generate landscape + square + portrait versions:
34
-
35
- \`\`\`ts
36
- const result = await renderer.render(project, {
37
- outputPath: "out/video.mp4",
38
- autoVariants: true,
39
- });
40
-
41
- result.variants; // [
42
- // { outputPath: "out/video-square.mp4", dimensions: { width: 1080, height: 1080 } },
43
- // { outputPath: "out/video-portrait.mp4", dimensions: { width: 1080, height: 1920 } },
44
- // ]
45
- \`\`\`
46
-
47
- ## Render Configuration
48
-
49
- ### Defaults
50
-
51
- \`\`\`ts
52
- import {
53
- defaultRenderConfig,
54
- resolveRenderConfig,
55
- qualityPresets,
56
- codecFormatMap,
57
- } from "@contractspec/lib.video-gen/renderers/config";
58
-
59
- defaultRenderConfig.codec; // "h264"
60
- defaultRenderConfig.outputFormat; // "mp4"
61
- defaultRenderConfig.crf; // 18
62
- defaultRenderConfig.pixelFormat; // "yuv420p"
63
- \`\`\`
64
-
65
- ### RenderConfig Options
66
-
67
- | Option | Type | Default | Description |
68
- |--------|------|---------|-------------|
69
- | \`outputPath\` | \`string\` | -- | **Required**. Output file path |
70
- | \`codec\` | \`"h264" \\| "h265" \\| "vp8" \\| "vp9"\` | \`"h264"\` | Video codec |
71
- | \`outputFormat\` | \`"mp4" \\| "webm" \\| "gif"\` | \`"mp4"\` | Container format |
72
- | \`crf\` | \`number\` | \`18\` | Constant Rate Factor (lower = better quality) |
73
- | \`pixelFormat\` | \`string\` | \`"yuv420p"\` | Pixel format |
74
- | \`concurrency\` | \`number\` | CPU count | Rendering threads |
75
- | \`autoVariants\` | \`boolean\` | \`false\` | Generate format variants |
76
-
77
- ### Quality Presets
78
-
79
- \`\`\`ts
80
- import { resolveRenderConfig } from "@contractspec/lib.video-gen/renderers/config";
81
-
82
- // Draft (fastest, for previews)
83
- resolveRenderConfig({ outputPath: "out/preview.mp4" }, "draft");
84
- // -> crf: 28, concurrency: 1
85
-
86
- // Standard (balanced)
87
- resolveRenderConfig({ outputPath: "out/video.mp4" }, "standard");
88
- // -> crf: 18
89
-
90
- // High (best quality, for final output)
91
- resolveRenderConfig({ outputPath: "out/final.mp4" }, "high");
92
- // -> crf: 12
93
- \`\`\`
94
-
95
- ### Codec-to-Format Mapping
96
-
97
- | Codec | Format |
98
- |-------|--------|
99
- | \`h264\` | \`mp4\` |
100
- | \`h265\` | \`mp4\` |
101
- | \`vp8\` | \`webm\` |
102
- | \`vp9\` | \`webm\` |
103
-
104
- ## DemoPlayer (Web Embedding)
105
-
106
- Embeddable Remotion Player for interactive video demos in React apps. Wraps \`@remotion/player\` with ContractSpec compositions.
107
-
108
- \`\`\`tsx
109
- import { DemoPlayer } from "@contractspec/lib.video-gen/player";
110
-
111
- <DemoPlayer
112
- compositionId="ApiOverview"
113
- inputProps={{
114
- specName: "CreateUser",
115
- specCode: "export const createUser = defineCommand({...})",
116
- }}
117
- controls
118
- autoPlay
119
- loop
120
- width="100%"
121
- clickToPlay
122
- doubleClickToFullscreen
123
- />
124
- \`\`\`
125
-
126
- ### DemoPlayer Props
127
-
128
- | Prop | Type | Default | Description |
129
- |------|------|---------|-------------|
130
- | \`compositionId\` | \`"ApiOverview" \\| "SocialClip" \\| "TerminalDemo"\` | -- | Composition to play |
131
- | \`inputProps\` | composition props type | -- | Props for the selected composition |
132
- | \`controls\` | \`boolean\` | \`true\` | Show playback controls |
133
- | \`autoPlay\` | \`boolean\` | \`false\` | Auto-play on mount |
134
- | \`loop\` | \`boolean\` | \`false\` | Loop playback |
135
- | \`width\` | \`string \\| number\` | \`"100%"\` | Player width |
136
- | \`height\` | \`string \\| number\` | \`"auto"\` | Player height |
137
- | \`clickToPlay\` | \`boolean\` | \`true\` | Click to toggle playback |
138
- | \`doubleClickToFullscreen\` | \`boolean\` | \`true\` | Double-click for fullscreen |
139
-
140
- > \`@remotion/player\` is a peer dependency. Install it in your app if you use \`DemoPlayer\`.
141
-
142
- ## Remotion Studio
143
-
144
- The \`@contractspec/app.video-studio\` package provides a Remotion Studio entry point for previewing compositions interactively.
145
-
146
- \`\`\`bash
147
- # Start Remotion Studio
148
- bun run dev:video
149
-
150
- # Render a specific composition
151
- bunx remotionb render src/index.ts ApiOverview out/api-overview.mp4
152
-
153
- # Render all compositions
154
- bun run render:all
155
- \`\`\`
156
-
157
- ### Registered Compositions
158
-
159
- | ID | Component | Dimensions | Duration | Description |
160
- |----|-----------|------------|----------|-------------|
161
- | \`ApiOverview\` | \`ApiOverview\` | 1920x1080 | 450 frames (15s) | Homepage API demo |
162
- | \`SocialClip\` | \`SocialClip\` | 1920x1080 | 300 frames (10s) | Landscape social clip |
163
- | \`SocialClipSquare\` | \`SocialClip\` | 1080x1080 | 300 frames (10s) | Square social clip |
164
- | \`SocialClipPortrait\` | \`SocialClip\` | 1080x1920 | 300 frames (10s) | Portrait social clip |
165
- | \`TerminalDemo\` | \`TerminalDemo\` | 1920x1080 | 600 frames (20s) | CLI walkthrough |
166
-
167
- All compositions run at 30fps.
168
-
169
- ## Guardrails
170
-
171
- - \`LocalRenderer\` requires Node.js or Bun -- do not attempt to use it in browser environments. On Bun, SSR scripts may not auto-quit (see [Remotion Bun docs](https://www.remotion.dev/docs/bun)).
172
- - Import \`LocalRenderer\` from the \`/renderers/local\` subpath to avoid bundling \`@remotion/renderer\` in browser builds.
173
- - The \`remotion\` entry point (\`@contractspec/lib.video-gen/remotion\`) is a **side-effect module** that calls \`registerRoot()\`. Only import it from Remotion Studio or render scripts.
174
- - Use quality presets for consistency: \`draft\` for development, \`standard\` for CI, \`high\` for releases.
175
- `}];f(h);
@@ -1,126 +0,0 @@
1
- import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.video-gen.overview",title:"Video Generation Library",summary:"Programmatic video generation with Remotion -- from content brief to rendered MP4 in a single pipeline.",kind:"reference",visibility:"public",route:"/docs/video-gen/overview",tags:["video","remotion","generation","content-pipeline"],owners:["@contractspec/lib.video-gen"],body:`# Video Generation Library
2
-
3
- \`@contractspec/lib.video-gen\` provides **programmatic video generation** using [Remotion](https://remotion.dev). It follows the same generator pattern as \`@contractspec/lib.content-gen\` and consumes provider contracts from \`@contractspec/lib.contracts-integrations/integrations/providers/video\`.
4
-
5
- ## Architecture
6
-
7
- The library is organized into five layers, each buildable and testable independently:
8
-
9
- \`\`\`
10
- Content Brief
11
- |
12
- v
13
- Generators -----> ScenePlanner (brief -> scenes)
14
- | ScriptGenerator (brief -> narration)
15
- | VideoGenerator (orchestrator)
16
- v
17
- Compositions ---> Primitives (AnimatedText, CodeBlock, Terminal, ...)
18
- | Full Compositions (ApiOverview, SocialClip, TerminalDemo)
19
- v
20
- Design ---------> Tokens, Motion, Typography, Layouts
21
- |
22
- v
23
- Renderers ------> LocalRenderer (@remotion/renderer)
24
- DemoPlayer (@remotion/player, web embedding)
25
- \`\`\`
26
-
27
- ### Layer Responsibilities
28
-
29
- | Layer | Import Path | Purpose |
30
- |-------|-------------|---------|
31
- | **Types** | \`@contractspec/lib.video-gen/types\` | VideoBrief, ScenePlan, GeneratedVideo, re-exported contract types |
32
- | **Design** | \`@contractspec/lib.video-gen/design\` | Video-optimized tokens, motion primitives, typography, layouts |
33
- | **Compositions** | \`@contractspec/lib.video-gen/compositions\` | Remotion components (primitives + full compositions) |
34
- | **Generators** | \`@contractspec/lib.video-gen/generators\` | VideoGenerator, ScenePlanner, ScriptGenerator |
35
- | **Renderers** | \`@contractspec/lib.video-gen/renderers\` | LocalRenderer, render config, quality presets |
36
- | **Player** | \`@contractspec/lib.video-gen/player\` | Embeddable DemoPlayer for web apps |
37
- | **Remotion** | \`@contractspec/lib.video-gen/remotion\` | Remotion Studio entry point (registerRoot) |
38
-
39
- ## Getting Started
40
-
41
- ### 1. Generate a video project from a content brief
42
-
43
- \`\`\`ts
44
- import { VideoGenerator } from "@contractspec/lib.video-gen/generators";
45
- import { VIDEO_FORMATS } from "@contractspec/lib.video-gen/types";
46
- import type { VideoBrief } from "@contractspec/lib.video-gen/types";
47
-
48
- const generator = new VideoGenerator({ fps: 30 });
49
-
50
- const brief: VideoBrief = {
51
- content: {
52
- title: "Ship APIs 10x Faster",
53
- summary: "ContractSpec generates everything from a single spec.",
54
- problems: ["Manual API maintenance", "Inconsistent surfaces"],
55
- solutions: ["One spec, every surface", "Safe regeneration"],
56
- callToAction: "Try ContractSpec",
57
- },
58
- format: VIDEO_FORMATS.landscape,
59
- targetDurationSeconds: 30,
60
- };
61
-
62
- const project = await generator.generate(brief);
63
- \`\`\`
64
-
65
- ### 2. Render to MP4
66
-
67
- \`\`\`ts
68
- import { LocalRenderer } from "@contractspec/lib.video-gen/renderers/local";
69
-
70
- const renderer = new LocalRenderer({
71
- entryPoint: "./src/remotion/index.ts",
72
- });
73
-
74
- const result = await renderer.render(project, {
75
- outputPath: "out/video.mp4",
76
- });
77
- \`\`\`
78
-
79
- ### 3. Embed in a web app
80
-
81
- \`\`\`tsx
82
- import { DemoPlayer } from "@contractspec/lib.video-gen/player";
83
-
84
- <DemoPlayer
85
- compositionId="ApiOverview"
86
- inputProps={{ specName: "CreateUser", specCode: "..." }}
87
- controls
88
- autoPlay
89
- loop
90
- />
91
- \`\`\`
92
-
93
- ## Contract Bridge
94
-
95
- The library consumes provider contracts defined in \`@contractspec/lib.contracts-integrations\`:
96
-
97
- | Contract | Purpose |
98
- |----------|---------|
99
- | \`VideoProvider\` | Renderer abstraction (local, Lambda, Cloud Run) |
100
- | \`VideoProject\` | Scene graph with format, fps, audio tracks |
101
- | \`RenderConfig\` / \`RenderResult\` | Codec, quality, output path, dimensions |
102
- | \`CompositionRegistry\` | Metadata for registered Remotion compositions |
103
- | \`VideoFormat\` | Landscape / portrait / square / custom dimensions |
104
-
105
- Types are re-exported from the main entry for convenience:
106
-
107
- \`\`\`ts
108
- import type { VideoProject, RenderConfig } from "@contractspec/lib.video-gen";
109
- \`\`\`
110
-
111
- ## Deterministic by Default
112
-
113
- All generators support two modes:
114
-
115
- - **Without LLM**: Fully deterministic, template-based output. Same brief always produces the same video project.
116
- - **With LLM**: Richer scene planning and narration scripts via an optional \`LLMProvider\`. Falls back to deterministic on any failure.
117
-
118
- This matches the content-gen pattern: \`constructor({ llm? })\` -> \`generate(brief)\`.
119
-
120
- ## Guardrails
121
-
122
- - Compositions must be **deterministic**: same props = same visual output.
123
- - Design tokens bridge from \`@contractspec/lib.design-system\` -- do not duplicate brand values.
124
- - \`LocalRenderer\` works with Node.js and Bun. On Bun, SSR scripts may not auto-quit (see [Remotion Bun docs](https://www.remotion.dev/docs/bun)).
125
- - The \`remotion\` entry point is a side-effect module (calls \`registerRoot\`) -- import it only from Remotion Studio or render scripts.
126
- `}];f(h);