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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +35 -42
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +149 -68
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +79 -74
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +103 -90
  36. package/src/command-palette/command-palette.tokens.json +1 -0
  37. package/src/container/container.css +24 -24
  38. package/src/context-menu/context-menu.css +8 -8
  39. package/src/currency-field/currency-field.css +210 -88
  40. package/src/currency-field/currency-field.tokens.json +13 -0
  41. package/src/dashboard-grid/dashboard-grid.css +148 -116
  42. package/src/data-grid/data-grid.css +535 -470
  43. package/src/data-grid/data-grid.tokens.json +4 -0
  44. package/src/data-list/data-list.css +81 -70
  45. package/src/data-list/data-list.tokens.json +2 -1
  46. package/src/date-field/date-field.css +55 -52
  47. package/src/date-field/date-field.tokens.json +1 -0
  48. package/src/date-picker/date-picker.css +40 -42
  49. package/src/date-range-picker/date-range-picker.css +114 -118
  50. package/src/datetime-field/datetime-field.css +78 -80
  51. package/src/datetime-field/datetime-field.tokens.json +1 -0
  52. package/src/datetime-picker/datetime-picker.css +61 -63
  53. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  54. package/src/description-list/description-list.css +61 -64
  55. package/src/detail-panel/detail-panel.css +86 -71
  56. package/src/detail-panel/detail-panel.tokens.json +2 -0
  57. package/src/dialog/dialog.css +372 -153
  58. package/src/dialog/dialog.tokens.json +6 -0
  59. package/src/divider/divider.css +18 -18
  60. package/src/drawer/drawer.css +205 -210
  61. package/src/drawer/drawer.tokens.json +1 -0
  62. package/src/entity-picker/entity-picker.css +238 -241
  63. package/src/entity-picker/entity-picker.tokens.json +1 -0
  64. package/src/event-calendar/event-calendar.css +343 -385
  65. package/src/field/field.css +74 -78
  66. package/src/field-group/field-group.css +22 -25
  67. package/src/filter-bar/filter-bar.css +193 -209
  68. package/src/form/form.css +34 -24
  69. package/src/form/form.tokens.json +1 -0
  70. package/src/fullscreen/fullscreen.css +24 -25
  71. package/src/grid/grid.css +28 -28
  72. package/src/highlight/highlight.css +6 -6
  73. package/src/hover-card/hover-card.css +6 -6
  74. package/src/icon/icon.css +19 -15
  75. package/src/icon/icon.tokens.json +1 -0
  76. package/src/image/image.css +39 -39
  77. package/src/import-export-center/import-export-center.css +135 -156
  78. package/src/inline/inline.css +27 -27
  79. package/src/inline-message/inline-message.css +52 -28
  80. package/src/inline-message/inline-message.tokens.json +4 -0
  81. package/src/kbd/kbd.css +30 -26
  82. package/src/link/link.css +15 -15
  83. package/src/list/list.css +44 -17
  84. package/src/list/list.tokens.json +4 -0
  85. package/src/list-item/list-item.css +80 -66
  86. package/src/list-item/list-item.tokens.json +7 -0
  87. package/src/listbox/listbox.css +56 -59
  88. package/src/loading-overlay/loading-overlay.css +75 -92
  89. package/src/markdown/markdown.css +17 -17
  90. package/src/menu/menu.css +83 -63
  91. package/src/menubar/menubar.css +13 -13
  92. package/src/message/message.css +182 -202
  93. package/src/message/message.tokens.json +5 -0
  94. package/src/message-scroller/message-scroller.css +41 -42
  95. package/src/multi-select/multi-select.css +152 -145
  96. package/src/multi-select/multi-select.tokens.json +1 -0
  97. package/src/navigation-menu/navigation-menu.css +167 -188
  98. package/src/notification-center/notification-center.css +140 -148
  99. package/src/notification-center/notification-center.tokens.json +3 -0
  100. package/src/number-field/number-field.css +84 -83
  101. package/src/number-field/number-field.tokens.json +1 -0
  102. package/src/otp-input/otp-input.css +67 -57
  103. package/src/otp-input/otp-input.tokens.json +1 -0
  104. package/src/page/page.css +39 -23
  105. package/src/page/page.tokens.json +1 -0
  106. package/src/page-header/page-header.css +323 -283
  107. package/src/page-header/page-header.tokens.json +5 -0
  108. package/src/pagination/pagination.css +68 -72
  109. package/src/popover/popover.css +40 -49
  110. package/src/progress-indicator/progress-indicator.css +177 -120
  111. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  112. package/src/prompt-composer/prompt-composer.css +221 -102
  113. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  114. package/src/prose/prose.css +71 -75
  115. package/src/radio-group/radio-group.css +98 -103
  116. package/src/rating/rating.css +136 -132
  117. package/src/rating/rating.tokens.json +1 -0
  118. package/src/result-state/result-state.css +74 -77
  119. package/src/runtime-properties.mjs +2 -0
  120. package/src/saved-views/saved-views.css +41 -47
  121. package/src/scroll-area/scroll-area.css +39 -32
  122. package/src/section/section.css +161 -41
  123. package/src/section/section.tokens.json +7 -2
  124. package/src/segmented-control/segmented-control.css +254 -97
  125. package/src/segmented-control/segmented-control.tokens.json +15 -11
  126. package/src/select/select.css +118 -117
  127. package/src/select/select.tokens.json +1 -0
  128. package/src/side-navigation/side-navigation.css +179 -182
  129. package/src/side-navigation/side-navigation.tokens.json +1 -0
  130. package/src/skeleton/skeleton.css +47 -48
  131. package/src/slider/slider.css +86 -88
  132. package/src/sparkline/sparkline.css +62 -40
  133. package/src/sparkline/sparkline.tokens.json +2 -0
  134. package/src/spinner/spinner.css +83 -180
  135. package/src/spinner/spinner.tokens.json +0 -1
  136. package/src/split-button/split-button.css +30 -31
  137. package/src/split-button/split-button.tokens.json +1 -0
  138. package/src/splitter/splitter.css +35 -35
  139. package/src/stack/stack.css +24 -24
  140. package/src/stat-card/stat-card.css +341 -224
  141. package/src/stat-card/stat-card.tokens.json +3 -0
  142. package/src/status-indicator/status-indicator.css +28 -28
  143. package/src/stepper/stepper.css +58 -62
  144. package/src/switch/switch.css +86 -92
  145. package/src/table/table.css +310 -165
  146. package/src/table/table.tokens.json +6 -0
  147. package/src/table-of-contents/table-of-contents.css +51 -54
  148. package/src/tabs/tabs.css +337 -302
  149. package/src/tabs/tabs.tokens.json +8 -5
  150. package/src/tag/tag.css +79 -71
  151. package/src/tag/tag.tokens.json +9 -0
  152. package/src/tags-input/tags-input.css +145 -82
  153. package/src/tags-input/tags-input.tokens.json +7 -1
  154. package/src/text-field/text-field.css +132 -136
  155. package/src/text-field/text-field.tokens.json +1 -0
  156. package/src/textarea/textarea.css +31 -28
  157. package/src/textarea/textarea.tokens.json +1 -0
  158. package/src/time-field/time-field.css +72 -69
  159. package/src/time-field/time-field.tokens.json +1 -0
  160. package/src/time-picker/time-picker.css +56 -58
  161. package/src/time-range-picker/time-range-picker.css +126 -133
  162. package/src/timeline/timeline.css +254 -266
  163. package/src/timeline/timeline.tokens.json +5 -0
  164. package/src/toast/toast.css +108 -90
  165. package/src/toast/toast.tokens.json +6 -0
  166. package/src/toggle/toggle.css +62 -25
  167. package/src/toggle/toggle.tokens.json +8 -0
  168. package/src/toggle-group/toggle-group.css +106 -60
  169. package/src/toggle-group/toggle-group.tokens.json +10 -0
  170. package/src/toolbar/toolbar.css +30 -35
  171. package/src/tooltip/tooltip.css +26 -26
  172. package/src/top-navigation/top-navigation.css +243 -259
  173. package/src/tour/tour.css +51 -60
  174. package/src/transfer/transfer.css +160 -164
  175. package/src/tree/tree.css +103 -111
  176. package/src/typography/typography.css +40 -36
  177. package/src/typography/typography.tokens.json +1 -0
  178. package/src/upload/upload.css +224 -224
  179. package/src/visually-hidden/visually-hidden.css +1 -1
  180. package/src/wizard/wizard.css +185 -197
@@ -36,7 +36,7 @@
36
36
  * a drawer is the ordinary case, and a descendant rule would paint the inner
37
37
  * panel with the outer panel's geometry.
38
38
  */
39
- [data-ui='drawer'] {
39
+ [data-ui-drawer] {
40
40
  /**
41
41
  * The panel's resting measure, per size step. Five named steps rather than
42
42
  * the pixel string Ant and MUI both take: a theme retunes a step and cannot
@@ -47,7 +47,7 @@
47
47
  /**
48
48
  * What the panel actually measures. `--slotted-drawer-extent` is the one
49
49
  * name for it, and it is read from two places: an application setting one
50
- * measure for every drawer writes it on `[data-ui='drawer']`, and the
50
+ * measure for every drawer writes it on `[data-ui-drawer]`, and the
51
51
  * binding writes the length the reader dragged to as an inline custom
52
52
  * property on this element. Both are lengths, so the cascade decides
53
53
  * between them the way it decides everything else.
@@ -176,7 +176,7 @@
176
176
  }
177
177
 
178
178
  /** Leaving is shorter than arriving: a reader who has decided is waiting. */
179
- [data-ui='drawer']:not([data-open]) {
179
+ [data-ui-drawer]:not([data-open]) {
180
180
  --_slide: var(--slotted-duration-medium) var(--slotted-easing-exit);
181
181
  --_move: var(--slotted-duration-medium) var(--slotted-easing-exit);
182
182
  }
@@ -186,27 +186,27 @@
186
186
  * every pointer position would lag the hand by the whole duration, and a
187
187
  * bottom sheet the reader is pulling has to follow it.
188
188
  */
189
- [data-ui='drawer'][data-dragging] {
189
+ [data-ui-drawer][data-dragging] {
190
190
  --_move: var(--slotted-duration-instant) var(--slotted-easing-standard);
191
191
  }
192
192
 
193
- [data-ui='drawer'][data-size='sm'] {
193
+ [data-ui-drawer][data-size='sm'] {
194
194
  --_step: var(--slotted-drawer-extent-sm, 18rem);
195
195
  --_padding-inline: var(--slotted-space-6, 1rem);
196
196
  }
197
197
 
198
- [data-ui='drawer'][data-size='lg'] {
198
+ [data-ui-drawer][data-size='lg'] {
199
199
  --_step: var(--slotted-drawer-extent-lg, 30rem);
200
200
  }
201
201
 
202
- [data-ui='drawer'][data-size='xl'] {
202
+ [data-ui-drawer][data-size='xl'] {
203
203
  --_step: var(--slotted-drawer-extent-xl, 40rem);
204
204
  --_padding-inline: var(--slotted-space-8, 1.5rem);
205
205
  --_title-font-size: var(--slotted-font-size-xl, 1.125rem);
206
206
  }
207
207
 
208
208
  /** The step a drawer that is a page takes: the whole layer, and no measure. */
209
- [data-ui='drawer'][data-size='full'] {
209
+ [data-ui-drawer][data-size='full'] {
210
210
  --_step: 100%;
211
211
  }
212
212
 
@@ -218,7 +218,7 @@
218
218
  * over a dialog is one step above it on the single stack the library keeps
219
219
  * rather than a number this stylesheet guessed.
220
220
  */
221
- [data-ui='drawer'][data-mode='overlay'] {
221
+ [data-ui-drawer][data-mode='overlay'] {
222
222
  position: fixed;
223
223
  inset: 0;
224
224
  z-index: calc(var(--slotted-z-index-overlay, 1000) + var(--slotted-layer-depth, 0));
@@ -235,20 +235,20 @@
235
235
  * a mode here, because a family writing a margin on an element it does not
236
236
  * own is a family deciding someone else's layout.
237
237
  */
238
- [data-ui='drawer'][data-mode='inline'] {
238
+ [data-ui-drawer][data-mode='inline'] {
239
239
  overflow: clip;
240
240
  }
241
241
 
242
- [data-ui='drawer'][data-mode='inline'][data-side='start'],
243
- [data-ui='drawer'][data-mode='inline'][data-side='end'] {
242
+ [data-ui-drawer][data-mode='inline'][data-side='start'],
243
+ [data-ui-drawer][data-mode='inline'][data-side='end'] {
244
244
  inline-size: 0;
245
245
  transition:
246
246
  inline-size var(--_move),
247
247
  var(--_reveal);
248
248
  }
249
249
 
250
- [data-ui='drawer'][data-mode='inline'][data-side='top'],
251
- [data-ui='drawer'][data-mode='inline'][data-side='bottom'] {
250
+ [data-ui-drawer][data-mode='inline'][data-side='top'],
251
+ [data-ui-drawer][data-mode='inline'][data-side='bottom'] {
252
252
  block-size: 0;
253
253
  transition:
254
254
  block-size var(--_move),
@@ -269,14 +269,14 @@
269
269
  * to nought, and a cap against a box on its way to nought is what would
270
270
  * rewrap the panel on the way out.
271
271
  */
272
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='start'],
273
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='end'] {
272
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='start'],
273
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='end'] {
274
274
  inline-size: var(--_extent);
275
275
  max-inline-size: 100%;
276
276
  }
277
277
 
278
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='top'],
279
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='bottom'] {
278
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='top'],
279
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='bottom'] {
280
280
  block-size: var(--_extent);
281
281
  max-block-size: 100%;
282
282
  }
@@ -290,7 +290,7 @@
290
290
  * `data-open`: the entering frame has no `data-open` either, and a hidden
291
291
  * panel in that frame refuses the focus scope's initial focus.
292
292
  */
293
- [data-ui='drawer'][inert] {
293
+ [data-ui-drawer][inert] {
294
294
  content-visibility: hidden;
295
295
  pointer-events: none;
296
296
  }
@@ -304,7 +304,7 @@
304
304
  * is `none` in that mode, and a panel separated only by elevation would sit on
305
305
  * an opaque ground with nothing marking where it starts.
306
306
  */
307
- [data-ui='drawer'] > [data-part='backdrop'] {
307
+ [data-ui-drawer] > [data-part-backdrop] {
308
308
  grid-area: 1 / 1;
309
309
  background: var(--slotted-drawer-scrim, var(--slotted-scrim, Canvas));
310
310
  opacity: 0;
@@ -321,7 +321,7 @@
321
321
  * close is waiting, and the page behind is back before the panel has finished
322
322
  * going.
323
323
  */
324
- [data-ui='drawer'][data-open] > [data-part='backdrop'] {
324
+ [data-ui-drawer][data-open] > [data-part-backdrop] {
325
325
  opacity: 1;
326
326
  transition: opacity var(--slotted-duration-long) var(--slotted-easing-standard);
327
327
  }
@@ -334,7 +334,7 @@
334
334
  * body is long — the failure Vaul, MUI and Angular Material all leave to each
335
335
  * consumer's own CSS, because none of the three ships a layout.
336
336
  */
337
- [data-ui='drawer'] > [data-part='panel'] {
337
+ [data-ui-drawer] > [data-part-panel] {
338
338
  grid-area: 1 / 1;
339
339
  box-sizing: border-box;
340
340
  /**
@@ -403,7 +403,7 @@
403
403
  * physical axis, and a start-side panel leaves toward the left of a
404
404
  * left-to-right document and toward the right of a mirrored one.
405
405
  */
406
- [data-ui='drawer'][data-mode='overlay'] > [data-part='panel'] {
406
+ [data-ui-drawer][data-mode='overlay'] > [data-part-panel] {
407
407
  box-shadow: var(--slotted-shadow-lg);
408
408
  translate: 0 0;
409
409
  /* The measure is restated here, or this rule would replace the base one:
@@ -412,10 +412,12 @@
412
412
  transition:
413
413
  translate var(--_slide),
414
414
  inline-size var(--_move),
415
- block-size var(--_move);
415
+ block-size var(--_move),
416
+ border-start-start-radius var(--_move),
417
+ border-start-end-radius var(--_move);
416
418
  }
417
419
 
418
- [data-ui='drawer'][data-mode='overlay']:not([data-open]) > [data-part='panel'] {
420
+ [data-ui-drawer][data-mode='overlay']:not([data-open]) > [data-part-panel] {
419
421
  translate: var(--_shift-x, 0) var(--_shift-y, 0);
420
422
  }
421
423
 
@@ -435,18 +437,18 @@
435
437
  * transition here would put the panel behind the hand by the whole duration.
436
438
  * The slide stays, because a panel released mid-gesture still has an exit.
437
439
  */
438
- [data-ui='drawer'][data-dragging] > [data-part='panel'] {
440
+ [data-ui-drawer][data-dragging] > [data-part-panel] {
439
441
  transition: none;
440
442
  }
441
443
 
442
- [data-ui='drawer'][data-dragging][data-mode='overlay'] > [data-part='panel'] {
444
+ [data-ui-drawer][data-dragging][data-mode='overlay'] > [data-part-panel] {
443
445
  transition: translate var(--_slide);
444
446
  }
445
447
 
446
- [data-ui='drawer'][data-dragging][data-mode='inline'][data-side='start'],
447
- [data-ui='drawer'][data-dragging][data-mode='inline'][data-side='end'],
448
- [data-ui='drawer'][data-dragging][data-mode='inline'][data-side='top'],
449
- [data-ui='drawer'][data-dragging][data-mode='inline'][data-side='bottom'] {
448
+ [data-ui-drawer][data-dragging][data-mode='inline'][data-side='start'],
449
+ [data-ui-drawer][data-dragging][data-mode='inline'][data-side='end'],
450
+ [data-ui-drawer][data-dragging][data-mode='inline'][data-side='top'],
451
+ [data-ui-drawer][data-dragging][data-mode='inline'][data-side='bottom'] {
450
452
  transition: var(--_reveal);
451
453
  }
452
454
 
@@ -456,7 +458,7 @@
456
458
  * closed panel sits at rest because the layer hides it whole, above.
457
459
  */
458
460
  @media (prefers-reduced-motion: reduce) {
459
- [data-ui='drawer'][data-mode='overlay'] > [data-part='panel'] {
461
+ [data-ui-drawer][data-mode='overlay'] > [data-part-panel] {
460
462
  translate: 0 0;
461
463
  transition:
462
464
  inline-size var(--_move),
@@ -466,20 +468,20 @@
466
468
 
467
469
  /* ── Where the panel sits, and where it goes when it leaves ───────────── */
468
470
 
469
- [data-ui='drawer'][data-side='start'] > [data-part='panel'],
470
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] {
471
+ [data-ui-drawer][data-side='start'] > [data-part-panel],
472
+ [data-ui-drawer][data-side='end'] > [data-part-panel] {
471
473
  align-self: stretch;
472
474
  inline-size: min(var(--_extent), 100%);
473
475
  grid-template-rows: auto minmax(0, 1fr) auto;
474
476
  }
475
477
 
476
- [data-ui='drawer'][data-side='top'] > [data-part='panel'],
477
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] {
478
+ [data-ui-drawer][data-side='top'] > [data-part-panel],
479
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] {
478
480
  justify-self: stretch;
479
481
  block-size: min(var(--_extent), 100%);
480
482
  }
481
483
 
482
- [data-ui='drawer'][data-side='start'] > [data-part='panel'] {
484
+ [data-ui-drawer][data-side='start'] > [data-part-panel] {
483
485
  justify-self: start;
484
486
  --_shift-x: -100%;
485
487
  /* The resizer lies over this edge, so the rows keep clear of it. */
@@ -487,7 +489,7 @@
487
489
  border-inline-end-width: var(--_rule-size);
488
490
  }
489
491
 
490
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] {
492
+ [data-ui-drawer][data-side='end'] > [data-part-panel] {
491
493
  justify-self: end;
492
494
  --_shift-x: 100%;
493
495
  --_row-padding-inline-start: max(var(--_padding-inline), var(--_resizer-thickness));
@@ -507,7 +509,7 @@
507
509
  * resizer would otherwise put its body in an `auto` track and lose the one
508
510
  * declaration that keeps the footer on screen.
509
511
  */
510
- [data-ui='drawer'][data-side='top'] > [data-part='panel'] {
512
+ [data-ui-drawer][data-side='top'] > [data-part-panel] {
511
513
  align-self: start;
512
514
  grid-template-rows: auto minmax(0, 1fr) auto auto;
513
515
  --_shift-y: -100%;
@@ -516,7 +518,7 @@
516
518
  border-end-end-radius: var(--slotted-drawer-radius, var(--_radius));
517
519
  }
518
520
 
519
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] {
521
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] {
520
522
  align-self: end;
521
523
  grid-template-rows: auto auto minmax(0, 1fr) auto;
522
524
  --_shift-y: 100%;
@@ -525,20 +527,36 @@
525
527
  border-start-end-radius: var(--slotted-drawer-radius, var(--_radius));
526
528
  }
527
529
 
530
+ /**
531
+ * A sheet that reaches the top of the layer is the screen, Material 3's
532
+ * expanded bottom sheet: its top corners square — a theme keeps a radius
533
+ * with `--slotted-drawer-radius-expanded` — and its header clears the safe
534
+ * area the status bar takes. The binding writes `data-expanded` while the
535
+ * extent is the whole layer, and under `size="full"`.
536
+ */
537
+ [data-ui-drawer][data-side='bottom'][data-expanded] > [data-part-panel] {
538
+ border-start-start-radius: var(--slotted-drawer-radius-expanded, 0px);
539
+ border-start-end-radius: var(--slotted-drawer-radius-expanded, 0px);
540
+ }
541
+
542
+ [data-ui-drawer][data-side='bottom'][data-expanded] > [data-part-panel] > [data-part-header] {
543
+ padding-block-start: calc(var(--_padding-block) + env(safe-area-inset-top, 0px));
544
+ }
545
+
528
546
  /**
529
547
  * A sheet's separator takes the first row, so the three that follow move down
530
548
  * one. `top` needs no such rule: its separator is the fourth row and the
531
549
  * three above it are already where the base puts them.
532
550
  */
533
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='header'] {
551
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-header] {
534
552
  grid-row: 2;
535
553
  }
536
554
 
537
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='body'] {
555
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-body] {
538
556
  grid-row: 3;
539
557
  }
540
558
 
541
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='footer'] {
559
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-footer] {
542
560
  grid-row: 4;
543
561
  }
544
562
 
@@ -550,8 +568,8 @@
550
568
  * edge then shows on three sides, so the panel draws it on three; on a phone
551
569
  * the two side edges sit on the screen's own and read as nothing.
552
570
  */
553
- [data-ui='drawer'][data-mode='overlay'][data-side='top'] > [data-part='panel'],
554
- [data-ui='drawer'][data-mode='overlay'][data-side='bottom'] > [data-part='panel'] {
571
+ [data-ui-drawer][data-mode='overlay'][data-side='top'] > [data-part-panel],
572
+ [data-ui-drawer][data-mode='overlay'][data-side='bottom'] > [data-part-panel] {
555
573
  justify-self: center;
556
574
  inline-size: min(
557
575
  100%,
@@ -574,7 +592,7 @@
574
592
  * arrives while the sheet is open, and a release back onto the content stop. A
575
593
  * browser without it jumps, and nothing else changes.
576
594
  */
577
- [data-ui='drawer'][data-size='content'] {
595
+ [data-ui-drawer][data-size='content'] {
578
596
  --_step: auto;
579
597
  --_content-cap: min(
580
598
  var(--slotted-drawer-extent, calc(100% - var(--slotted-space-12, 4rem))),
@@ -583,19 +601,19 @@
583
601
  interpolate-size: allow-keywords;
584
602
  }
585
603
 
586
- [data-ui='drawer'][data-size='content'][data-side='start'],
587
- [data-ui='drawer'][data-size='content'][data-side='end'] {
604
+ [data-ui-drawer][data-size='content'][data-side='start'],
605
+ [data-ui-drawer][data-size='content'][data-side='end'] {
588
606
  --_step: max-content;
589
607
  }
590
608
 
591
- [data-ui='drawer'][data-size='content'][data-side='start'] > [data-part='panel'],
592
- [data-ui='drawer'][data-size='content'][data-side='end'] > [data-part='panel'] {
609
+ [data-ui-drawer][data-size='content'][data-side='start'] > [data-part-panel],
610
+ [data-ui-drawer][data-size='content'][data-side='end'] > [data-part-panel] {
593
611
  inline-size: var(--_extent);
594
612
  max-inline-size: var(--_content-cap);
595
613
  }
596
614
 
597
- [data-ui='drawer'][data-size='content'][data-side='top'] > [data-part='panel'],
598
- [data-ui='drawer'][data-size='content'][data-side='bottom'] > [data-part='panel'] {
615
+ [data-ui-drawer][data-size='content'][data-side='top'] > [data-part-panel],
616
+ [data-ui-drawer][data-size='content'][data-side='bottom'] > [data-part-panel] {
599
617
  block-size: var(--_extent);
600
618
  max-block-size: var(--_content-cap);
601
619
  }
@@ -606,7 +624,7 @@
606
624
  * cell the panel sits in shrinks by it, so a sheet lands above the keys and a
607
625
  * side panel's footer does too, and every `100%` cap shrinks with the cell.
608
626
  */
609
- [data-ui='drawer'][data-mode='overlay'] {
627
+ [data-ui-drawer][data-mode='overlay'] {
610
628
  padding-block-end: var(--slotted-keyboard-inset, 0px);
611
629
  }
612
630
 
@@ -616,18 +634,18 @@
616
634
  * press on it reaches it. The opacity keeps the transition the scrim already
617
635
  * has, so crossing the stop fades rather than blinks.
618
636
  */
619
- [data-ui='drawer'][data-undimmed] > [data-part='backdrop'] {
637
+ [data-ui-drawer][data-undimmed] > [data-part-backdrop] {
620
638
  opacity: 0;
621
639
  pointer-events: none;
622
640
  }
623
641
 
624
642
  /* The layer is fixed over the whole viewport, so the scrim alone letting the
625
643
  press through leaves the root to catch it; the panel takes it back. */
626
- [data-ui='drawer'][data-undimmed] {
644
+ [data-ui-drawer][data-undimmed] {
627
645
  pointer-events: none;
628
646
  }
629
647
 
630
- [data-ui='drawer'][data-undimmed] > [data-part='panel'] {
648
+ [data-ui-drawer][data-undimmed] > [data-part-panel] {
631
649
  pointer-events: auto;
632
650
  }
633
651
 
@@ -636,16 +654,16 @@
636
654
  * sits over its end. The inset is padding inside the scrollport, so the last
637
655
  * line scrolls clear of the indicator rather than stopping under it.
638
656
  */
639
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='body']:last-child {
657
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-body]:last-child {
640
658
  padding-block-end: calc(var(--_padding-block) + env(safe-area-inset-bottom, 0px));
641
659
  }
642
660
 
643
661
  /** `start` is the left edge in one direction and the right edge in the other. */
644
- [data-ui='drawer'][data-side='start']:dir(rtl) > [data-part='panel'] {
662
+ [data-ui-drawer][data-side='start']:dir(rtl) > [data-part-panel] {
645
663
  --_shift-x: 100%;
646
664
  }
647
665
 
648
- [data-ui='drawer'][data-side='end']:dir(rtl) > [data-part='panel'] {
666
+ [data-ui-drawer][data-side='end']:dir(rtl) > [data-part-panel] {
649
667
  --_shift-x: -100%;
650
668
  }
651
669
 
@@ -661,7 +679,7 @@
661
679
  * step, because a container condition cannot hold a custom property — buy one
662
680
  * hairline at the extreme edge of the viewport.
663
681
  */
664
- [data-ui='drawer'][data-size='full'] > [data-part='panel'] {
682
+ [data-ui-drawer][data-size='full'] > [data-part-panel] {
665
683
  border-width: 0;
666
684
  border-radius: 0;
667
685
  }
@@ -671,13 +689,13 @@
671
689
  * from, which is what `overflow: clip` on the root is for. `min(…, 100%)`
672
690
  * would resolve against a box that is on its way to nought.
673
691
  */
674
- [data-ui='drawer'][data-mode='inline'][data-side='start'] > [data-part='panel'],
675
- [data-ui='drawer'][data-mode='inline'][data-side='end'] > [data-part='panel'] {
692
+ [data-ui-drawer][data-mode='inline'][data-side='start'] > [data-part-panel],
693
+ [data-ui-drawer][data-mode='inline'][data-side='end'] > [data-part-panel] {
676
694
  inline-size: var(--_extent);
677
695
  }
678
696
 
679
- [data-ui='drawer'][data-mode='inline'][data-side='top'] > [data-part='panel'],
680
- [data-ui='drawer'][data-mode='inline'][data-side='bottom'] > [data-part='panel'] {
697
+ [data-ui-drawer][data-mode='inline'][data-side='top'] > [data-part-panel],
698
+ [data-ui-drawer][data-mode='inline'][data-side='bottom'] > [data-part-panel] {
681
699
  block-size: var(--_extent);
682
700
  }
683
701
 
@@ -688,13 +706,13 @@
688
706
  * a worse picture than one that wrapped. The cap is on `[data-open]` for the
689
707
  * reason the root's is.
690
708
  */
691
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='start'] > [data-part='panel'],
692
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='end'] > [data-part='panel'] {
709
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='start'] > [data-part-panel],
710
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='end'] > [data-part-panel] {
693
711
  max-inline-size: 100%;
694
712
  }
695
713
 
696
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='top'] > [data-part='panel'],
697
- [data-ui='drawer'][data-mode='inline'][data-open][data-side='bottom'] > [data-part='panel'] {
714
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='top'] > [data-part-panel],
715
+ [data-ui-drawer][data-mode='inline'][data-open][data-side='bottom'] > [data-part-panel] {
698
716
  max-block-size: 100%;
699
717
  }
700
718
 
@@ -753,7 +771,7 @@
753
771
  *
754
772
  * `touch-action: none` so a drag is not read as a scroll on the way past.
755
773
  */
756
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer'] {
774
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer] {
757
775
  display: flex;
758
776
  align-items: center;
759
777
  justify-content: center;
@@ -781,16 +799,14 @@
781
799
  }
782
800
 
783
801
  /* Under the hand the gap closes and the marks read as one. */
784
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer']:not([data-disabled]):hover,
785
- [data-ui='drawer']
786
- > [data-part='panel']
787
- > [data-part='resizer']:not([data-disabled]):focus-visible,
788
- [data-ui='drawer'][data-dragging] > [data-part='panel'] > [data-part='resizer'] {
802
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer]:not([data-disabled]):hover,
803
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer]:not([data-disabled]):focus-visible,
804
+ [data-ui-drawer][data-dragging] > [data-part-panel] > [data-part-resizer] {
789
805
  gap: var(--slotted-space-4, 0.5rem);
790
806
  }
791
807
 
792
- [data-ui='drawer'][data-side='start'] > [data-part='panel'] > [data-part='resizer'],
793
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] > [data-part='resizer'] {
808
+ [data-ui-drawer][data-side='start'] > [data-part-panel] > [data-part-resizer],
809
+ [data-ui-drawer][data-side='end'] > [data-part-panel] > [data-part-resizer] {
794
810
  flex-direction: column;
795
811
  }
796
812
 
@@ -798,52 +814,52 @@
798
814
  * The reach. Transparent, centred on the gutter and above the panel's own
799
815
  * rows, which is what makes a four-pixel picture a twenty-four-pixel target.
800
816
  */
801
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer']::before {
817
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer]::before {
802
818
  content: '';
803
819
  position: absolute;
804
820
  --_reach-overhang: calc((var(--_resizer-reach) - var(--_resizer-thickness)) / -2);
805
821
  }
806
822
 
807
- [data-ui='drawer'][data-side='start'] > [data-part='panel'] > [data-part='resizer']::before,
808
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] > [data-part='resizer']::before {
823
+ [data-ui-drawer][data-side='start'] > [data-part-panel] > [data-part-resizer]::before,
824
+ [data-ui-drawer][data-side='end'] > [data-part-panel] > [data-part-resizer]::before {
809
825
  inset-block: 0;
810
826
  inset-inline: var(--_reach-overhang);
811
827
  }
812
828
 
813
- [data-ui='drawer'][data-side='top'] > [data-part='panel'] > [data-part='resizer']::before,
814
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='resizer']::before {
829
+ [data-ui-drawer][data-side='top'] > [data-part-panel] > [data-part-resizer]::before,
830
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-resizer]::before {
815
831
  inset-inline: 0;
816
832
  inset-block: var(--_reach-overhang);
817
833
  }
818
834
 
819
- [data-ui='drawer'][data-side='start'] > [data-part='panel'] > [data-part='resizer'],
820
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] > [data-part='resizer'] {
835
+ [data-ui-drawer][data-side='start'] > [data-part-panel] > [data-part-resizer],
836
+ [data-ui-drawer][data-side='end'] > [data-part-panel] > [data-part-resizer] {
821
837
  position: absolute;
822
838
  inset-block: 0;
823
839
  inline-size: var(--_resizer-thickness);
824
840
  cursor: col-resize;
825
841
  }
826
842
 
827
- [data-ui='drawer'][data-side='start'] > [data-part='panel'] > [data-part='resizer'] {
843
+ [data-ui-drawer][data-side='start'] > [data-part-panel] > [data-part-resizer] {
828
844
  inset-inline-end: 0;
829
845
  }
830
846
 
831
- [data-ui='drawer'][data-side='end'] > [data-part='panel'] > [data-part='resizer'] {
847
+ [data-ui-drawer][data-side='end'] > [data-part-panel] > [data-part-resizer] {
832
848
  inset-inline-start: 0;
833
849
  }
834
850
 
835
- [data-ui='drawer'][data-side='top'] > [data-part='panel'] > [data-part='resizer'],
836
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='resizer'] {
851
+ [data-ui-drawer][data-side='top'] > [data-part-panel] > [data-part-resizer],
852
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-resizer] {
837
853
  position: relative;
838
854
  block-size: var(--_resizer-thickness);
839
855
  cursor: row-resize;
840
856
  }
841
857
 
842
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='resizer'] {
858
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-resizer] {
843
859
  grid-row: 1;
844
860
  }
845
861
 
846
- [data-ui='drawer'][data-side='top'] > [data-part='panel'] > [data-part='resizer'] {
862
+ [data-ui-drawer][data-side='top'] > [data-part-panel] > [data-part-resizer] {
847
863
  grid-row: 4;
848
864
  }
849
865
 
@@ -856,7 +872,7 @@
856
872
  *
857
873
  * A sheet paints none of them — see the grabber below.
858
874
  */
859
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer'] > [data-part='line'] {
875
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer] > [data-part-line] {
860
876
  flex: 0 1 min(var(--slotted-space-12, 4rem), 20%);
861
877
  min-block-size: 0;
862
878
  min-inline-size: 0;
@@ -869,40 +885,37 @@
869
885
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
870
886
  }
871
887
 
872
- [data-ui='drawer'][data-side='start']
873
- > [data-part='panel']
874
- > [data-part='resizer']
875
- > [data-part='line']:first-child,
876
- [data-ui='drawer'][data-side='end']
877
- > [data-part='panel']
878
- > [data-part='resizer']
879
- > [data-part='line']:first-child {
888
+ [data-ui-drawer][data-side='start']
889
+ > [data-part-panel]
890
+ > [data-part-resizer]
891
+ > [data-part-line]:first-child,
892
+ [data-ui-drawer][data-side='end']
893
+ > [data-part-panel]
894
+ > [data-part-resizer]
895
+ > [data-part-line]:first-child {
880
896
  background: linear-gradient(to bottom, transparent, var(--_rest));
881
897
  }
882
898
 
883
- [data-ui='drawer'][data-side='start']
884
- > [data-part='panel']
885
- > [data-part='resizer']
886
- > [data-part='line']:last-child,
887
- [data-ui='drawer'][data-side='end']
888
- > [data-part='panel']
889
- > [data-part='resizer']
890
- > [data-part='line']:last-child {
899
+ [data-ui-drawer][data-side='start']
900
+ > [data-part-panel]
901
+ > [data-part-resizer]
902
+ > [data-part-line]:last-child,
903
+ [data-ui-drawer][data-side='end']
904
+ > [data-part-panel]
905
+ > [data-part-resizer]
906
+ > [data-part-line]:last-child {
891
907
  background: linear-gradient(to top, transparent, var(--_rest));
892
908
  }
893
909
 
894
- [data-ui='drawer']
895
- > [data-part='panel']
896
- > [data-part='resizer']:not([data-disabled]):hover
897
- > [data-part='line'],
898
- [data-ui='drawer']
899
- > [data-part='panel']
900
- > [data-part='resizer']:not([data-disabled]):focus-visible
901
- > [data-part='line'],
902
- [data-ui='drawer'][data-dragging]
903
- > [data-part='panel']
904
- > [data-part='resizer']
905
- > [data-part='line'] {
910
+ [data-ui-drawer]
911
+ > [data-part-panel]
912
+ > [data-part-resizer]:not([data-disabled]):hover
913
+ > [data-part-line],
914
+ [data-ui-drawer]
915
+ > [data-part-panel]
916
+ > [data-part-resizer]:not([data-disabled]):focus-visible
917
+ > [data-part-line],
918
+ [data-ui-drawer][data-dragging] > [data-part-panel] > [data-part-resizer] > [data-part-line] {
906
919
  flex-basis: 100%;
907
920
  background: var(--_active);
908
921
  }
@@ -918,7 +931,7 @@
918
931
  * there because a sheet is not held at its corners; it is held in the middle,
919
932
  * which is where every mobile sheet in the field puts its mark.
920
933
  */
921
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer'] > [data-part='grip'] {
934
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer] > [data-part-grip] {
922
935
  flex: none;
923
936
  transition:
924
937
  background-color var(--slotted-control-transition-duration, var(--slotted-duration-short))
@@ -927,14 +940,8 @@
927
940
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
928
941
  }
929
942
 
930
- [data-ui='drawer'][data-side='start']
931
- > [data-part='panel']
932
- > [data-part='resizer']
933
- > [data-part='grip'],
934
- [data-ui='drawer'][data-side='end']
935
- > [data-part='panel']
936
- > [data-part='resizer']
937
- > [data-part='grip'] {
943
+ [data-ui-drawer][data-side='start'] > [data-part-panel] > [data-part-resizer] > [data-part-grip],
944
+ [data-ui-drawer][data-side='end'] > [data-part-panel] > [data-part-resizer] > [data-part-grip] {
938
945
  color: var(--_rest);
939
946
  background-image: radial-gradient(circle at center, currentColor 40%, transparent 42%);
940
947
  background-size: var(--slotted-space-2, 0.25rem) var(--slotted-space-2, 0.25rem);
@@ -943,14 +950,11 @@
943
950
  }
944
951
 
945
952
  /* The grabber. Four by thirty-six, full radius, centred above the header. */
946
- [data-ui='drawer'][data-side='top']
947
- > [data-part='panel']
948
- > [data-part='resizer']
949
- > [data-part='grip'],
950
- [data-ui='drawer'][data-side='bottom']
951
- > [data-part='panel']
952
- > [data-part='resizer']
953
- > [data-part='grip'] {
953
+ [data-ui-drawer][data-side='top'] > [data-part-panel] > [data-part-resizer] > [data-part-grip],
954
+ [data-ui-drawer][data-side='bottom']
955
+ > [data-part-panel]
956
+ > [data-part-resizer]
957
+ > [data-part-grip] {
954
958
  background-color: var(--_rest);
955
959
  border-radius: var(--slotted-radius-full, 9999px);
956
960
  block-size: var(--slotted-space-2, 0.25rem);
@@ -958,14 +962,11 @@
958
962
  }
959
963
 
960
964
  /* A sheet's lines are not painted: the pill is the whole picture. */
961
- [data-ui='drawer'][data-side='top']
962
- > [data-part='panel']
963
- > [data-part='resizer']
964
- > [data-part='line'],
965
- [data-ui='drawer'][data-side='bottom']
966
- > [data-part='panel']
967
- > [data-part='resizer']
968
- > [data-part='line'] {
965
+ [data-ui-drawer][data-side='top'] > [data-part-panel] > [data-part-resizer] > [data-part-line],
966
+ [data-ui-drawer][data-side='bottom']
967
+ > [data-part-panel]
968
+ > [data-part-resizer]
969
+ > [data-part-line] {
969
970
  display: none;
970
971
  }
971
972
 
@@ -976,45 +977,42 @@
976
977
  * under focus. `splitter`, which draws the same picture, only ever changed
977
978
  * `color`. The pill on a block side is a filled box, so it recolours its fill.
978
979
  */
979
- [data-ui='drawer']
980
- > [data-part='panel']
981
- > [data-part='resizer']:not([data-disabled]):hover
982
- > [data-part='grip'],
983
- [data-ui='drawer']
984
- > [data-part='panel']
985
- > [data-part='resizer']:not([data-disabled]):focus-visible
986
- > [data-part='grip'],
987
- [data-ui='drawer'][data-dragging]
988
- > [data-part='panel']
989
- > [data-part='resizer']
990
- > [data-part='grip'] {
980
+ [data-ui-drawer]
981
+ > [data-part-panel]
982
+ > [data-part-resizer]:not([data-disabled]):hover
983
+ > [data-part-grip],
984
+ [data-ui-drawer]
985
+ > [data-part-panel]
986
+ > [data-part-resizer]:not([data-disabled]):focus-visible
987
+ > [data-part-grip],
988
+ [data-ui-drawer][data-dragging] > [data-part-panel] > [data-part-resizer] > [data-part-grip] {
991
989
  color: var(--_active);
992
990
  }
993
991
 
994
- [data-ui='drawer'][data-side='top']
995
- > [data-part='panel']
996
- > [data-part='resizer']:not([data-disabled]):hover
997
- > [data-part='grip'],
998
- [data-ui='drawer'][data-side='bottom']
999
- > [data-part='panel']
1000
- > [data-part='resizer']:not([data-disabled]):hover
1001
- > [data-part='grip'],
1002
- [data-ui='drawer'][data-side='top']
1003
- > [data-part='panel']
1004
- > [data-part='resizer']:not([data-disabled]):focus-visible
1005
- > [data-part='grip'],
1006
- [data-ui='drawer'][data-side='bottom']
1007
- > [data-part='panel']
1008
- > [data-part='resizer']:not([data-disabled]):focus-visible
1009
- > [data-part='grip'],
1010
- [data-ui='drawer'][data-dragging][data-side='top']
1011
- > [data-part='panel']
1012
- > [data-part='resizer']
1013
- > [data-part='grip'],
1014
- [data-ui='drawer'][data-dragging][data-side='bottom']
1015
- > [data-part='panel']
1016
- > [data-part='resizer']
1017
- > [data-part='grip'] {
992
+ [data-ui-drawer][data-side='top']
993
+ > [data-part-panel]
994
+ > [data-part-resizer]:not([data-disabled]):hover
995
+ > [data-part-grip],
996
+ [data-ui-drawer][data-side='bottom']
997
+ > [data-part-panel]
998
+ > [data-part-resizer]:not([data-disabled]):hover
999
+ > [data-part-grip],
1000
+ [data-ui-drawer][data-side='top']
1001
+ > [data-part-panel]
1002
+ > [data-part-resizer]:not([data-disabled]):focus-visible
1003
+ > [data-part-grip],
1004
+ [data-ui-drawer][data-side='bottom']
1005
+ > [data-part-panel]
1006
+ > [data-part-resizer]:not([data-disabled]):focus-visible
1007
+ > [data-part-grip],
1008
+ [data-ui-drawer][data-dragging][data-side='top']
1009
+ > [data-part-panel]
1010
+ > [data-part-resizer]
1011
+ > [data-part-grip],
1012
+ [data-ui-drawer][data-dragging][data-side='bottom']
1013
+ > [data-part-panel]
1014
+ > [data-part-resizer]
1015
+ > [data-part-grip] {
1018
1016
  background-color: var(--_active);
1019
1017
  }
1020
1018
 
@@ -1034,7 +1032,7 @@
1034
1032
  * forbids a system colour inside `::before` or `::after`, and the ring's own
1035
1033
  * last resort is `Highlight`.
1036
1034
  */
1037
- [data-ui='drawer'] > [data-part='panel'] > [data-part='resizer']:focus-visible {
1035
+ [data-ui-drawer] > [data-part-panel] > [data-part-resizer]:focus-visible {
1038
1036
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1039
1037
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
1040
1038
  }
@@ -1046,13 +1044,13 @@
1046
1044
  * between a resize the engine prepares for and one it discovers each frame.
1047
1045
  * It is written on the panel because the panel is what changes size.
1048
1046
  */
1049
- [data-ui='drawer'][data-dragging][data-side='start'] > [data-part='panel'],
1050
- [data-ui='drawer'][data-dragging][data-side='end'] > [data-part='panel'] {
1047
+ [data-ui-drawer][data-dragging][data-side='start'] > [data-part-panel],
1048
+ [data-ui-drawer][data-dragging][data-side='end'] > [data-part-panel] {
1051
1049
  will-change: inline-size;
1052
1050
  }
1053
1051
 
1054
- [data-ui='drawer'][data-dragging][data-side='top'] > [data-part='panel'],
1055
- [data-ui='drawer'][data-dragging][data-side='bottom'] > [data-part='panel'] {
1052
+ [data-ui-drawer][data-dragging][data-side='top'] > [data-part-panel],
1053
+ [data-ui-drawer][data-dragging][data-side='bottom'] > [data-part-panel] {
1056
1054
  will-change: block-size;
1057
1055
  }
1058
1056
 
@@ -1068,7 +1066,7 @@
1068
1066
  * consumer can write: a header, a body and a footer draw two rules; a header
1069
1067
  * and a footer alone draw one; and a panel that is only a body draws none.
1070
1068
  */
1071
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] {
1069
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] {
1072
1070
  grid-row: 1;
1073
1071
  display: grid;
1074
1072
  grid-template-columns: minmax(0, 1fr) auto;
@@ -1085,7 +1083,7 @@
1085
1083
  * panel past its own measure, and a panel pinned to an edge then pushes its
1086
1084
  * inner edge across the layer.
1087
1085
  */
1088
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] > [data-part='title'] {
1086
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-title] {
1089
1087
  grid-column: 1;
1090
1088
  grid-row: 1;
1091
1089
  margin: 0;
@@ -1104,7 +1102,7 @@
1104
1102
  color: var(--slotted-drawer-title-color, var(--slotted-text, CanvasText));
1105
1103
  }
1106
1104
 
1107
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] > [data-part='description'] {
1105
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-description] {
1108
1106
  grid-column: 1;
1109
1107
  grid-row: 2;
1110
1108
  margin: 0;
@@ -1125,7 +1123,7 @@
1125
1123
  * an `icon` box, sized here through the icon token so the box and the
1126
1124
  * formula above read one length.
1127
1125
  */
1128
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] > [data-part='close'] {
1126
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-close] {
1129
1127
  --slotted-icon-size: var(--_icon-size);
1130
1128
 
1131
1129
  grid-column: 2;
@@ -1156,21 +1154,21 @@
1156
1154
  is the one a mouse sees: a transparent `::before` centred on the control
1157
1155
  reaches 44 pixels, and the ground and the ring stay square. */
1158
1156
  @media (pointer: coarse) {
1159
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] > [data-part='close'] {
1157
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-close] {
1160
1158
  position: relative;
1161
1159
  }
1162
1160
 
1163
- [data-ui='drawer'] > [data-part='panel'] > [data-part='header'] > [data-part='close']::before {
1161
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-close]::before {
1164
1162
  content: '';
1165
1163
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
1166
1164
  position: absolute;
1167
1165
  }
1168
1166
  }
1169
1167
 
1170
- [data-ui='drawer']
1171
- > [data-part='panel']
1172
- > [data-part='header']
1173
- > [data-part='close']:not(:disabled):hover {
1168
+ [data-ui-drawer]
1169
+ > [data-part-panel]
1170
+ > [data-part-header]
1171
+ > [data-part-close]:not(:disabled):hover {
1174
1172
  /* The ground moves under the pointer and nothing else does (R2). */
1175
1173
  background-color: var(
1176
1174
  --slotted-drawer-close-hover-background,
@@ -1178,20 +1176,17 @@
1178
1176
  );
1179
1177
  }
1180
1178
 
1181
- [data-ui='drawer']
1182
- > [data-part='panel']
1183
- > [data-part='header']
1184
- > [data-part='close']:not(:disabled):active {
1179
+ [data-ui-drawer]
1180
+ > [data-part-panel]
1181
+ > [data-part-header]
1182
+ > [data-part-close]:not(:disabled):active {
1185
1183
  background-color: var(
1186
1184
  --slotted-drawer-close-active-background,
1187
1185
  var(--slotted-tone-secondary-subtle-active)
1188
1186
  );
1189
1187
  }
1190
1188
 
1191
- [data-ui='drawer']
1192
- > [data-part='panel']
1193
- > [data-part='header']
1194
- > [data-part='close']:focus-visible {
1189
+ [data-ui-drawer] > [data-part-panel] > [data-part-header] > [data-part-close]:focus-visible {
1195
1190
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1196
1191
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
1197
1192
  }
@@ -1204,7 +1199,7 @@
1204
1199
  * `dismissable-layer` covers the modal case; this covers the other two, where
1205
1200
  * the page behind is not locked at all.
1206
1201
  */
1207
- [data-ui='drawer'] > [data-part='panel'] > [data-part='body'] {
1202
+ [data-ui-drawer] > [data-part-panel] > [data-part-body] {
1208
1203
  grid-row: 2;
1209
1204
  min-block-size: 0;
1210
1205
  min-inline-size: 0;
@@ -1221,11 +1216,11 @@
1221
1216
  }
1222
1217
 
1223
1218
  /* Content that brings its own inset — a page, a list on the panel's edges. */
1224
- [data-ui='drawer'] > [data-part='panel'] > [data-part='body'][data-inset='none'] {
1219
+ [data-ui-drawer] > [data-part-panel] > [data-part-body][data-inset='none'] {
1225
1220
  padding: 0;
1226
1221
  }
1227
1222
 
1228
- [data-ui='drawer'] > [data-part='panel'] > [data-part='body']:not(:first-child) {
1223
+ [data-ui-drawer] > [data-part-panel] > [data-part-body]:not(:first-child) {
1229
1224
  border-block-start: var(--_rule-size) solid
1230
1225
  var(--slotted-drawer-rule-color, var(--slotted-border-subtle, ButtonBorder));
1231
1226
  }
@@ -1237,7 +1232,7 @@
1237
1232
  * instead, and the header, the close button, Escape and the resizer all stay
1238
1233
  * operable: a loading drawer a reader cannot leave is the worse failure.
1239
1234
  */
1240
- [data-ui='drawer'][data-loading] > [data-part='panel'] > [data-part='body'] {
1235
+ [data-ui-drawer][data-loading] > [data-part-panel] > [data-part-body] {
1241
1236
  min-block-size: var(--slotted-space-12, 4rem);
1242
1237
  }
1243
1238
 
@@ -1249,7 +1244,7 @@
1249
1244
  * reason the middle one is bounded — an unbounded panel pushes it past the
1250
1245
  * fold, which is the whole failure the three-row grid exists to prevent.
1251
1246
  */
1252
- [data-ui='drawer'] > [data-part='panel'] > [data-part='footer'] {
1247
+ [data-ui-drawer] > [data-part-panel] > [data-part-footer] {
1253
1248
  grid-row: 3;
1254
1249
  display: flex;
1255
1250
  flex-wrap: wrap;
@@ -1274,13 +1269,13 @@
1274
1269
  * above it and the header already clears it; the body scrolls, so an inset on
1275
1270
  * it would be padding inside a scrollport rather than under it.
1276
1271
  */
1277
- [data-ui='drawer'][data-side='bottom'] > [data-part='panel'] > [data-part='footer'] {
1272
+ [data-ui-drawer][data-side='bottom'] > [data-part-panel] > [data-part-footer] {
1278
1273
  padding-block-end: calc(
1279
1274
  var(--_footer-padding-block, var(--_padding-block)) + env(safe-area-inset-bottom, 0px)
1280
1275
  );
1281
1276
  }
1282
1277
 
1283
- [data-ui='drawer'] > [data-part='panel'] > [data-part='footer']:not(:first-child) {
1278
+ [data-ui-drawer] > [data-part-panel] > [data-part-footer]:not(:first-child) {
1284
1279
  border-block-start: var(--_rule-size) solid
1285
1280
  var(--slotted-drawer-rule-color, var(--slotted-border-subtle, ButtonBorder));
1286
1281
  }
@@ -1295,7 +1290,7 @@
1295
1290
  * border is read at, and gives the panel the three edges its side does not.
1296
1291
  */
1297
1292
  @media (forced-colors: active) {
1298
- [data-ui='drawer'] > [data-part='panel'] {
1293
+ [data-ui-drawer] > [data-part-panel] {
1299
1294
  border-width: var(--slotted-border-width-thick, 2px);
1300
1295
  border-color: CanvasText;
1301
1296
  }