@scalewing/react 1.47.0 → 1.49.0

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 (135) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +215 -6
  3. package/dist/command-palette.test-support.d.ts +21 -0
  4. package/dist/command-palette.test-support.js +55 -0
  5. package/dist/components/AppHeader.d.ts +3 -0
  6. package/dist/components/AppShell.d.ts +4 -3
  7. package/dist/components/AppShell.js +24 -7
  8. package/dist/components/Band.d.ts +30 -0
  9. package/dist/components/Band.js +23 -0
  10. package/dist/components/ButtonLink.d.ts +33 -0
  11. package/dist/components/ButtonLink.js +27 -0
  12. package/dist/components/CommandPalette.d.ts +12 -0
  13. package/dist/components/CommandPalette.js +143 -0
  14. package/dist/components/CommandPaletteTrigger.d.ts +9 -0
  15. package/dist/components/CommandPaletteTrigger.js +16 -0
  16. package/dist/components/ContextSwitcher.d.ts +12 -0
  17. package/dist/components/ContextSwitcher.js +62 -0
  18. package/dist/components/EmptyState.d.ts +23 -0
  19. package/dist/components/EmptyState.js +40 -0
  20. package/dist/components/FixtureGroup.d.ts +9 -0
  21. package/dist/components/FixtureGroup.js +16 -0
  22. package/dist/components/FixtureRow.d.ts +10 -0
  23. package/dist/components/FixtureRow.js +46 -0
  24. package/dist/components/GlyphTile.d.ts +9 -3
  25. package/dist/components/GlyphTile.js +15 -4
  26. package/dist/components/Grid.d.ts +11 -3
  27. package/dist/components/Grid.js +13 -4
  28. package/dist/components/Hero.d.ts +26 -0
  29. package/dist/components/Hero.js +23 -0
  30. package/dist/components/SiteFooter.d.ts +12 -0
  31. package/dist/components/SiteFooter.js +23 -0
  32. package/dist/components/SiteHeader.d.ts +14 -0
  33. package/dist/components/SiteHeader.js +24 -0
  34. package/dist/components/Skeleton.d.ts +22 -0
  35. package/dist/components/Skeleton.js +30 -0
  36. package/dist/components/Stepper.d.ts +11 -1
  37. package/dist/components/Stepper.js +10 -8
  38. package/dist/components/Text.js +3 -0
  39. package/dist/components/app-shell/AppShellBar.d.ts +23 -0
  40. package/dist/components/app-shell/AppShellBar.js +25 -0
  41. package/dist/components/app-shell/types.d.ts +36 -1
  42. package/dist/components/app-shell/validate.d.ts +4 -3
  43. package/dist/components/app-shell/validate.js +21 -3
  44. package/dist/components/command-palette/PaletteList.d.ts +20 -0
  45. package/dist/components/command-palette/PaletteList.js +21 -0
  46. package/dist/components/command-palette/shortcut.d.ts +19 -0
  47. package/dist/components/command-palette/shortcut.js +75 -0
  48. package/dist/components/command-palette/types.d.ts +72 -0
  49. package/dist/components/command-palette/types.js +2 -0
  50. package/dist/components/command-palette/validate.d.ts +10 -0
  51. package/dist/components/command-palette/validate.js +50 -0
  52. package/dist/components/context-switcher/SwitcherOption.d.ts +17 -0
  53. package/dist/components/context-switcher/SwitcherOption.js +20 -0
  54. package/dist/components/context-switcher/SwitcherPopup.d.ts +31 -0
  55. package/dist/components/context-switcher/SwitcherPopup.js +111 -0
  56. package/dist/components/context-switcher/options.d.ts +33 -0
  57. package/dist/components/context-switcher/options.js +60 -0
  58. package/dist/components/context-switcher/types.d.ts +96 -0
  59. package/dist/components/context-switcher/types.js +1 -0
  60. package/dist/components/context-switcher/use-switcher-list.d.ts +29 -0
  61. package/dist/components/context-switcher/use-switcher-list.js +93 -0
  62. package/dist/components/context-switcher/validate.d.ts +8 -0
  63. package/dist/components/context-switcher/validate.js +94 -0
  64. package/dist/components/fixture/fixture-list-context.d.ts +4 -0
  65. package/dist/components/fixture/fixture-list-context.js +9 -0
  66. package/dist/components/fixture/types.d.ts +50 -0
  67. package/dist/components/fixture/types.js +1 -0
  68. package/dist/components/fixture/validate.d.ts +8 -0
  69. package/dist/components/fixture/validate.js +36 -0
  70. package/dist/components/site-footer/types.d.ts +31 -0
  71. package/dist/components/site-footer/types.js +1 -0
  72. package/dist/components/site-footer/validate.d.ts +7 -0
  73. package/dist/components/site-footer/validate.js +22 -0
  74. package/dist/components/site-header/SiteHeaderLinks.d.ts +7 -0
  75. package/dist/components/site-header/SiteHeaderLinks.js +7 -0
  76. package/dist/components/site-header/types.d.ts +38 -0
  77. package/dist/components/site-header/types.js +1 -0
  78. package/dist/components/site-header/use-menu-dismiss.d.ts +8 -0
  79. package/dist/components/site-header/use-menu-dismiss.js +62 -0
  80. package/dist/components/site-header/validate.d.ts +7 -0
  81. package/dist/components/site-header/validate.js +17 -0
  82. package/dist/components/stepper/StepperCountFrame.d.ts +15 -0
  83. package/dist/components/stepper/StepperCountFrame.js +25 -0
  84. package/dist/components/use-element-height.d.ts +10 -0
  85. package/dist/components/use-element-height.js +35 -0
  86. package/dist/context-switcher.test-support.d.ts +9 -0
  87. package/dist/context-switcher.test-support.js +41 -0
  88. package/dist/css/css-app-shell-page-bar.d.ts +3 -0
  89. package/dist/css/css-app-shell-page-bar.js +81 -0
  90. package/dist/css/css-app-shell.js +6 -1
  91. package/dist/css/css-band.d.ts +10 -0
  92. package/dist/css/css-band.js +101 -0
  93. package/dist/css/css-button-link.d.ts +3 -0
  94. package/dist/css/css-button-link.js +48 -0
  95. package/dist/css/css-command-palette-key.d.ts +1 -0
  96. package/dist/css/css-command-palette-key.js +33 -0
  97. package/dist/css/css-command-palette-trigger.d.ts +2 -0
  98. package/dist/css/css-command-palette-trigger.js +88 -0
  99. package/dist/css/css-command-palette.d.ts +2 -0
  100. package/dist/css/css-command-palette.js +209 -0
  101. package/dist/css/css-components.js +30 -0
  102. package/dist/css/css-context-switcher-trigger.d.ts +15 -0
  103. package/dist/css/css-context-switcher-trigger.js +175 -0
  104. package/dist/css/css-context-switcher.d.ts +4 -0
  105. package/dist/css/css-context-switcher.js +219 -0
  106. package/dist/css/css-count-pill.d.ts +2 -2
  107. package/dist/css/css-count-pill.js +11 -3
  108. package/dist/css/css-empty-state.d.ts +2 -0
  109. package/dist/css/css-empty-state.js +77 -0
  110. package/dist/css/css-fixture.d.ts +5 -0
  111. package/dist/css/css-fixture.js +260 -0
  112. package/dist/css/css-glyph-tile.d.ts +2 -0
  113. package/dist/css/css-glyph-tile.js +29 -1
  114. package/dist/css/css-grid-span.js +5 -2
  115. package/dist/css/css-grid.d.ts +13 -0
  116. package/dist/css/css-grid.js +17 -1
  117. package/dist/css/css-hero.d.ts +2 -0
  118. package/dist/css/css-hero.js +62 -0
  119. package/dist/css/css-site-footer.d.ts +2 -0
  120. package/dist/css/css-site-footer.js +152 -0
  121. package/dist/css/css-site-header.d.ts +2 -0
  122. package/dist/css/css-site-header.js +262 -0
  123. package/dist/css/css-skeleton.d.ts +10 -0
  124. package/dist/css/css-skeleton.js +110 -0
  125. package/dist/css/css-stepper-unit.d.ts +9 -0
  126. package/dist/css/css-stepper-unit.js +102 -0
  127. package/dist/css/css-stepper.js +5 -1
  128. package/dist/css/stacking.js +7 -4
  129. package/dist/css/stylesheet.js +20 -0
  130. package/dist/index.d.ts +18 -2
  131. package/dist/index.js +13 -1
  132. package/dist/stepper-count.d.ts +8 -0
  133. package/dist/stepper-count.js +17 -0
  134. package/dist/styles.css +2202 -702
  135. package/package.json +2 -2
package/dist/styles.css CHANGED
@@ -18,6 +18,8 @@
18
18
  --sw-color-success: #087443;
19
19
  --sw-color-warning: #B54708;
20
20
  --sw-color-border: #D2D2D7;
21
+ --sw-color-inverse: #1D1D1F;
22
+ --sw-color-onInverse: #FFFFFF;
21
23
  --sw-button-secondary-border: #D2D2D7;
22
24
  --sw-categorical-green: #2E8F47;
23
25
  --sw-categorical-blue: #0A7AFF;
@@ -92,6 +94,8 @@
92
94
  --sw-color-success: #5BE0A0;
93
95
  --sw-color-warning: #FDB022;
94
96
  --sw-color-border: #3A3A3C;
97
+ --sw-color-inverse: #2C2C2E;
98
+ --sw-color-onInverse: #F5F5F7;
95
99
  --sw-button-secondary-border: #3A3A3C;
96
100
  --sw-categorical-green: #2E8F47;
97
101
  --sw-categorical-blue: #0A7AFF;
@@ -854,8 +858,8 @@ body {
854
858
  }
855
859
 
856
860
  /* Backdrop blur makes a glass surface its own stacking context, so it lifts while it holds an open popup (see stacking.ts). */
857
- .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
858
- .sw-accordion:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar) {
861
+ .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-context-switcher-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
862
+ .sw-accordion:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-context-switcher-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar) {
859
863
  position: relative;
860
864
  z-index: 4;
861
865
  }
@@ -890,19 +894,25 @@ body {
890
894
  .sw-text-align-center { text-align: center; }
891
895
  .sw-text-align-end { text-align: end; }
892
896
 
893
- :where(.sw-text-display, .sw-text-heading, .sw-text-title, .sw-text-body, .sw-text-label, .sw-text-caption, .sw-text-data) { margin: 0; }
897
+ :where(.sw-text-hero, .sw-text-display, .sw-text-headline, .sw-text-heading, .sw-text-title, .sw-text-lead, .sw-text-body, .sw-text-label, .sw-text-caption, .sw-text-data) { margin: 0; }
894
898
 
899
+ .sw-text-hero { font-family: var(--sw-font-sans); font-size: 56px; line-height: 60px; font-weight: 700; letter-spacing: -1.7px; }
895
900
  .sw-text-display { font-family: var(--sw-font-sans); font-size: 40px; line-height: 48px; font-weight: 600; letter-spacing: -0.8px; }
901
+ .sw-text-headline { font-family: var(--sw-font-sans); font-size: 36px; line-height: 40px; font-weight: 700; letter-spacing: -0.7px; }
896
902
  .sw-text-heading { font-family: var(--sw-font-sans); font-size: 28px; line-height: 34px; font-weight: 600; letter-spacing: -0.45px; }
897
903
  .sw-text-title { font-family: var(--sw-font-sans); font-size: 20px; line-height: 28px; font-weight: 600; letter-spacing: -0.3px; }
904
+ .sw-text-lead { font-family: var(--sw-font-sans); font-size: 20px; line-height: 29px; font-weight: 400; letter-spacing: -0.3px; }
898
905
  .sw-text-body { font-family: var(--sw-font-sans); font-size: 17px; line-height: 25px; font-weight: 400; letter-spacing: -0.2px; }
899
906
  .sw-text-label { font-family: var(--sw-font-sans); font-size: 15px; line-height: 20px; font-weight: 600; letter-spacing: -0.2px; }
900
907
  .sw-text-caption { font-family: var(--sw-font-sans); font-size: 13px; line-height: 18px; font-weight: 400; letter-spacing: -0.08px; }
901
908
  .sw-text-data { font-family: var(--sw-font-sans); font-size: 13px; line-height: 18px; font-weight: 500; letter-spacing: -0.08px; font-variant-numeric: tabular-nums; }
902
909
 
903
910
  @media not all and (min-width: 48rem) {
911
+ .sw-text-hero { font-size: 36px; line-height: 40px; letter-spacing: -0.7px; }
904
912
  .sw-text-display { font-size: 32px; line-height: 38px; letter-spacing: -0.6px; }
913
+ .sw-text-headline { font-size: 26px; line-height: 30px; letter-spacing: -0.4px; }
905
914
  .sw-text-heading { font-size: 24px; line-height: 30px; letter-spacing: -0.4px; }
915
+ .sw-text-lead { font-size: 17px; line-height: 25px; letter-spacing: -0.2px; }
906
916
  }
907
917
 
908
918
  [data-theme] .sw-font-mono,
@@ -1066,6 +1076,37 @@ body {
1066
1076
  .sw-button-group.sw-button-group-attached.sw-button-group-track > .sw-button[aria-pressed='true'] { border-color: Highlight; }
1067
1077
  }
1068
1078
 
1079
+ [data-theme] a.sw-button-link {
1080
+ text-decoration: none;
1081
+ }
1082
+
1083
+ [data-theme] a.sw-button-link.sw-button-primary,
1084
+ [data-theme] a.sw-button-link.sw-button-primary:hover { color: var(--sw-color-onAccent); }
1085
+ [data-theme] a.sw-button-link.sw-button-secondary,
1086
+ [data-theme] a.sw-button-link.sw-button-secondary:hover { color: var(--sw-color-onSecondary); }
1087
+ [data-theme] a.sw-button-link.sw-button-tertiary,
1088
+ [data-theme] a.sw-button-link.sw-button-tertiary:hover { color: var(--sw-color-onTertiary); }
1089
+ [data-theme] a.sw-button-link.sw-button-ghost,
1090
+ [data-theme] a.sw-button-link.sw-button-ghost:hover { color: var(--sw-color-accent); }
1091
+ [data-theme] a.sw-button-link.sw-button-danger,
1092
+ [data-theme] a.sw-button-link.sw-button-danger:hover { color: var(--sw-color-onDanger); }
1093
+ [data-theme] a.sw-button-link.sw-button-neutral,
1094
+ [data-theme] a.sw-button-link.sw-button-neutral:hover { color: var(--sw-color-text); }
1095
+
1096
+ [data-theme] a.sw-button-link[aria-current='page'] {
1097
+ box-shadow: 0 0 0 2px var(--sw-color-background), 0 0 0 4px var(--sw-color-accent);
1098
+ }
1099
+
1100
+ [data-theme] a.sw-button-link[aria-current='page']:focus-visible {
1101
+ outline-offset: calc(var(--sw-focus-ring-offset) + 4px);
1102
+ }
1103
+
1104
+ @media (forced-colors: active) {
1105
+ [data-theme] a.sw-button-link { color: LinkText; }
1106
+ [data-theme] a.sw-button-link[aria-current='page'] { border-color: Highlight; position: relative; }
1107
+ [data-theme] a.sw-button-link[aria-current='page']::after { border: 2px solid Highlight; border-radius: inherit; content: ''; inset: calc(-1px - 4px); pointer-events: none; position: absolute; }
1108
+ }
1109
+
1069
1110
  .sw-checkbox {
1070
1111
  display: flex;
1071
1112
  flex-direction: column;
@@ -3056,6 +3097,203 @@ body {
3056
3097
  .sw-list-group-tiles > .sw-list > .sw-list-item { border-color: CanvasText; }
3057
3098
  }
3058
3099
 
3100
+ .sw-fixture-group {
3101
+ display: flex;
3102
+ flex-direction: column;
3103
+ }
3104
+
3105
+ .sw-fixture-group-title {
3106
+ color: var(--sw-color-muted);
3107
+ font-family: var(--sw-font-sans);
3108
+ font-size: 13px;
3109
+ font-weight: 600;
3110
+ letter-spacing: -0.08px;
3111
+ line-height: 18px;
3112
+ padding-block: var(--sw-space-2) var(--sw-space-1);
3113
+ }
3114
+
3115
+ .sw-fixture-list {
3116
+ display: grid;
3117
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto auto;
3118
+ list-style: none;
3119
+ margin: 0;
3120
+ padding: 0;
3121
+ }
3122
+
3123
+ .sw-fixture-item,
3124
+ .sw-fixture-row {
3125
+ display: grid;
3126
+ grid-column: 1 / -1;
3127
+ grid-template-columns: subgrid;
3128
+ }
3129
+
3130
+ .sw-fixture-item {
3131
+ border-top: 1px solid var(--sw-color-border);
3132
+ }
3133
+
3134
+ .sw-fixture-row {
3135
+ align-items: center;
3136
+ appearance: none;
3137
+ background: transparent;
3138
+ border: 0;
3139
+ box-sizing: border-box;
3140
+ color: var(--sw-color-text);
3141
+ font-family: var(--sw-font-sans);
3142
+ font-size: 15px;
3143
+ letter-spacing: -0.2px;
3144
+ line-height: 20px;
3145
+ margin: 0;
3146
+ min-height: var(--sw-control-md-min-height);
3147
+ padding: var(--sw-space-2);
3148
+ row-gap: var(--sw-space-1);
3149
+ text-align: start;
3150
+ text-decoration: none;
3151
+ width: 100%;
3152
+ }
3153
+
3154
+ .sw-fixture-row-pressable { cursor: pointer; }
3155
+
3156
+ @media (hover: hover) {
3157
+ .sw-fixture-row-pressable:hover { background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent); }
3158
+ }
3159
+
3160
+ .sw-fixture-row-pressable:focus { outline: none; }
3161
+
3162
+ .sw-fixture-row-pressable:focus-visible {
3163
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
3164
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
3165
+ }
3166
+
3167
+ [data-theme] a.sw-fixture-row,
3168
+ [data-theme] a.sw-fixture-row:hover {
3169
+ color: var(--sw-color-text);
3170
+ }
3171
+
3172
+ [data-theme] a.sw-fixture-row:focus-visible {
3173
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
3174
+ }
3175
+
3176
+ .sw-fixture-team {
3177
+ align-items: center;
3178
+ display: flex;
3179
+ gap: var(--sw-space-2);
3180
+ min-width: 0;
3181
+ }
3182
+
3183
+ .sw-fixture-team-home {
3184
+ grid-column: 1;
3185
+ justify-content: flex-end;
3186
+ text-align: end;
3187
+ }
3188
+
3189
+ .sw-fixture-team-away {
3190
+ grid-column: 3;
3191
+ }
3192
+
3193
+ .sw-fixture-name {
3194
+ font-weight: 500;
3195
+ min-width: 0;
3196
+ overflow-wrap: anywhere;
3197
+ }
3198
+
3199
+ .sw-fixture-mark {
3200
+ display: inline-flex;
3201
+ flex: none;
3202
+ }
3203
+
3204
+ .sw-fixture-center {
3205
+ font-variant-numeric: tabular-nums;
3206
+ grid-column: 2;
3207
+ margin-inline: var(--sw-space-3);
3208
+ justify-self: center;
3209
+ white-space: nowrap;
3210
+ }
3211
+
3212
+ .sw-fixture-center-time {
3213
+ background: var(--sw-color-subtle);
3214
+ border-radius: var(--sw-radius-sm);
3215
+ font-size: 13px;
3216
+ font-weight: 600;
3217
+ letter-spacing: -0.08px;
3218
+ line-height: 18px;
3219
+ padding: calc(var(--sw-space-1) / 2) var(--sw-space-2);
3220
+ }
3221
+
3222
+ .sw-fixture-center-score {
3223
+ font-weight: 700;
3224
+ }
3225
+
3226
+ .sw-fixture-end {
3227
+ align-items: center;
3228
+ color: var(--sw-color-muted);
3229
+ display: flex;
3230
+ flex-wrap: wrap;
3231
+ font-size: 13px;
3232
+ gap: var(--sw-space-2);
3233
+ grid-column: 4;
3234
+ justify-content: flex-end;
3235
+ letter-spacing: -0.08px;
3236
+ margin-inline-start: var(--sw-space-3);
3237
+ line-height: 18px;
3238
+ }
3239
+
3240
+ .sw-fixture-chevron {
3241
+ border-bottom: 2px solid var(--sw-color-muted);
3242
+ border-right: 2px solid var(--sw-color-muted);
3243
+ box-sizing: border-box;
3244
+ height: var(--sw-space-2);
3245
+ width: var(--sw-space-2);
3246
+ grid-column: 5;
3247
+ justify-self: end;
3248
+ margin-inline: var(--sw-space-3) var(--sw-space-1);
3249
+ transform: rotate(-45deg);
3250
+ }
3251
+
3252
+ .sw-fixture-chevron:dir(rtl) { transform: rotate(135deg); }
3253
+
3254
+ @media (forced-colors: active) {
3255
+ .sw-fixture-row-pressable:hover {
3256
+ outline: var(--sw-focus-ring-width) solid Highlight;
3257
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
3258
+ }
3259
+ .sw-fixture-center-time { border: 1px solid CanvasText; }
3260
+ .sw-fixture-chevron { border-color: CanvasText; }
3261
+ }
3262
+
3263
+ @media not all and (min-width: 48rem) {
3264
+ .sw-fixture-list {
3265
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto;
3266
+ }
3267
+
3268
+ .sw-fixture-end {
3269
+ grid-column: 1 / 4;
3270
+ grid-row: 2;
3271
+ justify-content: flex-start;
3272
+ margin-inline-start: 0;
3273
+ }
3274
+
3275
+ .sw-fixture-chevron {
3276
+ grid-column: 4;
3277
+ grid-row: 1 / span 2;
3278
+ }
3279
+ }
3280
+
3281
+ @supports not (grid-template-columns: subgrid) {
3282
+ .sw-fixture-item {
3283
+ display: block;
3284
+ }
3285
+
3286
+ .sw-fixture-row {
3287
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto auto;
3288
+ }
3289
+
3290
+ @media not all and (min-width: 48rem) {
3291
+ .sw-fixture-row {
3292
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto;
3293
+ }
3294
+ }
3295
+ }
3296
+
3059
3297
  .sw-file-field-frame {
3060
3298
  border: 1px solid var(--sw-color-border);
3061
3299
  border-radius: var(--sw-radius-md);
@@ -3583,7 +3821,8 @@ body {
3583
3821
 
3584
3822
  [data-theme] .sw-section-nav-count,
3585
3823
  [data-theme] .sw-nav-count,
3586
- [data-theme] .sw-app-shell-count {
3824
+ [data-theme] .sw-app-shell-count,
3825
+ [data-theme] .sw-context-switcher-count {
3587
3826
  align-items: center;
3588
3827
  background: var(--sw-color-danger);
3589
3828
  border-radius: var(--sw-radius-pill);
@@ -3612,13 +3851,15 @@ body {
3612
3851
  * each wins in any order.
3613
3852
  */
3614
3853
  [data-theme] .sw-nav-count.sw-nav-count-accent,
3615
- [data-theme] .sw-app-shell-count.sw-app-shell-count-accent {
3854
+ [data-theme] .sw-app-shell-count.sw-app-shell-count-accent,
3855
+ [data-theme] .sw-context-switcher-count.sw-context-switcher-count-accent {
3616
3856
  background: var(--sw-color-accent);
3617
3857
  color: var(--sw-color-onAccent);
3618
3858
  }
3619
3859
 
3620
3860
  [data-theme] .sw-nav-count.sw-nav-count-warning,
3621
- [data-theme] .sw-app-shell-count.sw-app-shell-count-warning {
3861
+ [data-theme] .sw-app-shell-count.sw-app-shell-count-warning,
3862
+ [data-theme] .sw-context-switcher-count.sw-context-switcher-count-warning {
3622
3863
  background: color-mix(in srgb, var(--sw-color-warning) 10%, var(--sw-color-surface));
3623
3864
  border: 1px solid var(--sw-color-warning);
3624
3865
  color: color-mix(in srgb, var(--sw-color-warning) 70%, var(--sw-color-text));
@@ -3642,7 +3883,8 @@ body {
3642
3883
  @media (forced-colors: active) {
3643
3884
  [data-theme] .sw-section-nav-count,
3644
3885
  [data-theme] .sw-nav-count,
3645
- [data-theme] .sw-app-shell-count { border: 1px solid CanvasText; }
3886
+ [data-theme] .sw-app-shell-count,
3887
+ [data-theme] .sw-context-switcher-count { border: 1px solid CanvasText; }
3646
3888
  }
3647
3889
 
3648
3890
  .sw-bar-chart {
@@ -4306,701 +4548,1597 @@ body {
4306
4548
  [data-theme] .sw-section-nav-link[aria-current] { border-color: Highlight; color: CanvasText; }
4307
4549
  }
4308
4550
 
4309
- .sw-app-shell {
4310
- min-height: 100vh;
4311
- min-height: 100dvh;
4551
+ .sw-band {
4552
+ box-sizing: border-box;
4553
+ width: 100%;
4312
4554
  }
4313
4555
 
4314
- .sw-app-shell-bar {
4315
- align-items: center;
4316
- display: flex;
4317
- gap: var(--sw-space-2);
4556
+ .sw-band-surface {
4557
+ background: var(--sw-color-surface);
4558
+ color: var(--sw-color-text);
4318
4559
  }
4319
4560
 
4320
- .sw-app-shell-bar-title {
4321
- flex: 1 1 auto;
4322
- min-width: 0;
4561
+ .sw-band-subtle {
4562
+ background: var(--sw-color-subtle);
4563
+ color: var(--sw-color-text);
4323
4564
  }
4324
4565
 
4325
- .sw-app-shell-bar-end {
4326
- align-items: center;
4327
- display: flex;
4328
- flex: none;
4329
- gap: var(--sw-space-2);
4566
+ .sw-band-inverse {
4567
+ --sw-color-background: var(--sw-color-inverse);
4568
+ --sw-color-surface: var(--sw-color-inverse);
4569
+ --sw-color-text: var(--sw-color-onInverse);
4570
+ --sw-color-muted: color-mix(in srgb, var(--sw-color-onInverse) 78%, var(--sw-color-inverse));
4571
+ --sw-color-border: color-mix(in srgb, var(--sw-color-onInverse) 18%, var(--sw-color-inverse));
4572
+ --sw-color-subtle: color-mix(in srgb, var(--sw-color-onInverse) 10%, var(--sw-color-inverse));
4573
+ --sw-color-accent: var(--sw-color-onInverse);
4574
+ --sw-color-onAccent: var(--sw-color-inverse);
4575
+ background: var(--sw-color-inverse);
4576
+ color: var(--sw-color-onInverse);
4330
4577
  }
4331
4578
 
4332
- .sw-button.sw-app-shell-menu {
4333
- flex: none;
4334
- padding-inline: 0;
4579
+ [data-theme] .sw-band-inverse a:not(.sw-button) {
4580
+ color: var(--sw-color-onInverse);
4581
+ text-decoration: underline;
4582
+ text-decoration-color: color-mix(in srgb, currentColor 50%, transparent);
4583
+ text-underline-offset: 0.2em;
4335
4584
  }
4336
4585
 
4337
- .sw-button-xs.sw-app-shell-menu { min-width: var(--sw-control-xs-min-height); }
4338
- .sw-button-sm.sw-app-shell-menu { min-width: var(--sw-control-sm-min-height); }
4339
- .sw-button-md.sw-app-shell-menu { min-width: var(--sw-control-md-min-height); }
4340
-
4341
- @media (pointer: coarse) {
4342
- .sw-button.sw-app-shell-menu {
4343
- min-height: var(--sw-control-md-min-height);
4344
- min-width: var(--sw-control-md-min-height);
4345
- }
4586
+ [data-theme] .sw-band-inverse a:not(.sw-button):hover {
4587
+ text-decoration-color: currentColor;
4346
4588
  }
4347
4589
 
4348
- .sw-app-shell-main {
4349
- display: block;
4350
- min-width: 0;
4590
+ .sw-band-inner {
4591
+ box-sizing: border-box;
4592
+ margin-inline: auto;
4593
+ padding-inline: var(--sw-space-4);
4594
+ width: 100%;
4351
4595
  }
4352
4596
 
4353
- .sw-app-shell-sidebar,
4354
- .sw-app-shell-sidebar .sw-app-shell-rail-slot {
4355
- display: none;
4597
+ .sw-band-inner-container { max-width: calc(var(--sw-container-max) + 2 * var(--sw-space-5)); }
4598
+
4599
+ .sw-band-inner-reading { max-width: calc(var(--sw-reading-max) + 2 * var(--sw-space-5)); }
4600
+
4601
+ @media (min-width: 48rem) {
4602
+ .sw-band-inner { padding-inline: var(--sw-space-5); }
4356
4603
  }
4357
4604
 
4358
- .sw-app-shell-header,
4359
- .sw-app-shell-footer {
4360
- flex: none;
4361
- padding: var(--sw-space-3);
4605
+ @media (forced-colors: active) {
4606
+ .sw-band-inverse { border-block: 1px solid CanvasText; }
4362
4607
  }
4363
4608
 
4364
- .sw-app-shell-footer {
4365
- border-top: 1px solid var(--sw-color-border);
4609
+ .sw-hero {
4610
+ align-items: center;
4611
+ display: grid;
4612
+ gap: var(--sw-space-8);
4613
+ min-width: 0;
4366
4614
  }
4367
4615
 
4368
- .sw-app-shell-nav {
4369
- box-sizing: border-box;
4616
+ .sw-hero-text {
4370
4617
  display: flex;
4371
- flex: 1 1 auto;
4372
4618
  flex-direction: column;
4373
4619
  gap: var(--sw-space-4);
4374
- min-height: 0;
4375
- overflow-y: auto;
4376
- overscroll-behavior: contain;
4377
- padding: var(--sw-space-2) var(--sw-space-3);
4620
+ min-width: 0;
4378
4621
  }
4379
4622
 
4380
- .sw-app-shell-group {
4623
+ .sw-hero:not(.sw-hero-with-media) .sw-hero-text {
4624
+ max-width: var(--sw-reading-max);
4625
+ }
4626
+
4627
+ .sw-hero-actions {
4381
4628
  display: flex;
4382
- flex-direction: column;
4383
- gap: var(--sw-space-1);
4629
+ flex-wrap: wrap;
4630
+ gap: var(--sw-space-3);
4631
+ padding-top: var(--sw-space-1);
4384
4632
  }
4385
4633
 
4386
- .sw-app-shell-group-label {
4387
- color: var(--sw-color-muted);
4388
- font-family: var(--sw-font-sans);
4389
- font-size: 13px;
4390
- font-weight: 600;
4391
- letter-spacing: -0.08px;
4392
- line-height: 18px;
4393
- margin: 0;
4394
- padding-inline: var(--sw-space-2);
4634
+ .sw-hero-media {
4635
+ justify-self: center;
4636
+ max-width: 100%;
4637
+ min-width: 0;
4395
4638
  }
4396
4639
 
4397
- .sw-app-shell-list {
4640
+ @media (min-width: 48rem) {
4641
+ .sw-hero-text { gap: var(--sw-space-5); }
4642
+ .sw-hero-with-media { grid-template-columns: minmax(0, 1fr) auto; }
4643
+ }
4644
+
4645
+ @media not all and (min-width: 48rem) {
4646
+ .sw-hero { gap: var(--sw-space-6); }
4647
+ .sw-hero-actions { align-items: stretch; flex-direction: column; }
4648
+ }
4649
+
4650
+ .sw-site-footer-top {
4651
+ display: grid;
4652
+ gap: var(--sw-space-6) var(--sw-space-5);
4653
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4654
+ }
4655
+
4656
+ .sw-site-footer-brand {
4398
4657
  display: flex;
4399
4658
  flex-direction: column;
4400
- gap: var(--sw-space-1);
4401
- list-style: none;
4402
- margin: 0;
4403
- padding: 0;
4659
+ gap: var(--sw-space-3);
4660
+ grid-column: 1 / -1;
4661
+ max-width: 20rem;
4404
4662
  }
4405
4663
 
4406
- .sw-app-shell-item > .sw-tooltip-anchor {
4407
- display: flex;
4664
+ .sw-site-footer-brand > :first-child {
4665
+ align-self: flex-start;
4408
4666
  }
4409
4667
 
4410
- [data-theme] .sw-app-shell-link {
4411
- align-items: center;
4412
- border: 2px solid transparent;
4413
- border-radius: var(--sw-radius-sm);
4414
- box-sizing: border-box;
4415
- color: var(--sw-color-text);
4416
- display: flex;
4417
- flex: 1 1 auto;
4418
- font-family: var(--sw-font-sans);
4668
+ .sw-site-footer-tagline {
4669
+ color: var(--sw-color-muted);
4670
+ margin: 0;
4419
4671
  font-size: 15px;
4420
- font-weight: 500;
4421
- gap: var(--sw-space-3);
4672
+ font-weight: 400;
4422
4673
  letter-spacing: -0.2px;
4423
4674
  line-height: 20px;
4424
- min-height: var(--sw-control-sm-min-height);
4425
- padding: var(--sw-space-1) var(--sw-space-2);
4426
- text-decoration: none;
4427
4675
  }
4428
4676
 
4429
- [data-theme] .sw-app-shell-link:hover {
4430
- background: color-mix(in srgb, var(--sw-color-muted) 12%, transparent);
4677
+ .sw-site-footer-group {
4678
+ display: flex;
4679
+ flex-direction: column;
4680
+ gap: var(--sw-space-3);
4681
+ min-width: 0;
4431
4682
  }
4432
4683
 
4433
- [data-theme] .sw-app-shell-link:focus-visible {
4434
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4435
- outline-offset: calc(-1 * var(--sw-focus-ring-width));
4684
+ .sw-site-footer-label {
4685
+ color: var(--sw-color-text);
4686
+ margin: 0;
4687
+ font-size: 13px;
4688
+ font-weight: 600;
4689
+ letter-spacing: -0.08px;
4690
+ line-height: 18px;
4436
4691
  }
4437
4692
 
4438
- [data-theme] .sw-app-shell-link[aria-current] {
4439
- background: color-mix(in srgb, var(--sw-color-muted) 18%, transparent);
4440
- font-weight: 600;
4693
+ .sw-site-footer-links {
4694
+ display: flex;
4695
+ flex-direction: column;
4696
+ gap: var(--sw-space-2);
4697
+ list-style: none;
4698
+ margin: 0;
4699
+ padding: 0;
4441
4700
  }
4442
4701
 
4443
- .sw-app-shell-icon {
4702
+ [data-theme] .sw-band-inverse a.sw-site-footer-link {
4703
+ color: var(--sw-color-muted);
4444
4704
  display: inline-flex;
4445
- flex: none;
4705
+ font-size: 15px;
4706
+ font-weight: 400;
4707
+ letter-spacing: -0.2px;
4708
+ line-height: 20px;
4709
+ overflow-wrap: anywhere;
4710
+ text-decoration-color: transparent;
4446
4711
  }
4447
4712
 
4448
- .sw-app-shell-label {
4449
- flex: 1 1 auto;
4450
- min-width: 0;
4451
- overflow-wrap: anywhere;
4713
+ [data-theme] .sw-band-inverse a.sw-site-footer-link:is(:hover, :focus-visible) {
4714
+ color: var(--sw-color-text);
4715
+ text-decoration-color: currentColor;
4452
4716
  }
4453
4717
 
4454
- .sw-app-shell-count {
4455
- flex: none;
4718
+ [data-theme] .sw-band-inverse a.sw-site-footer-link[aria-current='page'] {
4719
+ color: var(--sw-color-text);
4720
+ font-weight: 600;
4456
4721
  }
4457
4722
 
4458
- @media (pointer: coarse) {
4459
- [data-theme] .sw-app-shell-link { min-height: var(--sw-control-md-min-height); }
4723
+ .sw-site-footer-bottom {
4724
+ align-items: center;
4725
+ border-top: 1px solid var(--sw-color-border);
4726
+ color: var(--sw-color-muted);
4727
+ display: flex;
4728
+ flex-wrap: wrap;
4729
+ gap: var(--sw-space-3);
4730
+ justify-content: space-between;
4731
+ margin-top: var(--sw-space-6);
4732
+ padding-top: var(--sw-space-4);
4733
+ font-size: 13px;
4734
+ font-weight: 400;
4735
+ letter-spacing: -0.08px;
4736
+ line-height: 18px;
4460
4737
  }
4461
4738
 
4462
- @media (forced-colors: active) {
4463
- [data-theme] .sw-app-shell-link { color: LinkText; }
4464
- [data-theme] .sw-app-shell-link[aria-current] { border-color: Highlight; color: CanvasText; }
4739
+ .sw-site-footer-end {
4740
+ margin-inline-start: auto;
4465
4741
  }
4466
4742
 
4467
- @media (min-width: 64rem) {
4468
- .sw-app-shell {
4469
- align-items: start;
4470
- display: grid;
4471
- grid-template-columns: auto minmax(0, 1fr);
4743
+ @media (min-width: 48rem) {
4744
+ .sw-site-footer-top {
4745
+ display: flex;
4746
+ flex-wrap: wrap;
4747
+ gap: var(--sw-space-6) var(--sw-space-8);
4748
+ justify-content: space-between;
4472
4749
  }
4750
+ }
4473
4751
 
4474
- .sw-app-shell-bar {
4475
- display: none;
4752
+ @media (pointer: coarse) {
4753
+ [data-theme] .sw-band-inverse a.sw-site-footer-link {
4754
+ align-items: center;
4755
+ min-height: var(--sw-control-md-min-height);
4476
4756
  }
4477
4757
 
4478
- .sw-app-shell-sidebar {
4479
- background: var(--sw-color-surface);
4480
- border-inline-end: 1px solid var(--sw-color-border);
4481
- box-sizing: border-box;
4482
- display: flex;
4483
- flex-direction: column;
4484
- height: 100vh;
4485
- height: 100dvh;
4486
- position: sticky;
4487
- top: 0;
4488
- width: calc(var(--sw-control-md-min-height) + 2 * var(--sw-space-3) + 1px);
4758
+ .sw-site-footer-links {
4759
+ gap: 0;
4489
4760
  }
4761
+ }
4490
4762
 
4491
- @media not all and (min-width: 75rem) {
4492
- .sw-app-shell-sidebar .sw-app-shell-slot {
4493
- display: none;
4494
- }
4495
-
4496
- .sw-app-shell-sidebar .sw-app-shell-rail-slot {
4497
- display: block;
4498
- }
4499
-
4500
- .sw-app-shell-sidebar .sw-app-shell-label,
4501
- .sw-app-shell-sidebar .sw-app-shell-group-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
4502
-
4503
- .sw-app-shell-sidebar .sw-app-shell-nav {
4504
- gap: var(--sw-space-2);
4505
- }
4506
-
4507
- .sw-app-shell-sidebar .sw-app-shell-group + .sw-app-shell-group {
4508
- border-top: 1px solid var(--sw-color-border);
4509
- padding-top: var(--sw-space-2);
4510
- }
4511
-
4512
- [data-theme] .sw-app-shell-sidebar .sw-app-shell-link {
4513
- justify-content: center;
4514
- min-height: var(--sw-control-md-min-height);
4515
- padding: 0;
4516
- position: relative;
4517
- }
4518
-
4519
- .sw-app-shell-sidebar .sw-app-shell-count {
4520
- inset-block-start: 0;
4521
- inset-inline-end: 0;
4522
- position: absolute;
4523
- }
4763
+ @media (forced-colors: active) {
4764
+ [data-theme] .sw-band-inverse a.sw-site-footer-link {
4765
+ color: LinkText;
4524
4766
  }
4525
- }
4526
4767
 
4527
- @media (min-width: 75rem) {
4528
- .sw-app-shell-sidebar {
4529
- width: 15rem;
4768
+ .sw-site-footer-bottom {
4769
+ border-top-color: CanvasText;
4530
4770
  }
4531
4771
  }
4532
4772
 
4533
- .sw-app-shell-drawer {
4773
+ .sw-site-header {
4774
+ --sw-site-header-height: calc(var(--sw-control-md-min-height) + var(--sw-space-3));
4534
4775
  background: var(--sw-color-surface);
4535
- border: 0;
4536
- border-inline-end: 1px solid var(--sw-color-border);
4537
- box-sizing: border-box;
4776
+ border-bottom: 1px solid var(--sw-color-border);
4538
4777
  color: var(--sw-color-text);
4539
- height: 100%;
4540
- inset-block: 0;
4541
- inset-inline: 0 auto;
4542
- margin: 0;
4543
- max-height: none;
4544
- max-width: calc(100% - var(--sw-space-8));
4545
- overflow: hidden;
4546
- padding: env(safe-area-inset-top, 0px) 0 env(safe-area-inset-bottom, 0px);
4547
- padding-inline-start: env(safe-area-inset-left, 0px);
4548
- width: 20rem;
4778
+ font-family: var(--sw-font-sans);
4779
+ position: relative;
4549
4780
  }
4550
4781
 
4551
- .sw-app-shell-drawer:dir(rtl) {
4552
- padding-inline-start: env(safe-area-inset-right, 0px);
4782
+ .sw-site-header-sticky {
4783
+ position: sticky;
4784
+ top: 0;
4785
+ z-index: 5;
4553
4786
  }
4554
4787
 
4555
- .sw-app-shell-drawer[open] {
4556
- animation: sw-app-shell-drawer-in var(--sw-motion-default) var(--sw-motion-easing);
4788
+ .sw-site-header-bar {
4789
+ align-items: center;
4790
+ box-sizing: border-box;
4557
4791
  display: flex;
4558
- flex-direction: column;
4792
+ gap: var(--sw-space-5);
4793
+ justify-content: space-between;
4794
+ margin-inline: auto;
4795
+ max-width: calc(var(--sw-container-max) + 2 * var(--sw-space-5));
4796
+ min-height: var(--sw-site-header-height);
4797
+ padding-inline: var(--sw-space-4);
4559
4798
  }
4560
4799
 
4561
- .sw-app-shell-drawer[open]:dir(rtl) {
4562
- animation-name: sw-app-shell-drawer-in-rtl;
4800
+ .sw-site-header-brand {
4801
+ align-items: center;
4802
+ display: flex;
4803
+ flex: none;
4563
4804
  }
4564
4805
 
4565
- @keyframes sw-app-shell-drawer-in {
4566
- from { translate: -100% 0; }
4806
+ .sw-site-header-nav,
4807
+ .sw-site-header-actions {
4808
+ display: none;
4567
4809
  }
4568
4810
 
4569
- @keyframes sw-app-shell-drawer-in-rtl {
4570
- from { translate: 100% 0; }
4811
+ .sw-site-header-compact {
4812
+ align-items: center;
4813
+ display: flex;
4814
+ gap: var(--sw-space-1);
4571
4815
  }
4572
4816
 
4573
- .sw-app-shell-drawer::backdrop {
4574
- background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
4817
+ .sw-site-header-list {
4818
+ list-style: none;
4819
+ margin: 0;
4820
+ padding: 0;
4575
4821
  }
4576
4822
 
4577
- .sw-app-shell-drawer-top {
4578
- align-items: center;
4823
+ .sw-site-header-nav .sw-site-header-list {
4579
4824
  display: flex;
4580
- flex: none;
4581
- gap: var(--sw-space-2);
4582
- padding: var(--sw-space-3) var(--sw-space-3) 0;
4825
+ gap: var(--sw-space-5);
4583
4826
  }
4584
4827
 
4585
- .sw-app-shell-drawer-top .sw-app-shell-header {
4586
- flex: 1 1 auto;
4587
- min-width: 0;
4588
- padding: 0;
4828
+ [data-theme] .sw-site-header-nav .sw-site-header-link {
4829
+ align-items: center;
4830
+ color: var(--sw-color-text);
4831
+ display: inline-flex;
4832
+ font-size: 15px;
4833
+ font-weight: 400;
4834
+ letter-spacing: -0.2px;
4835
+ line-height: 20px;
4836
+ min-height: var(--sw-site-header-height);
4837
+ text-decoration: none;
4589
4838
  }
4590
4839
 
4591
- .sw-button.sw-app-shell-close {
4592
- flex: none;
4593
- padding-inline: 0;
4840
+ [data-theme] .sw-site-header-nav .sw-site-header-link:hover {
4841
+ box-shadow: inset 0 -2px 0 var(--sw-color-border);
4594
4842
  }
4595
4843
 
4596
- .sw-button-xs.sw-app-shell-close { min-width: var(--sw-control-xs-min-height); }
4597
- .sw-button-sm.sw-app-shell-close { min-width: var(--sw-control-sm-min-height); }
4598
- .sw-button-md.sw-app-shell-close { min-width: var(--sw-control-md-min-height); }
4844
+ [data-theme] .sw-site-header-nav .sw-site-header-link[aria-current] {
4845
+ box-shadow: inset 0 -2px 0 currentColor;
4846
+ font-weight: 600;
4847
+ }
4599
4848
 
4600
- @media (pointer: coarse) {
4601
- .sw-button.sw-app-shell-close {
4602
- min-height: var(--sw-control-md-min-height);
4603
- min-width: var(--sw-control-md-min-height);
4604
- }
4849
+ [data-theme] .sw-site-header-nav .sw-site-header-link:focus-visible {
4850
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4605
4851
  }
4606
4852
 
4607
- @media (prefers-reduced-motion: reduce) {
4608
- .sw-app-shell-drawer[open],
4609
- .sw-app-shell-drawer[open]:dir(rtl) { animation: none; }
4853
+ .sw-site-header-actions {
4854
+ align-items: center;
4855
+ gap: var(--sw-space-4);
4610
4856
  }
4611
4857
 
4612
- @media (forced-colors: active) {
4613
- .sw-app-shell-drawer { border-inline-end-color: CanvasText; }
4858
+ @media (min-width: 48rem) {
4859
+ .sw-site-header-bar { padding-inline: var(--sw-space-5); }
4614
4860
  }
4615
4861
 
4616
- .sw-dialog {
4617
- background: var(--sw-glass-fill);
4618
- border: 1px solid var(--sw-glass-border);
4619
- border-radius: var(--sw-radius-lg);
4620
- box-shadow: inset 0 1px 0 var(--sw-glass-specular);
4621
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4622
- -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4623
- box-sizing: border-box;
4624
- color: var(--sw-color-text);
4625
- margin: auto;
4626
- max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
4627
- max-width: min(var(--sw-dialog-max), calc(100vw - var(--sw-space-8)));
4628
- overflow: auto;
4629
- width: calc(100% - var(--sw-space-8));
4862
+ @media (min-width: 64rem) {
4863
+ .sw-site-header { --sw-site-header-height: calc(var(--sw-control-md-min-height) + var(--sw-space-5) + var(--sw-space-1)); }
4864
+ .sw-site-header-nav { display: block; }
4865
+ .sw-site-header-actions { display: flex; }
4866
+ .sw-site-header-compact { display: none; }
4630
4867
  }
4631
4868
 
4632
- .sw-dialog-lg {
4633
- max-width: min(var(--sw-dialog-max-lg), calc(100vw - var(--sw-space-8)));
4869
+ .sw-site-header-menu > summary {
4870
+ list-style: none;
4634
4871
  }
4635
4872
 
4636
- .sw-dialog-xl {
4637
- max-width: min(var(--sw-dialog-max-xl), calc(100vw - var(--sw-space-8)));
4873
+ .sw-site-header-menu > summary::-webkit-details-marker {
4874
+ display: none;
4638
4875
  }
4639
4876
 
4640
- @media not all and (min-width: 48rem) {
4641
- .sw-dialog-sheet-below-md {
4642
- border-radius: var(--sw-radius-lg) var(--sw-radius-lg) 0 0;
4643
- border-width: 1px 0 0;
4644
- margin: auto 0 0;
4645
- max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
4646
- max-width: none;
4647
- padding-bottom: calc(var(--sw-space-5) + env(safe-area-inset-bottom, 0px));
4648
- padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
4649
- padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
4650
- width: 100%;
4651
- }
4877
+ .sw-site-header-menu-button {
4878
+ align-items: center;
4879
+ border-radius: var(--sw-radius-pill);
4880
+ box-sizing: border-box;
4881
+ color: var(--sw-color-text);
4882
+ cursor: pointer;
4883
+ display: inline-flex;
4884
+ height: var(--sw-control-md-min-height);
4885
+ justify-content: center;
4886
+ width: var(--sw-control-md-min-height);
4887
+ }
4652
4888
 
4653
- .sw-dialog-sheet-below-md[open] {
4654
- animation: sw-dialog-sheet-in var(--sw-motion-default) var(--sw-motion-easing);
4655
- }
4889
+ .sw-site-header-menu-button:hover {
4890
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
4891
+ }
4656
4892
 
4657
- .sw-dialog-sheet-below-md .sw-dialog-footer {
4658
- bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
4659
- margin-bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
4660
- padding-bottom: calc(var(--sw-space-3) + env(safe-area-inset-bottom, 0px));
4661
- }
4893
+ .sw-site-header-menu-button:focus-visible {
4894
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4895
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4662
4896
  }
4663
4897
 
4664
- @keyframes sw-dialog-sheet-in {
4665
- from { translate: 0 100%; }
4898
+ .sw-site-header-menu-open,
4899
+ .sw-site-header-menu-close,
4900
+ .sw-site-header-glyph {
4901
+ align-items: center;
4902
+ display: inline-flex;
4666
4903
  }
4667
4904
 
4668
- @media (prefers-reduced-motion: reduce) {
4669
- .sw-dialog-sheet-below-md[open] { animation: none; }
4905
+ .sw-site-header-menu[open] .sw-site-header-menu-open,
4906
+ .sw-site-header-menu:not([open]) .sw-site-header-menu-close {
4907
+ display: none;
4670
4908
  }
4671
4909
 
4672
- .sw-dialog::backdrop {
4673
- background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
4910
+ .sw-site-header-panel {
4911
+ background: var(--sw-color-surface);
4912
+ box-sizing: border-box;
4913
+ display: flex;
4914
+ flex-direction: column;
4915
+ height: calc(100dvh - var(--sw-site-header-height) - 1px);
4916
+ inset-inline: 0;
4917
+ overflow-y: auto;
4918
+ padding: var(--sw-space-2) var(--sw-space-4) var(--sw-space-6);
4919
+ position: absolute;
4920
+ top: calc(100% + 1px);
4674
4921
  }
4675
4922
 
4676
- .sw-dialog:focus-visible {
4677
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4678
- outline-offset: var(--sw-focus-ring-offset);
4923
+ .sw-site-header-menu-nav .sw-site-header-list {
4924
+ display: flex;
4925
+ flex-direction: column;
4679
4926
  }
4680
4927
 
4681
- .sw-dialog-header {
4682
- align-items: flex-start;
4928
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link {
4929
+ align-items: center;
4930
+ border-bottom: 1px solid var(--sw-color-border);
4931
+ color: var(--sw-color-text);
4932
+ display: flex;
4933
+ font-size: 20px;
4934
+ font-weight: 600;
4935
+ letter-spacing: -0.3px;
4936
+ line-height: 28px;
4937
+ min-height: calc(var(--sw-control-md-min-height) + var(--sw-space-3));
4938
+ text-decoration: none;
4939
+ }
4940
+
4941
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link[aria-current] {
4942
+ color: var(--sw-color-accent);
4943
+ }
4944
+
4945
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link:focus-visible {
4946
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4947
+ }
4948
+
4949
+ .sw-site-header-menu-actions {
4950
+ display: flex;
4951
+ flex-direction: column;
4952
+ gap: var(--sw-space-3);
4953
+ margin-top: auto;
4954
+ padding-top: var(--sw-space-5);
4955
+ }
4956
+
4957
+ /*
4958
+ * Forced colours drop box shadows, so the current destination's bar is a
4959
+ * thick underline there.
4960
+ */
4961
+ @media (forced-colors: active) {
4962
+ .sw-site-header,
4963
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link {
4964
+ border-color: CanvasText;
4965
+ }
4966
+
4967
+ [data-theme] .sw-site-header-link[aria-current] {
4968
+ color: Highlight;
4969
+ }
4970
+
4971
+ [data-theme] .sw-site-header-nav .sw-site-header-link[aria-current] {
4972
+ text-decoration: underline;
4973
+ text-decoration-thickness: 2px;
4974
+ text-underline-offset: var(--sw-space-2);
4975
+ }
4976
+
4977
+ .sw-site-header-menu-button {
4978
+ border: 1px solid ButtonText;
4979
+ }
4980
+ }
4981
+
4982
+ .sw-app-shell {
4983
+ min-height: 100vh;
4984
+ min-height: 100dvh;
4985
+ }
4986
+
4987
+ .sw-app-shell-bar {
4988
+ align-items: center;
4683
4989
  display: flex;
4684
4990
  gap: var(--sw-space-2);
4685
4991
  }
4686
4992
 
4687
- .sw-dialog-header > :is(h2, h3),
4688
- .sw-dialog-titles {
4993
+ .sw-app-shell-bar-title {
4689
4994
  flex: 1 1 auto;
4690
4995
  min-width: 0;
4691
4996
  }
4692
4997
 
4693
- .sw-button.sw-dialog-close {
4998
+ .sw-app-shell-bar-end {
4999
+ align-items: center;
5000
+ display: flex;
5001
+ flex: none;
5002
+ gap: var(--sw-space-2);
5003
+ }
5004
+
5005
+ .sw-button.sw-app-shell-menu {
4694
5006
  flex: none;
4695
5007
  padding-inline: 0;
4696
- min-width: var(--sw-control-sm-min-height);
4697
- margin-block: calc((28px - var(--sw-control-sm-min-height)) / 2);
4698
- margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-sm-min-height)) / 2);
4699
5008
  }
4700
5009
 
5010
+ .sw-button-xs.sw-app-shell-menu { min-width: var(--sw-control-xs-min-height); }
5011
+ .sw-button-sm.sw-app-shell-menu { min-width: var(--sw-control-sm-min-height); }
5012
+ .sw-button-md.sw-app-shell-menu { min-width: var(--sw-control-md-min-height); }
5013
+
4701
5014
  @media (pointer: coarse) {
4702
- .sw-button.sw-dialog-close {
5015
+ .sw-button.sw-app-shell-menu {
4703
5016
  min-height: var(--sw-control-md-min-height);
4704
5017
  min-width: var(--sw-control-md-min-height);
4705
- margin-block: calc((28px - var(--sw-control-md-min-height)) / 2);
4706
- margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-md-min-height)) / 2);
4707
5018
  }
4708
5019
  }
4709
5020
 
4710
- /* Private control chrome: two strokes crossed in a space-4 square, in the
4711
- button's color; borders, so forced colors keep them. */
4712
- .sw-dialog-close-glyph {
4713
- flex: none;
4714
- height: var(--sw-space-4);
4715
- position: relative;
4716
- width: var(--sw-space-4);
4717
- }
4718
-
4719
- .sw-dialog-close-glyph::before,
4720
- .sw-dialog-close-glyph::after {
4721
- border-top: 2px solid currentColor;
4722
- border-radius: 1px;
4723
- box-sizing: border-box;
4724
- content: '';
4725
- left: 0;
4726
- margin-top: -1px;
4727
- position: absolute;
4728
- top: 50%;
4729
- width: 100%;
5021
+ .sw-app-shell-main {
5022
+ display: block;
5023
+ min-width: 0;
4730
5024
  }
4731
5025
 
4732
- .sw-dialog-close-glyph::before { transform: rotate(45deg); }
4733
- .sw-dialog-close-glyph::after { transform: rotate(-45deg); }
4734
-
4735
- .sw-dialog-header-framed {
4736
- align-items: center;
4737
- gap: var(--sw-space-3);
5026
+ .sw-app-shell-sidebar,
5027
+ .sw-app-shell-sidebar .sw-app-shell-rail-slot {
5028
+ display: none;
4738
5029
  }
4739
5030
 
4740
- .sw-dialog-icon {
4741
- display: inline-flex;
5031
+ .sw-app-shell-header,
5032
+ .sw-app-shell-footer {
4742
5033
  flex: none;
5034
+ padding: var(--sw-space-3);
4743
5035
  }
4744
5036
 
4745
- .sw-dialog-description { margin: 0; }
4746
-
4747
- .sw-dialog-footer {
4748
- align-items: center;
4749
- background: var(--sw-color-surface);
5037
+ .sw-app-shell-footer {
4750
5038
  border-top: 1px solid var(--sw-color-border);
4751
- /* Sticky insets count from the scrollport's padding edge: step past the
4752
- dialog's own padding to sit on its bottom edge. */
4753
- bottom: calc(-1 * var(--sw-space-5));
5039
+ }
5040
+
5041
+ .sw-app-shell-nav {
4754
5042
  box-sizing: border-box;
4755
5043
  display: flex;
4756
- flex-wrap: wrap;
4757
- gap: var(--sw-space-2) var(--sw-space-4);
4758
- margin: 0 calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5));
4759
- padding: var(--sw-space-3) var(--sw-space-5);
4760
- position: sticky;
5044
+ flex: 1 1 auto;
5045
+ flex-direction: column;
5046
+ gap: var(--sw-space-4);
5047
+ min-height: 0;
5048
+ overflow-y: auto;
5049
+ overscroll-behavior: contain;
5050
+ padding: var(--sw-space-2) var(--sw-space-3);
4761
5051
  }
4762
5052
 
4763
- .sw-dialog-footer-status {
4764
- align-items: center;
4765
- column-gap: var(--sw-space-2);
5053
+ .sw-app-shell-group {
4766
5054
  display: flex;
4767
- flex: 1 1 auto;
4768
- flex-wrap: wrap;
4769
- min-width: 0;
5055
+ flex-direction: column;
5056
+ gap: var(--sw-space-1);
4770
5057
  }
4771
5058
 
4772
- /* The status line: muted caption words beside the actions. Its children
4773
- sit on one row and wrap as one phrase. */
4774
- .sw-dialog-footer-note {
5059
+ .sw-app-shell-group-label {
4775
5060
  color: var(--sw-color-muted);
4776
5061
  font-family: var(--sw-font-sans);
4777
5062
  font-size: 13px;
5063
+ font-weight: 600;
5064
+ letter-spacing: -0.08px;
4778
5065
  line-height: 18px;
4779
- min-width: 0;
4780
- overflow-wrap: anywhere;
5066
+ margin: 0;
5067
+ padding-inline: var(--sw-space-2);
4781
5068
  }
4782
5069
 
4783
- /* With no figure and no status line the live region stays in the
4784
- dialog, so a first figure is still announced, but it takes no room in
4785
- the footer. */
4786
- .sw-dialog-footer-status:empty {
4787
- clip-path: inset(50%);
4788
- height: 1px;
4789
- overflow: hidden;
4790
- position: absolute;
4791
- width: 1px;
5070
+ .sw-app-shell-list {
5071
+ display: flex;
5072
+ flex-direction: column;
5073
+ gap: var(--sw-space-1);
5074
+ list-style: none;
5075
+ margin: 0;
5076
+ padding: 0;
4792
5077
  }
4793
5078
 
4794
- .sw-dialog-footer-actions {
5079
+ .sw-app-shell-item > .sw-tooltip-anchor {
4795
5080
  display: flex;
4796
- flex: 0 1 auto;
4797
- flex-wrap: wrap;
4798
- gap: var(--sw-space-2);
4799
- justify-content: flex-end;
4800
- margin-inline-start: auto;
4801
5081
  }
4802
5082
 
4803
- @media (forced-colors: active) {
4804
- .sw-dialog-footer { border-top-color: CanvasText; }
5083
+ [data-theme] .sw-app-shell-link {
5084
+ align-items: center;
5085
+ border: 2px solid transparent;
5086
+ border-radius: var(--sw-radius-sm);
5087
+ box-sizing: border-box;
5088
+ color: var(--sw-color-text);
5089
+ display: flex;
5090
+ flex: 1 1 auto;
5091
+ font-family: var(--sw-font-sans);
5092
+ font-size: 15px;
5093
+ font-weight: 500;
5094
+ gap: var(--sw-space-3);
5095
+ letter-spacing: -0.2px;
5096
+ line-height: 20px;
5097
+ min-height: var(--sw-control-sm-min-height);
5098
+ padding: var(--sw-space-1) var(--sw-space-2);
5099
+ text-decoration: none;
4805
5100
  }
4806
5101
 
4807
- .sw-dialog-banded {
4808
- backdrop-filter: none;
4809
- -webkit-backdrop-filter: none;
4810
- background: var(--sw-color-surface);
4811
- border-color: transparent;
4812
- box-shadow: var(--sw-elevation-md);
5102
+ [data-theme] .sw-app-shell-link:hover {
5103
+ background: color-mix(in srgb, var(--sw-color-muted) 12%, transparent);
4813
5104
  }
4814
5105
 
4815
- .sw-dialog-banded .sw-dialog-header {
4816
- align-items: center;
4817
- background: var(--sw-color-surface);
4818
- border-bottom: 1px solid var(--sw-color-border);
4819
- margin: calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5)) 0;
4820
- padding: var(--sw-space-4) var(--sw-space-5);
4821
- position: sticky;
4822
- top: calc(-1 * var(--sw-space-5));
4823
- z-index: 5;
5106
+ [data-theme] .sw-app-shell-link:focus-visible {
5107
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5108
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4824
5109
  }
4825
5110
 
4826
- @media not all and (min-width: 48rem) {
4827
- .sw-dialog-sheet-below-md.sw-dialog-banded .sw-dialog-header {
4828
- margin-left: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-left, 0px)));
4829
- margin-right: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-right, 0px)));
4830
- padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
4831
- padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
4832
- }
5111
+ [data-theme] .sw-app-shell-link[aria-current] {
5112
+ background: color-mix(in srgb, var(--sw-color-muted) 18%, transparent);
5113
+ font-weight: 600;
4833
5114
  }
4834
5115
 
4835
- .sw-dialog-banded .sw-button.sw-dialog-close {
4836
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
4837
- border-radius: var(--sw-radius-pill);
4838
- color: var(--sw-color-text);
4839
- margin: 0;
5116
+ .sw-app-shell-icon {
5117
+ display: inline-flex;
5118
+ flex: none;
4840
5119
  }
4841
5120
 
4842
- @media (hover: hover) {
4843
- .sw-dialog-banded .sw-button.sw-dialog-close:hover {
4844
- background: color-mix(in srgb, var(--sw-color-muted) 24%, transparent);
4845
- }
5121
+ .sw-app-shell-label {
5122
+ flex: 1 1 auto;
5123
+ min-width: 0;
5124
+ overflow-wrap: anywhere;
5125
+ }
5126
+
5127
+ .sw-app-shell-count {
5128
+ flex: none;
5129
+ }
5130
+
5131
+ @media (pointer: coarse) {
5132
+ [data-theme] .sw-app-shell-link { min-height: var(--sw-control-md-min-height); }
4846
5133
  }
4847
5134
 
4848
5135
  @media (forced-colors: active) {
4849
- .sw-dialog-banded { border-color: CanvasText; }
4850
- .sw-dialog-banded .sw-dialog-header { border-bottom-color: CanvasText; }
5136
+ [data-theme] .sw-app-shell-link { color: LinkText; }
5137
+ [data-theme] .sw-app-shell-link[aria-current] { border-color: Highlight; color: CanvasText; }
4851
5138
  }
4852
5139
 
4853
- .sw-dialog.sw-dialog-canvas-grouped {
4854
- backdrop-filter: none;
4855
- -webkit-backdrop-filter: none;
4856
- background: var(--sw-canvas-grouped);
5140
+ .sw-app-shell-page-bar {
5141
+ align-items: center;
5142
+ background: var(--sw-color-surface);
5143
+ border-bottom: 1px solid var(--sw-color-border);
5144
+ box-sizing: border-box;
5145
+ display: flex;
5146
+ flex-wrap: wrap;
5147
+ gap: var(--sw-space-2) var(--sw-space-3);
5148
+ justify-content: space-between;
5149
+ padding: var(--sw-space-2) var(--sw-space-4);
5150
+ position: sticky;
5151
+ top: var(--sw-app-shell-bar-height, calc(var(--sw-control-sm-min-height) + 2 * var(--sw-space-2) + 1px));
5152
+ z-index: 5;
4857
5153
  }
4858
5154
 
4859
- .sw-dialog-grabber { display: none; }
5155
+ @media (pointer: coarse) {
5156
+ .sw-app-shell-page-bar {
5157
+ top: var(--sw-app-shell-bar-height, calc(var(--sw-control-md-min-height) + 2 * var(--sw-space-2) + 1px));
5158
+ }
5159
+ }
4860
5160
 
4861
- @media not all and (min-width: 48rem) {
4862
- .sw-dialog-sheet-below-md .sw-dialog-grabber {
4863
- background: color-mix(in srgb, var(--sw-color-muted) 40%, transparent);
4864
- border-radius: var(--sw-radius-pill);
4865
- display: block;
4866
- height: var(--sw-space-1);
4867
- margin: calc(var(--sw-space-2) - var(--sw-space-5)) auto var(--sw-space-3);
5161
+ @media (min-width: 64rem) {
5162
+ .sw-app-shell-page-bar {
5163
+ padding-inline: var(--sw-space-6);
5164
+ top: 0;
5165
+ }
5166
+ }
5167
+
5168
+ .sw-app-shell-menu {
5169
+ position: relative;
5170
+ }
5171
+
5172
+ .sw-app-shell-menu .sw-app-shell-count {
5173
+ inset-block-start: calc(-1 * var(--sw-space-1));
5174
+ inset-inline-end: calc(-1 * var(--sw-space-1));
5175
+ pointer-events: none;
5176
+ position: absolute;
5177
+ }
5178
+
5179
+ @media (min-width: 64rem) {
5180
+ .sw-app-shell {
5181
+ align-items: start;
5182
+ display: grid;
5183
+ grid-template-columns: auto minmax(0, 1fr);
5184
+ }
5185
+
5186
+ .sw-app-shell-bar {
5187
+ display: none;
5188
+ }
5189
+
5190
+ .sw-app-shell-sidebar {
5191
+ background: var(--sw-color-surface);
5192
+ border-inline-end: 1px solid var(--sw-color-border);
5193
+ box-sizing: border-box;
5194
+ display: flex;
5195
+ flex-direction: column;
5196
+ height: 100vh;
5197
+ height: 100dvh;
4868
5198
  position: sticky;
4869
- top: calc(var(--sw-space-2) - var(--sw-space-5));
4870
- width: var(--sw-space-6);
4871
- z-index: 6;
5199
+ top: 0;
5200
+ width: calc(var(--sw-control-md-min-height) + 2 * var(--sw-space-3) + 1px);
4872
5201
  }
4873
5202
 
4874
- .sw-dialog-sheet-below-md.sw-dialog-banded.sw-dialog-has-grabber .sw-dialog-header {
4875
- padding-top: var(--sw-space-5);
5203
+ @media not all and (min-width: 75rem) {
5204
+ .sw-app-shell-sidebar .sw-app-shell-slot {
5205
+ display: none;
5206
+ }
5207
+
5208
+ .sw-app-shell-sidebar .sw-app-shell-rail-slot {
5209
+ display: block;
5210
+ }
5211
+
5212
+ .sw-app-shell-sidebar .sw-app-shell-label,
5213
+ .sw-app-shell-sidebar .sw-app-shell-group-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
5214
+
5215
+ .sw-app-shell-sidebar .sw-app-shell-nav {
5216
+ gap: var(--sw-space-2);
5217
+ }
5218
+
5219
+ .sw-app-shell-sidebar .sw-app-shell-group + .sw-app-shell-group {
5220
+ border-top: 1px solid var(--sw-color-border);
5221
+ padding-top: var(--sw-space-2);
5222
+ }
5223
+
5224
+ [data-theme] .sw-app-shell-sidebar .sw-app-shell-link {
5225
+ justify-content: center;
5226
+ min-height: var(--sw-control-md-min-height);
5227
+ padding: 0;
5228
+ position: relative;
5229
+ }
5230
+
5231
+ .sw-app-shell-sidebar .sw-app-shell-count {
5232
+ inset-block-start: 0;
5233
+ inset-inline-end: 0;
5234
+ position: absolute;
5235
+ }
4876
5236
  }
5237
+ }
4877
5238
 
4878
- @media (forced-colors: active) {
4879
- .sw-dialog-sheet-below-md .sw-dialog-grabber { background: CanvasText; forced-color-adjust: none; }
5239
+ @media (min-width: 75rem) {
5240
+ .sw-app-shell-sidebar {
5241
+ width: 15rem;
4880
5242
  }
4881
5243
  }
4882
5244
 
4883
- .sw-accordion {
4884
- background: var(--sw-glass-fill);
4885
- border: 1px solid var(--sw-glass-border);
4886
- border-radius: var(--sw-radius-lg);
4887
- box-shadow: inset 0 1px 0 var(--sw-glass-specular);
4888
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4889
- -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5245
+ .sw-app-shell-drawer {
5246
+ background: var(--sw-color-surface);
5247
+ border: 0;
5248
+ border-inline-end: 1px solid var(--sw-color-border);
5249
+ box-sizing: border-box;
4890
5250
  color: var(--sw-color-text);
5251
+ height: 100%;
5252
+ inset-block: 0;
5253
+ inset-inline: 0 auto;
5254
+ margin: 0;
5255
+ max-height: none;
5256
+ max-width: calc(100% - var(--sw-space-8));
5257
+ overflow: hidden;
5258
+ padding: env(safe-area-inset-top, 0px) 0 env(safe-area-inset-bottom, 0px);
5259
+ padding-inline-start: env(safe-area-inset-left, 0px);
5260
+ width: 20rem;
4891
5261
  }
4892
5262
 
4893
- /* A nested disclosure sits inside a larger surface, so its corners are smaller. */
4894
- .sw-accordion-sm { border-radius: var(--sw-radius-md); }
5263
+ .sw-app-shell-drawer:dir(rtl) {
5264
+ padding-inline-start: env(safe-area-inset-right, 0px);
5265
+ }
4895
5266
 
4896
- .sw-accordion-summary {
4897
- align-items: center;
4898
- box-sizing: border-box;
4899
- cursor: pointer;
5267
+ .sw-app-shell-drawer[open] {
5268
+ animation: sw-app-shell-drawer-in var(--sw-motion-default) var(--sw-motion-easing);
4900
5269
  display: flex;
4901
- gap: var(--sw-space-3);
4902
- list-style: none;
4903
- min-height: var(--sw-control-md-min-height);
5270
+ flex-direction: column;
4904
5271
  }
4905
5272
 
4906
- /* A nested header is an sm control, still a comfortable pointer and touch target. */
4907
- .sw-accordion-sm > .sw-accordion-summary { min-height: var(--sw-control-sm-min-height); }
5273
+ .sw-app-shell-drawer[open]:dir(rtl) {
5274
+ animation-name: sw-app-shell-drawer-in-rtl;
5275
+ }
4908
5276
 
4909
- .sw-accordion-heading {
5277
+ @keyframes sw-app-shell-drawer-in {
5278
+ from { translate: -100% 0; }
5279
+ }
5280
+
5281
+ @keyframes sw-app-shell-drawer-in-rtl {
5282
+ from { translate: 100% 0; }
5283
+ }
5284
+
5285
+ .sw-app-shell-drawer::backdrop {
5286
+ background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
5287
+ }
5288
+
5289
+ .sw-app-shell-drawer-top {
5290
+ align-items: center;
4910
5291
  display: flex;
5292
+ flex: none;
5293
+ gap: var(--sw-space-2);
5294
+ padding: var(--sw-space-3) var(--sw-space-3) 0;
5295
+ }
5296
+
5297
+ .sw-app-shell-drawer-top .sw-app-shell-header {
4911
5298
  flex: 1 1 auto;
4912
- flex-direction: column;
4913
5299
  min-width: 0;
5300
+ padding: 0;
4914
5301
  }
4915
5302
 
4916
- .sw-accordion-summary:focus-visible {
4917
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4918
- outline-offset: var(--sw-focus-ring-offset);
5303
+ .sw-button.sw-app-shell-close {
5304
+ flex: none;
5305
+ padding-inline: 0;
5306
+ }
5307
+
5308
+ .sw-button-xs.sw-app-shell-close { min-width: var(--sw-control-xs-min-height); }
5309
+ .sw-button-sm.sw-app-shell-close { min-width: var(--sw-control-sm-min-height); }
5310
+ .sw-button-md.sw-app-shell-close { min-width: var(--sw-control-md-min-height); }
5311
+
5312
+ @media (pointer: coarse) {
5313
+ .sw-button.sw-app-shell-close {
5314
+ min-height: var(--sw-control-md-min-height);
5315
+ min-width: var(--sw-control-md-min-height);
5316
+ }
5317
+ }
5318
+
5319
+ @media (prefers-reduced-motion: reduce) {
5320
+ .sw-app-shell-drawer[open],
5321
+ .sw-app-shell-drawer[open]:dir(rtl) { animation: none; }
5322
+ }
5323
+
5324
+ @media (forced-colors: active) {
5325
+ .sw-app-shell-drawer { border-inline-end-color: CanvasText; }
5326
+ }
5327
+
5328
+ .sw-dialog {
5329
+ background: var(--sw-glass-fill);
5330
+ border: 1px solid var(--sw-glass-border);
5331
+ border-radius: var(--sw-radius-lg);
5332
+ box-shadow: inset 0 1px 0 var(--sw-glass-specular);
5333
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5334
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5335
+ box-sizing: border-box;
5336
+ color: var(--sw-color-text);
5337
+ margin: auto;
5338
+ max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
5339
+ max-width: min(var(--sw-dialog-max), calc(100vw - var(--sw-space-8)));
5340
+ overflow: auto;
5341
+ width: calc(100% - var(--sw-space-8));
5342
+ }
5343
+
5344
+ .sw-dialog-lg {
5345
+ max-width: min(var(--sw-dialog-max-lg), calc(100vw - var(--sw-space-8)));
5346
+ }
5347
+
5348
+ .sw-dialog-xl {
5349
+ max-width: min(var(--sw-dialog-max-xl), calc(100vw - var(--sw-space-8)));
5350
+ }
5351
+
5352
+ @media not all and (min-width: 48rem) {
5353
+ .sw-dialog-sheet-below-md {
5354
+ border-radius: var(--sw-radius-lg) var(--sw-radius-lg) 0 0;
5355
+ border-width: 1px 0 0;
5356
+ margin: auto 0 0;
5357
+ max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
5358
+ max-width: none;
5359
+ padding-bottom: calc(var(--sw-space-5) + env(safe-area-inset-bottom, 0px));
5360
+ padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
5361
+ padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
5362
+ width: 100%;
5363
+ }
5364
+
5365
+ .sw-dialog-sheet-below-md[open] {
5366
+ animation: sw-dialog-sheet-in var(--sw-motion-default) var(--sw-motion-easing);
5367
+ }
5368
+
5369
+ .sw-dialog-sheet-below-md .sw-dialog-footer {
5370
+ bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
5371
+ margin-bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
5372
+ padding-bottom: calc(var(--sw-space-3) + env(safe-area-inset-bottom, 0px));
5373
+ }
5374
+ }
5375
+
5376
+ @keyframes sw-dialog-sheet-in {
5377
+ from { translate: 0 100%; }
5378
+ }
5379
+
5380
+ @media (prefers-reduced-motion: reduce) {
5381
+ .sw-dialog-sheet-below-md[open] { animation: none; }
5382
+ }
5383
+
5384
+ .sw-dialog::backdrop {
5385
+ background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
5386
+ }
5387
+
5388
+ .sw-dialog:focus-visible {
5389
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5390
+ outline-offset: var(--sw-focus-ring-offset);
5391
+ }
5392
+
5393
+ .sw-dialog-header {
5394
+ align-items: flex-start;
5395
+ display: flex;
5396
+ gap: var(--sw-space-2);
5397
+ }
5398
+
5399
+ .sw-dialog-header > :is(h2, h3),
5400
+ .sw-dialog-titles {
5401
+ flex: 1 1 auto;
5402
+ min-width: 0;
5403
+ }
5404
+
5405
+ .sw-button.sw-dialog-close {
5406
+ flex: none;
5407
+ padding-inline: 0;
5408
+ min-width: var(--sw-control-sm-min-height);
5409
+ margin-block: calc((28px - var(--sw-control-sm-min-height)) / 2);
5410
+ margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-sm-min-height)) / 2);
5411
+ }
5412
+
5413
+ @media (pointer: coarse) {
5414
+ .sw-button.sw-dialog-close {
5415
+ min-height: var(--sw-control-md-min-height);
5416
+ min-width: var(--sw-control-md-min-height);
5417
+ margin-block: calc((28px - var(--sw-control-md-min-height)) / 2);
5418
+ margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-md-min-height)) / 2);
5419
+ }
5420
+ }
5421
+
5422
+ /* Private control chrome: two strokes crossed in a space-4 square, in the
5423
+ button's color; borders, so forced colors keep them. */
5424
+ .sw-dialog-close-glyph {
5425
+ flex: none;
5426
+ height: var(--sw-space-4);
5427
+ position: relative;
5428
+ width: var(--sw-space-4);
5429
+ }
5430
+
5431
+ .sw-dialog-close-glyph::before,
5432
+ .sw-dialog-close-glyph::after {
5433
+ border-top: 2px solid currentColor;
5434
+ border-radius: 1px;
5435
+ box-sizing: border-box;
5436
+ content: '';
5437
+ left: 0;
5438
+ margin-top: -1px;
5439
+ position: absolute;
5440
+ top: 50%;
5441
+ width: 100%;
5442
+ }
5443
+
5444
+ .sw-dialog-close-glyph::before { transform: rotate(45deg); }
5445
+ .sw-dialog-close-glyph::after { transform: rotate(-45deg); }
5446
+
5447
+ .sw-dialog-header-framed {
5448
+ align-items: center;
5449
+ gap: var(--sw-space-3);
5450
+ }
5451
+
5452
+ .sw-dialog-icon {
5453
+ display: inline-flex;
5454
+ flex: none;
5455
+ }
5456
+
5457
+ .sw-dialog-description { margin: 0; }
5458
+
5459
+ .sw-dialog-footer {
5460
+ align-items: center;
5461
+ background: var(--sw-color-surface);
5462
+ border-top: 1px solid var(--sw-color-border);
5463
+ /* Sticky insets count from the scrollport's padding edge: step past the
5464
+ dialog's own padding to sit on its bottom edge. */
5465
+ bottom: calc(-1 * var(--sw-space-5));
5466
+ box-sizing: border-box;
5467
+ display: flex;
5468
+ flex-wrap: wrap;
5469
+ gap: var(--sw-space-2) var(--sw-space-4);
5470
+ margin: 0 calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5));
5471
+ padding: var(--sw-space-3) var(--sw-space-5);
5472
+ position: sticky;
5473
+ }
5474
+
5475
+ .sw-dialog-footer-status {
5476
+ align-items: center;
5477
+ column-gap: var(--sw-space-2);
5478
+ display: flex;
5479
+ flex: 1 1 auto;
5480
+ flex-wrap: wrap;
5481
+ min-width: 0;
5482
+ }
5483
+
5484
+ /* The status line: muted caption words beside the actions. Its children
5485
+ sit on one row and wrap as one phrase. */
5486
+ .sw-dialog-footer-note {
5487
+ color: var(--sw-color-muted);
5488
+ font-family: var(--sw-font-sans);
5489
+ font-size: 13px;
5490
+ line-height: 18px;
5491
+ min-width: 0;
5492
+ overflow-wrap: anywhere;
5493
+ }
5494
+
5495
+ /* With no figure and no status line the live region stays in the
5496
+ dialog, so a first figure is still announced, but it takes no room in
5497
+ the footer. */
5498
+ .sw-dialog-footer-status:empty {
5499
+ clip-path: inset(50%);
5500
+ height: 1px;
5501
+ overflow: hidden;
5502
+ position: absolute;
5503
+ width: 1px;
5504
+ }
5505
+
5506
+ .sw-dialog-footer-actions {
5507
+ display: flex;
5508
+ flex: 0 1 auto;
5509
+ flex-wrap: wrap;
5510
+ gap: var(--sw-space-2);
5511
+ justify-content: flex-end;
5512
+ margin-inline-start: auto;
5513
+ }
5514
+
5515
+ @media (forced-colors: active) {
5516
+ .sw-dialog-footer { border-top-color: CanvasText; }
5517
+ }
5518
+
5519
+ .sw-dialog-banded {
5520
+ backdrop-filter: none;
5521
+ -webkit-backdrop-filter: none;
5522
+ background: var(--sw-color-surface);
5523
+ border-color: transparent;
5524
+ box-shadow: var(--sw-elevation-md);
5525
+ }
5526
+
5527
+ .sw-dialog-banded .sw-dialog-header {
5528
+ align-items: center;
5529
+ background: var(--sw-color-surface);
5530
+ border-bottom: 1px solid var(--sw-color-border);
5531
+ margin: calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5)) 0;
5532
+ padding: var(--sw-space-4) var(--sw-space-5);
5533
+ position: sticky;
5534
+ top: calc(-1 * var(--sw-space-5));
5535
+ z-index: 5;
5536
+ }
5537
+
5538
+ @media not all and (min-width: 48rem) {
5539
+ .sw-dialog-sheet-below-md.sw-dialog-banded .sw-dialog-header {
5540
+ margin-left: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-left, 0px)));
5541
+ margin-right: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-right, 0px)));
5542
+ padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
5543
+ padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
5544
+ }
5545
+ }
5546
+
5547
+ .sw-dialog-banded .sw-button.sw-dialog-close {
5548
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5549
+ border-radius: var(--sw-radius-pill);
5550
+ color: var(--sw-color-text);
5551
+ margin: 0;
5552
+ }
5553
+
5554
+ @media (hover: hover) {
5555
+ .sw-dialog-banded .sw-button.sw-dialog-close:hover {
5556
+ background: color-mix(in srgb, var(--sw-color-muted) 24%, transparent);
5557
+ }
5558
+ }
5559
+
5560
+ @media (forced-colors: active) {
5561
+ .sw-dialog-banded { border-color: CanvasText; }
5562
+ .sw-dialog-banded .sw-dialog-header { border-bottom-color: CanvasText; }
5563
+ }
5564
+
5565
+ .sw-dialog.sw-dialog-canvas-grouped {
5566
+ backdrop-filter: none;
5567
+ -webkit-backdrop-filter: none;
5568
+ background: var(--sw-canvas-grouped);
5569
+ }
5570
+
5571
+ .sw-dialog-grabber { display: none; }
5572
+
5573
+ @media not all and (min-width: 48rem) {
5574
+ .sw-dialog-sheet-below-md .sw-dialog-grabber {
5575
+ background: color-mix(in srgb, var(--sw-color-muted) 40%, transparent);
5576
+ border-radius: var(--sw-radius-pill);
5577
+ display: block;
5578
+ height: var(--sw-space-1);
5579
+ margin: calc(var(--sw-space-2) - var(--sw-space-5)) auto var(--sw-space-3);
5580
+ position: sticky;
5581
+ top: calc(var(--sw-space-2) - var(--sw-space-5));
5582
+ width: var(--sw-space-6);
5583
+ z-index: 6;
5584
+ }
5585
+
5586
+ .sw-dialog-sheet-below-md.sw-dialog-banded.sw-dialog-has-grabber .sw-dialog-header {
5587
+ padding-top: var(--sw-space-5);
5588
+ }
5589
+
5590
+ @media (forced-colors: active) {
5591
+ .sw-dialog-sheet-below-md .sw-dialog-grabber { background: CanvasText; forced-color-adjust: none; }
5592
+ }
5593
+ }
5594
+
5595
+ .sw-accordion {
5596
+ background: var(--sw-glass-fill);
5597
+ border: 1px solid var(--sw-glass-border);
5598
+ border-radius: var(--sw-radius-lg);
5599
+ box-shadow: inset 0 1px 0 var(--sw-glass-specular);
5600
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5601
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5602
+ color: var(--sw-color-text);
5603
+ }
5604
+
5605
+ /* A nested disclosure sits inside a larger surface, so its corners are smaller. */
5606
+ .sw-accordion-sm { border-radius: var(--sw-radius-md); }
5607
+
5608
+ .sw-accordion-summary {
5609
+ align-items: center;
5610
+ box-sizing: border-box;
5611
+ cursor: pointer;
5612
+ display: flex;
5613
+ gap: var(--sw-space-3);
5614
+ list-style: none;
5615
+ min-height: var(--sw-control-md-min-height);
5616
+ }
5617
+
5618
+ /* A nested header is an sm control, still a comfortable pointer and touch target. */
5619
+ .sw-accordion-sm > .sw-accordion-summary { min-height: var(--sw-control-sm-min-height); }
5620
+
5621
+ .sw-accordion-heading {
5622
+ display: flex;
5623
+ flex: 1 1 auto;
5624
+ flex-direction: column;
5625
+ min-width: 0;
5626
+ }
5627
+
5628
+ .sw-accordion-summary:focus-visible {
5629
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5630
+ outline-offset: var(--sw-focus-ring-offset);
5631
+ }
5632
+
5633
+ /* A token chevron replaces the user-agent triangle: it points to the inline end when closed and down when open. */
5634
+ .sw-accordion-summary::-webkit-details-marker { display: none; }
5635
+
5636
+ .sw-accordion-marker {
5637
+ border-bottom: 2px solid var(--sw-color-muted);
5638
+ border-right: 2px solid var(--sw-color-muted);
5639
+ box-sizing: border-box;
5640
+ height: var(--sw-space-2);
5641
+ width: var(--sw-space-2);
5642
+ flex: none;
5643
+ margin-inline-end: var(--sw-space-1);
5644
+ transform: rotate(-45deg);
5645
+ transition: transform var(--sw-motion-default) var(--sw-motion-easing);
5646
+ }
5647
+
5648
+ .sw-accordion-marker:dir(rtl) { transform: rotate(135deg); }
5649
+
5650
+ .sw-accordion[open] > .sw-accordion-summary .sw-accordion-marker {
5651
+ transform: rotate(45deg);
5652
+ }
5653
+
5654
+ @media (prefers-reduced-motion: reduce) {
5655
+ .sw-accordion-marker { transition: none; }
5656
+ }
5657
+
5658
+ @media (forced-colors: active) {
5659
+ .sw-accordion-marker { border-color: CanvasText; }
5660
+ }
5661
+
5662
+ .sw-select {
5663
+ max-width: 100%;
5664
+ width: max-content;
5665
+ }
5666
+
5667
+ /*
5668
+ * width="full": the field and its trigger fill the container's inline size.
5669
+ * The value still takes the free space and ellipsizes, and the chevron stays
5670
+ * last, at the inline end. In an Inline row the field takes only the space
5671
+ * its siblings leave, so a Button beside it keeps its label on one line.
5672
+ */
5673
+ .sw-select-full {
5674
+ width: 100%;
5675
+ }
5676
+
5677
+ .sw-inline > .sw-select-full {
5678
+ flex: 1 1 0;
5679
+ min-width: 0;
5680
+ }
5681
+
5682
+ .sw-select-full .sw-select-trigger {
5683
+ width: 100%;
5684
+ }
5685
+
5686
+ .sw-select-control {
5687
+ position: relative;
5688
+ }
5689
+
5690
+ .sw-select-trigger {
5691
+ align-items: center;
5692
+ appearance: none;
5693
+ -webkit-appearance: none;
5694
+ background-color: var(--sw-glass-fill);
5695
+ border: 1px solid var(--sw-color-border);
5696
+ border-radius: var(--sw-radius-sm);
5697
+ box-sizing: border-box;
5698
+ color: var(--sw-color-text);
5699
+ cursor: pointer;
5700
+ display: inline-flex;
5701
+ font-family: inherit;
5702
+ font-size: inherit;
5703
+ gap: var(--sw-space-3);
5704
+ letter-spacing: inherit;
5705
+ line-height: inherit;
5706
+ margin: 0;
5707
+ max-width: 100%;
5708
+ min-height: var(--sw-control-md-min-height);
5709
+ padding-block: 0;
5710
+ padding-inline: var(--sw-control-md-padding-inline);
5711
+ text-align: start;
5712
+ }
5713
+
5714
+ /* The chevron Accordion uses, pointing down, centred on the text. */
5715
+ .sw-select-trigger::after {
5716
+ border-bottom: 2px solid var(--sw-color-muted);
5717
+ border-right: 2px solid var(--sw-color-muted);
5718
+ box-sizing: border-box;
5719
+ height: var(--sw-space-2);
5720
+ width: var(--sw-space-2);
5721
+ content: '';
5722
+ flex: none;
5723
+ transform: translateY(-25%) rotate(45deg);
5724
+ }
5725
+
5726
+ /*
5727
+ * The current label and a hidden copy of every option's label share one grid
5728
+ * cell, so the trigger is as wide as the longest option and keeps that width
5729
+ * when the value changes; past the available width the label ellipsizes.
5730
+ */
5731
+ .sw-select-value {
5732
+ display: grid;
5733
+ flex: 1 1 auto;
5734
+ min-width: 0;
5735
+ }
5736
+
5737
+ .sw-select-value > * {
5738
+ grid-area: 1 / 1;
5739
+ min-width: 0;
5740
+ overflow: hidden;
5741
+ text-overflow: ellipsis;
5742
+ white-space: nowrap;
5743
+ }
5744
+
5745
+ .sw-select-value-sizer {
5746
+ visibility: hidden;
5747
+ }
5748
+
5749
+ .sw-select-placeholder {
5750
+ color: var(--sw-color-muted);
5751
+ }
5752
+
5753
+ .sw-select-invalid .sw-select-trigger {
5754
+ border-color: var(--sw-color-danger);
5755
+ }
5756
+
5757
+ .sw-select-value-sizer::before {
5758
+ content: attr(data-label);
5759
+ }
5760
+
5761
+ .sw-select-trigger:focus {
5762
+ box-shadow: none;
5763
+ outline: none;
5764
+ }
5765
+
5766
+ .sw-select-trigger:focus-visible {
5767
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5768
+ outline-offset: var(--sw-focus-ring-offset);
5769
+ }
5770
+
5771
+ .sw-select-xs .sw-select-trigger {
5772
+ font-size: 13px;
5773
+ gap: var(--sw-space-2);
5774
+ letter-spacing: -0.08px;
5775
+ line-height: 18px;
5776
+ min-height: var(--sw-control-xs-min-height);
5777
+ padding-inline: var(--sw-control-xs-padding-inline);
5778
+ }
5779
+
5780
+ @media (forced-colors: active) {
5781
+ .sw-select-trigger::after { border-color: CanvasText; }
5782
+ .sw-select-invalid .sw-select-trigger { border-color: Mark; }
5783
+ }
5784
+
5785
+ .sw-select-list {
5786
+ background: var(--sw-glass-fill);
5787
+ border: 1px solid var(--sw-glass-border);
5788
+ border-radius: var(--sw-radius-sm);
5789
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
5790
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5791
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5792
+ box-sizing: border-box;
5793
+ color: var(--sw-color-text);
5794
+ inset-inline-start: 0;
5795
+ margin: var(--sw-space-1) 0 0;
5796
+ max-height: var(--sw-select-max);
5797
+ max-width: var(--sw-dialog-max);
5798
+ min-width: 100%;
5799
+ overflow: auto;
5800
+ padding: var(--sw-space-1);
5801
+ position: absolute;
5802
+ width: max-content;
5803
+ z-index: 10;
5804
+ }
5805
+
5806
+ /*
5807
+ * A full-width field's open list is exactly the trigger's width (min-width
5808
+ * already beats the dialog-max cap), so it never runs past a phone's edge;
5809
+ * a long option wraps inside it, even a single long word.
5810
+ */
5811
+ .sw-select-full .sw-select-list {
5812
+ width: 100%;
5813
+ }
5814
+
5815
+ .sw-select-option {
5816
+ border-radius: var(--sw-radius-sm);
5817
+ box-sizing: border-box;
5818
+ cursor: pointer;
5819
+ display: flex;
5820
+ align-items: center;
5821
+ min-height: var(--sw-control-xs-min-height);
5822
+ padding-inline: var(--sw-control-xs-padding-inline);
5823
+ }
5824
+
5825
+ .sw-select-full .sw-select-option {
5826
+ overflow-wrap: anywhere;
5827
+ }
5828
+
5829
+ .sw-select-option[aria-selected='true'] {
5830
+ font-weight: 600;
5831
+ }
5832
+
5833
+ .sw-select-option[data-active='true'] {
5834
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5835
+ }
5836
+
5837
+ .sw-select-xs .sw-select-option {
5838
+ font-size: 13px;
5839
+ letter-spacing: -0.08px;
5840
+ line-height: 18px;
5841
+ }
5842
+
5843
+ .sw-select-action {
5844
+ border-top: 1px solid var(--sw-color-border);
5845
+ color: var(--sw-color-accent);
5846
+ margin-top: var(--sw-space-1);
5847
+ }
5848
+
5849
+ .sw-action-menu {
5850
+ display: inline-flex;
5851
+ position: relative;
5852
+ }
5853
+
5854
+ .sw-action-menu-trigger {
5855
+ appearance: none;
5856
+ background: var(--sw-glass-fill);
5857
+ border: 1px solid var(--sw-color-border);
5858
+ border-radius: var(--sw-radius-sm);
5859
+ color: var(--sw-color-text);
5860
+ cursor: pointer;
5861
+ font: inherit;
5862
+ min-height: var(--sw-control-xs-min-height);
5863
+ padding-inline: var(--sw-control-xs-padding-inline);
5864
+ }
5865
+
5866
+ .sw-action-menu-trigger:focus-visible,
5867
+ .sw-action-menu-item:focus-visible {
5868
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5869
+ outline-offset: var(--sw-focus-ring-offset);
5870
+ }
5871
+
5872
+ .sw-action-menu-trigger:disabled {
5873
+ cursor: not-allowed;
5874
+ opacity: 0.5;
5875
+ }
5876
+
5877
+ .sw-action-menu-list {
5878
+ background: var(--sw-glass-fill);
5879
+ border: 1px solid var(--sw-glass-border);
5880
+ border-radius: var(--sw-radius-sm);
5881
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
5882
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5883
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5884
+ box-sizing: border-box;
5885
+ color: var(--sw-color-text);
5886
+ /* The popover layer's inset: 0 would ignore the placed left in right-to-left. */
5887
+ inset: auto;
5888
+ margin: 0;
5889
+ max-height: var(--sw-select-max);
5890
+ /* On the top layer 100% is the viewport without a classic scrollbar. */
5891
+ max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
5892
+ /* Never narrower than a touch target. */
5893
+ min-width: var(--sw-control-md-min-height);
5894
+ overflow: auto;
5895
+ padding: var(--sw-space-1);
5896
+ position: fixed;
5897
+ /* As wide as its longest command, until max-width wraps it. */
5898
+ width: max-content;
5899
+ z-index: 10;
5900
+ }
5901
+
5902
+ /* Each child of the header is a line of its own: a name, then a role. */
5903
+ .sw-action-menu-header {
5904
+ border-bottom: 1px solid var(--sw-color-border);
5905
+ color: var(--sw-color-muted);
5906
+ display: flex;
5907
+ flex-direction: column;
5908
+ gap: var(--sw-space-1);
5909
+ font-family: var(--sw-font-sans);
5910
+ font-size: 13px;
5911
+ letter-spacing: -0.08px;
5912
+ line-height: 18px;
5913
+ margin-bottom: var(--sw-space-1);
5914
+ /* The commands' inline padding, so the header's words line up with theirs. */
5915
+ padding: var(--sw-space-1) var(--sw-control-xs-padding-inline) var(--sw-space-2);
5916
+ }
5917
+
5918
+ /* With a header, the commands are the menu inside the popover. */
5919
+ .sw-action-menu-items {
5920
+ display: block;
5921
+ }
5922
+
5923
+ .sw-action-menu-item {
5924
+ align-items: center;
5925
+ appearance: none;
5926
+ background: transparent;
5927
+ border: 0;
5928
+ border-radius: var(--sw-radius-sm);
5929
+ color: inherit;
5930
+ cursor: pointer;
5931
+ display: flex;
5932
+ font-family: var(--sw-font-sans);
5933
+ font-size: 15px;
5934
+ gap: var(--sw-space-2);
5935
+ line-height: 20px;
5936
+ min-height: var(--sw-control-xs-min-height);
5937
+ /* A long command wraps inside the capped menu, a word at a time if it must. */
5938
+ overflow-wrap: anywhere;
5939
+ padding-block: var(--sw-space-1);
5940
+ padding-inline: var(--sw-control-xs-padding-inline);
5941
+ text-align: start;
5942
+ width: 100%;
5943
+ }
5944
+
5945
+ .sw-action-menu-item:hover,
5946
+ .sw-action-menu-item:focus-visible {
5947
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5948
+ }
5949
+
5950
+ .sw-action-menu-item:disabled {
5951
+ cursor: not-allowed;
5952
+ opacity: 0.5;
5953
+ }
5954
+
5955
+ .sw-action-menu-item-danger {
5956
+ color: var(--sw-color-danger);
5957
+ }
5958
+
5959
+ /*
5960
+ * A command's detail: its current value at the inline end in the muted
5961
+ * colour, then a chevron pointing to the inline end (mirrored right to
5962
+ * left). A long value wraps between words, never inside one (the command
5963
+ * itself may break anywhere), and the chevron stays last.
5964
+ */
5965
+ .sw-action-menu-detail {
5966
+ align-items: center;
5967
+ color: var(--sw-color-muted);
5968
+ display: inline-flex;
5969
+ gap: var(--sw-space-2);
5970
+ margin-inline-start: auto;
5971
+ overflow-wrap: normal;
5972
+ padding-inline-start: var(--sw-space-3);
5973
+ text-align: end;
5974
+ }
5975
+
5976
+ .sw-action-menu-chevron {
5977
+ border-bottom: 2px solid var(--sw-color-muted);
5978
+ border-right: 2px solid var(--sw-color-muted);
5979
+ box-sizing: border-box;
5980
+ height: var(--sw-space-2);
5981
+ width: var(--sw-space-2);
5982
+ flex: none;
5983
+ transform: rotate(-45deg);
5984
+ }
5985
+
5986
+ .sw-action-menu-chevron:dir(rtl) {
5987
+ transform: rotate(135deg);
5988
+ }
5989
+
5990
+ /* A hairline that sets a command apart from the ones above. */
5991
+ .sw-action-menu-separator {
5992
+ border-top: 1px solid var(--sw-color-border);
5993
+ margin-block: var(--sw-space-1);
5994
+ }
5995
+
5996
+ @media (forced-colors: active) {
5997
+ .sw-action-menu-chevron { border-color: CanvasText; }
5998
+ }
5999
+
6000
+ /* A coarse pointer gets the full touch target: the trigger at least square, and every command as tall. */
6001
+ @media (pointer: coarse) {
6002
+ .sw-action-menu-trigger {
6003
+ min-height: var(--sw-control-md-min-height);
6004
+ min-width: var(--sw-control-md-min-height);
6005
+ }
6006
+
6007
+ .sw-action-menu-item {
6008
+ min-height: var(--sw-control-md-min-height);
6009
+ }
6010
+ }
6011
+
6012
+ .sw-action-menu-trigger.sw-action-menu-trigger-text {
6013
+ align-items: center;
6014
+ background: transparent;
6015
+ border-color: transparent;
6016
+ display: inline-flex;
6017
+ font-family: var(--sw-font-sans);
6018
+ font-size: 15px;
6019
+ font-weight: 500;
6020
+ gap: var(--sw-space-2);
6021
+ letter-spacing: -0.2px;
6022
+ line-height: 20px;
6023
+ min-height: var(--sw-control-sm-min-height);
6024
+ padding-inline: var(--sw-space-3) var(--sw-space-2);
4919
6025
  }
4920
6026
 
4921
- /* A token chevron replaces the user-agent triangle: it points to the inline end when closed and down when open. */
4922
- .sw-accordion-summary::-webkit-details-marker { display: none; }
4923
-
4924
- .sw-accordion-marker {
6027
+ .sw-action-menu-trigger.sw-action-menu-trigger-text::after {
4925
6028
  border-bottom: 2px solid var(--sw-color-muted);
4926
6029
  border-right: 2px solid var(--sw-color-muted);
4927
6030
  box-sizing: border-box;
4928
6031
  height: var(--sw-space-2);
4929
6032
  width: var(--sw-space-2);
6033
+ content: '';
4930
6034
  flex: none;
4931
- margin-inline-end: var(--sw-space-1);
4932
- transform: rotate(-45deg);
4933
- transition: transform var(--sw-motion-default) var(--sw-motion-easing);
6035
+ transform: translateY(-25%) rotate(45deg);
4934
6036
  }
4935
6037
 
4936
- .sw-accordion-marker:dir(rtl) { transform: rotate(135deg); }
6038
+ .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] {
6039
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6040
+ }
4937
6041
 
4938
- .sw-accordion[open] > .sw-accordion-summary .sw-accordion-marker {
4939
- transform: rotate(45deg);
6042
+ @media (hover: hover) {
6043
+ .sw-action-menu-trigger.sw-action-menu-trigger-text:hover:not(:disabled) {
6044
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6045
+ }
4940
6046
  }
4941
6047
 
4942
- @media (prefers-reduced-motion: reduce) {
4943
- .sw-accordion-marker { transition: none; }
6048
+ @media (pointer: coarse) {
6049
+ .sw-action-menu-trigger.sw-action-menu-trigger-text { min-height: var(--sw-control-md-min-height); }
4944
6050
  }
4945
6051
 
4946
6052
  @media (forced-colors: active) {
4947
- .sw-accordion-marker { border-color: CanvasText; }
6053
+ .sw-action-menu-trigger.sw-action-menu-trigger-text::after { border-color: CanvasText; }
6054
+ .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] { border-color: Highlight; }
4948
6055
  }
4949
6056
 
4950
- .sw-select {
4951
- max-width: 100%;
4952
- width: max-content;
6057
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon {
6058
+ align-items: center;
6059
+ background: transparent;
6060
+ border-color: transparent;
6061
+ border-radius: var(--sw-radius-pill);
6062
+ color: var(--sw-color-muted);
6063
+ display: inline-flex;
6064
+ justify-content: center;
6065
+ min-height: var(--sw-control-sm-min-height);
6066
+ min-width: var(--sw-control-sm-min-height);
6067
+ padding: 0;
4953
6068
  }
4954
6069
 
4955
- /*
4956
- * width="full": the field and its trigger fill the container's inline size.
4957
- * The value still takes the free space and ellipsizes, and the chevron stays
4958
- * last, at the inline end. In an Inline row the field takes only the space
4959
- * its siblings leave, so a Button beside it keeps its label on one line.
4960
- */
4961
- .sw-select-full {
4962
- width: 100%;
6070
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon[aria-expanded='true'] {
6071
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6072
+ color: var(--sw-color-text);
4963
6073
  }
4964
6074
 
4965
- .sw-inline > .sw-select-full {
4966
- flex: 1 1 0;
4967
- min-width: 0;
6075
+ @media (hover: hover) {
6076
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon:hover:not(:disabled) {
6077
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6078
+ color: var(--sw-color-text);
6079
+ }
4968
6080
  }
4969
6081
 
4970
- .sw-select-full .sw-select-trigger {
4971
- width: 100%;
6082
+ @media (pointer: coarse) {
6083
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon {
6084
+ min-height: var(--sw-control-md-min-height);
6085
+ min-width: var(--sw-control-md-min-height);
6086
+ }
4972
6087
  }
4973
6088
 
4974
- .sw-select-control {
4975
- position: relative;
6089
+ @media (forced-colors: active) {
6090
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon { color: ButtonText; }
6091
+ .sw-action-menu-trigger.sw-action-menu-trigger-icon[aria-expanded='true'] { border-color: Highlight; }
4976
6092
  }
4977
6093
 
4978
- .sw-select-trigger {
6094
+ .sw-context-switcher {
6095
+ display: inline-flex;
6096
+ max-width: 100%;
6097
+ }
6098
+
6099
+ .sw-context-switcher-full {
6100
+ display: flex;
6101
+ width: 100%;
6102
+ }
6103
+
6104
+ .sw-context-switcher-trigger {
4979
6105
  align-items: center;
4980
6106
  appearance: none;
4981
- -webkit-appearance: none;
4982
- background-color: var(--sw-glass-fill);
4983
- border: 1px solid var(--sw-color-border);
6107
+ background: transparent;
6108
+ border: 1px solid transparent;
4984
6109
  border-radius: var(--sw-radius-sm);
4985
6110
  box-sizing: border-box;
4986
6111
  color: var(--sw-color-text);
4987
6112
  cursor: pointer;
4988
6113
  display: inline-flex;
4989
- font-family: inherit;
4990
- font-size: inherit;
4991
- gap: var(--sw-space-3);
4992
- letter-spacing: inherit;
4993
- line-height: inherit;
6114
+ font-family: var(--sw-font-sans);
6115
+ font-size: 15px;
6116
+ font-weight: 500;
6117
+ gap: var(--sw-space-2);
6118
+ letter-spacing: -0.2px;
6119
+ line-height: 20px;
4994
6120
  margin: 0;
4995
6121
  max-width: 100%;
4996
- min-height: var(--sw-control-md-min-height);
4997
- padding-block: 0;
4998
- padding-inline: var(--sw-control-md-padding-inline);
6122
+ min-height: var(--sw-control-sm-min-height);
6123
+ padding-block: var(--sw-space-1);
6124
+ padding-inline: var(--sw-space-3) var(--sw-space-2);
4999
6125
  text-align: start;
5000
6126
  }
5001
6127
 
5002
- /* The chevron Accordion uses, pointing down, centred on the text. */
5003
- .sw-select-trigger::after {
6128
+ .sw-context-switcher-full .sw-context-switcher-trigger {
6129
+ width: 100%;
6130
+ }
6131
+
6132
+ .sw-context-switcher-trigger-content {
6133
+ align-items: center;
6134
+ display: flex;
6135
+ flex: 1 1 auto;
6136
+ gap: var(--sw-space-2);
6137
+ min-width: 0;
6138
+ overflow-wrap: anywhere;
6139
+ }
6140
+
6141
+ .sw-context-switcher-trigger:not(.sw-context-switcher-trigger-icon)::after {
5004
6142
  border-bottom: 2px solid var(--sw-color-muted);
5005
6143
  border-right: 2px solid var(--sw-color-muted);
5006
6144
  box-sizing: border-box;
@@ -5011,66 +6149,77 @@ body {
5011
6149
  transform: translateY(-25%) rotate(45deg);
5012
6150
  }
5013
6151
 
5014
- /*
5015
- * The current label and a hidden copy of every option's label share one grid
5016
- * cell, so the trigger is as wide as the longest option and keeps that width
5017
- * when the value changes; past the available width the label ellipsizes.
5018
- */
5019
- .sw-select-value {
5020
- display: grid;
5021
- flex: 1 1 auto;
5022
- min-width: 0;
6152
+ .sw-context-switcher-trigger[aria-expanded='true'] {
6153
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5023
6154
  }
5024
6155
 
5025
- .sw-select-value > * {
5026
- grid-area: 1 / 1;
5027
- min-width: 0;
5028
- overflow: hidden;
5029
- text-overflow: ellipsis;
5030
- white-space: nowrap;
6156
+ @media (hover: hover) {
6157
+ .sw-context-switcher-trigger:hover {
6158
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6159
+ }
5031
6160
  }
5032
6161
 
5033
- .sw-select-value-sizer {
5034
- visibility: hidden;
6162
+ .sw-context-switcher-trigger:focus-visible {
6163
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
6164
+ outline-offset: var(--sw-focus-ring-offset);
5035
6165
  }
5036
6166
 
5037
- .sw-select-placeholder {
5038
- color: var(--sw-color-muted);
6167
+ @media (pointer: coarse) {
6168
+ .sw-context-switcher-trigger { min-height: var(--sw-control-md-min-height); }
5039
6169
  }
5040
6170
 
5041
- .sw-select-invalid .sw-select-trigger {
5042
- border-color: var(--sw-color-danger);
6171
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-framed {
6172
+ background: var(--sw-glass-fill);
6173
+ border-color: var(--sw-color-border);
5043
6174
  }
5044
6175
 
5045
- .sw-select-value-sizer::before {
5046
- content: attr(data-label);
6176
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-pill {
6177
+ background: var(--sw-color-surface);
6178
+ border-color: var(--sw-color-border);
6179
+ border-radius: var(--sw-radius-pill);
6180
+ font-weight: 600;
5047
6181
  }
5048
6182
 
5049
- .sw-select-trigger:focus {
5050
- box-shadow: none;
5051
- outline: none;
6183
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-framed[aria-expanded='true'],
6184
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-pill[aria-expanded='true'] {
6185
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5052
6186
  }
5053
6187
 
5054
- .sw-select-trigger:focus-visible {
5055
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5056
- outline-offset: var(--sw-focus-ring-offset);
6188
+ @media (hover: hover) {
6189
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-framed:hover,
6190
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-pill:hover {
6191
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6192
+ }
5057
6193
  }
5058
6194
 
5059
- .sw-select-xs .sw-select-trigger {
5060
- font-size: 13px;
5061
- gap: var(--sw-space-2);
5062
- letter-spacing: -0.08px;
5063
- line-height: 18px;
5064
- min-height: var(--sw-control-xs-min-height);
5065
- padding-inline: var(--sw-control-xs-padding-inline);
6195
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon {
6196
+ border-radius: var(--sw-radius-pill);
6197
+ color: var(--sw-color-muted);
6198
+ justify-content: center;
6199
+ min-width: var(--sw-control-sm-min-height);
6200
+ padding: 0;
6201
+ }
6202
+
6203
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon .sw-context-switcher-trigger-content {
6204
+ flex: none;
6205
+ justify-content: center;
6206
+ }
6207
+
6208
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon[aria-expanded='true'] {
6209
+ color: var(--sw-color-text);
6210
+ }
6211
+
6212
+ @media (pointer: coarse) {
6213
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon { min-width: var(--sw-control-md-min-height); }
5066
6214
  }
5067
6215
 
5068
6216
  @media (forced-colors: active) {
5069
- .sw-select-trigger::after { border-color: CanvasText; }
5070
- .sw-select-invalid .sw-select-trigger { border-color: Mark; }
6217
+ .sw-context-switcher-trigger::after { border-color: CanvasText; }
6218
+ .sw-context-switcher-trigger[aria-expanded='true'] { border-color: Highlight; }
6219
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon { color: ButtonText; }
5071
6220
  }
5072
6221
 
5073
- .sw-select-list {
6222
+ .sw-context-switcher-popup {
5074
6223
  background: var(--sw-glass-fill);
5075
6224
  border: 1px solid var(--sw-glass-border);
5076
6225
  border-radius: var(--sw-radius-sm);
@@ -5079,304 +6228,390 @@ body {
5079
6228
  -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5080
6229
  box-sizing: border-box;
5081
6230
  color: var(--sw-color-text);
5082
- inset-inline-start: 0;
5083
- margin: var(--sw-space-1) 0 0;
5084
- max-height: var(--sw-select-max);
5085
- max-width: var(--sw-dialog-max);
5086
- min-width: 100%;
5087
- overflow: auto;
6231
+ display: flex;
6232
+ flex-direction: column;
6233
+ gap: var(--sw-space-1);
6234
+ inset: auto;
6235
+ margin: 0;
6236
+ max-height: calc(100% - var(--sw-space-2) - var(--sw-space-2));
6237
+ max-width: min(max(var(--sw-dialog-max), var(--sw-context-switcher-trigger-width, 0px)), calc(100% - var(--sw-space-2) - var(--sw-space-2)));
6238
+ min-width: min(max(15rem, var(--sw-context-switcher-trigger-width, 0px)), calc(100% - var(--sw-space-2) - var(--sw-space-2)));
5088
6239
  padding: var(--sw-space-1);
5089
- position: absolute;
6240
+ position: fixed;
5090
6241
  width: max-content;
5091
6242
  z-index: 10;
5092
6243
  }
5093
6244
 
5094
- /*
5095
- * A full-width field's open list is exactly the trigger's width (min-width
5096
- * already beats the dialog-max cap), so it never runs past a phone's edge;
5097
- * a long option wraps inside it, even a single long word.
5098
- */
5099
- .sw-select-full .sw-select-list {
5100
- width: 100%;
6245
+ .sw-context-switcher-filter {
6246
+ box-sizing: border-box;
6247
+ flex: none;
6248
+ margin: var(--sw-space-1);
6249
+ width: calc(100% - var(--sw-space-2));
6250
+ }
6251
+
6252
+ .sw-context-switcher-list {
6253
+ flex: 1 1 auto;
6254
+ max-height: var(--sw-select-max);
6255
+ min-height: 0;
6256
+ overflow-y: auto;
6257
+ overscroll-behavior: contain;
6258
+ }
6259
+
6260
+ .sw-context-switcher-list:focus {
6261
+ outline: none;
6262
+ }
6263
+
6264
+ .sw-context-switcher-heading {
6265
+ color: var(--sw-color-muted);
6266
+ font-family: var(--sw-font-sans);
6267
+ font-size: 13px;
6268
+ font-weight: 600;
6269
+ letter-spacing: -0.08px;
6270
+ line-height: 18px;
6271
+ padding: var(--sw-space-2) var(--sw-space-2) var(--sw-space-1);
6272
+ }
6273
+
6274
+ .sw-context-switcher-empty {
6275
+ color: var(--sw-color-muted);
6276
+ font-family: var(--sw-font-sans);
6277
+ font-size: 13px;
6278
+ letter-spacing: -0.08px;
6279
+ line-height: 18px;
6280
+ margin: 0;
6281
+ padding: var(--sw-space-2);
6282
+ }
6283
+
6284
+ .sw-context-switcher-footer {
6285
+ border-top: 1px solid var(--sw-color-border);
6286
+ display: flex;
6287
+ flex: none;
6288
+ flex-wrap: wrap;
6289
+ gap: var(--sw-space-1);
6290
+ padding-top: var(--sw-space-1);
6291
+ }
6292
+
6293
+ .sw-context-switcher-action-icon {
6294
+ display: inline-flex;
6295
+ flex: none;
5101
6296
  }
5102
6297
 
5103
- .sw-select-option {
6298
+ .sw-context-switcher-option {
6299
+ align-items: center;
5104
6300
  border-radius: var(--sw-radius-sm);
5105
6301
  box-sizing: border-box;
5106
6302
  cursor: pointer;
5107
6303
  display: flex;
5108
- align-items: center;
5109
- min-height: var(--sw-control-xs-min-height);
5110
- padding-inline: var(--sw-control-xs-padding-inline);
6304
+ font-family: var(--sw-font-sans);
6305
+ font-size: 15px;
6306
+ gap: var(--sw-space-2);
6307
+ letter-spacing: -0.2px;
6308
+ line-height: 20px;
6309
+ min-height: var(--sw-control-sm-min-height);
6310
+ overflow-wrap: anywhere;
6311
+ padding: var(--sw-space-1) var(--sw-space-2);
5111
6312
  }
5112
6313
 
5113
- .sw-select-full .sw-select-option {
5114
- overflow-wrap: anywhere;
6314
+ .sw-context-switcher-option[data-active='true'] {
6315
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5115
6316
  }
5116
6317
 
5117
- .sw-select-option[aria-selected='true'] {
5118
- font-weight: 600;
6318
+ /* On the quiet fill the muted detail moves toward the text colour, keeping 4.5:1. */
6319
+ .sw-context-switcher-option[data-active='true'] .sw-context-switcher-detail {
6320
+ color: color-mix(in srgb, var(--sw-color-muted) 70%, var(--sw-color-text));
5119
6321
  }
5120
6322
 
5121
- .sw-select-option[data-active='true'] {
5122
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6323
+ .sw-context-switcher-list:focus-visible .sw-context-switcher-option[data-active='true'] {
6324
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
6325
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
5123
6326
  }
5124
6327
 
5125
- .sw-select-xs .sw-select-option {
6328
+ .sw-context-switcher-icon {
6329
+ display: inline-flex;
6330
+ flex: none;
6331
+ }
6332
+
6333
+ .sw-context-switcher-words {
6334
+ display: flex;
6335
+ flex: 1 1 auto;
6336
+ flex-direction: column;
6337
+ min-width: 0;
6338
+ }
6339
+
6340
+ .sw-context-switcher-option[aria-selected='true'] .sw-context-switcher-label {
6341
+ font-weight: 600;
6342
+ }
6343
+
6344
+ .sw-context-switcher-detail {
6345
+ color: var(--sw-color-muted);
5126
6346
  font-size: 13px;
5127
6347
  letter-spacing: -0.08px;
5128
6348
  line-height: 18px;
5129
6349
  }
5130
6350
 
5131
- .sw-select-action {
5132
- border-top: 1px solid var(--sw-color-border);
5133
- color: var(--sw-color-accent);
5134
- margin-top: var(--sw-space-1);
5135
- }
5136
-
5137
- .sw-action-menu {
5138
- display: inline-flex;
5139
- position: relative;
6351
+ .sw-context-switcher-count {
6352
+ flex: none;
5140
6353
  }
5141
6354
 
5142
- .sw-action-menu-trigger {
5143
- appearance: none;
5144
- background: var(--sw-glass-fill);
5145
- border: 1px solid var(--sw-color-border);
5146
- border-radius: var(--sw-radius-sm);
5147
- color: var(--sw-color-text);
5148
- cursor: pointer;
5149
- font: inherit;
5150
- min-height: var(--sw-control-xs-min-height);
5151
- padding-inline: var(--sw-control-xs-padding-inline);
6355
+ .sw-context-switcher-check {
6356
+ border-bottom: 2px solid var(--sw-color-accent);
6357
+ border-right: 2px solid var(--sw-color-accent);
6358
+ box-sizing: border-box;
6359
+ flex: none;
6360
+ height: var(--sw-space-3);
6361
+ margin-inline: var(--sw-space-1);
6362
+ transform: rotate(45deg);
6363
+ width: var(--sw-space-2);
5152
6364
  }
5153
6365
 
5154
- .sw-action-menu-trigger:focus-visible,
5155
- .sw-action-menu-item:focus-visible {
5156
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5157
- outline-offset: var(--sw-focus-ring-offset);
6366
+ @media (pointer: coarse) {
6367
+ .sw-context-switcher-option { min-height: var(--sw-control-md-min-height); }
5158
6368
  }
5159
6369
 
5160
- .sw-action-menu-trigger:disabled {
5161
- cursor: not-allowed;
5162
- opacity: 0.5;
6370
+ @media (forced-colors: active) {
6371
+ .sw-context-switcher-popup { border-color: CanvasText; }
6372
+ .sw-context-switcher-option[data-active='true'] { background: Highlight; color: HighlightText; forced-color-adjust: none; }
6373
+ .sw-context-switcher-option[data-active='true'] .sw-context-switcher-detail { color: HighlightText; }
6374
+ .sw-context-switcher-option[data-active='true'] .sw-badge,
6375
+ .sw-context-switcher-option[data-active='true'] .sw-context-switcher-count { forced-color-adjust: auto; }
6376
+ .sw-context-switcher-check { border-color: CanvasText; }
6377
+ .sw-context-switcher-option[data-active='true'] .sw-context-switcher-check { border-color: HighlightText; }
6378
+ .sw-context-switcher-footer { border-color: CanvasText; }
5163
6379
  }
5164
6380
 
5165
- .sw-action-menu-list {
5166
- background: var(--sw-glass-fill);
5167
- border: 1px solid var(--sw-glass-border);
6381
+ .sw-command-palette-key {
6382
+ align-items: center;
6383
+ border: 1px solid var(--sw-color-border);
5168
6384
  border-radius: var(--sw-radius-sm);
5169
- box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
5170
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5171
- -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
5172
6385
  box-sizing: border-box;
5173
- color: var(--sw-color-text);
5174
- /* The popover layer's inset: 0 would ignore the placed left in right-to-left. */
5175
- inset: auto;
5176
- margin: 0;
5177
- max-height: var(--sw-select-max);
5178
- /* On the top layer 100% is the viewport without a classic scrollbar. */
5179
- max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
5180
- /* Never narrower than a touch target. */
5181
- min-width: var(--sw-control-md-min-height);
5182
- overflow: auto;
5183
- padding: var(--sw-space-1);
5184
- position: fixed;
5185
- /* As wide as its longest command, until max-width wraps it. */
5186
- width: max-content;
5187
- z-index: 10;
5188
- }
5189
-
5190
- /* Each child of the header is a line of its own: a name, then a role. */
5191
- .sw-action-menu-header {
5192
- border-bottom: 1px solid var(--sw-color-border);
5193
6386
  color: var(--sw-color-muted);
5194
- display: flex;
5195
- flex-direction: column;
5196
- gap: var(--sw-space-1);
6387
+ display: inline-flex;
6388
+ flex: none;
5197
6389
  font-family: var(--sw-font-sans);
5198
6390
  font-size: 13px;
6391
+ font-variant-numeric: tabular-nums;
6392
+ font-weight: 500;
6393
+ justify-content: center;
5199
6394
  letter-spacing: -0.08px;
5200
6395
  line-height: 18px;
5201
- margin-bottom: var(--sw-space-1);
5202
- /* The commands' inline padding, so the header's words line up with theirs. */
5203
- padding: var(--sw-space-1) var(--sw-control-xs-padding-inline) var(--sw-space-2);
6396
+ min-width: var(--sw-space-5);
6397
+ padding-inline: var(--sw-space-1);
6398
+ white-space: nowrap;
5204
6399
  }
5205
6400
 
5206
- /* With a header, the commands are the menu inside the popover. */
5207
- .sw-action-menu-items {
5208
- display: block;
6401
+ @media (forced-colors: active) {
6402
+ .sw-command-palette-key { border-color: CanvasText; color: CanvasText; }
5209
6403
  }
5210
6404
 
5211
- .sw-action-menu-item {
6405
+ .sw-command-palette-trigger {
5212
6406
  align-items: center;
5213
6407
  appearance: none;
5214
- background: transparent;
5215
- border: 0;
5216
- border-radius: var(--sw-radius-sm);
5217
- color: inherit;
6408
+ background: var(--sw-color-surface);
6409
+ border: 1px solid var(--sw-color-border);
6410
+ border-radius: var(--sw-radius-pill);
6411
+ box-sizing: border-box;
6412
+ color: var(--sw-color-muted);
5218
6413
  cursor: pointer;
5219
- display: flex;
6414
+ display: inline-flex;
5220
6415
  font-family: var(--sw-font-sans);
5221
6416
  font-size: 15px;
6417
+ font-weight: 400;
5222
6418
  gap: var(--sw-space-2);
6419
+ letter-spacing: -0.2px;
5223
6420
  line-height: 20px;
5224
- min-height: var(--sw-control-xs-min-height);
5225
- /* A long command wraps inside the capped menu, a word at a time if it must. */
5226
- overflow-wrap: anywhere;
5227
- padding-block: var(--sw-space-1);
5228
- padding-inline: var(--sw-control-xs-padding-inline);
6421
+ margin: 0;
6422
+ max-width: 100%;
6423
+ min-height: var(--sw-control-sm-min-height);
6424
+ min-width: min(12rem, 100%);
6425
+ padding-inline: var(--sw-space-3) var(--sw-space-2);
5229
6426
  text-align: start;
5230
- width: 100%;
5231
6427
  }
5232
6428
 
5233
- .sw-action-menu-item:hover,
5234
- .sw-action-menu-item:focus-visible {
5235
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6429
+ .sw-command-palette-trigger-icon {
6430
+ display: inline-flex;
6431
+ flex: none;
5236
6432
  }
5237
6433
 
5238
- .sw-action-menu-item:disabled {
5239
- cursor: not-allowed;
5240
- opacity: 0.5;
6434
+ .sw-command-palette-trigger-text {
6435
+ flex: 1 1 auto;
6436
+ min-width: 0;
6437
+ overflow: hidden;
6438
+ text-overflow: ellipsis;
6439
+ white-space: nowrap;
5241
6440
  }
5242
6441
 
5243
- .sw-action-menu-item-danger {
5244
- color: var(--sw-color-danger);
6442
+ @media (hover: hover) {
6443
+ .sw-command-palette-trigger:hover { background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent); color: var(--sw-color-text); }
5245
6444
  }
5246
6445
 
5247
- /*
5248
- * A command's detail: its current value at the inline end in the muted
5249
- * colour, then a chevron pointing to the inline end (mirrored right to
5250
- * left). A long value wraps between words, never inside one (the command
5251
- * itself may break anywhere), and the chevron stays last.
5252
- */
5253
- .sw-action-menu-detail {
5254
- align-items: center;
5255
- color: var(--sw-color-muted);
5256
- display: inline-flex;
5257
- gap: var(--sw-space-2);
5258
- margin-inline-start: auto;
5259
- overflow-wrap: normal;
5260
- padding-inline-start: var(--sw-space-3);
5261
- text-align: end;
6446
+ .sw-command-palette-trigger:focus-visible {
6447
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
6448
+ outline-offset: var(--sw-focus-ring-offset);
5262
6449
  }
5263
6450
 
5264
- .sw-action-menu-chevron {
5265
- border-bottom: 2px solid var(--sw-color-muted);
5266
- border-right: 2px solid var(--sw-color-muted);
6451
+ .sw-command-palette-trigger.sw-command-palette-trigger-compact {
6452
+ background: transparent;
6453
+ border-color: transparent;
6454
+ justify-content: center;
6455
+ min-width: var(--sw-control-sm-min-height);
6456
+ padding: 0;
6457
+ }
6458
+
6459
+ @media (pointer: coarse) {
6460
+ .sw-command-palette-trigger { min-height: var(--sw-control-md-min-height); }
6461
+ .sw-command-palette-trigger.sw-command-palette-trigger-compact { min-width: var(--sw-control-md-min-height); }
6462
+ }
6463
+
6464
+ @media (forced-colors: active) {
6465
+ .sw-command-palette-trigger { color: ButtonText; }
6466
+ }
6467
+
6468
+ .sw-command-palette {
6469
+ background: var(--sw-glass-fill);
6470
+ border: 1px solid var(--sw-glass-border);
6471
+ border-radius: var(--sw-radius-lg);
6472
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
6473
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
6474
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
6475
+ box-sizing: border-box;
6476
+ color: var(--sw-color-text);
6477
+ margin: var(--sw-space-2) auto auto;
6478
+ max-height: calc(100dvh - 2 * var(--sw-space-2));
6479
+ max-width: calc(100% - 2 * var(--sw-space-2));
6480
+ overflow: hidden;
6481
+ padding: 0;
6482
+ width: 40rem;
6483
+ }
6484
+
6485
+ @media (min-width: 48rem) {
6486
+ .sw-command-palette {
6487
+ margin-top: max(var(--sw-space-2), 10vh);
6488
+ max-height: calc(100dvh - max(var(--sw-space-2), 10vh) - var(--sw-space-8));
6489
+ }
6490
+ }
6491
+
6492
+ .sw-command-palette::backdrop {
6493
+ background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
6494
+ }
6495
+
6496
+ .sw-command-palette-body {
6497
+ display: flex;
6498
+ flex-direction: column;
6499
+ max-height: inherit;
6500
+ }
6501
+
6502
+ [data-theme] input.sw-command-palette-field {
6503
+ background: transparent;
6504
+ border: 0;
6505
+ border-bottom: 1px solid var(--sw-color-border);
6506
+ border-radius: 0;
5267
6507
  box-sizing: border-box;
5268
- height: var(--sw-space-2);
5269
- width: var(--sw-space-2);
5270
6508
  flex: none;
5271
- transform: rotate(-45deg);
6509
+ font-size: 17px;
6510
+ letter-spacing: -0.2px;
6511
+ line-height: 25px;
6512
+ min-height: var(--sw-control-md-min-height);
6513
+ padding: var(--sw-space-3) var(--sw-space-4);
6514
+ width: 100%;
5272
6515
  }
5273
6516
 
5274
- .sw-action-menu-chevron:dir(rtl) {
5275
- transform: rotate(135deg);
6517
+ [data-theme] input.sw-command-palette-field:focus,
6518
+ [data-theme] input.sw-command-palette-field:focus-visible {
6519
+ border-bottom-color: var(--sw-color-accent);
6520
+ box-shadow: inset 0 -1px 0 var(--sw-color-accent);
6521
+ outline: none;
5276
6522
  }
5277
6523
 
5278
- /* A hairline that sets a command apart from the ones above. */
5279
- .sw-action-menu-separator {
5280
- border-top: 1px solid var(--sw-color-border);
5281
- margin-block: var(--sw-space-1);
6524
+ .sw-command-palette-list {
6525
+ flex: 1 1 auto;
6526
+ min-height: 0;
6527
+ overflow-y: auto;
6528
+ overscroll-behavior: contain;
6529
+ padding: var(--sw-space-1) var(--sw-space-2);
5282
6530
  }
5283
6531
 
5284
- @media (forced-colors: active) {
5285
- .sw-action-menu-chevron { border-color: CanvasText; }
6532
+ .sw-command-palette-heading {
6533
+ color: var(--sw-color-muted);
6534
+ font-family: var(--sw-font-sans);
6535
+ font-size: 13px;
6536
+ font-weight: 600;
6537
+ letter-spacing: -0.08px;
6538
+ line-height: 18px;
6539
+ padding: var(--sw-space-2) var(--sw-space-2) var(--sw-space-1);
6540
+ }
6541
+
6542
+ .sw-command-palette-message,
6543
+ .sw-command-palette-hint {
6544
+ color: var(--sw-color-muted);
6545
+ font-family: var(--sw-font-sans);
6546
+ font-size: 13px;
6547
+ letter-spacing: -0.08px;
6548
+ line-height: 18px;
6549
+ margin: 0;
6550
+ padding: var(--sw-space-3) var(--sw-space-4);
5286
6551
  }
5287
6552
 
5288
- /* A coarse pointer gets the full touch target: the trigger at least square, and every command as tall. */
5289
- @media (pointer: coarse) {
5290
- .sw-action-menu-trigger {
5291
- min-height: var(--sw-control-md-min-height);
5292
- min-width: var(--sw-control-md-min-height);
5293
- }
5294
-
5295
- .sw-action-menu-item {
5296
- min-height: var(--sw-control-md-min-height);
5297
- }
6553
+ .sw-command-palette-hint {
6554
+ border-top: 1px solid var(--sw-color-border);
6555
+ flex: none;
5298
6556
  }
5299
6557
 
5300
- .sw-action-menu-trigger.sw-action-menu-trigger-text {
6558
+ .sw-command-palette-item {
5301
6559
  align-items: center;
5302
- background: transparent;
5303
- border-color: transparent;
5304
- display: inline-flex;
6560
+ border-radius: var(--sw-radius-sm);
6561
+ box-sizing: border-box;
6562
+ cursor: pointer;
6563
+ display: flex;
5305
6564
  font-family: var(--sw-font-sans);
5306
6565
  font-size: 15px;
5307
- font-weight: 500;
5308
- gap: var(--sw-space-2);
6566
+ gap: var(--sw-space-3);
5309
6567
  letter-spacing: -0.2px;
5310
6568
  line-height: 20px;
5311
6569
  min-height: var(--sw-control-sm-min-height);
5312
- padding-inline: var(--sw-space-3) var(--sw-space-2);
5313
- }
5314
-
5315
- .sw-action-menu-trigger.sw-action-menu-trigger-text::after {
5316
- border-bottom: 2px solid var(--sw-color-muted);
5317
- border-right: 2px solid var(--sw-color-muted);
5318
- box-sizing: border-box;
5319
- height: var(--sw-space-2);
5320
- width: var(--sw-space-2);
5321
- content: '';
5322
- flex: none;
5323
- transform: translateY(-25%) rotate(45deg);
6570
+ overflow-wrap: anywhere;
6571
+ padding: var(--sw-space-1) var(--sw-space-2);
5324
6572
  }
5325
6573
 
5326
- .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] {
6574
+ .sw-command-palette-item[aria-selected='true'] {
5327
6575
  background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5328
6576
  }
5329
6577
 
5330
- @media (hover: hover) {
5331
- .sw-action-menu-trigger.sw-action-menu-trigger-text:hover:not(:disabled) {
5332
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5333
- }
6578
+ .sw-command-palette-icon {
6579
+ display: inline-flex;
6580
+ flex: none;
5334
6581
  }
5335
6582
 
5336
- @media (pointer: coarse) {
5337
- .sw-action-menu-trigger.sw-action-menu-trigger-text { min-height: var(--sw-control-md-min-height); }
6583
+ .sw-command-palette-words {
6584
+ display: flex;
6585
+ flex: 1 1 auto;
6586
+ flex-direction: column;
6587
+ min-width: 0;
5338
6588
  }
5339
6589
 
5340
- @media (forced-colors: active) {
5341
- .sw-action-menu-trigger.sw-action-menu-trigger-text::after { border-color: CanvasText; }
5342
- .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] { border-color: Highlight; }
6590
+ .sw-command-palette-label {
6591
+ font-weight: 500;
5343
6592
  }
5344
6593
 
5345
- .sw-action-menu-trigger.sw-action-menu-trigger-icon {
5346
- align-items: center;
5347
- background: transparent;
5348
- border-color: transparent;
5349
- border-radius: var(--sw-radius-pill);
6594
+ .sw-command-palette-detail {
5350
6595
  color: var(--sw-color-muted);
5351
- display: inline-flex;
5352
- justify-content: center;
5353
- min-height: var(--sw-control-sm-min-height);
5354
- min-width: var(--sw-control-sm-min-height);
5355
- padding: 0;
5356
- }
5357
-
5358
- .sw-action-menu-trigger.sw-action-menu-trigger-icon[aria-expanded='true'] {
5359
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5360
- color: var(--sw-color-text);
6596
+ font-size: 13px;
6597
+ letter-spacing: -0.08px;
6598
+ line-height: 18px;
5361
6599
  }
5362
6600
 
5363
- @media (hover: hover) {
5364
- .sw-action-menu-trigger.sw-action-menu-trigger-icon:hover:not(:disabled) {
5365
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5366
- color: var(--sw-color-text);
5367
- }
6601
+ .sw-command-palette-item[aria-selected='true'] .sw-command-palette-detail {
6602
+ color: color-mix(in srgb, var(--sw-color-muted) 70%, var(--sw-color-text));
5368
6603
  }
5369
6604
 
5370
6605
  @media (pointer: coarse) {
5371
- .sw-action-menu-trigger.sw-action-menu-trigger-icon {
5372
- min-height: var(--sw-control-md-min-height);
5373
- min-width: var(--sw-control-md-min-height);
5374
- }
6606
+ .sw-command-palette-item { min-height: var(--sw-control-md-min-height); }
5375
6607
  }
5376
6608
 
5377
6609
  @media (forced-colors: active) {
5378
- .sw-action-menu-trigger.sw-action-menu-trigger-icon { color: ButtonText; }
5379
- .sw-action-menu-trigger.sw-action-menu-trigger-icon[aria-expanded='true'] { border-color: Highlight; }
6610
+ .sw-command-palette { border-color: CanvasText; }
6611
+ .sw-command-palette-item[aria-selected='true'] { background: Highlight; color: HighlightText; forced-color-adjust: none; }
6612
+ .sw-command-palette-item[aria-selected='true'] .sw-command-palette-detail,
6613
+ .sw-command-palette-item[aria-selected='true'] .sw-command-palette-key { border-color: HighlightText; color: HighlightText; }
6614
+ [data-theme] input.sw-command-palette-field:focus-visible { border-bottom-color: Highlight; box-shadow: inset 0 -1px 0 Highlight; }
5380
6615
  }
5381
6616
 
5382
6617
  .sw-combobox {
@@ -5874,6 +7109,141 @@ body {
5874
7109
  .sw-spinner-icon { border-color: CanvasText; border-block-start-color: Highlight; }
5875
7110
  }
5876
7111
 
7112
+ .sw-skeleton {
7113
+ display: flex;
7114
+ flex-direction: column;
7115
+ gap: var(--sw-space-3);
7116
+ width: 100%;
7117
+ }
7118
+
7119
+ .sw-skeleton-bar,
7120
+ .sw-skeleton-mark {
7121
+ animation: sw-skeleton-pulse calc(2 * var(--sw-motion-travel)) var(--sw-motion-travel-easing) infinite alternate;
7122
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
7123
+ border-radius: var(--sw-radius-sm);
7124
+ box-sizing: border-box;
7125
+ display: block;
7126
+ flex: none;
7127
+ }
7128
+
7129
+ .sw-skeleton-bar {
7130
+ height: calc(17px * 0.8);
7131
+ }
7132
+
7133
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(1) { width: 100%; }
7134
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(2) { width: 92%; }
7135
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(3) { width: 84%; }
7136
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(4) { width: 96%; }
7137
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(5) { width: 88%; }
7138
+ .sw-skeleton-lines > .sw-skeleton-bar:nth-of-type(6) { width: 80%; }
7139
+ .sw-skeleton-lines > .sw-skeleton-bar:last-of-type:not(:first-of-type) { width: 60%; }
7140
+
7141
+ .sw-skeleton-rows {
7142
+ gap: 0;
7143
+ }
7144
+
7145
+ .sw-skeleton-row {
7146
+ align-items: center;
7147
+ box-sizing: border-box;
7148
+ display: flex;
7149
+ gap: var(--sw-space-3);
7150
+ min-height: var(--sw-control-md-min-height);
7151
+ padding-block: var(--sw-space-2);
7152
+ }
7153
+
7154
+ .sw-skeleton-row + .sw-skeleton-row {
7155
+ border-top: 1px solid var(--sw-color-border);
7156
+ }
7157
+
7158
+ .sw-skeleton-row .sw-skeleton-bar {
7159
+ flex: 0 1 60%;
7160
+ }
7161
+
7162
+ .sw-skeleton-row:nth-of-type(even) .sw-skeleton-bar {
7163
+ flex-basis: 45%;
7164
+ }
7165
+
7166
+ .sw-skeleton-mark {
7167
+ height: var(--sw-space-6);
7168
+ width: var(--sw-space-6);
7169
+ }
7170
+
7171
+ @keyframes sw-skeleton-pulse {
7172
+ from { opacity: 1; }
7173
+ to { opacity: 0.6; }
7174
+ }
7175
+
7176
+ @media (pointer: coarse) {
7177
+ .sw-skeleton-row { min-height: var(--sw-control-md-min-height); }
7178
+ }
7179
+
7180
+ @media (prefers-reduced-motion: reduce) {
7181
+ .sw-skeleton-bar,
7182
+ .sw-skeleton-mark { animation: none; }
7183
+ }
7184
+
7185
+ @media (forced-colors: active) {
7186
+ .sw-skeleton-bar,
7187
+ .sw-skeleton-mark { border: 1px solid GrayText; }
7188
+ .sw-skeleton-row + .sw-skeleton-row { border-color: GrayText; }
7189
+ }
7190
+
7191
+ .sw-empty-state {
7192
+ align-items: center;
7193
+ background: var(--sw-color-surface);
7194
+ border: 1px dashed var(--sw-color-border);
7195
+ border-radius: var(--sw-radius-md);
7196
+ box-sizing: border-box;
7197
+ display: flex;
7198
+ flex-direction: column;
7199
+ gap: var(--sw-space-3);
7200
+ min-width: 0;
7201
+ overflow-wrap: anywhere;
7202
+ padding: var(--sw-space-8) var(--sw-space-4);
7203
+ text-align: center;
7204
+ width: 100%;
7205
+ }
7206
+
7207
+ .sw-empty-state-icon {
7208
+ align-items: center;
7209
+ background: var(--sw-color-subtle);
7210
+ border-radius: var(--sw-radius-md);
7211
+ color: var(--sw-color-muted);
7212
+ display: inline-flex;
7213
+ flex: none;
7214
+ height: var(--sw-space-8);
7215
+ justify-content: center;
7216
+ width: var(--sw-space-8);
7217
+ }
7218
+
7219
+ .sw-empty-state-icon > svg {
7220
+ height: var(--sw-space-5);
7221
+ width: var(--sw-space-5);
7222
+ }
7223
+
7224
+ .sw-empty-state-title,
7225
+ .sw-empty-state-description {
7226
+ margin: 0;
7227
+ max-width: var(--sw-reading-max);
7228
+ }
7229
+
7230
+ .sw-empty-state-actions {
7231
+ display: flex;
7232
+ flex-wrap: wrap;
7233
+ gap: var(--sw-space-2);
7234
+ justify-content: center;
7235
+ margin-top: var(--sw-space-1);
7236
+ }
7237
+
7238
+ @media (pointer: coarse) {
7239
+ .sw-empty-state-actions .sw-button { min-height: var(--sw-control-md-min-height); }
7240
+ }
7241
+
7242
+ @media (forced-colors: active) {
7243
+ .sw-empty-state { border-color: CanvasText; }
7244
+ .sw-empty-state-icon { color: CanvasText; }
7245
+ }
7246
+
5877
7247
  .sw-progress {
5878
7248
  display: flex;
5879
7249
  flex-direction: column;
@@ -6064,6 +7434,28 @@ body {
6064
7434
  width: var(--sw-space-4);
6065
7435
  }
6066
7436
 
7437
+ /*
7438
+ * Letters in place of a glyph: one line, centred, weight 600, the line as
7439
+ * tall as the letters, sized from the tile's side rather than the text
7440
+ * round it, so they fit at every size: one letter at half the side, two
7441
+ * at 0.42 of it, three at a third, tightened a little, so even a wide
7442
+ * trio ("WMW") fits inside the smallest tile.
7443
+ */
7444
+ .sw-glyph-tile-text {
7445
+ font-weight: 600;
7446
+ line-height: 1;
7447
+ white-space: nowrap;
7448
+ }
7449
+
7450
+ .sw-glyph-tile-text-1 { font-size: calc(var(--sw-glyph-tile-side) / 2); }
7451
+
7452
+ .sw-glyph-tile-text-2 { font-size: calc(var(--sw-glyph-tile-side) * 0.42); }
7453
+
7454
+ .sw-glyph-tile-text-3 {
7455
+ font-size: calc(var(--sw-glyph-tile-side) / 3);
7456
+ letter-spacing: -0.02em;
7457
+ }
7458
+
6067
7459
  .sw-glyph-tile-green { --sw-glyph-tile-fill: var(--sw-categorical-green); }
6068
7460
  .sw-glyph-tile-blue { --sw-glyph-tile-fill: var(--sw-categorical-blue); }
6069
7461
  .sw-glyph-tile-orange { --sw-glyph-tile-fill: var(--sw-categorical-orange); }
@@ -6072,9 +7464,9 @@ body {
6072
7464
  .sw-glyph-tile-rose { --sw-glyph-tile-fill: var(--sw-categorical-rose); }
6073
7465
  .sw-glyph-tile-neutral { --sw-glyph-tile-fill: var(--sw-categorical-neutral); }
6074
7466
 
6075
- .sw-glyph-tile-sm { height: var(--sw-space-5); width: var(--sw-space-5); }
6076
- .sw-glyph-tile-md { height: var(--sw-control-xs-min-height); width: var(--sw-control-xs-min-height); }
6077
- .sw-glyph-tile-lg { height: var(--sw-space-6); width: var(--sw-space-6); }
7467
+ .sw-glyph-tile-sm { --sw-glyph-tile-side: var(--sw-space-5); height: var(--sw-space-5); width: var(--sw-space-5); }
7468
+ .sw-glyph-tile-md { --sw-glyph-tile-side: var(--sw-control-xs-min-height); height: var(--sw-control-xs-min-height); width: var(--sw-control-xs-min-height); }
7469
+ .sw-glyph-tile-lg { --sw-glyph-tile-side: var(--sw-space-6); height: var(--sw-space-6); width: var(--sw-space-6); }
6078
7470
 
6079
7471
  @media (forced-colors: active) {
6080
7472
  .sw-glyph-tile { border: 1px solid CanvasText; color: CanvasText; }
@@ -6579,6 +7971,9 @@ body {
6579
7971
  .sw-grid-cols-below-md-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
6580
7972
  .sw-grid-cols-below-md-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
6581
7973
  }
7974
+ .sw-grid-fit-narrow { grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); }
7975
+ .sw-grid-fit-medium { grid-template-columns: repeat(auto-fit, minmax(min(100%, 16.25rem), 1fr)); }
7976
+ .sw-grid-fit-wide { grid-template-columns: repeat(auto-fit, minmax(min(100%, 18.75rem), 1fr)); }
6582
7977
  .sw-grid-span-1 { grid-column: span 1; }
6583
7978
  .sw-grid-span-2 { grid-column: span 2; }
6584
7979
  .sw-grid-span-3 { grid-column: span 3; }
@@ -6594,6 +7989,18 @@ body {
6594
7989
  :where(.sw-grid-cols-3) > .sw-grid-span-4 { grid-column: span 3; }
6595
7990
  :where(.sw-grid-cols-3) > .sw-grid-span-6 { grid-column: span 3; }
6596
7991
  :where(.sw-grid-cols-4) > .sw-grid-span-6 { grid-column: span 4; }
7992
+ :where(.sw-grid-fit-narrow) > .sw-grid-span-2 { grid-column: auto; }
7993
+ :where(.sw-grid-fit-narrow) > .sw-grid-span-3 { grid-column: auto; }
7994
+ :where(.sw-grid-fit-narrow) > .sw-grid-span-4 { grid-column: auto; }
7995
+ :where(.sw-grid-fit-narrow) > .sw-grid-span-6 { grid-column: auto; }
7996
+ :where(.sw-grid-fit-medium) > .sw-grid-span-2 { grid-column: auto; }
7997
+ :where(.sw-grid-fit-medium) > .sw-grid-span-3 { grid-column: auto; }
7998
+ :where(.sw-grid-fit-medium) > .sw-grid-span-4 { grid-column: auto; }
7999
+ :where(.sw-grid-fit-medium) > .sw-grid-span-6 { grid-column: auto; }
8000
+ :where(.sw-grid-fit-wide) > .sw-grid-span-2 { grid-column: auto; }
8001
+ :where(.sw-grid-fit-wide) > .sw-grid-span-3 { grid-column: auto; }
8002
+ :where(.sw-grid-fit-wide) > .sw-grid-span-4 { grid-column: auto; }
8003
+ :where(.sw-grid-fit-wide) > .sw-grid-span-6 { grid-column: auto; }
6597
8004
  @media not all and (min-width: 48rem) {
6598
8005
  :where(.sw-grid-cols-below-md-1) > .sw-grid-span-2 { grid-column: span 1; }
6599
8006
  :where(.sw-grid-cols-below-md-1) > .sw-grid-span-3 { grid-column: span 1; }
@@ -7626,6 +9033,99 @@ body {
7626
9033
  [data-theme] .sw-stepper-changed input.sw-stepper-input { border-color: Highlight; box-shadow: inset 0 0 0 1px Highlight; background-image: none; }
7627
9034
  }
7628
9035
 
9036
+ .sw-stepper-count {
9037
+ background-color: var(--sw-glass-fill);
9038
+ border: 1px solid var(--sw-color-border);
9039
+ border-radius: var(--sw-radius-sm);
9040
+ color: inherit;
9041
+ font-family: inherit;
9042
+ font-size: inherit;
9043
+ padding-inline: var(--sw-control-md-padding-inline);
9044
+ align-items: center;
9045
+ box-sizing: border-box;
9046
+ cursor: text;
9047
+ display: inline-flex;
9048
+ gap: var(--sw-space-1);
9049
+ justify-content: center;
9050
+ min-height: var(--sw-control-md-min-height);
9051
+ min-width: 0;
9052
+ padding-inline: var(--sw-space-2);
9053
+ }
9054
+
9055
+ .sw-stepper-full .sw-stepper-count { display: flex; }
9056
+
9057
+ [data-theme] .sw-stepper .sw-stepper-count > input.sw-stepper-input {
9058
+ align-self: stretch;
9059
+ background: transparent;
9060
+ background-image: none;
9061
+ border: 0;
9062
+ border-radius: 0;
9063
+ box-shadow: none;
9064
+ inline-size: 5ch;
9065
+ min-height: 0;
9066
+ padding-inline: 0;
9067
+ text-align: end;
9068
+ }
9069
+
9070
+ [data-theme] .sw-stepper .sw-stepper-count > input.sw-stepper-input:focus-visible { outline: none; }
9071
+
9072
+ .sw-stepper-count:focus-within {
9073
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
9074
+ outline-offset: var(--sw-focus-ring-offset);
9075
+ }
9076
+
9077
+ .sw-stepper-unit {
9078
+ color: var(--sw-color-muted);
9079
+ flex: none;
9080
+ font-size: 17px;
9081
+ line-height: 25px;
9082
+ user-select: none;
9083
+ white-space: nowrap;
9084
+ }
9085
+
9086
+ .sw-stepper-invalid .sw-stepper-count { border-color: var(--sw-color-danger); }
9087
+
9088
+ .sw-stepper-changed .sw-stepper-count {
9089
+ border-color: var(--sw-color-accent);
9090
+ box-shadow: inset 0 0 0 1px var(--sw-color-accent);
9091
+ }
9092
+
9093
+ .sw-stepper-changed .sw-stepper-count:not(:has(> input:placeholder-shown)) { background-image: linear-gradient(color-mix(in srgb, var(--sw-color-accent) 12%, transparent), color-mix(in srgb, var(--sw-color-accent) 12%, transparent)); }
9094
+
9095
+ .sw-stepper-changed .sw-stepper-count:not(:has(> input:placeholder-shown)) > .sw-stepper-unit { color: var(--sw-color-text); }
9096
+
9097
+ /*
9098
+ * The frame draws the surface, so it carries the disabled look for its count,
9099
+ * and only that look: a locked count drops the invalid and changed edges and
9100
+ * tint, which name nothing a person can act on.
9101
+ */
9102
+ .sw-stepper .sw-stepper-count:has(> input:disabled) {
9103
+ background-color: var(--sw-color-subtle);
9104
+ border-style: dashed;
9105
+ cursor: not-allowed;
9106
+ opacity: 1;
9107
+ -webkit-text-fill-color: currentColor;
9108
+ background-image: none;
9109
+ border-color: var(--sw-color-border);
9110
+ box-shadow: none;
9111
+ }
9112
+
9113
+ .sw-stepper .sw-stepper-count:has(> input:disabled) > .sw-stepper-unit {
9114
+ color: var(--sw-color-muted);
9115
+ }
9116
+
9117
+ @media (forced-colors: active) {
9118
+ .sw-stepper-unit { color: CanvasText; }
9119
+ .sw-stepper-invalid .sw-stepper-count { border-color: Mark; }
9120
+ .sw-stepper-changed .sw-stepper-count { border-color: Highlight; box-shadow: inset 0 0 0 1px Highlight; background-image: none; }
9121
+ .sw-stepper .sw-stepper-count:has(> input:disabled) {
9122
+ border-color: GrayText;
9123
+ color: GrayText;
9124
+ -webkit-text-fill-color: GrayText;
9125
+ box-shadow: none;
9126
+ }
9127
+ }
9128
+
7629
9129
  .sw-steps {
7630
9130
  display: flex;
7631
9131
  flex-direction: column;