@adia-ai/web-components 0.7.3 → 0.7.4

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 (136) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/components/accordion/accordion.css +2 -2
  3. package/components/action-list/action-list.css +2 -2
  4. package/components/agent-artifact/agent-artifact.css +31 -31
  5. package/components/agent-feedback-bar/agent-feedback-bar.css +10 -10
  6. package/components/agent-questions/agent-questions.css +59 -57
  7. package/components/agent-reasoning/agent-reasoning.css +54 -54
  8. package/components/agent-suggestions/agent-suggestions.css +4 -4
  9. package/components/agent-trace/agent-trace.css +53 -53
  10. package/components/alert/alert.css +53 -53
  11. package/components/avatar/avatar.css +27 -27
  12. package/components/badge/badge.css +56 -53
  13. package/components/block/block.css +16 -16
  14. package/components/blockquote/blockquote.css +16 -16
  15. package/components/breadcrumb/breadcrumb.css +23 -23
  16. package/components/button/button.css +99 -100
  17. package/components/calendar-grid/calendar-grid.css +95 -92
  18. package/components/calendar-picker/calendar-picker.css +141 -139
  19. package/components/canvas/canvas.css +12 -12
  20. package/components/card/card.css +83 -83
  21. package/components/chart/chart.css +218 -218
  22. package/components/chart-legend/chart-legend.css +26 -26
  23. package/components/check/check.css +40 -40
  24. package/components/code/code.css +125 -125
  25. package/components/col/col.css +15 -15
  26. package/components/color-picker/color-picker.css +55 -55
  27. package/components/combobox/combobox.css +64 -62
  28. package/components/command/command.css +91 -91
  29. package/components/context-menu/context-menu.css +1 -1
  30. package/components/date-range-picker/date-range-picker.css +59 -59
  31. package/components/datetime-picker/datetime-picker.css +25 -25
  32. package/components/demo-toggle/demo-toggle.css +27 -27
  33. package/components/description-list/description-list.css +18 -18
  34. package/components/divider/divider.css +24 -24
  35. package/components/embed/embed.css +6 -6
  36. package/components/empty-state/empty-state.css +29 -29
  37. package/components/feed/feed.css +12 -12
  38. package/components/field/field.css +28 -28
  39. package/components/field/field.test.js +2 -2
  40. package/components/fields/fields.css +5 -5
  41. package/components/grid/grid.a2ui.json +10 -0
  42. package/components/grid/grid.css +23 -5
  43. package/components/grid/grid.d.ts +4 -0
  44. package/components/grid/grid.yaml +13 -0
  45. package/components/heatmap/heatmap.css +61 -61
  46. package/components/icon/icon.css +12 -12
  47. package/components/image/image.css +14 -14
  48. package/components/inline-edit/inline-edit.css +16 -16
  49. package/components/inline-message/inline-message.css +16 -16
  50. package/components/input/input.css +69 -66
  51. package/components/inspector/inspector.css +6 -6
  52. package/components/integration-card/integration-card.css +41 -41
  53. package/components/integration-card/integration-card.test.js +4 -4
  54. package/components/kbd/kbd.css +47 -40
  55. package/components/link/link.css +12 -12
  56. package/components/list/list.css +8 -8
  57. package/components/list-window/list-window.css +10 -10
  58. package/components/loading-overlay/loading-overlay.css +17 -18
  59. package/components/loading-overlay/loading-overlay.test.js +8 -8
  60. package/components/mark/mark.css +16 -16
  61. package/components/menu/menu.css +9 -9
  62. package/components/modal/modal.class.js +5 -9
  63. package/components/modal/modal.css +43 -43
  64. package/components/nav/nav.css +40 -40
  65. package/components/nav-group/nav-group.css +54 -54
  66. package/components/nav-item/nav-item.css +44 -44
  67. package/components/noodles/noodles.css +31 -31
  68. package/components/number-format/number-format.css +4 -4
  69. package/components/option-card/option-card.css +70 -70
  70. package/components/otp-input/otp-input.css +29 -29
  71. package/components/page/page.a2ui.json +1 -1
  72. package/components/page/page.css +27 -27
  73. package/components/page/page.d.ts +1 -1
  74. package/components/page/page.yaml +1 -1
  75. package/components/pagination/pagination.css +6 -6
  76. package/components/pane/pane.css +57 -57
  77. package/components/password-strength/password-strength.css +32 -32
  78. package/components/pipeline-status/pipeline-status.css +67 -67
  79. package/components/popover/popover.css +11 -11
  80. package/components/preview/preview.css +21 -21
  81. package/components/progress/progress.css +23 -23
  82. package/components/progress-row/progress-row.css +17 -17
  83. package/components/qr-code/qr-code.css +4 -4
  84. package/components/radio/radio.css +39 -39
  85. package/components/range/range.css +58 -55
  86. package/components/rating/rating.css +28 -28
  87. package/components/relative-time/relative-time.css +6 -6
  88. package/components/richtext/richtext.css +133 -133
  89. package/components/row/row.css +19 -19
  90. package/components/search/search.css +5 -5
  91. package/components/segment/segment.css +29 -24
  92. package/components/segmented/segmented.css +30 -25
  93. package/components/select/select.css +95 -93
  94. package/components/skeleton/skeleton.css +14 -14
  95. package/components/skip-nav/skip-nav.css +4 -4
  96. package/components/slider/slider.css +61 -61
  97. package/components/spinner/spinner.css +40 -40
  98. package/components/spinner/spinner.test.js +10 -12
  99. package/components/stack/stack.css +11 -11
  100. package/components/stat/stat.css +27 -27
  101. package/components/step-progress/step-progress.css +20 -20
  102. package/components/stepper/stepper.css +29 -29
  103. package/components/stream/stream.css +12 -12
  104. package/components/swatch/swatch.css +68 -68
  105. package/components/swiper/swiper.class.js +5 -12
  106. package/components/swiper/swiper.css +57 -57
  107. package/components/switch/switch.css +53 -53
  108. package/components/table/table.css +166 -163
  109. package/components/table-toolbar/table-toolbar.css +33 -33
  110. package/components/tabs/tabs.css +54 -51
  111. package/components/tag/tag.css +74 -71
  112. package/components/tag/tag.test.js +14 -14
  113. package/components/tags-input/tags-input.css +51 -49
  114. package/components/text/text.css +44 -44
  115. package/components/textarea/textarea.css +49 -46
  116. package/components/time-picker/time-picker.css +47 -47
  117. package/components/timeline/timeline.css +54 -54
  118. package/components/toast/toast.css +58 -58
  119. package/components/toc/toc.css +28 -28
  120. package/components/toggle-group/toggle-group.css +9 -6
  121. package/components/toggle-scheme/toggle-scheme.css +2 -2
  122. package/components/toolbar/toolbar.css +18 -18
  123. package/components/tooltip/tooltip.css +2 -2
  124. package/components/tour/tour.css +4 -4
  125. package/components/tree/tree.css +37 -37
  126. package/components/upload/upload.css +49 -49
  127. package/dist/host.min.css +1 -0
  128. package/dist/web-components.min.css +1 -1
  129. package/dist/web-components.min.js +2 -2
  130. package/package.json +1 -1
  131. package/styles/foundation/space.css +19 -18
  132. package/styles/host.css +48 -0
  133. package/styles/prose.css +187 -173
  134. package/styles/type/scale.css +6 -0
  135. package/styles/typography.css +10 -5
  136. package/styles/verse.css +122 -0
@@ -1,7 +1,7 @@
1
1
  @scope (skip-nav-ui) {
2
2
  :where(:scope) {
3
- --skip-nav-bg-default: var(--a-accent-bg);
4
- --skip-nav-fg-default: var(--a-accent-fg);
3
+ --skip-nav-bg: var(--a-accent-bg);
4
+ --skip-nav-fg: var(--a-accent-fg);
5
5
  }
6
6
 
7
7
  /* Host renders nothing in flow — pure behavioral wrapper. The inner
@@ -28,8 +28,8 @@
28
28
  border: 0;
29
29
  /* Visible-state colors set here so the focus rule doesn't have to
30
30
  re-set them; UA's default <a> color is overridden either way. */
31
- background: var(--skip-nav-bg, var(--skip-nav-bg-default));
32
- color: var(--skip-nav-fg, var(--skip-nav-fg-default));
31
+ background: var(--skip-nav-bg);
32
+ color: var(--skip-nav-fg);
33
33
  text-decoration: none;
34
34
  border-radius: var(--a-radius-md);
35
35
  font-weight: var(--a-weight-medium);
@@ -7,8 +7,8 @@
7
7
  Variables
8
8
  W = track width (100% of the track element)
9
9
  t = thumb width (full outer width including internal padding)
10
- h = track height (var(--slider-track-height, var(--slider-track-height-default)))
11
- pad = internal padding on the thumb (var(--slider-thumb-padding, var(--slider-thumb-padding-default)))
10
+ h = track height (var(--slider-track-height))
11
+ pad = internal padding on the thumb (var(--slider-thumb-padding))
12
12
  p = progress (0.0 → 1.0, written by JS as --slider-pct)
13
13
 
14
14
  The thumb consists of two layers:
@@ -44,8 +44,8 @@
44
44
  In CSS (percentages relative to W):
45
45
 
46
46
  left = calc(t/2 + p · (W − t))
47
- = calc(var(--slider-thumb-width, var(--slider-thumb-width-default)) / 2
48
- + var(--slider-pct, var(--slider-pct-default)) * (100% - var(--slider-thumb-width, var(--slider-thumb-width-default))))
47
+ = calc(var(--slider-thumb-width) / 2
48
+ + var(--slider-pct) * (100% - var(--slider-thumb-width)))
49
49
 
50
50
  The element is shifted back by 50% via transform so its
51
51
  geometric center lands on the computed point.
@@ -60,54 +60,54 @@
60
60
  ═══════════════════════════════════════════════════════════════ */
61
61
 
62
62
  /* ── Layout ── */
63
- --slider-gap-default: var(--a-space-1);
64
- --slider-readout-gap-default: var(--a-space-0-5);
65
- --slider-radius-default: var(--a-radius-full);
63
+ --slider-gap: var(--a-space-1);
64
+ --slider-readout-gap: var(--a-space-0-5);
65
+ --slider-radius: var(--a-radius-full);
66
66
 
67
67
  /* Track height scales with the universal [size] attribute
68
68
  via --a-toggle-size: 16 sm / 20 md / 24 lg at density=1.
69
69
  Override --slider-track-height directly for custom sizes. */
70
- --slider-track-height-default: var(--a-toggle-size);
70
+ --slider-track-height: var(--a-toggle-size);
71
71
 
72
72
  /* Thumb padding: internal breathing room on all sides.
73
73
  The visual pill sits pad px away from the container edge. */
74
- --slider-thumb-padding-default: 2px;
74
+ --slider-thumb-padding: 2px;
75
75
 
76
76
  /* Visual thumb height: track height minus top and bottom padding. */
77
- --slider-thumb-visual-h-default: calc(var(--slider-track-height, var(--slider-track-height-default)) - 2 * var(--slider-thumb-padding, var(--slider-thumb-padding-default)));
77
+ --slider-thumb-visual-h: calc(var(--slider-track-height) - 2 * var(--slider-thumb-padding));
78
78
 
79
79
  /* Visual thumb width: 2×1 pill ratio. */
80
- --slider-thumb-visual-w-default: calc(var(--slider-thumb-visual-h, var(--slider-thumb-visual-h-default)) * 2);
80
+ --slider-thumb-visual-w: calc(var(--slider-thumb-visual-h) * 2);
81
81
 
82
82
  /* Container / geometry thumb width: visual width plus left and
83
83
  right padding. This is the width used in the travel equation. */
84
- --slider-thumb-width-default: calc(var(--slider-thumb-visual-w, var(--slider-thumb-visual-w-default)) + 2 * var(--slider-thumb-padding, var(--slider-thumb-padding-default)));
84
+ --slider-thumb-width: calc(var(--slider-thumb-visual-w) + 2 * var(--slider-thumb-padding));
85
85
 
86
86
  /* Progress fraction (0.0 → 1.0) written by JS. */
87
- --slider-pct-default: 0;
87
+ --slider-pct: 0;
88
88
 
89
89
  /* Dual-thumb progress fractions (0.0 → 1.0) written by JS when [dual]. */
90
- --slider-pct-lower-default: 0;
91
- --slider-pct-upper-default: 1;
90
+ --slider-pct-lower: 0;
91
+ --slider-pct-upper: 1;
92
92
 
93
93
  /* ── Colors ──
94
94
  Track: dim recessed surface | Fill: primary | Thumb: white chrome */
95
- --slider-track-bg-default: var(--a-bg-muted);
96
- --slider-fill-bg-default: var(--a-primary-bg);
97
- --slider-thumb-bg-default: var(--a-chrome-light);
98
- --slider-fill-bg-disabled-default: var(--a-canvas-1-scrim);
99
- --slider-thumb-bg-disabled-default: var(--a-canvas-2-scrim);
95
+ --slider-track-bg: var(--a-bg-muted);
96
+ --slider-fill-bg: var(--a-primary-bg);
97
+ --slider-thumb-bg: var(--a-chrome-light);
98
+ --slider-fill-bg-disabled: var(--a-canvas-1-scrim);
99
+ --slider-thumb-bg-disabled: var(--a-canvas-2-scrim);
100
100
 
101
101
  /* ── Typography ── */
102
- --slider-font-size-default: var(--a-ui-size);
103
- --slider-value-weight-default: var(--a-weight-bold);
102
+ --slider-font-size: var(--a-ui-size);
103
+ --slider-value-weight: var(--a-weight-bold);
104
104
 
105
105
  /* ── Transition ── */
106
- --slider-duration-default: var(--a-duration-fast);
107
- --slider-easing-default: var(--a-easing);
106
+ --slider-duration: var(--a-duration-fast);
107
+ --slider-easing: var(--a-easing);
108
108
 
109
109
  /* ── Focus ── */
110
- --slider-focus-ring-default: var(--a-focus-ring);
110
+ --slider-focus-ring: var(--a-focus-ring);
111
111
  text-align: start; /* §text-align-reset — blocks inheritance from centered ancestors */
112
112
  }
113
113
 
@@ -116,7 +116,7 @@
116
116
  box-sizing: border-box;
117
117
  display: flex;
118
118
  flex-direction: column;
119
- gap: var(--slider-gap, var(--slider-gap-default));
119
+ gap: var(--slider-gap);
120
120
  }
121
121
 
122
122
  :scope[data-direction="row"] {
@@ -130,7 +130,7 @@
130
130
  display: flex;
131
131
  align-items: baseline;
132
132
  justify-content: space-between;
133
- font-size: var(--slider-font-size, var(--slider-font-size-default));
133
+ font-size: var(--slider-font-size);
134
134
  }
135
135
 
136
136
  [slot="label"] {
@@ -140,12 +140,12 @@
140
140
  [slot="readout"] {
141
141
  display: flex;
142
142
  align-items: baseline;
143
- gap: var(--slider-readout-gap, var(--slider-readout-gap-default));
143
+ gap: var(--slider-readout-gap);
144
144
  }
145
145
 
146
146
  [slot="value"] {
147
147
  color: var(--a-fg);
148
- font-weight: var(--slider-value-weight, var(--slider-value-weight-default));
148
+ font-weight: var(--slider-value-weight);
149
149
  font-variant-numeric: tabular-nums;
150
150
  }
151
151
 
@@ -156,9 +156,9 @@
156
156
  /* Track: the reference frame W for all geometry calculations. */
157
157
  [slot="track"] {
158
158
  position: relative;
159
- height: var(--slider-track-height, var(--slider-track-height-default));
160
- border-radius: var(--slider-radius, var(--slider-radius-default));
161
- background: var(--slider-track-bg, var(--slider-track-bg-default));
159
+ height: var(--slider-track-height);
160
+ border-radius: var(--slider-radius);
161
+ background: var(--slider-track-bg);
162
162
  cursor: pointer;
163
163
  touch-action: none;
164
164
  }
@@ -170,10 +170,10 @@
170
170
  left: 0;
171
171
  height: 100%;
172
172
  border-radius: inherit;
173
- background: var(--slider-fill-bg, var(--slider-fill-bg-default));
173
+ background: var(--slider-fill-bg);
174
174
  pointer-events: none;
175
- width: calc(var(--slider-thumb-width, var(--slider-thumb-width-default))
176
- + var(--slider-pct, var(--slider-pct-default)) * (100% - var(--slider-thumb-width, var(--slider-thumb-width-default))));
175
+ width: calc(var(--slider-thumb-width)
176
+ + var(--slider-pct) * (100% - var(--slider-thumb-width)));
177
177
  }
178
178
 
179
179
  /* Dual-thumb geometry: each thumb has an EFFECTIVE travel of (W − 2t),
@@ -205,12 +205,12 @@
205
205
  fill_width = 72 + 0.6·644 = 458.4
206
206
  fill_right = 587.2 (= upper visual right) */
207
207
  :scope[dual] [slot="fill"] {
208
- left: calc(var(--slider-pct-lower, var(--slider-pct-lower-default))
209
- * (100% - 2 * var(--slider-thumb-width, var(--slider-thumb-width-default))));
210
- width: calc(2 * var(--slider-thumb-width, var(--slider-thumb-width-default))
211
- + (var(--slider-pct-upper, var(--slider-pct-upper-default))
212
- - var(--slider-pct-lower, var(--slider-pct-lower-default)))
213
- * (100% - 2 * var(--slider-thumb-width, var(--slider-thumb-width-default))));
208
+ left: calc(var(--slider-pct-lower)
209
+ * (100% - 2 * var(--slider-thumb-width)));
210
+ width: calc(2 * var(--slider-thumb-width)
211
+ + (var(--slider-pct-upper)
212
+ - var(--slider-pct-lower))
213
+ * (100% - 2 * var(--slider-thumb-width)));
214
214
  }
215
215
 
216
216
  /* Thumb CONTAINER: full track height, geometry width.
@@ -219,18 +219,18 @@
219
219
  [slot="thumb"] {
220
220
  position: absolute;
221
221
  top: 50%;
222
- left: calc(var(--slider-thumb-width, var(--slider-thumb-width-default)) / 2
223
- + var(--slider-pct, var(--slider-pct-default)) * (100% - var(--slider-thumb-width, var(--slider-thumb-width-default))));
224
- width: var(--slider-thumb-width, var(--slider-thumb-width-default));
225
- height: var(--slider-track-height, var(--slider-track-height-default));
226
- border-radius: var(--slider-radius, var(--slider-radius-default));
222
+ left: calc(var(--slider-thumb-width) / 2
223
+ + var(--slider-pct) * (100% - var(--slider-thumb-width)));
224
+ width: var(--slider-thumb-width);
225
+ height: var(--slider-track-height);
226
+ border-radius: var(--slider-radius);
227
227
  background: transparent;
228
228
  transform: translate(-50%, -50%);
229
229
  cursor: grab;
230
230
  touch-action: none;
231
231
  transition:
232
- left var(--slider-duration, var(--slider-duration-default)) var(--slider-easing, var(--slider-easing-default)),
233
- transform var(--slider-duration, var(--slider-duration-default)) var(--slider-easing, var(--slider-easing-default));
232
+ left var(--slider-duration) var(--slider-easing),
233
+ transform var(--slider-duration) var(--slider-easing);
234
234
  z-index: 1;
235
235
  }
236
236
 
@@ -241,15 +241,15 @@
241
241
  [slot="thumb"]::before {
242
242
  content: '';
243
243
  position: absolute;
244
- inset: var(--slider-thumb-padding, var(--slider-thumb-padding-default));
244
+ inset: var(--slider-thumb-padding);
245
245
  border-radius: inherit;
246
- background: var(--slider-thumb-bg, var(--slider-thumb-bg-default));
246
+ background: var(--slider-thumb-bg);
247
247
  }
248
248
 
249
249
  /* During drag: kill the left transition so the thumb follows
250
250
  the pointer frame-by-frame without CSS interpolation lag. */
251
251
  :scope[data-dragging] [slot="thumb"] {
252
- transition: transform var(--slider-duration, var(--slider-duration-default)) var(--slider-easing, var(--slider-easing-default));
252
+ transition: transform var(--slider-duration) var(--slider-easing);
253
253
  }
254
254
 
255
255
  /* Dual-mode thumb positions: each thumb travels along (W − 2t) so they
@@ -262,15 +262,15 @@
262
262
  z-index nudges keep both thumbs paintable at boundary positions.
263
263
  The "active" (currently-dragging) thumb lifts above its sibling. */
264
264
  :scope[dual] [slot="thumb"][data-thumb="lower"] {
265
- left: calc(var(--slider-thumb-width, var(--slider-thumb-width-default)) / 2
266
- + var(--slider-pct-lower, var(--slider-pct-lower-default))
267
- * (100% - 2 * var(--slider-thumb-width, var(--slider-thumb-width-default))));
265
+ left: calc(var(--slider-thumb-width) / 2
266
+ + var(--slider-pct-lower)
267
+ * (100% - 2 * var(--slider-thumb-width)));
268
268
  z-index: 2;
269
269
  }
270
270
  :scope[dual] [slot="thumb"][data-thumb="upper"] {
271
- left: calc(var(--slider-thumb-width, var(--slider-thumb-width-default)) * 1.5
272
- + var(--slider-pct-upper, var(--slider-pct-upper-default))
273
- * (100% - 2 * var(--slider-thumb-width, var(--slider-thumb-width-default))));
271
+ left: calc(var(--slider-thumb-width) * 1.5
272
+ + var(--slider-pct-upper)
273
+ * (100% - 2 * var(--slider-thumb-width)));
274
274
  z-index: 3;
275
275
  }
276
276
  /* When the user is dragging a thumb, lift it above its sibling so the
@@ -287,7 +287,7 @@
287
287
  :scope[dual] [slot="value-lower"],
288
288
  :scope[dual] [slot="value-upper"] {
289
289
  color: var(--a-fg);
290
- font-weight: var(--slider-value-weight, var(--slider-value-weight-default));
290
+ font-weight: var(--slider-value-weight);
291
291
  font-variant-numeric: tabular-nums;
292
292
  }
293
293
 
@@ -301,13 +301,13 @@
301
301
  }
302
302
 
303
303
  :scope:focus-visible { outline: none; }
304
- :scope:focus-visible [slot="thumb"] { box-shadow: var(--slider-focus-ring, var(--slider-focus-ring-default)); }
304
+ :scope:focus-visible [slot="thumb"] { box-shadow: var(--slider-focus-ring); }
305
305
 
306
306
  /* Disabled */
307
307
  :scope[disabled] [slot="track"] { cursor: not-allowed; }
308
- :scope[disabled] [slot="fill"] { background: var(--slider-fill-bg-disabled, var(--slider-fill-bg-disabled-default)); }
308
+ :scope[disabled] [slot="fill"] { background: var(--slider-fill-bg-disabled); }
309
309
  :scope[disabled] [slot="thumb"]::before {
310
- background: var(--slider-thumb-bg-disabled, var(--slider-thumb-bg-disabled-default));
310
+ background: var(--slider-thumb-bg-disabled);
311
311
  }
312
312
 
313
313
  /* ── Hint (§184, v0.5.5, FEEDBACK-08 §7) ── */
@@ -5,49 +5,49 @@
5
5
  re-assigning --spinner-color. Stroke is 2px (raw px allowed for
6
6
  borders 1-2px per component-token-contract §"Forbidden patterns"). */
7
7
  :where(:scope) {
8
- --spinner-size-default: 1rem; /* icon-ui md */
9
- --spinner-color-default: currentColor;
10
- --spinner-stroke-default: 2px;
8
+ --spinner-size: 1rem; /* icon-ui md */
9
+ --spinner-color: currentColor;
10
+ --spinner-stroke: 2px;
11
11
  /* Rotational cadence — interaction-duration tokens (`--a-duration-*`,
12
12
  120-300 ms) are tuned for hover/focus transitions; a full spinner
13
13
  revolution at 300 ms reads as a frantic blur. Canonical loader
14
14
  cadence is ~0.8 s per revolution (smooth, perceptible motion). */
15
- --spinner-duration-default: 0.8s;
16
- --spinner-track-opacity-default: 0.25;
17
- --spinner-dot-size-default: calc(var(--spinner-size, var(--spinner-size-default)) / 4);
18
- --spinner-dot-gap-default: calc(var(--spinner-size, var(--spinner-size-default)) / 8);
15
+ --spinner-duration: 0.8s;
16
+ --spinner-track-opacity: 0.25;
17
+ --spinner-dot-size: calc(var(--spinner-size) / 4);
18
+ --spinner-dot-gap: calc(var(--spinner-size) / 8);
19
19
  /* Knight-rider variant — horizontal track with a sliding thumb.
20
20
  Track width is a separate scale from the round-spinner --spinner-size
21
21
  (Knight reads as a bar, not a glyph). Track height defaults to the
22
22
  spinner-stroke for visual continuity with arc/ring. Thumb width
23
23
  expressed as a 0-1 ratio of the track so the keyframe math is
24
24
  single-variable. */
25
- --spinner-bar-track-width-default: 4rem;
26
- --spinner-bar-track-height-default: var(--spinner-stroke, var(--spinner-stroke-default));
27
- --spinner-bar-thumb-ratio-default: 0.3;
25
+ --spinner-bar-track-width: 4rem;
26
+ --spinner-bar-track-height: var(--spinner-stroke);
27
+ --spinner-bar-thumb-ratio: 0.3;
28
28
  }
29
29
 
30
30
  /* ── Block 2 — BASE ────────────────────────────────────────────── */
31
31
  :scope {
32
32
  box-sizing: border-box;
33
33
  display: inline-block;
34
- width: var(--spinner-size, var(--spinner-size-default));
35
- height: var(--spinner-size, var(--spinner-size-default));
36
- color: var(--spinner-color, var(--spinner-color-default));
34
+ width: var(--spinner-size);
35
+ height: var(--spinner-size);
36
+ color: var(--spinner-color);
37
37
  vertical-align: middle;
38
38
  flex-shrink: 0;
39
39
  }
40
40
 
41
41
  /* ── Size ladder (mirrors icon-ui's local rem declarations) ─────── */
42
- :scope[size="sm"] { --spinner-size-default: 0.875rem; } /* 14px */
43
- :scope[size="md"] { --spinner-size-default: 1rem; } /* 16px */
44
- :scope[size="lg"] { --spinner-size-default: 1.25rem; } /* 20px */
42
+ :scope[size="sm"] { --spinner-size: 0.875rem; } /* 14px */
43
+ :scope[size="md"] { --spinner-size: 1rem; } /* 16px */
44
+ :scope[size="lg"] { --spinner-size: 1.25rem; } /* 20px */
45
45
 
46
46
  /* ── Tones (override --spinner-color token) ────────────────────── */
47
- :scope[tone="current"] { --spinner-color-default: currentColor; }
48
- :scope[tone="subtle"] { --spinner-color-default: var(--a-fg-subtle); }
49
- :scope[tone="accent"] { --spinner-color-default: var(--a-accent-strong); }
50
- :scope[tone="inverse"] { --spinner-color-default: var(--a-chrome-light); }
47
+ :scope[tone="current"] { --spinner-color: currentColor; }
48
+ :scope[tone="subtle"] { --spinner-color: var(--a-fg-subtle); }
49
+ :scope[tone="accent"] { --spinner-color: var(--a-accent-strong); }
50
+ :scope[tone="inverse"] { --spinner-color: var(--a-chrome-light); }
51
51
 
52
52
  /* ── Variant: ARC (default) — rotating quarter-circle border ───── */
53
53
  :scope[variant="arc"]::before,
@@ -58,9 +58,9 @@
58
58
  width: 100%;
59
59
  height: 100%;
60
60
  border-radius: 50%;
61
- border: var(--spinner-stroke, var(--spinner-stroke-default)) solid;
61
+ border: var(--spinner-stroke) solid;
62
62
  border-color: currentColor transparent transparent transparent;
63
- animation: spinner-ui-rotate var(--spinner-duration, var(--spinner-duration-default)) linear infinite;
63
+ animation: spinner-ui-rotate var(--spinner-duration) linear infinite;
64
64
  }
65
65
 
66
66
  /* ── Variant: RING — full ring with one rotating colored segment ── */
@@ -71,10 +71,10 @@
71
71
  width: 100%;
72
72
  height: 100%;
73
73
  border-radius: 50%;
74
- border: var(--spinner-stroke, var(--spinner-stroke-default)) solid;
75
- border-color: color-mix(in oklch, currentColor calc(var(--spinner-track-opacity, var(--spinner-track-opacity-default)) * 100%), transparent);
74
+ border: var(--spinner-stroke) solid;
75
+ border-color: color-mix(in oklch, currentColor calc(var(--spinner-track-opacity) * 100%), transparent);
76
76
  border-top-color: currentColor;
77
- animation: spinner-ui-rotate var(--spinner-duration, var(--spinner-duration-default)) linear infinite;
77
+ animation: spinner-ui-rotate var(--spinner-duration) linear infinite;
78
78
  }
79
79
 
80
80
  /* ── Variant: DOTS — three bouncing dots ─────────────────────────
@@ -94,26 +94,26 @@
94
94
  align-items: center;
95
95
  justify-content: center;
96
96
  width: auto; /* dots row is wider than tall */
97
- min-width: var(--spinner-size, var(--spinner-size-default));
98
- gap: var(--spinner-dot-gap, var(--spinner-dot-gap-default));
97
+ min-width: var(--spinner-size);
98
+ gap: var(--spinner-dot-gap);
99
99
  }
100
100
 
101
101
  :scope[variant="dots"] > [data-spinner-dot] {
102
- width: var(--spinner-dot-size, var(--spinner-dot-size-default));
103
- height: var(--spinner-dot-size, var(--spinner-dot-size-default));
102
+ width: var(--spinner-dot-size);
103
+ height: var(--spinner-dot-size);
104
104
  border-radius: 50%;
105
105
  background: currentColor;
106
- animation: spinner-ui-bounce var(--spinner-duration, var(--spinner-duration-default)) ease-in-out infinite;
106
+ animation: spinner-ui-bounce var(--spinner-duration) ease-in-out infinite;
107
107
  }
108
108
  /* Stagger each dot so the row reads as a wave left → right.
109
109
  Three equal slices of one revolution (0, T/3, 2T/3) give the
110
110
  classic three-dot loading rhythm. */
111
111
  :scope[variant="dots"] > [data-spinner-dot="1"] { animation-delay: 0s; }
112
112
  :scope[variant="dots"] > [data-spinner-dot="2"] {
113
- animation-delay: calc(var(--spinner-duration, var(--spinner-duration-default)) / 3);
113
+ animation-delay: calc(var(--spinner-duration) / 3);
114
114
  }
115
115
  :scope[variant="dots"] > [data-spinner-dot="3"] {
116
- animation-delay: calc(var(--spinner-duration, var(--spinner-duration-default)) * 2 / 3);
116
+ animation-delay: calc(var(--spinner-duration) * 2 / 3);
117
117
  }
118
118
 
119
119
  /* ── Variant: KNIGHT — knight-rider sliding bar ──────────────────
@@ -126,11 +126,11 @@
126
126
  ratio 0.3 → translate end = 233.33% (of thumb width). */
127
127
  :scope[variant="knight"] {
128
128
  display: inline-block;
129
- width: var(--spinner-bar-track-width, var(--spinner-bar-track-width-default));
130
- height: var(--spinner-bar-track-height, var(--spinner-bar-track-height-default));
129
+ width: var(--spinner-bar-track-width);
130
+ height: var(--spinner-bar-track-height);
131
131
  background: color-mix(
132
132
  in oklch,
133
- currentColor calc(var(--spinner-track-opacity, var(--spinner-track-opacity-default)) * 100%),
133
+ currentColor calc(var(--spinner-track-opacity) * 100%),
134
134
  transparent
135
135
  );
136
136
  border-radius: 9999px;
@@ -141,11 +141,11 @@
141
141
  content: "";
142
142
  position: absolute;
143
143
  inset: 0 auto 0 0; /* top:0; right:auto; bottom:0; left:0 */
144
- width: calc(var(--spinner-bar-thumb-ratio, var(--spinner-bar-thumb-ratio-default)) * 100%);
144
+ width: calc(var(--spinner-bar-thumb-ratio) * 100%);
145
145
  background: currentColor;
146
146
  border-radius: inherit;
147
147
  animation: spinner-ui-knight
148
- var(--spinner-duration, var(--spinner-duration-default))
148
+ var(--spinner-duration)
149
149
  ease-in-out infinite alternate;
150
150
  }
151
151
 
@@ -186,12 +186,12 @@
186
186
  ::before paint the ellipsis fallback. */
187
187
  :scope[variant="dots"] > [data-spinner-dot] { display: none; }
188
188
  :scope[variant="dots"] {
189
- width: var(--spinner-size, var(--spinner-size-default)); /* shrink back to a square in reduced mode */
189
+ width: var(--spinner-size); /* shrink back to a square in reduced mode */
190
190
  }
191
191
  /* Knight-rider — hide the sliding thumb; the host's ::before
192
192
  above repaints as the ellipsis fallback. */
193
193
  :scope[variant="knight"] {
194
- width: var(--spinner-size, var(--spinner-size-default));
194
+ width: var(--spinner-size);
195
195
  background: transparent;
196
196
  }
197
197
  }
@@ -215,7 +215,7 @@
215
215
  @keyframes spinner-ui-knight {
216
216
  from { transform: translateX(0); }
217
217
  to { transform: translateX(
218
- calc((1 / var(--spinner-bar-thumb-ratio, var(--spinner-bar-thumb-ratio-default)) - 1) * 100%)
218
+ calc((1 / var(--spinner-bar-thumb-ratio) - 1) * 100%)
219
219
  ); }
220
220
  }
221
221
  }
@@ -182,20 +182,18 @@ describe('spinner-ui — CSS source contract', () => {
182
182
  }
183
183
  });
184
184
 
185
- it('size="sm" / "md" / "lg" all override --spinner-size-default', () => {
186
- // The two-token convention (--{prop}-default for defaults +
187
- // var(--{prop}, var(--{prop}-default)) at use sites) means size
188
- // variants flip the -default token; consumer overrides write to
189
- // the bare --{prop} which wins via the var() fallback chain.
190
- expect(SPINNER_CSS).toMatch(/:scope\[size="sm"\][^}]*--spinner-size-default:\s*0\.875rem/);
191
- expect(SPINNER_CSS).toMatch(/:scope\[size="md"\][^}]*--spinner-size-default:\s*1rem/);
192
- expect(SPINNER_CSS).toMatch(/:scope\[size="lg"\][^}]*--spinner-size-default:\s*1\.25rem/);
185
+ it('size="sm" / "md" / "lg" all set --spinner-size', () => {
186
+ // Size variants re-point the active --spinner-size token; consumers
187
+ // override the same un-suffixed token on the element (or @layer overrides).
188
+ expect(SPINNER_CSS).toMatch(/:scope\[size="sm"\][^}]*--spinner-size:\s*0\.875rem/);
189
+ expect(SPINNER_CSS).toMatch(/:scope\[size="md"\][^}]*--spinner-size:\s*1rem/);
190
+ expect(SPINNER_CSS).toMatch(/:scope\[size="lg"\][^}]*--spinner-size:\s*1\.25rem/);
193
191
  });
194
192
 
195
- it('tone="subtle" / "accent" / "inverse" override --spinner-color-default via semantic tokens', () => {
196
- expect(SPINNER_CSS).toMatch(/:scope\[tone="subtle"\][^}]*--spinner-color-default:\s*var\(--a-fg-subtle\)/);
197
- expect(SPINNER_CSS).toMatch(/:scope\[tone="accent"\][^}]*--spinner-color-default:\s*var\(--a-accent-strong\)/);
198
- expect(SPINNER_CSS).toMatch(/:scope\[tone="inverse"\][^}]*--spinner-color-default:\s*var\(--a-chrome-light\)/);
193
+ it('tone="subtle" / "accent" / "inverse" set --spinner-color via semantic tokens', () => {
194
+ expect(SPINNER_CSS).toMatch(/:scope\[tone="subtle"\][^}]*--spinner-color:\s*var\(--a-fg-subtle\)/);
195
+ expect(SPINNER_CSS).toMatch(/:scope\[tone="accent"\][^}]*--spinner-color:\s*var\(--a-accent-strong\)/);
196
+ expect(SPINNER_CSS).toMatch(/:scope\[tone="inverse"\][^}]*--spinner-color:\s*var\(--a-chrome-light\)/);
199
197
  });
200
198
 
201
199
  it('arc variant uses a rotating quarter-circle border on ::before', () => {
@@ -1,12 +1,12 @@
1
1
  @scope (stack-ui) {
2
2
  :where(:scope) {
3
- --stack-align-default: center;
3
+ --stack-align: center;
4
4
  }
5
5
 
6
6
  :scope {
7
7
  box-sizing: border-box;
8
8
  display: grid;
9
- place-items: var(--stack-align, var(--stack-align-default));
9
+ place-items: var(--stack-align);
10
10
  /* Universal [padding] / [margin] opt-in — see tokens.css for scale. */
11
11
  padding: var(--a-padding, 0);
12
12
  margin: var(--a-margin, 0);
@@ -19,13 +19,13 @@
19
19
  }
20
20
 
21
21
  /* Alignment */
22
- :scope[align="center"] { --stack-align-default: center; }
23
- :scope[align="top-left"] { --stack-align-default: start start; }
24
- :scope[align="top-right"] { --stack-align-default: start end; }
25
- :scope[align="bottom-left"] { --stack-align-default: end start; }
26
- :scope[align="bottom-right"] { --stack-align-default: end end; }
27
- :scope[align="top"] { --stack-align-default: start center; }
28
- :scope[align="bottom"] { --stack-align-default: end center; }
29
- :scope[align="left"] { --stack-align-default: center start; }
30
- :scope[align="right"] { --stack-align-default: center end; }
22
+ :scope[align="center"] { --stack-align: center; }
23
+ :scope[align="top-left"] { --stack-align: start start; }
24
+ :scope[align="top-right"] { --stack-align: start end; }
25
+ :scope[align="bottom-left"] { --stack-align: end start; }
26
+ :scope[align="bottom-right"] { --stack-align: end end; }
27
+ :scope[align="top"] { --stack-align: start center; }
28
+ :scope[align="bottom"] { --stack-align: end center; }
29
+ :scope[align="left"] { --stack-align: center start; }
30
+ :scope[align="right"] { --stack-align: center end; }
31
31
  }