@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
|
@@ -94,7 +94,8 @@
|
|
|
94
94
|
"url_encode",
|
|
95
95
|
"where",
|
|
96
96
|
"t",
|
|
97
|
-
"local_date"
|
|
97
|
+
"local_date",
|
|
98
|
+
"colour_roles"
|
|
98
99
|
],
|
|
99
100
|
"excluded": {
|
|
100
101
|
"tags": [
|
|
@@ -332,6 +333,223 @@
|
|
|
332
333
|
"description": "True when the sections mark which node shows which field with data-p60-field, so the editor can put the caret on the page instead of in a side panel. The address is inside that section's own content: data-p60-field=\"title\", or data-p60-field=\"items.{{ forloop.index0 }}.label\" for an entry in a list. Purely additive: the attribute is markup, the contract is untouched, and a template that marks nothing keeps the section-level editor. The validator reads the marks from the source and warns on any that does not name a field of that section. Missing or false leaves this exact template version editing in the panel.",
|
|
333
334
|
"$comment": "Follows the navigationHighlights pattern: declared honesty, proven by the validator."
|
|
334
335
|
},
|
|
336
|
+
"sectionFields": {
|
|
337
|
+
"type": "object",
|
|
338
|
+
"additionalProperties": false,
|
|
339
|
+
"properties": {
|
|
340
|
+
"hero": {
|
|
341
|
+
"type": "array",
|
|
342
|
+
"minItems": 2,
|
|
343
|
+
"maxItems": 3,
|
|
344
|
+
"uniqueItems": true,
|
|
345
|
+
"items": {
|
|
346
|
+
"enum": [
|
|
347
|
+
"imageUrl",
|
|
348
|
+
"imageAlt",
|
|
349
|
+
"photoFraming"
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
"allOf": [
|
|
353
|
+
{
|
|
354
|
+
"contains": {
|
|
355
|
+
"const": "imageUrl"
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"contains": {
|
|
360
|
+
"const": "imageAlt"
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"description": "Per-section opt-in to optional authored fields in this exact template version. The initial capability is the About introduction photograph: hero must also occur in supports.sections, and imageUrl/imageAlt are declared together. Optional photoFraming adds fill/whole on that photo; absent/reset inherits the author's composition while explicit whole shows the uncropped natural ratio. A fixed-layout photograph can be supported without sectionLayout. Missing support keeps saved photo fields but omits them from rendering and offers no new image picker. Validation proves supplied source/alt, no-photo omission, bounded framing and section ownership."
|
|
367
|
+
},
|
|
368
|
+
"sectionPresentation": {
|
|
369
|
+
"type": "object",
|
|
370
|
+
"maxProperties": 16,
|
|
371
|
+
"propertyNames": {
|
|
372
|
+
"enum": [
|
|
373
|
+
"hero",
|
|
374
|
+
"values",
|
|
375
|
+
"cta",
|
|
376
|
+
"homeHero",
|
|
377
|
+
"impact",
|
|
378
|
+
"events",
|
|
379
|
+
"articles",
|
|
380
|
+
"campaigns",
|
|
381
|
+
"emergency",
|
|
382
|
+
"stats",
|
|
383
|
+
"appealGrid",
|
|
384
|
+
"services",
|
|
385
|
+
"documents",
|
|
386
|
+
"people",
|
|
387
|
+
"impactMap",
|
|
388
|
+
"courses"
|
|
389
|
+
]
|
|
390
|
+
},
|
|
391
|
+
"additionalProperties": {
|
|
392
|
+
"type": "object",
|
|
393
|
+
"additionalProperties": false,
|
|
394
|
+
"minProperties": 1,
|
|
395
|
+
"properties": {
|
|
396
|
+
"sectionLayout": {
|
|
397
|
+
"type": "object",
|
|
398
|
+
"additionalProperties": false,
|
|
399
|
+
"required": [
|
|
400
|
+
"options",
|
|
401
|
+
"default"
|
|
402
|
+
],
|
|
403
|
+
"properties": {
|
|
404
|
+
"options": {
|
|
405
|
+
"type": "array",
|
|
406
|
+
"minItems": 2,
|
|
407
|
+
"maxItems": 3,
|
|
408
|
+
"uniqueItems": true,
|
|
409
|
+
"items": {
|
|
410
|
+
"enum": [
|
|
411
|
+
"image-start",
|
|
412
|
+
"image-end",
|
|
413
|
+
"stacked"
|
|
414
|
+
]
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"default": {
|
|
418
|
+
"enum": [
|
|
419
|
+
"image-start",
|
|
420
|
+
"image-end",
|
|
421
|
+
"stacked"
|
|
422
|
+
]
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
"description": "Per-section author opt-in for an About introduction with optional authored imagery. Start/end follow site direction. Permanent data-p60-section-layout on the single natural root, with data-p60-layout-has-media only when the photo exists and explicit frame/media/content roles. Token CSS changes only bounded grid tracks and slot placement, never copy, DOM order, imagery, gutters, typography or platform islands. Default/reset keeps inherited styling. Every narrow-screen choice retains authored single-column stacking."
|
|
426
|
+
},
|
|
427
|
+
"colourTreatment": {
|
|
428
|
+
"type": "object",
|
|
429
|
+
"additionalProperties": false,
|
|
430
|
+
"required": [
|
|
431
|
+
"options",
|
|
432
|
+
"default"
|
|
433
|
+
],
|
|
434
|
+
"properties": {
|
|
435
|
+
"options": {
|
|
436
|
+
"type": "array",
|
|
437
|
+
"minItems": 2,
|
|
438
|
+
"maxItems": 3,
|
|
439
|
+
"uniqueItems": true,
|
|
440
|
+
"items": {
|
|
441
|
+
"enum": [
|
|
442
|
+
"standard",
|
|
443
|
+
"soft",
|
|
444
|
+
"contrast"
|
|
445
|
+
]
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"default": {
|
|
449
|
+
"enum": [
|
|
450
|
+
"standard",
|
|
451
|
+
"soft",
|
|
452
|
+
"contrast"
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
"description": "Coordinated section paint within the selected Look. Requires a permanent data-p60-colour-treatment on the single natural section root and bounded data-p60-colour-role descendants. Nondefault treatments coordinate root background/text and every marked role, including link/button hover and focus-visible. No shared palette rebinding, images, layout or platform islands. Home hero and impact maps are unsupported. Missing/reset preserves inherited styling."
|
|
457
|
+
},
|
|
458
|
+
"imageOverlay": {
|
|
459
|
+
"type": "object",
|
|
460
|
+
"additionalProperties": false,
|
|
461
|
+
"required": [
|
|
462
|
+
"options",
|
|
463
|
+
"default"
|
|
464
|
+
],
|
|
465
|
+
"properties": {
|
|
466
|
+
"options": {
|
|
467
|
+
"type": "array",
|
|
468
|
+
"minItems": 2,
|
|
469
|
+
"maxItems": 3,
|
|
470
|
+
"uniqueItems": true,
|
|
471
|
+
"items": {
|
|
472
|
+
"enum": [
|
|
473
|
+
"subtle",
|
|
474
|
+
"standard",
|
|
475
|
+
"strong"
|
|
476
|
+
]
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
"default": {
|
|
480
|
+
"enum": [
|
|
481
|
+
"subtle",
|
|
482
|
+
"standard",
|
|
483
|
+
"strong"
|
|
484
|
+
]
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
"description": "Home hero only. Safe palette-derived decorative photo treatment choices, independently proven for static and carousel imagery, Fill and Whole. Preserve required text-readability scrims. Missing/reset preserves inherited treatment; no source editing, image opacity or geometry changes."
|
|
488
|
+
},
|
|
489
|
+
"sectionSpacing": {
|
|
490
|
+
"type": "object",
|
|
491
|
+
"additionalProperties": false,
|
|
492
|
+
"required": [
|
|
493
|
+
"options",
|
|
494
|
+
"default"
|
|
495
|
+
],
|
|
496
|
+
"properties": {
|
|
497
|
+
"options": {
|
|
498
|
+
"type": "array",
|
|
499
|
+
"minItems": 2,
|
|
500
|
+
"maxItems": 3,
|
|
501
|
+
"uniqueItems": true,
|
|
502
|
+
"items": {
|
|
503
|
+
"enum": [
|
|
504
|
+
"compact",
|
|
505
|
+
"standard",
|
|
506
|
+
"spacious"
|
|
507
|
+
]
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"default": {
|
|
511
|
+
"enum": [
|
|
512
|
+
"compact",
|
|
513
|
+
"standard",
|
|
514
|
+
"spacious"
|
|
515
|
+
]
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
"headingScale": {
|
|
520
|
+
"type": "object",
|
|
521
|
+
"additionalProperties": false,
|
|
522
|
+
"required": [
|
|
523
|
+
"options",
|
|
524
|
+
"default"
|
|
525
|
+
],
|
|
526
|
+
"properties": {
|
|
527
|
+
"options": {
|
|
528
|
+
"type": "array",
|
|
529
|
+
"minItems": 2,
|
|
530
|
+
"maxItems": 3,
|
|
531
|
+
"uniqueItems": true,
|
|
532
|
+
"items": {
|
|
533
|
+
"enum": [
|
|
534
|
+
"compact",
|
|
535
|
+
"standard",
|
|
536
|
+
"large"
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"default": {
|
|
541
|
+
"enum": [
|
|
542
|
+
"compact",
|
|
543
|
+
"standard",
|
|
544
|
+
"large"
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
},
|
|
551
|
+
"description": "Exact-version opt-in to independent platform-owned section presentation controls. Every key must be in supports.sections and declare at least one known control. Each control's default must occur in its options and describe inherited responsive styling. Saved explicit choices are projected into section.presentation; absence inherits without writing defaults. headingScale requires a permanent data-p60-heading-scale hook on the actual heading and authored font-size CSS. sectionSpacing requires a permanent data-p60-section-spacing hook on the natural outer section root and authored block-axis padding CSS, even without a heading; never alter horizontal gutters, card gaps, heights or island internals. Missing declarations are unsupported. No arbitrary values, conditions or CSS selectors are accepted."
|
|
552
|
+
},
|
|
335
553
|
"sectionHeadingAlignment": {
|
|
336
554
|
"type": "object",
|
|
337
555
|
"maxProperties": 16,
|
|
@@ -578,9 +796,11 @@
|
|
|
578
796
|
"type": "string",
|
|
579
797
|
"enum": [
|
|
580
798
|
"typography",
|
|
581
|
-
"looks"
|
|
799
|
+
"looks",
|
|
800
|
+
"header",
|
|
801
|
+
"footer"
|
|
582
802
|
],
|
|
583
|
-
"description": "Where the admin surfaces this knob:
|
|
803
|
+
"description": "Where the admin surfaces this knob: typography, looks, or the shared header/footer inspector. Header and footer groups explicitly declare template-authored global chrome settings, not a new content source. Every option must have template-owned CSS or markup; omitted groups never imply support. Other ungrouped knobs render under Template options."
|
|
584
804
|
},
|
|
585
805
|
"weights": {
|
|
586
806
|
"type": "array",
|
|
@@ -2735,8 +2955,14 @@
|
|
|
2735
2955
|
"pages": [
|
|
2736
2956
|
"about"
|
|
2737
2957
|
],
|
|
2738
|
-
"description": "The page opener: a headline with an optional kicker
|
|
2958
|
+
"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.",
|
|
2739
2959
|
"fields": [
|
|
2960
|
+
{
|
|
2961
|
+
"name": "presentation",
|
|
2962
|
+
"kind": "presentation",
|
|
2963
|
+
"required": false,
|
|
2964
|
+
"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."
|
|
2965
|
+
},
|
|
2740
2966
|
{
|
|
2741
2967
|
"name": "headingAlignment",
|
|
2742
2968
|
"kind": "select",
|
|
@@ -2764,7 +2990,29 @@
|
|
|
2764
2990
|
"name": "bodyHtml",
|
|
2765
2991
|
"kind": "richtext",
|
|
2766
2992
|
"required": false,
|
|
2767
|
-
"description": "Sanitised HTML intro, render with the raw filter."
|
|
2993
|
+
"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."
|
|
2994
|
+
},
|
|
2995
|
+
{
|
|
2996
|
+
"name": "imageUrl",
|
|
2997
|
+
"kind": "image",
|
|
2998
|
+
"required": false,
|
|
2999
|
+
"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."
|
|
3000
|
+
},
|
|
3001
|
+
{
|
|
3002
|
+
"name": "imageAlt",
|
|
3003
|
+
"kind": "text",
|
|
3004
|
+
"required": false,
|
|
3005
|
+
"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."
|
|
3006
|
+
},
|
|
3007
|
+
{
|
|
3008
|
+
"name": "photoFraming",
|
|
3009
|
+
"kind": "select",
|
|
3010
|
+
"required": false,
|
|
3011
|
+
"options": [
|
|
3012
|
+
"fill",
|
|
3013
|
+
"whole"
|
|
3014
|
+
],
|
|
3015
|
+
"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."
|
|
2768
3016
|
}
|
|
2769
3017
|
],
|
|
2770
3018
|
"minimal": {
|
|
@@ -2784,6 +3032,12 @@
|
|
|
2784
3032
|
],
|
|
2785
3033
|
"description": "A set of principles shown as cards or a numbered list, per the template.",
|
|
2786
3034
|
"fields": [
|
|
3035
|
+
{
|
|
3036
|
+
"name": "presentation",
|
|
3037
|
+
"kind": "presentation",
|
|
3038
|
+
"required": false,
|
|
3039
|
+
"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."
|
|
3040
|
+
},
|
|
2787
3041
|
{
|
|
2788
3042
|
"name": "headingAlignment",
|
|
2789
3043
|
"kind": "select",
|
|
@@ -2870,6 +3124,12 @@
|
|
|
2870
3124
|
],
|
|
2871
3125
|
"description": "A closing band: heading, optional line, one button.",
|
|
2872
3126
|
"fields": [
|
|
3127
|
+
{
|
|
3128
|
+
"name": "presentation",
|
|
3129
|
+
"kind": "presentation",
|
|
3130
|
+
"required": false,
|
|
3131
|
+
"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."
|
|
3132
|
+
},
|
|
2873
3133
|
{
|
|
2874
3134
|
"name": "headingAlignment",
|
|
2875
3135
|
"kind": "select",
|
|
@@ -2926,6 +3186,12 @@
|
|
|
2926
3186
|
],
|
|
2927
3187
|
"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.",
|
|
2928
3188
|
"fields": [
|
|
3189
|
+
{
|
|
3190
|
+
"name": "presentation",
|
|
3191
|
+
"kind": "presentation",
|
|
3192
|
+
"required": false,
|
|
3193
|
+
"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."
|
|
3194
|
+
},
|
|
2929
3195
|
{
|
|
2930
3196
|
"name": "headingAlignment",
|
|
2931
3197
|
"kind": "select",
|
|
@@ -3067,6 +3333,12 @@
|
|
|
3067
3333
|
],
|
|
3068
3334
|
"description": "What gifts make possible, optional intro plus icon/title/description cards. Claims must be truthful for the tenant.",
|
|
3069
3335
|
"fields": [
|
|
3336
|
+
{
|
|
3337
|
+
"name": "presentation",
|
|
3338
|
+
"kind": "presentation",
|
|
3339
|
+
"required": false,
|
|
3340
|
+
"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."
|
|
3341
|
+
},
|
|
3070
3342
|
{
|
|
3071
3343
|
"name": "headingAlignment",
|
|
3072
3344
|
"kind": "select",
|
|
@@ -3167,6 +3439,12 @@
|
|
|
3167
3439
|
"kind": "widget",
|
|
3168
3440
|
"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.",
|
|
3169
3441
|
"fields": [
|
|
3442
|
+
{
|
|
3443
|
+
"name": "presentation",
|
|
3444
|
+
"kind": "presentation",
|
|
3445
|
+
"required": false,
|
|
3446
|
+
"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."
|
|
3447
|
+
},
|
|
3170
3448
|
{
|
|
3171
3449
|
"name": "showCollectionLink",
|
|
3172
3450
|
"kind": "boolean",
|
|
@@ -3222,6 +3500,12 @@
|
|
|
3222
3500
|
"kind": "widget",
|
|
3223
3501
|
"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.",
|
|
3224
3502
|
"fields": [
|
|
3503
|
+
{
|
|
3504
|
+
"name": "presentation",
|
|
3505
|
+
"kind": "presentation",
|
|
3506
|
+
"required": false,
|
|
3507
|
+
"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."
|
|
3508
|
+
},
|
|
3225
3509
|
{
|
|
3226
3510
|
"name": "showCollectionLink",
|
|
3227
3511
|
"kind": "boolean",
|
|
@@ -3280,6 +3564,12 @@
|
|
|
3280
3564
|
"campaignsLabel"
|
|
3281
3565
|
],
|
|
3282
3566
|
"fields": [
|
|
3567
|
+
{
|
|
3568
|
+
"name": "presentation",
|
|
3569
|
+
"kind": "presentation",
|
|
3570
|
+
"required": false,
|
|
3571
|
+
"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."
|
|
3572
|
+
},
|
|
3283
3573
|
{
|
|
3284
3574
|
"name": "showCollectionLink",
|
|
3285
3575
|
"kind": "boolean",
|
|
@@ -3334,6 +3624,12 @@
|
|
|
3334
3624
|
"causes"
|
|
3335
3625
|
],
|
|
3336
3626
|
"fields": [
|
|
3627
|
+
{
|
|
3628
|
+
"name": "presentation",
|
|
3629
|
+
"kind": "presentation",
|
|
3630
|
+
"required": false,
|
|
3631
|
+
"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."
|
|
3632
|
+
},
|
|
3337
3633
|
{
|
|
3338
3634
|
"name": "headingAlignment",
|
|
3339
3635
|
"kind": "select",
|
|
@@ -3388,6 +3684,12 @@
|
|
|
3388
3684
|
],
|
|
3389
3685
|
"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`).",
|
|
3390
3686
|
"fields": [
|
|
3687
|
+
{
|
|
3688
|
+
"name": "presentation",
|
|
3689
|
+
"kind": "presentation",
|
|
3690
|
+
"required": false,
|
|
3691
|
+
"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."
|
|
3692
|
+
},
|
|
3391
3693
|
{
|
|
3392
3694
|
"name": "headingAlignment",
|
|
3393
3695
|
"kind": "select",
|
|
@@ -3482,6 +3784,12 @@
|
|
|
3482
3784
|
"causes"
|
|
3483
3785
|
],
|
|
3484
3786
|
"fields": [
|
|
3787
|
+
{
|
|
3788
|
+
"name": "presentation",
|
|
3789
|
+
"kind": "presentation",
|
|
3790
|
+
"required": false,
|
|
3791
|
+
"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."
|
|
3792
|
+
},
|
|
3485
3793
|
{
|
|
3486
3794
|
"name": "showCollectionLink",
|
|
3487
3795
|
"kind": "boolean",
|
|
@@ -3588,6 +3896,12 @@
|
|
|
3588
3896
|
"services"
|
|
3589
3897
|
],
|
|
3590
3898
|
"fields": [
|
|
3899
|
+
{
|
|
3900
|
+
"name": "presentation",
|
|
3901
|
+
"kind": "presentation",
|
|
3902
|
+
"required": false,
|
|
3903
|
+
"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."
|
|
3904
|
+
},
|
|
3591
3905
|
{
|
|
3592
3906
|
"name": "showCollectionLink",
|
|
3593
3907
|
"kind": "boolean",
|
|
@@ -3642,6 +3956,12 @@
|
|
|
3642
3956
|
"resources"
|
|
3643
3957
|
],
|
|
3644
3958
|
"fields": [
|
|
3959
|
+
{
|
|
3960
|
+
"name": "presentation",
|
|
3961
|
+
"kind": "presentation",
|
|
3962
|
+
"required": false,
|
|
3963
|
+
"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."
|
|
3964
|
+
},
|
|
3645
3965
|
{
|
|
3646
3966
|
"name": "showCollectionLink",
|
|
3647
3967
|
"kind": "boolean",
|
|
@@ -3693,6 +4013,12 @@
|
|
|
3693
4013
|
],
|
|
3694
4014
|
"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.",
|
|
3695
4015
|
"fields": [
|
|
4016
|
+
{
|
|
4017
|
+
"name": "presentation",
|
|
4018
|
+
"kind": "presentation",
|
|
4019
|
+
"required": false,
|
|
4020
|
+
"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."
|
|
4021
|
+
},
|
|
3696
4022
|
{
|
|
3697
4023
|
"name": "headingAlignment",
|
|
3698
4024
|
"kind": "select",
|
|
@@ -3796,6 +4122,12 @@
|
|
|
3796
4122
|
"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).",
|
|
3797
4123
|
"context": [],
|
|
3798
4124
|
"fields": [
|
|
4125
|
+
{
|
|
4126
|
+
"name": "presentation",
|
|
4127
|
+
"kind": "presentation",
|
|
4128
|
+
"required": false,
|
|
4129
|
+
"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."
|
|
4130
|
+
},
|
|
3799
4131
|
{
|
|
3800
4132
|
"name": "headingAlignment",
|
|
3801
4133
|
"kind": "select",
|
|
@@ -3829,14 +4161,15 @@
|
|
|
3829
4161
|
"name": "mapSlug",
|
|
3830
4162
|
"kind": "text",
|
|
3831
4163
|
"required": false,
|
|
3832
|
-
"description": "WHICH map renders here, by its address (the Pages editor's placement picker writes it; the Maps area
|
|
4164
|
+
"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."
|
|
3833
4165
|
}
|
|
3834
4166
|
],
|
|
3835
4167
|
"minimal": {},
|
|
3836
4168
|
"sample": {
|
|
3837
4169
|
"eyebrow": "Where we work",
|
|
3838
4170
|
"heading": "Our impact, on the map",
|
|
3839
|
-
"text": "Every marker is a real place: a programme, an appeal, a story. Click one to see what happens there."
|
|
4171
|
+
"text": "Every marker is a real place: a programme, an appeal, a story. Click one to see what happens there.",
|
|
4172
|
+
"mapSlug": "our-work"
|
|
3840
4173
|
}
|
|
3841
4174
|
},
|
|
3842
4175
|
{
|
|
@@ -3846,6 +4179,12 @@
|
|
|
3846
4179
|
"home"
|
|
3847
4180
|
],
|
|
3848
4181
|
"fields": [
|
|
4182
|
+
{
|
|
4183
|
+
"name": "presentation",
|
|
4184
|
+
"kind": "presentation",
|
|
4185
|
+
"required": false,
|
|
4186
|
+
"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."
|
|
4187
|
+
},
|
|
3849
4188
|
{
|
|
3850
4189
|
"name": "showCollectionLink",
|
|
3851
4190
|
"kind": "boolean",
|
|
@@ -5568,7 +5907,7 @@
|
|
|
5568
5907
|
"name": "hero_carousel",
|
|
5569
5908
|
"label": "Hero image carousel",
|
|
5570
5909
|
"status": "available",
|
|
5571
|
-
"description": "
|
|
5910
|
+
"description": "Photo-only rotation for homeHero.images (2+): advances every ~6s, pauses on hover and offers persistent Pause/Resume. Keyboard navigation or focus outside that button stops rotation until explicitly resumed. Reduced motion prevents autoplay, including after a live preference change. Supports horizontal touch swipe and direction-aware arrow keys, Home/End, plus optional dot navigation. Templates may hide dots when the .hero-playback control exists. They may reveal playback on photograph hover and keyboard focus, but must retain keyboard reachability, a visible focus indicator and a control that is available without hover on touch devices. This is separate from campaign/content carousels. The platform owns motion; the template styles the frame and the empty .hero-slide-scrim tonal layer using its palette. Fewer than 2 images render nothing: the template owns single/no-image states.",
|
|
5572
5911
|
"params": [],
|
|
5573
5912
|
"stylingApi": [
|
|
5574
5913
|
".hero-carousel",
|
|
@@ -5579,7 +5918,8 @@
|
|
|
5579
5918
|
".hero-slide-scrim",
|
|
5580
5919
|
".hero-dots",
|
|
5581
5920
|
".hero-dot",
|
|
5582
|
-
".hero-dot--active"
|
|
5921
|
+
".hero-dot--active",
|
|
5922
|
+
".hero-playback"
|
|
5583
5923
|
]
|
|
5584
5924
|
},
|
|
5585
5925
|
{
|
|
@@ -7256,6 +7596,219 @@
|
|
|
7256
7596
|
]
|
|
7257
7597
|
}
|
|
7258
7598
|
]
|
|
7599
|
+
},
|
|
7600
|
+
"presentation": {
|
|
7601
|
+
"version": 1,
|
|
7602
|
+
"description": "Platform-owned presentation meanings. Templates declare supported choices; saved values remain tenant-owned. An absent override inherits the exact artifact's authored default. Hidden or unsupported values remain stored but are not projected into template rendering.",
|
|
7603
|
+
"sectionTypes": [
|
|
7604
|
+
"hero",
|
|
7605
|
+
"values",
|
|
7606
|
+
"cta",
|
|
7607
|
+
"homeHero",
|
|
7608
|
+
"impact",
|
|
7609
|
+
"events",
|
|
7610
|
+
"articles",
|
|
7611
|
+
"campaigns",
|
|
7612
|
+
"emergency",
|
|
7613
|
+
"stats",
|
|
7614
|
+
"appealGrid",
|
|
7615
|
+
"services",
|
|
7616
|
+
"documents",
|
|
7617
|
+
"people",
|
|
7618
|
+
"impactMap",
|
|
7619
|
+
"courses"
|
|
7620
|
+
],
|
|
7621
|
+
"legacySectionAliases": {
|
|
7622
|
+
"programmes": "services",
|
|
7623
|
+
"resources": "documents",
|
|
7624
|
+
"whatsOn": "events"
|
|
7625
|
+
},
|
|
7626
|
+
"controls": {
|
|
7627
|
+
"sectionLayout": {
|
|
7628
|
+
"label": "Section layout",
|
|
7629
|
+
"kind": "choice",
|
|
7630
|
+
"scope": "section",
|
|
7631
|
+
"sectionTypes": [
|
|
7632
|
+
"hero"
|
|
7633
|
+
],
|
|
7634
|
+
"contentFields": {
|
|
7635
|
+
"imageUrl": "image",
|
|
7636
|
+
"imageAlt": "text"
|
|
7637
|
+
},
|
|
7638
|
+
"address": [
|
|
7639
|
+
"presentation",
|
|
7640
|
+
"sectionLayout"
|
|
7641
|
+
],
|
|
7642
|
+
"options": [
|
|
7643
|
+
"image-start",
|
|
7644
|
+
"image-end",
|
|
7645
|
+
"stacked"
|
|
7646
|
+
],
|
|
7647
|
+
"labels": {
|
|
7648
|
+
"image-start": "Image at start",
|
|
7649
|
+
"image-end": "Image at end",
|
|
7650
|
+
"stacked": "Image above"
|
|
7651
|
+
},
|
|
7652
|
+
"minimumOptions": 2,
|
|
7653
|
+
"reset": "remove",
|
|
7654
|
+
"target": "section-layout",
|
|
7655
|
+
"responsive": "author-defined",
|
|
7656
|
+
"attribute": "data-p60-section-layout",
|
|
7657
|
+
"description": "Author-owned image/text layout for an explicitly supported About introduction. Start/end follow the site direction. Mark the single natural outer root and existing frame/media/content slots; token CSS changes only bounded grid tracks and slot placement when a photograph exists. Missing/reset preserves authored styling. Preserve copy, imagery, reading order, links, gutters and narrow-screen stacking; never invent absent media, add arbitrary containers or target platform islands. Every exact section declaration is independent; missing support is unsupported."
|
|
7658
|
+
},
|
|
7659
|
+
"colourTreatment": {
|
|
7660
|
+
"label": "Colour treatment",
|
|
7661
|
+
"kind": "choice",
|
|
7662
|
+
"scope": "section",
|
|
7663
|
+
"sectionTypes": [
|
|
7664
|
+
"hero",
|
|
7665
|
+
"values",
|
|
7666
|
+
"cta",
|
|
7667
|
+
"impact",
|
|
7668
|
+
"events",
|
|
7669
|
+
"articles",
|
|
7670
|
+
"campaigns",
|
|
7671
|
+
"emergency",
|
|
7672
|
+
"stats",
|
|
7673
|
+
"appealGrid",
|
|
7674
|
+
"services",
|
|
7675
|
+
"documents",
|
|
7676
|
+
"people",
|
|
7677
|
+
"courses"
|
|
7678
|
+
],
|
|
7679
|
+
"address": [
|
|
7680
|
+
"presentation",
|
|
7681
|
+
"colourTreatment"
|
|
7682
|
+
],
|
|
7683
|
+
"options": [
|
|
7684
|
+
"standard",
|
|
7685
|
+
"soft",
|
|
7686
|
+
"contrast"
|
|
7687
|
+
],
|
|
7688
|
+
"labels": {
|
|
7689
|
+
"standard": "Standard",
|
|
7690
|
+
"soft": "Soft",
|
|
7691
|
+
"contrast": "Contrast"
|
|
7692
|
+
},
|
|
7693
|
+
"minimumOptions": 2,
|
|
7694
|
+
"reset": "remove",
|
|
7695
|
+
"target": "section-colour-treatment",
|
|
7696
|
+
"responsive": "author-defined",
|
|
7697
|
+
"attribute": "data-p60-colour-treatment",
|
|
7698
|
+
"description": "Coordinated author-owned section surface, copy, links and buttons within the selected Look. Missing/reset retains the original treatment. Mark the natural outer root and explicitly owned colour roles; token CSS changes paint only, never shared palette variables, imagery, layout or island internals. Home hero, impact maps and sections containing platform islands are not supported in this slice."
|
|
7699
|
+
},
|
|
7700
|
+
"headingScale": {
|
|
7701
|
+
"label": "Heading size",
|
|
7702
|
+
"kind": "choice",
|
|
7703
|
+
"scope": "section",
|
|
7704
|
+
"address": [
|
|
7705
|
+
"presentation",
|
|
7706
|
+
"headingScale"
|
|
7707
|
+
],
|
|
7708
|
+
"options": [
|
|
7709
|
+
"compact",
|
|
7710
|
+
"standard",
|
|
7711
|
+
"large"
|
|
7712
|
+
],
|
|
7713
|
+
"labels": {
|
|
7714
|
+
"compact": "Compact",
|
|
7715
|
+
"standard": "Standard",
|
|
7716
|
+
"large": "Large"
|
|
7717
|
+
},
|
|
7718
|
+
"minimumOptions": 2,
|
|
7719
|
+
"reset": "remove",
|
|
7720
|
+
"target": "section-heading",
|
|
7721
|
+
"responsive": "author-defined",
|
|
7722
|
+
"attribute": "data-p60-heading-scale",
|
|
7723
|
+
"description": "Changes only the actual section heading's responsive font size, never its heading level, eyebrow, body, cards, buttons or islands. Templates provide each size in their own CSS. The declared default describes inherited styling; it is not written into tenant content."
|
|
7724
|
+
},
|
|
7725
|
+
"sectionSpacing": {
|
|
7726
|
+
"label": "Section spacing",
|
|
7727
|
+
"kind": "choice",
|
|
7728
|
+
"scope": "section",
|
|
7729
|
+
"address": [
|
|
7730
|
+
"presentation",
|
|
7731
|
+
"sectionSpacing"
|
|
7732
|
+
],
|
|
7733
|
+
"options": [
|
|
7734
|
+
"compact",
|
|
7735
|
+
"standard",
|
|
7736
|
+
"spacious"
|
|
7737
|
+
],
|
|
7738
|
+
"labels": {
|
|
7739
|
+
"compact": "Compact",
|
|
7740
|
+
"standard": "Standard",
|
|
7741
|
+
"spacious": "Spacious"
|
|
7742
|
+
},
|
|
7743
|
+
"minimumOptions": 2,
|
|
7744
|
+
"reset": "remove",
|
|
7745
|
+
"target": "section-root",
|
|
7746
|
+
"responsive": "author-defined",
|
|
7747
|
+
"attribute": "data-p60-section-spacing",
|
|
7748
|
+
"description": "Changes only the natural outer section root's block-axis padding, never horizontal gutters, card gaps, heights or island internals. Templates provide each spacing in their own CSS. The declared default describes inherited styling; it is not written into tenant content. Keep the permanent hook even when the heading is hidden."
|
|
7749
|
+
},
|
|
7750
|
+
"imageOverlay": {
|
|
7751
|
+
"label": "Photo overlay",
|
|
7752
|
+
"kind": "choice",
|
|
7753
|
+
"scope": "section",
|
|
7754
|
+
"sectionTypes": [
|
|
7755
|
+
"homeHero"
|
|
7756
|
+
],
|
|
7757
|
+
"requiresSupport": "heroImagery",
|
|
7758
|
+
"address": [
|
|
7759
|
+
"presentation",
|
|
7760
|
+
"imageOverlay"
|
|
7761
|
+
],
|
|
7762
|
+
"options": [
|
|
7763
|
+
"subtle",
|
|
7764
|
+
"standard",
|
|
7765
|
+
"strong"
|
|
7766
|
+
],
|
|
7767
|
+
"labels": {
|
|
7768
|
+
"subtle": "Subtle",
|
|
7769
|
+
"standard": "Standard",
|
|
7770
|
+
"strong": "Strong"
|
|
7771
|
+
},
|
|
7772
|
+
"minimumOptions": 2,
|
|
7773
|
+
"reset": "remove",
|
|
7774
|
+
"target": "section-image-treatment",
|
|
7775
|
+
"responsive": "author-defined",
|
|
7776
|
+
"attribute": "data-p60-image-overlay",
|
|
7777
|
+
"description": "Changes only authored palette-derived decorative photo treatments in Home hero, never image opacity, source media, geometry, copy, widgets or a required readability scrim. Each exact artifact declares its safe choices and inherited default. Mark the existing photo wrapper with data-p60-image-overlay-media and empty decorative layers with data-p60-image-overlay-layer; token CSS may target those layers, marked wrapper pseudo-elements or the documented hero-slide-scrim. Missing and reset values preserve the authored treatment."
|
|
7778
|
+
},
|
|
7779
|
+
"headingAlignment": {
|
|
7780
|
+
"label": "Desktop heading alignment",
|
|
7781
|
+
"kind": "choice",
|
|
7782
|
+
"scope": "section",
|
|
7783
|
+
"address": [
|
|
7784
|
+
"headingAlignment"
|
|
7785
|
+
],
|
|
7786
|
+
"options": [
|
|
7787
|
+
"start",
|
|
7788
|
+
"center",
|
|
7789
|
+
"end"
|
|
7790
|
+
],
|
|
7791
|
+
"minimumOptions": 1,
|
|
7792
|
+
"reset": "remove",
|
|
7793
|
+
"target": "section-heading-and-eyebrow",
|
|
7794
|
+
"responsive": "desktop-1024",
|
|
7795
|
+
"attribute": "data-p60-heading-align",
|
|
7796
|
+
"declaration": "sectionHeadingAlignment"
|
|
7797
|
+
},
|
|
7798
|
+
"showCollectionLink": {
|
|
7799
|
+
"label": "Show collection link",
|
|
7800
|
+
"kind": "toggle",
|
|
7801
|
+
"scope": "section",
|
|
7802
|
+
"address": [
|
|
7803
|
+
"showCollectionLink"
|
|
7804
|
+
],
|
|
7805
|
+
"reset": "remove",
|
|
7806
|
+
"target": "collection-link",
|
|
7807
|
+
"responsive": "all",
|
|
7808
|
+
"attribute": "data-p60-collection-link",
|
|
7809
|
+
"declaration": "sectionCollectionLinkVisibility"
|
|
7810
|
+
}
|
|
7811
|
+
}
|
|
7259
7812
|
}
|
|
7260
7813
|
}
|
|
7261
7814
|
}
|