@adobe/design-data-spec 3.4.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +3 -0
  2. package/conformance/README.md +22 -0
  3. package/conformance/invalid/SPEC-058/dataset.json +38 -0
  4. package/conformance/invalid/SPEC-058/expected-errors.json +10 -0
  5. package/conformance/manifest-extensions/README.md +63 -0
  6. package/conformance/manifest-extensions/base/dataset.json +22 -0
  7. package/conformance/manifest-extensions/invalid/component-missing-name/expected-errors.json +7 -0
  8. package/conformance/manifest-extensions/invalid/component-missing-name/extensions/components/broken.json +1 -0
  9. package/conformance/manifest-extensions/invalid/component-missing-name/manifest.json +4 -0
  10. package/conformance/manifest-extensions/invalid/extensions-dir-absolute-path/expected-errors.json +1 -0
  11. package/conformance/manifest-extensions/invalid/extensions-dir-absolute-path/manifest.json +5 -0
  12. package/conformance/manifest-extensions/invalid/extensions-dir-parent-traversal/expected-errors.json +1 -0
  13. package/conformance/manifest-extensions/invalid/extensions-dir-parent-traversal/manifest.json +5 -0
  14. package/conformance/manifest-extensions/invalid/field-invalid-kind/expected-errors.json +6 -0
  15. package/conformance/manifest-extensions/invalid/field-invalid-kind/extensions/fields/broken.json +7 -0
  16. package/conformance/manifest-extensions/invalid/field-invalid-kind/manifest.json +4 -0
  17. package/conformance/manifest-extensions/invalid/guideline-invalid-category/expected-errors.json +6 -0
  18. package/conformance/manifest-extensions/invalid/guideline-invalid-category/extensions/guidelines/broken.json +7 -0
  19. package/conformance/manifest-extensions/invalid/guideline-invalid-category/manifest.json +4 -0
  20. package/conformance/manifest-extensions/invalid/override-missing-uuid/expected-errors.json +1 -0
  21. package/conformance/manifest-extensions/invalid/override-missing-uuid/extensions/relationships/bad-override.json +7 -0
  22. package/conformance/manifest-extensions/invalid/override-missing-uuid/manifest.json +4 -0
  23. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/expected-errors.json +6 -0
  24. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/extensions/platform-extensions/broken.json +4 -0
  25. package/conformance/manifest-extensions/invalid/platform-extension-missing-extends/manifest.json +4 -0
  26. package/conformance/manifest-extensions/invalid/relationship-missing-scope/expected-errors.json +6 -0
  27. package/conformance/manifest-extensions/invalid/relationship-missing-scope/extensions/relationships/broken.json +4 -0
  28. package/conformance/manifest-extensions/invalid/relationship-missing-scope/manifest.json +4 -0
  29. package/conformance/manifest-extensions/invalid/token-invalid-uuid/expected-errors.json +6 -0
  30. package/conformance/manifest-extensions/invalid/token-invalid-uuid/extensions/tokens/broken.tokens.json +7 -0
  31. package/conformance/manifest-extensions/invalid/token-invalid-uuid/manifest.json +4 -0
  32. package/conformance/manifest-extensions/invalid/unknown-subdir-name/expected-errors.json +6 -0
  33. package/conformance/manifest-extensions/invalid/unknown-subdir-name/extensions/bogus-subdir/whatever.json +1 -0
  34. package/conformance/manifest-extensions/invalid/unknown-subdir-name/manifest.json +4 -0
  35. package/conformance/manifest-extensions/invalid/unknown-term-id/expected-errors.json +1 -0
  36. package/conformance/manifest-extensions/invalid/unknown-term-id/extensions/platform-extensions/ios-states.json +5 -0
  37. package/conformance/manifest-extensions/invalid/unknown-term-id/manifest.json +4 -0
  38. package/conformance/manifest-extensions/valid/custom-extensions-dir/expected.json +1 -0
  39. package/conformance/manifest-extensions/valid/custom-extensions-dir/manifest.json +5 -0
  40. package/conformance/manifest-extensions/valid/custom-extensions-dir/platform-extras/components/tab-bar-ios.json +9 -0
  41. package/conformance/manifest-extensions/valid/injects-component/expected.json +1 -0
  42. package/conformance/manifest-extensions/valid/injects-component/extensions/components/tab-bar-ios.json +9 -0
  43. package/conformance/manifest-extensions/valid/injects-component/manifest.json +4 -0
  44. package/conformance/manifest-extensions/valid/injects-field/expected.json +1 -0
  45. package/conformance/manifest-extensions/valid/injects-field/extensions/fields/hapticStyle.json +8 -0
  46. package/conformance/manifest-extensions/valid/injects-field/manifest.json +4 -0
  47. package/conformance/manifest-extensions/valid/injects-guideline/expected.json +1 -0
  48. package/conformance/manifest-extensions/valid/injects-guideline/extensions/guidelines/ios-haptics.json +9 -0
  49. package/conformance/manifest-extensions/valid/injects-guideline/manifest.json +4 -0
  50. package/conformance/manifest-extensions/valid/injects-platform-extension/expected.json +12 -0
  51. package/conformance/manifest-extensions/valid/injects-platform-extension/extensions/platform-extensions/ios-states.json +5 -0
  52. package/conformance/manifest-extensions/valid/injects-platform-extension/manifest.json +4 -0
  53. package/conformance/manifest-extensions/valid/injects-relationship/expected.json +7 -0
  54. package/conformance/manifest-extensions/valid/injects-relationship/extensions/relationships/button.json +5 -0
  55. package/conformance/manifest-extensions/valid/injects-relationship/manifest.json +4 -0
  56. package/conformance/manifest-extensions/valid/later-file-wins/expected.json +1 -0
  57. package/conformance/manifest-extensions/valid/later-file-wins/extensions/components/a-tab-bar-ios.json +9 -0
  58. package/conformance/manifest-extensions/valid/later-file-wins/extensions/components/b-tab-bar-ios.json +9 -0
  59. package/conformance/manifest-extensions/valid/later-file-wins/manifest.json +4 -0
  60. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/expected.json +1 -0
  61. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/extensions/relationships/a-override.json +9 -0
  62. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/extensions/relationships/z-add.json +5 -0
  63. package/conformance/manifest-extensions/valid/override-entry-skips-schema-validation/manifest.json +4 -0
  64. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/expected.json +7 -0
  65. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/extensions/relationships/a-override.json +9 -0
  66. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/extensions/relationships/z-add.json +5 -0
  67. package/conformance/manifest-extensions/valid/override-relationship-by-uuid/manifest.json +4 -0
  68. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/expected.json +5 -0
  69. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/extensions/relationships/button.json +5 -0
  70. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/extensions/relationships/slider.json +5 -0
  71. package/conformance/manifest-extensions/valid/plain-add-uuid-collision-append/manifest.json +4 -0
  72. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/expected.json +1 -0
  73. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/extensions/relationships/button.json +5 -0
  74. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/extensions/relationships/remove-button.json +4 -0
  75. package/conformance/manifest-extensions/valid/remove-relationship-by-uuid/manifest.json +4 -0
  76. package/conformance/manifest-extensions/valid/tokens-sorted-order/expected.json +8 -0
  77. package/conformance/manifest-extensions/valid/tokens-sorted-order/extensions/tokens/a.tokens.json +7 -0
  78. package/conformance/manifest-extensions/valid/tokens-sorted-order/extensions/tokens/b.tokens.json +7 -0
  79. package/conformance/manifest-extensions/valid/tokens-sorted-order/manifest.json +4 -0
  80. package/package.json +1 -1
  81. package/rules/rules.yaml +17 -0
  82. package/schemas/manifest.schema.json +43 -101
  83. package/spec/manifest-schema-override-spike.md +6 -3
  84. package/spec/manifest.md +108 -66
  85. package/spec/mode-sets.md +5 -5
  86. package/spec/taxonomy.md +2 -2
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/`.
@@ -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).
@@ -0,0 +1,38 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "name": {
5
+ "component": "accordion",
6
+ "property": "top-to-text-compact-medium"
7
+ },
8
+ "value": "5px",
9
+ "uuid": "aaaaaaaa-0058-4000-8000-000000000001",
10
+ "lifecycle": {
11
+ "deprecatedIn": "14.3.0",
12
+ "replacedBy": "aaaaaaaa-0058-4000-8000-000000000002"
13
+ }
14
+ },
15
+ {
16
+ "name": { "property": "base-padding-vertical-medium" },
17
+ "value": "5px",
18
+ "uuid": "aaaaaaaa-0058-4000-8000-000000000002"
19
+ }
20
+ ],
21
+ "relationships": [
22
+ {
23
+ "scope": {
24
+ "component": "accordion",
25
+ "property": "top-to-text-compact-medium"
26
+ },
27
+ "$ref": "aaaaaaaa-0058-4000-8000-000000000001"
28
+ }
29
+ ],
30
+ "components": [
31
+ {
32
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/accordion.json",
33
+ "name": "accordion",
34
+ "displayName": "Accordion",
35
+ "meta": { "category": "actions" }
36
+ }
37
+ ]
38
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-058",
6
+ "severity": "warning",
7
+ "message_pattern": ".*deprecated in 14.3.0.*aaaaaaaa-0058-4000-8000-000000000002.*"
8
+ }
9
+ ]
10
+ }
@@ -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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "relationships": {
3
+ "byUuid": {
4
+ "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a": { "count": 1, "value": "8px" }
5
+ }
6
+ }
7
+ }
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "relationships": {
3
+ "byUuid": { "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a": { "count": 2 } }
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "scope": { "component": "button", "property": "corner-radius" },
3
+ "value": "4px",
4
+ "uuid": "9c858f9c-1d90-4f1a-8c1a-1f1a1f1a1f1a"
5
+ }