@port60/template-kit 0.20.4 → 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 (58) hide show
  1. package/README.md +42 -3
  2. package/bin/cli.mjs +10 -0
  3. package/package.json +4 -2
  4. package/src/commands/content.mjs +4 -3
  5. package/src/commands/create.mjs +11 -3
  6. package/src/commands/dev.mjs +9 -3
  7. package/src/commands/model.mjs +3 -3
  8. package/src/commands/packageCmd.mjs +1 -1
  9. package/src/commands/publish.mjs +1 -1
  10. package/src/commands/refresh.mjs +8 -3
  11. package/src/commands/release.mjs +22 -0
  12. package/src/commands/setupPreviews.mjs +19 -0
  13. package/src/commands/validate.mjs +1 -1
  14. package/src/lib/agentsMd.mjs +108 -155
  15. package/src/lib/designer-bridge.js +26 -0
  16. package/src/lib/designerPalette.mjs +62 -0
  17. package/src/lib/galleryPosters.mjs +105 -0
  18. package/src/lib/previewOptions.mjs +1 -1
  19. package/src/lib/releaseBundle.mjs +141 -0
  20. package/src/vendor/contract/v1/context.json +1 -1
  21. package/src/vendor/contract/v1/manifest.schema.json +6 -0
  22. package/src/vendor/contract/v2/behaviours.json +346 -0
  23. package/src/vendor/contract/v2/content-bounds.json +117 -0
  24. package/src/vendor/contract/v2/content-model.json +766 -0
  25. package/src/vendor/contract/v2/context.json +1569 -0
  26. package/src/vendor/contract/v2/dialect.json +105 -0
  27. package/src/vendor/contract/v2/fonts.json +910 -0
  28. package/src/vendor/contract/v2/imagery.json +32 -0
  29. package/src/vendor/contract/v2/islands.json +263 -0
  30. package/src/vendor/contract/v2/layout.json +28 -0
  31. package/src/vendor/contract/v2/manifest.schema.json +388 -0
  32. package/src/vendor/contract/v2/sections.json +947 -0
  33. package/src/vendor/contract/v2/site.schema.json +1353 -0
  34. package/src/vendor/contract/v2/tokens.json +101 -0
  35. package/src/vendor/contract/v2.lock.json +6931 -0
  36. package/src/vendor/engine/content-footprint.mjs +76 -1
  37. package/src/vendor/engine/majors.mjs +42 -0
  38. package/src/vendor/validator/gift-aid-logo.svg +6 -0
  39. package/src/vendor/validator/model-reference-v2.mjs +95 -0
  40. package/src/vendor/validator/platform-base.css +359 -2
  41. package/src/vendor/validator/preview-v1.mjs +691 -0
  42. package/src/vendor/validator/preview-v2.mjs +654 -0
  43. package/src/vendor/validator/preview.mjs +8 -688
  44. package/src/vendor/validator/site-context-v2.mjs +113 -0
  45. package/src/vendor/validator/validate-v1.mjs +666 -0
  46. package/src/vendor/validator/validate-v2.mjs +642 -0
  47. package/src/vendor/validator/validate.mjs +21 -621
  48. package/starter/assets/theme.css +3 -0
  49. package/starter/layout.liquid +15 -18
  50. package/starter/manifest.json +6 -4
  51. package/starter/preview/config.json +4 -0
  52. package/starter/preview/media/README.md +9 -0
  53. package/starter/sections/campaigns.liquid +5 -4
  54. package/starter/sections/cta.liquid +2 -2
  55. package/starter/sections/hero.liquid +9 -2
  56. package/starter/sections/homeHero.liquid +28 -24
  57. package/starter/sections/people.liquid +7 -6
  58. package/starter/sections/values.liquid +3 -3
@@ -0,0 +1,766 @@
1
+ {
2
+ "description": "Version 2 public content model. Collection envelopes carry resolved public labels, real destinations, bounded eligible items and optional listing pagination. Metadata does not require a record fetch. Absent authored values and explicitly cleared values remain distinct. Additive-only within major 2.",
3
+ "version": "2.0",
4
+ "root": "site",
5
+ "siblings": {
6
+ "description": "Resolved website metadata, actions and current-page context, separate from public source collections.",
7
+ "keys": [
8
+ "brand",
9
+ "nav",
10
+ "socials",
11
+ "locale",
12
+ "actions",
13
+ "page"
14
+ ]
15
+ },
16
+ "collections": {
17
+ "services": {
18
+ "since": "2.0",
19
+ "cap": 24,
20
+ "moreHref": "/services",
21
+ "description": "The organisation's published content pages (the services CMS), newest curation order first.",
22
+ "item": {
23
+ "id": {
24
+ "type": "string",
25
+ "since": "2.0"
26
+ },
27
+ "title": {
28
+ "type": "string",
29
+ "since": "2.0",
30
+ "max": 200
31
+ },
32
+ "slug": {
33
+ "type": "string",
34
+ "since": "2.0"
35
+ },
36
+ "summary": {
37
+ "type": "string",
38
+ "since": "2.0",
39
+ "nullable": true,
40
+ "max": 500
41
+ },
42
+ "imageUrl": {
43
+ "type": "string",
44
+ "since": "2.0",
45
+ "nullable": true
46
+ },
47
+ "href": {
48
+ "type": "string",
49
+ "since": "2.0"
50
+ }
51
+ },
52
+ "shape": "envelope",
53
+ "members": {
54
+ "label": {
55
+ "type": "string",
56
+ "since": "2.0",
57
+ "description": "Resolved required public collection name.",
58
+ "max": 60
59
+ },
60
+ "href": {
61
+ "type": "string",
62
+ "since": "2.0",
63
+ "description": "Platform-resolved destination; Documents may have none."
64
+ },
65
+ "items": {
66
+ "type": "array",
67
+ "since": "2.0",
68
+ "boundedBy": "cap",
69
+ "description": "Eligible bounded records for this render."
70
+ },
71
+ "pagination": {
72
+ "type": "object",
73
+ "nullable": true,
74
+ "since": "2.0",
75
+ "fields": {
76
+ "page": {
77
+ "type": "number",
78
+ "minimum": 0
79
+ },
80
+ "size": {
81
+ "type": "number",
82
+ "minimum": 1
83
+ },
84
+ "totalElements": {
85
+ "type": "number",
86
+ "minimum": 0
87
+ },
88
+ "totalPages": {
89
+ "type": "number",
90
+ "minimum": 0
91
+ },
92
+ "nextHref": {
93
+ "type": "string",
94
+ "nullable": true
95
+ },
96
+ "previousHref": {
97
+ "type": "string",
98
+ "nullable": true
99
+ }
100
+ }
101
+ }
102
+ }
103
+ },
104
+ "events": {
105
+ "since": "2.0",
106
+ "cap": 12,
107
+ "moreHref": "/events",
108
+ "description": "Published events, soonest first. `registrationMode` is an OPEN enum: INFO, RSVP and TICKETED exist today and new modes will arrive; branch on the ones you style and fall back for the rest.",
109
+ "item": {
110
+ "id": {
111
+ "type": "string",
112
+ "since": "2.0"
113
+ },
114
+ "name": {
115
+ "type": "string",
116
+ "since": "2.0",
117
+ "max": 200
118
+ },
119
+ "description": {
120
+ "type": "string",
121
+ "since": "2.0",
122
+ "nullable": true,
123
+ "max": 200
124
+ },
125
+ "registrationMode": {
126
+ "type": "string",
127
+ "since": "2.0",
128
+ "enumOpen": [
129
+ "INFO",
130
+ "RSVP",
131
+ "TICKETED"
132
+ ]
133
+ },
134
+ "startsAt": {
135
+ "type": "string",
136
+ "since": "2.0"
137
+ },
138
+ "endsAt": {
139
+ "type": "string",
140
+ "since": "2.0",
141
+ "nullable": true
142
+ },
143
+ "venueName": {
144
+ "type": "string",
145
+ "since": "2.0",
146
+ "nullable": true,
147
+ "max": 200
148
+ },
149
+ "online": {
150
+ "type": "boolean",
151
+ "since": "2.0"
152
+ },
153
+ "imageUrl": {
154
+ "type": "string",
155
+ "since": "2.0",
156
+ "nullable": true
157
+ },
158
+ "onSale": {
159
+ "type": "boolean",
160
+ "since": "2.0"
161
+ },
162
+ "soldOut": {
163
+ "type": "boolean",
164
+ "since": "2.0"
165
+ },
166
+ "priceFrom": {
167
+ "type": "number",
168
+ "since": "2.0",
169
+ "nullable": true,
170
+ "description": "Minimum finite nonnegative full variant price. Monthly and quarterly instalment amounts are not a course full fee."
171
+ },
172
+ "currency": {
173
+ "type": "string",
174
+ "since": "2.0",
175
+ "nullable": true
176
+ },
177
+ "detailHref": {
178
+ "type": "string",
179
+ "since": "2.0"
180
+ }
181
+ },
182
+ "shape": "envelope",
183
+ "members": {
184
+ "label": {
185
+ "type": "string",
186
+ "since": "2.0",
187
+ "description": "Resolved required public collection name.",
188
+ "max": 60
189
+ },
190
+ "href": {
191
+ "type": "string",
192
+ "since": "2.0",
193
+ "description": "Platform-resolved destination; Documents may have none."
194
+ },
195
+ "items": {
196
+ "type": "array",
197
+ "since": "2.0",
198
+ "boundedBy": "cap",
199
+ "description": "Eligible bounded records for this render."
200
+ },
201
+ "pagination": {
202
+ "type": "object",
203
+ "nullable": true,
204
+ "since": "2.0",
205
+ "fields": {
206
+ "page": {
207
+ "type": "number",
208
+ "minimum": 0
209
+ },
210
+ "size": {
211
+ "type": "number",
212
+ "minimum": 1
213
+ },
214
+ "totalElements": {
215
+ "type": "number",
216
+ "minimum": 0
217
+ },
218
+ "totalPages": {
219
+ "type": "number",
220
+ "minimum": 0
221
+ },
222
+ "nextHref": {
223
+ "type": "string",
224
+ "nullable": true
225
+ },
226
+ "previousHref": {
227
+ "type": "string",
228
+ "nullable": true
229
+ }
230
+ }
231
+ }
232
+ }
233
+ },
234
+ "articles": {
235
+ "since": "2.0",
236
+ "cap": 12,
237
+ "moreHref": "/articles/all",
238
+ "description": "Published articles, newest first. Detail bodies stay editor-owned sanitised richtext on the article page BY DESIGN; the card model carries everything a listing needs.",
239
+ "item": {
240
+ "id": {
241
+ "type": "string",
242
+ "since": "2.0"
243
+ },
244
+ "title": {
245
+ "type": "string",
246
+ "since": "2.0",
247
+ "max": 200
248
+ },
249
+ "slug": {
250
+ "type": "string",
251
+ "since": "2.0"
252
+ },
253
+ "excerpt": {
254
+ "type": "string",
255
+ "since": "2.0",
256
+ "nullable": true,
257
+ "max": 500
258
+ },
259
+ "imageUrl": {
260
+ "type": "string",
261
+ "since": "2.0",
262
+ "nullable": true
263
+ },
264
+ "authorName": {
265
+ "type": "string",
266
+ "since": "2.0",
267
+ "nullable": true,
268
+ "max": 120
269
+ },
270
+ "authorRole": {
271
+ "type": "string",
272
+ "since": "2.0",
273
+ "nullable": true,
274
+ "max": 120
275
+ },
276
+ "categories": {
277
+ "type": "string[]",
278
+ "since": "2.0"
279
+ },
280
+ "publishedAt": {
281
+ "type": "string",
282
+ "since": "2.0"
283
+ },
284
+ "readingMinutes": {
285
+ "type": "number",
286
+ "since": "2.0",
287
+ "nullable": true
288
+ },
289
+ "href": {
290
+ "type": "string",
291
+ "since": "2.0"
292
+ }
293
+ },
294
+ "shape": "envelope",
295
+ "members": {
296
+ "label": {
297
+ "type": "string",
298
+ "since": "2.0",
299
+ "description": "Resolved required public collection name.",
300
+ "max": 60
301
+ },
302
+ "href": {
303
+ "type": "string",
304
+ "since": "2.0",
305
+ "description": "Platform-resolved destination; Documents may have none."
306
+ },
307
+ "items": {
308
+ "type": "array",
309
+ "since": "2.0",
310
+ "boundedBy": "cap",
311
+ "description": "Eligible bounded records for this render."
312
+ },
313
+ "pagination": {
314
+ "type": "object",
315
+ "nullable": true,
316
+ "since": "2.0",
317
+ "fields": {
318
+ "page": {
319
+ "type": "number",
320
+ "minimum": 0
321
+ },
322
+ "size": {
323
+ "type": "number",
324
+ "minimum": 1
325
+ },
326
+ "totalElements": {
327
+ "type": "number",
328
+ "minimum": 0
329
+ },
330
+ "totalPages": {
331
+ "type": "number",
332
+ "minimum": 0
333
+ },
334
+ "nextHref": {
335
+ "type": "string",
336
+ "nullable": true
337
+ },
338
+ "previousHref": {
339
+ "type": "string",
340
+ "nullable": true
341
+ }
342
+ }
343
+ }
344
+ }
345
+ },
346
+ "campaigns": {
347
+ "since": "2.0",
348
+ "cap": 12,
349
+ "moreHref": "/campaigns",
350
+ "description": "Live campaigns, curation order.",
351
+ "item": {
352
+ "id": {
353
+ "type": "string",
354
+ "since": "2.0"
355
+ },
356
+ "title": {
357
+ "type": "string",
358
+ "since": "2.0",
359
+ "max": 200
360
+ },
361
+ "href": {
362
+ "type": "string",
363
+ "since": "2.0"
364
+ },
365
+ "summary": {
366
+ "type": "string",
367
+ "since": "2.0",
368
+ "nullable": true,
369
+ "max": 500
370
+ },
371
+ "imageUrl": {
372
+ "type": "string",
373
+ "since": "2.0",
374
+ "nullable": true
375
+ },
376
+ "slug": {
377
+ "type": "string",
378
+ "since": "2.0",
379
+ "description": "Public stable campaign slug; prefer the supplied href for links."
380
+ }
381
+ },
382
+ "shape": "envelope",
383
+ "members": {
384
+ "label": {
385
+ "type": "string",
386
+ "since": "2.0",
387
+ "description": "Resolved required public collection name.",
388
+ "max": 60
389
+ },
390
+ "href": {
391
+ "type": "string",
392
+ "since": "2.0",
393
+ "description": "Platform-resolved destination; Documents may have none."
394
+ },
395
+ "items": {
396
+ "type": "array",
397
+ "since": "2.0",
398
+ "boundedBy": "cap",
399
+ "description": "Eligible bounded records for this render."
400
+ },
401
+ "pagination": {
402
+ "type": "object",
403
+ "nullable": true,
404
+ "since": "2.0",
405
+ "fields": {
406
+ "page": {
407
+ "type": "number",
408
+ "minimum": 0
409
+ },
410
+ "size": {
411
+ "type": "number",
412
+ "minimum": 1
413
+ },
414
+ "totalElements": {
415
+ "type": "number",
416
+ "minimum": 0
417
+ },
418
+ "totalPages": {
419
+ "type": "number",
420
+ "minimum": 0
421
+ },
422
+ "nextHref": {
423
+ "type": "string",
424
+ "nullable": true
425
+ },
426
+ "previousHref": {
427
+ "type": "string",
428
+ "nullable": true
429
+ }
430
+ }
431
+ }
432
+ }
433
+ },
434
+ "causes": {
435
+ "since": "2.0",
436
+ "cap": 12,
437
+ "moreHref": "/donate",
438
+ "description": "Causes currently accepting donations, quick-give first. `paymentOptions` mirrors the public cause contract.",
439
+ "item": {
440
+ "id": {
441
+ "type": "string",
442
+ "since": "2.0"
443
+ },
444
+ "title": {
445
+ "type": "string",
446
+ "since": "2.0",
447
+ "max": 200
448
+ },
449
+ "slug": {
450
+ "type": "string",
451
+ "since": "2.0"
452
+ },
453
+ "description": {
454
+ "type": "string",
455
+ "since": "2.0",
456
+ "nullable": true,
457
+ "max": 500
458
+ },
459
+ "imageUrl": {
460
+ "type": "string",
461
+ "since": "2.0",
462
+ "nullable": true
463
+ },
464
+ "targetAmount": {
465
+ "type": "number",
466
+ "since": "2.0",
467
+ "nullable": true
468
+ },
469
+ "raisedAmount": {
470
+ "type": "number",
471
+ "since": "2.0",
472
+ "nullable": true
473
+ },
474
+ "progressPercentage": {
475
+ "type": "number",
476
+ "since": "2.0",
477
+ "nullable": true
478
+ },
479
+ "href": {
480
+ "type": "string",
481
+ "since": "2.0"
482
+ },
483
+ "paymentOptions": {
484
+ "type": "object",
485
+ "since": "2.0",
486
+ "nullable": true
487
+ }
488
+ },
489
+ "shape": "envelope",
490
+ "members": {
491
+ "label": {
492
+ "type": "string",
493
+ "since": "2.0",
494
+ "description": "Resolved required public collection name.",
495
+ "max": 60
496
+ },
497
+ "href": {
498
+ "type": "string",
499
+ "since": "2.0",
500
+ "description": "Platform-resolved destination; Documents may have none."
501
+ },
502
+ "items": {
503
+ "type": "array",
504
+ "since": "2.0",
505
+ "boundedBy": "cap",
506
+ "description": "Eligible bounded records for this render."
507
+ },
508
+ "pagination": {
509
+ "type": "object",
510
+ "nullable": true,
511
+ "since": "2.0",
512
+ "fields": {
513
+ "page": {
514
+ "type": "number",
515
+ "minimum": 0
516
+ },
517
+ "size": {
518
+ "type": "number",
519
+ "minimum": 1
520
+ },
521
+ "totalElements": {
522
+ "type": "number",
523
+ "minimum": 0
524
+ },
525
+ "totalPages": {
526
+ "type": "number",
527
+ "minimum": 0
528
+ },
529
+ "nextHref": {
530
+ "type": "string",
531
+ "nullable": true
532
+ },
533
+ "previousHref": {
534
+ "type": "string",
535
+ "nullable": true
536
+ }
537
+ }
538
+ }
539
+ }
540
+ },
541
+ "courses": {
542
+ "since": "2.0",
543
+ "cap": 12,
544
+ "moreHref": "/courses",
545
+ "description": "Enrollable courses. The long-form About body is sanitised richtext on the course page, never in cards.",
546
+ "item": {
547
+ "id": {
548
+ "type": "string",
549
+ "since": "2.0"
550
+ },
551
+ "title": {
552
+ "type": "string",
553
+ "since": "2.0",
554
+ "max": 200
555
+ },
556
+ "description": {
557
+ "type": "string",
558
+ "since": "2.0",
559
+ "nullable": true,
560
+ "max": 500
561
+ },
562
+ "imageUrl": {
563
+ "type": "string",
564
+ "since": "2.0",
565
+ "nullable": true
566
+ },
567
+ "venue": {
568
+ "type": "string",
569
+ "since": "2.0",
570
+ "nullable": true,
571
+ "max": 200
572
+ },
573
+ "audience": {
574
+ "type": "string",
575
+ "since": "2.0",
576
+ "enumOpen": [
577
+ "EVERYONE",
578
+ "CHILD"
579
+ ]
580
+ },
581
+ "priceFrom": {
582
+ "type": "number",
583
+ "since": "2.0",
584
+ "nullable": true
585
+ },
586
+ "currency": {
587
+ "type": "string",
588
+ "since": "2.0",
589
+ "nullable": true
590
+ },
591
+ "soldOut": {
592
+ "type": "boolean",
593
+ "since": "2.0"
594
+ },
595
+ "href": {
596
+ "type": "string",
597
+ "since": "2.0"
598
+ }
599
+ },
600
+ "shape": "envelope",
601
+ "members": {
602
+ "label": {
603
+ "type": "string",
604
+ "since": "2.0",
605
+ "description": "Resolved required public collection name.",
606
+ "max": 60
607
+ },
608
+ "href": {
609
+ "type": "string",
610
+ "since": "2.0",
611
+ "description": "Platform-resolved destination; Documents may have none."
612
+ },
613
+ "items": {
614
+ "type": "array",
615
+ "since": "2.0",
616
+ "boundedBy": "cap",
617
+ "description": "Eligible bounded records for this render."
618
+ },
619
+ "pagination": {
620
+ "type": "object",
621
+ "nullable": true,
622
+ "since": "2.0",
623
+ "fields": {
624
+ "page": {
625
+ "type": "number",
626
+ "minimum": 0
627
+ },
628
+ "size": {
629
+ "type": "number",
630
+ "minimum": 1
631
+ },
632
+ "totalElements": {
633
+ "type": "number",
634
+ "minimum": 0
635
+ },
636
+ "totalPages": {
637
+ "type": "number",
638
+ "minimum": 0
639
+ },
640
+ "nextHref": {
641
+ "type": "string",
642
+ "nullable": true
643
+ },
644
+ "previousHref": {
645
+ "type": "string",
646
+ "nullable": true
647
+ }
648
+ }
649
+ }
650
+ }
651
+ },
652
+ "documents": {
653
+ "since": "2.0",
654
+ "cap": 24,
655
+ "moreHref": null,
656
+ "description": "Selected existing public documents only. No automatic media-library exposure and no independent directory route.",
657
+ "item": {
658
+ "id": {
659
+ "type": "string",
660
+ "since": "2.0"
661
+ },
662
+ "title": {
663
+ "type": "string",
664
+ "since": "2.0",
665
+ "max": 200
666
+ },
667
+ "folder": {
668
+ "type": "string",
669
+ "since": "2.0",
670
+ "nullable": true
671
+ },
672
+ "url": {
673
+ "type": "string",
674
+ "since": "2.0"
675
+ },
676
+ "contentType": {
677
+ "type": "string",
678
+ "since": "2.0",
679
+ "nullable": true
680
+ },
681
+ "bytes": {
682
+ "type": "number",
683
+ "since": "2.0",
684
+ "nullable": true
685
+ },
686
+ "publishedAt": {
687
+ "type": "string",
688
+ "since": "2.0",
689
+ "nullable": true
690
+ }
691
+ },
692
+ "shape": "envelope",
693
+ "members": {
694
+ "label": {
695
+ "type": "string",
696
+ "since": "2.0",
697
+ "description": "Resolved required public collection name.",
698
+ "max": 60
699
+ },
700
+ "href": {
701
+ "type": "string",
702
+ "since": "2.0",
703
+ "nullable": true,
704
+ "description": "Platform-resolved destination; Documents may have none."
705
+ },
706
+ "items": {
707
+ "type": "array",
708
+ "since": "2.0",
709
+ "boundedBy": "cap",
710
+ "description": "Eligible bounded records for this render."
711
+ },
712
+ "pagination": {
713
+ "type": "object",
714
+ "nullable": true,
715
+ "since": "2.0",
716
+ "fields": {
717
+ "page": {
718
+ "type": "number",
719
+ "minimum": 0
720
+ },
721
+ "size": {
722
+ "type": "number",
723
+ "minimum": 1
724
+ },
725
+ "totalElements": {
726
+ "type": "number",
727
+ "minimum": 0
728
+ },
729
+ "totalPages": {
730
+ "type": "number",
731
+ "minimum": 0
732
+ },
733
+ "nextHref": {
734
+ "type": "string",
735
+ "nullable": true
736
+ },
737
+ "previousHref": {
738
+ "type": "string",
739
+ "nullable": true
740
+ }
741
+ }
742
+ }
743
+ }
744
+ },
745
+ "schedules": {
746
+ "since": "2.0",
747
+ "cap": 4,
748
+ "moreHref": null,
749
+ "description": "TYPE-DERIVED recurring schedules. `type` is an OPEN enum; 'worship' is the first (its shape is the layout worship contract: times, labels, today, next). Other institutions arrive as new types; render the types you know, ignore the rest.",
750
+ "item": {
751
+ "type": {
752
+ "type": "string",
753
+ "since": "1.0",
754
+ "enumOpen": [
755
+ "worship"
756
+ ]
757
+ },
758
+ "content": {
759
+ "type": "object",
760
+ "since": "1.0"
761
+ }
762
+ },
763
+ "shape": "array"
764
+ }
765
+ }
766
+ }