@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
@@ -24,7 +24,7 @@
24
24
  * some, so the ring is held off the edge at the foundation's offset, where
25
25
  * the joined bar draws it inward.
26
26
  */
27
- [data-ui='toggle'][data-part='root'] {
27
+ [data-ui-toggle][data-part-root] {
28
28
  --_height: var(--slotted-control-height-md, 34px);
29
29
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
30
30
  --_font-size: var(--slotted-control-font-size-md, 13px);
@@ -93,7 +93,7 @@
93
93
 
94
94
  /* ── Size ─────────────────────────────────────────────────────────────── */
95
95
 
96
- [data-ui='toggle'][data-part='root'][data-size='sm'] {
96
+ [data-ui-toggle][data-part-root][data-size='sm'] {
97
97
  --_height: var(--slotted-control-height-sm, 30px);
98
98
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
99
99
  --_font-size: var(--slotted-control-font-size-sm, 12px);
@@ -101,7 +101,7 @@
101
101
  --_gap: var(--slotted-control-gap-sm, 6px);
102
102
  }
103
103
 
104
- [data-ui='toggle'][data-part='root'][data-size='lg'] {
104
+ [data-ui-toggle][data-part-root][data-size='lg'] {
105
105
  --_height: var(--slotted-control-height-lg, 38px);
106
106
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
107
107
  --_font-size: var(--slotted-control-font-size-lg, 14px);
@@ -118,12 +118,12 @@
118
118
  * words: the Angular binding projects the words into a box it always
119
119
  * renders, and a box with nothing in it must not hold the gap open either.
120
120
  */
121
- [data-ui='toggle'][data-part='root']:not(:has([data-part='label']:not(:empty))) {
121
+ [data-ui-toggle][data-part-root]:not(:has([data-part-label]:not(:empty))) {
122
122
  inline-size: var(--_height);
123
123
  padding-inline: 0;
124
124
  }
125
125
 
126
- [data-ui='toggle'] [data-part='label']:empty {
126
+ [data-ui-toggle] [data-part-label]:empty {
127
127
  display: none;
128
128
  }
129
129
 
@@ -132,7 +132,7 @@
132
132
  * from its container, and a bare glyph host such as `ng-icon` reads the
133
133
  * slot's font-size, so both are the glyph scale.
134
134
  */
135
- [data-ui='toggle'] [data-part='icon'] {
135
+ [data-ui-toggle] [data-part-icon] {
136
136
  --slotted-icon-size: var(--_icon-size);
137
137
 
138
138
  block-size: var(--_icon-size);
@@ -142,7 +142,7 @@
142
142
  inline-size: var(--_icon-size);
143
143
  }
144
144
 
145
- [data-ui='toggle'] [data-part='icon'] > * {
145
+ [data-ui-toggle] [data-part-icon] > * {
146
146
  block-size: 100%;
147
147
  display: block;
148
148
  inline-size: 100%;
@@ -155,7 +155,7 @@
155
155
  * whole in the DOM — the library's rule is that truncation never removes
156
156
  * content.
157
157
  */
158
- [data-ui='toggle'] [data-part='label'] {
158
+ [data-ui-toggle] [data-part-label] {
159
159
  overflow: hidden;
160
160
  text-overflow: ellipsis;
161
161
  white-space: nowrap;
@@ -163,7 +163,7 @@
163
163
 
164
164
  /* ── The edge ─────────────────────────────────────────────────────────── */
165
165
 
166
- [data-ui='toggle'][data-part='root'][data-variant='outline'] {
166
+ [data-ui-toggle][data-part-root][data-variant='outline'] {
167
167
  border-color: var(--_border-color);
168
168
  /* A framed control lifts off its ground at rest, as button's outline does. */
169
169
  box-shadow: var(--slotted-toggle-shadow, var(--slotted-control-shadow, none));
@@ -177,7 +177,7 @@
177
177
  * `STATE_PRECEDENCE` sets. Both variants take the edge: a ghost toggle that
178
178
  * is on has become a framed thing, and the edge is half of what says so.
179
179
  */
180
- [data-ui='toggle'][data-part='root'][data-pressed]:not(:disabled):not([data-disabled]) {
180
+ [data-ui-toggle][data-part-root][data-pressed]:not(:disabled):not([data-disabled]) {
181
181
  background: var(
182
182
  --slotted-toggle-pressed-background,
183
183
  var(--slotted-tone-accent-subtle-active, Highlight)
@@ -198,18 +198,14 @@
198
198
  * is on answers the pointer on the accent ground's own steps, so the two
199
199
  * states share no surface in any of theirs.
200
200
  */
201
- [data-ui='toggle'][data-part='root']:hover:not(:disabled):not([data-disabled]):not(
202
- [data-pressed]
203
- ) {
201
+ [data-ui-toggle][data-part-root]:hover:not(:disabled):not([data-disabled]):not([data-pressed]) {
204
202
  background: var(
205
203
  --slotted-toggle-hover-background,
206
204
  var(--slotted-tone-secondary-subtle-hover, ButtonFace)
207
205
  );
208
206
  }
209
207
 
210
- [data-ui='toggle'][data-part='root']:active:not(:disabled):not([data-disabled]):not(
211
- [data-pressed]
212
- ) {
208
+ [data-ui-toggle][data-part-root]:active:not(:disabled):not([data-disabled]):not([data-pressed]) {
213
209
  background: var(
214
210
  --slotted-toggle-active-background,
215
211
  var(--slotted-tone-secondary-subtle-active, ButtonFace)
@@ -220,14 +216,14 @@
220
216
  transition-duration: var(--slotted-duration-instant);
221
217
  }
222
218
 
223
- [data-ui='toggle'][data-part='root'][data-pressed]:hover:not(:disabled):not([data-disabled]) {
219
+ [data-ui-toggle][data-part-root][data-pressed]:hover:not(:disabled):not([data-disabled]) {
224
220
  background: var(
225
221
  --slotted-toggle-pressed-hover-background,
226
222
  var(--slotted-tone-accent-subtle-hover, Highlight)
227
223
  );
228
224
  }
229
225
 
230
- [data-ui='toggle'][data-part='root'][data-pressed]:active:not(:disabled):not([data-disabled]) {
226
+ [data-ui-toggle][data-part-root][data-pressed]:active:not(:disabled):not([data-disabled]) {
231
227
  background: var(
232
228
  --slotted-toggle-pressed-background,
233
229
  var(--slotted-tone-accent-subtle-active, Highlight)
@@ -235,13 +231,54 @@
235
231
  transition-duration: var(--slotted-duration-instant);
236
232
  }
237
233
 
234
+ /**
235
+ * ── Chips ──────────────────────────────────────────────────────────────
236
+ *
237
+ * The same chip `toggle-group` draws: a rounded item with the control edge,
238
+ * pressed in the neutral tone's ink.
239
+ */
240
+ [data-ui-toggle][data-part-root][data-variant='chips'] {
241
+ border-color: var(--_border-color);
242
+ border-radius: var(--slotted-toggle-chips-radius, var(--slotted-radius-full, 9999px));
243
+ font-weight: var(--slotted-font-weight-medium, 500);
244
+ }
245
+
246
+ [data-ui-toggle][data-part-root][data-variant='chips'][data-pressed]:not(:disabled):not(
247
+ [data-disabled]
248
+ ),
249
+ [data-ui-toggle][data-part-root][data-variant='chips'][data-pressed]:active:not(:disabled):not(
250
+ [data-disabled]
251
+ ) {
252
+ background: var(
253
+ --slotted-toggle-chips-pressed-background,
254
+ var(--slotted-tone-neutral-solid, CanvasText)
255
+ );
256
+ border-color: var(
257
+ --slotted-toggle-chips-pressed-background,
258
+ var(--slotted-tone-neutral-solid, CanvasText)
259
+ );
260
+ color: var(--slotted-toggle-chips-pressed-color, var(--slotted-tone-neutral-on-solid, Canvas));
261
+ }
262
+
263
+ [data-ui-toggle][data-part-root][data-variant='chips'][data-pressed]:hover:not(:disabled):not(
264
+ [data-disabled]
265
+ ) {
266
+ background: var(--slotted-tone-neutral-solid-hover, CanvasText);
267
+ border-color: var(--slotted-tone-neutral-solid-hover, CanvasText);
268
+ }
269
+
270
+ [data-ui-toggle][data-part-root][data-variant='chips']:disabled,
271
+ [data-ui-toggle][data-part-root][data-variant='chips'][data-disabled] {
272
+ border-color: var(--slotted-disabled-border, GrayText);
273
+ }
274
+
238
275
  /* ── Focus ────────────────────────────────────────────────────────────── */
239
276
 
240
277
  /**
241
278
  * A standalone control has room around it, so the ring is held off the
242
279
  * edge the way every other control in the library holds it.
243
280
  */
244
- [data-ui='toggle'][data-part='root']:focus-visible {
281
+ [data-ui-toggle][data-part-root]:focus-visible {
245
282
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
246
283
  outline-offset: var(--slotted-focus-ring-offset, 2px);
247
284
  }
@@ -252,15 +289,15 @@
252
289
  * `[data-disabled]` as well as `:disabled`, because a control taken out of
253
290
  * action with a `fieldset` carries no attribute of its own.
254
291
  */
255
- [data-ui='toggle'][data-part='root']:disabled,
256
- [data-ui='toggle'][data-part='root'][data-disabled] {
292
+ [data-ui-toggle][data-part-root]:disabled,
293
+ [data-ui-toggle][data-part-root][data-disabled] {
257
294
  background: transparent;
258
295
  color: var(--slotted-toggle-disabled-color, var(--slotted-disabled-foreground, GrayText));
259
296
  cursor: not-allowed;
260
297
  }
261
298
 
262
- [data-ui='toggle'][data-part='root'][data-variant='outline']:disabled,
263
- [data-ui='toggle'][data-part='root'][data-variant='outline'][data-disabled] {
299
+ [data-ui-toggle][data-part-root][data-variant='outline']:disabled,
300
+ [data-ui-toggle][data-part-root][data-variant='outline'][data-disabled] {
264
301
  border-color: var(
265
302
  --slotted-toggle-disabled-border-color,
266
303
  var(--slotted-disabled-border, GrayText)
@@ -276,8 +313,8 @@
276
313
  * cannot change. In `high-contrast` the ground is the page's own white, and
277
314
  * the edge is then the only thing carrying it.
278
315
  */
279
- [data-ui='toggle'][data-part='root'][data-pressed]:disabled,
280
- [data-ui='toggle'][data-part='root'][data-pressed][data-disabled] {
316
+ [data-ui-toggle][data-part-root][data-pressed]:disabled,
317
+ [data-ui-toggle][data-part-root][data-pressed][data-disabled] {
281
318
  background: var(
282
319
  --slotted-toggle-disabled-pressed-background,
283
320
  var(--slotted-disabled-background, ButtonFace)
@@ -31,9 +31,14 @@
31
31
  "--slotted-focus-ring-color",
32
32
  "--slotted-focus-ring-offset",
33
33
  "--slotted-focus-ring-width",
34
+ "--slotted-font-weight-medium",
35
+ "--slotted-radius-full",
34
36
  "--slotted-text",
35
37
  "--slotted-toggle-active-background",
36
38
  "--slotted-toggle-border-color",
39
+ "--slotted-toggle-chips-pressed-background",
40
+ "--slotted-toggle-chips-pressed-color",
41
+ "--slotted-toggle-chips-radius",
37
42
  "--slotted-toggle-color",
38
43
  "--slotted-toggle-disabled-border-color",
39
44
  "--slotted-toggle-disabled-color",
@@ -49,6 +54,9 @@
49
54
  "--slotted-tone-accent-subtle-active",
50
55
  "--slotted-tone-accent-subtle-hover",
51
56
  "--slotted-tone-accent-text",
57
+ "--slotted-tone-neutral-on-solid",
58
+ "--slotted-tone-neutral-solid",
59
+ "--slotted-tone-neutral-solid-hover",
52
60
  "--slotted-tone-secondary-subtle-active",
53
61
  "--slotted-tone-secondary-subtle-hover"
54
62
  ]
@@ -32,7 +32,7 @@
32
32
  * correctly: a coloured border inside a grey one, and an edge that was one
33
33
  * pixel in places and two in others.
34
34
  */
35
- [data-ui='toggle-group'][data-part='root'] {
35
+ [data-ui-toggle-group][data-part-root] {
36
36
  --_height: var(--slotted-control-height-md, 34px);
37
37
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
38
38
  --_font-size: var(--slotted-control-font-size-md, 13px);
@@ -76,13 +76,13 @@
76
76
  * from a permission filter renders one often, and an empty box still eats a
77
77
  * gap in the row that holds it — `button-group` records the same defect.
78
78
  */
79
- [data-ui='toggle-group'][data-part='root']:empty {
79
+ [data-ui-toggle-group][data-part-root]:empty {
80
80
  display: none;
81
81
  }
82
82
 
83
83
  /* ── Size ─────────────────────────────────────────────────────────────── */
84
84
 
85
- [data-ui='toggle-group'][data-part='root'][data-size='sm'] {
85
+ [data-ui-toggle-group][data-part-root][data-size='sm'] {
86
86
  --_height: var(--slotted-control-height-sm, 30px);
87
87
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
88
88
  --_font-size: var(--slotted-control-font-size-sm, 12px);
@@ -90,7 +90,7 @@
90
90
  --_gap: var(--slotted-control-gap-sm, 6px);
91
91
  }
92
92
 
93
- [data-ui='toggle-group'][data-part='root'][data-size='lg'] {
93
+ [data-ui-toggle-group][data-part-root][data-size='lg'] {
94
94
  --_height: var(--slotted-control-height-lg, 38px);
95
95
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
96
96
  --_font-size: var(--slotted-control-font-size-lg, 14px);
@@ -100,7 +100,7 @@
100
100
 
101
101
  /* ── Orientation ──────────────────────────────────────────────────────── */
102
102
 
103
- [data-ui='toggle-group'][data-part='root'][data-orientation='vertical'] {
103
+ [data-ui-toggle-group][data-part-root][data-orientation='vertical'] {
104
104
  flex-direction: column;
105
105
  }
106
106
 
@@ -111,18 +111,18 @@
111
111
  * shrinks to its content, which is what a set of formatting toggles beside a
112
112
  * paragraph needs and what every surveyed implementation defaults to.
113
113
  */
114
- [data-ui='toggle-group'][data-part='root'][data-full-width] {
114
+ [data-ui-toggle-group][data-part-root][data-full-width] {
115
115
  display: flex;
116
116
  inline-size: 100%;
117
117
  }
118
118
 
119
- [data-ui='toggle-group'][data-part='root'][data-full-width] [data-part='item'] {
119
+ [data-ui-toggle-group][data-part-root][data-full-width] [data-part-item] {
120
120
  flex: 1 1 0;
121
121
  }
122
122
 
123
123
  /* ── The item ─────────────────────────────────────────────────────────── */
124
124
 
125
- [data-ui='toggle-group'] [data-part='item'] {
125
+ [data-ui-toggle-group] [data-part-item] {
126
126
  align-items: center;
127
127
  appearance: none;
128
128
  background: transparent;
@@ -176,11 +176,11 @@
176
176
  * An item with no words is a square holding one mark, so its inline padding
177
177
  * is whatever centres that mark rather than the padding a label needs.
178
178
  */
179
- [data-ui='toggle-group'] [data-part='item']:not(:has([data-part='label'])) {
179
+ [data-ui-toggle-group] [data-part-item]:not(:has([data-part-label])) {
180
180
  padding-inline: 0;
181
181
  }
182
182
 
183
- [data-ui='toggle-group'] [data-part='icon'] {
183
+ [data-ui-toggle-group] [data-part-icon] {
184
184
  block-size: var(--_icon-size);
185
185
  display: inline-flex;
186
186
  flex: none;
@@ -193,7 +193,7 @@
193
193
  * and what an icon beside it is aligned against. The string stays whole in
194
194
  * the DOM — the library's rule is that truncation never removes content.
195
195
  */
196
- [data-ui='toggle-group'] [data-part='label'] {
196
+ [data-ui-toggle-group] [data-part-label] {
197
197
  overflow: hidden;
198
198
  text-overflow: ellipsis;
199
199
  white-space: nowrap;
@@ -201,12 +201,12 @@
201
201
 
202
202
  /* ── The edge ─────────────────────────────────────────────────────────── */
203
203
 
204
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'] [data-part='item'] {
204
+ [data-ui-toggle-group][data-part-root][data-variant='outline'] [data-part-item] {
205
205
  border-color: var(--_border-color);
206
206
  /* A framed item lifts off its ground at rest, as button's outline does. */
207
207
  box-shadow: var(--slotted-toggle-group-shadow, var(--slotted-control-shadow, none));
208
208
  }
209
- [data-ui='toggle-group'][data-part='root']:not([data-attached]) {
209
+ [data-ui-toggle-group][data-part-root]:not([data-attached]) {
210
210
  gap: var(--_separation);
211
211
  }
212
212
 
@@ -231,54 +231,54 @@
231
231
  * anything: an item that is on replaces the grey line in its column with its
232
232
  * own, and the bar's outline stays one pixel everywhere.
233
233
  */
234
- [data-ui='toggle-group'][data-part='root'][data-attached]:not([data-orientation='vertical'])
235
- [data-part='item']
236
- + [data-part='item'] {
234
+ [data-ui-toggle-group][data-part-root][data-attached]:not([data-orientation='vertical'])
235
+ [data-part-item]
236
+ + [data-part-item] {
237
237
  margin-inline-start: var(--_overlap);
238
238
  }
239
239
 
240
- [data-ui='toggle-group'][data-part='root'][data-attached][data-orientation='vertical']
241
- [data-part='item']
242
- + [data-part='item'] {
240
+ [data-ui-toggle-group][data-part-root][data-attached][data-orientation='vertical']
241
+ [data-part-item]
242
+ + [data-part-item] {
243
243
  margin-block-start: var(--_overlap);
244
244
  }
245
245
 
246
- [data-ui='toggle-group'][data-part='root'][data-attached]:not([data-orientation='vertical'])
247
- [data-part='item'] {
246
+ [data-ui-toggle-group][data-part-root][data-attached]:not([data-orientation='vertical'])
247
+ [data-part-item] {
248
248
  border-end-start-radius: 0;
249
249
  border-end-end-radius: 0;
250
250
  border-start-start-radius: 0;
251
251
  border-start-end-radius: 0;
252
252
  }
253
253
 
254
- [data-ui='toggle-group'][data-part='root'][data-attached]:not([data-orientation='vertical'])
255
- [data-part='item']:first-child {
254
+ [data-ui-toggle-group][data-part-root][data-attached]:not([data-orientation='vertical'])
255
+ [data-part-item]:first-child {
256
256
  border-end-start-radius: var(--_radius);
257
257
  border-start-start-radius: var(--_radius);
258
258
  }
259
259
 
260
- [data-ui='toggle-group'][data-part='root'][data-attached]:not([data-orientation='vertical'])
261
- [data-part='item']:last-child {
260
+ [data-ui-toggle-group][data-part-root][data-attached]:not([data-orientation='vertical'])
261
+ [data-part-item]:last-child {
262
262
  border-end-end-radius: var(--_radius);
263
263
  border-start-end-radius: var(--_radius);
264
264
  }
265
265
 
266
- [data-ui='toggle-group'][data-part='root'][data-attached][data-orientation='vertical']
267
- [data-part='item'] {
266
+ [data-ui-toggle-group][data-part-root][data-attached][data-orientation='vertical']
267
+ [data-part-item] {
268
268
  border-end-start-radius: 0;
269
269
  border-end-end-radius: 0;
270
270
  border-start-start-radius: 0;
271
271
  border-start-end-radius: 0;
272
272
  }
273
273
 
274
- [data-ui='toggle-group'][data-part='root'][data-attached][data-orientation='vertical']
275
- [data-part='item']:first-child {
274
+ [data-ui-toggle-group][data-part-root][data-attached][data-orientation='vertical']
275
+ [data-part-item]:first-child {
276
276
  border-start-end-radius: var(--_radius);
277
277
  border-start-start-radius: var(--_radius);
278
278
  }
279
279
 
280
- [data-ui='toggle-group'][data-part='root'][data-attached][data-orientation='vertical']
281
- [data-part='item']:last-child {
280
+ [data-ui-toggle-group][data-part-root][data-attached][data-orientation='vertical']
281
+ [data-part-item]:last-child {
282
282
  border-end-end-radius: var(--_radius);
283
283
  border-end-start-radius: var(--_radius);
284
284
  }
@@ -290,29 +290,29 @@
290
290
  * four edges, and the neighbour after it gives up the leading edge that would
291
291
  * otherwise be painted over the accent one.
292
292
  */
293
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'][data-attached]:not(
293
+ [data-ui-toggle-group][data-part-root][data-variant='outline'][data-attached]:not(
294
294
  [data-orientation='vertical']
295
295
  )
296
- [data-part='item']:not(:last-child):not([data-pressed]) {
296
+ [data-part-item]:not(:last-child):not([data-pressed]) {
297
297
  border-inline-end-color: transparent;
298
298
  }
299
299
 
300
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'][data-attached][data-orientation='vertical']
301
- [data-part='item']:not(:last-child):not([data-pressed]) {
300
+ [data-ui-toggle-group][data-part-root][data-variant='outline'][data-attached][data-orientation='vertical']
301
+ [data-part-item]:not(:last-child):not([data-pressed]) {
302
302
  border-block-end-color: transparent;
303
303
  }
304
304
 
305
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'][data-attached]:not(
305
+ [data-ui-toggle-group][data-part-root][data-variant='outline'][data-attached]:not(
306
306
  [data-orientation='vertical']
307
307
  )
308
- [data-part='item'][data-pressed]
309
- + [data-part='item'] {
308
+ [data-part-item][data-pressed]
309
+ + [data-part-item] {
310
310
  border-inline-start-color: transparent;
311
311
  }
312
312
 
313
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'][data-attached][data-orientation='vertical']
314
- [data-part='item'][data-pressed]
315
- + [data-part='item'] {
313
+ [data-ui-toggle-group][data-part-root][data-variant='outline'][data-attached][data-orientation='vertical']
314
+ [data-part-item][data-pressed]
315
+ + [data-part-item] {
316
316
  border-block-start-color: transparent;
317
317
  }
318
318
 
@@ -327,7 +327,7 @@
327
327
  * It sits above hover and below disabled, which is the order
328
328
  * `STATE_PRECEDENCE` sets.
329
329
  */
330
- [data-ui='toggle-group'] [data-part='item'][data-pressed]:not(:disabled):not([data-disabled]) {
330
+ [data-ui-toggle-group] [data-part-item][data-pressed]:not(:disabled):not([data-disabled]) {
331
331
  background: var(
332
332
  --slotted-toggle-group-pressed-background,
333
333
  var(--slotted-tone-accent-subtle-active, Highlight)
@@ -342,7 +342,7 @@
342
342
  );
343
343
  }
344
344
 
345
- [data-ui='toggle-group'] [data-part='item'][data-pressed] {
345
+ [data-ui-toggle-group] [data-part-item][data-pressed] {
346
346
  z-index: 1;
347
347
  }
348
348
 
@@ -355,16 +355,16 @@
355
355
  * that is on answers the pointer on the accent ground's own steps, so the
356
356
  * two states share no surface in any of theirs.
357
357
  */
358
- [data-ui='toggle-group']
359
- [data-part='item']:hover:not(:disabled):not([data-disabled]):not([data-pressed]) {
358
+ [data-ui-toggle-group]
359
+ [data-part-item]:hover:not(:disabled):not([data-disabled]):not([data-pressed]) {
360
360
  background: var(
361
361
  --slotted-toggle-group-hover-background,
362
362
  var(--slotted-tone-secondary-subtle-hover, ButtonFace)
363
363
  );
364
364
  }
365
365
 
366
- [data-ui='toggle-group']
367
- [data-part='item']:active:not(:disabled):not([data-disabled]):not([data-pressed]) {
366
+ [data-ui-toggle-group]
367
+ [data-part-item]:active:not(:disabled):not([data-disabled]):not([data-pressed]) {
368
368
  background: var(
369
369
  --slotted-toggle-group-active-background,
370
370
  var(--slotted-tone-secondary-subtle-active, ButtonFace)
@@ -375,16 +375,14 @@
375
375
  transition-duration: var(--slotted-duration-instant);
376
376
  }
377
377
 
378
- [data-ui='toggle-group']
379
- [data-part='item'][data-pressed]:hover:not(:disabled):not([data-disabled]) {
378
+ [data-ui-toggle-group] [data-part-item][data-pressed]:hover:not(:disabled):not([data-disabled]) {
380
379
  background: var(
381
380
  --slotted-toggle-group-pressed-hover-background,
382
381
  var(--slotted-tone-accent-subtle-hover, Highlight)
383
382
  );
384
383
  }
385
384
 
386
- [data-ui='toggle-group']
387
- [data-part='item'][data-pressed]:active:not(:disabled):not([data-disabled]) {
385
+ [data-ui-toggle-group] [data-part-item][data-pressed]:active:not(:disabled):not([data-disabled]) {
388
386
  background: var(
389
387
  --slotted-toggle-group-pressed-background,
390
388
  var(--slotted-tone-accent-subtle-active, Highlight)
@@ -392,6 +390,55 @@
392
390
  transition-duration: var(--slotted-duration-instant);
393
391
  }
394
392
 
393
+ /**
394
+ * ── Chips ──────────────────────────────────────────────────────────────
395
+ *
396
+ * A short list of choices as separate rounded items that wrap onto a second
397
+ * line rather than overflow, never joined into a bar. A chip at rest has the
398
+ * control edge; the pressed one is the neutral tone's ink — its solid ground
399
+ * under its own label — which is the one state a chip has to say at a
400
+ * glance. Hover and press move the ground of a chip at rest only.
401
+ */
402
+ [data-ui-toggle-group][data-part-root][data-variant='chips'] {
403
+ flex-wrap: wrap;
404
+ gap: var(--slotted-toggle-group-chips-gap, var(--slotted-space-3, 0.375rem));
405
+ }
406
+
407
+ [data-ui-toggle-group][data-part-root][data-variant='chips'] [data-part-item] {
408
+ border-color: var(--_border-color);
409
+ border-radius: var(--slotted-toggle-group-chips-radius, var(--slotted-radius-full, 9999px));
410
+ font-weight: var(--slotted-font-weight-medium, 500);
411
+ }
412
+
413
+ [data-ui-toggle-group][data-part-root][data-variant='chips']
414
+ [data-part-item][data-pressed]:not(:disabled):not([data-disabled]),
415
+ [data-ui-toggle-group][data-part-root][data-variant='chips']
416
+ [data-part-item][data-pressed]:active:not(:disabled):not([data-disabled]) {
417
+ background: var(
418
+ --slotted-toggle-group-chips-pressed-background,
419
+ var(--slotted-tone-neutral-solid, CanvasText)
420
+ );
421
+ border-color: var(
422
+ --slotted-toggle-group-chips-pressed-background,
423
+ var(--slotted-tone-neutral-solid, CanvasText)
424
+ );
425
+ color: var(
426
+ --slotted-toggle-group-chips-pressed-color,
427
+ var(--slotted-tone-neutral-on-solid, Canvas)
428
+ );
429
+ }
430
+
431
+ [data-ui-toggle-group][data-part-root][data-variant='chips']
432
+ [data-part-item][data-pressed]:hover:not(:disabled):not([data-disabled]) {
433
+ background: var(--slotted-tone-neutral-solid-hover, CanvasText);
434
+ border-color: var(--slotted-tone-neutral-solid-hover, CanvasText);
435
+ }
436
+
437
+ [data-ui-toggle-group][data-part-root][data-variant='chips'] [data-part-item]:disabled,
438
+ [data-ui-toggle-group][data-part-root][data-variant='chips'] [data-part-item][data-disabled] {
439
+ border-color: var(--slotted-disabled-border, GrayText);
440
+ }
441
+
395
442
  /* ── Focus ────────────────────────────────────────────────────────────── */
396
443
 
397
444
  /**
@@ -399,7 +446,7 @@
399
446
  * edge the way every other control in the library holds it. The focused item
400
447
  * is raised above every other, including one that is on.
401
448
  */
402
- [data-ui='toggle-group'] [data-part='item']:focus-visible {
449
+ [data-ui-toggle-group] [data-part-item]:focus-visible {
403
450
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
404
451
  outline-offset: var(--slotted-focus-ring-offset, 2px);
405
452
  z-index: 2;
@@ -417,7 +464,7 @@
417
464
  * gives. It then replaces that item's own border rather than standing beside
418
465
  * it, and every seam in the bar stays one line wide.
419
466
  */
420
- [data-ui='toggle-group'][data-part='root'][data-attached] [data-part='item']:focus-visible {
467
+ [data-ui-toggle-group][data-part-root][data-attached] [data-part-item]:focus-visible {
421
468
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
422
469
  }
423
470
 
@@ -428,16 +475,15 @@
428
475
  * out of action with a `fieldset` and its items then carry no attribute of
429
476
  * their own.
430
477
  */
431
- [data-ui='toggle-group'] [data-part='item']:disabled,
432
- [data-ui='toggle-group'] [data-part='item'][data-disabled] {
478
+ [data-ui-toggle-group] [data-part-item]:disabled,
479
+ [data-ui-toggle-group] [data-part-item][data-disabled] {
433
480
  background: transparent;
434
481
  color: var(--slotted-toggle-group-disabled-color, var(--slotted-disabled-foreground, GrayText));
435
482
  cursor: default;
436
483
  }
437
484
 
438
- [data-ui='toggle-group'][data-part='root'][data-variant='outline'] [data-part='item']:disabled,
439
- [data-ui='toggle-group'][data-part='root'][data-variant='outline']
440
- [data-part='item'][data-disabled] {
485
+ [data-ui-toggle-group][data-part-root][data-variant='outline'] [data-part-item]:disabled,
486
+ [data-ui-toggle-group][data-part-root][data-variant='outline'] [data-part-item][data-disabled] {
441
487
  border-color: var(
442
488
  --slotted-toggle-group-disabled-border-color,
443
489
  var(--slotted-disabled-border, GrayText)
@@ -453,8 +499,8 @@
453
499
  * a control they cannot change. In `high-contrast` the ground is the page's
454
500
  * own white, and the edge is then the only thing carrying it.
455
501
  */
456
- [data-ui='toggle-group'] [data-part='item'][data-pressed]:disabled,
457
- [data-ui='toggle-group'] [data-part='item'][data-pressed][data-disabled] {
502
+ [data-ui-toggle-group] [data-part-item][data-pressed]:disabled,
503
+ [data-ui-toggle-group] [data-part-item][data-pressed][data-disabled] {
458
504
  background: var(
459
505
  --slotted-toggle-group-disabled-pressed-background,
460
506
  var(--slotted-disabled-background, ButtonFace)
@@ -31,9 +31,16 @@
31
31
  "--slotted-focus-ring-color",
32
32
  "--slotted-focus-ring-offset",
33
33
  "--slotted-focus-ring-width",
34
+ "--slotted-font-weight-medium",
35
+ "--slotted-radius-full",
36
+ "--slotted-space-3",
34
37
  "--slotted-text",
35
38
  "--slotted-toggle-group-active-background",
36
39
  "--slotted-toggle-group-border-color",
40
+ "--slotted-toggle-group-chips-gap",
41
+ "--slotted-toggle-group-chips-pressed-background",
42
+ "--slotted-toggle-group-chips-pressed-color",
43
+ "--slotted-toggle-group-chips-radius",
37
44
  "--slotted-toggle-group-color",
38
45
  "--slotted-toggle-group-disabled-border-color",
39
46
  "--slotted-toggle-group-disabled-color",
@@ -49,6 +56,9 @@
49
56
  "--slotted-tone-accent-subtle-active",
50
57
  "--slotted-tone-accent-subtle-hover",
51
58
  "--slotted-tone-accent-text",
59
+ "--slotted-tone-neutral-on-solid",
60
+ "--slotted-tone-neutral-solid",
61
+ "--slotted-tone-neutral-solid-hover",
52
62
  "--slotted-tone-secondary-subtle-active",
53
63
  "--slotted-tone-secondary-subtle-hover"
54
64
  ]