sketchmark 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +274 -188
  2. package/bin/editor-ui.cjs +2285 -0
  3. package/bin/preview-ui.cjs +74 -0
  4. package/bin/sketchmark.cjs +648 -2008
  5. package/dist/src/animatable.d.ts +21 -0
  6. package/dist/src/animatable.js +439 -0
  7. package/dist/src/builders/index.d.ts +1 -11
  8. package/dist/src/builders/index.js +1 -19
  9. package/dist/src/diagnostics.js +1 -64
  10. package/dist/src/edit.d.ts +27 -0
  11. package/dist/src/edit.js +162 -0
  12. package/dist/src/index.d.ts +4 -13
  13. package/dist/src/index.js +4 -13
  14. package/dist/src/keyframes.d.ts +48 -0
  15. package/dist/src/keyframes.js +182 -0
  16. package/dist/src/motion.d.ts +4 -0
  17. package/dist/src/motion.js +262 -0
  18. package/dist/src/normalize.js +120 -151
  19. package/dist/src/presets/characters.d.ts +15 -0
  20. package/dist/src/presets/characters.js +113 -0
  21. package/dist/src/presets/compose.d.ts +5 -0
  22. package/dist/src/presets/compose.js +80 -0
  23. package/dist/src/presets/effects.d.ts +40 -0
  24. package/dist/src/presets/effects.js +79 -0
  25. package/dist/src/presets/helpers.d.ts +33 -0
  26. package/dist/src/presets/helpers.js +165 -0
  27. package/dist/src/presets/index.d.ts +9 -0
  28. package/dist/src/presets/index.js +48 -0
  29. package/dist/src/presets/motions.d.ts +33 -0
  30. package/dist/src/presets/motions.js +75 -0
  31. package/dist/src/presets/scenes.d.ts +35 -0
  32. package/dist/src/presets/scenes.js +134 -0
  33. package/dist/src/presets/shapes.d.ts +71 -0
  34. package/dist/src/presets/shapes.js +96 -0
  35. package/dist/src/presets/transitions.d.ts +29 -0
  36. package/dist/src/presets/transitions.js +113 -0
  37. package/dist/src/presets/types.d.ts +34 -0
  38. package/dist/src/presets/types.js +2 -0
  39. package/dist/src/render/html.js +1 -4
  40. package/dist/src/render/svg.d.ts +2 -2
  41. package/dist/src/render/svg.js +86 -82
  42. package/dist/src/render/three-html.js +67 -113
  43. package/dist/src/scenes.js +1 -0
  44. package/dist/src/schema.js +218 -280
  45. package/dist/src/shapes/builtins.js +11 -47
  46. package/dist/src/shapes/common.js +12 -11
  47. package/dist/src/shapes/registry.d.ts +0 -1
  48. package/dist/src/shapes/registry.js +0 -4
  49. package/dist/src/shapes/types.d.ts +1 -3
  50. package/dist/src/types.d.ts +57 -288
  51. package/dist/src/utils.d.ts +2 -11
  52. package/dist/src/utils.js +13 -70
  53. package/dist/src/validate.js +321 -275
  54. package/dist/tests/run.js +576 -510
  55. package/package.json +46 -52
  56. package/schema/visual.schema.json +1086 -930
@@ -1,930 +1,1086 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://sketchmark.dev/schema/visual.schema.json",
4
- "title": "Sketchmark Primitive Visual Document",
5
- "type": "object",
6
- "required": [
7
- "version",
8
- "canvas"
9
- ],
10
- "additionalProperties": true,
11
- "properties": {
12
- "version": {
13
- "const": 1
14
- },
15
- "canvas": {
16
- "type": "object",
17
- "required": [
18
- "width",
19
- "height"
20
- ],
21
- "additionalProperties": true,
22
- "properties": {
23
- "width": {
24
- "type": "number"
25
- },
26
- "height": {
27
- "type": "number"
28
- },
29
- "background": {
30
- "type": "string"
31
- },
32
- "duration": {
33
- "type": "number"
34
- },
35
- "fps": {
36
- "type": "number"
37
- },
38
- "space": {
39
- "enum": [
40
- "2d",
41
- "3d"
42
- ]
43
- },
44
- "renderer": {
45
- "enum": [
46
- "svg",
47
- "three"
48
- ]
49
- }
50
- }
51
- },
52
- "elements": {
53
- "type": "array",
54
- "items": {
55
- "$ref": "#/$defs/element"
56
- }
57
- },
58
- "imports": {
59
- "type": "object",
60
- "additionalProperties": {
61
- "type": "string"
62
- }
63
- },
64
- "assets": {
65
- "type": "object",
66
- "additionalProperties": {
67
- "type": "string"
68
- }
69
- },
70
- "exports": {
71
- "type": "object",
72
- "additionalProperties": {
73
- "type": "object",
74
- "properties": {
75
- "format": {
76
- "enum": [
77
- "svg",
78
- "html",
79
- "png",
80
- "jpg",
81
- "mp4",
82
- "webm",
83
- "pdf",
84
- "pptx"
85
- ]
86
- },
87
- "sequence": {
88
- "type": "string"
89
- },
90
- "scene": {
91
- "type": "string"
92
- }
93
- },
94
- "additionalProperties": true
95
- }
96
- },
97
- "scenes": {
98
- "type": "object",
99
- "additionalProperties": {
100
- "type": "object",
101
- "required": [
102
- "elements"
103
- ],
104
- "properties": {
105
- "canvas": {
106
- "type": "object"
107
- },
108
- "elements": {
109
- "type": "array",
110
- "items": {
111
- "$ref": "#/$defs/element"
112
- }
113
- },
114
- "steps": {
115
- "type": "array",
116
- "items": {
117
- "$ref": "#/$defs/deckStep"
118
- }
119
- }
120
- },
121
- "additionalProperties": true
122
- }
123
- },
124
- "sequences": {
125
- "type": "object",
126
- "additionalProperties": {
127
- "type": "object",
128
- "required": [
129
- "id",
130
- "clips"
131
- ],
132
- "properties": {
133
- "id": {
134
- "type": "string"
135
- },
136
- "clips": {
137
- "type": "array",
138
- "items": {
139
- "$ref": "#/$defs/clip"
140
- }
141
- }
142
- },
143
- "additionalProperties": true
144
- }
145
- }
146
- },
147
- "$defs": {
148
- "point2": {
149
- "type": "array",
150
- "minItems": 2,
151
- "maxItems": 2,
152
- "items": {
153
- "type": "number"
154
- }
155
- },
156
- "point3": {
157
- "type": "array",
158
- "minItems": 3,
159
- "maxItems": 3,
160
- "items": {
161
- "type": "number"
162
- }
163
- },
164
- "endpoint": {
165
- "oneOf": [
166
- {
167
- "$ref": "#/$defs/point2"
168
- },
169
- {
170
- "type": "string"
171
- }
172
- ]
173
- },
174
- "paint": {
175
- "oneOf": [
176
- {
177
- "type": "string"
178
- },
179
- {
180
- "type": "object",
181
- "required": [
182
- "type",
183
- "from",
184
- "to",
185
- "stops"
186
- ],
187
- "properties": {
188
- "type": {
189
- "const": "linearGradient"
190
- },
191
- "from": {
192
- "$ref": "#/$defs/point2"
193
- },
194
- "to": {
195
- "$ref": "#/$defs/point2"
196
- },
197
- "stops": {
198
- "$ref": "#/$defs/gradientStops"
199
- }
200
- },
201
- "additionalProperties": true
202
- },
203
- {
204
- "type": "object",
205
- "required": [
206
- "type",
207
- "center",
208
- "radius",
209
- "stops"
210
- ],
211
- "properties": {
212
- "type": {
213
- "const": "radialGradient"
214
- },
215
- "center": {
216
- "$ref": "#/$defs/point2"
217
- },
218
- "radius": {
219
- "type": "number"
220
- },
221
- "focus": {
222
- "$ref": "#/$defs/point2"
223
- },
224
- "stops": {
225
- "$ref": "#/$defs/gradientStops"
226
- }
227
- },
228
- "additionalProperties": true
229
- },
230
- {
231
- "type": "object",
232
- "required": [
233
- "type",
234
- "src",
235
- "width",
236
- "height"
237
- ],
238
- "properties": {
239
- "type": {
240
- "const": "pattern"
241
- },
242
- "src": {
243
- "type": "string"
244
- },
245
- "x": {
246
- "type": "number"
247
- },
248
- "y": {
249
- "type": "number"
250
- },
251
- "width": {
252
- "type": "number"
253
- },
254
- "height": {
255
- "type": "number"
256
- },
257
- "fit": {
258
- "$ref": "#/$defs/imageFit"
259
- },
260
- "opacity": {
261
- "type": "number"
262
- }
263
- },
264
- "additionalProperties": true
265
- }
266
- ]
267
- },
268
- "imageFit": {
269
- "enum": [
270
- "fill",
271
- "contain",
272
- "cover"
273
- ]
274
- },
275
- "gradientStops": {
276
- "type": "array",
277
- "minItems": 2,
278
- "items": {
279
- "oneOf": [
280
- {
281
- "type": "array",
282
- "minItems": 2,
283
- "maxItems": 2,
284
- "prefixItems": [
285
- {
286
- "type": "number"
287
- },
288
- {
289
- "type": "string"
290
- }
291
- ]
292
- },
293
- {
294
- "type": "object",
295
- "required": [
296
- "offset",
297
- "color"
298
- ],
299
- "properties": {
300
- "offset": {
301
- "type": "number"
302
- },
303
- "color": {
304
- "type": "string"
305
- }
306
- },
307
- "additionalProperties": true
308
- }
309
- ]
310
- }
311
- },
312
- "effects": {
313
- "type": "object",
314
- "properties": {
315
- "blur": {
316
- "type": "number"
317
- },
318
- "brightness": {
319
- "type": "number"
320
- },
321
- "contrast": {
322
- "type": "number"
323
- },
324
- "saturate": {
325
- "type": "number"
326
- },
327
- "hueRotate": {
328
- "type": "number"
329
- },
330
- "shadow": {
331
- "type": "object",
332
- "required": [
333
- "dx",
334
- "dy",
335
- "blur",
336
- "color"
337
- ],
338
- "properties": {
339
- "dx": {
340
- "type": "number"
341
- },
342
- "dy": {
343
- "type": "number"
344
- },
345
- "blur": {
346
- "type": "number"
347
- },
348
- "color": {
349
- "type": "string"
350
- },
351
- "opacity": {
352
- "type": "number"
353
- }
354
- },
355
- "additionalProperties": true
356
- }
357
- },
358
- "additionalProperties": true
359
- },
360
- "clipShape": {
361
- "oneOf": [
362
- {
363
- "type": "object",
364
- "required": [
365
- "type",
366
- "x",
367
- "y",
368
- "width",
369
- "height"
370
- ],
371
- "properties": {
372
- "type": {
373
- "const": "rect"
374
- },
375
- "x": {
376
- "type": "number"
377
- },
378
- "y": {
379
- "type": "number"
380
- },
381
- "width": {
382
- "type": "number"
383
- },
384
- "height": {
385
- "type": "number"
386
- },
387
- "radius": {
388
- "type": "number"
389
- },
390
- "opacity": {
391
- "type": "number"
392
- }
393
- },
394
- "additionalProperties": true
395
- },
396
- {
397
- "type": "object",
398
- "required": [
399
- "type",
400
- "cx",
401
- "cy",
402
- "radius"
403
- ],
404
- "properties": {
405
- "type": {
406
- "const": "circle"
407
- },
408
- "cx": {
409
- "type": "number"
410
- },
411
- "cy": {
412
- "type": "number"
413
- },
414
- "radius": {
415
- "type": "number"
416
- },
417
- "opacity": {
418
- "type": "number"
419
- }
420
- },
421
- "additionalProperties": true
422
- },
423
- {
424
- "type": "object",
425
- "required": [
426
- "type",
427
- "d"
428
- ],
429
- "properties": {
430
- "type": {
431
- "const": "path"
432
- },
433
- "d": {
434
- "type": "string"
435
- },
436
- "opacity": {
437
- "type": "number"
438
- }
439
- },
440
- "additionalProperties": true
441
- }
442
- ]
443
- },
444
- "imageSource": {
445
- "type": "object",
446
- "required": [
447
- "x",
448
- "y",
449
- "width",
450
- "height",
451
- "imageWidth",
452
- "imageHeight"
453
- ],
454
- "properties": {
455
- "x": {
456
- "type": "number"
457
- },
458
- "y": {
459
- "type": "number"
460
- },
461
- "width": {
462
- "type": "number"
463
- },
464
- "height": {
465
- "type": "number"
466
- },
467
- "imageWidth": {
468
- "type": "number"
469
- },
470
- "imageHeight": {
471
- "type": "number"
472
- }
473
- },
474
- "additionalProperties": true
475
- },
476
- "animationValue": {
477
- "type": "object",
478
- "additionalProperties": true,
479
- "properties": {
480
- "from": {
481
- "oneOf": [
482
- {
483
- "type": "number"
484
- },
485
- {
486
- "type": "string"
487
- }
488
- ]
489
- },
490
- "to": {
491
- "oneOf": [
492
- {
493
- "type": "number"
494
- },
495
- {
496
- "type": "string"
497
- }
498
- ]
499
- },
500
- "duration": {
501
- "type": "number"
502
- },
503
- "delay": {
504
- "type": "number"
505
- },
506
- "ease": {
507
- "type": "string"
508
- },
509
- "keyframes": {
510
- "type": "array",
511
- "items": {
512
- "type": "array",
513
- "minItems": 2,
514
- "maxItems": 2,
515
- "prefixItems": [
516
- {
517
- "type": "number"
518
- },
519
- {
520
- "oneOf": [
521
- {
522
- "type": "number"
523
- },
524
- {
525
- "type": "string"
526
- }
527
- ]
528
- }
529
- ]
530
- }
531
- }
532
- }
533
- },
534
- "clip": {
535
- "type": "object",
536
- "required": [
537
- "scene",
538
- "duration"
539
- ],
540
- "properties": {
541
- "scene": {
542
- "type": "string"
543
- },
544
- "duration": {
545
- "type": "number"
546
- },
547
- "transition": {
548
- "oneOf": [
549
- {
550
- "enum": [
551
- "cut",
552
- "fade"
553
- ]
554
- },
555
- {
556
- "type": "object",
557
- "required": [
558
- "type"
559
- ],
560
- "properties": {
561
- "type": {
562
- "enum": [
563
- "cut",
564
- "fade"
565
- ]
566
- },
567
- "duration": {
568
- "type": "number"
569
- }
570
- },
571
- "additionalProperties": true
572
- }
573
- ]
574
- }
575
- },
576
- "additionalProperties": true
577
- },
578
- "deckStep": {
579
- "type": "object",
580
- "required": [
581
- "id"
582
- ],
583
- "properties": {
584
- "id": {
585
- "type": "string"
586
- },
587
- "show": {
588
- "type": "array",
589
- "items": {
590
- "type": "string"
591
- }
592
- },
593
- "hide": {
594
- "type": "array",
595
- "items": {
596
- "type": "string"
597
- }
598
- },
599
- "duration": {
600
- "type": "number"
601
- }
602
- },
603
- "additionalProperties": true
604
- },
605
- "element": {
606
- "type": "object",
607
- "required": [
608
- "type"
609
- ],
610
- "additionalProperties": true,
611
- "properties": {
612
- "id": {
613
- "type": "string"
614
- },
615
- "type": {
616
- "enum": [
617
- "rect",
618
- "circle",
619
- "ellipse",
620
- "line",
621
- "arrow",
622
- "arc",
623
- "curve",
624
- "polyline",
625
- "polygon",
626
- "path",
627
- "text",
628
- "image",
629
- "point",
630
- "group",
631
- "cuboid",
632
- "sphere",
633
- "plane",
634
- "line3d",
635
- "text3d",
636
- "light"
637
- ]
638
- },
639
- "opacity": {
640
- "type": "number"
641
- },
642
- "fill": {
643
- "$ref": "#/$defs/paint"
644
- },
645
- "stroke": {
646
- "$ref": "#/$defs/paint"
647
- },
648
- "strokeWidth": {
649
- "type": "number"
650
- },
651
- "dashArray": {
652
- "type": "array",
653
- "items": {
654
- "type": "number"
655
- }
656
- },
657
- "strokeCap": {
658
- "enum": [
659
- "butt",
660
- "round",
661
- "square"
662
- ]
663
- },
664
- "strokeJoin": {
665
- "enum": [
666
- "miter",
667
- "round",
668
- "bevel"
669
- ]
670
- },
671
- "miterLimit": {
672
- "type": "number"
673
- },
674
- "dashOffset": {
675
- "type": "number"
676
- },
677
- "drawStart": {
678
- "type": "number"
679
- },
680
- "drawEnd": {
681
- "type": "number"
682
- },
683
- "effects": {
684
- "$ref": "#/$defs/effects"
685
- },
686
- "blendMode": {
687
- "type": "string"
688
- },
689
- "rotation": {
690
- "type": "number"
691
- },
692
- "scale": {
693
- "type": "number"
694
- },
695
- "scaleX": {
696
- "type": "number"
697
- },
698
- "scaleY": {
699
- "type": "number"
700
- },
701
- "origin": {
702
- "oneOf": [
703
- {
704
- "type": "string"
705
- },
706
- {
707
- "$ref": "#/$defs/point2"
708
- }
709
- ]
710
- },
711
- "clip": {
712
- "$ref": "#/$defs/clipShape"
713
- },
714
- "mask": {
715
- "$ref": "#/$defs/clipShape"
716
- },
717
- "animate": {
718
- "type": "object",
719
- "additionalProperties": {
720
- "$ref": "#/$defs/animationValue"
721
- }
722
- },
723
- "metadata": {
724
- "type": "object",
725
- "additionalProperties": true
726
- },
727
- "align": {
728
- "enum": [
729
- "left",
730
- "center",
731
- "right"
732
- ]
733
- },
734
- "valign": {
735
- "enum": [
736
- "top",
737
- "middle",
738
- "bottom"
739
- ]
740
- },
741
- "fontSize": {
742
- "type": "number"
743
- },
744
- "fontFamily": {
745
- "type": "string"
746
- },
747
- "weight": {
748
- "oneOf": [
749
- {
750
- "type": "number"
751
- },
752
- {
753
- "type": "string"
754
- }
755
- ]
756
- },
757
- "fontStyle": {
758
- "type": "string"
759
- },
760
- "lineHeight": {
761
- "type": "number"
762
- },
763
- "letterSpacing": {
764
- "type": "number"
765
- },
766
- "maxWidth": {
767
- "type": "number"
768
- },
769
- "wrap": {
770
- "type": "boolean"
771
- },
772
- "label": {
773
- "type": "string"
774
- },
775
- "labelX": {
776
- "type": "number"
777
- },
778
- "labelY": {
779
- "type": "number"
780
- },
781
- "progress": {
782
- "oneOf": [
783
- {
784
- "type": "number"
785
- },
786
- {
787
- "$ref": "#/$defs/animationValue"
788
- }
789
- ]
790
- },
791
- "follow": {
792
- "type": "string"
793
- },
794
- "rotationX": {
795
- "type": "number"
796
- },
797
- "rotationY": {
798
- "type": "number"
799
- },
800
- "rotationZ": {
801
- "type": "number"
802
- },
803
- "scaleZ": {
804
- "type": "number"
805
- },
806
- "x": {
807
- "type": "number"
808
- },
809
- "y": {
810
- "type": "number"
811
- },
812
- "width": {
813
- "type": "number"
814
- },
815
- "height": {
816
- "type": "number"
817
- },
818
- "cx": {
819
- "type": "number"
820
- },
821
- "cy": {
822
- "type": "number"
823
- },
824
- "radius": {
825
- "type": "number"
826
- },
827
- "rx": {
828
- "type": "number"
829
- },
830
- "ry": {
831
- "type": "number"
832
- },
833
- "from": {
834
- "oneOf": [
835
- {
836
- "$ref": "#/$defs/endpoint"
837
- },
838
- {
839
- "$ref": "#/$defs/point3"
840
- }
841
- ]
842
- },
843
- "to": {
844
- "oneOf": [
845
- {
846
- "$ref": "#/$defs/endpoint"
847
- },
848
- {
849
- "$ref": "#/$defs/point3"
850
- }
851
- ]
852
- },
853
- "startAngle": {
854
- "type": "number"
855
- },
856
- "endAngle": {
857
- "type": "number"
858
- },
859
- "counterclockwise": {
860
- "type": "boolean"
861
- },
862
- "closed": {
863
- "type": "boolean"
864
- },
865
- "control1": {
866
- "$ref": "#/$defs/point2"
867
- },
868
- "control2": {
869
- "$ref": "#/$defs/point2"
870
- },
871
- "points": {
872
- "type": "array",
873
- "items": {
874
- "$ref": "#/$defs/point2"
875
- }
876
- },
877
- "d": {
878
- "type": "string"
879
- },
880
- "text": {
881
- "type": "string"
882
- },
883
- "lines": {
884
- "type": "array",
885
- "items": {
886
- "type": "string"
887
- }
888
- },
889
- "src": {
890
- "type": "string"
891
- },
892
- "fit": {
893
- "$ref": "#/$defs/imageFit"
894
- },
895
- "source": {
896
- "$ref": "#/$defs/imageSource"
897
- },
898
- "children": {
899
- "type": "array",
900
- "items": {
901
- "$ref": "#/$defs/element"
902
- }
903
- },
904
- "position": {
905
- "$ref": "#/$defs/point3"
906
- },
907
- "size": {
908
- "oneOf": [
909
- {
910
- "$ref": "#/$defs/point3"
911
- },
912
- {
913
- "$ref": "#/$defs/point2"
914
- }
915
- ]
916
- },
917
- "kind": {
918
- "enum": [
919
- "ambient",
920
- "directional",
921
- "point"
922
- ]
923
- },
924
- "intensity": {
925
- "type": "number"
926
- }
927
- }
928
- }
929
- }
930
- }
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sketchmark.dev/schema/visual.schema.json",
4
+ "title": "Sketchmark Render Kernel Document",
5
+ "type": "object",
6
+ "required": [
7
+ "version",
8
+ "canvas"
9
+ ],
10
+ "additionalProperties": false,
11
+ "properties": {
12
+ "version": {
13
+ "const": 1
14
+ },
15
+ "canvas": {
16
+ "type": "object",
17
+ "required": [
18
+ "width",
19
+ "height"
20
+ ],
21
+ "additionalProperties": false,
22
+ "properties": {
23
+ "width": {
24
+ "type": "number"
25
+ },
26
+ "height": {
27
+ "type": "number"
28
+ },
29
+ "background": {
30
+ "type": "string"
31
+ },
32
+ "duration": {
33
+ "type": "number",
34
+ "minimum": 0
35
+ },
36
+ "fps": {
37
+ "type": "number",
38
+ "exclusiveMinimum": 0
39
+ }
40
+ }
41
+ },
42
+ "elements": {
43
+ "type": "array",
44
+ "items": {
45
+ "$ref": "#/$defs/element"
46
+ }
47
+ }
48
+ },
49
+ "$defs": {
50
+ "point2": {
51
+ "type": "array",
52
+ "minItems": 2,
53
+ "maxItems": 2,
54
+ "prefixItems": [
55
+ {
56
+ "type": "number"
57
+ },
58
+ {
59
+ "type": "number"
60
+ }
61
+ ]
62
+ },
63
+ "gradientStop": {
64
+ "oneOf": [
65
+ {
66
+ "type": "array",
67
+ "minItems": 2,
68
+ "maxItems": 2,
69
+ "prefixItems": [
70
+ {
71
+ "type": "number",
72
+ "minimum": 0,
73
+ "maximum": 1
74
+ },
75
+ {
76
+ "type": "string"
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ "type": "object",
82
+ "required": [
83
+ "offset",
84
+ "color"
85
+ ],
86
+ "additionalProperties": false,
87
+ "properties": {
88
+ "offset": {
89
+ "type": "number",
90
+ "minimum": 0,
91
+ "maximum": 1
92
+ },
93
+ "color": {
94
+ "type": "string"
95
+ }
96
+ }
97
+ }
98
+ ]
99
+ },
100
+ "paint": {
101
+ "oneOf": [
102
+ {
103
+ "type": "string"
104
+ },
105
+ {
106
+ "type": "object",
107
+ "required": [
108
+ "type",
109
+ "from",
110
+ "to",
111
+ "stops"
112
+ ],
113
+ "additionalProperties": false,
114
+ "properties": {
115
+ "type": {
116
+ "const": "linearGradient"
117
+ },
118
+ "from": {
119
+ "$ref": "#/$defs/point2"
120
+ },
121
+ "to": {
122
+ "$ref": "#/$defs/point2"
123
+ },
124
+ "stops": {
125
+ "type": "array",
126
+ "minItems": 2,
127
+ "items": {
128
+ "$ref": "#/$defs/gradientStop"
129
+ }
130
+ }
131
+ }
132
+ },
133
+ {
134
+ "type": "object",
135
+ "required": [
136
+ "type",
137
+ "center",
138
+ "radius",
139
+ "stops"
140
+ ],
141
+ "additionalProperties": false,
142
+ "properties": {
143
+ "type": {
144
+ "const": "radialGradient"
145
+ },
146
+ "center": {
147
+ "$ref": "#/$defs/point2"
148
+ },
149
+ "radius": {
150
+ "type": "number"
151
+ },
152
+ "focus": {
153
+ "$ref": "#/$defs/point2"
154
+ },
155
+ "stops": {
156
+ "type": "array",
157
+ "minItems": 2,
158
+ "items": {
159
+ "$ref": "#/$defs/gradientStop"
160
+ }
161
+ }
162
+ }
163
+ },
164
+ {
165
+ "type": "object",
166
+ "required": [
167
+ "type",
168
+ "src",
169
+ "width",
170
+ "height"
171
+ ],
172
+ "additionalProperties": false,
173
+ "properties": {
174
+ "type": {
175
+ "const": "pattern"
176
+ },
177
+ "src": {
178
+ "type": "string"
179
+ },
180
+ "x": {
181
+ "type": "number"
182
+ },
183
+ "y": {
184
+ "type": "number"
185
+ },
186
+ "width": {
187
+ "type": "number"
188
+ },
189
+ "height": {
190
+ "type": "number"
191
+ },
192
+ "fit": {
193
+ "$ref": "#/$defs/imageFit"
194
+ },
195
+ "opacity": {
196
+ "type": "number"
197
+ }
198
+ }
199
+ }
200
+ ]
201
+ },
202
+ "effects": {
203
+ "type": "object",
204
+ "additionalProperties": false,
205
+ "properties": {
206
+ "blur": {
207
+ "type": "number"
208
+ },
209
+ "brightness": {
210
+ "type": "number"
211
+ },
212
+ "contrast": {
213
+ "type": "number"
214
+ },
215
+ "saturate": {
216
+ "type": "number"
217
+ },
218
+ "hueRotate": {
219
+ "type": "number"
220
+ },
221
+ "shadow": {
222
+ "type": "object",
223
+ "required": [
224
+ "dx",
225
+ "dy",
226
+ "blur",
227
+ "color"
228
+ ],
229
+ "additionalProperties": false,
230
+ "properties": {
231
+ "dx": {
232
+ "type": "number"
233
+ },
234
+ "dy": {
235
+ "type": "number"
236
+ },
237
+ "blur": {
238
+ "type": "number"
239
+ },
240
+ "color": {
241
+ "type": "string"
242
+ },
243
+ "opacity": {
244
+ "type": "number"
245
+ }
246
+ }
247
+ }
248
+ }
249
+ },
250
+ "imageFit": {
251
+ "enum": [
252
+ "fill",
253
+ "contain",
254
+ "cover"
255
+ ]
256
+ },
257
+ "imageSource": {
258
+ "type": "object",
259
+ "required": [
260
+ "x",
261
+ "y",
262
+ "width",
263
+ "height",
264
+ "imageWidth",
265
+ "imageHeight"
266
+ ],
267
+ "additionalProperties": false,
268
+ "properties": {
269
+ "x": {
270
+ "type": "number"
271
+ },
272
+ "y": {
273
+ "type": "number"
274
+ },
275
+ "width": {
276
+ "type": "number"
277
+ },
278
+ "height": {
279
+ "type": "number"
280
+ },
281
+ "imageWidth": {
282
+ "type": "number"
283
+ },
284
+ "imageHeight": {
285
+ "type": "number"
286
+ }
287
+ }
288
+ },
289
+ "clipShape": {
290
+ "type": "object",
291
+ "required": [
292
+ "type",
293
+ "d"
294
+ ],
295
+ "additionalProperties": false,
296
+ "properties": {
297
+ "type": {
298
+ "const": "path"
299
+ },
300
+ "d": {
301
+ "type": "string"
302
+ }
303
+ }
304
+ },
305
+ "maskShape": {
306
+ "type": "object",
307
+ "required": [
308
+ "type",
309
+ "d"
310
+ ],
311
+ "additionalProperties": false,
312
+ "properties": {
313
+ "type": {
314
+ "const": "path"
315
+ },
316
+ "d": {
317
+ "type": "string"
318
+ },
319
+ "opacity": {
320
+ "type": "number",
321
+ "minimum": 0,
322
+ "maximum": 1
323
+ }
324
+ }
325
+ },
326
+ "timelineValue": {
327
+ "oneOf": [
328
+ {
329
+ "type": "number"
330
+ },
331
+ {
332
+ "type": "string"
333
+ },
334
+ {
335
+ "type": "array",
336
+ "items": {
337
+ "type": "number"
338
+ }
339
+ },
340
+ {
341
+ "type": "array",
342
+ "items": {
343
+ "type": "string"
344
+ }
345
+ },
346
+ {
347
+ "type": "object",
348
+ "additionalProperties": true
349
+ }
350
+ ]
351
+ },
352
+ "timelineCurve": {
353
+ "oneOf": [
354
+ {
355
+ "type": "object",
356
+ "required": [
357
+ "type",
358
+ "points"
359
+ ],
360
+ "additionalProperties": false,
361
+ "properties": {
362
+ "type": {
363
+ "const": "graph"
364
+ },
365
+ "points": {
366
+ "type": "array",
367
+ "minItems": 2,
368
+ "items": {
369
+ "$ref": "#/$defs/point2"
370
+ }
371
+ }
372
+ }
373
+ },
374
+ {
375
+ "type": "object",
376
+ "required": [
377
+ "type",
378
+ "x1",
379
+ "y1",
380
+ "x2",
381
+ "y2"
382
+ ],
383
+ "additionalProperties": false,
384
+ "properties": {
385
+ "type": {
386
+ "const": "cubicBezier"
387
+ },
388
+ "x1": {
389
+ "type": "number",
390
+ "minimum": 0,
391
+ "maximum": 1
392
+ },
393
+ "y1": {
394
+ "type": "number"
395
+ },
396
+ "x2": {
397
+ "type": "number",
398
+ "minimum": 0,
399
+ "maximum": 1
400
+ },
401
+ "y2": {
402
+ "type": "number"
403
+ }
404
+ }
405
+ },
406
+ {
407
+ "type": "object",
408
+ "required": [
409
+ "type"
410
+ ],
411
+ "additionalProperties": false,
412
+ "properties": {
413
+ "type": {
414
+ "const": "hold"
415
+ }
416
+ }
417
+ }
418
+ ]
419
+ },
420
+ "timelineKeyframe": {
421
+ "oneOf": [
422
+ {
423
+ "type": "array",
424
+ "minItems": 2,
425
+ "maxItems": 2,
426
+ "prefixItems": [
427
+ {
428
+ "type": "number"
429
+ },
430
+ {
431
+ "$ref": "#/$defs/timelineValue"
432
+ }
433
+ ]
434
+ },
435
+ {
436
+ "type": "object",
437
+ "required": [
438
+ "time",
439
+ "value"
440
+ ],
441
+ "additionalProperties": false,
442
+ "properties": {
443
+ "time": {
444
+ "type": "number"
445
+ },
446
+ "value": {
447
+ "$ref": "#/$defs/timelineValue"
448
+ },
449
+ "in": {
450
+ "$ref": "#/$defs/timelineCurve"
451
+ },
452
+ "out": {
453
+ "$ref": "#/$defs/timelineCurve"
454
+ },
455
+ "interpolation": {
456
+ "$ref": "#/$defs/timelineCurve"
457
+ }
458
+ }
459
+ }
460
+ ]
461
+ },
462
+ "timelineTrack": {
463
+ "type": "object",
464
+ "required": [
465
+ "keyframes"
466
+ ],
467
+ "additionalProperties": false,
468
+ "properties": {
469
+ "curve": {
470
+ "$ref": "#/$defs/timelineCurve"
471
+ },
472
+ "ease": {
473
+ "type": "string"
474
+ },
475
+ "keyframes": {
476
+ "type": "array",
477
+ "minItems": 1,
478
+ "items": {
479
+ "$ref": "#/$defs/timelineKeyframe"
480
+ }
481
+ }
482
+ }
483
+ },
484
+ "timeline": {
485
+ "type": "object",
486
+ "additionalProperties": false,
487
+ "properties": {
488
+ "start": {
489
+ "type": "number",
490
+ "minimum": 0
491
+ },
492
+ "end": {
493
+ "type": "number",
494
+ "minimum": 0
495
+ },
496
+ "tracks": {
497
+ "type": "object",
498
+ "additionalProperties": {
499
+ "$ref": "#/$defs/timelineTrack"
500
+ }
501
+ }
502
+ }
503
+ },
504
+ "element": {
505
+ "oneOf": [
506
+ {
507
+ "type": "object",
508
+ "required": [
509
+ "type",
510
+ "d"
511
+ ],
512
+ "additionalProperties": false,
513
+ "properties": {
514
+ "id": {
515
+ "type": "string",
516
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$"
517
+ },
518
+ "opacity": {
519
+ "type": "number"
520
+ },
521
+ "fill": {
522
+ "$ref": "#/$defs/paint"
523
+ },
524
+ "stroke": {
525
+ "$ref": "#/$defs/paint"
526
+ },
527
+ "strokeWidth": {
528
+ "type": "number"
529
+ },
530
+ "strokeCap": {
531
+ "enum": [
532
+ "butt",
533
+ "round",
534
+ "square"
535
+ ]
536
+ },
537
+ "strokeJoin": {
538
+ "enum": [
539
+ "miter",
540
+ "round",
541
+ "bevel"
542
+ ]
543
+ },
544
+ "miterLimit": {
545
+ "type": "number"
546
+ },
547
+ "dashArray": {
548
+ "type": "array",
549
+ "items": {
550
+ "type": "number"
551
+ }
552
+ },
553
+ "dashOffset": {
554
+ "type": "number"
555
+ },
556
+ "drawStart": {
557
+ "type": "number"
558
+ },
559
+ "drawEnd": {
560
+ "type": "number"
561
+ },
562
+ "effects": {
563
+ "$ref": "#/$defs/effects"
564
+ },
565
+ "blendMode": {
566
+ "type": "string"
567
+ },
568
+ "rotation": {
569
+ "type": "number"
570
+ },
571
+ "scale": {
572
+ "type": "number"
573
+ },
574
+ "scaleX": {
575
+ "type": "number"
576
+ },
577
+ "scaleY": {
578
+ "type": "number"
579
+ },
580
+ "origin": {
581
+ "$ref": "#/$defs/point2"
582
+ },
583
+ "clip": {
584
+ "$ref": "#/$defs/clipShape"
585
+ },
586
+ "mask": {
587
+ "$ref": "#/$defs/maskShape"
588
+ },
589
+ "timeline": {
590
+ "$ref": "#/$defs/timeline"
591
+ },
592
+ "type": {
593
+ "const": "path"
594
+ },
595
+ "d": {
596
+ "type": "string"
597
+ },
598
+ "x": {
599
+ "type": "number"
600
+ },
601
+ "y": {
602
+ "type": "number"
603
+ }
604
+ }
605
+ },
606
+ {
607
+ "type": "object",
608
+ "required": [
609
+ "type",
610
+ "x",
611
+ "y"
612
+ ],
613
+ "additionalProperties": false,
614
+ "properties": {
615
+ "id": {
616
+ "type": "string",
617
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$"
618
+ },
619
+ "opacity": {
620
+ "type": "number"
621
+ },
622
+ "fill": {
623
+ "$ref": "#/$defs/paint"
624
+ },
625
+ "stroke": {
626
+ "$ref": "#/$defs/paint"
627
+ },
628
+ "strokeWidth": {
629
+ "type": "number"
630
+ },
631
+ "strokeCap": {
632
+ "enum": [
633
+ "butt",
634
+ "round",
635
+ "square"
636
+ ]
637
+ },
638
+ "strokeJoin": {
639
+ "enum": [
640
+ "miter",
641
+ "round",
642
+ "bevel"
643
+ ]
644
+ },
645
+ "miterLimit": {
646
+ "type": "number"
647
+ },
648
+ "dashArray": {
649
+ "type": "array",
650
+ "items": {
651
+ "type": "number"
652
+ }
653
+ },
654
+ "dashOffset": {
655
+ "type": "number"
656
+ },
657
+ "drawStart": {
658
+ "type": "number"
659
+ },
660
+ "drawEnd": {
661
+ "type": "number"
662
+ },
663
+ "effects": {
664
+ "$ref": "#/$defs/effects"
665
+ },
666
+ "blendMode": {
667
+ "type": "string"
668
+ },
669
+ "rotation": {
670
+ "type": "number"
671
+ },
672
+ "scale": {
673
+ "type": "number"
674
+ },
675
+ "scaleX": {
676
+ "type": "number"
677
+ },
678
+ "scaleY": {
679
+ "type": "number"
680
+ },
681
+ "origin": {
682
+ "$ref": "#/$defs/point2"
683
+ },
684
+ "clip": {
685
+ "$ref": "#/$defs/clipShape"
686
+ },
687
+ "mask": {
688
+ "$ref": "#/$defs/maskShape"
689
+ },
690
+ "timeline": {
691
+ "$ref": "#/$defs/timeline"
692
+ },
693
+ "type": {
694
+ "const": "text"
695
+ },
696
+ "x": {
697
+ "type": "number"
698
+ },
699
+ "y": {
700
+ "type": "number"
701
+ },
702
+ "text": {
703
+ "type": "string"
704
+ },
705
+ "lines": {
706
+ "type": "array",
707
+ "items": {
708
+ "type": "string"
709
+ }
710
+ },
711
+ "align": {
712
+ "enum": [
713
+ "left",
714
+ "center",
715
+ "right"
716
+ ]
717
+ },
718
+ "valign": {
719
+ "enum": [
720
+ "top",
721
+ "middle",
722
+ "bottom"
723
+ ]
724
+ },
725
+ "fontSize": {
726
+ "type": "number"
727
+ },
728
+ "fontFamily": {
729
+ "type": "string"
730
+ },
731
+ "weight": {
732
+ "oneOf": [
733
+ {
734
+ "type": "number"
735
+ },
736
+ {
737
+ "type": "string"
738
+ }
739
+ ]
740
+ },
741
+ "fontStyle": {
742
+ "type": "string"
743
+ },
744
+ "lineHeight": {
745
+ "type": "number"
746
+ },
747
+ "letterSpacing": {
748
+ "type": "number"
749
+ },
750
+ "maxWidth": {
751
+ "type": "number"
752
+ },
753
+ "wrap": {
754
+ "type": "boolean"
755
+ }
756
+ }
757
+ },
758
+ {
759
+ "type": "object",
760
+ "required": [
761
+ "type",
762
+ "src",
763
+ "x",
764
+ "y",
765
+ "width",
766
+ "height"
767
+ ],
768
+ "additionalProperties": false,
769
+ "properties": {
770
+ "id": {
771
+ "type": "string",
772
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$"
773
+ },
774
+ "opacity": {
775
+ "type": "number"
776
+ },
777
+ "fill": {
778
+ "$ref": "#/$defs/paint"
779
+ },
780
+ "stroke": {
781
+ "$ref": "#/$defs/paint"
782
+ },
783
+ "strokeWidth": {
784
+ "type": "number"
785
+ },
786
+ "strokeCap": {
787
+ "enum": [
788
+ "butt",
789
+ "round",
790
+ "square"
791
+ ]
792
+ },
793
+ "strokeJoin": {
794
+ "enum": [
795
+ "miter",
796
+ "round",
797
+ "bevel"
798
+ ]
799
+ },
800
+ "miterLimit": {
801
+ "type": "number"
802
+ },
803
+ "dashArray": {
804
+ "type": "array",
805
+ "items": {
806
+ "type": "number"
807
+ }
808
+ },
809
+ "dashOffset": {
810
+ "type": "number"
811
+ },
812
+ "drawStart": {
813
+ "type": "number"
814
+ },
815
+ "drawEnd": {
816
+ "type": "number"
817
+ },
818
+ "effects": {
819
+ "$ref": "#/$defs/effects"
820
+ },
821
+ "blendMode": {
822
+ "type": "string"
823
+ },
824
+ "rotation": {
825
+ "type": "number"
826
+ },
827
+ "scale": {
828
+ "type": "number"
829
+ },
830
+ "scaleX": {
831
+ "type": "number"
832
+ },
833
+ "scaleY": {
834
+ "type": "number"
835
+ },
836
+ "origin": {
837
+ "$ref": "#/$defs/point2"
838
+ },
839
+ "clip": {
840
+ "$ref": "#/$defs/clipShape"
841
+ },
842
+ "mask": {
843
+ "$ref": "#/$defs/maskShape"
844
+ },
845
+ "timeline": {
846
+ "$ref": "#/$defs/timeline"
847
+ },
848
+ "type": {
849
+ "const": "image"
850
+ },
851
+ "src": {
852
+ "type": "string"
853
+ },
854
+ "x": {
855
+ "type": "number"
856
+ },
857
+ "y": {
858
+ "type": "number"
859
+ },
860
+ "width": {
861
+ "type": "number"
862
+ },
863
+ "height": {
864
+ "type": "number"
865
+ },
866
+ "fit": {
867
+ "$ref": "#/$defs/imageFit"
868
+ },
869
+ "source": {
870
+ "$ref": "#/$defs/imageSource"
871
+ }
872
+ }
873
+ },
874
+ {
875
+ "type": "object",
876
+ "required": [
877
+ "type",
878
+ "x",
879
+ "y"
880
+ ],
881
+ "additionalProperties": false,
882
+ "properties": {
883
+ "id": {
884
+ "type": "string",
885
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$"
886
+ },
887
+ "opacity": {
888
+ "type": "number"
889
+ },
890
+ "fill": {
891
+ "$ref": "#/$defs/paint"
892
+ },
893
+ "stroke": {
894
+ "$ref": "#/$defs/paint"
895
+ },
896
+ "strokeWidth": {
897
+ "type": "number"
898
+ },
899
+ "strokeCap": {
900
+ "enum": [
901
+ "butt",
902
+ "round",
903
+ "square"
904
+ ]
905
+ },
906
+ "strokeJoin": {
907
+ "enum": [
908
+ "miter",
909
+ "round",
910
+ "bevel"
911
+ ]
912
+ },
913
+ "miterLimit": {
914
+ "type": "number"
915
+ },
916
+ "dashArray": {
917
+ "type": "array",
918
+ "items": {
919
+ "type": "number"
920
+ }
921
+ },
922
+ "dashOffset": {
923
+ "type": "number"
924
+ },
925
+ "drawStart": {
926
+ "type": "number"
927
+ },
928
+ "drawEnd": {
929
+ "type": "number"
930
+ },
931
+ "effects": {
932
+ "$ref": "#/$defs/effects"
933
+ },
934
+ "blendMode": {
935
+ "type": "string"
936
+ },
937
+ "rotation": {
938
+ "type": "number"
939
+ },
940
+ "scale": {
941
+ "type": "number"
942
+ },
943
+ "scaleX": {
944
+ "type": "number"
945
+ },
946
+ "scaleY": {
947
+ "type": "number"
948
+ },
949
+ "origin": {
950
+ "$ref": "#/$defs/point2"
951
+ },
952
+ "clip": {
953
+ "$ref": "#/$defs/clipShape"
954
+ },
955
+ "mask": {
956
+ "$ref": "#/$defs/maskShape"
957
+ },
958
+ "timeline": {
959
+ "$ref": "#/$defs/timeline"
960
+ },
961
+ "type": {
962
+ "const": "point"
963
+ },
964
+ "x": {
965
+ "type": "number"
966
+ },
967
+ "y": {
968
+ "type": "number"
969
+ }
970
+ }
971
+ },
972
+ {
973
+ "type": "object",
974
+ "required": [
975
+ "type",
976
+ "x",
977
+ "y",
978
+ "children"
979
+ ],
980
+ "additionalProperties": false,
981
+ "properties": {
982
+ "id": {
983
+ "type": "string",
984
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$"
985
+ },
986
+ "opacity": {
987
+ "type": "number"
988
+ },
989
+ "fill": {
990
+ "$ref": "#/$defs/paint"
991
+ },
992
+ "stroke": {
993
+ "$ref": "#/$defs/paint"
994
+ },
995
+ "strokeWidth": {
996
+ "type": "number"
997
+ },
998
+ "strokeCap": {
999
+ "enum": [
1000
+ "butt",
1001
+ "round",
1002
+ "square"
1003
+ ]
1004
+ },
1005
+ "strokeJoin": {
1006
+ "enum": [
1007
+ "miter",
1008
+ "round",
1009
+ "bevel"
1010
+ ]
1011
+ },
1012
+ "miterLimit": {
1013
+ "type": "number"
1014
+ },
1015
+ "dashArray": {
1016
+ "type": "array",
1017
+ "items": {
1018
+ "type": "number"
1019
+ }
1020
+ },
1021
+ "dashOffset": {
1022
+ "type": "number"
1023
+ },
1024
+ "drawStart": {
1025
+ "type": "number"
1026
+ },
1027
+ "drawEnd": {
1028
+ "type": "number"
1029
+ },
1030
+ "effects": {
1031
+ "$ref": "#/$defs/effects"
1032
+ },
1033
+ "blendMode": {
1034
+ "type": "string"
1035
+ },
1036
+ "rotation": {
1037
+ "type": "number"
1038
+ },
1039
+ "scale": {
1040
+ "type": "number"
1041
+ },
1042
+ "scaleX": {
1043
+ "type": "number"
1044
+ },
1045
+ "scaleY": {
1046
+ "type": "number"
1047
+ },
1048
+ "origin": {
1049
+ "$ref": "#/$defs/point2"
1050
+ },
1051
+ "clip": {
1052
+ "$ref": "#/$defs/clipShape"
1053
+ },
1054
+ "mask": {
1055
+ "$ref": "#/$defs/maskShape"
1056
+ },
1057
+ "timeline": {
1058
+ "$ref": "#/$defs/timeline"
1059
+ },
1060
+ "type": {
1061
+ "const": "group"
1062
+ },
1063
+ "x": {
1064
+ "type": "number"
1065
+ },
1066
+ "y": {
1067
+ "type": "number"
1068
+ },
1069
+ "width": {
1070
+ "type": "number"
1071
+ },
1072
+ "height": {
1073
+ "type": "number"
1074
+ },
1075
+ "children": {
1076
+ "type": "array",
1077
+ "items": {
1078
+ "$ref": "#/$defs/element"
1079
+ }
1080
+ }
1081
+ }
1082
+ }
1083
+ ]
1084
+ }
1085
+ }
1086
+ }