@slotted/styles 0.1.0-beta.0 → 0.1.0-beta.10

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 (176) 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 +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 +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  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 +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -3,7 +3,7 @@
3
3
  * The outer frame of a route: the regions that do not change when the
4
4
  * content does.
5
5
  *
6
- * div[data-ui=app-shell]
6
+ * div[data-ui-app-shell]
7
7
  * ├─ skip ▸ a · a · a
8
8
  * ├─ banner ▸ brand ▸ nav-toggle · … | centre ▸ … | actions ▸ …
9
9
  * ├─ nav ▸ nav-header · nav-body · nav-footer
@@ -67,7 +67,7 @@
67
67
  * focus and the scroll position where the reader left them; Carbon remounts
68
68
  * its side nav between the two and loses both.
69
69
  */
70
- [data-ui='app-shell'] {
70
+ [data-ui-app-shell] {
71
71
  /**
72
72
  * The air around anything the frame holds. Composed from the control gap
73
73
  * rather than stated on the space scale, so it answers density: a dense
@@ -82,6 +82,16 @@
82
82
  /** The box a row's mark occupies: a control's own size, so the two agree. */
83
83
  --_row-mark: var(--slotted-app-shell-row-mark-size, var(--slotted-control-height-md, 34px));
84
84
  --_row-gap: var(--slotted-control-gap-md, 8px);
85
+ /**
86
+ * How far a focus ring drawn outside a control reaches past its box: the
87
+ * ring's width and its offset, 4px with the default theme. The three parts
88
+ * of the navigation column pad their inline sides by it, because the body
89
+ * scrolls and clips at its padding box, and a full-width control's ring
90
+ * stood outside that box on both sides.
91
+ */
92
+ --_row-ring-inset: calc(
93
+ var(--slotted-focus-ring-width, 2px) + var(--slotted-focus-ring-offset, 2px)
94
+ );
85
95
 
86
96
  /**
87
97
  * A row's type. A list of destinations is text and not a control, so it
@@ -271,16 +281,16 @@
271
281
  position: relative;
272
282
  }
273
283
 
274
- [data-ui='app-shell'][data-nav-size='sm'] {
284
+ [data-ui-app-shell][data-nav-size='sm'] {
275
285
  --_nav-size: var(--slotted-app-shell-nav-size-sm, 13rem);
276
286
  }
277
- [data-ui='app-shell'][data-nav-size='lg'] {
287
+ [data-ui-app-shell][data-nav-size='lg'] {
278
288
  --_nav-size: var(--slotted-app-shell-nav-size-lg, 18rem);
279
289
  }
280
- [data-ui='app-shell'][data-aside-size='sm'] {
290
+ [data-ui-app-shell][data-aside-size='sm'] {
281
291
  --_aside-size: var(--slotted-app-shell-aside-size-sm, 16rem);
282
292
  }
283
- [data-ui='app-shell'][data-aside-size='lg'] {
293
+ [data-ui-app-shell][data-aside-size='lg'] {
284
294
  --_aside-size: var(--slotted-app-shell-aside-size-lg, 26rem);
285
295
  }
286
296
 
@@ -292,7 +302,7 @@
292
302
  * toolbar makes `100vh` taller than the space there is, and `100dvh` is the
293
303
  * space there is.
294
304
  */
295
- [data-ui='app-shell'][data-scroll='content'] {
305
+ [data-ui-app-shell][data-scroll='content'] {
296
306
  block-size: 100%;
297
307
  /**
298
308
  * Both axes, under `content` alone: the shell's height is the space it was
@@ -311,14 +321,14 @@
311
321
  * focused: the reader who does not need it never meets it, and the reader
312
322
  * who does finds it before the chrome.
313
323
  */
314
- [data-ui='app-shell'] > [data-part='skip'] {
324
+ [data-ui-app-shell] > [data-part-skip] {
315
325
  inset-block-start: 0;
316
326
  inset-inline-start: 0;
317
327
  position: absolute;
318
328
  z-index: var(--slotted-z-index-popover, 1100);
319
329
  }
320
330
 
321
- [data-ui='app-shell'] > [data-part='skip'] > a {
331
+ [data-ui-app-shell] > [data-part-skip] > a {
322
332
  background-color: var(--_canvas);
323
333
  border: var(--_rule-width) solid var(--_rule);
324
334
  border-radius: var(--slotted-control-radius, 4px);
@@ -338,7 +348,7 @@
338
348
  white-space: nowrap;
339
349
  }
340
350
 
341
- [data-ui='app-shell'] > [data-part='skip'] > a:focus-visible {
351
+ [data-ui-app-shell] > [data-part-skip] > a:focus-visible {
342
352
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
343
353
  outline-offset: var(--slotted-focus-ring-offset, 2px);
344
354
  translate: 0 0;
@@ -359,7 +369,7 @@
359
369
  * in the family reads the query — the bar carries an application's own search
360
370
  * and its own account, and those are the things that shed a label first.
361
371
  */
362
- [data-ui='app-shell'] > [data-part='banner'] {
372
+ [data-ui-app-shell] > [data-part-banner] {
363
373
  align-items: center;
364
374
  background-color: var(--slotted-app-shell-banner-surface, transparent);
365
375
  color: var(
@@ -376,7 +386,7 @@
376
386
  padding-inline: var(--_edge);
377
387
  }
378
388
 
379
- [data-ui='app-shell'] [data-part='brand'] {
389
+ [data-ui-app-shell] [data-part-brand] {
380
390
  align-items: center;
381
391
  display: flex;
382
392
  flex: 0 1 auto;
@@ -395,13 +405,13 @@
395
405
  * shortens instead; the control is exempt, because a control that shrinks
396
406
  * below its target is a defect of a different kind.
397
407
  */
398
- [data-ui='app-shell'] [data-part='brand'] > *:not([data-part='nav-toggle']) {
408
+ [data-ui-app-shell] [data-part-brand] > *:not([data-part-nav-toggle]) {
399
409
  min-inline-size: 0;
400
410
  overflow: var(--slotted-app-shell-brand-overflow, hidden);
401
411
  text-overflow: ellipsis;
402
412
  white-space: var(--slotted-app-shell-brand-wrap, nowrap);
403
413
  }
404
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='actions'] {
414
+ [data-ui-app-shell] > [data-part-banner] > [data-part-actions] {
405
415
  align-items: center;
406
416
  display: flex;
407
417
  flex: 0 1 auto;
@@ -416,7 +426,7 @@
416
426
  * defect of a different kind from a bar that has run out of room. What runs
417
427
  * out of room is the middle, which is what `centre` is for.
418
428
  */
419
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='actions'] > * {
429
+ [data-ui-app-shell] > [data-part-banner] > [data-part-actions] > * {
420
430
  flex-shrink: 0;
421
431
  }
422
432
 
@@ -428,7 +438,7 @@
428
438
  * is the consumer's; that it may be narrower than what it holds is the
429
439
  * shell's, for the reason `actions` carries `min-inline-size: 0`.
430
440
  */
431
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='centre'] {
441
+ [data-ui-app-shell] > [data-part-banner] > [data-part-centre] {
432
442
  align-items: center;
433
443
  display: flex;
434
444
  flex: 1 1 auto;
@@ -442,7 +452,7 @@
442
452
  * destination shows at that width — a mark alone, a mark and a word — is
443
453
  * `side-navigation`'s decision to take against the room it has.
444
454
  */
445
- [data-ui='app-shell'] > [data-part='nav'] {
455
+ [data-ui-app-shell] > [data-part-nav] {
446
456
  background-color: var(--slotted-app-shell-nav-surface, transparent);
447
457
  box-sizing: border-box;
448
458
  color: var(
@@ -460,7 +470,18 @@
460
470
  * for fifty pixels stood at whatever the longest destination measured.
461
471
  */
462
472
  min-inline-size: 0;
463
- overflow: hidden;
473
+ /**
474
+ * The inline axis clips, which the width transition between open and rail
475
+ * needs. The block axis scrolls: a region holding one column taller than
476
+ * itself instead of `nav-header`, `nav-body` and `nav-footer` keeps its
477
+ * foot reachable. With the three parts the body scrolls and the region
478
+ * never overflows.
479
+ */
480
+ overflow-x: hidden;
481
+ overflow-y: auto;
482
+ overflow-inline: hidden;
483
+ overflow-block: auto;
484
+ overscroll-behavior: contain;
464
485
  transition:
465
486
  inline-size var(--_duration) var(--_easing),
466
487
  visibility var(--_duration) step-start;
@@ -476,25 +497,43 @@
476
497
  * two-line block its own air; without it both were crushed against the group
477
498
  * heading below and the frame's footer beneath.
478
499
  */
479
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-header'],
480
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-footer'] {
500
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-header],
501
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-footer] {
481
502
  align-items: center;
482
503
  display: flex;
483
504
  flex: 0 0 auto;
484
505
  gap: var(--_row-gap);
485
506
  min-block-size: var(--_rail-size);
486
507
  min-inline-size: 0;
508
+ /**
509
+ * The gutter the body reserves, reserved here too. `scrollbar-gutter`
510
+ * applies to a scroll container only, and `hidden` is the overflow that
511
+ * makes one without a bar of its own: with classic scrollbars the body's
512
+ * content box ended one bar width (10px in Chrome) before the head's and
513
+ * the foot's. Nothing is clipped that was drawn before: the ring inset
514
+ * keeps a control's focus ring inside the padding box. The bar's width is
515
+ * the body's, or the gutter is the platform's full bar (15px in Chrome).
516
+ */
517
+ overflow: hidden;
487
518
  padding-block: var(--_row-inset);
519
+ scrollbar-gutter: stable;
520
+ scrollbar-width: thin;
488
521
  }
489
522
  /**
490
523
  * The inset is the rows', not the region's: on the parts, a seam drawn by
491
524
  * one of them — the rule over the foot — still runs the column's full width,
492
525
  * and a strip of the rail's own beside the column needs none.
493
526
  */
494
- [data-ui='app-shell']
495
- > [data-part='nav']
496
- > :is([data-part='nav-header'], [data-part='nav-body'], [data-part='nav-footer']) {
497
- padding-inline: var(--_nav-inset);
527
+ [data-ui-app-shell]
528
+ > [data-part-nav]
529
+ > :is([data-part-nav-header], [data-part-nav-body], [data-part-nav-footer]) {
530
+ /**
531
+ * Published where it pads, beside the row geometry the root publishes:
532
+ * `side-navigation` reads it to keep its rows' box on the edge it had,
533
+ * and a row it reaches outside these parts reads nothing.
534
+ */
535
+ --slotted-app-shell-row-ring-inset: var(--_row-ring-inset);
536
+ padding-inline: calc(var(--_nav-inset) + var(--_row-ring-inset));
498
537
  }
499
538
  /**
500
539
  * The body scrolls the way `scroll-area` scrolls, and for the reasons written
@@ -511,7 +550,7 @@
511
550
  * between open and rail, the rows stand wider than the body, and an `auto`
512
551
  * inline axis drew a horizontal bar for the length of the transition.
513
552
  */
514
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-body'] {
553
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-body] {
515
554
  align-items: stretch;
516
555
  display: flex;
517
556
  flex: 1 1 auto;
@@ -529,7 +568,7 @@
529
568
  scrollbar-width: thin;
530
569
  }
531
570
 
532
- [data-ui='app-shell'] > [data-part='main'] {
571
+ [data-ui-app-shell] > [data-part-main] {
533
572
  background-color: var(
534
573
  --slotted-app-shell-main-surface,
535
574
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -549,7 +588,7 @@
549
588
  min-block-size: 0;
550
589
  min-inline-size: 0;
551
590
  }
552
- [data-ui='app-shell'][data-scroll='content'] > [data-part='main'] {
591
+ [data-ui-app-shell][data-scroll='content'] > [data-part-main] {
553
592
  overflow: auto;
554
593
  }
555
594
 
@@ -566,7 +605,7 @@
566
605
  * Strict containment keeps the travelling bar's per-frame layout inside
567
606
  * this box, and its paint inside the corners.
568
607
  */
569
- [data-ui='app-shell'] > [data-part='progress'] {
608
+ [data-ui-app-shell] > [data-part-progress] {
570
609
  contain: strict;
571
610
  grid-area: 2 / 2 / 3 / 3;
572
611
  inset-block-start: calc(-1 * var(--_progress-lift, 0px));
@@ -582,15 +621,15 @@
582
621
  * with it; the bar holds the top of the viewport once the banner, which is
583
622
  * not sticky there, has gone.
584
623
  */
585
- [data-ui='app-shell'][data-scroll='document'] > [data-part='progress'] {
624
+ [data-ui-app-shell][data-scroll='document'] > [data-part-progress] {
586
625
  --slotted-progress-indicator-position: sticky;
587
626
  }
588
627
 
589
628
  /** A skip link's destination takes focus; it draws no ring for a pointer. */
590
- [data-ui='app-shell'] > [data-part='main']:focus {
629
+ [data-ui-app-shell] > [data-part-main]:focus {
591
630
  outline: none;
592
631
  }
593
- [data-ui='app-shell'] > [data-part='main']:focus-visible {
632
+ [data-ui-app-shell] > [data-part-main]:focus-visible {
594
633
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
595
634
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
596
635
  }
@@ -605,7 +644,7 @@
605
644
  * the thing it shows or nothing — and a region at nought pixels that still
606
645
  * lays its children out puts content outside the box that owns it.
607
646
  */
608
- [data-ui='app-shell'] > [data-part='aside'] {
647
+ [data-ui-app-shell] > [data-part-aside] {
609
648
  background-color: var(
610
649
  --slotted-app-shell-aside-surface,
611
650
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -621,10 +660,10 @@
621
660
  min-block-size: 0;
622
661
  min-inline-size: 0;
623
662
  }
624
- [data-ui='app-shell'][data-scroll='content'] > [data-part='aside'] {
663
+ [data-ui-app-shell][data-scroll='content'] > [data-part-aside] {
625
664
  overflow: auto;
626
665
  }
627
- [data-ui='app-shell']:not([data-aside-mode='overlay']) > [data-part='aside']:not([data-open]) {
666
+ [data-ui-app-shell]:not([data-aside-mode='overlay']) > [data-part-aside]:not([data-open]) {
628
667
  display: none;
629
668
  }
630
669
 
@@ -635,8 +674,8 @@
635
674
  * foot holds the actions that close its task. Both stand on the row inset
636
675
  * plus the edge, so the title's left edge is the content card's.
637
676
  */
638
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-header'],
639
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-footer'] {
677
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-header],
678
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-footer] {
640
679
  align-items: center;
641
680
  display: flex;
642
681
  flex: 0 0 auto;
@@ -646,18 +685,18 @@
646
685
  padding-block: var(--_row-inset);
647
686
  padding-inline: calc(var(--_row-inset) + var(--_row-gap));
648
687
  }
649
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-header'] {
688
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-header] {
650
689
  font-weight: var(--slotted-font-weight-semibold, 600);
651
690
  }
652
691
  /** The title takes the room and the control keeps its own. */
653
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-header'] > :not([data-part]) {
692
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-header] > :not([data-part]) {
654
693
  flex: 1 1 auto;
655
694
  min-inline-size: 0;
656
695
  overflow: hidden;
657
696
  text-overflow: ellipsis;
658
697
  white-space: nowrap;
659
698
  }
660
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-footer'] {
699
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-footer] {
661
700
  justify-content: flex-end;
662
701
  }
663
702
  /**
@@ -665,7 +704,7 @@
665
704
  * stands on the inset the head and the foot stand on, so what it holds lines
666
705
  * up with the pane's title and no consumer pads it by hand.
667
706
  */
668
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-body'] {
707
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-body] {
669
708
  flex: 1 1 auto;
670
709
  min-block-size: 0;
671
710
  min-inline-size: 0;
@@ -681,7 +720,7 @@
681
720
  scrollbar-width: thin;
682
721
  }
683
722
  /* Content that brings its own inset — a page, a detail panel, a list to the edges. */
684
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-body'][data-inset='none'] {
723
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-body][data-inset='none'] {
685
724
  padding: 0;
686
725
  }
687
726
 
@@ -699,7 +738,7 @@
699
738
  * At rest it draws nothing; under the hand, the drag and the keyboard its
700
739
  * outer border becomes the line, and the keyboard alone adds the ring.
701
740
  */
702
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer'] {
741
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer] {
703
742
  --_resizer-thickness: var(--slotted-space-6, 1rem);
704
743
  --_resizer-reach: var(--slotted-target-min, 24px);
705
744
  background: transparent;
@@ -716,29 +755,27 @@
716
755
  transition: border-color var(--_duration) var(--_easing);
717
756
  z-index: 1;
718
757
  }
719
- [data-ui='app-shell'][data-nav-side='end'] > [data-part='aside'] > [data-part='aside-resizer'] {
758
+ [data-ui-app-shell][data-nav-side='end'] > [data-part-aside] > [data-part-aside-resizer] {
720
759
  border-inline-end-width: var(--slotted-border-width-thick, 2px);
721
760
  border-inline-start-width: 0;
722
761
  inset-inline-end: 0;
723
762
  inset-inline-start: auto;
724
763
  }
725
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer']::before {
764
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer]::before {
726
765
  content: '';
727
766
  inset-block: 0;
728
767
  inset-inline: calc((var(--_resizer-reach) - var(--_resizer-thickness)) / -2);
729
768
  position: absolute;
730
769
  }
731
- [data-ui='app-shell']
732
- > [data-part='aside']
733
- > [data-part='aside-resizer']:not([data-disabled]):hover,
734
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer']:focus-visible,
735
- [data-ui='app-shell'][data-dragging] > [data-part='aside'] > [data-part='aside-resizer'] {
770
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer]:not([data-disabled]):hover,
771
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer]:focus-visible,
772
+ [data-ui-app-shell][data-dragging] > [data-part-aside] > [data-part-aside-resizer] {
736
773
  border-color: var(
737
774
  --slotted-app-shell-resizer-color,
738
775
  var(--slotted-border-strong, ButtonBorder)
739
776
  );
740
777
  }
741
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer']:focus-visible {
778
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer]:focus-visible {
742
779
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
743
780
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
744
781
  }
@@ -750,7 +787,7 @@
750
787
  * where a product does have one — a licence, a status, an environment — and
751
788
  * it takes only the height of its own line.
752
789
  */
753
- [data-ui='app-shell'] > [data-part='footer'] {
790
+ [data-ui-app-shell] > [data-part-footer] {
754
791
  align-items: center;
755
792
  background-color: var(--slotted-app-shell-footer-surface, transparent);
756
793
  color: var(
@@ -772,7 +809,7 @@
772
809
  * it. What it is a containing block for is the shell rather than the
773
810
  * viewport, because `container-type` contains layout.
774
811
  */
775
- [data-ui='app-shell'] > [data-part='layer'] {
812
+ [data-ui-app-shell] > [data-part-layer] {
776
813
  display: contents;
777
814
  }
778
815
 
@@ -786,30 +823,44 @@
786
823
  * finding — the closed strip had twelve pixels to its right, where the
787
824
  * content card begins, and nothing to its left.
788
825
  */
789
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='nav'] {
826
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-nav] {
827
+ /* The navigation stands on the sunken frame, which the secondary tone's
828
+ hover is 0.011 lighter than in the light scheme: a row's hover was the
829
+ frame itself. Both steps are recomputed from the ground it stands on. */
830
+ --slotted-tone-secondary-subtle-hover: color-mix(
831
+ in oklab,
832
+ var(--slotted-app-shell-nav-surface, var(--_frame)),
833
+ var(--slotted-text) 4%
834
+ );
835
+ --slotted-tone-secondary-subtle-active: color-mix(
836
+ in oklab,
837
+ var(--slotted-app-shell-nav-surface, var(--_frame)),
838
+ var(--slotted-text) 7%
839
+ );
840
+
790
841
  /* Invisible on the transparent default; a product that paints the column
791
842
  gets a region with the plane's corners rather than a square block. */
792
843
  border-radius: var(--_radius);
793
844
  margin-block: var(--_gutter);
794
845
  margin-inline-start: var(--_gutter);
795
846
  }
796
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='main'],
797
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='aside'],
798
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='main'],
799
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='aside'] {
847
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-main],
848
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-aside],
849
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-main],
850
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-aside] {
800
851
  border: var(--_rule-width) solid var(--_rule);
801
852
  border-radius: var(--_radius);
802
853
  box-shadow: var(--_elevation);
803
854
  margin-block: var(--_gutter);
804
855
  margin-inline: var(--_gutter);
805
856
  }
806
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='aside'],
807
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='aside'] {
857
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-aside],
858
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-aside] {
808
859
  margin-inline-start: 0;
809
860
  }
810
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='footer'],
811
- [data-ui='app-shell'][data-canvas='panel'] > [data-part='footer'],
812
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='footer'] {
861
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-footer],
862
+ [data-ui-app-shell][data-canvas='panel'] > [data-part-footer],
863
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-footer] {
813
864
  padding-block-start: 0;
814
865
  }
815
866
  /**
@@ -820,8 +871,8 @@
820
871
  * for the seam the gutter used to draw. Keyed on the mode, as every layer
821
872
  * rule is; the width answers only for a shell not yet measured, below.
822
873
  */
823
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='main'],
824
- [data-ui='app-shell'][data-canvas='inset'][data-nav-mode='overlay'] > [data-part='main'] {
874
+ [data-ui-app-shell][data-canvas='floating'][data-nav-mode='overlay'] > [data-part-main],
875
+ [data-ui-app-shell][data-canvas='inset'][data-nav-mode='overlay'] > [data-part-main] {
825
876
  border-block-end: 0;
826
877
  border-inline: 0;
827
878
  border-radius: 0;
@@ -836,33 +887,33 @@
836
887
  * carries the ground. Stated as the same six properties, so a product that
837
888
  * repaints one region keeps its choice under either plane.
838
889
  */
839
- [data-ui='app-shell'][data-canvas='flush'] {
890
+ [data-ui-app-shell][data-canvas='flush'] {
840
891
  --_edge: var(--_row-inset);
841
892
  --_nav-edges: var(--_seam-width);
842
893
  --_nav-inset: var(--_row-inset);
843
894
  }
844
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='banner'] {
895
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-banner] {
845
896
  background-color: var(
846
897
  --slotted-app-shell-banner-surface,
847
898
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
848
899
  );
849
900
  }
850
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='nav'] {
901
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-nav] {
851
902
  background-color: var(
852
903
  --slotted-app-shell-nav-surface,
853
904
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
854
905
  );
855
906
  }
856
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='main'] {
907
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-main] {
857
908
  background-color: var(--slotted-app-shell-main-surface, transparent);
858
909
  }
859
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='aside'] {
910
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-aside] {
860
911
  background-color: var(
861
912
  --slotted-app-shell-aside-surface,
862
913
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
863
914
  );
864
915
  }
865
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='footer'] {
916
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-footer] {
866
917
  background-color: var(
867
918
  --slotted-app-shell-footer-surface,
868
919
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -874,33 +925,33 @@
874
925
  * off-centre on this plane once; none at all put every row's ground against
875
926
  * the screen's edge and against the seam.
876
927
  */
877
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='nav'] {
928
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-nav] {
878
929
  padding-block: var(--_gutter);
879
930
  }
880
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='banner'] {
931
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-banner] {
881
932
  border-block-end: var(--_seam);
882
933
  }
883
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='footer'] {
934
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-footer] {
884
935
  border-block-start: var(--_seam);
885
936
  }
886
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='aside'] {
937
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-aside] {
887
938
  border-block-start: var(--_seam);
888
939
  }
889
940
  /* The seams inside a region: wherever regions touch without a gutter, which
890
941
  is every seam of `flush` and every seam inside the `panel` card. */
891
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
892
- > [data-part='nav']
893
- > [data-part='nav-footer'] {
942
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])
943
+ > [data-part-nav]
944
+ > [data-part-nav-footer] {
894
945
  border-block-start: var(--_seam);
895
946
  }
896
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
897
- > [data-part='aside']
898
- > [data-part='aside-header'] {
947
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])
948
+ > [data-part-aside]
949
+ > [data-part-aside-header] {
899
950
  border-block-end: var(--_seam);
900
951
  }
901
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
902
- > [data-part='aside']
903
- > [data-part='aside-footer'] {
952
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])
953
+ > [data-part-aside]
954
+ > [data-part-aside-footer] {
904
955
  border-block-start: var(--_seam);
905
956
  }
906
957
 
@@ -914,7 +965,7 @@
914
965
  * mark column and a row's inset each side, and the card's edge is added to
915
966
  * it rather than taken from the marks.
916
967
  */
917
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='nav'] {
968
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-nav] {
918
969
  background-color: var(
919
970
  --slotted-app-shell-nav-surface,
920
971
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -927,12 +978,12 @@
927
978
  }
928
979
  /* A card has an edge the column never had: the rows stand one inset in, as
929
980
  they do on the overlay card, and the bar's rows stand over them. */
930
- [data-ui='app-shell'][data-canvas='floating'] {
981
+ [data-ui-app-shell][data-canvas='floating'] {
931
982
  --_edge: calc(var(--_gutter) + var(--_rule-width) + var(--_row-inset));
932
983
  --_nav-edges: calc(2 * var(--_rule-width));
933
984
  --_nav-inset: var(--_row-inset);
934
985
  }
935
- [data-ui='app-shell'][data-canvas='floating'][data-nav-side='end'] > [data-part='nav'] {
986
+ [data-ui-app-shell][data-canvas='floating'][data-nav-side='end'] > [data-part-nav] {
936
987
  margin-inline: 0 var(--_gutter);
937
988
  }
938
989
 
@@ -951,11 +1002,11 @@
951
1002
  * A layer is a phone's arrangement, and a phone has no room for a frame: the
952
1003
  * card goes wherever the navigation is a layer, as the inset card does.
953
1004
  */
954
- [data-ui='app-shell']:is(
1005
+ [data-ui-app-shell]:is(
955
1006
  [data-canvas='floating'],
956
1007
  [data-canvas='inset']
957
1008
  )[data-primary='main']::before,
958
- [data-ui='app-shell'][data-canvas='panel']::before {
1009
+ [data-ui-app-shell][data-canvas='panel']::before {
959
1010
  background-color: var(
960
1011
  --slotted-app-shell-main-surface,
961
1012
  var(--slotted-app-shell-canvas, var(--slotted-surface))
@@ -968,17 +1019,14 @@
968
1019
  margin: var(--_gutter);
969
1020
  min-inline-size: 0;
970
1021
  }
971
- [data-ui='app-shell'][data-canvas='panel']::before {
1022
+ [data-ui-app-shell][data-canvas='panel']::before {
972
1023
  grid-area: 2 / 1 / 3 / -1;
973
1024
  margin: 0;
974
1025
  }
975
- [data-ui='app-shell'][data-canvas='panel']:is(
976
- [data-primary='nav'],
977
- [data-primary='main']
978
- )::before {
1026
+ [data-ui-app-shell][data-canvas='panel']:is([data-primary='nav'], [data-primary='main'])::before {
979
1027
  grid-area: 1 / 1 / 3 / -1;
980
1028
  }
981
- [data-ui='app-shell'][data-nav-mode='overlay'][data-canvas]::before {
1029
+ [data-ui-app-shell][data-nav-mode='overlay'][data-canvas]::before {
982
1030
  content: none;
983
1031
  }
984
1032
 
@@ -990,37 +1038,37 @@
990
1038
  * and keeps its ground with the card's lower corners. Between them is a
991
1039
  * seam, and `separation` decides it.
992
1040
  */
993
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
994
- > [data-part='banner'] {
1041
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1042
+ > [data-part-banner] {
995
1043
  margin-block-start: calc(var(--_gutter) + var(--_rule-width));
996
1044
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
997
1045
  padding-inline: 0;
998
1046
  }
999
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1000
- > [data-part='main'] {
1047
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1048
+ > [data-part-main] {
1001
1049
  border: none;
1002
1050
  border-radius: 0 0 var(--_inner-radius) var(--_inner-radius);
1003
1051
  box-shadow: none;
1004
1052
  margin-block: 0 calc(var(--_gutter) + var(--_rule-width));
1005
1053
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
1006
1054
  }
1007
- [data-ui='app-shell'][data-primary='main'] > [data-part='banner'],
1008
- [data-ui='app-shell'][data-primary='main'][data-nav-side='end'] > [data-part='banner'],
1009
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'] > [data-part='banner'],
1010
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'][data-nav-side='end']
1011
- > [data-part='banner'] {
1055
+ [data-ui-app-shell][data-primary='main'] > [data-part-banner],
1056
+ [data-ui-app-shell][data-primary='main'][data-nav-side='end'] > [data-part-banner],
1057
+ [data-ui-app-shell][data-canvas='panel'][data-primary='nav'] > [data-part-banner],
1058
+ [data-ui-app-shell][data-canvas='panel'][data-primary='nav'][data-nav-side='end']
1059
+ > [data-part-banner] {
1012
1060
  border-block-end: var(--_seam);
1013
1061
  grid-column: 2 / 3;
1014
1062
  }
1015
- [data-ui='app-shell'][data-primary='main'][data-nav-mode='overlay'] > [data-part='banner'] {
1063
+ [data-ui-app-shell][data-primary='main'][data-nav-mode='overlay'] > [data-part-banner] {
1016
1064
  margin: 0;
1017
1065
  padding-inline: var(--_edge);
1018
1066
  }
1019
- [data-ui='app-shell']:is(
1067
+ [data-ui-app-shell]:is(
1020
1068
  [data-canvas='floating'],
1021
1069
  [data-canvas='inset']
1022
1070
  )[data-primary='main'][data-nav-mode='overlay']
1023
- > [data-part='main'] {
1071
+ > [data-part-main] {
1024
1072
  border-radius: 0;
1025
1073
  margin: 0;
1026
1074
  }
@@ -1039,80 +1087,80 @@
1039
1087
  * measured below the compact width keeps it for one frame: the root cannot
1040
1088
  * query its own width, and that frame is the cost.
1041
1089
  */
1042
- [data-ui='app-shell'][data-canvas='panel'] {
1090
+ [data-ui-app-shell][data-canvas='panel'] {
1043
1091
  --_edge: calc(var(--_rule-width) + var(--_row-inset));
1044
1092
  --_nav-edges: var(--_seam-width);
1045
1093
  --_nav-inset: var(--_row-inset);
1046
1094
  }
1047
1095
  /* Once the navigation is a layer the card beside the bar is gone, and the
1048
1096
  bar's rows stand where the inset plane's do. */
1049
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'],
1050
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] {
1097
+ [data-ui-app-shell][data-canvas='floating'][data-nav-mode='overlay'],
1098
+ [data-ui-app-shell][data-canvas='panel'][data-nav-mode='overlay'] {
1051
1099
  --_edge: var(--_gutter);
1052
1100
  }
1053
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']) {
1101
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']) {
1054
1102
  box-sizing: border-box;
1055
1103
  padding-block-end: var(--_gutter);
1056
1104
  padding-inline: var(--_gutter);
1057
1105
  }
1058
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):is(
1106
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):is(
1059
1107
  [data-primary='nav'],
1060
1108
  [data-primary='main']
1061
1109
  ) {
1062
1110
  padding-block-start: var(--_gutter);
1063
1111
  }
1064
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part='nav'] {
1112
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part-nav] {
1065
1113
  border-end-start-radius: var(--_inner-radius);
1066
1114
  border-start-start-radius: var(--_inner-radius);
1067
1115
  margin: var(--_rule-width) 0 var(--_rule-width) var(--_rule-width);
1068
1116
  }
1069
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay'])[data-nav-side='end']
1070
- > [data-part='nav'] {
1117
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay'])[data-nav-side='end']
1118
+ > [data-part-nav] {
1071
1119
  border-radius: 0 var(--_inner-radius) var(--_inner-radius) 0;
1072
1120
  margin: var(--_rule-width) var(--_rule-width) var(--_rule-width) 0;
1073
1121
  }
1074
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part='main'] {
1122
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part-main] {
1075
1123
  border-end-end-radius: var(--_inner-radius);
1076
1124
  margin-block-end: var(--_rule-width);
1077
1125
  margin-inline-end: var(--_rule-width);
1078
1126
  }
1079
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1080
- > [data-part='main'] {
1127
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1128
+ > [data-part-main] {
1081
1129
  border-start-end-radius: var(--_inner-radius);
1082
1130
  margin-block-start: var(--_rule-width);
1083
1131
  }
1084
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):not(
1132
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):not(
1085
1133
  [data-primary='banner']
1086
1134
  )
1087
- > [data-part='banner'] {
1135
+ > [data-part-banner] {
1088
1136
  margin-block-start: var(--_rule-width);
1089
1137
  margin-inline-end: var(--_rule-width);
1090
1138
  }
1091
1139
  /* The corner the content shares with the card is the pane's once the pane
1092
1140
  stands beside it. */
1093
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1094
- > [data-part='aside'][data-open]
1141
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1142
+ > [data-part-aside][data-open]
1095
1143
  )
1096
- > [data-part='main'] {
1144
+ > [data-part-main] {
1097
1145
  border-end-end-radius: 0;
1098
1146
  border-start-end-radius: 0;
1099
1147
  margin-inline-end: 0;
1100
1148
  }
1101
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1102
- > [data-part='aside'][data-open]
1149
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1150
+ > [data-part-aside][data-open]
1103
1151
  )
1104
- > [data-part='banner'] {
1152
+ > [data-part-banner] {
1105
1153
  margin-inline-end: 0;
1106
1154
  }
1107
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):not(
1155
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):not(
1108
1156
  [data-aside-mode='overlay']
1109
1157
  )
1110
- > [data-part='aside'] {
1158
+ > [data-part-aside] {
1111
1159
  border-end-end-radius: var(--_inner-radius);
1112
1160
  border-start-end-radius: var(--_inner-radius);
1113
1161
  margin: var(--_rule-width) var(--_rule-width) var(--_rule-width) 0;
1114
1162
  }
1115
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] > [data-part='main'] {
1163
+ [data-ui-app-shell][data-canvas='panel'][data-nav-mode='overlay'] > [data-part-main] {
1116
1164
  border-block-start: var(--_rule-width) solid var(--_rule);
1117
1165
  }
1118
1166
 
@@ -1130,14 +1178,14 @@
1130
1178
  * gives it once the navigation is a layer — the frame is the box of `main`
1131
1179
  * and covers that edge already.
1132
1180
  */
1133
- [data-ui='app-shell']:is([data-canvas='flush'], [data-primary='main']),
1134
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'] {
1181
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-primary='main']),
1182
+ [data-ui-app-shell][data-canvas='panel'][data-primary='nav'] {
1135
1183
  --_progress-lift: var(--_seam-width);
1136
1184
  }
1137
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner'] {
1185
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner'] {
1138
1186
  --_progress-lift: var(--_rule-width);
1139
1187
  }
1140
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] {
1188
+ [data-ui-app-shell][data-canvas='panel'][data-nav-mode='overlay'] {
1141
1189
  --_progress-lift: 0px;
1142
1190
  }
1143
1191
 
@@ -1152,50 +1200,62 @@
1152
1200
  * their originals in the narrow query below. `app-shell.styles.test.mjs`
1153
1201
  * holds every rule that gives `main` a margin or a radius to its twin.
1154
1202
  */
1155
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='progress'],
1156
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='progress'] {
1203
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-progress],
1204
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-progress] {
1157
1205
  border-radius: var(--_radius);
1158
1206
  margin-block: var(--_gutter);
1159
1207
  margin-inline: var(--_gutter);
1160
1208
  }
1161
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='progress'],
1162
- [data-ui='app-shell'][data-canvas='inset'][data-nav-mode='overlay'] > [data-part='progress'] {
1209
+ [data-ui-app-shell][data-canvas='floating'][data-nav-mode='overlay'] > [data-part-progress],
1210
+ [data-ui-app-shell][data-canvas='inset'][data-nav-mode='overlay'] > [data-part-progress] {
1163
1211
  border-radius: 0;
1164
1212
  margin: 0;
1165
1213
  }
1166
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1167
- > [data-part='progress'] {
1214
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1215
+ > [data-part-progress] {
1168
1216
  border-radius: 0 0 var(--_inner-radius) var(--_inner-radius);
1169
1217
  margin-block: 0 calc(var(--_gutter) + var(--_rule-width));
1170
1218
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
1171
1219
  }
1172
- [data-ui='app-shell']:is(
1220
+ [data-ui-app-shell]:is(
1173
1221
  [data-canvas='floating'],
1174
1222
  [data-canvas='inset']
1175
1223
  )[data-primary='main'][data-nav-mode='overlay']
1176
- > [data-part='progress'] {
1224
+ > [data-part-progress] {
1177
1225
  border-radius: 0;
1178
1226
  margin: 0;
1179
1227
  }
1180
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay'])
1181
- > [data-part='progress'] {
1228
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part-progress] {
1182
1229
  border-end-end-radius: var(--_inner-radius);
1183
1230
  margin-block-end: var(--_rule-width);
1184
1231
  margin-inline-end: var(--_rule-width);
1185
1232
  }
1186
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1187
- > [data-part='progress'] {
1233
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1234
+ > [data-part-progress] {
1188
1235
  border-start-end-radius: var(--_inner-radius);
1189
1236
  margin-block-start: var(--_rule-width);
1190
1237
  }
1191
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1192
- > [data-part='aside'][data-open]
1238
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1239
+ > [data-part-aside][data-open]
1193
1240
  )
1194
- > [data-part='progress'] {
1241
+ > [data-part-progress] {
1195
1242
  border-end-end-radius: 0;
1196
1243
  border-start-end-radius: 0;
1197
1244
  margin-inline-end: 0;
1198
1245
  }
1246
+
1247
+ /**
1248
+ * The seam re-read in each region's scope. `--_seam` declared on the root
1249
+ * holds the root's `--slotted-app-shell-border-color`, so the property written
1250
+ * on a region recoloured nothing. Declared again on every region, the chain
1251
+ * resolves where the region stands: a colour written there recolours the
1252
+ * seams the region and its parts draw, and `transparent` removes them. The
1253
+ * tone rules below state the same two declarations at a higher specificity.
1254
+ */
1255
+ [data-ui-app-shell] > [data-part] {
1256
+ --_rule: var(--slotted-app-shell-border-color, var(--slotted-border-subtle, ButtonBorder));
1257
+ --_seam: var(--_rule-width) solid var(--_rule);
1258
+ }
1199
1259
  /* ── Separation by tone ──────────────────────────────────────────────── */
1200
1260
 
1201
1261
  /**
@@ -1213,11 +1273,12 @@
1213
1273
  * where it is declared, and a region carrying a scheme of its own must mix
1214
1274
  * its own ink.
1215
1275
  */
1216
- [data-ui='app-shell'][data-separation='tone'] {
1276
+ [data-ui-app-shell][data-separation='tone'],
1277
+ [data-ui-app-shell][data-separation='tone'] > [data-part] {
1217
1278
  --_seam: none;
1218
1279
  --_seam-width: 0px;
1219
1280
  }
1220
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone'] > [data-part='footer'] {
1281
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone'] > [data-part-footer] {
1221
1282
  --_ground: var(
1222
1283
  --slotted-app-shell-footer-surface,
1223
1284
  var(
@@ -1226,8 +1287,8 @@
1226
1287
  )
1227
1288
  );
1228
1289
  }
1229
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1230
- > [data-part='banner'] {
1290
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1291
+ > [data-part-banner] {
1231
1292
  --_ground: var(
1232
1293
  --slotted-app-shell-banner-surface,
1233
1294
  var(
@@ -1236,8 +1297,8 @@
1236
1297
  )
1237
1298
  );
1238
1299
  }
1239
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1240
- > [data-part='nav'] {
1300
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1301
+ > [data-part-nav] {
1241
1302
  --_ground: var(
1242
1303
  --slotted-app-shell-nav-surface,
1243
1304
  var(
@@ -1246,8 +1307,8 @@
1246
1307
  )
1247
1308
  );
1248
1309
  }
1249
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1250
- > [data-part='aside'] {
1310
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1311
+ > [data-part-aside] {
1251
1312
  --_ground: var(
1252
1313
  --slotted-app-shell-aside-surface,
1253
1314
  var(
@@ -1256,18 +1317,18 @@
1256
1317
  )
1257
1318
  );
1258
1319
  }
1259
- [data-ui='app-shell'][data-separation='tone'] > [data-part='nav'] > [data-part='nav-rail'] {
1320
+ [data-ui-app-shell][data-separation='tone'] > [data-part-nav] > [data-part-nav-rail] {
1260
1321
  --_ground: var(
1261
1322
  --slotted-app-shell-tone-surface,
1262
1323
  color-mix(in oklab, var(--slotted-surface), var(--slotted-text) 4.5%)
1263
1324
  );
1264
1325
  }
1265
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1266
- > [data-part='banner'],
1267
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone'] > [data-part='footer'],
1268
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1269
- > :is([data-part='nav'], [data-part='aside']),
1270
- [data-ui='app-shell'][data-separation='tone'] > [data-part='nav'] > [data-part='nav-rail'] {
1326
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1327
+ > [data-part-banner],
1328
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone'] > [data-part-footer],
1329
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1330
+ > :is([data-part-nav], [data-part-aside]),
1331
+ [data-ui-app-shell][data-separation='tone'] > [data-part-nav] > [data-part-nav-rail] {
1271
1332
  --slotted-tone-secondary-subtle-hover: color-mix(
1272
1333
  in oklab,
1273
1334
  var(--_ground),
@@ -1283,7 +1344,7 @@
1283
1344
  }
1284
1345
  /* The content keeps the surface under a toned frame: on the flush plane it
1285
1346
  carried the sunken ground, which is 0.014 from the tone. */
1286
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone'] > [data-part='main'] {
1347
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone'] > [data-part-main] {
1287
1348
  background-color: var(
1288
1349
  --slotted-app-shell-main-surface,
1289
1350
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -1303,12 +1364,12 @@
1303
1364
  * on the way in. `:has()` recognises the part, so no script writes an
1304
1365
  * attribute and a server render has the grid on its first paint.
1305
1366
  */
1306
- [data-ui='app-shell'] > [data-part='nav']:has(> [data-part='nav-rail']) {
1367
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) {
1307
1368
  display: grid;
1308
1369
  grid-template-columns: var(--_rail-size) minmax(var(--_nav-size), 1fr);
1309
1370
  grid-template-rows: auto minmax(0, 1fr) auto;
1310
1371
  }
1311
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-rail'] {
1372
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-rail] {
1312
1373
  align-items: center;
1313
1374
  border-inline-end: var(--_seam);
1314
1375
  box-sizing: border-box;
@@ -1322,47 +1383,43 @@
1322
1383
  padding-block: var(--_row-inset);
1323
1384
  scrollbar-width: none;
1324
1385
  }
1325
- [data-ui='app-shell']
1326
- > [data-part='nav']:has(> [data-part='nav-rail'])
1327
- > [data-part='nav-header'] {
1386
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) > [data-part-nav-header] {
1328
1387
  grid-area: 1 / 2 / 2 / 3;
1329
1388
  }
1330
- [data-ui='app-shell'] > [data-part='nav']:has(> [data-part='nav-rail']) > [data-part='nav-body'] {
1389
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) > [data-part-nav-body] {
1331
1390
  grid-area: 2 / 2 / 3 / 3;
1332
1391
  }
1333
- [data-ui='app-shell']
1334
- > [data-part='nav']:has(> [data-part='nav-rail'])
1335
- > [data-part='nav-footer'] {
1392
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) > [data-part-nav-footer] {
1336
1393
  grid-area: 3 / 2 / 4 / 3;
1337
1394
  }
1338
1395
  /* The strip's rule is an edge, and a row whose ground meets it reads as a
1339
1396
  column with no padding. */
1340
- [data-ui='app-shell']
1341
- > [data-part='nav']:has(> [data-part='nav-rail'])
1342
- > :is([data-part='nav-header'], [data-part='nav-body'], [data-part='nav-footer']) {
1343
- padding-inline-start: var(--_row-inset);
1397
+ [data-ui-app-shell]
1398
+ > [data-part-nav]:has(> [data-part-nav-rail])
1399
+ > :is([data-part-nav-header], [data-part-nav-body], [data-part-nav-footer]) {
1400
+ padding-inline-start: calc(var(--_row-inset) + var(--_row-ring-inset));
1344
1401
  transition: visibility var(--_duration) step-start;
1345
1402
  }
1346
- [data-ui='app-shell'][data-nav-mode='inline'][data-open]
1347
- > [data-part='nav']:has(> [data-part='nav-rail']) {
1403
+ [data-ui-app-shell][data-nav-mode='inline'][data-open]
1404
+ > [data-part-nav]:has(> [data-part-nav-rail]) {
1348
1405
  inline-size: calc(var(--_rail-size) + var(--_nav-size) + var(--_nav-edges));
1349
1406
  }
1350
1407
  /* Closed, the region is the strip and its edges: the strip holds a row's
1351
1408
  inset on each side of its marks already. */
1352
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1353
- > [data-part='nav']:has(> [data-part='nav-rail']) {
1409
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1410
+ > [data-part-nav]:has(> [data-part-nav-rail]) {
1354
1411
  inline-size: calc(var(--_rail-size) + var(--_nav-edges));
1355
1412
  }
1356
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1357
- > [data-part='nav']:has(> [data-part='nav-rail'])
1358
- > :is([data-part='nav-header'], [data-part='nav-body'], [data-part='nav-footer']) {
1413
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1414
+ > [data-part-nav]:has(> [data-part-nav-rail])
1415
+ > :is([data-part-nav-header], [data-part-nav-body], [data-part-nav-footer]) {
1359
1416
  transition: visibility var(--_duration) step-end;
1360
1417
  visibility: hidden;
1361
1418
  }
1362
1419
  /* A closed strip is the region's edge, and the edge is the plane's to draw. */
1363
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1364
- > [data-part='nav']
1365
- > [data-part='nav-rail'] {
1420
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1421
+ > [data-part-nav]
1422
+ > [data-part-nav-rail] {
1366
1423
  border-inline-end: none;
1367
1424
  }
1368
1425
 
@@ -1375,7 +1432,8 @@
1375
1432
  * a forced-colours rule of its own for.
1376
1433
  */
1377
1434
  @media (forced-colors: active) {
1378
- [data-ui='app-shell'][data-separation='tone'] {
1435
+ [data-ui-app-shell][data-separation='tone'],
1436
+ [data-ui-app-shell][data-separation='tone'] > [data-part] {
1379
1437
  --_seam: var(--_rule-width) solid CanvasText;
1380
1438
  --_seam-width: var(--_rule-width);
1381
1439
  }
@@ -1396,8 +1454,8 @@
1396
1454
  * The pane's control is the same control: the same box, the same ink, the
1397
1455
  * same pair of marks. What differs is which way the artwork faces, below.
1398
1456
  */
1399
- [data-ui='app-shell'] [data-part='nav-toggle'],
1400
- [data-ui='app-shell'] [data-part='aside-toggle'] {
1457
+ [data-ui-app-shell] [data-part-nav-toggle],
1458
+ [data-ui-app-shell] [data-part-aside-toggle] {
1401
1459
  --slotted-icon-size: var(--slotted-control-icon-size-md, 16px);
1402
1460
 
1403
1461
  background-color: transparent;
@@ -1434,37 +1492,31 @@
1434
1492
  * navigation's turns. The box is not `directional`: which side the region
1435
1493
  * stands on is this family's fact, not the reading direction's alone.
1436
1494
  */
1437
- [data-ui='app-shell'][data-nav-side='end'] [data-part='nav-toggle'] > [data-ui='icon'],
1438
- [dir='rtl'] [data-ui='app-shell'] [data-part='nav-toggle'] > [data-ui='icon'],
1439
- [data-ui='app-shell']:not([data-nav-side='end']) [data-part='aside-toggle'] > [data-ui='icon'],
1440
- [dir='rtl']
1441
- [data-ui='app-shell'][data-nav-side='end']
1442
- [data-part='aside-toggle']
1443
- > [data-ui='icon'] {
1495
+ [data-ui-app-shell][data-nav-side='end'] [data-part-nav-toggle] > [data-ui-icon],
1496
+ [dir='rtl'] [data-ui-app-shell] [data-part-nav-toggle] > [data-ui-icon],
1497
+ [data-ui-app-shell]:not([data-nav-side='end']) [data-part-aside-toggle] > [data-ui-icon],
1498
+ [dir='rtl'] [data-ui-app-shell][data-nav-side='end'] [data-part-aside-toggle] > [data-ui-icon] {
1444
1499
  scale: -1 1;
1445
1500
  }
1501
+ [dir='rtl'] [data-ui-app-shell][data-nav-side='end'] [data-part-nav-toggle] > [data-ui-icon],
1446
1502
  [dir='rtl']
1447
- [data-ui='app-shell'][data-nav-side='end']
1448
- [data-part='nav-toggle']
1449
- > [data-ui='icon'],
1450
- [dir='rtl']
1451
- [data-ui='app-shell']:not([data-nav-side='end'])
1452
- [data-part='aside-toggle']
1453
- > [data-ui='icon'] {
1503
+ [data-ui-app-shell]:not([data-nav-side='end'])
1504
+ [data-part-aside-toggle]
1505
+ > [data-ui-icon] {
1454
1506
  scale: 1 1;
1455
1507
  }
1456
1508
 
1457
- [data-ui='app-shell'] [data-part='nav-toggle']:enabled:hover,
1458
- [data-ui='app-shell'] [data-part='aside-toggle']:enabled:hover {
1509
+ [data-ui-app-shell] [data-part-nav-toggle]:enabled:hover,
1510
+ [data-ui-app-shell] [data-part-aside-toggle]:enabled:hover {
1459
1511
  background-color: var(--slotted-tone-secondary-subtle-hover, ButtonFace);
1460
1512
  color: currentcolor;
1461
1513
  }
1462
- [data-ui='app-shell'] [data-part='nav-toggle']:enabled:active,
1463
- [data-ui='app-shell'] [data-part='aside-toggle']:enabled:active {
1514
+ [data-ui-app-shell] [data-part-nav-toggle]:enabled:active,
1515
+ [data-ui-app-shell] [data-part-aside-toggle]:enabled:active {
1464
1516
  background-color: var(--slotted-tone-secondary-subtle-active, ButtonFace);
1465
1517
  }
1466
- [data-ui='app-shell'] [data-part='nav-toggle']:focus-visible,
1467
- [data-ui='app-shell'] [data-part='aside-toggle']:focus-visible {
1518
+ [data-ui-app-shell] [data-part-nav-toggle]:focus-visible,
1519
+ [data-ui-app-shell] [data-part-aside-toggle]:focus-visible {
1468
1520
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1469
1521
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1470
1522
  }
@@ -1476,31 +1528,35 @@
1476
1528
  * mode at any width. The container query further down is the fallback for
1477
1529
  * the frame before the binding has measured, and nothing else.
1478
1530
  */
1479
- [data-ui='app-shell'][data-nav-mode='inline'] > [data-part='nav'] {
1480
- inline-size: calc(var(--_rail-size) + 2 * var(--_nav-inset) + var(--_nav-edges));
1531
+ /* The rail holds the parts' ring inset on each side as well, so a control
1532
+ at the mark's size keeps its focus ring inside the body beside the gutter. */
1533
+ [data-ui-app-shell][data-nav-mode='inline'] > [data-part-nav] {
1534
+ inline-size: calc(
1535
+ var(--_rail-size) + 2 * (var(--_nav-inset) + var(--_row-ring-inset)) + var(--_nav-edges)
1536
+ );
1481
1537
  }
1482
- [data-ui='app-shell'][data-nav-mode='inline'][data-open] > [data-part='nav'] {
1538
+ [data-ui-app-shell][data-nav-mode='inline'][data-open] > [data-part-nav] {
1483
1539
  inline-size: var(--_nav-size);
1484
1540
  }
1485
1541
  /**
1486
1542
  * The rail centres its marks, all three rows together: a head centred over a
1487
1543
  * body that is not reads as two columns in one strip.
1488
1544
  */
1489
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1490
- > [data-part='nav']
1491
- > [data-part='nav-header'],
1492
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1493
- > [data-part='nav']
1494
- > [data-part='nav-footer'] {
1545
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1546
+ > [data-part-nav]
1547
+ > [data-part-nav-header],
1548
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1549
+ > [data-part-nav]
1550
+ > [data-part-nav-footer] {
1495
1551
  /* Two marks in one end of a rail — the control and the account — stand
1496
1552
  one over the other: the rail is one mark column wide, so a row of two
1497
1553
  is a row that overflows it. */
1498
1554
  flex-wrap: wrap;
1499
1555
  justify-content: center;
1500
1556
  }
1501
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1502
- > [data-part='nav']
1503
- > [data-part='nav-body'] {
1557
+ [data-ui-app-shell][data-nav-mode='inline']:not([data-open])
1558
+ > [data-part-nav]
1559
+ > [data-part-nav-body] {
1504
1560
  align-items: center;
1505
1561
  }
1506
1562
  /**
@@ -1513,35 +1569,35 @@
1513
1569
  * `hidden` does not animate, because it is a removal rather than a change of
1514
1570
  * width.
1515
1571
  */
1516
- [data-ui='app-shell'][data-nav-mode='inline'][data-collapsed-to='hidden']:not([data-open])
1517
- > [data-part='nav'] {
1572
+ [data-ui-app-shell][data-nav-mode='inline'][data-collapsed-to='hidden']:not([data-open])
1573
+ > [data-part-nav] {
1518
1574
  display: none;
1519
1575
  }
1520
1576
 
1521
- [data-ui='app-shell'][data-nav-side='end'] > [data-part='nav'] {
1577
+ [data-ui-app-shell][data-nav-side='end'] > [data-part-nav] {
1522
1578
  grid-area: 2 / 3 / 3 / 4;
1523
1579
  }
1524
- [data-ui='app-shell'][data-canvas='inset'][data-nav-side='end'] > [data-part='nav'] {
1580
+ [data-ui-app-shell][data-canvas='inset'][data-nav-side='end'] > [data-part-nav] {
1525
1581
  margin-inline: 0 var(--_gutter);
1526
1582
  }
1527
- [data-ui='app-shell'][data-canvas='flush'][data-nav-side='end'] > [data-part='nav'] {
1583
+ [data-ui-app-shell][data-canvas='flush'][data-nav-side='end'] > [data-part-nav] {
1528
1584
  padding-inline: 0 var(--_gutter);
1529
1585
  }
1530
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel']) > [data-part='nav'] {
1586
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel']) > [data-part-nav] {
1531
1587
  border-inline-end: var(--_seam);
1532
1588
  }
1533
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-nav-side='end']
1534
- > [data-part='nav'] {
1589
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-nav-side='end']
1590
+ > [data-part-nav] {
1535
1591
  border-inline-end: none;
1536
1592
  border-inline-start: var(--_seam);
1537
1593
  }
1538
1594
 
1539
1595
  /** Reaching the corner: the navigation spans every row instead. */
1540
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main']) > [data-part='nav'] {
1596
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main']) > [data-part-nav] {
1541
1597
  grid-area: 1 / 1 / -1 / 2;
1542
1598
  }
1543
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1544
- > [data-part='nav'] {
1599
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1600
+ > [data-part-nav] {
1545
1601
  grid-area: 1 / 3 / -1 / 4;
1546
1602
  }
1547
1603
  /**
@@ -1549,22 +1605,22 @@
1549
1605
  * and whatever the bar carries sit on one line rather than being two headers
1550
1606
  * of different sizes in the same row of the screen.
1551
1607
  */
1552
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])
1553
- > [data-part='nav']
1554
- > [data-part='nav-header'] {
1608
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main'])
1609
+ > [data-part-nav]
1610
+ > [data-part-nav-header] {
1555
1611
  /* The head's own padding is inside the banner's height, or the mark stands
1556
1612
  its padding lower than the bar beside it. */
1557
1613
  box-sizing: border-box;
1558
1614
  min-block-size: var(--_banner-size);
1559
1615
  }
1560
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main']) > [data-part='banner'],
1561
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main']) > [data-part='footer'] {
1616
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main']) > [data-part-banner],
1617
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main']) > [data-part-footer] {
1562
1618
  grid-column: 2 / -1;
1563
1619
  }
1564
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1565
- > [data-part='banner'],
1566
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1567
- > [data-part='footer'] {
1620
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1621
+ > [data-part-banner],
1622
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1623
+ > [data-part-footer] {
1568
1624
  grid-column: 1 / -2;
1569
1625
  }
1570
1626
  /**
@@ -1573,8 +1629,8 @@
1573
1629
  * `panel` the banner is inside the card whether the column or the content
1574
1630
  * is primary, so `nav` draws what `main` draws there.
1575
1631
  */
1576
- [data-ui='app-shell'][data-primary='main'] > [data-part='banner'],
1577
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'] > [data-part='banner'] {
1632
+ [data-ui-app-shell][data-primary='main'] > [data-part-banner],
1633
+ [data-ui-app-shell][data-canvas='panel'][data-primary='nav'] > [data-part-banner] {
1578
1634
  grid-column: 2 / 3;
1579
1635
  }
1580
1636
 
@@ -1595,7 +1651,7 @@
1595
1651
  * puts the veil over the bar as well: the reader then has no fixed point on
1596
1652
  * the screen at all.
1597
1653
  */
1598
- [data-ui='app-shell'][data-nav-mode='overlay'] > [data-part='nav'] {
1654
+ [data-ui-app-shell][data-nav-mode='overlay'] > [data-part-nav] {
1599
1655
  /* A layer has an edge on every plane, so its rows stand one inset in. The
1600
1656
  inset is read by the parts, which take it from here. */
1601
1657
  --_nav-inset: var(--_row-inset);
@@ -1624,14 +1680,14 @@
1624
1680
  visibility: hidden;
1625
1681
  z-index: var(--slotted-z-index-overlay, 1000);
1626
1682
  }
1627
- [data-ui='app-shell'][data-nav-mode='overlay'][data-open] > [data-part='nav'] {
1683
+ [data-ui-app-shell][data-nav-mode='overlay'][data-open] > [data-part-nav] {
1628
1684
  transition:
1629
1685
  translate var(--_duration) var(--slotted-easing-enter, cubic-bezier(0.05, 0.7, 0.1, 1)),
1630
1686
  visibility var(--_duration) step-start;
1631
1687
  translate: 0 0;
1632
1688
  visibility: visible;
1633
1689
  }
1634
- [data-ui='app-shell'][data-nav-mode='overlay'][data-nav-side='end'] > [data-part='nav'] {
1690
+ [data-ui-app-shell][data-nav-mode='overlay'][data-nav-side='end'] > [data-part-nav] {
1635
1691
  inset-inline-end: 0;
1636
1692
  inset-inline-start: auto;
1637
1693
  translate: 100% 0;
@@ -1649,9 +1705,9 @@
1649
1705
  * three parts: the marks keep one column, and a consumer's header row that
1650
1706
  * writes the same inset stays over them.
1651
1707
  */
1652
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='nav'],
1653
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] > [data-part='nav'],
1654
- [data-ui='app-shell'][data-canvas='inset'][data-nav-mode='overlay'] > [data-part='nav'] {
1708
+ [data-ui-app-shell][data-canvas='floating'][data-nav-mode='overlay'] > [data-part-nav],
1709
+ [data-ui-app-shell][data-canvas='panel'][data-nav-mode='overlay'] > [data-part-nav],
1710
+ [data-ui-app-shell][data-canvas='inset'][data-nav-mode='overlay'] > [data-part-nav] {
1655
1711
  border: var(--_rule-width) solid var(--_rule);
1656
1712
  border-radius: var(--_radius);
1657
1713
  box-shadow: var(--slotted-shadow-lg);
@@ -1659,14 +1715,14 @@
1659
1715
  margin-inline-start: var(--_gutter);
1660
1716
  translate: calc(-100% - var(--_gutter)) 0;
1661
1717
  }
1662
- [data-ui='app-shell']:not([data-canvas='flush'])[data-nav-mode='overlay'][data-nav-side='end']
1663
- > [data-part='nav'] {
1718
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-nav-mode='overlay'][data-nav-side='end']
1719
+ > [data-part-nav] {
1664
1720
  margin-inline-end: var(--_gutter);
1665
1721
  margin-inline-start: 0;
1666
1722
  translate: calc(100% + var(--_gutter)) 0;
1667
1723
  }
1668
- [data-ui='app-shell']:not([data-canvas='flush'])[data-nav-mode='overlay'][data-open]
1669
- > [data-part='nav'] {
1724
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-nav-mode='overlay'][data-open]
1725
+ > [data-part-nav] {
1670
1726
  translate: 0 0;
1671
1727
  }
1672
1728
 
@@ -1678,7 +1734,7 @@
1678
1734
  * every inline distance. It slides in from the end the navigation is not on,
1679
1735
  * which is the end the pane stands at as a column.
1680
1736
  */
1681
- [data-ui='app-shell'][data-aside-mode='overlay'] > [data-part='aside'] {
1737
+ [data-ui-app-shell][data-aside-mode='overlay'] > [data-part-aside] {
1682
1738
  background-color: var(
1683
1739
  --slotted-app-shell-aside-surface,
1684
1740
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -1701,21 +1757,21 @@
1701
1757
  visibility: hidden;
1702
1758
  z-index: var(--slotted-z-index-overlay, 1000);
1703
1759
  }
1704
- [data-ui='app-shell'][data-aside-mode='overlay'] > [data-part='aside'][data-open] {
1760
+ [data-ui-app-shell][data-aside-mode='overlay'] > [data-part-aside][data-open] {
1705
1761
  transition:
1706
1762
  translate var(--_duration) var(--slotted-easing-enter, cubic-bezier(0.05, 0.7, 0.1, 1)),
1707
1763
  visibility var(--_duration) step-start;
1708
1764
  translate: 0 0;
1709
1765
  visibility: visible;
1710
1766
  }
1711
- [data-ui='app-shell'][data-aside-mode='overlay'][data-nav-side='end'] > [data-part='aside'] {
1767
+ [data-ui-app-shell][data-aside-mode='overlay'][data-nav-side='end'] > [data-part-aside] {
1712
1768
  inset-inline-end: auto;
1713
1769
  inset-inline-start: 0;
1714
1770
  translate: -100% 0;
1715
1771
  }
1716
- [data-ui='app-shell'][data-canvas='floating'][data-aside-mode='overlay'] > [data-part='aside'],
1717
- [data-ui='app-shell'][data-canvas='panel'][data-aside-mode='overlay'] > [data-part='aside'],
1718
- [data-ui='app-shell'][data-canvas='inset'][data-aside-mode='overlay'] > [data-part='aside'] {
1772
+ [data-ui-app-shell][data-canvas='floating'][data-aside-mode='overlay'] > [data-part-aside],
1773
+ [data-ui-app-shell][data-canvas='panel'][data-aside-mode='overlay'] > [data-part-aside],
1774
+ [data-ui-app-shell][data-canvas='inset'][data-aside-mode='overlay'] > [data-part-aside] {
1719
1775
  border: var(--_rule-width) solid var(--_rule);
1720
1776
  border-radius: var(--_radius);
1721
1777
  box-shadow: var(--slotted-shadow-lg);
@@ -1723,14 +1779,14 @@
1723
1779
  margin-inline-end: var(--_gutter);
1724
1780
  translate: calc(100% + var(--_gutter)) 0;
1725
1781
  }
1726
- [data-ui='app-shell']:not([data-canvas='flush'])[data-aside-mode='overlay'][data-nav-side='end']
1727
- > [data-part='aside'] {
1782
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-aside-mode='overlay'][data-nav-side='end']
1783
+ > [data-part-aside] {
1728
1784
  margin-inline-end: 0;
1729
1785
  margin-inline-start: var(--_gutter);
1730
1786
  translate: calc(-100% - var(--_gutter)) 0;
1731
1787
  }
1732
- [data-ui='app-shell']:not([data-canvas='flush'])[data-aside-mode='overlay']
1733
- > [data-part='aside'][data-open] {
1788
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-aside-mode='overlay']
1789
+ > [data-part-aside][data-open] {
1734
1790
  translate: 0 0;
1735
1791
  }
1736
1792
 
@@ -1753,10 +1809,12 @@
1753
1809
  * rather than of mode, so the width answers it and the width alone.
1754
1810
  */
1755
1811
  @container slotted-app-shell (inline-size >= 600px) {
1756
- [data-ui='app-shell']:not([data-nav-mode]) > [data-part='nav'] {
1757
- inline-size: calc(var(--_rail-size) + 2 * var(--_nav-inset) + var(--_nav-edges));
1812
+ [data-ui-app-shell]:not([data-nav-mode]) > [data-part-nav] {
1813
+ inline-size: calc(
1814
+ var(--_rail-size) + 2 * (var(--_nav-inset) + var(--_row-ring-inset)) + var(--_nav-edges)
1815
+ );
1758
1816
  }
1759
- [data-ui='app-shell']:not([data-nav-mode])[data-open] > [data-part='nav'] {
1817
+ [data-ui-app-shell]:not([data-nav-mode])[data-open] > [data-part-nav] {
1760
1818
  inline-size: var(--_nav-size);
1761
1819
  }
1762
1820
 
@@ -1768,63 +1826,60 @@
1768
1826
  the unit resolves against the shell's own inline size from inside this
1769
1827
  `auto` track, where a percentage would resolve against the track the
1770
1828
  pane itself sizes. */
1771
- [data-ui='app-shell']:not([data-aside-mode='overlay']) > [data-part='aside'] {
1829
+ [data-ui-app-shell]:not([data-aside-mode='overlay']) > [data-part-aside] {
1772
1830
  grid-area: 2 / 3 / 3 / 4;
1773
1831
  inline-size: var(--slotted-app-shell-aside-extent, var(--_aside-size));
1774
1832
  position: relative;
1775
1833
  }
1776
- [data-ui='app-shell']:not([data-aside-mode='overlay'])
1777
- > [data-part='aside']
1778
- > [data-part='aside-resizer']:not([hidden]) {
1834
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])
1835
+ > [data-part-aside]
1836
+ > [data-part-aside-resizer]:not([hidden]) {
1779
1837
  display: block;
1780
1838
  }
1781
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-nav-side='end']
1782
- > [data-part='aside'] {
1839
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-nav-side='end'] > [data-part-aside] {
1783
1840
  grid-area: 2 / 1 / 3 / 2;
1784
1841
  }
1785
1842
  /* Under `primary="main"` the pane, as a column, stands beside the card
1786
1843
  that holds the banner and the content, so it spans the banner's row. */
1787
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-primary='main']
1788
- > [data-part='aside'],
1789
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-canvas='panel'][data-primary='nav']
1790
- > [data-part='aside'] {
1844
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-primary='main'] > [data-part-aside],
1845
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-canvas='panel'][data-primary='nav']
1846
+ > [data-part-aside] {
1791
1847
  grid-row: 1 / 3;
1792
1848
  }
1793
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1849
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1794
1850
  [data-canvas='floating'],
1795
1851
  [data-canvas='inset']
1796
1852
  )[data-nav-side='end']
1797
- > [data-part='aside'] {
1853
+ > [data-part-aside] {
1798
1854
  margin-inline: var(--_gutter) 0;
1799
1855
  }
1800
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-canvas='flush']
1801
- > [data-part='aside'] {
1856
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-canvas='flush'] > [data-part-aside] {
1802
1857
  border-block-start: none;
1803
1858
  }
1804
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1859
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1805
1860
  [data-canvas='flush'],
1806
1861
  [data-canvas='panel']
1807
1862
  )
1808
- > [data-part='aside'] {
1863
+ > [data-part-aside] {
1809
1864
  border-inline-start: var(--_seam);
1810
1865
  }
1811
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1866
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1812
1867
  [data-canvas='flush'],
1813
1868
  [data-canvas='panel']
1814
1869
  )[data-nav-side='end']
1815
- > [data-part='aside'] {
1870
+ > [data-part-aside] {
1816
1871
  border-inline-end: var(--_seam);
1817
1872
  border-inline-start: none;
1818
1873
  }
1819
1874
  }
1820
1875
 
1821
1876
  @container slotted-app-shell (inline-size < 600px) {
1822
- [data-ui='app-shell']:not([data-nav-mode]) > [data-part='nav'] {
1877
+ [data-ui-app-shell]:not([data-nav-mode]) > [data-part-nav] {
1823
1878
  display: none;
1824
1879
  }
1825
1880
  /* The content flush to the frame, as it is once the mode says overlay. */
1826
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='floating'] > [data-part='main'],
1827
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='inset'] > [data-part='main'] {
1881
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='floating'] > [data-part-main],
1882
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='inset'] > [data-part-main] {
1828
1883
  border-block-end: 0;
1829
1884
  border-inline: 0;
1830
1885
  border-radius: 0;
@@ -1834,33 +1889,33 @@
1834
1889
  /* The card of `primary="main"` goes with the gutter. The root cannot
1835
1890
  query its own width, but its pseudo-element is a child of the query
1836
1891
  container and reads it. */
1837
- [data-ui='app-shell']:not([data-nav-mode]):is(
1892
+ [data-ui-app-shell]:not([data-nav-mode]):is(
1838
1893
  [data-canvas='floating'],
1839
1894
  [data-canvas='inset']
1840
1895
  )[data-primary='main']::before {
1841
1896
  content: none;
1842
1897
  }
1843
- [data-ui='app-shell']:not([data-nav-mode])[data-primary='main'] > [data-part='banner'] {
1898
+ [data-ui-app-shell]:not([data-nav-mode])[data-primary='main'] > [data-part-banner] {
1844
1899
  margin: 0;
1845
1900
  padding-inline: var(--_edge);
1846
1901
  }
1847
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='panel'] > [data-part='main'] {
1902
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='panel'] > [data-part-main] {
1848
1903
  border-block-start: var(--_rule-width) solid var(--_rule);
1849
1904
  border-radius: 0;
1850
1905
  }
1851
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='floating'] > [data-part='progress'],
1852
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='inset'] > [data-part='progress'] {
1906
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='floating'] > [data-part-progress],
1907
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='inset'] > [data-part-progress] {
1853
1908
  border-radius: 0;
1854
1909
  margin: 0;
1855
1910
  }
1856
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='panel'] > [data-part='progress'] {
1911
+ [data-ui-app-shell]:not([data-nav-mode])[data-canvas='panel'] > [data-part-progress] {
1857
1912
  border-radius: 0;
1858
1913
  }
1859
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1914
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1860
1915
  [data-canvas='floating'],
1861
1916
  [data-canvas='inset']
1862
1917
  )
1863
- > [data-part='aside'] {
1918
+ > [data-part-aside] {
1864
1919
  margin-inline: var(--_gutter);
1865
1920
  }
1866
1921
  /* A row under the content takes at most half the shell, so the content
@@ -1868,14 +1923,14 @@
1868
1923
  left the content a line high, with the pane scrolling and the content
1869
1924
  gone. Only where the shell owns its height; under `document` the page
1870
1925
  scrolls and the row takes its content's height. */
1871
- [data-ui='app-shell'][data-scroll='content']:not([data-aside-mode='overlay'])
1872
- > [data-part='aside'] {
1926
+ [data-ui-app-shell][data-scroll='content']:not([data-aside-mode='overlay'])
1927
+ > [data-part-aside] {
1873
1928
  max-block-size: 50cqb;
1874
1929
  }
1875
1930
  /* The pane as a row under the content, in the inline mode alone: a pane
1876
1931
  whose mode is not yet decided draws nothing at a narrow width, the safe
1877
1932
  half of the answer, for the reason the navigation draws nothing. */
1878
- [data-ui='app-shell']:not([data-aside-mode]) > [data-part='aside'] {
1933
+ [data-ui-app-shell]:not([data-aside-mode]) > [data-part-aside] {
1879
1934
  display: none;
1880
1935
  }
1881
1936
  }
@@ -1883,7 +1938,7 @@
1883
1938
  /* ── The veil ────────────────────────────────────────────────────────── */
1884
1939
 
1885
1940
  /** It stops where the panel stops, so the bar above stays a fixed point. */
1886
- [data-ui='app-shell'] > [data-part='scrim'] {
1941
+ [data-ui-app-shell] > [data-part-scrim] {
1887
1942
  background-color: var(--_scrim);
1888
1943
  grid-area: 2 / 1 / -1 / -1;
1889
1944
  inset: 0;
@@ -1892,8 +1947,8 @@
1892
1947
  transition: opacity var(--_duration) var(--_easing);
1893
1948
  z-index: calc(var(--slotted-z-index-overlay, 1000) - 1);
1894
1949
  }
1895
- [data-ui='app-shell'] > [data-part='scrim'][data-status='entering'],
1896
- [data-ui='app-shell'] > [data-part='scrim'][data-status='exiting'] {
1950
+ [data-ui-app-shell] > [data-part-scrim][data-status='entering'],
1951
+ [data-ui-app-shell] > [data-part-scrim][data-status='exiting'] {
1897
1952
  opacity: 0;
1898
1953
  }
1899
1954
  }