@visitwonders/assembly 0.14.0 → 0.16.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 (34) hide show
  1. package/README.md +8 -0
  2. package/declarations/overlay/drawer.d.ts +11 -0
  3. package/declarations/overlay/drawer.d.ts.map +1 -1
  4. package/dist/_app_/data/pagination-cluster.js +1 -0
  5. package/dist/_app_/data/pagination.js +1 -0
  6. package/dist/action/button.css +30 -19
  7. package/dist/data/index.js +1 -0
  8. package/dist/data/index.js.map +1 -1
  9. package/dist/data/pagination-cluster.js +106 -0
  10. package/dist/data/pagination-cluster.js.map +1 -0
  11. package/dist/data/pagination.css +216 -0
  12. package/dist/data/pagination.js +287 -0
  13. package/dist/data/pagination.js.map +1 -0
  14. package/dist/form/calendar.css +6 -6
  15. package/dist/form/checkbox.css +25 -24
  16. package/dist/form/date-range-picker.css +1 -1
  17. package/dist/form/input.css +16 -15
  18. package/dist/form/multi-combobox.css +2 -2
  19. package/dist/form/multi-select.css +2 -2
  20. package/dist/form/radio.css +19 -16
  21. package/dist/form/toggle.css +4 -2
  22. package/dist/overlay/drawer.js +13 -4
  23. package/dist/status/tag.css +2 -2
  24. package/dist/styles/semantic/colors.css +31 -5
  25. package/dist/styles/semantic/component.css +154 -0
  26. package/dist/styles/semantic/effects.css +9 -3
  27. package/dist/styles/semantic/typography.css +60 -0
  28. package/dist/styles/tokens.css +3 -0
  29. package/dist/styles.css +258 -8
  30. package/dist/typography/{heading-css-726c4c3109f2b741657733e1ba103c67.css → heading-css-eca8b0ae619f69fcbe9535f4700db421.css} +35 -3
  31. package/dist/typography/heading.js +34 -39
  32. package/dist/typography/{text-css-935f55e9cd74b06a5ce61330c4c79ef9.css → text-css-a4c06f76a813db6b613c4f3c22e6bb85.css} +23 -9
  33. package/dist/typography/text.js +1 -1
  34. package/package.json +6 -6
@@ -32,9 +32,9 @@
32
32
  display: flex;
33
33
  align-items: center;
34
34
  justify-content: center;
35
- border: var(--border-width-1) solid var(--color-border-control);
35
+ border: var(--border-width-1) solid var(--color-input-border-default);
36
36
  border-radius: var(--radius-round);
37
- background-color: var(--color-bg-surface);
37
+ background-color: var(--color-input-bg-default);
38
38
  transition: all var(--transition-fast);
39
39
  }
40
40
 
@@ -65,43 +65,46 @@
65
65
 
66
66
  /* Hover */
67
67
  .radio-label-wrapper_e6dda4f5d:hover .radio-control_e6dda4f5d {
68
- border-color: var(--color-border-control-hover);
68
+ border-color: var(--color-input-border-hover);
69
69
  }
70
70
 
71
71
  .radio-wrapper_e6dda4f5d[data-disabled="true"] .radio-label-wrapper_e6dda4f5d:hover .radio-control_e6dda4f5d {
72
- border-color: var(--color-border-control-disabled);
72
+ border-color: var(--color-input-border-disabled);
73
73
  }
74
74
 
75
75
  /* Focus */
76
76
  .radio-input_e6dda4f5d:focus-visible + .radio-control_e6dda4f5d {
77
- border-color: var(--color-border-focus);
77
+ border-color: var(--color-input-border-focus);
78
78
  box-shadow: var(--focus-ring);
79
79
  }
80
80
 
81
- /* Checked */
81
+ /* Checked — anchored to the shared `--color-bg-control-checked`
82
+ token, in line with the other selected-state controls. Folded
83
+ the pre-existing radio debt that pinned the dot to
84
+ `--color-border-focus` and `--color-text-link-hover`. */
82
85
  .radio-input_e6dda4f5d:checked + .radio-control_e6dda4f5d {
83
- border-color: var(--color-border-focus);
86
+ border-color: var(--color-input-checked-border);
84
87
  }
85
88
 
86
89
  .radio-input_e6dda4f5d:checked + .radio-control_e6dda4f5d .radio-dot_e6dda4f5d {
87
- background-color: var(--color-border-focus);
90
+ background-color: var(--color-input-checked-bg);
88
91
  }
89
92
 
90
93
  .radio-label-wrapper_e6dda4f5d:hover .radio-input_e6dda4f5d:checked + .radio-control_e6dda4f5d {
91
- border-color: var(--color-text-link-hover);
94
+ border-color: var(--color-input-checked-bg-hover);
92
95
  }
93
96
 
94
97
  .radio-label-wrapper_e6dda4f5d:hover .radio-input_e6dda4f5d:checked + .radio-control_e6dda4f5d .radio-dot_e6dda4f5d {
95
- background-color: var(--color-text-link-hover);
98
+ background-color: var(--color-input-checked-bg-hover);
96
99
  }
97
100
 
98
- /* Invalid */
101
+ /* Invalid — error path goes through `--color-input-border-error`. */
99
102
  .radio-wrapper_e6dda4f5d[data-invalid="true"] .radio-control_e6dda4f5d {
100
- border-color: var(--color-border-critical);
103
+ border-color: var(--color-input-border-error);
101
104
  }
102
105
 
103
106
  .radio-wrapper_e6dda4f5d[data-invalid="true"] .radio-input_e6dda4f5d:checked + .radio-control_e6dda4f5d {
104
- border-color: var(--color-border-critical);
107
+ border-color: var(--color-input-border-error);
105
108
  }
106
109
 
107
110
  .radio-wrapper_e6dda4f5d[data-invalid="true"]
@@ -119,12 +122,12 @@
119
122
 
120
123
  /* Disabled */
121
124
  .radio-input_e6dda4f5d:disabled + .radio-control_e6dda4f5d {
122
- background-color: var(--color-bg-disabled);
123
- border-color: var(--color-border-control-disabled);
125
+ background-color: var(--color-input-bg-disabled);
126
+ border-color: var(--color-input-border-disabled);
124
127
  }
125
128
 
126
129
  .radio-input_e6dda4f5d:disabled:checked + .radio-control_e6dda4f5d .radio-dot_e6dda4f5d {
127
- background-color: var(--color-text-disabled);
130
+ background-color: var(--color-input-text-disabled);
128
131
  }
129
132
 
130
133
  /* Label */
@@ -108,9 +108,11 @@
108
108
  transform: scale(0.95);
109
109
  }
110
110
 
111
- /* Checked state - track */
111
+ /* Checked state - track (default tone). Sentiment variants below
112
+ intentionally bypass `--color-bg-control-checked` to expose the
113
+ sentiment-specific fill — architect-confirmed override. */
112
114
  .track_eb612ecfd.checked_eb612ecfd {
113
- background-color: var(--color-bg-fill-accent);
115
+ background-color: var(--color-bg-control-checked);
114
116
  }
115
117
 
116
118
  /* Checked + hover */
@@ -34,7 +34,7 @@ class DrawerHeader extends Component {
34
34
  }
35
35
  handleClose = event => {
36
36
  event.preventDefault();
37
- void this.ctx.closeDrawer();
37
+ this.ctx.requestDismiss();
38
38
  };
39
39
  static {
40
40
  setComponentTemplate(precompileTemplate("<div class=\"drawer-header_e20b0b74f\" data-test-drawer-header ...attributes>\n <div id={{this.ctx.titleId}} class=\"drawer-title_e20b0b74f\">\n {{yield}}\n </div>\n {{#if this.isCloseButtonVisible}}\n <button type=\"button\" class=\"drawer-header-close_e20b0b74f\" aria-label=\"Close\" {{on \"click\" this.handleClose}} data-test-drawer-header-close>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n {{/if}}\n</div>", {
@@ -165,8 +165,16 @@ class Drawer extends Component {
165
165
  }
166
166
  handleBackdropClose = () => {
167
167
  if (this.closeOnBackdropClick) {
168
- void this.closeDrawer();
168
+ this.requestDismiss();
169
+ }
170
+ };
171
+ requestDismiss = () => {
172
+ if (this.args.preventClose) return;
173
+ if (this.args.onDismiss) {
174
+ this.args.onDismiss(this.closeDrawer);
175
+ return;
169
176
  }
177
+ void this.closeDrawer();
170
178
  };
171
179
  // ============================================================================
172
180
  // Modifiers
@@ -214,7 +222,7 @@ class Drawer extends Component {
214
222
  if (event.key === 'Escape' && this.closeOnEscape) {
215
223
  event.preventDefault();
216
224
  event.stopPropagation();
217
- void this.closeDrawer();
225
+ this.requestDismiss();
218
226
  return;
219
227
  }
220
228
  // Focus trap (only when blanket is shown)
@@ -281,7 +289,8 @@ class Drawer extends Component {
281
289
  return {
282
290
  isOpen: this.isOpen,
283
291
  titleId: this.titleId,
284
- closeDrawer: this.closeDrawer
292
+ closeDrawer: this.closeDrawer,
293
+ requestDismiss: this.requestDismiss
285
294
  };
286
295
  }
287
296
  // ============================================================================
@@ -54,7 +54,7 @@ button.e873402ac.tag-content_e873402ac,a.e873402ac.tag-content_e873402ac {
54
54
 
55
55
  button.e873402ac.tag-content_e873402ac:focus-visible,a.e873402ac.tag-content_e873402ac:focus-visible {
56
56
  outline: none;
57
- box-shadow: inset 0 0 0 2px var(--color-focus-ring-halo);
57
+ box-shadow: inset 0 0 0 2px var(--color-focus-ring-outer);
58
58
  }
59
59
 
60
60
  /* ===================================
@@ -337,7 +337,7 @@ button.e873402ac.tag-content_e873402ac:focus-visible,a.e873402ac.tag-content_e87
337
337
  .tag-remove_e873402ac:focus-visible {
338
338
  outline: none;
339
339
  opacity: 1;
340
- box-shadow: 0 0 0 2px var(--color-focus-ring-halo);
340
+ box-shadow: 0 0 0 2px var(--color-focus-ring-outer);
341
341
  }
342
342
 
343
343
  .tag-remove_e873402ac:disabled {
@@ -17,6 +17,15 @@
17
17
  --color-bg-inverse: var(--gray-900); /* Dark background for contrast */
18
18
  --color-bg-disabled: var(--gray-100); /* Disabled backgrounds */
19
19
 
20
+ /* Status Surfaces — for panels, banners, callouts, toasts.
21
+ Distinct from `bg-{semantic}-subtle` (tinted hover/badge backgrounds)
22
+ and `bg-fill-{semantic}` (solid status fills). Surface tier sits at
23
+ the same level as `bg-surface` but carries status sentiment. */
24
+ --color-bg-surface-success: var(--green-50);
25
+ --color-bg-surface-warning: var(--amber-50);
26
+ --color-bg-surface-critical: var(--red-50);
27
+ --color-bg-surface-info: var(--cyan-50);
28
+
20
29
  /* Hover States */
21
30
  --color-bg-hover-subtle: var(--gray-50);
22
31
 
@@ -33,13 +42,19 @@
33
42
  --color-bg-fill-interactive-selected: var(--gray-175);
34
43
  --color-bg-fill-interactive-disabled: var(--gray-50);
35
44
 
36
- /* Accent Fill (Selected controls — checkboxes, toggles, radios) */
45
+ /* Accent Fill (Selected controls — checkboxes, toggles, radios,
46
+ calendar selected day, multi-select chips, date-range fill) */
37
47
  --color-bg-fill-accent: var(--indigo-500);
38
48
  --color-bg-fill-accent-hover: var(--indigo-600);
39
49
  --color-bg-fill-accent-active: var(--indigo-700);
40
50
  --color-bg-fill-accent-disabled: var(--indigo-300);
41
51
 
42
- /* Secondary Fill */
52
+ /* Accent Fill — Subtle (tinted accent backgrounds, e.g. table row
53
+ selected). Sits in the same range as the other `*-subtle` tints. */
54
+ --color-bg-fill-accent-subtle: var(--indigo-50);
55
+ --color-bg-fill-accent-subtle-hover: var(--indigo-100);
56
+
57
+ /* reserved — no consumers yet, validate value when first used */
43
58
  --color-bg-fill-secondary: var(--cyan-600);
44
59
  --color-bg-fill-secondary-hover: var(--cyan-700);
45
60
  --color-bg-fill-secondary-active: var(--cyan-800);
@@ -135,6 +150,15 @@
135
150
  --color-border-control-active: var(--gray-500);
136
151
  --color-border-control-disabled: var(--gray-300);
137
152
  --color-border-control-readonly: var(--gray-300);
153
+ /* Aliased to `--color-border-critical` so consumers reach for the
154
+ error-state intent rather than the raw critical token. */
155
+ --color-border-control-error: var(--color-border-critical);
156
+
157
+ /* Control Fill — Checked (selected affordance for checkbox, toggle,
158
+ radio, multi-select, multi-combobox, calendar selected day,
159
+ date-range range fill). Aliased to `--color-bg-fill-accent` so all
160
+ "checked/selected" controls share one anchor. */
161
+ --color-bg-control-checked: var(--color-bg-fill-accent);
138
162
 
139
163
  /* Brand/Primary Border */
140
164
  --color-border-primary: var(--indigo-700);
@@ -142,9 +166,11 @@
142
166
  /* Focus Border */
143
167
  --color-border-focus: var(--indigo-500);
144
168
 
145
- /* Focus Ring Halo (box-shadow glow) */
146
- --color-focus-ring-halo: var(--indigo-200);
147
- --color-focus-ring-halo-critical: var(--red-200);
169
+ /* Focus Ring two-stop composite (WCAG 2.2 non-text-contrast).
170
+ `inner` separates the ring from the focused element; `outer` carries
171
+ the ring colour. Composed in `effects.css` as `--focus-ring`. */
172
+ --color-focus-ring-inner: var(--white);
173
+ --color-focus-ring-outer: var(--indigo-500);
148
174
 
149
175
  /* Semantic Borders */
150
176
  --color-border-neutral: var(--gray-900);
@@ -0,0 +1,154 @@
1
+ /* ===================================
2
+ * Component-Tier Tokens (Layer 3)
3
+ *
4
+ * Action and Input matrices. Every cell aliases a layer-2 generic — no
5
+ * flat hex. Variants compose in component CSS (e.g. button.css picks
6
+ * which property carries the tone colour for `outline` vs `solid`).
7
+ *
8
+ * The rest of Assembly's components consume semantic tokens directly;
9
+ * only action + input have a layer-3 surface. See
10
+ * `docs/component-tokens.md` for the rationale and the cell-by-cell
11
+ * spec — this file mirrors it.
12
+ * =================================== */
13
+ :root {
14
+ /* ===================================
15
+ * Action Matrix
16
+ * Shape: --color-action-{tone}-{property}-{state}
17
+ * tones = primary | neutral | critical
18
+ * properties = bg | border | text | icon
19
+ * states = default | hover | focus | pressed | disabled
20
+ * =================================== */
21
+
22
+ /* Primary — bg */
23
+ --color-action-primary-bg-default: var(--color-bg-fill-primary);
24
+ --color-action-primary-bg-hover: var(--color-bg-fill-primary-hover);
25
+ --color-action-primary-bg-focus: var(--color-bg-fill-primary);
26
+ --color-action-primary-bg-pressed: var(--color-bg-fill-primary-active);
27
+ --color-action-primary-bg-disabled: var(--color-bg-fill-primary-disabled);
28
+
29
+ /* Primary — border */
30
+ --color-action-primary-border-default: var(--color-border-primary);
31
+ --color-action-primary-border-hover: var(--color-border-primary);
32
+ --color-action-primary-border-focus: var(--color-border-focus);
33
+ --color-action-primary-border-pressed: var(--color-border-primary);
34
+ --color-action-primary-border-disabled: var(--color-border-control-disabled);
35
+
36
+ /* Primary — text */
37
+ --color-action-primary-text-default: var(--color-text-on-primary);
38
+ --color-action-primary-text-hover: var(--color-text-on-primary);
39
+ --color-action-primary-text-focus: var(--color-text-on-primary);
40
+ --color-action-primary-text-pressed: var(--color-text-on-primary);
41
+ --color-action-primary-text-disabled: var(--color-text-disabled);
42
+
43
+ /* Primary — icon */
44
+ --color-action-primary-icon-default: var(--color-text-on-primary);
45
+ --color-action-primary-icon-hover: var(--color-text-on-primary);
46
+ --color-action-primary-icon-focus: var(--color-text-on-primary);
47
+ --color-action-primary-icon-pressed: var(--color-text-on-primary);
48
+ --color-action-primary-icon-disabled: var(--color-text-disabled);
49
+
50
+ /* Neutral — bg */
51
+ --color-action-neutral-bg-default: var(--color-bg-fill-interactive);
52
+ --color-action-neutral-bg-hover: var(--color-bg-fill-interactive-hover);
53
+ --color-action-neutral-bg-focus: var(--color-bg-fill-interactive);
54
+ --color-action-neutral-bg-pressed: var(--color-bg-fill-interactive-active);
55
+ --color-action-neutral-bg-disabled: var(--color-bg-fill-interactive-disabled);
56
+
57
+ /* Neutral — border */
58
+ --color-action-neutral-border-default: var(--color-border-control);
59
+ --color-action-neutral-border-hover: var(--color-border-control-hover);
60
+ --color-action-neutral-border-focus: var(--color-border-focus);
61
+ --color-action-neutral-border-pressed: var(--color-border-control-active);
62
+ --color-action-neutral-border-disabled: var(--color-border-control-disabled);
63
+
64
+ /* Neutral — text */
65
+ --color-action-neutral-text-default: var(--color-text);
66
+ --color-action-neutral-text-hover: var(--color-text);
67
+ --color-action-neutral-text-focus: var(--color-text);
68
+ --color-action-neutral-text-pressed: var(--color-text);
69
+ --color-action-neutral-text-disabled: var(--color-text-disabled);
70
+
71
+ /* Neutral — icon */
72
+ --color-action-neutral-icon-default: var(--color-icon);
73
+ --color-action-neutral-icon-hover: var(--color-icon-interactive-hover);
74
+ --color-action-neutral-icon-focus: var(--color-icon);
75
+ --color-action-neutral-icon-pressed: var(--color-icon);
76
+ --color-action-neutral-icon-disabled: var(--color-icon-disabled);
77
+
78
+ /* Critical — bg */
79
+ --color-action-critical-bg-default: var(--color-bg-fill-critical);
80
+ --color-action-critical-bg-hover: var(--color-bg-fill-critical-hover);
81
+ --color-action-critical-bg-focus: var(--color-bg-fill-critical);
82
+ --color-action-critical-bg-pressed: var(--color-bg-fill-critical-active);
83
+ --color-action-critical-bg-disabled: var(
84
+ --color-bg-fill-interactive-disabled
85
+ );
86
+
87
+ /* Critical — border */
88
+ --color-action-critical-border-default: var(--color-border-critical);
89
+ --color-action-critical-border-hover: var(--color-border-critical);
90
+ --color-action-critical-border-focus: var(--color-border-critical);
91
+ --color-action-critical-border-pressed: var(--color-border-critical);
92
+ --color-action-critical-border-disabled: var(--color-border-control-disabled);
93
+
94
+ /* Critical — text */
95
+ --color-action-critical-text-default: var(--color-text-on-critical);
96
+ --color-action-critical-text-hover: var(--color-text-on-critical);
97
+ --color-action-critical-text-focus: var(--color-text-on-critical);
98
+ --color-action-critical-text-pressed: var(--color-text-on-critical);
99
+ --color-action-critical-text-disabled: var(--color-text-disabled);
100
+
101
+ /* Critical — icon */
102
+ --color-action-critical-icon-default: var(--color-text-on-critical);
103
+ --color-action-critical-icon-hover: var(--color-text-on-critical);
104
+ --color-action-critical-icon-focus: var(--color-text-on-critical);
105
+ --color-action-critical-icon-pressed: var(--color-text-on-critical);
106
+ --color-action-critical-icon-disabled: var(--color-text-disabled);
107
+
108
+ /* ===================================
109
+ * Input Matrix
110
+ * Shape: --color-input-{property}-{state}
111
+ * properties = bg | border | text | icon | checked
112
+ * states = default | hover | focus | disabled | error
113
+ *
114
+ * `checked` is the selected-state affordance; it collapses the state
115
+ * axis (the "checked" affordance itself is a state). Inputs without a
116
+ * checked affordance (text inputs, textareas) ignore the `checked-*`
117
+ * cells.
118
+ * =================================== */
119
+
120
+ /* bg */
121
+ --color-input-bg-default: var(--color-bg-surface);
122
+ --color-input-bg-hover: var(--color-bg-surface);
123
+ --color-input-bg-focus: var(--color-bg-surface);
124
+ --color-input-bg-disabled: var(--color-bg-disabled);
125
+ --color-input-bg-error: var(--color-bg-surface);
126
+
127
+ /* border */
128
+ --color-input-border-default: var(--color-border-control);
129
+ --color-input-border-hover: var(--color-border-control-hover);
130
+ --color-input-border-focus: var(--color-border-focus);
131
+ --color-input-border-disabled: var(--color-border-control-disabled);
132
+ --color-input-border-error: var(--color-border-control-error);
133
+
134
+ /* text */
135
+ --color-input-text-default: var(--color-text);
136
+ --color-input-text-hover: var(--color-text);
137
+ --color-input-text-focus: var(--color-text);
138
+ --color-input-text-disabled: var(--color-text-disabled);
139
+ --color-input-text-error: var(--color-text);
140
+
141
+ /* icon */
142
+ --color-input-icon-default: var(--color-icon-secondary);
143
+ --color-input-icon-hover: var(--color-icon);
144
+ --color-input-icon-focus: var(--color-icon);
145
+ --color-input-icon-disabled: var(--color-icon-disabled);
146
+ --color-input-icon-error: var(--color-icon-critical);
147
+
148
+ /* checked (selected affordance) */
149
+ --color-input-checked-bg: var(--color-bg-control-checked);
150
+ --color-input-checked-bg-hover: var(--color-bg-fill-accent-hover);
151
+ --color-input-checked-border: var(--color-bg-control-checked);
152
+ --color-input-checked-icon: var(--color-text-on-accent);
153
+ --color-input-checked-disabled: var(--color-bg-fill-accent-disabled);
154
+ }
@@ -3,9 +3,15 @@
3
3
  --shadow-surface: var(--shadow-xs);
4
4
  --shadow-modal: var(--shadow-lg);
5
5
 
6
- /* Focus Ring */
7
- --focus-ring: 0 0 0 3px var(--color-focus-ring-halo);
8
- --focus-ring-critical: 0 0 0 3px var(--color-focus-ring-halo-critical);
6
+ /* Focus Ring — two-stop composite. Inner stop separates the ring from
7
+ the focused surface; outer stop carries the ring colour. Meets WCAG
8
+ 2.2 non-text-contrast on light + dark surfaces. */
9
+ --focus-ring:
10
+ 0 0 0 2px var(--color-focus-ring-inner),
11
+ 0 0 0 4px var(--color-focus-ring-outer);
12
+ --focus-ring-critical:
13
+ 0 0 0 2px var(--color-focus-ring-inner),
14
+ 0 0 0 4px var(--color-border-critical);
9
15
 
10
16
  /* Z-Index Semantic Layers */
11
17
  --z-dropdown: var(--z-100);
@@ -29,4 +29,64 @@
29
29
  --letter-spacing-tight: -0.025em;
30
30
  --letter-spacing-normal: 0;
31
31
  --letter-spacing-wide: 0.025em;
32
+
33
+ /* ===================================
34
+ * Typography Roles — Bundled Sub-tokens
35
+ *
36
+ * Role names (display | page | section | subsection for headings;
37
+ * sm | md | lg for body) survive a redesign that re-scales the type
38
+ * ramp. Components consume the four sub-tokens (size, weight, leading,
39
+ * tracking) per role rather than composing atomic font-size +
40
+ * line-height + weight per call site. Sub-tokens not `font:`
41
+ * shorthand — shorthand resets font-stretch/variant and cannot carry
42
+ * letter-spacing.
43
+ *
44
+ * Heading mapping (locked, see WON-580):
45
+ * level=1 → page (default page title)
46
+ * level=2 → section (first-level section header)
47
+ * level=3-6 → subsection (size step-down via @size override)
48
+ * `display` is an opt-in @size — never a level default.
49
+ * =================================== */
50
+
51
+ /* Heading — Display (opt-in via @size="display") */
52
+ --typography-heading-display-size: var(--font-size-5xl); /* 30px */
53
+ --typography-heading-display-weight: var(--font-weight-medium);
54
+ --typography-heading-display-leading: var(--line-height-36);
55
+ --typography-heading-display-tracking: var(--letter-spacing-tight);
56
+
57
+ /* Heading — Page (level=1 default) */
58
+ --typography-heading-page-size: var(--font-size-4xl); /* 24px */
59
+ --typography-heading-page-weight: var(--font-weight-medium);
60
+ --typography-heading-page-leading: var(--line-height-28);
61
+ --typography-heading-page-tracking: var(--letter-spacing-tight);
62
+
63
+ /* Heading — Section (level=2 default) */
64
+ --typography-heading-section-size: var(--font-size-3xl); /* 20px */
65
+ --typography-heading-section-weight: var(--font-weight-medium);
66
+ --typography-heading-section-leading: var(--line-height-24);
67
+ --typography-heading-section-tracking: var(--letter-spacing-normal);
68
+
69
+ /* Heading — Subsection (level=3 default; 4-6 step down via @size) */
70
+ --typography-heading-subsection-size: var(--font-size-2xl); /* 18px */
71
+ --typography-heading-subsection-weight: var(--font-weight-medium);
72
+ --typography-heading-subsection-leading: var(--line-height-24);
73
+ --typography-heading-subsection-tracking: var(--letter-spacing-normal);
74
+
75
+ /* Body — Small (captions, dense table cells, helper text) */
76
+ --typography-body-sm-size: var(--font-size-sm); /* 12px */
77
+ --typography-body-sm-weight: var(--font-weight-regular);
78
+ --typography-body-sm-leading: var(--line-height-tight); /* 16px */
79
+ --typography-body-sm-tracking: var(--letter-spacing-normal);
80
+
81
+ /* Body — Medium (default body text) */
82
+ --typography-body-md-size: var(--font-size-md); /* 13px */
83
+ --typography-body-md-weight: var(--font-weight-regular);
84
+ --typography-body-md-leading: var(--line-height-normal); /* 20px */
85
+ --typography-body-md-tracking: var(--letter-spacing-normal);
86
+
87
+ /* Body — Large (lead paragraphs, emphasized body) */
88
+ --typography-body-lg-size: var(--font-size-lg); /* 14px */
89
+ --typography-body-lg-weight: var(--font-weight-regular);
90
+ --typography-body-lg-leading: var(--line-height-normal); /* 20px */
91
+ --typography-body-lg-tracking: var(--letter-spacing-normal);
32
92
  }
@@ -21,6 +21,9 @@
21
21
  @import url("./semantic/effects.css");
22
22
  @import url("./semantic/motion.css");
23
23
 
24
+ /* Component-tier tokens (Action + Input matrices only) */
25
+ @import url("./semantic/component.css");
26
+
24
27
  /* Base styles */
25
28
  @import url("./base/typography.css");
26
29