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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +35 -42
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +149 -68
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +79 -74
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +103 -90
  36. package/src/command-palette/command-palette.tokens.json +1 -0
  37. package/src/container/container.css +24 -24
  38. package/src/context-menu/context-menu.css +8 -8
  39. package/src/currency-field/currency-field.css +210 -88
  40. package/src/currency-field/currency-field.tokens.json +13 -0
  41. package/src/dashboard-grid/dashboard-grid.css +148 -116
  42. package/src/data-grid/data-grid.css +535 -470
  43. package/src/data-grid/data-grid.tokens.json +4 -0
  44. package/src/data-list/data-list.css +81 -70
  45. package/src/data-list/data-list.tokens.json +2 -1
  46. package/src/date-field/date-field.css +55 -52
  47. package/src/date-field/date-field.tokens.json +1 -0
  48. package/src/date-picker/date-picker.css +40 -42
  49. package/src/date-range-picker/date-range-picker.css +114 -118
  50. package/src/datetime-field/datetime-field.css +78 -80
  51. package/src/datetime-field/datetime-field.tokens.json +1 -0
  52. package/src/datetime-picker/datetime-picker.css +61 -63
  53. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  54. package/src/description-list/description-list.css +61 -64
  55. package/src/detail-panel/detail-panel.css +86 -71
  56. package/src/detail-panel/detail-panel.tokens.json +2 -0
  57. package/src/dialog/dialog.css +372 -153
  58. package/src/dialog/dialog.tokens.json +6 -0
  59. package/src/divider/divider.css +18 -18
  60. package/src/drawer/drawer.css +205 -210
  61. package/src/drawer/drawer.tokens.json +1 -0
  62. package/src/entity-picker/entity-picker.css +238 -241
  63. package/src/entity-picker/entity-picker.tokens.json +1 -0
  64. package/src/event-calendar/event-calendar.css +343 -385
  65. package/src/field/field.css +74 -78
  66. package/src/field-group/field-group.css +22 -25
  67. package/src/filter-bar/filter-bar.css +193 -209
  68. package/src/form/form.css +34 -24
  69. package/src/form/form.tokens.json +1 -0
  70. package/src/fullscreen/fullscreen.css +24 -25
  71. package/src/grid/grid.css +28 -28
  72. package/src/highlight/highlight.css +6 -6
  73. package/src/hover-card/hover-card.css +6 -6
  74. package/src/icon/icon.css +19 -15
  75. package/src/icon/icon.tokens.json +1 -0
  76. package/src/image/image.css +39 -39
  77. package/src/import-export-center/import-export-center.css +135 -156
  78. package/src/inline/inline.css +27 -27
  79. package/src/inline-message/inline-message.css +52 -28
  80. package/src/inline-message/inline-message.tokens.json +4 -0
  81. package/src/kbd/kbd.css +30 -26
  82. package/src/link/link.css +15 -15
  83. package/src/list/list.css +44 -17
  84. package/src/list/list.tokens.json +4 -0
  85. package/src/list-item/list-item.css +80 -66
  86. package/src/list-item/list-item.tokens.json +7 -0
  87. package/src/listbox/listbox.css +56 -59
  88. package/src/loading-overlay/loading-overlay.css +75 -92
  89. package/src/markdown/markdown.css +17 -17
  90. package/src/menu/menu.css +83 -63
  91. package/src/menubar/menubar.css +13 -13
  92. package/src/message/message.css +182 -202
  93. package/src/message/message.tokens.json +5 -0
  94. package/src/message-scroller/message-scroller.css +41 -42
  95. package/src/multi-select/multi-select.css +152 -145
  96. package/src/multi-select/multi-select.tokens.json +1 -0
  97. package/src/navigation-menu/navigation-menu.css +167 -188
  98. package/src/notification-center/notification-center.css +140 -148
  99. package/src/notification-center/notification-center.tokens.json +3 -0
  100. package/src/number-field/number-field.css +84 -83
  101. package/src/number-field/number-field.tokens.json +1 -0
  102. package/src/otp-input/otp-input.css +67 -57
  103. package/src/otp-input/otp-input.tokens.json +1 -0
  104. package/src/page/page.css +39 -23
  105. package/src/page/page.tokens.json +1 -0
  106. package/src/page-header/page-header.css +323 -283
  107. package/src/page-header/page-header.tokens.json +5 -0
  108. package/src/pagination/pagination.css +68 -72
  109. package/src/popover/popover.css +40 -49
  110. package/src/progress-indicator/progress-indicator.css +177 -120
  111. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  112. package/src/prompt-composer/prompt-composer.css +221 -102
  113. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  114. package/src/prose/prose.css +71 -75
  115. package/src/radio-group/radio-group.css +98 -103
  116. package/src/rating/rating.css +136 -132
  117. package/src/rating/rating.tokens.json +1 -0
  118. package/src/result-state/result-state.css +74 -77
  119. package/src/runtime-properties.mjs +2 -0
  120. package/src/saved-views/saved-views.css +41 -47
  121. package/src/scroll-area/scroll-area.css +39 -32
  122. package/src/section/section.css +161 -41
  123. package/src/section/section.tokens.json +7 -2
  124. package/src/segmented-control/segmented-control.css +254 -97
  125. package/src/segmented-control/segmented-control.tokens.json +15 -11
  126. package/src/select/select.css +118 -117
  127. package/src/select/select.tokens.json +1 -0
  128. package/src/side-navigation/side-navigation.css +179 -182
  129. package/src/side-navigation/side-navigation.tokens.json +1 -0
  130. package/src/skeleton/skeleton.css +47 -48
  131. package/src/slider/slider.css +86 -88
  132. package/src/sparkline/sparkline.css +62 -40
  133. package/src/sparkline/sparkline.tokens.json +2 -0
  134. package/src/spinner/spinner.css +83 -180
  135. package/src/spinner/spinner.tokens.json +0 -1
  136. package/src/split-button/split-button.css +30 -31
  137. package/src/split-button/split-button.tokens.json +1 -0
  138. package/src/splitter/splitter.css +35 -35
  139. package/src/stack/stack.css +24 -24
  140. package/src/stat-card/stat-card.css +341 -224
  141. package/src/stat-card/stat-card.tokens.json +3 -0
  142. package/src/status-indicator/status-indicator.css +28 -28
  143. package/src/stepper/stepper.css +58 -62
  144. package/src/switch/switch.css +86 -92
  145. package/src/table/table.css +310 -165
  146. package/src/table/table.tokens.json +6 -0
  147. package/src/table-of-contents/table-of-contents.css +51 -54
  148. package/src/tabs/tabs.css +337 -302
  149. package/src/tabs/tabs.tokens.json +8 -5
  150. package/src/tag/tag.css +79 -71
  151. package/src/tag/tag.tokens.json +9 -0
  152. package/src/tags-input/tags-input.css +145 -82
  153. package/src/tags-input/tags-input.tokens.json +7 -1
  154. package/src/text-field/text-field.css +132 -136
  155. package/src/text-field/text-field.tokens.json +1 -0
  156. package/src/textarea/textarea.css +31 -28
  157. package/src/textarea/textarea.tokens.json +1 -0
  158. package/src/time-field/time-field.css +72 -69
  159. package/src/time-field/time-field.tokens.json +1 -0
  160. package/src/time-picker/time-picker.css +56 -58
  161. package/src/time-range-picker/time-range-picker.css +126 -133
  162. package/src/timeline/timeline.css +254 -266
  163. package/src/timeline/timeline.tokens.json +5 -0
  164. package/src/toast/toast.css +108 -90
  165. package/src/toast/toast.tokens.json +6 -0
  166. package/src/toggle/toggle.css +62 -25
  167. package/src/toggle/toggle.tokens.json +8 -0
  168. package/src/toggle-group/toggle-group.css +106 -60
  169. package/src/toggle-group/toggle-group.tokens.json +10 -0
  170. package/src/toolbar/toolbar.css +30 -35
  171. package/src/tooltip/tooltip.css +26 -26
  172. package/src/top-navigation/top-navigation.css +243 -259
  173. package/src/tour/tour.css +51 -60
  174. package/src/transfer/transfer.css +160 -164
  175. package/src/tree/tree.css +103 -111
  176. package/src/typography/typography.css +40 -36
  177. package/src/typography/typography.tokens.json +1 -0
  178. package/src/upload/upload.css +224 -224
  179. package/src/visually-hidden/visually-hidden.css +1 -1
  180. package/src/wizard/wizard.css +185 -197
@@ -46,6 +46,7 @@
46
46
  "--slotted-combobox-surface",
47
47
  "--slotted-control-border-color",
48
48
  "--slotted-control-border-width",
49
+ "--slotted-control-focus-ring-offset",
49
50
  "--slotted-control-font-family",
50
51
  "--slotted-control-font-size-lg",
51
52
  "--slotted-control-font-size-md",
@@ -23,7 +23,7 @@
23
23
  * The layer, the scrim, the motion of arriving and leaving, the focus
24
24
  * containment and the Escape that closes are `dialog`'s: the panel stands
25
25
  * inside a dialog whose surface is `plain`, and `identity.test.mjs` keeps
26
- * this sheet off `[data-ui='dialog']`. The keys in an item's shortcut and in
26
+ * this sheet off `[data-ui-dialog]`. The keys in an item's shortcut and in
27
27
  * the footer's hints are `kbd`'s, worn as `data-ui='kbd'` under this family's
28
28
  * own `shortcut` and `hint` parts, so every selector on those two parts is a
29
29
  * child selector and never reaches the caps inside them. The mark on the
@@ -57,7 +57,7 @@
57
57
  * down. Only the panel's own radius and the list's inset come off the space
58
58
  * and radius scales.
59
59
  */
60
- [data-ui='command-palette'] {
60
+ [data-ui-command-palette] {
61
61
  --_surface: var(--slotted-command-palette-surface, var(--slotted-surface-raised, #ffffff));
62
62
  --_text: var(--slotted-command-palette-text, var(--slotted-text, #0f172a));
63
63
  --_muted: var(--slotted-command-palette-text-muted, var(--slotted-text-muted, #5b6b7f));
@@ -135,9 +135,28 @@
135
135
  overflow: clip;
136
136
  }
137
137
 
138
+ /**
139
+ * A theme draws the panel as a material with this filter beside a surface
140
+ * with alpha: `--slotted-command-palette-backdrop-filter`, `none` unless set.
141
+ * The root is the one layer that paints a ground under either presentation.
142
+ * A reader who asked for less transparency gets no filter, and under forced
143
+ * colours the ground is the system's.
144
+ */
145
+ [data-ui-command-palette] {
146
+ -webkit-backdrop-filter: var(--slotted-command-palette-backdrop-filter, none);
147
+ backdrop-filter: var(--slotted-command-palette-backdrop-filter, none);
148
+ }
149
+
150
+ @media (prefers-reduced-transparency: reduce), (forced-colors: active) {
151
+ [data-ui-command-palette] {
152
+ -webkit-backdrop-filter: none;
153
+ backdrop-filter: none;
154
+ }
155
+ }
156
+
138
157
  /* ── Size ─────────────────────────────────────────────────────────────── */
139
158
 
140
- [data-ui='command-palette'][data-size='sm'] {
159
+ [data-ui-command-palette][data-size='sm'] {
141
160
  --_item-height: var(--slotted-control-height-sm, 30px);
142
161
  --_item-inset: var(--slotted-control-padding-inline-sm, 10px);
143
162
  --_font-size: var(--slotted-control-font-size-sm, 12px);
@@ -150,7 +169,7 @@
150
169
  --_chip-size: var(--slotted-control-inner-size-sm, 22px);
151
170
  }
152
171
 
153
- [data-ui='command-palette'][data-size='lg'] {
172
+ [data-ui-command-palette][data-size='lg'] {
154
173
  --_item-height: var(--slotted-control-height-lg, 38px);
155
174
  --_item-inset: var(--slotted-control-padding-inline-lg, 16px);
156
175
  --_font-size: var(--slotted-control-font-size-lg, 14px);
@@ -172,7 +191,7 @@
172
191
  * something else — so it draws no edge and no ground of its own, and the
173
192
  * rule under the header is the one line between the field and the list.
174
193
  */
175
- [data-ui='command-palette'] > [data-part='header'] {
194
+ [data-ui-command-palette] > [data-part-header] {
176
195
  align-items: center;
177
196
  border-block-end: var(--_border-width) solid var(--_border-color);
178
197
  box-sizing: border-box;
@@ -194,8 +213,7 @@
194
213
  * a bottom edge: `state-rail.test.mjs` (R1) refuses a state rail on the
195
214
  * start or the top edge, and this is neither.
196
215
  */
197
- [data-ui='command-palette']
198
- > [data-part='header']:has(> [data-part='input']:focus-visible)::after {
216
+ [data-ui-command-palette] > [data-part-header]:has(> [data-part-input]:focus-visible)::after {
199
217
  background-color: var(--slotted-focus-ring-color, currentColor);
200
218
  block-size: var(--slotted-focus-ring-width, 2px);
201
219
  content: '';
@@ -205,7 +223,7 @@
205
223
  position: absolute;
206
224
  }
207
225
 
208
- [data-ui='command-palette'] :is([data-part='search'], [data-part='busy']) {
226
+ [data-ui-command-palette] :is([data-part-search], [data-part-busy]) {
209
227
  color: var(--_muted);
210
228
  flex: none;
211
229
  }
@@ -215,7 +233,7 @@
215
233
  * icon box at the header's icon size so it sits on the field's line; a
216
234
  * character is never an icon.
217
235
  */
218
- [data-ui='command-palette'] [data-part='search'] {
236
+ [data-ui-command-palette] [data-part-search] {
219
237
  --slotted-icon-size: var(--_header-icon-size);
220
238
 
221
239
  display: flex;
@@ -226,7 +244,7 @@
226
244
  * `spinner/spinner.css`'s, worn as `data-ui='spinner'` beside this family's
227
245
  * part, and this family only says where it stands and how big it is.
228
246
  */
229
- [data-ui='command-palette'] [data-part='busy'] {
247
+ [data-ui-command-palette] [data-part-busy] {
230
248
  --slotted-spinner-size: var(--_header-icon-size);
231
249
  }
232
250
 
@@ -237,7 +255,7 @@
237
255
  * Each is a control that returns to its page; the last one is where the
238
256
  * reader is and reads as the field's own prefix.
239
257
  */
240
- [data-ui='command-palette'] [data-part='pages'] {
258
+ [data-ui-command-palette] [data-part-pages] {
241
259
  align-items: center;
242
260
  display: flex;
243
261
  flex: none;
@@ -249,11 +267,11 @@
249
267
  padding: 0;
250
268
  }
251
269
 
252
- [data-ui='command-palette'] [data-part='pages'] > li {
270
+ [data-ui-command-palette] [data-part-pages] > li {
253
271
  display: contents;
254
272
  }
255
273
 
256
- [data-ui='command-palette'] [data-part='page'] {
274
+ [data-ui-command-palette] [data-part-page] {
257
275
  align-items: center;
258
276
  appearance: none;
259
277
  background-color: var(--slotted-command-palette-page-surface, var(--_hover));
@@ -284,32 +302,32 @@
284
302
  white-space: nowrap;
285
303
  }
286
304
 
287
- [data-ui='command-palette'] [data-part='page'] > span {
305
+ [data-ui-command-palette] [data-part-page] > span {
288
306
  overflow: hidden;
289
307
  text-overflow: ellipsis;
290
308
  }
291
309
 
292
310
  /* A chip inside the header is shorter than the target minimum at every
293
311
  density; the hit area is recovered outside its paint. */
294
- [data-ui='command-palette'] [data-part='page']::after {
312
+ [data-ui-command-palette] [data-part-page]::after {
295
313
  content: '';
296
314
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
297
315
  position: absolute;
298
316
  }
299
317
 
300
- [data-ui='command-palette'] [data-part='page']:not(:disabled):hover {
318
+ [data-ui-command-palette] [data-part-page]:not(:disabled):hover {
301
319
  background-color: var(--_active);
302
320
  color: var(--_text);
303
321
  }
304
322
 
305
- [data-ui='command-palette'] [data-part='page']:not(:disabled):active {
323
+ [data-ui-command-palette] [data-part-page]:not(:disabled):active {
306
324
  background-color: var(--_active);
307
325
  }
308
326
 
309
327
  /* Drawn one width inside the chip, as a chip in a scrolling row draws it:
310
328
  the header clips at its padding edge and a ring at the theme's offset
311
329
  would lose its outer half. */
312
- [data-ui='command-palette'] [data-part='page']:focus-visible {
330
+ [data-ui-command-palette] [data-part-page]:focus-visible {
313
331
  outline: var(--slotted-focus-ring-width, 2px) solid
314
332
  var(--slotted-focus-ring-color, currentColor);
315
333
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
@@ -321,7 +339,7 @@
321
339
  * right-to-left document so the trail reads in the direction the reader
322
340
  * reads.
323
341
  */
324
- [data-ui='command-palette'] [data-part='pages'] > li > [data-ui='icon'] {
342
+ [data-ui-command-palette] [data-part-pages] > li > [data-ui-icon] {
325
343
  --slotted-icon-size: var(--_icon-size);
326
344
 
327
345
  color: var(--_muted);
@@ -330,7 +348,7 @@
330
348
 
331
349
  /* ── The field ────────────────────────────────────────────────────────── */
332
350
 
333
- [data-ui='command-palette'] [data-part='input'] {
351
+ [data-ui-command-palette] [data-part-input] {
334
352
  appearance: none;
335
353
  background: transparent;
336
354
  block-size: 100%;
@@ -349,7 +367,7 @@
349
367
  padding: 0;
350
368
  }
351
369
 
352
- [data-ui='command-palette'] [data-part='input']::placeholder {
370
+ [data-ui-command-palette] [data-part-input]::placeholder {
353
371
  color: var(--_muted);
354
372
  opacity: 1;
355
373
  }
@@ -362,7 +380,7 @@
362
380
  * or not — measured on the Nexora palette at 390 pixels. Only while the
363
381
  * placeholder shows: what the reader types is never faded under the caret.
364
382
  */
365
- [data-ui='command-palette'] [data-part='input']:placeholder-shown {
383
+ [data-ui-command-palette] [data-part-input]:placeholder-shown {
366
384
  mask-image: linear-gradient(
367
385
  to right,
368
386
  #000 calc(100% - var(--slotted-command-palette-placeholder-fade, 2em)),
@@ -372,8 +390,8 @@
372
390
 
373
391
  /* The browser's own clear and its search decoration, which the family
374
392
  draws itself so the two schemes and the three densities agree. */
375
- [data-ui='command-palette'] [data-part='input']::-webkit-search-cancel-button,
376
- [data-ui='command-palette'] [data-part='input']::-webkit-search-decoration {
393
+ [data-ui-command-palette] [data-part-input]::-webkit-search-cancel-button,
394
+ [data-ui-command-palette] [data-part-input]::-webkit-search-decoration {
377
395
  appearance: none;
378
396
  }
379
397
 
@@ -384,7 +402,7 @@
384
402
  * because Escape already clears and a second stop before the list is a
385
403
  * stop nobody asked for.
386
404
  */
387
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear'] {
405
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear] {
388
406
  --_clear-size: min(
389
407
  calc(var(--_icon-size) + 2 * var(--slotted-space-2, 0.25rem)),
390
408
  var(--slotted-control-inner-size-md, 24px)
@@ -412,7 +430,7 @@
412
430
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
413
431
  }
414
432
 
415
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear']::after {
433
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear]::after {
416
434
  content: '';
417
435
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
418
436
  position: absolute;
@@ -423,27 +441,27 @@
423
441
  the hit area above grows to 44 pixels around them. It does not reach
424
442
  across the close control after it. */
425
443
  @media (pointer: coarse) {
426
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear']::after {
444
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear]::after {
427
445
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
428
446
  }
429
447
 
430
- [data-ui='command-palette']
431
- > [data-part='header']
432
- > [data-part='clear']:has(+ [data-part='close'])::after {
448
+ [data-ui-command-palette]
449
+ > [data-part-header]
450
+ > [data-part-clear]:has(+ [data-part-close])::after {
433
451
  inset-inline-end: 0;
434
452
  }
435
453
  }
436
454
 
437
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear']:not(:disabled):hover {
455
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear]:not(:disabled):hover {
438
456
  background-color: var(--_hover);
439
457
  color: var(--_text);
440
458
  }
441
459
 
442
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear']:not(:disabled):active {
460
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear]:not(:disabled):active {
443
461
  background-color: var(--_active);
444
462
  }
445
463
 
446
- [data-ui='command-palette'] > [data-part='header'] > [data-part='clear']:focus-visible {
464
+ [data-ui-command-palette] > [data-part-header] > [data-part-clear]:focus-visible {
447
465
  outline: var(--slotted-focus-ring-width, 2px) solid
448
466
  var(--slotted-focus-ring-color, currentColor);
449
467
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
@@ -451,7 +469,7 @@
451
469
 
452
470
  /* Present in the DOM whenever the family renders it, drawn only with a
453
471
  query: a clear beside an empty field is a control with nothing to do. */
454
- [data-ui='command-palette']:not([data-query]) > [data-part='header'] > [data-part='clear'] {
472
+ [data-ui-command-palette]:not([data-query]) > [data-part-header] > [data-part-clear] {
455
473
  display: none;
456
474
  }
457
475
 
@@ -463,7 +481,7 @@
463
481
  * beside a search field reads as clear, which is what `clear` already is.
464
482
  * Drawn only under the dialog's own full-screen query, below.
465
483
  */
466
- [data-ui='command-palette'] > [data-part='header'] > [data-part='close'] {
484
+ [data-ui-command-palette] > [data-part-header] > [data-part-close] {
467
485
  align-items: center;
468
486
  appearance: none;
469
487
  background-color: transparent;
@@ -483,15 +501,15 @@
483
501
  white-space: nowrap;
484
502
  }
485
503
 
486
- [data-ui='command-palette'] > [data-part='header'] > [data-part='close']:not(:disabled):hover {
504
+ [data-ui-command-palette] > [data-part-header] > [data-part-close]:not(:disabled):hover {
487
505
  background-color: var(--_hover);
488
506
  }
489
507
 
490
- [data-ui='command-palette'] > [data-part='header'] > [data-part='close']:not(:disabled):active {
508
+ [data-ui-command-palette] > [data-part-header] > [data-part-close]:not(:disabled):active {
491
509
  background-color: var(--_active);
492
510
  }
493
511
 
494
- [data-ui='command-palette'] > [data-part='header'] > [data-part='close']:focus-visible {
512
+ [data-ui-command-palette] > [data-part-header] > [data-part-close]:focus-visible {
495
513
  outline: var(--slotted-focus-ring-width, 2px) solid
496
514
  var(--slotted-focus-ring-color, currentColor);
497
515
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
@@ -503,7 +521,7 @@
503
521
  * Five columns, bounded, scrolling. `overscroll-behavior` keeps the page —
504
522
  * or the popover — still once the list has scrolled to its end.
505
523
  */
506
- [data-ui='command-palette'] > [data-part='list'] {
524
+ [data-ui-command-palette] > [data-part-list] {
507
525
  box-sizing: border-box;
508
526
  display: grid;
509
527
  grid-template-columns: auto minmax(0, 1fr) auto auto auto;
@@ -517,19 +535,19 @@
517
535
  scroll-padding-block: var(--_list-inset);
518
536
  }
519
537
 
520
- [data-ui='command-palette'] > [data-part='list'][data-loading] {
538
+ [data-ui-command-palette] > [data-part-list][data-loading] {
521
539
  cursor: progress;
522
540
  }
523
541
 
524
542
  /* ── Groups ───────────────────────────────────────────────────────────── */
525
543
 
526
- [data-ui='command-palette'] [data-part='group'] {
544
+ [data-ui-command-palette] [data-part-group] {
527
545
  display: grid;
528
546
  grid-column: 1 / -1;
529
547
  grid-template-columns: subgrid;
530
548
  }
531
549
 
532
- [data-ui='command-palette'] [data-part='group-label'] {
550
+ [data-ui-command-palette] [data-part-group-label] {
533
551
  color: var(--_muted);
534
552
  font-size: var(--_secondary-font-size);
535
553
  font-weight: var(--slotted-font-weight-semibold, 600);
@@ -548,7 +566,7 @@
548
566
  * `min-block-size` rather than a height, because an item with a description
549
567
  * is two lines tall and still has to clear the target minimum.
550
568
  */
551
- [data-ui='command-palette'] [data-part='item'] {
569
+ [data-ui-command-palette] [data-part-item] {
552
570
  align-content: center;
553
571
  border-radius: var(--_item-radius);
554
572
  box-sizing: border-box;
@@ -582,11 +600,11 @@
582
600
  * moves; the two are told apart so a reader who arrowed to one row while the
583
601
  * pointer rests on another reads exactly one cursor.
584
602
  */
585
- [data-ui='command-palette'] [data-part='item']:not([data-disabled]):not([data-current]):hover {
603
+ [data-ui-command-palette] [data-part-item]:not([data-disabled]):not([data-current]):hover {
586
604
  background-color: var(--_hover);
587
605
  }
588
606
 
589
- [data-ui='command-palette'] [data-part='item']:not([data-disabled]):not([data-current]):active {
607
+ [data-ui-command-palette] [data-part-item]:not([data-disabled]):not([data-current]):active {
590
608
  background-color: var(--_active);
591
609
  }
592
610
 
@@ -597,13 +615,13 @@
597
615
  * of row is a reading, not a movement, and a transition lags behind a reader
598
616
  * holding ArrowDown.
599
617
  */
600
- [data-ui='command-palette'] [data-part='item'][data-current] {
618
+ [data-ui-command-palette] [data-part-item][data-current] {
601
619
  background-color: var(--_highlight);
602
620
  box-shadow: inset 0 0 0 var(--slotted-border-width-thin, 1px) var(--_highlight-ring);
603
621
  transition: none;
604
622
  }
605
623
 
606
- [data-ui='command-palette'] [data-part='item'][data-current]:not([data-disabled]):active {
624
+ [data-ui-command-palette] [data-part-item][data-current]:not([data-disabled]):active {
607
625
  background-color: var(--_active);
608
626
  }
609
627
 
@@ -612,7 +630,7 @@
612
630
  * current — `moveIndex` skips it and the pointer does not highlight it. The
613
631
  * hand goes, because there is nothing to press.
614
632
  */
615
- [data-ui='command-palette'] [data-part='item'][data-disabled] {
633
+ [data-ui-command-palette] [data-part-item][data-disabled] {
616
634
  color: var(--slotted-disabled-foreground, #64748b);
617
635
  cursor: not-allowed;
618
636
  }
@@ -620,11 +638,11 @@
620
638
  /* A handler that has not answered yet: the cursor says so, and the ring
621
639
  `spinner` draws stands in the last column, where the arrow of a page
622
640
  item stands, sized to the row's own glyph. */
623
- [data-ui='command-palette'] [data-part='item'][data-loading] {
641
+ [data-ui-command-palette] [data-part-item][data-loading] {
624
642
  cursor: progress;
625
643
  }
626
644
 
627
- [data-ui='command-palette'] [data-part='item'] > [data-part='busy'] {
645
+ [data-ui-command-palette] [data-part-item] > [data-part-busy] {
628
646
  --slotted-spinner-size: var(--_icon-size);
629
647
 
630
648
  color: var(--_muted);
@@ -648,7 +666,7 @@
648
666
  * the child and not on the box, because the box's `1lh` reads the item's
649
667
  * line box.
650
668
  */
651
- [data-ui='command-palette'] [data-part='icon'] {
669
+ [data-ui-command-palette] [data-part-icon] {
652
670
  --slotted-icon-size: var(--_icon-size);
653
671
 
654
672
  align-items: center;
@@ -665,7 +683,7 @@
665
683
  margin-inline-end: calc(var(--_column-gap) + var(--slotted-space-2, 0.25rem));
666
684
  }
667
685
 
668
- [data-ui='command-palette'] [data-part='icon']:not(:empty) > * {
686
+ [data-ui-command-palette] [data-part-icon]:not(:empty) > * {
669
687
  block-size: var(--_icon-size);
670
688
  font-size: var(--_icon-size);
671
689
  inline-size: var(--_icon-size);
@@ -677,7 +695,7 @@
677
695
  * is three rows pretending to be one. The whole text is on the item's
678
696
  * `title` and reachable by the reader, so nothing leaves the DOM.
679
697
  */
680
- [data-ui='command-palette'] [data-part='label'] {
698
+ [data-ui-command-palette] [data-part-label] {
681
699
  grid-column: 2;
682
700
  grid-row: 1;
683
701
  min-inline-size: 0;
@@ -686,7 +704,7 @@
686
704
  white-space: nowrap;
687
705
  }
688
706
 
689
- [data-ui='command-palette'] [data-part='description'] {
707
+ [data-ui-command-palette] [data-part-description] {
690
708
  color: var(--_muted);
691
709
  font-size: var(--_secondary-font-size);
692
710
  grid-column: 2;
@@ -698,7 +716,7 @@
698
716
  white-space: nowrap;
699
717
  }
700
718
 
701
- [data-ui='command-palette'] [data-part='item'][data-disabled] > [data-part='description'] {
719
+ [data-ui-command-palette] [data-part-item][data-disabled] > [data-part-description] {
702
720
  color: inherit;
703
721
  }
704
722
 
@@ -709,14 +727,14 @@
709
727
  * label's line box stretched that row, and the description under it dropped
710
728
  * by the difference — a gap that opened only on rows with a binding.
711
729
  */
712
- [data-ui='command-palette']
713
- [data-part='item']
714
- > :is([data-part='meta'], [data-part='shortcut'], [data-part='arrow'], [data-part='busy']) {
730
+ [data-ui-command-palette]
731
+ [data-part-item]
732
+ > :is([data-part-meta], [data-part-shortcut], [data-part-arrow], [data-part-busy]) {
715
733
  align-self: center;
716
734
  grid-row: 1 / -1;
717
735
  }
718
736
 
719
- [data-ui='command-palette'] [data-part='meta'] {
737
+ [data-ui-command-palette] [data-part-meta] {
720
738
  color: var(--_muted);
721
739
  font-size: var(--_secondary-font-size);
722
740
  grid-column: 3;
@@ -728,9 +746,7 @@
728
746
  /* A word on a row with no binding takes the binding's column too, so it
729
747
  ends where the bindings on the rows around it end rather than a column
730
748
  short of them. */
731
- [data-ui='command-palette']
732
- [data-part='item']:not(:has(> [data-part='shortcut']))
733
- > [data-part='meta'] {
749
+ [data-ui-command-palette] [data-part-item]:not(:has(> [data-part-shortcut])) > [data-part-meta] {
734
750
  grid-column: 3 / 5;
735
751
  }
736
752
 
@@ -739,7 +755,7 @@
739
755
  * rule places the column and states its ink; every selector stops at the
740
756
  * part and never reaches the caps.
741
757
  */
742
- [data-ui='command-palette'] [data-part='item'] > [data-part='shortcut'] {
758
+ [data-ui-command-palette] [data-part-item] > [data-part-shortcut] {
743
759
  align-items: center;
744
760
  color: var(--_muted);
745
761
  display: inline-flex;
@@ -757,9 +773,9 @@
757
773
  white-space: nowrap;
758
774
  }
759
775
 
760
- [data-ui='command-palette']
761
- [data-part='item'][data-disabled]
762
- > :is([data-part='meta'], [data-part='shortcut']) {
776
+ [data-ui-command-palette]
777
+ [data-part-item][data-disabled]
778
+ > :is([data-part-meta], [data-part-shortcut]) {
763
779
  color: inherit;
764
780
  }
765
781
 
@@ -769,7 +785,7 @@
769
785
  * glyph in a `directional` icon box, which mirrors in a right-to-left
770
786
  * document; the column is one line box tall and centres it.
771
787
  */
772
- [data-ui='command-palette'] [data-part='arrow'] {
788
+ [data-ui-command-palette] [data-part-arrow] {
773
789
  --slotted-icon-size: var(--_icon-size);
774
790
 
775
791
  align-items: center;
@@ -790,7 +806,7 @@
790
806
  * painted them as one-pixel rules — the bar over the word, and the word
791
807
  * itself pushed out of a box one pixel tall.
792
808
  */
793
- [data-ui='command-palette'] > [data-part='list'] [data-part='separator']:not([data-separator]) {
809
+ [data-ui-command-palette] > [data-part-list] [data-part-separator]:not([data-separator]) {
794
810
  background-color: var(--slotted-command-palette-separator-color, var(--_border-color));
795
811
  block-size: var(--_border-width);
796
812
  border: 0;
@@ -799,7 +815,7 @@
799
815
  margin-inline: 0;
800
816
  }
801
817
 
802
- [data-ui='command-palette'] [data-part='empty'] {
818
+ [data-ui-command-palette] [data-part-empty] {
803
819
  color: var(--_muted);
804
820
  grid-column: 1 / -1;
805
821
  padding-block: var(--slotted-space-8, 1.5rem);
@@ -814,7 +830,7 @@
814
830
  * what the reader is looking at. The clip is the visually-hidden idiom, kept
815
831
  * in the DOM so `role="status"` has something to announce from.
816
832
  */
817
- [data-ui='command-palette'] > [data-part='status'] {
833
+ [data-ui-command-palette] > [data-part-status] {
818
834
  block-size: 1px;
819
835
  clip-path: inset(50%);
820
836
  inline-size: 1px;
@@ -829,24 +845,24 @@
829
845
  * of an item, `combobox`'s decision for `combobox`'s reasons. The bars are
830
846
  * `skeleton/skeleton.css`'s; this family places them.
831
847
  */
832
- [data-ui='command-palette'] [data-part='placeholder'] {
848
+ [data-ui-command-palette] [data-part-placeholder] {
833
849
  display: grid;
834
850
  grid-column: 1 / -1;
835
851
  padding-block: var(--slotted-space-2, 0.25rem);
836
852
  padding-inline: var(--_item-inset);
837
853
  }
838
854
 
839
- [data-ui='command-palette'] [data-part='placeholder'] > * {
855
+ [data-ui-command-palette] [data-part-placeholder] > * {
840
856
  align-items: center;
841
857
  display: flex;
842
858
  min-block-size: var(--_item-height);
843
859
  }
844
860
 
845
- [data-ui='command-palette'] [data-part='placeholder'] > :nth-child(2) [data-ui='skeleton'] {
861
+ [data-ui-command-palette] [data-part-placeholder] > :nth-child(2) [data-ui-skeleton] {
846
862
  inline-size: 78%;
847
863
  }
848
864
 
849
- [data-ui='command-palette'] [data-part='placeholder'] > :nth-child(3) [data-ui='skeleton'] {
865
+ [data-ui-command-palette] [data-part-placeholder] > :nth-child(3) [data-ui-skeleton] {
850
866
  inline-size: 56%;
851
867
  }
852
868
 
@@ -857,7 +873,7 @@
857
873
  * `kbd`'s in its `plain` variant at the small step; the words beside them
858
874
  * are this family's, one step quieter than the list.
859
875
  */
860
- [data-ui='command-palette'] > [data-part='footer'] {
876
+ [data-ui-command-palette] > [data-part-footer] {
861
877
  align-items: center;
862
878
  background: var(
863
879
  --slotted-command-palette-footer-surface,
@@ -876,7 +892,7 @@
876
892
  padding-inline: var(--_header-inset);
877
893
  }
878
894
 
879
- [data-ui='command-palette'] > [data-part='footer'] > [data-part='hint'] {
895
+ [data-ui-command-palette] > [data-part-footer] > [data-part-hint] {
880
896
  align-items: center;
881
897
  display: inline-flex;
882
898
  /* The caps read the footer's own size through `kbd` at `inherit`, a tenth
@@ -892,7 +908,7 @@
892
908
  * because a line box of 1.4 is centred on its leading and not on its
893
909
  * letters. `line-height: 1` centres the em box, which is where the word is.
894
910
  */
895
- [data-ui='command-palette'] > [data-part='footer'] > [data-part='hint'] > span:not([data-ui]) {
911
+ [data-ui-command-palette] > [data-part-footer] > [data-part-hint] > span:not([data-ui]) {
896
912
  font-size: var(--slotted-font-size-xs, 0.75rem);
897
913
  line-height: 1;
898
914
  }
@@ -905,15 +921,15 @@
905
921
  * third of the header so the field is never squeezed to nothing.
906
922
  */
907
923
  @container command-palette (max-width: 360px) {
908
- [data-ui='command-palette'] :is([data-part='description'], [data-part='meta']) {
924
+ [data-ui-command-palette] :is([data-part-description], [data-part-meta]) {
909
925
  display: none;
910
926
  }
911
927
 
912
- [data-ui='command-palette'] [data-part='pages'] {
928
+ [data-ui-command-palette] [data-part-pages] {
913
929
  max-inline-size: 33%;
914
930
  }
915
931
 
916
- [data-ui='command-palette'] > [data-part='footer'] {
932
+ [data-ui-command-palette] > [data-part-footer] {
917
933
  gap: var(--slotted-space-4, 0.5rem);
918
934
  }
919
935
  }
@@ -925,13 +941,13 @@
925
941
  * edge is this panel's. The panel is asked the same question the dialog
926
942
  * asked, of the dialog's own named container, so the two answer together:
927
943
  * the corner, the side edges and the lift go, and the list takes the rest
928
- * of the screen. Written here rather than on `[data-ui='dialog']` because
944
+ * of the screen. Written here rather than on `[data-ui-dialog]` because
929
945
  * `identity.test.mjs` keeps this sheet off another family's identifier;
930
946
  * the container name and the breakpoint are the dialog's, recorded in
931
947
  * `dialog.css` beside its own query.
932
948
  */
933
949
  @container slotted-dialog (max-inline-size: 30rem) {
934
- [data-ui='command-palette'][data-presentation='dialog'] {
950
+ [data-ui-command-palette][data-presentation='dialog'] {
935
951
  --_list-max: none;
936
952
 
937
953
  border-inline: 0;
@@ -948,9 +964,7 @@
948
964
  }
949
965
 
950
966
  /* No scrim to press: the word that closes stands at the end of the field. */
951
- [data-ui='command-palette'][data-presentation='dialog']
952
- > [data-part='header']
953
- > [data-part='close'] {
967
+ [data-ui-command-palette][data-presentation='dialog'] > [data-part-header] > [data-part-close] {
954
968
  display: inline-flex;
955
969
  }
956
970
  }
@@ -961,7 +975,7 @@
961
975
  * the reader can press; the list is scrolled and the rows are tapped.
962
976
  */
963
977
  @media (hover: none) and (pointer: coarse) {
964
- [data-ui='command-palette'] > [data-part='footer'] {
978
+ [data-ui-command-palette] > [data-part-footer] {
965
979
  display: none;
966
980
  }
967
981
  }
@@ -974,13 +988,13 @@
974
988
  * not decoration — would disappear.
975
989
  */
976
990
  @media (forced-colors: active) {
977
- [data-ui='command-palette'] [data-part='item'][data-current] {
991
+ [data-ui-command-palette] [data-part-item][data-current] {
978
992
  background-color: Highlight;
979
993
  color: HighlightText;
980
994
  forced-color-adjust: none;
981
995
  }
982
996
 
983
- [data-ui='command-palette'] [data-part='item'][data-disabled][data-current] {
997
+ [data-ui-command-palette] [data-part-item][data-disabled][data-current] {
984
998
  background-color: Highlight;
985
999
  color: GrayText;
986
1000
  }
@@ -992,8 +1006,7 @@
992
1006
  * the host's ink the system has already forced. The glyphs are `Glyph`
993
1007
  * elements drawn in `currentColor` and need nothing here.
994
1008
  */
995
- [data-ui='command-palette']
996
- > [data-part='header']:has(> [data-part='input']:focus-visible)::after {
1009
+ [data-ui-command-palette] > [data-part-header]:has(> [data-part-input]:focus-visible)::after {
997
1010
  forced-color-adjust: none;
998
1011
  }
999
1012
  }
@@ -2,6 +2,7 @@
2
2
  "--slotted-border-subtle",
3
3
  "--slotted-border-width-thin",
4
4
  "--slotted-command-palette-active",
5
+ "--slotted-command-palette-backdrop-filter",
5
6
  "--slotted-command-palette-border-color",
6
7
  "--slotted-command-palette-footer-surface",
7
8
  "--slotted-command-palette-highlight",