@getvitops/generator 0.9.0 → 2.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.
- package/CHANGELOG.md +1031 -0
- package/README.md +24 -5
- package/assets/bricks/elements/icon.php +102 -0
- package/assets/bricks/elements/split.php +8 -5
- package/assets/bricks/load.php +137 -1
- package/assets/css/animation.css +147 -36
- package/assets/css/global.css +19 -3
- package/assets/css/index.css +8 -0
- package/assets/css/layout-utilities.css +764 -0
- package/assets/css/layout.css +50 -584
- package/assets/css/patterns/carousel.css +3 -3
- package/assets/css/patterns/code.css +2 -2
- package/assets/css/patterns/combobox.css +3 -3
- package/assets/css/patterns/comment.css +1 -1
- package/assets/css/patterns/consent.css +117 -0
- package/assets/css/patterns/copy.css +3 -3
- package/assets/css/patterns/details.css +1 -1
- package/assets/css/patterns/dialog.css +2 -2
- package/assets/css/patterns/drawer.css +2 -2
- package/assets/css/patterns/forms.css +11 -11
- package/assets/css/patterns/grouped.css +1 -1
- package/assets/css/patterns/icon.css +2 -2
- package/assets/css/patterns/list.css +5 -5
- package/assets/css/patterns/media.css +1 -1
- package/assets/css/patterns/nav.css +5 -5
- package/assets/css/patterns/notification.css +3 -3
- package/assets/css/patterns/reveal.css +92 -0
- package/assets/css/patterns/scroll-based.css +1 -1
- package/assets/css/patterns/scroll-target.css +3 -3
- package/assets/css/patterns/sitenav.css +14 -14
- package/assets/css/patterns/split-link.css +4 -4
- package/assets/css/patterns/subgrid.css +7 -2
- package/assets/css/patterns/tag.css +1 -1
- package/assets/css/patterns/text-effects.css +1 -1
- package/assets/css/patterns/theme-editor.css +43 -6
- package/assets/css/patterns/tooltip.css +2 -2
- package/assets/css/patterns/tree.css +3 -3
- package/assets/css/utilities.css +19 -98
- package/assets/js/consent.js +1 -0
- package/assets/js/deferred.js +1 -1
- package/assets/js/editor.js +2 -2
- package/dist/index.d.mts +1218 -376
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +4384 -1784
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -3
- package/schema.json +54 -12
- package/site.schema.json +648 -458
package/site.schema.json
CHANGED
|
@@ -796,85 +796,157 @@
|
|
|
796
796
|
},
|
|
797
797
|
"designSystem": {
|
|
798
798
|
"type": "object",
|
|
799
|
-
"
|
|
800
|
-
"
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
"type": "object",
|
|
804
|
-
"properties": {
|
|
805
|
-
"$schema": {
|
|
806
|
-
"description": "URL of the published JSON Schema (stamped by `vitops init`) so editors provide autocomplete + validation.",
|
|
799
|
+
"properties": {
|
|
800
|
+
"themes": {
|
|
801
|
+
"type": "object",
|
|
802
|
+
"propertyNames": {
|
|
807
803
|
"type": "string"
|
|
808
804
|
},
|
|
809
|
-
"
|
|
805
|
+
"additionalProperties": {
|
|
810
806
|
"type": "object",
|
|
811
807
|
"properties": {
|
|
812
|
-
"
|
|
808
|
+
"$schema": {
|
|
809
|
+
"description": "URL of the published JSON Schema (stamped by `vitops init`) so editors provide autocomplete + validation.",
|
|
810
|
+
"type": "string"
|
|
811
|
+
},
|
|
812
|
+
"meta": {
|
|
813
|
+
"description": "Brand identity for agent-facing output. Consumed only by the `design` format (`DESIGN.md`); it emits no CSS and no tokens.",
|
|
813
814
|
"type": "object",
|
|
814
|
-
"
|
|
815
|
-
"
|
|
815
|
+
"properties": {
|
|
816
|
+
"name": {
|
|
817
|
+
"description": "Brand/system name. Used as the `name` field and `<h1>` of the `design` format's `DESIGN.md`. Defaults to \"Design System\".",
|
|
818
|
+
"type": "string"
|
|
819
|
+
},
|
|
820
|
+
"description": {
|
|
821
|
+
"description": "One or two sentences on the brand personality and the feeling the UI should evoke — what an agent needs when no token answers the question. Becomes the DESIGN.md `description` field and opens its Overview section; if omitted, a generic description of the system's mechanics is used instead.",
|
|
822
|
+
"type": "string"
|
|
823
|
+
}
|
|
816
824
|
},
|
|
817
|
-
"additionalProperties":
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
"anchors": {
|
|
827
|
-
"type": "object",
|
|
828
|
-
"propertyNames": {
|
|
829
|
-
"type": "string"
|
|
830
|
-
},
|
|
831
|
-
"additionalProperties": {
|
|
832
|
-
"type": "string"
|
|
833
|
-
},
|
|
834
|
-
"description": "Step → colour overrides (hex or oklch()) that pin specific steps of the generated scale; the remaining steps interpolate around them."
|
|
835
|
-
}
|
|
836
|
-
},
|
|
837
|
-
"required": [
|
|
838
|
-
"seed"
|
|
839
|
-
],
|
|
840
|
-
"additionalProperties": false,
|
|
841
|
-
"description": "Seeded hue: the 11-step scale is GENERATED in OKLCH from `seed` (anchors pin specific steps)."
|
|
825
|
+
"additionalProperties": false
|
|
826
|
+
},
|
|
827
|
+
"colors": {
|
|
828
|
+
"type": "object",
|
|
829
|
+
"properties": {
|
|
830
|
+
"palette": {
|
|
831
|
+
"type": "object",
|
|
832
|
+
"propertyNames": {
|
|
833
|
+
"type": "string"
|
|
842
834
|
},
|
|
843
|
-
{
|
|
844
|
-
"
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
"
|
|
848
|
-
{
|
|
849
|
-
"type": "
|
|
850
|
-
"
|
|
851
|
-
"type": "string"
|
|
852
|
-
}
|
|
835
|
+
"additionalProperties": {
|
|
836
|
+
"anyOf": [
|
|
837
|
+
{
|
|
838
|
+
"type": "object",
|
|
839
|
+
"properties": {
|
|
840
|
+
"seed": {
|
|
841
|
+
"type": "string",
|
|
842
|
+
"description": "Seed colour (hex or oklch()). An 11-step numeric scale (50…950, tinted near-white → tinted near-black) is generated in OKLCH from it; the seed is preserved at its natural step."
|
|
853
843
|
},
|
|
854
|
-
{
|
|
844
|
+
"anchors": {
|
|
855
845
|
"type": "object",
|
|
856
846
|
"propertyNames": {
|
|
857
847
|
"type": "string"
|
|
858
848
|
},
|
|
859
849
|
"additionalProperties": {
|
|
860
850
|
"type": "string"
|
|
861
|
-
}
|
|
851
|
+
},
|
|
852
|
+
"description": "Step → colour overrides (hex or oklch()) pinned VERBATIM at those steps. Every other step takes its lightness from the shared ladder, with chroma and hue interpolated between the anchors — so an anchor is reproduced exactly and is the only step allowed off the ladder. An explicit anchor overrides the seed at that step; two anchors that resolve to the same step are an error."
|
|
862
853
|
}
|
|
854
|
+
},
|
|
855
|
+
"required": [
|
|
856
|
+
"seed"
|
|
863
857
|
],
|
|
864
|
-
"
|
|
858
|
+
"additionalProperties": false,
|
|
859
|
+
"description": "Seeded hue: the 11-step scale is GENERATED in OKLCH from `seed` (anchors pin specific steps)."
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"type": "object",
|
|
863
|
+
"properties": {
|
|
864
|
+
"tones": {
|
|
865
|
+
"anyOf": [
|
|
866
|
+
{
|
|
867
|
+
"type": "array",
|
|
868
|
+
"items": {
|
|
869
|
+
"type": "string"
|
|
870
|
+
}
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
"type": "object",
|
|
874
|
+
"propertyNames": {
|
|
875
|
+
"type": "string"
|
|
876
|
+
},
|
|
877
|
+
"additionalProperties": {
|
|
878
|
+
"type": "string"
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
],
|
|
882
|
+
"description": "Fixed brand kit: authored tones placed verbatim at their nearest steps plus tinted off-white/off-black endpoints; no interpolation. Either an ordered light → dark array or a step → colour map."
|
|
883
|
+
}
|
|
884
|
+
},
|
|
885
|
+
"required": [
|
|
886
|
+
"tones"
|
|
887
|
+
],
|
|
888
|
+
"additionalProperties": false,
|
|
889
|
+
"description": "Fixed hue: authored brand tones used verbatim; no generation."
|
|
865
890
|
}
|
|
866
|
-
},
|
|
867
|
-
"required": [
|
|
868
|
-
"tones"
|
|
869
891
|
],
|
|
870
|
-
"
|
|
871
|
-
"description": "Fixed hue: authored brand tones used verbatim; no generation."
|
|
892
|
+
"description": "A palette hue, authored one of two ways: `{ seed, anchors? }` generates an 11-step numeric OKLCH scale (50…950) from the seed, or `{ tones }` supplies a fixed brand kit used verbatim."
|
|
872
893
|
}
|
|
873
|
-
|
|
874
|
-
"
|
|
875
|
-
|
|
894
|
+
},
|
|
895
|
+
"roles": {
|
|
896
|
+
"type": "object",
|
|
897
|
+
"propertyNames": {
|
|
898
|
+
"type": "string"
|
|
899
|
+
},
|
|
900
|
+
"additionalProperties": {
|
|
901
|
+
"anyOf": [
|
|
902
|
+
{
|
|
903
|
+
"type": "string",
|
|
904
|
+
"description": "A palette hue name. Shorthand for `{ hue, kind: \"chromatic\" }`."
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
"type": "object",
|
|
908
|
+
"properties": {
|
|
909
|
+
"hue": {
|
|
910
|
+
"type": "string",
|
|
911
|
+
"description": "The palette hue this role resolves to."
|
|
912
|
+
},
|
|
913
|
+
"kind": {
|
|
914
|
+
"type": "string",
|
|
915
|
+
"enum": [
|
|
916
|
+
"surface",
|
|
917
|
+
"chromatic"
|
|
918
|
+
],
|
|
919
|
+
"description": "`surface` — a page/panel colour: gets a bare `bg-<role>` plus the full emphasis range and text scale. `chromatic` (default) — a signal colour: tints and solids only, no bare `bg-<role>`."
|
|
920
|
+
}
|
|
921
|
+
},
|
|
922
|
+
"required": [
|
|
923
|
+
"hue"
|
|
924
|
+
],
|
|
925
|
+
"additionalProperties": false
|
|
926
|
+
}
|
|
927
|
+
]
|
|
928
|
+
}
|
|
929
|
+
},
|
|
930
|
+
"utilities": {
|
|
931
|
+
"type": "array",
|
|
932
|
+
"items": {
|
|
933
|
+
"type": "string",
|
|
934
|
+
"enum": [
|
|
935
|
+
"bg",
|
|
936
|
+
"text",
|
|
937
|
+
"icon",
|
|
938
|
+
"border",
|
|
939
|
+
"outline",
|
|
940
|
+
"fill",
|
|
941
|
+
"stroke"
|
|
942
|
+
]
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
},
|
|
946
|
+
"additionalProperties": false
|
|
876
947
|
},
|
|
877
|
-
"
|
|
948
|
+
"shadows": {
|
|
949
|
+
"description": "Named shadows → `--shadow-<name>` tokens and `.drop-shadow-<name>` utilities. Values are shadow parameter lists (offset/blur/colour). Each token feeds two consumers with different grammars — `box-shadow` (pattern geometry, via the `--ds-*` group aliases) and `filter: drop-shadow(…)` (the utilities and the `shadow:` state shortcut) — so values must stay in the intersection: **one layer, no spread radius, no `inset`**. `drop-shadow()` rejects all three, and rejecting them invalidates the whole filter, so the shadow vanishes rather than degrading.",
|
|
878
950
|
"type": "object",
|
|
879
951
|
"propertyNames": {
|
|
880
952
|
"type": "string"
|
|
@@ -883,257 +955,170 @@
|
|
|
883
955
|
"type": "string"
|
|
884
956
|
}
|
|
885
957
|
},
|
|
886
|
-
"
|
|
887
|
-
"
|
|
888
|
-
"
|
|
889
|
-
|
|
890
|
-
"
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
"border",
|
|
894
|
-
"outline",
|
|
895
|
-
"fill",
|
|
896
|
-
"stroke"
|
|
897
|
-
]
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
},
|
|
901
|
-
"additionalProperties": false
|
|
902
|
-
},
|
|
903
|
-
"shadows": {
|
|
904
|
-
"description": "Named shadows → `--shadow-<name>` tokens and `.drop-shadow-<name>` utilities. Values are shadow parameter lists (offset/blur/colour), applied via `filter: drop-shadow(…)`.",
|
|
905
|
-
"type": "object",
|
|
906
|
-
"propertyNames": {
|
|
907
|
-
"type": "string"
|
|
908
|
-
},
|
|
909
|
-
"additionalProperties": {
|
|
910
|
-
"type": "string"
|
|
911
|
-
}
|
|
912
|
-
},
|
|
913
|
-
"fonts": {
|
|
914
|
-
"description": "Raw font stacks by name, emitted as `--font-<name>` tokens (referenced by `typography.families`).",
|
|
915
|
-
"type": "object",
|
|
916
|
-
"propertyNames": {
|
|
917
|
-
"type": "string"
|
|
918
|
-
},
|
|
919
|
-
"additionalProperties": {
|
|
920
|
-
"type": "string"
|
|
921
|
-
}
|
|
922
|
-
},
|
|
923
|
-
"typeScale": {
|
|
924
|
-
"description": "Fluid modular TYPE scale → `--text-<name>` tokens, consumed by typography roles and text-size utilities.",
|
|
925
|
-
"type": "object",
|
|
926
|
-
"properties": {
|
|
927
|
-
"base": {
|
|
928
|
-
"type": "string",
|
|
929
|
-
"description": "Anchor size (a CSS length, e.g. \"1rem\") — the value at `baseStep`."
|
|
930
|
-
},
|
|
931
|
-
"ratio": {
|
|
932
|
-
"type": "number",
|
|
933
|
-
"description": "Modular ratio between adjacent steps at large viewports."
|
|
934
|
-
},
|
|
935
|
-
"steps": {
|
|
936
|
-
"description": "Token count when `names` is absent (steps are then named 1..steps).",
|
|
937
|
-
"type": "number"
|
|
938
|
-
},
|
|
939
|
-
"names": {
|
|
940
|
-
"description": "Step names, smallest → largest (e.g. [\"xs\",\"sm\",\"md\",…]); each becomes a token suffix.",
|
|
941
|
-
"type": "array",
|
|
942
|
-
"items": {
|
|
958
|
+
"fonts": {
|
|
959
|
+
"description": "Raw font stacks by name, emitted as `--font-<name>` tokens (referenced by `typography.families`). **Stacks only — vitops does not load webfonts.** A value here is a `font-family` list and nothing more: it emits no `@font-face`, no preload, and no metrics-matched fallback. If a family needs loading, declare it in Astro's `fonts:` config (`astro.config`, or the site config's `fonts` array) and point the token at the family's `cssVariable` — `\"display\": \"var(--font-league-spartan), sans-serif\"`. Installing a `@fontsource*` package and importing its CSS also works but gives up subsetting, preload and `size-adjust`/`ascent-override` fallbacks, so it regresses CLS.",
|
|
960
|
+
"type": "object",
|
|
961
|
+
"propertyNames": {
|
|
962
|
+
"type": "string"
|
|
963
|
+
},
|
|
964
|
+
"additionalProperties": {
|
|
943
965
|
"type": "string"
|
|
944
966
|
}
|
|
945
967
|
},
|
|
946
|
-
"
|
|
947
|
-
"description": "
|
|
948
|
-
"type": "number"
|
|
949
|
-
},
|
|
950
|
-
"baseline": {
|
|
951
|
-
"description": "Named step used as the fluid pivot / GUI scale centre (defaults to `baseStep`).",
|
|
952
|
-
"type": "string"
|
|
953
|
-
},
|
|
954
|
-
"fluid": {
|
|
955
|
-
"description": "Makes the scale fluid: each step compiles to a clamp() that interpolates from `minRatio` at `minVw` to `ratio` at `maxVw`.",
|
|
968
|
+
"typeScale": {
|
|
969
|
+
"description": "Fluid modular TYPE scale → `--text-<name>` tokens, consumed by typography roles and text-size utilities.",
|
|
956
970
|
"type": "object",
|
|
957
971
|
"properties": {
|
|
958
|
-
"
|
|
959
|
-
"type": "string",
|
|
960
|
-
"description": "Viewport width (CSS length) where fluid scaling bottoms out."
|
|
961
|
-
},
|
|
962
|
-
"maxVw": {
|
|
972
|
+
"base": {
|
|
963
973
|
"type": "string",
|
|
964
|
-
"description": "
|
|
974
|
+
"description": "Anchor size (a CSS length, e.g. \"1rem\") — the value at `baseStep`."
|
|
965
975
|
},
|
|
966
|
-
"
|
|
976
|
+
"ratio": {
|
|
967
977
|
"type": "number",
|
|
968
|
-
"description": "Modular ratio
|
|
978
|
+
"description": "Modular ratio between adjacent steps at large viewports."
|
|
979
|
+
},
|
|
980
|
+
"steps": {
|
|
981
|
+
"description": "Token count when `names` is absent (steps are then named 1..steps).",
|
|
982
|
+
"type": "number"
|
|
983
|
+
},
|
|
984
|
+
"names": {
|
|
985
|
+
"description": "Step names, smallest → largest (e.g. [\"xs\",\"sm\",\"md\",…]); each becomes a token suffix.",
|
|
986
|
+
"type": "array",
|
|
987
|
+
"items": {
|
|
988
|
+
"type": "string"
|
|
989
|
+
}
|
|
990
|
+
},
|
|
991
|
+
"baseStep": {
|
|
992
|
+
"description": "1-based index of the step whose value is `base`.",
|
|
993
|
+
"type": "number"
|
|
994
|
+
},
|
|
995
|
+
"baseline": {
|
|
996
|
+
"description": "Named step used as the fluid pivot / GUI scale centre (defaults to `baseStep`).",
|
|
997
|
+
"type": "string"
|
|
998
|
+
},
|
|
999
|
+
"fluid": {
|
|
1000
|
+
"description": "Makes the scale fluid: each step compiles to a clamp() that interpolates from `minRatio` at `minVw` to `ratio` at `maxVw`.",
|
|
1001
|
+
"type": "object",
|
|
1002
|
+
"properties": {
|
|
1003
|
+
"minVw": {
|
|
1004
|
+
"type": "string",
|
|
1005
|
+
"description": "Viewport width (CSS length) where fluid scaling bottoms out."
|
|
1006
|
+
},
|
|
1007
|
+
"maxVw": {
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"description": "Viewport width (CSS length) where fluid scaling tops out."
|
|
1010
|
+
},
|
|
1011
|
+
"minRatio": {
|
|
1012
|
+
"type": "number",
|
|
1013
|
+
"description": "Modular ratio at/below `minVw` (usually < `ratio`)."
|
|
1014
|
+
}
|
|
1015
|
+
},
|
|
1016
|
+
"required": [
|
|
1017
|
+
"minVw",
|
|
1018
|
+
"maxVw",
|
|
1019
|
+
"minRatio"
|
|
1020
|
+
],
|
|
1021
|
+
"additionalProperties": false
|
|
969
1022
|
}
|
|
970
1023
|
},
|
|
971
1024
|
"required": [
|
|
972
|
-
"
|
|
973
|
-
"
|
|
974
|
-
"minRatio"
|
|
1025
|
+
"base",
|
|
1026
|
+
"ratio"
|
|
975
1027
|
],
|
|
976
1028
|
"additionalProperties": false
|
|
977
|
-
}
|
|
978
|
-
},
|
|
979
|
-
"required": [
|
|
980
|
-
"base",
|
|
981
|
-
"ratio"
|
|
982
|
-
],
|
|
983
|
-
"additionalProperties": false
|
|
984
|
-
},
|
|
985
|
-
"spaceScale": {
|
|
986
|
-
"description": "Fluid modular SPACE scale → `--space-<name>` tokens, consumed by spacing/gap utilities and vertical rhythm.",
|
|
987
|
-
"type": "object",
|
|
988
|
-
"properties": {
|
|
989
|
-
"base": {
|
|
990
|
-
"type": "string",
|
|
991
|
-
"description": "Anchor size (a CSS length, e.g. \"1rem\") — the value at `baseStep`."
|
|
992
|
-
},
|
|
993
|
-
"ratio": {
|
|
994
|
-
"type": "number",
|
|
995
|
-
"description": "Modular ratio between adjacent steps at large viewports."
|
|
996
1029
|
},
|
|
997
|
-
"
|
|
998
|
-
"description": "
|
|
999
|
-
"type": "number"
|
|
1000
|
-
},
|
|
1001
|
-
"names": {
|
|
1002
|
-
"description": "Step names, smallest → largest (e.g. [\"xs\",\"sm\",\"md\",…]); each becomes a token suffix.",
|
|
1003
|
-
"type": "array",
|
|
1004
|
-
"items": {
|
|
1005
|
-
"type": "string"
|
|
1006
|
-
}
|
|
1007
|
-
},
|
|
1008
|
-
"baseStep": {
|
|
1009
|
-
"description": "1-based index of the step whose value is `base`.",
|
|
1010
|
-
"type": "number"
|
|
1011
|
-
},
|
|
1012
|
-
"baseline": {
|
|
1013
|
-
"description": "Named step used as the fluid pivot / GUI scale centre (defaults to `baseStep`).",
|
|
1014
|
-
"type": "string"
|
|
1015
|
-
},
|
|
1016
|
-
"fluid": {
|
|
1017
|
-
"description": "Makes the scale fluid: each step compiles to a clamp() that interpolates from `minRatio` at `minVw` to `ratio` at `maxVw`.",
|
|
1030
|
+
"spaceScale": {
|
|
1031
|
+
"description": "Fluid modular SPACE scale → `--space-<name>` tokens, consumed by spacing/gap utilities and vertical rhythm.",
|
|
1018
1032
|
"type": "object",
|
|
1019
1033
|
"properties": {
|
|
1020
|
-
"
|
|
1021
|
-
"type": "string",
|
|
1022
|
-
"description": "Viewport width (CSS length) where fluid scaling bottoms out."
|
|
1023
|
-
},
|
|
1024
|
-
"maxVw": {
|
|
1034
|
+
"base": {
|
|
1025
1035
|
"type": "string",
|
|
1026
|
-
"description": "
|
|
1036
|
+
"description": "Anchor size (a CSS length, e.g. \"1rem\") — the value at `baseStep`."
|
|
1027
1037
|
},
|
|
1028
|
-
"
|
|
1038
|
+
"ratio": {
|
|
1029
1039
|
"type": "number",
|
|
1030
|
-
"description": "Modular ratio
|
|
1040
|
+
"description": "Modular ratio between adjacent steps at large viewports."
|
|
1041
|
+
},
|
|
1042
|
+
"steps": {
|
|
1043
|
+
"description": "Token count when `names` is absent (steps are then named 1..steps).",
|
|
1044
|
+
"type": "number"
|
|
1045
|
+
},
|
|
1046
|
+
"names": {
|
|
1047
|
+
"description": "Step names, smallest → largest (e.g. [\"xs\",\"sm\",\"md\",…]); each becomes a token suffix.",
|
|
1048
|
+
"type": "array",
|
|
1049
|
+
"items": {
|
|
1050
|
+
"type": "string"
|
|
1051
|
+
}
|
|
1052
|
+
},
|
|
1053
|
+
"baseStep": {
|
|
1054
|
+
"description": "1-based index of the step whose value is `base`.",
|
|
1055
|
+
"type": "number"
|
|
1056
|
+
},
|
|
1057
|
+
"baseline": {
|
|
1058
|
+
"description": "Named step used as the fluid pivot / GUI scale centre (defaults to `baseStep`).",
|
|
1059
|
+
"type": "string"
|
|
1060
|
+
},
|
|
1061
|
+
"fluid": {
|
|
1062
|
+
"description": "Makes the scale fluid: each step compiles to a clamp() that interpolates from `minRatio` at `minVw` to `ratio` at `maxVw`.",
|
|
1063
|
+
"type": "object",
|
|
1064
|
+
"properties": {
|
|
1065
|
+
"minVw": {
|
|
1066
|
+
"type": "string",
|
|
1067
|
+
"description": "Viewport width (CSS length) where fluid scaling bottoms out."
|
|
1068
|
+
},
|
|
1069
|
+
"maxVw": {
|
|
1070
|
+
"type": "string",
|
|
1071
|
+
"description": "Viewport width (CSS length) where fluid scaling tops out."
|
|
1072
|
+
},
|
|
1073
|
+
"minRatio": {
|
|
1074
|
+
"type": "number",
|
|
1075
|
+
"description": "Modular ratio at/below `minVw` (usually < `ratio`)."
|
|
1076
|
+
}
|
|
1077
|
+
},
|
|
1078
|
+
"required": [
|
|
1079
|
+
"minVw",
|
|
1080
|
+
"maxVw",
|
|
1081
|
+
"minRatio"
|
|
1082
|
+
],
|
|
1083
|
+
"additionalProperties": false
|
|
1031
1084
|
}
|
|
1032
1085
|
},
|
|
1033
1086
|
"required": [
|
|
1034
|
-
"
|
|
1035
|
-
"
|
|
1036
|
-
"minRatio"
|
|
1087
|
+
"base",
|
|
1088
|
+
"ratio"
|
|
1037
1089
|
],
|
|
1038
1090
|
"additionalProperties": false
|
|
1039
|
-
}
|
|
1040
|
-
},
|
|
1041
|
-
"required": [
|
|
1042
|
-
"base",
|
|
1043
|
-
"ratio"
|
|
1044
|
-
],
|
|
1045
|
-
"additionalProperties": false
|
|
1046
|
-
},
|
|
1047
|
-
"patterns": {
|
|
1048
|
-
"type": "object",
|
|
1049
|
-
"properties": {
|
|
1050
|
-
"defaults": {
|
|
1051
|
-
"type": "object",
|
|
1052
|
-
"propertyNames": {
|
|
1053
|
-
"type": "string"
|
|
1054
|
-
},
|
|
1055
|
-
"additionalProperties": {
|
|
1056
|
-
"type": "string"
|
|
1057
|
-
},
|
|
1058
|
-
"description": "Cascade-wide fallback tokens, emitted as `--<prop>-default`."
|
|
1059
|
-
},
|
|
1060
|
-
"radii": {
|
|
1061
|
-
"type": "object",
|
|
1062
|
-
"propertyNames": {
|
|
1063
|
-
"type": "string"
|
|
1064
|
-
},
|
|
1065
|
-
"additionalProperties": {
|
|
1066
|
-
"type": "string"
|
|
1067
|
-
},
|
|
1068
|
-
"description": "Shape primitives, emitted as `--br-<name>` (referenced by pattern bases)."
|
|
1069
1091
|
},
|
|
1070
|
-
"
|
|
1071
|
-
"description": "Group-level tokens, emitted as `--<prop>-<group>`; patterns opt in via their `group` key.",
|
|
1092
|
+
"patterns": {
|
|
1072
1093
|
"type": "object",
|
|
1073
|
-
"
|
|
1074
|
-
"
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
"type": "object",
|
|
1078
|
-
"propertyNames": {
|
|
1079
|
-
"type": "string"
|
|
1080
|
-
},
|
|
1081
|
-
"additionalProperties": {
|
|
1082
|
-
"type": "string"
|
|
1083
|
-
},
|
|
1084
|
-
"description": "A CSS declaration block: property → value. Values stay strings (they can be hex, var(), clamp(), keywords, …); the generator, not the schema, interprets them."
|
|
1085
|
-
}
|
|
1086
|
-
},
|
|
1087
|
-
"z": {
|
|
1088
|
-
"description": "Z-index tiers → `--z-tier-<name>`.",
|
|
1089
|
-
"type": "object",
|
|
1090
|
-
"propertyNames": {
|
|
1091
|
-
"type": "string"
|
|
1092
|
-
},
|
|
1093
|
-
"additionalProperties": {
|
|
1094
|
-
"type": "number"
|
|
1095
|
-
}
|
|
1096
|
-
},
|
|
1097
|
-
"items": {
|
|
1098
|
-
"description": "The component patterns to emit, keyed by name.",
|
|
1099
|
-
"type": "object",
|
|
1100
|
-
"propertyNames": {
|
|
1101
|
-
"type": "string"
|
|
1102
|
-
},
|
|
1103
|
-
"additionalProperties": {
|
|
1104
|
-
"type": "object",
|
|
1105
|
-
"properties": {
|
|
1106
|
-
"group": {
|
|
1107
|
-
"description": "Token-cascade group this pattern belongs to (e.g. tag / control / panel); base declarations resolve through `--<prop>-<group>` before `--<prop>-default`.",
|
|
1094
|
+
"properties": {
|
|
1095
|
+
"defaults": {
|
|
1096
|
+
"type": "object",
|
|
1097
|
+
"propertyNames": {
|
|
1108
1098
|
"type": "string"
|
|
1109
1099
|
},
|
|
1110
|
-
"
|
|
1111
|
-
"type": "object",
|
|
1112
|
-
"propertyNames": {
|
|
1113
|
-
"type": "string"
|
|
1114
|
-
},
|
|
1115
|
-
"additionalProperties": {
|
|
1116
|
-
"type": "string"
|
|
1117
|
-
},
|
|
1118
|
-
"description": "Per-pattern token overrides, emitted as `--<prop>-<name>-group` values."
|
|
1119
|
-
},
|
|
1120
|
-
"element": {
|
|
1121
|
-
"description": "Style at element level via zero-specificity `:where(<element>)` (instead of, or alongside, a class).",
|
|
1100
|
+
"additionalProperties": {
|
|
1122
1101
|
"type": "string"
|
|
1123
1102
|
},
|
|
1124
|
-
"
|
|
1125
|
-
|
|
1103
|
+
"description": "Cascade-wide fallback tokens, emitted as `--<prop>-default`."
|
|
1104
|
+
},
|
|
1105
|
+
"radii": {
|
|
1106
|
+
"type": "object",
|
|
1107
|
+
"propertyNames": {
|
|
1126
1108
|
"type": "string"
|
|
1127
1109
|
},
|
|
1128
|
-
"
|
|
1129
|
-
"
|
|
1130
|
-
"type": "boolean"
|
|
1110
|
+
"additionalProperties": {
|
|
1111
|
+
"type": "string"
|
|
1131
1112
|
},
|
|
1132
|
-
"
|
|
1133
|
-
|
|
1113
|
+
"description": "Shape primitives, emitted as `--br-<name>` (referenced by pattern bases)."
|
|
1114
|
+
},
|
|
1115
|
+
"groups": {
|
|
1116
|
+
"description": "Group-level tokens, emitted as `--<prop>-<group>`; patterns opt in via their `group` key.",
|
|
1117
|
+
"type": "object",
|
|
1118
|
+
"propertyNames": {
|
|
1134
1119
|
"type": "string"
|
|
1135
1120
|
},
|
|
1136
|
-
"
|
|
1121
|
+
"additionalProperties": {
|
|
1137
1122
|
"type": "object",
|
|
1138
1123
|
"propertyNames": {
|
|
1139
1124
|
"type": "string"
|
|
@@ -1141,123 +1126,118 @@
|
|
|
1141
1126
|
"additionalProperties": {
|
|
1142
1127
|
"type": "string"
|
|
1143
1128
|
},
|
|
1144
|
-
"description": "
|
|
1145
|
-
},
|
|
1146
|
-
"states": {
|
|
1147
|
-
"description": "Interaction states (hover / active / focus-visible), each a map of shortcuts: `step` (intensify fills/text by n emphasis stops), `scale` (transform scale), `lift` (translateY + shadow), `shadow` (a shadow name → drop-shadow(var(--shadow-<name>)), or true → lift shadow), `ring` (focus ring), or raw `css` declarations. Hover rules are wrapped in `@media (hover: hover)`.",
|
|
1148
|
-
"type": "object",
|
|
1149
|
-
"propertyNames": {
|
|
1150
|
-
"type": "string"
|
|
1151
|
-
},
|
|
1152
|
-
"additionalProperties": {
|
|
1153
|
-
"type": "object",
|
|
1154
|
-
"propertyNames": {
|
|
1155
|
-
"type": "string"
|
|
1156
|
-
},
|
|
1157
|
-
"additionalProperties": {}
|
|
1158
|
-
}
|
|
1159
|
-
},
|
|
1160
|
-
"roles": {
|
|
1161
|
-
"description": "Semantic colour role variants to emit as `<pattern>-<role>` classes (fills use the role solid / on-solid tokens).",
|
|
1162
|
-
"type": "array",
|
|
1163
|
-
"items": {
|
|
1164
|
-
"type": "string"
|
|
1165
|
-
}
|
|
1129
|
+
"description": "A CSS declaration block: property → value. Values stay strings (they can be hex, var(), clamp(), keywords, …); the generator, not the schema, interprets them."
|
|
1166
1130
|
}
|
|
1167
1131
|
},
|
|
1168
|
-
"
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
"type": "object",
|
|
1178
|
-
"properties": {
|
|
1179
|
-
"families": {
|
|
1180
|
-
"description": "Role-facing family aliases → CSS font values, usually referencing the top-level `fonts` tokens (e.g. \"var(--font-display)\").",
|
|
1181
|
-
"type": "object",
|
|
1182
|
-
"propertyNames": {
|
|
1183
|
-
"type": "string"
|
|
1184
|
-
},
|
|
1185
|
-
"additionalProperties": {
|
|
1186
|
-
"type": "string"
|
|
1187
|
-
}
|
|
1188
|
-
},
|
|
1189
|
-
"roles": {
|
|
1190
|
-
"description": "Semantic type roles (display, title, heading, body, quote, caption, eyebrow, code, lead, footnote, tag, …), each emitted as a `font-<role>` class.",
|
|
1191
|
-
"type": "object",
|
|
1192
|
-
"propertyNames": {
|
|
1193
|
-
"type": "string"
|
|
1194
|
-
},
|
|
1195
|
-
"additionalProperties": {
|
|
1196
|
-
"type": "object",
|
|
1197
|
-
"propertyNames": {
|
|
1198
|
-
"type": "string"
|
|
1199
|
-
},
|
|
1200
|
-
"additionalProperties": {
|
|
1201
|
-
"anyOf": [
|
|
1202
|
-
{
|
|
1203
|
-
"type": "string"
|
|
1204
|
-
},
|
|
1205
|
-
{
|
|
1206
|
-
"type": "number"
|
|
1207
|
-
}
|
|
1208
|
-
]
|
|
1132
|
+
"z": {
|
|
1133
|
+
"description": "Z-index tiers → `--z-tier-<name>`.",
|
|
1134
|
+
"type": "object",
|
|
1135
|
+
"propertyNames": {
|
|
1136
|
+
"type": "string"
|
|
1137
|
+
},
|
|
1138
|
+
"additionalProperties": {
|
|
1139
|
+
"type": "number"
|
|
1140
|
+
}
|
|
1209
1141
|
},
|
|
1210
|
-
"
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
"type": "object",
|
|
1216
|
-
"propertyNames": {
|
|
1217
|
-
"type": "string"
|
|
1218
|
-
},
|
|
1219
|
-
"additionalProperties": {
|
|
1220
|
-
"type": "string"
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
},
|
|
1224
|
-
"additionalProperties": false,
|
|
1225
|
-
"description": "Typography: family aliases, semantic type roles (→ `font-<role>` classes), and the heading-element → role mapping."
|
|
1226
|
-
},
|
|
1227
|
-
"animations": {
|
|
1228
|
-
"type": "object",
|
|
1229
|
-
"properties": {
|
|
1230
|
-
"effects": {
|
|
1231
|
-
"description": "Effect classes to emit (`.fade-in`, `.reveal-left`, …), keyed by class name.",
|
|
1232
|
-
"type": "object",
|
|
1233
|
-
"propertyNames": {
|
|
1234
|
-
"type": "string"
|
|
1235
|
-
},
|
|
1236
|
-
"additionalProperties": {
|
|
1237
|
-
"type": "object",
|
|
1238
|
-
"properties": {
|
|
1239
|
-
"kf": {
|
|
1240
|
-
"type": "string",
|
|
1241
|
-
"description": "Keyframe family driving the effect: composite (transform/opacity), paint, or layout."
|
|
1142
|
+
"items": {
|
|
1143
|
+
"description": "The component patterns to emit, keyed by name.",
|
|
1144
|
+
"type": "object",
|
|
1145
|
+
"propertyNames": {
|
|
1146
|
+
"type": "string"
|
|
1242
1147
|
},
|
|
1243
|
-
"
|
|
1148
|
+
"additionalProperties": {
|
|
1244
1149
|
"type": "object",
|
|
1245
|
-
"
|
|
1246
|
-
"
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1150
|
+
"properties": {
|
|
1151
|
+
"group": {
|
|
1152
|
+
"description": "Token-cascade group this pattern belongs to (e.g. tag / control / panel); base declarations resolve through `--<prop>-<group>` before `--<prop>-default`.",
|
|
1153
|
+
"type": "string"
|
|
1154
|
+
},
|
|
1155
|
+
"overrides": {
|
|
1156
|
+
"type": "object",
|
|
1157
|
+
"propertyNames": {
|
|
1158
|
+
"type": "string"
|
|
1159
|
+
},
|
|
1160
|
+
"additionalProperties": {
|
|
1161
|
+
"type": "string"
|
|
1162
|
+
},
|
|
1163
|
+
"description": "Per-pattern token overrides, emitted as `--<prop>-<name>-group` values."
|
|
1164
|
+
},
|
|
1165
|
+
"element": {
|
|
1166
|
+
"description": "Style at element level via zero-specificity `:where(<element>)` (instead of, or alongside, a class).",
|
|
1167
|
+
"type": "string"
|
|
1168
|
+
},
|
|
1169
|
+
"class": {
|
|
1170
|
+
"description": "Class name to emit (defaults to the pattern's key when no `element` is set). Combined with `element`, the pattern emits one zero-specificity `:where(<element>, .<class>)` rule so the class works on any tag and any explicit class overrides it.",
|
|
1171
|
+
"type": "string"
|
|
1172
|
+
},
|
|
1173
|
+
"fill": {
|
|
1174
|
+
"description": "Whether this pattern is colour-filled (states/roles drive `background-color` + `on-solid` text) or text-coloured (they drive `color`). Defaults to true when `base` declares a background.",
|
|
1175
|
+
"type": "boolean"
|
|
1176
|
+
},
|
|
1177
|
+
"default_role": {
|
|
1178
|
+
"description": "Semantic colour role applied to the bare/default variant.",
|
|
1179
|
+
"type": "string"
|
|
1180
|
+
},
|
|
1181
|
+
"base": {
|
|
1182
|
+
"type": "object",
|
|
1183
|
+
"propertyNames": {
|
|
1251
1184
|
"type": "string"
|
|
1252
1185
|
},
|
|
1253
|
-
{
|
|
1254
|
-
"type": "
|
|
1186
|
+
"additionalProperties": {
|
|
1187
|
+
"type": "string"
|
|
1188
|
+
},
|
|
1189
|
+
"description": "Base CSS declarations. Geometry properties (padding, border-radius, border, box-shadow, font-size) are wrapped in per-pattern override hooks (`--p-<name>`, `--br-<name>`, `--b-<name>`, `--ds-<name>`, `--fs-<name>`) so consumers can restyle one pattern by setting one variable."
|
|
1190
|
+
},
|
|
1191
|
+
"states": {
|
|
1192
|
+
"description": "Interaction states (hover / active / focus-visible), each a map of shortcuts: `step` (intensify the fill or text by n rungs — `bg-<role>-solid` → `-solid-bold`, `text-<role>` → `-bold`), `scale` (transform scale), `lift` (translateY + shadow), `shadow` (a shadow name → drop-shadow(var(--shadow-<name>)), or true → lift shadow), `ring` (focus ring), or raw `css` declarations. Hover rules are wrapped in `@media (hover: hover)`.",
|
|
1193
|
+
"type": "object",
|
|
1194
|
+
"propertyNames": {
|
|
1195
|
+
"type": "string"
|
|
1196
|
+
},
|
|
1197
|
+
"additionalProperties": {
|
|
1198
|
+
"type": "object",
|
|
1199
|
+
"propertyNames": {
|
|
1200
|
+
"type": "string"
|
|
1201
|
+
},
|
|
1202
|
+
"additionalProperties": {}
|
|
1255
1203
|
}
|
|
1256
|
-
|
|
1204
|
+
},
|
|
1205
|
+
"roles": {
|
|
1206
|
+
"description": "Semantic colour role variants to emit as `<pattern>-<role>` classes (fills use the role solid / on-solid tokens).",
|
|
1207
|
+
"type": "array",
|
|
1208
|
+
"items": {
|
|
1209
|
+
"type": "string"
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1257
1212
|
},
|
|
1258
|
-
"
|
|
1213
|
+
"additionalProperties": false,
|
|
1214
|
+
"description": "One component pattern (button, link, badge, card, …): base declarations + interaction states + semantic role variants, resolved through the pattern token cascade."
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
},
|
|
1218
|
+
"additionalProperties": false,
|
|
1219
|
+
"description": "Component patterns and their token cascade: `defaults` → `groups` → per-pattern `overrides`, plus shape (`radii`) and z-index primitives."
|
|
1220
|
+
},
|
|
1221
|
+
"typography": {
|
|
1222
|
+
"type": "object",
|
|
1223
|
+
"properties": {
|
|
1224
|
+
"families": {
|
|
1225
|
+
"description": "Role-facing family aliases → CSS font values, usually referencing the top-level `fonts` tokens (e.g. \"var(--font-display)\").",
|
|
1226
|
+
"type": "object",
|
|
1227
|
+
"propertyNames": {
|
|
1228
|
+
"type": "string"
|
|
1229
|
+
},
|
|
1230
|
+
"additionalProperties": {
|
|
1231
|
+
"type": "string"
|
|
1232
|
+
}
|
|
1233
|
+
},
|
|
1234
|
+
"roles": {
|
|
1235
|
+
"description": "Semantic type roles (display, title, heading, body, quote, caption, eyebrow, code, lead, footnote, tag, …), each emitted as a `font-<role>` class.",
|
|
1236
|
+
"type": "object",
|
|
1237
|
+
"propertyNames": {
|
|
1238
|
+
"type": "string"
|
|
1259
1239
|
},
|
|
1260
|
-
"
|
|
1240
|
+
"additionalProperties": {
|
|
1261
1241
|
"type": "object",
|
|
1262
1242
|
"propertyNames": {
|
|
1263
1243
|
"type": "string"
|
|
@@ -1272,104 +1252,173 @@
|
|
|
1272
1252
|
}
|
|
1273
1253
|
]
|
|
1274
1254
|
},
|
|
1275
|
-
"description": "
|
|
1255
|
+
"description": "A bag of CSS-ish keys, each mapped to a declaration plus a `--<role>-<sfx>` override hook. The recognised set is **closed**: `family`, `size`, `weight`, `style`, `line-height`, `tracking` (→ `letter-spacing`), `text-transform`, `text-decoration`, `text-wrap`, `color`. Note the last four are spelled with their full CSS property names — `transform` and `decoration` are NOT accepted. Anything unrecognised is **ignored**, not passed through, so the generator warns rather than emitting it: a silently-dropped `transform: uppercase` is how title-case navigation reaches production. Note also that `style`, `text-transform`, `text-decoration` and `text-wrap` are emitted on **every** role at their identity value (`normal`/`none`/`none`/`wrap`) whether declared or not, so applying one role class over another fully resets it — which means **omitting `text-wrap` is not \"inherit\"**: it emits `text-wrap: wrap` and cancels the `pretty` the role would otherwise inherit from a `pretty` ancestor such as a `body`-mapped role. Declare it on every role — `balance` for heading-like roles, `pretty` for copy, `wrap` for short single-line labels."
|
|
1276
1256
|
}
|
|
1277
1257
|
},
|
|
1278
|
-
"
|
|
1279
|
-
"
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1258
|
+
"headings": {
|
|
1259
|
+
"description": "Maps bare elements to type roles so unclassed markup picks up role styling — `{ \"h1\": \"display\", \"h2\": \"heading\" }`. The key is used verbatim as a selector, so it is not limited to h1…h6: **map `\"body\"` to your prose role** to bind base page typography to the role rather than hand-writing it. That binding is what makes the role editable — a stylesheet that re-states `font-family`/`line-height` as literals on `body` shadows `--<role>-ff`/`--<role>-lh`, and the live theme editor then appears to do nothing.",
|
|
1260
|
+
"type": "object",
|
|
1261
|
+
"propertyNames": {
|
|
1262
|
+
"type": "string"
|
|
1263
|
+
},
|
|
1264
|
+
"additionalProperties": {
|
|
1265
|
+
"type": "string"
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
},
|
|
1269
|
+
"additionalProperties": false,
|
|
1270
|
+
"description": "Typography: family aliases, semantic type roles (→ `font-<role>` classes), and the bare-element → role mapping."
|
|
1284
1271
|
},
|
|
1285
|
-
"
|
|
1286
|
-
"description": "Multi-part journey classes composed from `base` building blocks.",
|
|
1272
|
+
"animations": {
|
|
1287
1273
|
"type": "object",
|
|
1288
1274
|
"properties": {
|
|
1289
|
-
"
|
|
1290
|
-
"description": "
|
|
1275
|
+
"effects": {
|
|
1276
|
+
"description": "Effect classes to emit (`.fade-in`, `.reveal-left`, …), keyed by class name.",
|
|
1291
1277
|
"type": "object",
|
|
1292
1278
|
"propertyNames": {
|
|
1293
1279
|
"type": "string"
|
|
1294
1280
|
},
|
|
1295
1281
|
"additionalProperties": {
|
|
1296
1282
|
"type": "object",
|
|
1297
|
-
"
|
|
1298
|
-
"
|
|
1283
|
+
"properties": {
|
|
1284
|
+
"kf": {
|
|
1285
|
+
"type": "string",
|
|
1286
|
+
"description": "Keyframe family driving the effect: composite (transform/opacity), paint, or layout."
|
|
1287
|
+
},
|
|
1288
|
+
"css": {
|
|
1289
|
+
"type": "object",
|
|
1290
|
+
"propertyNames": {
|
|
1291
|
+
"type": "string"
|
|
1292
|
+
},
|
|
1293
|
+
"additionalProperties": {
|
|
1294
|
+
"anyOf": [
|
|
1295
|
+
{
|
|
1296
|
+
"type": "string"
|
|
1297
|
+
},
|
|
1298
|
+
{
|
|
1299
|
+
"type": "number"
|
|
1300
|
+
}
|
|
1301
|
+
]
|
|
1302
|
+
},
|
|
1303
|
+
"description": "Extra literal declarations merged into the effect class as-is."
|
|
1304
|
+
},
|
|
1305
|
+
"vars": {
|
|
1306
|
+
"type": "object",
|
|
1307
|
+
"propertyNames": {
|
|
1308
|
+
"type": "string"
|
|
1309
|
+
},
|
|
1310
|
+
"additionalProperties": {
|
|
1311
|
+
"anyOf": [
|
|
1312
|
+
{
|
|
1313
|
+
"type": "string"
|
|
1314
|
+
},
|
|
1315
|
+
{
|
|
1316
|
+
"type": "number"
|
|
1317
|
+
}
|
|
1318
|
+
]
|
|
1319
|
+
},
|
|
1320
|
+
"description": "Effect endpoint variables (`--<key>: <value>`, e.g. opacity-from, translate-y-to) that override the keyframe defaults."
|
|
1321
|
+
}
|
|
1299
1322
|
},
|
|
1300
|
-
"
|
|
1301
|
-
"
|
|
1302
|
-
|
|
1323
|
+
"required": [
|
|
1324
|
+
"kf"
|
|
1325
|
+
],
|
|
1326
|
+
"additionalProperties": false,
|
|
1327
|
+
"description": "A named animation effect class — a pure value layer (`--_anim` + `--<prop>-from/-to`) over the static keyframe engine."
|
|
1328
|
+
}
|
|
1329
|
+
},
|
|
1330
|
+
"journeys": {
|
|
1331
|
+
"description": "Multi-part journey classes composed from `base` building blocks.",
|
|
1332
|
+
"type": "object",
|
|
1333
|
+
"properties": {
|
|
1334
|
+
"base": {
|
|
1335
|
+
"description": "Named journey building blocks: part name → var map.",
|
|
1336
|
+
"type": "object",
|
|
1337
|
+
"propertyNames": {
|
|
1338
|
+
"type": "string"
|
|
1339
|
+
},
|
|
1340
|
+
"additionalProperties": {
|
|
1341
|
+
"type": "object",
|
|
1342
|
+
"propertyNames": {
|
|
1303
1343
|
"type": "string"
|
|
1304
1344
|
},
|
|
1305
|
-
{
|
|
1306
|
-
"
|
|
1345
|
+
"additionalProperties": {
|
|
1346
|
+
"anyOf": [
|
|
1347
|
+
{
|
|
1348
|
+
"type": "string"
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
"type": "number"
|
|
1352
|
+
}
|
|
1353
|
+
]
|
|
1307
1354
|
}
|
|
1308
|
-
|
|
1355
|
+
}
|
|
1356
|
+
},
|
|
1357
|
+
"compose": {
|
|
1358
|
+
"description": "Combinations of base parts, each emitted as a `.<parts>-journey` class.",
|
|
1359
|
+
"type": "array",
|
|
1360
|
+
"items": {
|
|
1361
|
+
"type": "array",
|
|
1362
|
+
"items": {
|
|
1363
|
+
"type": "string"
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1309
1366
|
}
|
|
1310
|
-
}
|
|
1367
|
+
},
|
|
1368
|
+
"additionalProperties": false
|
|
1369
|
+
}
|
|
1370
|
+
},
|
|
1371
|
+
"additionalProperties": false,
|
|
1372
|
+
"description": "Animation effect + journey classes (pure value layers). The animation engine itself — keyframes, drivers, floats, utilities — is static framework CSS, not configured here."
|
|
1373
|
+
},
|
|
1374
|
+
"displayName": {
|
|
1375
|
+
"description": "Human-readable theme name (localisable). The label a theme picker would show — nothing reads it yet, because nothing builds more than one theme (see `themes`).",
|
|
1376
|
+
"anyOf": [
|
|
1377
|
+
{
|
|
1378
|
+
"type": "string"
|
|
1311
1379
|
},
|
|
1312
|
-
|
|
1313
|
-
"
|
|
1314
|
-
"
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
}
|
|
1380
|
+
{
|
|
1381
|
+
"type": "object",
|
|
1382
|
+
"propertyNames": {
|
|
1383
|
+
"type": "string"
|
|
1384
|
+
},
|
|
1385
|
+
"additionalProperties": {
|
|
1386
|
+
"type": "string"
|
|
1320
1387
|
}
|
|
1321
1388
|
}
|
|
1322
|
-
|
|
1323
|
-
"additionalProperties": false
|
|
1324
|
-
}
|
|
1325
|
-
},
|
|
1326
|
-
"additionalProperties": false,
|
|
1327
|
-
"description": "Animation effect + journey classes (pure value layers). The animation engine itself — keyframes, drivers, floats, utilities — is static framework CSS, not configured here."
|
|
1328
|
-
},
|
|
1329
|
-
"displayName": {
|
|
1330
|
-
"description": "Human-readable theme name (localisable).",
|
|
1331
|
-
"anyOf": [
|
|
1332
|
-
{
|
|
1333
|
-
"type": "string"
|
|
1389
|
+
]
|
|
1334
1390
|
},
|
|
1335
|
-
{
|
|
1336
|
-
"
|
|
1337
|
-
"
|
|
1338
|
-
"type": "string"
|
|
1339
|
-
},
|
|
1340
|
-
"additionalProperties": {
|
|
1341
|
-
"type": "string"
|
|
1342
|
-
}
|
|
1391
|
+
"extends": {
|
|
1392
|
+
"description": "Another `themes` key to inherit from; this entry then only supplies what it overrides.",
|
|
1393
|
+
"type": "string"
|
|
1343
1394
|
}
|
|
1344
|
-
|
|
1395
|
+
},
|
|
1396
|
+
"additionalProperties": false
|
|
1345
1397
|
},
|
|
1346
|
-
"
|
|
1347
|
-
"description": "Another `designSystem` key to inherit from; this entry then only supplies what it overrides.",
|
|
1348
|
-
"type": "string"
|
|
1349
|
-
}
|
|
1398
|
+
"description": "Named themes. `default` is the base; others may `extends` another and supply a partial patch. Light/dark is NOT a theme — the functional tokens flip per appearance within each one, so `default` already has both. Only the default theme is built today; multi-theme output and a picker are not wired yet."
|
|
1350
1399
|
},
|
|
1351
|
-
"
|
|
1400
|
+
"defaultTheme": {
|
|
1401
|
+
"description": "Which `themes` entry to use (convention: \"default\"). Validated against the map; selecting a non-default theme is not wired yet.",
|
|
1402
|
+
"type": "string"
|
|
1403
|
+
},
|
|
1404
|
+
"defaultColorScheme": {
|
|
1405
|
+
"description": "Initial appearance. `\"system\"` follows the OS via `prefers-color-scheme` and is what makes `<color-scheme-toggle>`'s \"System\" position resolve to anything — it removes the theme attribute, so without this the page falls through to light. It also gives a no-JS page the OS appearance. Defaults to `\"light\"`, because switching an existing site to `\"system\"` visibly flips it dark for dark-OS visitors.",
|
|
1406
|
+
"type": "string",
|
|
1407
|
+
"enum": [
|
|
1408
|
+
"light",
|
|
1409
|
+
"dark",
|
|
1410
|
+
"system"
|
|
1411
|
+
]
|
|
1412
|
+
}
|
|
1352
1413
|
},
|
|
1353
|
-
"
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
"
|
|
1357
|
-
"
|
|
1358
|
-
},
|
|
1359
|
-
"defaultColorScheme": {
|
|
1360
|
-
"description": "Initial appearance to render before any user/system preference applies.",
|
|
1361
|
-
"type": "string",
|
|
1362
|
-
"enum": [
|
|
1363
|
-
"light",
|
|
1364
|
-
"dark"
|
|
1365
|
-
]
|
|
1366
|
-
},
|
|
1367
|
-
"respectSystemPreference": {
|
|
1368
|
-
"description": "Follow the user's OS light/dark preference.",
|
|
1369
|
-
"type": "boolean"
|
|
1414
|
+
"required": [
|
|
1415
|
+
"themes"
|
|
1416
|
+
],
|
|
1417
|
+
"additionalProperties": false,
|
|
1418
|
+
"description": "The design system: named themes plus the system-wide facts (which theme, which appearance). A bare design system, or a bare theme map, is accepted as shorthand for `{ themes: … }`."
|
|
1370
1419
|
},
|
|
1371
1420
|
"fonts": {
|
|
1372
|
-
"description": "Font LOADING (a serialisable projection of the Astro Fonts API: provider, weights, subsets, preload). Font TOKENS live in `designSystem.<theme>.fonts` and reference the same `cssVariable`.",
|
|
1421
|
+
"description": "Font LOADING (a serialisable projection of the Astro Fonts API: provider, weights, subsets, preload). Font TOKENS live in `designSystem.themes.<theme>.fonts` and reference the same `cssVariable`.",
|
|
1373
1422
|
"type": "array",
|
|
1374
1423
|
"items": {
|
|
1375
1424
|
"type": "object",
|
|
@@ -2177,7 +2226,7 @@
|
|
|
2177
2226
|
"additionalProperties": false
|
|
2178
2227
|
},
|
|
2179
2228
|
"analytics": {
|
|
2180
|
-
"description": "Analytics provider IDs (gated per environment via `environments.<env>.analytics`).",
|
|
2229
|
+
"description": "Analytics provider IDs (gated per environment via `environments.<env>.analytics`). Which provider is set is also what the generated privacy policy and cookie notice disclose — see `legal`.",
|
|
2181
2230
|
"type": "object",
|
|
2182
2231
|
"properties": {
|
|
2183
2232
|
"googleAnalyticsId": {
|
|
@@ -2188,6 +2237,33 @@
|
|
|
2188
2237
|
},
|
|
2189
2238
|
"googleTagManagerId": {
|
|
2190
2239
|
"type": "string"
|
|
2240
|
+
},
|
|
2241
|
+
"clarityId": {
|
|
2242
|
+
"description": "Microsoft Clarity project ID.",
|
|
2243
|
+
"type": "string"
|
|
2244
|
+
},
|
|
2245
|
+
"matomo": {
|
|
2246
|
+
"description": "Matomo instance.",
|
|
2247
|
+
"type": "object",
|
|
2248
|
+
"properties": {
|
|
2249
|
+
"url": {
|
|
2250
|
+
"type": "string",
|
|
2251
|
+
"description": "Instance base URL (self-hosted, or `*.matomo.cloud`)."
|
|
2252
|
+
},
|
|
2253
|
+
"siteId": {
|
|
2254
|
+
"type": "string",
|
|
2255
|
+
"description": "Site ID within that instance."
|
|
2256
|
+
},
|
|
2257
|
+
"cookies": {
|
|
2258
|
+
"description": "Default false — Matomo runs cookieless (`disableCookies`), which is what lets the cookie notice state positively that it sets none.",
|
|
2259
|
+
"type": "boolean"
|
|
2260
|
+
}
|
|
2261
|
+
},
|
|
2262
|
+
"required": [
|
|
2263
|
+
"url",
|
|
2264
|
+
"siteId"
|
|
2265
|
+
],
|
|
2266
|
+
"additionalProperties": false
|
|
2191
2267
|
}
|
|
2192
2268
|
},
|
|
2193
2269
|
"additionalProperties": false
|
|
@@ -2238,9 +2314,16 @@
|
|
|
2238
2314
|
"additionalProperties": false
|
|
2239
2315
|
},
|
|
2240
2316
|
"legal": {
|
|
2241
|
-
"description": "Legal pages
|
|
2317
|
+
"description": "Legal pages: which documents exist, where they live, and the facts the generated prose asserts.",
|
|
2242
2318
|
"type": "object",
|
|
2243
2319
|
"properties": {
|
|
2320
|
+
"jurisdiction": {
|
|
2321
|
+
"description": "Which legal template set the generated documents use. Default `ca`.",
|
|
2322
|
+
"type": "string",
|
|
2323
|
+
"enum": [
|
|
2324
|
+
"ca"
|
|
2325
|
+
]
|
|
2326
|
+
},
|
|
2244
2327
|
"privacyPolicy": {
|
|
2245
2328
|
"type": "object",
|
|
2246
2329
|
"properties": {
|
|
@@ -2254,6 +2337,95 @@
|
|
|
2254
2337
|
"lastUpdated": {
|
|
2255
2338
|
"type": "string",
|
|
2256
2339
|
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
2340
|
+
},
|
|
2341
|
+
"privacyOfficer": {
|
|
2342
|
+
"description": "Who privacy requests go to. Falls back to `contact`, then `primaryLocation`.",
|
|
2343
|
+
"anyOf": [
|
|
2344
|
+
{
|
|
2345
|
+
"type": "string"
|
|
2346
|
+
},
|
|
2347
|
+
{
|
|
2348
|
+
"type": "object",
|
|
2349
|
+
"properties": {
|
|
2350
|
+
"name": {
|
|
2351
|
+
"type": "string"
|
|
2352
|
+
},
|
|
2353
|
+
"email": {
|
|
2354
|
+
"type": "string",
|
|
2355
|
+
"format": "email",
|
|
2356
|
+
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2357
|
+
},
|
|
2358
|
+
"phone": {
|
|
2359
|
+
"type": "string"
|
|
2360
|
+
},
|
|
2361
|
+
"address": {
|
|
2362
|
+
"type": "object",
|
|
2363
|
+
"properties": {
|
|
2364
|
+
"streetAddress": {
|
|
2365
|
+
"type": "string"
|
|
2366
|
+
},
|
|
2367
|
+
"addressLocality": {
|
|
2368
|
+
"type": "string",
|
|
2369
|
+
"description": "City."
|
|
2370
|
+
},
|
|
2371
|
+
"addressRegion": {
|
|
2372
|
+
"description": "State / province.",
|
|
2373
|
+
"type": "string"
|
|
2374
|
+
},
|
|
2375
|
+
"postalCode": {
|
|
2376
|
+
"type": "string"
|
|
2377
|
+
},
|
|
2378
|
+
"addressCountry": {
|
|
2379
|
+
"type": "string",
|
|
2380
|
+
"description": "Country (ISO 3166-1 alpha-2 preferred)."
|
|
2381
|
+
}
|
|
2382
|
+
},
|
|
2383
|
+
"required": [
|
|
2384
|
+
"streetAddress",
|
|
2385
|
+
"addressLocality",
|
|
2386
|
+
"addressCountry"
|
|
2387
|
+
],
|
|
2388
|
+
"additionalProperties": false,
|
|
2389
|
+
"description": "schema.org `PostalAddress` field names, so JSON-LD generation is lossless."
|
|
2390
|
+
}
|
|
2391
|
+
},
|
|
2392
|
+
"additionalProperties": false
|
|
2393
|
+
}
|
|
2394
|
+
]
|
|
2395
|
+
},
|
|
2396
|
+
"retention": {
|
|
2397
|
+
"description": "How long personal information is kept, in prose (e.g. \"24 months after last contact\").",
|
|
2398
|
+
"type": "string"
|
|
2399
|
+
},
|
|
2400
|
+
"processors": {
|
|
2401
|
+
"description": "Third parties that receive personal information and cannot be inferred from the rest of the config (payment processors, CRMs, mail senders). Known providers implied by `analytics`, `security` and `deployment` are added automatically — list only the rest.",
|
|
2402
|
+
"type": "array",
|
|
2403
|
+
"items": {
|
|
2404
|
+
"type": "object",
|
|
2405
|
+
"properties": {
|
|
2406
|
+
"name": {
|
|
2407
|
+
"type": "string",
|
|
2408
|
+
"description": "The provider, as a reader would recognise it (e.g. \"Stripe\")."
|
|
2409
|
+
},
|
|
2410
|
+
"purpose": {
|
|
2411
|
+
"type": "string",
|
|
2412
|
+
"description": "Why they receive it, as a noun phrase that reads after \"for\" (e.g. \"payment processing\")."
|
|
2413
|
+
},
|
|
2414
|
+
"country": {
|
|
2415
|
+
"description": "Where they process it, as it should read in a sentence (e.g. \"the United States\"). Feeds the cross-border-transfer disclosure.",
|
|
2416
|
+
"type": "string"
|
|
2417
|
+
},
|
|
2418
|
+
"privacyUrl": {
|
|
2419
|
+
"type": "string",
|
|
2420
|
+
"format": "uri"
|
|
2421
|
+
}
|
|
2422
|
+
},
|
|
2423
|
+
"required": [
|
|
2424
|
+
"name",
|
|
2425
|
+
"purpose"
|
|
2426
|
+
],
|
|
2427
|
+
"additionalProperties": false
|
|
2428
|
+
}
|
|
2257
2429
|
}
|
|
2258
2430
|
},
|
|
2259
2431
|
"required": [
|
|
@@ -2281,6 +2453,10 @@
|
|
|
2281
2453
|
"type": "null"
|
|
2282
2454
|
}
|
|
2283
2455
|
]
|
|
2456
|
+
},
|
|
2457
|
+
"governingLaw": {
|
|
2458
|
+
"description": "Governing-law clause, in prose (e.g. \"the Province of Ontario\"). Defaults from the contact address.",
|
|
2459
|
+
"type": "string"
|
|
2284
2460
|
}
|
|
2285
2461
|
},
|
|
2286
2462
|
"required": [
|
|
@@ -2330,13 +2506,21 @@
|
|
|
2330
2506
|
"type": "object",
|
|
2331
2507
|
"properties": {
|
|
2332
2508
|
"ui": {
|
|
2333
|
-
"description": "Icon set used for UI chrome (e.g. \"lucide\").",
|
|
2509
|
+
"description": "Icon set used for UI chrome (e.g. \"lucide\", \"ph\").",
|
|
2334
2510
|
"type": "string"
|
|
2335
2511
|
},
|
|
2336
2512
|
"brand": {
|
|
2337
2513
|
"description": "Icon set used for brand marks.",
|
|
2338
2514
|
"type": "string"
|
|
2339
2515
|
},
|
|
2516
|
+
"weight": {
|
|
2517
|
+
"description": "Weight for suffix-weighted sets like Phosphor (\"regular\" | \"bold\" | \"duotone\" | \"fill\" | \"light\" | \"thin\"). Ignored by sets that split weights across collections, e.g. Font Awesome.",
|
|
2518
|
+
"type": "string"
|
|
2519
|
+
},
|
|
2520
|
+
"sprite": {
|
|
2521
|
+
"description": "Emit an SVG sprite (icons.svg) alongside the stylesheet, for consumers that cannot run an icon integration (Bricks/WordPress, EmDash renderers).",
|
|
2522
|
+
"type": "boolean"
|
|
2523
|
+
},
|
|
2340
2524
|
"semantic": {
|
|
2341
2525
|
"description": "Named semantic icons to include.",
|
|
2342
2526
|
"type": "array",
|
|
@@ -2391,9 +2575,15 @@
|
|
|
2391
2575
|
"items": {
|
|
2392
2576
|
"type": "string"
|
|
2393
2577
|
}
|
|
2578
|
+
},
|
|
2579
|
+
"ph": {
|
|
2580
|
+
"type": "array",
|
|
2581
|
+
"items": {
|
|
2582
|
+
"type": "string"
|
|
2583
|
+
}
|
|
2394
2584
|
}
|
|
2395
2585
|
},
|
|
2396
|
-
"additionalProperties":
|
|
2586
|
+
"additionalProperties": {}
|
|
2397
2587
|
},
|
|
2398
2588
|
"favicon": {
|
|
2399
2589
|
"description": "Favicon/PWA asset generation (consumed by `@getvitops/utils` favicon tooling).",
|