@slotted/styles 0.1.0-beta.1 → 0.1.0-beta.11

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 (180) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +35 -42
  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 +149 -68
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +79 -74
  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 +103 -90
  36. package/src/command-palette/command-palette.tokens.json +1 -0
  37. package/src/container/container.css +24 -24
  38. package/src/context-menu/context-menu.css +8 -8
  39. package/src/currency-field/currency-field.css +210 -88
  40. package/src/currency-field/currency-field.tokens.json +13 -0
  41. package/src/dashboard-grid/dashboard-grid.css +148 -116
  42. package/src/data-grid/data-grid.css +535 -470
  43. package/src/data-grid/data-grid.tokens.json +4 -0
  44. package/src/data-list/data-list.css +81 -70
  45. package/src/data-list/data-list.tokens.json +2 -1
  46. package/src/date-field/date-field.css +55 -52
  47. package/src/date-field/date-field.tokens.json +1 -0
  48. package/src/date-picker/date-picker.css +40 -42
  49. package/src/date-range-picker/date-range-picker.css +114 -118
  50. package/src/datetime-field/datetime-field.css +78 -80
  51. package/src/datetime-field/datetime-field.tokens.json +1 -0
  52. package/src/datetime-picker/datetime-picker.css +61 -63
  53. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  54. package/src/description-list/description-list.css +61 -64
  55. package/src/detail-panel/detail-panel.css +86 -71
  56. package/src/detail-panel/detail-panel.tokens.json +2 -0
  57. package/src/dialog/dialog.css +372 -153
  58. package/src/dialog/dialog.tokens.json +6 -0
  59. package/src/divider/divider.css +18 -18
  60. package/src/drawer/drawer.css +205 -210
  61. package/src/drawer/drawer.tokens.json +1 -0
  62. package/src/entity-picker/entity-picker.css +238 -241
  63. package/src/entity-picker/entity-picker.tokens.json +1 -0
  64. package/src/event-calendar/event-calendar.css +343 -385
  65. package/src/field/field.css +74 -78
  66. package/src/field-group/field-group.css +22 -25
  67. package/src/filter-bar/filter-bar.css +193 -209
  68. package/src/form/form.css +34 -24
  69. package/src/form/form.tokens.json +1 -0
  70. package/src/fullscreen/fullscreen.css +24 -25
  71. package/src/grid/grid.css +28 -28
  72. package/src/highlight/highlight.css +6 -6
  73. package/src/hover-card/hover-card.css +6 -6
  74. package/src/icon/icon.css +19 -15
  75. package/src/icon/icon.tokens.json +1 -0
  76. package/src/image/image.css +39 -39
  77. package/src/import-export-center/import-export-center.css +135 -156
  78. package/src/inline/inline.css +27 -27
  79. package/src/inline-message/inline-message.css +52 -28
  80. package/src/inline-message/inline-message.tokens.json +4 -0
  81. package/src/kbd/kbd.css +30 -26
  82. package/src/link/link.css +15 -15
  83. package/src/list/list.css +44 -17
  84. package/src/list/list.tokens.json +4 -0
  85. package/src/list-item/list-item.css +80 -66
  86. package/src/list-item/list-item.tokens.json +7 -0
  87. package/src/listbox/listbox.css +56 -59
  88. package/src/loading-overlay/loading-overlay.css +75 -92
  89. package/src/markdown/markdown.css +17 -17
  90. package/src/menu/menu.css +83 -63
  91. package/src/menubar/menubar.css +13 -13
  92. package/src/message/message.css +182 -202
  93. package/src/message/message.tokens.json +5 -0
  94. package/src/message-scroller/message-scroller.css +41 -42
  95. package/src/multi-select/multi-select.css +152 -145
  96. package/src/multi-select/multi-select.tokens.json +1 -0
  97. package/src/navigation-menu/navigation-menu.css +167 -188
  98. package/src/notification-center/notification-center.css +140 -148
  99. package/src/notification-center/notification-center.tokens.json +3 -0
  100. package/src/number-field/number-field.css +84 -83
  101. package/src/number-field/number-field.tokens.json +1 -0
  102. package/src/otp-input/otp-input.css +67 -57
  103. package/src/otp-input/otp-input.tokens.json +1 -0
  104. package/src/page/page.css +39 -23
  105. package/src/page/page.tokens.json +1 -0
  106. package/src/page-header/page-header.css +323 -283
  107. package/src/page-header/page-header.tokens.json +5 -0
  108. package/src/pagination/pagination.css +68 -72
  109. package/src/popover/popover.css +40 -49
  110. package/src/progress-indicator/progress-indicator.css +177 -120
  111. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  112. package/src/prompt-composer/prompt-composer.css +221 -102
  113. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  114. package/src/prose/prose.css +71 -75
  115. package/src/radio-group/radio-group.css +98 -103
  116. package/src/rating/rating.css +136 -132
  117. package/src/rating/rating.tokens.json +1 -0
  118. package/src/result-state/result-state.css +74 -77
  119. package/src/runtime-properties.mjs +2 -0
  120. package/src/saved-views/saved-views.css +41 -47
  121. package/src/scroll-area/scroll-area.css +39 -32
  122. package/src/section/section.css +161 -41
  123. package/src/section/section.tokens.json +7 -2
  124. package/src/segmented-control/segmented-control.css +254 -97
  125. package/src/segmented-control/segmented-control.tokens.json +15 -11
  126. package/src/select/select.css +118 -117
  127. package/src/select/select.tokens.json +1 -0
  128. package/src/side-navigation/side-navigation.css +179 -182
  129. package/src/side-navigation/side-navigation.tokens.json +1 -0
  130. package/src/skeleton/skeleton.css +47 -48
  131. package/src/slider/slider.css +86 -88
  132. package/src/sparkline/sparkline.css +62 -40
  133. package/src/sparkline/sparkline.tokens.json +2 -0
  134. package/src/spinner/spinner.css +83 -180
  135. package/src/spinner/spinner.tokens.json +0 -1
  136. package/src/split-button/split-button.css +30 -31
  137. package/src/split-button/split-button.tokens.json +1 -0
  138. package/src/splitter/splitter.css +35 -35
  139. package/src/stack/stack.css +24 -24
  140. package/src/stat-card/stat-card.css +341 -224
  141. package/src/stat-card/stat-card.tokens.json +3 -0
  142. package/src/status-indicator/status-indicator.css +28 -28
  143. package/src/stepper/stepper.css +58 -62
  144. package/src/switch/switch.css +86 -92
  145. package/src/table/table.css +310 -165
  146. package/src/table/table.tokens.json +6 -0
  147. package/src/table-of-contents/table-of-contents.css +51 -54
  148. package/src/tabs/tabs.css +337 -302
  149. package/src/tabs/tabs.tokens.json +8 -5
  150. package/src/tag/tag.css +79 -71
  151. package/src/tag/tag.tokens.json +9 -0
  152. package/src/tags-input/tags-input.css +145 -82
  153. package/src/tags-input/tags-input.tokens.json +7 -1
  154. package/src/text-field/text-field.css +132 -136
  155. package/src/text-field/text-field.tokens.json +1 -0
  156. package/src/textarea/textarea.css +31 -28
  157. package/src/textarea/textarea.tokens.json +1 -0
  158. package/src/time-field/time-field.css +72 -69
  159. package/src/time-field/time-field.tokens.json +1 -0
  160. package/src/time-picker/time-picker.css +56 -58
  161. package/src/time-range-picker/time-range-picker.css +126 -133
  162. package/src/timeline/timeline.css +254 -266
  163. package/src/timeline/timeline.tokens.json +5 -0
  164. package/src/toast/toast.css +108 -90
  165. package/src/toast/toast.tokens.json +6 -0
  166. package/src/toggle/toggle.css +62 -25
  167. package/src/toggle/toggle.tokens.json +8 -0
  168. package/src/toggle-group/toggle-group.css +106 -60
  169. package/src/toggle-group/toggle-group.tokens.json +10 -0
  170. package/src/toolbar/toolbar.css +30 -35
  171. package/src/tooltip/tooltip.css +26 -26
  172. package/src/top-navigation/top-navigation.css +243 -259
  173. package/src/tour/tour.css +51 -60
  174. package/src/transfer/transfer.css +160 -164
  175. package/src/tree/tree.css +103 -111
  176. package/src/typography/typography.css +40 -36
  177. package/src/typography/typography.tokens.json +1 -0
  178. package/src/upload/upload.css +224 -224
  179. package/src/visually-hidden/visually-hidden.css +1 -1
  180. 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,23 +652,44 @@
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
 
623
663
  /**
624
- * The label carries a wrapping line height of its own: the control's line
625
- * height is 1, which centres a single line inside the box and crushes the
626
- * second one. A token longer than the container breaks instead of escaping.
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.
627
671
  */
628
- [data-ui='button'] [data-part='label'] {
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
+
678
+ /**
679
+ * The label is one line at its own width. It broke anywhere once, which made
680
+ * a button in a row as narrow as one letter: squeezed, "Corrigir" became
681
+ * three lines and broke inside the word. A row of buttons now overflows, or
682
+ * a toolbar folds what does not fit; a control held narrower than its label
683
+ * by its container — `max-inline-size: 100%` — cuts the label with an
684
+ * ellipsis rather than spilling it past the border. The line height is the
685
+ * text step's, which the trim below reads.
686
+ */
687
+ [data-ui-button] [data-part-label] {
629
688
  line-height: var(--slotted-line-height-sm, 1.45);
630
689
  min-inline-size: 0;
631
- overflow-wrap: anywhere;
690
+ overflow: hidden;
691
+ text-overflow: ellipsis;
692
+ white-space: nowrap;
632
693
  }
633
694
 
634
695
  /**
@@ -656,7 +717,7 @@
656
717
  * of a pixel, which is the only thing the term governs.
657
718
  */
658
719
  @supports (text-box: trim-both cap alphabetic) {
659
- [data-ui='button'] [data-part='label'] {
720
+ [data-ui-button] [data-part-label] {
660
721
  padding-block: calc((var(--slotted-line-height-sm, 1.45) * 1em - 0.75em) / 2);
661
722
  text-box: trim-both cap alphabetic;
662
723
  }
@@ -667,20 +728,40 @@
667
728
  * letter. An icon-only control is exempt, because both of its sides hold
668
729
  * the same glyph and its inset is zero.
669
730
  */
670
- [data-ui='button']:not([data-shape]):has(> [data-part='start']) {
731
+ [data-ui-button]:not([data-shape]):has(> [data-part-start]) {
671
732
  padding-inline-start: var(--_padding-inline-visual);
672
733
  }
673
734
 
674
- [data-ui='button']:not([data-shape]):has(> [data-part='end']) {
735
+ [data-ui-button]:not([data-shape]):has(> [data-part-end]) {
675
736
  padding-inline-end: var(--_padding-inline-visual);
676
737
  }
677
738
 
678
739
  /* ── Inline size ──────────────────────────────────────────────────────── */
679
740
 
680
- [data-ui='button'][data-full-width] {
741
+ [data-ui-button][data-full-width] {
681
742
  inline-size: 100%;
682
743
  }
683
744
 
745
+ /**
746
+ * A field trigger: the label at the start and `end` at the inline end. The
747
+ * label takes the free space, so `start` stays beside it and the end slot is
748
+ * pushed to the edge; flex follows the writing direction, so it mirrors.
749
+ */
750
+ [data-ui-button][data-justify='between'] {
751
+ justify-content: space-between;
752
+ }
753
+
754
+ [data-ui-button][data-justify='between'] > [data-part-label] {
755
+ flex: 1 1 auto;
756
+ text-align: start;
757
+ }
758
+
759
+ /* What a trigger holds at its end — a shortcut, a count — is as wide as it is. */
760
+ [data-ui-button][data-justify='between'] > [data-part-end] {
761
+ inline-size: auto;
762
+ min-inline-size: var(--_icon-size);
763
+ }
764
+
684
765
  /**
685
766
  * An icon-only control is square from the control height, so its visual box
686
767
  * and its target are the same box. The two minimums are the WCAG 2.2 floor
@@ -688,7 +769,7 @@
688
769
  * small in one axis is the family's to correct, and theme validation only
689
770
  * guarantees the block axis.
690
771
  */
691
- [data-ui='button'][data-shape] {
772
+ [data-ui-button][data-shape] {
692
773
  aspect-ratio: 1;
693
774
  inline-size: var(--_height);
694
775
  min-block-size: max(var(--_height), var(--slotted-target-min, 24px));
@@ -697,7 +778,7 @@
697
778
  padding-inline: 0;
698
779
  }
699
780
 
700
- [data-ui='button'][data-shape='circle'] {
781
+ [data-ui-button][data-shape='circle'] {
701
782
  border-radius: var(--slotted-radius-full, 9999px);
702
783
  }
703
784
 
@@ -711,16 +792,16 @@
711
792
  * for a fill the system has flattened.
712
793
  */
713
794
  @media (forced-colors: active) {
714
- [data-ui='button'] {
795
+ [data-ui-button] {
715
796
  border-color: ButtonBorder;
716
797
  }
717
798
 
718
- [data-ui='button'][data-pressed] {
799
+ [data-ui-button][data-pressed] {
719
800
  border-color: Highlight;
720
801
  }
721
802
 
722
- [data-ui='button']:disabled,
723
- [data-ui='button'][data-disabled] {
803
+ [data-ui-button]:disabled,
804
+ [data-ui-button][data-disabled] {
724
805
  border-color: GrayText;
725
806
  color: GrayText;
726
807
  }
@@ -731,7 +812,7 @@
731
812
  * shows the wait, and the sweep above is the loop this sheet owns.
732
813
  */
733
814
  @media (prefers-reduced-motion: reduce) {
734
- [data-ui='button'] [data-part='indicator'] {
815
+ [data-ui-button] [data-part-indicator] {
735
816
  animation: none;
736
817
  }
737
818
  }
@@ -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",