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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +35 -35
  6. package/src/app-shell/app-shell.css +280 -299
  7. package/src/aspect-ratio/aspect-ratio.css +9 -9
  8. package/src/attachment/attachment.css +91 -99
  9. package/src/avatar/avatar.css +41 -41
  10. package/src/avatar-group/avatar-group.css +21 -22
  11. package/src/badge/badge.css +37 -37
  12. package/src/breadcrumb/breadcrumb.css +37 -37
  13. package/src/button/button.css +88 -69
  14. package/src/button-group/button-group.css +69 -73
  15. package/src/calendar/calendar.css +93 -103
  16. package/src/card/card.css +54 -61
  17. package/src/carousel/carousel.css +150 -161
  18. package/src/cascader/cascader.css +147 -151
  19. package/src/chart/chart.css +225 -240
  20. package/src/checkbox/checkbox.css +119 -124
  21. package/src/checkbox-group/checkbox-group.css +7 -7
  22. package/src/code-block/code-block.css +81 -85
  23. package/src/collapsible/collapsible.css +69 -76
  24. package/src/color-picker/color-picker.css +83 -91
  25. package/src/column-manager/column-manager.css +106 -114
  26. package/src/combobox/combobox.css +99 -101
  27. package/src/command-palette/command-palette.css +84 -90
  28. package/src/container/container.css +24 -24
  29. package/src/context-menu/context-menu.css +8 -8
  30. package/src/currency-field/currency-field.css +99 -104
  31. package/src/dashboard-grid/dashboard-grid.css +104 -107
  32. package/src/data-grid/data-grid.css +458 -456
  33. package/src/data-grid/data-grid.tokens.json +2 -0
  34. package/src/data-list/data-list.css +67 -69
  35. package/src/date-field/date-field.css +50 -50
  36. package/src/date-picker/date-picker.css +40 -42
  37. package/src/date-range-picker/date-range-picker.css +114 -118
  38. package/src/datetime-field/datetime-field.css +73 -78
  39. package/src/datetime-picker/datetime-picker.css +61 -63
  40. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  41. package/src/description-list/description-list.css +61 -64
  42. package/src/detail-panel/detail-panel.css +70 -70
  43. package/src/dialog/dialog.css +312 -148
  44. package/src/divider/divider.css +18 -18
  45. package/src/drawer/drawer.css +186 -209
  46. package/src/entity-picker/entity-picker.css +220 -239
  47. package/src/event-calendar/event-calendar.css +343 -385
  48. package/src/field/field.css +74 -78
  49. package/src/field-group/field-group.css +22 -25
  50. package/src/filter-bar/filter-bar.css +193 -209
  51. package/src/form/form.css +21 -24
  52. package/src/fullscreen/fullscreen.css +24 -25
  53. package/src/grid/grid.css +28 -28
  54. package/src/highlight/highlight.css +6 -6
  55. package/src/hover-card/hover-card.css +6 -6
  56. package/src/icon/icon.css +15 -15
  57. package/src/image/image.css +39 -39
  58. package/src/import-export-center/import-export-center.css +135 -156
  59. package/src/inline/inline.css +27 -27
  60. package/src/inline-message/inline-message.css +28 -28
  61. package/src/kbd/kbd.css +26 -26
  62. package/src/link/link.css +15 -15
  63. package/src/list/list.css +20 -20
  64. package/src/list-item/list-item.css +66 -66
  65. package/src/listbox/listbox.css +56 -59
  66. package/src/loading-overlay/loading-overlay.css +75 -92
  67. package/src/markdown/markdown.css +17 -17
  68. package/src/menu/menu.css +63 -65
  69. package/src/menubar/menubar.css +13 -13
  70. package/src/message/message.css +174 -202
  71. package/src/message-scroller/message-scroller.css +41 -42
  72. package/src/multi-select/multi-select.css +131 -137
  73. package/src/navigation-menu/navigation-menu.css +167 -188
  74. package/src/notification-center/notification-center.css +134 -148
  75. package/src/number-field/number-field.css +76 -81
  76. package/src/otp-input/otp-input.css +48 -48
  77. package/src/page/page.css +23 -23
  78. package/src/page-header/page-header.css +219 -280
  79. package/src/pagination/pagination.css +68 -72
  80. package/src/popover/popover.css +40 -49
  81. package/src/progress-indicator/progress-indicator.css +85 -90
  82. package/src/prompt-composer/prompt-composer.css +94 -99
  83. package/src/prose/prose.css +71 -75
  84. package/src/radio-group/radio-group.css +98 -103
  85. package/src/rating/rating.css +132 -132
  86. package/src/result-state/result-state.css +74 -77
  87. package/src/saved-views/saved-views.css +41 -47
  88. package/src/scroll-area/scroll-area.css +32 -35
  89. package/src/section/section.css +16 -16
  90. package/src/segmented-control/segmented-control.css +77 -79
  91. package/src/select/select.css +113 -115
  92. package/src/side-navigation/side-navigation.css +170 -180
  93. package/src/skeleton/skeleton.css +47 -48
  94. package/src/slider/slider.css +86 -88
  95. package/src/sparkline/sparkline.css +32 -32
  96. package/src/spinner/spinner.css +4 -4
  97. package/src/split-button/split-button.css +26 -31
  98. package/src/splitter/splitter.css +35 -35
  99. package/src/stack/stack.css +24 -24
  100. package/src/stat-card/stat-card.css +102 -103
  101. package/src/status-indicator/status-indicator.css +28 -28
  102. package/src/stepper/stepper.css +58 -62
  103. package/src/switch/switch.css +86 -92
  104. package/src/table/table.css +189 -198
  105. package/src/table-of-contents/table-of-contents.css +51 -54
  106. package/src/tabs/tabs.css +157 -172
  107. package/src/tag/tag.css +67 -71
  108. package/src/tags-input/tags-input.css +124 -74
  109. package/src/tags-input/tags-input.tokens.json +6 -1
  110. package/src/text-field/text-field.css +108 -126
  111. package/src/textarea/textarea.css +26 -26
  112. package/src/time-field/time-field.css +67 -67
  113. package/src/time-picker/time-picker.css +56 -58
  114. package/src/time-range-picker/time-range-picker.css +126 -133
  115. package/src/timeline/timeline.css +244 -266
  116. package/src/toast/toast.css +81 -90
  117. package/src/toggle/toggle.css +29 -33
  118. package/src/toggle-group/toggle-group.css +67 -71
  119. package/src/toolbar/toolbar.css +30 -35
  120. package/src/tooltip/tooltip.css +26 -26
  121. package/src/top-navigation/top-navigation.css +243 -259
  122. package/src/tour/tour.css +51 -60
  123. package/src/transfer/transfer.css +160 -164
  124. package/src/tree/tree.css +103 -111
  125. package/src/typography/typography.css +36 -36
  126. package/src/upload/upload.css +224 -224
  127. package/src/visually-hidden/visually-hidden.css +1 -1
  128. package/src/wizard/wizard.css +185 -197
@@ -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
@@ -281,16 +281,16 @@
281
281
  position: relative;
282
282
  }
283
283
 
284
- [data-ui='app-shell'][data-nav-size='sm'] {
284
+ [data-ui-app-shell][data-nav-size='sm'] {
285
285
  --_nav-size: var(--slotted-app-shell-nav-size-sm, 13rem);
286
286
  }
287
- [data-ui='app-shell'][data-nav-size='lg'] {
287
+ [data-ui-app-shell][data-nav-size='lg'] {
288
288
  --_nav-size: var(--slotted-app-shell-nav-size-lg, 18rem);
289
289
  }
290
- [data-ui='app-shell'][data-aside-size='sm'] {
290
+ [data-ui-app-shell][data-aside-size='sm'] {
291
291
  --_aside-size: var(--slotted-app-shell-aside-size-sm, 16rem);
292
292
  }
293
- [data-ui='app-shell'][data-aside-size='lg'] {
293
+ [data-ui-app-shell][data-aside-size='lg'] {
294
294
  --_aside-size: var(--slotted-app-shell-aside-size-lg, 26rem);
295
295
  }
296
296
 
@@ -302,7 +302,7 @@
302
302
  * toolbar makes `100vh` taller than the space there is, and `100dvh` is the
303
303
  * space there is.
304
304
  */
305
- [data-ui='app-shell'][data-scroll='content'] {
305
+ [data-ui-app-shell][data-scroll='content'] {
306
306
  block-size: 100%;
307
307
  /**
308
308
  * Both axes, under `content` alone: the shell's height is the space it was
@@ -321,14 +321,14 @@
321
321
  * focused: the reader who does not need it never meets it, and the reader
322
322
  * who does finds it before the chrome.
323
323
  */
324
- [data-ui='app-shell'] > [data-part='skip'] {
324
+ [data-ui-app-shell] > [data-part-skip] {
325
325
  inset-block-start: 0;
326
326
  inset-inline-start: 0;
327
327
  position: absolute;
328
328
  z-index: var(--slotted-z-index-popover, 1100);
329
329
  }
330
330
 
331
- [data-ui='app-shell'] > [data-part='skip'] > a {
331
+ [data-ui-app-shell] > [data-part-skip] > a {
332
332
  background-color: var(--_canvas);
333
333
  border: var(--_rule-width) solid var(--_rule);
334
334
  border-radius: var(--slotted-control-radius, 4px);
@@ -348,7 +348,7 @@
348
348
  white-space: nowrap;
349
349
  }
350
350
 
351
- [data-ui='app-shell'] > [data-part='skip'] > a:focus-visible {
351
+ [data-ui-app-shell] > [data-part-skip] > a:focus-visible {
352
352
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
353
353
  outline-offset: var(--slotted-focus-ring-offset, 2px);
354
354
  translate: 0 0;
@@ -369,7 +369,7 @@
369
369
  * in the family reads the query — the bar carries an application's own search
370
370
  * and its own account, and those are the things that shed a label first.
371
371
  */
372
- [data-ui='app-shell'] > [data-part='banner'] {
372
+ [data-ui-app-shell] > [data-part-banner] {
373
373
  align-items: center;
374
374
  background-color: var(--slotted-app-shell-banner-surface, transparent);
375
375
  color: var(
@@ -386,7 +386,7 @@
386
386
  padding-inline: var(--_edge);
387
387
  }
388
388
 
389
- [data-ui='app-shell'] [data-part='brand'] {
389
+ [data-ui-app-shell] [data-part-brand] {
390
390
  align-items: center;
391
391
  display: flex;
392
392
  flex: 0 1 auto;
@@ -405,13 +405,13 @@
405
405
  * shortens instead; the control is exempt, because a control that shrinks
406
406
  * below its target is a defect of a different kind.
407
407
  */
408
- [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]) {
409
409
  min-inline-size: 0;
410
410
  overflow: var(--slotted-app-shell-brand-overflow, hidden);
411
411
  text-overflow: ellipsis;
412
412
  white-space: var(--slotted-app-shell-brand-wrap, nowrap);
413
413
  }
414
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='actions'] {
414
+ [data-ui-app-shell] > [data-part-banner] > [data-part-actions] {
415
415
  align-items: center;
416
416
  display: flex;
417
417
  flex: 0 1 auto;
@@ -426,7 +426,7 @@
426
426
  * defect of a different kind from a bar that has run out of room. What runs
427
427
  * out of room is the middle, which is what `centre` is for.
428
428
  */
429
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='actions'] > * {
429
+ [data-ui-app-shell] > [data-part-banner] > [data-part-actions] > * {
430
430
  flex-shrink: 0;
431
431
  }
432
432
 
@@ -438,7 +438,7 @@
438
438
  * is the consumer's; that it may be narrower than what it holds is the
439
439
  * shell's, for the reason `actions` carries `min-inline-size: 0`.
440
440
  */
441
- [data-ui='app-shell'] > [data-part='banner'] > [data-part='centre'] {
441
+ [data-ui-app-shell] > [data-part-banner] > [data-part-centre] {
442
442
  align-items: center;
443
443
  display: flex;
444
444
  flex: 1 1 auto;
@@ -452,7 +452,7 @@
452
452
  * destination shows at that width — a mark alone, a mark and a word — is
453
453
  * `side-navigation`'s decision to take against the room it has.
454
454
  */
455
- [data-ui='app-shell'] > [data-part='nav'] {
455
+ [data-ui-app-shell] > [data-part-nav] {
456
456
  background-color: var(--slotted-app-shell-nav-surface, transparent);
457
457
  box-sizing: border-box;
458
458
  color: var(
@@ -497,8 +497,8 @@
497
497
  * two-line block its own air; without it both were crushed against the group
498
498
  * heading below and the frame's footer beneath.
499
499
  */
500
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-header'],
501
- [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] {
502
502
  align-items: center;
503
503
  display: flex;
504
504
  flex: 0 0 auto;
@@ -524,9 +524,9 @@
524
524
  * one of them — the rule over the foot — still runs the column's full width,
525
525
  * and a strip of the rail's own beside the column needs none.
526
526
  */
527
- [data-ui='app-shell']
528
- > [data-part='nav']
529
- > :is([data-part='nav-header'], [data-part='nav-body'], [data-part='nav-footer']) {
527
+ [data-ui-app-shell]
528
+ > [data-part-nav]
529
+ > :is([data-part-nav-header], [data-part-nav-body], [data-part-nav-footer]) {
530
530
  /**
531
531
  * Published where it pads, beside the row geometry the root publishes:
532
532
  * `side-navigation` reads it to keep its rows' box on the edge it had,
@@ -550,7 +550,7 @@
550
550
  * between open and rail, the rows stand wider than the body, and an `auto`
551
551
  * inline axis drew a horizontal bar for the length of the transition.
552
552
  */
553
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-body'] {
553
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-body] {
554
554
  align-items: stretch;
555
555
  display: flex;
556
556
  flex: 1 1 auto;
@@ -568,7 +568,7 @@
568
568
  scrollbar-width: thin;
569
569
  }
570
570
 
571
- [data-ui='app-shell'] > [data-part='main'] {
571
+ [data-ui-app-shell] > [data-part-main] {
572
572
  background-color: var(
573
573
  --slotted-app-shell-main-surface,
574
574
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -588,7 +588,7 @@
588
588
  min-block-size: 0;
589
589
  min-inline-size: 0;
590
590
  }
591
- [data-ui='app-shell'][data-scroll='content'] > [data-part='main'] {
591
+ [data-ui-app-shell][data-scroll='content'] > [data-part-main] {
592
592
  overflow: auto;
593
593
  }
594
594
 
@@ -605,7 +605,7 @@
605
605
  * Strict containment keeps the travelling bar's per-frame layout inside
606
606
  * this box, and its paint inside the corners.
607
607
  */
608
- [data-ui='app-shell'] > [data-part='progress'] {
608
+ [data-ui-app-shell] > [data-part-progress] {
609
609
  contain: strict;
610
610
  grid-area: 2 / 2 / 3 / 3;
611
611
  inset-block-start: calc(-1 * var(--_progress-lift, 0px));
@@ -621,15 +621,15 @@
621
621
  * with it; the bar holds the top of the viewport once the banner, which is
622
622
  * not sticky there, has gone.
623
623
  */
624
- [data-ui='app-shell'][data-scroll='document'] > [data-part='progress'] {
624
+ [data-ui-app-shell][data-scroll='document'] > [data-part-progress] {
625
625
  --slotted-progress-indicator-position: sticky;
626
626
  }
627
627
 
628
628
  /** A skip link's destination takes focus; it draws no ring for a pointer. */
629
- [data-ui='app-shell'] > [data-part='main']:focus {
629
+ [data-ui-app-shell] > [data-part-main]:focus {
630
630
  outline: none;
631
631
  }
632
- [data-ui='app-shell'] > [data-part='main']:focus-visible {
632
+ [data-ui-app-shell] > [data-part-main]:focus-visible {
633
633
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
634
634
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
635
635
  }
@@ -644,7 +644,7 @@
644
644
  * the thing it shows or nothing — and a region at nought pixels that still
645
645
  * lays its children out puts content outside the box that owns it.
646
646
  */
647
- [data-ui='app-shell'] > [data-part='aside'] {
647
+ [data-ui-app-shell] > [data-part-aside] {
648
648
  background-color: var(
649
649
  --slotted-app-shell-aside-surface,
650
650
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -660,10 +660,10 @@
660
660
  min-block-size: 0;
661
661
  min-inline-size: 0;
662
662
  }
663
- [data-ui='app-shell'][data-scroll='content'] > [data-part='aside'] {
663
+ [data-ui-app-shell][data-scroll='content'] > [data-part-aside] {
664
664
  overflow: auto;
665
665
  }
666
- [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]) {
667
667
  display: none;
668
668
  }
669
669
 
@@ -674,8 +674,8 @@
674
674
  * foot holds the actions that close its task. Both stand on the row inset
675
675
  * plus the edge, so the title's left edge is the content card's.
676
676
  */
677
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-header'],
678
- [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] {
679
679
  align-items: center;
680
680
  display: flex;
681
681
  flex: 0 0 auto;
@@ -685,18 +685,18 @@
685
685
  padding-block: var(--_row-inset);
686
686
  padding-inline: calc(var(--_row-inset) + var(--_row-gap));
687
687
  }
688
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-header'] {
688
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-header] {
689
689
  font-weight: var(--slotted-font-weight-semibold, 600);
690
690
  }
691
691
  /** The title takes the room and the control keeps its own. */
692
- [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]) {
693
693
  flex: 1 1 auto;
694
694
  min-inline-size: 0;
695
695
  overflow: hidden;
696
696
  text-overflow: ellipsis;
697
697
  white-space: nowrap;
698
698
  }
699
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-footer'] {
699
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-footer] {
700
700
  justify-content: flex-end;
701
701
  }
702
702
  /**
@@ -704,7 +704,7 @@
704
704
  * stands on the inset the head and the foot stand on, so what it holds lines
705
705
  * up with the pane's title and no consumer pads it by hand.
706
706
  */
707
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-body'] {
707
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-body] {
708
708
  flex: 1 1 auto;
709
709
  min-block-size: 0;
710
710
  min-inline-size: 0;
@@ -720,7 +720,7 @@
720
720
  scrollbar-width: thin;
721
721
  }
722
722
  /* Content that brings its own inset — a page, a detail panel, a list to the edges. */
723
- [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'] {
724
724
  padding: 0;
725
725
  }
726
726
 
@@ -738,7 +738,7 @@
738
738
  * At rest it draws nothing; under the hand, the drag and the keyboard its
739
739
  * outer border becomes the line, and the keyboard alone adds the ring.
740
740
  */
741
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer'] {
741
+ [data-ui-app-shell] > [data-part-aside] > [data-part-aside-resizer] {
742
742
  --_resizer-thickness: var(--slotted-space-6, 1rem);
743
743
  --_resizer-reach: var(--slotted-target-min, 24px);
744
744
  background: transparent;
@@ -755,29 +755,27 @@
755
755
  transition: border-color var(--_duration) var(--_easing);
756
756
  z-index: 1;
757
757
  }
758
- [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] {
759
759
  border-inline-end-width: var(--slotted-border-width-thick, 2px);
760
760
  border-inline-start-width: 0;
761
761
  inset-inline-end: 0;
762
762
  inset-inline-start: auto;
763
763
  }
764
- [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 {
765
765
  content: '';
766
766
  inset-block: 0;
767
767
  inset-inline: calc((var(--_resizer-reach) - var(--_resizer-thickness)) / -2);
768
768
  position: absolute;
769
769
  }
770
- [data-ui='app-shell']
771
- > [data-part='aside']
772
- > [data-part='aside-resizer']:not([data-disabled]):hover,
773
- [data-ui='app-shell'] > [data-part='aside'] > [data-part='aside-resizer']:focus-visible,
774
- [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] {
775
773
  border-color: var(
776
774
  --slotted-app-shell-resizer-color,
777
775
  var(--slotted-border-strong, ButtonBorder)
778
776
  );
779
777
  }
780
- [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 {
781
779
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
782
780
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
783
781
  }
@@ -789,7 +787,7 @@
789
787
  * where a product does have one — a licence, a status, an environment — and
790
788
  * it takes only the height of its own line.
791
789
  */
792
- [data-ui='app-shell'] > [data-part='footer'] {
790
+ [data-ui-app-shell] > [data-part-footer] {
793
791
  align-items: center;
794
792
  background-color: var(--slotted-app-shell-footer-surface, transparent);
795
793
  color: var(
@@ -811,7 +809,7 @@
811
809
  * it. What it is a containing block for is the shell rather than the
812
810
  * viewport, because `container-type` contains layout.
813
811
  */
814
- [data-ui='app-shell'] > [data-part='layer'] {
812
+ [data-ui-app-shell] > [data-part-layer] {
815
813
  display: contents;
816
814
  }
817
815
 
@@ -825,7 +823,7 @@
825
823
  * finding — the closed strip had twelve pixels to its right, where the
826
824
  * content card begins, and nothing to its left.
827
825
  */
828
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='nav'] {
826
+ [data-ui-app-shell][data-canvas='inset'] > [data-part-nav] {
829
827
  /* The navigation stands on the sunken frame, which the secondary tone's
830
828
  hover is 0.011 lighter than in the light scheme: a row's hover was the
831
829
  frame itself. Both steps are recomputed from the ground it stands on. */
@@ -846,23 +844,23 @@
846
844
  margin-block: var(--_gutter);
847
845
  margin-inline-start: var(--_gutter);
848
846
  }
849
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='main'],
850
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='aside'],
851
- [data-ui='app-shell'][data-canvas='inset'] > [data-part='main'],
852
- [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] {
853
851
  border: var(--_rule-width) solid var(--_rule);
854
852
  border-radius: var(--_radius);
855
853
  box-shadow: var(--_elevation);
856
854
  margin-block: var(--_gutter);
857
855
  margin-inline: var(--_gutter);
858
856
  }
859
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='aside'],
860
- [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] {
861
859
  margin-inline-start: 0;
862
860
  }
863
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='footer'],
864
- [data-ui='app-shell'][data-canvas='panel'] > [data-part='footer'],
865
- [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] {
866
864
  padding-block-start: 0;
867
865
  }
868
866
  /**
@@ -873,8 +871,8 @@
873
871
  * for the seam the gutter used to draw. Keyed on the mode, as every layer
874
872
  * rule is; the width answers only for a shell not yet measured, below.
875
873
  */
876
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='main'],
877
- [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] {
878
876
  border-block-end: 0;
879
877
  border-inline: 0;
880
878
  border-radius: 0;
@@ -889,33 +887,33 @@
889
887
  * carries the ground. Stated as the same six properties, so a product that
890
888
  * repaints one region keeps its choice under either plane.
891
889
  */
892
- [data-ui='app-shell'][data-canvas='flush'] {
890
+ [data-ui-app-shell][data-canvas='flush'] {
893
891
  --_edge: var(--_row-inset);
894
892
  --_nav-edges: var(--_seam-width);
895
893
  --_nav-inset: var(--_row-inset);
896
894
  }
897
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='banner'] {
895
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-banner] {
898
896
  background-color: var(
899
897
  --slotted-app-shell-banner-surface,
900
898
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
901
899
  );
902
900
  }
903
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='nav'] {
901
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-nav] {
904
902
  background-color: var(
905
903
  --slotted-app-shell-nav-surface,
906
904
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
907
905
  );
908
906
  }
909
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='main'] {
907
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-main] {
910
908
  background-color: var(--slotted-app-shell-main-surface, transparent);
911
909
  }
912
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='aside'] {
910
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-aside] {
913
911
  background-color: var(
914
912
  --slotted-app-shell-aside-surface,
915
913
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
916
914
  );
917
915
  }
918
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='footer'] {
916
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-footer] {
919
917
  background-color: var(
920
918
  --slotted-app-shell-footer-surface,
921
919
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -927,33 +925,33 @@
927
925
  * off-centre on this plane once; none at all put every row's ground against
928
926
  * the screen's edge and against the seam.
929
927
  */
930
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='nav'] {
928
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-nav] {
931
929
  padding-block: var(--_gutter);
932
930
  }
933
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='banner'] {
931
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-banner] {
934
932
  border-block-end: var(--_seam);
935
933
  }
936
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='footer'] {
934
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-footer] {
937
935
  border-block-start: var(--_seam);
938
936
  }
939
- [data-ui='app-shell'][data-canvas='flush'] > [data-part='aside'] {
937
+ [data-ui-app-shell][data-canvas='flush'] > [data-part-aside] {
940
938
  border-block-start: var(--_seam);
941
939
  }
942
940
  /* The seams inside a region: wherever regions touch without a gutter, which
943
941
  is every seam of `flush` and every seam inside the `panel` card. */
944
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
945
- > [data-part='nav']
946
- > [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] {
947
945
  border-block-start: var(--_seam);
948
946
  }
949
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
950
- > [data-part='aside']
951
- > [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] {
952
950
  border-block-end: var(--_seam);
953
951
  }
954
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])
955
- > [data-part='aside']
956
- > [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] {
957
955
  border-block-start: var(--_seam);
958
956
  }
959
957
 
@@ -967,7 +965,7 @@
967
965
  * mark column and a row's inset each side, and the card's edge is added to
968
966
  * it rather than taken from the marks.
969
967
  */
970
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='nav'] {
968
+ [data-ui-app-shell][data-canvas='floating'] > [data-part-nav] {
971
969
  background-color: var(
972
970
  --slotted-app-shell-nav-surface,
973
971
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -980,12 +978,12 @@
980
978
  }
981
979
  /* A card has an edge the column never had: the rows stand one inset in, as
982
980
  they do on the overlay card, and the bar's rows stand over them. */
983
- [data-ui='app-shell'][data-canvas='floating'] {
981
+ [data-ui-app-shell][data-canvas='floating'] {
984
982
  --_edge: calc(var(--_gutter) + var(--_rule-width) + var(--_row-inset));
985
983
  --_nav-edges: calc(2 * var(--_rule-width));
986
984
  --_nav-inset: var(--_row-inset);
987
985
  }
988
- [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] {
989
987
  margin-inline: 0 var(--_gutter);
990
988
  }
991
989
 
@@ -1004,11 +1002,11 @@
1004
1002
  * A layer is a phone's arrangement, and a phone has no room for a frame: the
1005
1003
  * card goes wherever the navigation is a layer, as the inset card does.
1006
1004
  */
1007
- [data-ui='app-shell']:is(
1005
+ [data-ui-app-shell]:is(
1008
1006
  [data-canvas='floating'],
1009
1007
  [data-canvas='inset']
1010
1008
  )[data-primary='main']::before,
1011
- [data-ui='app-shell'][data-canvas='panel']::before {
1009
+ [data-ui-app-shell][data-canvas='panel']::before {
1012
1010
  background-color: var(
1013
1011
  --slotted-app-shell-main-surface,
1014
1012
  var(--slotted-app-shell-canvas, var(--slotted-surface))
@@ -1021,17 +1019,14 @@
1021
1019
  margin: var(--_gutter);
1022
1020
  min-inline-size: 0;
1023
1021
  }
1024
- [data-ui='app-shell'][data-canvas='panel']::before {
1022
+ [data-ui-app-shell][data-canvas='panel']::before {
1025
1023
  grid-area: 2 / 1 / 3 / -1;
1026
1024
  margin: 0;
1027
1025
  }
1028
- [data-ui='app-shell'][data-canvas='panel']:is(
1029
- [data-primary='nav'],
1030
- [data-primary='main']
1031
- )::before {
1026
+ [data-ui-app-shell][data-canvas='panel']:is([data-primary='nav'], [data-primary='main'])::before {
1032
1027
  grid-area: 1 / 1 / 3 / -1;
1033
1028
  }
1034
- [data-ui='app-shell'][data-nav-mode='overlay'][data-canvas]::before {
1029
+ [data-ui-app-shell][data-nav-mode='overlay'][data-canvas]::before {
1035
1030
  content: none;
1036
1031
  }
1037
1032
 
@@ -1043,37 +1038,37 @@
1043
1038
  * and keeps its ground with the card's lower corners. Between them is a
1044
1039
  * seam, and `separation` decides it.
1045
1040
  */
1046
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1047
- > [data-part='banner'] {
1041
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1042
+ > [data-part-banner] {
1048
1043
  margin-block-start: calc(var(--_gutter) + var(--_rule-width));
1049
1044
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
1050
1045
  padding-inline: 0;
1051
1046
  }
1052
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1053
- > [data-part='main'] {
1047
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1048
+ > [data-part-main] {
1054
1049
  border: none;
1055
1050
  border-radius: 0 0 var(--_inner-radius) var(--_inner-radius);
1056
1051
  box-shadow: none;
1057
1052
  margin-block: 0 calc(var(--_gutter) + var(--_rule-width));
1058
1053
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
1059
1054
  }
1060
- [data-ui='app-shell'][data-primary='main'] > [data-part='banner'],
1061
- [data-ui='app-shell'][data-primary='main'][data-nav-side='end'] > [data-part='banner'],
1062
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'] > [data-part='banner'],
1063
- [data-ui='app-shell'][data-canvas='panel'][data-primary='nav'][data-nav-side='end']
1064
- > [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] {
1065
1060
  border-block-end: var(--_seam);
1066
1061
  grid-column: 2 / 3;
1067
1062
  }
1068
- [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] {
1069
1064
  margin: 0;
1070
1065
  padding-inline: var(--_edge);
1071
1066
  }
1072
- [data-ui='app-shell']:is(
1067
+ [data-ui-app-shell]:is(
1073
1068
  [data-canvas='floating'],
1074
1069
  [data-canvas='inset']
1075
1070
  )[data-primary='main'][data-nav-mode='overlay']
1076
- > [data-part='main'] {
1071
+ > [data-part-main] {
1077
1072
  border-radius: 0;
1078
1073
  margin: 0;
1079
1074
  }
@@ -1092,80 +1087,80 @@
1092
1087
  * measured below the compact width keeps it for one frame: the root cannot
1093
1088
  * query its own width, and that frame is the cost.
1094
1089
  */
1095
- [data-ui='app-shell'][data-canvas='panel'] {
1090
+ [data-ui-app-shell][data-canvas='panel'] {
1096
1091
  --_edge: calc(var(--_rule-width) + var(--_row-inset));
1097
1092
  --_nav-edges: var(--_seam-width);
1098
1093
  --_nav-inset: var(--_row-inset);
1099
1094
  }
1100
1095
  /* Once the navigation is a layer the card beside the bar is gone, and the
1101
1096
  bar's rows stand where the inset plane's do. */
1102
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'],
1103
- [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'] {
1104
1099
  --_edge: var(--_gutter);
1105
1100
  }
1106
- [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']) {
1107
1102
  box-sizing: border-box;
1108
1103
  padding-block-end: var(--_gutter);
1109
1104
  padding-inline: var(--_gutter);
1110
1105
  }
1111
- [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(
1112
1107
  [data-primary='nav'],
1113
1108
  [data-primary='main']
1114
1109
  ) {
1115
1110
  padding-block-start: var(--_gutter);
1116
1111
  }
1117
- [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] {
1118
1113
  border-end-start-radius: var(--_inner-radius);
1119
1114
  border-start-start-radius: var(--_inner-radius);
1120
1115
  margin: var(--_rule-width) 0 var(--_rule-width) var(--_rule-width);
1121
1116
  }
1122
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay'])[data-nav-side='end']
1123
- > [data-part='nav'] {
1117
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay'])[data-nav-side='end']
1118
+ > [data-part-nav] {
1124
1119
  border-radius: 0 var(--_inner-radius) var(--_inner-radius) 0;
1125
1120
  margin: var(--_rule-width) var(--_rule-width) var(--_rule-width) 0;
1126
1121
  }
1127
- [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] {
1128
1123
  border-end-end-radius: var(--_inner-radius);
1129
1124
  margin-block-end: var(--_rule-width);
1130
1125
  margin-inline-end: var(--_rule-width);
1131
1126
  }
1132
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1133
- > [data-part='main'] {
1127
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1128
+ > [data-part-main] {
1134
1129
  border-start-end-radius: var(--_inner-radius);
1135
1130
  margin-block-start: var(--_rule-width);
1136
1131
  }
1137
- [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(
1138
1133
  [data-primary='banner']
1139
1134
  )
1140
- > [data-part='banner'] {
1135
+ > [data-part-banner] {
1141
1136
  margin-block-start: var(--_rule-width);
1142
1137
  margin-inline-end: var(--_rule-width);
1143
1138
  }
1144
1139
  /* The corner the content shares with the card is the pane's once the pane
1145
1140
  stands beside it. */
1146
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1147
- > [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]
1148
1143
  )
1149
- > [data-part='main'] {
1144
+ > [data-part-main] {
1150
1145
  border-end-end-radius: 0;
1151
1146
  border-start-end-radius: 0;
1152
1147
  margin-inline-end: 0;
1153
1148
  }
1154
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1155
- > [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]
1156
1151
  )
1157
- > [data-part='banner'] {
1152
+ > [data-part-banner] {
1158
1153
  margin-inline-end: 0;
1159
1154
  }
1160
- [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(
1161
1156
  [data-aside-mode='overlay']
1162
1157
  )
1163
- > [data-part='aside'] {
1158
+ > [data-part-aside] {
1164
1159
  border-end-end-radius: var(--_inner-radius);
1165
1160
  border-start-end-radius: var(--_inner-radius);
1166
1161
  margin: var(--_rule-width) var(--_rule-width) var(--_rule-width) 0;
1167
1162
  }
1168
- [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] {
1169
1164
  border-block-start: var(--_rule-width) solid var(--_rule);
1170
1165
  }
1171
1166
 
@@ -1183,14 +1178,14 @@
1183
1178
  * gives it once the navigation is a layer — the frame is the box of `main`
1184
1179
  * and covers that edge already.
1185
1180
  */
1186
- [data-ui='app-shell']:is([data-canvas='flush'], [data-primary='main']),
1187
- [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'] {
1188
1183
  --_progress-lift: var(--_seam-width);
1189
1184
  }
1190
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner'] {
1185
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner'] {
1191
1186
  --_progress-lift: var(--_rule-width);
1192
1187
  }
1193
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] {
1188
+ [data-ui-app-shell][data-canvas='panel'][data-nav-mode='overlay'] {
1194
1189
  --_progress-lift: 0px;
1195
1190
  }
1196
1191
 
@@ -1205,46 +1200,45 @@
1205
1200
  * their originals in the narrow query below. `app-shell.styles.test.mjs`
1206
1201
  * holds every rule that gives `main` a margin or a radius to its twin.
1207
1202
  */
1208
- [data-ui='app-shell'][data-canvas='floating'] > [data-part='progress'],
1209
- [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] {
1210
1205
  border-radius: var(--_radius);
1211
1206
  margin-block: var(--_gutter);
1212
1207
  margin-inline: var(--_gutter);
1213
1208
  }
1214
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='progress'],
1215
- [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] {
1216
1211
  border-radius: 0;
1217
1212
  margin: 0;
1218
1213
  }
1219
- [data-ui='app-shell']:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1220
- > [data-part='progress'] {
1214
+ [data-ui-app-shell]:is([data-canvas='floating'], [data-canvas='inset'])[data-primary='main']
1215
+ > [data-part-progress] {
1221
1216
  border-radius: 0 0 var(--_inner-radius) var(--_inner-radius);
1222
1217
  margin-block: 0 calc(var(--_gutter) + var(--_rule-width));
1223
1218
  margin-inline: calc(var(--_gutter) + var(--_rule-width));
1224
1219
  }
1225
- [data-ui='app-shell']:is(
1220
+ [data-ui-app-shell]:is(
1226
1221
  [data-canvas='floating'],
1227
1222
  [data-canvas='inset']
1228
1223
  )[data-primary='main'][data-nav-mode='overlay']
1229
- > [data-part='progress'] {
1224
+ > [data-part-progress] {
1230
1225
  border-radius: 0;
1231
1226
  margin: 0;
1232
1227
  }
1233
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay'])
1234
- > [data-part='progress'] {
1228
+ [data-ui-app-shell][data-canvas='panel']:not([data-nav-mode='overlay']) > [data-part-progress] {
1235
1229
  border-end-end-radius: var(--_inner-radius);
1236
1230
  margin-block-end: var(--_rule-width);
1237
1231
  margin-inline-end: var(--_rule-width);
1238
1232
  }
1239
- [data-ui='app-shell'][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1240
- > [data-part='progress'] {
1233
+ [data-ui-app-shell][data-canvas='panel'][data-primary='banner']:not([data-nav-mode='overlay'])
1234
+ > [data-part-progress] {
1241
1235
  border-start-end-radius: var(--_inner-radius);
1242
1236
  margin-block-start: var(--_rule-width);
1243
1237
  }
1244
- [data-ui='app-shell'][data-canvas='panel']:not([data-nav-mode='overlay']):has(
1245
- > [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]
1246
1240
  )
1247
- > [data-part='progress'] {
1241
+ > [data-part-progress] {
1248
1242
  border-end-end-radius: 0;
1249
1243
  border-start-end-radius: 0;
1250
1244
  margin-inline-end: 0;
@@ -1258,7 +1252,7 @@
1258
1252
  * seams the region and its parts draw, and `transparent` removes them. The
1259
1253
  * tone rules below state the same two declarations at a higher specificity.
1260
1254
  */
1261
- [data-ui='app-shell'] > [data-part] {
1255
+ [data-ui-app-shell] > [data-part] {
1262
1256
  --_rule: var(--slotted-app-shell-border-color, var(--slotted-border-subtle, ButtonBorder));
1263
1257
  --_seam: var(--_rule-width) solid var(--_rule);
1264
1258
  }
@@ -1279,12 +1273,12 @@
1279
1273
  * where it is declared, and a region carrying a scheme of its own must mix
1280
1274
  * its own ink.
1281
1275
  */
1282
- [data-ui='app-shell'][data-separation='tone'],
1283
- [data-ui='app-shell'][data-separation='tone'] > [data-part] {
1276
+ [data-ui-app-shell][data-separation='tone'],
1277
+ [data-ui-app-shell][data-separation='tone'] > [data-part] {
1284
1278
  --_seam: none;
1285
1279
  --_seam-width: 0px;
1286
1280
  }
1287
- [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] {
1288
1282
  --_ground: var(
1289
1283
  --slotted-app-shell-footer-surface,
1290
1284
  var(
@@ -1293,8 +1287,8 @@
1293
1287
  )
1294
1288
  );
1295
1289
  }
1296
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1297
- > [data-part='banner'] {
1290
+ [data-ui-app-shell][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1291
+ > [data-part-banner] {
1298
1292
  --_ground: var(
1299
1293
  --slotted-app-shell-banner-surface,
1300
1294
  var(
@@ -1303,8 +1297,8 @@
1303
1297
  )
1304
1298
  );
1305
1299
  }
1306
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1307
- > [data-part='nav'] {
1300
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1301
+ > [data-part-nav] {
1308
1302
  --_ground: var(
1309
1303
  --slotted-app-shell-nav-surface,
1310
1304
  var(
@@ -1313,8 +1307,8 @@
1313
1307
  )
1314
1308
  );
1315
1309
  }
1316
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1317
- > [data-part='aside'] {
1310
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1311
+ > [data-part-aside] {
1318
1312
  --_ground: var(
1319
1313
  --slotted-app-shell-aside-surface,
1320
1314
  var(
@@ -1323,18 +1317,18 @@
1323
1317
  )
1324
1318
  );
1325
1319
  }
1326
- [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] {
1327
1321
  --_ground: var(
1328
1322
  --slotted-app-shell-tone-surface,
1329
1323
  color-mix(in oklab, var(--slotted-surface), var(--slotted-text) 4.5%)
1330
1324
  );
1331
1325
  }
1332
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone']:not([data-primary='main'])
1333
- > [data-part='banner'],
1334
- [data-ui='app-shell'][data-canvas='flush'][data-separation='tone'] > [data-part='footer'],
1335
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-separation='tone']
1336
- > :is([data-part='nav'], [data-part='aside']),
1337
- [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] {
1338
1332
  --slotted-tone-secondary-subtle-hover: color-mix(
1339
1333
  in oklab,
1340
1334
  var(--_ground),
@@ -1350,7 +1344,7 @@
1350
1344
  }
1351
1345
  /* The content keeps the surface under a toned frame: on the flush plane it
1352
1346
  carried the sunken ground, which is 0.014 from the tone. */
1353
- [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] {
1354
1348
  background-color: var(
1355
1349
  --slotted-app-shell-main-surface,
1356
1350
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -1370,12 +1364,12 @@
1370
1364
  * on the way in. `:has()` recognises the part, so no script writes an
1371
1365
  * attribute and a server render has the grid on its first paint.
1372
1366
  */
1373
- [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]) {
1374
1368
  display: grid;
1375
1369
  grid-template-columns: var(--_rail-size) minmax(var(--_nav-size), 1fr);
1376
1370
  grid-template-rows: auto minmax(0, 1fr) auto;
1377
1371
  }
1378
- [data-ui='app-shell'] > [data-part='nav'] > [data-part='nav-rail'] {
1372
+ [data-ui-app-shell] > [data-part-nav] > [data-part-nav-rail] {
1379
1373
  align-items: center;
1380
1374
  border-inline-end: var(--_seam);
1381
1375
  box-sizing: border-box;
@@ -1389,47 +1383,43 @@
1389
1383
  padding-block: var(--_row-inset);
1390
1384
  scrollbar-width: none;
1391
1385
  }
1392
- [data-ui='app-shell']
1393
- > [data-part='nav']:has(> [data-part='nav-rail'])
1394
- > [data-part='nav-header'] {
1386
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) > [data-part-nav-header] {
1395
1387
  grid-area: 1 / 2 / 2 / 3;
1396
1388
  }
1397
- [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] {
1398
1390
  grid-area: 2 / 2 / 3 / 3;
1399
1391
  }
1400
- [data-ui='app-shell']
1401
- > [data-part='nav']:has(> [data-part='nav-rail'])
1402
- > [data-part='nav-footer'] {
1392
+ [data-ui-app-shell] > [data-part-nav]:has(> [data-part-nav-rail]) > [data-part-nav-footer] {
1403
1393
  grid-area: 3 / 2 / 4 / 3;
1404
1394
  }
1405
1395
  /* The strip's rule is an edge, and a row whose ground meets it reads as a
1406
1396
  column with no padding. */
1407
- [data-ui='app-shell']
1408
- > [data-part='nav']:has(> [data-part='nav-rail'])
1409
- > :is([data-part='nav-header'], [data-part='nav-body'], [data-part='nav-footer']) {
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]) {
1410
1400
  padding-inline-start: calc(var(--_row-inset) + var(--_row-ring-inset));
1411
1401
  transition: visibility var(--_duration) step-start;
1412
1402
  }
1413
- [data-ui='app-shell'][data-nav-mode='inline'][data-open]
1414
- > [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]) {
1415
1405
  inline-size: calc(var(--_rail-size) + var(--_nav-size) + var(--_nav-edges));
1416
1406
  }
1417
1407
  /* Closed, the region is the strip and its edges: the strip holds a row's
1418
1408
  inset on each side of its marks already. */
1419
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1420
- > [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]) {
1421
1411
  inline-size: calc(var(--_rail-size) + var(--_nav-edges));
1422
1412
  }
1423
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1424
- > [data-part='nav']:has(> [data-part='nav-rail'])
1425
- > :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]) {
1426
1416
  transition: visibility var(--_duration) step-end;
1427
1417
  visibility: hidden;
1428
1418
  }
1429
1419
  /* A closed strip is the region's edge, and the edge is the plane's to draw. */
1430
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1431
- > [data-part='nav']
1432
- > [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] {
1433
1423
  border-inline-end: none;
1434
1424
  }
1435
1425
 
@@ -1442,8 +1432,8 @@
1442
1432
  * a forced-colours rule of its own for.
1443
1433
  */
1444
1434
  @media (forced-colors: active) {
1445
- [data-ui='app-shell'][data-separation='tone'],
1446
- [data-ui='app-shell'][data-separation='tone'] > [data-part] {
1435
+ [data-ui-app-shell][data-separation='tone'],
1436
+ [data-ui-app-shell][data-separation='tone'] > [data-part] {
1447
1437
  --_seam: var(--_rule-width) solid CanvasText;
1448
1438
  --_seam-width: var(--_rule-width);
1449
1439
  }
@@ -1464,8 +1454,8 @@
1464
1454
  * The pane's control is the same control: the same box, the same ink, the
1465
1455
  * same pair of marks. What differs is which way the artwork faces, below.
1466
1456
  */
1467
- [data-ui='app-shell'] [data-part='nav-toggle'],
1468
- [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] {
1469
1459
  --slotted-icon-size: var(--slotted-control-icon-size-md, 16px);
1470
1460
 
1471
1461
  background-color: transparent;
@@ -1502,37 +1492,31 @@
1502
1492
  * navigation's turns. The box is not `directional`: which side the region
1503
1493
  * stands on is this family's fact, not the reading direction's alone.
1504
1494
  */
1505
- [data-ui='app-shell'][data-nav-side='end'] [data-part='nav-toggle'] > [data-ui='icon'],
1506
- [dir='rtl'] [data-ui='app-shell'] [data-part='nav-toggle'] > [data-ui='icon'],
1507
- [data-ui='app-shell']:not([data-nav-side='end']) [data-part='aside-toggle'] > [data-ui='icon'],
1508
- [dir='rtl']
1509
- [data-ui='app-shell'][data-nav-side='end']
1510
- [data-part='aside-toggle']
1511
- > [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] {
1512
1499
  scale: -1 1;
1513
1500
  }
1501
+ [dir='rtl'] [data-ui-app-shell][data-nav-side='end'] [data-part-nav-toggle] > [data-ui-icon],
1514
1502
  [dir='rtl']
1515
- [data-ui='app-shell'][data-nav-side='end']
1516
- [data-part='nav-toggle']
1517
- > [data-ui='icon'],
1518
- [dir='rtl']
1519
- [data-ui='app-shell']:not([data-nav-side='end'])
1520
- [data-part='aside-toggle']
1521
- > [data-ui='icon'] {
1503
+ [data-ui-app-shell]:not([data-nav-side='end'])
1504
+ [data-part-aside-toggle]
1505
+ > [data-ui-icon] {
1522
1506
  scale: 1 1;
1523
1507
  }
1524
1508
 
1525
- [data-ui='app-shell'] [data-part='nav-toggle']:enabled:hover,
1526
- [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 {
1527
1511
  background-color: var(--slotted-tone-secondary-subtle-hover, ButtonFace);
1528
1512
  color: currentcolor;
1529
1513
  }
1530
- [data-ui='app-shell'] [data-part='nav-toggle']:enabled:active,
1531
- [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 {
1532
1516
  background-color: var(--slotted-tone-secondary-subtle-active, ButtonFace);
1533
1517
  }
1534
- [data-ui='app-shell'] [data-part='nav-toggle']:focus-visible,
1535
- [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 {
1536
1520
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
1537
1521
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1538
1522
  }
@@ -1546,33 +1530,33 @@
1546
1530
  */
1547
1531
  /* The rail holds the parts' ring inset on each side as well, so a control
1548
1532
  at the mark's size keeps its focus ring inside the body beside the gutter. */
1549
- [data-ui='app-shell'][data-nav-mode='inline'] > [data-part='nav'] {
1533
+ [data-ui-app-shell][data-nav-mode='inline'] > [data-part-nav] {
1550
1534
  inline-size: calc(
1551
1535
  var(--_rail-size) + 2 * (var(--_nav-inset) + var(--_row-ring-inset)) + var(--_nav-edges)
1552
1536
  );
1553
1537
  }
1554
- [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] {
1555
1539
  inline-size: var(--_nav-size);
1556
1540
  }
1557
1541
  /**
1558
1542
  * The rail centres its marks, all three rows together: a head centred over a
1559
1543
  * body that is not reads as two columns in one strip.
1560
1544
  */
1561
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1562
- > [data-part='nav']
1563
- > [data-part='nav-header'],
1564
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1565
- > [data-part='nav']
1566
- > [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] {
1567
1551
  /* Two marks in one end of a rail — the control and the account — stand
1568
1552
  one over the other: the rail is one mark column wide, so a row of two
1569
1553
  is a row that overflows it. */
1570
1554
  flex-wrap: wrap;
1571
1555
  justify-content: center;
1572
1556
  }
1573
- [data-ui='app-shell'][data-nav-mode='inline']:not([data-open])
1574
- > [data-part='nav']
1575
- > [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] {
1576
1560
  align-items: center;
1577
1561
  }
1578
1562
  /**
@@ -1585,35 +1569,35 @@
1585
1569
  * `hidden` does not animate, because it is a removal rather than a change of
1586
1570
  * width.
1587
1571
  */
1588
- [data-ui='app-shell'][data-nav-mode='inline'][data-collapsed-to='hidden']:not([data-open])
1589
- > [data-part='nav'] {
1572
+ [data-ui-app-shell][data-nav-mode='inline'][data-collapsed-to='hidden']:not([data-open])
1573
+ > [data-part-nav] {
1590
1574
  display: none;
1591
1575
  }
1592
1576
 
1593
- [data-ui='app-shell'][data-nav-side='end'] > [data-part='nav'] {
1577
+ [data-ui-app-shell][data-nav-side='end'] > [data-part-nav] {
1594
1578
  grid-area: 2 / 3 / 3 / 4;
1595
1579
  }
1596
- [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] {
1597
1581
  margin-inline: 0 var(--_gutter);
1598
1582
  }
1599
- [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] {
1600
1584
  padding-inline: 0 var(--_gutter);
1601
1585
  }
1602
- [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] {
1603
1587
  border-inline-end: var(--_seam);
1604
1588
  }
1605
- [data-ui='app-shell']:is([data-canvas='flush'], [data-canvas='panel'])[data-nav-side='end']
1606
- > [data-part='nav'] {
1589
+ [data-ui-app-shell]:is([data-canvas='flush'], [data-canvas='panel'])[data-nav-side='end']
1590
+ > [data-part-nav] {
1607
1591
  border-inline-end: none;
1608
1592
  border-inline-start: var(--_seam);
1609
1593
  }
1610
1594
 
1611
1595
  /** Reaching the corner: the navigation spans every row instead. */
1612
- [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] {
1613
1597
  grid-area: 1 / 1 / -1 / 2;
1614
1598
  }
1615
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1616
- > [data-part='nav'] {
1599
+ [data-ui-app-shell]:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1600
+ > [data-part-nav] {
1617
1601
  grid-area: 1 / 3 / -1 / 4;
1618
1602
  }
1619
1603
  /**
@@ -1621,22 +1605,22 @@
1621
1605
  * and whatever the bar carries sit on one line rather than being two headers
1622
1606
  * of different sizes in the same row of the screen.
1623
1607
  */
1624
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])
1625
- > [data-part='nav']
1626
- > [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] {
1627
1611
  /* The head's own padding is inside the banner's height, or the mark stands
1628
1612
  its padding lower than the bar beside it. */
1629
1613
  box-sizing: border-box;
1630
1614
  min-block-size: var(--_banner-size);
1631
1615
  }
1632
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main']) > [data-part='banner'],
1633
- [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] {
1634
1618
  grid-column: 2 / -1;
1635
1619
  }
1636
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1637
- > [data-part='banner'],
1638
- [data-ui='app-shell']:is([data-primary='nav'], [data-primary='main'])[data-nav-side='end']
1639
- > [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] {
1640
1624
  grid-column: 1 / -2;
1641
1625
  }
1642
1626
  /**
@@ -1645,8 +1629,8 @@
1645
1629
  * `panel` the banner is inside the card whether the column or the content
1646
1630
  * is primary, so `nav` draws what `main` draws there.
1647
1631
  */
1648
- [data-ui='app-shell'][data-primary='main'] > [data-part='banner'],
1649
- [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] {
1650
1634
  grid-column: 2 / 3;
1651
1635
  }
1652
1636
 
@@ -1667,7 +1651,7 @@
1667
1651
  * puts the veil over the bar as well: the reader then has no fixed point on
1668
1652
  * the screen at all.
1669
1653
  */
1670
- [data-ui='app-shell'][data-nav-mode='overlay'] > [data-part='nav'] {
1654
+ [data-ui-app-shell][data-nav-mode='overlay'] > [data-part-nav] {
1671
1655
  /* A layer has an edge on every plane, so its rows stand one inset in. The
1672
1656
  inset is read by the parts, which take it from here. */
1673
1657
  --_nav-inset: var(--_row-inset);
@@ -1696,14 +1680,14 @@
1696
1680
  visibility: hidden;
1697
1681
  z-index: var(--slotted-z-index-overlay, 1000);
1698
1682
  }
1699
- [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] {
1700
1684
  transition:
1701
1685
  translate var(--_duration) var(--slotted-easing-enter, cubic-bezier(0.05, 0.7, 0.1, 1)),
1702
1686
  visibility var(--_duration) step-start;
1703
1687
  translate: 0 0;
1704
1688
  visibility: visible;
1705
1689
  }
1706
- [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] {
1707
1691
  inset-inline-end: 0;
1708
1692
  inset-inline-start: auto;
1709
1693
  translate: 100% 0;
@@ -1721,9 +1705,9 @@
1721
1705
  * three parts: the marks keep one column, and a consumer's header row that
1722
1706
  * writes the same inset stays over them.
1723
1707
  */
1724
- [data-ui='app-shell'][data-canvas='floating'][data-nav-mode='overlay'] > [data-part='nav'],
1725
- [data-ui='app-shell'][data-canvas='panel'][data-nav-mode='overlay'] > [data-part='nav'],
1726
- [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] {
1727
1711
  border: var(--_rule-width) solid var(--_rule);
1728
1712
  border-radius: var(--_radius);
1729
1713
  box-shadow: var(--slotted-shadow-lg);
@@ -1731,14 +1715,14 @@
1731
1715
  margin-inline-start: var(--_gutter);
1732
1716
  translate: calc(-100% - var(--_gutter)) 0;
1733
1717
  }
1734
- [data-ui='app-shell']:not([data-canvas='flush'])[data-nav-mode='overlay'][data-nav-side='end']
1735
- > [data-part='nav'] {
1718
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-nav-mode='overlay'][data-nav-side='end']
1719
+ > [data-part-nav] {
1736
1720
  margin-inline-end: var(--_gutter);
1737
1721
  margin-inline-start: 0;
1738
1722
  translate: calc(100% + var(--_gutter)) 0;
1739
1723
  }
1740
- [data-ui='app-shell']:not([data-canvas='flush'])[data-nav-mode='overlay'][data-open]
1741
- > [data-part='nav'] {
1724
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-nav-mode='overlay'][data-open]
1725
+ > [data-part-nav] {
1742
1726
  translate: 0 0;
1743
1727
  }
1744
1728
 
@@ -1750,7 +1734,7 @@
1750
1734
  * every inline distance. It slides in from the end the navigation is not on,
1751
1735
  * which is the end the pane stands at as a column.
1752
1736
  */
1753
- [data-ui='app-shell'][data-aside-mode='overlay'] > [data-part='aside'] {
1737
+ [data-ui-app-shell][data-aside-mode='overlay'] > [data-part-aside] {
1754
1738
  background-color: var(
1755
1739
  --slotted-app-shell-aside-surface,
1756
1740
  var(--slotted-app-shell-canvas, var(--slotted-surface, Canvas))
@@ -1773,21 +1757,21 @@
1773
1757
  visibility: hidden;
1774
1758
  z-index: var(--slotted-z-index-overlay, 1000);
1775
1759
  }
1776
- [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] {
1777
1761
  transition:
1778
1762
  translate var(--_duration) var(--slotted-easing-enter, cubic-bezier(0.05, 0.7, 0.1, 1)),
1779
1763
  visibility var(--_duration) step-start;
1780
1764
  translate: 0 0;
1781
1765
  visibility: visible;
1782
1766
  }
1783
- [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] {
1784
1768
  inset-inline-end: auto;
1785
1769
  inset-inline-start: 0;
1786
1770
  translate: -100% 0;
1787
1771
  }
1788
- [data-ui='app-shell'][data-canvas='floating'][data-aside-mode='overlay'] > [data-part='aside'],
1789
- [data-ui='app-shell'][data-canvas='panel'][data-aside-mode='overlay'] > [data-part='aside'],
1790
- [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] {
1791
1775
  border: var(--_rule-width) solid var(--_rule);
1792
1776
  border-radius: var(--_radius);
1793
1777
  box-shadow: var(--slotted-shadow-lg);
@@ -1795,14 +1779,14 @@
1795
1779
  margin-inline-end: var(--_gutter);
1796
1780
  translate: calc(100% + var(--_gutter)) 0;
1797
1781
  }
1798
- [data-ui='app-shell']:not([data-canvas='flush'])[data-aside-mode='overlay'][data-nav-side='end']
1799
- > [data-part='aside'] {
1782
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-aside-mode='overlay'][data-nav-side='end']
1783
+ > [data-part-aside] {
1800
1784
  margin-inline-end: 0;
1801
1785
  margin-inline-start: var(--_gutter);
1802
1786
  translate: calc(-100% - var(--_gutter)) 0;
1803
1787
  }
1804
- [data-ui='app-shell']:not([data-canvas='flush'])[data-aside-mode='overlay']
1805
- > [data-part='aside'][data-open] {
1788
+ [data-ui-app-shell]:not([data-canvas='flush'])[data-aside-mode='overlay']
1789
+ > [data-part-aside][data-open] {
1806
1790
  translate: 0 0;
1807
1791
  }
1808
1792
 
@@ -1825,12 +1809,12 @@
1825
1809
  * rather than of mode, so the width answers it and the width alone.
1826
1810
  */
1827
1811
  @container slotted-app-shell (inline-size >= 600px) {
1828
- [data-ui='app-shell']:not([data-nav-mode]) > [data-part='nav'] {
1812
+ [data-ui-app-shell]:not([data-nav-mode]) > [data-part-nav] {
1829
1813
  inline-size: calc(
1830
1814
  var(--_rail-size) + 2 * (var(--_nav-inset) + var(--_row-ring-inset)) + var(--_nav-edges)
1831
1815
  );
1832
1816
  }
1833
- [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] {
1834
1818
  inline-size: var(--_nav-size);
1835
1819
  }
1836
1820
 
@@ -1842,63 +1826,60 @@
1842
1826
  the unit resolves against the shell's own inline size from inside this
1843
1827
  `auto` track, where a percentage would resolve against the track the
1844
1828
  pane itself sizes. */
1845
- [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] {
1846
1830
  grid-area: 2 / 3 / 3 / 4;
1847
1831
  inline-size: var(--slotted-app-shell-aside-extent, var(--_aside-size));
1848
1832
  position: relative;
1849
1833
  }
1850
- [data-ui='app-shell']:not([data-aside-mode='overlay'])
1851
- > [data-part='aside']
1852
- > [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]) {
1853
1837
  display: block;
1854
1838
  }
1855
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-nav-side='end']
1856
- > [data-part='aside'] {
1839
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-nav-side='end'] > [data-part-aside] {
1857
1840
  grid-area: 2 / 1 / 3 / 2;
1858
1841
  }
1859
1842
  /* Under `primary="main"` the pane, as a column, stands beside the card
1860
1843
  that holds the banner and the content, so it spans the banner's row. */
1861
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-primary='main']
1862
- > [data-part='aside'],
1863
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-canvas='panel'][data-primary='nav']
1864
- > [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] {
1865
1847
  grid-row: 1 / 3;
1866
1848
  }
1867
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1849
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1868
1850
  [data-canvas='floating'],
1869
1851
  [data-canvas='inset']
1870
1852
  )[data-nav-side='end']
1871
- > [data-part='aside'] {
1853
+ > [data-part-aside] {
1872
1854
  margin-inline: var(--_gutter) 0;
1873
1855
  }
1874
- [data-ui='app-shell']:not([data-aside-mode='overlay'])[data-canvas='flush']
1875
- > [data-part='aside'] {
1856
+ [data-ui-app-shell]:not([data-aside-mode='overlay'])[data-canvas='flush'] > [data-part-aside] {
1876
1857
  border-block-start: none;
1877
1858
  }
1878
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1859
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1879
1860
  [data-canvas='flush'],
1880
1861
  [data-canvas='panel']
1881
1862
  )
1882
- > [data-part='aside'] {
1863
+ > [data-part-aside] {
1883
1864
  border-inline-start: var(--_seam);
1884
1865
  }
1885
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1866
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1886
1867
  [data-canvas='flush'],
1887
1868
  [data-canvas='panel']
1888
1869
  )[data-nav-side='end']
1889
- > [data-part='aside'] {
1870
+ > [data-part-aside] {
1890
1871
  border-inline-end: var(--_seam);
1891
1872
  border-inline-start: none;
1892
1873
  }
1893
1874
  }
1894
1875
 
1895
1876
  @container slotted-app-shell (inline-size < 600px) {
1896
- [data-ui='app-shell']:not([data-nav-mode]) > [data-part='nav'] {
1877
+ [data-ui-app-shell]:not([data-nav-mode]) > [data-part-nav] {
1897
1878
  display: none;
1898
1879
  }
1899
1880
  /* The content flush to the frame, as it is once the mode says overlay. */
1900
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='floating'] > [data-part='main'],
1901
- [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] {
1902
1883
  border-block-end: 0;
1903
1884
  border-inline: 0;
1904
1885
  border-radius: 0;
@@ -1908,33 +1889,33 @@
1908
1889
  /* The card of `primary="main"` goes with the gutter. The root cannot
1909
1890
  query its own width, but its pseudo-element is a child of the query
1910
1891
  container and reads it. */
1911
- [data-ui='app-shell']:not([data-nav-mode]):is(
1892
+ [data-ui-app-shell]:not([data-nav-mode]):is(
1912
1893
  [data-canvas='floating'],
1913
1894
  [data-canvas='inset']
1914
1895
  )[data-primary='main']::before {
1915
1896
  content: none;
1916
1897
  }
1917
- [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] {
1918
1899
  margin: 0;
1919
1900
  padding-inline: var(--_edge);
1920
1901
  }
1921
- [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] {
1922
1903
  border-block-start: var(--_rule-width) solid var(--_rule);
1923
1904
  border-radius: 0;
1924
1905
  }
1925
- [data-ui='app-shell']:not([data-nav-mode])[data-canvas='floating'] > [data-part='progress'],
1926
- [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] {
1927
1908
  border-radius: 0;
1928
1909
  margin: 0;
1929
1910
  }
1930
- [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] {
1931
1912
  border-radius: 0;
1932
1913
  }
1933
- [data-ui='app-shell']:not([data-aside-mode='overlay']):is(
1914
+ [data-ui-app-shell]:not([data-aside-mode='overlay']):is(
1934
1915
  [data-canvas='floating'],
1935
1916
  [data-canvas='inset']
1936
1917
  )
1937
- > [data-part='aside'] {
1918
+ > [data-part-aside] {
1938
1919
  margin-inline: var(--_gutter);
1939
1920
  }
1940
1921
  /* A row under the content takes at most half the shell, so the content
@@ -1942,14 +1923,14 @@
1942
1923
  left the content a line high, with the pane scrolling and the content
1943
1924
  gone. Only where the shell owns its height; under `document` the page
1944
1925
  scrolls and the row takes its content's height. */
1945
- [data-ui='app-shell'][data-scroll='content']:not([data-aside-mode='overlay'])
1946
- > [data-part='aside'] {
1926
+ [data-ui-app-shell][data-scroll='content']:not([data-aside-mode='overlay'])
1927
+ > [data-part-aside] {
1947
1928
  max-block-size: 50cqb;
1948
1929
  }
1949
1930
  /* The pane as a row under the content, in the inline mode alone: a pane
1950
1931
  whose mode is not yet decided draws nothing at a narrow width, the safe
1951
1932
  half of the answer, for the reason the navigation draws nothing. */
1952
- [data-ui='app-shell']:not([data-aside-mode]) > [data-part='aside'] {
1933
+ [data-ui-app-shell]:not([data-aside-mode]) > [data-part-aside] {
1953
1934
  display: none;
1954
1935
  }
1955
1936
  }
@@ -1957,7 +1938,7 @@
1957
1938
  /* ── The veil ────────────────────────────────────────────────────────── */
1958
1939
 
1959
1940
  /** It stops where the panel stops, so the bar above stays a fixed point. */
1960
- [data-ui='app-shell'] > [data-part='scrim'] {
1941
+ [data-ui-app-shell] > [data-part-scrim] {
1961
1942
  background-color: var(--_scrim);
1962
1943
  grid-area: 2 / 1 / -1 / -1;
1963
1944
  inset: 0;
@@ -1966,8 +1947,8 @@
1966
1947
  transition: opacity var(--_duration) var(--_easing);
1967
1948
  z-index: calc(var(--slotted-z-index-overlay, 1000) - 1);
1968
1949
  }
1969
- [data-ui='app-shell'] > [data-part='scrim'][data-status='entering'],
1970
- [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'] {
1971
1952
  opacity: 0;
1972
1953
  }
1973
1954
  }