ugcinc-render 1.8.1 → 1.8.3

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.
package/dist/index.d.mts CHANGED
@@ -1,569 +1,8 @@
1
+ import { S as SegmentType, T as TimeValue, R as RelativePositionConfigX, a as RelativePositionConfigY, F as FitMode, B as BorderRadiusConfig, b as TextStyleProperties, D as DynamicCropConfig, I as ImageEditorElement, A as AutoCaptionCompositionProps, C as CaptionOverlayProps, P as PositionResolutionResult } from './index-C5NlUiZT.mjs';
2
+ export { Y as APPLE_EMOJI_FONT, aB as CAPTION_PRESETS, Q as CaptionFontWeight, M as CaptionPage, O as CaptionPosition, N as CaptionPreset, U as CaptionStyle, L as CaptionWord, J as CropAxisConfig, G as CropBoundary, K as CropBounds, aC as DEFAULT_CAPTION_STYLE, p as DIMENSION_PRESETS, o as DimensionPreset, n as DimensionPresetKey, X as FONT_FAMILIES, $ as FONT_URLS, a4 as FitDimensions, c as FontType, d as FontWeight, j as HorizontalAnchor, k as HorizontalSelfAnchor, H as Hyphenation, a6 as IMAGE_DEFAULTS, m as ImageEditorNodeConfig, an as PositionResolutionError, E as SegmentTimelinePosition, a5 as TEXT_DEFAULTS, e as TextAlignment, f as TextDirection, h as TextOverflow, g as TextWrap, q as TimeMode, a7 as VIDEO_DEFAULTS, a8 as VISUAL_DEFAULTS, V as VerticalAlignment, i as VerticalAnchor, l as VerticalSelfAnchor, u as VideoEditorAudioSegment, r as VideoEditorBaseSegment, y as VideoEditorChannel, v as VideoEditorImageSegment, z as VideoEditorNodeConfig, x as VideoEditorSegment, w as VideoEditorTextSegment, t as VideoEditorVideoSegment, s as VideoEditorVisualSegment, W as WordBreak, aa as applyImageDefaults, a9 as applyTextDefaults, ab as applyVideoDefaults, a1 as areFontsLoaded, _ as buildFontString, ai as calculateAutoWidthDimensions, ao as calculateCropBounds, av as calculateEstimatedDuration, a3 as calculateFitDimensions, ad as calculateLineWidth, aw as calculateTimelineContentEnd, aj as canSetAsReference, a2 as debugFontStatus, aq as defaultOffset, ax as formatTime, aA as generateOverlayId, az as generateSegmentId, ar as getBaseSegments, ae as getBorderRadii, aE as getCaptionPresetNames, ak as getDependentElements, Z as getFontFamily, as as getOverlays, al as getReferenceElementX, am as getReferenceElementY, at as getSegmentTimelinePosition, ag as hexToRgba, ap as isDynamicCropEnabled, au as isSegmentVisibleAtTime, aF as isValidCaptionPreset, af as parseHexColor, ay as parseTime, a0 as preloadFonts, aD as resolveCaptionStyle, ah as resolveElementPositions, ac as wrapText } from './index-C5NlUiZT.mjs';
1
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
4
  import React from 'react';
3
5
 
4
- /**
5
- * Base types used throughout the rendering system
6
- */
7
- /**
8
- * Time value - can be absolute (milliseconds) or relative (0-1 percentage)
9
- *
10
- * @example
11
- * // Absolute: 500 milliseconds
12
- * { type: 'absolute', value: 500 }
13
- *
14
- * @example
15
- * // Relative: 50% of total duration
16
- * { type: 'relative', value: 0.5 }
17
- */
18
- interface TimeValue {
19
- type: 'absolute' | 'relative';
20
- value: number;
21
- }
22
- /**
23
- * Border radius configuration for individual corners.
24
- * All values in pixels, default 0 (no rounding).
25
- */
26
- interface BorderRadiusConfig {
27
- /** Top-left corner radius in pixels */
28
- topLeft?: number;
29
- /** Top-right corner radius in pixels */
30
- topRight?: number;
31
- /** Bottom-right corner radius in pixels */
32
- bottomRight?: number;
33
- /** Bottom-left corner radius in pixels */
34
- bottomLeft?: number;
35
- }
36
- /**
37
- * Fit mode for media (images/videos)
38
- * - cover: Fill the area, cropping if necessary
39
- * - contain: Fit within the area, letterboxing if necessary
40
- * - fill: Stretch to fill the area exactly
41
- */
42
- type FitMode = 'cover' | 'contain' | 'fill';
43
- /**
44
- * Segment type identifiers
45
- */
46
- type SegmentType = 'video' | 'image' | 'text' | 'audio' | 'editor';
47
- /**
48
- * Font type identifiers
49
- */
50
- type FontType = 'arial' | 'tiktok' | 'apple';
51
- /**
52
- * Font weight options
53
- */
54
- type FontWeight = 'normal' | 'bold';
55
- /**
56
- * Text alignment options
57
- */
58
- type TextAlignment = 'left' | 'center' | 'right' | 'justify';
59
- /**
60
- * Vertical alignment options
61
- */
62
- type VerticalAlignment = 'top' | 'middle' | 'bottom';
63
- /**
64
- * Text direction
65
- */
66
- type TextDirection = 'ltr' | 'rtl';
67
- /**
68
- * Text wrapping mode
69
- */
70
- type TextWrap = 'word' | 'char' | 'none';
71
- /**
72
- * Word break behavior
73
- */
74
- type WordBreak = 'normal' | 'break-all' | 'break-word';
75
- /**
76
- * Hyphenation mode
77
- */
78
- type Hyphenation = 'none' | 'auto';
79
- /**
80
- * Text overflow behavior
81
- */
82
- type TextOverflow = 'clip' | 'ellipsis';
83
- /**
84
- * Shared text styling properties used by both render and UI text segments.
85
- * This ensures feature parity between image editor and video editor text elements.
86
- */
87
- interface TextStyleProperties {
88
- /** Horizontal alignment (default: 'left') */
89
- alignment?: TextAlignment;
90
- /** Vertical alignment within bounds (default: 'top') */
91
- verticalAlign?: VerticalAlignment;
92
- /** Text direction (default: 'ltr') */
93
- direction?: TextDirection;
94
- /** Inner padding in pixels - uniform for all sides (default: 0) */
95
- padding?: number;
96
- /** Top padding in pixels */
97
- paddingTop?: number;
98
- /** Right padding in pixels */
99
- paddingRight?: number;
100
- /** Bottom padding in pixels */
101
- paddingBottom?: number;
102
- /** Left padding in pixels */
103
- paddingLeft?: number;
104
- /** Extra top padding added when text has 2+ lines */
105
- multiLineExtraPaddingTop?: number;
106
- /** Extra right padding added when text has 2+ lines */
107
- multiLineExtraPaddingRight?: number;
108
- /** Extra bottom padding added when text has 2+ lines */
109
- multiLineExtraPaddingBottom?: number;
110
- /** Extra left padding added when text has 2+ lines */
111
- multiLineExtraPaddingLeft?: number;
112
- /** Font family (default: 'arial') */
113
- fontType?: FontType;
114
- /** Font size in pixels (default: 40) */
115
- fontSize?: number;
116
- /** Font weight (default: 'normal') */
117
- fontWeight?: FontWeight;
118
- /** Line height multiplier (default: 1.2) */
119
- lineHeight?: number;
120
- /** Letter spacing in pixels (default: 0) */
121
- letterSpacing?: number;
122
- /** How text wraps to new lines (default: 'word') */
123
- textWrap?: TextWrap;
124
- /** How words break across lines (default: 'normal') */
125
- wordBreak?: WordBreak;
126
- /** Automatic hyphenation (default: 'none') */
127
- hyphenation?: Hyphenation;
128
- /** Maximum lines (0 = unlimited) (default: 0) */
129
- maxLines?: number;
130
- /** How overflow is handled (default: 'clip') */
131
- textOverflow?: TextOverflow;
132
- /** Ellipsis string for overflow (default: '...') */
133
- ellipsis?: string;
134
- /** Text color (default: '#000000') */
135
- color?: string;
136
- /** Background color in hex format #RRGGBB (default: transparent) */
137
- backgroundColor?: string;
138
- /** Background opacity 0-100 (default: 100) */
139
- backgroundOpacity?: number;
140
- /** Border radius for background box - individual corners (default: 0) */
141
- backgroundBorderRadius?: BorderRadiusConfig;
142
- /** Text outline color (default: none) */
143
- strokeColor?: string;
144
- /** Outline width in pixels (default: 0) */
145
- strokeWidth?: number;
146
- /** When true, box shrinks to fit content (width becomes max width) */
147
- autoWidth?: boolean;
148
- /** Which side the box anchors to when autoWidth is true (default: 'left') */
149
- boxAlign?: 'left' | 'center' | 'right';
150
- }
151
-
152
- /**
153
- * Position and anchor types for relative element positioning
154
- */
155
- /**
156
- * Vertical anchor for Y positioning (parent element)
157
- * Specifies which vertical edge of the reference element to anchor to
158
- */
159
- type VerticalAnchor = 'top' | 'bottom';
160
- /**
161
- * Horizontal anchor for X positioning (parent element)
162
- * Specifies which horizontal edge of the reference element to anchor to
163
- */
164
- type HorizontalAnchor = 'left' | 'right';
165
- /**
166
- * Self anchor for X positioning
167
- * Specifies which horizontal edge of THIS element to use for positioning
168
- */
169
- type HorizontalSelfAnchor = 'left' | 'center' | 'right';
170
- /**
171
- * Self anchor for Y positioning
172
- * Specifies which vertical edge of THIS element to use for positioning
173
- */
174
- type VerticalSelfAnchor = 'top' | 'middle' | 'bottom';
175
- /**
176
- * Relative X position configuration
177
- * When set, the segment's X position is calculated relative to another segment
178
- *
179
- * @example
180
- * // Position this segment to the right of another segment with 10px gap
181
- * { elementId: 'other-element', anchor: 'right', selfAnchor: 'left', offset: 10 }
182
- */
183
- interface RelativePositionConfigX {
184
- /** ID of the segment to position relative to */
185
- elementId: string;
186
- /** Which horizontal edge of the reference segment to anchor to */
187
- anchor: HorizontalAnchor;
188
- /** Which horizontal edge of THIS segment to use (default: opposite of anchor) */
189
- selfAnchor?: HorizontalSelfAnchor;
190
- /** Offset in pixels from the anchor point */
191
- offset: number;
192
- }
193
- /**
194
- * Relative Y position configuration
195
- * When set, the segment's Y position is calculated relative to another segment
196
- *
197
- * @example
198
- * // Position this segment below another segment with a 10px gap
199
- * { elementId: 'message-1', anchor: 'bottom', selfAnchor: 'top', offset: 10 }
200
- */
201
- interface RelativePositionConfigY {
202
- /** ID of the segment to position relative to */
203
- elementId: string;
204
- /** Which vertical edge of the reference segment to anchor to */
205
- anchor: VerticalAnchor;
206
- /** Which vertical edge of THIS segment to use (default: opposite of anchor) */
207
- selfAnchor?: VerticalSelfAnchor;
208
- /** Offset in pixels from the anchor point */
209
- offset: number;
210
- }
211
-
212
- /**
213
- * Dynamic cropping configuration types
214
- *
215
- * Dynamic cropping allows the output dimensions to be calculated
216
- * based on element positions at render time.
217
- */
218
- /**
219
- * Crop boundary - can be static (element ID) or dynamic (input reference)
220
- */
221
- interface CropBoundary {
222
- /** Static: reference a specific element by ID */
223
- elementId?: string;
224
- /** Variable: get element ID from input (creates an input port) */
225
- inputRef?: string;
226
- }
227
- /**
228
- * Configuration for cropping along one axis (vertical = height, horizontal = width)
229
- */
230
- interface CropAxisConfig {
231
- /** Whether cropping is enabled for this axis */
232
- enabled: boolean;
233
- /**
234
- * Crop mode:
235
- * - 'all-elements': Crop to bounding box of all visible elements
236
- * - 'between-elements': Crop between specific boundary elements
237
- */
238
- mode: 'all-elements' | 'between-elements';
239
- /** Top/left element boundary (between-elements mode only) */
240
- startBoundary?: CropBoundary;
241
- /** Bottom/right element boundary (between-elements mode only) */
242
- endBoundary?: CropBoundary;
243
- /** Padding before (top/left) in pixels */
244
- paddingStart?: number;
245
- /** Padding after (bottom/right) in pixels */
246
- paddingEnd?: number;
247
- /** Minimum dimension (prevents cropping too small) */
248
- minSize?: number;
249
- }
250
- /**
251
- * Dynamic crop configuration for image/video editor
252
- */
253
- interface DynamicCropConfig {
254
- /** Crop height based on elements */
255
- vertical?: CropAxisConfig;
256
- /** Crop width based on elements */
257
- horizontal?: CropAxisConfig;
258
- }
259
- /**
260
- * Result of crop bounds calculation
261
- */
262
- interface CropBounds {
263
- /** Left edge of crop area */
264
- x: number;
265
- /** Top edge of crop area */
266
- y: number;
267
- /** Width of cropped output */
268
- width: number;
269
- /** Height of cropped output */
270
- height: number;
271
- }
272
-
273
- /**
274
- * Raw element types for editor input
275
- *
276
- * These types represent the raw configuration that users define in the editor.
277
- * They include relative positioning which gets resolved to absolute positions
278
- * before rendering.
279
- */
280
-
281
- /**
282
- * Dimension preset keys for image editor
283
- */
284
- type DimensionPresetKey = 'tiktok' | 'instagram-square' | 'instagram-post' | 'youtube' | 'twitter' | 'custom';
285
- /**
286
- * Dimension preset configuration
287
- */
288
- interface DimensionPreset {
289
- width: number;
290
- height: number;
291
- label: string;
292
- ratio: string;
293
- }
294
- /**
295
- * Standard dimension presets
296
- */
297
- declare const DIMENSION_PRESETS: Record<Exclude<DimensionPresetKey, 'custom'>, DimensionPreset>;
298
- /**
299
- * Image editor element - a raw image or text layer in the editor
300
- *
301
- * This is the input format that includes relative positioning.
302
- * It gets resolved to absolute positions before being converted to segments.
303
- */
304
- interface ImageEditorElement {
305
- /** Unique element identifier */
306
- id: string;
307
- /** Element type */
308
- type: 'image' | 'text';
309
- /** X position in pixels (may be overridden by relativePositionX) */
310
- x: number;
311
- /** Y position in pixels (may be overridden by relativePositionY) */
312
- y: number;
313
- /** Width in pixels */
314
- width: number;
315
- /** Height in pixels */
316
- height: number;
317
- /** Z-index for layering */
318
- zIndex: number;
319
- /** Rotation in degrees clockwise */
320
- rotation?: number;
321
- /** Whether the element is locked from editing */
322
- locked?: boolean;
323
- /** Relative X positioning config - when set, x is calculated from the reference element */
324
- relativePositionX?: RelativePositionConfigX;
325
- /** Relative Y positioning config - when set, y is calculated from the reference element */
326
- relativePositionY?: RelativePositionConfigY;
327
- /** Text content */
328
- text?: string;
329
- /** Maps to text input port for variable text (e.g., "text_1") */
330
- textInputId?: string;
331
- /** Text color (hex) */
332
- color?: string;
333
- /** Outline width in pixels (0 = no outline) */
334
- outlineWidth?: number;
335
- /** Outline color */
336
- strokeColor?: string;
337
- /** Font family */
338
- font?: FontType;
339
- /** Font size in pixels */
340
- fontSize?: number;
341
- /** Font weight */
342
- fontWeight?: FontWeight;
343
- /** Line height multiplier */
344
- lineHeight?: number;
345
- /** Letter spacing in pixels */
346
- letterSpacing?: number;
347
- /** Horizontal text alignment */
348
- textAlign?: TextAlignment;
349
- /** Vertical text alignment within bounds */
350
- verticalAlign?: VerticalAlignment;
351
- /** Background color for text box (hex) */
352
- backgroundColor?: string;
353
- /** Background opacity 0-100 */
354
- backgroundOpacity?: number;
355
- /** Corner radius for background box */
356
- backgroundBorderRadius?: BorderRadiusConfig;
357
- paddingTop?: number;
358
- paddingRight?: number;
359
- paddingBottom?: number;
360
- paddingLeft?: number;
361
- multiLineExtraPaddingTop?: number;
362
- multiLineExtraPaddingRight?: number;
363
- multiLineExtraPaddingBottom?: number;
364
- multiLineExtraPaddingLeft?: number;
365
- /** When true, box shrinks to fit content (width becomes max width) */
366
- autoWidth?: boolean;
367
- /** Which side the box anchors to when autoWidth is true */
368
- boxAlign?: 'left' | 'center' | 'right';
369
- /** Maps to input port (e.g., "image_1", "image_2") */
370
- inputId?: string;
371
- /** How the image fits its container */
372
- fit?: FitMode;
373
- /** Opacity percentage 0-100 */
374
- opacity?: number;
375
- /** Corner radius - single number for all corners, or object for individual */
376
- borderRadius?: number | BorderRadiusConfig;
377
- }
378
- /**
379
- * Image editor node configuration
380
- *
381
- * This is the complete configuration for an image editor node,
382
- * including canvas dimensions, elements, and crop settings.
383
- */
384
- interface ImageEditorNodeConfig {
385
- /** Canvas width in pixels */
386
- width: number;
387
- /** Canvas height in pixels */
388
- height: number;
389
- /** Aspect ratio string (e.g., "9:16") */
390
- aspectRatio: string;
391
- /** Dimension preset key */
392
- dimensionPreset: DimensionPresetKey;
393
- /** Elements to render */
394
- elements: ImageEditorElement[];
395
- /** Background type: 'image' for image input, 'color' for solid color */
396
- backgroundType?: 'image' | 'color';
397
- /** Background color (hex) when backgroundType is 'color' */
398
- backgroundColor?: string;
399
- /** How the background image fits the canvas */
400
- backgroundFit?: FitMode;
401
- /** Cached background image URL for consistent preview */
402
- previewBackgroundUrl?: string;
403
- /** Cached image URLs for image elements (keyed by inputId) */
404
- previewImageUrls?: Record<string, string>;
405
- /** Cached text values for text elements (keyed by textInputId) */
406
- previewTextValues?: Record<string, string>;
407
- /** Dynamic cropping configuration */
408
- dynamicCrop?: DynamicCropConfig;
409
- }
410
-
411
- /**
412
- * Video editor types for the WEBAPP UI
413
- *
414
- * These types include UI-only fields (marked with comments).
415
- * The renderer uses types from editor.ts and segment.ts instead.
416
- *
417
- * UI-only fields are stripped before sending to renderer:
418
- * - timeMode: UI helper for displaying timing mode
419
- * - inputRef/textInputRef: Resolved to source/text before rendering
420
- * - dimensionPreset: Renderer uses width/height directly
421
- * - previewUrls/previewTextValues: Only for UI preview
422
- */
423
-
424
- /**
425
- * UI helper for timing mode - not sent to renderer
426
- */
427
- type TimeMode = 'fixed' | 'flexible';
428
- /**
429
- * Base properties for all video editor segments (UI)
430
- */
431
- interface VideoEditorBaseSegment {
432
- /** Unique segment identifier */
433
- id: string;
434
- /** Order in the channel (0-based) */
435
- order: number;
436
- /** Time offset from previous segment or absolute position */
437
- offset: TimeValue;
438
- /** Segment duration - required for sequential playback */
439
- duration?: TimeValue;
440
- /** Trim from start in milliseconds */
441
- startTrim?: number;
442
- /** Trim from end in milliseconds */
443
- endTrim?: number;
444
- /** UI-only: reference to input for dynamic start trim value - resolved to startTrim before rendering */
445
- startTrimInputRef?: string;
446
- /** UI-only: reference to input for dynamic end trim value - resolved to endTrim before rendering */
447
- endTrimInputRef?: string;
448
- /** UI-only: helper for timing mode display - stripped before rendering */
449
- timeMode?: TimeMode;
450
- /** Parent segment ID for overlays */
451
- parentId?: string;
452
- /** Relative start (0-1) within parent for overlays */
453
- relativeStart?: number;
454
- /** Relative end (0-1) within parent for overlays */
455
- relativeEnd?: number;
456
- /** Fade-in duration in milliseconds */
457
- fadeIn?: number;
458
- }
459
- /**
460
- * Base properties for visual segments
461
- */
462
- interface VideoEditorVisualSegment extends VideoEditorBaseSegment {
463
- xOffset: number;
464
- yOffset: number;
465
- width: number;
466
- height: number;
467
- zIndex?: number;
468
- scale?: number;
469
- rotation?: number;
470
- opacity?: number;
471
- }
472
- /**
473
- * Video segment (UI)
474
- */
475
- interface VideoEditorVideoSegment extends VideoEditorVisualSegment {
476
- type: 'video';
477
- /** UI-only: reference to input node - resolved to source before rendering */
478
- inputRef?: string;
479
- /** Actual source URL (set after inputRef is resolved) */
480
- source?: string;
481
- fit?: FitMode;
482
- speed?: number;
483
- volume?: number;
484
- borderRadius?: number | BorderRadiusConfig;
485
- }
486
- /**
487
- * Audio segment (UI)
488
- */
489
- interface VideoEditorAudioSegment extends VideoEditorBaseSegment {
490
- type: 'audio';
491
- /** UI-only: reference to input node - resolved to source before rendering */
492
- inputRef?: string;
493
- /** Actual source URL (set after inputRef is resolved) */
494
- source?: string;
495
- volume?: number;
496
- }
497
- /**
498
- * Image segment (UI)
499
- */
500
- interface VideoEditorImageSegment extends VideoEditorVisualSegment {
501
- type: 'image';
502
- /** UI-only: reference to input node - resolved to source before rendering */
503
- inputRef?: string;
504
- /** Actual source URL (set after inputRef is resolved) */
505
- source?: string;
506
- fit?: FitMode;
507
- loop?: boolean;
508
- borderRadius?: number | BorderRadiusConfig;
509
- }
510
- /**
511
- * Text segment (UI)
512
- *
513
- * Extends TextStyleProperties which contains all shared text styling options.
514
- * This ensures feature parity between image editor and video editor text elements.
515
- */
516
- interface VideoEditorTextSegment extends VideoEditorVisualSegment, TextStyleProperties {
517
- type: 'text';
518
- /** UI-only: reference to text input - resolved to text before rendering */
519
- textInputRef?: string;
520
- /** Actual text content (set after textInputRef is resolved) */
521
- text?: string;
522
- }
523
- /**
524
- * Union of all video editor segment types
525
- */
526
- type VideoEditorSegment = VideoEditorVideoSegment | VideoEditorAudioSegment | VideoEditorImageSegment | VideoEditorTextSegment;
527
- /**
528
- * Video editor channel
529
- */
530
- interface VideoEditorChannel {
531
- id: string;
532
- name: string;
533
- segments: VideoEditorSegment[];
534
- }
535
- /**
536
- * Video editor node configuration for WEBAPP UI
537
- *
538
- * Duration is NOT stored - it's calculated from segment durations.
539
- * dimensionPreset, previewUrls, previewTextValues are UI-only.
540
- */
541
- interface VideoEditorNodeConfig {
542
- /** Canvas width in pixels */
543
- width: number;
544
- /** Canvas height in pixels */
545
- height: number;
546
- /** Frames per second */
547
- fps: number;
548
- /** UI-only: dimension preset selector */
549
- dimensionPreset: DimensionPresetKey;
550
- /** Channels containing segments */
551
- channels: VideoEditorChannel[];
552
- /** UI-only: preview URLs for displaying in editor */
553
- previewUrls?: Record<string, string>;
554
- /** UI-only: preview text values for displaying in editor */
555
- previewTextValues?: Record<string, string>;
556
- }
557
- /**
558
- * Segment position on timeline (calculated from segment timing properties)
559
- */
560
- interface SegmentTimelinePosition {
561
- /** Start time in milliseconds */
562
- startMs: number;
563
- /** Duration in milliseconds */
564
- durationMs: number;
565
- }
566
-
567
6
  /**
568
7
  * Segment types for the rendering system
569
8
  *
@@ -1071,112 +510,6 @@ declare function isDeduplicationLevel(input: DeduplicationInput): input is Dedup
1071
510
  */
1072
511
  declare function resolveDeduplicationConfig(input: DeduplicationInput): DeduplicationConfig;
1073
512
 
1074
- /**
1075
- * Caption types for auto-captioning functionality
1076
- *
1077
- * These types are used by both the CaptionOverlay component (client + server)
1078
- * and the AutoCaptionComposition for rendering captioned videos.
1079
- */
1080
- /**
1081
- * Caption word with timing information from transcription
1082
- */
1083
- interface CaptionWord {
1084
- /** The word text */
1085
- word: string;
1086
- /** Start time in milliseconds */
1087
- startMs: number;
1088
- /** End time in milliseconds */
1089
- endMs: number;
1090
- }
1091
- /**
1092
- * Caption page - a group of words displayed together
1093
- */
1094
- interface CaptionPage {
1095
- /** Words in this page */
1096
- words: CaptionWord[];
1097
- /** Start time of first word in ms */
1098
- startMs: number;
1099
- /** End time of last word in ms */
1100
- endMs: number;
1101
- }
1102
- /**
1103
- * Caption style preset names
1104
- */
1105
- type CaptionPreset = 'hormozi' | 'minimal' | 'bold-pop' | 'clean' | 'neon';
1106
- /**
1107
- * Caption vertical position on screen
1108
- */
1109
- type CaptionPosition = 'top' | 'center' | 'bottom';
1110
- /**
1111
- * Caption font weight options
1112
- */
1113
- type CaptionFontWeight = 'normal' | 'bold' | 'black';
1114
- /**
1115
- * Full caption style configuration
1116
- */
1117
- interface CaptionStyle {
1118
- /** Preset name (if used, provides defaults for other fields) */
1119
- preset?: CaptionPreset;
1120
- /** Google Font name (e.g., 'Montserrat', 'Inter') */
1121
- fontName: string;
1122
- /** Font size in pixels (relative to 1920p height) */
1123
- fontSize: number;
1124
- /** Font weight */
1125
- fontWeight: CaptionFontWeight;
1126
- /** Text color for inactive words */
1127
- fontColor: string;
1128
- /** Text color for the currently active/highlighted word */
1129
- highlightColor: string;
1130
- /** Stroke/outline color */
1131
- strokeColor: string;
1132
- /** Stroke width in pixels */
1133
- strokeWidth: number;
1134
- /** Background color (hex) - omit for transparent */
1135
- backgroundColor?: string;
1136
- /** Background opacity (0-1) */
1137
- backgroundOpacity?: number;
1138
- /** Background border radius in pixels */
1139
- backgroundBorderRadius?: number;
1140
- /** Vertical position on screen */
1141
- position: CaptionPosition;
1142
- /** Vertical offset in pixels from position edge */
1143
- yOffset: number;
1144
- /** Max width as percentage of video width (0-100) */
1145
- maxWidth: number;
1146
- /** Enable bounce/scale animation on active word */
1147
- enableAnimation: boolean;
1148
- /** Maximum words per caption page/screen */
1149
- wordsPerPage: number;
1150
- }
1151
- /**
1152
- * Props for AutoCaptionComposition
1153
- */
1154
- interface AutoCaptionCompositionProps {
1155
- /** Video source URL */
1156
- videoUrl: string;
1157
- /** Video width in pixels */
1158
- width: number;
1159
- /** Video height in pixels */
1160
- height: number;
1161
- /** Video duration in milliseconds */
1162
- durationMs: number;
1163
- /** Caption words with timing */
1164
- captions: CaptionWord[];
1165
- /** Caption styling configuration */
1166
- style: CaptionStyle;
1167
- }
1168
- /**
1169
- * Props for CaptionOverlay component
1170
- */
1171
- interface CaptionOverlayProps {
1172
- /** Caption words with timing */
1173
- captions: CaptionWord[];
1174
- /** Caption styling configuration */
1175
- style: CaptionStyle;
1176
- /** Override current time for preview mode (ms) */
1177
- previewTimeMs?: number;
1178
- }
1179
-
1180
513
  interface ImageEditorCompositionProps {
1181
514
  /** The editor configuration to render (legacy format with pre-resolved segments) */
1182
515
  config?: ImageEditorConfig;
@@ -1357,401 +690,6 @@ declare function VideoElement({ segment, src, startFrame, durationInFrames, scal
1357
690
  */
1358
691
  declare function CaptionOverlay({ captions, style, previewTimeMs }: CaptionOverlayProps): react_jsx_runtime.JSX.Element | null;
1359
692
 
1360
- /**
1361
- * Font utilities for the rendering system
1362
- */
1363
-
1364
- /**
1365
- * Apple Color Emoji font name - used as fallback for emoji characters
1366
- */
1367
- declare const APPLE_EMOJI_FONT = "\"Apple Color Emoji\"";
1368
- /**
1369
- * Font family CSS strings for each font type
1370
- * These match the fonts registered in the rendering system
1371
- * Apple Color Emoji is added as a fallback for consistent emoji rendering
1372
- */
1373
- declare const FONT_FAMILIES: Record<FontType, string>;
1374
- /**
1375
- * Get the CSS font family string for a font type
1376
- */
1377
- declare function getFontFamily(fontType: FontType): string;
1378
- /**
1379
- * Build a CSS font string
1380
- */
1381
- declare function buildFontString({ fontType, fontSize, fontWeight, }: {
1382
- fontType: FontType;
1383
- fontSize: number;
1384
- fontWeight: 'normal' | 'bold';
1385
- }): string;
1386
- /**
1387
- * Font URLs for loading web fonts
1388
- * These are the public URLs to the font files
1389
- */
1390
- declare const FONT_URLS: {
1391
- tiktok: {
1392
- regular: string;
1393
- bold: string;
1394
- };
1395
- apple: {
1396
- regular: string;
1397
- };
1398
- emoji: {
1399
- apple: string;
1400
- };
1401
- };
1402
- /**
1403
- * Preload fonts for rendering
1404
- * Call this in your Root component or composition
1405
- */
1406
- declare function preloadFonts(): Promise<void>;
1407
- /**
1408
- * Check if fonts are loaded
1409
- */
1410
- declare function areFontsLoaded(): boolean;
1411
- /**
1412
- * Debug utility to log current font status
1413
- */
1414
- declare function debugFontStatus(): void;
1415
-
1416
- /**
1417
- * Fit calculation utilities for media positioning
1418
- */
1419
-
1420
- /**
1421
- * Result of fit dimension calculation
1422
- */
1423
- interface FitDimensions {
1424
- /** X offset within target area */
1425
- x: number;
1426
- /** Y offset within target area */
1427
- y: number;
1428
- /** Rendered width */
1429
- width: number;
1430
- /** Rendered height */
1431
- height: number;
1432
- /** Source X offset (for cropping) */
1433
- sourceX: number;
1434
- /** Source Y offset (for cropping) */
1435
- sourceY: number;
1436
- /** Source width to use */
1437
- sourceWidth: number;
1438
- /** Source height to use */
1439
- sourceHeight: number;
1440
- }
1441
- /**
1442
- * Calculate dimensions for fit modes (cover, contain, fill)
1443
- */
1444
- declare function calculateFitDimensions({ sourceWidth, sourceHeight, targetWidth, targetHeight, fit, }: {
1445
- sourceWidth: number;
1446
- sourceHeight: number;
1447
- targetWidth: number;
1448
- targetHeight: number;
1449
- fit: FitMode;
1450
- }): FitDimensions;
1451
-
1452
- /**
1453
- * Default values for segment properties
1454
- *
1455
- * These defaults match the server-side rendering defaults exactly
1456
- * to ensure consistent behavior between client preview and server render.
1457
- */
1458
-
1459
- /**
1460
- * Default values for text segments
1461
- */
1462
- declare const TEXT_DEFAULTS: {
1463
- fontType: FontType;
1464
- fontSize: number;
1465
- fontWeight: FontWeight;
1466
- color: string;
1467
- alignment: TextAlignment;
1468
- verticalAlign: VerticalAlignment;
1469
- direction: TextDirection;
1470
- lineHeight: number;
1471
- letterSpacing: number;
1472
- padding: number;
1473
- textWrap: TextWrap;
1474
- wordBreak: WordBreak;
1475
- hyphenation: Hyphenation;
1476
- maxLines: number;
1477
- textOverflow: TextOverflow;
1478
- ellipsis: string;
1479
- strokeWidth: number;
1480
- backgroundOpacity: number;
1481
- autoWidth: boolean;
1482
- boxAlign: "left";
1483
- };
1484
- /**
1485
- * Default values for image segments
1486
- */
1487
- declare const IMAGE_DEFAULTS: {
1488
- fit: FitMode;
1489
- opacity: number;
1490
- loop: boolean;
1491
- speed: number;
1492
- };
1493
- /**
1494
- * Default values for video segments
1495
- */
1496
- declare const VIDEO_DEFAULTS: {
1497
- volume: number;
1498
- fit: FitMode;
1499
- opacity: number;
1500
- loop: boolean;
1501
- speed: number;
1502
- };
1503
- /**
1504
- * Default values for visual segment positioning
1505
- */
1506
- declare const VISUAL_DEFAULTS: {
1507
- xOffset: number;
1508
- yOffset: number;
1509
- zIndex: number;
1510
- scale: number;
1511
- rotation: number;
1512
- opacity: number;
1513
- };
1514
- /**
1515
- * Apply default values to a text segment
1516
- */
1517
- declare function applyTextDefaults<T extends Record<string, unknown>>(segment: T): T & typeof TEXT_DEFAULTS;
1518
- /**
1519
- * Apply default values to an image segment
1520
- */
1521
- declare function applyImageDefaults<T extends Record<string, unknown>>(segment: T): T & typeof IMAGE_DEFAULTS;
1522
- /**
1523
- * Apply default values to a video segment
1524
- */
1525
- declare function applyVideoDefaults<T extends Record<string, unknown>>(segment: T): T & typeof VIDEO_DEFAULTS;
1526
-
1527
- /**
1528
- * Text utilities for measuring and wrapping text
1529
- */
1530
-
1531
- /**
1532
- * Wrap text to fit within a specific width
1533
- * Accounts for letter spacing when measuring text width
1534
- */
1535
- declare function wrapText({ text, maxWidth, letterSpacing, textWrap, maxLines, measureText, }: {
1536
- text: string;
1537
- maxWidth: number;
1538
- letterSpacing?: number;
1539
- textWrap?: 'word' | 'char' | 'none';
1540
- maxLines?: number;
1541
- measureText: (text: string) => number;
1542
- }): string[];
1543
- /**
1544
- * Calculate line width with letter spacing
1545
- */
1546
- declare function calculateLineWidth({ line, letterSpacing, measureText, }: {
1547
- line: string;
1548
- letterSpacing: number;
1549
- measureText: (text: string) => number;
1550
- }): number;
1551
- /**
1552
- * Convert borderRadius value to array format for roundRect()
1553
- * Returns [topLeft, topRight, bottomRight, bottomLeft] or null if no rounding needed
1554
- */
1555
- declare function getBorderRadii(borderRadius: number | BorderRadiusConfig | undefined): number[] | null;
1556
- /**
1557
- * Parse hex color to RGB values
1558
- */
1559
- declare function parseHexColor(hex: string): {
1560
- r: number;
1561
- g: number;
1562
- b: number;
1563
- };
1564
- /**
1565
- * Convert hex color and opacity to rgba string
1566
- */
1567
- declare function hexToRgba(hex: string, opacity?: number): string;
1568
-
1569
- /**
1570
- * Position Resolution Utility
1571
- *
1572
- * Resolves relative element positions to absolute coordinates.
1573
- * X and Y positions can be independently set to relative or absolute.
1574
- * Handles dependency resolution, circular dependency detection, and cascading updates.
1575
- */
1576
-
1577
- /**
1578
- * Calculate the actual dimensions of a text element when autoWidth is enabled
1579
- * Returns { actualWidth, actualX, actualHeight } where:
1580
- * - actualX is adjusted based on boxAlign
1581
- * - actualHeight is calculated based on the number of wrapped lines
1582
- */
1583
- declare function calculateAutoWidthDimensions(elem: ImageEditorElement, textContent: string, ctx?: CanvasRenderingContext2D | null): {
1584
- actualWidth: number;
1585
- actualX: number;
1586
- actualHeight: number;
1587
- lineCount: number;
1588
- } | null;
1589
- interface PositionResolutionError {
1590
- elementId: string;
1591
- type: 'circular_dependency' | 'missing_reference' | 'invalid_config';
1592
- message: string;
1593
- /** Which axis the error is for */
1594
- axis?: 'x' | 'y';
1595
- /** For circular dependencies, the cycle path */
1596
- cyclePath?: string[];
1597
- }
1598
- interface PositionResolutionResult {
1599
- /** Elements with resolved absolute positions */
1600
- elements: ImageEditorElement[];
1601
- /** Any errors encountered during resolution */
1602
- errors: PositionResolutionError[];
1603
- }
1604
- /**
1605
- * Resolve all relative positions to absolute coordinates
1606
- *
1607
- * X and Y are resolved independently, allowing:
1608
- * - X absolute, Y relative (common for vertical stacking)
1609
- * - X relative, Y absolute (common for horizontal stacking)
1610
- * - Both relative (can be to different elements)
1611
- * - Both absolute
1612
- *
1613
- * @param elements - Array of elements to resolve
1614
- * @param textValues - Optional map of textInputId -> text content for autoWidth calculation
1615
- */
1616
- declare function resolveElementPositions(elements: ImageEditorElement[], textValues?: Record<string, string>): PositionResolutionResult;
1617
- /**
1618
- * Check if an element can be set as a reference for another element on a specific axis
1619
- */
1620
- declare function canSetAsReference(elements: ImageEditorElement[], elementId: string, proposedReferenceId: string, axis: 'x' | 'y'): boolean;
1621
- /**
1622
- * Get all elements that would be affected if a given element's position/size changes
1623
- */
1624
- declare function getDependentElements(elements: ImageEditorElement[], elementId: string): string[];
1625
- /**
1626
- * Get the element that a given element references for X position (if any)
1627
- */
1628
- declare function getReferenceElementX(elements: ImageEditorElement[], elementId: string): ImageEditorElement | null;
1629
- /**
1630
- * Get the element that a given element references for Y position (if any)
1631
- */
1632
- declare function getReferenceElementY(elements: ImageEditorElement[], elementId: string): ImageEditorElement | null;
1633
-
1634
- /**
1635
- * Utility functions for calculating dynamic crop bounds
1636
- */
1637
-
1638
- /**
1639
- * Calculate dynamic crop bounds based on element positions
1640
- *
1641
- * @param elements - Array of resolved elements with absolute positions
1642
- * @param dynamicCrop - Crop configuration
1643
- * @param canvasWidth - Original canvas width
1644
- * @param canvasHeight - Original canvas height
1645
- * @param textValues - Optional map of textInputId -> text content for height calculation
1646
- * @returns CropBounds with x, y, width, height
1647
- */
1648
- declare function calculateCropBounds(elements: ImageEditorElement[], dynamicCrop: DynamicCropConfig | undefined, canvasWidth: number, canvasHeight: number, textValues?: Record<string, string>): CropBounds;
1649
- /**
1650
- * Check if dynamic crop is enabled (either vertical or horizontal)
1651
- */
1652
- declare function isDynamicCropEnabled(dynamicCrop: DynamicCropConfig | undefined): boolean;
1653
-
1654
- /**
1655
- * Timeline utility functions for video editor
1656
- *
1657
- * These functions calculate segment positions on the timeline based on
1658
- * the segment/overlay timing model. Used by both the webapp UI and
1659
- * the VideoEditorComposition for rendering.
1660
- */
1661
-
1662
- /**
1663
- * Create a default TimeValue for segment offsets
1664
- */
1665
- declare function defaultOffset(mode?: TimeMode): TimeValue;
1666
- /**
1667
- * Get base segments (no parentId) for a channel
1668
- * Base segments are the primary timeline elements that overlays attach to
1669
- */
1670
- declare function getBaseSegments(channel: VideoEditorChannel): VideoEditorSegment[];
1671
- /**
1672
- * Get overlays for a specific parent segment (or global overlays if parentId is null)
1673
- */
1674
- declare function getOverlays(channel: VideoEditorChannel, parentId: string | null): VideoEditorSegment[];
1675
- /**
1676
- * Calculate segment position on timeline
1677
- *
1678
- * For base segments:
1679
- * - Position is calculated from offset and previous segments
1680
- * - Duration is from the duration property or default (5 seconds)
1681
- *
1682
- * For overlay segments:
1683
- * - Position is calculated relative to parent using relativeStart/relativeEnd
1684
- * - relativeStart/relativeEnd are fractions (0-1) of parent duration
1685
- */
1686
- declare function getSegmentTimelinePosition(segment: VideoEditorSegment, baseSegments: VideoEditorSegment[], channel: VideoEditorChannel): SegmentTimelinePosition;
1687
- /**
1688
- * Check if a segment is visible at a given time
1689
- */
1690
- declare function isSegmentVisibleAtTime(segment: VideoEditorSegment, time: number, channel: VideoEditorChannel): boolean;
1691
- /**
1692
- * Calculate estimated total duration based on segments
1693
- */
1694
- declare function calculateEstimatedDuration(channels: VideoEditorChannel[]): number;
1695
- /**
1696
- * Calculate the timeline content end time (used for both ruler and scroll width)
1697
- */
1698
- declare function calculateTimelineContentEnd(channel: VideoEditorChannel): number;
1699
- /**
1700
- * Format time in mm:ss.ms
1701
- */
1702
- declare function formatTime(ms: number): string;
1703
- /**
1704
- * Parse time string to milliseconds
1705
- */
1706
- declare function parseTime(timeStr: string): number;
1707
- /**
1708
- * Generate a unique segment ID
1709
- */
1710
- declare function generateSegmentId(): string;
1711
- /**
1712
- * Generate a unique overlay ID
1713
- */
1714
- declare function generateOverlayId(): string;
1715
-
1716
- /**
1717
- * Caption style presets and resolution utilities
1718
- *
1719
- * Provides TikTok-style caption presets and a function to resolve
1720
- * partial config into a complete CaptionStyle object.
1721
- */
1722
-
1723
- /**
1724
- * Predefined caption style presets
1725
- *
1726
- * Font sizes are designed for 1920p height and scale proportionally.
1727
- * maxWidth is a percentage of video width (0-100).
1728
- */
1729
- declare const CAPTION_PRESETS: Record<CaptionPreset, Omit<CaptionStyle, 'preset'>>;
1730
- /**
1731
- * Default caption style (used when no preset or custom values provided)
1732
- */
1733
- declare const DEFAULT_CAPTION_STYLE: Omit<CaptionStyle, "preset">;
1734
- /**
1735
- * Resolve a partial caption style config into a complete CaptionStyle object
1736
- *
1737
- * Priority:
1738
- * 1. Explicit values in the input style
1739
- * 2. Preset values (if preset is specified)
1740
- * 3. Default values (hormozi preset)
1741
- *
1742
- * @param style - Partial caption style configuration
1743
- * @returns Complete CaptionStyle object with all fields populated
1744
- */
1745
- declare function resolveCaptionStyle(style: Partial<CaptionStyle> | undefined): CaptionStyle;
1746
- /**
1747
- * Get all available preset names
1748
- */
1749
- declare function getCaptionPresetNames(): CaptionPreset[];
1750
- /**
1751
- * Check if a string is a valid caption preset name
1752
- */
1753
- declare function isValidCaptionPreset(name: string): name is CaptionPreset;
1754
-
1755
693
  /**
1756
694
  * Hook exports for ugcinc-render
1757
695
  *
@@ -1814,4 +752,4 @@ declare function useResolvedPositions(elements: ImageEditorElement[], textValues
1814
752
 
1815
753
  declare const RenderRoot: React.FC;
1816
754
 
1817
- export { APPLE_EMOJI_FONT, type Acceleration, type AudioConfig, type AudioSegment, AutoCaptionComposition, type AutoCaptionCompositionProps, AutoCaptionCompositionWithVideo, type BaseEditorConfig, type BaseSegment, type BlendMode, type BorderRadiusConfig, CAPTION_PRESETS, type CaptionFontWeight, CaptionOverlay, type CaptionOverlayProps, type CaptionPage, type CaptionPosition, type CaptionPreset, type CaptionStyle, type CaptionWord, type Channel, type ColorFilterConfig, type ColorShiftConfig, type CropAxisConfig, type CropBoundary, type CropBounds, type CropConfig, type CuttingConfig, DEDUPLICATION_LEVELS, DEFAULT_CAPTION_STYLE, DIMENSION_PRESETS, type DeduplicationConfig, type DeduplicationInput, type DeduplicationLevel, type DiagonalFilterConfig, type DiagonalFilterType, type DimensionPreset, type DimensionPresetKey, type DynamicCropConfig, type EditorConfig, type EditorSegment, type EnhanceLevel, type EnhancementConfig, FONT_FAMILIES, FONT_URLS, type FitDimensions, type FitMode, type FontType, type FontWeight, type FrameManipulationConfig, type GifOverlayConfig, type GifSource, type GradientOverlayConfig, type HorizontalAnchor, type HorizontalSelfAnchor, type Hyphenation, IMAGE_DEFAULTS, ImageEditorComposition, type ImageEditorCompositionProps, type ImageEditorConfig, type ImageEditorElement, type ImageEditorNodeConfig, ImageElement, type ImageElementProps, type ImageSegment, LEVEL_1_CONFIG, LEVEL_2_CONFIG, LEVEL_3_CONFIG, LEVEL_4_CONFIG, LEVEL_5_CONFIG, type LensCorrectionConfig, type MobileEncodingConfig, type ParticleOverlayConfig, type PhoneConfig, type PhoneModel, type PhoneType, type PictureSegment, type PositionResolutionError, type PositionResolutionResult, type RelativePositionConfigX, type RelativePositionConfigY, RenderRoot, type Segment, type SegmentTimelinePosition, type SegmentType, type SpeedConfig, type StaticSegment, TEXT_DEFAULTS, type TextAlignment, type TextDirection, TextElement, type TextElementProps, type TextOverflow, type TextSegment, type TextStyleProperties, type TextWrap, type TimeMode, type TimeValue, type TraceRemovalConfig, VIDEO_DEFAULTS, VISUAL_DEFAULTS, type VerticalAlignment, type VerticalAnchor, type VerticalSelfAnchor, type VideoCodec, type VideoEditorAudioSegment, type VideoEditorBaseSegment, type VideoEditorChannel, VideoEditorComposition, type VideoEditorCompositionProps, type VideoEditorConfig, type VideoEditorImageSegment, type VideoEditorNodeConfig, type VideoEditorSegment, type VideoEditorTextSegment, type VideoEditorVideoSegment, type VideoEditorVisualSegment, VideoElement, type VideoElementProps, type VideoExtension, type VideoSegment, type VisualAdjustmentsConfig, type VisualSegment, type VisualSegmentUnion, type WordBreak, applyImageDefaults, applyTextDefaults, applyVideoDefaults, areFontsLoaded, buildFontString, calculateAutoWidthDimensions, calculateCropBounds, calculateEstimatedDuration, calculateFitDimensions, calculateLineWidth, calculateTimelineContentEnd, canSetAsReference, debugFontStatus, defaultOffset, formatTime, generateOverlayId, generateSegmentId, getBaseSegments, getBorderRadii, getCaptionPresetNames, getDependentElements, getFontFamily, getOverlays, getReferenceElementX, getReferenceElementY, getSegmentTimelinePosition, hexToRgba, isDeduplicationLevel, isDynamicCropEnabled, isSegmentVisibleAtTime, isValidCaptionPreset, parseHexColor, parseTime, preloadFonts, resolveCaptionStyle, resolveDeduplicationConfig, resolveElementPositions, useFontsLoaded, useImageLoader, useImagePreloader, useResolvedPositions, wrapText };
755
+ export { type Acceleration, type AudioConfig, type AudioSegment, AutoCaptionComposition, AutoCaptionCompositionProps, AutoCaptionCompositionWithVideo, type BaseEditorConfig, type BaseSegment, type BlendMode, BorderRadiusConfig, CaptionOverlay, CaptionOverlayProps, type Channel, type ColorFilterConfig, type ColorShiftConfig, type CropConfig, type CuttingConfig, DEDUPLICATION_LEVELS, type DeduplicationConfig, type DeduplicationInput, type DeduplicationLevel, type DiagonalFilterConfig, type DiagonalFilterType, DynamicCropConfig, type EditorConfig, type EditorSegment, type EnhanceLevel, type EnhancementConfig, FitMode, type FrameManipulationConfig, type GifOverlayConfig, type GifSource, type GradientOverlayConfig, ImageEditorComposition, type ImageEditorCompositionProps, type ImageEditorConfig, ImageEditorElement, ImageElement, type ImageElementProps, type ImageSegment, LEVEL_1_CONFIG, LEVEL_2_CONFIG, LEVEL_3_CONFIG, LEVEL_4_CONFIG, LEVEL_5_CONFIG, type LensCorrectionConfig, type MobileEncodingConfig, type ParticleOverlayConfig, type PhoneConfig, type PhoneModel, type PhoneType, type PictureSegment, PositionResolutionResult, RelativePositionConfigX, RelativePositionConfigY, RenderRoot, type Segment, SegmentType, type SpeedConfig, type StaticSegment, TextElement, type TextElementProps, type TextSegment, TextStyleProperties, TimeValue, type TraceRemovalConfig, type VideoCodec, VideoEditorComposition, type VideoEditorCompositionProps, type VideoEditorConfig, VideoElement, type VideoElementProps, type VideoExtension, type VideoSegment, type VisualAdjustmentsConfig, type VisualSegment, type VisualSegmentUnion, isDeduplicationLevel, resolveDeduplicationConfig, useFontsLoaded, useImageLoader, useImagePreloader, useResolvedPositions };