@tanqory/dev-mcp 0.0.0-stage → 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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -2
  3. package/bin/tanqory-dev-mcp.mjs +16 -0
  4. package/bundled/examples/blank/config/settings.json +3 -0
  5. package/bundled/examples/blank/locales/en.json +22 -0
  6. package/bundled/examples/blank/locales/th.json +22 -0
  7. package/bundled/examples/blank/regions/footer.json +35 -0
  8. package/bundled/examples/blank/regions/header.json +13 -0
  9. package/bundled/examples/blank/src/bundle.ts +15 -0
  10. package/bundled/examples/blank/src/components/parts.tsx +32 -0
  11. package/bundled/examples/blank/src/entry.client.tsx +6 -0
  12. package/bundled/examples/blank/src/entry.server.tsx +13 -0
  13. package/bundled/examples/blank/src/sections/chrome.tsx +132 -0
  14. package/bundled/examples/blank/src/sections/commerce.tsx +242 -0
  15. package/bundled/examples/blank/src/sections/content.tsx +111 -0
  16. package/bundled/examples/blank/src/sections/editorial.tsx +107 -0
  17. package/bundled/examples/blank/src/settings.ts +15 -0
  18. package/bundled/examples/blank/src/styles/theme.css +195 -0
  19. package/bundled/examples/blank/src/templates.ts +14 -0
  20. package/bundled/examples/blank/src/theme.tsx +76 -0
  21. package/bundled/examples/blank/template.json +24 -0
  22. package/bundled/examples/blank/templates/404.json +14 -0
  23. package/bundled/examples/blank/templates/account.json +14 -0
  24. package/bundled/examples/blank/templates/article.json +14 -0
  25. package/bundled/examples/blank/templates/blog.json +14 -0
  26. package/bundled/examples/blank/templates/cart.json +14 -0
  27. package/bundled/examples/blank/templates/collection.json +14 -0
  28. package/bundled/examples/blank/templates/index.json +36 -0
  29. package/bundled/examples/blank/templates/page.contact.json +18 -0
  30. package/bundled/examples/blank/templates/page.json +14 -0
  31. package/bundled/examples/blank/templates/product.json +18 -0
  32. package/bundled/examples/blank/templates/search.json +14 -0
  33. package/bundled/examples/blank/tests/theme.test.ts +49 -0
  34. package/bundled/theme-abi/contracts/render-context.v2.d.ts +849 -0
  35. package/bundled/theme-abi/contracts/theme-abi-v2.md +1833 -0
  36. package/bundled/theme-abi/generated/capabilities.json +80 -0
  37. package/bundled/theme-abi/generated/field-types.json +869 -0
  38. package/bundled/theme-abi/generated/limits.json +173 -0
  39. package/bundled/theme-abi/schemas/conformance-report.v2.schema.json +482 -0
  40. package/bundled/theme-abi/schemas/theme-artifact.v1.schema.json +230 -0
  41. package/bundled/theme-abi/schemas/theme-manifest.v2.schema.json +254 -0
  42. package/bundled/theme-conformance/docs/storefront-tier.md +250 -0
  43. package/bundled/theme-conformance/schema/conformance-report.v2.schema.json +482 -0
  44. package/bundled/theme-conformance/schema/storefront-report.v1.schema.json +110 -0
  45. package/bundled/theme-conformance/schema/x-tanqory-ai.v0.schema.json +70 -0
  46. package/bundled/theme-kit/docs/headless-api.md +220 -0
  47. package/bundled/theme-kit/generated/kit-strings.json +180 -0
  48. package/bundled/theme-kit/types/headless/index.d.ts +36 -0
  49. package/bundled/theme-kit/types/headless/theme.d.ts +99 -0
  50. package/bundled/theme-kit/types/sdk/schema.d.ts +197 -0
  51. package/bundled/versions.json +8 -0
  52. package/package.json +53 -3
  53. package/src/bm25.mjs +69 -0
  54. package/src/browser.mjs +123 -0
  55. package/src/cli.mjs +127 -0
  56. package/src/devserver.mjs +82 -0
  57. package/src/docs.mjs +329 -0
  58. package/src/index.mjs +33 -0
  59. package/src/kit.mjs +150 -0
  60. package/src/manifest.mjs +82 -0
  61. package/src/prompts.mjs +97 -0
  62. package/src/scaffold.mjs +471 -0
  63. package/src/schemas.mjs +127 -0
  64. package/src/server.mjs +595 -0
  65. package/src/theme.mjs +91 -0
@@ -0,0 +1,869 @@
1
+ {
2
+ "registryVersions": [
3
+ "1",
4
+ "2"
5
+ ],
6
+ "requiredConstraints": {
7
+ "list": [
8
+ "items"
9
+ ],
10
+ "radio": [
11
+ "options"
12
+ ],
13
+ "select": [
14
+ "options"
15
+ ]
16
+ },
17
+ "types": {
18
+ "1": {
19
+ "article": {
20
+ "aiGenerate": true,
21
+ "constraints": [
22
+ "resolve"
23
+ ],
24
+ "control": "resource-picker",
25
+ "doc": "Article handle.",
26
+ "dynamicBindable": false,
27
+ "dynamicSourceTypes": [],
28
+ "id": "article",
29
+ "media": null,
30
+ "resource": "article",
31
+ "value": "string"
32
+ },
33
+ "blog": {
34
+ "aiGenerate": true,
35
+ "constraints": [
36
+ "resolve"
37
+ ],
38
+ "control": "resource-picker",
39
+ "doc": "Blog handle.",
40
+ "dynamicBindable": false,
41
+ "dynamicSourceTypes": [],
42
+ "id": "blog",
43
+ "media": null,
44
+ "resource": "blog",
45
+ "value": "string"
46
+ },
47
+ "boolean": {
48
+ "aiGenerate": true,
49
+ "constraints": [],
50
+ "control": "switch",
51
+ "doc": "On/off.",
52
+ "dynamicBindable": false,
53
+ "dynamicSourceTypes": [
54
+ "boolean"
55
+ ],
56
+ "id": "boolean",
57
+ "media": null,
58
+ "resource": null,
59
+ "value": "boolean"
60
+ },
61
+ "collection": {
62
+ "aiGenerate": true,
63
+ "constraints": [
64
+ "resolve"
65
+ ],
66
+ "control": "resource-picker",
67
+ "doc": "Collection handle.",
68
+ "dynamicBindable": false,
69
+ "dynamicSourceTypes": [],
70
+ "id": "collection",
71
+ "media": null,
72
+ "resource": "collection",
73
+ "value": "string"
74
+ },
75
+ "color": {
76
+ "aiGenerate": true,
77
+ "constraints": [],
78
+ "control": "color",
79
+ "doc": "Colour.",
80
+ "dynamicBindable": false,
81
+ "dynamicSourceTypes": [],
82
+ "id": "color",
83
+ "media": null,
84
+ "resource": null,
85
+ "value": "string"
86
+ },
87
+ "html": {
88
+ "aiGenerate": false,
89
+ "constraints": [],
90
+ "control": "textarea",
91
+ "doc": "Author-trusted; never bind shopper input.",
92
+ "dynamicBindable": false,
93
+ "dynamicSourceTypes": [],
94
+ "id": "html",
95
+ "media": null,
96
+ "resource": null,
97
+ "value": "string"
98
+ },
99
+ "image": {
100
+ "aiGenerate": true,
101
+ "constraints": [],
102
+ "control": "media-picker",
103
+ "doc": "Media-library picker.",
104
+ "dynamicBindable": true,
105
+ "dynamicSourceTypes": [
106
+ "file_reference",
107
+ "image"
108
+ ],
109
+ "id": "image",
110
+ "media": "image",
111
+ "resource": null,
112
+ "value": "string"
113
+ },
114
+ "json": {
115
+ "aiGenerate": true,
116
+ "constraints": [
117
+ "schema"
118
+ ],
119
+ "control": "json-editor",
120
+ "doc": "Free-form structured value validated against `schema` when present.",
121
+ "dynamicBindable": false,
122
+ "dynamicSourceTypes": [],
123
+ "id": "json",
124
+ "media": null,
125
+ "resource": null,
126
+ "value": "object"
127
+ },
128
+ "list": {
129
+ "aiGenerate": true,
130
+ "constraints": [
131
+ "items",
132
+ "min",
133
+ "max"
134
+ ],
135
+ "control": "list",
136
+ "doc": "Ordered values of one element spec.",
137
+ "dynamicBindable": false,
138
+ "dynamicSourceTypes": [],
139
+ "id": "list",
140
+ "media": null,
141
+ "resource": null,
142
+ "value": "array"
143
+ },
144
+ "menu": {
145
+ "aiGenerate": true,
146
+ "constraints": [
147
+ "resolve"
148
+ ],
149
+ "control": "resource-picker",
150
+ "doc": "Store menu handle.",
151
+ "dynamicBindable": false,
152
+ "dynamicSourceTypes": [],
153
+ "id": "menu",
154
+ "media": null,
155
+ "resource": "menu",
156
+ "value": "string"
157
+ },
158
+ "number": {
159
+ "aiGenerate": true,
160
+ "constraints": [
161
+ "min",
162
+ "max",
163
+ "step"
164
+ ],
165
+ "control": "number-input",
166
+ "doc": "Numeric input.",
167
+ "dynamicBindable": true,
168
+ "dynamicSourceTypes": [
169
+ "number_integer",
170
+ "number_decimal"
171
+ ],
172
+ "id": "number",
173
+ "media": null,
174
+ "resource": null,
175
+ "value": "number"
176
+ },
177
+ "page": {
178
+ "aiGenerate": true,
179
+ "constraints": [
180
+ "resolve"
181
+ ],
182
+ "control": "resource-picker",
183
+ "doc": "Page handle.",
184
+ "dynamicBindable": false,
185
+ "dynamicSourceTypes": [],
186
+ "id": "page",
187
+ "media": null,
188
+ "resource": "page",
189
+ "value": "string"
190
+ },
191
+ "product": {
192
+ "aiGenerate": true,
193
+ "constraints": [
194
+ "resolve"
195
+ ],
196
+ "control": "resource-picker",
197
+ "doc": "Product handle.",
198
+ "dynamicBindable": false,
199
+ "dynamicSourceTypes": [],
200
+ "id": "product",
201
+ "media": null,
202
+ "resource": "product",
203
+ "value": "string"
204
+ },
205
+ "radio": {
206
+ "aiGenerate": true,
207
+ "constraints": [
208
+ "options"
209
+ ],
210
+ "control": "segmented",
211
+ "doc": "Segmented choice.",
212
+ "dynamicBindable": false,
213
+ "dynamicSourceTypes": [],
214
+ "id": "radio",
215
+ "media": null,
216
+ "resource": null,
217
+ "value": "string"
218
+ },
219
+ "range": {
220
+ "aiGenerate": true,
221
+ "constraints": [
222
+ "min",
223
+ "max",
224
+ "step",
225
+ "unit"
226
+ ],
227
+ "control": "slider",
228
+ "doc": "Slider; declare min/max/step.",
229
+ "dynamicBindable": false,
230
+ "dynamicSourceTypes": [],
231
+ "id": "range",
232
+ "media": null,
233
+ "resource": null,
234
+ "value": "number"
235
+ },
236
+ "richtext": {
237
+ "aiGenerate": true,
238
+ "constraints": [],
239
+ "control": "rich-text",
240
+ "doc": "Formatted text.",
241
+ "dynamicBindable": true,
242
+ "dynamicSourceTypes": [
243
+ "rich_text_field"
244
+ ],
245
+ "id": "richtext",
246
+ "media": null,
247
+ "resource": null,
248
+ "value": "string"
249
+ },
250
+ "select": {
251
+ "aiGenerate": true,
252
+ "constraints": [
253
+ "options"
254
+ ],
255
+ "control": "select",
256
+ "doc": "Dropdown.",
257
+ "dynamicBindable": false,
258
+ "dynamicSourceTypes": [],
259
+ "id": "select",
260
+ "media": null,
261
+ "resource": null,
262
+ "value": "string"
263
+ },
264
+ "text": {
265
+ "aiGenerate": true,
266
+ "constraints": [],
267
+ "control": "text-input",
268
+ "doc": "Single-line text.",
269
+ "dynamicBindable": true,
270
+ "dynamicSourceTypes": [
271
+ "single_line_text_field"
272
+ ],
273
+ "id": "text",
274
+ "media": null,
275
+ "resource": null,
276
+ "value": "string"
277
+ },
278
+ "text_alignment": {
279
+ "aiGenerate": true,
280
+ "constraints": [],
281
+ "control": "segmented",
282
+ "doc": "Editor supplies the three choices.",
283
+ "dynamicBindable": false,
284
+ "dynamicSourceTypes": [],
285
+ "id": "text_alignment",
286
+ "media": null,
287
+ "resource": null,
288
+ "value": "string"
289
+ },
290
+ "textarea": {
291
+ "aiGenerate": true,
292
+ "constraints": [],
293
+ "control": "textarea",
294
+ "doc": "Multi-line plain text, no markup.",
295
+ "dynamicBindable": true,
296
+ "dynamicSourceTypes": [
297
+ "multi_line_text_field"
298
+ ],
299
+ "id": "textarea",
300
+ "media": null,
301
+ "resource": null,
302
+ "value": "string"
303
+ },
304
+ "url": {
305
+ "aiGenerate": true,
306
+ "constraints": [],
307
+ "control": "link-picker",
308
+ "doc": "A link.",
309
+ "dynamicBindable": true,
310
+ "dynamicSourceTypes": [
311
+ "url"
312
+ ],
313
+ "id": "url",
314
+ "media": null,
315
+ "resource": null,
316
+ "value": "string"
317
+ },
318
+ "video": {
319
+ "aiGenerate": true,
320
+ "constraints": [],
321
+ "control": "media-picker",
322
+ "doc": "Hosted video; external URL → `url`.",
323
+ "dynamicBindable": false,
324
+ "dynamicSourceTypes": [],
325
+ "id": "video",
326
+ "media": "video",
327
+ "resource": null,
328
+ "value": "string"
329
+ }
330
+ },
331
+ "2": {
332
+ "article": {
333
+ "aiGenerate": true,
334
+ "constraints": [
335
+ "resolve"
336
+ ],
337
+ "control": "resource-picker",
338
+ "doc": "Article handle.",
339
+ "dynamicBindable": false,
340
+ "dynamicSourceTypes": [],
341
+ "id": "article",
342
+ "media": null,
343
+ "resource": "article",
344
+ "value": "string"
345
+ },
346
+ "blog": {
347
+ "aiGenerate": true,
348
+ "constraints": [
349
+ "resolve"
350
+ ],
351
+ "control": "resource-picker",
352
+ "doc": "Blog handle.",
353
+ "dynamicBindable": false,
354
+ "dynamicSourceTypes": [],
355
+ "id": "blog",
356
+ "media": null,
357
+ "resource": "blog",
358
+ "value": "string"
359
+ },
360
+ "boolean": {
361
+ "aiGenerate": true,
362
+ "constraints": [],
363
+ "control": "switch",
364
+ "doc": "On/off.",
365
+ "dynamicBindable": false,
366
+ "dynamicSourceTypes": [
367
+ "boolean"
368
+ ],
369
+ "id": "boolean",
370
+ "media": null,
371
+ "resource": null,
372
+ "value": "boolean"
373
+ },
374
+ "collection": {
375
+ "aiGenerate": true,
376
+ "constraints": [
377
+ "resolve"
378
+ ],
379
+ "control": "resource-picker",
380
+ "doc": "Collection handle.",
381
+ "dynamicBindable": false,
382
+ "dynamicSourceTypes": [],
383
+ "id": "collection",
384
+ "media": null,
385
+ "resource": "collection",
386
+ "value": "string"
387
+ },
388
+ "color": {
389
+ "aiGenerate": true,
390
+ "constraints": [],
391
+ "control": "color",
392
+ "doc": "Colour.",
393
+ "dynamicBindable": false,
394
+ "dynamicSourceTypes": [],
395
+ "id": "color",
396
+ "media": null,
397
+ "resource": null,
398
+ "value": "string"
399
+ },
400
+ "html": {
401
+ "aiGenerate": false,
402
+ "constraints": [],
403
+ "control": "textarea",
404
+ "doc": "Author-trusted; never bind shopper input.",
405
+ "dynamicBindable": false,
406
+ "dynamicSourceTypes": [],
407
+ "id": "html",
408
+ "media": null,
409
+ "resource": null,
410
+ "value": "string"
411
+ },
412
+ "image": {
413
+ "aiGenerate": true,
414
+ "constraints": [],
415
+ "control": "media-picker",
416
+ "doc": "Media-library picker.",
417
+ "dynamicBindable": true,
418
+ "dynamicSourceTypes": [
419
+ "file_reference",
420
+ "image"
421
+ ],
422
+ "id": "image",
423
+ "media": "image",
424
+ "resource": null,
425
+ "value": "string"
426
+ },
427
+ "json": {
428
+ "aiGenerate": true,
429
+ "constraints": [
430
+ "schema"
431
+ ],
432
+ "control": "json-editor",
433
+ "doc": "Free-form structured value validated against `schema` when present.",
434
+ "dynamicBindable": false,
435
+ "dynamicSourceTypes": [],
436
+ "id": "json",
437
+ "media": null,
438
+ "resource": null,
439
+ "value": "object"
440
+ },
441
+ "list": {
442
+ "aiGenerate": true,
443
+ "constraints": [
444
+ "items",
445
+ "min",
446
+ "max"
447
+ ],
448
+ "control": "list",
449
+ "doc": "Ordered values of one element spec.",
450
+ "dynamicBindable": false,
451
+ "dynamicSourceTypes": [],
452
+ "id": "list",
453
+ "media": null,
454
+ "resource": null,
455
+ "value": "array"
456
+ },
457
+ "menu": {
458
+ "aiGenerate": true,
459
+ "constraints": [
460
+ "resolve"
461
+ ],
462
+ "control": "resource-picker",
463
+ "doc": "Store menu handle.",
464
+ "dynamicBindable": false,
465
+ "dynamicSourceTypes": [],
466
+ "id": "menu",
467
+ "media": null,
468
+ "resource": "menu",
469
+ "value": "string"
470
+ },
471
+ "number": {
472
+ "aiGenerate": true,
473
+ "constraints": [
474
+ "min",
475
+ "max",
476
+ "step"
477
+ ],
478
+ "control": "number-input",
479
+ "doc": "Numeric input.",
480
+ "dynamicBindable": true,
481
+ "dynamicSourceTypes": [
482
+ "number_integer",
483
+ "number_decimal"
484
+ ],
485
+ "id": "number",
486
+ "media": null,
487
+ "resource": null,
488
+ "value": "number"
489
+ },
490
+ "page": {
491
+ "aiGenerate": true,
492
+ "constraints": [
493
+ "resolve"
494
+ ],
495
+ "control": "resource-picker",
496
+ "doc": "Page handle.",
497
+ "dynamicBindable": false,
498
+ "dynamicSourceTypes": [],
499
+ "id": "page",
500
+ "media": null,
501
+ "resource": "page",
502
+ "value": "string"
503
+ },
504
+ "product": {
505
+ "aiGenerate": true,
506
+ "constraints": [
507
+ "resolve"
508
+ ],
509
+ "control": "resource-picker",
510
+ "doc": "Product handle.",
511
+ "dynamicBindable": false,
512
+ "dynamicSourceTypes": [],
513
+ "id": "product",
514
+ "media": null,
515
+ "resource": "product",
516
+ "value": "string"
517
+ },
518
+ "radio": {
519
+ "aiGenerate": true,
520
+ "constraints": [
521
+ "options"
522
+ ],
523
+ "control": "segmented",
524
+ "doc": "Segmented choice.",
525
+ "dynamicBindable": false,
526
+ "dynamicSourceTypes": [],
527
+ "id": "radio",
528
+ "media": null,
529
+ "resource": null,
530
+ "value": "string"
531
+ },
532
+ "range": {
533
+ "aiGenerate": true,
534
+ "constraints": [
535
+ "min",
536
+ "max",
537
+ "step",
538
+ "unit"
539
+ ],
540
+ "control": "slider",
541
+ "doc": "Slider; declare min/max/step.",
542
+ "dynamicBindable": false,
543
+ "dynamicSourceTypes": [],
544
+ "id": "range",
545
+ "media": null,
546
+ "resource": null,
547
+ "value": "number"
548
+ },
549
+ "richtext": {
550
+ "aiGenerate": true,
551
+ "constraints": [],
552
+ "control": "rich-text",
553
+ "doc": "Formatted text.",
554
+ "dynamicBindable": true,
555
+ "dynamicSourceTypes": [
556
+ "rich_text_field"
557
+ ],
558
+ "id": "richtext",
559
+ "media": null,
560
+ "resource": null,
561
+ "value": "string"
562
+ },
563
+ "select": {
564
+ "aiGenerate": true,
565
+ "constraints": [
566
+ "options"
567
+ ],
568
+ "control": "select",
569
+ "doc": "Dropdown.",
570
+ "dynamicBindable": false,
571
+ "dynamicSourceTypes": [],
572
+ "id": "select",
573
+ "media": null,
574
+ "resource": null,
575
+ "value": "string"
576
+ },
577
+ "text": {
578
+ "aiGenerate": true,
579
+ "constraints": [],
580
+ "control": "text-input",
581
+ "doc": "Single-line text.",
582
+ "dynamicBindable": true,
583
+ "dynamicSourceTypes": [
584
+ "single_line_text_field"
585
+ ],
586
+ "id": "text",
587
+ "media": null,
588
+ "resource": null,
589
+ "value": "string"
590
+ },
591
+ "text_alignment": {
592
+ "aiGenerate": true,
593
+ "constraints": [],
594
+ "control": "segmented",
595
+ "doc": "Editor supplies the three choices.",
596
+ "dynamicBindable": false,
597
+ "dynamicSourceTypes": [],
598
+ "id": "text_alignment",
599
+ "media": null,
600
+ "resource": null,
601
+ "value": "string"
602
+ },
603
+ "textarea": {
604
+ "aiGenerate": true,
605
+ "constraints": [],
606
+ "control": "textarea",
607
+ "doc": "Multi-line plain text, no markup.",
608
+ "dynamicBindable": true,
609
+ "dynamicSourceTypes": [
610
+ "multi_line_text_field"
611
+ ],
612
+ "id": "textarea",
613
+ "media": null,
614
+ "resource": null,
615
+ "value": "string"
616
+ },
617
+ "url": {
618
+ "aiGenerate": true,
619
+ "constraints": [],
620
+ "control": "link-picker",
621
+ "doc": "A link.",
622
+ "dynamicBindable": true,
623
+ "dynamicSourceTypes": [
624
+ "url"
625
+ ],
626
+ "id": "url",
627
+ "media": null,
628
+ "resource": null,
629
+ "value": "string"
630
+ },
631
+ "video": {
632
+ "aiGenerate": true,
633
+ "constraints": [],
634
+ "control": "media-picker",
635
+ "doc": "Hosted video; external URL → `url`.",
636
+ "dynamicBindable": false,
637
+ "dynamicSourceTypes": [],
638
+ "id": "video",
639
+ "media": "video",
640
+ "resource": null,
641
+ "value": "string"
642
+ }
643
+ }
644
+ },
645
+ "universalConstraints": [
646
+ "label",
647
+ "info",
648
+ "default",
649
+ "placeholder",
650
+ "group",
651
+ "visible_if"
652
+ ],
653
+ "valueShapes": {
654
+ "1": {
655
+ "article": {
656
+ "kind": "string",
657
+ "note": "`<blog>/<article>` handle"
658
+ },
659
+ "blog": {
660
+ "kind": "string",
661
+ "note": "handle"
662
+ },
663
+ "boolean": {
664
+ "kind": "boolean"
665
+ },
666
+ "collection": {
667
+ "kind": "string",
668
+ "note": "handle"
669
+ },
670
+ "color": {
671
+ "formats": [
672
+ "#rrggbb",
673
+ "#rrggbbaa"
674
+ ],
675
+ "kind": "string"
676
+ },
677
+ "html": {
678
+ "kind": "string",
679
+ "note": "raw HTML"
680
+ },
681
+ "image": {
682
+ "kind": "string",
683
+ "schemes": [
684
+ "https:"
685
+ ],
686
+ "siteRelative": false
687
+ },
688
+ "json": {
689
+ "kind": "object",
690
+ "note": "≤ 16 KiB serialised"
691
+ },
692
+ "list": {
693
+ "kind": "array",
694
+ "note": "≤ 64 entries; `items` depth ≤ 2",
695
+ "of": "items.value"
696
+ },
697
+ "menu": {
698
+ "kind": "string",
699
+ "note": "handle"
700
+ },
701
+ "number": {
702
+ "kind": "number"
703
+ },
704
+ "page": {
705
+ "kind": "string",
706
+ "note": "handle"
707
+ },
708
+ "product": {
709
+ "kind": "string",
710
+ "note": "handle"
711
+ },
712
+ "radio": {
713
+ "kind": "string",
714
+ "oneOf": "options[].value"
715
+ },
716
+ "range": {
717
+ "kind": "number"
718
+ },
719
+ "richtext": {
720
+ "kind": "string",
721
+ "note": "sanitised HTML"
722
+ },
723
+ "select": {
724
+ "kind": "string",
725
+ "oneOf": "options[].value"
726
+ },
727
+ "text": {
728
+ "kind": "string"
729
+ },
730
+ "text_alignment": {
731
+ "enum": [
732
+ "left",
733
+ "center",
734
+ "right"
735
+ ],
736
+ "kind": "string"
737
+ },
738
+ "textarea": {
739
+ "kind": "string"
740
+ },
741
+ "url": {
742
+ "kind": "string",
743
+ "schemes": [
744
+ "https:",
745
+ "http:",
746
+ "mailto:",
747
+ "tel:"
748
+ ],
749
+ "siteRelative": true
750
+ },
751
+ "video": {
752
+ "kind": "string",
753
+ "schemes": [
754
+ "https:"
755
+ ],
756
+ "siteRelative": false
757
+ }
758
+ },
759
+ "2": {
760
+ "article": {
761
+ "kind": "string",
762
+ "note": "`<blog>/<article>` handle"
763
+ },
764
+ "blog": {
765
+ "kind": "string",
766
+ "note": "handle"
767
+ },
768
+ "boolean": {
769
+ "kind": "boolean"
770
+ },
771
+ "collection": {
772
+ "kind": "string",
773
+ "note": "handle"
774
+ },
775
+ "color": {
776
+ "formats": [
777
+ "#rrggbb",
778
+ "#rrggbbaa"
779
+ ],
780
+ "kind": "string"
781
+ },
782
+ "html": {
783
+ "kind": "string",
784
+ "note": "raw HTML"
785
+ },
786
+ "image": {
787
+ "assetRef": true,
788
+ "kind": "string",
789
+ "schemes": [
790
+ "https:"
791
+ ],
792
+ "siteRelative": false
793
+ },
794
+ "json": {
795
+ "kind": "object",
796
+ "note": "≤ 16 KiB serialised"
797
+ },
798
+ "list": {
799
+ "kind": "array",
800
+ "note": "≤ 64 entries; `items` depth ≤ 2",
801
+ "of": "items.value"
802
+ },
803
+ "menu": {
804
+ "kind": "string",
805
+ "note": "handle"
806
+ },
807
+ "number": {
808
+ "kind": "number"
809
+ },
810
+ "page": {
811
+ "kind": "string",
812
+ "note": "handle"
813
+ },
814
+ "product": {
815
+ "kind": "string",
816
+ "note": "handle"
817
+ },
818
+ "radio": {
819
+ "kind": "string",
820
+ "oneOf": "options[].value"
821
+ },
822
+ "range": {
823
+ "kind": "number"
824
+ },
825
+ "richtext": {
826
+ "kind": "string",
827
+ "note": "sanitised HTML"
828
+ },
829
+ "select": {
830
+ "kind": "string",
831
+ "oneOf": "options[].value"
832
+ },
833
+ "text": {
834
+ "kind": "string"
835
+ },
836
+ "text_alignment": {
837
+ "enum": [
838
+ "left",
839
+ "center",
840
+ "right",
841
+ "start",
842
+ "end"
843
+ ],
844
+ "kind": "string"
845
+ },
846
+ "textarea": {
847
+ "kind": "string"
848
+ },
849
+ "url": {
850
+ "kind": "string",
851
+ "schemes": [
852
+ "https:",
853
+ "http:",
854
+ "mailto:",
855
+ "tel:"
856
+ ],
857
+ "siteRelative": true
858
+ },
859
+ "video": {
860
+ "assetRef": true,
861
+ "kind": "string",
862
+ "schemes": [
863
+ "https:"
864
+ ],
865
+ "siteRelative": false
866
+ }
867
+ }
868
+ }
869
+ }