@arraypress/covers 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +29 -0
  3. package/README.md +561 -2
  4. package/fonts/OFL.txt +93 -0
  5. package/fonts/inter-latin-400.woff +0 -0
  6. package/fonts/inter-latin-500.woff +0 -0
  7. package/fonts/inter-latin-600.woff +0 -0
  8. package/fonts/inter-latin-700.woff +0 -0
  9. package/package.json +96 -4
  10. package/recipes/aurora.json +132 -0
  11. package/recipes/bauhaus.json +113 -0
  12. package/recipes/bigType.json +103 -0
  13. package/recipes/contour.json +109 -0
  14. package/recipes/cutout.json +191 -0
  15. package/recipes/diagram.json +92 -0
  16. package/recipes/dither.json +170 -0
  17. package/recipes/duotone.json +75 -0
  18. package/recipes/gridTitle.json +136 -0
  19. package/recipes/iconTile.json +214 -0
  20. package/recipes/issue.json +221 -0
  21. package/recipes/mark.json +170 -0
  22. package/recipes/photo.json +156 -0
  23. package/recipes/riso.json +387 -0
  24. package/recipes/stripes.json +206 -0
  25. package/recipes/waveform.json +154 -0
  26. package/schema/recipe.schema.json +2292 -0
  27. package/src/astro.d.ts +31 -0
  28. package/src/astro.js +86 -0
  29. package/src/color.js +246 -0
  30. package/src/diagram.js +248 -0
  31. package/src/extract.js +90 -0
  32. package/src/flatten.js +234 -0
  33. package/src/fonts.js +200 -0
  34. package/src/geometry.js +187 -0
  35. package/src/grid.js +41 -0
  36. package/src/handmade.js +253 -0
  37. package/src/icons.js +157 -0
  38. package/src/index.d.ts +897 -0
  39. package/src/index.js +19 -0
  40. package/src/json-recipe.js +458 -0
  41. package/src/layer-options.js +37 -0
  42. package/src/layers.js +972 -0
  43. package/src/palette.js +185 -0
  44. package/src/png.js +77 -0
  45. package/src/print.js +658 -0
  46. package/src/recipes.js +78 -0
  47. package/src/render.js +462 -0
  48. package/src/rng.js +95 -0
  49. package/src/svg.js +69 -0
  50. package/src/text.js +230 -0
@@ -0,0 +1,2292 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://unpkg.com/@arraypress/covers/schema/recipe.schema.json",
4
+ "title": "@arraypress/covers recipe",
5
+ "description": "A cover style as data: params, vars and a stack of layers. See the README, \"JSON recipes\".",
6
+ "type": "object",
7
+ "required": [
8
+ "layers"
9
+ ],
10
+ "additionalProperties": false,
11
+ "properties": {
12
+ "$schema": {
13
+ "type": "string"
14
+ },
15
+ "name": {
16
+ "type": "string",
17
+ "description": "Shown in error messages."
18
+ },
19
+ "description": {
20
+ "type": "string"
21
+ },
22
+ "params": {
23
+ "type": "object",
24
+ "description": "Options this recipe reads, with defaults. Cover options of the same name override them; use them as \"{name}\".",
25
+ "additionalProperties": {
26
+ "$ref": "#/$defs/value"
27
+ }
28
+ },
29
+ "requires": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "string"
33
+ },
34
+ "description": "Options that must be set (e.g. \"image\")."
35
+ },
36
+ "vars": {
37
+ "type": "object",
38
+ "description": "Named values, resolved in order (draws use the recipe stream); use them as \"$name\".",
39
+ "additionalProperties": {
40
+ "$ref": "#/$defs/value"
41
+ }
42
+ },
43
+ "output": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "description": "The encoding this style prefers in renderImage (options passed to renderImage win).",
47
+ "properties": {
48
+ "lossless": {
49
+ "type": "boolean",
50
+ "description": "Lossless WebP/AVIF: for flat or 1-bit art (dither)."
51
+ }
52
+ }
53
+ },
54
+ "layers": {
55
+ "type": "array",
56
+ "minItems": 1,
57
+ "items": {
58
+ "$ref": "#/$defs/layer"
59
+ }
60
+ }
61
+ },
62
+ "$defs": {
63
+ "token": {
64
+ "type": "string",
65
+ "description": "@bg @text @accent @onAccent @muted @surface @mode @colors @colors.N @width @height @u · $var · {param} {title} {label} {icon} {image} {opt.x} · a length (\"12vmin\", \"4vw\") · a colour · any text"
66
+ },
67
+ "value": {
68
+ "anyOf": [
69
+ {
70
+ "$ref": "#/$defs/token"
71
+ },
72
+ {
73
+ "type": [
74
+ "number",
75
+ "boolean",
76
+ "null"
77
+ ]
78
+ },
79
+ {
80
+ "type": "array",
81
+ "items": {
82
+ "$ref": "#/$defs/value"
83
+ }
84
+ },
85
+ {
86
+ "$ref": "#/$defs/if"
87
+ },
88
+ {
89
+ "type": "object",
90
+ "description": "Mix two colours: [a, b, t] in OKLab, or [a, b, t, \"oklch\"] (hue the short way, stays vivid).",
91
+ "required": [
92
+ "mix"
93
+ ],
94
+ "additionalProperties": false,
95
+ "properties": {
96
+ "mix": {
97
+ "type": "array",
98
+ "minItems": 3,
99
+ "maxItems": 4,
100
+ "items": {
101
+ "$ref": "#/$defs/value"
102
+ }
103
+ }
104
+ }
105
+ },
106
+ {
107
+ "type": "object",
108
+ "description": "White, or near-black on a light colour: c, [c, light, dark], or [backgrounds, ratio, prefer] (prefer \"white\" | \"black\" | a colour when it clears ratio on every background).",
109
+ "required": [
110
+ "readable"
111
+ ],
112
+ "additionalProperties": false,
113
+ "properties": {
114
+ "readable": {
115
+ "$ref": "#/$defs/value"
116
+ }
117
+ }
118
+ },
119
+ {
120
+ "type": "object",
121
+ "description": "[color, { l: [min, max], c: [min, max] }]: the colour pulled into an OKLCH band, hue kept.",
122
+ "required": [
123
+ "tone"
124
+ ],
125
+ "additionalProperties": false,
126
+ "properties": {
127
+ "tone": {
128
+ "type": "array",
129
+ "minItems": 2,
130
+ "maxItems": 2,
131
+ "items": {
132
+ "$ref": "#/$defs/value"
133
+ }
134
+ }
135
+ }
136
+ },
137
+ {
138
+ "type": "object",
139
+ "description": "[colors, angle, size]: the colours a centred square of that size covers in a linear gradient.",
140
+ "required": [
141
+ "gradientUnder"
142
+ ],
143
+ "additionalProperties": false,
144
+ "properties": {
145
+ "gradientUnder": {
146
+ "type": "array",
147
+ "minItems": 3,
148
+ "maxItems": 3,
149
+ "items": {
150
+ "$ref": "#/$defs/value"
151
+ }
152
+ }
153
+ }
154
+ },
155
+ {
156
+ "type": "object",
157
+ "description": "One item, seeded.",
158
+ "required": [
159
+ "pick"
160
+ ],
161
+ "additionalProperties": false,
162
+ "properties": {
163
+ "pick": {
164
+ "type": "array",
165
+ "minItems": 1,
166
+ "items": {
167
+ "$ref": "#/$defs/value"
168
+ }
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "type": "object",
174
+ "description": "A float in [min, max), seeded.",
175
+ "required": [
176
+ "range"
177
+ ],
178
+ "additionalProperties": false,
179
+ "properties": {
180
+ "range": {
181
+ "type": "array",
182
+ "minItems": 2,
183
+ "maxItems": 2,
184
+ "items": {
185
+ "$ref": "#/$defs/value"
186
+ }
187
+ }
188
+ }
189
+ },
190
+ {
191
+ "type": "object",
192
+ "description": "An integer in [min, max], seeded.",
193
+ "required": [
194
+ "int"
195
+ ],
196
+ "additionalProperties": false,
197
+ "properties": {
198
+ "int": {
199
+ "type": "array",
200
+ "minItems": 2,
201
+ "maxItems": 2,
202
+ "items": {
203
+ "$ref": "#/$defs/value"
204
+ }
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "type": "object",
210
+ "description": "Sum (lengths become px).",
211
+ "required": [
212
+ "add"
213
+ ],
214
+ "additionalProperties": false,
215
+ "properties": {
216
+ "add": {
217
+ "type": "array",
218
+ "minItems": 1,
219
+ "items": {
220
+ "$ref": "#/$defs/value"
221
+ }
222
+ }
223
+ }
224
+ },
225
+ {
226
+ "type": "object",
227
+ "description": "First minus the rest.",
228
+ "required": [
229
+ "sub"
230
+ ],
231
+ "additionalProperties": false,
232
+ "properties": {
233
+ "sub": {
234
+ "type": "array",
235
+ "minItems": 2,
236
+ "items": {
237
+ "$ref": "#/$defs/value"
238
+ }
239
+ }
240
+ }
241
+ },
242
+ {
243
+ "type": "object",
244
+ "description": "Product.",
245
+ "required": [
246
+ "mul"
247
+ ],
248
+ "additionalProperties": false,
249
+ "properties": {
250
+ "mul": {
251
+ "type": "array",
252
+ "minItems": 1,
253
+ "items": {
254
+ "$ref": "#/$defs/value"
255
+ }
256
+ }
257
+ }
258
+ },
259
+ {
260
+ "type": "object",
261
+ "description": "a / b.",
262
+ "required": [
263
+ "div"
264
+ ],
265
+ "additionalProperties": false,
266
+ "properties": {
267
+ "div": {
268
+ "type": "array",
269
+ "minItems": 2,
270
+ "maxItems": 2,
271
+ "items": {
272
+ "$ref": "#/$defs/value"
273
+ }
274
+ }
275
+ }
276
+ },
277
+ {
278
+ "type": "object",
279
+ "description": "Smallest.",
280
+ "required": [
281
+ "min"
282
+ ],
283
+ "additionalProperties": false,
284
+ "properties": {
285
+ "min": {
286
+ "type": "array",
287
+ "minItems": 1,
288
+ "items": {
289
+ "$ref": "#/$defs/value"
290
+ }
291
+ }
292
+ }
293
+ },
294
+ {
295
+ "type": "object",
296
+ "description": "Largest.",
297
+ "required": [
298
+ "max"
299
+ ],
300
+ "additionalProperties": false,
301
+ "properties": {
302
+ "max": {
303
+ "type": "array",
304
+ "minItems": 1,
305
+ "items": {
306
+ "$ref": "#/$defs/value"
307
+ }
308
+ }
309
+ }
310
+ },
311
+ {
312
+ "type": "object",
313
+ "description": "[from, to, steps, amount?]: steps colours from one toward the other.",
314
+ "required": [
315
+ "ramp"
316
+ ],
317
+ "additionalProperties": false,
318
+ "properties": {
319
+ "ramp": {
320
+ "type": "array",
321
+ "minItems": 3,
322
+ "maxItems": 4,
323
+ "items": {
324
+ "$ref": "#/$defs/value"
325
+ }
326
+ }
327
+ }
328
+ },
329
+ {
330
+ "type": "object",
331
+ "description": "[ratio, steps]: [1, ratio, ratio², …].",
332
+ "required": [
333
+ "taper"
334
+ ],
335
+ "additionalProperties": false,
336
+ "properties": {
337
+ "taper": {
338
+ "type": "array",
339
+ "minItems": 2,
340
+ "maxItems": 2,
341
+ "items": {
342
+ "$ref": "#/$defs/value"
343
+ }
344
+ }
345
+ }
346
+ },
347
+ {
348
+ "type": "object",
349
+ "description": "Characters in a string (a number's digits) or items in an array.",
350
+ "required": [
351
+ "length"
352
+ ],
353
+ "additionalProperties": false,
354
+ "properties": {
355
+ "length": {
356
+ "$ref": "#/$defs/value"
357
+ }
358
+ }
359
+ },
360
+ {
361
+ "type": "object",
362
+ "description": "An array backwards.",
363
+ "required": [
364
+ "reverse"
365
+ ],
366
+ "additionalProperties": false,
367
+ "properties": {
368
+ "reverse": {
369
+ "$ref": "#/$defs/value"
370
+ }
371
+ }
372
+ },
373
+ {
374
+ "type": "object",
375
+ "additionalProperties": {
376
+ "$ref": "#/$defs/value"
377
+ }
378
+ }
379
+ ]
380
+ },
381
+ "if": {
382
+ "type": "object",
383
+ "description": "A choice: only the chosen side is evaluated.",
384
+ "required": [
385
+ "if",
386
+ "then"
387
+ ],
388
+ "additionalProperties": false,
389
+ "properties": {
390
+ "if": {
391
+ "$ref": "#/$defs/condition"
392
+ },
393
+ "then": {
394
+ "$ref": "#/$defs/value"
395
+ },
396
+ "else": {
397
+ "$ref": "#/$defs/value"
398
+ }
399
+ }
400
+ },
401
+ "condition": {
402
+ "description": "\"title\" (the option is set), { \"background\": \"gradient\" } (equals; \"mode\" is the palette's, \"aspect\" the canvas's: wide | square | tall), { \"not\": … }, { \"all\": [...] }, { \"any\": [...] }.",
403
+ "anyOf": [
404
+ {
405
+ "type": "string"
406
+ },
407
+ {
408
+ "type": "boolean"
409
+ },
410
+ {
411
+ "type": "object",
412
+ "required": [
413
+ "not"
414
+ ],
415
+ "additionalProperties": false,
416
+ "properties": {
417
+ "not": {
418
+ "$ref": "#/$defs/condition"
419
+ }
420
+ }
421
+ },
422
+ {
423
+ "type": "object",
424
+ "required": [
425
+ "all"
426
+ ],
427
+ "additionalProperties": false,
428
+ "properties": {
429
+ "all": {
430
+ "type": "array",
431
+ "items": {
432
+ "$ref": "#/$defs/condition"
433
+ }
434
+ }
435
+ }
436
+ },
437
+ {
438
+ "type": "object",
439
+ "required": [
440
+ "any"
441
+ ],
442
+ "additionalProperties": false,
443
+ "properties": {
444
+ "any": {
445
+ "type": "array",
446
+ "items": {
447
+ "$ref": "#/$defs/condition"
448
+ }
449
+ }
450
+ }
451
+ },
452
+ {
453
+ "type": "object",
454
+ "minProperties": 1,
455
+ "not": {
456
+ "anyOf": [
457
+ {
458
+ "required": [
459
+ "not"
460
+ ]
461
+ },
462
+ {
463
+ "required": [
464
+ "all"
465
+ ]
466
+ },
467
+ {
468
+ "required": [
469
+ "any"
470
+ ]
471
+ }
472
+ ]
473
+ },
474
+ "additionalProperties": {
475
+ "type": [
476
+ "string",
477
+ "number",
478
+ "boolean",
479
+ "array"
480
+ ]
481
+ }
482
+ }
483
+ ]
484
+ },
485
+ "layer": {
486
+ "type": "object",
487
+ "required": [
488
+ "type"
489
+ ],
490
+ "properties": {
491
+ "type": {
492
+ "enum": [
493
+ "solid",
494
+ "linear",
495
+ "radial",
496
+ "mesh",
497
+ "stripes",
498
+ "image",
499
+ "grain",
500
+ "pattern",
501
+ "shapes",
502
+ "icon",
503
+ "text",
504
+ "diagram",
505
+ "paper",
506
+ "scribble",
507
+ "ink",
508
+ "dither",
509
+ "contour",
510
+ "waveform",
511
+ "tiles",
512
+ "rule",
513
+ "frame"
514
+ ]
515
+ },
516
+ "id": {
517
+ "type": "string",
518
+ "description": "Names the layer for overrides (cover({ <id>: {...} | false }))."
519
+ },
520
+ "when": {
521
+ "$ref": "#/$defs/condition",
522
+ "description": "Include the layer only when this holds."
523
+ }
524
+ },
525
+ "allOf": [
526
+ {
527
+ "if": {
528
+ "properties": {
529
+ "type": {
530
+ "const": "solid"
531
+ }
532
+ },
533
+ "required": [
534
+ "type"
535
+ ]
536
+ },
537
+ "then": {
538
+ "properties": {
539
+ "color": {
540
+ "$ref": "#/$defs/value",
541
+ "description": "Fill. Default @bg."
542
+ },
543
+ "opacity": {
544
+ "$ref": "#/$defs/value",
545
+ "description": "0–1."
546
+ },
547
+ "blend": {
548
+ "$ref": "#/$defs/value",
549
+ "description": "A CSS mix-blend-mode."
550
+ },
551
+ "seed": {
552
+ "$ref": "#/$defs/value",
553
+ "description": "This layer's own random stream."
554
+ }
555
+ },
556
+ "propertyNames": {
557
+ "enum": [
558
+ "type",
559
+ "id",
560
+ "when",
561
+ "color",
562
+ "opacity",
563
+ "blend",
564
+ "seed"
565
+ ]
566
+ }
567
+ }
568
+ },
569
+ {
570
+ "if": {
571
+ "properties": {
572
+ "type": {
573
+ "const": "linear"
574
+ }
575
+ },
576
+ "required": [
577
+ "type"
578
+ ]
579
+ },
580
+ "then": {
581
+ "properties": {
582
+ "colors": {
583
+ "$ref": "#/$defs/value",
584
+ "description": "Two or more colours."
585
+ },
586
+ "opacities": {
587
+ "$ref": "#/$defs/value",
588
+ "description": "Per-stop opacity."
589
+ },
590
+ "angle": {
591
+ "$ref": "#/$defs/value",
592
+ "description": "CSS degrees (0 = up). Default seeded."
593
+ },
594
+ "ease": {
595
+ "$ref": "#/$defs/value",
596
+ "description": "Smoothstep stops. Default true."
597
+ },
598
+ "opacity": {
599
+ "$ref": "#/$defs/value",
600
+ "description": "0–1."
601
+ },
602
+ "blend": {
603
+ "$ref": "#/$defs/value",
604
+ "description": "A CSS mix-blend-mode."
605
+ },
606
+ "seed": {
607
+ "$ref": "#/$defs/value",
608
+ "description": "This layer's own random stream."
609
+ }
610
+ },
611
+ "propertyNames": {
612
+ "enum": [
613
+ "type",
614
+ "id",
615
+ "when",
616
+ "colors",
617
+ "opacities",
618
+ "angle",
619
+ "ease",
620
+ "opacity",
621
+ "blend",
622
+ "seed"
623
+ ]
624
+ }
625
+ }
626
+ },
627
+ {
628
+ "if": {
629
+ "properties": {
630
+ "type": {
631
+ "const": "radial"
632
+ }
633
+ },
634
+ "required": [
635
+ "type"
636
+ ]
637
+ },
638
+ "then": {
639
+ "properties": {
640
+ "colors": {
641
+ "$ref": "#/$defs/value",
642
+ "description": "Centre → edge."
643
+ },
644
+ "x": {
645
+ "$ref": "#/$defs/value",
646
+ "description": "Centre x, 0–1."
647
+ },
648
+ "y": {
649
+ "$ref": "#/$defs/value",
650
+ "description": "Centre y, 0–1."
651
+ },
652
+ "radius": {
653
+ "$ref": "#/$defs/value",
654
+ "description": "Length. Default \"80vmax\"."
655
+ },
656
+ "ease": {
657
+ "$ref": "#/$defs/value",
658
+ "description": "Default true."
659
+ },
660
+ "opacity": {
661
+ "$ref": "#/$defs/value",
662
+ "description": "0–1."
663
+ },
664
+ "blend": {
665
+ "$ref": "#/$defs/value",
666
+ "description": "A CSS mix-blend-mode."
667
+ },
668
+ "seed": {
669
+ "$ref": "#/$defs/value",
670
+ "description": "This layer's own random stream."
671
+ }
672
+ },
673
+ "propertyNames": {
674
+ "enum": [
675
+ "type",
676
+ "id",
677
+ "when",
678
+ "colors",
679
+ "x",
680
+ "y",
681
+ "radius",
682
+ "ease",
683
+ "opacity",
684
+ "blend",
685
+ "seed"
686
+ ]
687
+ }
688
+ }
689
+ },
690
+ {
691
+ "if": {
692
+ "properties": {
693
+ "type": {
694
+ "const": "mesh"
695
+ }
696
+ },
697
+ "required": [
698
+ "type"
699
+ ]
700
+ },
701
+ "then": {
702
+ "properties": {
703
+ "colors": {
704
+ "$ref": "#/$defs/value",
705
+ "description": "Blob colours."
706
+ },
707
+ "hues": {
708
+ "$ref": "#/$defs/value",
709
+ "description": "Distinct colours to use. Default 3."
710
+ },
711
+ "hueSpan": {
712
+ "$ref": "#/$defs/value",
713
+ "description": "Keep the colours within this many degrees of hue (OKLCH): neighbouring hues only."
714
+ },
715
+ "count": {
716
+ "$ref": "#/$defs/value",
717
+ "description": "Blobs. Default 4."
718
+ },
719
+ "blur": {
720
+ "$ref": "#/$defs/value",
721
+ "description": "Length. Default \"11vmax\"."
722
+ },
723
+ "spread": {
724
+ "$ref": "#/$defs/value",
725
+ "description": "0–1. Default 1 (sweep), 0.7 (ring)."
726
+ },
727
+ "size": {
728
+ "$ref": "#/$defs/value",
729
+ "description": "[min, max] radius, fractions of the longer side."
730
+ },
731
+ "base": {
732
+ "$ref": "#/$defs/value",
733
+ "description": "Fill under the fields: \"auto\" (a gradient across the sweep between the first two colours; default), \"bg\", a colour, or null."
734
+ },
735
+ "arrangement": {
736
+ "$ref": "#/$defs/value",
737
+ "description": "sweep (default: long fields along one direction) | ring"
738
+ },
739
+ "angle": {
740
+ "$ref": "#/$defs/value",
741
+ "description": "Sweep direction in degrees. Default seeded."
742
+ },
743
+ "streak": {
744
+ "$ref": "#/$defs/value",
745
+ "description": "How much more the sweep blurs along than across. Default 1.5."
746
+ },
747
+ "tone": {
748
+ "$ref": "#/$defs/value",
749
+ "description": "{ l: [min, max], c: [min, max] }: pull colours into an OKLCH band."
750
+ },
751
+ "fold": {
752
+ "$ref": "#/$defs/value",
753
+ "description": "true or { color, to, position, bend, softness, sheen }: a second field meeting the first along a soft curve."
754
+ },
755
+ "streaks": {
756
+ "$ref": "#/$defs/value",
757
+ "description": "Thin light motion streaks along the sweep. Default 0."
758
+ },
759
+ "from": {
760
+ "$ref": "#/$defs/value",
761
+ "description": "A photo (path or bytes) to take the colours from (needs sharp)."
762
+ },
763
+ "blobs": {
764
+ "$ref": "#/$defs/value",
765
+ "description": "Explicit [{ x, y, r, squash, rotate, color, opacity }]."
766
+ },
767
+ "opacity": {
768
+ "$ref": "#/$defs/value",
769
+ "description": "0–1."
770
+ },
771
+ "blend": {
772
+ "$ref": "#/$defs/value",
773
+ "description": "A CSS mix-blend-mode."
774
+ },
775
+ "seed": {
776
+ "$ref": "#/$defs/value",
777
+ "description": "This layer's own random stream."
778
+ }
779
+ },
780
+ "propertyNames": {
781
+ "enum": [
782
+ "type",
783
+ "id",
784
+ "when",
785
+ "colors",
786
+ "hues",
787
+ "hueSpan",
788
+ "count",
789
+ "blur",
790
+ "spread",
791
+ "size",
792
+ "base",
793
+ "arrangement",
794
+ "angle",
795
+ "streak",
796
+ "tone",
797
+ "fold",
798
+ "streaks",
799
+ "from",
800
+ "blobs",
801
+ "opacity",
802
+ "blend",
803
+ "seed"
804
+ ]
805
+ }
806
+ }
807
+ },
808
+ {
809
+ "if": {
810
+ "properties": {
811
+ "type": {
812
+ "const": "stripes"
813
+ }
814
+ },
815
+ "required": [
816
+ "type"
817
+ ]
818
+ },
819
+ "then": {
820
+ "properties": {
821
+ "direction": {
822
+ "$ref": "#/$defs/value",
823
+ "description": "vertical | horizontal | diagonal"
824
+ },
825
+ "angle": {
826
+ "$ref": "#/$defs/value",
827
+ "description": "For diagonal."
828
+ },
829
+ "count": {
830
+ "$ref": "#/$defs/value",
831
+ "description": "Stripes. Default 8."
832
+ },
833
+ "widths": {
834
+ "$ref": "#/$defs/value",
835
+ "description": "even | random | taper | [weights]"
836
+ },
837
+ "taper": {
838
+ "$ref": "#/$defs/value",
839
+ "description": "Ratio for widths: taper."
840
+ },
841
+ "colors": {
842
+ "$ref": "#/$defs/value",
843
+ "description": "Cycled."
844
+ },
845
+ "gap": {
846
+ "$ref": "#/$defs/value",
847
+ "description": "Length."
848
+ },
849
+ "radius": {
850
+ "$ref": "#/$defs/value",
851
+ "description": "Length."
852
+ },
853
+ "region": {
854
+ "$ref": "#/$defs/value",
855
+ "description": "{ x, y, width, height } fractions."
856
+ },
857
+ "regionRadius": {
858
+ "$ref": "#/$defs/value",
859
+ "description": "Length."
860
+ },
861
+ "opacity": {
862
+ "$ref": "#/$defs/value",
863
+ "description": "0–1."
864
+ },
865
+ "blend": {
866
+ "$ref": "#/$defs/value",
867
+ "description": "A CSS mix-blend-mode."
868
+ },
869
+ "seed": {
870
+ "$ref": "#/$defs/value",
871
+ "description": "This layer's own random stream."
872
+ }
873
+ },
874
+ "propertyNames": {
875
+ "enum": [
876
+ "type",
877
+ "id",
878
+ "when",
879
+ "direction",
880
+ "angle",
881
+ "count",
882
+ "widths",
883
+ "taper",
884
+ "colors",
885
+ "gap",
886
+ "radius",
887
+ "region",
888
+ "regionRadius",
889
+ "opacity",
890
+ "blend",
891
+ "seed"
892
+ ]
893
+ }
894
+ }
895
+ },
896
+ {
897
+ "if": {
898
+ "properties": {
899
+ "type": {
900
+ "const": "image"
901
+ }
902
+ },
903
+ "required": [
904
+ "type"
905
+ ]
906
+ },
907
+ "then": {
908
+ "properties": {
909
+ "src": {
910
+ "$ref": "#/$defs/value",
911
+ "description": "A local path, data: URI or bytes (\"{image}\")."
912
+ },
913
+ "fit": {
914
+ "$ref": "#/$defs/value",
915
+ "description": "cover | contain"
916
+ },
917
+ "focus": {
918
+ "$ref": "#/$defs/value",
919
+ "description": "An anchor, attention or entropy."
920
+ },
921
+ "region": {
922
+ "$ref": "#/$defs/value",
923
+ "description": "Fractions."
924
+ },
925
+ "duotone": {
926
+ "$ref": "#/$defs/value",
927
+ "description": "true or [shadow, highlight]."
928
+ },
929
+ "grayscale": {
930
+ "$ref": "#/$defs/value",
931
+ "description": "boolean"
932
+ },
933
+ "normalize": {
934
+ "$ref": "#/$defs/value",
935
+ "description": "Stretch tones first."
936
+ },
937
+ "tint": {
938
+ "$ref": "#/$defs/value",
939
+ "description": "A colour or { color, amount, blend }."
940
+ },
941
+ "blur": {
942
+ "$ref": "#/$defs/value",
943
+ "description": "Length."
944
+ },
945
+ "opacity": {
946
+ "$ref": "#/$defs/value",
947
+ "description": "0–1."
948
+ },
949
+ "blend": {
950
+ "$ref": "#/$defs/value",
951
+ "description": "A CSS mix-blend-mode."
952
+ },
953
+ "seed": {
954
+ "$ref": "#/$defs/value",
955
+ "description": "This layer's own random stream."
956
+ }
957
+ },
958
+ "propertyNames": {
959
+ "enum": [
960
+ "type",
961
+ "id",
962
+ "when",
963
+ "src",
964
+ "fit",
965
+ "focus",
966
+ "region",
967
+ "duotone",
968
+ "grayscale",
969
+ "normalize",
970
+ "tint",
971
+ "blur",
972
+ "opacity",
973
+ "blend",
974
+ "seed"
975
+ ]
976
+ }
977
+ }
978
+ },
979
+ {
980
+ "if": {
981
+ "properties": {
982
+ "type": {
983
+ "const": "grain"
984
+ }
985
+ },
986
+ "required": [
987
+ "type"
988
+ ]
989
+ },
990
+ "then": {
991
+ "properties": {
992
+ "amount": {
993
+ "$ref": "#/$defs/value",
994
+ "description": "0–1. Default 0.08."
995
+ },
996
+ "size": {
997
+ "$ref": "#/$defs/value",
998
+ "description": "Grain px. Default 1."
999
+ },
1000
+ "monochrome": {
1001
+ "$ref": "#/$defs/value",
1002
+ "description": "Default true."
1003
+ },
1004
+ "vary": {
1005
+ "$ref": "#/$defs/value",
1006
+ "description": "\"edges\": heavier toward the edges (spray paint)."
1007
+ },
1008
+ "opacity": {
1009
+ "$ref": "#/$defs/value",
1010
+ "description": "0–1."
1011
+ },
1012
+ "blend": {
1013
+ "$ref": "#/$defs/value",
1014
+ "description": "A CSS mix-blend-mode."
1015
+ },
1016
+ "seed": {
1017
+ "$ref": "#/$defs/value",
1018
+ "description": "This layer's own random stream."
1019
+ }
1020
+ },
1021
+ "propertyNames": {
1022
+ "enum": [
1023
+ "type",
1024
+ "id",
1025
+ "when",
1026
+ "amount",
1027
+ "size",
1028
+ "monochrome",
1029
+ "vary",
1030
+ "opacity",
1031
+ "blend",
1032
+ "seed"
1033
+ ]
1034
+ }
1035
+ }
1036
+ },
1037
+ {
1038
+ "if": {
1039
+ "properties": {
1040
+ "type": {
1041
+ "const": "pattern"
1042
+ }
1043
+ },
1044
+ "required": [
1045
+ "type"
1046
+ ]
1047
+ },
1048
+ "then": {
1049
+ "properties": {
1050
+ "kind": {
1051
+ "$ref": "#/$defs/value",
1052
+ "description": "grid | dots | lines | rings | waves"
1053
+ },
1054
+ "size": {
1055
+ "$ref": "#/$defs/value",
1056
+ "description": "Cell. Length."
1057
+ },
1058
+ "stroke": {
1059
+ "$ref": "#/$defs/value",
1060
+ "description": "Length."
1061
+ },
1062
+ "color": {
1063
+ "$ref": "#/$defs/value",
1064
+ "description": "Default @text."
1065
+ },
1066
+ "angle": {
1067
+ "$ref": "#/$defs/value",
1068
+ "description": "For lines."
1069
+ },
1070
+ "center": {
1071
+ "$ref": "#/$defs/value",
1072
+ "description": "{ x, y } fractions."
1073
+ },
1074
+ "wavelength": {
1075
+ "$ref": "#/$defs/value",
1076
+ "description": "Length."
1077
+ },
1078
+ "amplitude": {
1079
+ "$ref": "#/$defs/value",
1080
+ "description": "Length."
1081
+ },
1082
+ "fade": {
1083
+ "$ref": "#/$defs/value",
1084
+ "description": "none | radial | edges | top | bottom | left | right"
1085
+ },
1086
+ "dash": {
1087
+ "$ref": "#/$defs/value",
1088
+ "description": "dotted | dashed | [on, off] lengths."
1089
+ },
1090
+ "divisions": {
1091
+ "$ref": "#/$defs/value",
1092
+ "description": "Grid/lines: N equal cells (inner lines only) instead of size."
1093
+ },
1094
+ "gaps": {
1095
+ "$ref": "#/$defs/value",
1096
+ "description": "[{ x, y, width, height }] fractions the lines break around."
1097
+ },
1098
+ "region": {
1099
+ "$ref": "#/$defs/value",
1100
+ "description": "Fractions."
1101
+ },
1102
+ "opacity": {
1103
+ "$ref": "#/$defs/value",
1104
+ "description": "0–1."
1105
+ },
1106
+ "blend": {
1107
+ "$ref": "#/$defs/value",
1108
+ "description": "A CSS mix-blend-mode."
1109
+ },
1110
+ "seed": {
1111
+ "$ref": "#/$defs/value",
1112
+ "description": "This layer's own random stream."
1113
+ }
1114
+ },
1115
+ "propertyNames": {
1116
+ "enum": [
1117
+ "type",
1118
+ "id",
1119
+ "when",
1120
+ "kind",
1121
+ "size",
1122
+ "stroke",
1123
+ "color",
1124
+ "angle",
1125
+ "center",
1126
+ "wavelength",
1127
+ "amplitude",
1128
+ "fade",
1129
+ "dash",
1130
+ "divisions",
1131
+ "gaps",
1132
+ "region",
1133
+ "opacity",
1134
+ "blend",
1135
+ "seed"
1136
+ ]
1137
+ }
1138
+ }
1139
+ },
1140
+ {
1141
+ "if": {
1142
+ "properties": {
1143
+ "type": {
1144
+ "const": "shapes"
1145
+ }
1146
+ },
1147
+ "required": [
1148
+ "type"
1149
+ ]
1150
+ },
1151
+ "then": {
1152
+ "properties": {
1153
+ "kind": {
1154
+ "$ref": "#/$defs/value",
1155
+ "description": "circle | square | pill | mixed"
1156
+ },
1157
+ "count": {
1158
+ "$ref": "#/$defs/value",
1159
+ "description": "Default 6."
1160
+ },
1161
+ "size": {
1162
+ "$ref": "#/$defs/value",
1163
+ "description": "[min, max] lengths."
1164
+ },
1165
+ "colors": {
1166
+ "$ref": "#/$defs/value",
1167
+ "description": "Cycled."
1168
+ },
1169
+ "placement": {
1170
+ "$ref": "#/$defs/value",
1171
+ "description": "scatter | row | column"
1172
+ },
1173
+ "items": {
1174
+ "$ref": "#/$defs/value",
1175
+ "description": "[{ kind, x, y, size, color, rotate, opacity }]"
1176
+ },
1177
+ "region": {
1178
+ "$ref": "#/$defs/value",
1179
+ "description": "Fractions."
1180
+ },
1181
+ "rotate": {
1182
+ "$ref": "#/$defs/value",
1183
+ "description": "Tilt squares and pills."
1184
+ },
1185
+ "radius": {
1186
+ "$ref": "#/$defs/value",
1187
+ "description": "Square corner, fraction of size."
1188
+ },
1189
+ "outline": {
1190
+ "$ref": "#/$defs/value",
1191
+ "description": "true or a width."
1192
+ },
1193
+ "opacity": {
1194
+ "$ref": "#/$defs/value",
1195
+ "description": "0–1."
1196
+ },
1197
+ "blend": {
1198
+ "$ref": "#/$defs/value",
1199
+ "description": "A CSS mix-blend-mode."
1200
+ },
1201
+ "seed": {
1202
+ "$ref": "#/$defs/value",
1203
+ "description": "This layer's own random stream."
1204
+ }
1205
+ },
1206
+ "propertyNames": {
1207
+ "enum": [
1208
+ "type",
1209
+ "id",
1210
+ "when",
1211
+ "kind",
1212
+ "count",
1213
+ "size",
1214
+ "colors",
1215
+ "placement",
1216
+ "items",
1217
+ "region",
1218
+ "rotate",
1219
+ "radius",
1220
+ "outline",
1221
+ "opacity",
1222
+ "blend",
1223
+ "seed"
1224
+ ]
1225
+ }
1226
+ }
1227
+ },
1228
+ {
1229
+ "if": {
1230
+ "properties": {
1231
+ "type": {
1232
+ "const": "icon"
1233
+ }
1234
+ },
1235
+ "required": [
1236
+ "type"
1237
+ ]
1238
+ },
1239
+ "then": {
1240
+ "properties": {
1241
+ "name": {
1242
+ "$ref": "#/$defs/value",
1243
+ "description": "Iconify name (\"lucide:feather\") or raw SVG (\"{icon}\")."
1244
+ },
1245
+ "svg": {
1246
+ "$ref": "#/$defs/value",
1247
+ "description": "Raw SVG."
1248
+ },
1249
+ "path": {
1250
+ "$ref": "#/$defs/value",
1251
+ "description": "A path d."
1252
+ },
1253
+ "viewBox": {
1254
+ "$ref": "#/$defs/value",
1255
+ "description": "[x, y, w, h] for path."
1256
+ },
1257
+ "size": {
1258
+ "$ref": "#/$defs/value",
1259
+ "description": "Length. Default \"24vmin\"."
1260
+ },
1261
+ "color": {
1262
+ "$ref": "#/$defs/value",
1263
+ "description": "Default the accent on a tile, else @text."
1264
+ },
1265
+ "strokeWidth": {
1266
+ "$ref": "#/$defs/value",
1267
+ "description": "Stroke icons."
1268
+ },
1269
+ "anchor": {
1270
+ "$ref": "#/$defs/value",
1271
+ "description": "One of nine anchors."
1272
+ },
1273
+ "position": {
1274
+ "$ref": "#/$defs/value",
1275
+ "description": "{ x, y } fractions."
1276
+ },
1277
+ "offset": {
1278
+ "$ref": "#/$defs/value",
1279
+ "description": "{ x, y } lengths."
1280
+ },
1281
+ "margin": {
1282
+ "$ref": "#/$defs/value",
1283
+ "description": "Length."
1284
+ },
1285
+ "tile": {
1286
+ "$ref": "#/$defs/value",
1287
+ "description": "true or { size, radius, color, shadow, border }."
1288
+ },
1289
+ "opacity": {
1290
+ "$ref": "#/$defs/value",
1291
+ "description": "0–1."
1292
+ },
1293
+ "blend": {
1294
+ "$ref": "#/$defs/value",
1295
+ "description": "A CSS mix-blend-mode."
1296
+ },
1297
+ "seed": {
1298
+ "$ref": "#/$defs/value",
1299
+ "description": "This layer's own random stream."
1300
+ }
1301
+ },
1302
+ "propertyNames": {
1303
+ "enum": [
1304
+ "type",
1305
+ "id",
1306
+ "when",
1307
+ "name",
1308
+ "svg",
1309
+ "path",
1310
+ "viewBox",
1311
+ "size",
1312
+ "color",
1313
+ "strokeWidth",
1314
+ "anchor",
1315
+ "position",
1316
+ "offset",
1317
+ "margin",
1318
+ "tile",
1319
+ "opacity",
1320
+ "blend",
1321
+ "seed"
1322
+ ]
1323
+ }
1324
+ }
1325
+ },
1326
+ {
1327
+ "if": {
1328
+ "properties": {
1329
+ "type": {
1330
+ "const": "text"
1331
+ }
1332
+ },
1333
+ "required": [
1334
+ "type"
1335
+ ]
1336
+ },
1337
+ "then": {
1338
+ "properties": {
1339
+ "content": {
1340
+ "$ref": "#/$defs/value",
1341
+ "description": "The text (\"{title}\")."
1342
+ },
1343
+ "font": {
1344
+ "$ref": "#/$defs/value",
1345
+ "description": "Family. Default Inter."
1346
+ },
1347
+ "weight": {
1348
+ "$ref": "#/$defs/value",
1349
+ "description": "Default 600."
1350
+ },
1351
+ "style": {
1352
+ "$ref": "#/$defs/value",
1353
+ "description": "normal | italic"
1354
+ },
1355
+ "size": {
1356
+ "$ref": "#/$defs/value",
1357
+ "description": "Length."
1358
+ },
1359
+ "minSize": {
1360
+ "$ref": "#/$defs/value",
1361
+ "description": "Shrink toward this before truncating."
1362
+ },
1363
+ "lineHeight": {
1364
+ "$ref": "#/$defs/value",
1365
+ "description": "Default 1.12."
1366
+ },
1367
+ "letterSpacing": {
1368
+ "$ref": "#/$defs/value",
1369
+ "description": "Em. Default -0.02."
1370
+ },
1371
+ "color": {
1372
+ "$ref": "#/$defs/value",
1373
+ "description": "Default @text."
1374
+ },
1375
+ "align": {
1376
+ "$ref": "#/$defs/value",
1377
+ "description": "left | center | right"
1378
+ },
1379
+ "anchor": {
1380
+ "$ref": "#/$defs/value",
1381
+ "description": "Default bottom-left."
1382
+ },
1383
+ "position": {
1384
+ "$ref": "#/$defs/value",
1385
+ "description": "{ x, y } fractions."
1386
+ },
1387
+ "offset": {
1388
+ "$ref": "#/$defs/value",
1389
+ "description": "{ x, y } lengths."
1390
+ },
1391
+ "margin": {
1392
+ "$ref": "#/$defs/value",
1393
+ "description": "Length."
1394
+ },
1395
+ "maxWidth": {
1396
+ "$ref": "#/$defs/value",
1397
+ "description": "Length."
1398
+ },
1399
+ "maxLines": {
1400
+ "$ref": "#/$defs/value",
1401
+ "description": "Default 3."
1402
+ },
1403
+ "ellipsis": {
1404
+ "$ref": "#/$defs/value",
1405
+ "description": "Default '…'."
1406
+ },
1407
+ "balance": {
1408
+ "$ref": "#/$defs/value",
1409
+ "description": "Default true."
1410
+ },
1411
+ "transform": {
1412
+ "$ref": "#/$defs/value",
1413
+ "description": "none | uppercase | lowercase"
1414
+ },
1415
+ "label": {
1416
+ "$ref": "#/$defs/value",
1417
+ "description": "A string or { content, size, weight, color, letterSpacing, transform, gap }."
1418
+ },
1419
+ "background": {
1420
+ "$ref": "#/$defs/value",
1421
+ "description": "A colour or { color, radius, padding, opacity }."
1422
+ },
1423
+ "opacity": {
1424
+ "$ref": "#/$defs/value",
1425
+ "description": "0–1."
1426
+ },
1427
+ "blend": {
1428
+ "$ref": "#/$defs/value",
1429
+ "description": "A CSS mix-blend-mode."
1430
+ },
1431
+ "seed": {
1432
+ "$ref": "#/$defs/value",
1433
+ "description": "This layer's own random stream."
1434
+ }
1435
+ },
1436
+ "propertyNames": {
1437
+ "enum": [
1438
+ "type",
1439
+ "id",
1440
+ "when",
1441
+ "content",
1442
+ "font",
1443
+ "weight",
1444
+ "style",
1445
+ "size",
1446
+ "minSize",
1447
+ "lineHeight",
1448
+ "letterSpacing",
1449
+ "color",
1450
+ "align",
1451
+ "anchor",
1452
+ "position",
1453
+ "offset",
1454
+ "margin",
1455
+ "maxWidth",
1456
+ "maxLines",
1457
+ "ellipsis",
1458
+ "balance",
1459
+ "transform",
1460
+ "label",
1461
+ "background",
1462
+ "opacity",
1463
+ "blend",
1464
+ "seed"
1465
+ ]
1466
+ }
1467
+ }
1468
+ },
1469
+ {
1470
+ "if": {
1471
+ "properties": {
1472
+ "type": {
1473
+ "const": "diagram"
1474
+ }
1475
+ },
1476
+ "required": [
1477
+ "type"
1478
+ ]
1479
+ },
1480
+ "then": {
1481
+ "properties": {
1482
+ "icon": {
1483
+ "$ref": "#/$defs/value",
1484
+ "description": "One icon (Iconify name or raw SVG), drawn as white line-art."
1485
+ },
1486
+ "nodes": {
1487
+ "$ref": "#/$defs/value",
1488
+ "description": "[{ icon, shape: square | circle | none, size, brackets }]"
1489
+ },
1490
+ "layout": {
1491
+ "$ref": "#/$defs/value",
1492
+ "description": "single | row | triangle | square | stack | hub"
1493
+ },
1494
+ "arrows": {
1495
+ "$ref": "#/$defs/value",
1496
+ "description": "true | false | loop | both | cycle"
1497
+ },
1498
+ "shape": {
1499
+ "$ref": "#/$defs/value",
1500
+ "description": "For a single icon: none (default) | square | circle."
1501
+ },
1502
+ "size": {
1503
+ "$ref": "#/$defs/value",
1504
+ "description": "Node size. Length."
1505
+ },
1506
+ "gap": {
1507
+ "$ref": "#/$defs/value",
1508
+ "description": "Space between nodes. Length."
1509
+ },
1510
+ "stroke": {
1511
+ "$ref": "#/$defs/value",
1512
+ "description": "Line width. Default \"0.3vmin\"."
1513
+ },
1514
+ "color": {
1515
+ "$ref": "#/$defs/value",
1516
+ "description": "Line colour. Default white."
1517
+ },
1518
+ "radius": {
1519
+ "$ref": "#/$defs/value",
1520
+ "description": "Tile corner radius."
1521
+ },
1522
+ "iconScale": {
1523
+ "$ref": "#/$defs/value",
1524
+ "description": "Icon size inside a tile, 0–1. Default 0.44."
1525
+ },
1526
+ "position": {
1527
+ "$ref": "#/$defs/value",
1528
+ "description": "{ x, y } centre, fractions."
1529
+ },
1530
+ "grid": {
1531
+ "$ref": "#/$defs/value",
1532
+ "description": "true or { divisions, opacity, stroke, color, pad }: a dotted grid that breaks around the drawing."
1533
+ },
1534
+ "opacity": {
1535
+ "$ref": "#/$defs/value",
1536
+ "description": "0–1."
1537
+ },
1538
+ "blend": {
1539
+ "$ref": "#/$defs/value",
1540
+ "description": "A CSS mix-blend-mode."
1541
+ },
1542
+ "seed": {
1543
+ "$ref": "#/$defs/value",
1544
+ "description": "This layer's own random stream."
1545
+ }
1546
+ },
1547
+ "propertyNames": {
1548
+ "enum": [
1549
+ "type",
1550
+ "id",
1551
+ "when",
1552
+ "icon",
1553
+ "nodes",
1554
+ "layout",
1555
+ "arrows",
1556
+ "shape",
1557
+ "size",
1558
+ "gap",
1559
+ "stroke",
1560
+ "color",
1561
+ "radius",
1562
+ "iconScale",
1563
+ "position",
1564
+ "grid",
1565
+ "opacity",
1566
+ "blend",
1567
+ "seed"
1568
+ ]
1569
+ }
1570
+ }
1571
+ },
1572
+ {
1573
+ "if": {
1574
+ "properties": {
1575
+ "type": {
1576
+ "const": "paper"
1577
+ }
1578
+ },
1579
+ "required": [
1580
+ "type"
1581
+ ]
1582
+ },
1583
+ "then": {
1584
+ "properties": {
1585
+ "count": {
1586
+ "$ref": "#/$defs/value",
1587
+ "description": "Shapes in the collage. Default 4."
1588
+ },
1589
+ "kind": {
1590
+ "$ref": "#/$defs/value",
1591
+ "description": "mixed | rect | square | circle | blob | arch | pill"
1592
+ },
1593
+ "color": {
1594
+ "$ref": "#/$defs/value",
1595
+ "description": "Default #faf9f5 (paper)."
1596
+ },
1597
+ "region": {
1598
+ "$ref": "#/$defs/value",
1599
+ "description": "Where the collage sits, fractions."
1600
+ },
1601
+ "items": {
1602
+ "$ref": "#/$defs/value",
1603
+ "description": "[{ kind, x, y, width, height, size, rotate, color }] placed in the region."
1604
+ },
1605
+ "wobble": {
1606
+ "$ref": "#/$defs/value",
1607
+ "description": "How rough the cut edges are, 0–1. Default 0.5."
1608
+ },
1609
+ "opacity": {
1610
+ "$ref": "#/$defs/value",
1611
+ "description": "0–1."
1612
+ },
1613
+ "blend": {
1614
+ "$ref": "#/$defs/value",
1615
+ "description": "A CSS mix-blend-mode."
1616
+ },
1617
+ "seed": {
1618
+ "$ref": "#/$defs/value",
1619
+ "description": "This layer's own random stream."
1620
+ }
1621
+ },
1622
+ "propertyNames": {
1623
+ "enum": [
1624
+ "type",
1625
+ "id",
1626
+ "when",
1627
+ "count",
1628
+ "kind",
1629
+ "color",
1630
+ "region",
1631
+ "items",
1632
+ "wobble",
1633
+ "opacity",
1634
+ "blend",
1635
+ "seed"
1636
+ ]
1637
+ }
1638
+ }
1639
+ },
1640
+ {
1641
+ "if": {
1642
+ "properties": {
1643
+ "type": {
1644
+ "const": "scribble"
1645
+ }
1646
+ },
1647
+ "required": [
1648
+ "type"
1649
+ ]
1650
+ },
1651
+ "then": {
1652
+ "properties": {
1653
+ "icon": {
1654
+ "$ref": "#/$defs/value",
1655
+ "description": "An icon to re-draw by hand (Iconify name or raw SVG)."
1656
+ },
1657
+ "graph": {
1658
+ "$ref": "#/$defs/value",
1659
+ "description": "true or { nodes, dot }: a hand-drawn node graph instead."
1660
+ },
1661
+ "color": {
1662
+ "$ref": "#/$defs/value",
1663
+ "description": "Default #faf9f5."
1664
+ },
1665
+ "stroke": {
1666
+ "$ref": "#/$defs/value",
1667
+ "description": "Line width. Default \"1.3vmin\"."
1668
+ },
1669
+ "size": {
1670
+ "$ref": "#/$defs/value",
1671
+ "description": "Length. Default \"46vmin\"."
1672
+ },
1673
+ "position": {
1674
+ "$ref": "#/$defs/value",
1675
+ "description": "{ x, y } centre, fractions."
1676
+ },
1677
+ "wobble": {
1678
+ "$ref": "#/$defs/value",
1679
+ "description": "0–1. Default 0.5."
1680
+ },
1681
+ "opacity": {
1682
+ "$ref": "#/$defs/value",
1683
+ "description": "0–1."
1684
+ },
1685
+ "blend": {
1686
+ "$ref": "#/$defs/value",
1687
+ "description": "A CSS mix-blend-mode."
1688
+ },
1689
+ "seed": {
1690
+ "$ref": "#/$defs/value",
1691
+ "description": "This layer's own random stream."
1692
+ }
1693
+ },
1694
+ "propertyNames": {
1695
+ "enum": [
1696
+ "type",
1697
+ "id",
1698
+ "when",
1699
+ "icon",
1700
+ "graph",
1701
+ "color",
1702
+ "stroke",
1703
+ "size",
1704
+ "position",
1705
+ "wobble",
1706
+ "opacity",
1707
+ "blend",
1708
+ "seed"
1709
+ ]
1710
+ }
1711
+ }
1712
+ },
1713
+ {
1714
+ "if": {
1715
+ "properties": {
1716
+ "type": {
1717
+ "const": "ink"
1718
+ }
1719
+ },
1720
+ "required": [
1721
+ "type"
1722
+ ]
1723
+ },
1724
+ "then": {
1725
+ "properties": {
1726
+ "color": {
1727
+ "$ref": "#/$defs/value",
1728
+ "description": "The ink: a colour or riso:pink | blue | yellow | teal | red | green | orange | purple | navy | black."
1729
+ },
1730
+ "shapes": {
1731
+ "$ref": "#/$defs/value",
1732
+ "description": "[{ kind: circle | ring | half | arch | band | rect | text, x, y, r, size, width, height, thickness, rotate, content, … }]"
1733
+ },
1734
+ "offset": {
1735
+ "$ref": "#/$defs/value",
1736
+ "description": "{ x, y }: misregistration. Default seeded, 0.3–1% of the short side."
1737
+ },
1738
+ "texture": {
1739
+ "$ref": "#/$defs/value",
1740
+ "description": "grain (default) | halftone | none"
1741
+ },
1742
+ "speckle": {
1743
+ "$ref": "#/$defs/value",
1744
+ "description": "Grain: share of paper showing through. Default 0.09."
1745
+ },
1746
+ "cell": {
1747
+ "$ref": "#/$defs/value",
1748
+ "description": "Halftone cell. Length."
1749
+ },
1750
+ "dot": {
1751
+ "$ref": "#/$defs/value",
1752
+ "description": "Halftone dot radius, fraction of the cell."
1753
+ },
1754
+ "angle": {
1755
+ "$ref": "#/$defs/value",
1756
+ "description": "Halftone screen angle: 0 or 45 (default seeded)."
1757
+ },
1758
+ "density": {
1759
+ "$ref": "#/$defs/value",
1760
+ "description": "[min, max]: uneven ink across the sheet. Default [0.78, 1]."
1761
+ },
1762
+ "opacity": {
1763
+ "$ref": "#/$defs/value",
1764
+ "description": "0–1."
1765
+ },
1766
+ "blend": {
1767
+ "$ref": "#/$defs/value",
1768
+ "description": "A CSS mix-blend-mode."
1769
+ },
1770
+ "seed": {
1771
+ "$ref": "#/$defs/value",
1772
+ "description": "This layer's own random stream."
1773
+ }
1774
+ },
1775
+ "propertyNames": {
1776
+ "enum": [
1777
+ "type",
1778
+ "id",
1779
+ "when",
1780
+ "color",
1781
+ "shapes",
1782
+ "offset",
1783
+ "texture",
1784
+ "speckle",
1785
+ "cell",
1786
+ "dot",
1787
+ "angle",
1788
+ "density",
1789
+ "opacity",
1790
+ "blend",
1791
+ "seed"
1792
+ ]
1793
+ }
1794
+ }
1795
+ },
1796
+ {
1797
+ "if": {
1798
+ "properties": {
1799
+ "type": {
1800
+ "const": "dither"
1801
+ }
1802
+ },
1803
+ "required": [
1804
+ "type"
1805
+ ]
1806
+ },
1807
+ "then": {
1808
+ "properties": {
1809
+ "colors": {
1810
+ "$ref": "#/$defs/value",
1811
+ "description": "[ground, ink] or [c0, c1, c2] (two dithered bands)."
1812
+ },
1813
+ "source": {
1814
+ "$ref": "#/$defs/value",
1815
+ "description": "field (default, noise) | linear | radial"
1816
+ },
1817
+ "shape": {
1818
+ "$ref": "#/$defs/value",
1819
+ "description": "none | circle | sphere | arch"
1820
+ },
1821
+ "size": {
1822
+ "$ref": "#/$defs/value",
1823
+ "description": "Shape size. Length."
1824
+ },
1825
+ "center": {
1826
+ "$ref": "#/$defs/value",
1827
+ "description": "{ x, y } fractions."
1828
+ },
1829
+ "matrix": {
1830
+ "$ref": "#/$defs/value",
1831
+ "description": "bayer4 (default) | bayer8 | noise"
1832
+ },
1833
+ "cell": {
1834
+ "$ref": "#/$defs/value",
1835
+ "description": "Pixel size. Length. Default \"0.9vmin\"."
1836
+ },
1837
+ "angle": {
1838
+ "$ref": "#/$defs/value",
1839
+ "description": "For linear."
1840
+ },
1841
+ "scale": {
1842
+ "$ref": "#/$defs/value",
1843
+ "description": "Noise feature size."
1844
+ },
1845
+ "gamma": {
1846
+ "$ref": "#/$defs/value",
1847
+ "description": "Tone curve."
1848
+ },
1849
+ "range": {
1850
+ "$ref": "#/$defs/value",
1851
+ "description": "[lo, hi] of the field."
1852
+ },
1853
+ "opacity": {
1854
+ "$ref": "#/$defs/value",
1855
+ "description": "0–1."
1856
+ },
1857
+ "blend": {
1858
+ "$ref": "#/$defs/value",
1859
+ "description": "A CSS mix-blend-mode."
1860
+ },
1861
+ "seed": {
1862
+ "$ref": "#/$defs/value",
1863
+ "description": "This layer's own random stream."
1864
+ }
1865
+ },
1866
+ "propertyNames": {
1867
+ "enum": [
1868
+ "type",
1869
+ "id",
1870
+ "when",
1871
+ "colors",
1872
+ "source",
1873
+ "shape",
1874
+ "size",
1875
+ "center",
1876
+ "matrix",
1877
+ "cell",
1878
+ "angle",
1879
+ "scale",
1880
+ "gamma",
1881
+ "range",
1882
+ "opacity",
1883
+ "blend",
1884
+ "seed"
1885
+ ]
1886
+ }
1887
+ }
1888
+ },
1889
+ {
1890
+ "if": {
1891
+ "properties": {
1892
+ "type": {
1893
+ "const": "contour"
1894
+ }
1895
+ },
1896
+ "required": [
1897
+ "type"
1898
+ ]
1899
+ },
1900
+ "then": {
1901
+ "properties": {
1902
+ "levels": {
1903
+ "$ref": "#/$defs/value",
1904
+ "description": "Isolines. Default 20."
1905
+ },
1906
+ "color": {
1907
+ "$ref": "#/$defs/value",
1908
+ "description": "Default @text."
1909
+ },
1910
+ "stroke": {
1911
+ "$ref": "#/$defs/value",
1912
+ "description": "Default \"0.14vmin\"."
1913
+ },
1914
+ "highlight": {
1915
+ "$ref": "#/$defs/value",
1916
+ "description": "Level to draw in the accent (default seeded), or false."
1917
+ },
1918
+ "highlightColor": {
1919
+ "$ref": "#/$defs/value",
1920
+ "description": "Default @accent."
1921
+ },
1922
+ "index": {
1923
+ "$ref": "#/$defs/value",
1924
+ "description": "Every Nth line thicker. Default 5 (0: none)."
1925
+ },
1926
+ "indexWeight": {
1927
+ "$ref": "#/$defs/value",
1928
+ "description": "Index line weight multiple."
1929
+ },
1930
+ "scale": {
1931
+ "$ref": "#/$defs/value",
1932
+ "description": "Noise feature size."
1933
+ },
1934
+ "octaves": {
1935
+ "$ref": "#/$defs/value",
1936
+ "description": "Noise detail."
1937
+ },
1938
+ "resolution": {
1939
+ "$ref": "#/$defs/value",
1940
+ "description": "Grid cells across the short side."
1941
+ },
1942
+ "opacity": {
1943
+ "$ref": "#/$defs/value",
1944
+ "description": "0–1."
1945
+ },
1946
+ "blend": {
1947
+ "$ref": "#/$defs/value",
1948
+ "description": "A CSS mix-blend-mode."
1949
+ },
1950
+ "seed": {
1951
+ "$ref": "#/$defs/value",
1952
+ "description": "This layer's own random stream."
1953
+ }
1954
+ },
1955
+ "propertyNames": {
1956
+ "enum": [
1957
+ "type",
1958
+ "id",
1959
+ "when",
1960
+ "levels",
1961
+ "color",
1962
+ "stroke",
1963
+ "highlight",
1964
+ "highlightColor",
1965
+ "index",
1966
+ "indexWeight",
1967
+ "scale",
1968
+ "octaves",
1969
+ "resolution",
1970
+ "opacity",
1971
+ "blend",
1972
+ "seed"
1973
+ ]
1974
+ }
1975
+ }
1976
+ },
1977
+ {
1978
+ "if": {
1979
+ "properties": {
1980
+ "type": {
1981
+ "const": "waveform"
1982
+ }
1983
+ },
1984
+ "required": [
1985
+ "type"
1986
+ ]
1987
+ },
1988
+ "then": {
1989
+ "properties": {
1990
+ "peaks": {
1991
+ "$ref": "#/$defs/value",
1992
+ "description": "Peak values (any scale)."
1993
+ },
1994
+ "audio": {
1995
+ "$ref": "#/$defs/value",
1996
+ "description": "An audio file to decode at build (needs @arraypress/waveform-gen)."
1997
+ },
1998
+ "bars": {
1999
+ "$ref": "#/$defs/value",
2000
+ "description": "Bars. Default 88."
2001
+ },
2002
+ "style": {
2003
+ "$ref": "#/$defs/value",
2004
+ "description": "mirrored (default) | bars | line | dots"
2005
+ },
2006
+ "color": {
2007
+ "$ref": "#/$defs/value",
2008
+ "description": "Default @accent."
2009
+ },
2010
+ "region": {
2011
+ "$ref": "#/$defs/value",
2012
+ "description": "Fractions."
2013
+ },
2014
+ "gap": {
2015
+ "$ref": "#/$defs/value",
2016
+ "description": "Gap between bars, fraction. Default 0.4."
2017
+ },
2018
+ "round": {
2019
+ "$ref": "#/$defs/value",
2020
+ "description": "Rounded bars. Default true."
2021
+ },
2022
+ "stroke": {
2023
+ "$ref": "#/$defs/value",
2024
+ "description": "Line style width."
2025
+ },
2026
+ "caption": {
2027
+ "$ref": "#/$defs/value",
2028
+ "description": "true (the duration) or text under the wave."
2029
+ },
2030
+ "duration": {
2031
+ "$ref": "#/$defs/value",
2032
+ "description": "Seconds (for the caption)."
2033
+ },
2034
+ "captionSize": {
2035
+ "$ref": "#/$defs/value",
2036
+ "description": "Length."
2037
+ },
2038
+ "captionColor": {
2039
+ "$ref": "#/$defs/value",
2040
+ "description": "Default @text."
2041
+ },
2042
+ "opacity": {
2043
+ "$ref": "#/$defs/value",
2044
+ "description": "0–1."
2045
+ },
2046
+ "blend": {
2047
+ "$ref": "#/$defs/value",
2048
+ "description": "A CSS mix-blend-mode."
2049
+ },
2050
+ "seed": {
2051
+ "$ref": "#/$defs/value",
2052
+ "description": "This layer's own random stream."
2053
+ }
2054
+ },
2055
+ "propertyNames": {
2056
+ "enum": [
2057
+ "type",
2058
+ "id",
2059
+ "when",
2060
+ "peaks",
2061
+ "audio",
2062
+ "bars",
2063
+ "style",
2064
+ "color",
2065
+ "region",
2066
+ "gap",
2067
+ "round",
2068
+ "stroke",
2069
+ "caption",
2070
+ "duration",
2071
+ "captionSize",
2072
+ "captionColor",
2073
+ "opacity",
2074
+ "blend",
2075
+ "seed"
2076
+ ]
2077
+ }
2078
+ }
2079
+ },
2080
+ {
2081
+ "if": {
2082
+ "properties": {
2083
+ "type": {
2084
+ "const": "tiles"
2085
+ }
2086
+ },
2087
+ "required": [
2088
+ "type"
2089
+ ]
2090
+ },
2091
+ "then": {
2092
+ "properties": {
2093
+ "cols": {
2094
+ "$ref": "#/$defs/value",
2095
+ "description": "Columns. Default from the series."
2096
+ },
2097
+ "rows": {
2098
+ "$ref": "#/$defs/value",
2099
+ "description": "Rows. Default to keep cells near square."
2100
+ },
2101
+ "series": {
2102
+ "$ref": "#/$defs/value",
2103
+ "description": "Seeds the grid rhythm shared by a series."
2104
+ },
2105
+ "colors": {
2106
+ "$ref": "#/$defs/value",
2107
+ "description": "Shape and cell colours."
2108
+ },
2109
+ "ground": {
2110
+ "$ref": "#/$defs/value",
2111
+ "description": "The page colour among them."
2112
+ },
2113
+ "kinds": {
2114
+ "$ref": "#/$defs/value",
2115
+ "description": "Subset of quarter, half, circle, square, triangle."
2116
+ },
2117
+ "merge": {
2118
+ "$ref": "#/$defs/value",
2119
+ "description": "A 2×2 merged cell. Default true."
2120
+ },
2121
+ "region": {
2122
+ "$ref": "#/$defs/value",
2123
+ "description": "Fractions."
2124
+ },
2125
+ "opacity": {
2126
+ "$ref": "#/$defs/value",
2127
+ "description": "0–1."
2128
+ },
2129
+ "blend": {
2130
+ "$ref": "#/$defs/value",
2131
+ "description": "A CSS mix-blend-mode."
2132
+ },
2133
+ "seed": {
2134
+ "$ref": "#/$defs/value",
2135
+ "description": "This layer's own random stream."
2136
+ }
2137
+ },
2138
+ "propertyNames": {
2139
+ "enum": [
2140
+ "type",
2141
+ "id",
2142
+ "when",
2143
+ "cols",
2144
+ "rows",
2145
+ "series",
2146
+ "colors",
2147
+ "ground",
2148
+ "kinds",
2149
+ "merge",
2150
+ "region",
2151
+ "opacity",
2152
+ "blend",
2153
+ "seed"
2154
+ ]
2155
+ }
2156
+ }
2157
+ },
2158
+ {
2159
+ "if": {
2160
+ "properties": {
2161
+ "type": {
2162
+ "const": "rule"
2163
+ }
2164
+ },
2165
+ "required": [
2166
+ "type"
2167
+ ]
2168
+ },
2169
+ "then": {
2170
+ "properties": {
2171
+ "y": {
2172
+ "$ref": "#/$defs/value",
2173
+ "description": "Height, fraction. Default 0.15."
2174
+ },
2175
+ "from": {
2176
+ "$ref": "#/$defs/value",
2177
+ "description": "{ x, y } fractions."
2178
+ },
2179
+ "to": {
2180
+ "$ref": "#/$defs/value",
2181
+ "description": "{ x, y } fractions."
2182
+ },
2183
+ "inset": {
2184
+ "$ref": "#/$defs/value",
2185
+ "description": "Side inset. Length."
2186
+ },
2187
+ "color": {
2188
+ "$ref": "#/$defs/value",
2189
+ "description": "Default @text."
2190
+ },
2191
+ "stroke": {
2192
+ "$ref": "#/$defs/value",
2193
+ "description": "Default \"0.12vmin\"."
2194
+ },
2195
+ "opacity": {
2196
+ "$ref": "#/$defs/value",
2197
+ "description": "0–1."
2198
+ },
2199
+ "blend": {
2200
+ "$ref": "#/$defs/value",
2201
+ "description": "A CSS mix-blend-mode."
2202
+ },
2203
+ "seed": {
2204
+ "$ref": "#/$defs/value",
2205
+ "description": "This layer's own random stream."
2206
+ }
2207
+ },
2208
+ "propertyNames": {
2209
+ "enum": [
2210
+ "type",
2211
+ "id",
2212
+ "when",
2213
+ "y",
2214
+ "from",
2215
+ "to",
2216
+ "inset",
2217
+ "color",
2218
+ "stroke",
2219
+ "opacity",
2220
+ "blend",
2221
+ "seed"
2222
+ ]
2223
+ }
2224
+ }
2225
+ },
2226
+ {
2227
+ "if": {
2228
+ "properties": {
2229
+ "type": {
2230
+ "const": "frame"
2231
+ }
2232
+ },
2233
+ "required": [
2234
+ "type"
2235
+ ]
2236
+ },
2237
+ "then": {
2238
+ "properties": {
2239
+ "inset": {
2240
+ "$ref": "#/$defs/value",
2241
+ "description": "Length."
2242
+ },
2243
+ "radius": {
2244
+ "$ref": "#/$defs/value",
2245
+ "description": "Length."
2246
+ },
2247
+ "stroke": {
2248
+ "$ref": "#/$defs/value",
2249
+ "description": "Length."
2250
+ },
2251
+ "color": {
2252
+ "$ref": "#/$defs/value",
2253
+ "description": "Default @text."
2254
+ },
2255
+ "fill": {
2256
+ "$ref": "#/$defs/value",
2257
+ "description": "A colour (a card)."
2258
+ },
2259
+ "opacity": {
2260
+ "$ref": "#/$defs/value",
2261
+ "description": "0–1."
2262
+ },
2263
+ "blend": {
2264
+ "$ref": "#/$defs/value",
2265
+ "description": "A CSS mix-blend-mode."
2266
+ },
2267
+ "seed": {
2268
+ "$ref": "#/$defs/value",
2269
+ "description": "This layer's own random stream."
2270
+ }
2271
+ },
2272
+ "propertyNames": {
2273
+ "enum": [
2274
+ "type",
2275
+ "id",
2276
+ "when",
2277
+ "inset",
2278
+ "radius",
2279
+ "stroke",
2280
+ "color",
2281
+ "fill",
2282
+ "opacity",
2283
+ "blend",
2284
+ "seed"
2285
+ ]
2286
+ }
2287
+ }
2288
+ }
2289
+ ]
2290
+ }
2291
+ }
2292
+ }