visualfries 0.1.10120 → 0.3.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 (133) hide show
  1. package/README.md +97 -0
  2. package/bin/visualfries.js +1570 -0
  3. package/dist/DIContainer.d.ts +2 -1
  4. package/dist/DIContainer.js +16 -5
  5. package/dist/SceneBuilder.svelte.d.ts +70 -1
  6. package/dist/SceneBuilder.svelte.js +96 -29
  7. package/dist/agent/audioMixer.d.ts +34 -0
  8. package/dist/agent/audioMixer.js +308 -0
  9. package/dist/agent/broll.d.ts +35 -0
  10. package/dist/agent/broll.js +226 -0
  11. package/dist/agent/capabilities.d.ts +34 -0
  12. package/dist/agent/capabilities.js +246 -0
  13. package/dist/agent/captionScene.d.ts +23 -0
  14. package/dist/agent/captionScene.js +204 -0
  15. package/dist/agent/catalog.d.ts +24 -0
  16. package/dist/agent/catalog.js +67 -0
  17. package/dist/agent/cueFiles.d.ts +54 -0
  18. package/dist/agent/cueFiles.js +219 -0
  19. package/dist/agent/cuePresets.d.ts +7 -0
  20. package/dist/agent/cuePresets.js +50 -0
  21. package/dist/agent/deterministicMedia.d.ts +61 -0
  22. package/dist/agent/deterministicMedia.js +303 -0
  23. package/dist/agent/index.d.ts +18 -0
  24. package/dist/agent/index.js +18 -0
  25. package/dist/agent/inspectScene.d.ts +36 -0
  26. package/dist/agent/inspectScene.js +139 -0
  27. package/dist/agent/localRender.d.ts +82 -0
  28. package/dist/agent/localRender.js +702 -0
  29. package/dist/agent/overlays.d.ts +40 -0
  30. package/dist/agent/overlays.js +325 -0
  31. package/dist/agent/productionPlan.d.ts +131 -0
  32. package/dist/agent/productionPlan.js +322 -0
  33. package/dist/agent/renderPlan.d.ts +27 -0
  34. package/dist/agent/renderPlan.js +68 -0
  35. package/dist/agent/renderRanges.d.ts +24 -0
  36. package/dist/agent/renderRanges.js +73 -0
  37. package/dist/agent/runtimeSupport.d.ts +19 -0
  38. package/dist/agent/runtimeSupport.js +192 -0
  39. package/dist/agent/streamingEncoder.d.ts +31 -0
  40. package/dist/agent/streamingEncoder.js +208 -0
  41. package/dist/agent/transcripts.d.ts +29 -0
  42. package/dist/agent/transcripts.js +146 -0
  43. package/dist/agent/transitions.d.ts +20 -0
  44. package/dist/agent/transitions.js +169 -0
  45. package/dist/animations/PixiAnimationTarget.d.ts +29 -0
  46. package/dist/animations/PixiAnimationTarget.js +63 -0
  47. package/dist/animations/builders/LineHighlighterAnimationBuilder.js +20 -3
  48. package/dist/animations/builders/WordHighlighterAnimationBuilder.js +15 -2
  49. package/dist/browser/browserExport.d.ts +73 -0
  50. package/dist/browser/browserExport.js +180 -0
  51. package/dist/browser/glTransitions.d.ts +37 -0
  52. package/dist/browser/glTransitions.js +261 -0
  53. package/dist/browser/index.d.ts +3 -0
  54. package/dist/browser/index.js +3 -0
  55. package/dist/browser/mediaDecode.d.ts +31 -0
  56. package/dist/browser/mediaDecode.js +152 -0
  57. package/dist/builders/PixiComponentBuilder.d.ts +6 -0
  58. package/dist/builders/PixiComponentBuilder.js +12 -0
  59. package/dist/builders/_ComponentState.svelte.d.ts +7 -5
  60. package/dist/builders/_ComponentState.svelte.js +29 -15
  61. package/dist/builders/html/StyleBuilder.js +9 -8
  62. package/dist/builders/html/TextComponentHtmlBuilder.js +4 -2
  63. package/dist/builders/html/processors/AppearanceStyleProcessor.js +1 -1
  64. package/dist/builders/html/processors/TextAppearanceStyleProcessor.js +7 -0
  65. package/dist/builders/html/processors/TextEffectsStyleProcessor.js +32 -13
  66. package/dist/commands/ReplaceSourceOnTimeCommand.js +9 -1
  67. package/dist/commands/SeekCommand.js +19 -6
  68. package/dist/components/AnimatedGIF.d.ts +3 -0
  69. package/dist/components/AnimatedGIF.js +28 -1
  70. package/dist/components/Component.svelte.d.ts +5 -5
  71. package/dist/components/Component.svelte.js +29 -13
  72. package/dist/components/ComponentContext.svelte.js +68 -23
  73. package/dist/components/hooks/AnimationHook.js +1 -1
  74. package/dist/components/hooks/CanvasFillHook.d.ts +12 -0
  75. package/dist/components/hooks/CanvasFillHook.js +75 -0
  76. package/dist/components/hooks/DeterministicMediaFrameHook.js +3 -0
  77. package/dist/components/hooks/HtmlTextHook.js +11 -3
  78. package/dist/components/hooks/HtmlToCanvasHook.js +8 -25
  79. package/dist/components/hooks/MediaHook.js +172 -47
  80. package/dist/components/hooks/MediaSeekingHook.js +138 -88
  81. package/dist/components/hooks/PixiGifHook.js +4 -4
  82. package/dist/components/hooks/PixiSplitScreenDisplayObjectHook.js +73 -6
  83. package/dist/components/hooks/PixiVideoTextureHook.js +10 -4
  84. package/dist/components/hooks/PixiVisualTransformHook.d.ts +16 -0
  85. package/dist/components/hooks/PixiVisualTransformHook.js +102 -0
  86. package/dist/components/hooks/SubtitlesHook.js +48 -24
  87. package/dist/components/hooks/VerifyMediaHook.js +2 -2
  88. package/dist/directors/ComponentDirector.d.ts +1 -0
  89. package/dist/directors/ComponentDirector.js +41 -8
  90. package/dist/fonts/fontDiscovery.js +12 -1
  91. package/dist/layers/Layer.svelte.d.ts +54 -0
  92. package/dist/layers/Layer.svelte.js +2 -25
  93. package/dist/managers/AppManager.svelte.js +8 -5
  94. package/dist/managers/ComponentsManager.svelte.d.ts +7 -7
  95. package/dist/managers/ComponentsManager.svelte.js +29 -15
  96. package/dist/managers/DeterministicMediaManager.js +38 -3
  97. package/dist/managers/EventManager.js +3 -1
  98. package/dist/managers/LayersManager.svelte.d.ts +54 -0
  99. package/dist/managers/RenderManager.d.ts +5 -0
  100. package/dist/managers/RenderManager.js +67 -21
  101. package/dist/managers/StateManager.svelte.d.ts +56 -0
  102. package/dist/managers/StateManager.svelte.js +60 -58
  103. package/dist/managers/SubtitlesManager.svelte.js +1 -3
  104. package/dist/managers/TimeManager.svelte.d.ts +4 -0
  105. package/dist/managers/TimeManager.svelte.js +23 -7
  106. package/dist/schemas/runtime/deterministic.js +5 -1
  107. package/dist/schemas/runtime/types.d.ts +36 -15
  108. package/dist/schemas/scene/components.d.ts +126 -0
  109. package/dist/schemas/scene/components.js +11 -0
  110. package/dist/schemas/scene/core.d.ts +109 -10
  111. package/dist/schemas/scene/core.js +1 -1
  112. package/dist/utils/mediaWindow.d.ts +13 -0
  113. package/dist/utils/mediaWindow.js +25 -0
  114. package/dist/utils/svgGenerator.js +1 -1
  115. package/dist/utils/timelineWindow.d.ts +2 -0
  116. package/dist/utils/timelineWindow.js +7 -0
  117. package/dist/utils/utils.js +2 -4
  118. package/docs/AGENT_PATTERNS.md +243 -0
  119. package/docs/AGENT_WORKFLOW.md +364 -0
  120. package/docs/AUTHORING_BEST_PRACTICES.md +188 -0
  121. package/docs/AUTHORING_SYSTEM_AUDIT.md +98 -0
  122. package/docs/BROWSER_EXPORT_SPIKE.md +55 -0
  123. package/docs/DETERMINISTIC_RENDERER.md +83 -0
  124. package/docs/NEXT_RELEASE.md +28 -0
  125. package/docs/PROPOSED_VISUALFRIES_SKILL.md +68 -0
  126. package/docs/examples/agent-cues.json +49 -0
  127. package/docs/examples/agent-transcript.json +23 -0
  128. package/docs/examples/agent-transcript.srt +7 -0
  129. package/docs/examples/agent-transcript.vtt +7 -0
  130. package/docs/examples/image-animation.json +87 -0
  131. package/docs/examples/native-text-metric-badge.json +109 -0
  132. package/package.json +133 -100
  133. package/skills/visualfries/SKILL.md +328 -0
@@ -0,0 +1,40 @@
1
+ import { type ComponentInput, type Scene, type SceneInput } from '../schemas/scene/index.js';
2
+ export type AgentTextOverlayStyle = 'pop-label' | 'shock-word' | 'soft-card' | 'hook-punch' | 'proof-pill' | 'danger-crossout' | 'metric-badge' | 'verdict-slam' | 'receipt-metric' | 'micro-proof' | 'cta-card';
3
+ export type AgentTextOverlayCue = {
4
+ id?: string;
5
+ text: string;
6
+ start: number;
7
+ end: number;
8
+ x?: number;
9
+ y?: number;
10
+ width?: number;
11
+ height?: number;
12
+ style?: AgentTextOverlayStyle;
13
+ color?: string;
14
+ backgroundColor?: string;
15
+ fontSize?: number;
16
+ fontFamily?: string;
17
+ fontWeight?: '700' | '800' | '900';
18
+ textTransform?: 'none' | 'uppercase';
19
+ rotation?: number;
20
+ outlineColor?: string;
21
+ outlineSize?: number;
22
+ animated?: boolean;
23
+ };
24
+ export type AddAgentTextOverlaysInput = {
25
+ scene: Scene | SceneInput;
26
+ overlays: AgentTextOverlayCue[];
27
+ layerId?: string;
28
+ layerName?: string;
29
+ layerOrder?: number;
30
+ };
31
+ export type OverlayStyleConfig = Required<Pick<AgentTextOverlayCue, 'x' | 'y' | 'width' | 'height' | 'color' | 'backgroundColor' | 'fontSize' | 'fontFamily' | 'fontWeight' | 'textTransform'>> & {
32
+ radius: number;
33
+ shadowBlur: number;
34
+ rotation: number;
35
+ outlineColor?: string;
36
+ outlineSize?: number;
37
+ };
38
+ export declare function resolveAgentOverlayStyle(style: AgentTextOverlayStyle, scene: Scene): OverlayStyleConfig;
39
+ export declare function createAgentTextOverlayComponent(cue: AgentTextOverlayCue, scene: Scene | SceneInput, index?: number): ComponentInput;
40
+ export declare function addAgentTextOverlays(input: AddAgentTextOverlaysInput): Scene;
@@ -0,0 +1,325 @@
1
+ import { ComponentShape, SceneShape } from '../schemas/scene/index.js';
2
+ export function resolveAgentOverlayStyle(style, scene) {
3
+ const width = scene.settings.width;
4
+ const height = scene.settings.height;
5
+ if (style === 'verdict-slam') {
6
+ return {
7
+ x: Math.round(width * 0.07),
8
+ y: Math.round(height * 0.34),
9
+ width: Math.round(width * 0.86),
10
+ height: Math.round(height * 0.13),
11
+ color: '#FFFFFF',
12
+ backgroundColor: '#ED1939',
13
+ fontSize: Math.round(width * 0.105),
14
+ fontFamily: 'Montserrat',
15
+ fontWeight: '900',
16
+ textTransform: 'uppercase',
17
+ radius: 0,
18
+ shadowBlur: 24,
19
+ rotation: -2,
20
+ outlineColor: '#FFFFFF',
21
+ outlineSize: 1
22
+ };
23
+ }
24
+ if (style === 'receipt-metric') {
25
+ return {
26
+ x: Math.round(width * 0.1),
27
+ y: Math.round(height * 0.58),
28
+ width: Math.round(width * 0.8),
29
+ height: Math.round(height * 0.14),
30
+ color: '#FFFFFF',
31
+ backgroundColor: '#2854D6',
32
+ fontSize: Math.round(width * 0.1),
33
+ fontFamily: 'Montserrat',
34
+ fontWeight: '900',
35
+ textTransform: 'uppercase',
36
+ radius: 0,
37
+ shadowBlur: 22,
38
+ rotation: 0,
39
+ outlineColor: '#FFFFFF',
40
+ outlineSize: 1
41
+ };
42
+ }
43
+ if (style === 'micro-proof') {
44
+ return {
45
+ x: Math.round(width * 0.18),
46
+ y: Math.round(height * 0.76),
47
+ width: Math.round(width * 0.64),
48
+ height: Math.round(height * 0.065),
49
+ color: '#FFFFFF',
50
+ backgroundColor: 'rgba(0, 0, 0, 0.82)',
51
+ fontSize: Math.round(width * 0.045),
52
+ fontFamily: 'Inter',
53
+ fontWeight: '800',
54
+ textTransform: 'none',
55
+ radius: 999,
56
+ shadowBlur: 12,
57
+ rotation: 0
58
+ };
59
+ }
60
+ if (style === 'shock-word') {
61
+ return {
62
+ x: Math.round(width * 0.08),
63
+ y: Math.round(height * 0.3),
64
+ width: Math.round(width * 0.84),
65
+ height: Math.round(height * 0.12),
66
+ color: '#FFDF5A',
67
+ backgroundColor: 'rgba(4, 72, 61, 0.92)',
68
+ fontSize: Math.round(width * 0.11),
69
+ fontFamily: 'Montserrat',
70
+ fontWeight: '900',
71
+ textTransform: 'uppercase',
72
+ radius: 22,
73
+ shadowBlur: 16,
74
+ rotation: 0,
75
+ outlineColor: '#052B26',
76
+ outlineSize: 2
77
+ };
78
+ }
79
+ if (style === 'hook-punch') {
80
+ return {
81
+ x: Math.round(width * 0.07),
82
+ y: Math.round(height * 0.12),
83
+ width: Math.round(width * 0.86),
84
+ height: Math.round(height * 0.105),
85
+ color: '#172337',
86
+ backgroundColor: '#FFC727',
87
+ fontSize: Math.round(width * 0.082),
88
+ fontFamily: 'Montserrat',
89
+ fontWeight: '900',
90
+ textTransform: 'uppercase',
91
+ radius: 0,
92
+ shadowBlur: 18,
93
+ rotation: -1.5,
94
+ outlineColor: '#FFFFFF',
95
+ outlineSize: 1
96
+ };
97
+ }
98
+ if (style === 'proof-pill') {
99
+ return {
100
+ x: Math.round(width * 0.11),
101
+ y: Math.round(height * 0.16),
102
+ width: Math.round(width * 0.78),
103
+ height: Math.round(height * 0.082),
104
+ color: '#EFFFF8',
105
+ backgroundColor: 'rgba(4, 72, 61, 0.92)',
106
+ fontSize: Math.round(width * 0.054),
107
+ fontFamily: 'Inter',
108
+ fontWeight: '900',
109
+ textTransform: 'uppercase',
110
+ radius: 999,
111
+ shadowBlur: 14,
112
+ rotation: 0
113
+ };
114
+ }
115
+ if (style === 'danger-crossout') {
116
+ return {
117
+ x: Math.round(width * 0.09),
118
+ y: Math.round(height * 0.17),
119
+ width: Math.round(width * 0.82),
120
+ height: Math.round(height * 0.1),
121
+ color: '#FFFFFF',
122
+ backgroundColor: 'rgba(165, 30, 45, 0.9)',
123
+ fontSize: Math.round(width * 0.068),
124
+ fontFamily: 'Montserrat',
125
+ fontWeight: '900',
126
+ textTransform: 'uppercase',
127
+ radius: 16,
128
+ shadowBlur: 18,
129
+ rotation: -1
130
+ };
131
+ }
132
+ if (style === 'metric-badge') {
133
+ return {
134
+ x: Math.round(width * 0.1),
135
+ y: Math.round(height * 0.115),
136
+ width: Math.round(width * 0.8),
137
+ height: Math.round(height * 0.13),
138
+ color: '#172337',
139
+ backgroundColor: '#FFC727',
140
+ fontSize: Math.round(width * 0.092),
141
+ fontFamily: 'Montserrat',
142
+ fontWeight: '900',
143
+ textTransform: 'uppercase',
144
+ radius: 0,
145
+ shadowBlur: 18,
146
+ rotation: -2,
147
+ outlineColor: '#FFFFFF',
148
+ outlineSize: 1
149
+ };
150
+ }
151
+ if (style === 'cta-card') {
152
+ return {
153
+ x: Math.round(width * 0.08),
154
+ y: Math.round(height * 0.68),
155
+ width: Math.round(width * 0.84),
156
+ height: Math.round(height * 0.12),
157
+ color: '#F7F7F2',
158
+ backgroundColor: 'rgba(17, 24, 39, 0.82)',
159
+ fontSize: Math.round(width * 0.056),
160
+ fontFamily: 'Inter',
161
+ fontWeight: '900',
162
+ textTransform: 'none',
163
+ radius: 18,
164
+ shadowBlur: 16,
165
+ rotation: 0
166
+ };
167
+ }
168
+ if (style === 'soft-card') {
169
+ return {
170
+ x: Math.round(width * 0.1),
171
+ y: Math.round(height * 0.18),
172
+ width: Math.round(width * 0.8),
173
+ height: Math.round(height * 0.12),
174
+ color: '#F7F7F2',
175
+ backgroundColor: 'rgba(0, 0, 0, 0.58)',
176
+ fontSize: Math.round(width * 0.062),
177
+ fontFamily: 'Inter',
178
+ fontWeight: '800',
179
+ textTransform: 'none',
180
+ radius: 18,
181
+ shadowBlur: 12,
182
+ rotation: 0
183
+ };
184
+ }
185
+ return {
186
+ x: Math.round(width * 0.1),
187
+ y: Math.round(height * 0.2),
188
+ width: Math.round(width * 0.8),
189
+ height: Math.round(height * 0.1),
190
+ color: '#FFFFFF',
191
+ backgroundColor: 'rgba(0, 0, 0, 0.64)',
192
+ fontSize: Math.round(width * 0.074),
193
+ fontFamily: 'Montserrat',
194
+ fontWeight: '900',
195
+ textTransform: 'uppercase',
196
+ radius: 18,
197
+ shadowBlur: 14,
198
+ rotation: 0
199
+ };
200
+ }
201
+ function popAnimation(id, style) {
202
+ const isHardHit = style === 'shock-word' ||
203
+ style === 'hook-punch' ||
204
+ style === 'metric-badge' ||
205
+ style === 'verdict-slam' ||
206
+ style === 'receipt-metric';
207
+ const inDuration = isHardHit ? 0.14 : 0.18;
208
+ const inScale = isHardHit ? 0.72 : 0.84;
209
+ const ease = isHardHit ? 'back.out(2.6)' : 'back.out(1.9)';
210
+ return {
211
+ id: `${id}-pop`,
212
+ name: 'Agent pop in/out',
213
+ animation: {
214
+ id: `${id}-pop-preset`,
215
+ timeline: [
216
+ {
217
+ tweens: [
218
+ {
219
+ method: 'from',
220
+ vars: {
221
+ duration: inDuration,
222
+ scale: inScale,
223
+ opacity: 0,
224
+ ease
225
+ }
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ position: {
231
+ anchor: 'componentEnd',
232
+ alignTween: 'end',
233
+ offset: '0s'
234
+ },
235
+ tweens: [
236
+ {
237
+ method: 'to',
238
+ vars: {
239
+ duration: 0.16,
240
+ scale: 0.94,
241
+ opacity: 0,
242
+ ease: 'power2.in'
243
+ }
244
+ }
245
+ ]
246
+ }
247
+ ]
248
+ }
249
+ };
250
+ }
251
+ export function createAgentTextOverlayComponent(cue, scene, index = 0) {
252
+ const parsedScene = SceneShape.parse(scene);
253
+ const id = cue.id ?? `agent-text-overlay-${index + 1}`;
254
+ const style = cue.style ?? 'pop-label';
255
+ const defaults = resolveAgentOverlayStyle(style, parsedScene);
256
+ const component = {
257
+ id,
258
+ name: `Agent Overlay: ${cue.text}`,
259
+ type: 'TEXT',
260
+ text: cue.text,
261
+ timeline: {
262
+ startAt: cue.start,
263
+ endAt: cue.end
264
+ },
265
+ order: index,
266
+ appearance: {
267
+ x: cue.x ?? defaults.x,
268
+ y: cue.y ?? defaults.y,
269
+ width: cue.width ?? defaults.width,
270
+ height: cue.height ?? defaults.height,
271
+ rotation: cue.rotation ?? defaults.rotation,
272
+ horizontalAlign: 'center',
273
+ verticalAlign: 'center',
274
+ background: {
275
+ enabled: true,
276
+ color: cue.backgroundColor ?? defaults.backgroundColor,
277
+ target: 'wrapper',
278
+ radius: defaults.radius
279
+ },
280
+ text: {
281
+ fontFamily: cue.fontFamily ?? defaults.fontFamily,
282
+ fontSize: { value: cue.fontSize ?? defaults.fontSize, unit: 'px' },
283
+ fontWeight: cue.fontWeight ?? defaults.fontWeight,
284
+ color: cue.color ?? defaults.color,
285
+ textAlign: 'center',
286
+ textTransform: cue.textTransform ?? defaults.textTransform,
287
+ lineHeight: { value: 1.02, unit: 'em' },
288
+ outline: cue.outlineColor || defaults.outlineColor
289
+ ? {
290
+ enabled: true,
291
+ color: cue.outlineColor ?? defaults.outlineColor ?? '#000000',
292
+ size: cue.outlineSize ?? defaults.outlineSize ?? 1,
293
+ opacity: 1,
294
+ style: 'solid'
295
+ }
296
+ : undefined,
297
+ shadow: {
298
+ enabled: true,
299
+ color: '#000000',
300
+ blur: defaults.shadowBlur,
301
+ offsetX: 0,
302
+ offsetY: 4
303
+ }
304
+ }
305
+ },
306
+ animations: {
307
+ enabled: cue.animated !== false,
308
+ list: cue.animated === false ? [] : [popAnimation(id, style)]
309
+ }
310
+ };
311
+ return ComponentShape.parse(component);
312
+ }
313
+ export function addAgentTextOverlays(input) {
314
+ const scene = SceneShape.parse(input.scene);
315
+ const overlayLayer = {
316
+ id: input.layerId ?? 'layer-agent-overlays',
317
+ name: input.layerName ?? 'Agent Overlays',
318
+ order: input.layerOrder ?? 90,
319
+ components: input.overlays.map((cue, index) => createAgentTextOverlayComponent(cue, scene, index))
320
+ };
321
+ return SceneShape.parse({
322
+ ...scene,
323
+ layers: [...scene.layers, overlayLayer]
324
+ });
325
+ }
@@ -0,0 +1,131 @@
1
+ import { z } from 'zod';
2
+ import { type Scene } from '../schemas/scene/index.js';
3
+ export declare const ProductionPlanShape: z.ZodObject<{
4
+ version: z.ZodLiteral<1>;
5
+ id: z.ZodString;
6
+ name: z.ZodOptional<z.ZodString>;
7
+ settings: z.ZodObject<{
8
+ width: z.ZodDefault<z.ZodNumber>;
9
+ height: z.ZodDefault<z.ZodNumber>;
10
+ duration: z.ZodNumber;
11
+ fps: z.ZodDefault<z.ZodNumber>;
12
+ backgroundColor: z.ZodDefault<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ beats: z.ZodArray<z.ZodObject<{
15
+ id: z.ZodString;
16
+ name: z.ZodOptional<z.ZodString>;
17
+ start: z.ZodNumber;
18
+ end: z.ZodNumber;
19
+ media: z.ZodDefault<z.ZodArray<z.ZodObject<{
20
+ id: z.ZodString;
21
+ url: z.ZodString;
22
+ type: z.ZodOptional<z.ZodEnum<{
23
+ VIDEO: "VIDEO";
24
+ GIF: "GIF";
25
+ IMAGE: "IMAGE";
26
+ }>>;
27
+ start: z.ZodNumber;
28
+ end: z.ZodNumber;
29
+ sourceStart: z.ZodOptional<z.ZodNumber>;
30
+ sourceEnd: z.ZodOptional<z.ZodNumber>;
31
+ freezeAt: z.ZodOptional<z.ZodNumber>;
32
+ motion: z.ZodOptional<z.ZodEnum<{
33
+ none: "none";
34
+ "slow-zoom-in": "slow-zoom-in";
35
+ "slow-zoom-out": "slow-zoom-out";
36
+ "drift-up": "drift-up";
37
+ }>>;
38
+ fade: z.ZodOptional<z.ZodNumber>;
39
+ muted: z.ZodOptional<z.ZodBoolean>;
40
+ volume: z.ZodOptional<z.ZodNumber>;
41
+ x: z.ZodOptional<z.ZodNumber>;
42
+ y: z.ZodOptional<z.ZodNumber>;
43
+ width: z.ZodOptional<z.ZodNumber>;
44
+ height: z.ZodOptional<z.ZodNumber>;
45
+ order: z.ZodOptional<z.ZodNumber>;
46
+ }, z.core.$strip>>>;
47
+ overlays: z.ZodDefault<z.ZodArray<z.ZodObject<{
48
+ id: z.ZodOptional<z.ZodString>;
49
+ text: z.ZodString;
50
+ start: z.ZodNumber;
51
+ end: z.ZodNumber;
52
+ style: z.ZodOptional<z.ZodEnum<{
53
+ "pop-label": "pop-label";
54
+ "shock-word": "shock-word";
55
+ "soft-card": "soft-card";
56
+ "hook-punch": "hook-punch";
57
+ "proof-pill": "proof-pill";
58
+ "danger-crossout": "danger-crossout";
59
+ "metric-badge": "metric-badge";
60
+ "cta-card": "cta-card";
61
+ "verdict-slam": "verdict-slam";
62
+ "receipt-metric": "receipt-metric";
63
+ "micro-proof": "micro-proof";
64
+ }>>;
65
+ x: z.ZodOptional<z.ZodNumber>;
66
+ y: z.ZodOptional<z.ZodNumber>;
67
+ width: z.ZodOptional<z.ZodNumber>;
68
+ height: z.ZodOptional<z.ZodNumber>;
69
+ color: z.ZodOptional<z.ZodString>;
70
+ backgroundColor: z.ZodOptional<z.ZodString>;
71
+ fontSize: z.ZodOptional<z.ZodNumber>;
72
+ fontFamily: z.ZodOptional<z.ZodString>;
73
+ fontWeight: z.ZodOptional<z.ZodEnum<{
74
+ 700: "700";
75
+ 800: "800";
76
+ 900: "900";
77
+ }>>;
78
+ textTransform: z.ZodOptional<z.ZodEnum<{
79
+ none: "none";
80
+ uppercase: "uppercase";
81
+ }>>;
82
+ rotation: z.ZodOptional<z.ZodNumber>;
83
+ outlineColor: z.ZodOptional<z.ZodString>;
84
+ outlineSize: z.ZodOptional<z.ZodNumber>;
85
+ animated: z.ZodOptional<z.ZodBoolean>;
86
+ renderAs: z.ZodDefault<z.ZodEnum<{
87
+ TEXT: "TEXT";
88
+ SVG: "SVG";
89
+ }>>;
90
+ }, z.core.$strip>>>;
91
+ }, z.core.$strip>>;
92
+ audio: z.ZodDefault<z.ZodArray<z.ZodObject<{
93
+ id: z.ZodString;
94
+ name: z.ZodOptional<z.ZodString>;
95
+ url: z.ZodString;
96
+ startAt: z.ZodNumber;
97
+ endAt: z.ZodOptional<z.ZodNumber>;
98
+ volume: z.ZodDefault<z.ZodNumber>;
99
+ muted: z.ZodDefault<z.ZodBoolean>;
100
+ }, z.core.$strip>>>;
101
+ transitions: z.ZodDefault<z.ZodArray<z.ZodObject<{
102
+ id: z.ZodOptional<z.ZodString>;
103
+ time: z.ZodNumber;
104
+ duration: z.ZodOptional<z.ZodNumber>;
105
+ style: z.ZodDefault<z.ZodEnum<{
106
+ "dip-to-black": "dip-to-black";
107
+ flash: "flash";
108
+ "swipe-left": "swipe-left";
109
+ "swipe-up": "swipe-up";
110
+ "focus-pull": "focus-pull";
111
+ }>>;
112
+ color: z.ZodOptional<z.ZodString>;
113
+ animated: z.ZodOptional<z.ZodBoolean>;
114
+ }, z.core.$strip>>>;
115
+ qa: z.ZodDefault<z.ZodObject<{
116
+ framesAt: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
117
+ maxLeadingSilence: z.ZodOptional<z.ZodNumber>;
118
+ requiredText: z.ZodDefault<z.ZodArray<z.ZodString>>;
119
+ }, z.core.$strip>>;
120
+ }, z.core.$strip>;
121
+ export type ProductionPlan = z.infer<typeof ProductionPlanShape>;
122
+ export declare function compileProductionPlan(input: {
123
+ plan: unknown;
124
+ planPath?: string;
125
+ generatedAssetsDir?: string;
126
+ }): Promise<{
127
+ scene: Scene;
128
+ plan: ProductionPlan;
129
+ generatedAssets: string[];
130
+ qaFrameIndices: number[];
131
+ }>;