@scalewing/react 1.46.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 (134) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +228 -4
  3. package/dist/app-shell.test-support.d.ts +5 -0
  4. package/dist/app-shell.test-support.js +45 -0
  5. package/dist/command-palette.test-support.d.ts +21 -0
  6. package/dist/command-palette.test-support.js +55 -0
  7. package/dist/components/AppHeader.d.ts +3 -0
  8. package/dist/components/AppShell.d.ts +13 -0
  9. package/dist/components/AppShell.js +65 -0
  10. package/dist/components/Band.d.ts +30 -0
  11. package/dist/components/Band.js +23 -0
  12. package/dist/components/ButtonLink.d.ts +33 -0
  13. package/dist/components/ButtonLink.js +27 -0
  14. package/dist/components/CommandPalette.d.ts +12 -0
  15. package/dist/components/CommandPalette.js +143 -0
  16. package/dist/components/CommandPaletteTrigger.d.ts +9 -0
  17. package/dist/components/CommandPaletteTrigger.js +16 -0
  18. package/dist/components/ContextSwitcher.d.ts +12 -0
  19. package/dist/components/ContextSwitcher.js +62 -0
  20. package/dist/components/FixtureGroup.d.ts +9 -0
  21. package/dist/components/FixtureGroup.js +16 -0
  22. package/dist/components/FixtureRow.d.ts +10 -0
  23. package/dist/components/FixtureRow.js +46 -0
  24. package/dist/components/GlyphTile.d.ts +9 -3
  25. package/dist/components/GlyphTile.js +15 -4
  26. package/dist/components/NavCount.d.ts +12 -5
  27. package/dist/components/NavCount.js +9 -4
  28. package/dist/components/SectionNav.d.ts +2 -1
  29. package/dist/components/SectionNav.js +3 -19
  30. package/dist/components/SiteFooter.d.ts +12 -0
  31. package/dist/components/SiteFooter.js +23 -0
  32. package/dist/components/SiteHeader.d.ts +14 -0
  33. package/dist/components/SiteHeader.js +24 -0
  34. package/dist/components/Skeleton.d.ts +22 -0
  35. package/dist/components/Skeleton.js +30 -0
  36. package/dist/components/app-shell/AppShellBar.d.ts +23 -0
  37. package/dist/components/app-shell/AppShellBar.js +25 -0
  38. package/dist/components/app-shell/AppShellDrawer.d.ts +24 -0
  39. package/dist/components/app-shell/AppShellDrawer.js +17 -0
  40. package/dist/components/app-shell/AppShellLink.d.ts +14 -0
  41. package/dist/components/app-shell/AppShellLink.js +27 -0
  42. package/dist/components/app-shell/AppShellNav.d.ts +15 -0
  43. package/dist/components/app-shell/AppShellNav.js +29 -0
  44. package/dist/components/app-shell/AppShellSidebar.d.ts +18 -0
  45. package/dist/components/app-shell/AppShellSidebar.js +18 -0
  46. package/dist/components/app-shell/types.d.ts +122 -0
  47. package/dist/components/app-shell/types.js +1 -0
  48. package/dist/components/app-shell/validate.d.ts +7 -0
  49. package/dist/components/app-shell/validate.js +70 -0
  50. package/dist/components/command-palette/PaletteList.d.ts +20 -0
  51. package/dist/components/command-palette/PaletteList.js +21 -0
  52. package/dist/components/command-palette/shortcut.d.ts +19 -0
  53. package/dist/components/command-palette/shortcut.js +75 -0
  54. package/dist/components/command-palette/types.d.ts +72 -0
  55. package/dist/components/command-palette/types.js +2 -0
  56. package/dist/components/command-palette/validate.d.ts +10 -0
  57. package/dist/components/command-palette/validate.js +50 -0
  58. package/dist/components/context-switcher/SwitcherOption.d.ts +17 -0
  59. package/dist/components/context-switcher/SwitcherOption.js +20 -0
  60. package/dist/components/context-switcher/SwitcherPopup.d.ts +31 -0
  61. package/dist/components/context-switcher/SwitcherPopup.js +111 -0
  62. package/dist/components/context-switcher/options.d.ts +33 -0
  63. package/dist/components/context-switcher/options.js +60 -0
  64. package/dist/components/context-switcher/types.d.ts +96 -0
  65. package/dist/components/context-switcher/types.js +1 -0
  66. package/dist/components/context-switcher/use-switcher-list.d.ts +29 -0
  67. package/dist/components/context-switcher/use-switcher-list.js +93 -0
  68. package/dist/components/context-switcher/validate.d.ts +8 -0
  69. package/dist/components/context-switcher/validate.js +94 -0
  70. package/dist/components/fixture/fixture-list-context.d.ts +4 -0
  71. package/dist/components/fixture/fixture-list-context.js +9 -0
  72. package/dist/components/fixture/types.d.ts +50 -0
  73. package/dist/components/fixture/types.js +1 -0
  74. package/dist/components/fixture/validate.d.ts +8 -0
  75. package/dist/components/fixture/validate.js +36 -0
  76. package/dist/components/nav-items.d.ts +21 -0
  77. package/dist/components/nav-items.js +26 -0
  78. package/dist/components/site-footer/types.d.ts +31 -0
  79. package/dist/components/site-footer/types.js +1 -0
  80. package/dist/components/site-footer/validate.d.ts +7 -0
  81. package/dist/components/site-footer/validate.js +22 -0
  82. package/dist/components/site-header/SiteHeaderLinks.d.ts +7 -0
  83. package/dist/components/site-header/SiteHeaderLinks.js +7 -0
  84. package/dist/components/site-header/types.d.ts +38 -0
  85. package/dist/components/site-header/types.js +1 -0
  86. package/dist/components/site-header/use-menu-dismiss.d.ts +8 -0
  87. package/dist/components/site-header/use-menu-dismiss.js +62 -0
  88. package/dist/components/site-header/validate.d.ts +7 -0
  89. package/dist/components/site-header/validate.js +17 -0
  90. package/dist/components/use-element-height.d.ts +10 -0
  91. package/dist/components/use-element-height.js +35 -0
  92. package/dist/context-switcher.test-support.d.ts +9 -0
  93. package/dist/context-switcher.test-support.js +41 -0
  94. package/dist/css/css-app-shell-drawer.d.ts +2 -0
  95. package/dist/css/css-app-shell-drawer.js +91 -0
  96. package/dist/css/css-app-shell-nav.d.ts +3 -0
  97. package/dist/css/css-app-shell-nav.js +167 -0
  98. package/dist/css/css-app-shell-page-bar.d.ts +3 -0
  99. package/dist/css/css-app-shell-page-bar.js +81 -0
  100. package/dist/css/css-app-shell.d.ts +4 -0
  101. package/dist/css/css-app-shell.js +155 -0
  102. package/dist/css/css-band.d.ts +10 -0
  103. package/dist/css/css-band.js +101 -0
  104. package/dist/css/css-button-link.d.ts +3 -0
  105. package/dist/css/css-button-link.js +48 -0
  106. package/dist/css/css-command-palette-key.d.ts +1 -0
  107. package/dist/css/css-command-palette-key.js +33 -0
  108. package/dist/css/css-command-palette-trigger.d.ts +2 -0
  109. package/dist/css/css-command-palette-trigger.js +88 -0
  110. package/dist/css/css-command-palette.d.ts +2 -0
  111. package/dist/css/css-command-palette.js +209 -0
  112. package/dist/css/css-components.js +27 -0
  113. package/dist/css/css-context-switcher-trigger.d.ts +15 -0
  114. package/dist/css/css-context-switcher-trigger.js +175 -0
  115. package/dist/css/css-context-switcher.d.ts +4 -0
  116. package/dist/css/css-context-switcher.js +219 -0
  117. package/dist/css/css-count-pill.d.ts +7 -0
  118. package/dist/css/css-count-pill.js +50 -12
  119. package/dist/css/css-fixture.d.ts +5 -0
  120. package/dist/css/css-fixture.js +260 -0
  121. package/dist/css/css-glyph-tile.d.ts +2 -0
  122. package/dist/css/css-glyph-tile.js +29 -1
  123. package/dist/css/css-site-footer.d.ts +2 -0
  124. package/dist/css/css-site-footer.js +152 -0
  125. package/dist/css/css-site-header.d.ts +2 -0
  126. package/dist/css/css-site-header.js +262 -0
  127. package/dist/css/css-skeleton.d.ts +10 -0
  128. package/dist/css/css-skeleton.js +110 -0
  129. package/dist/css/stacking.js +7 -4
  130. package/dist/css/stylesheet.js +18 -0
  131. package/dist/index.d.ts +14 -0
  132. package/dist/index.js +11 -0
  133. package/dist/styles.css +2122 -512
  134. 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);
@@ -3582,7 +3814,9 @@ body {
3582
3814
  }
3583
3815
 
3584
3816
  [data-theme] .sw-section-nav-count,
3585
- [data-theme] .sw-nav-count {
3817
+ [data-theme] .sw-nav-count,
3818
+ [data-theme] .sw-app-shell-count,
3819
+ [data-theme] .sw-context-switcher-count {
3586
3820
  align-items: center;
3587
3821
  background: var(--sw-color-danger);
3588
3822
  border-radius: var(--sw-radius-pill);
@@ -3601,16 +3835,30 @@ body {
3601
3835
  }
3602
3836
 
3603
3837
  /*
3604
- * NavCount's `tone="accent"`: a count that is news, not work waiting (what
3605
- * was added since the person last looked), is the accent fill with its
3606
- * on-colour figures (4.5:1 in every palette, as a primary Button's label).
3607
- * One class more specific than the pill, so it wins in any order.
3838
+ * `tone="accent"` (NavCount, an AppShell item's `countTone`): a count that
3839
+ * is news, not work waiting (what was added since the person last looked),
3840
+ * is the accent fill with its on-colour figures (4.5:1 in every palette, as
3841
+ * a primary Button's label). `tone="warning"`: work that needs the person
3842
+ * but is not urgent is amber, the warning tint with the warning ink (a
3843
+ * warning Notice's, 4.5:1 on the tint in every palette) inside the warning
3844
+ * edge a warning Badge draws. One class more specific than the pill, so
3845
+ * each wins in any order.
3608
3846
  */
3609
- [data-theme] .sw-nav-count.sw-nav-count-accent {
3847
+ [data-theme] .sw-nav-count.sw-nav-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 {
3610
3850
  background: var(--sw-color-accent);
3611
3851
  color: var(--sw-color-onAccent);
3612
3852
  }
3613
3853
 
3854
+ [data-theme] .sw-nav-count.sw-nav-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 {
3857
+ background: color-mix(in srgb, var(--sw-color-warning) 10%, var(--sw-color-surface));
3858
+ border: 1px solid var(--sw-color-warning);
3859
+ color: color-mix(in srgb, var(--sw-color-warning) 70%, var(--sw-color-text));
3860
+ }
3861
+
3614
3862
  /*
3615
3863
  * A Nav link holding a count lays out as SectionNav's link does: the words
3616
3864
  * and the pill centred on one line a space-2 apart (the space text node
@@ -3628,7 +3876,9 @@ body {
3628
3876
 
3629
3877
  @media (forced-colors: active) {
3630
3878
  [data-theme] .sw-section-nav-count,
3631
- [data-theme] .sw-nav-count { border: 1px solid CanvasText; }
3879
+ [data-theme] .sw-nav-count,
3880
+ [data-theme] .sw-app-shell-count,
3881
+ [data-theme] .sw-context-switcher-count { border: 1px solid CanvasText; }
3632
3882
  }
3633
3883
 
3634
3884
  .sw-bar-chart {
@@ -4292,394 +4542,1556 @@ body {
4292
4542
  [data-theme] .sw-section-nav-link[aria-current] { border-color: Highlight; color: CanvasText; }
4293
4543
  }
4294
4544
 
4295
- .sw-dialog {
4296
- background: var(--sw-glass-fill);
4297
- border: 1px solid var(--sw-glass-border);
4298
- border-radius: var(--sw-radius-lg);
4299
- box-shadow: inset 0 1px 0 var(--sw-glass-specular);
4300
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4301
- -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4545
+ .sw-band {
4302
4546
  box-sizing: border-box;
4303
- color: var(--sw-color-text);
4304
- margin: auto;
4305
- max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
4306
- max-width: min(var(--sw-dialog-max), calc(100vw - var(--sw-space-8)));
4307
- overflow: auto;
4308
- width: calc(100% - var(--sw-space-8));
4547
+ width: 100%;
4309
4548
  }
4310
4549
 
4311
- .sw-dialog-lg {
4312
- max-width: min(var(--sw-dialog-max-lg), calc(100vw - var(--sw-space-8)));
4550
+ .sw-band-surface {
4551
+ background: var(--sw-color-surface);
4552
+ color: var(--sw-color-text);
4313
4553
  }
4314
4554
 
4315
- .sw-dialog-xl {
4316
- max-width: min(var(--sw-dialog-max-xl), calc(100vw - var(--sw-space-8)));
4555
+ .sw-band-subtle {
4556
+ background: var(--sw-color-subtle);
4557
+ color: var(--sw-color-text);
4317
4558
  }
4318
4559
 
4319
- @media not all and (min-width: 48rem) {
4320
- .sw-dialog-sheet-below-md {
4321
- border-radius: var(--sw-radius-lg) var(--sw-radius-lg) 0 0;
4322
- border-width: 1px 0 0;
4323
- margin: auto 0 0;
4324
- max-height: min(100vh - var(--sw-space-8), 100dvh - var(--sw-space-8));
4325
- max-width: none;
4326
- padding-bottom: calc(var(--sw-space-5) + env(safe-area-inset-bottom, 0px));
4327
- padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
4328
- padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
4329
- width: 100%;
4330
- }
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);
4571
+ }
4331
4572
 
4332
- .sw-dialog-sheet-below-md[open] {
4333
- animation: sw-dialog-sheet-in var(--sw-motion-default) var(--sw-motion-easing);
4334
- }
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;
4578
+ }
4335
4579
 
4336
- .sw-dialog-sheet-below-md .sw-dialog-footer {
4337
- bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
4338
- margin-bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
4339
- padding-bottom: calc(var(--sw-space-3) + env(safe-area-inset-bottom, 0px));
4340
- }
4580
+ [data-theme] .sw-band-inverse a:not(.sw-button):hover {
4581
+ text-decoration-color: currentColor;
4341
4582
  }
4342
4583
 
4343
- @keyframes sw-dialog-sheet-in {
4344
- from { translate: 0 100%; }
4584
+ .sw-band-inner {
4585
+ box-sizing: border-box;
4586
+ margin-inline: auto;
4587
+ padding-inline: var(--sw-space-4);
4588
+ width: 100%;
4345
4589
  }
4346
4590
 
4347
- @media (prefers-reduced-motion: reduce) {
4348
- .sw-dialog-sheet-below-md[open] { animation: 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); }
4349
4597
  }
4350
4598
 
4351
- .sw-dialog::backdrop {
4352
- background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
4599
+ @media (forced-colors: active) {
4600
+ .sw-band-inverse { border-block: 1px solid CanvasText; }
4353
4601
  }
4354
4602
 
4355
- .sw-dialog:focus-visible {
4356
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4357
- outline-offset: var(--sw-focus-ring-offset);
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));
4358
4607
  }
4359
4608
 
4360
- .sw-dialog-header {
4361
- align-items: flex-start;
4609
+ .sw-site-footer-brand {
4362
4610
  display: flex;
4363
- gap: var(--sw-space-2);
4611
+ flex-direction: column;
4612
+ gap: var(--sw-space-3);
4613
+ grid-column: 1 / -1;
4614
+ max-width: 20rem;
4364
4615
  }
4365
4616
 
4366
- .sw-dialog-header > :is(h2, h3),
4367
- .sw-dialog-titles {
4368
- flex: 1 1 auto;
4369
- min-width: 0;
4617
+ .sw-site-footer-brand > :first-child {
4618
+ align-self: flex-start;
4370
4619
  }
4371
4620
 
4372
- .sw-button.sw-dialog-close {
4373
- flex: none;
4374
- padding-inline: 0;
4375
- min-width: var(--sw-control-sm-min-height);
4376
- margin-block: calc((28px - var(--sw-control-sm-min-height)) / 2);
4377
- margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-sm-min-height)) / 2);
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;
4378
4628
  }
4379
4629
 
4380
- @media (pointer: coarse) {
4381
- .sw-button.sw-dialog-close {
4382
- min-height: var(--sw-control-md-min-height);
4383
- min-width: var(--sw-control-md-min-height);
4384
- margin-block: calc((28px - var(--sw-control-md-min-height)) / 2);
4385
- margin-inline-end: calc((var(--sw-space-4) - var(--sw-control-md-min-height)) / 2);
4386
- }
4630
+ .sw-site-footer-group {
4631
+ display: flex;
4632
+ flex-direction: column;
4633
+ gap: var(--sw-space-3);
4634
+ min-width: 0;
4387
4635
  }
4388
4636
 
4389
- /* Private control chrome: two strokes crossed in a space-4 square, in the
4390
- button's color; borders, so forced colors keep them. */
4391
- .sw-dialog-close-glyph {
4392
- flex: none;
4393
- height: var(--sw-space-4);
4394
- position: relative;
4395
- width: var(--sw-space-4);
4637
+ .sw-site-footer-label {
4638
+ color: var(--sw-color-text);
4639
+ margin: 0;
4640
+ font-size: 13px;
4641
+ font-weight: 600;
4642
+ letter-spacing: -0.08px;
4643
+ line-height: 18px;
4396
4644
  }
4397
4645
 
4398
- .sw-dialog-close-glyph::before,
4399
- .sw-dialog-close-glyph::after {
4400
- border-top: 2px solid currentColor;
4401
- border-radius: 1px;
4402
- box-sizing: border-box;
4403
- content: '';
4404
- left: 0;
4405
- margin-top: -1px;
4406
- position: absolute;
4407
- top: 50%;
4408
- width: 100%;
4646
+ .sw-site-footer-links {
4647
+ display: flex;
4648
+ flex-direction: column;
4649
+ gap: var(--sw-space-2);
4650
+ list-style: none;
4651
+ margin: 0;
4652
+ padding: 0;
4409
4653
  }
4410
4654
 
4411
- .sw-dialog-close-glyph::before { transform: rotate(45deg); }
4412
- .sw-dialog-close-glyph::after { transform: rotate(-45deg); }
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;
4664
+ }
4413
4665
 
4414
- .sw-dialog-header-framed {
4666
+ [data-theme] .sw-band-inverse a.sw-site-footer-link:is(:hover, :focus-visible) {
4667
+ color: var(--sw-color-text);
4668
+ text-decoration-color: currentColor;
4669
+ }
4670
+
4671
+ [data-theme] .sw-band-inverse a.sw-site-footer-link[aria-current='page'] {
4672
+ color: var(--sw-color-text);
4673
+ font-weight: 600;
4674
+ }
4675
+
4676
+ .sw-site-footer-bottom {
4415
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;
4416
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;
4417
4690
  }
4418
4691
 
4419
- .sw-dialog-icon {
4420
- display: inline-flex;
4421
- flex: none;
4692
+ .sw-site-footer-end {
4693
+ margin-inline-start: auto;
4422
4694
  }
4423
4695
 
4424
- .sw-dialog-description { margin: 0; }
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
+ }
4703
+ }
4425
4704
 
4426
- .sw-dialog-footer {
4427
- align-items: center;
4705
+ @media (pointer: coarse) {
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
+ }
4710
+
4711
+ .sw-site-footer-links {
4712
+ gap: 0;
4713
+ }
4714
+ }
4715
+
4716
+ @media (forced-colors: active) {
4717
+ [data-theme] .sw-band-inverse a.sw-site-footer-link {
4718
+ color: LinkText;
4719
+ }
4720
+
4721
+ .sw-site-footer-bottom {
4722
+ border-top-color: CanvasText;
4723
+ }
4724
+ }
4725
+
4726
+ .sw-site-header {
4727
+ --sw-site-header-height: calc(var(--sw-control-md-min-height) + var(--sw-space-3));
4428
4728
  background: var(--sw-color-surface);
4429
- border-top: 1px solid var(--sw-color-border);
4430
- /* Sticky insets count from the scrollport's padding edge: step past the
4431
- dialog's own padding to sit on its bottom edge. */
4432
- bottom: calc(-1 * var(--sw-space-5));
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
+ }
4734
+
4735
+ .sw-site-header-sticky {
4736
+ position: sticky;
4737
+ top: 0;
4738
+ z-index: 5;
4739
+ }
4740
+
4741
+ .sw-site-header-bar {
4742
+ align-items: center;
4433
4743
  box-sizing: border-box;
4434
4744
  display: flex;
4435
- flex-wrap: wrap;
4436
- gap: var(--sw-space-2) var(--sw-space-4);
4437
- margin: 0 calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5));
4438
- padding: var(--sw-space-3) var(--sw-space-5);
4439
- position: sticky;
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);
4440
4751
  }
4441
4752
 
4442
- .sw-dialog-footer-status {
4753
+ .sw-site-header-brand {
4443
4754
  align-items: center;
4444
- column-gap: var(--sw-space-2);
4445
4755
  display: flex;
4446
- flex: 1 1 auto;
4447
- flex-wrap: wrap;
4448
- min-width: 0;
4756
+ flex: none;
4449
4757
  }
4450
4758
 
4451
- /* The status line: muted caption words beside the actions. Its children
4452
- sit on one row and wrap as one phrase. */
4453
- .sw-dialog-footer-note {
4454
- color: var(--sw-color-muted);
4455
- font-family: var(--sw-font-sans);
4456
- font-size: 13px;
4457
- line-height: 18px;
4458
- min-width: 0;
4459
- overflow-wrap: anywhere;
4759
+ .sw-site-header-nav,
4760
+ .sw-site-header-actions {
4761
+ display: none;
4460
4762
  }
4461
4763
 
4462
- /* With no figure and no status line the live region stays in the
4463
- dialog, so a first figure is still announced, but it takes no room in
4464
- the footer. */
4465
- .sw-dialog-footer-status:empty {
4466
- clip-path: inset(50%);
4467
- height: 1px;
4468
- overflow: hidden;
4469
- position: absolute;
4470
- width: 1px;
4764
+ .sw-site-header-compact {
4765
+ align-items: center;
4766
+ display: flex;
4767
+ gap: var(--sw-space-1);
4471
4768
  }
4472
4769
 
4473
- .sw-dialog-footer-actions {
4770
+ .sw-site-header-list {
4771
+ list-style: none;
4772
+ margin: 0;
4773
+ padding: 0;
4774
+ }
4775
+
4776
+ .sw-site-header-nav .sw-site-header-list {
4474
4777
  display: flex;
4475
- flex: 0 1 auto;
4476
- flex-wrap: wrap;
4477
- gap: var(--sw-space-2);
4478
- justify-content: flex-end;
4479
- margin-inline-start: auto;
4778
+ gap: var(--sw-space-5);
4480
4779
  }
4481
4780
 
4482
- @media (forced-colors: active) {
4483
- .sw-dialog-footer { border-top-color: CanvasText; }
4781
+ [data-theme] .sw-site-header-nav .sw-site-header-link {
4782
+ align-items: center;
4783
+ color: var(--sw-color-text);
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;
4484
4791
  }
4485
4792
 
4486
- .sw-dialog-banded {
4487
- backdrop-filter: none;
4488
- -webkit-backdrop-filter: none;
4489
- background: var(--sw-color-surface);
4490
- border-color: transparent;
4491
- box-shadow: var(--sw-elevation-md);
4793
+ [data-theme] .sw-site-header-nav .sw-site-header-link:hover {
4794
+ box-shadow: inset 0 -2px 0 var(--sw-color-border);
4492
4795
  }
4493
4796
 
4494
- .sw-dialog-banded .sw-dialog-header {
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;
4800
+ }
4801
+
4802
+ [data-theme] .sw-site-header-nav .sw-site-header-link:focus-visible {
4803
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4804
+ }
4805
+
4806
+ .sw-site-header-actions {
4495
4807
  align-items: center;
4496
- background: var(--sw-color-surface);
4497
- border-bottom: 1px solid var(--sw-color-border);
4498
- margin: calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5)) 0;
4499
- padding: var(--sw-space-4) var(--sw-space-5);
4500
- position: sticky;
4501
- top: calc(-1 * var(--sw-space-5));
4502
- z-index: 5;
4808
+ gap: var(--sw-space-4);
4503
4809
  }
4504
4810
 
4505
- @media not all and (min-width: 48rem) {
4506
- .sw-dialog-sheet-below-md.sw-dialog-banded .sw-dialog-header {
4507
- margin-left: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-left, 0px)));
4508
- margin-right: calc(-1 * max(var(--sw-space-5), env(safe-area-inset-right, 0px)));
4509
- padding-left: max(var(--sw-space-5), env(safe-area-inset-left, 0px));
4510
- padding-right: max(var(--sw-space-5), env(safe-area-inset-right, 0px));
4511
- }
4811
+ @media (min-width: 48rem) {
4812
+ .sw-site-header-bar { padding-inline: var(--sw-space-5); }
4512
4813
  }
4513
4814
 
4514
- .sw-dialog-banded .sw-button.sw-dialog-close {
4515
- background: color-mix(in srgb, var(--sw-color-muted) 16%, 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; }
4820
+ }
4821
+
4822
+ .sw-site-header-menu > summary {
4823
+ list-style: none;
4824
+ }
4825
+
4826
+ .sw-site-header-menu > summary::-webkit-details-marker {
4827
+ display: none;
4828
+ }
4829
+
4830
+ .sw-site-header-menu-button {
4831
+ align-items: center;
4516
4832
  border-radius: var(--sw-radius-pill);
4833
+ box-sizing: border-box;
4517
4834
  color: var(--sw-color-text);
4518
- margin: 0;
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);
4519
4840
  }
4520
4841
 
4521
- @media (hover: hover) {
4522
- .sw-dialog-banded .sw-button.sw-dialog-close:hover {
4523
- background: color-mix(in srgb, var(--sw-color-muted) 24%, transparent);
4524
- }
4842
+ .sw-site-header-menu-button:hover {
4843
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
4844
+ }
4845
+
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));
4849
+ }
4850
+
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;
4856
+ }
4857
+
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;
4861
+ }
4862
+
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);
4525
4874
  }
4526
4875
 
4876
+ .sw-site-header-menu-nav .sw-site-header-list {
4877
+ display: flex;
4878
+ flex-direction: column;
4879
+ }
4880
+
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
+ }
4893
+
4894
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link[aria-current] {
4895
+ color: var(--sw-color-accent);
4896
+ }
4897
+
4898
+ [data-theme] .sw-site-header-menu-nav .sw-site-header-link:focus-visible {
4899
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4900
+ }
4901
+
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);
4908
+ }
4909
+
4910
+ /*
4911
+ * Forced colours drop box shadows, so the current destination's bar is a
4912
+ * thick underline there.
4913
+ */
4527
4914
  @media (forced-colors: active) {
4528
- .sw-dialog-banded { border-color: CanvasText; }
4529
- .sw-dialog-banded .sw-dialog-header { border-bottom-color: CanvasText; }
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
+ }
4933
+ }
4934
+
4935
+ .sw-app-shell {
4936
+ min-height: 100vh;
4937
+ min-height: 100dvh;
4938
+ }
4939
+
4940
+ .sw-app-shell-bar {
4941
+ align-items: center;
4942
+ display: flex;
4943
+ gap: var(--sw-space-2);
4944
+ }
4945
+
4946
+ .sw-app-shell-bar-title {
4947
+ flex: 1 1 auto;
4948
+ min-width: 0;
4949
+ }
4950
+
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 {
4959
+ flex: none;
4960
+ padding-inline: 0;
4961
+ }
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
+
4967
+ @media (pointer: coarse) {
4968
+ .sw-button.sw-app-shell-menu {
4969
+ min-height: var(--sw-control-md-min-height);
4970
+ min-width: var(--sw-control-md-min-height);
4971
+ }
4972
+ }
4973
+
4974
+ .sw-app-shell-main {
4975
+ display: block;
4976
+ min-width: 0;
4977
+ }
4978
+
4979
+ .sw-app-shell-sidebar,
4980
+ .sw-app-shell-sidebar .sw-app-shell-rail-slot {
4981
+ display: none;
4982
+ }
4983
+
4984
+ .sw-app-shell-header,
4985
+ .sw-app-shell-footer {
4986
+ flex: none;
4987
+ padding: var(--sw-space-3);
4988
+ }
4989
+
4990
+ .sw-app-shell-footer {
4991
+ border-top: 1px solid var(--sw-color-border);
4992
+ }
4993
+
4994
+ .sw-app-shell-nav {
4995
+ box-sizing: border-box;
4996
+ display: flex;
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);
5004
+ }
5005
+
5006
+ .sw-app-shell-group {
5007
+ display: flex;
5008
+ flex-direction: column;
5009
+ gap: var(--sw-space-1);
5010
+ }
5011
+
5012
+ .sw-app-shell-group-label {
5013
+ color: var(--sw-color-muted);
5014
+ font-family: var(--sw-font-sans);
5015
+ font-size: 13px;
5016
+ font-weight: 600;
5017
+ letter-spacing: -0.08px;
5018
+ line-height: 18px;
5019
+ margin: 0;
5020
+ padding-inline: var(--sw-space-2);
5021
+ }
5022
+
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;
5030
+ }
5031
+
5032
+ .sw-app-shell-item > .sw-tooltip-anchor {
5033
+ display: flex;
5034
+ }
5035
+
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;
5053
+ }
5054
+
5055
+ [data-theme] .sw-app-shell-link:hover {
5056
+ background: color-mix(in srgb, var(--sw-color-muted) 12%, transparent);
5057
+ }
5058
+
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 {
5094
+ align-items: center;
5095
+ background: var(--sw-color-surface);
5096
+ border-bottom: 1px solid var(--sw-color-border);
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);
5103
+ position: sticky;
5104
+ top: var(--sw-app-shell-bar-height, calc(var(--sw-control-sm-min-height) + 2 * var(--sw-space-2) + 1px));
5105
+ z-index: 5;
5106
+ }
5107
+
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%;
4530
5896
  }
4531
5897
 
4532
- .sw-dialog.sw-dialog-canvas-grouped {
4533
- backdrop-filter: none;
4534
- -webkit-backdrop-filter: none;
4535
- background: var(--sw-canvas-grouped);
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);
4536
5901
  }
4537
5902
 
4538
- .sw-dialog-grabber { display: none; }
5903
+ .sw-action-menu-item:disabled {
5904
+ cursor: not-allowed;
5905
+ opacity: 0.5;
5906
+ }
4539
5907
 
4540
- @media not all and (min-width: 48rem) {
4541
- .sw-dialog-sheet-below-md .sw-dialog-grabber {
4542
- background: color-mix(in srgb, var(--sw-color-muted) 40%, transparent);
4543
- border-radius: var(--sw-radius-pill);
4544
- display: block;
4545
- height: var(--sw-space-1);
4546
- margin: calc(var(--sw-space-2) - var(--sw-space-5)) auto var(--sw-space-3);
4547
- position: sticky;
4548
- top: calc(var(--sw-space-2) - var(--sw-space-5));
4549
- width: var(--sw-space-6);
4550
- z-index: 6;
4551
- }
5908
+ .sw-action-menu-item-danger {
5909
+ color: var(--sw-color-danger);
5910
+ }
4552
5911
 
4553
- .sw-dialog-sheet-below-md.sw-dialog-banded.sw-dialog-has-grabber .sw-dialog-header {
4554
- padding-top: var(--sw-space-5);
4555
- }
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
+ }
4556
5928
 
4557
- @media (forced-colors: active) {
4558
- .sw-dialog-sheet-below-md .sw-dialog-grabber { background: CanvasText; forced-color-adjust: none; }
4559
- }
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);
4560
5937
  }
4561
5938
 
4562
- .sw-accordion {
4563
- background: var(--sw-glass-fill);
4564
- border: 1px solid var(--sw-glass-border);
4565
- border-radius: var(--sw-radius-lg);
4566
- box-shadow: inset 0 1px 0 var(--sw-glass-specular);
4567
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4568
- -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4569
- color: var(--sw-color-text);
5939
+ .sw-action-menu-chevron:dir(rtl) {
5940
+ transform: rotate(135deg);
4570
5941
  }
4571
5942
 
4572
- /* A nested disclosure sits inside a larger surface, so its corners are smaller. */
4573
- .sw-accordion-sm { border-radius: var(--sw-radius-md); }
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);
5947
+ }
4574
5948
 
4575
- .sw-accordion-summary {
4576
- align-items: center;
4577
- box-sizing: border-box;
4578
- cursor: pointer;
4579
- display: flex;
4580
- gap: var(--sw-space-3);
4581
- list-style: none;
4582
- min-height: var(--sw-control-md-min-height);
5949
+ @media (forced-colors: active) {
5950
+ .sw-action-menu-chevron { border-color: CanvasText; }
4583
5951
  }
4584
5952
 
4585
- /* A nested header is an sm control, still a comfortable pointer and touch target. */
4586
- .sw-accordion-sm > .sw-accordion-summary { min-height: var(--sw-control-sm-min-height); }
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);
5958
+ }
4587
5959
 
4588
- .sw-accordion-heading {
4589
- display: flex;
4590
- flex: 1 1 auto;
4591
- flex-direction: column;
4592
- min-width: 0;
5960
+ .sw-action-menu-item {
5961
+ min-height: var(--sw-control-md-min-height);
5962
+ }
4593
5963
  }
4594
5964
 
4595
- .sw-accordion-summary:focus-visible {
4596
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4597
- outline-offset: var(--sw-focus-ring-offset);
5965
+ .sw-action-menu-trigger.sw-action-menu-trigger-text {
5966
+ align-items: center;
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);
4598
5978
  }
4599
5979
 
4600
- /* A token chevron replaces the user-agent triangle: it points to the inline end when closed and down when open. */
4601
- .sw-accordion-summary::-webkit-details-marker { display: none; }
4602
-
4603
- .sw-accordion-marker {
5980
+ .sw-action-menu-trigger.sw-action-menu-trigger-text::after {
4604
5981
  border-bottom: 2px solid var(--sw-color-muted);
4605
5982
  border-right: 2px solid var(--sw-color-muted);
4606
5983
  box-sizing: border-box;
4607
5984
  height: var(--sw-space-2);
4608
5985
  width: var(--sw-space-2);
5986
+ content: '';
4609
5987
  flex: none;
4610
- margin-inline-end: var(--sw-space-1);
4611
- transform: rotate(-45deg);
4612
- transition: transform var(--sw-motion-default) var(--sw-motion-easing);
5988
+ transform: translateY(-25%) rotate(45deg);
4613
5989
  }
4614
5990
 
4615
- .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
+ }
4616
5994
 
4617
- .sw-accordion[open] > .sw-accordion-summary .sw-accordion-marker {
4618
- 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
+ }
4619
5999
  }
4620
6000
 
4621
- @media (prefers-reduced-motion: reduce) {
4622
- .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); }
4623
6003
  }
4624
6004
 
4625
6005
  @media (forced-colors: active) {
4626
- .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; }
4627
6008
  }
4628
6009
 
4629
- .sw-select {
4630
- max-width: 100%;
4631
- 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;
4632
6021
  }
4633
6022
 
4634
- /*
4635
- * width="full": the field and its trigger fill the container's inline size.
4636
- * The value still takes the free space and ellipsizes, and the chevron stays
4637
- * last, at the inline end. In an Inline row the field takes only the space
4638
- * its siblings leave, so a Button beside it keeps its label on one line.
4639
- */
4640
- .sw-select-full {
4641
- 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);
4642
6026
  }
4643
6027
 
4644
- .sw-inline > .sw-select-full {
4645
- flex: 1 1 0;
4646
- 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
+ }
4647
6033
  }
4648
6034
 
4649
- .sw-select-full .sw-select-trigger {
4650
- 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
+ }
4651
6040
  }
4652
6041
 
4653
- .sw-select-control {
4654
- 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; }
4655
6045
  }
4656
6046
 
4657
- .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 {
4658
6058
  align-items: center;
4659
6059
  appearance: none;
4660
- -webkit-appearance: none;
4661
- background-color: var(--sw-glass-fill);
4662
- border: 1px solid var(--sw-color-border);
6060
+ background: transparent;
6061
+ border: 1px solid transparent;
4663
6062
  border-radius: var(--sw-radius-sm);
4664
6063
  box-sizing: border-box;
4665
6064
  color: var(--sw-color-text);
4666
6065
  cursor: pointer;
4667
6066
  display: inline-flex;
4668
- font-family: inherit;
4669
- font-size: inherit;
4670
- gap: var(--sw-space-3);
4671
- letter-spacing: inherit;
4672
- 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;
4673
6073
  margin: 0;
4674
6074
  max-width: 100%;
4675
- min-height: var(--sw-control-md-min-height);
4676
- padding-block: 0;
4677
- 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);
4678
6078
  text-align: start;
4679
6079
  }
4680
6080
 
4681
- /* The chevron Accordion uses, pointing down, centred on the text. */
4682
- .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 {
4683
6095
  border-bottom: 2px solid var(--sw-color-muted);
4684
6096
  border-right: 2px solid var(--sw-color-muted);
4685
6097
  box-sizing: border-box;
@@ -4690,66 +6102,77 @@ body {
4690
6102
  transform: translateY(-25%) rotate(45deg);
4691
6103
  }
4692
6104
 
4693
- /*
4694
- * The current label and a hidden copy of every option's label share one grid
4695
- * cell, so the trigger is as wide as the longest option and keeps that width
4696
- * when the value changes; past the available width the label ellipsizes.
4697
- */
4698
- .sw-select-value {
4699
- display: grid;
4700
- flex: 1 1 auto;
4701
- min-width: 0;
6105
+ .sw-context-switcher-trigger[aria-expanded='true'] {
6106
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
6107
+ }
6108
+
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); }
4702
6122
  }
4703
6123
 
4704
- .sw-select-value > * {
4705
- grid-area: 1 / 1;
4706
- min-width: 0;
4707
- overflow: hidden;
4708
- text-overflow: ellipsis;
4709
- white-space: nowrap;
6124
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-framed {
6125
+ background: var(--sw-glass-fill);
6126
+ border-color: var(--sw-color-border);
4710
6127
  }
4711
6128
 
4712
- .sw-select-value-sizer {
4713
- 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;
4714
6134
  }
4715
6135
 
4716
- .sw-select-placeholder {
4717
- 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);
4718
6139
  }
4719
6140
 
4720
- .sw-select-invalid .sw-select-trigger {
4721
- 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
+ }
4722
6146
  }
4723
6147
 
4724
- .sw-select-value-sizer::before {
4725
- 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;
4726
6154
  }
4727
6155
 
4728
- .sw-select-trigger:focus {
4729
- box-shadow: none;
4730
- outline: none;
6156
+ .sw-context-switcher-trigger.sw-context-switcher-trigger-icon .sw-context-switcher-trigger-content {
6157
+ flex: none;
6158
+ justify-content: center;
4731
6159
  }
4732
6160
 
4733
- .sw-select-trigger:focus-visible {
4734
- outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4735
- 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);
4736
6163
  }
4737
6164
 
4738
- .sw-select-xs .sw-select-trigger {
4739
- font-size: 13px;
4740
- gap: var(--sw-space-2);
4741
- letter-spacing: -0.08px;
4742
- line-height: 18px;
4743
- min-height: var(--sw-control-xs-min-height);
4744
- 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); }
4745
6167
  }
4746
6168
 
4747
6169
  @media (forced-colors: active) {
4748
- .sw-select-trigger::after { border-color: CanvasText; }
4749
- .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; }
4750
6173
  }
4751
6174
 
4752
- .sw-select-list {
6175
+ .sw-context-switcher-popup {
4753
6176
  background: var(--sw-glass-fill);
4754
6177
  border: 1px solid var(--sw-glass-border);
4755
6178
  border-radius: var(--sw-radius-sm);
@@ -4758,304 +6181,390 @@ body {
4758
6181
  -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4759
6182
  box-sizing: border-box;
4760
6183
  color: var(--sw-color-text);
4761
- inset-inline-start: 0;
4762
- margin: var(--sw-space-1) 0 0;
4763
- max-height: var(--sw-select-max);
4764
- max-width: var(--sw-dialog-max);
4765
- min-width: 100%;
4766
- 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)));
4767
6192
  padding: var(--sw-space-1);
4768
- position: absolute;
6193
+ position: fixed;
4769
6194
  width: max-content;
4770
6195
  z-index: 10;
4771
6196
  }
4772
6197
 
4773
- /*
4774
- * A full-width field's open list is exactly the trigger's width (min-width
4775
- * already beats the dialog-max cap), so it never runs past a phone's edge;
4776
- * a long option wraps inside it, even a single long word.
4777
- */
4778
- .sw-select-full .sw-select-list {
4779
- width: 100%;
4780
- }
4781
-
4782
- .sw-select-option {
4783
- border-radius: var(--sw-radius-sm);
6198
+ .sw-context-switcher-filter {
4784
6199
  box-sizing: border-box;
4785
- cursor: pointer;
4786
- display: flex;
4787
- align-items: center;
4788
- min-height: var(--sw-control-xs-min-height);
4789
- 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));
4790
6203
  }
4791
6204
 
4792
- .sw-select-full .sw-select-option {
4793
- 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;
4794
6211
  }
4795
6212
 
4796
- .sw-select-option[aria-selected='true'] {
4797
- font-weight: 600;
6213
+ .sw-context-switcher-list:focus {
6214
+ outline: none;
4798
6215
  }
4799
6216
 
4800
- .sw-select-option[data-active='true'] {
4801
- 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);
4802
6225
  }
4803
6226
 
4804
- .sw-select-xs .sw-select-option {
6227
+ .sw-context-switcher-empty {
6228
+ color: var(--sw-color-muted);
6229
+ font-family: var(--sw-font-sans);
4805
6230
  font-size: 13px;
4806
6231
  letter-spacing: -0.08px;
4807
6232
  line-height: 18px;
6233
+ margin: 0;
6234
+ padding: var(--sw-space-2);
4808
6235
  }
4809
6236
 
4810
- .sw-select-action {
6237
+ .sw-context-switcher-footer {
4811
6238
  border-top: 1px solid var(--sw-color-border);
4812
- color: var(--sw-color-accent);
4813
- 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);
4814
6244
  }
4815
6245
 
4816
- .sw-action-menu {
6246
+ .sw-context-switcher-action-icon {
4817
6247
  display: inline-flex;
4818
- position: relative;
6248
+ flex: none;
4819
6249
  }
4820
6250
 
4821
- .sw-action-menu-trigger {
4822
- appearance: none;
4823
- background: var(--sw-glass-fill);
4824
- border: 1px solid var(--sw-color-border);
6251
+ .sw-context-switcher-option {
6252
+ align-items: center;
4825
6253
  border-radius: var(--sw-radius-sm);
4826
- color: var(--sw-color-text);
6254
+ box-sizing: border-box;
4827
6255
  cursor: pointer;
4828
- font: inherit;
4829
- min-height: var(--sw-control-xs-min-height);
4830
- 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);
4831
6265
  }
4832
6266
 
4833
- .sw-action-menu-trigger:focus-visible,
4834
- .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'] {
4835
6277
  outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4836
- outline-offset: var(--sw-focus-ring-offset);
6278
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4837
6279
  }
4838
6280
 
4839
- .sw-action-menu-trigger:disabled {
4840
- cursor: not-allowed;
4841
- opacity: 0.5;
6281
+ .sw-context-switcher-icon {
6282
+ display: inline-flex;
6283
+ flex: none;
4842
6284
  }
4843
6285
 
4844
- .sw-action-menu-list {
4845
- background: var(--sw-glass-fill);
4846
- border: 1px solid var(--sw-glass-border);
4847
- border-radius: var(--sw-radius-sm);
4848
- box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
4849
- backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
4850
- -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);
4851
6311
  box-sizing: border-box;
4852
- color: var(--sw-color-text);
4853
- /* The popover layer's inset: 0 would ignore the placed left in right-to-left. */
4854
- inset: auto;
4855
- margin: 0;
4856
- max-height: var(--sw-select-max);
4857
- /* On the top layer 100% is the viewport without a classic scrollbar. */
4858
- max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
4859
- /* Never narrower than a touch target. */
4860
- min-width: var(--sw-control-md-min-height);
4861
- overflow: auto;
4862
- padding: var(--sw-space-1);
4863
- position: fixed;
4864
- /* As wide as its longest command, until max-width wraps it. */
4865
- width: max-content;
4866
- 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);
4867
6317
  }
4868
6318
 
4869
- /* Each child of the header is a line of its own: a name, then a role. */
4870
- .sw-action-menu-header {
4871
- 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;
4872
6339
  color: var(--sw-color-muted);
4873
- display: flex;
4874
- flex-direction: column;
4875
- gap: var(--sw-space-1);
6340
+ display: inline-flex;
6341
+ flex: none;
4876
6342
  font-family: var(--sw-font-sans);
4877
6343
  font-size: 13px;
6344
+ font-variant-numeric: tabular-nums;
6345
+ font-weight: 500;
6346
+ justify-content: center;
4878
6347
  letter-spacing: -0.08px;
4879
6348
  line-height: 18px;
4880
- margin-bottom: var(--sw-space-1);
4881
- /* The commands' inline padding, so the header's words line up with theirs. */
4882
- 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); }
4883
6397
  }
4884
6398
 
4885
- /* With a header, the commands are the menu inside the popover. */
4886
- .sw-action-menu-items {
4887
- display: block;
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);
4888
6402
  }
4889
6403
 
4890
- .sw-action-menu-item {
4891
- align-items: center;
4892
- appearance: none;
6404
+ .sw-command-palette-trigger.sw-command-palette-trigger-compact {
4893
6405
  background: transparent;
4894
- border: 0;
4895
- border-radius: var(--sw-radius-sm);
4896
- color: inherit;
4897
- cursor: pointer;
4898
- display: flex;
4899
- font-family: var(--sw-font-sans);
4900
- font-size: 15px;
4901
- gap: var(--sw-space-2);
4902
- line-height: 20px;
4903
- min-height: var(--sw-control-xs-min-height);
4904
- /* A long command wraps inside the capped menu, a word at a time if it must. */
4905
- overflow-wrap: anywhere;
4906
- padding-block: var(--sw-space-1);
4907
- padding-inline: var(--sw-control-xs-padding-inline);
4908
- text-align: start;
4909
- width: 100%;
6406
+ border-color: transparent;
6407
+ justify-content: center;
6408
+ min-width: var(--sw-control-sm-min-height);
6409
+ padding: 0;
4910
6410
  }
4911
6411
 
4912
- .sw-action-menu-item:hover,
4913
- .sw-action-menu-item:focus-visible {
4914
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
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); }
4915
6415
  }
4916
6416
 
4917
- .sw-action-menu-item:disabled {
4918
- cursor: not-allowed;
4919
- opacity: 0.5;
6417
+ @media (forced-colors: active) {
6418
+ .sw-command-palette-trigger { color: ButtonText; }
4920
6419
  }
4921
6420
 
4922
- .sw-action-menu-item-danger {
4923
- color: var(--sw-color-danger);
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;
4924
6436
  }
4925
6437
 
4926
- /*
4927
- * A command's detail: its current value at the inline end in the muted
4928
- * colour, then a chevron pointing to the inline end (mirrored right to
4929
- * left). A long value wraps between words, never inside one (the command
4930
- * itself may break anywhere), and the chevron stays last.
4931
- */
4932
- .sw-action-menu-detail {
4933
- align-items: center;
4934
- color: var(--sw-color-muted);
4935
- display: inline-flex;
4936
- gap: var(--sw-space-2);
4937
- margin-inline-start: auto;
4938
- overflow-wrap: normal;
4939
- padding-inline-start: var(--sw-space-3);
4940
- text-align: end;
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
+ }
4941
6443
  }
4942
6444
 
4943
- .sw-action-menu-chevron {
4944
- border-bottom: 2px solid var(--sw-color-muted);
4945
- border-right: 2px solid var(--sw-color-muted);
6445
+ .sw-command-palette::backdrop {
6446
+ background: color-mix(in srgb, var(--sw-color-text) 28%, transparent);
6447
+ }
6448
+
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;
4946
6460
  box-sizing: border-box;
4947
- height: var(--sw-space-2);
4948
- width: var(--sw-space-2);
4949
6461
  flex: none;
4950
- 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%;
4951
6468
  }
4952
6469
 
4953
- .sw-action-menu-chevron:dir(rtl) {
4954
- 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;
4955
6475
  }
4956
6476
 
4957
- /* A hairline that sets a command apart from the ones above. */
4958
- .sw-action-menu-separator {
4959
- border-top: 1px solid var(--sw-color-border);
4960
- 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);
4961
6483
  }
4962
6484
 
4963
- @media (forced-colors: active) {
4964
- .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);
4965
6493
  }
4966
6494
 
4967
- /* A coarse pointer gets the full touch target: the trigger at least square, and every command as tall. */
4968
- @media (pointer: coarse) {
4969
- .sw-action-menu-trigger {
4970
- min-height: var(--sw-control-md-min-height);
4971
- min-width: var(--sw-control-md-min-height);
4972
- }
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
+ }
4973
6505
 
4974
- .sw-action-menu-item {
4975
- min-height: var(--sw-control-md-min-height);
4976
- }
6506
+ .sw-command-palette-hint {
6507
+ border-top: 1px solid var(--sw-color-border);
6508
+ flex: none;
4977
6509
  }
4978
6510
 
4979
- .sw-action-menu-trigger.sw-action-menu-trigger-text {
6511
+ .sw-command-palette-item {
4980
6512
  align-items: center;
4981
- background: transparent;
4982
- border-color: transparent;
4983
- display: inline-flex;
6513
+ border-radius: var(--sw-radius-sm);
6514
+ box-sizing: border-box;
6515
+ cursor: pointer;
6516
+ display: flex;
4984
6517
  font-family: var(--sw-font-sans);
4985
6518
  font-size: 15px;
4986
- font-weight: 500;
4987
- gap: var(--sw-space-2);
6519
+ gap: var(--sw-space-3);
4988
6520
  letter-spacing: -0.2px;
4989
6521
  line-height: 20px;
4990
6522
  min-height: var(--sw-control-sm-min-height);
4991
- padding-inline: var(--sw-space-3) var(--sw-space-2);
4992
- }
4993
-
4994
- .sw-action-menu-trigger.sw-action-menu-trigger-text::after {
4995
- border-bottom: 2px solid var(--sw-color-muted);
4996
- border-right: 2px solid var(--sw-color-muted);
4997
- box-sizing: border-box;
4998
- height: var(--sw-space-2);
4999
- width: var(--sw-space-2);
5000
- content: '';
5001
- flex: none;
5002
- transform: translateY(-25%) rotate(45deg);
6523
+ overflow-wrap: anywhere;
6524
+ padding: var(--sw-space-1) var(--sw-space-2);
5003
6525
  }
5004
6526
 
5005
- .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] {
6527
+ .sw-command-palette-item[aria-selected='true'] {
5006
6528
  background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5007
6529
  }
5008
6530
 
5009
- @media (hover: hover) {
5010
- .sw-action-menu-trigger.sw-action-menu-trigger-text:hover:not(:disabled) {
5011
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5012
- }
6531
+ .sw-command-palette-icon {
6532
+ display: inline-flex;
6533
+ flex: none;
5013
6534
  }
5014
6535
 
5015
- @media (pointer: coarse) {
5016
- .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;
5017
6541
  }
5018
6542
 
5019
- @media (forced-colors: active) {
5020
- .sw-action-menu-trigger.sw-action-menu-trigger-text::after { border-color: CanvasText; }
5021
- .sw-action-menu-trigger.sw-action-menu-trigger-text[aria-expanded='true'] { border-color: Highlight; }
6543
+ .sw-command-palette-label {
6544
+ font-weight: 500;
5022
6545
  }
5023
6546
 
5024
- .sw-action-menu-trigger.sw-action-menu-trigger-icon {
5025
- align-items: center;
5026
- background: transparent;
5027
- border-color: transparent;
5028
- border-radius: var(--sw-radius-pill);
6547
+ .sw-command-palette-detail {
5029
6548
  color: var(--sw-color-muted);
5030
- display: inline-flex;
5031
- justify-content: center;
5032
- min-height: var(--sw-control-sm-min-height);
5033
- min-width: var(--sw-control-sm-min-height);
5034
- padding: 0;
5035
- }
5036
-
5037
- .sw-action-menu-trigger.sw-action-menu-trigger-icon[aria-expanded='true'] {
5038
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5039
- color: var(--sw-color-text);
6549
+ font-size: 13px;
6550
+ letter-spacing: -0.08px;
6551
+ line-height: 18px;
5040
6552
  }
5041
6553
 
5042
- @media (hover: hover) {
5043
- .sw-action-menu-trigger.sw-action-menu-trigger-icon:hover:not(:disabled) {
5044
- background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
5045
- color: var(--sw-color-text);
5046
- }
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));
5047
6556
  }
5048
6557
 
5049
6558
  @media (pointer: coarse) {
5050
- .sw-action-menu-trigger.sw-action-menu-trigger-icon {
5051
- min-height: var(--sw-control-md-min-height);
5052
- min-width: var(--sw-control-md-min-height);
5053
- }
6559
+ .sw-command-palette-item { min-height: var(--sw-control-md-min-height); }
5054
6560
  }
5055
6561
 
5056
6562
  @media (forced-colors: active) {
5057
- .sw-action-menu-trigger.sw-action-menu-trigger-icon { color: ButtonText; }
5058
- .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; }
5059
6568
  }
5060
6569
 
5061
6570
  .sw-combobox {
@@ -5553,6 +7062,85 @@ body {
5553
7062
  .sw-spinner-icon { border-color: CanvasText; border-block-start-color: Highlight; }
5554
7063
  }
5555
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
+
5556
7144
  .sw-progress {
5557
7145
  display: flex;
5558
7146
  flex-direction: column;
@@ -5743,6 +7331,28 @@ body {
5743
7331
  width: var(--sw-space-4);
5744
7332
  }
5745
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
+
5746
7356
  .sw-glyph-tile-green { --sw-glyph-tile-fill: var(--sw-categorical-green); }
5747
7357
  .sw-glyph-tile-blue { --sw-glyph-tile-fill: var(--sw-categorical-blue); }
5748
7358
  .sw-glyph-tile-orange { --sw-glyph-tile-fill: var(--sw-categorical-orange); }
@@ -5751,9 +7361,9 @@ body {
5751
7361
  .sw-glyph-tile-rose { --sw-glyph-tile-fill: var(--sw-categorical-rose); }
5752
7362
  .sw-glyph-tile-neutral { --sw-glyph-tile-fill: var(--sw-categorical-neutral); }
5753
7363
 
5754
- .sw-glyph-tile-sm { height: var(--sw-space-5); width: var(--sw-space-5); }
5755
- .sw-glyph-tile-md { height: var(--sw-control-xs-min-height); width: var(--sw-control-xs-min-height); }
5756
- .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); }
5757
7367
 
5758
7368
  @media (forced-colors: active) {
5759
7369
  .sw-glyph-tile { border: 1px solid CanvasText; color: CanvasText; }