@port60/template-kit 1.2.0 → 1.3.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.
- package/README.md +46 -1
- package/package.json +1 -1
- package/src/commands/create.mjs +11 -0
- package/src/lib/agentsMd.mjs +176 -0
- package/src/vendor/contract/v2/dialect.json +2 -1
- package/src/vendor/contract/v2/islands.json +3 -2
- package/src/vendor/contract/v2/manifest.schema.json +73 -2
- package/src/vendor/contract/v2/presentation.json +107 -0
- package/src/vendor/contract/v2/sections.json +120 -4
- package/src/vendor/contract/v2.lock.json +562 -9
- package/src/vendor/engine/budgets.mjs +0 -6
- package/src/vendor/engine/colour-roles.mjs +68 -0
- package/src/vendor/engine/content-footprint.mjs +0 -11
- package/src/vendor/engine/design-settings.mjs +34 -0
- package/src/vendor/engine/dialect.mjs +3 -10
- package/src/vendor/engine/locale.mjs +0 -5
- package/src/vendor/engine/majors.mjs +0 -5
- package/src/vendor/engine/presentation-capabilities.mjs +0 -2
- package/src/vendor/engine/section-fields.mjs +64 -0
- package/src/vendor/engine/section-heading-alignment.mjs +0 -2
- package/src/vendor/engine/section-presentation.mjs +127 -0
- package/src/vendor/validator/behaviors-runtime.js +1 -1
- package/src/vendor/validator/collection-link-visibility.mjs +0 -1
- package/src/vendor/validator/colour-treatment.mjs +154 -0
- package/src/vendor/validator/fixture-art.mjs +0 -15
- package/src/vendor/validator/focus.mjs +0 -5
- package/src/vendor/validator/fonts.mjs +0 -6
- package/src/vendor/validator/heading-alignment.mjs +0 -3
- package/src/vendor/validator/icons.mjs +0 -4
- package/src/vendor/validator/image-overlay.mjs +141 -0
- package/src/vendor/validator/intro-photo-framing.mjs +101 -0
- package/src/vendor/validator/model-reference-v2.mjs +0 -4
- package/src/vendor/validator/model-reference.mjs +0 -4
- package/src/vendor/validator/navigation-highlights.mjs +0 -3
- package/src/vendor/validator/platform-base.css +23 -0
- package/src/vendor/validator/presentation-proof.mjs +0 -2
- package/src/vendor/validator/preview-v1.mjs +3 -103
- package/src/vendor/validator/preview-v2.mjs +12 -105
- package/src/vendor/validator/section-fields.mjs +41 -0
- package/src/vendor/validator/section-layout.mjs +156 -0
- package/src/vendor/validator/section-presentation.mjs +225 -0
- package/src/vendor/validator/site-context-v2.mjs +17 -2
- package/src/vendor/validator/site-context.mjs +0 -14
- package/src/vendor/validator/validate-v1.mjs +4 -98
- package/src/vendor/validator/validate-v2.mjs +44 -103
- package/src/vendor/validator/validate.mjs +0 -2
- package/starter/assets/theme.css +55 -0
- package/starter/manifest.json +20 -0
- package/starter/sections/cta.liquid +2 -2
- package/starter/sections/hero.liquid +5 -3
- package/starter/sections/homeHero.liquid +6 -6
- package/starter/sections/values.liquid +2 -2
|
@@ -7,8 +7,14 @@
|
|
|
7
7
|
"pages": [
|
|
8
8
|
"about"
|
|
9
9
|
],
|
|
10
|
-
"description": "The page opener: a headline with an optional kicker
|
|
10
|
+
"description": "The page opener: a headline with an optional kicker, sanitised rich-text intro and one optional author-supported photograph. Photograph support is explicit per section of the exact template; layout choices are a separate capability.",
|
|
11
11
|
"fields": [
|
|
12
|
+
{
|
|
13
|
+
"name": "presentation",
|
|
14
|
+
"kind": "presentation",
|
|
15
|
+
"required": false,
|
|
16
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
17
|
+
},
|
|
12
18
|
{
|
|
13
19
|
"name": "headingAlignment",
|
|
14
20
|
"kind": "select",
|
|
@@ -36,7 +42,26 @@
|
|
|
36
42
|
"name": "bodyHtml",
|
|
37
43
|
"kind": "richtext",
|
|
38
44
|
"required": false,
|
|
39
|
-
"description": "Sanitised HTML intro, render with the raw filter."
|
|
45
|
+
"description": "Sanitised HTML intro, render with the raw filter. A colour-capable introduction renders bodyHtml | colour_roles | raw so semantic descendants receive bounded paint roles without changing content."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "imageUrl",
|
|
49
|
+
"kind": "image",
|
|
50
|
+
"required": false,
|
|
51
|
+
"description": "Optional introduction photograph. Requires supports.sectionFields.hero to declare imageUrl and imageAlt together. Missing or blank renders no photograph, placeholder or empty media column. Fixed-layout photo support is independent of sectionLayout. Use the supplied safe URL on the actual image, never in inline CSS; unsupported stored values remain saved but do not render."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "imageAlt",
|
|
55
|
+
"kind": "text",
|
|
56
|
+
"required": false,
|
|
57
|
+
"description": "Plain-text alternative for this introduction photograph, escaped into its alt attribute. Missing or blank means an empty alternative; never invent a description or render it as visible copy. Paired with imageUrl in supports.sectionFields.hero."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "photoFraming",
|
|
61
|
+
"kind": "select",
|
|
62
|
+
"required": false,
|
|
63
|
+
"options": ["fill", "whole"],
|
|
64
|
+
"description": "Optional exact-section photograph framing, declared as a third supports.sectionFields.hero member beside imageUrl/imageAlt. Absent/reset inherits the template's authored image composition, which may crop. Explicit whole shows the full photograph at its natural ratio, width 100% and height auto without a blanket height cap. Fill deliberately crops into an author-bounded aspect ratio. Keep data-p60-photo-framing on the actual img, empty when inherited. Token CSS may change only object-fit and bounded aspect-ratio on that image, never its source, width, grid, copy or neighbours. Home hero semantics are unchanged. Unsupported saved choices remain stored but are not projected."
|
|
40
65
|
}
|
|
41
66
|
],
|
|
42
67
|
"minimal": {
|
|
@@ -56,6 +81,12 @@
|
|
|
56
81
|
],
|
|
57
82
|
"description": "A set of principles shown as cards or a numbered list, per the template.",
|
|
58
83
|
"fields": [
|
|
84
|
+
{
|
|
85
|
+
"name": "presentation",
|
|
86
|
+
"kind": "presentation",
|
|
87
|
+
"required": false,
|
|
88
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
89
|
+
},
|
|
59
90
|
{
|
|
60
91
|
"name": "headingAlignment",
|
|
61
92
|
"kind": "select",
|
|
@@ -142,6 +173,12 @@
|
|
|
142
173
|
],
|
|
143
174
|
"description": "A closing band: heading, optional line, one button.",
|
|
144
175
|
"fields": [
|
|
176
|
+
{
|
|
177
|
+
"name": "presentation",
|
|
178
|
+
"kind": "presentation",
|
|
179
|
+
"required": false,
|
|
180
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
181
|
+
},
|
|
145
182
|
{
|
|
146
183
|
"name": "headingAlignment",
|
|
147
184
|
"kind": "select",
|
|
@@ -198,6 +235,12 @@
|
|
|
198
235
|
],
|
|
199
236
|
"description": "The home opener. EVERY field optional: eyebrow/title derive from branding when absent, the lead OMITS when absent (never a fabricated placeholder), buttons fall back to platform defaults.",
|
|
200
237
|
"fields": [
|
|
238
|
+
{
|
|
239
|
+
"name": "presentation",
|
|
240
|
+
"kind": "presentation",
|
|
241
|
+
"required": false,
|
|
242
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
243
|
+
},
|
|
201
244
|
{
|
|
202
245
|
"name": "headingAlignment",
|
|
203
246
|
"kind": "select",
|
|
@@ -339,6 +382,12 @@
|
|
|
339
382
|
],
|
|
340
383
|
"description": "What gifts make possible, optional intro plus icon/title/description cards. Claims must be truthful for the tenant.",
|
|
341
384
|
"fields": [
|
|
385
|
+
{
|
|
386
|
+
"name": "presentation",
|
|
387
|
+
"kind": "presentation",
|
|
388
|
+
"required": false,
|
|
389
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
390
|
+
},
|
|
342
391
|
{
|
|
343
392
|
"name": "headingAlignment",
|
|
344
393
|
"kind": "select",
|
|
@@ -439,6 +488,12 @@
|
|
|
439
488
|
"kind": "widget",
|
|
440
489
|
"description": "Published events across registration modes. Render the supplied bounded site.content.events.items with this placement's authored introduction. Optional motion uses declared behaviours; ticket sales and RSVP stay on the platform-owned detail route supplied by each item.",
|
|
441
490
|
"fields": [
|
|
491
|
+
{
|
|
492
|
+
"name": "presentation",
|
|
493
|
+
"kind": "presentation",
|
|
494
|
+
"required": false,
|
|
495
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
496
|
+
},
|
|
442
497
|
{
|
|
443
498
|
"name": "showCollectionLink",
|
|
444
499
|
"kind": "boolean",
|
|
@@ -494,6 +549,12 @@
|
|
|
494
549
|
"kind": "widget",
|
|
495
550
|
"description": "Published articles from the supplied bounded site.content.articles.items. Render the records with this placement's authored introduction and link through the supplied item URLs. Article engagement and comments remain platform islands on the detail page.",
|
|
496
551
|
"fields": [
|
|
552
|
+
{
|
|
553
|
+
"name": "presentation",
|
|
554
|
+
"kind": "presentation",
|
|
555
|
+
"required": false,
|
|
556
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
557
|
+
},
|
|
497
558
|
{
|
|
498
559
|
"name": "showCollectionLink",
|
|
499
560
|
"kind": "boolean",
|
|
@@ -552,6 +613,12 @@
|
|
|
552
613
|
"campaignsLabel"
|
|
553
614
|
],
|
|
554
615
|
"fields": [
|
|
616
|
+
{
|
|
617
|
+
"name": "presentation",
|
|
618
|
+
"kind": "presentation",
|
|
619
|
+
"required": false,
|
|
620
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
621
|
+
},
|
|
555
622
|
{
|
|
556
623
|
"name": "showCollectionLink",
|
|
557
624
|
"kind": "boolean",
|
|
@@ -606,6 +673,12 @@
|
|
|
606
673
|
"causes"
|
|
607
674
|
],
|
|
608
675
|
"fields": [
|
|
676
|
+
{
|
|
677
|
+
"name": "presentation",
|
|
678
|
+
"kind": "presentation",
|
|
679
|
+
"required": false,
|
|
680
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
681
|
+
},
|
|
609
682
|
{
|
|
610
683
|
"name": "headingAlignment",
|
|
611
684
|
"kind": "select",
|
|
@@ -660,6 +733,12 @@
|
|
|
660
733
|
],
|
|
661
734
|
"description": "Big headline numbers, the at-a-glance impact band. Values are author-entered text (write them exactly as they should read), or, per item, a live figure the platform counts (`source`).",
|
|
662
735
|
"fields": [
|
|
736
|
+
{
|
|
737
|
+
"name": "presentation",
|
|
738
|
+
"kind": "presentation",
|
|
739
|
+
"required": false,
|
|
740
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
741
|
+
},
|
|
663
742
|
{
|
|
664
743
|
"name": "headingAlignment",
|
|
665
744
|
"kind": "select",
|
|
@@ -754,6 +833,12 @@
|
|
|
754
833
|
"causes"
|
|
755
834
|
],
|
|
756
835
|
"fields": [
|
|
836
|
+
{
|
|
837
|
+
"name": "presentation",
|
|
838
|
+
"kind": "presentation",
|
|
839
|
+
"required": false,
|
|
840
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
841
|
+
},
|
|
757
842
|
{
|
|
758
843
|
"name": "showCollectionLink",
|
|
759
844
|
"kind": "boolean",
|
|
@@ -860,6 +945,12 @@
|
|
|
860
945
|
"services"
|
|
861
946
|
],
|
|
862
947
|
"fields": [
|
|
948
|
+
{
|
|
949
|
+
"name": "presentation",
|
|
950
|
+
"kind": "presentation",
|
|
951
|
+
"required": false,
|
|
952
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
953
|
+
},
|
|
863
954
|
{
|
|
864
955
|
"name": "showCollectionLink",
|
|
865
956
|
"kind": "boolean",
|
|
@@ -914,6 +1005,12 @@
|
|
|
914
1005
|
"resources"
|
|
915
1006
|
],
|
|
916
1007
|
"fields": [
|
|
1008
|
+
{
|
|
1009
|
+
"name": "presentation",
|
|
1010
|
+
"kind": "presentation",
|
|
1011
|
+
"required": false,
|
|
1012
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
1013
|
+
},
|
|
917
1014
|
{
|
|
918
1015
|
"name": "showCollectionLink",
|
|
919
1016
|
"kind": "boolean",
|
|
@@ -965,6 +1062,12 @@
|
|
|
965
1062
|
],
|
|
966
1063
|
"description": "The key people behind the charity, trustees, staff, volunteers, as simple cards: name, position, an optional photograph (uploaded through the platform pipeline) and an optional one-line statement. Templates render a card grid that collapses to a single column on small screens; a card without a photo renders cleanly (initials or plain), never a placeholder face.",
|
|
967
1064
|
"fields": [
|
|
1065
|
+
{
|
|
1066
|
+
"name": "presentation",
|
|
1067
|
+
"kind": "presentation",
|
|
1068
|
+
"required": false,
|
|
1069
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
1070
|
+
},
|
|
968
1071
|
{
|
|
969
1072
|
"name": "headingAlignment",
|
|
970
1073
|
"kind": "select",
|
|
@@ -1068,6 +1171,12 @@
|
|
|
1068
1171
|
"description": "The organisation's impact map: a themed map whose points link existing content (campaigns, causes, articles, events, places), each opening a card derived from the linked thing. Place the `map` island, it brings the map, the points and the cards; your template brings placement and tokens (the island theming contract).",
|
|
1069
1172
|
"context": [],
|
|
1070
1173
|
"fields": [
|
|
1174
|
+
{
|
|
1175
|
+
"name": "presentation",
|
|
1176
|
+
"kind": "presentation",
|
|
1177
|
+
"required": false,
|
|
1178
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
1179
|
+
},
|
|
1071
1180
|
{
|
|
1072
1181
|
"name": "headingAlignment",
|
|
1073
1182
|
"kind": "select",
|
|
@@ -1101,14 +1210,15 @@
|
|
|
1101
1210
|
"name": "mapSlug",
|
|
1102
1211
|
"kind": "text",
|
|
1103
1212
|
"required": false,
|
|
1104
|
-
"description": "WHICH map renders here, by its address (the Pages editor's placement picker writes it; the Maps area
|
|
1213
|
+
"description": "WHICH published map renders here, by its address (the Pages editor's placement picker writes it; the Maps area owns its title, description and points). An absent or blank selection renders no map. A missing or ineligible selected map never falls back to another record."
|
|
1105
1214
|
}
|
|
1106
1215
|
],
|
|
1107
1216
|
"minimal": {},
|
|
1108
1217
|
"sample": {
|
|
1109
1218
|
"eyebrow": "Where we work",
|
|
1110
1219
|
"heading": "Our impact, on the map",
|
|
1111
|
-
"text": "Every marker is a real place: a programme, an appeal, a story. Click one to see what happens there."
|
|
1220
|
+
"text": "Every marker is a real place: a programme, an appeal, a story. Click one to see what happens there.",
|
|
1221
|
+
"mapSlug": "our-work"
|
|
1112
1222
|
}
|
|
1113
1223
|
},
|
|
1114
1224
|
{
|
|
@@ -1118,6 +1228,12 @@
|
|
|
1118
1228
|
"home"
|
|
1119
1229
|
],
|
|
1120
1230
|
"fields": [
|
|
1231
|
+
{
|
|
1232
|
+
"name": "presentation",
|
|
1233
|
+
"kind": "presentation",
|
|
1234
|
+
"required": false,
|
|
1235
|
+
"description": "Typed placement preferences from presentation.json. Only controls declared by the exact template version affect rendering. An absent key inherits; unsupported stored preferences remain untouched. headingScale changes only this section heading, not its eyebrow, cards or body. sectionSpacing independently changes only the natural outer section root's block-axis padding, never horizontal gutters, gaps, heights or island internals."
|
|
1236
|
+
},
|
|
1121
1237
|
{
|
|
1122
1238
|
"name": "showCollectionLink",
|
|
1123
1239
|
"kind": "boolean",
|