@shotstack/shotstack-canvas 1.0.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.
@@ -0,0 +1,1345 @@
1
+ import { z } from 'zod';
2
+ import { components } from '@shotstack/schemas';
3
+ export { svgAssetSchema, svgGradientStopSchema, svgLinearGradientFillSchema, svgRadialGradientFillSchema, svgShadowSchema, svgShapeSchema, svgSolidFillSchema, svgStrokeSchema, svgTransformSchema } from '@shotstack/schemas/zod';
4
+
5
+ declare const CanvasRichTextAssetSchema: z.ZodObject<{
6
+ type: z.ZodLiteral<"rich-text">;
7
+ text: z.ZodDefault<z.ZodString>;
8
+ width: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
9
+ height: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
+ font: z.ZodOptional<z.ZodObject<{
11
+ stroke: z.ZodOptional<z.ZodObject<{
12
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
13
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
14
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
15
+ }, z.core.$strict>>;
16
+ family: z.ZodDefault<z.ZodString>;
17
+ size: z.ZodDefault<z.ZodNumber>;
18
+ weight: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
19
+ color: z.ZodDefault<z.ZodString>;
20
+ opacity: z.ZodDefault<z.ZodNumber>;
21
+ background: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strict>>;
23
+ style: z.ZodOptional<z.ZodObject<{
24
+ wordSpacing: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
25
+ letterSpacing: z.ZodDefault<z.ZodNumber>;
26
+ lineHeight: z.ZodDefault<z.ZodNumber>;
27
+ textTransform: z.ZodDefault<z.ZodEnum<{
28
+ none: "none";
29
+ uppercase: "uppercase";
30
+ lowercase: "lowercase";
31
+ capitalize: "capitalize";
32
+ }>>;
33
+ textDecoration: z.ZodDefault<z.ZodEnum<{
34
+ none: "none";
35
+ underline: "underline";
36
+ "line-through": "line-through";
37
+ }>>;
38
+ gradient: z.ZodOptional<z.ZodObject<{
39
+ type: z.ZodDefault<z.ZodEnum<{
40
+ linear: "linear";
41
+ radial: "radial";
42
+ }>>;
43
+ angle: z.ZodDefault<z.ZodNumber>;
44
+ stops: z.ZodArray<z.ZodObject<{
45
+ offset: z.ZodNumber;
46
+ color: z.ZodString;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>>;
49
+ }, z.core.$strict>>;
50
+ stroke: z.ZodOptional<z.ZodObject<{
51
+ width: z.ZodDefault<z.ZodNumber>;
52
+ color: z.ZodDefault<z.ZodString>;
53
+ opacity: z.ZodDefault<z.ZodNumber>;
54
+ }, z.core.$strict>>;
55
+ shadow: z.ZodOptional<z.ZodObject<{
56
+ offsetX: z.ZodDefault<z.ZodNumber>;
57
+ offsetY: z.ZodDefault<z.ZodNumber>;
58
+ blur: z.ZodDefault<z.ZodNumber>;
59
+ color: z.ZodDefault<z.ZodString>;
60
+ opacity: z.ZodDefault<z.ZodNumber>;
61
+ }, z.core.$strict>>;
62
+ background: z.ZodOptional<z.ZodObject<{
63
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
64
+ color: z.ZodOptional<z.ZodString>;
65
+ opacity: z.ZodDefault<z.ZodNumber>;
66
+ }, z.core.$strict>>;
67
+ border: z.ZodOptional<z.ZodObject<{
68
+ width: z.ZodDefault<z.ZodNumber>;
69
+ color: z.ZodDefault<z.ZodString>;
70
+ opacity: z.ZodDefault<z.ZodNumber>;
71
+ radius: z.ZodDefault<z.ZodNumber>;
72
+ }, z.core.$strip>>;
73
+ padding: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodObject<{
74
+ top: z.ZodDefault<z.ZodNumber>;
75
+ right: z.ZodDefault<z.ZodNumber>;
76
+ bottom: z.ZodDefault<z.ZodNumber>;
77
+ left: z.ZodDefault<z.ZodNumber>;
78
+ }, z.core.$strip>]>>;
79
+ align: z.ZodOptional<z.ZodObject<{
80
+ horizontal: z.ZodDefault<z.ZodEnum<{
81
+ center: "center";
82
+ right: "right";
83
+ left: "left";
84
+ }>>;
85
+ vertical: z.ZodDefault<z.ZodEnum<{
86
+ top: "top";
87
+ bottom: "bottom";
88
+ middle: "middle";
89
+ }>>;
90
+ }, z.core.$strict>>;
91
+ animation: z.ZodOptional<z.ZodObject<{
92
+ preset: z.ZodEnum<{
93
+ typewriter: "typewriter";
94
+ fadeIn: "fadeIn";
95
+ slideIn: "slideIn";
96
+ shift: "shift";
97
+ ascend: "ascend";
98
+ movingLetters: "movingLetters";
99
+ }>;
100
+ speed: z.ZodDefault<z.ZodNumber>;
101
+ duration: z.ZodOptional<z.ZodNumber>;
102
+ style: z.ZodOptional<z.ZodEnum<{
103
+ character: "character";
104
+ word: "word";
105
+ }>>;
106
+ direction: z.ZodOptional<z.ZodEnum<{
107
+ right: "right";
108
+ left: "left";
109
+ up: "up";
110
+ down: "down";
111
+ }>>;
112
+ }, z.core.$strict>>;
113
+ customFonts: z.ZodOptional<z.ZodArray<z.ZodObject<{
114
+ src: z.ZodString;
115
+ family: z.ZodString;
116
+ weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
117
+ style: z.ZodOptional<z.ZodString>;
118
+ originalFamily: z.ZodOptional<z.ZodString>;
119
+ }, z.core.$strip>>>;
120
+ }, z.core.$strict>;
121
+ type CanvasRichTextAsset = z.infer<typeof CanvasRichTextAssetSchema>;
122
+ declare const CanvasSvgAssetSchema: z.ZodObject<{
123
+ type: z.ZodEnum<{
124
+ svg: "svg";
125
+ }>;
126
+ src: z.ZodOptional<z.ZodString>;
127
+ shape: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
128
+ type: z.ZodEnum<{
129
+ rectangle: "rectangle";
130
+ }>;
131
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
132
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
133
+ cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
134
+ }, z.core.$strict>, z.ZodObject<{
135
+ type: z.ZodEnum<{
136
+ circle: "circle";
137
+ }>;
138
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
139
+ }, z.core.$strict>, z.ZodObject<{
140
+ type: z.ZodEnum<{
141
+ ellipse: "ellipse";
142
+ }>;
143
+ radiusX: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
144
+ radiusY: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
145
+ }, z.core.$strict>, z.ZodObject<{
146
+ type: z.ZodEnum<{
147
+ line: "line";
148
+ }>;
149
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
150
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
151
+ }, z.core.$strict>, z.ZodObject<{
152
+ type: z.ZodEnum<{
153
+ polygon: "polygon";
154
+ }>;
155
+ sides: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
156
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
157
+ }, z.core.$strict>, z.ZodObject<{
158
+ type: z.ZodEnum<{
159
+ star: "star";
160
+ }>;
161
+ points: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
162
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
163
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
164
+ }, z.core.$strict>, z.ZodObject<{
165
+ type: z.ZodEnum<{
166
+ arrow: "arrow";
167
+ }>;
168
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
169
+ headWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
170
+ headLength: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
171
+ shaftWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
172
+ }, z.core.$strict>, z.ZodObject<{
173
+ type: z.ZodEnum<{
174
+ heart: "heart";
175
+ }>;
176
+ size: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
177
+ }, z.core.$strict>, z.ZodObject<{
178
+ type: z.ZodEnum<{
179
+ cross: "cross";
180
+ }>;
181
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
182
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
183
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
184
+ }, z.core.$strict>, z.ZodObject<{
185
+ type: z.ZodEnum<{
186
+ ring: "ring";
187
+ }>;
188
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
189
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
190
+ }, z.core.$strict>, z.ZodObject<{
191
+ type: z.ZodEnum<{
192
+ path: "path";
193
+ }>;
194
+ d: z.ZodString;
195
+ }, z.core.$strict>], "type">>;
196
+ fill: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
197
+ type: z.ZodEnum<{
198
+ solid: "solid";
199
+ }>;
200
+ color: z.ZodDefault<z.ZodString>;
201
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
202
+ }, z.core.$strict>, z.ZodObject<{
203
+ type: z.ZodEnum<{
204
+ linear: "linear";
205
+ }>;
206
+ angle: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
207
+ stops: z.ZodArray<z.ZodObject<{
208
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
209
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
210
+ }, z.core.$strict>>;
211
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
212
+ }, z.core.$strict>, z.ZodObject<{
213
+ type: z.ZodEnum<{
214
+ radial: "radial";
215
+ }>;
216
+ stops: z.ZodArray<z.ZodObject<{
217
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
218
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
219
+ }, z.core.$strict>>;
220
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
221
+ }, z.core.$strict>], "type">>;
222
+ stroke: z.ZodOptional<z.ZodObject<{
223
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
224
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
225
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
226
+ lineCap: z.ZodOptional<z.ZodEnum<{
227
+ butt: "butt";
228
+ round: "round";
229
+ square: "square";
230
+ }>>;
231
+ lineJoin: z.ZodOptional<z.ZodEnum<{
232
+ round: "round";
233
+ miter: "miter";
234
+ bevel: "bevel";
235
+ }>>;
236
+ dashArray: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
237
+ dashOffset: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
238
+ }, z.core.$strict>>;
239
+ shadow: z.ZodOptional<z.ZodObject<{
240
+ offsetX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
241
+ offsetY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
242
+ blur: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
243
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
244
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
245
+ }, z.core.$strict>>;
246
+ transform: z.ZodOptional<z.ZodObject<{
247
+ x: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
248
+ y: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
249
+ rotation: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
250
+ scale: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
251
+ originX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
252
+ originY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
253
+ }, z.core.$strict>>;
254
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
255
+ width: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
256
+ height: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
257
+ }, z.core.$strict>;
258
+ declare const richCaptionAssetSchema: z.ZodObject<{
259
+ type: z.ZodLiteral<"rich-caption">;
260
+ src: z.ZodOptional<z.ZodString>;
261
+ words: z.ZodOptional<z.ZodArray<z.ZodObject<{
262
+ text: z.ZodString;
263
+ start: z.ZodNumber;
264
+ end: z.ZodNumber;
265
+ confidence: z.ZodOptional<z.ZodNumber>;
266
+ }, z.core.$strip>>>;
267
+ font: z.ZodOptional<z.ZodObject<{
268
+ family: z.ZodDefault<z.ZodString>;
269
+ size: z.ZodDefault<z.ZodNumber>;
270
+ weight: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
271
+ color: z.ZodDefault<z.ZodString>;
272
+ opacity: z.ZodDefault<z.ZodNumber>;
273
+ background: z.ZodOptional<z.ZodString>;
274
+ }, z.core.$strip>>;
275
+ style: z.ZodOptional<z.ZodObject<{
276
+ wordSpacing: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
277
+ letterSpacing: z.ZodDefault<z.ZodNumber>;
278
+ lineHeight: z.ZodDefault<z.ZodNumber>;
279
+ textTransform: z.ZodDefault<z.ZodEnum<{
280
+ none: "none";
281
+ uppercase: "uppercase";
282
+ lowercase: "lowercase";
283
+ capitalize: "capitalize";
284
+ }>>;
285
+ textDecoration: z.ZodDefault<z.ZodEnum<{
286
+ none: "none";
287
+ underline: "underline";
288
+ "line-through": "line-through";
289
+ }>>;
290
+ gradient: z.ZodOptional<z.ZodObject<{
291
+ type: z.ZodDefault<z.ZodEnum<{
292
+ linear: "linear";
293
+ radial: "radial";
294
+ }>>;
295
+ angle: z.ZodDefault<z.ZodNumber>;
296
+ stops: z.ZodArray<z.ZodObject<{
297
+ offset: z.ZodNumber;
298
+ color: z.ZodString;
299
+ }, z.core.$strip>>;
300
+ }, z.core.$strip>>;
301
+ }, z.core.$strict>>;
302
+ stroke: z.ZodOptional<z.ZodObject<{
303
+ width: z.ZodDefault<z.ZodNumber>;
304
+ color: z.ZodDefault<z.ZodString>;
305
+ opacity: z.ZodDefault<z.ZodNumber>;
306
+ }, z.core.$strict>>;
307
+ shadow: z.ZodOptional<z.ZodObject<{
308
+ offsetX: z.ZodDefault<z.ZodNumber>;
309
+ offsetY: z.ZodDefault<z.ZodNumber>;
310
+ blur: z.ZodDefault<z.ZodNumber>;
311
+ color: z.ZodDefault<z.ZodString>;
312
+ opacity: z.ZodDefault<z.ZodNumber>;
313
+ }, z.core.$strict>>;
314
+ background: z.ZodOptional<z.ZodObject<{
315
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
316
+ color: z.ZodOptional<z.ZodString>;
317
+ opacity: z.ZodDefault<z.ZodNumber>;
318
+ }, z.core.$strict>>;
319
+ border: z.ZodOptional<z.ZodObject<{
320
+ width: z.ZodDefault<z.ZodNumber>;
321
+ color: z.ZodDefault<z.ZodString>;
322
+ opacity: z.ZodDefault<z.ZodNumber>;
323
+ radius: z.ZodDefault<z.ZodNumber>;
324
+ }, z.core.$strip>>;
325
+ padding: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodObject<{
326
+ top: z.ZodDefault<z.ZodNumber>;
327
+ right: z.ZodDefault<z.ZodNumber>;
328
+ bottom: z.ZodDefault<z.ZodNumber>;
329
+ left: z.ZodDefault<z.ZodNumber>;
330
+ }, z.core.$strip>]>>;
331
+ align: z.ZodOptional<z.ZodObject<{
332
+ horizontal: z.ZodDefault<z.ZodEnum<{
333
+ center: "center";
334
+ right: "right";
335
+ left: "left";
336
+ }>>;
337
+ vertical: z.ZodDefault<z.ZodEnum<{
338
+ top: "top";
339
+ bottom: "bottom";
340
+ middle: "middle";
341
+ }>>;
342
+ }, z.core.$strict>>;
343
+ active: z.ZodOptional<z.ZodObject<{
344
+ font: z.ZodOptional<z.ZodObject<{
345
+ color: z.ZodDefault<z.ZodString>;
346
+ background: z.ZodOptional<z.ZodString>;
347
+ opacity: z.ZodDefault<z.ZodNumber>;
348
+ }, z.core.$strip>>;
349
+ stroke: z.ZodOptional<z.ZodObject<{
350
+ width: z.ZodOptional<z.ZodNumber>;
351
+ color: z.ZodOptional<z.ZodString>;
352
+ opacity: z.ZodOptional<z.ZodNumber>;
353
+ }, z.core.$strip>>;
354
+ scale: z.ZodDefault<z.ZodNumber>;
355
+ }, z.core.$strict>>;
356
+ wordAnimation: z.ZodOptional<z.ZodObject<{
357
+ style: z.ZodDefault<z.ZodEnum<{
358
+ typewriter: "typewriter";
359
+ none: "none";
360
+ karaoke: "karaoke";
361
+ highlight: "highlight";
362
+ pop: "pop";
363
+ fade: "fade";
364
+ slide: "slide";
365
+ bounce: "bounce";
366
+ }>>;
367
+ speed: z.ZodDefault<z.ZodNumber>;
368
+ direction: z.ZodDefault<z.ZodEnum<{
369
+ right: "right";
370
+ left: "left";
371
+ up: "up";
372
+ down: "down";
373
+ }>>;
374
+ }, z.core.$strict>>;
375
+ pauseThreshold: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
376
+ customFonts: z.ZodOptional<z.ZodArray<z.ZodObject<{
377
+ src: z.ZodString;
378
+ family: z.ZodString;
379
+ weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
380
+ style: z.ZodOptional<z.ZodString>;
381
+ originalFamily: z.ZodOptional<z.ZodString>;
382
+ }, z.core.$strip>>>;
383
+ }, z.core.$strip>;
384
+ declare const CanvasRichCaptionAssetSchema: z.ZodObject<{
385
+ type: z.ZodLiteral<"rich-caption">;
386
+ src: z.ZodOptional<z.ZodString>;
387
+ words: z.ZodOptional<z.ZodArray<z.ZodObject<{
388
+ text: z.ZodString;
389
+ start: z.ZodNumber;
390
+ end: z.ZodNumber;
391
+ confidence: z.ZodOptional<z.ZodNumber>;
392
+ }, z.core.$strip>>>;
393
+ font: z.ZodOptional<z.ZodObject<{
394
+ family: z.ZodDefault<z.ZodString>;
395
+ size: z.ZodDefault<z.ZodNumber>;
396
+ weight: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
397
+ color: z.ZodDefault<z.ZodString>;
398
+ opacity: z.ZodDefault<z.ZodNumber>;
399
+ background: z.ZodOptional<z.ZodString>;
400
+ }, z.core.$strip>>;
401
+ style: z.ZodOptional<z.ZodObject<{
402
+ wordSpacing: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
403
+ letterSpacing: z.ZodDefault<z.ZodNumber>;
404
+ lineHeight: z.ZodDefault<z.ZodNumber>;
405
+ textTransform: z.ZodDefault<z.ZodEnum<{
406
+ none: "none";
407
+ uppercase: "uppercase";
408
+ lowercase: "lowercase";
409
+ capitalize: "capitalize";
410
+ }>>;
411
+ textDecoration: z.ZodDefault<z.ZodEnum<{
412
+ none: "none";
413
+ underline: "underline";
414
+ "line-through": "line-through";
415
+ }>>;
416
+ gradient: z.ZodOptional<z.ZodObject<{
417
+ type: z.ZodDefault<z.ZodEnum<{
418
+ linear: "linear";
419
+ radial: "radial";
420
+ }>>;
421
+ angle: z.ZodDefault<z.ZodNumber>;
422
+ stops: z.ZodArray<z.ZodObject<{
423
+ offset: z.ZodNumber;
424
+ color: z.ZodString;
425
+ }, z.core.$strip>>;
426
+ }, z.core.$strip>>;
427
+ }, z.core.$strict>>;
428
+ stroke: z.ZodOptional<z.ZodObject<{
429
+ width: z.ZodDefault<z.ZodNumber>;
430
+ color: z.ZodDefault<z.ZodString>;
431
+ opacity: z.ZodDefault<z.ZodNumber>;
432
+ }, z.core.$strict>>;
433
+ shadow: z.ZodOptional<z.ZodObject<{
434
+ offsetX: z.ZodDefault<z.ZodNumber>;
435
+ offsetY: z.ZodDefault<z.ZodNumber>;
436
+ blur: z.ZodDefault<z.ZodNumber>;
437
+ color: z.ZodDefault<z.ZodString>;
438
+ opacity: z.ZodDefault<z.ZodNumber>;
439
+ }, z.core.$strict>>;
440
+ background: z.ZodOptional<z.ZodObject<{
441
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
442
+ color: z.ZodOptional<z.ZodString>;
443
+ opacity: z.ZodDefault<z.ZodNumber>;
444
+ }, z.core.$strict>>;
445
+ border: z.ZodOptional<z.ZodObject<{
446
+ width: z.ZodDefault<z.ZodNumber>;
447
+ color: z.ZodDefault<z.ZodString>;
448
+ opacity: z.ZodDefault<z.ZodNumber>;
449
+ radius: z.ZodDefault<z.ZodNumber>;
450
+ }, z.core.$strip>>;
451
+ padding: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodObject<{
452
+ top: z.ZodDefault<z.ZodNumber>;
453
+ right: z.ZodDefault<z.ZodNumber>;
454
+ bottom: z.ZodDefault<z.ZodNumber>;
455
+ left: z.ZodDefault<z.ZodNumber>;
456
+ }, z.core.$strip>]>>;
457
+ align: z.ZodOptional<z.ZodObject<{
458
+ horizontal: z.ZodDefault<z.ZodEnum<{
459
+ center: "center";
460
+ right: "right";
461
+ left: "left";
462
+ }>>;
463
+ vertical: z.ZodDefault<z.ZodEnum<{
464
+ top: "top";
465
+ bottom: "bottom";
466
+ middle: "middle";
467
+ }>>;
468
+ }, z.core.$strict>>;
469
+ active: z.ZodOptional<z.ZodObject<{
470
+ font: z.ZodOptional<z.ZodObject<{
471
+ color: z.ZodDefault<z.ZodString>;
472
+ background: z.ZodOptional<z.ZodString>;
473
+ opacity: z.ZodDefault<z.ZodNumber>;
474
+ }, z.core.$strip>>;
475
+ stroke: z.ZodOptional<z.ZodObject<{
476
+ width: z.ZodOptional<z.ZodNumber>;
477
+ color: z.ZodOptional<z.ZodString>;
478
+ opacity: z.ZodOptional<z.ZodNumber>;
479
+ }, z.core.$strip>>;
480
+ scale: z.ZodDefault<z.ZodNumber>;
481
+ }, z.core.$strict>>;
482
+ wordAnimation: z.ZodOptional<z.ZodObject<{
483
+ style: z.ZodDefault<z.ZodEnum<{
484
+ typewriter: "typewriter";
485
+ none: "none";
486
+ karaoke: "karaoke";
487
+ highlight: "highlight";
488
+ pop: "pop";
489
+ fade: "fade";
490
+ slide: "slide";
491
+ bounce: "bounce";
492
+ }>>;
493
+ speed: z.ZodDefault<z.ZodNumber>;
494
+ direction: z.ZodDefault<z.ZodEnum<{
495
+ right: "right";
496
+ left: "left";
497
+ up: "up";
498
+ down: "down";
499
+ }>>;
500
+ }, z.core.$strict>>;
501
+ pauseThreshold: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
502
+ customFonts: z.ZodOptional<z.ZodArray<z.ZodObject<{
503
+ src: z.ZodString;
504
+ family: z.ZodString;
505
+ weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
506
+ style: z.ZodOptional<z.ZodString>;
507
+ originalFamily: z.ZodOptional<z.ZodString>;
508
+ }, z.core.$strip>>>;
509
+ }, z.core.$strip>;
510
+ type CanvasRichCaptionAsset = z.infer<typeof CanvasRichCaptionAssetSchema>;
511
+ type CanvasSvgAsset = z.infer<typeof CanvasSvgAssetSchema>;
512
+
513
+ interface HBBlob {
514
+ destroy(): void;
515
+ }
516
+ interface HBFace {
517
+ destroy(): void;
518
+ upem?: number;
519
+ }
520
+ interface HBFont {
521
+ destroy(): void;
522
+ glyphToPath(glyphId: number): string;
523
+ setScale(xScale: number, yScale: number): void;
524
+ setVariations(variations: string): void;
525
+ }
526
+ interface HBGlyphInfo {
527
+ g: number;
528
+ ax: number;
529
+ ay: number;
530
+ dx: number;
531
+ dy: number;
532
+ cl: number;
533
+ }
534
+ interface HBBuffer {
535
+ addText(text: string): void;
536
+ guessSegmentProperties(): void;
537
+ setDirection(direction: "ltr" | "rtl" | "ttb" | "btt"): void;
538
+ json(): HBGlyphInfo[];
539
+ destroy(): void;
540
+ }
541
+ interface HB {
542
+ createBlob(data: ArrayBuffer): HBBlob;
543
+ createFace(blob: HBBlob, index: number): HBFace;
544
+ createFont(face: HBFace): HBFont;
545
+ createBuffer(): HBBuffer;
546
+ shape(font: HBFont, buffer: HBBuffer): void;
547
+ }
548
+
549
+ type FontDescriptor = {
550
+ family: string;
551
+ weight?: string | number;
552
+ };
553
+ declare class FontRegistry {
554
+ private hb;
555
+ private faces;
556
+ private fonts;
557
+ private blobs;
558
+ private fontkitFonts;
559
+ private fontkitBaseFonts;
560
+ private colorEmojiFonts;
561
+ private colorEmojiFontBytes;
562
+ private registeredCanvasFonts;
563
+ private wasmBaseURL?;
564
+ private initPromise?;
565
+ private emojiFallbackDesc?;
566
+ private static sharedInstance;
567
+ private static refCount;
568
+ private static sharedInitPromise;
569
+ private static fallbackLoader?;
570
+ static setFallbackLoader(loader: (desc: FontDescriptor) => Promise<ArrayBuffer | undefined>): void;
571
+ static getSharedInstance(wasmBaseURL?: string): Promise<FontRegistry>;
572
+ static getRefCount(): number;
573
+ static hasSharedInstance(): boolean;
574
+ release(): void;
575
+ static resetSharedInstance(): void;
576
+ setEmojiFallback(desc: FontDescriptor): void;
577
+ isColorEmojiFont(family: string): boolean;
578
+ getColorEmojiFontBytes(family: string): ArrayBuffer | undefined;
579
+ getColorEmojiFontFamilies(): string[];
580
+ private detectColorEmojiFont;
581
+ constructor(wasmBaseURL?: string);
582
+ init(): Promise<void>;
583
+ private _doInit;
584
+ getHB(): Promise<HB>;
585
+ private key;
586
+ hasRegisteredFace(desc: FontDescriptor): boolean;
587
+ registerFromBytes(bytes: ArrayBuffer, desc: FontDescriptor): Promise<void>;
588
+ private tryFallbackInstall;
589
+ getFont(desc: FontDescriptor): Promise<HBFont>;
590
+ private tryDeriveFromExistingFont;
591
+ getFace(desc: FontDescriptor): Promise<HBFace | undefined>;
592
+ getUnitsPerEm(desc: FontDescriptor): Promise<number>;
593
+ glyphPath(desc: FontDescriptor, glyphId: number): Promise<string>;
594
+ private registerWithCanvas;
595
+ destroy(): void;
596
+ }
597
+
598
+ declare function containsRTLCharacters(text: string): boolean;
599
+ type ParagraphDirection = "ltr" | "rtl";
600
+ declare function detectParagraphDirection(text: string): ParagraphDirection;
601
+ declare function detectParagraphDirectionFromWords(words: string[]): ParagraphDirection;
602
+ declare function reorderWordsForLine(wordTexts: string[], paragraphDirection: ParagraphDirection): number[];
603
+ declare function getVisibleText(text: string, visibleCharacters: number, isRTL: boolean): string;
604
+ declare function mirrorAnimationDirection(direction: "left" | "right" | "up" | "down", isRTL: boolean): "left" | "right" | "up" | "down";
605
+
606
+ interface WordTiming {
607
+ text: string;
608
+ start: number;
609
+ end: number;
610
+ confidence?: number;
611
+ }
612
+ interface CaptionLayoutConfig {
613
+ frameWidth: number;
614
+ frameHeight: number;
615
+ availableWidth: number;
616
+ maxLines: number;
617
+ verticalAlign: "top" | "middle" | "bottom";
618
+ horizontalAlign: "left" | "center" | "right";
619
+ paddingLeft: number;
620
+ fontSize: number;
621
+ fontFamily: string;
622
+ fontWeight: string | number;
623
+ letterSpacing: number;
624
+ wordSpacing: number;
625
+ lineHeight: number;
626
+ textTransform: "none" | "uppercase" | "lowercase" | "capitalize";
627
+ pauseThreshold: number;
628
+ measureTextWidth?: (text: string, font: string) => number;
629
+ }
630
+ interface ShapedWordGlyph {
631
+ id: number;
632
+ xAdvance: number;
633
+ xOffset: number;
634
+ yOffset: number;
635
+ cluster: number;
636
+ }
637
+ interface ShapedWord {
638
+ text: string;
639
+ width: number;
640
+ glyphs: ShapedWordGlyph[];
641
+ isRTL: boolean;
642
+ }
643
+ interface CaptionLine {
644
+ wordIndices: number[];
645
+ x: number;
646
+ y: number;
647
+ width: number;
648
+ height: number;
649
+ }
650
+ interface CaptionGroup {
651
+ wordIndices: number[];
652
+ startTime: number;
653
+ endTime: number;
654
+ lines: CaptionLine[];
655
+ }
656
+ interface PositionedWord {
657
+ wordIndex: number;
658
+ text: string;
659
+ x: number;
660
+ y: number;
661
+ width: number;
662
+ startTime: number;
663
+ endTime: number;
664
+ isRTL: boolean;
665
+ }
666
+ interface CaptionLayout {
667
+ store: WordTimingStore;
668
+ groups: CaptionGroup[];
669
+ shapedWords: ShapedWord[];
670
+ paragraphDirection: ParagraphDirection;
671
+ }
672
+ declare function isRTLText(text: string): boolean;
673
+ declare class WordTimingStore {
674
+ startTimes: Uint32Array;
675
+ endTimes: Uint32Array;
676
+ xPositions: Float32Array;
677
+ yPositions: Float32Array;
678
+ widths: Float32Array;
679
+ words: string[];
680
+ length: number;
681
+ constructor(words: WordTiming[]);
682
+ }
683
+ declare function findWordAtTime(store: WordTimingStore, timeMs: number): number;
684
+ declare function groupWordsByPause(store: WordTimingStore, pauseThreshold?: number): number[][];
685
+ declare function breakIntoLines(wordWidths: number[], maxWidth: number, spaceWidth: number): number[][];
686
+ declare class CaptionLayoutEngine {
687
+ private fontRegistry;
688
+ private cache;
689
+ private layoutEngine;
690
+ constructor(fontRegistry: FontRegistry);
691
+ private measureWord;
692
+ layoutCaption(words: WordTiming[], config: CaptionLayoutConfig): Promise<CaptionLayout>;
693
+ getVisibleWordsAtTime(layout: CaptionLayout, timeMs: number): PositionedWord[];
694
+ getActiveWordAtTime(layout: CaptionLayout, timeMs: number): PositionedWord | null;
695
+ clearCache(): void;
696
+ getCacheStats(): {
697
+ size: number;
698
+ calculatedSize: number;
699
+ };
700
+ }
701
+
702
+ type AnimationStyle = "karaoke" | "highlight" | "pop" | "fade" | "slide" | "bounce" | "typewriter" | "none";
703
+ type AnimationDirection = "left" | "right" | "up" | "down";
704
+ interface WordAnimationConfig {
705
+ style: AnimationStyle;
706
+ speed: number;
707
+ direction: AnimationDirection;
708
+ }
709
+ interface WordAnimationState {
710
+ opacity: number;
711
+ scale: number;
712
+ translateX: number;
713
+ translateY: number;
714
+ fillProgress: number;
715
+ isActive: boolean;
716
+ visibleCharacters: number;
717
+ }
718
+ declare function calculateAnimationStatesForGroup(words: PositionedWord[], currentTime: number, config: WordAnimationConfig, activeScale?: number, fontSize?: number): Map<number, WordAnimationState>;
719
+ declare function getDefaultAnimationConfig(): WordAnimationConfig;
720
+
721
+ type ShotstackRichTextAsset = components["schemas"]["RichTextAsset"];
722
+ type ShotstackSvgAsset = components["schemas"]["SvgAsset"];
723
+ type RGBA = {
724
+ r: number;
725
+ g: number;
726
+ b: number;
727
+ a: number;
728
+ };
729
+ type GradientSpec = {
730
+ kind: "solid";
731
+ color: string;
732
+ opacity: number;
733
+ } | {
734
+ kind: "linear";
735
+ angle: number;
736
+ stops: {
737
+ offset: number;
738
+ color: string;
739
+ }[];
740
+ opacity: number;
741
+ } | {
742
+ kind: "radial";
743
+ stops: {
744
+ offset: number;
745
+ color: string;
746
+ }[];
747
+ opacity: number;
748
+ };
749
+ type StrokeSpec = {
750
+ width: number;
751
+ color: string;
752
+ opacity: number;
753
+ dashArray?: number[];
754
+ lineCap?: "butt" | "round" | "square";
755
+ lineJoin?: "miter" | "round" | "bevel";
756
+ };
757
+ type Point2D = {
758
+ x: number;
759
+ y: number;
760
+ };
761
+ type BoundingBox = {
762
+ x: number;
763
+ y: number;
764
+ w: number;
765
+ h: number;
766
+ };
767
+ type Glyph = {
768
+ id: number;
769
+ xAdvance: number;
770
+ xOffset: number;
771
+ yOffset: number;
772
+ cluster: number;
773
+ char?: string;
774
+ fontDesc?: {
775
+ family: string;
776
+ weight?: string | number;
777
+ };
778
+ isColorEmoji?: boolean;
779
+ };
780
+ type ShapedLine = {
781
+ glyphs: Glyph[];
782
+ width: number;
783
+ y: number;
784
+ isRTL?: boolean;
785
+ };
786
+ type DrawOp = {
787
+ op: "BeginFrame";
788
+ width: number;
789
+ height: number;
790
+ pixelRatio: number;
791
+ clear: boolean;
792
+ bg?: {
793
+ color?: string;
794
+ opacity: number;
795
+ radius: number;
796
+ };
797
+ } | {
798
+ op: "FillPath";
799
+ path: string;
800
+ x: number;
801
+ y: number;
802
+ fill: GradientSpec;
803
+ scale?: number;
804
+ gradientBBox?: BoundingBox;
805
+ isShadow?: boolean;
806
+ } | {
807
+ op: "StrokePath";
808
+ path: string;
809
+ x: number;
810
+ y: number;
811
+ width: number;
812
+ color: string;
813
+ opacity: number;
814
+ scale?: number;
815
+ } | {
816
+ op: "DecorationLine";
817
+ from: {
818
+ x: number;
819
+ y: number;
820
+ };
821
+ to: {
822
+ x: number;
823
+ y: number;
824
+ };
825
+ width: number;
826
+ color: string;
827
+ opacity: number;
828
+ } | {
829
+ op: "Rectangle";
830
+ x: number;
831
+ y: number;
832
+ width: number;
833
+ height: number;
834
+ fill: GradientSpec;
835
+ borderRadius?: number;
836
+ } | {
837
+ op: "RectangleStroke";
838
+ x: number;
839
+ y: number;
840
+ width: number;
841
+ height: number;
842
+ stroke: {
843
+ width: number;
844
+ color: string;
845
+ opacity: number;
846
+ };
847
+ borderRadius?: number;
848
+ } | {
849
+ op: "DrawColorEmoji";
850
+ char: string;
851
+ x: number;
852
+ y: number;
853
+ fontSize: number;
854
+ fontFamily: string;
855
+ } | {
856
+ op: "Ellipse";
857
+ cx: number;
858
+ cy: number;
859
+ rx: number;
860
+ ry: number;
861
+ fill: GradientSpec;
862
+ rotation?: number;
863
+ gradientBBox?: BoundingBox;
864
+ } | {
865
+ op: "EllipseStroke";
866
+ cx: number;
867
+ cy: number;
868
+ rx: number;
869
+ ry: number;
870
+ stroke: StrokeSpec;
871
+ rotation?: number;
872
+ } | {
873
+ op: "Polygon";
874
+ points: Point2D[];
875
+ fill: GradientSpec;
876
+ closed?: boolean;
877
+ gradientBBox?: BoundingBox;
878
+ } | {
879
+ op: "PolygonStroke";
880
+ points: Point2D[];
881
+ stroke: StrokeSpec;
882
+ closed?: boolean;
883
+ } | {
884
+ op: "ShapePath";
885
+ path: string;
886
+ x: number;
887
+ y: number;
888
+ fill: GradientSpec;
889
+ gradientBBox?: BoundingBox;
890
+ } | {
891
+ op: "ShapePathStroke";
892
+ path: string;
893
+ x: number;
894
+ y: number;
895
+ stroke: StrokeSpec;
896
+ } | {
897
+ op: "DrawCaptionWord";
898
+ text: string;
899
+ x: number;
900
+ y: number;
901
+ width: number;
902
+ fontSize: number;
903
+ fontFamily: string;
904
+ fontWeight: string;
905
+ baseColor: string;
906
+ activeColor: string;
907
+ baseOpacity: number;
908
+ activeOpacity: number;
909
+ fillProgress: number;
910
+ transform: {
911
+ scale: number;
912
+ translateX: number;
913
+ translateY: number;
914
+ opacity: number;
915
+ };
916
+ isRTL: boolean;
917
+ visibleCharacters: number;
918
+ letterSpacing?: number;
919
+ stroke?: {
920
+ width: number;
921
+ color: string;
922
+ opacity: number;
923
+ };
924
+ shadow?: {
925
+ offsetX: number;
926
+ offsetY: number;
927
+ blur: number;
928
+ color: string;
929
+ opacity: number;
930
+ };
931
+ background?: {
932
+ color: string;
933
+ opacity: number;
934
+ borderRadius: number;
935
+ padding: number;
936
+ };
937
+ } | {
938
+ op: "DrawCaptionBackground";
939
+ x: number;
940
+ y: number;
941
+ width: number;
942
+ height: number;
943
+ color: string;
944
+ opacity: number;
945
+ borderRadius: number;
946
+ };
947
+ type EngineInit = {
948
+ width: number;
949
+ height: number;
950
+ pixelRatio?: number;
951
+ fps?: number;
952
+ };
953
+ type Renderer = {
954
+ render(ops: DrawOp[]): Promise<void>;
955
+ toPNG?: () => Promise<Buffer>;
956
+ };
957
+ type ValidAsset = CanvasRichTextAsset | CanvasSvgAsset | CanvasRichCaptionAsset;
958
+
959
+ interface VideoGenerationOptions {
960
+ width: number;
961
+ height: number;
962
+ fps: number;
963
+ duration: number;
964
+ outputPath: string;
965
+ pixelRatio?: number;
966
+ hasAlpha?: boolean;
967
+ crf?: number;
968
+ preset?: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow";
969
+ tune?: "film" | "animation" | "grain" | "stillimage" | "psnr" | "ssim" | "fastdecode" | "zerolatency";
970
+ profile?: "baseline" | "main" | "high";
971
+ level?: string;
972
+ pixFmt?: string;
973
+ ffmpegPath?: string;
974
+ bgColor?: string;
975
+ }
976
+
977
+ declare function createNodePainter(opts: {
978
+ width: number;
979
+ height: number;
980
+ pixelRatio: number;
981
+ }): Promise<{
982
+ render(ops: DrawOp[]): Promise<void>;
983
+ toPNG(): Promise<Buffer>;
984
+ toRawRGBA(): {
985
+ data: Uint8ClampedArray;
986
+ width: number;
987
+ height: number;
988
+ };
989
+ getCanvasSize(): {
990
+ width: number;
991
+ height: number;
992
+ };
993
+ }>;
994
+
995
+ type PathCommandType = "M" | "m" | "L" | "l" | "H" | "h" | "V" | "v" | "C" | "c" | "S" | "s" | "Q" | "q" | "T" | "t" | "A" | "a" | "Z" | "z";
996
+ interface MoveToCommand {
997
+ type: "M";
998
+ x: number;
999
+ y: number;
1000
+ }
1001
+ interface LineToCommand {
1002
+ type: "L";
1003
+ x: number;
1004
+ y: number;
1005
+ }
1006
+ interface CubicBezierCommand {
1007
+ type: "C";
1008
+ x1: number;
1009
+ y1: number;
1010
+ x2: number;
1011
+ y2: number;
1012
+ x: number;
1013
+ y: number;
1014
+ }
1015
+ interface QuadraticBezierCommand {
1016
+ type: "Q";
1017
+ x1: number;
1018
+ y1: number;
1019
+ x: number;
1020
+ y: number;
1021
+ }
1022
+ interface ArcCommand {
1023
+ type: "A";
1024
+ rx: number;
1025
+ ry: number;
1026
+ xAxisRotation: number;
1027
+ largeArcFlag: boolean;
1028
+ sweepFlag: boolean;
1029
+ x: number;
1030
+ y: number;
1031
+ }
1032
+ interface ClosePathCommand {
1033
+ type: "Z";
1034
+ }
1035
+ type NormalizedPathCommand = MoveToCommand | LineToCommand | CubicBezierCommand | QuadraticBezierCommand | ClosePathCommand;
1036
+ type ParsedPathCommand = MoveToCommand | LineToCommand | CubicBezierCommand | QuadraticBezierCommand | ArcCommand | ClosePathCommand;
1037
+ declare function parseSvgPath(pathData: string): ParsedPathCommand[];
1038
+ declare function normalizePath(commands: ParsedPathCommand[]): NormalizedPathCommand[];
1039
+ declare function commandsToPathString(commands: NormalizedPathCommand[]): string;
1040
+ declare function normalizePathString(pathData: string): string;
1041
+ declare function arcToCubicBeziers(x1: number, y1: number, rx: number, ry: number, phi: number, largeArc: boolean, sweep: boolean, x2: number, y2: number): CubicBezierCommand[] | LineToCommand[];
1042
+ declare function quadraticToCubic(x0: number, y0: number, qx: number, qy: number, x: number, y: number): CubicBezierCommand;
1043
+
1044
+ interface ResvgRenderOptions {
1045
+ width?: number;
1046
+ height?: number;
1047
+ background?: string;
1048
+ fitTo?: {
1049
+ mode: "original";
1050
+ } | {
1051
+ mode: "width";
1052
+ value: number;
1053
+ } | {
1054
+ mode: "height";
1055
+ value: number;
1056
+ } | {
1057
+ mode: "zoom";
1058
+ value: number;
1059
+ };
1060
+ }
1061
+ interface ResvgRenderResult {
1062
+ png: Buffer;
1063
+ width: number;
1064
+ height: number;
1065
+ }
1066
+ declare function renderSvgToPng(svgString: string, options?: ResvgRenderOptions): Promise<ResvgRenderResult>;
1067
+ declare function shapeToSvgString(asset: CanvasSvgAsset, defaultWidth: number, defaultHeight: number): string;
1068
+ declare function generateShapePathData(shape: NonNullable<CanvasSvgAsset["shape"]>): string;
1069
+ declare function computeSimplePathBounds(d: string): BoundingBox;
1070
+ declare function renderSvgAssetToPng(asset: CanvasSvgAsset, options?: {
1071
+ defaultWidth?: number;
1072
+ defaultHeight?: number;
1073
+ background?: string;
1074
+ }): Promise<ResvgRenderResult>;
1075
+
1076
+ declare const ASCENT_RATIO = 0.8;
1077
+ declare const DESCENT_RATIO = 0.2;
1078
+ declare const WORD_BG_OPACITY = 1;
1079
+ declare const WORD_BG_BORDER_RADIUS = 4;
1080
+ declare const WORD_BG_PADDING_RATIO = 0.12;
1081
+ interface RichCaptionGeneratorConfig {
1082
+ frameWidth: number;
1083
+ frameHeight: number;
1084
+ pixelRatio: number;
1085
+ }
1086
+ interface FontConfig {
1087
+ family: string;
1088
+ size: number;
1089
+ weight: string;
1090
+ baseColor: string;
1091
+ activeColor: string;
1092
+ baseOpacity: number;
1093
+ activeOpacity: number;
1094
+ letterSpacing: number;
1095
+ }
1096
+ interface StrokeConfig {
1097
+ width: number;
1098
+ color: string;
1099
+ opacity: number;
1100
+ }
1101
+ interface ShadowConfig {
1102
+ offsetX: number;
1103
+ offsetY: number;
1104
+ blur: number;
1105
+ color: string;
1106
+ opacity: number;
1107
+ }
1108
+ interface BackgroundConfig {
1109
+ color: string;
1110
+ opacity: number;
1111
+ borderRadius: number;
1112
+ padding: number;
1113
+ }
1114
+ declare function extractCaptionPadding(asset: CanvasRichCaptionAsset): {
1115
+ top: number;
1116
+ right: number;
1117
+ bottom: number;
1118
+ left: number;
1119
+ };
1120
+ declare function generateRichCaptionDrawOps(asset: CanvasRichCaptionAsset, layout: CaptionLayout, frameTimeMs: number, layoutEngine: CaptionLayoutEngine, config: RichCaptionGeneratorConfig): DrawOp[];
1121
+ declare function generateRichCaptionFrame(asset: CanvasRichCaptionAsset, layout: CaptionLayout, frameTimeMs: number, layoutEngine: CaptionLayoutEngine, config: RichCaptionGeneratorConfig): {
1122
+ ops: DrawOp[];
1123
+ visibleWordCount: number;
1124
+ activeWordIndex: number;
1125
+ };
1126
+ declare function createDefaultGeneratorConfig(frameWidth?: number, frameHeight?: number, pixelRatio?: number): RichCaptionGeneratorConfig;
1127
+ declare function isDrawCaptionWordOp(op: DrawOp): op is Extract<DrawOp, {
1128
+ op: "DrawCaptionWord";
1129
+ }>;
1130
+ declare function getDrawCaptionWordOps(ops: DrawOp[]): Extract<DrawOp, {
1131
+ op: "DrawCaptionWord";
1132
+ }>[];
1133
+
1134
+ interface RenderFrame {
1135
+ frameIndex: number;
1136
+ repeatCount: number;
1137
+ timeMs: number;
1138
+ }
1139
+ interface FrameSchedule {
1140
+ renderFrames: RenderFrame[];
1141
+ totalFrames: number;
1142
+ uniqueFrameCount: number;
1143
+ skipRatio: number;
1144
+ }
1145
+ declare function createFrameSchedule(layout: CaptionLayout, durationMs: number, fps: number, animationStyle?: AnimationStyle, speed?: number): FrameSchedule;
1146
+
1147
+ interface RichCaptionRendererOptions {
1148
+ width: number;
1149
+ height: number;
1150
+ pixelRatio?: number;
1151
+ fps?: number;
1152
+ wasmBaseURL?: string;
1153
+ fetchFile?: (pathOrUrl: string) => Promise<ArrayBuffer>;
1154
+ }
1155
+ interface RenderStats {
1156
+ frameCount: number;
1157
+ totalRenderTimeMs: number;
1158
+ averageFrameTimeMs: number;
1159
+ peakMemoryMB: number;
1160
+ cacheHitRate: number;
1161
+ }
1162
+ interface FastVideoOptions {
1163
+ outputPath: string;
1164
+ bgColor?: string;
1165
+ crf?: number;
1166
+ preset?: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow";
1167
+ profile?: "baseline" | "main" | "high";
1168
+ ffmpegPath?: string;
1169
+ }
1170
+ interface FastVideoResult {
1171
+ outputPath: string;
1172
+ totalFrames: number;
1173
+ uniqueFramesRendered: number;
1174
+ skipRatio: number;
1175
+ totalTimeMs: number;
1176
+ renderTimeMs: number;
1177
+ encodeTimeMs: number;
1178
+ realtimeMultiplier: number;
1179
+ }
1180
+ declare class RichCaptionRenderer {
1181
+ private width;
1182
+ private height;
1183
+ private pixelRatio;
1184
+ private fps;
1185
+ private wasmBaseURL?;
1186
+ private fetchFile;
1187
+ private fontRegistry;
1188
+ private layoutEngine;
1189
+ private currentAsset;
1190
+ private currentLayout;
1191
+ private generatorConfig;
1192
+ private frameCount;
1193
+ private totalRenderTimeMs;
1194
+ private peakMemoryMB;
1195
+ private lastMemoryCheckFrame;
1196
+ constructor(options: RichCaptionRendererOptions);
1197
+ initialize(): Promise<void>;
1198
+ registerFont(source: string, desc: {
1199
+ family: string;
1200
+ weight?: string | number;
1201
+ }): Promise<void>;
1202
+ loadAsset(asset: CanvasRichCaptionAsset): Promise<void>;
1203
+ renderFrame(timeMs: number): DrawOp[];
1204
+ generateVideo(outputPath: string, duration: number, options?: Partial<VideoGenerationOptions>): Promise<string>;
1205
+ generateVideoLegacy(outputPath: string, duration: number, options?: Partial<VideoGenerationOptions>): Promise<string>;
1206
+ generateVideoWithChunking(outputPath: string, duration: number, options?: Partial<VideoGenerationOptions>): Promise<string>;
1207
+ getFrameSchedule(duration: number): FrameSchedule;
1208
+ getStats(): RenderStats;
1209
+ resetStats(): void;
1210
+ clearCache(): void;
1211
+ private mapVerticalAlign;
1212
+ private mapHorizontalAlign;
1213
+ private extractAnimationStyle;
1214
+ private extractAnimationSpeed;
1215
+ private logProgress;
1216
+ private logCompletion;
1217
+ private checkMemoryUsage;
1218
+ destroy(): void;
1219
+ }
1220
+ declare function createRichCaptionRenderer(options: RichCaptionRendererOptions): Promise<RichCaptionRenderer>;
1221
+
1222
+ declare function detectSubtitleFormat(content: string): "vtt" | "srt";
1223
+ declare function parseSubtitleToWords(content: string): WordTiming[];
1224
+
1225
+ interface VideoEncoderConfig {
1226
+ width: number;
1227
+ height: number;
1228
+ fps: number;
1229
+ duration: number;
1230
+ bitrate?: number;
1231
+ codec?: "avc" | "hevc";
1232
+ profile?: "baseline" | "main" | "high";
1233
+ hardwareAcceleration?: "prefer-hardware" | "prefer-software" | "no-preference";
1234
+ crf?: number;
1235
+ preset?: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow";
1236
+ hasAlpha?: boolean;
1237
+ }
1238
+ interface VideoEncoderProgress {
1239
+ framesEncoded: number;
1240
+ totalFrames: number;
1241
+ percentage: number;
1242
+ elapsedMs: number;
1243
+ estimatedRemainingMs: number;
1244
+ currentFps: number;
1245
+ }
1246
+ interface IVideoEncoder {
1247
+ configure(config: VideoEncoderConfig): Promise<void>;
1248
+ encodeFrame(frameData: Uint8ClampedArray | ArrayBuffer, frameIndex: number): Promise<void>;
1249
+ flush(): Promise<Uint8Array | Blob>;
1250
+ close(): void;
1251
+ onProgress?: (progress: VideoEncoderProgress) => void;
1252
+ }
1253
+ interface VideoEncoderCapabilities {
1254
+ encoder: string;
1255
+ codec: string;
1256
+ hardwareAccelerated: boolean;
1257
+ supportsH264: boolean;
1258
+ }
1259
+
1260
+ type EncoderType = "webcodecs" | "mediarecorder" | "node-raw";
1261
+ declare function createVideoEncoder(config: VideoEncoderConfig, options?: {
1262
+ platform?: "node" | "web";
1263
+ outputPath?: string;
1264
+ ffmpegPath?: string;
1265
+ canvas?: HTMLCanvasElement | OffscreenCanvas;
1266
+ preferredEncoder?: EncoderType;
1267
+ }): Promise<IVideoEncoder>;
1268
+ declare function isWebCodecsH264Supported(): Promise<boolean>;
1269
+ declare function getEncoderCapabilities(): Promise<VideoEncoderCapabilities>;
1270
+ declare function detectPlatform(): "node" | "web";
1271
+ declare function getEncoderWarning(): string | null;
1272
+
1273
+ declare class NodeRawEncoder implements IVideoEncoder {
1274
+ private ffmpegPath;
1275
+ private ffmpegProcess;
1276
+ private config;
1277
+ private outputPath;
1278
+ private frameCount;
1279
+ private totalFrames;
1280
+ private startTime;
1281
+ private chunks;
1282
+ private outputToMemory;
1283
+ private ffmpegError;
1284
+ private static readonly DRAIN_TIMEOUT_MS;
1285
+ onProgress?: (progress: VideoEncoderProgress) => void;
1286
+ private trySetPath;
1287
+ private initFFmpeg;
1288
+ configure(config: VideoEncoderConfig, options?: {
1289
+ outputPath?: string;
1290
+ ffmpegPath?: string;
1291
+ }): Promise<void>;
1292
+ encodeFrame(frameData: Uint8ClampedArray | ArrayBuffer, _frameIndex: number): Promise<void>;
1293
+ encodeFrameRepeat(frameData: Uint8ClampedArray | ArrayBuffer, repeatCount: number): Promise<void>;
1294
+ flush(): Promise<Uint8Array>;
1295
+ close(): void;
1296
+ private waitForDrain;
1297
+ private toBuffer;
1298
+ private reportProgress;
1299
+ }
1300
+ declare function createNodeRawEncoder(config: VideoEncoderConfig, options?: {
1301
+ outputPath?: string;
1302
+ ffmpegPath?: string;
1303
+ }): Promise<NodeRawEncoder>;
1304
+
1305
+ declare function createTextEngine(opts?: {
1306
+ width?: number;
1307
+ height?: number;
1308
+ pixelRatio?: number;
1309
+ fps?: number;
1310
+ wasmBaseURL?: string;
1311
+ }): Promise<{
1312
+ validate(input: unknown): {
1313
+ value: CanvasRichTextAsset;
1314
+ };
1315
+ registerFontFromFile(path: string, desc: {
1316
+ family: string;
1317
+ weight?: string | number;
1318
+ }): Promise<void>;
1319
+ registerFontFromUrl(url: string, desc: {
1320
+ family: string;
1321
+ weight?: string | number;
1322
+ }): Promise<void>;
1323
+ renderFrame(asset: CanvasRichTextAsset, tSeconds: number, clipDuration?: number): Promise<DrawOp[]>;
1324
+ createRenderer(p: {
1325
+ width?: number;
1326
+ height?: number;
1327
+ pixelRatio?: number;
1328
+ }): Promise<{
1329
+ render(ops: DrawOp[]): Promise<void>;
1330
+ toPNG(): Promise<Buffer>;
1331
+ toRawRGBA(): {
1332
+ data: Uint8ClampedArray;
1333
+ width: number;
1334
+ height: number;
1335
+ };
1336
+ getCanvasSize(): {
1337
+ width: number;
1338
+ height: number;
1339
+ };
1340
+ }>;
1341
+ generateVideo(asset: CanvasRichTextAsset, options: Partial<VideoGenerationOptions>): Promise<string>;
1342
+ destroy(): void;
1343
+ }>;
1344
+
1345
+ export { ASCENT_RATIO, type AnimationDirection, type AnimationStyle, type ArcCommand, type BackgroundConfig, type BoundingBox, type CanvasRichCaptionAsset, CanvasRichCaptionAssetSchema, type CanvasRichTextAsset, CanvasRichTextAssetSchema, type CanvasSvgAsset, CanvasSvgAssetSchema, type CaptionGroup, type CaptionLayout, type CaptionLayoutConfig, CaptionLayoutEngine, type CaptionLine, type ClosePathCommand, type CubicBezierCommand, DESCENT_RATIO, type DrawOp, type EngineInit, type FastVideoOptions, type FastVideoResult, type FontConfig, FontRegistry, type FrameSchedule, type Glyph, type GradientSpec, type IVideoEncoder, type LineToCommand, type MoveToCommand, NodeRawEncoder, type NormalizedPathCommand, type ParagraphDirection, type ParsedPathCommand, type PathCommandType, type Point2D, type PositionedWord, type QuadraticBezierCommand, type RGBA, type RenderFrame, type RenderStats, type Renderer, type ResvgRenderOptions, type ResvgRenderResult, type RichCaptionGeneratorConfig, RichCaptionRenderer, type RichCaptionRendererOptions, type ShadowConfig, type ShapedLine, type ShapedWord, type ShapedWordGlyph, type ShotstackRichTextAsset, type ShotstackSvgAsset, type StrokeConfig, type StrokeSpec, type ValidAsset, type VideoEncoderCapabilities, type VideoEncoderConfig, type VideoEncoderProgress, WORD_BG_BORDER_RADIUS, WORD_BG_OPACITY, WORD_BG_PADDING_RATIO, type WordAnimationConfig, type WordAnimationState, type WordTiming, WordTimingStore, arcToCubicBeziers, breakIntoLines, calculateAnimationStatesForGroup, commandsToPathString, computeSimplePathBounds, containsRTLCharacters, createDefaultGeneratorConfig, createFrameSchedule, createNodePainter, createNodeRawEncoder, createRichCaptionRenderer, createTextEngine, createVideoEncoder, detectParagraphDirection, detectParagraphDirectionFromWords, detectPlatform, detectSubtitleFormat, extractCaptionPadding, findWordAtTime, generateRichCaptionDrawOps, generateRichCaptionFrame, generateShapePathData, getDefaultAnimationConfig, getDrawCaptionWordOps, getEncoderCapabilities, getEncoderWarning, getVisibleText, groupWordsByPause, isDrawCaptionWordOp, isRTLText, isWebCodecsH264Supported, mirrorAnimationDirection, normalizePath, normalizePathString, parseSubtitleToWords, parseSvgPath, quadraticToCubic, renderSvgAssetToPng, renderSvgToPng, reorderWordsForLine, richCaptionAssetSchema, shapeToSvgString };