@adobe/design-data-spec 3.5.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +3 -0
  2. package/conformance/README.md +24 -2
  3. package/conformance/generation/README.md +6 -6
  4. package/conformance/generation/mode-set-edit/input/tokens.tokens.json +3 -3
  5. package/conformance/generation/mode-set-token/input/tokens.tokens.json +2 -2
  6. package/conformance/manifest-extensions/README.md +63 -0
  7. package/conformance/manifest-extensions/base/dataset.json +22 -0
  8. package/conformance/manifest-extensions/invalid/component-missing-name/expected-errors.json +7 -0
  9. package/conformance/manifest-extensions/invalid/component-missing-name/extensions/components/broken.json +1 -0
  10. package/conformance/manifest-extensions/invalid/component-missing-name/manifest.json +4 -0
  11. package/conformance/manifest-extensions/invalid/extensions-dir-absolute-path/expected-errors.json +1 -0
  12. package/conformance/manifest-extensions/invalid/extensions-dir-absolute-path/manifest.json +5 -0
  13. package/conformance/manifest-extensions/invalid/extensions-dir-parent-traversal/expected-errors.json +1 -0
  14. package/conformance/manifest-extensions/invalid/extensions-dir-parent-traversal/manifest.json +5 -0
  15. package/conformance/manifest-extensions/invalid/field-invalid-kind/expected-errors.json +6 -0
  16. package/conformance/manifest-extensions/invalid/field-invalid-kind/extensions/fields/broken.json +7 -0
  17. package/conformance/manifest-extensions/invalid/field-invalid-kind/manifest.json +4 -0
  18. package/conformance/manifest-extensions/invalid/guideline-invalid-category/expected-errors.json +6 -0
  19. package/conformance/manifest-extensions/invalid/guideline-invalid-category/extensions/guidelines/broken.json +7 -0
  20. package/conformance/manifest-extensions/invalid/guideline-invalid-category/manifest.json +4 -0
  21. package/conformance/manifest-extensions/invalid/override-missing-uuid/expected-errors.json +1 -0
  22. package/conformance/manifest-extensions/invalid/override-missing-uuid/extensions/relationships/bad-override.json +7 -0
  23. package/conformance/manifest-extensions/invalid/override-missing-uuid/manifest.json +4 -0
  24. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/expected-errors.json +6 -0
  25. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/extensions/platform-extensions/broken.json +4 -0
  26. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/manifest.json +4 -0
  27. package/conformance/manifest-extensions/invalid/relationship-missing-scope/expected-errors.json +6 -0
  28. package/conformance/manifest-extensions/invalid/relationship-missing-scope/extensions/relationships/broken.json +4 -0
  29. package/conformance/manifest-extensions/invalid/relationship-missing-scope/manifest.json +4 -0
  30. package/conformance/manifest-extensions/invalid/token-invalid-uuid/expected-errors.json +6 -0
  31. package/conformance/manifest-extensions/invalid/token-invalid-uuid/extensions/tokens/broken.tokens.json +7 -0
  32. package/conformance/manifest-extensions/invalid/token-invalid-uuid/manifest.json +4 -0
  33. package/conformance/manifest-extensions/invalid/unknown-subdir-name/expected-errors.json +6 -0
  34. package/conformance/manifest-extensions/invalid/unknown-subdir-name/extensions/bogus-subdir/whatever.json +1 -0
  35. package/conformance/manifest-extensions/invalid/unknown-subdir-name/manifest.json +4 -0
  36. package/conformance/manifest-extensions/invalid/unknown-term-id/expected-errors.json +1 -0
  37. package/conformance/manifest-extensions/invalid/unknown-term-id/extensions/platform-extensions/ios-states.json +5 -0
  38. package/conformance/manifest-extensions/invalid/unknown-term-id/manifest.json +4 -0
  39. package/conformance/manifest-extensions/valid/custom-extensions-dir/expected.json +1 -0
  40. package/conformance/manifest-extensions/valid/custom-extensions-dir/manifest.json +5 -0
  41. package/conformance/manifest-extensions/valid/custom-extensions-dir/platform-extras/components/tab-bar-ios.json +9 -0
  42. package/conformance/manifest-extensions/valid/injects-component/expected.json +1 -0
  43. package/conformance/manifest-extensions/valid/injects-component/extensions/components/tab-bar-ios.json +9 -0
  44. package/conformance/manifest-extensions/valid/injects-component/manifest.json +4 -0
  45. package/conformance/manifest-extensions/valid/injects-field/expected.json +1 -0
  46. package/conformance/manifest-extensions/valid/injects-field/extensions/fields/hapticStyle.json +8 -0
  47. package/conformance/manifest-extensions/valid/injects-field/manifest.json +4 -0
  48. package/conformance/manifest-extensions/valid/injects-guideline/expected.json +1 -0
  49. package/conformance/manifest-extensions/valid/injects-guideline/extensions/guidelines/ios-haptics.json +9 -0
  50. package/conformance/manifest-extensions/valid/injects-guideline/manifest.json +4 -0
  51. package/conformance/manifest-extensions/valid/injects-platform-extension/expected.json +12 -0
  52. package/conformance/manifest-extensions/valid/injects-platform-extension/extensions/platform-extensions/ios-states.json +5 -0
  53. package/conformance/manifest-extensions/valid/injects-platform-extension/manifest.json +4 -0
  54. package/conformance/manifest-extensions/valid/injects-relationship/expected.json +7 -0
  55. package/conformance/manifest-extensions/valid/injects-relationship/extensions/relationships/button.json +5 -0
  56. package/conformance/manifest-extensions/valid/injects-relationship/manifest.json +4 -0
  57. package/conformance/manifest-extensions/valid/later-file-wins/expected.json +1 -0
  58. package/conformance/manifest-extensions/valid/later-file-wins/extensions/components/a-tab-bar-ios.json +9 -0
  59. package/conformance/manifest-extensions/valid/later-file-wins/extensions/components/b-tab-bar-ios.json +9 -0
  60. package/conformance/manifest-extensions/valid/later-file-wins/manifest.json +4 -0
  61. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/expected.json +1 -0
  62. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/extensions/relationships/a-override.json +9 -0
  63. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/extensions/relationships/z-add.json +5 -0
  64. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/manifest.json +4 -0
  65. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/expected.json +7 -0
  66. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/extensions/relationships/a-override.json +9 -0
  67. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/extensions/relationships/z-add.json +5 -0
  68. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/manifest.json +4 -0
  69. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/expected.json +5 -0
  70. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/extensions/relationships/button.json +5 -0
  71. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/extensions/relationships/slider.json +5 -0
  72. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/manifest.json +4 -0
  73. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/expected.json +1 -0
  74. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/extensions/relationships/button.json +5 -0
  75. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/extensions/relationships/remove-button.json +4 -0
  76. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/manifest.json +4 -0
  77. package/conformance/manifest-extensions/valid/tokens-sorted-order/expected.json +8 -0
  78. package/conformance/manifest-extensions/valid/tokens-sorted-order/extensions/tokens/a.tokens.json +7 -0
  79. package/conformance/manifest-extensions/valid/tokens-sorted-order/extensions/tokens/b.tokens.json +7 -0
  80. package/conformance/manifest-extensions/valid/tokens-sorted-order/manifest.json +4 -0
  81. package/conformance/reference/set-alias-dark/expected.json +1 -1
  82. package/conformance/reference/set-alias-dark/input/tokens.tokens.json +2 -2
  83. package/conformance/reference/set-alias-light/expected.json +1 -1
  84. package/conformance/reference/set-alias-light/input/tokens.tokens.json +2 -2
  85. package/package.json +1 -1
  86. package/rules/rules.yaml +17 -0
  87. package/schemas/manifest.schema.json +43 -101
  88. package/spec/cascade.md +3 -1
  89. package/spec/manifest-schema-override-spike.md +6 -3
  90. package/spec/manifest.md +108 -66
  91. package/spec/taxonomy.md +2 -2
  92. package/spec/token-format.md +28 -0
package/README.md CHANGED
@@ -4,6 +4,9 @@ Normative **Design Data Specification** artifacts for Spectrum: human-readable s
4
4
 
5
5
  **Spec version:** `1.0.0-draft` — see [`spec/index.md`](spec/index.md).
6
6
 
7
+ See [`spec/manifest.md`](spec/manifest.md) for the platform manifest spec, including the
8
+ `extensions/` directory model.
9
+
7
10
  ## Layers
8
11
 
9
12
  1. **JSON Schemas** (Draft 2020-12) — structural (per-file) validation; canonical `$id` under `https://opensource.adobe.com/spectrum-design-data/schemas/v0/`.
@@ -79,14 +79,14 @@ These fixtures verify the field-mapping contract in [Evolution — Legacy format
79
79
  | Folder | Intent |
80
80
  | --------------------------- | -------------------------------------------------------------------------------------------------- |
81
81
  | `generation/flat-token` | A single cascade token with no mode sets maps to a single keyed entry `{ slug: { value, uuid } }`. |
82
- | `generation/mode-set-token` | Multiple cascade tokens sharing a `set_uuid` merge into a single `sets`-keyed entry. |
82
+ | `generation/mode-set-token` | Multiple cascade tokens sharing a `conceptId` merge into a single `sets`-keyed entry. |
83
83
 
84
84
  The Rust SDK drives these fixtures via `design-data migrate legacy-output` (see `sdk/core/src/legacy.rs`).
85
85
  Consumer implementations MUST regenerate each `input/` and diff against `expected/` to claim conformance
86
86
  with the output-generator determinism contract.
87
87
 
88
88
  See [`generation/README.md`](generation/README.md) for the fixture format, the run command, and
89
- documentation of the `set_uuid`/`set_schema` cascade grouping fields used in `mode-set-token`.
89
+ documentation of the `conceptId`/`set_schema` cascade grouping fields used in `mode-set-token`.
90
90
 
91
91
  ***
92
92
 
@@ -112,3 +112,25 @@ Each **query** case lives under `query/<name>/` with:
112
112
  | `query/and-or-precedence` | AND binds tighter than OR: `a,b\|c` = `(a AND b) OR c`. |
113
113
 
114
114
  The Rust SDK drives these fixtures in `sdk/core/src/lib.rs` (`query_conformance` module, closes [#788](https://github.com/adobe/spectrum-design-data/issues/788)).
115
+
116
+ ***
117
+
118
+ ## Manifest extensions conformance fixtures
119
+
120
+ Each **manifest-extensions** case lives under `manifest-extensions/valid/<name>/`
121
+ or `manifest-extensions/invalid/<name>/` with:
122
+
123
+ * `manifest.json` — a Layer 2 platform manifest (applied against the shared
124
+ `manifest-extensions/base/dataset.json` seed graph)
125
+ * an `extensions/` directory tree (or custom-named via `extensionsDir`) with
126
+ category subdirectories (`tokens/`, `components/`, `fields/`, `guidelines/`,
127
+ `platform-extensions/`, `relationships/`)
128
+ * `valid/` cases: `expected.json` — optional post-apply graph predicates
129
+ (relationship `byUuid`/`absent`, component/field/guideline `present`, token
130
+ `orderByUuid`); `{}` when the case only proves the manifest applies cleanly
131
+ * `invalid/` cases: `expected-errors.json` — `{ "errors": [{ "message_pattern": "..." }] }`,
132
+ every pattern regex-matched against the single returned error message
133
+
134
+ See [`manifest-extensions/README.md`](manifest-extensions/README.md) for the
135
+ full case table. The Rust SDK drives these fixtures in `sdk/core/src/lib.rs`
136
+ (`manifest_extensions_conformance` and `manifest_extensions_behavior` modules).
@@ -38,20 +38,20 @@ design-data migrate legacy-output <case>/input --output <case>/expected
38
38
  | Case | What it exercises |
39
39
  | ------------------ | ----------------------------------------------------------------------------------------------------------- |
40
40
  | `flat-token` | Basic flat token conversion (property key derivation, field passthrough) |
41
- | `mode-set-token` | Color-set reconstruction from per-mode cascade records (`set_uuid`/`set_schema`) |
41
+ | `mode-set-token` | Color-set reconstruction from per-mode cascade records (`conceptId`/`set_schema`) |
42
42
  | `deprecated-token` | `deprecated: "version"` string → `true` boolean; `deprecated_comment` passthrough; `plannedRemoval` dropped |
43
43
  | `renamed-token` | `replaced_by: "<uuid>"` → `renamed: "<property-name>"` via global UUID→name map |
44
44
  | `alias-rewire` | `$ref: "<uuid>"` → `value: "{<property-name>}"` (alias denormalization with UUID resolution) |
45
45
  | `mode-set-edit` | `deprecated`/`renamed` hoisted to outer set level when consistent across all mode entries |
46
46
 
47
- ## Cascade grouping fields (`set_uuid` / `set_schema`)
47
+ ## Cascade grouping fields (`conceptId` / `set_schema`)
48
48
 
49
49
  The `mode-set-token` and `mode-set-edit` fixtures use two cascade-internal grouping fields:
50
50
 
51
- | Field | Type | Role |
52
- | ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
53
- | `set_uuid` | string | Shared UUID that groups per-mode cascade records into one set-keyed legacy entry. The SDK registers this as `set_uuid → child-key list` in `sdk/core/src/graph.rs` and the legacy generator collapses all records sharing a `set_uuid` into a single `sets`-keyed output object. |
54
- | `set_schema` | string | The `$schema` URI of the aggregate set token emitted at the outer (non-mode-keyed) level in the legacy output (e.g. `color-set.json`). |
51
+ | Field | Type | Role |
52
+ | ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
53
+ | `conceptId` | string | Canonical concept-level UUID shared by every mode row of a design concept. The SDK registers this as `conceptId → child-key list` in `sdk/core/src/graph.rs` and the legacy generator collapses all records sharing a `conceptId` into a single `sets`-keyed output object. |
54
+ | `set_schema` | string | The `$schema` URI of the aggregate set token emitted at the outer (non-mode-keyed) level in the legacy output (e.g. `color-set.json`). |
55
55
 
56
56
  These fields are not yet in the normative token-format field table — they are Rust SDK
57
57
  implementation fields defined in `sdk/core/src/graph.rs` and emitted by the cascade ingest
@@ -9,7 +9,7 @@
9
9
  "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
10
10
  "value": "rgb(20, 115, 230)",
11
11
  "uuid": "11111111-0001-4000-8000-000000000001",
12
- "set_uuid": "11111111-0003-4000-8000-000000000003",
12
+ "conceptId": "11111111-0003-4000-8000-000000000003",
13
13
  "set_schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color-set.json",
14
14
  "lifecycle": {
15
15
  "deprecatedIn": true,
@@ -26,7 +26,7 @@
26
26
  "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
27
27
  "value": "rgb(56, 145, 254)",
28
28
  "uuid": "11111111-0002-4000-8000-000000000002",
29
- "set_uuid": "11111111-0003-4000-8000-000000000003",
29
+ "conceptId": "11111111-0003-4000-8000-000000000003",
30
30
  "set_schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color-set.json",
31
31
  "lifecycle": {
32
32
  "deprecatedIn": true,
@@ -38,7 +38,7 @@
38
38
  "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
39
39
  "value": "rgb(20, 115, 230)",
40
40
  "uuid": "11111111-0004-4000-8000-000000000004",
41
- "set_uuid": "11111111-0005-4000-8000-000000000005",
41
+ "conceptId": "11111111-0005-4000-8000-000000000005",
42
42
  "set_schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color-set.json"
43
43
  }
44
44
  ]
@@ -9,7 +9,7 @@
9
9
  "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
10
10
  "value": "rgb(245, 249, 255)",
11
11
  "uuid": "bbbbbbbb-0001-4000-8000-000000000001",
12
- "set_uuid": "cccccccc-0001-4000-8000-000000000001",
12
+ "conceptId": "cccccccc-0001-4000-8000-000000000001",
13
13
  "set_schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color-set.json",
14
14
  "private": true
15
15
  },
@@ -23,7 +23,7 @@
23
23
  "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
24
24
  "value": "rgb(14, 23, 63)",
25
25
  "uuid": "bbbbbbbb-0002-4000-8000-000000000002",
26
- "set_uuid": "cccccccc-0001-4000-8000-000000000001",
26
+ "conceptId": "cccccccc-0001-4000-8000-000000000001",
27
27
  "set_schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color-set.json",
28
28
  "private": true
29
29
  }
@@ -0,0 +1,63 @@
1
+ # Manifest extensions conformance fixtures
2
+
3
+ Exercises the Layer 2 platform manifest's `extensions/` **directory** loader
4
+ (`packages/design-data-spec/spec/manifest.md#extensions-directory`): a sibling
5
+ `extensions/` tree (or a custom name via the manifest's `extensionsDir` field)
6
+ whose category subdirectories (`tokens/`, `components/`, `fields/`,
7
+ `guidelines/`, `platform-extensions/`, `relationships/`) are discovered,
8
+ glob+merged in sorted path order, per-fragment schema-validated, and spliced
9
+ into the manifest before it's applied to the graph.
10
+
11
+ * `base/dataset.json` — a shared minimal seed graph (three foundation tokens:
12
+ `btn-bg`, `btn-fg`, `chk-bg` on the `button`/`checkbox` components), loaded
13
+ once per case before that case's `manifest.json` is applied via
14
+ `apply_configured`.
15
+ * `valid/<case>/` — `manifest.json` + an `extensions/` (or custom-named) tree
16
+ that must apply cleanly. `expected.json` optionally carries behavior
17
+ predicates asserted against the post-apply graph:
18
+ ```jsonc
19
+ {
20
+ "relationships": {
21
+ "byUuid": { "<uuid>": { "count": 1, "value": "8px" } },
22
+ "absent": ["<uuid>"]
23
+ },
24
+ "components": { "present": ["tab-bar-ios"] },
25
+ "fields": { "present": ["hapticStyle"] },
26
+ "guidelines": { "present": ["ios-haptics"] },
27
+ "tokens": { "orderByUuid": ["<uuid-1>", "<uuid-2>"] }
28
+ }
29
+ ```
30
+ A case that only needs to prove "loads clean" uses `{}`.
31
+ * `invalid/<case>/` — `manifest.json` + tree that must fail `apply_configured`.
32
+ `expected-errors.json` is `{ "errors": [{ "message_pattern": "..." }] }`;
33
+ every pattern (regex) must match the single returned error message.
34
+
35
+ Rust SDK drives these fixtures in `sdk/core/src/lib.rs` via the
36
+ `manifest_extensions_conformance` (pass/fail + error message matching) and
37
+ `manifest_extensions_behavior` (post-apply graph predicates) test modules.
38
+
39
+ | Case | Intent |
40
+ | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
41
+ | `valid/injects-component` | A `components/` fragment is injected as a Platform-layer component. |
42
+ | `valid/injects-platform-extension` | A `platform-extensions/` fragment is injected. |
43
+ | `valid/injects-field` | A `fields/` fragment is injected. |
44
+ | `valid/injects-guideline` | A `guidelines/` fragment is injected. |
45
+ | `valid/injects-relationship` | A `relationships/` plain-add fragment is injected. |
46
+ | `valid/override-relationship-by-uuid` | An `op: "override"` entry replaces a plain add sharing its `uuid`, regardless of file sort order. |
47
+ | `valid/plain-add-uuid-collision-append` | Two plain adds sharing a `uuid` both append rather than one overwriting the other. |
48
+ | `valid/remove-relationship-by-uuid` | An `op: "remove"` entry deletes the matching relationship. |
49
+ | `valid/tokens-sorted-order` | Multiple `tokens/*.tokens.json` files concatenate in sorted path order. |
50
+ | `valid/later-file-wins` | Two `components/` fragments declaring the same component name dedupe to one, later file wins. |
51
+ | `valid/custom-extensions-dir` | The manifest's `extensionsDir` field is honored in place of the default `extensions/` name. |
52
+ | `valid/override-entry-skips-schema-validation` | An `op: "override"` relationship entry is not schema-validated against `relationship.schema.json` (only plain adds are). |
53
+ | `invalid/override-missing-uuid` | An `op: "override"` relationship entry missing `uuid` fails loudly. |
54
+ | `invalid/unknown-term-id` | A `platform-extensions/` fragment referencing a non-existent `termId` fails loudly. |
55
+ | `invalid/component-missing-name` | A `components/` fragment missing `name` fails Layer 1 fragment schema validation. |
56
+ | `invalid/field-invalid-kind` | A `fields/` fragment with an invalid `kind` enum value fails schema validation. |
57
+ | `invalid/guideline-invalid-category` | A `guidelines/` fragment with an invalid `category` enum value fails schema validation. |
58
+ | `invalid/platform-extension-missing-extends` | A `platform-extensions/` fragment missing `extends` fails schema validation. |
59
+ | `invalid/token-invalid-uuid` | A `tokens/*.tokens.json` fragment with a malformed `uuid` fails schema validation. |
60
+ | `invalid/relationship-missing-scope` | A `relationships/` plain-add fragment missing `scope` fails schema validation. |
61
+ | `invalid/extensions-dir-parent-traversal` | `extensionsDir` containing a `..` component is rejected. |
62
+ | `invalid/extensions-dir-absolute-path` | An absolute `extensionsDir` path is rejected. |
63
+ | `invalid/unknown-subdir-name` | An unrecognized subdirectory directly under `extensions/` (not one of the six known categories) is rejected by name. |
@@ -0,0 +1,22 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "key": "btn-bg",
5
+ "name": { "property": "background-color", "component": "button" },
6
+ "value": "#aaa",
7
+ "uuid": "u-btn-bg"
8
+ },
9
+ {
10
+ "key": "btn-fg",
11
+ "name": { "property": "color", "component": "button" },
12
+ "value": "#111",
13
+ "uuid": "u-btn-fg"
14
+ },
15
+ {
16
+ "key": "chk-bg",
17
+ "name": { "property": "background-color", "component": "checkbox" },
18
+ "value": "#bbb",
19
+ "uuid": "u-chk-bg"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.json" },
4
+ { "message_pattern": "component\\.schema\\.json" },
5
+ { "message_pattern": "\"name\"" }
6
+ ]
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "errors": [{ "message_pattern": "extensionsDir" }] }
@@ -0,0 +1,5 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0",
4
+ "extensionsDir": "/etc"
5
+ }
@@ -0,0 +1 @@
1
+ { "errors": [{ "message_pattern": "extensionsDir" }] }
@@ -0,0 +1,5 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0",
4
+ "extensionsDir": "../escape"
5
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.json" },
4
+ { "message_pattern": "field\\.schema\\.json" }
5
+ ]
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "hapticStyle",
3
+ "kind": "bogus-kind",
4
+ "registry": null,
5
+ "validation": "none",
6
+ "serialization": { "position": 9 }
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.json" },
4
+ { "message_pattern": "guideline\\.schema\\.json" }
5
+ ]
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$id": "https://example.com/guidelines/broken",
3
+ "name": "broken",
4
+ "title": "Broken",
5
+ "category": "not-a-real-category",
6
+ "documentBlocks": [{ "type": "purpose", "content": "..." }]
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "errors": [{ "message_pattern": "missing a \"uuid\"" }] }
@@ -0,0 +1,7 @@
1
+ {
2
+ "op": "override",
3
+ "value": {
4
+ "scope": { "component": "button", "property": "corner-radius" },
5
+ "value": "8px"
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.json" },
4
+ { "message_pattern": "platform-extension\\.json" }
5
+ ]
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "platform": "iOS",
3
+ "extensions": [{ "termId": "default", "platformTerm": "normal" }]
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.json" },
4
+ { "message_pattern": "relationship\\.schema\\.json" }
5
+ ]
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "value": "4px",
3
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "broken\\.tokens\\.json" },
4
+ { "message_pattern": "cascade-file\\.schema\\.json" }
5
+ ]
6
+ }
@@ -0,0 +1,7 @@
1
+ [
2
+ {
3
+ "name": { "property": "elevation", "component": "card" },
4
+ "value": "4dp",
5
+ "uuid": "not-a-uuid"
6
+ }
7
+ ]
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errors": [
3
+ { "message_pattern": "unrecognized subdirectory" },
4
+ { "message_pattern": "bogus-subdir" }
5
+ ]
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "errors": [{ "message_pattern": "not-a-real-state" }] }
@@ -0,0 +1,5 @@
1
+ {
2
+ "platform": "iOS",
3
+ "extends": "states",
4
+ "extensions": [{ "termId": "not-a-real-state" }]
5
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "components": { "present": ["tab-bar-ios"] } }
@@ -0,0 +1,5 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0",
4
+ "extensionsDir": "platform-extras"
5
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://example.com/components/tab-bar-ios",
3
+ "name": "tab-bar-ios",
4
+ "displayName": "Tab Bar (iOS)",
5
+ "meta": {
6
+ "category": "navigation",
7
+ "documentationUrl": "https://example.com"
8
+ }
9
+ }
@@ -0,0 +1 @@
1
+ { "components": { "present": ["tab-bar-ios"] } }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://example.com/components/tab-bar-ios",
3
+ "name": "tab-bar-ios",
4
+ "displayName": "Tab Bar (iOS)",
5
+ "meta": {
6
+ "category": "navigation",
7
+ "documentationUrl": "https://example.com"
8
+ }
9
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "fields": { "present": ["hapticStyle"] } }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "hapticStyle",
3
+ "kind": "semantic",
4
+ "registry": null,
5
+ "validation": "none",
6
+ "serialization": { "position": 9 },
7
+ "required": false
8
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "guidelines": { "present": ["ios-haptics"] } }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://example.com/guidelines/ios-haptics",
3
+ "name": "ios-haptics",
4
+ "title": "iOS Haptics",
5
+ "category": "developing",
6
+ "documentBlocks": [
7
+ { "type": "purpose", "content": "When to use haptic feedback on iOS." }
8
+ ]
9
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "platformExtensions": {
3
+ "present": [
4
+ {
5
+ "platform": "iOS",
6
+ "extends": "states",
7
+ "termId": "default",
8
+ "platformTerm": "normal"
9
+ }
10
+ ]
11
+ }
12
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "platform": "iOS",
3
+ "extends": "states",
4
+ "extensions": [{ "termId": "default", "platformTerm": "normal" }]
5
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "relationships": {
3
+ "byUuid": {
4
+ "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a": { "count": 1, "value": "4px" }
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "scope": { "component": "button", "property": "corner-radius" },
3
+ "value": "4px",
4
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a"
5
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1 @@
1
+ { "components": { "present": ["tab-bar-ios"] } }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://example.com/components/tab-bar-ios",
3
+ "name": "tab-bar-ios",
4
+ "displayName": "First",
5
+ "meta": {
6
+ "category": "navigation",
7
+ "documentationUrl": "https://example.com"
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://example.com/components/tab-bar-ios",
3
+ "name": "tab-bar-ios",
4
+ "displayName": "Second",
5
+ "meta": {
6
+ "category": "navigation",
7
+ "documentationUrl": "https://example.com"
8
+ }
9
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "op": "override",
3
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a",
4
+ "value": {
5
+ "scope": { "component": "button", "property": "corner-radius" },
6
+ "value": "8px",
7
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a"
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "scope": { "component": "button", "property": "corner-radius" },
3
+ "value": "4px",
4
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a"
5
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "specVersion": "1.0.0-draft",
3
+ "foundationVersion": "1.0.0"
4
+ }