@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
@@ -2,9 +2,10 @@
2
2
  /**
3
3
  * ── A frame of typed values, with a field that adds more ────────────────
4
4
  *
5
- * One subtree, where the consumer wrote it. Nothing is portalled and
6
- * nothing opens: the input is a text box, and the values beside it are the
7
- * texts the reader typed.
5
+ * One subtree, where the consumer wrote it. Nothing is portalled: the
6
+ * input is a text box, and the values beside it are the texts the reader
7
+ * typed. With `suggestions` the one thing that opens is the listbox of
8
+ * them, placed under the frame by the positioner with a fixed position.
8
9
  *
9
10
  * ┌─ root ─ the frame ─────────────────────────────────────────┐
10
11
  * │ ┌─ control ─ role="grid" ───────────────┐ │
@@ -53,7 +54,7 @@
53
54
 
54
55
  /* ── The frame ────────────────────────────────────────────────────────── */
55
56
 
56
- [data-ui='tags-input'][data-part='root'] {
57
+ [data-ui-tags-input][data-part-root] {
57
58
  --_font-size: var(--slotted-control-font-size-md, 13px);
58
59
  --_height: var(--slotted-control-height-md, 34px);
59
60
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
@@ -123,7 +124,7 @@
123
124
  box-shadow var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
124
125
  }
125
126
 
126
- [data-ui='tags-input'][data-part='root']:not([data-full-width]) {
127
+ [data-ui-tags-input][data-part-root]:not([data-full-width]) {
127
128
  inline-size: auto;
128
129
  }
129
130
 
@@ -132,7 +133,7 @@
132
133
  * role is what the layout-grid pattern asks for, and the geometry belongs to
133
134
  * the row that wraps.
134
135
  */
135
- [data-ui='tags-input'] > [data-part='control'] {
136
+ [data-ui-tags-input] > [data-part-control] {
136
137
  display: flex;
137
138
  flex: 1 1 auto;
138
139
  min-inline-size: 0;
@@ -145,7 +146,7 @@
145
146
  * what is typed and what acts on it is never narrower than the rhythm inside
146
147
  * it. `multi-select` measured the two-pixel version of this and rejected it.
147
148
  */
148
- [data-ui='tags-input'] > [data-part='control'] + * {
149
+ [data-ui-tags-input] > [data-part-control] + * {
149
150
  margin-inline-start: var(--_row-gap);
150
151
  }
151
152
 
@@ -154,7 +155,7 @@
154
155
  * the reading order stays linear and "previous" and "next" have one meaning
155
156
  * each — which is why the grid answers neither `ArrowDown` nor `ArrowUp`.
156
157
  */
157
- [data-ui='tags-input'] [data-part='chips'] {
158
+ [data-ui-tags-input] [data-part-chips] {
158
159
  /* `safe`, because this box scrolls: centring a scroll container's content
159
160
  pushes the first line above the scrollport when there is more than fits,
160
161
  and nothing can scroll back to it. `multi-select` found the first three
@@ -193,7 +194,7 @@
193
194
  scrollbar-width: none;
194
195
  }
195
196
 
196
- [data-ui='tags-input'] [data-part='chips']::-webkit-scrollbar {
197
+ [data-ui-tags-input] [data-part-chips]::-webkit-scrollbar {
197
198
  display: none;
198
199
  }
199
200
 
@@ -203,7 +204,7 @@
203
204
  * hold the rest, so the row itself opens — the rule after this one — while
204
205
  * the control has focus within.
205
206
  */
206
- [data-ui='tags-input'][data-overflow='collapse']:not([data-expanded]) [data-part='chips'] {
207
+ [data-ui-tags-input][data-overflow='collapse']:not([data-expanded]) [data-part-chips] {
207
208
  flex-wrap: nowrap;
208
209
  max-block-size: none;
209
210
  overflow: hidden;
@@ -218,9 +219,7 @@
218
219
  * No transition. The row's height changes as focus arrives, and a transition
219
220
  * would make the reader wait for the chip they are about to reach.
220
221
  */
221
- [data-ui='tags-input'][data-overflow='collapse'][data-expanded]
222
- [data-part='chips']
223
- > [data-count] {
222
+ [data-ui-tags-input][data-overflow='collapse'][data-expanded] [data-part-chips] > [data-count] {
224
223
  display: none;
225
224
  }
226
225
 
@@ -232,7 +231,7 @@
232
231
  * belongs to the chip, and the query's own input is told apart by the part it
233
232
  * does have.
234
233
  */
235
- [data-ui='tags-input'] [data-part='chips'] input:not([data-part='input']) {
234
+ [data-ui-tags-input] [data-part-chips] input:not([data-part-input]) {
236
235
  background-color: transparent;
237
236
  border: 0;
238
237
  color: inherit;
@@ -249,7 +248,7 @@
249
248
  * target minimum — so three of them plus their gaps divide the cap above
250
249
  * exactly, and no fourth row shows as a sliver under the third.
251
250
  */
252
- [data-ui='tags-input'] [data-part='chips'] > :not([data-part='field']) {
251
+ [data-ui-tags-input] [data-part-chips] > :not([data-part-field]) {
253
252
  flex: 0 0 auto;
254
253
  max-inline-size: 100%;
255
254
  min-block-size: var(--_row-size);
@@ -259,10 +258,10 @@
259
258
  /**
260
259
  * The chip takes the height the inside of this control has, through the
261
260
  * property `tag` reads for it. Set on the row, inherited by every chip, and
262
- * no rule of this sheet names `[data-ui='tag']`: the host stands beside the
261
+ * no rule of this sheet names `[data-ui-tag]`: the host stands beside the
263
262
  * tag sheet and never reaches into it.
264
263
  */
265
- [data-ui='tags-input'] [data-part='chips'] {
264
+ [data-ui-tags-input] [data-part-chips] {
266
265
  --slotted-control-inner-size: var(--_inner-size);
267
266
  }
268
267
 
@@ -273,7 +272,7 @@
273
272
  * has somewhere to type and a 240-pixel control holding two values does not
274
273
  * stand two rows tall with one row empty.
275
274
  */
276
- [data-ui='tags-input'] [data-part='field'] {
275
+ [data-ui-tags-input] [data-part-field] {
277
276
  align-items: center;
278
277
  display: flex;
279
278
  flex: 1 1 var(--slotted-tags-input-field-basis, 4rem);
@@ -287,7 +286,7 @@
287
286
  * composition, autofill, the browser's own completion from a `datalist`, and
288
287
  * every native attribute the consumer wrote.
289
288
  */
290
- [data-ui='tags-input'] [data-part='input'] {
289
+ [data-ui-tags-input] [data-part-input] {
291
290
  background-color: transparent;
292
291
  border: 0;
293
292
  color: inherit;
@@ -302,18 +301,28 @@
302
301
  text-overflow: ellipsis;
303
302
  }
304
303
 
305
- [data-ui='tags-input'] [data-part='input']::placeholder {
304
+ [data-ui-tags-input] [data-part-input]::placeholder {
306
305
  color: var(--slotted-tags-input-placeholder-color, var(--slotted-text-muted, GrayText));
307
306
  text-overflow: ellipsis;
308
307
  }
309
308
 
310
309
  /**
311
- * Autofill. Chrome paints its own ground over the control's, and a
312
- * hundred-pixel inset shadow is the only way to reach it. The signal is kept
313
- * rather than erased, in the accent surface the theme owns — the repair
314
- * `text-field` makes, for the same reason.
310
+ * Autofill. Chrome paints its own ground over the input, and a hundred-pixel
311
+ * inset shadow is the only way to reach it. The signal is kept rather than
312
+ * erased, in the accent surface the theme owns, and it is the whole
313
+ * control's: the frame takes the tint under its border and inside its
314
+ * corner, and the input repaints the browser's ground in the same colour.
315
+ * Painted on the input alone, the tint left the frame's padding, the slots
316
+ * and the buttons bare.
315
317
  */
316
- [data-ui='tags-input'] [data-part='input']:autofill {
318
+ [data-ui-tags-input][data-part-root]:has([data-part-input]:autofill) {
319
+ background-color: var(
320
+ --slotted-tags-input-autofill-background,
321
+ var(--slotted-tone-accent-surface)
322
+ );
323
+ }
324
+
325
+ [data-ui-tags-input] [data-part-input]:autofill {
317
326
  box-shadow: inset 0 0 0 100px
318
327
  var(--slotted-tags-input-autofill-background, var(--slotted-tone-accent-surface));
319
328
  -webkit-text-fill-color: var(--slotted-tags-input-color, var(--slotted-text, CanvasText));
@@ -337,7 +346,7 @@
337
346
  * its own inner ring two widths in to keep a sliver of ground outside it;
338
347
  * here that sliver would cost the text its leading.
339
348
  */
340
- [data-ui='tags-input'] [data-part='chips'] > :not([data-part='field']):focus-visible {
349
+ [data-ui-tags-input] [data-part-chips] > :not([data-part-field]):focus-visible {
341
350
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
342
351
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
343
352
  }
@@ -347,9 +356,9 @@
347
356
  * takes focus, and for one long step of the motion scale its edge is the
348
357
  * accent's, so a reader who looked away from the ring still sees which chip
349
358
  * answered — through the edge token `tag` reads, so this sheet names
350
- * `[data-ui='tag']` nowhere.
359
+ * `[data-ui-tag]` nowhere.
351
360
  */
352
- [data-ui='tags-input'] [data-part='chips'] > [data-current] {
361
+ [data-ui-tags-input] [data-part-chips] > [data-current] {
353
362
  --slotted-tag-border-color: var(
354
363
  --slotted-tags-input-current-border-color,
355
364
  var(--slotted-tone-accent-border)
@@ -362,7 +371,7 @@
362
371
  * whose last one happens to be a count, and `createCollapse` measures it the
363
372
  * way it measures every other unit.
364
373
  */
365
- [data-ui='tags-input'] [data-part='chips'] > [data-count] {
374
+ [data-ui-tags-input] [data-part-chips] > [data-count] {
366
375
  cursor: pointer;
367
376
  flex: none;
368
377
  }
@@ -373,7 +382,7 @@
373
382
  * too narrow for a chip — because a counter with nothing to count against is
374
383
  * furniture.
375
384
  */
376
- [data-ui='tags-input'] > [data-part='counter'] {
385
+ [data-ui-tags-input] > [data-part-counter] {
377
386
  align-self: center;
378
387
  color: var(--slotted-tags-input-counter-color, var(--slotted-text-muted, GrayText));
379
388
  flex: none;
@@ -393,13 +402,13 @@
393
402
  * uses for a chosen value. Not a warning tone: reaching the limit is the
394
403
  * reader arriving somewhere, not going wrong.
395
404
  */
396
- [data-ui='tags-input'][data-complete] > [data-part='counter'] {
405
+ [data-ui-tags-input][data-complete] > [data-part-counter] {
397
406
  color: var(--slotted-tags-input-counter-complete-color, var(--slotted-tone-accent-text));
398
407
  font-weight: var(--slotted-font-weight-medium, 500);
399
408
  }
400
409
 
401
410
  /* Too narrow for a chip: the count is the whole answer. */
402
- [data-ui='tags-input'][data-narrow] [data-part='chips'] > :not([data-part='field']) {
411
+ [data-ui-tags-input][data-narrow] [data-part-chips] > :not([data-part-field]) {
403
412
  display: none;
404
413
  }
405
414
 
@@ -412,7 +421,7 @@
412
421
  * The `message` lives inside the chip and the `hint` beside the row; both
413
422
  * are positioned against the frame, which is the nearest containing block.
414
423
  */
415
- [data-ui='tags-input'] :is([data-part='message'], [data-part='hint']) {
424
+ [data-ui-tags-input] :is([data-part-message], [data-part-hint]) {
416
425
  block-size: 1px;
417
426
  border: 0;
418
427
  clip-path: inset(50%);
@@ -426,7 +435,7 @@
426
435
 
427
436
  /* ── The button inside the frame ──────────────────────────────────────── */
428
437
 
429
- [data-ui='tags-input'] > [data-part='clear'] {
438
+ [data-ui-tags-input] > [data-part-clear] {
430
439
  align-items: center;
431
440
  align-self: center;
432
441
  appearance: none;
@@ -458,7 +467,7 @@
458
467
  * control is 24 pixels tall — the WCAG 2.2 minimum — so nothing drawn inside
459
468
  * it can also be 24.
460
469
  */
461
- [data-ui='tags-input'] > [data-part='clear']::after {
470
+ [data-ui-tags-input] > [data-part-clear]::after {
462
471
  content: '';
463
472
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
464
473
  position: absolute;
@@ -469,7 +478,7 @@
469
478
  the hit area above grows to 44 pixels around them. It does not reach back
470
479
  over the chips, where the last chip's remove stands a few pixels away. */
471
480
  @media (pointer: coarse) {
472
- [data-ui='tags-input'] > [data-part='clear']::after {
481
+ [data-ui-tags-input] > [data-part-clear]::after {
473
482
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
474
483
  inset-inline-start: 0;
475
484
  }
@@ -477,13 +486,13 @@
477
486
 
478
487
  /* The cross is the `Glyph` element the binding renders inside the button,
479
488
  drawn at the control's own icon step. */
480
- [data-ui='tags-input'] > [data-part='clear'] {
489
+ [data-ui-tags-input] > [data-part-clear] {
481
490
  --slotted-icon-size: var(--_icon-size);
482
491
  }
483
492
 
484
493
  /* ── Size ─────────────────────────────────────────────────────────────── */
485
494
 
486
- [data-ui='tags-input'][data-part='root'][data-size='sm'] {
495
+ [data-ui-tags-input][data-part-root][data-size='sm'] {
487
496
  --_font-size: var(--slotted-control-font-size-sm, 12px);
488
497
  --_height: var(--slotted-control-height-sm, 30px);
489
498
  --_inner-size: var(--slotted-control-inner-size-sm, 22px);
@@ -492,7 +501,7 @@
492
501
  --_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-sm, 14px));
493
502
  }
494
503
 
495
- [data-ui='tags-input'][data-part='root'][data-size='md'] {
504
+ [data-ui-tags-input][data-part-root][data-size='md'] {
496
505
  --_font-size: var(--slotted-control-font-size-md, 13px);
497
506
  --_height: var(--slotted-control-height-md, 34px);
498
507
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
@@ -501,7 +510,7 @@
501
510
  --_inner-size: var(--slotted-control-inner-size-md, 24px);
502
511
  }
503
512
 
504
- [data-ui='tags-input'][data-part='root'][data-size='lg'] {
513
+ [data-ui-tags-input][data-part-root][data-size='lg'] {
505
514
  --_font-size: var(--slotted-control-font-size-lg, 14px);
506
515
  --_height: var(--slotted-control-height-lg, 38px);
507
516
  --_inner-size: var(--slotted-control-inner-size-lg, 28px);
@@ -512,7 +521,7 @@
512
521
 
513
522
  /* ── Variant ──────────────────────────────────────────────────────────── */
514
523
 
515
- [data-ui='tags-input'][data-part='root'][data-variant='subtle'] {
524
+ [data-ui-tags-input][data-part-root][data-variant='subtle'] {
516
525
  background-color: var(
517
526
  --slotted-tags-input-subtle-background,
518
527
  var(--slotted-surface-sunken, Canvas)
@@ -526,7 +535,7 @@
526
535
  /* No edge, no lift, no ground and no corner of its own: the cell it sits in
527
536
  is the box, the row is the ground, a cell has no corner, and the resting
528
537
  shadow would draw the cell where there is none. */
529
- [data-ui='tags-input'][data-part='root'][data-variant='plain'] {
538
+ [data-ui-tags-input][data-part-root][data-variant='plain'] {
530
539
  background-color: transparent;
531
540
  border-color: transparent;
532
541
  border-radius: var(--slotted-radius-none, 0px);
@@ -534,31 +543,31 @@
534
543
  }
535
544
 
536
545
  @media (forced-colors: active) {
537
- [data-ui='tags-input'][data-part='root'][data-variant='plain'] {
546
+ [data-ui-tags-input][data-part-root][data-variant='plain'] {
538
547
  border-color: ButtonBorder;
539
548
  }
540
549
  }
541
550
 
542
551
  /* ── States on the control ────────────────────────────────────────────── */
543
552
 
544
- [data-ui='tags-input'][data-part='root']:hover:not([data-disabled]):not([data-readonly]):not(
553
+ [data-ui-tags-input][data-part-root]:hover:not([data-disabled]):not([data-readonly]):not(
545
554
  [data-invalid]
546
555
  ) {
547
556
  border-color: var(--slotted-tags-input-hover-border-color, var(--slotted-tone-accent-border));
548
557
  }
549
558
 
550
- [data-ui='tags-input'][data-part='root'][data-variant='subtle']:hover:not([data-disabled]):not(
559
+ [data-ui-tags-input][data-part-root][data-variant='subtle']:hover:not([data-disabled]):not(
551
560
  [data-readonly]
552
- ):not([data-invalid]) {
561
+ ):not([data-invalid]):not(:has([data-part-input]:autofill)) {
553
562
  background-color: var(
554
563
  --slotted-tags-input-subtle-hover-background,
555
564
  var(--slotted-tone-secondary-subtle-hover)
556
565
  );
557
566
  }
558
567
 
559
- [data-ui='tags-input'][data-part='root'][data-variant='plain']:hover:not([data-disabled]):not(
568
+ [data-ui-tags-input][data-part-root][data-variant='plain']:hover:not([data-disabled]):not(
560
569
  [data-readonly]
561
- ):not([data-invalid]) {
570
+ ):not([data-invalid]):not(:has([data-part-input]:autofill)) {
562
571
  background-color: var(
563
572
  --slotted-tags-input-plain-hover-background,
564
573
  var(--slotted-tone-secondary-subtle-hover)
@@ -571,14 +580,14 @@
571
580
  * The frame carries the ring for whatever inside it holds focus — the input
572
581
  * or a chip — because the frame is the control a reader is operating.
573
582
  */
574
- [data-ui='tags-input'][data-part='root']:has([data-part='input']:focus-visible),
575
- [data-ui='tags-input'][data-part='root']:has(
576
- [data-part='chips'] > :not([data-part='field']):focus-visible
583
+ [data-ui-tags-input][data-part-root]:has([data-part-input]:focus-visible),
584
+ [data-ui-tags-input][data-part-root]:has(
585
+ [data-part-chips] > :not([data-part-field]):focus-visible
577
586
  ) {
578
587
  box-shadow: var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
579
588
  var(--slotted-focus-ring-color, Highlight);
580
589
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
581
- outline-offset: var(--slotted-focus-ring-offset, 2px);
590
+ outline-offset: var(--slotted-control-focus-ring-offset, var(--slotted-focus-ring-offset, 2px));
582
591
  }
583
592
 
584
593
  /**
@@ -588,11 +597,9 @@
588
597
  * shadow that appears only under focus is a cell that changes size when it
589
598
  * is used.
590
599
  */
591
- [data-ui='tags-input'][data-part='root'][data-variant='plain']:has(
592
- [data-part='input']:focus-visible
593
- ),
594
- [data-ui='tags-input'][data-part='root'][data-variant='plain']:has(
595
- [data-part='chips'] > :not([data-part='field']):focus-visible
600
+ [data-ui-tags-input][data-part-root][data-variant='plain']:has([data-part-input]:focus-visible),
601
+ [data-ui-tags-input][data-part-root][data-variant='plain']:has(
602
+ [data-part-chips] > :not([data-part-field]):focus-visible
596
603
  ) {
597
604
  box-shadow: none;
598
605
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
@@ -603,13 +610,13 @@
603
610
  * is two rings for one focus. The frame keeps its lift and gives up the
604
611
  * outline while the ring is inside it.
605
612
  */
606
- [data-ui='tags-input'][data-part='root']:has(
607
- [data-part='chips'] > :not([data-part='field']):focus-visible
613
+ [data-ui-tags-input][data-part-root]:has(
614
+ [data-part-chips] > :not([data-part-field]):focus-visible
608
615
  ) {
609
616
  outline: none;
610
617
  }
611
618
 
612
- [data-ui='tags-input'][data-part='root'][data-invalid] {
619
+ [data-ui-tags-input][data-part-root][data-invalid] {
613
620
  --slotted-focus-ring-color: var(
614
621
  --slotted-tags-input-invalid-focus-ring-color,
615
622
  var(--slotted-focus-ring-color-invalid, Highlight)
@@ -634,9 +641,9 @@
634
641
  box-shadow: var(--_invalid-edge);
635
642
  }
636
643
 
637
- [data-ui='tags-input'][data-part='root'][data-invalid]:has([data-part='input']:focus-visible),
638
- [data-ui='tags-input'][data-part='root'][data-invalid]:has(
639
- [data-part='chips'] > :not([data-part='field']):focus-visible
644
+ [data-ui-tags-input][data-part-root][data-invalid]:has([data-part-input]:focus-visible),
645
+ [data-ui-tags-input][data-part-root][data-invalid]:has(
646
+ [data-part-chips] > :not([data-part-field]):focus-visible
640
647
  ) {
641
648
  box-shadow:
642
649
  var(--_invalid-edge),
@@ -644,11 +651,11 @@
644
651
  var(--slotted-focus-ring-color, Highlight);
645
652
  }
646
653
 
647
- [data-ui='tags-input'][data-part='root'][data-variant='plain'][data-invalid]:has(
648
- [data-part='input']:focus-visible
654
+ [data-ui-tags-input][data-part-root][data-variant='plain'][data-invalid]:has(
655
+ [data-part-input]:focus-visible
649
656
  ),
650
- [data-ui='tags-input'][data-part='root'][data-variant='plain'][data-invalid]:has(
651
- [data-part='chips'] > :not([data-part='field']):focus-visible
657
+ [data-ui-tags-input][data-part-root][data-variant='plain'][data-invalid]:has(
658
+ [data-part-chips] > :not([data-part-field]):focus-visible
652
659
  ) {
653
660
  /* The ring lies inside the box here, over the border and an edge as wide as
654
661
  it; the edge reaches past the ring. */
@@ -666,21 +673,24 @@
666
673
  * control draws its ring double, which a valid ring is not.
667
674
  */
668
675
  @media (forced-colors: active) {
669
- [data-ui='tags-input'][data-part='root'][data-invalid] {
676
+ [data-ui-tags-input][data-part-root][data-invalid] {
670
677
  outline: var(--_invalid-edge-width) solid CanvasText;
671
678
  outline-offset: calc(
672
679
  -1 * (var(--slotted-control-border-width, 1px) + var(--_invalid-edge-width))
673
680
  );
674
681
  }
675
682
 
676
- [data-ui='tags-input'][data-part='root'][data-invalid]:has([data-part='input']:focus-visible) {
683
+ [data-ui-tags-input][data-part-root][data-invalid]:has([data-part-input]:focus-visible) {
677
684
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
678
685
  var(--slotted-focus-ring-color, Highlight);
679
- outline-offset: var(--slotted-focus-ring-offset, 2px);
686
+ outline-offset: var(
687
+ --slotted-control-focus-ring-offset,
688
+ var(--slotted-focus-ring-offset, 2px)
689
+ );
680
690
  }
681
691
 
682
- [data-ui='tags-input'][data-part='root'][data-variant='plain'][data-invalid]:has(
683
- [data-part='input']:focus-visible
692
+ [data-ui-tags-input][data-part-root][data-variant='plain'][data-invalid]:has(
693
+ [data-part-input]:focus-visible
684
694
  ) {
685
695
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
686
696
  var(--slotted-focus-ring-color, Highlight);
@@ -689,11 +699,11 @@
689
699
  );
690
700
  }
691
701
 
692
- [data-ui='tags-input'][data-part='root'][data-invalid]:has(
693
- [data-part='chips'] > :not([data-part='field']):focus-visible
702
+ [data-ui-tags-input][data-part-root][data-invalid]:has(
703
+ [data-part-chips] > :not([data-part-field]):focus-visible
694
704
  ),
695
- [data-ui='tags-input'][data-part='root'][data-variant='plain'][data-invalid]:has(
696
- [data-part='chips'] > :not([data-part='field']):focus-visible
705
+ [data-ui-tags-input][data-part-root][data-variant='plain'][data-invalid]:has(
706
+ [data-part-chips] > :not([data-part-field]):focus-visible
697
707
  ) {
698
708
  outline: var(--_invalid-edge-width) solid CanvasText;
699
709
  outline-offset: calc(
@@ -707,7 +717,7 @@
707
717
  * withholds every remove control. The native `readonly` gives the text half;
708
718
  * the rest is the family's.
709
719
  */
710
- [data-ui='tags-input'][data-part='root'][data-readonly] {
720
+ [data-ui-tags-input][data-part-root][data-readonly] {
711
721
  background-color: var(
712
722
  --slotted-tags-input-readonly-background,
713
723
  var(--slotted-tone-secondary-subtle-hover)
@@ -719,8 +729,8 @@
719
729
  * because a disabled `fieldset` disables every control inside it and the
720
730
  * control has no way to say so.
721
731
  */
722
- [data-ui='tags-input'][data-part='root'][data-disabled],
723
- [data-ui='tags-input'][data-part='root']:has([data-part='input']:disabled) {
732
+ [data-ui-tags-input][data-part-root][data-disabled],
733
+ [data-ui-tags-input][data-part-root]:has([data-part-input]:disabled) {
724
734
  background-color: var(
725
735
  --slotted-tags-input-disabled-background,
726
736
  var(--slotted-disabled-background)
@@ -731,14 +741,14 @@
731
741
  cursor: not-allowed;
732
742
  }
733
743
 
734
- [data-ui='tags-input'] > [data-part='clear']:hover:not(:disabled):not([data-disabled]) {
744
+ [data-ui-tags-input] > [data-part-clear]:hover:not(:disabled):not([data-disabled]) {
735
745
  background-color: var(
736
746
  --slotted-tags-input-action-hover-background,
737
747
  var(--slotted-tone-secondary-subtle-hover)
738
748
  );
739
749
  }
740
750
 
741
- [data-ui='tags-input'] > [data-part='clear']:active:not(:disabled):not([data-disabled]) {
751
+ [data-ui-tags-input] > [data-part-clear]:active:not(:disabled):not([data-disabled]) {
742
752
  background-color: var(
743
753
  --slotted-tags-input-action-active-background,
744
754
  var(--slotted-tone-secondary-subtle-active)
@@ -750,8 +760,61 @@
750
760
  * from the input to it has to move something visible, and a ring around the
751
761
  * whole frame would sit still while focus moved inside it.
752
762
  */
753
- [data-ui='tags-input'] > [data-part='clear']:focus-visible {
763
+ [data-ui-tags-input] > [data-part-clear]:focus-visible {
754
764
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
755
765
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
756
766
  }
767
+
768
+ /* ── The suggestions ──────────────────────────────────────────────────── */
769
+
770
+ /**
771
+ * A raised surface as wide as the frame, written where the positioner puts
772
+ * it: `left` and `top` are its, and the width is the anchor's, which it
773
+ * publishes. Ten options are seen before the list scrolls.
774
+ */
775
+ [data-ui-tags-input] > [data-part-suggestions] {
776
+ background-color: var(--slotted-surface-raised, Canvas);
777
+ border: var(--slotted-border-width-thin, 1px) solid var(--slotted-border-subtle, GrayText);
778
+ border-radius: var(--slotted-radius-lg, 8px);
779
+ box-shadow: var(--slotted-shadow-md);
780
+ box-sizing: border-box;
781
+ color: var(--slotted-text, CanvasText);
782
+ font-size: var(--_font-size);
783
+ /* No inset of its own: the positioner writes `left` and `top`, and an
784
+ inline inset would resolve to `right` in a right-to-left document. */
785
+ inline-size: var(--slotted-positioner-anchor-width, 100%);
786
+ max-block-size: calc(10 * var(--_height) + 2 * var(--slotted-space-2, 0.25rem));
787
+ overflow-y: auto;
788
+ overscroll-behavior: contain;
789
+ padding: var(--slotted-space-2, 0.25rem);
790
+ position: fixed;
791
+ z-index: calc(var(--slotted-z-index-popover, 1100) + var(--slotted-layer-depth, 0));
792
+ }
793
+
794
+ /* One option is one control row, so the list reads at the frame's own step. */
795
+ [data-ui-tags-input] > [data-part-suggestions] > [data-part-suggestion] {
796
+ align-items: center;
797
+ border-radius: var(--slotted-control-radius, 4px);
798
+ cursor: default;
799
+ display: flex;
800
+ min-block-size: var(--_height);
801
+ overflow-wrap: anywhere;
802
+ padding-inline: var(--_padding-inline);
803
+ }
804
+
805
+ /**
806
+ * The highlight follows the arrow keys and the pointer alike. The `-active`
807
+ * step of the neutral tone, the one that lifts off a raised surface in every
808
+ * scheme, as `combobox.css` explains.
809
+ */
810
+ [data-ui-tags-input] > [data-part-suggestions] > [data-highlighted] {
811
+ background-color: var(--slotted-tone-secondary-subtle-active);
812
+ }
813
+
814
+ @media (forced-colors: active) {
815
+ [data-ui-tags-input] > [data-part-suggestions] > [data-highlighted] {
816
+ background-color: Highlight;
817
+ color: HighlightText;
818
+ }
819
+ }
757
820
  }
@@ -1,7 +1,9 @@
1
1
  [
2
2
  "--slotted-border-subtle",
3
+ "--slotted-border-width-thin",
3
4
  "--slotted-control-border-color",
4
5
  "--slotted-control-border-width",
6
+ "--slotted-control-focus-ring-offset",
5
7
  "--slotted-control-font-family",
6
8
  "--slotted-control-font-size-lg",
7
9
  "--slotted-control-font-size-md",
@@ -38,9 +40,12 @@
38
40
  "--slotted-font-size-xs",
39
41
  "--slotted-font-weight-medium",
40
42
  "--slotted-line-height-sm",
43
+ "--slotted-radius-lg",
41
44
  "--slotted-radius-none",
45
+ "--slotted-shadow-md",
42
46
  "--slotted-space-1",
43
47
  "--slotted-space-2",
48
+ "--slotted-surface-raised",
44
49
  "--slotted-surface-sunken",
45
50
  "--slotted-tags-input-action-active-background",
46
51
  "--slotted-tags-input-action-color",
@@ -80,5 +85,6 @@
80
85
  "--slotted-tone-accent-text",
81
86
  "--slotted-tone-danger-border",
82
87
  "--slotted-tone-secondary-subtle-active",
83
- "--slotted-tone-secondary-subtle-hover"
88
+ "--slotted-tone-secondary-subtle-hover",
89
+ "--slotted-z-index-popover"
84
90
  ]