@undrr/undrr-mangrove 1.3.1 → 1.3.3

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 (76) hide show
  1. package/README.md +4 -4
  2. package/components/BarChart.js +1 -1
  3. package/components/Fetcher.js +1 -1
  4. package/components/Gallery.js +2 -2
  5. package/components/IconCard.js +2 -2
  6. package/components/IconCard.js.LICENSE.txt +1 -1
  7. package/components/MapComponent.js +2 -2
  8. package/components/MegaMenu.js +2 -2
  9. package/components/Pager.js +1 -1
  10. package/components/QuoteHighlight.js +2 -2
  11. package/components/ScrollContainer.js +2 -2
  12. package/components/ShareButtons.js +2 -2
  13. package/components/StatsCard.js +2 -2
  14. package/components/SyndicationSearchWidget.js +2 -2
  15. package/components/hydrate.js +5 -0
  16. package/css/style-gutenberg.css +11 -2
  17. package/css/style-gutenberg.css.map +1 -1
  18. package/css/style-irp.css +30 -71
  19. package/css/style-irp.css.map +1 -1
  20. package/css/style-mcr.css +30 -71
  21. package/css/style-mcr.css.map +1 -1
  22. package/css/style-preventionweb.css +30 -71
  23. package/css/style-preventionweb.css.map +1 -1
  24. package/css/style.css +30 -71
  25. package/css/style.css.map +1 -1
  26. package/error-pages/401.html +1 -1
  27. package/error-pages/403.html +1 -1
  28. package/error-pages/404.html +1 -1
  29. package/error-pages/429.html +1 -1
  30. package/error-pages/500.html +1 -1
  31. package/error-pages/502.html +1 -1
  32. package/error-pages/503.html +1 -1
  33. package/error-pages/504.html +1 -1
  34. package/error-pages/5xx.html +1 -1
  35. package/error-pages/challenge.html +1 -1
  36. package/error-pages/managed-challenge.html +1 -1
  37. package/js/show-more.js +15 -9
  38. package/js/tabs.js +0 -7
  39. package/package.json +1 -1
  40. package/scss/Atom/Tag/tag.scss +115 -0
  41. package/scss/Components/Boilerplate/boilerplate.scss +15 -0
  42. package/scss/Components/Cards/Card/card.scss +88 -23
  43. package/scss/Components/Cards/StatsCard/stats-card.scss +1 -1
  44. package/scss/Components/Footer/footer.scss +20 -3
  45. package/scss/Components/Forms/Checkbox/checkbox.scss +2 -22
  46. package/scss/Components/Forms/FormGroup/form-group.scss +24 -0
  47. package/scss/Components/Forms/InputFields/input-fields.scss +7 -177
  48. package/scss/Components/Forms/Radio/radio.scss +2 -13
  49. package/scss/Components/Forms/Select/select.scss +6 -15
  50. package/scss/Components/Forms/TextInput/text-input.scss +13 -0
  51. package/scss/Components/Forms/Textarea/textarea.scss +2 -0
  52. package/scss/Components/Forms/_form-base.scss +324 -0
  53. package/scss/Components/Forms/_form-legacy.scss +153 -0
  54. package/scss/Components/Hero/hero.scss +1 -1
  55. package/scss/Components/HighlightBox/highlight-box.scss +0 -9
  56. package/scss/Components/MegaMenu/megamenu.scss +75 -1
  57. package/scss/Components/PageHeader/page-header.scss +1 -1
  58. package/scss/Components/SyndicationSearchWidget/SyndicationSearchWidget.scss +49 -1
  59. package/scss/Utilities/EmbedContainer/embed-container.scss +58 -0
  60. package/scss/Utilities/ShowMore/ShowMore.scss +8 -17
  61. package/scss/assets/scss/_components.scss +7 -10
  62. package/scss/assets/scss/_mixins.scss +4 -68
  63. package/scss/assets/scss/_utility.scss +87 -0
  64. package/scss/assets/scss/_variables-irp.scss +12 -3
  65. package/scss/assets/scss/_variables-mcr.scss +12 -3
  66. package/scss/assets/scss/_variables-preventionweb.scss +10 -2
  67. package/scss/assets/scss/_variables.scss +37 -10
  68. package/scss/Atom/Navigation/LanguageSwitcherRow/language-switcher-row.scss +0 -12
  69. package/scss/Atom/Navigation/ProgressBarNavigation/progress-bar-navigation.scss +0 -70
  70. package/scss/Atom/Navigation/SidebarFirstLevel/sidebar-first-level.scss +0 -26
  71. package/scss/Components/Accordion/accordion.scss +0 -119
  72. package/scss/Components/Forms/Dropdowns/CustomSelect/custom-select.scss +0 -110
  73. package/scss/Components/Forms/Dropdowns/Multiselect/multi-select.scss +0 -228
  74. package/scss/Components/LanguageSwitcher/language-switcher.scss +0 -162
  75. package/scss/Components/Sidebar/sidebar.scss +0 -236
  76. package/scss/Molecules/SidebarData/sidebar-data.scss +0 -44
@@ -0,0 +1,324 @@
1
+ // Shared BEM-scoped form styles for Mangrove form components.
2
+ // All form components import this partial for consistent base styling.
3
+
4
+ // -----------------------------------------------------------------------------
5
+ // Field wrapper
6
+ // -----------------------------------------------------------------------------
7
+ .mg-form-field {
8
+ display: block;
9
+ margin-bottom: $mg-spacing-100;
10
+ }
11
+
12
+ // -----------------------------------------------------------------------------
13
+ // Label
14
+ // -----------------------------------------------------------------------------
15
+ .mg-form-label {
16
+ display: block;
17
+ font-size: $mg-font-size-300;
18
+
19
+ &--disabled {
20
+ color: $mg-color-neutral-400;
21
+ }
22
+
23
+ &--required::after {
24
+ color: $mg-color-red-900;
25
+ content: " *";
26
+ }
27
+ }
28
+
29
+ // -----------------------------------------------------------------------------
30
+ // Text input
31
+ // -----------------------------------------------------------------------------
32
+ %mg-form-input-base {
33
+ @extend %background-white;
34
+
35
+ appearance: none;
36
+ border: 2px solid $mg-color-black;
37
+ border-radius: $mg-radius-form-input;
38
+ box-sizing: border-box;
39
+ display: block;
40
+ font-family: $mg-font-family;
41
+ font-size: $mg-font-size-300;
42
+ height: 46px;
43
+ margin-top: $mg-spacing-25;
44
+ padding: 0.625rem;
45
+ width: 100%;
46
+
47
+ &::placeholder {
48
+ color: $mg-color-neutral-500;
49
+ }
50
+
51
+ &:focus-visible {
52
+ box-shadow: 0 0 4px $mg-color-form-focus;
53
+ outline: 0;
54
+ }
55
+ }
56
+
57
+ .mg-form-input {
58
+ @extend %mg-form-input-base;
59
+
60
+ &--disabled {
61
+ background-color: $mg-color-white;
62
+ border-color: $mg-color-neutral-400;
63
+ color: $mg-color-neutral-400;
64
+
65
+ &::placeholder {
66
+ color: $mg-color-neutral-400;
67
+ }
68
+ }
69
+
70
+ &--error {
71
+ border-color: $mg-color-red-900;
72
+ }
73
+ }
74
+
75
+ // -----------------------------------------------------------------------------
76
+ // Textarea
77
+ // -----------------------------------------------------------------------------
78
+ .mg-form-textarea {
79
+ @extend %mg-form-input-base;
80
+
81
+ height: auto;
82
+ max-width: 100%;
83
+ resize: vertical;
84
+
85
+ &--disabled {
86
+ background-color: $mg-color-white;
87
+ border-color: $mg-color-neutral-400;
88
+ color: $mg-color-neutral-400;
89
+
90
+ &::placeholder {
91
+ color: $mg-color-neutral-400;
92
+ }
93
+ }
94
+
95
+ &--error {
96
+ border-color: $mg-color-red-900;
97
+ }
98
+ }
99
+
100
+ // -----------------------------------------------------------------------------
101
+ // Select
102
+ // -----------------------------------------------------------------------------
103
+ .mg-form-select {
104
+ @extend %background-white;
105
+
106
+ appearance: none;
107
+ border: 2px solid $mg-color-black;
108
+ border-radius: $mg-radius-form-input;
109
+ box-sizing: border-box;
110
+ cursor: pointer;
111
+ display: block;
112
+ font-family: $mg-font-family;
113
+ font-size: $mg-font-size-300;
114
+ height: 46px;
115
+ margin-top: $mg-spacing-25;
116
+ padding: 0.625rem;
117
+ padding-right: $mg-spacing-200;
118
+ width: 100%;
119
+
120
+ // Custom dropdown arrow
121
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%231a1a1a' d='M1.41 0L6 4.58 10.59 0 12 1.41l-6 6-6-6z'/%3E%3C/svg%3E");
122
+ background-position: right 0.625rem center;
123
+ background-repeat: no-repeat;
124
+
125
+ &:focus-visible {
126
+ box-shadow: 0 0 4px $mg-color-form-focus;
127
+ outline: 0;
128
+ }
129
+
130
+ &--disabled {
131
+ background-color: $mg-color-white;
132
+ border-color: $mg-color-neutral-400;
133
+ color: $mg-color-neutral-400;
134
+ cursor: default;
135
+ }
136
+
137
+ &--error {
138
+ border-color: $mg-color-red-900;
139
+ }
140
+ }
141
+
142
+ // -----------------------------------------------------------------------------
143
+ // Checkbox / Radio shared (check group)
144
+ // -----------------------------------------------------------------------------
145
+ .mg-form-check {
146
+ align-items: center;
147
+ display: flex;
148
+ position: relative;
149
+
150
+ // Base input (shared between checkbox and radio)
151
+ &__input {
152
+ appearance: none;
153
+ border: 2px solid $mg-color-form-check;
154
+ cursor: pointer;
155
+ height: 16px;
156
+ margin: 0;
157
+ width: 16px;
158
+
159
+ &:hover {
160
+ border-color: $mg-color-form-check--hover;
161
+ }
162
+
163
+ &:focus-visible {
164
+ box-shadow: 0 0 4px $mg-color-form-focus;
165
+ outline: 0;
166
+ }
167
+
168
+ &--checkbox {
169
+ border-radius: 0;
170
+ }
171
+
172
+ &--radio {
173
+ background-color: transparent;
174
+ border-radius: 100%;
175
+ box-shadow: inset 0 0 0 $mg-color-white;
176
+ }
177
+
178
+ &--disabled {
179
+ border-color: $mg-color-neutral-400;
180
+ cursor: default;
181
+
182
+ &:hover {
183
+ border-color: $mg-color-neutral-400;
184
+ }
185
+ }
186
+
187
+ &--error {
188
+ border-color: $mg-color-red-900;
189
+
190
+ &:hover {
191
+ border-color: $mg-color-red-900;
192
+ }
193
+ }
194
+ }
195
+
196
+ // Label next to checkbox/radio
197
+ &__label {
198
+ cursor: pointer;
199
+ font-size: $mg-font-size-300;
200
+ padding: 0 7px;
201
+ }
202
+ }
203
+
204
+ // Checked states (must be outside BEM nesting for specificity)
205
+ .mg-form-check__input--checkbox:checked {
206
+ background-color: $mg-color-form-check--checked;
207
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23fff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8l3 3 6-6'/%3E%3C/svg%3E");
208
+ border-color: $mg-color-form-check--checked;
209
+ }
210
+
211
+ .mg-form-check__input--radio:checked {
212
+ background-color: $mg-color-form-check--checked;
213
+ box-shadow: inset 0 0 0 3px $mg-color-white;
214
+ }
215
+
216
+ // -----------------------------------------------------------------------------
217
+ // Help text
218
+ // -----------------------------------------------------------------------------
219
+ .mg-form-help {
220
+ color: $mg-color-neutral-500;
221
+ font-size: $mg-font-size-200;
222
+ margin-bottom: 0;
223
+ margin-top: $mg-spacing-25;
224
+ }
225
+
226
+ // -----------------------------------------------------------------------------
227
+ // Error text
228
+ // -----------------------------------------------------------------------------
229
+ .mg-form-error {
230
+ color: $mg-color-red-900;
231
+ font-size: $mg-font-size-300;
232
+ margin-bottom: 0;
233
+ margin-top: $mg-spacing-25;
234
+ }
235
+
236
+ // -----------------------------------------------------------------------------
237
+ // Form error summary
238
+ // -----------------------------------------------------------------------------
239
+ .mg-form-error-summary {
240
+ background-color: $mg-color-red-50;
241
+ border-left: 4px solid $mg-color-red-900;
242
+ margin-bottom: $mg-spacing-200;
243
+ padding: $mg-spacing-150;
244
+
245
+ &:focus {
246
+ outline: 3px solid $mg-color-blue-800;
247
+ outline-offset: 0;
248
+ }
249
+
250
+ &__title {
251
+ color: $mg-color-red-900;
252
+ font-size: $mg-font-size-300;
253
+ font-weight: 700;
254
+ margin-bottom: $mg-spacing-75;
255
+ margin-top: 0;
256
+ }
257
+
258
+ &__list {
259
+ margin: 0;
260
+ padding-left: $mg-spacing-100;
261
+
262
+ li {
263
+ margin-bottom: $mg-spacing-50;
264
+
265
+ &:last-child {
266
+ margin-bottom: 0;
267
+ }
268
+ }
269
+
270
+ a {
271
+ color: $mg-color-red-900;
272
+ font-weight: 600;
273
+ text-decoration: underline;
274
+ }
275
+ }
276
+ }
277
+
278
+ // -----------------------------------------------------------------------------
279
+ // Screen-reader-only utility
280
+ // -----------------------------------------------------------------------------
281
+ .mg-u-sr-only {
282
+ border: 0;
283
+ clip-path: inset(50%);
284
+ height: 1px;
285
+ margin: -1px;
286
+ overflow: hidden;
287
+ padding: 0;
288
+ position: absolute;
289
+ white-space: nowrap;
290
+ width: 1px;
291
+ }
292
+
293
+ // -----------------------------------------------------------------------------
294
+ // RTL overrides
295
+ // -----------------------------------------------------------------------------
296
+ [dir="rtl"] {
297
+ .mg-form-select {
298
+ background-position: left 0.625rem center;
299
+ padding-left: $mg-spacing-200;
300
+ padding-right: 0.625rem;
301
+ }
302
+
303
+ .mg-form-input[type="date"]::-webkit-calendar-picker-indicator {
304
+ left: inherit;
305
+ position: absolute;
306
+ right: 27px;
307
+ }
308
+
309
+ .mg-form-input[type="date"]::-webkit-date-and-time-value {
310
+ margin-right: 0;
311
+ text-align: right;
312
+ }
313
+ }
314
+
315
+ // -----------------------------------------------------------------------------
316
+ // Arabic font override
317
+ // -----------------------------------------------------------------------------
318
+ :lang(ar) {
319
+ .mg-form-input,
320
+ .mg-form-textarea,
321
+ .mg-form-select {
322
+ font-family: $mg-font-family-arabic-body;
323
+ }
324
+ }
@@ -0,0 +1,153 @@
1
+ // DEPRECATED — February 2026
2
+ // These bare element selectors are provided for backward compatibility only.
3
+ // Migrate to BEM classes (.mg-form-input, .mg-form-label, etc.) from _form-base.scss.
4
+ // Scheduled for removal: August 2026.
5
+ @warn "_form-legacy.scss is deprecated. Migrate to BEM classes from _form-base.scss. Removal: August 2026.";
6
+
7
+ label {
8
+ @extend %paragraph-font-300;
9
+
10
+ display: block;
11
+
12
+ &.error {
13
+ @extend %paragraph-font-300;
14
+
15
+ color: $mg-color-black;
16
+ margin-top: 0;
17
+ }
18
+
19
+ &.disabled {
20
+ color: $mg-color-neutral-400;
21
+ }
22
+ }
23
+
24
+ .help {
25
+ color: $mg-color-neutral-500;
26
+ display: block;
27
+ font-size: $mg-font-size-200;
28
+ margin-bottom: 0;
29
+ margin-top: $mg-spacing-25;
30
+ }
31
+
32
+ .error {
33
+ color: $mg-color-red-900;
34
+ font-size: $mg-font-size-300;
35
+ margin-bottom: 0;
36
+ margin-top: $mg-spacing-25;
37
+ }
38
+
39
+ input[type="text"],
40
+ input[type="number"],
41
+ input[type="email"],
42
+ input[type="password"],
43
+ input[type="search"],
44
+ input[type="tel"],
45
+ input[type="date"],
46
+ textarea {
47
+ @extend %background-white;
48
+
49
+ appearance: none;
50
+ border: 2px solid $mg-color-black;
51
+ border-radius: 0;
52
+ box-sizing: border-box;
53
+ display: block;
54
+ font-family: $mg-font-family;
55
+ font-size: $mg-font-size-300;
56
+ height: 46px;
57
+ margin-top: $mg-spacing-25;
58
+ padding: 0.625rem;
59
+ width: 100%;
60
+
61
+ &::placeholder {
62
+ color: $mg-color-neutral-500;
63
+ }
64
+
65
+ &:focus {
66
+ box-shadow: 0 0 4px $mg-color-blue-800;
67
+ outline: 0;
68
+ }
69
+
70
+ input[type="date"],
71
+ input[type="search"] {
72
+ position: relative;
73
+ }
74
+
75
+ &.disabled {
76
+ background-color: $mg-color-white;
77
+ border: 2px solid $mg-color-neutral-400;
78
+ color: $mg-color-neutral-400;
79
+
80
+ &::placeholder {
81
+ color: $mg-color-neutral-400;
82
+ }
83
+ }
84
+
85
+ &.error {
86
+ border: 2px solid $mg-color-red-900;
87
+ }
88
+ }
89
+
90
+ input[type="date"] {
91
+ background-color: $mg-color-white;
92
+ color: $mg-color-neutral-500;
93
+ }
94
+
95
+ .help {
96
+ &.disabled {
97
+ color: $mg-color-neutral-400;
98
+ }
99
+ }
100
+
101
+ textarea {
102
+ height: auto;
103
+ max-width: 100%;
104
+ resize: vertical;
105
+ }
106
+
107
+ input[type="date"]::-webkit-calendar-picker-indicator {
108
+ appearance: none;
109
+ left: 3px;
110
+ opacity: 0;
111
+ position: absolute;
112
+ }
113
+
114
+ [dir="rtl"] {
115
+ input[type="text"],
116
+ input[type="number"],
117
+ input[type="email"],
118
+ input[type="password"],
119
+ input[type="search"],
120
+ input[type="tel"],
121
+ input[type="date"],
122
+ textarea {
123
+ @media (hover: none) and (pointer: coarse) {
124
+ input[type="date"] {
125
+ padding-right: $mg-spacing-100;
126
+ }
127
+ }
128
+ }
129
+
130
+ input[type="date"]::-webkit-calendar-picker-indicator {
131
+ left: inherit;
132
+ position: absolute;
133
+ right: 27px;
134
+ }
135
+
136
+ input::-webkit-date-and-time-value {
137
+ margin-right: 0;
138
+ text-align: right;
139
+ }
140
+ }
141
+
142
+ :lang(ar) {
143
+ input[type="text"],
144
+ input[type="number"],
145
+ input[type="email"],
146
+ input[type="password"],
147
+ input[type="search"],
148
+ input[type="tel"],
149
+ input[type="date"],
150
+ textarea {
151
+ font-family: $mg-font-family-arabic-body;
152
+ }
153
+ }
@@ -69,7 +69,7 @@
69
69
 
70
70
  &__label {
71
71
  display: inline-block;
72
- font-size: $mg-font-label;
72
+ font-size: $mg-font-tag;
73
73
  font-weight: bold;
74
74
  margin-right: $mg-spacing-25;
75
75
  padding: $mg-spacing-25 0;
@@ -12,16 +12,7 @@
12
12
  width: 100%;
13
13
  border: 1px solid rgb(0 0 0 / 0.3);
14
14
 
15
- // Responsive embed for iframes inside highlight-box
16
- &:has(iframe) {
17
- position: relative;
18
- max-width: 100%;
19
- aspect-ratio: 16 / 9;
20
- height: 100%;
21
- }
22
15
  iframe {
23
- width: 100%;
24
- height: 100%;
25
16
  border: 0;
26
17
  display: block;
27
18
  max-width: 100%;
@@ -24,6 +24,71 @@
24
24
  overflow-x: hidden; // primarily for mobile
25
25
  }
26
26
 
27
+ // --- Branded variant (with inline logo) ---
28
+ &--branded {
29
+ align-items: center;
30
+
31
+ @media screen and (max-width: $mg-breakpoint-tablet) {
32
+ padding-left: 0; // logo replaces the left padding
33
+ overflow-x: hidden;
34
+ }
35
+
36
+ // Hamburger becomes a discrete button (not full-width overlay)
37
+ .mg-mega-topbar-mobile__icon-button {
38
+ position: relative;
39
+ width: auto;
40
+ margin-inline-start: auto;
41
+ background: $mg-color-white;
42
+ flex-shrink: 0;
43
+ box-shadow: -3px 0 6px -2px rgb(0 0 0 / 0.15);
44
+
45
+ &:has(.mg-icon-angle-circled-left) {
46
+ background: $mg-color-white;
47
+ box-shadow: -3px 0 6px -2px rgb(0 0 0 / 0.15);
48
+ }
49
+ }
50
+ }
51
+
52
+ // Logo link
53
+ &__logo {
54
+ flex-shrink: 1;
55
+ min-width: 0; // allow shrinking below intrinsic size
56
+ display: flex;
57
+ align-items: center;
58
+ padding: $mg-spacing-100 $mg-spacing-150;
59
+ }
60
+
61
+ // Logo image
62
+ &__logo-img {
63
+ display: block;
64
+ height: 3rem;
65
+ max-width: 100%;
66
+ width: auto;
67
+
68
+ @media screen and (min-width: $mg-breakpoint-tablet) {
69
+ height: 3.5rem;
70
+ }
71
+ }
72
+
73
+ // Inner nav list inside branded variant
74
+ &__nav {
75
+ display: flex;
76
+ align-items: flex-start;
77
+ flex: 1;
78
+ padding: 0;
79
+ margin: 0;
80
+ list-style: none;
81
+
82
+ // Hide items on mobile (same as default topbar behavior)
83
+ @media screen and (max-width: $mg-breakpoint-tablet) {
84
+ // Items are there but non-interactive on mobile (hamburger opens sidebar)
85
+ pointer-events: none;
86
+ overflow: hidden;
87
+ flex: 1;
88
+ min-width: 0;
89
+ }
90
+ }
91
+
27
92
  // Hide desktop menu items on mobile/tablet, show on desktop
28
93
  &__item {
29
94
  pointer-events: none; // on mobile we only advertise the buttons, but not clickable
@@ -338,7 +403,7 @@
338
403
  li {
339
404
  animation: mg-mega-item-slide-in 250ms ease-out both;
340
405
 
341
- @for $i from 1 through 12 {
406
+ @for $i from 1 through 25 {
342
407
  &:nth-child(#{$i}) {
343
408
  animation-delay: #{($i - 1) * 30}ms;
344
409
  }
@@ -651,6 +716,15 @@
651
716
  }
652
717
  }
653
718
 
719
+ // RTL: Flip hamburger shadow direction in branded variant
720
+ [dir="rtl"] .mg-mega-topbar--branded .mg-mega-topbar-mobile__icon-button {
721
+ box-shadow: 3px 0 6px -2px rgb(0 0 0 / 0.15);
722
+ }
723
+
724
+ [dir="rtl"] .mg-mega-topbar--branded .mg-mega-topbar-mobile__icon-button:has(.mg-icon-angle-circled-left) {
725
+ box-shadow: 3px 0 6px -2px rgb(0 0 0 / 0.15);
726
+ }
727
+
654
728
  // Arabic
655
729
  :lang(ar) {
656
730
  .mg-mega-menu__item-link {
@@ -130,7 +130,7 @@
130
130
 
131
131
  .mg-page-header__label {
132
132
  display: inline-block;
133
- font-size: $mg-font-label;
133
+ font-size: $mg-font-tag;
134
134
  font-weight: bold;
135
135
  margin-right: $mg-spacing-25;
136
136
  padding: $mg-spacing-25 0;
@@ -689,10 +689,22 @@ $search-input-padding-x: $mg-spacing-250;
689
689
  // Result teaser HTML overrides
690
690
  // ========================================
691
691
 
692
+ // Type badge and site name badges injected before the title in teaser results
693
+ .mg-search__result-badges {
694
+ display: inline-flex;
695
+ flex-wrap: wrap;
696
+ align-items: center;
697
+ gap: $mg-spacing-50;
698
+ margin-bottom: $mg-spacing-25;
699
+ }
700
+
701
+ // Content type badge — uses the system-level .mg-tag atom.
702
+ // No additional styles needed; the class is applied in ResultItem.jsx.
703
+
692
704
  // Site name label in search results
693
705
  .mg-search__result-site-name {
694
706
  display: inline-block;
695
- margin: 0 0 $mg-spacing-25;
707
+ margin: 0;
696
708
  padding: $mg-spacing-25 $mg-spacing-50;
697
709
  font-size: $mg-font-size-200;
698
710
  color: $search-text-muted;
@@ -719,6 +731,42 @@ $search-input-padding-x: $mg-spacing-250;
719
731
  }
720
732
  }
721
733
 
734
+ // ========================================
735
+ // Teaser Field Visibility
736
+ // ========================================
737
+ // Modifier classes on the results container hide specific teaser fields
738
+ // via the visibleTeaserFields config option.
739
+ // Title (.mg-card__title) is intentionally not toggleable.
740
+ // Teaser HTML uses standard mg-card__* BEM wrapper classes added by
741
+ // Drupal teaser templates (see web-backlog#2660).
742
+
743
+ .mg-search--hide-image .mg-card__visual { display: none; }
744
+ .mg-search--hide-contentType .mg-card__tag { display: none; }
745
+ .mg-search--hide-publicationType .mg-card__publication-type { display: none; }
746
+ .mg-search--hide-date .mg-card__date { display: none; }
747
+ .mg-search--hide-siteName .mg-search__result-site-name { display: none; }
748
+ .mg-search--hide-summary .mg-card__description { display: none; }
749
+ .mg-search--hide-organization .mg-card__organization { display: none; }
750
+
751
+ // ========================================
752
+ // Card Display Mode (mg-grid layout)
753
+ // ========================================
754
+
755
+ .mg-search__results-grid {
756
+ gap: $mg-spacing-150;
757
+
758
+ // Card items within grid
759
+ > [role="listitem"] {
760
+ display: flex;
761
+ }
762
+
763
+ // Remove list-style dividers in grid/card mode
764
+ .mg-search__result {
765
+ padding-bottom: 0;
766
+ border-bottom: 0;
767
+ }
768
+ }
769
+
722
770
  // ========================================
723
771
  // Result Animations
724
772
  // Sequential fade-in and slide from left for search results.