@slotted/styles 0.1.0-beta.7 → 0.1.0-beta.9

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 (128) 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 +35 -35
  6. package/src/app-shell/app-shell.css +280 -299
  7. package/src/aspect-ratio/aspect-ratio.css +9 -9
  8. package/src/attachment/attachment.css +91 -99
  9. package/src/avatar/avatar.css +41 -41
  10. package/src/avatar-group/avatar-group.css +21 -22
  11. package/src/badge/badge.css +37 -37
  12. package/src/breadcrumb/breadcrumb.css +37 -37
  13. package/src/button/button.css +88 -69
  14. package/src/button-group/button-group.css +69 -73
  15. package/src/calendar/calendar.css +93 -103
  16. package/src/card/card.css +54 -61
  17. package/src/carousel/carousel.css +150 -161
  18. package/src/cascader/cascader.css +147 -151
  19. package/src/chart/chart.css +225 -240
  20. package/src/checkbox/checkbox.css +119 -124
  21. package/src/checkbox-group/checkbox-group.css +7 -7
  22. package/src/code-block/code-block.css +81 -85
  23. package/src/collapsible/collapsible.css +69 -76
  24. package/src/color-picker/color-picker.css +83 -91
  25. package/src/column-manager/column-manager.css +106 -114
  26. package/src/combobox/combobox.css +99 -101
  27. package/src/command-palette/command-palette.css +84 -90
  28. package/src/container/container.css +24 -24
  29. package/src/context-menu/context-menu.css +8 -8
  30. package/src/currency-field/currency-field.css +99 -104
  31. package/src/dashboard-grid/dashboard-grid.css +104 -107
  32. package/src/data-grid/data-grid.css +458 -456
  33. package/src/data-grid/data-grid.tokens.json +2 -0
  34. package/src/data-list/data-list.css +67 -69
  35. package/src/date-field/date-field.css +50 -50
  36. package/src/date-picker/date-picker.css +40 -42
  37. package/src/date-range-picker/date-range-picker.css +114 -118
  38. package/src/datetime-field/datetime-field.css +73 -78
  39. package/src/datetime-picker/datetime-picker.css +61 -63
  40. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  41. package/src/description-list/description-list.css +61 -64
  42. package/src/detail-panel/detail-panel.css +70 -70
  43. package/src/dialog/dialog.css +312 -148
  44. package/src/divider/divider.css +18 -18
  45. package/src/drawer/drawer.css +186 -209
  46. package/src/entity-picker/entity-picker.css +220 -239
  47. package/src/event-calendar/event-calendar.css +343 -385
  48. package/src/field/field.css +74 -78
  49. package/src/field-group/field-group.css +22 -25
  50. package/src/filter-bar/filter-bar.css +193 -209
  51. package/src/form/form.css +21 -24
  52. package/src/fullscreen/fullscreen.css +24 -25
  53. package/src/grid/grid.css +28 -28
  54. package/src/highlight/highlight.css +6 -6
  55. package/src/hover-card/hover-card.css +6 -6
  56. package/src/icon/icon.css +15 -15
  57. package/src/image/image.css +39 -39
  58. package/src/import-export-center/import-export-center.css +135 -156
  59. package/src/inline/inline.css +27 -27
  60. package/src/inline-message/inline-message.css +28 -28
  61. package/src/kbd/kbd.css +26 -26
  62. package/src/link/link.css +15 -15
  63. package/src/list/list.css +20 -20
  64. package/src/list-item/list-item.css +66 -66
  65. package/src/listbox/listbox.css +56 -59
  66. package/src/loading-overlay/loading-overlay.css +75 -92
  67. package/src/markdown/markdown.css +17 -17
  68. package/src/menu/menu.css +63 -65
  69. package/src/menubar/menubar.css +13 -13
  70. package/src/message/message.css +174 -202
  71. package/src/message-scroller/message-scroller.css +41 -42
  72. package/src/multi-select/multi-select.css +131 -137
  73. package/src/navigation-menu/navigation-menu.css +167 -188
  74. package/src/notification-center/notification-center.css +134 -148
  75. package/src/number-field/number-field.css +76 -81
  76. package/src/otp-input/otp-input.css +48 -48
  77. package/src/page/page.css +23 -23
  78. package/src/page-header/page-header.css +219 -280
  79. package/src/pagination/pagination.css +68 -72
  80. package/src/popover/popover.css +40 -49
  81. package/src/progress-indicator/progress-indicator.css +85 -90
  82. package/src/prompt-composer/prompt-composer.css +94 -99
  83. package/src/prose/prose.css +71 -75
  84. package/src/radio-group/radio-group.css +98 -103
  85. package/src/rating/rating.css +132 -132
  86. package/src/result-state/result-state.css +74 -77
  87. package/src/saved-views/saved-views.css +41 -47
  88. package/src/scroll-area/scroll-area.css +32 -35
  89. package/src/section/section.css +16 -16
  90. package/src/segmented-control/segmented-control.css +77 -79
  91. package/src/select/select.css +113 -115
  92. package/src/side-navigation/side-navigation.css +170 -180
  93. package/src/skeleton/skeleton.css +47 -48
  94. package/src/slider/slider.css +86 -88
  95. package/src/sparkline/sparkline.css +32 -32
  96. package/src/spinner/spinner.css +4 -4
  97. package/src/split-button/split-button.css +26 -31
  98. package/src/splitter/splitter.css +35 -35
  99. package/src/stack/stack.css +24 -24
  100. package/src/stat-card/stat-card.css +102 -103
  101. package/src/status-indicator/status-indicator.css +28 -28
  102. package/src/stepper/stepper.css +58 -62
  103. package/src/switch/switch.css +86 -92
  104. package/src/table/table.css +189 -198
  105. package/src/table-of-contents/table-of-contents.css +51 -54
  106. package/src/tabs/tabs.css +157 -172
  107. package/src/tag/tag.css +67 -71
  108. package/src/tags-input/tags-input.css +124 -74
  109. package/src/tags-input/tags-input.tokens.json +6 -1
  110. package/src/text-field/text-field.css +108 -126
  111. package/src/textarea/textarea.css +26 -26
  112. package/src/time-field/time-field.css +67 -67
  113. package/src/time-picker/time-picker.css +56 -58
  114. package/src/time-range-picker/time-range-picker.css +126 -133
  115. package/src/timeline/timeline.css +244 -266
  116. package/src/toast/toast.css +81 -90
  117. package/src/toggle/toggle.css +29 -33
  118. package/src/toggle-group/toggle-group.css +67 -71
  119. package/src/toolbar/toolbar.css +30 -35
  120. package/src/tooltip/tooltip.css +26 -26
  121. package/src/top-navigation/top-navigation.css +243 -259
  122. package/src/tour/tour.css +51 -60
  123. package/src/transfer/transfer.css +160 -164
  124. package/src/tree/tree.css +103 -111
  125. package/src/typography/typography.css +36 -36
  126. package/src/upload/upload.css +224 -224
  127. package/src/visually-hidden/visually-hidden.css +1 -1
  128. package/src/wizard/wizard.css +185 -197
@@ -15,7 +15,7 @@
15
15
  * gap — so a theme that retunes a text field retunes this bar with it, and
16
16
  * the three densities move every control together.
17
17
  */
18
- [data-ui='filter-bar'] {
18
+ [data-ui-filter-bar] {
19
19
  --_gap: var(--slotted-filter-bar-gap, var(--slotted-control-gap-md, 8px));
20
20
  --_gap-sm: var(--slotted-control-gap-sm, 6px);
21
21
  --_height: var(--slotted-control-height-md, 34px);
@@ -68,7 +68,7 @@
68
68
  * start-justified grid or flex parent measured the root at zero pixels and
69
69
  * drew every pill and chip outside it.
70
70
  */
71
- [data-ui='filter-bar'][data-part='root'] {
71
+ [data-ui-filter-bar][data-part-root] {
72
72
  container-name: slotted-filter-bar;
73
73
  container-type: inline-size;
74
74
  display: block;
@@ -83,7 +83,7 @@
83
83
  * and a select shrink-wrapped to its value is a control that changes width
84
84
  * when the value does.
85
85
  */
86
- [data-ui='filter-bar'][data-part='rule'] {
86
+ [data-ui-filter-bar][data-part-rule] {
87
87
  display: grid;
88
88
  gap: var(--_gap);
89
89
  inline-size: var(--slotted-filter-bar-editor-size, 18rem);
@@ -96,17 +96,17 @@
96
96
  * own at `display: contents`, which leaves the two parts as grid items of
97
97
  * the rule and out of reach of a child combinator.
98
98
  */
99
- [data-ui='filter-bar'][data-part='rule'] [data-part='operand'] {
99
+ [data-ui-filter-bar][data-part-rule] [data-part-operand] {
100
100
  display: grid;
101
101
  gap: var(--_gap-sm);
102
102
  min-inline-size: 0;
103
103
  }
104
104
 
105
- [data-ui='filter-bar'][data-part='rule'][data-kind='boolean'] [data-part='operand']:empty {
105
+ [data-ui-filter-bar][data-part-rule][data-kind='boolean'] [data-part-operand]:empty {
106
106
  display: none;
107
107
  }
108
108
 
109
- [data-ui='filter-bar'][data-part='rule'] > [data-part='actions'] {
109
+ [data-ui-filter-bar][data-part-rule] > [data-part-actions] {
110
110
  align-items: center;
111
111
  display: flex;
112
112
  gap: var(--_gap-sm);
@@ -131,7 +131,7 @@
131
131
  * Every member of the first line starts at its top and is a control tall,
132
132
  * so the count centres its text against the search whatever wraps.
133
133
  */
134
- [data-ui='filter-bar'] > [data-part='frame'] {
134
+ [data-ui-filter-bar] > [data-part-frame] {
135
135
  align-items: start;
136
136
  column-gap: var(--_gap);
137
137
  display: grid;
@@ -142,31 +142,31 @@
142
142
  row-gap: var(--_gap);
143
143
  }
144
144
 
145
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='search'] {
145
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-search] {
146
146
  grid-area: search;
147
147
  max-inline-size: var(--slotted-filter-bar-search-max, 28rem);
148
148
  min-inline-size: 0;
149
149
  }
150
150
 
151
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='bar'] {
151
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-bar] {
152
152
  grid-area: bar;
153
153
  }
154
154
 
155
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='end'] {
155
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-end] {
156
156
  grid-area: end;
157
157
  }
158
158
 
159
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='count'] {
159
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-count] {
160
160
  grid-area: count;
161
161
  justify-self: end;
162
162
  }
163
163
 
164
164
  /** A member that is absent collapses: the grid's gap is what would remain, and it is taken away. */
165
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='end']:empty {
165
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-end]:empty {
166
166
  display: none;
167
167
  }
168
168
 
169
- [data-ui='filter-bar'][data-size='sm'] {
169
+ [data-ui-filter-bar][data-size='sm'] {
170
170
  --_height: var(--slotted-control-height-sm, 30px);
171
171
  --_font-size: var(--slotted-control-font-size-sm, 12px);
172
172
  --_pad: var(--slotted-control-padding-inline-sm, 10px);
@@ -176,7 +176,7 @@
176
176
  --_gap-sm: var(--slotted-control-gap-sm, 4px);
177
177
  }
178
178
 
179
- [data-ui='filter-bar'][data-size='lg'] {
179
+ [data-ui-filter-bar][data-size='lg'] {
180
180
  --_height: var(--slotted-control-height-lg, 38px);
181
181
  --_font-size: var(--slotted-control-font-size-lg, 14px);
182
182
  --_pad: var(--slotted-control-padding-inline-lg, 16px);
@@ -192,9 +192,9 @@
192
192
  * the query is an `icon` in the field's start adornment, which the field
193
193
  * sizes as it sizes every adornment.
194
194
  */
195
- [data-ui='filter-bar'] [data-part='search'] > [data-ui='text-field'],
196
- [data-ui='filter-bar'] [data-part='preset'] > [data-ui='select'],
197
- [data-ui='filter-bar'] :is([data-part='field'], [data-part='operator']) > [data-ui='select'] {
195
+ [data-ui-filter-bar] [data-part-search] > [data-ui-text-field],
196
+ [data-ui-filter-bar] [data-part-preset] > [data-ui-select],
197
+ [data-ui-filter-bar] :is([data-part-field], [data-part-operator]) > [data-ui-select] {
198
198
  inline-size: 100%;
199
199
  }
200
200
 
@@ -203,7 +203,7 @@
203
203
  * to line, which the toolbar pattern allows for a toolbar of several rows.
204
204
  * The row gap is the column gap, so two lines of chips read as one set.
205
205
  */
206
- [data-ui='filter-bar'] [data-part='bar'] {
206
+ [data-ui-filter-bar] [data-part-bar] {
207
207
  align-items: center;
208
208
  display: flex;
209
209
  flex-wrap: wrap;
@@ -211,14 +211,14 @@
211
211
  min-inline-size: 0;
212
212
  }
213
213
 
214
- [data-ui='filter-bar'] [data-part='end'] {
214
+ [data-ui-filter-bar] [data-part-end] {
215
215
  align-items: center;
216
216
  display: flex;
217
217
  gap: var(--_gap);
218
218
  }
219
219
 
220
220
  /** The count is the answer to the filters, and it takes the far end of its line — PatternFly's rule for an item count. */
221
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='count'] {
221
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-count] {
222
222
  color: var(--_muted);
223
223
  font-variant-numeric: tabular-nums;
224
224
  margin: 0;
@@ -240,7 +240,7 @@
240
240
  * that holds something. The plus before the name says what pressing it
241
241
  * does. Given a condition, the same place in the bar becomes a chip.
242
242
  */
243
- [data-ui='filter-bar'] [data-part='pill'] {
243
+ [data-ui-filter-bar] [data-part-pill] {
244
244
  align-items: center;
245
245
  appearance: none;
246
246
  background-color: transparent;
@@ -268,36 +268,36 @@
268
268
  white-space: nowrap;
269
269
  }
270
270
 
271
- [data-ui='filter-bar'] [data-part='pill'] > span:not([data-ui='icon']) {
271
+ [data-ui-filter-bar] [data-part-pill] > span:not([data-ui-icon]) {
272
272
  min-inline-size: 0;
273
273
  overflow: hidden;
274
274
  text-overflow: ellipsis;
275
275
  unicode-bidi: isolate;
276
276
  }
277
277
 
278
- [data-ui='filter-bar'] [data-part='pill'] > [data-ui='icon'] {
278
+ [data-ui-filter-bar] [data-part-pill] > [data-ui-icon] {
279
279
  --slotted-icon-size: var(--_icon);
280
280
  }
281
281
 
282
- [data-ui='filter-bar'] [data-part='pill'][data-invalid] {
282
+ [data-ui-filter-bar] [data-part-pill][data-invalid] {
283
283
  border-color: var(--_invalid);
284
284
  box-shadow: var(--_invalid-edge);
285
285
  }
286
286
 
287
- [data-ui='filter-bar'] [data-part='pill']:enabled:hover {
287
+ [data-ui-filter-bar] [data-part-pill]:enabled:hover {
288
288
  background-color: var(--_hover);
289
289
  border-color: var(--slotted-border-strong, ButtonBorder);
290
290
  color: var(--_ink);
291
291
  }
292
292
 
293
- [data-ui='filter-bar'] [data-part='pill']:enabled:active,
294
- [data-ui='filter-bar'] [data-part='pill']:enabled[aria-expanded='true'] {
293
+ [data-ui-filter-bar] [data-part-pill]:enabled:active,
294
+ [data-ui-filter-bar] [data-part-pill]:enabled[aria-expanded='true'] {
295
295
  background-color: var(--_active);
296
296
  border-color: var(--slotted-border-strong, ButtonBorder);
297
297
  color: var(--_ink);
298
298
  }
299
299
 
300
- [data-ui='filter-bar'] [data-part='pill']:focus-visible {
300
+ [data-ui-filter-bar] [data-part-pill]:focus-visible {
301
301
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
302
302
  outline-offset: var(--slotted-focus-ring-offset, 2px);
303
303
  }
@@ -319,7 +319,7 @@
319
319
  * so a hover ground and a focus ring follow its curve rather than being
320
320
  * clipped by it.
321
321
  */
322
- [data-ui='filter-bar'] [data-part='chip'] {
322
+ [data-ui-filter-bar] [data-part-chip] {
323
323
  align-items: stretch;
324
324
  background-color: var(--_surface);
325
325
  block-size: var(--_height);
@@ -347,13 +347,13 @@
347
347
  * held for an exit would be a stop of the arrows that no longer exists.
348
348
  */
349
349
  @starting-style {
350
- [data-ui='filter-bar'] :is([data-part='chip'], [data-part='pill']) {
350
+ [data-ui-filter-bar] :is([data-part-chip], [data-part-pill]) {
351
351
  opacity: 0;
352
352
  translate: 0 calc(-1 * var(--slotted-space-2, 0.25rem));
353
353
  }
354
354
  }
355
355
 
356
- [data-ui='filter-bar'] [data-part='chip'] > * {
356
+ [data-ui-filter-bar] [data-part-chip] > * {
357
357
  align-items: center;
358
358
  background-color: transparent;
359
359
  border: 0;
@@ -371,52 +371,52 @@
371
371
  white-space: nowrap;
372
372
  }
373
373
 
374
- [data-ui='filter-bar'] [data-part='chip'] > * + * {
374
+ [data-ui-filter-bar] [data-part-chip] > * + * {
375
375
  border-inline-start: var(--_border-width) solid var(--_seam);
376
376
  }
377
377
 
378
- [data-ui='filter-bar'] [data-part='chip'] > :first-child {
378
+ [data-ui-filter-bar] [data-part-chip] > :first-child {
379
379
  border-end-start-radius: var(--_radius);
380
380
  border-start-start-radius: var(--_radius);
381
381
  /* The capsule's curve takes air from the first letter, so the start inset is the control's, not the segment's. */
382
382
  padding-inline-start: var(--_pad);
383
383
  }
384
384
 
385
- [data-ui='filter-bar'] [data-part='chip'] > :last-child {
385
+ [data-ui-filter-bar] [data-part-chip] > :last-child {
386
386
  border-end-end-radius: var(--_radius);
387
387
  border-start-end-radius: var(--_radius);
388
388
  }
389
389
 
390
- [data-ui='filter-bar'] [data-part='chip'] [data-ui='icon'] {
390
+ [data-ui-filter-bar] [data-part-chip] [data-ui-icon] {
391
391
  --slotted-icon-size: var(--_icon);
392
392
  }
393
393
 
394
- [data-ui='filter-bar'] [data-part='chip-field'] {
394
+ [data-ui-filter-bar] [data-part-chip-field] {
395
395
  font-weight: var(--slotted-font-weight-medium, 500);
396
396
  }
397
397
 
398
- [data-ui='filter-bar'] [data-part='chip-field'] > [data-ui='icon'] {
398
+ [data-ui-filter-bar] [data-part-chip-field] > [data-ui-icon] {
399
399
  color: var(--_muted);
400
400
  }
401
401
 
402
402
  /** The field's name, the operator and the value are isolated runs, so a right-to-left name beside an ISO date reorders nothing. */
403
- [data-ui='filter-bar'] [data-part='chip'] > * > span:not([data-ui]),
404
- [data-ui='filter-bar'] [data-part='chip-operator'] {
403
+ [data-ui-filter-bar] [data-part-chip] > * > span:not([data-ui]),
404
+ [data-ui-filter-bar] [data-part-chip-operator] {
405
405
  unicode-bidi: isolate;
406
406
  }
407
407
 
408
- [data-ui='filter-bar'] [data-part='chip-operator'] {
408
+ [data-ui-filter-bar] [data-part-chip-operator] {
409
409
  color: var(--_muted);
410
410
  font-weight: var(--slotted-font-weight-regular, 400);
411
411
  }
412
412
 
413
- [data-ui='filter-bar'] [data-part='chip-value'] {
413
+ [data-ui-filter-bar] [data-part-chip-value] {
414
414
  font-weight: var(--slotted-font-weight-medium, 500);
415
415
  min-inline-size: 0;
416
416
  }
417
417
 
418
418
  /* The value truncates and the whole list stays in the segment's name and title. */
419
- [data-ui='filter-bar'] [data-part='chip-value'] > [data-value] {
419
+ [data-ui-filter-bar] [data-part-chip-value] > [data-value] {
420
420
  max-inline-size: var(--slotted-filter-bar-value-max, 12rem);
421
421
  min-inline-size: 0;
422
422
  overflow: hidden;
@@ -427,21 +427,21 @@
427
427
  * The operator's words inside the value segment are drawn only where the
428
428
  * operator segment is not — under the narrow breakpoint, below.
429
429
  */
430
- [data-ui='filter-bar'] [data-part='chip-value'] > [data-operator] {
430
+ [data-ui-filter-bar] [data-part-chip-value] > [data-operator] {
431
431
  color: var(--_muted);
432
432
  display: none;
433
433
  font-weight: var(--slotted-font-weight-regular, 400);
434
434
  }
435
435
 
436
436
  /** The remove control is square in the capsule's height, and its glyph reads quiet until it is aimed at. */
437
- [data-ui='filter-bar'] [data-part='chip-remove'] {
437
+ [data-ui-filter-bar] [data-part-chip-remove] {
438
438
  aspect-ratio: 1;
439
439
  color: var(--_muted);
440
440
  justify-content: center;
441
441
  padding-inline: 0;
442
442
  }
443
443
 
444
- [data-ui='filter-bar'] [data-part='chip'] > :is(button, [role='button']) {
444
+ [data-ui-filter-bar] [data-part-chip] > :is(button, [role='button']) {
445
445
  cursor: pointer;
446
446
  transition:
447
447
  background-color var(--_duration) var(--_easing),
@@ -453,17 +453,17 @@
453
453
  * open segment holds the press ground while its surface is up, so the
454
454
  * reader sees which segment the menu or the popover belongs to.
455
455
  */
456
- [data-ui='filter-bar']
457
- [data-part='chip']
456
+ [data-ui-filter-bar]
457
+ [data-part-chip]
458
458
  > :is(button, [role='button']):enabled:not([aria-disabled='true']):hover {
459
459
  background-color: var(--_hover);
460
460
  color: var(--_ink);
461
461
  }
462
462
 
463
- [data-ui='filter-bar']
464
- [data-part='chip']
463
+ [data-ui-filter-bar]
464
+ [data-part-chip]
465
465
  > :is(button, [role='button']):enabled:not([aria-disabled='true']):active,
466
- [data-ui='filter-bar'] [data-part='chip'] > :is(button, [role='button'])[aria-expanded='true'] {
466
+ [data-ui-filter-bar] [data-part-chip] > :is(button, [role='button'])[aria-expanded='true'] {
467
467
  background-color: var(--_active);
468
468
  color: var(--_ink);
469
469
  }
@@ -473,7 +473,7 @@
473
473
  * neighbouring segments, and inward it stays inside the capsule and follows
474
474
  * its curve on the end segments — the rule every inner control follows.
475
475
  */
476
- [data-ui='filter-bar'] [data-part='chip'] > :focus-visible {
476
+ [data-ui-filter-bar] [data-part-chip] > :focus-visible {
477
477
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
478
478
  outline-offset: calc(var(--slotted-focus-ring-width, 2px) * -1);
479
479
  }
@@ -483,43 +483,40 @@
483
483
  * says the same thing, and the value segment writes the prompt in the
484
484
  * muted ink. The condition is not applied until the value is there.
485
485
  */
486
- [data-ui='filter-bar'] [data-part='chip'][data-incomplete] {
486
+ [data-ui-filter-bar] [data-part-chip][data-incomplete] {
487
487
  border-style: dashed;
488
488
  box-shadow: none;
489
489
  }
490
490
 
491
- [data-ui='filter-bar'] [data-part='chip'][data-incomplete] > [data-part='chip-value'] {
491
+ [data-ui-filter-bar] [data-part-chip][data-incomplete] > [data-part-chip-value] {
492
492
  color: var(--_muted);
493
493
  font-weight: var(--slotted-font-weight-regular, 400);
494
494
  }
495
495
 
496
- [data-ui='filter-bar'] [data-part='chip'][data-invalid] {
496
+ [data-ui-filter-bar] [data-part-chip][data-invalid] {
497
497
  border-color: var(--_invalid);
498
498
  box-shadow: var(--_invalid-edge);
499
499
  }
500
500
 
501
501
  /** The field's glyph and name turn to the danger ink with the edge, so the fault is read on the segment it is about. */
502
- [data-ui='filter-bar'] [data-part='chip'][data-invalid] > [data-part='chip-field'],
503
- [data-ui='filter-bar']
504
- [data-part='chip'][data-invalid]
505
- > [data-part='chip-field']
506
- > [data-ui='icon'] {
502
+ [data-ui-filter-bar] [data-part-chip][data-invalid] > [data-part-chip-field],
503
+ [data-ui-filter-bar] [data-part-chip][data-invalid] > [data-part-chip-field] > [data-ui-icon] {
507
504
  color: var(--slotted-tone-danger-text, CanvasText);
508
505
  }
509
506
 
510
- [data-ui='filter-bar'] [data-part='chip'][data-folded] {
507
+ [data-ui-filter-bar] [data-part-chip][data-folded] {
511
508
  display: none;
512
509
  visibility: hidden;
513
510
  }
514
511
 
515
- [data-ui='filter-bar'] [data-part='bar'][data-revealed] [data-part='chip'][data-folded] {
512
+ [data-ui-filter-bar] [data-part-bar][data-revealed] [data-part-chip][data-folded] {
516
513
  display: inline-flex;
517
514
  visibility: visible;
518
515
  }
519
516
 
520
517
  /* ── More ───────────────────────────────────────────────────────────── */
521
518
 
522
- [data-ui='filter-bar'] [data-part='more'] {
519
+ [data-ui-filter-bar] [data-part-more] {
523
520
  align-items: center;
524
521
  appearance: none;
525
522
  background: none;
@@ -540,17 +537,17 @@
540
537
  white-space: nowrap;
541
538
  }
542
539
 
543
- [data-ui='filter-bar'] [data-part='more']:enabled:hover {
540
+ [data-ui-filter-bar] [data-part-more]:enabled:hover {
544
541
  background-color: var(--_hover);
545
542
  color: var(--_ink);
546
543
  }
547
544
 
548
- [data-ui='filter-bar'] [data-part='more']:enabled:active {
545
+ [data-ui-filter-bar] [data-part-more]:enabled:active {
549
546
  background-color: var(--_active);
550
547
  color: var(--_ink);
551
548
  }
552
549
 
553
- [data-ui='filter-bar'] [data-part='more']:focus-visible {
550
+ [data-ui-filter-bar] [data-part-more]:focus-visible {
554
551
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
555
552
  outline-offset: var(--slotted-focus-ring-offset, 2px);
556
553
  }
@@ -564,18 +561,18 @@
564
561
  * conditions are what the bar is about, and a control that empties them is
565
562
  * not the loudest word on the line. Apply keeps the weight of a commit.
566
563
  */
567
- [data-ui='filter-bar'] [data-part='bar'] :is([data-part='clear'], [data-part='reset']) {
564
+ [data-ui-filter-bar] [data-part-bar] :is([data-part-clear], [data-part-reset]) {
568
565
  --slotted-control-font-weight: var(--slotted-font-weight-medium, 500);
569
566
  }
570
567
 
571
568
  /* ── The summary, drawn only when the bar is narrow ─────────────────── */
572
569
 
573
- [data-ui='filter-bar'] [data-part='summary'] {
570
+ [data-ui-filter-bar] [data-part-summary] {
574
571
  display: none;
575
572
  visibility: hidden;
576
573
  }
577
574
 
578
- [data-ui='filter-bar'] [data-part='summary'] > [data-part='label'] > span {
575
+ [data-ui-filter-bar] [data-part-summary] > [data-part-label] > span {
579
576
  /* The count in the summary is a figure, and figures line up. */
580
577
  font-variant-numeric: tabular-nums;
581
578
  }
@@ -588,7 +585,7 @@
588
585
  * and Clear there would make the control that empties the filter the
589
586
  * neighbour of the one that commits it.
590
587
  */
591
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='bar'] > [data-part='actions'] {
588
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-bar] > [data-part-actions] {
592
589
  align-items: center;
593
590
  display: flex;
594
591
  gap: var(--_gap-sm);
@@ -597,7 +594,7 @@
597
594
 
598
595
  /* ── States of the whole bar ────────────────────────────────────────── */
599
596
 
600
- [data-ui='filter-bar'][data-disabled] {
597
+ [data-ui-filter-bar][data-disabled] {
601
598
  --_ink: var(--slotted-disabled-foreground, GrayText);
602
599
  --_muted: var(--slotted-disabled-foreground, GrayText);
603
600
  --_edge: var(--slotted-disabled-border, GrayText);
@@ -605,11 +602,11 @@
605
602
  --_surface: var(--slotted-disabled-background, Canvas);
606
603
  }
607
604
 
608
- [data-ui='filter-bar'][data-disabled] :is([data-part='pill'], [data-part='chip']) {
605
+ [data-ui-filter-bar][data-disabled] :is([data-part-pill], [data-part-chip]) {
609
606
  box-shadow: none;
610
607
  }
611
608
 
612
- [data-ui='filter-bar'][data-disabled] :is([data-part='pill'], [data-part='chip'] > *) {
609
+ [data-ui-filter-bar][data-disabled] :is([data-part-pill], [data-part-chip] > *) {
613
610
  cursor: not-allowed;
614
611
  }
615
612
 
@@ -618,12 +615,12 @@
618
615
  * invites a press — the segments keep their stop and lose the pointer, and
619
616
  * the binding draws no remove, add or clear control.
620
617
  */
621
- [data-ui='filter-bar'][data-readonly] [data-part='chip'] > * {
618
+ [data-ui-filter-bar][data-readonly] [data-part-chip] > * {
622
619
  cursor: default;
623
620
  }
624
621
 
625
622
  /** A loading bar keeps its width and its controls, and says so in the count's place. */
626
- [data-ui='filter-bar'][data-loading] > [data-part='frame'] > [data-part='count'] {
623
+ [data-ui-filter-bar][data-loading] > [data-part-frame] > [data-part-count] {
627
624
  align-items: center;
628
625
  display: inline-flex;
629
626
  gap: var(--_gap-sm);
@@ -639,7 +636,7 @@
639
636
  * and writes the value it read back on the root itself, so the bar keeps
640
637
  * sticking where it did while everything after it stops under the bar.
641
638
  */
642
- [data-ui='filter-bar'][data-sticky] {
639
+ [data-ui-filter-bar][data-sticky] {
643
640
  background-color: var(--_surface);
644
641
  inset-block-start: var(--slotted-page-sticky-top, 0px);
645
642
  padding-block: var(--slotted-space-3, 0.375rem);
@@ -657,7 +654,7 @@
657
654
  * header and its own remove. A rule is one row: field, operator, operand,
658
655
  * remove; it stacks when the drawer is narrow, and the leading word stays.
659
656
  */
660
- [data-ui='filter-bar'][data-part='builder'] {
657
+ [data-ui-filter-bar][data-part-builder] {
661
658
  --_join-col: var(--slotted-filter-bar-join-size, 3.5rem);
662
659
  --_group-surface: var(
663
660
  --slotted-filter-bar-group-surface,
@@ -679,7 +676,7 @@
679
676
  * builder's, because the card form below is the builder's decision and
680
677
  * every group in one builder takes the same form.
681
678
  */
682
- [data-ui='filter-bar'][data-part='builder'] [data-part='group'] {
679
+ [data-ui-filter-bar][data-part-builder] [data-part-group] {
683
680
  border: 0;
684
681
  container-name: slotted-filter-bar-group;
685
682
  container-type: inline-size;
@@ -690,7 +687,7 @@
690
687
  padding: 0;
691
688
  }
692
689
 
693
- [data-ui='filter-bar'][data-part='builder'] [data-part='group']:not([data-depth='0']) {
690
+ [data-ui-filter-bar][data-part-builder] [data-part-group]:not([data-depth='0']) {
694
691
  background-color: var(--_group-surface);
695
692
  border: var(--slotted-border-width-thin, 1px) solid var(--_group-edge);
696
693
  border-radius: var(--slotted-radius-md, 6px);
@@ -698,12 +695,12 @@
698
695
  }
699
696
 
700
697
  /* A box inside a box alternates its ground, so the third level reads as a level and not as a border. */
701
- [data-ui='filter-bar'][data-part='builder']
702
- [data-part='group']:is([data-depth='2'], [data-depth='4'], [data-depth='6']) {
698
+ [data-ui-filter-bar][data-part-builder]
699
+ [data-part-group]:is([data-depth='2'], [data-depth='4'], [data-depth='6']) {
703
700
  background-color: var(--_surface);
704
701
  }
705
702
 
706
- [data-ui='filter-bar'][data-part='builder'] [data-part='group'] > legend {
703
+ [data-ui-filter-bar][data-part-builder] [data-part-group] > legend {
707
704
  /* The legend names the group to a reader and draws nothing. */
708
705
  block-size: 1px;
709
706
  clip-path: inset(50%);
@@ -714,7 +711,7 @@
714
711
  }
715
712
 
716
713
  /** The header: the words, the All | Any control between them, and, in a nested group, its remove at the end. */
717
- [data-ui='filter-bar'][data-part='builder'] [data-part='join'] {
714
+ [data-ui-filter-bar][data-part-builder] [data-part-join] {
718
715
  align-items: center;
719
716
  color: var(--_ink);
720
717
  display: flex;
@@ -723,7 +720,7 @@
723
720
  gap: var(--_gap-sm);
724
721
  }
725
722
 
726
- [data-ui='filter-bar'][data-part='builder'] [data-part='join'] > [data-part='remove-group'] {
723
+ [data-ui-filter-bar][data-part-builder] [data-part-join] > [data-part-remove-group] {
727
724
  margin-inline-start: auto;
728
725
  }
729
726
 
@@ -731,7 +728,7 @@
731
728
  * The rows: a two-column grid, the joining word then the rule or the group,
732
729
  * so every field lines up under the first whatever word stands before it.
733
730
  */
734
- [data-ui='filter-bar'][data-part='builder'] [data-part='rules'] {
731
+ [data-ui-filter-bar][data-part-builder] [data-part-rules] {
735
732
  align-items: start;
736
733
  column-gap: var(--_gap-sm);
737
734
  display: grid;
@@ -740,7 +737,7 @@
740
737
  row-gap: var(--_gap);
741
738
  }
742
739
 
743
- [data-ui='filter-bar'][data-part='builder'] [data-part='conjunction'] {
740
+ [data-ui-filter-bar][data-part-builder] [data-part-conjunction] {
744
741
  color: var(--_muted);
745
742
  /* Centred on the first control of its row, whatever the row stacks to. */
746
743
  line-height: var(--_height);
@@ -750,7 +747,7 @@
750
747
  white-space: nowrap;
751
748
  }
752
749
 
753
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'] {
750
+ [data-ui-filter-bar][data-part-builder] [data-part-rule] {
754
751
  align-items: center;
755
752
  display: grid;
756
753
  gap: var(--_gap-sm);
@@ -764,38 +761,34 @@
764
761
  min-inline-size: 0;
765
762
  }
766
763
 
767
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'] > *,
768
- [data-ui='filter-bar'][data-part='builder']
769
- [data-part='rule']
770
- :is([data-part='operator'], [data-part='operand']) {
764
+ [data-ui-filter-bar][data-part-builder] [data-part-rule] > *,
765
+ [data-ui-filter-bar][data-part-builder]
766
+ [data-part-rule]
767
+ :is([data-part-operator], [data-part-operand]) {
771
768
  min-inline-size: 0;
772
769
  }
773
770
 
774
- [data-ui='filter-bar'][data-part='builder']
775
- [data-part='rule'][data-operands='0']
776
- [data-part='operand'] {
771
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-operands='0'] [data-part-operand] {
777
772
  display: none;
778
773
  }
779
774
 
780
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-operands='0'] {
775
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-operands='0'] {
781
776
  /* The operator takes the operand's tracks too, so the field keeps the width it has on every other row. */
782
777
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) var(--slotted-target-min, 24px);
783
778
  }
784
779
 
785
- [data-ui='filter-bar'][data-part='builder'] [data-part='operand'] {
780
+ [data-ui-filter-bar][data-part-builder] [data-part-operand] {
786
781
  display: grid;
787
782
  gap: var(--_gap-sm);
788
783
  min-inline-size: 0;
789
784
  }
790
785
 
791
- [data-ui='filter-bar'][data-part='builder']
792
- [data-part='rule'][data-operands='2']
793
- [data-part='operand'] {
786
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-operands='2'] [data-part-operand] {
794
787
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
795
788
  }
796
789
 
797
790
  /** The group's own controls, under its rows and aligned with them. */
798
- [data-ui='filter-bar'][data-part='builder'] [data-part='group'] > [data-part='actions'] {
791
+ [data-ui-filter-bar][data-part-builder] [data-part-group] > [data-part-actions] {
799
792
  align-items: center;
800
793
  display: flex;
801
794
  flex-wrap: wrap;
@@ -811,22 +804,17 @@
811
804
  * as view is a different act — it leaves the builder for the application's
812
805
  * dialog — so it stands apart at the far end, at the weight of the words.
813
806
  */
814
- [data-ui='filter-bar'][data-part='builder']
815
- [data-part='group']
816
- > [data-part='actions']
817
- > :is(
818
- [data-part='add-rule'],
819
- [data-part='add-group'],
820
- [data-part='clear'],
821
- [data-part='save-preset']
822
- ) {
807
+ [data-ui-filter-bar][data-part-builder]
808
+ [data-part-group]
809
+ > [data-part-actions]
810
+ > :is([data-part-add-rule], [data-part-add-group], [data-part-clear], [data-part-save-preset]) {
823
811
  --slotted-control-font-weight: var(--slotted-font-weight-medium, 500);
824
812
  }
825
813
 
826
- [data-ui='filter-bar'][data-part='builder']
827
- [data-part='group']
828
- > [data-part='actions']
829
- > [data-part='save-preset'] {
814
+ [data-ui-filter-bar][data-part-builder]
815
+ [data-part-group]
816
+ > [data-part-actions]
817
+ > [data-part-save-preset] {
830
818
  margin-inline-start: auto;
831
819
  }
832
820
 
@@ -835,23 +823,23 @@
835
823
  operator and the operand span both tracks, and a spanning item hands
836
824
  its size to the non-flexible track first — `auto` took the operand's
837
825
  whole width and left the field 34 pixels wide, a chevron with no name. */
838
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'],
839
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-operands='0'] {
826
+ [data-ui-filter-bar][data-part-builder] [data-part-rule],
827
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-operands='0'] {
840
828
  grid-template-columns: minmax(0, 1fr) var(--slotted-target-min, 24px);
841
829
  }
842
830
 
843
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'] > [data-part='field'] {
831
+ [data-ui-filter-bar][data-part-builder] [data-part-rule] > [data-part-field] {
844
832
  grid-column: 1;
845
833
  }
846
834
 
847
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'] > [data-part='remove'] {
835
+ [data-ui-filter-bar][data-part-builder] [data-part-rule] > [data-part-remove] {
848
836
  grid-column: 2;
849
837
  grid-row: 1;
850
838
  }
851
839
 
852
- [data-ui='filter-bar'][data-part='builder']
853
- [data-part='rule']
854
- :is([data-part='operator'], [data-part='operand']) {
840
+ [data-ui-filter-bar][data-part-builder]
841
+ [data-part-rule]
842
+ :is([data-part-operator], [data-part-operand]) {
855
843
  grid-column: 1 / -1;
856
844
  }
857
845
  }
@@ -860,7 +848,7 @@
860
848
  * The sentence of a rule is the card form's header, and a row that already
861
849
  * shows its three controls does not draw it.
862
850
  */
863
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] {
851
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] {
864
852
  display: none;
865
853
  visibility: hidden;
866
854
  }
@@ -877,32 +865,32 @@
877
865
  * the joining word stands on its own line between two cards.
878
866
  */
879
867
  @container slotted-filter-bar-builder (max-width: 30rem) {
880
- [data-ui='filter-bar'][data-part='builder'] {
868
+ [data-ui-filter-bar][data-part-builder] {
881
869
  gap: var(--_gap);
882
870
  }
883
871
 
884
- [data-ui='filter-bar'][data-part='builder'] [data-part='rules'] {
872
+ [data-ui-filter-bar][data-part-builder] [data-part-rules] {
885
873
  grid-template-columns: minmax(0, 1fr);
886
874
  row-gap: var(--_gap-sm);
887
875
  }
888
876
 
889
877
  /* The joining word, small and on a line of its own; "Where" says nothing a list of cards does not. */
890
- [data-ui='filter-bar'][data-part='builder'] [data-part='conjunction'] {
878
+ [data-ui-filter-bar][data-part-builder] [data-part-conjunction] {
891
879
  font-size: var(--slotted-font-size-xs, 12px);
892
880
  line-height: var(--slotted-line-height-xs, 1.5);
893
881
  padding-inline-start: var(--_seg-pad);
894
882
  text-align: start;
895
883
  }
896
884
 
897
- [data-ui='filter-bar'][data-part='builder']
898
- [data-part='rules']
899
- > [data-part='conjunction']:first-child {
885
+ [data-ui-filter-bar][data-part-builder]
886
+ [data-part-rules]
887
+ > [data-part-conjunction]:first-child {
900
888
  display: none;
901
889
  }
902
890
 
903
- [data-ui='filter-bar'][data-part='builder'] [data-part='group']:not([data-depth='0']),
904
- [data-ui='filter-bar'][data-part='builder']
905
- [data-part='group']:is([data-depth='2'], [data-depth='4'], [data-depth='6']) {
891
+ [data-ui-filter-bar][data-part-builder] [data-part-group]:not([data-depth='0']),
892
+ [data-ui-filter-bar][data-part-builder]
893
+ [data-part-group]:is([data-depth='2'], [data-depth='4'], [data-depth='6']) {
906
894
  background-color: transparent;
907
895
  border: 0;
908
896
  /* The rail carries the nesting alone here, so it takes the edge the cards have rather than the box's subtler one. */
@@ -912,8 +900,8 @@
912
900
  padding-inline: var(--slotted-space-4, 0.5rem) 0;
913
901
  }
914
902
 
915
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'],
916
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-operands='0'] {
903
+ [data-ui-filter-bar][data-part-builder] [data-part-rule],
904
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-operands='0'] {
917
905
  background-color: var(--_surface);
918
906
  border: var(--_border-width) solid var(--_edge);
919
907
  border-radius: var(--slotted-radius-md, 6px);
@@ -925,26 +913,26 @@
925
913
  transition: border-color var(--_duration) var(--_easing);
926
914
  }
927
915
 
928
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-expanded] {
916
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-expanded] {
929
917
  border-color: var(--slotted-border-strong, ButtonBorder);
930
918
  padding-block-end: var(--_seg-pad);
931
919
  }
932
920
 
933
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-invalid] {
921
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-invalid] {
934
922
  border-color: var(--_invalid);
935
923
  box-shadow: var(--_invalid-edge);
936
924
  }
937
925
 
938
926
  /* Forced colours remove the shadow; the edge comes back as an outline. */
939
927
  @media (forced-colors: active) {
940
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'][data-invalid] {
928
+ [data-ui-filter-bar][data-part-builder] [data-part-rule][data-invalid] {
941
929
  outline: var(--_invalid-edge-width) solid CanvasText;
942
930
  outline-offset: calc(-1 * (var(--_border-width) + var(--_invalid-edge-width)));
943
931
  }
944
932
  }
945
933
 
946
934
  /* The sentence: the field at the weight of a name, the operator quiet, the value back at weight. It wraps rather than truncates — on a phone the sentence is what is read. */
947
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] {
935
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] {
948
936
  /* The chevron stands in the middle of the card's header, whether the sentence takes one line or two. */
949
937
  align-items: center;
950
938
  appearance: none;
@@ -968,26 +956,26 @@
968
956
  }
969
957
 
970
958
  /* The words wrap inside their own run, so the chevron keeps the end of the first line however long the value is. */
971
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] > [data-sentence] {
959
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] > [data-sentence] {
972
960
  flex: 1 1 auto;
973
961
  min-inline-size: 0;
974
962
  }
975
963
 
976
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] [data-field] {
964
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] [data-field] {
977
965
  font-weight: var(--slotted-font-weight-medium, 500);
978
966
  }
979
967
 
980
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] [data-operator] {
968
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] [data-operator] {
981
969
  color: var(--_muted);
982
970
  }
983
971
 
984
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] [data-value] {
972
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] [data-value] {
985
973
  font-weight: var(--slotted-font-weight-medium, 500);
986
974
  min-inline-size: 0;
987
975
  overflow-wrap: anywhere;
988
976
  }
989
977
 
990
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary'] > [data-ui='icon'] {
978
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary] > [data-ui-icon] {
991
979
  --slotted-icon-size: var(--_icon);
992
980
 
993
981
  color: var(--_muted);
@@ -996,21 +984,21 @@
996
984
  transition: rotate var(--_duration) var(--_easing);
997
985
  }
998
986
 
999
- [data-ui='filter-bar'][data-part='builder']
1000
- [data-part='rule-summary'][aria-expanded='true']
1001
- > [data-ui='icon'] {
987
+ [data-ui-filter-bar][data-part-builder]
988
+ [data-part-rule-summary][aria-expanded='true']
989
+ > [data-ui-icon] {
1002
990
  rotate: 180deg;
1003
991
  }
1004
992
 
1005
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary']:enabled:hover {
993
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary]:enabled:hover {
1006
994
  background-color: var(--_hover);
1007
995
  }
1008
996
 
1009
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary']:enabled:active {
997
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary]:enabled:active {
1010
998
  background-color: var(--_active);
1011
999
  }
1012
1000
 
1013
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule-summary']:focus-visible {
1001
+ [data-ui-filter-bar][data-part-builder] [data-part-rule-summary]:focus-visible {
1014
1002
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1015
1003
  outline-offset: calc(var(--slotted-focus-ring-width, 2px) * -1);
1016
1004
  }
@@ -1021,7 +1009,7 @@
1021
1009
  * with the summary is centred on it, and an expanded card's controls
1022
1010
  * below do not pull it down.
1023
1011
  */
1024
- [data-ui='filter-bar'][data-part='builder'] [data-part='rule'] > [data-part='remove'] {
1012
+ [data-ui-filter-bar][data-part-builder] [data-part-rule] > [data-part-remove] {
1025
1013
  align-self: center;
1026
1014
  grid-area: remove;
1027
1015
  grid-row: 1;
@@ -1034,16 +1022,16 @@
1034
1022
  * arrive from a step above, so the eye follows the card opening; closing
1035
1023
  * snaps, because the reader has already looked away to the next card.
1036
1024
  */
1037
- [data-ui='filter-bar'][data-part='builder']
1038
- [data-part='rule']:not([data-expanded])
1039
- :is([data-part='field'], [data-part='operator'], [data-part='operand']) {
1025
+ [data-ui-filter-bar][data-part-builder]
1026
+ [data-part-rule]:not([data-expanded])
1027
+ :is([data-part-field], [data-part-operator], [data-part-operand]) {
1040
1028
  display: none;
1041
1029
  visibility: hidden;
1042
1030
  }
1043
1031
 
1044
- [data-ui='filter-bar'][data-part='builder']
1045
- [data-part='rule'][data-expanded]
1046
- :is([data-part='field'], [data-part='operator'], [data-part='operand']) {
1032
+ [data-ui-filter-bar][data-part-builder]
1033
+ [data-part-rule][data-expanded]
1034
+ :is([data-part-field], [data-part-operator], [data-part-operand]) {
1047
1035
  grid-column: 1 / -1;
1048
1036
  margin-inline: var(--_seg-pad);
1049
1037
  transition:
@@ -1052,15 +1040,15 @@
1052
1040
  }
1053
1041
 
1054
1042
  @starting-style {
1055
- [data-ui='filter-bar'][data-part='builder']
1056
- [data-part='rule'][data-expanded]
1057
- :is([data-part='field'], [data-part='operator'], [data-part='operand']) {
1043
+ [data-ui-filter-bar][data-part-builder]
1044
+ [data-part-rule][data-expanded]
1045
+ :is([data-part-field], [data-part-operator], [data-part-operand]) {
1058
1046
  opacity: 0;
1059
1047
  translate: 0 calc(-1 * var(--slotted-space-2, 0.25rem));
1060
1048
  }
1061
1049
  }
1062
1050
 
1063
- [data-ui='filter-bar'][data-part='builder'] [data-part='group'] > [data-part='actions'] {
1051
+ [data-ui-filter-bar][data-part-builder] [data-part-group] > [data-part-actions] {
1064
1052
  padding-inline-start: 0;
1065
1053
  }
1066
1054
 
@@ -1070,31 +1058,31 @@
1070
1058
  * nested group's pair stays a quiet line at the start of its rail: three
1071
1059
  * lines of full-width buttons read as three copies of one control.
1072
1060
  */
1073
- [data-ui='filter-bar'][data-part='builder']
1074
- [data-part='group'][data-depth='0']
1075
- > [data-part='actions'] {
1061
+ [data-ui-filter-bar][data-part-builder]
1062
+ [data-part-group][data-depth='0']
1063
+ > [data-part-actions] {
1076
1064
  display: grid;
1077
1065
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1078
1066
  }
1079
1067
 
1080
- [data-ui='filter-bar'][data-part='builder']
1081
- [data-part='group'][data-depth='0']
1082
- > [data-part='actions']
1083
- > :is([data-part='add-rule'], [data-part='add-group']) {
1068
+ [data-ui-filter-bar][data-part-builder]
1069
+ [data-part-group][data-depth='0']
1070
+ > [data-part-actions]
1071
+ > :is([data-part-add-rule], [data-part-add-group]) {
1084
1072
  inline-size: 100%;
1085
1073
  }
1086
1074
 
1087
- [data-ui='filter-bar'][data-part='builder']
1088
- [data-part='group']
1089
- > [data-part='actions']
1090
- > :is([data-part='clear'], [data-part='save-preset']) {
1075
+ [data-ui-filter-bar][data-part-builder]
1076
+ [data-part-group]
1077
+ > [data-part-actions]
1078
+ > :is([data-part-clear], [data-part-save-preset]) {
1091
1079
  margin-inline-start: 0;
1092
1080
  }
1093
1081
  }
1094
1082
 
1095
1083
  /* ── A builder row's remove control ─────────────────────────────────── */
1096
1084
 
1097
- [data-ui='filter-bar'] [data-part='rule'] > [data-part='remove'] {
1085
+ [data-ui-filter-bar] [data-part-rule] > [data-part-remove] {
1098
1086
  align-items: center;
1099
1087
  appearance: none;
1100
1088
  background: none;
@@ -1113,21 +1101,21 @@
1113
1101
  color var(--_duration) var(--_easing);
1114
1102
  }
1115
1103
 
1116
- [data-ui='filter-bar'] [data-part='rule'] > [data-part='remove'] > [data-ui='icon'] {
1104
+ [data-ui-filter-bar] [data-part-rule] > [data-part-remove] > [data-ui-icon] {
1117
1105
  --slotted-icon-size: var(--_icon);
1118
1106
  }
1119
1107
 
1120
- [data-ui='filter-bar'] [data-part='rule'] > [data-part='remove']:enabled:hover {
1108
+ [data-ui-filter-bar] [data-part-rule] > [data-part-remove]:enabled:hover {
1121
1109
  background-color: var(--_hover);
1122
1110
  color: var(--_ink);
1123
1111
  }
1124
1112
 
1125
- [data-ui='filter-bar'] [data-part='rule'] > [data-part='remove']:enabled:active {
1113
+ [data-ui-filter-bar] [data-part-rule] > [data-part-remove]:enabled:active {
1126
1114
  background-color: var(--_active);
1127
1115
  color: var(--_ink);
1128
1116
  }
1129
1117
 
1130
- [data-ui='filter-bar'] [data-part='rule'] > [data-part='remove']:focus-visible {
1118
+ [data-ui-filter-bar] [data-part-rule] > [data-part-remove]:focus-visible {
1131
1119
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1132
1120
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1133
1121
  }
@@ -1149,7 +1137,7 @@
1149
1137
  * answer.
1150
1138
  */
1151
1139
  @container slotted-filter-bar (max-width: 36rem) {
1152
- [data-ui='filter-bar'] > [data-part='frame'] {
1140
+ [data-ui-filter-bar] > [data-part-frame] {
1153
1141
  grid-template-areas:
1154
1142
  'search'
1155
1143
  'bar'
@@ -1157,7 +1145,7 @@
1157
1145
  grid-template-columns: minmax(0, 1fr);
1158
1146
  }
1159
1147
 
1160
- [data-ui='filter-bar'] > [data-part='frame']:has(> [data-part='end']:not(:empty)) {
1148
+ [data-ui-filter-bar] > [data-part-frame]:has(> [data-part-end]:not(:empty)) {
1161
1149
  grid-template-areas:
1162
1150
  'search'
1163
1151
  'bar'
@@ -1165,7 +1153,7 @@
1165
1153
  'count';
1166
1154
  }
1167
1155
 
1168
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='search'] {
1156
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-search] {
1169
1157
  max-inline-size: none;
1170
1158
  }
1171
1159
 
@@ -1177,63 +1165,60 @@
1177
1165
  * control gives (`focus-ring.test.mjs`) — so the row takes no room it
1178
1166
  * would have to give back as a negative margin.
1179
1167
  */
1180
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='bar'] {
1168
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-bar] {
1181
1169
  flex-wrap: nowrap;
1182
1170
  overflow-x: auto;
1183
1171
  overscroll-behavior-inline: contain;
1184
1172
  scrollbar-width: none;
1185
1173
  }
1186
1174
 
1187
- [data-ui='filter-bar']
1188
- > [data-part='frame']
1189
- > [data-part='bar']
1190
- > :is([data-part='summary'], [data-part='pill']):focus-visible {
1175
+ [data-ui-filter-bar]
1176
+ > [data-part-frame]
1177
+ > [data-part-bar]
1178
+ > :is([data-part-summary], [data-part-pill]):focus-visible {
1191
1179
  outline-offset: calc(var(--slotted-focus-ring-width, 2px) * -1);
1192
1180
  }
1193
1181
 
1194
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='bar']::-webkit-scrollbar {
1182
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-bar]::-webkit-scrollbar {
1195
1183
  display: none;
1196
1184
  }
1197
1185
 
1198
- [data-ui='filter-bar']
1199
- > [data-part='frame']
1200
- > [data-part='bar']
1201
- > :is([data-part='summary'], [data-part='chip'], [data-part='pill']) {
1186
+ [data-ui-filter-bar]
1187
+ > [data-part-frame]
1188
+ > [data-part-bar]
1189
+ > :is([data-part-summary], [data-part-chip], [data-part-pill]) {
1202
1190
  flex: none;
1203
1191
  }
1204
1192
 
1205
- [data-ui='filter-bar']
1206
- > [data-part='frame']
1207
- > [data-part='bar']
1208
- > :is([data-part='more'], [data-part='add'], [data-part='clear'], [data-part='actions']),
1209
- [data-ui='filter-bar'] [data-part='chip'] > [data-part='chip-operator'] {
1193
+ [data-ui-filter-bar]
1194
+ > [data-part-frame]
1195
+ > [data-part-bar]
1196
+ > :is([data-part-more], [data-part-add], [data-part-clear], [data-part-actions]),
1197
+ [data-ui-filter-bar] [data-part-chip] > [data-part-chip-operator] {
1210
1198
  display: none;
1211
1199
  visibility: hidden;
1212
1200
  }
1213
1201
 
1214
- [data-ui='filter-bar']
1215
- > [data-part='frame']
1216
- > [data-part='bar']
1217
- > [data-part='chip'][data-folded] {
1202
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-bar] > [data-part-chip][data-folded] {
1218
1203
  display: inline-flex;
1219
1204
  visibility: visible;
1220
1205
  }
1221
1206
 
1222
- [data-ui='filter-bar'] [data-part='chip-value'] > [data-operator] {
1207
+ [data-ui-filter-bar] [data-part-chip-value] > [data-operator] {
1223
1208
  display: inline;
1224
1209
  }
1225
1210
 
1226
- [data-ui='filter-bar'] [data-part='chip-value'] > [data-value] {
1211
+ [data-ui-filter-bar] [data-part-chip-value] > [data-value] {
1227
1212
  max-inline-size: var(--slotted-filter-bar-value-max-narrow, 9rem);
1228
1213
  }
1229
1214
 
1230
- [data-ui='filter-bar'] [data-part='summary'] {
1215
+ [data-ui-filter-bar] [data-part-summary] {
1231
1216
  display: inline-flex;
1232
1217
  visibility: visible;
1233
1218
  }
1234
1219
 
1235
1220
  /* A line of its own here, with nothing to line up with. */
1236
- [data-ui='filter-bar'] > [data-part='frame'] > [data-part='count'] {
1221
+ [data-ui-filter-bar] > [data-part-frame] > [data-part-count] {
1237
1222
  justify-self: start;
1238
1223
  padding-block: 0;
1239
1224
  }
@@ -1246,7 +1231,7 @@
1246
1231
  * keyboard is attached.
1247
1232
  */
1248
1233
  @media (hover: none) and (pointer: coarse) {
1249
- [data-ui='filter-bar'] [data-part='search'] [data-ui='kbd'] {
1234
+ [data-ui-filter-bar] [data-part-search] [data-ui-kbd] {
1250
1235
  display: none;
1251
1236
  }
1252
1237
  }
@@ -1259,12 +1244,11 @@
1259
1244
  * control height, which the theme already raises to the comfortable target.
1260
1245
  */
1261
1246
  @media (pointer: coarse) {
1262
- [data-ui='filter-bar'] :is([data-part='more'], [data-part='rule'] > [data-part='remove']) {
1247
+ [data-ui-filter-bar] :is([data-part-more], [data-part-rule] > [data-part-remove]) {
1263
1248
  position: relative;
1264
1249
  }
1265
1250
 
1266
- [data-ui='filter-bar']
1267
- :is([data-part='more'], [data-part='rule'] > [data-part='remove'])::before {
1251
+ [data-ui-filter-bar] :is([data-part-more], [data-part-rule] > [data-part-remove])::before {
1268
1252
  content: '';
1269
1253
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
1270
1254
  position: absolute;
@@ -1275,31 +1259,31 @@
1275
1259
  /* Forced colours remove the invalid edge's shadow; it comes back as an
1276
1260
  outline inside the border, and a focused invalid pill draws its ring
1277
1261
  double. A chip's ring belongs to a segment and leaves it alone. */
1278
- [data-ui='filter-bar'] [data-part='pill'][data-invalid],
1279
- [data-ui='filter-bar'] [data-part='chip'][data-invalid] {
1262
+ [data-ui-filter-bar] [data-part-pill][data-invalid],
1263
+ [data-ui-filter-bar] [data-part-chip][data-invalid] {
1280
1264
  outline: var(--_invalid-edge-width) solid CanvasText;
1281
1265
  outline-offset: calc(-1 * (var(--_border-width) + var(--_invalid-edge-width)));
1282
1266
  }
1283
1267
 
1284
- [data-ui='filter-bar'] [data-part='pill'][data-invalid]:focus-visible {
1268
+ [data-ui-filter-bar] [data-part-pill][data-invalid]:focus-visible {
1285
1269
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
1286
1270
  var(--slotted-focus-ring-color, Highlight);
1287
1271
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1288
1272
  }
1289
1273
 
1290
1274
  /* The seams would read as a second edge in the system palette; the segments keep one line each. */
1291
- [data-ui='filter-bar'] [data-part='chip'] > * + * {
1275
+ [data-ui-filter-bar] [data-part-chip] > * + * {
1292
1276
  border-inline-start-color: GrayText;
1293
1277
  }
1294
1278
 
1295
- [data-ui='filter-bar'] [data-part='chip'] > [aria-expanded='true'] {
1279
+ [data-ui-filter-bar] [data-part-chip] > [aria-expanded='true'] {
1296
1280
  background-color: Highlight;
1297
1281
  color: HighlightText;
1298
1282
  }
1299
1283
  }
1300
1284
 
1301
1285
  @media print {
1302
- [data-ui='filter-bar'][data-sticky] {
1286
+ [data-ui-filter-bar][data-sticky] {
1303
1287
  position: static;
1304
1288
  }
1305
1289
  }