@adobe/design-data-spec 1.3.0 → 1.4.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.
@@ -0,0 +1,21 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/font-weight.json",
5
+ "name": {
6
+ "property": "font-weight",
7
+ "colorFamily": "blue"
8
+ },
9
+ "value": "bold"
10
+ },
11
+ {
12
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
13
+ "name": {
14
+ "property": "color",
15
+ "weight": "bold"
16
+ },
17
+ "value": "#0265dc"
18
+ }
19
+ ],
20
+ "components": []
21
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-042",
6
+ "severity": "warning",
7
+ "message_pattern": ".*colorFamily.*color-scoped.*font-weight.*"
8
+ },
9
+ {
10
+ "rule_id": "SPEC-042",
11
+ "severity": "warning",
12
+ "message_pattern": ".*weight.*typography-scoped.*color.*"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/color.json",
5
+ "name": {
6
+ "property": "color",
7
+ "state": "hover"
8
+ },
9
+ "value": "#0265dc"
10
+ },
11
+ {
12
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/token-types/font-weight.json",
13
+ "name": {
14
+ "property": "font-weight"
15
+ },
16
+ "value": "bold"
17
+ }
18
+ ],
19
+ "components": []
20
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-043",
6
+ "severity": "warning",
7
+ "message_pattern": ".*color.*no domain-identifying field.*colorFamily.*"
8
+ },
9
+ {
10
+ "rule_id": "SPEC-043",
11
+ "severity": "warning",
12
+ "message_pattern": ".*typography.*no domain-identifying field.*family.*"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "colorFamily",
5
+ "description": "Hue family of a color token (e.g. blue, gray, celery, accent). Used on color palette and semantic color tokens. Paired with scaleIndex for ramp tokens (e.g. colorFamily=blue + scaleIndex=100 → blue-100).",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/color-families.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 17
11
+ },
12
+ "scope": "color",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "easing",
5
+ "description": "Easing curve identifier for a motion token (e.g. ease-in, ease-out, standard). Registry is provisional until motion tokens are added to the foundation.",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/easing-curves.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 22
11
+ },
12
+ "scope": "motion",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "family",
5
+ "description": "Type family of a typography token (e.g. sans-serif, serif, cjk, code). Used to distinguish tokens that apply to different script or display contexts.",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/typography-families.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 18
11
+ },
12
+ "scope": "typography",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "motionRole",
5
+ "description": "Semantic role of a motion token — the interaction pattern it governs (e.g. enter, exit, transition, emphasis). Registry is provisional until motion tokens are added to the foundation.",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/motion-roles.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 21
11
+ },
12
+ "scope": "motion",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
@@ -7,7 +7,7 @@
7
7
  "registry": null,
8
8
  "validation": "none",
9
9
  "serialization": {
10
- "position": 16
10
+ "position": 99
11
11
  },
12
12
  "scope": null,
13
13
  "required": false,
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "style",
5
+ "description": "Typographic style of a typography token (e.g. italic, oblique). Corresponds to the CSS font-style axis. Normal style is omitted (default).",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/typography-styles.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 20
11
+ },
12
+ "scope": "typography",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/field.schema.json",
3
+ "specVersion": "1.0.0-draft",
4
+ "name": "weight",
5
+ "description": "Typographic weight of a typography token (e.g. regular, bold, light, black). Corresponds to the CSS font-weight axis.",
6
+ "kind": "semantic",
7
+ "registry": "packages/design-system-registry/registry/typography-weights.json",
8
+ "validation": "advisory",
9
+ "serialization": {
10
+ "position": 19
11
+ },
12
+ "scope": "typography",
13
+ "required": false,
14
+ "valueType": "string"
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/design-data-spec",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Design Data Specification — prose, JSON Schemas, rule catalog, and conformance fixtures for Spectrum design data",
5
5
  "type": "module",
6
6
  "repository": {
package/rules/rules.yaml CHANGED
@@ -436,3 +436,40 @@ rules:
436
436
  message: "Token group '{base_name}' has no resolvable candidate under manifest mode-set restrictions ({restrictions})"
437
437
  spec_ref: spec/mode-sets.md#platform-restrictions
438
438
  introduced_in: "1.0.0-draft"
439
+
440
+ - id: SPEC-042
441
+ name: field-scope-violation
442
+ severity: warning
443
+ layer: 2
444
+ category: taxonomy
445
+ rfc: "#806"
446
+ assert: >
447
+ When a token's name object contains a domain-scoped field (e.g. `colorFamily`,
448
+ `weight`, `motionRole`), the token's `$schema` MUST reference a compatible token
449
+ type for that domain. Using a color-scoped field on a typography token, or a
450
+ typography-scoped field on a color token, is a taxonomy violation. The set of
451
+ domain-scoped fields and their valid schema URL suffixes is declared in the field
452
+ catalog under `packages/design-data-spec/fields/` via the `scope` property.
453
+ Tokens without a `$schema` are skipped (domain cannot be determined).
454
+ message: "name.{field} is a {scope}-scoped field but token schema '{schema_url}' is not a {scope} token type"
455
+ spec_ref: spec/taxonomy.md#token-type-taxonomies
456
+ introduced_in: "1.0.0-draft"
457
+
458
+ - id: SPEC-043
459
+ name: domain-required-fields
460
+ severity: warning
461
+ layer: 2
462
+ category: taxonomy
463
+ rfc: "#806"
464
+ assert: >
465
+ Tokens in a known domain SHOULD include at least one domain-identifying field in
466
+ their name object so tooling can group, sort, and validate them correctly.
467
+ Color tokens (schema: color.json, color-set.json) SHOULD have `colorFamily` or
468
+ `scaleIndex`. Typography tokens (schema: font-*.json, typography.json) SHOULD have
469
+ `family`, `weight`, or `style`. Motion tokens (schema: duration.json, motion.json)
470
+ SHOULD have `motionRole` or `easing`. String-named tokens and tokens without `$schema`
471
+ are skipped. Advisory severity: the existing corpus has not yet migrated to structured
472
+ name objects; this rule tracks progress rather than blocking.
473
+ message: "{domain} token has a name object but no domain-identifying field — add at least one of: {required_fields}"
474
+ spec_ref: spec/taxonomy.md#token-type-taxonomies
475
+ introduced_in: "1.0.0-draft"
@@ -108,7 +108,13 @@
108
108
  "size",
109
109
  "density",
110
110
  "shape",
111
- "state"
111
+ "state",
112
+ "colorFamily",
113
+ "family",
114
+ "weight",
115
+ "style",
116
+ "motionRole",
117
+ "easing"
112
118
  ]
113
119
  },
114
120
  "uniqueItems": true,
package/spec/taxonomy.md CHANGED
@@ -46,13 +46,17 @@ The taxonomy is designed with three guiding principles:
46
46
  2. **Agnostic (with compromises)** — Platform-agnostic terms are used except when platforms have specific terms for the same concept. In those cases, the most common or clear term is used.
47
47
  3. **Verified** — Multiple existing components must be rebuildable using the taxonomy system, and consumers must find them reasonably understandable or learnable.
48
48
 
49
- ## Semantic / layout token taxonomy
49
+ ## Token-type taxonomies
50
50
 
51
- Concept categories for name-object fields are declared in the design system's **field catalog** — a set of field declarations in the `fields/` directory, each conforming to [`field.schema.json`](../schemas/field.schema.json). Each declaration specifies the field name, vocabulary registry, validation severity, and default serialization position.
51
+ Concept categories for name-object fields are declared in the design system's **field catalog** — a set of field declarations in the `fields/` directory, each conforming to [`field.schema.json`](../schemas/field.schema.json). Each declaration specifies the field name, vocabulary registry, validation severity, default serialization position, and an optional **scope** that restricts the field to a specific token type.
52
52
 
53
53
  **NORMATIVE:** The field catalog is the authoritative source for what fields exist on the name object. Tools, validators, and serializers **SHOULD** read the catalog rather than hardcoding field knowledge.
54
54
 
55
- The following concept categories are defined in Spectrum's foundation field catalog for semantic and layout tokens, ordered by default serialization position. This ordering is the **default serialization order** for legacy format output; it is not a conformance requirement for stored name objects.
55
+ **NORMATIVE:** A field with a non-null `scope` declaration **MUST** only appear on tokens of that type. Using a scoped field on a mismatched token type triggers rule SPEC-042 (`field-scope-violation`, warning).
56
+
57
+ ### Semantic / layout token taxonomy
58
+
59
+ The following concept categories are defined in Spectrum's foundation field catalog for semantic and layout tokens (`scope: null` — universal), ordered by default serialization position. This ordering is the **default serialization order** for legacy format output; it is not a conformance requirement for stored name objects.
56
60
 
57
61
  **NORMATIVE:** Each category listed below corresponds to a field on the token [name object](token-format.md). Tokens **MAY** use any subset of these fields. Exception: `property` is REQUIRED on every name object — see [token-format.md](token-format.md#name-object).
58
62
 
@@ -77,7 +81,67 @@ Additional categories for variant and state are inherited from the existing name
77
81
  | Variant | `variant` | Variant within a component (e.g. accent, negative, primary). |
78
82
  | State | `state` | Interactive or semantic state (e.g. hover, focus, disabled). |
79
83
 
80
- **NOTE:** The categories above are filtered for semantic and layout token taxonomies. Additional taxonomies for other token types (color, typography, motion) will be defined in future spec versions — see the open follow-up RFC discussion [#806](https://github.com/adobe/spectrum-design-data/discussions/806) (Q3, taxonomy scoping). The taxonomy is built to scale as new concepts and terms are identified.
84
+ ### Color token taxonomy
85
+
86
+ Color tokens describe palette entries and semantic color assignments. Their name objects use `scope: "color"` fields alongside the universal `property` and `state` fields.
87
+
88
+ **NORMATIVE:** Color tokens SHOULD include `colorFamily`, `scaleIndex`, or both to allow tooling to group and sort palette entries. Tokens missing both are flagged by rule SPEC-043 (`domain-required-fields`, warning).
89
+
90
+ | Category | Name object field | Answers | Description |
91
+ | ------------ | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
92
+ | Color Family | `colorFamily` | What? | Hue family of the color (e.g. `blue`, `gray`, `celery`, `transparent-black`). Values come from [`color-families.json`](../../packages/design-system-registry/registry/color-families.json). |
93
+ | Ramp Index | `scaleIndex` | Which? | Numeric perceptual ramp step (e.g. `100`, `400`, `900`, `1600`). Shared with layout tokens; see [scaleIndex field declaration](../fields/scaleIndex.json). Not scope-restricted. |
94
+
95
+ **Default serialization order for color tokens:**
96
+
97
+ ```
98
+ {variant}-{colorFamily}-{scaleIndex}
99
+ ```
100
+
101
+ Example: `colorFamily=blue` + `scaleIndex=100` → `blue-100`.
102
+
103
+ ### Typography token taxonomy
104
+
105
+ Typography tokens describe typeface attributes: family, weight, style, and numeric scale. Their name objects use `scope: "typography"` fields alongside the universal `property` field.
106
+
107
+ **NORMATIVE:** Typography tokens SHOULD include at least one of `family`, `weight`, or `style`. Tokens missing all three are flagged by rule SPEC-043 (`domain-required-fields`, warning).
108
+
109
+ | Category | Name object field | Answers | Description |
110
+ | -------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
111
+ | Family | `family` | What? | Type family of the token (e.g. `sans-serif`, `serif`, `cjk`, `code`). Values come from [`typography-families.json`](../../packages/design-system-registry/registry/typography-families.json). |
112
+ | Weight | `weight` | How? | Typographic weight (e.g. `regular`, `bold`, `light`, `black`). Values come from [`typography-weights.json`](../../packages/design-system-registry/registry/typography-weights.json). |
113
+ | Style | `style` | How? | Typographic style when non-default (e.g. `italic`, `oblique`). Omit the field when style is normal. Values come from [`typography-styles.json`](../../packages/design-system-registry/registry/typography-styles.json). |
114
+ | Scale | `scaleIndex` | Which? | Numeric size scale step (e.g. `75`, `100`, `200`). Shared with other token types; not scope-restricted. |
115
+
116
+ **Default serialization order for typography tokens:**
117
+
118
+ ```
119
+ {family}-{weight}-{style}-{scaleIndex}
120
+ ```
121
+
122
+ Example: `family=sans-serif` + `weight=bold` → `sans-serif-bold`. `family=sans-serif` + `style=italic` + `scaleIndex=100` → `sans-serif-italic-100`.
123
+
124
+ ### Motion token taxonomy
125
+
126
+ Motion tokens describe timing, easing, and animation role for UI animation. Their name objects use `scope: "motion"` fields alongside the universal `property` field.
127
+
128
+ **NOTE:** No motion tokens exist in the foundation dataset at the time of this writing. This taxonomy is normative but the registry values for `motionRole` and `easing` are provisional — they will be refined when motion tokens are added to the foundation. Validators emit SPEC-043 at warning severity so provisional tokens are not blocked.
129
+
130
+ **NORMATIVE:** Motion tokens SHOULD include `motionRole` or `easing`. Tokens missing both are flagged by rule SPEC-043 (`domain-required-fields`, warning).
131
+
132
+ | Category | Name object field | Answers | Description |
133
+ | ----------- | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
134
+ | Motion Role | `motionRole` | What? | Semantic role of the animation (e.g. `enter`, `exit`, `transition`, `emphasis`). Values come from [`motion-roles.json`](../../packages/design-system-registry/registry/motion-roles.json). |
135
+ | Easing | `easing` | How? | Easing curve identifier (e.g. `ease-in`, `ease-out`, `standard`). Values come from [`easing-curves.json`](../../packages/design-system-registry/registry/easing-curves.json). |
136
+ | Duration | `scaleIndex` | Which? | Numeric duration bucket index (e.g. `100` for 100ms, `200` for 200ms). Shared with other token types; not scope-restricted. |
137
+
138
+ **Default serialization order for motion tokens:**
139
+
140
+ ```
141
+ {motionRole}-{easing}-{scaleIndex}
142
+ ```
143
+
144
+ Example: `motionRole=enter` + `easing=ease-out` → `enter-ease-out`. `motionRole=transition` + `scaleIndex=100` → `transition-100`.
81
145
 
82
146
  ### Structure vs. component — when does the line move?
83
147
 
@@ -177,7 +241,7 @@ The taxonomy and terms are built to scale as new concepts and terms are identifi
177
241
 
178
242
  * New concept categories **MAY** be added by creating a new field declaration file in the field catalog — no spec version change is required for the mechanism itself.
179
243
  * New terms **MAY** be added to the vocabulary registry without spec version changes.
180
- * New token type taxonomies (beyond semantic/layout) **MAY** be defined in future spec versions.
244
+ * New token type taxonomies **MAY** be added by creating scoped field declarations (non-null `scope`) and a corresponding registry section in taxonomy.md. Color, typography, and motion taxonomies are defined above.
181
245
  * Platform manifests **MAY** extend the vocabulary with platform-specific terms and formatting.
182
246
 
183
247
  ## References
@@ -51,6 +51,10 @@ Fields are divided into **semantic fields** (identity, structure, intent) and **
51
51
 
52
52
  #### Semantic fields
53
53
 
54
+ The table below lists all semantic fields. Fields marked with a scope are domain-restricted — see [Taxonomy — Token-type taxonomies](taxonomy.md#token-type-taxonomies) for the normative per-domain field rules and serialization orders. Validators enforce scope restrictions via rule SPEC-042.
55
+
56
+ **Universal semantic fields** (`scope: null` — apply to all token types):
57
+
54
58
  | Field | Status | Taxonomy category | Description |
55
59
  | -------------- | -------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
56
60
  | `property` | REQUIRED | Property | The stylistic attribute being defined (e.g. `color`, `width`, `padding`, `gap`). |
@@ -66,6 +70,18 @@ Fields are divided into **semantic fields** (identity, structure, intent) and **
66
70
  | `size` | OPTIONAL | Size | Relative t-shirt sizing for relationships across tokens (e.g. `small`, `medium`, `large`). |
67
71
  | `density` | OPTIONAL | Density | Space within or around component parts (e.g. `spacious`, `compact`). |
68
72
  | `shape` | OPTIONAL | Shape | Relative to overall component shape (e.g. `uniform`). |
73
+ | `scaleIndex` | OPTIONAL | — | Numeric scale index appended at the end of the serialized name (e.g. `100`, `200`, `900`). Used by color palette, spacing, font-size, and motion duration tokens. |
74
+
75
+ **Domain-scoped semantic fields** (only valid on the indicated token type):
76
+
77
+ | Field | Status | Scope | Description |
78
+ | ------------- | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
79
+ | `colorFamily` | OPTIONAL | `color` | Hue family of the color (e.g. `blue`, `gray`, `cyan`). See [Taxonomy — Color token taxonomy](taxonomy.md#color-token-taxonomy). |
80
+ | `family` | OPTIONAL | `typography` | Type family (e.g. `sans-serif`, `serif`, `cjk`, `code`). See [Taxonomy — Typography token taxonomy](taxonomy.md#typography-token-taxonomy). |
81
+ | `weight` | OPTIONAL | `typography` | Typographic weight (e.g. `regular`, `bold`, `light`). See [Taxonomy — Typography token taxonomy](taxonomy.md#typography-token-taxonomy). |
82
+ | `style` | OPTIONAL | `typography` | Typographic style when non-default (e.g. `italic`). See [Taxonomy — Typography token taxonomy](taxonomy.md#typography-token-taxonomy). |
83
+ | `motionRole` | OPTIONAL | `motion` | Semantic animation role (e.g. `enter`, `exit`, `transition`). See [Taxonomy — Motion token taxonomy](taxonomy.md#motion-token-taxonomy). |
84
+ | `easing` | OPTIONAL | `motion` | Easing curve identifier (e.g. `ease-out`, `standard`). See [Taxonomy — Motion token taxonomy](taxonomy.md#motion-token-taxonomy). |
69
85
 
70
86
  #### Mode-set fields
71
87