@slotted/styles 0.1.0-beta.1 → 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
@@ -28,7 +28,7 @@
28
28
  * scrolling surface are all `select`'s decisions, taken in the same session
29
29
  * and written out in `packages/styles/src/select/select.css`. They are
30
30
  * repeated here rather than shared because the two families have two public
31
- * identifiers, and a stylesheet that painted `[data-ui='select']` from a
31
+ * identifiers, and a stylesheet that painted `[data-ui-select]` from a
32
32
  * combobox would make one family's selector match the other's DOM. The
33
33
  * duplication is the price of that boundary and it is paid on purpose.
34
34
  *
@@ -54,7 +54,7 @@
54
54
 
55
55
  /* ── The control ──────────────────────────────────────────────────────── */
56
56
 
57
- [data-ui='combobox'][data-part='root'] {
57
+ [data-ui-combobox][data-part-root] {
58
58
  --_font-size: var(--slotted-control-font-size-md, 13px);
59
59
  --_height: var(--slotted-control-height-md, 34px);
60
60
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
@@ -102,7 +102,7 @@
102
102
  box-shadow var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
103
103
  }
104
104
 
105
- [data-ui='combobox'][data-part='root']:not([data-full-width]) {
105
+ [data-ui-combobox][data-part-root]:not([data-full-width]) {
106
106
  inline-size: auto;
107
107
  }
108
108
 
@@ -113,7 +113,7 @@
113
113
  * `autocomplete="both"` writes as a selected range rather than as text, so
114
114
  * the next character typed replaces it.
115
115
  */
116
- [data-ui='combobox'] > [data-part='input'] {
116
+ [data-ui-combobox] > [data-part-input] {
117
117
  background-color: transparent;
118
118
  /* The frame's border box, not its content box: on a coarse pointer the frame
119
119
  is the touch target's height and the control it holds is too. Stretched
@@ -135,7 +135,7 @@
135
135
  text-overflow: ellipsis;
136
136
  }
137
137
 
138
- [data-ui='combobox'] > [data-part='input']::placeholder {
138
+ [data-ui-combobox] > [data-part-input]::placeholder {
139
139
  color: var(--slotted-combobox-placeholder-color, var(--slotted-text-muted, GrayText));
140
140
  text-overflow: ellipsis;
141
141
  }
@@ -146,7 +146,7 @@
146
146
  * the theme's accent tone is what that paint should be, rather than the
147
147
  * browser's blue in a form that is not blue.
148
148
  */
149
- [data-ui='combobox'] > [data-part='input']::selection {
149
+ [data-ui-combobox] > [data-part-input]::selection {
150
150
  background-color: var(
151
151
  --slotted-combobox-completion-background,
152
152
  var(--slotted-tone-accent-surface)
@@ -155,20 +155,32 @@
155
155
  }
156
156
 
157
157
  /**
158
- * Autofill. Chrome paints its own ground over the control's, and a
159
- * hundred-pixel inset shadow is the only way to reach it. The signal is kept
160
- * rather than erased, in the accent surface the theme owns — the repair
161
- * `text-field` makes, for the same reason.
158
+ * Autofill. Chrome paints its own ground over the input, and a hundred-pixel
159
+ * inset shadow is the only way to reach it. The signal is kept rather than
160
+ * erased, in the accent surface the theme owns, and it is the whole
161
+ * control's: the frame takes the tint under its border and inside its
162
+ * corner, and the input repaints the browser's ground in the same colour.
163
+ * Painted on the input alone, the tint left the frame's padding, the slots
164
+ * and the buttons bare, and covered the border the input overlaps by one width.
162
165
  */
163
- [data-ui='combobox'] > [data-part='input']:autofill {
166
+ [data-ui-combobox][data-part-root]:has(> [data-part-input]:autofill) {
167
+ background-color: var(
168
+ --slotted-combobox-autofill-background,
169
+ var(--slotted-tone-accent-surface)
170
+ );
171
+ }
172
+
173
+ [data-ui-combobox] > [data-part-input]:autofill {
164
174
  box-shadow: inset 0 0 0 100px
165
175
  var(--slotted-combobox-autofill-background, var(--slotted-tone-accent-surface));
176
+ /* The input overlaps the frame's border by one width; the tint stops at it. */
177
+ clip-path: inset(var(--slotted-control-border-width, 1px) 0);
166
178
  -webkit-text-fill-color: var(--slotted-combobox-color, var(--slotted-text, CanvasText));
167
179
  }
168
180
 
169
181
  /* ── The two buttons inside the frame ─────────────────────────────────── */
170
182
 
171
- [data-ui='combobox'] > :is([data-part='clear'], [data-part='trigger']) {
183
+ [data-ui-combobox] > :is([data-part-clear], [data-part-trigger]) {
172
184
  align-items: center;
173
185
  appearance: none;
174
186
  background-color: transparent;
@@ -199,7 +211,7 @@
199
211
  * control is 24 pixels tall — the WCAG 2.2 minimum — so nothing drawn inside
200
212
  * it can also be 24.
201
213
  */
202
- [data-ui='combobox'] > :is([data-part='clear'], [data-part='trigger'])::after {
214
+ [data-ui-combobox] > :is([data-part-clear], [data-part-trigger])::after {
203
215
  content: '';
204
216
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
205
217
  position: absolute;
@@ -210,22 +222,22 @@
210
222
  the hit area above grows to 44 pixels around them. Side by side, neither
211
223
  button reaches across the edge the two share. */
212
224
  @media (pointer: coarse) {
213
- [data-ui='combobox'] > :is([data-part='clear'], [data-part='trigger'])::after {
225
+ [data-ui-combobox] > :is([data-part-clear], [data-part-trigger])::after {
214
226
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
215
227
  }
216
228
 
217
- [data-ui='combobox'] > [data-part='clear']:has(+ [data-part='trigger']:not([hidden]))::after {
229
+ [data-ui-combobox] > [data-part-clear]:has(+ [data-part-trigger]:not([hidden]))::after {
218
230
  inset-inline-end: 0;
219
231
  }
220
232
 
221
- [data-ui='combobox'] > [data-part='clear']:not([hidden]) + [data-part='trigger']::after {
233
+ [data-ui-combobox] > [data-part-clear]:not([hidden]) + [data-part-trigger]::after {
222
234
  inset-inline-start: 0;
223
235
  }
224
236
  }
225
237
 
226
238
  /* The cross and the chevron are `Glyph` elements the binding draws, sized
227
239
  here to the control's icon step. */
228
- [data-ui='combobox'] > :is([data-part='clear'], [data-part='trigger']) {
240
+ [data-ui-combobox] > :is([data-part-clear], [data-part-trigger]) {
229
241
  --slotted-icon-size: var(--_icon-size);
230
242
  }
231
243
 
@@ -234,7 +246,7 @@
234
246
  * button is what a reader presses and the arrow is what turns over. The
235
247
  * library's own `Glyph` in an `icon` box; a character is never an icon.
236
248
  */
237
- [data-ui='combobox'] [data-part='arrow'] {
249
+ [data-ui-combobox] [data-part-arrow] {
238
250
  align-items: center;
239
251
  block-size: var(--_icon-size);
240
252
  display: flex;
@@ -242,12 +254,12 @@
242
254
  justify-content: center;
243
255
  }
244
256
 
245
- [data-ui='combobox'] [data-part='arrow'] > [data-ui='icon'] {
257
+ [data-ui-combobox] [data-part-arrow] > [data-ui-icon] {
246
258
  transition: rotate var(--slotted-control-transition-duration)
247
259
  var(--slotted-control-transition-easing);
248
260
  }
249
261
 
250
- [data-ui='combobox'][data-open] [data-part='arrow'] > [data-ui='icon'] {
262
+ [data-ui-combobox][data-open] [data-part-arrow] > [data-ui-icon] {
251
263
  rotate: 180deg;
252
264
  }
253
265
 
@@ -258,7 +270,7 @@
258
270
  * draws for every family that waits, worn as `data-ui='spinner'` beside this
259
271
  * family's own part.
260
272
  */
261
- [data-ui='combobox'] [data-part='busy'] {
273
+ [data-ui-combobox] [data-part-busy] {
262
274
  --slotted-spinner-size: var(--_icon-size);
263
275
 
264
276
  color: var(--slotted-combobox-arrow-color, var(--slotted-text-muted, GrayText));
@@ -267,7 +279,7 @@
267
279
 
268
280
  /* ── Size ─────────────────────────────────────────────────────────────── */
269
281
 
270
- [data-ui='combobox'][data-part='root'][data-size='sm'] {
282
+ [data-ui-combobox][data-part-root][data-size='sm'] {
271
283
  --_font-size: var(--slotted-control-font-size-sm, 12px);
272
284
  --_height: var(--slotted-control-height-sm, 30px);
273
285
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
@@ -276,7 +288,7 @@
276
288
  --_inner-size: var(--slotted-control-inner-size-sm, 22px);
277
289
  }
278
290
 
279
- [data-ui='combobox'][data-part='root'][data-size='md'] {
291
+ [data-ui-combobox][data-part-root][data-size='md'] {
280
292
  --_font-size: var(--slotted-control-font-size-md, 13px);
281
293
  --_height: var(--slotted-control-height-md, 34px);
282
294
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
@@ -285,7 +297,7 @@
285
297
  --_inner-size: var(--slotted-control-inner-size-md, 24px);
286
298
  }
287
299
 
288
- [data-ui='combobox'][data-part='root'][data-size='lg'] {
300
+ [data-ui-combobox][data-part-root][data-size='lg'] {
289
301
  --_font-size: var(--slotted-control-font-size-lg, 14px);
290
302
  --_height: var(--slotted-control-height-lg, 38px);
291
303
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
@@ -296,7 +308,7 @@
296
308
 
297
309
  /* ── Variant ──────────────────────────────────────────────────────────── */
298
310
 
299
- [data-ui='combobox'][data-part='root'][data-variant='subtle'] {
311
+ [data-ui-combobox][data-part-root][data-variant='subtle'] {
300
312
  background-color: var(
301
313
  --slotted-combobox-subtle-background,
302
314
  var(--slotted-surface-sunken, Canvas)
@@ -310,7 +322,7 @@
310
322
  /* No edge, no lift, no ground and no corner of its own: the cell it sits in
311
323
  is the box, the row is the ground, a cell has no corner, and the resting
312
324
  shadow would draw the cell where there is none. */
313
- [data-ui='combobox'][data-part='root'][data-variant='plain'] {
325
+ [data-ui-combobox][data-part-root][data-variant='plain'] {
314
326
  background-color: transparent;
315
327
  border-color: transparent;
316
328
  border-radius: var(--slotted-radius-none, 0px);
@@ -318,31 +330,31 @@
318
330
  }
319
331
 
320
332
  @media (forced-colors: active) {
321
- [data-ui='combobox'][data-part='root'][data-variant='plain'] {
333
+ [data-ui-combobox][data-part-root][data-variant='plain'] {
322
334
  border-color: ButtonBorder;
323
335
  }
324
336
  }
325
337
 
326
338
  /* ── States on the control ────────────────────────────────────────────── */
327
339
 
328
- [data-ui='combobox'][data-part='root']:hover:not([data-disabled]):not([data-readonly]):not(
340
+ [data-ui-combobox][data-part-root]:hover:not([data-disabled]):not([data-readonly]):not(
329
341
  [data-invalid]
330
342
  ) {
331
343
  border-color: var(--slotted-combobox-hover-border-color, var(--slotted-tone-accent-border));
332
344
  }
333
345
 
334
- [data-ui='combobox'][data-part='root'][data-variant='subtle']:hover:not([data-disabled]):not(
346
+ [data-ui-combobox][data-part-root][data-variant='subtle']:hover:not([data-disabled]):not(
335
347
  [data-readonly]
336
- ):not([data-invalid]) {
348
+ ):not([data-invalid]):not(:has(> [data-part-input]:autofill)) {
337
349
  background-color: var(
338
350
  --slotted-combobox-subtle-hover-background,
339
351
  var(--slotted-tone-secondary-subtle-hover)
340
352
  );
341
353
  }
342
354
 
343
- [data-ui='combobox'][data-part='root'][data-variant='plain']:hover:not([data-disabled]):not(
355
+ [data-ui-combobox][data-part-root][data-variant='plain']:hover:not([data-disabled]):not(
344
356
  [data-readonly]
345
- ):not([data-invalid]) {
357
+ ):not([data-invalid]):not(:has(> [data-part-input]:autofill)) {
346
358
  background-color: var(
347
359
  --slotted-combobox-plain-hover-background,
348
360
  var(--slotted-tone-secondary-subtle-hover)
@@ -351,11 +363,11 @@
351
363
  border-color: transparent;
352
364
  }
353
365
 
354
- [data-ui='combobox'][data-part='root']:has(> [data-part='input']:focus-visible) {
366
+ [data-ui-combobox][data-part-root]:has(> [data-part-input]:focus-visible) {
355
367
  box-shadow: var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
356
368
  var(--slotted-focus-ring-color, Highlight);
357
369
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
358
- outline-offset: var(--slotted-focus-ring-offset, 2px);
370
+ outline-offset: var(--slotted-control-focus-ring-offset, var(--slotted-focus-ring-offset, 2px));
359
371
  }
360
372
 
361
373
  /**
@@ -365,18 +377,16 @@
365
377
  * shadow that appears only under focus is a cell that changes size when it
366
378
  * is used.
367
379
  */
368
- [data-ui='combobox'][data-part='root'][data-variant='plain']:has(
369
- > [data-part='input']:focus-visible
370
- ) {
380
+ [data-ui-combobox][data-part-root][data-variant='plain']:has(> [data-part-input]:focus-visible) {
371
381
  box-shadow: none;
372
382
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
373
383
  }
374
384
 
375
- [data-ui='combobox'][data-part='root'][data-open]:not([data-disabled]) {
385
+ [data-ui-combobox][data-part-root][data-open]:not([data-disabled]) {
376
386
  border-color: var(--slotted-combobox-open-border-color, var(--slotted-tone-accent-border));
377
387
  }
378
388
 
379
- [data-ui='combobox'][data-part='root'][data-invalid] {
389
+ [data-ui-combobox][data-part-root][data-invalid] {
380
390
  --slotted-focus-ring-color: var(
381
391
  --slotted-combobox-invalid-focus-ring-color,
382
392
  var(--slotted-focus-ring-color-invalid, Highlight)
@@ -401,15 +411,15 @@
401
411
  box-shadow: var(--_invalid-edge);
402
412
  }
403
413
 
404
- [data-ui='combobox'][data-part='root'][data-invalid]:has(> [data-part='input']:focus-visible) {
414
+ [data-ui-combobox][data-part-root][data-invalid]:has(> [data-part-input]:focus-visible) {
405
415
  box-shadow:
406
416
  var(--_invalid-edge),
407
417
  var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
408
418
  var(--slotted-focus-ring-color, Highlight);
409
419
  }
410
420
 
411
- [data-ui='combobox'][data-part='root'][data-variant='plain'][data-invalid]:has(
412
- > [data-part='input']:focus-visible
421
+ [data-ui-combobox][data-part-root][data-variant='plain'][data-invalid]:has(
422
+ > [data-part-input]:focus-visible
413
423
  ) {
414
424
  /* The ring lies inside the box here, over the border and an edge as wide as
415
425
  it; the edge reaches past the ring. */
@@ -427,21 +437,24 @@
427
437
  * control draws its ring double, which a valid ring is not.
428
438
  */
429
439
  @media (forced-colors: active) {
430
- [data-ui='combobox'][data-part='root'][data-invalid] {
440
+ [data-ui-combobox][data-part-root][data-invalid] {
431
441
  outline: var(--_invalid-edge-width) solid CanvasText;
432
442
  outline-offset: calc(
433
443
  -1 * (var(--slotted-control-border-width, 1px) + var(--_invalid-edge-width))
434
444
  );
435
445
  }
436
446
 
437
- [data-ui='combobox'][data-part='root'][data-invalid]:has(> [data-part='input']:focus-visible) {
447
+ [data-ui-combobox][data-part-root][data-invalid]:has(> [data-part-input]:focus-visible) {
438
448
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
439
449
  var(--slotted-focus-ring-color, Highlight);
440
- outline-offset: var(--slotted-focus-ring-offset, 2px);
450
+ outline-offset: var(
451
+ --slotted-control-focus-ring-offset,
452
+ var(--slotted-focus-ring-offset, 2px)
453
+ );
441
454
  }
442
455
 
443
- [data-ui='combobox'][data-part='root'][data-variant='plain'][data-invalid]:has(
444
- > [data-part='input']:focus-visible
456
+ [data-ui-combobox][data-part-root][data-variant='plain'][data-invalid]:has(
457
+ > [data-part-input]:focus-visible
445
458
  ) {
446
459
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
447
460
  var(--slotted-focus-ring-color, Highlight);
@@ -456,14 +469,14 @@
456
469
  * popup. The native `readonly` gives the first three; the second is the
457
470
  * family's, because the pattern has no readonly for a combobox.
458
471
  */
459
- [data-ui='combobox'][data-part='root'][data-readonly] {
472
+ [data-ui-combobox][data-part-root][data-readonly] {
460
473
  background-color: var(
461
474
  --slotted-combobox-readonly-background,
462
475
  var(--slotted-tone-secondary-subtle-hover)
463
476
  );
464
477
  }
465
478
 
466
- [data-ui='combobox'][data-part='root'][data-readonly] [data-part='arrow'] {
479
+ [data-ui-combobox][data-part-root][data-readonly] [data-part-arrow] {
467
480
  opacity: 0.5;
468
481
  }
469
482
 
@@ -472,8 +485,8 @@
472
485
  * because a disabled `fieldset` disables every control inside it and the
473
486
  * control has no way to say so.
474
487
  */
475
- [data-ui='combobox'][data-part='root'][data-disabled],
476
- [data-ui='combobox'][data-part='root']:has(> [data-part='input']:disabled) {
488
+ [data-ui-combobox][data-part-root][data-disabled],
489
+ [data-ui-combobox][data-part-root]:has(> [data-part-input]:disabled) {
477
490
  background-color: var(
478
491
  --slotted-combobox-disabled-background,
479
492
  var(--slotted-disabled-background)
@@ -484,16 +497,16 @@
484
497
  cursor: not-allowed;
485
498
  }
486
499
 
487
- [data-ui='combobox']
488
- > :is([data-part='clear'], [data-part='trigger']):hover:not(:disabled):not([data-disabled]) {
500
+ [data-ui-combobox]
501
+ > :is([data-part-clear], [data-part-trigger]):hover:not(:disabled):not([data-disabled]) {
489
502
  background-color: var(
490
503
  --slotted-combobox-action-hover-background,
491
504
  var(--slotted-tone-secondary-subtle-hover)
492
505
  );
493
506
  }
494
507
 
495
- [data-ui='combobox']
496
- > :is([data-part='clear'], [data-part='trigger']):active:not(:disabled):not([data-disabled]) {
508
+ [data-ui-combobox]
509
+ > :is([data-part-clear], [data-part-trigger]):active:not(:disabled):not([data-disabled]) {
497
510
  background-color: var(
498
511
  --slotted-combobox-action-active-background,
499
512
  var(--slotted-tone-secondary-subtle-active)
@@ -507,14 +520,14 @@
507
520
  * it. The trigger is not in the tab sequence and takes the same rule anyway,
508
521
  * because a script may focus it.
509
522
  */
510
- [data-ui='combobox'] > :is([data-part='clear'], [data-part='trigger']):focus-visible {
523
+ [data-ui-combobox] > :is([data-part-clear], [data-part-trigger]):focus-visible {
511
524
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
512
525
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
513
526
  }
514
527
 
515
528
  /* ── The layer ────────────────────────────────────────────────────────── */
516
529
 
517
- [data-ui='combobox'][data-part='positioner'] {
530
+ [data-ui-combobox][data-part-positioner] {
518
531
  --_surface: var(--slotted-combobox-surface, var(--slotted-surface-raised, #ffffff));
519
532
  --_text: var(--slotted-combobox-content-text, var(--slotted-text, #0f172a));
520
533
  --_muted: var(--slotted-combobox-content-text-muted, var(--slotted-text-muted, #5b6b7f));
@@ -583,12 +596,12 @@
583
596
  translate var(--slotted-duration-short) var(--slotted-easing-exit);
584
597
  }
585
598
 
586
- [data-ui='combobox'][data-part='positioner'][data-side='top'] {
599
+ [data-ui-combobox][data-part-positioner][data-side='top'] {
587
600
  translate: 0 var(--_enter-distance);
588
601
  }
589
602
 
590
603
  /* A lateral side has no block direction to arrive from, so it only fades. */
591
- [data-ui='combobox'][data-part='positioner']:is([data-side='left'], [data-side='right']) {
604
+ [data-ui-combobox][data-part-positioner]:is([data-side='left'], [data-side='right']) {
592
605
  translate: 0 0;
593
606
  }
594
607
 
@@ -601,7 +614,7 @@
601
614
  * A keyframe states where it starts. The exit stays a transition: it
602
615
  * leaves from wherever the layer is, on the closed rule's durations.
603
616
  */
604
- [data-ui='combobox'][data-part='positioner'][data-open] {
617
+ [data-ui-combobox][data-part-positioner][data-open] {
605
618
  opacity: 1;
606
619
  translate: 0 0;
607
620
  transition: none;
@@ -612,16 +625,16 @@
612
625
  * with the side, and a layer written open in static markup — the harness,
613
626
  * a docs snippet — is simply there, and is photographed where it stands.
614
627
  */
615
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned] {
628
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned] {
616
629
  animation: slotted-combobox-enter-down var(--slotted-duration-medium)
617
630
  var(--slotted-easing-enter);
618
631
  }
619
632
 
620
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned][data-side='top'] {
633
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned][data-side='top'] {
621
634
  animation-name: slotted-combobox-enter-up;
622
635
  }
623
636
 
624
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned]:is(
637
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned]:is(
625
638
  [data-side='left'],
626
639
  [data-side='right']
627
640
  ) {
@@ -650,37 +663,37 @@
650
663
 
651
664
  /* Stillness keeps the fade and drops the movement (R7). */
652
665
  @media (prefers-reduced-motion: reduce) {
653
- [data-ui='combobox'][data-part='positioner'],
654
- [data-ui='combobox'][data-part='positioner'][data-side='top'],
655
- [data-ui='combobox'][data-part='positioner'][data-side='left'],
656
- [data-ui='combobox'][data-part='positioner'][data-side='right'] {
666
+ [data-ui-combobox][data-part-positioner],
667
+ [data-ui-combobox][data-part-positioner][data-side='top'],
668
+ [data-ui-combobox][data-part-positioner][data-side='left'],
669
+ [data-ui-combobox][data-part-positioner][data-side='right'] {
657
670
  translate: 0 0;
658
671
  transition: opacity var(--slotted-duration-short) var(--slotted-easing-exit);
659
672
  }
660
673
 
661
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned],
662
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned][data-side='top'],
663
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned][data-side='left'],
664
- [data-ui='combobox'][data-part='positioner'][data-open][data-positioned][data-side='right'] {
674
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned],
675
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned][data-side='top'],
676
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned][data-side='left'],
677
+ [data-ui-combobox][data-part-positioner][data-open][data-positioned][data-side='right'] {
665
678
  animation-name: slotted-combobox-fade;
666
679
  }
667
680
  }
668
681
 
669
- [data-ui='combobox'][data-part='positioner'][data-detached] {
682
+ [data-ui-combobox][data-part-positioner][data-detached] {
670
683
  visibility: hidden;
671
684
  }
672
685
 
673
- [data-ui='combobox'][data-part='positioner'][data-width='anchor'] {
686
+ [data-ui-combobox][data-part-positioner][data-width='anchor'] {
674
687
  inline-size: var(--slotted-positioner-anchor-width, auto);
675
688
  }
676
689
 
677
- [data-ui='combobox'][data-part='positioner'][data-width='content'] {
690
+ [data-ui-combobox][data-part-positioner][data-width='content'] {
678
691
  inline-size: max-content;
679
692
  max-inline-size: min(var(--_measure), var(--slotted-positioner-available-width, 100vw));
680
693
  min-inline-size: var(--slotted-positioner-anchor-width, auto);
681
694
  }
682
695
 
683
- [data-ui='combobox'][data-part='positioner'][data-size='sm'] {
696
+ [data-ui-combobox][data-part-positioner][data-size='sm'] {
684
697
  --_item-inset: var(--slotted-control-padding-inline-sm, 0.625rem);
685
698
  --_item-height: var(--slotted-control-height-sm, 30px);
686
699
  --_content-font-size: var(--slotted-control-font-size-sm, 12px);
@@ -689,7 +702,7 @@
689
702
  --_column-gap: var(--slotted-control-gap-sm, 0.375rem);
690
703
  }
691
704
 
692
- [data-ui='combobox'][data-part='positioner'][data-size='lg'] {
705
+ [data-ui-combobox][data-part-positioner][data-size='lg'] {
693
706
  --_item-inset: var(--slotted-control-padding-inline-lg, 1rem);
694
707
  --_item-height: var(--slotted-control-height-lg, 38px);
695
708
  --_content-font-size: var(--slotted-control-font-size-lg, 14px);
@@ -700,7 +713,7 @@
700
713
 
701
714
  /* ── The surface ──────────────────────────────────────────────────────── */
702
715
 
703
- [data-ui='combobox'] > [data-part='content'] {
716
+ [data-ui-combobox] > [data-part-content] {
704
717
  background: var(--_surface);
705
718
  border: var(--_border-width) solid var(--_border-color);
706
719
  border-radius: var(--_radius);
@@ -722,19 +735,19 @@
722
735
  pointer-events: auto;
723
736
  }
724
737
 
725
- [data-ui='combobox'] > [data-part='content']:focus-visible {
738
+ [data-ui-combobox] > [data-part-content]:focus-visible {
726
739
  outline: none;
727
740
  }
728
741
 
729
742
  /* ── Groups ───────────────────────────────────────────────────────────── */
730
743
 
731
- [data-ui='combobox'] [data-part='group'] {
744
+ [data-ui-combobox] [data-part-group] {
732
745
  display: grid;
733
746
  grid-column: 1 / -1;
734
747
  grid-template-columns: subgrid;
735
748
  }
736
749
 
737
- [data-ui='combobox'] [data-part='group-label'] {
750
+ [data-ui-combobox] [data-part-group-label] {
738
751
  color: var(--_muted);
739
752
  font-size: var(--_secondary-font-size);
740
753
  font-weight: var(--slotted-font-weight-semibold, 600);
@@ -746,7 +759,19 @@
746
759
 
747
760
  /* ── Options ──────────────────────────────────────────────────────────── */
748
761
 
749
- [data-ui='combobox'] [data-part='item'] {
762
+ /**
763
+ * An option the query rejected, and a group whose options all went. Both
764
+ * carry `hidden` — Angular hides each rejected option rather than leaving the
765
+ * list, and both bindings hide an emptied group — and `display: grid` on
766
+ * either beats the user agent's own `[hidden] { display: none }`, because an
767
+ * author rule wins over the user agent sheet.
768
+ */
769
+ [data-ui-combobox] [data-part-item][hidden],
770
+ [data-ui-combobox] [data-part-group][hidden] {
771
+ display: none;
772
+ }
773
+
774
+ [data-ui-combobox] [data-part-item] {
750
775
  align-content: center;
751
776
  border-radius: var(--_item-radius);
752
777
  box-sizing: border-box;
@@ -772,7 +797,7 @@
772
797
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
773
798
  }
774
799
 
775
- [data-ui='combobox'] [data-part='item'][data-current] {
800
+ [data-ui-combobox] [data-part-item][data-current] {
776
801
  background-color: var(--_highlight);
777
802
  /**
778
803
  * A ring as well as a ground. Nothing on this surface holds focus — DOM
@@ -786,11 +811,11 @@
786
811
  var(--slotted-combobox-highlight-ring, var(--slotted-tone-accent-border));
787
812
  }
788
813
 
789
- [data-ui='combobox'] [data-part='item']:not([data-disabled]):active {
814
+ [data-ui-combobox] [data-part-item]:not([data-disabled]):active {
790
815
  background-color: var(--_highlight-active);
791
816
  }
792
817
 
793
- [data-ui='combobox'] [data-part='item'][data-selected] {
818
+ [data-ui-combobox] [data-part-item][data-selected] {
794
819
  color: var(--_selected-color);
795
820
  }
796
821
 
@@ -803,21 +828,21 @@
803
828
  * selection begins and ends. `select` and `combobox` draw the same ground
804
829
  * and answer the same way; `selection-block.test.mjs` holds the three to it.
805
830
  */
806
- [data-ui='combobox'] [data-part='item'][data-selected] + [data-part='item'][data-selected] {
831
+ [data-ui-combobox] [data-part-item][data-selected] + [data-part-item][data-selected] {
807
832
  border-start-end-radius: 0;
808
833
  border-start-start-radius: 0;
809
834
  }
810
835
 
811
- [data-ui='combobox'] [data-part='item'][data-selected]:has(+ [data-part='item'][data-selected]) {
836
+ [data-ui-combobox] [data-part-item][data-selected]:has(+ [data-part-item][data-selected]) {
812
837
  border-end-end-radius: 0;
813
838
  border-end-start-radius: 0;
814
839
  }
815
840
 
816
- [data-ui='combobox'] [data-part='item'][data-selected] > [data-part='label'] {
841
+ [data-ui-combobox] [data-part-item][data-selected] > [data-part-label] {
817
842
  font-weight: var(--slotted-font-weight-medium, 500);
818
843
  }
819
844
 
820
- [data-ui='combobox'] [data-part='item'][data-disabled] {
845
+ [data-ui-combobox] [data-part-item][data-disabled] {
821
846
  color: var(--slotted-disabled-foreground, #64748b);
822
847
  cursor: not-allowed;
823
848
  }
@@ -843,7 +868,7 @@
843
868
  * would watch it disappear. A cursor lifts, always. What the row cannot do is
844
869
  * said by the ink and by the ring, which both step down to the disabled pair.
845
870
  */
846
- [data-ui='combobox'] [data-part='item'][data-disabled][data-current] {
871
+ [data-ui-combobox] [data-part-item][data-disabled][data-current] {
847
872
  box-shadow: inset 0 0 0 var(--slotted-border-width-thin, 1px)
848
873
  var(--slotted-disabled-border, #cbd5e1);
849
874
  color: var(--slotted-disabled-foreground, #64748b);
@@ -851,13 +876,13 @@
851
876
 
852
877
  /* ── The cells ────────────────────────────────────────────────────────── */
853
878
 
854
- [data-ui='combobox'] :is([data-part='indicator'], [data-part='icon']) {
879
+ [data-ui-combobox] :is([data-part-indicator], [data-part-icon]) {
855
880
  block-size: 1lh;
856
881
  }
857
882
 
858
883
  /* Column one holds content and paints none: a `Glyph` in an `Icon` box, or
859
884
  artwork of the consumer's own, centred and sized from the column. */
860
- [data-ui='combobox'] [data-part='icon'] {
885
+ [data-ui-combobox] [data-part-icon] {
861
886
  --slotted-icon-size: var(--_content-icon-size);
862
887
 
863
888
  align-items: center;
@@ -870,7 +895,7 @@
870
895
  margin-inline-end: var(--_column-gap);
871
896
  }
872
897
 
873
- [data-ui='combobox'] [data-part='label'] {
898
+ [data-ui-combobox] [data-part-label] {
874
899
  grid-column: 2;
875
900
  grid-row: 1;
876
901
  min-inline-size: 0;
@@ -894,7 +919,7 @@
894
919
  * run moved on every keystroke as the filter re-marked the label (CB6).
895
920
  */
896
921
 
897
- [data-ui='combobox'] [data-part='description'] {
922
+ [data-ui-combobox] [data-part-description] {
898
923
  color: var(--_muted);
899
924
  font-size: var(--_secondary-font-size);
900
925
  grid-column: 2;
@@ -904,12 +929,12 @@
904
929
  overflow-wrap: anywhere;
905
930
  }
906
931
 
907
- [data-ui='combobox'] [data-part='item'][data-disabled] > [data-part='description'] {
932
+ [data-ui-combobox] [data-part-item][data-disabled] > [data-part-description] {
908
933
  color: inherit;
909
934
  }
910
935
 
911
936
  /* The tick is a `Glyph` the binding draws, at the content's icon step. */
912
- [data-ui='combobox'] [data-part='indicator'] {
937
+ [data-ui-combobox] [data-part-indicator] {
913
938
  --slotted-icon-size: var(--_content-icon-size);
914
939
 
915
940
  align-items: center;
@@ -924,13 +949,13 @@
924
949
  transition: opacity var(--slotted-duration-short) var(--slotted-easing-standard);
925
950
  }
926
951
 
927
- [data-ui='combobox'] [data-part='item'][data-selected] > [data-part='indicator'] {
952
+ [data-ui-combobox] [data-part-item][data-selected] > [data-part-indicator] {
928
953
  opacity: 1;
929
954
  }
930
955
 
931
956
  /* ── Separator, empty, status ─────────────────────────────────────────── */
932
957
 
933
- [data-ui='combobox'] [data-part='separator'] {
958
+ [data-ui-combobox] [data-part-separator] {
934
959
  background-color: var(--slotted-combobox-separator-color, var(--_border-color));
935
960
  block-size: var(--_border-width);
936
961
  border: 0;
@@ -945,7 +970,7 @@
945
970
  * when the results land — which is the gap none of the surveyed
946
971
  * implementations closes.
947
972
  */
948
- [data-ui='combobox'] :is([data-part='empty'], [data-part='status']) {
973
+ [data-ui-combobox] :is([data-part-empty], [data-part-status]) {
949
974
  color: var(--_muted);
950
975
  /**
951
976
  * Its own bidi run, ordered by its own content. "3 results" is a European
@@ -978,7 +1003,7 @@
978
1003
  * often present with nothing to draw. A row with no text takes no space, and
979
1004
  * a row with text takes the same space as the empty message beside it.
980
1005
  */
981
- [data-ui='combobox'] [data-part='status']:empty {
1006
+ [data-ui-combobox] [data-part-status]:empty {
982
1007
  display: none;
983
1008
  }
984
1009
 
@@ -991,7 +1016,7 @@
991
1016
  * about how a placeholder is painted — and they are hidden from assistive
992
1017
  * technology, because the `status` row beside them is the live region.
993
1018
  */
994
- [data-ui='combobox'] [data-part='placeholder'] {
1019
+ [data-ui-combobox] [data-part-placeholder] {
995
1020
  display: grid;
996
1021
  /* The surface is a grid of option columns; the rows span all of them, as
997
1022
  the status and empty rows do. */
@@ -1000,23 +1025,23 @@
1000
1025
  padding-inline: var(--_item-inset);
1001
1026
  }
1002
1027
 
1003
- [data-ui='combobox'] [data-part='placeholder'] > * {
1028
+ [data-ui-combobox] [data-part-placeholder] > * {
1004
1029
  align-items: center;
1005
1030
  display: flex;
1006
1031
  min-block-size: var(--_item-height);
1007
1032
  }
1008
1033
 
1009
- [data-ui='combobox'] [data-part='placeholder'] > [data-ui='skeleton'] {
1034
+ [data-ui-combobox] [data-part-placeholder] > [data-ui-skeleton] {
1010
1035
  align-self: center;
1011
1036
  }
1012
1037
 
1013
1038
  /* Three ragged widths: three identical bars read as a table, and a list of
1014
1039
  labels is ragged. */
1015
- [data-ui='combobox'] [data-part='placeholder'] > :nth-child(2) [data-ui='skeleton'] {
1040
+ [data-ui-combobox] [data-part-placeholder] > :nth-child(2) [data-ui-skeleton] {
1016
1041
  inline-size: 78%;
1017
1042
  }
1018
1043
 
1019
- [data-ui='combobox'] [data-part='placeholder'] > :nth-child(3) [data-ui='skeleton'] {
1044
+ [data-ui-combobox] [data-part-placeholder] > :nth-child(3) [data-ui-skeleton] {
1020
1045
  inline-size: 56%;
1021
1046
  }
1022
1047
 
@@ -1027,20 +1052,20 @@
1027
1052
  * many for one wait (SL6/CB5).
1028
1053
  */
1029
1054
 
1030
- [data-ui='combobox'] > [data-part='content'][data-loading] {
1055
+ [data-ui-combobox] > [data-part-content][data-loading] {
1031
1056
  cursor: progress;
1032
1057
  }
1033
1058
 
1034
1059
  /* ── Forced colours ───────────────────────────────────────────────────── */
1035
1060
 
1036
1061
  @media (forced-colors: active) {
1037
- [data-ui='combobox'] [data-part='item'][data-current] {
1062
+ [data-ui-combobox] [data-part-item][data-current] {
1038
1063
  background-color: Highlight;
1039
1064
  color: HighlightText;
1040
1065
  forced-color-adjust: none;
1041
1066
  }
1042
1067
 
1043
- [data-ui='combobox'] [data-part='item'][data-disabled][data-current] {
1068
+ [data-ui-combobox] [data-part-item][data-disabled][data-current] {
1044
1069
  background-color: Highlight;
1045
1070
  color: GrayText;
1046
1071
  }