@kitsra/kavio-schema 0.1.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,2104 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://kavio.dev/schemas/kavio-0.1.schema.json",
4
+ "title": "Kavio Composition",
5
+ "description": "Canonical Kavio 0.1 JSON timeline document.",
6
+ "type": "object",
7
+ "required": ["version", "composition", "assets", "layers", "exports"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "version": {
11
+ "const": "0.1"
12
+ },
13
+ "metadata": {
14
+ "$ref": "#/$defs/metadata"
15
+ },
16
+ "composition": {
17
+ "$ref": "#/$defs/composition"
18
+ },
19
+ "props": {
20
+ "$ref": "#/$defs/props"
21
+ },
22
+ "assets": {
23
+ "$ref": "#/$defs/assets"
24
+ },
25
+ "layers": {
26
+ "type": "array",
27
+ "items": {
28
+ "$ref": "#/$defs/layer"
29
+ },
30
+ "maxItems": 512
31
+ },
32
+ "tracks": {
33
+ "type": "array",
34
+ "items": {
35
+ "$ref": "#/$defs/track"
36
+ },
37
+ "maxItems": 64
38
+ },
39
+ "audio": {
40
+ "type": "array",
41
+ "items": {
42
+ "$ref": "#/$defs/audioTrack"
43
+ },
44
+ "maxItems": 64
45
+ },
46
+ "exports": {
47
+ "type": "array",
48
+ "minItems": 1,
49
+ "maxItems": 32,
50
+ "items": {
51
+ "$ref": "#/$defs/exportPreset"
52
+ }
53
+ }
54
+ },
55
+ "$defs": {
56
+ "jsonValue": {
57
+ "oneOf": [
58
+ {
59
+ "type": "string"
60
+ },
61
+ {
62
+ "type": "number"
63
+ },
64
+ {
65
+ "type": "boolean"
66
+ },
67
+ {
68
+ "type": "null"
69
+ },
70
+ {
71
+ "type": "array",
72
+ "items": {
73
+ "$ref": "#/$defs/jsonValue"
74
+ }
75
+ },
76
+ {
77
+ "type": "object",
78
+ "additionalProperties": {
79
+ "$ref": "#/$defs/jsonValue"
80
+ }
81
+ }
82
+ ]
83
+ },
84
+ "metadata": {
85
+ "type": "object",
86
+ "additionalProperties": {
87
+ "$ref": "#/$defs/jsonValue"
88
+ },
89
+ "properties": {
90
+ "title": {
91
+ "type": "string",
92
+ "minLength": 1
93
+ },
94
+ "author": {
95
+ "type": "string",
96
+ "minLength": 1
97
+ },
98
+ "tags": {
99
+ "type": "array",
100
+ "items": {
101
+ "type": "string",
102
+ "minLength": 1
103
+ },
104
+ "uniqueItems": true
105
+ },
106
+ "createdAt": {
107
+ "type": "string",
108
+ "format": "date-time"
109
+ }
110
+ }
111
+ },
112
+ "composition": {
113
+ "type": "object",
114
+ "required": ["width", "height", "fps", "durationFrames"],
115
+ "additionalProperties": false,
116
+ "properties": {
117
+ "width": {
118
+ "type": "integer",
119
+ "minimum": 1,
120
+ "maximum": 7680
121
+ },
122
+ "height": {
123
+ "type": "integer",
124
+ "minimum": 1,
125
+ "maximum": 7680
126
+ },
127
+ "fps": {
128
+ "type": "integer",
129
+ "minimum": 1,
130
+ "maximum": 120
131
+ },
132
+ "durationFrames": {
133
+ "type": "integer",
134
+ "minimum": 1,
135
+ "maximum": 216000
136
+ },
137
+ "background": {
138
+ "$ref": "#/$defs/colorOrTransparent"
139
+ },
140
+ "colorSpace": {
141
+ "enum": ["srgb", "display-p3"]
142
+ }
143
+ }
144
+ },
145
+ "props": {
146
+ "type": "object",
147
+ "propertyNames": {
148
+ "$ref": "#/$defs/identifier"
149
+ },
150
+ "additionalProperties": {
151
+ "$ref": "#/$defs/propDefinition"
152
+ }
153
+ },
154
+ "propDefinition": {
155
+ "type": "object",
156
+ "required": ["type"],
157
+ "additionalProperties": false,
158
+ "properties": {
159
+ "type": {
160
+ "enum": ["string", "number", "boolean", "color", "url", "enum", "asset"]
161
+ },
162
+ "required": {
163
+ "type": "boolean"
164
+ },
165
+ "default": {
166
+ "$ref": "#/$defs/jsonValue"
167
+ },
168
+ "maxLength": {
169
+ "type": "integer",
170
+ "minimum": 0,
171
+ "maximum": 10000
172
+ },
173
+ "min": {
174
+ "type": "number"
175
+ },
176
+ "max": {
177
+ "type": "number"
178
+ },
179
+ "options": {
180
+ "type": "array",
181
+ "minItems": 1,
182
+ "uniqueItems": true,
183
+ "items": {
184
+ "type": ["string", "number", "boolean", "null"]
185
+ }
186
+ },
187
+ "description": {
188
+ "type": "string"
189
+ }
190
+ },
191
+ "allOf": [
192
+ {
193
+ "if": {
194
+ "properties": {
195
+ "type": {
196
+ "const": "enum"
197
+ }
198
+ },
199
+ "required": ["type"]
200
+ },
201
+ "then": {
202
+ "required": ["options"]
203
+ }
204
+ }
205
+ ]
206
+ },
207
+ "assets": {
208
+ "type": "object",
209
+ "propertyNames": {
210
+ "$ref": "#/$defs/identifier"
211
+ },
212
+ "maxProperties": 64,
213
+ "additionalProperties": {
214
+ "$ref": "#/$defs/asset"
215
+ }
216
+ },
217
+ "asset": {
218
+ "oneOf": [
219
+ {
220
+ "$ref": "#/$defs/videoAsset"
221
+ },
222
+ {
223
+ "$ref": "#/$defs/imageAsset"
224
+ },
225
+ {
226
+ "$ref": "#/$defs/audioAsset"
227
+ },
228
+ {
229
+ "$ref": "#/$defs/fontAsset"
230
+ }
231
+ ]
232
+ },
233
+ "assetBase": {
234
+ "type": "object",
235
+ "required": ["type", "src"],
236
+ "properties": {
237
+ "type": {
238
+ "enum": ["video", "image", "audio", "font"]
239
+ },
240
+ "src": {
241
+ "type": "string",
242
+ "minLength": 1
243
+ },
244
+ "checksum": {
245
+ "type": "string",
246
+ "pattern": "^[a-z0-9-]+:.+|^[a-z0-9-]+-.+$"
247
+ }
248
+ }
249
+ },
250
+ "timedAssetFields": {
251
+ "type": "object",
252
+ "properties": {
253
+ "trimStartFrames": {
254
+ "type": "integer",
255
+ "minimum": 0
256
+ },
257
+ "trimEndFrames": {
258
+ "type": ["integer", "null"],
259
+ "minimum": 0
260
+ },
261
+ "loop": {
262
+ "type": "boolean"
263
+ }
264
+ }
265
+ },
266
+ "videoAsset": {
267
+ "allOf": [
268
+ {
269
+ "$ref": "#/$defs/assetBase"
270
+ },
271
+ {
272
+ "$ref": "#/$defs/timedAssetFields"
273
+ },
274
+ {
275
+ "type": "object",
276
+ "properties": {
277
+ "type": {
278
+ "const": "video"
279
+ }
280
+ }
281
+ }
282
+ ],
283
+ "unevaluatedProperties": false
284
+ },
285
+ "imageAsset": {
286
+ "allOf": [
287
+ {
288
+ "$ref": "#/$defs/assetBase"
289
+ },
290
+ {
291
+ "type": "object",
292
+ "properties": {
293
+ "type": {
294
+ "const": "image"
295
+ }
296
+ }
297
+ }
298
+ ],
299
+ "unevaluatedProperties": false
300
+ },
301
+ "audioAsset": {
302
+ "allOf": [
303
+ {
304
+ "$ref": "#/$defs/assetBase"
305
+ },
306
+ {
307
+ "$ref": "#/$defs/timedAssetFields"
308
+ },
309
+ {
310
+ "type": "object",
311
+ "properties": {
312
+ "type": {
313
+ "const": "audio"
314
+ }
315
+ }
316
+ }
317
+ ],
318
+ "unevaluatedProperties": false
319
+ },
320
+ "fontAsset": {
321
+ "allOf": [
322
+ {
323
+ "$ref": "#/$defs/assetBase"
324
+ },
325
+ {
326
+ "type": "object",
327
+ "required": ["family"],
328
+ "properties": {
329
+ "type": {
330
+ "const": "font"
331
+ },
332
+ "family": {
333
+ "type": "string",
334
+ "minLength": 1
335
+ },
336
+ "weight": {
337
+ "type": ["integer", "string"],
338
+ "minimum": 1
339
+ },
340
+ "style": {
341
+ "type": "string",
342
+ "minLength": 1
343
+ }
344
+ }
345
+ }
346
+ ],
347
+ "unevaluatedProperties": false
348
+ },
349
+ "layer": {
350
+ "oneOf": [
351
+ {
352
+ "$ref": "#/$defs/videoLayer"
353
+ },
354
+ {
355
+ "$ref": "#/$defs/imageLayer"
356
+ },
357
+ {
358
+ "$ref": "#/$defs/textLayer"
359
+ },
360
+ {
361
+ "$ref": "#/$defs/shapeLayer"
362
+ },
363
+ {
364
+ "$ref": "#/$defs/captionLayer"
365
+ }
366
+ ]
367
+ },
368
+ "layerBase": {
369
+ "type": "object",
370
+ "required": ["id", "type", "startFrame", "durationFrames"],
371
+ "properties": {
372
+ "id": {
373
+ "$ref": "#/$defs/identifier"
374
+ },
375
+ "type": {
376
+ "enum": ["video", "image", "text", "shape", "caption"]
377
+ },
378
+ "startFrame": {
379
+ "type": "integer",
380
+ "minimum": 0
381
+ },
382
+ "durationFrames": {
383
+ "type": "integer",
384
+ "minimum": 1
385
+ },
386
+ "position": {
387
+ "$ref": "#/$defs/position"
388
+ },
389
+ "anchor": {
390
+ "$ref": "#/$defs/anchor"
391
+ },
392
+ "size": {
393
+ "$ref": "#/$defs/size"
394
+ },
395
+ "opacity": {
396
+ "type": "number",
397
+ "minimum": 0,
398
+ "maximum": 1
399
+ },
400
+ "rotation": {
401
+ "type": "number"
402
+ },
403
+ "scale": {
404
+ "type": "number",
405
+ "exclusiveMinimum": 0
406
+ },
407
+ "z": {
408
+ "type": ["integer", "null"]
409
+ },
410
+ "track": {
411
+ "type": "string",
412
+ "minLength": 1
413
+ },
414
+ "keyframes": {
415
+ "$ref": "#/$defs/keyframes"
416
+ },
417
+ "effects": {
418
+ "type": "array",
419
+ "items": {
420
+ "$ref": "#/$defs/effect"
421
+ }
422
+ },
423
+ "mask": {
424
+ "oneOf": [
425
+ {
426
+ "$ref": "#/$defs/layerMask"
427
+ },
428
+ {
429
+ "type": "null"
430
+ }
431
+ ]
432
+ },
433
+ "transitionIn": {
434
+ "oneOf": [
435
+ {
436
+ "$ref": "#/$defs/transition"
437
+ },
438
+ {
439
+ "type": "null"
440
+ }
441
+ ]
442
+ },
443
+ "transitionOut": {
444
+ "oneOf": [
445
+ {
446
+ "$ref": "#/$defs/transition"
447
+ },
448
+ {
449
+ "type": "null"
450
+ }
451
+ ]
452
+ }
453
+ }
454
+ },
455
+ "videoLayer": {
456
+ "allOf": [
457
+ {
458
+ "$ref": "#/$defs/layerBase"
459
+ },
460
+ {
461
+ "type": "object",
462
+ "required": ["asset"],
463
+ "properties": {
464
+ "type": {
465
+ "const": "video"
466
+ },
467
+ "asset": {
468
+ "$ref": "#/$defs/identifier"
469
+ },
470
+ "fit": {
471
+ "$ref": "#/$defs/fit"
472
+ },
473
+ "crop": {
474
+ "$ref": "#/$defs/videoCrop"
475
+ },
476
+ "muted": {
477
+ "type": "boolean"
478
+ },
479
+ "volume": {
480
+ "type": "number",
481
+ "minimum": 0,
482
+ "maximum": 1
483
+ },
484
+ "playbackRate": {
485
+ "type": "number",
486
+ "exclusiveMinimum": 0
487
+ }
488
+ }
489
+ }
490
+ ],
491
+ "unevaluatedProperties": false
492
+ },
493
+ "imageLayer": {
494
+ "allOf": [
495
+ {
496
+ "$ref": "#/$defs/layerBase"
497
+ },
498
+ {
499
+ "type": "object",
500
+ "required": ["asset"],
501
+ "properties": {
502
+ "type": {
503
+ "const": "image"
504
+ },
505
+ "asset": {
506
+ "$ref": "#/$defs/identifier"
507
+ },
508
+ "fit": {
509
+ "$ref": "#/$defs/fit"
510
+ }
511
+ }
512
+ }
513
+ ],
514
+ "unevaluatedProperties": false
515
+ },
516
+ "textLayer": {
517
+ "allOf": [
518
+ {
519
+ "$ref": "#/$defs/layerBase"
520
+ },
521
+ {
522
+ "type": "object",
523
+ "required": ["text"],
524
+ "properties": {
525
+ "type": {
526
+ "const": "text"
527
+ },
528
+ "text": {
529
+ "type": "string"
530
+ },
531
+ "style": {
532
+ "$ref": "#/$defs/textStyle"
533
+ },
534
+ "textMotion": {
535
+ "$ref": "#/$defs/textMotion"
536
+ }
537
+ }
538
+ }
539
+ ],
540
+ "unevaluatedProperties": false
541
+ },
542
+ "shapeLayer": {
543
+ "allOf": [
544
+ {
545
+ "$ref": "#/$defs/layerBase"
546
+ },
547
+ {
548
+ "type": "object",
549
+ "required": ["shape"],
550
+ "properties": {
551
+ "type": {
552
+ "const": "shape"
553
+ },
554
+ "shape": {
555
+ "const": "rect"
556
+ },
557
+ "fill": {
558
+ "$ref": "#/$defs/color"
559
+ },
560
+ "stroke": {
561
+ "oneOf": [
562
+ {
563
+ "$ref": "#/$defs/stroke"
564
+ },
565
+ {
566
+ "type": "null"
567
+ }
568
+ ]
569
+ },
570
+ "radius": {
571
+ "type": "number",
572
+ "minimum": 0
573
+ }
574
+ }
575
+ }
576
+ ],
577
+ "unevaluatedProperties": false
578
+ },
579
+ "captionLayer": {
580
+ "allOf": [
581
+ {
582
+ "$ref": "#/$defs/layerBase"
583
+ },
584
+ {
585
+ "type": "object",
586
+ "required": ["source"],
587
+ "properties": {
588
+ "type": {
589
+ "const": "caption"
590
+ },
591
+ "source": {
592
+ "$ref": "#/$defs/captionSource"
593
+ },
594
+ "style": {
595
+ "$ref": "#/$defs/captionStyle"
596
+ },
597
+ "safeArea": {
598
+ "oneOf": [
599
+ {
600
+ "enum": ["bottom", "center", "top"]
601
+ },
602
+ {
603
+ "$ref": "#/$defs/position"
604
+ }
605
+ ]
606
+ }
607
+ }
608
+ }
609
+ ],
610
+ "unevaluatedProperties": false
611
+ },
612
+ "track": {
613
+ "type": "object",
614
+ "required": ["id", "clips"],
615
+ "additionalProperties": false,
616
+ "properties": {
617
+ "id": {
618
+ "$ref": "#/$defs/identifier"
619
+ },
620
+ "clips": {
621
+ "type": "array",
622
+ "items": {
623
+ "$ref": "#/$defs/trackClip"
624
+ }
625
+ }
626
+ }
627
+ },
628
+ "trackClip": {
629
+ "type": "object",
630
+ "required": ["id", "layerId", "startFrame", "durationFrames"],
631
+ "additionalProperties": false,
632
+ "properties": {
633
+ "id": {
634
+ "$ref": "#/$defs/identifier"
635
+ },
636
+ "layerId": {
637
+ "$ref": "#/$defs/identifier"
638
+ },
639
+ "startFrame": {
640
+ "type": "integer",
641
+ "minimum": 0
642
+ },
643
+ "durationFrames": {
644
+ "type": "integer",
645
+ "minimum": 1
646
+ },
647
+ "transitionFromPrevious": {
648
+ "$ref": "#/$defs/transitionSeriesDefinition"
649
+ }
650
+ }
651
+ },
652
+ "transitionSeriesDefinition": {
653
+ "type": "object",
654
+ "required": ["presentation", "timing"],
655
+ "additionalProperties": false,
656
+ "properties": {
657
+ "presentation": {
658
+ "$ref": "#/$defs/transitionPresentation"
659
+ },
660
+ "timing": {
661
+ "$ref": "#/$defs/transitionTiming"
662
+ }
663
+ }
664
+ },
665
+ "transitionPresentation": {
666
+ "type": "object",
667
+ "required": ["type"],
668
+ "additionalProperties": false,
669
+ "properties": {
670
+ "type": {
671
+ "enum": [
672
+ "fade",
673
+ "slide",
674
+ "wipe",
675
+ "crossfade",
676
+ "zoom",
677
+ "push",
678
+ "spin",
679
+ "rotate",
680
+ "flip",
681
+ "blurDissolve",
682
+ "colorDissolve",
683
+ "dip",
684
+ "iris",
685
+ "stretch",
686
+ "squeeze",
687
+ "clockWipe",
688
+ "barWipe",
689
+ "gridWipe",
690
+ "tileReveal",
691
+ "radialBlur",
692
+ "zoomBlur",
693
+ "bookFlip",
694
+ "pageCurlLite",
695
+ "skewSlide",
696
+ "expandMask",
697
+ "letterboxReveal",
698
+ "filmFlash",
699
+ "cameraWhip"
700
+ ]
701
+ },
702
+ "direction": {
703
+ "enum": ["up", "down", "left", "right"]
704
+ },
705
+ "axis": {
706
+ "enum": ["x", "y"]
707
+ },
708
+ "shape": {
709
+ "enum": ["circle", "diamond"]
710
+ },
711
+ "color": {
712
+ "$ref": "#/$defs/color"
713
+ },
714
+ "amount": {
715
+ "type": "number",
716
+ "minimum": 0
717
+ },
718
+ "intensity": {
719
+ "type": "number",
720
+ "minimum": 0
721
+ },
722
+ "rows": {
723
+ "type": "integer",
724
+ "minimum": 1,
725
+ "maximum": 32
726
+ },
727
+ "columns": {
728
+ "type": "integer",
729
+ "minimum": 1,
730
+ "maximum": 32
731
+ }
732
+ }
733
+ },
734
+ "transitionTiming": {
735
+ "type": "object",
736
+ "required": ["type", "durationFrames"],
737
+ "additionalProperties": false,
738
+ "properties": {
739
+ "type": {
740
+ "const": "tween"
741
+ },
742
+ "durationFrames": {
743
+ "type": "integer",
744
+ "minimum": 1
745
+ },
746
+ "easing": {
747
+ "$ref": "#/$defs/easing"
748
+ }
749
+ }
750
+ },
751
+ "textStyle": {
752
+ "type": "object",
753
+ "additionalProperties": false,
754
+ "properties": {
755
+ "fontFamily": {
756
+ "type": "string",
757
+ "minLength": 1
758
+ },
759
+ "fontSize": {
760
+ "type": "number",
761
+ "exclusiveMinimum": 0
762
+ },
763
+ "fontWeight": {
764
+ "type": ["integer", "string"],
765
+ "minimum": 1
766
+ },
767
+ "fontStyle": {
768
+ "type": "string",
769
+ "minLength": 1
770
+ },
771
+ "color": {
772
+ "$ref": "#/$defs/color"
773
+ },
774
+ "align": {
775
+ "enum": ["left", "center", "right"]
776
+ },
777
+ "lineHeight": {
778
+ "type": "number",
779
+ "exclusiveMinimum": 0
780
+ },
781
+ "letterSpacing": {
782
+ "type": "number"
783
+ },
784
+ "maxLines": {
785
+ "type": "integer",
786
+ "minimum": 0
787
+ },
788
+ "wrap": {
789
+ "type": "boolean"
790
+ },
791
+ "background": {
792
+ "oneOf": [
793
+ {
794
+ "$ref": "#/$defs/color"
795
+ },
796
+ {
797
+ "type": "null"
798
+ }
799
+ ]
800
+ },
801
+ "padding": {
802
+ "type": "number",
803
+ "minimum": 0
804
+ },
805
+ "stroke": {
806
+ "oneOf": [
807
+ {
808
+ "$ref": "#/$defs/stroke"
809
+ },
810
+ {
811
+ "type": "null"
812
+ }
813
+ ]
814
+ },
815
+ "shadow": {
816
+ "oneOf": [
817
+ {
818
+ "$ref": "#/$defs/shadow"
819
+ },
820
+ {
821
+ "type": "null"
822
+ }
823
+ ]
824
+ }
825
+ }
826
+ },
827
+ "textMotion": {
828
+ "type": "object",
829
+ "additionalProperties": false,
830
+ "required": ["type"],
831
+ "properties": {
832
+ "type": {
833
+ "enum": ["typeOn", "cascade", "scramble", "highlightSweep", "trackingIn"]
834
+ },
835
+ "split": {
836
+ "enum": ["none", "word", "char", "line"]
837
+ },
838
+ "durationFrames": {
839
+ "type": "integer",
840
+ "minimum": 1
841
+ },
842
+ "easing": {
843
+ "$ref": "#/$defs/easing"
844
+ },
845
+ "staggerFrames": {
846
+ "type": "integer",
847
+ "minimum": 0
848
+ },
849
+ "origin": {
850
+ "enum": ["start", "center", "end"]
851
+ },
852
+ "seed": {
853
+ "type": "integer"
854
+ },
855
+ "preserveLayout": {
856
+ "type": "boolean"
857
+ },
858
+ "restingBox": {
859
+ "type": "object",
860
+ "additionalProperties": false,
861
+ "properties": {
862
+ "width": {
863
+ "type": "number",
864
+ "minimum": 0
865
+ },
866
+ "height": {
867
+ "type": "number",
868
+ "minimum": 0
869
+ }
870
+ }
871
+ },
872
+ "direction": {
873
+ "enum": ["up", "down", "left", "right"]
874
+ },
875
+ "amount": {
876
+ "type": "number",
877
+ "minimum": 0
878
+ },
879
+ "intensity": {
880
+ "type": "number",
881
+ "minimum": 0
882
+ },
883
+ "color": {
884
+ "$ref": "#/$defs/color"
885
+ }
886
+ }
887
+ },
888
+ "captionStyle": {
889
+ "type": "object",
890
+ "additionalProperties": false,
891
+ "properties": {
892
+ "fontFamily": {
893
+ "type": "string",
894
+ "minLength": 1
895
+ },
896
+ "fontSize": {
897
+ "type": "number",
898
+ "exclusiveMinimum": 0
899
+ },
900
+ "fontWeight": {
901
+ "type": ["integer", "string"],
902
+ "minimum": 1
903
+ },
904
+ "fontStyle": {
905
+ "type": "string",
906
+ "minLength": 1
907
+ },
908
+ "color": {
909
+ "$ref": "#/$defs/color"
910
+ },
911
+ "align": {
912
+ "enum": ["left", "center", "right"]
913
+ },
914
+ "lineHeight": {
915
+ "type": "number",
916
+ "exclusiveMinimum": 0
917
+ },
918
+ "letterSpacing": {
919
+ "type": "number"
920
+ },
921
+ "maxLines": {
922
+ "type": "integer",
923
+ "minimum": 0
924
+ },
925
+ "wrap": {
926
+ "type": "boolean"
927
+ },
928
+ "background": {
929
+ "oneOf": [
930
+ {
931
+ "$ref": "#/$defs/color"
932
+ },
933
+ {
934
+ "type": "null"
935
+ }
936
+ ]
937
+ },
938
+ "padding": {
939
+ "type": "number",
940
+ "minimum": 0
941
+ },
942
+ "stroke": {
943
+ "oneOf": [
944
+ {
945
+ "$ref": "#/$defs/stroke"
946
+ },
947
+ {
948
+ "type": "null"
949
+ }
950
+ ]
951
+ },
952
+ "shadow": {
953
+ "oneOf": [
954
+ {
955
+ "$ref": "#/$defs/shadow"
956
+ },
957
+ {
958
+ "type": "null"
959
+ }
960
+ ]
961
+ },
962
+ "maxCharsPerLine": {
963
+ "type": "integer",
964
+ "minimum": 1
965
+ },
966
+ "highlight": {
967
+ "$ref": "#/$defs/captionHighlight"
968
+ }
969
+ }
970
+ },
971
+ "captionHighlight": {
972
+ "type": "object",
973
+ "required": ["mode"],
974
+ "additionalProperties": false,
975
+ "properties": {
976
+ "mode": {
977
+ "enum": ["none", "word", "line"]
978
+ },
979
+ "color": {
980
+ "$ref": "#/$defs/color"
981
+ },
982
+ "scale": {
983
+ "type": "number",
984
+ "exclusiveMinimum": 0
985
+ }
986
+ }
987
+ },
988
+ "captionSource": {
989
+ "oneOf": [
990
+ {
991
+ "type": "object",
992
+ "required": ["kind", "cues"],
993
+ "additionalProperties": false,
994
+ "properties": {
995
+ "kind": {
996
+ "const": "inline"
997
+ },
998
+ "cues": {
999
+ "type": "array",
1000
+ "items": {
1001
+ "$ref": "#/$defs/captionCue"
1002
+ }
1003
+ }
1004
+ }
1005
+ },
1006
+ {
1007
+ "type": "object",
1008
+ "required": ["kind", "asset"],
1009
+ "additionalProperties": false,
1010
+ "properties": {
1011
+ "kind": {
1012
+ "enum": ["vtt", "srt", "asset"]
1013
+ },
1014
+ "asset": {
1015
+ "$ref": "#/$defs/identifier"
1016
+ }
1017
+ }
1018
+ }
1019
+ ]
1020
+ },
1021
+ "captionCue": {
1022
+ "type": "object",
1023
+ "required": ["startFrame", "endFrame", "text"],
1024
+ "additionalProperties": false,
1025
+ "properties": {
1026
+ "startFrame": {
1027
+ "type": "integer",
1028
+ "minimum": 0
1029
+ },
1030
+ "endFrame": {
1031
+ "type": "integer",
1032
+ "minimum": 1
1033
+ },
1034
+ "text": {
1035
+ "type": "string"
1036
+ },
1037
+ "words": {
1038
+ "type": "array",
1039
+ "items": {
1040
+ "$ref": "#/$defs/captionWord"
1041
+ }
1042
+ }
1043
+ }
1044
+ },
1045
+ "captionWord": {
1046
+ "type": "object",
1047
+ "required": ["startFrame", "endFrame", "text"],
1048
+ "additionalProperties": false,
1049
+ "properties": {
1050
+ "startFrame": {
1051
+ "type": "integer",
1052
+ "minimum": 0
1053
+ },
1054
+ "endFrame": {
1055
+ "type": "integer",
1056
+ "minimum": 1
1057
+ },
1058
+ "text": {
1059
+ "type": "string"
1060
+ }
1061
+ }
1062
+ },
1063
+ "audioTrack": {
1064
+ "type": "object",
1065
+ "required": ["id", "asset", "role", "startFrame"],
1066
+ "additionalProperties": false,
1067
+ "properties": {
1068
+ "id": {
1069
+ "$ref": "#/$defs/identifier"
1070
+ },
1071
+ "asset": {
1072
+ "$ref": "#/$defs/identifier"
1073
+ },
1074
+ "role": {
1075
+ "enum": ["music", "voiceover", "sfx", "source"]
1076
+ },
1077
+ "startFrame": {
1078
+ "type": "integer",
1079
+ "minimum": 0
1080
+ },
1081
+ "durationFrames": {
1082
+ "type": "integer",
1083
+ "minimum": 1
1084
+ },
1085
+ "offsetFrames": {
1086
+ "type": "integer",
1087
+ "minimum": 0
1088
+ },
1089
+ "volume": {
1090
+ "type": "number",
1091
+ "minimum": 0,
1092
+ "maximum": 1
1093
+ },
1094
+ "fadeInFrames": {
1095
+ "type": "integer",
1096
+ "minimum": 0
1097
+ },
1098
+ "fadeOutFrames": {
1099
+ "type": "integer",
1100
+ "minimum": 0
1101
+ },
1102
+ "loop": {
1103
+ "type": "boolean"
1104
+ },
1105
+ "duck": {
1106
+ "$ref": "#/$defs/audioDuck"
1107
+ }
1108
+ }
1109
+ },
1110
+ "audioDuck": {
1111
+ "type": "object",
1112
+ "required": ["against", "amountDb"],
1113
+ "additionalProperties": false,
1114
+ "properties": {
1115
+ "against": {
1116
+ "enum": ["music", "voiceover", "sfx", "source"]
1117
+ },
1118
+ "amountDb": {
1119
+ "type": "number",
1120
+ "maximum": 0
1121
+ },
1122
+ "attackFrames": {
1123
+ "type": "integer",
1124
+ "minimum": 0
1125
+ },
1126
+ "releaseFrames": {
1127
+ "type": "integer",
1128
+ "minimum": 0
1129
+ }
1130
+ }
1131
+ },
1132
+ "exportPreset": {
1133
+ "type": "object",
1134
+ "required": ["name", "format", "width", "height"],
1135
+ "additionalProperties": false,
1136
+ "properties": {
1137
+ "name": {
1138
+ "type": "string",
1139
+ "minLength": 1
1140
+ },
1141
+ "format": {
1142
+ "enum": ["mp4", "webm", "mov", "gif", "png-sequence"]
1143
+ },
1144
+ "codec": {
1145
+ "enum": ["h264", "hevc", "vp9", "prores"]
1146
+ },
1147
+ "width": {
1148
+ "type": "integer",
1149
+ "minimum": 1,
1150
+ "maximum": 7680
1151
+ },
1152
+ "height": {
1153
+ "type": "integer",
1154
+ "minimum": 1,
1155
+ "maximum": 7680
1156
+ },
1157
+ "fps": {
1158
+ "type": "integer",
1159
+ "minimum": 1,
1160
+ "maximum": 120
1161
+ },
1162
+ "bitrate": {
1163
+ "type": "string",
1164
+ "pattern": "^[0-9]+(k|K|m|M)$"
1165
+ },
1166
+ "crf": {
1167
+ "type": "integer",
1168
+ "minimum": 0,
1169
+ "maximum": 63
1170
+ },
1171
+ "audioCodec": {
1172
+ "enum": ["aac", "opus", "mp3", "pcm"]
1173
+ },
1174
+ "audioBitrate": {
1175
+ "type": "string",
1176
+ "pattern": "^[0-9]+(k|K)$"
1177
+ },
1178
+ "loudnessLufs": {
1179
+ "type": "number",
1180
+ "minimum": -70,
1181
+ "maximum": 0
1182
+ },
1183
+ "background": {
1184
+ "oneOf": [
1185
+ {
1186
+ "$ref": "#/$defs/colorOrTransparent"
1187
+ },
1188
+ {
1189
+ "type": "null"
1190
+ }
1191
+ ]
1192
+ },
1193
+ "layerOverrides": {
1194
+ "type": "object",
1195
+ "propertyNames": {
1196
+ "$ref": "#/$defs/identifier"
1197
+ },
1198
+ "additionalProperties": {
1199
+ "$ref": "#/$defs/layerOverride"
1200
+ }
1201
+ }
1202
+ }
1203
+ },
1204
+ "layerOverride": {
1205
+ "type": "object",
1206
+ "additionalProperties": false,
1207
+ "properties": {
1208
+ "startFrame": {
1209
+ "type": "integer",
1210
+ "minimum": 0
1211
+ },
1212
+ "durationFrames": {
1213
+ "type": "integer",
1214
+ "minimum": 1
1215
+ },
1216
+ "position": {
1217
+ "$ref": "#/$defs/position"
1218
+ },
1219
+ "anchor": {
1220
+ "$ref": "#/$defs/anchor"
1221
+ },
1222
+ "size": {
1223
+ "$ref": "#/$defs/size"
1224
+ },
1225
+ "opacity": {
1226
+ "type": "number",
1227
+ "minimum": 0,
1228
+ "maximum": 1
1229
+ },
1230
+ "rotation": {
1231
+ "type": "number"
1232
+ },
1233
+ "scale": {
1234
+ "type": "number",
1235
+ "exclusiveMinimum": 0
1236
+ },
1237
+ "z": {
1238
+ "type": ["integer", "null"]
1239
+ },
1240
+ "track": {
1241
+ "type": "string",
1242
+ "minLength": 1
1243
+ },
1244
+ "keyframes": {
1245
+ "$ref": "#/$defs/keyframes"
1246
+ },
1247
+ "effects": {
1248
+ "type": "array",
1249
+ "items": {
1250
+ "$ref": "#/$defs/effect"
1251
+ }
1252
+ },
1253
+ "mask": {
1254
+ "oneOf": [
1255
+ {
1256
+ "$ref": "#/$defs/layerMask"
1257
+ },
1258
+ {
1259
+ "type": "null"
1260
+ }
1261
+ ]
1262
+ },
1263
+ "transitionIn": {
1264
+ "oneOf": [
1265
+ {
1266
+ "$ref": "#/$defs/transition"
1267
+ },
1268
+ {
1269
+ "type": "null"
1270
+ }
1271
+ ]
1272
+ },
1273
+ "transitionOut": {
1274
+ "oneOf": [
1275
+ {
1276
+ "$ref": "#/$defs/transition"
1277
+ },
1278
+ {
1279
+ "type": "null"
1280
+ }
1281
+ ]
1282
+ },
1283
+ "fit": {
1284
+ "$ref": "#/$defs/fit"
1285
+ },
1286
+ "muted": {
1287
+ "type": "boolean"
1288
+ },
1289
+ "volume": {
1290
+ "type": "number",
1291
+ "minimum": 0,
1292
+ "maximum": 1
1293
+ },
1294
+ "playbackRate": {
1295
+ "type": "number",
1296
+ "exclusiveMinimum": 0
1297
+ },
1298
+ "crop": {
1299
+ "$ref": "#/$defs/videoCrop"
1300
+ },
1301
+ "text": {
1302
+ "type": "string"
1303
+ },
1304
+ "style": {
1305
+ "anyOf": [
1306
+ {
1307
+ "$ref": "#/$defs/textStyle"
1308
+ },
1309
+ {
1310
+ "$ref": "#/$defs/captionStyle"
1311
+ }
1312
+ ]
1313
+ },
1314
+ "shape": {
1315
+ "const": "rect"
1316
+ },
1317
+ "fill": {
1318
+ "$ref": "#/$defs/color"
1319
+ },
1320
+ "stroke": {
1321
+ "oneOf": [
1322
+ {
1323
+ "$ref": "#/$defs/stroke"
1324
+ },
1325
+ {
1326
+ "type": "null"
1327
+ }
1328
+ ]
1329
+ },
1330
+ "radius": {
1331
+ "type": "number",
1332
+ "minimum": 0
1333
+ },
1334
+ "safeArea": {
1335
+ "oneOf": [
1336
+ {
1337
+ "enum": ["bottom", "center", "top"]
1338
+ },
1339
+ {
1340
+ "$ref": "#/$defs/position"
1341
+ }
1342
+ ]
1343
+ }
1344
+ }
1345
+ },
1346
+ "keyframes": {
1347
+ "type": "object",
1348
+ "additionalProperties": false,
1349
+ "properties": {
1350
+ "opacity": {
1351
+ "$ref": "#/$defs/keyframeArray"
1352
+ },
1353
+ "x": {
1354
+ "$ref": "#/$defs/keyframeArray"
1355
+ },
1356
+ "y": {
1357
+ "$ref": "#/$defs/keyframeArray"
1358
+ },
1359
+ "scale": {
1360
+ "$ref": "#/$defs/keyframeArray"
1361
+ },
1362
+ "rotation": {
1363
+ "$ref": "#/$defs/keyframeArray"
1364
+ }
1365
+ }
1366
+ },
1367
+ "keyframeArray": {
1368
+ "type": "array",
1369
+ "minItems": 1,
1370
+ "items": {
1371
+ "$ref": "#/$defs/keyframe"
1372
+ }
1373
+ },
1374
+ "keyframe": {
1375
+ "type": "object",
1376
+ "required": ["frame", "value"],
1377
+ "additionalProperties": false,
1378
+ "properties": {
1379
+ "frame": {
1380
+ "type": "integer",
1381
+ "minimum": 0
1382
+ },
1383
+ "value": {
1384
+ "type": "number"
1385
+ },
1386
+ "easing": {
1387
+ "$ref": "#/$defs/easing"
1388
+ },
1389
+ "timing": {
1390
+ "$ref": "#/$defs/timing"
1391
+ }
1392
+ }
1393
+ },
1394
+ "effect": {
1395
+ "oneOf": [
1396
+ {
1397
+ "type": "object",
1398
+ "required": ["type", "radius"],
1399
+ "additionalProperties": false,
1400
+ "properties": {
1401
+ "type": {
1402
+ "const": "blur"
1403
+ },
1404
+ "radius": {
1405
+ "type": "number",
1406
+ "minimum": 0
1407
+ }
1408
+ }
1409
+ },
1410
+ {
1411
+ "type": "object",
1412
+ "required": ["type", "value"],
1413
+ "additionalProperties": false,
1414
+ "properties": {
1415
+ "type": {
1416
+ "enum": ["brightness", "contrast", "saturate"]
1417
+ },
1418
+ "value": {
1419
+ "type": "number",
1420
+ "minimum": 0
1421
+ }
1422
+ }
1423
+ },
1424
+ {
1425
+ "type": "object",
1426
+ "required": ["type", "color"],
1427
+ "additionalProperties": false,
1428
+ "properties": {
1429
+ "type": {
1430
+ "const": "tint"
1431
+ },
1432
+ "color": {
1433
+ "$ref": "#/$defs/color"
1434
+ }
1435
+ }
1436
+ }
1437
+ ]
1438
+ },
1439
+ "layerMask": {
1440
+ "type": "object",
1441
+ "required": ["source"],
1442
+ "additionalProperties": false,
1443
+ "properties": {
1444
+ "source": {
1445
+ "$ref": "#/$defs/maskSource"
1446
+ },
1447
+ "opacity": {
1448
+ "type": "number",
1449
+ "minimum": 0,
1450
+ "maximum": 1
1451
+ },
1452
+ "invert": {
1453
+ "type": "boolean"
1454
+ }
1455
+ }
1456
+ },
1457
+ "maskSource": {
1458
+ "oneOf": [
1459
+ {
1460
+ "type": "object",
1461
+ "required": ["kind", "shape"],
1462
+ "additionalProperties": false,
1463
+ "properties": {
1464
+ "kind": {
1465
+ "const": "shape"
1466
+ },
1467
+ "shape": {
1468
+ "enum": ["rect", "circle", "diamond"]
1469
+ }
1470
+ }
1471
+ },
1472
+ {
1473
+ "type": "object",
1474
+ "required": ["kind", "asset"],
1475
+ "additionalProperties": false,
1476
+ "properties": {
1477
+ "kind": {
1478
+ "const": "asset"
1479
+ },
1480
+ "asset": {
1481
+ "$ref": "#/$defs/identifier"
1482
+ },
1483
+ "mode": {
1484
+ "const": "alpha"
1485
+ },
1486
+ "resolution": {
1487
+ "$ref": "#/$defs/maskResolution"
1488
+ }
1489
+ }
1490
+ },
1491
+ {
1492
+ "type": "object",
1493
+ "required": ["kind", "type", "seed"],
1494
+ "additionalProperties": false,
1495
+ "properties": {
1496
+ "kind": {
1497
+ "const": "procedural"
1498
+ },
1499
+ "type": {
1500
+ "enum": ["linearGradient", "radialGradient", "scanlines"]
1501
+ },
1502
+ "seed": {
1503
+ "type": "integer",
1504
+ "minimum": 0
1505
+ },
1506
+ "direction": {
1507
+ "enum": ["up", "down", "left", "right"]
1508
+ },
1509
+ "softness": {
1510
+ "type": "number",
1511
+ "minimum": 0,
1512
+ "maximum": 1
1513
+ },
1514
+ "frequency": {
1515
+ "type": "number",
1516
+ "minimum": 1,
1517
+ "maximum": 256
1518
+ },
1519
+ "resolution": {
1520
+ "$ref": "#/$defs/maskResolution"
1521
+ }
1522
+ }
1523
+ }
1524
+ ]
1525
+ },
1526
+ "maskResolution": {
1527
+ "type": "object",
1528
+ "required": ["width", "height"],
1529
+ "additionalProperties": false,
1530
+ "properties": {
1531
+ "width": {
1532
+ "type": "integer",
1533
+ "minimum": 1,
1534
+ "maximum": 4096
1535
+ },
1536
+ "height": {
1537
+ "type": "integer",
1538
+ "minimum": 1,
1539
+ "maximum": 4096
1540
+ }
1541
+ }
1542
+ },
1543
+ "transition": {
1544
+ "type": "object",
1545
+ "required": ["type"],
1546
+ "additionalProperties": false,
1547
+ "anyOf": [
1548
+ { "required": ["durationFrames"] },
1549
+ {
1550
+ "properties": {
1551
+ "timing": {
1552
+ "$ref": "#/$defs/timingWithDuration"
1553
+ }
1554
+ },
1555
+ "required": ["timing"]
1556
+ }
1557
+ ],
1558
+ "properties": {
1559
+ "type": {
1560
+ "enum": [
1561
+ "fade",
1562
+ "slide",
1563
+ "wipe",
1564
+ "crossfade",
1565
+ "zoom",
1566
+ "push",
1567
+ "spin",
1568
+ "rotate",
1569
+ "flip",
1570
+ "blurDissolve",
1571
+ "colorDissolve",
1572
+ "dip",
1573
+ "iris",
1574
+ "stretch",
1575
+ "squeeze",
1576
+ "clockWipe",
1577
+ "barWipe",
1578
+ "gridWipe",
1579
+ "tileReveal",
1580
+ "radialBlur",
1581
+ "zoomBlur",
1582
+ "bookFlip",
1583
+ "pageCurlLite",
1584
+ "skewSlide",
1585
+ "expandMask",
1586
+ "letterboxReveal",
1587
+ "filmFlash",
1588
+ "cameraWhip"
1589
+ ]
1590
+ },
1591
+ "durationFrames": {
1592
+ "type": "integer",
1593
+ "minimum": 1
1594
+ },
1595
+ "direction": {
1596
+ "enum": ["up", "down", "left", "right"]
1597
+ },
1598
+ "axis": {
1599
+ "enum": ["x", "y"]
1600
+ },
1601
+ "shape": {
1602
+ "enum": ["circle", "diamond"]
1603
+ },
1604
+ "color": {
1605
+ "$ref": "#/$defs/color"
1606
+ },
1607
+ "amount": {
1608
+ "type": "number",
1609
+ "minimum": 0
1610
+ },
1611
+ "intensity": {
1612
+ "type": "number",
1613
+ "minimum": 0
1614
+ },
1615
+ "rows": {
1616
+ "type": "integer",
1617
+ "minimum": 1,
1618
+ "maximum": 32
1619
+ },
1620
+ "columns": {
1621
+ "type": "integer",
1622
+ "minimum": 1,
1623
+ "maximum": 32
1624
+ },
1625
+ "easing": {
1626
+ "$ref": "#/$defs/easing"
1627
+ },
1628
+ "timing": {
1629
+ "$ref": "#/$defs/timing"
1630
+ }
1631
+ }
1632
+ },
1633
+ "timing": {
1634
+ "oneOf": [
1635
+ {
1636
+ "type": "object",
1637
+ "required": ["type"],
1638
+ "additionalProperties": false,
1639
+ "properties": {
1640
+ "type": {
1641
+ "const": "tween"
1642
+ },
1643
+ "durationFrames": {
1644
+ "type": "integer",
1645
+ "minimum": 1
1646
+ },
1647
+ "easing": {
1648
+ "$ref": "#/$defs/easing"
1649
+ }
1650
+ }
1651
+ },
1652
+ {
1653
+ "type": "object",
1654
+ "required": ["type"],
1655
+ "additionalProperties": false,
1656
+ "properties": {
1657
+ "type": {
1658
+ "const": "spring"
1659
+ },
1660
+ "durationFrames": {
1661
+ "type": "integer",
1662
+ "minimum": 1
1663
+ },
1664
+ "stiffness": {
1665
+ "type": "number",
1666
+ "exclusiveMinimum": 0
1667
+ },
1668
+ "damping": {
1669
+ "type": "number",
1670
+ "exclusiveMinimum": 0
1671
+ },
1672
+ "mass": {
1673
+ "type": "number",
1674
+ "exclusiveMinimum": 0
1675
+ },
1676
+ "restSpeed": {
1677
+ "type": "number",
1678
+ "minimum": 0
1679
+ },
1680
+ "bounce": {
1681
+ "type": "number",
1682
+ "minimum": 0,
1683
+ "maximum": 1
1684
+ }
1685
+ }
1686
+ },
1687
+ {
1688
+ "type": "object",
1689
+ "required": ["type", "steps"],
1690
+ "additionalProperties": false,
1691
+ "properties": {
1692
+ "type": {
1693
+ "const": "steps"
1694
+ },
1695
+ "durationFrames": {
1696
+ "type": "integer",
1697
+ "minimum": 1
1698
+ },
1699
+ "steps": {
1700
+ "type": "integer",
1701
+ "minimum": 1
1702
+ },
1703
+ "direction": {
1704
+ "enum": ["start", "end"]
1705
+ }
1706
+ }
1707
+ },
1708
+ {
1709
+ "type": "object",
1710
+ "required": ["type", "segments"],
1711
+ "additionalProperties": false,
1712
+ "properties": {
1713
+ "type": {
1714
+ "const": "sequence"
1715
+ },
1716
+ "segments": {
1717
+ "type": "array",
1718
+ "minItems": 1,
1719
+ "items": {
1720
+ "$ref": "#/$defs/timingSequenceSegment"
1721
+ }
1722
+ }
1723
+ }
1724
+ },
1725
+ {
1726
+ "type": "object",
1727
+ "required": ["type", "timing", "childCount", "eachFrames"],
1728
+ "additionalProperties": false,
1729
+ "properties": {
1730
+ "type": {
1731
+ "const": "stagger"
1732
+ },
1733
+ "timing": {
1734
+ "$ref": "#/$defs/timing"
1735
+ },
1736
+ "childCount": {
1737
+ "type": "integer",
1738
+ "minimum": 1
1739
+ },
1740
+ "eachFrames": {
1741
+ "type": "integer",
1742
+ "minimum": 0
1743
+ },
1744
+ "childIndex": {
1745
+ "type": "integer",
1746
+ "minimum": 0
1747
+ },
1748
+ "from": {
1749
+ "enum": ["start", "center", "end"]
1750
+ }
1751
+ }
1752
+ }
1753
+ ]
1754
+ },
1755
+ "timingSequenceSegment": {
1756
+ "type": "object",
1757
+ "required": ["durationFrames"],
1758
+ "additionalProperties": false,
1759
+ "properties": {
1760
+ "durationFrames": {
1761
+ "type": "integer",
1762
+ "minimum": 1
1763
+ },
1764
+ "timing": {
1765
+ "$ref": "#/$defs/timing"
1766
+ },
1767
+ "from": {
1768
+ "type": "number"
1769
+ },
1770
+ "to": {
1771
+ "type": "number"
1772
+ }
1773
+ }
1774
+ },
1775
+ "timingWithDuration": {
1776
+ "oneOf": [
1777
+ {
1778
+ "allOf": [
1779
+ {
1780
+ "$ref": "#/$defs/timing"
1781
+ },
1782
+ {
1783
+ "type": "object",
1784
+ "required": ["durationFrames"],
1785
+ "properties": {
1786
+ "type": {
1787
+ "enum": ["tween", "spring", "steps"]
1788
+ },
1789
+ "durationFrames": {
1790
+ "type": "integer",
1791
+ "minimum": 1
1792
+ }
1793
+ }
1794
+ }
1795
+ ]
1796
+ },
1797
+ {
1798
+ "allOf": [
1799
+ {
1800
+ "$ref": "#/$defs/timing"
1801
+ },
1802
+ {
1803
+ "type": "object",
1804
+ "required": ["segments"],
1805
+ "properties": {
1806
+ "type": {
1807
+ "const": "sequence"
1808
+ }
1809
+ }
1810
+ }
1811
+ ]
1812
+ },
1813
+ {
1814
+ "type": "object",
1815
+ "required": ["type", "timing", "childCount", "eachFrames"],
1816
+ "additionalProperties": false,
1817
+ "properties": {
1818
+ "type": {
1819
+ "const": "stagger"
1820
+ },
1821
+ "timing": {
1822
+ "$ref": "#/$defs/timingWithDuration"
1823
+ },
1824
+ "childCount": {
1825
+ "type": "integer",
1826
+ "minimum": 1
1827
+ },
1828
+ "eachFrames": {
1829
+ "type": "integer",
1830
+ "minimum": 0
1831
+ },
1832
+ "childIndex": {
1833
+ "type": "integer",
1834
+ "minimum": 0
1835
+ },
1836
+ "from": {
1837
+ "enum": ["start", "center", "end"]
1838
+ }
1839
+ }
1840
+ }
1841
+ ]
1842
+ },
1843
+ "position": {
1844
+ "type": "object",
1845
+ "additionalProperties": false,
1846
+ "properties": {
1847
+ "x": {
1848
+ "$ref": "#/$defs/dimension"
1849
+ },
1850
+ "y": {
1851
+ "$ref": "#/$defs/dimension"
1852
+ }
1853
+ }
1854
+ },
1855
+ "size": {
1856
+ "type": "object",
1857
+ "additionalProperties": false,
1858
+ "properties": {
1859
+ "width": {
1860
+ "$ref": "#/$defs/nonNegativeDimension"
1861
+ },
1862
+ "height": {
1863
+ "$ref": "#/$defs/nonNegativeDimension"
1864
+ }
1865
+ }
1866
+ },
1867
+ "anchor": {
1868
+ "oneOf": [
1869
+ {
1870
+ "enum": [
1871
+ "top-left",
1872
+ "top",
1873
+ "top-right",
1874
+ "left",
1875
+ "center",
1876
+ "right",
1877
+ "bottom-left",
1878
+ "bottom",
1879
+ "bottom-right"
1880
+ ]
1881
+ },
1882
+ {
1883
+ "type": "object",
1884
+ "required": ["x", "y"],
1885
+ "additionalProperties": false,
1886
+ "properties": {
1887
+ "x": {
1888
+ "type": "number",
1889
+ "minimum": 0,
1890
+ "maximum": 1
1891
+ },
1892
+ "y": {
1893
+ "type": "number",
1894
+ "minimum": 0,
1895
+ "maximum": 1
1896
+ }
1897
+ }
1898
+ }
1899
+ ]
1900
+ },
1901
+ "dimension": {
1902
+ "oneOf": [
1903
+ {
1904
+ "type": "number"
1905
+ },
1906
+ {
1907
+ "$ref": "#/$defs/relativeUnit"
1908
+ }
1909
+ ]
1910
+ },
1911
+ "nonNegativeDimension": {
1912
+ "oneOf": [
1913
+ {
1914
+ "type": "number",
1915
+ "minimum": 0
1916
+ },
1917
+ {
1918
+ "$ref": "#/$defs/relativeUnit"
1919
+ }
1920
+ ]
1921
+ },
1922
+ "relativeUnit": {
1923
+ "type": "string",
1924
+ "pattern": "^-?[0-9]+(?:\\.[0-9]+)?%(?:w|h)?$"
1925
+ },
1926
+ "fit": {
1927
+ "enum": ["cover", "contain", "fill", "none"]
1928
+ },
1929
+ "videoCrop": {
1930
+ "oneOf": [
1931
+ {
1932
+ "type": "object",
1933
+ "required": ["mode"],
1934
+ "additionalProperties": false,
1935
+ "properties": {
1936
+ "mode": {
1937
+ "const": "center"
1938
+ }
1939
+ }
1940
+ },
1941
+ {
1942
+ "type": "object",
1943
+ "required": ["mode"],
1944
+ "additionalProperties": false,
1945
+ "properties": {
1946
+ "mode": {
1947
+ "const": "subject"
1948
+ },
1949
+ "x": {
1950
+ "type": "number",
1951
+ "minimum": 0,
1952
+ "maximum": 1
1953
+ },
1954
+ "y": {
1955
+ "type": "number",
1956
+ "minimum": 0,
1957
+ "maximum": 1
1958
+ },
1959
+ "keyframes": {
1960
+ "type": "array",
1961
+ "minItems": 1,
1962
+ "items": {
1963
+ "$ref": "#/$defs/subjectCropKeyframe"
1964
+ }
1965
+ },
1966
+ "smoothingFrames": {
1967
+ "type": "integer",
1968
+ "minimum": 0
1969
+ },
1970
+ "source": {
1971
+ "type": "string",
1972
+ "minLength": 1
1973
+ }
1974
+ },
1975
+ "anyOf": [
1976
+ {
1977
+ "required": ["x"]
1978
+ },
1979
+ {
1980
+ "required": ["y"]
1981
+ },
1982
+ {
1983
+ "required": ["keyframes"]
1984
+ }
1985
+ ]
1986
+ }
1987
+ ]
1988
+ },
1989
+ "subjectCropKeyframe": {
1990
+ "type": "object",
1991
+ "required": ["frame", "x", "y"],
1992
+ "additionalProperties": false,
1993
+ "properties": {
1994
+ "frame": {
1995
+ "type": "integer",
1996
+ "minimum": 0
1997
+ },
1998
+ "x": {
1999
+ "type": "number",
2000
+ "minimum": 0,
2001
+ "maximum": 1
2002
+ },
2003
+ "y": {
2004
+ "type": "number",
2005
+ "minimum": 0,
2006
+ "maximum": 1
2007
+ },
2008
+ "easing": {
2009
+ "$ref": "#/$defs/easing"
2010
+ }
2011
+ }
2012
+ },
2013
+ "stroke": {
2014
+ "type": "object",
2015
+ "required": ["color", "width"],
2016
+ "additionalProperties": false,
2017
+ "properties": {
2018
+ "color": {
2019
+ "$ref": "#/$defs/color"
2020
+ },
2021
+ "width": {
2022
+ "type": "number",
2023
+ "minimum": 0
2024
+ }
2025
+ }
2026
+ },
2027
+ "shadow": {
2028
+ "type": "object",
2029
+ "required": ["color", "x", "y", "blur"],
2030
+ "additionalProperties": false,
2031
+ "properties": {
2032
+ "color": {
2033
+ "$ref": "#/$defs/color"
2034
+ },
2035
+ "x": {
2036
+ "type": "number"
2037
+ },
2038
+ "y": {
2039
+ "type": "number"
2040
+ },
2041
+ "blur": {
2042
+ "type": "number",
2043
+ "minimum": 0
2044
+ }
2045
+ }
2046
+ },
2047
+ "colorOrTransparent": {
2048
+ "anyOf": [
2049
+ {
2050
+ "$ref": "#/$defs/color"
2051
+ },
2052
+ {
2053
+ "const": "transparent"
2054
+ }
2055
+ ]
2056
+ },
2057
+ "color": {
2058
+ "type": "string",
2059
+ "minLength": 1
2060
+ },
2061
+ "easing": {
2062
+ "oneOf": [
2063
+ {
2064
+ "enum": [
2065
+ "linear",
2066
+ "inQuad",
2067
+ "outQuad",
2068
+ "inOutQuad",
2069
+ "inCubic",
2070
+ "outCubic",
2071
+ "inOutCubic",
2072
+ "inCirc",
2073
+ "outCirc",
2074
+ "inOutCirc",
2075
+ "inExpo",
2076
+ "outExpo",
2077
+ "inOutExpo",
2078
+ "anticipate",
2079
+ "back",
2080
+ "inBack",
2081
+ "outBack",
2082
+ "inOutBack",
2083
+ "inElastic",
2084
+ "outElastic",
2085
+ "inOutElastic",
2086
+ "inBounce",
2087
+ "outBounce",
2088
+ "inOutBounce"
2089
+ ]
2090
+ },
2091
+ {
2092
+ "type": "string",
2093
+ "pattern": "^cubic-bezier\\(-?[0-9]+(?:\\.[0-9]+)?,-?[0-9]+(?:\\.[0-9]+)?,-?[0-9]+(?:\\.[0-9]+)?,-?[0-9]+(?:\\.[0-9]+)?\\)$"
2094
+ }
2095
+ ]
2096
+ },
2097
+ "identifier": {
2098
+ "type": "string",
2099
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
2100
+ "minLength": 1,
2101
+ "maxLength": 128
2102
+ }
2103
+ }
2104
+ }