@slotted/styles 0.1.0-beta.0 → 0.1.0-beta.10

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 (176) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -20,7 +20,7 @@
20
20
  * outline. The rebuild that preceded this one thickened the border on a
21
21
  * pressed toggle, which moved every control beside it by two pixels.
22
22
  */
23
- [data-ui='button'] {
23
+ [data-ui-button] {
24
24
  --_solid: var(--slotted-tone-accent-solid);
25
25
  --_solid-hover: var(--slotted-tone-accent-solid-hover);
26
26
  --_solid-active: var(--slotted-tone-accent-solid-active);
@@ -135,7 +135,7 @@
135
135
 
136
136
  /* ── Tone: which of the five semantic colours the control speaks in ───── */
137
137
 
138
- [data-ui='button'][data-tone='secondary'] {
138
+ [data-ui-button][data-tone='secondary'] {
139
139
  --_solid: var(--slotted-tone-secondary-solid);
140
140
  --_solid-hover: var(--slotted-tone-secondary-solid-hover);
141
141
  --_solid-active: var(--slotted-tone-secondary-solid-active);
@@ -158,7 +158,20 @@
158
158
  --_edge: var(--_solid-active);
159
159
  }
160
160
 
161
- [data-ui='button'][data-tone='success'] {
161
+ /**
162
+ * Ink: the theme's `neutral` tone fills with the inverse surface and labels
163
+ * with the inverse text. A product that keeps the accent for data draws its
164
+ * primary action in it.
165
+ */
166
+ [data-ui-button][data-tone='neutral'] {
167
+ --_solid: var(--slotted-tone-neutral-solid);
168
+ --_solid-hover: var(--slotted-tone-neutral-solid-hover);
169
+ --_solid-active: var(--slotted-tone-neutral-solid-active);
170
+ --_on-solid: var(--slotted-tone-neutral-on-solid);
171
+ --_text: var(--slotted-tone-neutral-text);
172
+ }
173
+
174
+ [data-ui-button][data-tone='success'] {
162
175
  --_solid: var(--slotted-tone-success-solid);
163
176
  --_solid-hover: var(--slotted-tone-success-solid-hover);
164
177
  --_solid-active: var(--slotted-tone-success-solid-active);
@@ -166,7 +179,15 @@
166
179
  --_text: var(--slotted-tone-success-text);
167
180
  }
168
181
 
169
- [data-ui='button'][data-tone='warning'] {
182
+ [data-ui-button][data-tone='info'] {
183
+ --_solid: var(--slotted-tone-info-solid);
184
+ --_solid-hover: var(--slotted-tone-info-solid-hover);
185
+ --_solid-active: var(--slotted-tone-info-solid-active);
186
+ --_on-solid: var(--slotted-tone-info-on-solid);
187
+ --_text: var(--slotted-tone-info-text);
188
+ }
189
+
190
+ [data-ui-button][data-tone='warning'] {
170
191
  --_solid: var(--slotted-tone-warning-solid);
171
192
  --_solid-hover: var(--slotted-tone-warning-solid-hover);
172
193
  --_solid-active: var(--slotted-tone-warning-solid-active);
@@ -174,7 +195,7 @@
174
195
  --_text: var(--slotted-tone-warning-text);
175
196
  }
176
197
 
177
- [data-ui='button'][data-tone='danger'] {
198
+ [data-ui-button][data-tone='danger'] {
178
199
  --_solid: var(--slotted-tone-danger-solid);
179
200
  --_solid-hover: var(--slotted-tone-danger-solid-hover);
180
201
  --_solid-active: var(--slotted-tone-danger-solid-active);
@@ -184,7 +205,7 @@
184
205
 
185
206
  /* ── Size: the control scale, one step of it per member instance ──────── */
186
207
 
187
- [data-ui='button'][data-size='sm'] {
208
+ [data-ui-button][data-size='sm'] {
188
209
  --_height: var(--slotted-control-height-sm, 30px);
189
210
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
190
211
  --_font-size: var(--slotted-control-font-size-sm, 12px);
@@ -192,7 +213,7 @@
192
213
  --_gap: var(--slotted-control-gap-sm, 6px);
193
214
  }
194
215
 
195
- [data-ui='button'][data-size='lg'] {
216
+ [data-ui-button][data-size='lg'] {
196
217
  --_height: var(--slotted-control-height-lg, 38px);
197
218
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
198
219
  --_font-size: var(--slotted-control-font-size-lg, 14px);
@@ -234,7 +255,7 @@
234
255
  * sheet carried the shadow on the base rule for one release and every
235
256
  * member inherited it, which is the defect this split exists to close.
236
257
  */
237
- [data-ui='button'][data-variant='solid'] {
258
+ [data-ui-button][data-variant='solid'] {
238
259
  background: var(--_solid, ButtonFace);
239
260
  border-color: var(--_edge, ButtonBorder);
240
261
  box-shadow: var(--slotted-control-shadow, none);
@@ -250,14 +271,14 @@
250
271
  * button the darkest line on the form, and the foundation now keeps that
251
272
  * step for the line between two surfaces.
252
273
  */
253
- [data-ui='button'][data-variant='outline'] {
274
+ [data-ui-button][data-variant='outline'] {
254
275
  background: transparent;
255
276
  border-color: var(--slotted-control-border-color, ButtonBorder);
256
277
  box-shadow: var(--slotted-control-shadow, none);
257
278
  color: var(--_text, ButtonText);
258
279
  }
259
280
 
260
- [data-ui='button'][data-variant='ghost'] {
281
+ [data-ui-button][data-variant='ghost'] {
261
282
  background: transparent;
262
283
  border-color: transparent;
263
284
  color: var(--_text, ButtonText);
@@ -269,9 +290,9 @@
269
290
  * rule: its solid step is the page's own colour, so it takes the band the way
270
291
  * a bare control does.
271
292
  */
272
- [data-ui='button'][data-variant='outline'],
273
- [data-ui='button'][data-variant='ghost'],
274
- [data-ui='button'][data-variant='solid'][data-tone='secondary'] {
293
+ [data-ui-button][data-variant='outline'],
294
+ [data-ui-button][data-variant='ghost'],
295
+ [data-ui-button][data-variant='solid'][data-tone='secondary'] {
275
296
  --_sweep-strength: 0.18;
276
297
  }
277
298
 
@@ -293,7 +314,7 @@
293
314
  * It sits above hover and below loading and disabled, which is the order
294
315
  * `STATE_PRECEDENCE` sets.
295
316
  */
296
- [data-ui='button'][data-pressed]:not(:disabled):not([data-disabled]) {
317
+ [data-ui-button][data-pressed]:not(:disabled):not([data-disabled]) {
297
318
  background: var(--slotted-tone-accent-subtle-active, Highlight);
298
319
  border-color: var(--slotted-tone-accent-border, Highlight);
299
320
  /* A ghost toggle that is on has taken a fill and an edge, so it is a framed
@@ -327,13 +348,13 @@
327
348
  * and nothing moves.
328
349
  */
329
350
 
330
- [data-ui='button'][data-variant='solid']:hover:not(:disabled):not([data-disabled]):not(
351
+ [data-ui-button][data-variant='solid']:hover:not(:disabled):not([data-disabled]):not(
331
352
  [data-loading]
332
353
  ):not([data-pressed]) {
333
354
  background: var(--_solid-hover, Highlight);
334
355
  }
335
356
 
336
- [data-ui='button'][data-variant='solid']:active:not(:disabled):not([data-disabled]):not(
357
+ [data-ui-button][data-variant='solid']:active:not(:disabled):not([data-disabled]):not(
337
358
  [data-loading]
338
359
  ):not([data-pressed]) {
339
360
  background: var(--_solid-active, Highlight);
@@ -342,19 +363,19 @@
342
363
  transition-duration: var(--slotted-duration-instant);
343
364
  }
344
365
 
345
- [data-ui='button'][data-variant='outline']:hover:not(:disabled):not([data-disabled]):not(
366
+ [data-ui-button][data-variant='outline']:hover:not(:disabled):not([data-disabled]):not(
346
367
  [data-loading]
347
368
  ):not([data-pressed]),
348
- [data-ui='button'][data-variant='ghost']:hover:not(:disabled):not([data-disabled]):not(
369
+ [data-ui-button][data-variant='ghost']:hover:not(:disabled):not([data-disabled]):not(
349
370
  [data-loading]
350
371
  ):not([data-pressed]) {
351
372
  background: var(--slotted-tone-secondary-subtle-hover, ButtonFace);
352
373
  }
353
374
 
354
- [data-ui='button'][data-variant='outline']:active:not(:disabled):not([data-disabled]):not(
375
+ [data-ui-button][data-variant='outline']:active:not(:disabled):not([data-disabled]):not(
355
376
  [data-loading]
356
377
  ):not([data-pressed]),
357
- [data-ui='button'][data-variant='ghost']:active:not(:disabled):not([data-disabled]):not(
378
+ [data-ui-button][data-variant='ghost']:active:not(:disabled):not([data-disabled]):not(
358
379
  [data-loading]
359
380
  ):not([data-pressed]) {
360
381
  background: var(--slotted-tone-secondary-subtle-active, ButtonFace);
@@ -366,18 +387,18 @@
366
387
  * ground's own hover step and never on the neutral one a toggle that is off
367
388
  * hovers with — the two states share no surface in any of theirs.
368
389
  */
369
- [data-ui='button'][data-pressed]:hover:not(:disabled):not([data-disabled]):not([data-loading]) {
390
+ [data-ui-button][data-pressed]:hover:not(:disabled):not([data-disabled]):not([data-loading]) {
370
391
  background: var(--slotted-tone-accent-subtle-hover, Highlight);
371
392
  }
372
393
 
373
- [data-ui='button'][data-pressed]:active:not(:disabled):not([data-disabled]):not([data-loading]) {
394
+ [data-ui-button][data-pressed]:active:not(:disabled):not([data-disabled]):not([data-loading]) {
374
395
  background: var(--slotted-tone-accent-subtle-active, Highlight);
375
396
  transition-duration: var(--slotted-duration-instant);
376
397
  }
377
398
 
378
399
  /* ── Focus ────────────────────────────────────────────────────────────── */
379
400
 
380
- [data-ui='button']:focus-visible {
401
+ [data-ui-button]:focus-visible {
381
402
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
382
403
  outline-offset: var(--slotted-focus-ring-offset, 2px);
383
404
  }
@@ -395,8 +416,8 @@
395
416
  * is always there.
396
417
  */
397
418
 
398
- [data-ui='button']:disabled,
399
- [data-ui='button'][data-disabled] {
419
+ [data-ui-button]:disabled,
420
+ [data-ui-button][data-disabled] {
400
421
  /* Nothing a person cannot reach is lifted off the page — the rule
401
422
  `text-field` states for the same shadow. */
402
423
  box-shadow: none;
@@ -404,8 +425,8 @@
404
425
  cursor: not-allowed;
405
426
  }
406
427
 
407
- [data-ui='button'][data-variant='solid']:disabled,
408
- [data-ui='button'][data-variant='solid'][data-disabled] {
428
+ [data-ui-button][data-variant='solid']:disabled,
429
+ [data-ui-button][data-variant='solid'][data-disabled] {
409
430
  background: var(--slotted-disabled-background, ButtonFace);
410
431
  /**
411
432
  * The disabled border rather than the disabled surface, because in the
@@ -415,8 +436,8 @@
415
436
  border-color: var(--slotted-disabled-border, ButtonBorder);
416
437
  }
417
438
 
418
- [data-ui='button'][data-variant='outline']:disabled,
419
- [data-ui='button'][data-variant='outline'][data-disabled] {
439
+ [data-ui-button][data-variant='outline']:disabled,
440
+ [data-ui-button][data-variant='outline'][data-disabled] {
420
441
  background: transparent;
421
442
  border-color: var(--slotted-disabled-border, GrayText);
422
443
  }
@@ -427,8 +448,8 @@
427
448
  * is `aria-pressed`, which the platform announces whether or not the control
428
449
  * can be operated.
429
450
  */
430
- [data-ui='button'][data-pressed]:disabled,
431
- [data-ui='button'][data-pressed][data-disabled] {
451
+ [data-ui-button][data-pressed]:disabled,
452
+ [data-ui-button][data-pressed][data-disabled] {
432
453
  background: var(--slotted-disabled-background, ButtonFace);
433
454
  border-color: var(--slotted-disabled-border, GrayText);
434
455
  color: var(--slotted-disabled-foreground, GrayText);
@@ -456,18 +477,18 @@
456
477
  * a natively disabled control keeps the disabled tokens above, and a ghost
457
478
  * stays flat and takes only the text.
458
479
  */
459
- [data-ui='button'][data-disabled]:not(:disabled) {
480
+ [data-ui-button][data-disabled]:not(:disabled) {
460
481
  color: var(--slotted-text-muted, GrayText);
461
482
  }
462
483
 
463
- [data-ui='button'][data-variant='solid'][data-disabled]:not(:disabled),
464
- [data-ui='button'][data-pressed][data-disabled]:not(:disabled) {
484
+ [data-ui-button][data-variant='solid'][data-disabled]:not(:disabled),
485
+ [data-ui-button][data-pressed][data-disabled]:not(:disabled) {
465
486
  background: var(--slotted-tone-secondary-subtle-hover, ButtonFace);
466
487
  border-color: var(--slotted-border-subtle, GrayText);
467
488
  color: var(--slotted-text-muted, GrayText);
468
489
  }
469
490
 
470
- [data-ui='button'][data-variant='outline'][data-disabled]:not(:disabled) {
491
+ [data-ui-button][data-variant='outline'][data-disabled]:not(:disabled) {
471
492
  border-color: var(--slotted-border-subtle, GrayText);
472
493
  }
473
494
 
@@ -492,11 +513,11 @@
492
513
  * supplies survives the wait and combines with the indicator's own.
493
514
  */
494
515
 
495
- [data-ui='button'][data-loading] {
516
+ [data-ui-button][data-loading] {
496
517
  cursor: progress;
497
518
  }
498
519
 
499
- [data-ui='button'][data-loading]:has(> [data-part='indicator']) > :not([data-part='indicator']) {
520
+ [data-ui-button][data-loading]:has(> [data-part-indicator]) > :not([data-part-indicator]) {
500
521
  opacity: 0;
501
522
  }
502
523
 
@@ -505,14 +526,35 @@
505
526
  * that waits. This family only says how big it is — the glyph box of its
506
527
  * own step — and where it sits.
507
528
  */
508
- [data-ui='button'] [data-part='indicator'] {
529
+ [data-ui-button] [data-part-indicator] {
509
530
  --slotted-spinner-size: var(--_icon-size);
510
531
 
511
532
  flex: none;
512
533
  }
513
534
 
535
+ /**
536
+ * The ring that stands in for a glyph takes the glyph's box. The glyph stays
537
+ * in the DOM, so the slot keeps its width, and is not drawn: the slot hides
538
+ * what it holds and the ring alone shows again. `IconButton` drew both side
539
+ * by side in a square of one glyph.
540
+ */
541
+ [data-ui-button] [data-part-start]:has(> [data-part-indicator]),
542
+ [data-ui-button] [data-part-end]:has(> [data-part-indicator]),
543
+ [data-ui-button] [data-part-icon]:has(> [data-part-indicator]) {
544
+ visibility: hidden;
545
+ }
546
+
547
+ [data-ui-button] [data-part-start] > [data-part-indicator],
548
+ [data-ui-button] [data-part-end] > [data-part-indicator],
549
+ [data-ui-button] [data-part-icon] > [data-part-indicator] {
550
+ inset: 0;
551
+ margin: auto;
552
+ position: absolute;
553
+ visibility: visible;
554
+ }
555
+
514
556
  /* Only the ring that has no visual slot to sit in is placed against the box. */
515
- [data-ui='button'] > [data-part='indicator'] {
557
+ [data-ui-button] > [data-part-indicator] {
516
558
  inset: 0;
517
559
  /* `inset: 0` with a definite size and automatic margins centres on both
518
560
  axes without naming a physical side. */
@@ -551,7 +593,7 @@
551
593
  */
552
594
  @media (prefers-reduced-motion: no-preference) {
553
595
  @media not (forced-colors: active) {
554
- [data-ui='button']:not([data-shape])[data-loading]:has([data-part='indicator'])::after {
596
+ [data-ui-button]:not([data-shape])[data-loading]:has([data-part-indicator])::after {
555
597
  /**
556
598
  * The tile is crossed once per cycle, so the pair sets the speed the
557
599
  * band travels rather than the time it takes: two heights per loop
@@ -575,19 +617,17 @@
575
617
  * A band that travels against the reading direction reads as undoing
576
618
  * rather than as progressing, so it is mirrored rather than reused.
577
619
  */
578
- [data-ui='button']:not([data-shape])[data-loading]:has([data-part='indicator']):dir(
579
- rtl
580
- )::after {
620
+ [data-ui-button]:not([data-shape])[data-loading]:has([data-part-indicator]):dir(rtl)::after {
581
621
  animation-direction: reverse;
582
622
  background-image: linear-gradient(to left, transparent, currentColor 40%, transparent 80%);
583
623
  }
584
624
 
585
- [data-ui='button']:not([data-shape])[data-loading]:has(> [data-part='indicator'])
586
- > :not([data-part='indicator']) {
625
+ [data-ui-button]:not([data-shape])[data-loading]:has(> [data-part-indicator])
626
+ > :not([data-part-indicator]) {
587
627
  opacity: 1;
588
628
  }
589
629
 
590
- [data-ui='button']:not([data-shape])[data-loading] [data-part='indicator'] {
630
+ [data-ui-button]:not([data-shape])[data-loading] [data-part-indicator] {
591
631
  opacity: 0;
592
632
  position: absolute;
593
633
  }
@@ -596,9 +636,9 @@
596
636
 
597
637
  /* ── Parts ────────────────────────────────────────────────────────────── */
598
638
 
599
- [data-ui='button'] [data-part='start'],
600
- [data-ui='button'] [data-part='end'],
601
- [data-ui='button'] [data-part='icon'] {
639
+ [data-ui-button] [data-part-start],
640
+ [data-ui-button] [data-part-end],
641
+ [data-ui-button] [data-part-icon] {
602
642
  align-items: center;
603
643
  block-size: var(--_icon-size);
604
644
  box-sizing: border-box;
@@ -612,20 +652,35 @@
612
652
  position: relative;
613
653
  }
614
654
 
615
- [data-ui='button'] [data-part='start'] > *:not([data-part='indicator']),
616
- [data-ui='button'] [data-part='end'] > *:not([data-part='indicator']),
617
- [data-ui='button'] [data-part='icon'] > *:not([data-part='indicator']) {
655
+ [data-ui-button] [data-part-start] > *:not([data-part-indicator], [data-ui-kbd]),
656
+ [data-ui-button] [data-part-end] > *:not([data-part-indicator], [data-ui-kbd]),
657
+ [data-ui-button] [data-part-icon] > *:not([data-part-indicator]) {
618
658
  block-size: 100%;
619
659
  display: block;
620
660
  inline-size: 100%;
621
661
  }
622
662
 
663
+ /**
664
+ * A key in a slot is sized by its own family. The slot above is a glyph's
665
+ * box: it stated `display: block` on the key, which put the legend on a line
666
+ * box's baseline instead of the key's centre, sixteen pixels square, and the
667
+ * icon's font size, which `size="inherit"` read as the text's. Measured, a
668
+ * `Kbd` legend stood 1.5px above the label's centre and a `Shortcut` 1.5px
669
+ * below it. Here the slot takes the key's measure and the label's type, and
670
+ * the flex container centres the key on the label.
671
+ */
672
+ [data-ui-button] :is([data-part-start], [data-part-end]):has(> [data-ui-kbd]) {
673
+ block-size: auto;
674
+ font-size: inherit;
675
+ inline-size: auto;
676
+ }
677
+
623
678
  /**
624
679
  * The label carries a wrapping line height of its own: the control's line
625
680
  * height is 1, which centres a single line inside the box and crushes the
626
681
  * second one. A token longer than the container breaks instead of escaping.
627
682
  */
628
- [data-ui='button'] [data-part='label'] {
683
+ [data-ui-button] [data-part-label] {
629
684
  line-height: var(--slotted-line-height-sm, 1.45);
630
685
  min-inline-size: 0;
631
686
  overflow-wrap: anywhere;
@@ -656,7 +711,7 @@
656
711
  * of a pixel, which is the only thing the term governs.
657
712
  */
658
713
  @supports (text-box: trim-both cap alphabetic) {
659
- [data-ui='button'] [data-part='label'] {
714
+ [data-ui-button] [data-part-label] {
660
715
  padding-block: calc((var(--slotted-line-height-sm, 1.45) * 1em - 0.75em) / 2);
661
716
  text-box: trim-both cap alphabetic;
662
717
  }
@@ -667,20 +722,40 @@
667
722
  * letter. An icon-only control is exempt, because both of its sides hold
668
723
  * the same glyph and its inset is zero.
669
724
  */
670
- [data-ui='button']:not([data-shape]):has(> [data-part='start']) {
725
+ [data-ui-button]:not([data-shape]):has(> [data-part-start]) {
671
726
  padding-inline-start: var(--_padding-inline-visual);
672
727
  }
673
728
 
674
- [data-ui='button']:not([data-shape]):has(> [data-part='end']) {
729
+ [data-ui-button]:not([data-shape]):has(> [data-part-end]) {
675
730
  padding-inline-end: var(--_padding-inline-visual);
676
731
  }
677
732
 
678
733
  /* ── Inline size ──────────────────────────────────────────────────────── */
679
734
 
680
- [data-ui='button'][data-full-width] {
735
+ [data-ui-button][data-full-width] {
681
736
  inline-size: 100%;
682
737
  }
683
738
 
739
+ /**
740
+ * A field trigger: the label at the start and `end` at the inline end. The
741
+ * label takes the free space, so `start` stays beside it and the end slot is
742
+ * pushed to the edge; flex follows the writing direction, so it mirrors.
743
+ */
744
+ [data-ui-button][data-justify='between'] {
745
+ justify-content: space-between;
746
+ }
747
+
748
+ [data-ui-button][data-justify='between'] > [data-part-label] {
749
+ flex: 1 1 auto;
750
+ text-align: start;
751
+ }
752
+
753
+ /* What a trigger holds at its end — a shortcut, a count — is as wide as it is. */
754
+ [data-ui-button][data-justify='between'] > [data-part-end] {
755
+ inline-size: auto;
756
+ min-inline-size: var(--_icon-size);
757
+ }
758
+
684
759
  /**
685
760
  * An icon-only control is square from the control height, so its visual box
686
761
  * and its target are the same box. The two minimums are the WCAG 2.2 floor
@@ -688,7 +763,7 @@
688
763
  * small in one axis is the family's to correct, and theme validation only
689
764
  * guarantees the block axis.
690
765
  */
691
- [data-ui='button'][data-shape] {
766
+ [data-ui-button][data-shape] {
692
767
  aspect-ratio: 1;
693
768
  inline-size: var(--_height);
694
769
  min-block-size: max(var(--_height), var(--slotted-target-min, 24px));
@@ -697,7 +772,7 @@
697
772
  padding-inline: 0;
698
773
  }
699
774
 
700
- [data-ui='button'][data-shape='circle'] {
775
+ [data-ui-button][data-shape='circle'] {
701
776
  border-radius: var(--slotted-radius-full, 9999px);
702
777
  }
703
778
 
@@ -711,16 +786,16 @@
711
786
  * for a fill the system has flattened.
712
787
  */
713
788
  @media (forced-colors: active) {
714
- [data-ui='button'] {
789
+ [data-ui-button] {
715
790
  border-color: ButtonBorder;
716
791
  }
717
792
 
718
- [data-ui='button'][data-pressed] {
793
+ [data-ui-button][data-pressed] {
719
794
  border-color: Highlight;
720
795
  }
721
796
 
722
- [data-ui='button']:disabled,
723
- [data-ui='button'][data-disabled] {
797
+ [data-ui-button]:disabled,
798
+ [data-ui-button][data-disabled] {
724
799
  border-color: GrayText;
725
800
  color: GrayText;
726
801
  }
@@ -731,7 +806,7 @@
731
806
  * shows the wait, and the sweep above is the loop this sheet owns.
732
807
  */
733
808
  @media (prefers-reduced-motion: reduce) {
734
- [data-ui='button'] [data-part='indicator'] {
809
+ [data-ui-button] [data-part-indicator] {
735
810
  animation: none;
736
811
  }
737
812
  }
@@ -52,6 +52,16 @@
52
52
  "--slotted-tone-danger-solid-active",
53
53
  "--slotted-tone-danger-solid-hover",
54
54
  "--slotted-tone-danger-text",
55
+ "--slotted-tone-info-on-solid",
56
+ "--slotted-tone-info-solid",
57
+ "--slotted-tone-info-solid-active",
58
+ "--slotted-tone-info-solid-hover",
59
+ "--slotted-tone-info-text",
60
+ "--slotted-tone-neutral-on-solid",
61
+ "--slotted-tone-neutral-solid",
62
+ "--slotted-tone-neutral-solid-active",
63
+ "--slotted-tone-neutral-solid-hover",
64
+ "--slotted-tone-neutral-text",
55
65
  "--slotted-tone-secondary-on-solid",
56
66
  "--slotted-tone-secondary-solid",
57
67
  "--slotted-tone-secondary-solid-active",