@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
@@ -14,7 +14,7 @@
14
14
  * `prose` makes the same division for the same reason, and every token below
15
15
  * is declared here so both boxes and every cell read one set.
16
16
  */
17
- [data-ui='table'][data-part='root'] {
17
+ [data-ui-table][data-part-root] {
18
18
  /* Geometry. Every value is the control scale's, because a row is a
19
19
  control-sized thing: one theme decision retunes the rows, the buttons and
20
20
  the fields together, and `@media (pointer: coarse)` grows all three at
@@ -146,7 +146,7 @@
146
146
  max-inline-size: 100%;
147
147
  }
148
148
 
149
- [data-ui='table'][data-variant='framed'] {
149
+ [data-ui-table][data-variant='framed'] {
150
150
  border: var(--_rule-width) solid var(--_rule);
151
151
  border-radius: var(--_radius);
152
152
  /**
@@ -180,7 +180,7 @@
180
180
  * press Tab for nothing, and a wide table with no tab stop is unreachable
181
181
  * without a pointer.
182
182
  */
183
- [data-ui='table'] [data-part='scroll'] {
183
+ [data-ui-table] [data-part-scroll] {
184
184
  /* `overscroll-behavior-inline: contain` keeps a sideways flick inside the
185
185
  table instead of walking the page back a step, which is the gesture a
186
186
  wide table on a trackpad produces constantly. */
@@ -193,10 +193,10 @@
193
193
  keyboard: a click on a cell focuses the scroller too, and the next Shift
194
194
  would make it match `:focus-visible` (`createFocusOrigin`). The browser's own
195
195
  ring is suppressed for the same focus. */
196
- [data-ui='table'] [data-part='scroll']:focus {
196
+ [data-ui-table] [data-part-scroll]:focus {
197
197
  outline: none;
198
198
  }
199
- [data-ui='table'] [data-part='scroll']:focus-visible[data-focus-origin='keyboard'] {
199
+ [data-ui-table] [data-part-scroll]:focus-visible[data-focus-origin='keyboard'] {
200
200
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
201
201
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
202
202
  }
@@ -210,7 +210,7 @@
210
210
  * a border radius. The rules are therefore drawn as one edge on each cell,
211
211
  * never as a border on the row.
212
212
  */
213
- [data-ui='table'] [data-part='table'] {
213
+ [data-ui-table] [data-part-table] {
214
214
  border-collapse: separate;
215
215
  border-spacing: 0;
216
216
  /* The table fills the scroller and grows past it when its columns need
@@ -220,7 +220,7 @@
220
220
  text-align: start;
221
221
  }
222
222
 
223
- [data-ui='table'][data-layout='fixed'] [data-part='table'] {
223
+ [data-ui-table][data-layout='fixed'] [data-part-table] {
224
224
  inline-size: 100%;
225
225
  table-layout: fixed;
226
226
  }
@@ -233,7 +233,7 @@
233
233
  * consumer who hides it with `visually-hidden` loses the picture and keeps
234
234
  * the name.
235
235
  */
236
- [data-ui='table'] [data-part='caption'] {
236
+ [data-ui-table] [data-part-caption] {
237
237
  caption-side: block-start;
238
238
  color: var(--_muted);
239
239
  font-size: var(--slotted-font-size-xs, 0.75rem);
@@ -257,8 +257,8 @@
257
257
  column header above the alignment rule that comes after it — a header
258
258
  carrying data-align="end" computed text-align: start, so a numeric
259
259
  column's digits ended at one edge and their name at the other. */
260
- [data-ui='table'] [data-part='column-header'],
261
- [data-ui='table'] [data-part='head'] [data-part='selection'] {
260
+ [data-ui-table] [data-part-column-header],
261
+ [data-ui-table] [data-part-head] [data-part-selection] {
262
262
  background-color: var(--_head-surface);
263
263
  border-block-end: var(--_rule-width) solid var(--_rule-strong);
264
264
  color: var(--_text);
@@ -278,14 +278,14 @@
278
278
  vertical-align: bottom;
279
279
  }
280
280
 
281
- [data-ui='table'][data-variant='plain'] [data-part='column-header'] {
281
+ [data-ui-table][data-variant='plain'] [data-part-column-header] {
282
282
  background-color: transparent;
283
283
  }
284
284
 
285
285
  /**
286
286
  * ── Rows and cells ─────────────────────────────────────────────────────
287
287
  */
288
- [data-ui='table'] [data-part='row'] {
288
+ [data-ui-table] [data-part-row] {
289
289
  background-color: var(--_surface);
290
290
  }
291
291
 
@@ -305,20 +305,20 @@
305
305
  * because the cell that wants the other answer is usually one: the actions
306
306
  * pinned at the end of a tall row.
307
307
  */
308
- [data-ui='table'] {
308
+ [data-ui-table] {
309
309
  --_cell-align: middle;
310
310
  }
311
311
 
312
- [data-ui='table'][data-cell-align='start'] {
312
+ [data-ui-table][data-cell-align='start'] {
313
313
  --_cell-align: top;
314
314
  }
315
315
 
316
- [data-ui='table'][data-cell-align='end'] {
316
+ [data-ui-table][data-cell-align='end'] {
317
317
  --_cell-align: bottom;
318
318
  }
319
319
 
320
- [data-ui='table'] [data-part='cell'],
321
- [data-ui='table'] [data-part='row-header'] {
320
+ [data-ui-table] [data-part-cell],
321
+ [data-ui-table] [data-part-row-header] {
322
322
  padding-block: var(--_pad-block);
323
323
  padding-inline: var(--_pad-inline);
324
324
  text-align: start;
@@ -339,52 +339,46 @@
339
339
  * inset because it is not one of the parts named here — a table that leads
340
340
  * with a chooser has no text at its edge.
341
341
  */
342
- [data-ui='table'][data-part='root'] {
342
+ [data-ui-table][data-part-root] {
343
343
  --_edge-inset: var(--_pad-inline);
344
344
  }
345
345
 
346
- [data-ui='table'][data-part='root'][data-edges='flush']:is(
346
+ [data-ui-table][data-part-root][data-edges='flush']:is(
347
347
  [data-variant='plain'],
348
348
  [data-variant='ruled']
349
349
  ) {
350
350
  --_edge-inset: var(--slotted-table-edge-inset, 0px);
351
351
  }
352
352
 
353
- [data-ui='table']
354
- [data-part='row']
355
- > :is([data-part='cell'], [data-part='row-header'], [data-part='group-header']):first-child,
356
- [data-ui='table']
357
- [data-part='row']
358
- > [data-part='column-header']:first-child:not(:has(> [data-part='sort'])),
359
- [data-ui='table']
360
- [data-part='row']
361
- > [data-part='column-header']:first-child
362
- > [data-part='sort'] {
353
+ [data-ui-table]
354
+ [data-part-row]
355
+ > :is([data-part-cell], [data-part-row-header], [data-part-group-header]):first-child,
356
+ [data-ui-table]
357
+ [data-part-row]
358
+ > [data-part-column-header]:first-child:not(:has(> [data-part-sort])),
359
+ [data-ui-table] [data-part-row] > [data-part-column-header]:first-child > [data-part-sort] {
363
360
  padding-inline-start: var(--_edge-inset);
364
361
  }
365
362
 
366
- [data-ui='table']
367
- [data-part='row']
368
- > :is([data-part='cell'], [data-part='row-header'], [data-part='group-header']):last-child,
369
- [data-ui='table']
370
- [data-part='row']
371
- > [data-part='column-header']:last-child:not(:has(> [data-part='sort'])),
372
- [data-ui='table']
373
- [data-part='row']
374
- > [data-part='column-header']:last-child
375
- > [data-part='sort'] {
363
+ [data-ui-table]
364
+ [data-part-row]
365
+ > :is([data-part-cell], [data-part-row-header], [data-part-group-header]):last-child,
366
+ [data-ui-table]
367
+ [data-part-row]
368
+ > [data-part-column-header]:last-child:not(:has(> [data-part-sort])),
369
+ [data-ui-table] [data-part-row] > [data-part-column-header]:last-child > [data-part-sort] {
376
370
  padding-inline-end: var(--_edge-inset);
377
371
  }
378
372
 
379
- [data-ui='table'] [data-block-align='start'] {
373
+ [data-ui-table] [data-block-align='start'] {
380
374
  vertical-align: top;
381
375
  }
382
376
 
383
- [data-ui='table'] [data-block-align='center'] {
377
+ [data-ui-table] [data-block-align='center'] {
384
378
  vertical-align: middle;
385
379
  }
386
380
 
387
- [data-ui='table'] [data-block-align='end'] {
381
+ [data-ui-table] [data-block-align='end'] {
388
382
  vertical-align: bottom;
389
383
  }
390
384
 
@@ -413,24 +407,24 @@
413
407
  * `timeline` or a nested table has a `plain` variant of its own and is not a
414
408
  * control. `table.styles.test.mjs` holds the two lists against each other.
415
409
  */
416
- [data-ui='table']
417
- :is([data-part='cell'], [data-part='row-header']):has(
418
- > [data-part='root'][data-variant='plain']:is(
419
- [data-ui='select'],
420
- [data-ui='combobox'],
421
- [data-ui='multi-select'],
422
- [data-ui='text-field'],
423
- [data-ui='textarea'],
424
- [data-ui='number-field'],
425
- [data-ui='currency-field'],
426
- [data-ui='date-field'],
427
- [data-ui='time-field'],
428
- [data-ui='datetime-field'],
429
- [data-ui='tags-input'],
430
- [data-ui='date-range-picker'],
431
- [data-ui='time-range-picker'],
432
- [data-ui='datetime-range-picker'],
433
- [data-ui='entity-picker']
410
+ [data-ui-table]
411
+ :is([data-part-cell], [data-part-row-header]):has(
412
+ > [data-part-root][data-variant='plain']:is(
413
+ [data-ui-select],
414
+ [data-ui-combobox],
415
+ [data-ui-multi-select],
416
+ [data-ui-text-field],
417
+ [data-ui-textarea],
418
+ [data-ui-number-field],
419
+ [data-ui-currency-field],
420
+ [data-ui-date-field],
421
+ [data-ui-time-field],
422
+ [data-ui-datetime-field],
423
+ [data-ui-tags-input],
424
+ [data-ui-date-range-picker],
425
+ [data-ui-time-range-picker],
426
+ [data-ui-datetime-range-picker],
427
+ [data-ui-entity-picker]
434
428
  )
435
429
  ) {
436
430
  --slotted-control-padding-inline-sm: var(--_pad-inline);
@@ -448,7 +442,7 @@
448
442
  against the row's ink, a selected record's name stayed the page's black
449
443
  while every value beside it turned accent, and a disabled row's name stayed
450
444
  at full strength — the two states the row paints and this cell refused. */
451
- [data-ui='table'] [data-part='row-header'] {
445
+ [data-ui-table] [data-part-row-header] {
452
446
  font-weight: var(--slotted-font-weight-medium, 500);
453
447
  }
454
448
 
@@ -456,16 +450,16 @@
456
450
  it under `border-collapse: separate`. The last row of the body gives its
457
451
  rule up unless a footer follows, so a `ruled` table does not end in a line
458
452
  with nothing under it. */
459
- [data-ui='table']:is([data-variant='ruled'], [data-variant='framed'])
460
- [data-part='body']
461
- > [data-part='row']
453
+ [data-ui-table]:is([data-variant='ruled'], [data-variant='framed'])
454
+ [data-part-body]
455
+ > [data-part-row]
462
456
  > * {
463
457
  border-block-end: var(--_rule-width) solid var(--_rule);
464
458
  }
465
459
 
466
- [data-ui='table']:is([data-variant='ruled'], [data-variant='framed'])
467
- [data-part='body']
468
- > [data-part='row']:last-child
460
+ [data-ui-table]:is([data-variant='ruled'], [data-variant='framed'])
461
+ [data-part-body]
462
+ > [data-part-row]:last-child
469
463
  > * {
470
464
  border-block-end-color: transparent;
471
465
  }
@@ -475,7 +469,7 @@
475
469
  `nth-child(even)` counts rows the family renders; a detail row is a row of
476
470
  the same body, so the stripe follows the record it belongs to rather than
477
471
  alternating around it — see the detail rule below. */
478
- [data-ui='table'][data-striped] [data-part='body'] > [data-part='row']:nth-child(even) {
472
+ [data-ui-table][data-striped] [data-part-body] > [data-part-row]:nth-child(even) {
479
473
  background-color: var(--_stripe);
480
474
  }
481
475
 
@@ -487,7 +481,7 @@
487
481
  * every pointer state rather than a rule of its own: a row a consumer has
488
482
  * disabled does not answer the pointer at all.
489
483
  */
490
- [data-ui='table'] [data-part='body'] > [data-part='row']:not([data-disabled]):hover {
484
+ [data-ui-table] [data-part-body] > [data-part-row]:not([data-disabled]):hover {
491
485
  background-color: var(--_hover);
492
486
  }
493
487
 
@@ -503,18 +497,16 @@
503
497
  * is what survives forced colours, which is where WCAG 2.2 SC 1.4.1 puts the
504
498
  * requirement anyway.
505
499
  */
506
- [data-ui='table'] [data-part='body'] > [data-part='row'][data-selected] {
500
+ [data-ui-table] [data-part-body] > [data-part-row][data-selected] {
507
501
  background-color: var(--_selected);
508
502
  color: var(--_selected-text);
509
503
  }
510
504
 
511
- [data-ui='table']
512
- [data-part='body']
513
- > [data-part='row'][data-selected]:not([data-disabled]):hover {
505
+ [data-ui-table] [data-part-body] > [data-part-row][data-selected]:not([data-disabled]):hover {
514
506
  background-color: var(--_selected-hover);
515
507
  }
516
508
 
517
- [data-ui='table'] [data-part='row'][data-disabled] {
509
+ [data-ui-table] [data-part-row][data-disabled] {
518
510
  color: var(--slotted-disabled-foreground, GrayText);
519
511
  }
520
512
 
@@ -525,7 +517,7 @@
525
517
  * pinned cell copies the row's ground and a translucent one shows the
526
518
  * scrolled cells through it. Selection is stronger and paints over it.
527
519
  */
528
- [data-ui='table'] [data-part='body'] > [data-part='row'][data-current]:not([data-selected]) {
520
+ [data-ui-table] [data-part-body] > [data-part-row][data-current]:not([data-selected]) {
529
521
  background-color: var(
530
522
  --slotted-table-row-surface-current,
531
523
  var(--slotted-tone-secondary-subtle-active, ButtonFace)
@@ -533,7 +525,7 @@
533
525
  }
534
526
 
535
527
  /* A row with an action of its own is a thing the pointer presses. */
536
- [data-ui='table'] [data-part='body'] > [data-part='row'][data-interactive]:not([data-disabled]) {
528
+ [data-ui-table] [data-part-body] > [data-part-row][data-interactive]:not([data-disabled]) {
537
529
  cursor: pointer;
538
530
  }
539
531
 
@@ -545,7 +537,7 @@
545
537
  * up. The ground is the stripe's step, opaque for the same reason a pinned
546
538
  * cell's is, and the band stays where it is when the pointer passes.
547
539
  */
548
- [data-ui='table'] [data-part='group-header'] {
540
+ [data-ui-table] [data-part-group-header] {
549
541
  background-color: var(--slotted-table-group-surface, var(--_stripe));
550
542
  border-block-end: var(--_rule-width) solid var(--_rule);
551
543
  color: var(--slotted-table-group-color, var(--_text));
@@ -555,7 +547,7 @@
555
547
  text-align: start;
556
548
  }
557
549
 
558
- [data-ui='table'] [data-part='group-content'] {
550
+ [data-ui-table] [data-part-group-content] {
559
551
  align-items: baseline;
560
552
  display: flex;
561
553
  gap: var(--_gap);
@@ -563,7 +555,7 @@
563
555
  min-inline-size: 0;
564
556
  }
565
557
 
566
- [data-ui='table'] [data-part='group-end'] {
558
+ [data-ui-table] [data-part-group-end] {
567
559
  font-variant-numeric: tabular-nums;
568
560
  text-align: end;
569
561
  white-space: nowrap;
@@ -574,15 +566,15 @@
574
566
  * header's height is one row of the control scale and its rule; a header
575
567
  * that wraps sets `--slotted-table-group-sticky-offset` itself.
576
568
  */
577
- [data-ui='table'] [data-part='group-row'][data-sticky] > [data-part='group-header'] {
569
+ [data-ui-table] [data-part-group-row][data-sticky] > [data-part-group-header] {
578
570
  inset-block-start: var(--slotted-table-group-sticky-offset, 0);
579
571
  position: sticky;
580
572
  z-index: var(--slotted-z-index-sticky, 100);
581
573
  }
582
574
 
583
- [data-ui='table'][data-sticky-header]
584
- [data-part='group-row'][data-sticky]
585
- > [data-part='group-header'] {
575
+ [data-ui-table][data-sticky-header]
576
+ [data-part-group-row][data-sticky]
577
+ > [data-part-group-header] {
586
578
  inset-block-start: var(
587
579
  --slotted-table-group-sticky-offset,
588
580
  calc(var(--_row-min-block) + var(--_rule-width))
@@ -590,7 +582,7 @@
590
582
  }
591
583
 
592
584
  @media (forced-colors: active) {
593
- [data-ui='table'] [data-part='body'] > [data-part='row'][data-current] {
585
+ [data-ui-table] [data-part-body] > [data-part-row][data-current] {
594
586
  outline: var(--_rule-width) solid Highlight;
595
587
  outline-offset: calc(var(--_rule-width) * -1);
596
588
  }
@@ -604,25 +596,25 @@
604
596
  * `start` and `end` are the logical values, so a column aligned to the end is
605
597
  * on the right in English and on the left in Arabic.
606
598
  */
607
- [data-ui='table'] [data-align='start'] {
599
+ [data-ui-table] [data-align='start'] {
608
600
  text-align: start;
609
601
  }
610
602
 
611
- [data-ui='table'] [data-align='center'] {
603
+ [data-ui-table] [data-align='center'] {
612
604
  text-align: center;
613
605
  }
614
606
 
615
- [data-ui='table'] [data-align='end'] {
607
+ [data-ui-table] [data-align='end'] {
616
608
  text-align: end;
617
609
  }
618
610
 
619
611
  /* A ten under a nine is only a column if the digits are the same width. The
620
612
  alignment is inferred once, and only where the consumer stated none. */
621
- [data-ui='table'] [data-numeric] {
613
+ [data-ui-table] [data-numeric] {
622
614
  font-variant-numeric: tabular-nums;
623
615
  }
624
616
 
625
- [data-ui='table'] [data-numeric]:not([data-align]) {
617
+ [data-ui-table] [data-numeric]:not([data-align]) {
626
618
  text-align: end;
627
619
  }
628
620
 
@@ -633,18 +625,18 @@
633
625
  * decision is that a truncated string stays readable to assistive technology
634
626
  * and reachable in full.
635
627
  */
636
- [data-ui='table'] [data-text='wrap'] {
628
+ [data-ui-table] [data-text='wrap'] {
637
629
  /* An identifier, a hash or a URL is one unbroken token, and every surveyed
638
630
  table lets it set the column's width and push the rest of the table
639
631
  sideways. */
640
632
  overflow-wrap: anywhere;
641
633
  }
642
634
 
643
- [data-ui='table'] [data-text='nowrap'] {
635
+ [data-ui-table] [data-text='nowrap'] {
644
636
  white-space: nowrap;
645
637
  }
646
638
 
647
- [data-ui='table'] [data-text='truncate'] {
639
+ [data-ui-table] [data-text='truncate'] {
648
640
  overflow: hidden;
649
641
  text-overflow: ellipsis;
650
642
  white-space: nowrap;
@@ -686,24 +678,24 @@
686
678
  * top, over the first rows. A `page` table inside a scrolling box of the
687
679
  * consumer's own sets the offset on that box, `0` for its top edge.
688
680
  */
689
- [data-ui='table'][data-sticky-header] [data-part='column-header'],
681
+ [data-ui-table][data-sticky-header] [data-part-column-header],
690
682
  /* The chooser's own header is a `selection` cell and not a `column-header`,
691
683
  and a rule naming only the second left the select-all scrolling away while
692
684
  every column beside it stayed. */
693
- [data-ui='table'][data-sticky-header] [data-part='head'] [data-part='selection'] {
685
+ [data-ui-table][data-sticky-header] [data-part-head] [data-part-selection] {
694
686
  inset-block-start: 0;
695
687
  position: sticky;
696
688
  z-index: calc(var(--slotted-z-index-sticky, 100) + 1);
697
689
  }
698
690
 
699
- [data-ui='table'][data-sticky-to='page'][data-sticky-header] [data-part='column-header'],
700
- [data-ui='table'][data-sticky-to='page'][data-sticky-header]
701
- [data-part='head']
702
- [data-part='selection'] {
691
+ [data-ui-table][data-sticky-to='page'][data-sticky-header] [data-part-column-header],
692
+ [data-ui-table][data-sticky-to='page'][data-sticky-header]
693
+ [data-part-head]
694
+ [data-part-selection] {
703
695
  inset-block-start: var(--slotted-table-sticky-offset, 0);
704
696
  }
705
697
 
706
- [data-ui='table'][data-sticky-to='page'] [data-part='scroll'] {
698
+ [data-ui-table][data-sticky-to='page'] [data-part-scroll] {
707
699
  overflow: visible;
708
700
  }
709
701
 
@@ -718,26 +710,26 @@
718
710
  * It is the `tfoot` that is pinned and not the footer bar: the bar is a
719
711
  * sibling of the scroller and never leaves it in the first place.
720
712
  */
721
- [data-ui='table'][data-sticky-footer] [data-part='summary'] > [data-part='row'] > * {
713
+ [data-ui-table][data-sticky-footer] [data-part-summary] > [data-part-row] > * {
722
714
  inset-block-end: 0;
723
715
  position: sticky;
724
716
  z-index: calc(var(--slotted-z-index-sticky, 100) + 1);
725
717
  }
726
718
 
727
- [data-ui='table'][data-sticky-to='page'][data-sticky-footer]
728
- [data-part='summary']
729
- > [data-part='row']
719
+ [data-ui-table][data-sticky-to='page'][data-sticky-footer]
720
+ [data-part-summary]
721
+ > [data-part-row]
730
722
  > * {
731
723
  inset-block-end: var(--slotted-table-sticky-offset-end, 0);
732
724
  }
733
725
 
734
726
  /* The corner again, at the bottom: a summary cell that is also a pinned
735
727
  column takes both insets and the step above both. */
736
- [data-ui='table'][data-sticky-footer] [data-part='summary'] [data-sticky] {
728
+ [data-ui-table][data-sticky-footer] [data-part-summary] [data-sticky] {
737
729
  z-index: calc(var(--slotted-z-index-sticky, 100) + 2);
738
730
  }
739
731
 
740
- [data-ui='table'] [data-sticky='start'] {
732
+ [data-ui-table] [data-sticky='start'] {
741
733
  /* The ground the row is painted with, whatever state it is in: `inherit`
742
734
  takes the row's own computed value, so a hovered, striped or selected row
743
735
  keeps one colour across the seam. */
@@ -755,15 +747,15 @@
755
747
  z-index: var(--slotted-z-index-sticky, 100);
756
748
  }
757
749
 
758
- [data-ui='table'] [data-sticky='end'] {
750
+ [data-ui-table] [data-sticky='end'] {
759
751
  background-color: inherit;
760
752
  inset-inline-end: var(--slotted-table-sticky-inset, 0);
761
753
  position: sticky;
762
754
  z-index: var(--slotted-z-index-sticky, 100);
763
755
  }
764
756
 
765
- [data-ui='table'][data-sticky-header] [data-part='column-header'][data-sticky],
766
- [data-ui='table'][data-sticky-header] [data-part='head'] [data-part='selection'][data-sticky] {
757
+ [data-ui-table][data-sticky-header] [data-part-column-header][data-sticky],
758
+ [data-ui-table][data-sticky-header] [data-part-head] [data-part-selection][data-sticky] {
767
759
  background-color: var(--_head-surface);
768
760
  z-index: calc(var(--slotted-z-index-sticky, 100) + 2);
769
761
  }
@@ -796,7 +788,7 @@
796
788
  positioned box, so the line below resolves against it — and a `relative`
797
789
  written at this point in the file would land after the sticky rules and
798
790
  unpin every pinned column. */
799
- [data-ui='table'] [data-sticky]::after {
791
+ [data-ui-table] [data-sticky]::after {
800
792
  background-color: var(--slotted-table-border-color, var(--slotted-border-subtle));
801
793
  content: '';
802
794
  inline-size: var(--_rule-width);
@@ -805,11 +797,11 @@
805
797
  z-index: 1;
806
798
  }
807
799
 
808
- [data-ui='table'] [data-sticky='start']::after {
800
+ [data-ui-table] [data-sticky='start']::after {
809
801
  inset-inline-end: 0;
810
802
  }
811
803
 
812
- [data-ui='table'] [data-sticky='end']::after {
804
+ [data-ui-table] [data-sticky='end']::after {
813
805
  inset-inline-start: 0;
814
806
  }
815
807
 
@@ -848,7 +840,7 @@
848
840
  * so does this: the header cell gives up its inset and the control takes it,
849
841
  * so the whole header is the target rather than the words inside it.
850
842
  */
851
- [data-ui='table'] [data-part='column-header']:has(> [data-part='sort']) {
843
+ [data-ui-table] [data-part-column-header]:has(> [data-part-sort]) {
852
844
  padding: 0;
853
845
  }
854
846
 
@@ -882,7 +874,7 @@
882
874
  * consumer's own, so their width is not a fact this family holds, and
883
875
  * measuring it would mean reading the layout during render.
884
876
  */
885
- [data-ui='table'] [data-part='column-header']:has(> [data-part='column-actions']) {
877
+ [data-ui-table] [data-part-column-header]:has(> [data-part-column-actions]) {
886
878
  /**
887
879
  * The room is what the slot actually occupies plus one gap: the slot stands
888
880
  * `--_pad-inline` in from the cell's edge and its control is one target
@@ -899,7 +891,7 @@
899
891
  padding-inline-end: var(--_actions-room);
900
892
  }
901
893
 
902
- [data-ui='table'] [data-part='column-actions'] {
894
+ [data-ui-table] [data-part-column-actions] {
903
895
  align-items: center;
904
896
  display: inline-flex;
905
897
  gap: var(--_gap);
@@ -908,7 +900,7 @@
908
900
  position: absolute;
909
901
  }
910
902
 
911
- [data-ui='table'] [data-part='sort'] {
903
+ [data-ui-table] [data-part-sort] {
912
904
  /* The mark is centred on the text rather than dropped at the top of the
913
905
  line: with the default `stretch` resolving to `flex-start` under a stated
914
906
  block size, the chevron sat two pixels above the capitals and read as a
@@ -944,11 +936,11 @@
944
936
  /* An aligned column keeps its name over its values, and the mark follows the
945
937
  name rather than the cell: a centred column reads as a centred pair, and a
946
938
  numeric column's name and mark both stand at the edge its digits end on. */
947
- [data-ui='table'] [data-align='center'] > [data-part='sort'] {
939
+ [data-ui-table] [data-align='center'] > [data-part-sort] {
948
940
  justify-content: center;
949
941
  }
950
942
 
951
- [data-ui='table'] :is([data-align='end'], [data-numeric]:not([data-align])) > [data-part='sort'] {
943
+ [data-ui-table] :is([data-align='end'], [data-numeric]:not([data-align])) > [data-part-sort] {
952
944
  justify-content: end;
953
945
  }
954
946
 
@@ -968,20 +960,20 @@
968
960
  * scale holds a ground one step under this one, and mixing keeps the
969
961
  * direction right in every scheme.
970
962
  */
971
- [data-ui='table'] [data-part='column-header']:has(> [data-part='sort']:not(:disabled)):hover {
963
+ [data-ui-table] [data-part-column-header]:has(> [data-part-sort]:not(:disabled)):hover {
972
964
  background-color: var(
973
965
  --slotted-table-header-surface-hover,
974
966
  color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface))
975
967
  );
976
968
  }
977
969
 
978
- [data-ui='table'] [data-part='column-header'] {
970
+ [data-ui-table] [data-part-column-header] {
979
971
  transition: background-color
980
972
  var(--slotted-control-transition-duration, var(--slotted-duration-short))
981
973
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
982
974
  }
983
975
 
984
- [data-ui='table'] [data-part='sort']:focus-visible {
976
+ [data-ui-table] [data-part-sort]:focus-visible {
985
977
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
986
978
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
987
979
  }
@@ -996,7 +988,7 @@
996
988
  * pointer or under focus, so the column says it can be sorted without twelve
997
989
  * marks competing with twelve names. The sorted column keeps its mark drawn.
998
990
  */
999
- [data-ui='table'] [data-part='sort'] > [data-ui='icon'] {
991
+ [data-ui-table] [data-part-sort] > [data-ui-icon] {
1000
992
  --slotted-icon-size: var(--_icon-size);
1001
993
  opacity: 0;
1002
994
  transition:
@@ -1006,19 +998,19 @@
1006
998
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
1007
999
  }
1008
1000
 
1009
- [data-ui='table'] [data-part='sort']:not(:disabled):hover > [data-ui='icon'],
1010
- [data-ui='table'] [data-part='sort']:focus-visible > [data-ui='icon'] {
1001
+ [data-ui-table] [data-part-sort]:not(:disabled):hover > [data-ui-icon],
1002
+ [data-ui-table] [data-part-sort]:focus-visible > [data-ui-icon] {
1011
1003
  opacity: 0.55;
1012
1004
  }
1013
1005
 
1014
- [data-ui='table'] [aria-sort] > [data-part='sort'] > [data-ui='icon'] {
1006
+ [data-ui-table] [aria-sort] > [data-part-sort] > [data-ui-icon] {
1015
1007
  opacity: 1;
1016
1008
  }
1017
1009
 
1018
1010
  /* Ascending is the same mark turned over. The rotation is animated because it
1019
1011
  is the one movement in this family a reader has to follow: the column did
1020
1012
  not change, its direction did. */
1021
- [data-ui='table'] [aria-sort='ascending'] > [data-part='sort'] > [data-ui='icon'] {
1013
+ [data-ui-table] [aria-sort='ascending'] > [data-part-sort] > [data-ui-icon] {
1022
1014
  rotate: 180deg;
1023
1015
  }
1024
1016
 
@@ -1038,7 +1030,7 @@
1038
1030
  * past the chooser and over the column behind it. Now one name answers both
1039
1031
  * places: this width, and the `stickyOffset` beside it.
1040
1032
  */
1041
- [data-ui='table'] [data-part='selection'] {
1033
+ [data-ui-table] [data-part-selection] {
1042
1034
  inline-size: var(--slotted-table-selection-size, 3rem);
1043
1035
  padding-block: var(--_pad-block);
1044
1036
  padding-inline: var(--_pad-inline);
@@ -1052,7 +1044,7 @@
1052
1044
 
1053
1045
  /* The control is one line tall whatever the row is, so it sits on the line
1054
1046
  the axis puts it on rather than stretching down a three-line cell. */
1055
- [data-ui='table'] [data-part='selection'] > [data-ui='checkbox'] {
1047
+ [data-ui-table] [data-part-selection] > [data-ui-checkbox] {
1056
1048
  block-size: var(--_line);
1057
1049
  }
1058
1050
 
@@ -1071,7 +1063,7 @@
1071
1063
  * be this stylesheet deciding how that one looks. The target is unaffected —
1072
1064
  * it is a separate pseudo-element, and it stays at the WCAG minimum.
1073
1065
  */
1074
- [data-ui='table'] [data-part='selection'] {
1066
+ [data-ui-table] [data-part-selection] {
1075
1067
  --slotted-selection-halo-opacity: 0;
1076
1068
  }
1077
1069
 
@@ -1083,7 +1075,7 @@
1083
1075
  * expander inside the row header moved one identifier and left the column
1084
1076
  * ragged.
1085
1077
  */
1086
- [data-ui='table'] [data-part='cell']:has(> [data-part='expander']) {
1078
+ [data-ui-table] [data-part-cell]:has(> [data-part-expander]) {
1087
1079
  inline-size: 1%;
1088
1080
  padding-inline-end: 0;
1089
1081
  white-space: nowrap;
@@ -1099,7 +1091,7 @@
1099
1091
  * out. `display: contents` removes both wrappers from layout and leaves the
1100
1092
  * button as the slot's own child, which is the box tree React already has.
1101
1093
  */
1102
- [data-ui='table'] [data-part='column-actions'] *:has([data-part='filter']) {
1094
+ [data-ui-table] [data-part-column-actions] *:has([data-part-filter]) {
1103
1095
  display: contents;
1104
1096
  }
1105
1097
 
@@ -1111,10 +1103,10 @@
1111
1103
  * turn when the detail is open — and mirrored in a right-to-left document,
1112
1104
  * where a closed disclosure points the other way.
1113
1105
  */
1114
- [data-ui='table'] [data-part='expander'],
1115
- [data-ui='table'] [data-part='column-actions'] > button,
1116
- [data-ui='table'] button[data-part='column-actions'],
1117
- [data-ui='table'] [data-part='filter'] {
1106
+ [data-ui-table] [data-part-expander],
1107
+ [data-ui-table] [data-part-column-actions] > button,
1108
+ [data-ui-table] button[data-part-column-actions],
1109
+ [data-ui-table] [data-part-filter] {
1118
1110
  background-color: transparent;
1119
1111
  border: 0;
1120
1112
  border-radius: var(--slotted-table-control-radius, var(--slotted-radius-sm, 4px));
@@ -1155,39 +1147,39 @@
1155
1147
  * back across them.
1156
1148
  */
1157
1149
  @media (pointer: coarse) {
1158
- [data-ui='table'] [data-part='expander'],
1159
- [data-ui='table'] [data-part='column-actions'] > button,
1160
- [data-ui='table'] button[data-part='column-actions'],
1161
- [data-ui='table'] [data-part='filter'] {
1150
+ [data-ui-table] [data-part-expander],
1151
+ [data-ui-table] [data-part-column-actions] > button,
1152
+ [data-ui-table] button[data-part-column-actions],
1153
+ [data-ui-table] [data-part-filter] {
1162
1154
  position: relative;
1163
1155
  }
1164
1156
 
1165
- [data-ui='table'] [data-part='expander']::after,
1166
- [data-ui='table'] [data-part='column-actions'] > button::after,
1167
- [data-ui='table'] button[data-part='column-actions']::after,
1168
- [data-ui='table'] [data-part='filter']::after {
1157
+ [data-ui-table] [data-part-expander]::after,
1158
+ [data-ui-table] [data-part-column-actions] > button::after,
1159
+ [data-ui-table] button[data-part-column-actions]::after,
1160
+ [data-ui-table] [data-part-filter]::after {
1169
1161
  content: '';
1170
1162
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
1171
1163
  position: absolute;
1172
1164
  }
1173
1165
 
1174
- [data-ui='table'] [data-part='column-actions'] > button::after,
1175
- [data-ui='table'] button[data-part='column-actions']::after,
1176
- [data-ui='table'] [data-part='filter']::after {
1166
+ [data-ui-table] [data-part-column-actions] > button::after,
1167
+ [data-ui-table] button[data-part-column-actions]::after,
1168
+ [data-ui-table] [data-part-filter]::after {
1177
1169
  inset-inline-start: 0;
1178
1170
  }
1179
1171
  }
1180
1172
 
1181
- [data-ui='table'] [data-part='expander']:not(:disabled):hover {
1173
+ [data-ui-table] [data-part-expander]:not(:disabled):hover {
1182
1174
  background-color: var(--_hover);
1183
1175
  color: var(--_text);
1184
1176
  }
1185
1177
 
1186
1178
  /* On the band the hover darkens, for the reason the sort control's does: the
1187
1179
  step a row hovers with is lighter than the band and reads as a hole in it. */
1188
- [data-ui='table'] [data-part='column-actions'] > button:not(:disabled):hover,
1189
- [data-ui='table'] button[data-part='column-actions']:not(:disabled):hover,
1190
- [data-ui='table'] [data-part='filter']:not(:disabled):hover {
1180
+ [data-ui-table] [data-part-column-actions] > button:not(:disabled):hover,
1181
+ [data-ui-table] button[data-part-column-actions]:not(:disabled):hover,
1182
+ [data-ui-table] [data-part-filter]:not(:disabled):hover {
1191
1183
  background-color: var(
1192
1184
  --slotted-table-header-surface-hover,
1193
1185
  color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface))
@@ -1200,10 +1192,10 @@
1200
1192
  because both stand against an edge the ring would otherwise cross; these
1201
1193
  are 24-pixel boxes inside a cell's own inset, and read at that size an
1202
1194
  inward ring closed on the chevron. */
1203
- [data-ui='table'] [data-part='expander']:focus-visible,
1204
- [data-ui='table'] [data-part='column-actions'] > button:focus-visible,
1205
- [data-ui='table'] button[data-part='column-actions']:focus-visible,
1206
- [data-ui='table'] [data-part='filter']:focus-visible {
1195
+ [data-ui-table] [data-part-expander]:focus-visible,
1196
+ [data-ui-table] [data-part-column-actions] > button:focus-visible,
1197
+ [data-ui-table] button[data-part-column-actions]:focus-visible,
1198
+ [data-ui-table] [data-part-filter]:focus-visible {
1207
1199
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1208
1200
  outline-offset: 0;
1209
1201
  }
@@ -1216,7 +1208,7 @@
1216
1208
  * nineteen and a half — the control scale is right for a control in a form
1217
1209
  * and wrong for a mark in a header.
1218
1210
  */
1219
- [data-ui='table'] :is([data-part='column-actions'], [data-part='filter']) :is(svg, img) {
1211
+ [data-ui-table] :is([data-part-column-actions], [data-part-filter]) :is(svg, img) {
1220
1212
  block-size: var(--_icon-size);
1221
1213
  inline-size: var(--_icon-size);
1222
1214
  }
@@ -1229,8 +1221,8 @@
1229
1221
  * accent ink and holds it whether the pointer is on it or not, because a
1230
1222
  * filter a reader forgot they set is the defect this state exists to prevent.
1231
1223
  */
1232
- [data-ui='table'] [data-part='filter'][data-filtered],
1233
- [data-ui='table'] [data-part='filter'][data-filtered]:not(:disabled):hover {
1224
+ [data-ui-table] [data-part-filter][data-filtered],
1225
+ [data-ui-table] [data-part-filter][data-filtered]:not(:disabled):hover {
1234
1226
  color: var(--slotted-tone-accent-text, LinkText);
1235
1227
  }
1236
1228
 
@@ -1238,17 +1230,17 @@
1238
1230
  * The panel, which is drawn wherever `popover` puts it — inside the header or
1239
1231
  * portalled to the end of the document. So it carries the family's identity
1240
1232
  * on itself rather than reading it from an ancestor: a rule that reached for
1241
- * `[data-ui='table']` above would style the panel in one of the two.
1233
+ * `[data-ui-table]` above would style the panel in one of the two.
1242
1234
  *
1243
1235
  * And it declares the values it uses rather than reading them from the root,
1244
- * for the same reason. Every `--_` above is declared on `[data-part='root']`;
1236
+ * for the same reason. Every `--_` above is declared on `[data-part-root]`;
1245
1237
  * portalled to the end of the document the panel is not inside it, and a
1246
1238
  * custom property that resolves to nothing takes its whole declaration with
1247
1239
  * it — `gap: var(--_gap)` became no gap at all, silently, in the one
1248
1240
  * arrangement `popover` uses by default. The eight below are the panel's own,
1249
1241
  * from the same theme tokens the root reads.
1250
1242
  */
1251
- [data-ui='table'][data-part='filter-panel'] {
1243
+ [data-ui-table][data-part-filter-panel] {
1252
1244
  --_gap: var(--slotted-table-gap, var(--slotted-control-gap-md, 8px));
1253
1245
  --_font-size: var(--slotted-table-font-size, var(--slotted-control-font-size-md, 13px));
1254
1246
  --_line: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));
@@ -1318,13 +1310,13 @@
1318
1310
  * rather than set on a row, because an operator name is the widest thing in
1319
1311
  * the panel and a row would give the value what was left of 15rem.
1320
1312
  */
1321
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-condition'] {
1313
+ [data-ui-table][data-part-filter-panel] [data-part-filter-condition] {
1322
1314
  display: grid;
1323
1315
  gap: calc(var(--_gap) / 2);
1324
1316
  }
1325
1317
 
1326
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operator'],
1327
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-search'] {
1318
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operator],
1319
+ [data-ui-table][data-part-filter-panel] [data-part-filter-search] {
1328
1320
  display: block;
1329
1321
  }
1330
1322
 
@@ -1339,14 +1331,14 @@
1339
1331
  * way round: two number fields side by side in a 15rem panel are two fields
1340
1332
  * nobody can read.
1341
1333
  */
1342
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operand'] {
1334
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operand] {
1343
1335
  display: grid;
1344
1336
  gap: calc(var(--_gap) / 2);
1345
1337
  grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr));
1346
1338
  }
1347
1339
 
1348
1340
  /* A set's operand is a search and a list, which own their own stacking. */
1349
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operand'][data-kind='set'] {
1341
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operand][data-kind='set'] {
1350
1342
  grid-template-columns: 1fr;
1351
1343
  gap: var(--_gap);
1352
1344
  }
@@ -1364,9 +1356,9 @@
1364
1356
  * one field, and the field takes the panel's width so the wrapping has
1365
1357
  * somewhere to go.
1366
1358
  */
1367
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operand'][data-range],
1368
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operand'][data-kind='datetime'],
1369
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-operand'][data-operand='tags'] {
1359
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operand][data-range],
1360
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operand][data-kind='datetime'],
1361
+ [data-ui-table][data-part-filter-panel] [data-part-filter-operand][data-operand='tags'] {
1370
1362
  grid-template-columns: 1fr;
1371
1363
  }
1372
1364
 
@@ -1379,8 +1371,8 @@
1379
1371
  * `between` is one range picker, marked `data-range`, and this rule stands
1380
1372
  * after the one above, so it steps aside for that mark.
1381
1373
  */
1382
- [data-ui='table'][data-part='filter-panel']
1383
- [data-part='filter-operand'][data-kind='time']:not([data-range]) {
1374
+ [data-ui-table][data-part-filter-panel]
1375
+ [data-part-filter-operand][data-kind='time']:not([data-range]) {
1384
1376
  grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
1385
1377
  }
1386
1378
 
@@ -1389,7 +1381,7 @@
1389
1381
  * conditions are separate boxes and the reader has to see where the first ends
1390
1382
  * before being asked how the second joins it.
1391
1383
  */
1392
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-join'] {
1384
+ [data-ui-table][data-part-filter-panel] [data-part-filter-join] {
1393
1385
  align-items: center;
1394
1386
  border-block-start: var(--_rule-width) solid var(--_rule);
1395
1387
  display: flex;
@@ -1398,7 +1390,7 @@
1398
1390
  padding-block-start: var(--_gap);
1399
1391
  }
1400
1392
 
1401
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-join'] > [data-label] {
1393
+ [data-ui-table][data-part-filter-panel] [data-part-filter-join] > [data-label] {
1402
1394
  color: var(--_muted);
1403
1395
  }
1404
1396
 
@@ -1407,7 +1399,7 @@
1407
1399
  * than the screen. Eight rows is the height a set filter opens at in AG Grid
1408
1400
  * and about the height Excel's opens at; past that the reader searches.
1409
1401
  */
1410
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-list'] {
1402
+ [data-ui-table][data-part-filter-panel] [data-part-filter-list] {
1411
1403
  display: grid;
1412
1404
  gap: var(--_gap);
1413
1405
  max-block-size: calc(var(--_line) * 9);
@@ -1427,7 +1419,7 @@
1427
1419
  * pulled out to the panel's inset so it reads as a row rather than as a box
1428
1420
  * around the words.
1429
1421
  */
1430
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-option'] {
1422
+ [data-ui-table][data-part-filter-panel] [data-part-filter-option] {
1431
1423
  --slotted-selection-halo-opacity: 0;
1432
1424
 
1433
1425
  align-items: center;
@@ -1439,26 +1431,25 @@
1439
1431
  padding-inline: var(--_gap);
1440
1432
  }
1441
1433
 
1442
- [data-ui='table'][data-part='filter-panel']
1443
- [data-part='filter-option']:not([data-disabled]):hover {
1434
+ [data-ui-table][data-part-filter-panel] [data-part-filter-option]:not([data-disabled]):hover {
1444
1435
  background-color: var(--_hover);
1445
1436
  }
1446
1437
 
1447
1438
  /* The count is the consumer's fact about their own query, so it is set apart
1448
1439
  from the value rather than beside it as a second label. */
1449
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-option'] > [data-count] {
1440
+ [data-ui-table][data-part-filter-panel] [data-part-filter-option] > [data-count] {
1450
1441
  color: var(--_muted);
1451
1442
  font-variant-numeric: tabular-nums;
1452
1443
  }
1453
1444
 
1454
1445
  /* The covering checkbox is a row of the same list and a boundary at once: it
1455
1446
  answers for everything under it, so the rule says where "everything" ends. */
1456
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-option'][data-covering] {
1447
+ [data-ui-table][data-part-filter-panel] [data-part-filter-option][data-covering] {
1457
1448
  border-block-end: var(--_rule-width) solid var(--_rule);
1458
1449
  padding-block-end: var(--_gap);
1459
1450
  }
1460
1451
 
1461
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-empty'] {
1452
+ [data-ui-table][data-part-filter-panel] [data-part-filter-empty] {
1462
1453
  color: var(--_muted);
1463
1454
  padding-block: var(--_pad-block);
1464
1455
  text-align: center;
@@ -1466,7 +1457,7 @@
1466
1457
 
1467
1458
  /* Clear at the leading edge and Apply at the trailing one: the destructive
1468
1459
  answer is farthest from the one a reader presses without reading. */
1469
- [data-ui='table'][data-part='filter-panel'] [data-part='filter-actions'] {
1460
+ [data-ui-table][data-part-filter-panel] [data-part-filter-actions] {
1470
1461
  border-block-start: var(--_rule-width) solid var(--_rule);
1471
1462
  display: flex;
1472
1463
  gap: var(--_gap);
@@ -1475,25 +1466,25 @@
1475
1466
  }
1476
1467
 
1477
1468
  /* The chevron is the `Glyph` the binding draws inside the button. */
1478
- [data-ui='table'] [data-part='expander'] > [data-ui='icon'] {
1469
+ [data-ui-table] [data-part-expander] > [data-ui-icon] {
1479
1470
  --slotted-icon-size: var(--_icon-size);
1480
1471
  rotate: 0deg;
1481
1472
  transition: rotate var(--slotted-control-transition-duration, var(--slotted-duration-short))
1482
1473
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
1483
1474
  }
1484
1475
 
1485
- [data-ui='table'] [data-part='expander'][aria-expanded='true'] > [data-ui='icon'] {
1476
+ [data-ui-table] [data-part-expander][aria-expanded='true'] > [data-ui-icon] {
1486
1477
  rotate: 90deg;
1487
1478
  }
1488
1479
 
1489
1480
  /* A chevron is direction-sensitive artwork, so it is mirrored rather than
1490
1481
  reused: a closed row in Arabic points to the start of the line, which is
1491
1482
  the right-hand side. */
1492
- [data-ui='table']:dir(rtl) [data-part='expander'] > [data-ui='icon'] {
1483
+ [data-ui-table]:dir(rtl) [data-part-expander] > [data-ui-icon] {
1493
1484
  scale: -1 1;
1494
1485
  }
1495
1486
 
1496
- [data-ui='table']:dir(rtl) [data-part='expander'][aria-expanded='true'] > [data-ui='icon'] {
1487
+ [data-ui-table]:dir(rtl) [data-part-expander][aria-expanded='true'] > [data-ui-icon] {
1497
1488
  rotate: -90deg;
1498
1489
  }
1499
1490
 
@@ -1505,25 +1496,25 @@
1505
1496
  * reach, and it takes the sunken ground so the record it belongs to still
1506
1497
  * reads as one thing.
1507
1498
  */
1508
- [data-ui='table'] [data-part='detail'] {
1499
+ [data-ui-table] [data-part-detail] {
1509
1500
  background-color: var(--_stripe);
1510
1501
  }
1511
1502
 
1512
- [data-ui='table'] [data-part='detail'] > [data-part='cell'] {
1503
+ [data-ui-table] [data-part-detail] > [data-part-cell] {
1513
1504
  padding-block: var(--_pad-block);
1514
1505
  padding-inline: var(--_pad-inline);
1515
1506
  }
1516
1507
 
1517
1508
  /* A detail row is not a record, so it takes no stripe of its own and never
1518
1509
  shifts the alternation of the rows around it. */
1519
- [data-ui='table'][data-striped] [data-part='body'] > [data-part='detail'] {
1510
+ [data-ui-table][data-striped] [data-part-body] > [data-part-detail] {
1520
1511
  background-color: var(--_stripe);
1521
1512
  }
1522
1513
 
1523
1514
  /**
1524
1515
  * ── Empty and loading ──────────────────────────────────────────────────
1525
1516
  */
1526
- [data-ui='table'] [data-part='empty'] {
1517
+ [data-ui-table] [data-part-empty] {
1527
1518
  color: var(--_muted);
1528
1519
  padding-block: var(--slotted-space-9, 2rem);
1529
1520
  padding-inline: var(--_pad-inline);
@@ -1533,7 +1524,7 @@
1533
1524
  /* The skeleton rows of a first load. The shapes are `skeleton`'s own; what
1534
1525
  this family supplies is the row that holds them, so the table's shape is
1535
1526
  visible before its content arrives. */
1536
- [data-ui='table'] [data-part='loader'] > [data-part='row'] > * {
1527
+ [data-ui-table] [data-part-loader] > [data-part-row] > * {
1537
1528
  padding-block: var(--_pad-block);
1538
1529
  padding-inline: var(--_pad-inline);
1539
1530
  }
@@ -1543,7 +1534,7 @@
1543
1534
  * body dims and nothing moves: the column widths are the table's, the scroll
1544
1535
  * position is the reader's, and swapping rows for skeletons would take both.
1545
1536
  */
1546
- [data-ui='table'][data-loading] [data-part='body'] {
1537
+ [data-ui-table][data-loading] [data-part-body] {
1547
1538
  opacity: 0.55;
1548
1539
  transition: opacity var(--slotted-control-transition-duration, var(--slotted-duration-short))
1549
1540
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
@@ -1558,7 +1549,7 @@
1558
1549
  * kind of boundary — and it is not the `footer`, which is a bar outside the
1559
1550
  * table holding the consumer's own controls.
1560
1551
  */
1561
- [data-ui='table'] [data-part='summary'] > [data-part='row'] > * {
1552
+ [data-ui-table] [data-part-summary] > [data-part-row] > * {
1562
1553
  background-color: var(--_head-surface);
1563
1554
  border-block-start: var(--_rule-width) solid var(--_rule-strong);
1564
1555
  font-weight: var(--slotted-font-weight-medium, 500);
@@ -1566,7 +1557,7 @@
1566
1557
  padding-inline: var(--_pad-inline);
1567
1558
  }
1568
1559
 
1569
- [data-ui='table'][data-variant='plain'] [data-part='summary'] > [data-part='row'] > * {
1560
+ [data-ui-table][data-variant='plain'] [data-part-summary] > [data-part-row] > * {
1570
1561
  background-color: transparent;
1571
1562
  }
1572
1563
 
@@ -1582,7 +1573,7 @@
1582
1573
  * a count, a bulk-action bar. The family draws the rule above it and the
1583
1574
  * inset around it, and nothing else.
1584
1575
  */
1585
- [data-ui='table'] [data-part='footer'] {
1576
+ [data-ui-table] [data-part-footer] {
1586
1577
  align-items: center;
1587
1578
  border-block-start: var(--_rule-width) solid var(--_rule);
1588
1579
  display: flex;
@@ -1604,7 +1595,7 @@
1604
1595
  * So the bar states the room instead of asking for it, and a control that
1605
1596
  * wants to sit at the trailing edge justifies itself there.
1606
1597
  */
1607
- [data-ui='table'] [data-part='footer'] > :last-child {
1598
+ [data-ui-table] [data-part-footer] > :last-child {
1608
1599
  flex: 1 1 auto;
1609
1600
  /* And it aligns its own content to the trailing edge, which is where a
1610
1601
  listing screen puts its paging control. The rule is structural rather
@@ -1621,15 +1612,15 @@
1621
1612
  * repeats at the top of every printed page.
1622
1613
  */
1623
1614
  @media print {
1624
- [data-ui='table'] [data-part='scroll'] {
1615
+ [data-ui-table] [data-part-scroll] {
1625
1616
  max-block-size: none;
1626
1617
  overflow: visible;
1627
1618
  }
1628
1619
 
1629
- [data-ui='table'][data-sticky-header] [data-part='column-header'],
1630
- [data-ui='table'][data-sticky-header] [data-part='head'] [data-part='selection'],
1631
- [data-ui='table'][data-sticky-footer] [data-part='summary'] > [data-part='row'] > *,
1632
- [data-ui='table'] [data-sticky] {
1620
+ [data-ui-table][data-sticky-header] [data-part-column-header],
1621
+ [data-ui-table][data-sticky-header] [data-part-head] [data-part-selection],
1622
+ [data-ui-table][data-sticky-footer] [data-part-summary] > [data-part-row] > *,
1623
+ [data-ui-table] [data-sticky] {
1633
1624
  position: static;
1634
1625
  }
1635
1626
  }