@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
package/src/list/list.css CHANGED
@@ -3,7 +3,7 @@
3
3
  * ── The set ────────────────────────────────────────────────────────────
4
4
  *
5
5
  * A vertical run of related rows. The rows are `list-item`, a family of its
6
- * own, and **no selector here reaches `[data-ui='list-item']`** — the rule
6
+ * own, and **no selector here reaches `[data-ui-list-item]`** — the rule
7
7
  * `accordion` and `collapsible` set for the same relationship. What the set
8
8
  * decides it hands to each row through the binding, as a `data-` attribute
9
9
  * the row's own stylesheet reads.
@@ -19,8 +19,8 @@
19
19
  * here and on `section-list`, which is what Safari and VoiceOver need once
20
20
  * the marker is removed.
21
21
  */
22
- [data-ui='list'][data-part='root'],
23
- [data-ui='list'] [data-part='section-list'] {
22
+ [data-ui-list][data-part-root],
23
+ [data-ui-list] [data-part-section-list] {
24
24
  /* The row's own number. The set opens the count; each group opens its own,
25
25
  so a numbered list of groups restarts rather than running through. */
26
26
  counter-reset: slotted-list-item;
@@ -37,7 +37,7 @@
37
37
  padding-inline: 0;
38
38
  }
39
39
 
40
- [data-ui='list'][data-part='root'] {
40
+ [data-ui-list][data-part-root] {
41
41
  /* The distance between rows, and it is spent only by `separated`. The other
42
42
  three variants separate rows with a line or with nothing, so a gap there
43
43
  would be space the reader cannot account for. */
@@ -79,7 +79,7 @@
79
79
  * roomy settings list stand on the same page without either of them lying
80
80
  * about the density.
81
81
  */
82
- [data-ui='list'][data-part='root'][data-size='sm'] {
82
+ [data-ui-list][data-part-root][data-size='sm'] {
83
83
  --_gap: var(--slotted-list-gap-sm, var(--slotted-space-2, 0.25rem));
84
84
  --_section-inset-block: var(
85
85
  --slotted-list-section-padding-block-sm,
@@ -92,7 +92,7 @@
92
92
  --_empty-inset: var(--slotted-list-empty-padding-sm, var(--slotted-space-6, 1rem));
93
93
  }
94
94
 
95
- [data-ui='list'][data-part='root'][data-size='lg'] {
95
+ [data-ui-list][data-part-root][data-size='lg'] {
96
96
  --_gap: var(--slotted-list-gap-lg, var(--slotted-space-4, 0.5rem));
97
97
  --_section-inset-block: var(
98
98
  --slotted-list-section-padding-block-lg,
@@ -115,7 +115,7 @@
115
115
  *
116
116
  * `plain` and `ruled` draw nothing on the set.
117
117
  */
118
- [data-ui='list'][data-part='root'][data-variant='framed'] {
118
+ [data-ui-list][data-part-root][data-variant='framed'] {
119
119
  background-color: var(--_surface);
120
120
  border: var(--_frame-width) solid var(--_frame-color);
121
121
  border-radius: var(--_frame-radius);
@@ -125,7 +125,7 @@
125
125
  overflow: clip;
126
126
  }
127
127
 
128
- [data-ui='list'][data-part='root'][data-variant='separated'] {
128
+ [data-ui-list][data-part-root][data-variant='separated'] {
129
129
  row-gap: var(--_gap);
130
130
  }
131
131
 
@@ -135,7 +135,7 @@
135
135
  * React Aria each leave the heading loose among the rows instead, so a reader
136
136
  * hears a heading inside a set rather than a set with a name.
137
137
  */
138
- [data-ui='list'] [data-part='section'] {
138
+ [data-ui-list] [data-part-section] {
139
139
  display: flex;
140
140
  flex-direction: column;
141
141
  min-inline-size: 0;
@@ -143,8 +143,8 @@
143
143
 
144
144
  /* A separated set gaps its groups too, and a group gaps its own rows. Both
145
145
  read the one distance the root declared. */
146
- [data-ui='list'][data-variant='separated'] [data-part='section'],
147
- [data-ui='list'][data-variant='separated'] [data-part='section-list'] {
146
+ [data-ui-list][data-variant='separated'] [data-part-section],
147
+ [data-ui-list][data-variant='separated'] [data-part-section-list] {
148
148
  row-gap: var(--_gap);
149
149
  }
150
150
 
@@ -153,7 +153,7 @@
153
153
  * titles under it stand in one column, which is the alignment that makes a
154
154
  * grouped list read as one list rather than as several.
155
155
  */
156
- [data-ui='list'] [data-part='section-label'] {
156
+ [data-ui-list] [data-part-section-label] {
157
157
  color: var(--_section-color);
158
158
  font-size: var(--_section-font-size);
159
159
  font-weight: var(--_section-weight);
@@ -178,8 +178,8 @@
178
178
  * `disableGutters` leaves out: it removes the padding and leaves the line
179
179
  * inset, so a flush list draws a rule stopping short of the box it is in.
180
180
  */
181
- [data-ui='list'][data-inset] [data-part='section-label'],
182
- [data-ui='list'][data-inset] [data-part='empty'] {
181
+ [data-ui-list][data-inset] [data-part-section-label],
182
+ [data-ui-list][data-inset] [data-part-empty] {
183
183
  padding-inline: 0;
184
184
  }
185
185
 
@@ -195,14 +195,14 @@
195
195
  */
196
196
  /* A heading with an end sets the name at the start and the end content on
197
197
  the same line, at the end. */
198
- [data-ui='list'] [data-part='section-label']:has(> [data-part='section-end']) {
198
+ [data-ui-list] [data-part-section-label]:has(> [data-part-section-end]) {
199
199
  align-items: baseline;
200
200
  display: flex;
201
201
  gap: var(--slotted-space-4, 0.5rem);
202
202
  justify-content: space-between;
203
203
  }
204
204
 
205
- [data-ui='list'] [data-part='section-end'] {
205
+ [data-ui-list] [data-part-section-end] {
206
206
  flex: none;
207
207
  font-variant-numeric: tabular-nums;
208
208
  white-space: nowrap;
@@ -213,14 +213,14 @@
213
213
  * — a day of a phone list with its balance at the end. The sticky ground is
214
214
  * still the set's surface, so the rows passing under it are covered.
215
215
  */
216
- [data-ui='list'] [data-part='section-label'][data-variant='ruled'] {
216
+ [data-ui-list] [data-part-section-label][data-variant='ruled'] {
217
217
  border-block-end: var(--slotted-border-width-thin, 1px) solid
218
218
  var(--slotted-list-section-rule-color, var(--slotted-border-subtle, GrayText));
219
219
  color: var(--slotted-list-section-ruled-color, var(--slotted-text, CanvasText));
220
220
  font-weight: var(--slotted-font-weight-medium, 500);
221
221
  }
222
222
 
223
- [data-ui='list'] [data-part='section-label'][data-sticky] {
223
+ [data-ui-list] [data-part-section-label][data-sticky] {
224
224
  background-color: var(--_surface);
225
225
  inset-block-start: 0;
226
226
  position: sticky;
@@ -236,7 +236,7 @@
236
236
  * The family supplies the box, the height and the muted ink. The words are
237
237
  * the page's, and `result-state` is what goes in here.
238
238
  */
239
- [data-ui='list'] [data-part='empty'] {
239
+ [data-ui-list] [data-part-empty] {
240
240
  align-items: center;
241
241
  color: var(--_empty-color);
242
242
  display: flex;
@@ -261,7 +261,7 @@
261
261
  * loading panel. What is left for the set is the pointer, which is the one
262
262
  * signal that belongs to the box rather than to its content.
263
263
  */
264
- [data-ui='list'][data-part='root'][data-loading] {
264
+ [data-ui-list][data-part-root][data-loading] {
265
265
  cursor: progress;
266
266
  }
267
267
  }
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * One entry of a `list`. The set decides four things — variant, size, marker
6
6
  * and inset — and hands each one down through the binding as a `data-`
7
- * attribute this sheet reads. **No selector here reaches `[data-ui='list']`,
7
+ * attribute this sheet reads. **No selector here reaches `[data-ui-list]`,
8
8
  * and none there reaches this family**, which is the rule `accordion` and
9
9
  * `collapsible` set for the same relationship.
10
10
  *
@@ -28,7 +28,7 @@
28
28
  * each part on the element the page wrote and React renders it as that
29
29
  * element, so the chain in the selectors is the chain in the document.
30
30
  */
31
- [data-ui='list-item'][data-part='root'] {
31
+ [data-ui-list-item][data-part-root] {
32
32
  /* Geometry. Every value is the control scale's, because a row is a
33
33
  control-sized thing: one theme decision retunes the rows, the buttons and
34
34
  the fields together, and `@media (pointer: coarse)` grows all three at
@@ -157,7 +157,7 @@
157
157
  * arrives inside every control token above; the two never multiply, because
158
158
  * this family reads the density-varying token and states no second scale.
159
159
  */
160
- [data-ui='list-item'][data-size='sm'] {
160
+ [data-ui-list-item][data-size='sm'] {
161
161
  --_min-block: var(
162
162
  --slotted-list-item-min-block-size-sm,
163
163
  var(--slotted-control-height-sm, 30px)
@@ -182,7 +182,7 @@
182
182
  );
183
183
  }
184
184
 
185
- [data-ui='list-item'][data-size='lg'] {
185
+ [data-ui-list-item][data-size='lg'] {
186
186
  --_min-block: var(
187
187
  --slotted-list-item-min-block-size-lg,
188
188
  var(--slotted-control-height-lg, 38px)
@@ -220,7 +220,7 @@
220
220
  * never fills a resting row, because a list of rows each filled with a tone
221
221
  * is a list nobody can read. The current row is not the tone's to move.
222
222
  */
223
- [data-ui='list-item'][data-tone='accent'] {
223
+ [data-ui-list-item][data-tone='accent'] {
224
224
  --_text: var(--slotted-tone-accent-text, CanvasText);
225
225
  --_subtle-hover: var(--slotted-tone-accent-subtle-hover, ButtonFace);
226
226
  --_subtle-active: var(--slotted-tone-accent-subtle-active, ButtonFace);
@@ -234,7 +234,7 @@
234
234
  --_selected-active: var(--_subtle-active);
235
235
  }
236
236
 
237
- [data-ui='list-item'][data-tone='success'] {
237
+ [data-ui-list-item][data-tone='success'] {
238
238
  --_text: var(--slotted-tone-success-text, CanvasText);
239
239
  --_subtle-hover: var(--slotted-tone-success-subtle-hover, ButtonFace);
240
240
  --_subtle-active: var(--slotted-tone-success-subtle-active, ButtonFace);
@@ -248,7 +248,7 @@
248
248
  --_selected-active: var(--_subtle-active);
249
249
  }
250
250
 
251
- [data-ui='list-item'][data-tone='warning'] {
251
+ [data-ui-list-item][data-tone='warning'] {
252
252
  --_text: var(--slotted-tone-warning-text, CanvasText);
253
253
  --_subtle-hover: var(--slotted-tone-warning-subtle-hover, ButtonFace);
254
254
  --_subtle-active: var(--slotted-tone-warning-subtle-active, ButtonFace);
@@ -262,7 +262,7 @@
262
262
  --_selected-active: var(--_subtle-active);
263
263
  }
264
264
 
265
- [data-ui='list-item'][data-tone='danger'] {
265
+ [data-ui-list-item][data-tone='danger'] {
266
266
  --_text: var(--slotted-tone-danger-text, CanvasText);
267
267
  --_subtle-hover: var(--slotted-tone-danger-subtle-hover, ButtonFace);
268
268
  --_subtle-active: var(--slotted-tone-danger-subtle-active, ButtonFace);
@@ -293,8 +293,8 @@
293
293
  * sits on the title's line in a row of three lines instead of floating in the
294
294
  * middle of the block.
295
295
  */
296
- [data-ui='list-item'][data-marker='bullet'] > [data-part='marker'],
297
- [data-ui='list-item'][data-marker='number']::before {
296
+ [data-ui-list-item][data-marker='bullet'] > [data-part-marker],
297
+ [data-ui-list-item][data-marker='number']::before {
298
298
  /* The mark sits on the title's first line and never in the middle of the
299
299
  block, whatever `align` says. `align` is about the leading visual — an
300
300
  avatar beside three lines of text belongs with the title or with the
@@ -329,7 +329,7 @@
329
329
  padding-block-start: var(--_pad-block);
330
330
  }
331
331
 
332
- [data-ui='list-item'][data-marker='bullet'] > [data-part='marker'] {
332
+ [data-ui-list-item][data-marker='bullet'] > [data-part-marker] {
333
333
  --slotted-icon-size: var(--_marker-size);
334
334
  justify-content: center;
335
335
  }
@@ -338,27 +338,27 @@
338
338
  middle of the part, because the part is one line and its padding tall and
339
339
  the dot has no baseline to sit on. Half the line less half the dot, so the
340
340
  dot stands between the baseline and the cap line rather than on either. */
341
- [data-ui='list-item'][data-marker='bullet'] > [data-part='marker'] > [data-ui='icon'] {
341
+ [data-ui-list-item][data-marker='bullet'] > [data-part-marker] > [data-ui-icon] {
342
342
  margin-block-start: calc(
343
343
  var(--_font-size) * var(--slotted-line-height-md, 1.5) * 0.5 - var(--_marker-size) * 0.5
344
344
  );
345
345
  }
346
346
 
347
- [data-ui='list-item'][data-marker='number']::before {
347
+ [data-ui-list-item][data-marker='number']::before {
348
348
  content: counter(slotted-list-item) '.';
349
349
  justify-content: end;
350
350
  }
351
351
 
352
352
  /* The mark already stands in its own gutter, so the box beside it gives up
353
353
  the padding it would otherwise repeat. */
354
- [data-ui='list-item']:is([data-marker='bullet'], [data-marker='number']) > [data-part='content'] {
354
+ [data-ui-list-item]:is([data-marker='bullet'], [data-marker='number']) > [data-part-content] {
355
355
  padding-inline-start: 0;
356
356
  }
357
357
 
358
358
  /* `inset` is the set's answer for a list inside a box that already pads its
359
359
  own content. The mark gives up its gutter with everything else. */
360
- [data-ui='list-item'][data-inset][data-marker='bullet'] > [data-part='marker'],
361
- [data-ui='list-item'][data-inset][data-marker='number']::before {
360
+ [data-ui-list-item][data-inset][data-marker='bullet'] > [data-part-marker],
361
+ [data-ui-list-item][data-inset][data-marker='number']::before {
362
362
  margin-inline-start: 0;
363
363
  }
364
364
 
@@ -375,7 +375,7 @@
375
375
  * consumer choosing between the three chooses an accessibility tree, never a
376
376
  * different picture.
377
377
  */
378
- [data-ui='list-item'] > [data-part='content'] {
378
+ [data-ui-list-item] > [data-part-content] {
379
379
  appearance: none;
380
380
  background-color: transparent;
381
381
  border: none;
@@ -420,20 +420,20 @@
420
420
  * `framed` clips its own corners at the set, so the first and last rows are
421
421
  * rounded by the box rather than by themselves.
422
422
  */
423
- [data-ui='list-item']:is([data-variant='ruled'], [data-variant='framed']) {
423
+ [data-ui-list-item]:is([data-variant='ruled'], [data-variant='framed']) {
424
424
  border-radius: 0;
425
425
  }
426
426
 
427
427
  /* A row whose whole box resolves somewhere, or runs a command, is a target
428
428
  and the pointer says so. A row that is only read keeps the arrow. */
429
- [data-ui='list-item']:not([data-disabled]) > :is(a, button)[data-part='content']:not(:disabled) {
429
+ [data-ui-list-item]:not([data-disabled]) > :is(a, button)[data-part-content]:not(:disabled) {
430
430
  cursor: pointer;
431
431
  }
432
432
 
433
433
  /* `inset` takes the row's inline padding away so a list inside a padded box
434
434
  lines its titles up with the box. The fill and the rule still run edge to
435
435
  edge, which is the half MUI's `disableGutters` leaves out. */
436
- [data-ui='list-item'][data-inset] > [data-part='content'] {
436
+ [data-ui-list-item][data-inset] > [data-part-content] {
437
437
  padding-inline: 0;
438
438
  }
439
439
 
@@ -443,11 +443,11 @@
443
443
  * the same decision `alignItems`; Angular Material derives it from counting
444
444
  * the lines, which is a count a translated string can change.
445
445
  */
446
- [data-ui='list-item'][data-align='start'] > [data-part='content'] {
446
+ [data-ui-list-item][data-align='start'] > [data-part-content] {
447
447
  align-items: start;
448
448
  }
449
449
 
450
- [data-ui='list-item'] > [data-part='content'] > [data-part='start'] {
450
+ [data-ui-list-item] > [data-part-content] > [data-part-start] {
451
451
  align-items: center;
452
452
  color: var(--_text);
453
453
  display: flex;
@@ -472,7 +472,7 @@
472
472
  * chooser is (CK1); the gap beside it is the row's control gap, the same
473
473
  * distance the chooser puts between its box and its own label.
474
474
  */
475
- [data-ui='list-item'] > [data-part='content'] > [data-part='start']:has(> [data-ui='checkbox']) {
475
+ [data-ui-list-item] > [data-part-content] > [data-part-start]:has(> [data-ui-checkbox]) {
476
476
  align-items: start;
477
477
  inline-size: var(--_control-size);
478
478
  min-block-size: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));
@@ -480,7 +480,7 @@
480
480
 
481
481
  /* A leading visual beside a three-line row sits on the title's line, and the
482
482
  line is the box's own, not the block's. */
483
- [data-ui='list-item'][data-align='start'] > [data-part='content'] > [data-part='start'] {
483
+ [data-ui-list-item][data-align='start'] > [data-part-content] > [data-part-start] {
484
484
  min-block-size: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));
485
485
  }
486
486
 
@@ -490,7 +490,7 @@
490
490
  * word, so a title that is one unbroken token — a URL, a commit hash — pushes
491
491
  * the metadata out of the row instead of breaking inside it.
492
492
  */
493
- [data-ui='list-item'] > [data-part='content'] > [data-part='body'] {
493
+ [data-ui-list-item] > [data-part-content] > [data-part-body] {
494
494
  display: flex;
495
495
  flex-direction: column;
496
496
  grid-area: body;
@@ -498,7 +498,7 @@
498
498
  row-gap: var(--slotted-list-item-body-gap, var(--slotted-space-1, 0.125rem));
499
499
  }
500
500
 
501
- [data-ui='list-item'] > [data-part='content'] > [data-part='body'] > [data-part='label'] {
501
+ [data-ui-list-item] > [data-part-content] > [data-part-body] > [data-part-label] {
502
502
  color: inherit;
503
503
  font-size: var(--_font-size);
504
504
  font-weight: var(--slotted-list-item-font-weight, var(--slotted-font-weight-regular, 400));
@@ -514,7 +514,7 @@
514
514
  unicode-bidi: plaintext;
515
515
  }
516
516
 
517
- [data-ui='list-item'] > [data-part='content'] > [data-part='body'] > [data-part='description'] {
517
+ [data-ui-list-item] > [data-part-content] > [data-part-body] > [data-part-description] {
518
518
  color: var(--_muted);
519
519
  font-size: var(--slotted-list-item-description-font-size, var(--slotted-font-size-xs, 0.75rem));
520
520
  line-height: var(--slotted-line-height-sm, 1.45);
@@ -533,10 +533,10 @@
533
533
  * truncated string is still readable to assistive technology and still
534
534
  * reachable in full when the row is opened.
535
535
  */
536
- [data-ui='list-item'][data-truncate]
537
- > [data-part='content']
538
- > [data-part='body']
539
- > :is([data-part='label'], [data-part='description']) {
536
+ [data-ui-list-item][data-truncate]
537
+ > [data-part-content]
538
+ > [data-part-body]
539
+ > :is([data-part-label], [data-part-description]) {
540
540
  overflow: hidden;
541
541
  overflow-wrap: normal;
542
542
  text-overflow: ellipsis;
@@ -549,7 +549,7 @@
549
549
  * reader and part of its target for a pointer. Anything that acts is
550
550
  * `actions` instead.
551
551
  */
552
- [data-ui='list-item'] > [data-part='content'] > [data-part='end'] {
552
+ [data-ui-list-item] > [data-part-content] > [data-part-end] {
553
553
  align-items: center;
554
554
  color: var(--_muted);
555
555
  display: flex;
@@ -571,7 +571,7 @@
571
571
  * The box is above the row's own fill, so a control here is operable on a row
572
572
  * whose whole surface resolves somewhere else.
573
573
  */
574
- [data-ui='list-item'] > [data-part='actions'] {
574
+ [data-ui-list-item] > [data-part-actions] {
575
575
  align-items: center;
576
576
  /* The box counts its own inset (LI4). Below the breakpoint it takes the
577
577
  whole line and the row's inline inset on both sides, and read as
@@ -585,7 +585,7 @@
585
585
  position: relative;
586
586
  }
587
587
 
588
- [data-ui='list-item'][data-inset] > [data-part='actions'] {
588
+ [data-ui-list-item][data-inset] > [data-part-actions] {
589
589
  padding-inline-end: 0;
590
590
  }
591
591
 
@@ -595,7 +595,7 @@
595
595
  * the title's line, a row of two lines put its badge and its delete control
596
596
  * on two different lines — the one thing a trailing pair must not do.
597
597
  */
598
- [data-ui='list-item'][data-align='start'] > [data-part='actions'] {
598
+ [data-ui-list-item][data-align='start'] > [data-part-actions] {
599
599
  align-items: start;
600
600
  padding-block-start: var(--_pad-block);
601
601
  }
@@ -616,7 +616,7 @@
616
616
  * `framed` rules its rows exactly as `ruled` does; what it adds is the box
617
617
  * around them, and that box belongs to the set.
618
618
  */
619
- [data-ui='list-item']:is([data-variant='ruled'], [data-variant='framed']):not(:first-child) {
619
+ [data-ui-list-item]:is([data-variant='ruled'], [data-variant='framed']):not(:first-child) {
620
620
  /* A shadow rather than a border, and the reason is the pointer. A border is
621
621
  part of the row's box and outside the box that paints hover, so the top
622
622
  pixel of every ruled row answered nothing: the reader saw a one-pixel
@@ -636,7 +636,7 @@
636
636
  * drawn once, at row scale, so a list of cards and a list of rows are the
637
637
  * same family in two arrangements rather than two families.
638
638
  */
639
- [data-ui='list-item'][data-variant='separated'] {
639
+ [data-ui-list-item][data-variant='separated'] {
640
640
  --_fill: var(--slotted-list-item-background, var(--slotted-surface-raised, Canvas));
641
641
 
642
642
  border: var(--_rule-width) solid var(--_rule);
@@ -645,7 +645,7 @@
645
645
  /* The row's own corners clip the fill its content paints, so a hover wash
646
646
  inside a rounded row does not square off its edges. `clip` rather than
647
647
  `hidden`: a row is not a scroll container, and `hidden` would make it one. */
648
- [data-ui='list-item'][data-variant='separated'] {
648
+ [data-ui-list-item][data-variant='separated'] {
649
649
  overflow: clip;
650
650
  }
651
651
 
@@ -661,14 +661,14 @@
661
661
  * nothing to say about being pointed at, and washing it would promise an
662
662
  * interaction that never arrives.
663
663
  */
664
- [data-ui='list-item']:not([data-disabled]):not([data-loading]):has(
665
- > :is(a, button)[data-part='content']:not(:disabled):hover
664
+ [data-ui-list-item]:not([data-disabled]):not([data-loading]):has(
665
+ > :is(a, button)[data-part-content]:not(:disabled):hover
666
666
  ) {
667
667
  --_fill: var(--_hover);
668
668
  }
669
669
 
670
- [data-ui='list-item']:not([data-disabled]):not([data-loading]):has(
671
- > :is(a, button)[data-part='content']:not(:disabled):active
670
+ [data-ui-list-item]:not([data-disabled]):not([data-loading]):has(
671
+ > :is(a, button)[data-part-content]:not(:disabled):active
672
672
  ) {
673
673
  --_fill: var(--_active);
674
674
  }
@@ -679,7 +679,7 @@
679
679
  * and on the last row it is drawn outside the page; a negative offset keeps
680
680
  * the whole ring on the row it is about.
681
681
  */
682
- [data-ui='list-item'] > [data-part='content']:focus-visible {
682
+ [data-ui-list-item] > [data-part-content]:focus-visible {
683
683
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
684
684
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
685
685
  }
@@ -694,7 +694,7 @@
694
694
  * announce for itself, so this is also the only one of the two the row says
695
695
  * out loud.
696
696
  */
697
- [data-ui='list-item'][data-current] {
697
+ [data-ui-list-item][data-current] {
698
698
  --_fill: var(--_current-surface);
699
699
  /* The edge is an inset shadow rather than a border, so the state changes
700
700
  no measurement and moves no text. It is what carries the state in
@@ -708,7 +708,7 @@
708
708
  * and the control the page puts in `start` — a `checkbox` — is what announces
709
709
  * it. `card` reached the same conclusion for the same reason.
710
710
  */
711
- [data-ui='list-item'][data-selected] {
711
+ [data-ui-list-item][data-selected] {
712
712
  /* A selected row that is hovered has to darken, not lighten. The resting
713
713
  fill is already the tone's subtle step, so the two pointer states move
714
714
  one step along the same subtle pair rather than staying where an
@@ -718,7 +718,7 @@
718
718
  --_active: var(--_selected-active);
719
719
  }
720
720
 
721
- [data-ui='list-item'][data-selected] {
721
+ [data-ui-list-item][data-selected] {
722
722
  --_fill: var(--_selected-surface);
723
723
  --_edge-shadow: inset 0 0 0 var(--_rule-width) var(--_selected-edge);
724
724
  }
@@ -732,8 +732,8 @@
732
732
  * and a rule drawn above the edge made its top two pixels in `high-contrast`,
733
733
  * where both are black.
734
734
  */
735
- [data-ui='list-item']:is([data-selected], [data-current]):not(:first-child),
736
- [data-ui='list-item']:is([data-selected], [data-current]) + [data-ui='list-item'] {
735
+ [data-ui-list-item]:is([data-selected], [data-current]):not(:first-child),
736
+ [data-ui-list-item]:is([data-selected], [data-current]) + [data-ui-list-item] {
737
737
  --_rule-shadow: 0 0 0 0 transparent;
738
738
  }
739
739
 
@@ -742,14 +742,14 @@
742
742
  them; both edges drawn made that line two pixels. The offsets are
743
743
  physical because `box-shadow` has no logical form, and the two sides are
744
744
  the same width, so the mirrored row is the same picture. */
745
- [data-ui='list-item'][data-selected] + [data-ui='list-item'][data-selected] {
745
+ [data-ui-list-item][data-selected] + [data-ui-list-item][data-selected] {
746
746
  --_edge-shadow:
747
747
  inset 0 calc(var(--_rule-width) * -1) 0 0 var(--_selected-edge),
748
748
  inset var(--_rule-width) 0 0 0 var(--_selected-edge),
749
749
  inset calc(var(--_rule-width) * -1) 0 0 0 var(--_selected-edge);
750
750
  }
751
751
 
752
- [data-ui='list-item'][data-selected] > [data-part='content'] {
752
+ [data-ui-list-item][data-selected] > [data-part-content] {
753
753
  color: var(--_selected-text);
754
754
  font-weight: var(
755
755
  --slotted-list-item-font-weight-selected,
@@ -757,7 +757,7 @@
757
757
  );
758
758
  }
759
759
 
760
- [data-ui='list-item'][data-current] > [data-part='content'] {
760
+ [data-ui-list-item][data-current] > [data-part-content] {
761
761
  font-weight: var(
762
762
  --slotted-list-item-font-weight-current,
763
763
  var(--slotted-font-weight-medium, 500)
@@ -776,14 +776,14 @@
776
776
  * No placeholder is drawn. `skeleton` owns placeholder geometry, and a second
777
777
  * answer to that question is what `collapsible` already refused.
778
778
  */
779
- [data-ui='list-item'][data-loading] {
779
+ [data-ui-list-item][data-loading] {
780
780
  /* One retarget rather than a rule per part: the title, the description, the
781
781
  metadata and the mark all read the same two custom properties, so the
782
782
  whole row recedes together and nothing changes size. */
783
783
  --_text: var(--_muted);
784
784
  }
785
785
 
786
- [data-ui='list-item'][data-loading] > [data-part='content'] {
786
+ [data-ui-list-item][data-loading] > [data-part-content] {
787
787
  cursor: progress;
788
788
  }
789
789
 
@@ -799,7 +799,7 @@
799
799
  * control can refuse an interaction, which is the rule `card` states for the
800
800
  * same shape.
801
801
  */
802
- [data-ui='list-item'][data-disabled] {
802
+ [data-ui-list-item][data-disabled] {
803
803
  /* Both, stated from one alias rather than one pointing at the other: a row
804
804
  that is loading retargets `--_text` at `--_muted`, and a disabled loading
805
805
  row would otherwise be a cycle CSS resolves by dropping both. Disabled is
@@ -812,7 +812,7 @@
812
812
  --_muted: var(--_disabled-ink);
813
813
  }
814
814
 
815
- [data-ui='list-item'][data-disabled] > [data-part='content'] {
815
+ [data-ui-list-item][data-disabled] > [data-part-content] {
816
816
  cursor: default;
817
817
  }
818
818
 
@@ -823,7 +823,7 @@
823
823
  * surface a selected row is filled with, so a disabled card and a selected
824
824
  * one were one rectangle told apart only by their edge.
825
825
  */
826
- [data-ui='list-item'][data-disabled][data-variant='separated'] {
826
+ [data-ui-list-item][data-disabled][data-variant='separated'] {
827
827
  --_fill: var(--slotted-surface-sunken, Canvas);
828
828
 
829
829
  border-color: var(--slotted-disabled-border, GrayText);
@@ -842,14 +842,14 @@
842
842
  * is invalid CSS — `docs/token-foundation.md` rule 4.
843
843
  */
844
844
  @container slotted-list-item (max-inline-size: 22rem) {
845
- [data-ui='list-item'] > [data-part='content'] {
845
+ [data-ui-list-item] > [data-part-content] {
846
846
  grid-template-areas:
847
847
  'start body'
848
848
  'start end';
849
849
  grid-template-columns: auto minmax(0, 1fr);
850
850
  }
851
851
 
852
- [data-ui='list-item'] > [data-part='content'] > [data-part='end'] {
852
+ [data-ui-list-item] > [data-part-content] > [data-part-end] {
853
853
  justify-content: start;
854
854
  margin-block-start: var(--slotted-list-item-body-gap, var(--slotted-space-1, 0.125rem));
855
855
  margin-inline-start: 0;
@@ -857,7 +857,7 @@
857
857
 
858
858
  /* The leading visual now spans two rows, so it stops being centred on the
859
859
  block and returns to the title's line. */
860
- [data-ui='list-item'] > [data-part='content'] > [data-part='start'] {
860
+ [data-ui-list-item] > [data-part-content] > [data-part-start] {
861
861
  align-self: start;
862
862
  min-block-size: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));
863
863
  }
@@ -871,14 +871,14 @@
871
871
  * They stay at the end of the row, where they were, and take the row's own
872
872
  * inline inset so they line up with the content above them.
873
873
  */
874
- [data-ui='list-item'] > [data-part='actions'] {
874
+ [data-ui-list-item] > [data-part-actions] {
875
875
  flex-basis: 100%;
876
876
  justify-content: flex-end;
877
877
  padding-block-end: var(--_pad-block);
878
878
  padding-inline: var(--_pad-inline);
879
879
  }
880
880
 
881
- [data-ui='list-item'][data-inset] > [data-part='actions'] {
881
+ [data-ui-list-item][data-inset] > [data-part-actions] {
882
882
  padding-inline: 0;
883
883
  }
884
884
 
@@ -891,13 +891,13 @@
891
891
  * keeps the line it had; a target that carries a word still takes its
892
892
  * own, because a word is what does not fit.
893
893
  */
894
- [data-ui='list-item'] > [data-part='actions']:not(:has(> :not([data-shape]))) {
894
+ [data-ui-list-item] > [data-part-actions]:not(:has(> :not([data-shape]))) {
895
895
  flex-basis: auto;
896
896
  padding-block-end: 0;
897
897
  padding-inline: 0 var(--_pad-inline);
898
898
  }
899
899
 
900
- [data-ui='list-item'][data-inset] > [data-part='actions']:not(:has(> :not([data-shape]))) {
900
+ [data-ui-list-item][data-inset] > [data-part-actions]:not(:has(> :not([data-shape]))) {
901
901
  padding-inline-end: 0;
902
902
  }
903
903
  }
@@ -916,11 +916,11 @@
916
916
  * resting one would be the same rectangle. Selection is the accent state,
917
917
  * and the system's own selected pair is what says so.
918
918
  */
919
- [data-ui='list-item'][data-selected] {
919
+ [data-ui-list-item][data-selected] {
920
920
  background-color: Highlight;
921
921
  }
922
922
 
923
- [data-ui='list-item'][data-selected] > [data-part='content'] {
923
+ [data-ui-list-item][data-selected] > [data-part-content] {
924
924
  color: HighlightText;
925
925
  }
926
926
 
@@ -929,7 +929,7 @@
929
929
  * colour, drawn inward so it changes no measurement: the inset shadow that
930
930
  * says it elsewhere is decoration the theme cannot reach (R1).
931
931
  */
932
- [data-ui='list-item'][data-current]:not([data-selected]) {
932
+ [data-ui-list-item][data-current]:not([data-selected]) {
933
933
  outline: var(--slotted-border-width-thin, 1px) solid Highlight;
934
934
  outline-offset: calc(-1 * var(--slotted-border-width-thin, 1px));
935
935
  }