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