@undrr/undrr-mangrove 2.2.0 → 2.4.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 (100) hide show
  1. package/README.md +1 -1
  2. package/components/BookCard.js +5 -2
  3. package/components/Breadcrumbs.js +2 -2
  4. package/components/Checkbox.js +3 -2
  5. package/components/Chips.js +2 -2
  6. package/components/ContentCard.js +8 -2
  7. package/components/ContentTeaser.js +8 -2
  8. package/components/CopyButton.js +3 -2
  9. package/components/CtaButton.js +3 -2
  10. package/components/Drawer.js +2 -2
  11. package/components/Drawer.js.LICENSE.txt +1 -1
  12. package/components/DrupalContentPatterns.js +1 -1
  13. package/components/EmbedContainer.js +3 -2
  14. package/components/Footer.js +2 -2
  15. package/components/FormAction.js +3 -2
  16. package/components/FormErrorSummary.js +2 -2
  17. package/components/FormGroup.js +3 -2
  18. package/components/FullWidth.js +3 -2
  19. package/components/Gallery.js +3 -2
  20. package/components/Hero.js +6 -2
  21. package/components/HighlightBox.js +3 -2
  22. package/components/HorizontalBookCard.js +6 -2
  23. package/components/HorizontalBookCard.js.LICENSE.txt +1 -1
  24. package/components/HorizontalCard.js +6 -2
  25. package/components/HorizontalCard.js.LICENSE.txt +1 -1
  26. package/components/IconCard.js +4 -2
  27. package/components/IconCard.js.LICENSE.txt +1 -1
  28. package/components/Legend.js +3 -2
  29. package/components/Loader.js +2 -2
  30. package/components/MegaMenu.js +7 -2
  31. package/components/Notice.js +3 -2
  32. package/components/PageHeader.js +4 -2
  33. package/components/Pager.js +7 -2
  34. package/components/ProgressBar.js +3 -2
  35. package/components/QuoteHighlight.js +3 -2
  36. package/components/QuoteHighlight.js.LICENSE.txt +1 -1
  37. package/components/Radio.js +3 -2
  38. package/components/Range.js +3 -2
  39. package/components/ScrollContainer.js +2 -2
  40. package/components/SegmentedControl.js +6 -2
  41. package/components/Select.js +3 -2
  42. package/components/ServiceNotice.js +4 -2
  43. package/components/ShareButtons.js +4 -2
  44. package/components/ShowMore.js +3 -2
  45. package/components/SkipLink.js +3 -2
  46. package/components/StatsCard.js +5 -2
  47. package/components/StatsCard.js.LICENSE.txt +1 -1
  48. package/components/SyndicationSearchWidget.js +31 -2
  49. package/components/Tab.js +7 -2
  50. package/components/TextCta.js +4 -2
  51. package/components/TextCta.js.LICENSE.txt +1 -1
  52. package/components/TextInput.js +3 -2
  53. package/components/Textarea.js +3 -2
  54. package/components/Tree.js +7 -2
  55. package/components/UserFeedback.js +2 -2
  56. package/components/VerticalCard.js +6 -2
  57. package/components/VerticalCard.js.LICENSE.txt +1 -1
  58. package/components/hydrate.js +2 -2
  59. package/css/style-all.css +16 -10
  60. package/css/style-all.css.map +1 -1
  61. package/css/style-delta.css +16 -10
  62. package/css/style-delta.css.map +1 -1
  63. package/css/style-gutenberg.css +1 -1
  64. package/css/style-irp.css +16 -10
  65. package/css/style-irp.css.map +1 -1
  66. package/css/style-mcr.css +16 -10
  67. package/css/style-mcr.css.map +1 -1
  68. package/css/style-preventionweb.css +16 -10
  69. package/css/style-preventionweb.css.map +1 -1
  70. package/css/style.css +16 -10
  71. package/css/style.css.map +1 -1
  72. package/docs/EDITORIAL-MANUAL.md +2 -2
  73. package/docs/llms-editorial-manual.txt +1 -1
  74. package/docs/llms-page-building.txt +4 -2
  75. package/docs/llms-search-widget.txt +3 -1
  76. package/error-pages/401.html +1 -1
  77. package/error-pages/403.html +1 -1
  78. package/error-pages/404.html +1 -1
  79. package/error-pages/429.html +1 -1
  80. package/error-pages/500.html +1 -1
  81. package/error-pages/502.html +1 -1
  82. package/error-pages/503.html +1 -1
  83. package/error-pages/504.html +1 -1
  84. package/error-pages/5xx.html +1 -1
  85. package/error-pages/challenge.html +1 -1
  86. package/error-pages/managed-challenge.html +1 -1
  87. package/js/dialog.js +205 -0
  88. package/package.json +1 -1
  89. package/scss/Atom/BaseTypography/Code/code.scss +0 -1
  90. package/scss/Atom/Table/table.scss +0 -1
  91. package/scss/Atom/Tag/tag.scss +0 -1
  92. package/scss/Components/Buttons/ShareButtons/share-buttons.scss +18 -0
  93. package/scss/Components/Cards/StatsCard/stats-card.scss +0 -1
  94. package/scss/Components/Dialog/dialog.scss +87 -0
  95. package/scss/Components/MegaMenu/mega-menu.scss +460 -33
  96. package/scss/Components/SyndicationSearchWidget/syndication-search-widget.scss +70 -2
  97. package/scss/Patterns/Content/Publication/publication-record.scss +110 -0
  98. package/scss/Patterns/LandingPages/publication-example.scss +28 -0
  99. package/scss/assets/scss/_components.scss +1 -0
  100. package/scss/assets/scss/_variables.scss +1 -1
@@ -12,7 +12,9 @@
12
12
  .mg-mega-wrapper {
13
13
  position: relative;
14
14
  background: rgb(var(--mg-color-white));
15
- box-shadow: inset 0 -1px 0 rgb(var(--mg-color-neutral-600) / 0.24);
15
+
16
+ // Paint below the header so opaque logo/trigger surfaces cannot cover it.
17
+ box-shadow: 0 1px 0 rgb(var(--mg-color-neutral-600) / 0.24);
16
18
  z-index: var(--mg-z-index-nav);
17
19
  }
18
20
 
@@ -22,9 +24,7 @@
22
24
  align-items: flex-start;
23
25
  z-index: var(--mg-z-index-nav);
24
26
 
25
- // In the default variant this class is on the nav <ul> itself (the branded
26
- // variant puts it on a wrapping <div> and uses &__nav for the list), so it
27
- // is a list class and carries the house rule.
27
+ // Plain HTML consumers can use this class directly on a navigation list.
28
28
  @include mg-list-unmarked;
29
29
 
30
30
  padding: 0;
@@ -36,17 +36,38 @@
36
36
  }
37
37
 
38
38
  // Kept max-width based to avoid a Firefox glitch with .mg-container-full-width.
39
- @media screen and (max-width: $mg-breakpoint-tablet) {
40
- padding-left: mg-rem(40); // space for the icon button
41
- overflow-x: hidden; // primarily for mobile
39
+ @media screen and (width < $mg-breakpoint-tablet) {
40
+ position: relative;
41
+ padding-inline-start: mg-rem(40); // space for the icon button
42
+ overflow-x: auto;
43
+ overscroll-behavior-inline: contain;
44
+ scrollbar-width: none;
45
+ }
46
+
47
+ // React keeps the hamburger outside the scrolling rail in both variants.
48
+ // Avoid sticky flex children: WebKit can scroll them out of view in RTL.
49
+ @media screen and (width < $mg-breakpoint-tablet) {
50
+ &:has(> .mg-mega-topbar__nav) {
51
+ padding-inline-start: 0;
52
+ overflow: hidden;
53
+ }
54
+
55
+ > .mg-mega-topbar-mobile__icon-button {
56
+ position: relative;
57
+ inset: auto;
58
+ width: mg-rem(40);
59
+ flex-shrink: 0;
60
+ align-self: stretch;
61
+ background: rgb(var(--mg-color-white));
62
+ }
42
63
  }
43
64
 
44
65
  // --- Branded variant (with inline logo) ---
45
66
  &--branded {
46
67
  align-items: center;
47
68
 
48
- @media screen and (max-width: $mg-breakpoint-tablet) {
49
- padding-left: 0; // logo replaces the left padding
69
+ @media screen and (width < $mg-breakpoint-tablet) {
70
+ padding-inline-start: 0; // logo replaces the left padding
50
71
  overflow-x: hidden;
51
72
  }
52
73
 
@@ -72,6 +93,10 @@
72
93
  justify-content: flex-end;
73
94
  flex: 1;
74
95
 
96
+ @media screen and (width < $mg-breakpoint-tablet) {
97
+ justify-content: flex-start;
98
+ }
99
+
75
100
  @include mg-list-unmarked;
76
101
 
77
102
  margin: 0;
@@ -109,11 +134,23 @@
109
134
 
110
135
  @include mg-list-unmarked;
111
136
 
112
- // Clip overflow on mobile so the scrolling content hint works correctly.
113
- // pointer-events is left as auto here — it is restricted only when JS has
114
- // initialised the full mega menu (see .mg-mega-wrapper--js-active below).
115
- @media screen and (max-width: $mg-breakpoint-tablet) {
116
- overflow: hidden;
137
+ // The branded rail scrolls independently of the logo and hamburger.
138
+ @media screen and (width < $mg-breakpoint-tablet) {
139
+ overflow-x: auto;
140
+ overscroll-behavior-inline: contain;
141
+ scrollbar-width: none;
142
+ cursor: grab;
143
+ user-select: none;
144
+
145
+ &:active {
146
+ cursor: grabbing;
147
+ }
148
+
149
+ .mg-mega-topbar__item-link {
150
+ cursor: inherit;
151
+ }
152
+
153
+ justify-content: flex-start;
117
154
  flex: 1;
118
155
  min-width: 0;
119
156
  }
@@ -148,6 +185,7 @@
148
185
  }
149
186
  }
150
187
 
188
+ flex-shrink: 0;
151
189
  font-size: var(--mg-font-size-300);
152
190
  color: rgb(var(--mg-color-interactive));
153
191
  font-weight: bold;
@@ -688,6 +726,7 @@
688
726
  .mg-mega-topbar-mobile__icon-button {
689
727
  // Mobile-first: Display by default
690
728
  position: absolute;
729
+ inset-block: 0;
691
730
 
692
731
  // Anchored to both edges of the topbar rather than assumed to be
693
732
  // viewport-wide: a `100vw` overlay overhangs and is clipped by the parent's
@@ -701,7 +740,8 @@
701
740
  color: rgb(var(--mg-color-interactive));
702
741
  font-size: mg-rem(20);
703
742
  width: auto;
704
- height: 100%;
743
+ height: auto;
744
+ min-height: mg-rem(44);
705
745
  padding: var(--mg-spacing-100);
706
746
  border: none;
707
747
  cursor: pointer;
@@ -793,24 +833,8 @@
793
833
  box-shadow: 3px 0 6px -2px rgb(0 0 0 / 0.15);
794
834
  }
795
835
 
796
- // Full JS mega menu — sidebar handles mobile nav, so topbar items must NOT be
797
- // interactive on small screens. This class is added by the React component on
798
- // mount (useEffect), so it is absent when JS fails or has not yet hydrated,
799
- // preserving a clickable fallback for server-rendered nav markup.
800
- .mg-mega-wrapper--js-active {
801
- @media screen and (max-width: $mg-breakpoint-tablet) {
802
- .mg-mega-topbar__nav {
803
- pointer-events: none;
804
- }
805
-
806
- .mg-mega-topbar__item {
807
- pointer-events: none;
808
- }
809
- }
810
- }
811
-
812
836
  // Mobile progressive navigation: one stable surface at every depth. Existing
813
- // desktop classes and the full-strip opening target remain compatible.
837
+ // desktop classes remain compatible; the rail opens individual sections.
814
838
  .mg-mega-mobile-sidebar--progressive {
815
839
  position: fixed;
816
840
  inset: 0 0 auto;
@@ -1094,7 +1118,7 @@
1094
1118
 
1095
1119
  // Existing plain HTML navigation needs no hamburger gutter or JS enhancement.
1096
1120
  // Keep overflow local to the rail so every destination remains reachable.
1097
- @media screen and (max-width: $mg-breakpoint-tablet) {
1121
+ @media screen and (width < $mg-breakpoint-tablet) {
1098
1122
  .mg-mega-topbar:not(
1099
1123
  .mg-mega-topbar--branded,
1100
1124
  :has(.mg-mega-topbar-mobile__icon-button)
@@ -1113,3 +1137,406 @@
1113
1137
  }
1114
1138
  }
1115
1139
  }
1140
+
1141
+ // =============================================================================
1142
+ // Contextual menu finding: desktop sections and mobile drawer
1143
+ // =============================================================================
1144
+
1145
+ // Quick navigation shares geometry and readable type across every theme.
1146
+ // Override these properties on .mg-mega-wrapper in consumer theme CSS.
1147
+ :where(.mg-mega-wrapper) {
1148
+ --mg-mega-filter-font-size: var(--mg-font-size-300);
1149
+ --mg-mega-filter-meta-font-size: var(--mg-font-size-250);
1150
+ }
1151
+
1152
+ .mg-mega-mobile-sidebar__filter-container {
1153
+ padding: var(--mg-spacing-100) var(--mg-spacing-150);
1154
+ border-bottom: 1px solid rgb(var(--mg-color-neutral-200));
1155
+ background: rgb(var(--mg-color-white));
1156
+ flex-shrink: 0;
1157
+ }
1158
+
1159
+ .mg-mega-filter {
1160
+ position: relative;
1161
+ display: flex;
1162
+ align-items: center;
1163
+ width: 100%;
1164
+ background: rgb(var(--mg-color-white));
1165
+ border: 1px solid rgb(var(--mg-color-neutral-300));
1166
+ border-radius: var(--mg-radius-form-input);
1167
+
1168
+ &:focus-within {
1169
+ @include mg-focus-ring;
1170
+ }
1171
+
1172
+ &__icon {
1173
+ position: absolute;
1174
+ inset-inline-start: var(--mg-spacing-100);
1175
+ color: rgb(var(--mg-color-neutral-600));
1176
+ pointer-events: none;
1177
+ font-size: var(--mg-font-size-300);
1178
+ }
1179
+
1180
+ &__input {
1181
+ width: 100%;
1182
+ min-width: 0;
1183
+ height: mg-rem(44);
1184
+ padding: var(--mg-spacing-50) mg-rem(44);
1185
+ border: none;
1186
+ background: transparent;
1187
+ font-family: var(--mg-font-family-text);
1188
+ font-size: var(--mg-mega-filter-font-size);
1189
+ color: rgb(var(--mg-color-neutral-900));
1190
+
1191
+ &::placeholder {
1192
+ color: rgb(var(--mg-color-neutral-600));
1193
+ }
1194
+
1195
+ &:focus {
1196
+ outline: none;
1197
+ }
1198
+
1199
+ &::-webkit-search-cancel-button,
1200
+ &::-webkit-search-decoration {
1201
+ appearance: none;
1202
+ }
1203
+ }
1204
+
1205
+ &__clear {
1206
+ position: absolute;
1207
+ inset-inline-end: 0;
1208
+ display: inline-flex;
1209
+ align-items: center;
1210
+ justify-content: center;
1211
+ width: mg-rem(44);
1212
+ height: mg-rem(44);
1213
+ padding: 0;
1214
+ border: none;
1215
+ border-radius: var(--mg-radius-form-input);
1216
+ background: transparent;
1217
+ color: rgb(var(--mg-color-neutral-800));
1218
+ font-family: var(--mg-font-family-text);
1219
+ font-size: var(--mg-font-size-500);
1220
+ cursor: pointer;
1221
+
1222
+ &:focus-visible {
1223
+ @include mg-focus-ring-inset;
1224
+ }
1225
+ }
1226
+
1227
+ &__status {
1228
+ font-size: var(--mg-mega-filter-meta-font-size);
1229
+ color: rgb(var(--mg-color-neutral-600));
1230
+ margin-bottom: var(--mg-spacing-100);
1231
+ font-variant-numeric: tabular-nums;
1232
+ }
1233
+
1234
+ &__highlight {
1235
+ // Match the card title's search-hit treatment. Reset the global editorial
1236
+ // mark padding and size so the match stays inline, including in breadcrumbs.
1237
+ padding: 0;
1238
+ background: rgb(var(--mg-color-neutral-50));
1239
+ color: inherit;
1240
+ font-size: inherit;
1241
+ font-weight: 700;
1242
+ line-height: inherit;
1243
+ }
1244
+
1245
+ &__empty-container {
1246
+ padding-block: var(--mg-spacing-100);
1247
+ }
1248
+
1249
+ &__empty-search-btn,
1250
+ &__site-search-link {
1251
+ display: flex;
1252
+ align-items: center;
1253
+ justify-content: space-between;
1254
+ gap: var(--mg-spacing-100);
1255
+ min-height: mg-rem(44);
1256
+ max-inline-size: 100%;
1257
+ font-size: var(--mg-mega-filter-font-size);
1258
+ line-height: inherit;
1259
+ text-align: start;
1260
+ text-decoration: none;
1261
+ white-space: normal;
1262
+ overflow-wrap: anywhere;
1263
+
1264
+ &:hover {
1265
+ text-decoration: none;
1266
+ }
1267
+ }
1268
+
1269
+ &__fallback {
1270
+ margin-top: var(--mg-spacing-100);
1271
+ padding-top: var(--mg-spacing-100);
1272
+ border-top: 1px solid rgb(var(--mg-color-neutral-200));
1273
+ }
1274
+
1275
+ &__fallback-arrow {
1276
+ margin-inline-start: auto;
1277
+
1278
+ &:dir(rtl) {
1279
+ transform: scaleX(-1);
1280
+ }
1281
+ }
1282
+
1283
+ &__mobile-list {
1284
+ @include mg-list-unmarked;
1285
+
1286
+ padding: 0;
1287
+ margin: 0;
1288
+ }
1289
+
1290
+ &__mobile-item {
1291
+ border-bottom: 1px solid rgb(var(--mg-color-neutral-200));
1292
+
1293
+ &:last-child {
1294
+ border-bottom: 0; // The site-search footer owns the closing separator.
1295
+ }
1296
+ }
1297
+
1298
+ &__mobile-link {
1299
+ transition: none;
1300
+ display: flex;
1301
+ align-items: center;
1302
+ min-height: mg-rem(44);
1303
+ padding: var(--mg-spacing-100);
1304
+ border-radius: var(--mg-radius-form-input);
1305
+ font-family: var(--mg-font-family-ui);
1306
+ text-decoration: none;
1307
+ overflow-wrap: anywhere;
1308
+
1309
+ &:focus-visible {
1310
+ @include mg-focus-ring-inset;
1311
+ }
1312
+
1313
+ @media (hover: hover) {
1314
+ &:hover {
1315
+ background: rgb(var(--mg-color-interactive) / 0.06);
1316
+ }
1317
+ }
1318
+ }
1319
+
1320
+ // Same chevron geometry and logical direction as .mg-breadcrumb, without
1321
+ // creating a navigation landmark or nested links for every search result.
1322
+ &__trail {
1323
+ display: flex;
1324
+ flex-wrap: wrap;
1325
+ align-items: baseline;
1326
+ row-gap: var(--mg-spacing-25);
1327
+ flex: 1;
1328
+ min-width: 0;
1329
+ font-size: var(--mg-mega-filter-meta-font-size);
1330
+ color: rgb(var(--mg-color-neutral-600));
1331
+ }
1332
+
1333
+ &__trail-step {
1334
+ display: inline;
1335
+ max-inline-size: 100%;
1336
+ overflow-wrap: anywhere;
1337
+
1338
+ + .mg-mega-filter__trail-step::before {
1339
+ content: "";
1340
+ display: inline-block;
1341
+ inline-size: 0.35em;
1342
+ block-size: 0.35em;
1343
+ border-inline-end: 0.125em solid currentColor;
1344
+ border-block-start: 0.125em solid currentColor;
1345
+ transform: rotate(45deg);
1346
+ margin-inline: 0.65em 0.75em;
1347
+ vertical-align: middle;
1348
+ color: rgb(var(--mg-color-neutral-600));
1349
+ }
1350
+
1351
+ &:dir(rtl) + .mg-mega-filter__trail-step::before {
1352
+ transform: rotate(-45deg);
1353
+ }
1354
+ }
1355
+
1356
+ &__item-title {
1357
+ font-size: var(--mg-mega-filter-font-size);
1358
+ font-weight: 600;
1359
+ color: rgb(var(--mg-color-interactive));
1360
+ }
1361
+ }
1362
+
1363
+ .mg-mega-mobile-sidebar--progressive.mg-mega-mobile-sidebar--filtering {
1364
+ display: flex;
1365
+ flex-direction: column;
1366
+ overflow: hidden;
1367
+
1368
+ .mg-mega-mobile-sidebar__header {
1369
+ flex-shrink: 0;
1370
+ }
1371
+ }
1372
+
1373
+ .mg-mega-mobile-sidebar__filter-results {
1374
+ padding: var(--mg-spacing-100) var(--mg-spacing-150);
1375
+ overflow-y: auto;
1376
+ overscroll-behavior: contain;
1377
+ min-height: 0;
1378
+
1379
+ .mg-mega-filter__site-search-link {
1380
+ width: 100%;
1381
+ }
1382
+ }
1383
+
1384
+ .mg-mega-content__left-contents {
1385
+ display: contents;
1386
+ }
1387
+
1388
+ .mg-mega-content--filterable > .mg-mega-content__left {
1389
+ display: flex;
1390
+ flex-direction: column;
1391
+ overflow: hidden;
1392
+ }
1393
+
1394
+ .mg-mega-content__left-scroll {
1395
+ flex: 1;
1396
+ min-height: 0;
1397
+ overflow-y: auto;
1398
+ overscroll-behavior: contain;
1399
+ }
1400
+
1401
+ .mg-mega-content__finder-footer {
1402
+ flex-shrink: 0;
1403
+ padding-block: var(--mg-spacing-100);
1404
+ border-top: 1px solid rgb(var(--mg-color-neutral-200));
1405
+ }
1406
+
1407
+ .mg-mega-menu-finder__action.mg-mega-content__finder-trigger {
1408
+ width: 100%;
1409
+ justify-content: space-between;
1410
+ padding-inline: var(--mg-spacing-250);
1411
+ border-radius: 0;
1412
+
1413
+ @media (hover: hover) {
1414
+ &:hover {
1415
+ background: rgb(var(--mg-color-interactive) / 0.15);
1416
+ }
1417
+ }
1418
+
1419
+ &:focus-visible {
1420
+ background: rgb(var(--mg-color-interactive) / 0.15);
1421
+ }
1422
+
1423
+ > span {
1424
+ text-decoration: underline;
1425
+ text-underline-offset: 0.15em;
1426
+ }
1427
+ }
1428
+
1429
+ .mg-mega-content__finder-shortcut {
1430
+ font-size: var(--mg-mega-filter-meta-font-size);
1431
+ padding-inline: var(--mg-spacing-50);
1432
+ border: 1px solid rgb(var(--mg-color-neutral-300));
1433
+ border-radius: var(--mg-spacing-25);
1434
+ background: rgb(var(--mg-color-white));
1435
+ color: rgb(var(--mg-color-neutral-600));
1436
+ }
1437
+
1438
+ .mg-mega-menu-finder {
1439
+ flex-direction: column;
1440
+ max-block-size: min(75vh, 600px);
1441
+ margin-block: min(10vh, 80px) auto;
1442
+ margin-inline: auto;
1443
+ overflow: hidden;
1444
+ font-weight: 400;
1445
+
1446
+ &[open] {
1447
+ display: flex;
1448
+ }
1449
+
1450
+ &__action {
1451
+ transition: none;
1452
+ display: inline-flex;
1453
+ align-items: center;
1454
+ justify-content: center;
1455
+ flex-shrink: 0;
1456
+ min-inline-size: mg-rem(44);
1457
+ min-height: mg-rem(44);
1458
+ padding: 0 var(--mg-spacing-50);
1459
+ border: 0;
1460
+ border-radius: var(--mg-radius-form-input);
1461
+ background: transparent;
1462
+ color: rgb(var(--mg-color-interactive));
1463
+ font-family: var(--mg-font-family-text);
1464
+ font-size: var(--mg-mega-filter-meta-font-size);
1465
+ font-weight: 400;
1466
+ cursor: pointer;
1467
+ text-decoration: none;
1468
+
1469
+ @media (hover: hover) {
1470
+ &:hover {
1471
+ background: rgb(var(--mg-color-neutral-100));
1472
+ }
1473
+ }
1474
+
1475
+ &:focus-visible {
1476
+ @include mg-focus-ring;
1477
+ }
1478
+ }
1479
+
1480
+ &__header {
1481
+ padding: var(--mg-spacing-100) var(--mg-spacing-250) var(--mg-spacing-150);
1482
+ border-bottom: 1px solid rgb(var(--mg-color-neutral-200));
1483
+ flex-shrink: 0;
1484
+
1485
+ .mg-mega-filter {
1486
+ max-inline-size: mg-rem(480);
1487
+ }
1488
+ }
1489
+
1490
+ &__heading {
1491
+ display: flex;
1492
+ align-items: center;
1493
+ justify-content: space-between;
1494
+ gap: var(--mg-spacing-100);
1495
+ }
1496
+
1497
+ &__label {
1498
+ font-family: var(--mg-font-family-ui);
1499
+ font-size: var(--mg-mega-filter-font-size);
1500
+ color: rgb(var(--mg-color-neutral-800));
1501
+ }
1502
+
1503
+ &__results {
1504
+ padding: var(--mg-spacing-100) var(--mg-spacing-250);
1505
+ overflow-y: auto;
1506
+ overscroll-behavior: contain;
1507
+ min-height: 0;
1508
+ }
1509
+
1510
+ &__footer {
1511
+ flex-shrink: 0;
1512
+ padding: var(--mg-spacing-100) var(--mg-spacing-250);
1513
+ border-top: 1px solid rgb(var(--mg-color-neutral-200));
1514
+
1515
+ .mg-mega-filter__site-search-link {
1516
+ width: fit-content;
1517
+ max-inline-size: 100%;
1518
+ }
1519
+ }
1520
+ }
1521
+
1522
+ // Keep the finder body scrolling independently of its input, Close control and site-search footer.
1523
+ .mg-dialog.mg-mega-menu-finder {
1524
+ max-block-size: min(75vh, 600px);
1525
+ margin-block: min(10vh, 80px) auto;
1526
+ margin-inline: auto;
1527
+ overflow: hidden;
1528
+ }
1529
+
1530
+ // A brief tint confirms pointer targeting without delaying navigation or focus.
1531
+ // Base states remain immediate; keyboard, touch and forced colours stay instant.
1532
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) and (forced-colors: none) {
1533
+ .mg-mega-menu-finder__action,
1534
+ .mg-mega-filter__mobile-link {
1535
+ transition: background-color var(--mg-motion-duration-fast)
1536
+ var(--mg-motion-easing-standard);
1537
+
1538
+ &:focus-visible {
1539
+ transition: none;
1540
+ }
1541
+ }
1542
+ }
@@ -573,7 +573,6 @@ $search-input-padding-x: mg-rem(44);
573
573
  padding: var(--mg-spacing-25) var(--mg-spacing-50);
574
574
  background: $search-chip-bg;
575
575
  border-radius: $search-radius;
576
- text-transform: uppercase;
577
576
  letter-spacing: 0.025em;
578
577
  }
579
578
 
@@ -1713,7 +1712,6 @@ $search-input-padding-x: mg-rem(44);
1713
1712
  margin-inline-end: var(--mg-spacing-25);
1714
1713
  color: $search-text-muted;
1715
1714
  font-weight: 600;
1716
- text-transform: uppercase;
1717
1715
  letter-spacing: 0.05em;
1718
1716
  }
1719
1717
 
@@ -1736,3 +1734,73 @@ $search-input-padding-x: mg-rem(44);
1736
1734
  border-inline-end: 1px solid CanvasText;
1737
1735
  }
1738
1736
  }
1737
+
1738
+ // A result scope is one required choice, distinct from removable filters.
1739
+ .mg-search__scope-tabs {
1740
+ border: 0;
1741
+ padding: 0;
1742
+ margin-block: 0 var(--mg-spacing-100);
1743
+ margin-inline: 0;
1744
+ min-inline-size: 0;
1745
+ }
1746
+
1747
+ .mg-search__scope-options {
1748
+ display: flex;
1749
+ flex-wrap: wrap;
1750
+ gap: var(--mg-spacing-25);
1751
+ border-block-end: 1px solid rgb(var(--mg-color-neutral-200));
1752
+ }
1753
+
1754
+ .mg-search__scope-option {
1755
+ position: relative;
1756
+ cursor: pointer;
1757
+ margin: 0;
1758
+
1759
+ input {
1760
+ position: absolute;
1761
+ inline-size: 1px;
1762
+ block-size: 1px;
1763
+ opacity: 0;
1764
+ }
1765
+
1766
+ span {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ justify-content: center;
1770
+ min-inline-size: mg-rem(44);
1771
+ min-block-size: mg-rem(44);
1772
+ box-sizing: border-box;
1773
+ padding: var(--mg-spacing-75) var(--mg-spacing-100);
1774
+ border-block-end: 3px solid transparent;
1775
+ font-family: var(--mg-font-family-ui);
1776
+ color: rgb(var(--mg-color-text));
1777
+ }
1778
+
1779
+ input:checked + span {
1780
+ border-block-end-color: rgb(var(--mg-color-interactive));
1781
+ font-weight: 700;
1782
+ }
1783
+
1784
+ input:focus-visible + span {
1785
+ @include mg-focus-ring-inset;
1786
+ }
1787
+
1788
+ input:disabled + span {
1789
+ cursor: not-allowed;
1790
+ color: rgb(var(--mg-color-neutral-600));
1791
+ }
1792
+
1793
+ @media (forced-colors: active) {
1794
+ input:not(:checked) + span {
1795
+ border-block-end-color: Canvas;
1796
+ }
1797
+
1798
+ input:checked + span {
1799
+ border-block-end-color: Highlight;
1800
+ }
1801
+
1802
+ input:disabled + span {
1803
+ color: GrayText;
1804
+ }
1805
+ }
1806
+ }