@undrr/undrr-mangrove 1.8.2 → 2.0.0-alpha.2

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 (145) hide show
  1. package/components/BookCard.js +2 -2
  2. package/components/BookCard.js.LICENSE.txt +1 -1
  3. package/components/Breadcrumbs.js +3 -2
  4. package/components/Checkbox.js +3 -2
  5. package/components/Chips.js +3 -2
  6. package/components/CtaButton.js +3 -2
  7. package/components/EmbedContainer.js +3 -2
  8. package/components/Footer.js +2 -2
  9. package/components/Footer.js.LICENSE.txt +1 -1
  10. package/components/FormAction.js +6 -0
  11. package/components/FormAction.js.LICENSE.txt +9 -0
  12. package/components/FormErrorSummary.js +3 -2
  13. package/components/FormGroup.js +3 -2
  14. package/components/FullWidth.js +3 -2
  15. package/components/Gallery.js +2 -2
  16. package/components/Gallery.js.LICENSE.txt +1 -1
  17. package/components/Hero.js +2 -2
  18. package/components/Hero.js.LICENSE.txt +1 -1
  19. package/components/HighlightBox.js +3 -2
  20. package/components/HorizontalBookCard.js +2 -2
  21. package/components/HorizontalBookCard.js.LICENSE.txt +1 -1
  22. package/components/HorizontalCard.js +2 -2
  23. package/components/HorizontalCard.js.LICENSE.txt +1 -1
  24. package/components/IconCard.js +2 -2
  25. package/components/IconCard.js.LICENSE.txt +1 -1
  26. package/components/Loader.js +3 -2
  27. package/components/MegaMenu.js +2 -2
  28. package/components/MegaMenu.js.LICENSE.txt +1 -1
  29. package/components/PageHeader.js +3 -2
  30. package/components/Pager.js +2 -2
  31. package/components/Pager.js.LICENSE.txt +1 -1
  32. package/components/QuoteHighlight.js +3 -2
  33. package/components/Radio.js +3 -2
  34. package/components/ScrollContainer.js +3 -2
  35. package/components/Select.js +3 -2
  36. package/components/ShareButtons.js +2 -2
  37. package/components/ShareButtons.js.LICENSE.txt +1 -1
  38. package/components/ShowMore.js +3 -2
  39. package/components/StatsCard.js +2 -2
  40. package/components/StatsCard.js.LICENSE.txt +10 -0
  41. package/components/SyndicationSearchWidget.js +2 -2
  42. package/components/SyndicationSearchWidget.js.LICENSE.txt +1 -1
  43. package/components/Tab.js +3 -2
  44. package/components/TextCta.js +2 -2
  45. package/components/TextCta.js.LICENSE.txt +10 -0
  46. package/components/TextInput.js +3 -2
  47. package/components/Textarea.js +3 -2
  48. package/components/UserFeedback.js +6 -0
  49. package/components/UserFeedback.js.LICENSE.txt +9 -0
  50. package/components/VerticalCard.js +2 -2
  51. package/components/VerticalCard.js.LICENSE.txt +1 -1
  52. package/components/hydrate.js +1 -1
  53. package/css/style-all.css +422 -0
  54. package/css/style-all.css.map +1 -0
  55. package/css/style-delta.css +122 -171
  56. package/css/style-delta.css.map +1 -1
  57. package/css/style-gutenberg.css +55 -89
  58. package/css/style-gutenberg.css.map +1 -1
  59. package/css/style-irp.css +122 -161
  60. package/css/style-irp.css.map +1 -1
  61. package/css/style-mcr.css +122 -161
  62. package/css/style-mcr.css.map +1 -1
  63. package/css/style-preventionweb.css +122 -161
  64. package/css/style-preventionweb.css.map +1 -1
  65. package/css/style.css +121 -154
  66. package/css/style.css.map +1 -1
  67. package/package.json +2 -2
  68. package/scss/Atom/BaseTypography/Abbr/abbr.scss +1 -1
  69. package/scss/Atom/BaseTypography/Code/code.scss +41 -36
  70. package/scss/Atom/BaseTypography/Mark/mark.scss +2 -2
  71. package/scss/Atom/Images/AuthorImage/author-image.scss +8 -8
  72. package/scss/Atom/Images/ImageCaptionCredit/image-caption-credit.scss +9 -9
  73. package/scss/Atom/Layout/Container/container.scss +2 -4
  74. package/scss/Atom/Layout/Grid/grid.scss +15 -15
  75. package/scss/Atom/Navigation/MenuItems/menu-items.scss +10 -3
  76. package/scss/Atom/ReachElement/Details/details.scss +44 -39
  77. package/scss/Atom/Table/table.scss +22 -10
  78. package/scss/Atom/Tag/tag.scss +32 -32
  79. package/scss/Components/Boilerplate/boilerplate.scss +7 -7
  80. package/scss/Components/Breadcrumbs/breadcrumbs.scss +9 -9
  81. package/scss/Components/Buttons/Chips/chips.scss +63 -23
  82. package/scss/Components/Buttons/CtaButton/cta-button.scss +142 -20
  83. package/scss/Components/Buttons/ShareButtons/share-buttons.scss +16 -16
  84. package/scss/Components/Cards/Card/card.scss +77 -50
  85. package/scss/Components/Cards/StatsCard/stats-card.scss +32 -34
  86. package/scss/Components/CookieConsentBanner/cookie-consent-banner.scss +75 -74
  87. package/scss/Components/ErrorPages/error-pages.scss +9 -9
  88. package/scss/Components/Footer/footer.scss +12 -12
  89. package/scss/Components/Forms/FormAction/form-action.scss +50 -0
  90. package/scss/Components/Forms/FormGroup/form-group.scss +18 -7
  91. package/scss/Components/Forms/Select/select.scss +1 -1
  92. package/scss/Components/Forms/TextInput/text-input.scss +1 -1
  93. package/scss/Components/Forms/_form-base.scss +68 -61
  94. package/scss/Components/Gallery/gallery.scss +71 -70
  95. package/scss/Components/Hero/hero.scss +241 -74
  96. package/scss/Components/HighlightBox/highlight-box.scss +3 -3
  97. package/scss/Components/MegaMenu/mega-menu.scss +73 -76
  98. package/scss/Components/OnThisPageNav/on-this-page-nav.scss +36 -37
  99. package/scss/Components/PageHeader/page-header.scss +7 -7
  100. package/scss/Components/Pager/pager.scss +85 -62
  101. package/scss/Components/PreviewAccess/preview-access.scss +35 -35
  102. package/scss/Components/QuoteHighlight/quote-highlight.scss +32 -32
  103. package/scss/Components/ScrollContainer/scroll-container.scss +52 -32
  104. package/scss/Components/Snackbar/snackbar.scss +24 -31
  105. package/scss/Components/SyndicationSearchWidget/syndication-search-widget.scss +147 -139
  106. package/scss/Components/Tab/tab.scss +215 -34
  107. package/scss/Components/TableOfContents/table-of-contents.scss +6 -6
  108. package/scss/Components/TextCta/text-cta.scss +69 -23
  109. package/scss/Components/UserFeedback/user-feedback.scss +69 -0
  110. package/scss/Molecules/ImageCaption/image-caption.scss +16 -16
  111. package/scss/Molecules/SectionHeader/section-header.scss +1 -1
  112. package/scss/Utilities/FullWidth/full-width.scss +1 -1
  113. package/scss/Utilities/Loader/loader.scss +4 -4
  114. package/scss/assets/scss/_components.scss +3 -2
  115. package/scss/assets/scss/_foundational.scss +44 -26
  116. package/scss/assets/scss/_mixins.scss +34 -1
  117. package/scss/assets/scss/_theme-delta.scss +68 -0
  118. package/scss/assets/scss/_theme-irp.scss +39 -0
  119. package/scss/assets/scss/_theme-mcr.scss +56 -0
  120. package/scss/assets/scss/_theme-preventionweb.scss +37 -0
  121. package/scss/assets/scss/_utility.scss +112 -112
  122. package/scss/assets/scss/_variables.scss +358 -354
  123. package/scss/assets/scss/style-all.scss +19 -0
  124. package/scss/assets/scss/style-delta.scss +1 -1
  125. package/scss/assets/scss/style-irp.scss +1 -1
  126. package/scss/assets/scss/style-mcr.scss +1 -1
  127. package/scss/assets/scss/style-preventionweb.scss +1 -1
  128. package/css/style-irp-legacy.css +0 -476
  129. package/css/style-irp-legacy.css.map +0 -1
  130. package/css/style-legacy.css +0 -469
  131. package/css/style-legacy.css.map +0 -1
  132. package/css/style-mcr-legacy.css +0 -476
  133. package/css/style-mcr-legacy.css.map +0 -1
  134. package/css/style-preventionweb-legacy.css +0 -476
  135. package/css/style-preventionweb-legacy.css.map +0 -1
  136. package/scss/Components/Forms/_form-legacy.scss +0 -152
  137. package/scss/Components/Pagination/pagination.scss +0 -112
  138. package/scss/assets/scss/_variables-delta.scss +0 -110
  139. package/scss/assets/scss/_variables-irp.scss +0 -50
  140. package/scss/assets/scss/_variables-mcr.scss +0 -65
  141. package/scss/assets/scss/_variables-preventionweb.scss +0 -48
  142. package/scss/assets/scss/style-irp-legacy.scss +0 -20
  143. package/scss/assets/scss/style-legacy.scss +0 -20
  144. package/scss/assets/scss/style-mcr-legacy.scss +0 -20
  145. package/scss/assets/scss/style-preventionweb-legacy.scss +0 -20
@@ -17,19 +17,38 @@
17
17
  align-items: center;
18
18
  background: transparent;
19
19
  display: flex;
20
- font-family: $mg-font-family-headings;
21
- font-size: $mg-font-size-button;
20
+ font-family: $mg-font-family;
21
+ font-size: var(--mg-font-size-button);
22
22
  font-weight: 600;
23
23
  line-height: 1;
24
- border-radius: $mg-radius-button;
25
- color: $mg-color-button;
24
+ border-radius: var(--mg-radius-button);
25
+ color: rgb(var(--mg-color-button));
26
26
  cursor: pointer;
27
27
  justify-content: center;
28
- padding: $mg-padding-button;
29
- border: $mg-border-width-button solid $mg-border-color-button;
28
+ padding: var(--mg-padding-button);
29
+ border: var(--mg-border-width-button) solid var(--mg-border-color-button);
30
+
31
+ @media (prefers-reduced-motion: no-preference) {
32
+ transition:
33
+ background-color 200ms ease,
34
+ border-color 200ms ease,
35
+ color 200ms ease,
36
+ scale var(--mg-motion-duration-fast) var(--mg-motion-easing-standard);
37
+ }
38
+
39
+ &:active:not(.disabled) {
40
+ scale: 0.96;
41
+ }
30
42
 
43
+ // Visible, token-driven focus ring. A neutral separator ring plus a
44
+ // focus-coloured ring reads clearly on any button background (unlike a
45
+ // same-colour glow), follows the button's border-radius, and is not clipped
46
+ // by overflow like an outline can be.
31
47
  &:focus-visible {
32
- box-shadow: 0 0 4px $mg-color-button-background--hover;
48
+ box-shadow:
49
+ 0 0 0 var(--mg-focus-ring-offset) rgb(var(--mg-color-neutral-0)),
50
+ 0 0 0 calc(var(--mg-focus-ring-offset) + var(--mg-focus-ring-width))
51
+ rgb(var(--mg-color-focus-ring));
33
52
  outline: 0;
34
53
  }
35
54
 
@@ -38,41 +57,144 @@
38
57
  }
39
58
  }
40
59
 
41
- .mg-button + .mg-button {
42
- margin-left: mg-rem(10);
60
+ .mg-buttons {
61
+ align-items: center;
62
+ display: flex;
63
+ flex-wrap: wrap;
64
+ gap: var(--mg-spacing-75);
43
65
  }
44
66
 
45
67
  button {
46
68
  &:focus-visible {
47
- box-shadow: 0 0 4px $mg-color-button-background;
69
+ box-shadow: 0 0 4px rgb(var(--mg-color-button-background));
48
70
  outline: 0;
49
71
  }
50
72
  }
51
73
 
52
74
  .mg-button-primary {
53
- background-color: $mg-color-button-background;
75
+ background-color: rgb(var(--mg-color-button-background));
54
76
 
55
77
  &:hover {
56
- color: $mg-color-button;
57
- background-color: $mg-color-button-background--hover;
78
+ color: rgb(var(--mg-color-button));
79
+ background-color: rgb(var(--mg-color-button-background--hover));
58
80
  }
59
81
  }
60
82
 
61
83
  .mg-button-secondary {
62
- background-color: $mg-color-button-secondary-background;
84
+ background-color: rgb(var(--mg-color-button-secondary-background));
85
+
86
+ &:hover {
87
+ color: rgb(var(--mg-color-button));
88
+ background-color: rgb(var(--mg-color-button-secondary-background--hover));
89
+ }
90
+ }
91
+
92
+ // The outline modifier composes with the existing emphasis variants:
93
+ // .mg-button.mg-button-primary.mg-button-outline or
94
+ // .mg-button.mg-button-secondary.mg-button-outline.
95
+ .mg-button-outline {
96
+ background-color: transparent;
97
+ }
98
+
99
+ .mg-button-primary.mg-button-outline {
100
+ border-color: rgb(var(--mg-color-button-outline-primary));
101
+ color: rgb(var(--mg-color-button-outline-primary));
63
102
 
64
103
  &:hover {
65
- color: $mg-color-button;
66
- background-color: $mg-color-button-secondary-background--hover;
104
+ background-color: rgb(var(--mg-color-button-outline-primary--hover));
105
+ color: rgb(var(--mg-color-button));
106
+ }
107
+ }
108
+
109
+ .mg-button-secondary.mg-button-outline {
110
+ border-color: rgb(var(--mg-color-button-outline-secondary));
111
+ color: rgb(var(--mg-color-button-outline-secondary));
112
+
113
+ &:hover {
114
+ background-color: rgb(var(--mg-color-button-outline-secondary--hover));
115
+ color: rgb(var(--mg-color-button));
67
116
  }
68
117
  }
69
118
 
70
119
  .mg-button.disabled {
71
- background-color: $mg-color-neutral-500;
72
- color: $mg-color-neutral-0;
120
+ background-color: rgb(var(--mg-color-neutral-500));
121
+ color: rgb(var(--mg-color-neutral-0));
73
122
  pointer-events: none;
74
123
  }
75
124
 
125
+ // Compact editorial CTA: text plus a circular directional badge. Consumers opt
126
+ // into this modifier so form submits and utility actions retain their
127
+ // conventional button treatment.
128
+ .mg-button.mg-button-cta {
129
+ background: transparent;
130
+ border-color: transparent;
131
+ color: rgb(var(--mg-color-text));
132
+ flex: 0 0 auto;
133
+ justify-content: flex-start;
134
+ max-inline-size: 100%;
135
+ min-height: mg-rem(44);
136
+ overflow-wrap: anywhere;
137
+ padding: var(--mg-spacing-50) 0;
138
+ padding-inline-end: calc(#{mg-rem(22)} + var(--mg-spacing-50));
139
+ position: relative;
140
+ text-align: start;
141
+ white-space: normal;
142
+
143
+ // The compact editorial treatment keeps its label steady and gives the
144
+ // directional badge the tactile response instead of scaling the whole row.
145
+ &:active:not(.disabled) {
146
+ scale: 1;
147
+ }
148
+
149
+ &::after {
150
+ align-items: center;
151
+ background: rgb(var(--mg-color-interactive));
152
+ border-radius: 50%;
153
+ color: rgb(var(--mg-color-neutral-0));
154
+ content: "›";
155
+ display: inline-flex;
156
+ flex: 0 0 mg-rem(22);
157
+ font-family: $mg-font-family;
158
+ font-size: mg-rem(18);
159
+ font-weight: 700;
160
+ height: mg-rem(22);
161
+ inline-size: mg-rem(22);
162
+ inset-block-start: 50%;
163
+ inset-inline-end: 0;
164
+ justify-content: center;
165
+ line-height: 1;
166
+ padding-block-end: 0.06em; // optically centres the asymmetric chevron
167
+ padding-inline-start: 0.03em;
168
+ position: absolute;
169
+ translate: 0 -50%;
170
+
171
+ @media (prefers-reduced-motion: no-preference) {
172
+ transition: background-color var(--mg-motion-duration-fast)
173
+ var(--mg-motion-easing-standard);
174
+ }
175
+ }
176
+
177
+ &:hover {
178
+ background: transparent;
179
+ border-color: transparent;
180
+ color: rgb(var(--mg-color-interactive-active));
181
+ text-decoration: underline;
182
+ text-underline-offset: 0.2em;
183
+
184
+ &::after {
185
+ background: rgb(var(--mg-color-interactive-active));
186
+ }
187
+ }
188
+
189
+ &:active::after {
190
+ scale: 0.96;
191
+ }
192
+ }
193
+
194
+ [dir="rtl"] .mg-button.mg-button-cta::after {
195
+ content: "‹";
196
+ }
197
+
76
198
  // [dir='rtl'] {
77
199
  // .button {
78
200
  // &.button-primary {
@@ -81,7 +203,7 @@ button {
81
203
  // @include transform(rotate(180deg));
82
204
 
83
205
  // margin-left: 0;
84
- // margin-right: $mg-spacing-25;
206
+ // margin-right: var(--mg-spacing-25);
85
207
  // }
86
208
 
87
209
  // &:hover::after {
@@ -95,6 +217,6 @@ button {
95
217
  // Arabic font override
96
218
  :lang(ar) {
97
219
  .mg-button {
98
- font-family: $mg-font-family-arabic-headings;
220
+ font-family: $mg-font-family-arabic-body;
99
221
  }
100
222
  }
@@ -2,12 +2,12 @@
2
2
  max-width: 400px;
3
3
  display: flex;
4
4
  flex-direction: column;
5
- gap: $mg-spacing-100;
5
+ gap: var(--mg-spacing-100);
6
6
  }
7
7
 
8
8
  .mg-share__header {
9
9
  font-family: $mg-font-family;
10
- color: $mg-color-text;
10
+ color: rgb(var(--mg-color-text));
11
11
  font-weight: 600;
12
12
  font-size: $mg-font-size-300;
13
13
  display: flex;
@@ -16,7 +16,7 @@
16
16
 
17
17
  .mg-share__buttons {
18
18
  display: flex;
19
- gap: $mg-spacing-50;
19
+ gap: var(--mg-spacing-50);
20
20
  flex-direction: row;
21
21
  justify-content: left;
22
22
  align-items: center;
@@ -26,22 +26,22 @@
26
26
  font-size: $mg-font-size-400;
27
27
  width: mg-rem(40);
28
28
  height: mg-rem(40);
29
- padding: $mg-spacing-100;
30
- border-radius: $mg-radius-button;
31
- background-color: $mg-color-button-background;
32
- color: $mg-color-button;
29
+ padding: var(--mg-spacing-100);
30
+ border-radius: var(--mg-radius-button);
31
+ background-color: rgb(var(--mg-color-button-background));
32
+ color: rgb(var(--mg-color-button));
33
33
  display: flex;
34
34
  justify-content: center;
35
35
  align-items: center;
36
36
  cursor: pointer;
37
- border: $mg-border-width-button solid $mg-border-color-button;
37
+ border: var(--mg-border-width-button) solid var(--mg-border-color-button);
38
38
 
39
39
  &:hover {
40
- background-color: rgba($mg-color-button-background--hover, 0.8);
40
+ background-color: rgb(var(--mg-color-blue-700) / 0.8);
41
41
  }
42
42
 
43
43
  &:focus-visible {
44
- box-shadow: 0 0 4px $mg-color-button-background--hover;
44
+ box-shadow: 0 0 4px rgb(var(--mg-color-button-background--hover));
45
45
  outline: 0;
46
46
  }
47
47
  }
@@ -52,11 +52,11 @@
52
52
  justify-content: space-between;
53
53
  align-items: center;
54
54
  cursor: pointer;
55
- border: 0 solid $mg-border-color-button;
56
- color: $mg-color-button;
55
+ border: 0 solid var(--mg-border-color-button);
56
+ color: rgb(var(--mg-color-button));
57
57
  font-family: $mg-font-family;
58
- padding: $mg-spacing-100;
59
- background-color: rgba($mg-color-button-background, 1);
58
+ padding: var(--mg-spacing-100);
59
+ background-color: rgb(var(--mg-color-blue-900));
60
60
 
61
61
  &:hover .mg-share__copy-text {
62
62
  text-decoration: underline;
@@ -77,7 +77,7 @@
77
77
  }
78
78
 
79
79
  .mg-share__copy-text {
80
- color: $mg-color-button;
80
+ color: rgb(var(--mg-color-button));
81
81
  font-size: $mg-font-size-100;
82
82
  overflow: hidden;
83
83
  scrollbar-width: 0;
@@ -95,7 +95,7 @@
95
95
  display: flex;
96
96
  justify-content: center;
97
97
  align-items: center;
98
- background-color: rgba($mg-color-button-background, 0.5);
98
+ background-color: rgb(var(--mg-color-blue-900) / 0.5);
99
99
 
100
100
  img {
101
101
  width: 18px;
@@ -5,28 +5,47 @@
5
5
  display: inline-block;
6
6
  position: relative;
7
7
  isolation: isolate;
8
- margin-bottom: $mg-spacing-100;
9
- background: $mg-card-background;
10
- padding: $mg-card-padding;
11
- border-radius: $mg-card-border-radius;
8
+ margin-bottom: var(--mg-spacing-100);
9
+ background: var(--mg-card-background);
10
+ padding: var(--mg-card-padding);
11
+ border-radius: var(--mg-card-border-radius);
12
+ box-shadow: var(--mg-card-shadow);
13
+
14
+ @media (prefers-reduced-motion: no-preference) {
15
+ transition: box-shadow var(--mg-motion-duration-fast) var(--mg-motion-easing-standard);
16
+ }
17
+
18
+ &:hover {
19
+ box-shadow: var(--mg-card-shadow-hover);
20
+ }
12
21
 
13
22
  // Vertical CARD
14
23
  &__vc {
24
+ align-content: flex-start;
15
25
  display: grid;
16
- gap: $mg-spacing-50;
26
+ gap: var(--mg-spacing-50);
17
27
 
18
28
  .mg-card__visual {
19
29
  aspect-ratio: 16/9;
30
+ border-radius: calc(var(--mg-card-border-radius) / 2);
20
31
  overflow: hidden;
32
+ outline: 1px solid rgb(var(--mg-color-neutral-900) / 0.1);
33
+ }
34
+
35
+ &:not(.mg-card__book) .mg-card__image {
36
+ block-size: 100%;
37
+ inline-size: 100%;
21
38
  }
39
+
40
+ @include mg-card-image-zoom;
22
41
  }
23
42
 
24
43
  // Horizontal CARD
25
44
  &__hc {
26
- color: $mg-color-neutral-800;
45
+ color: rgb(var(--mg-color-neutral-800));
27
46
  display: grid;
28
47
  grid-template-columns: 1fr;
29
- gap: $mg-spacing-100;
48
+ gap: var(--mg-spacing-100);
30
49
 
31
50
  .mg-card__content {
32
51
  grid-column: 1 / 3;
@@ -57,10 +76,22 @@
57
76
  }
58
77
  }
59
78
 
79
+ // Horizontal card image zoom on hover (book covers excluded — they sit in a
80
+ // bordered frame where a zoom reads oddly).
81
+ &__hc:not(.mg-card-book__hc) {
82
+ .mg-card__visual {
83
+ border-radius: calc(var(--mg-card-border-radius) / 2);
84
+ overflow: hidden;
85
+ outline: 1px solid rgb(var(--mg-color-neutral-900) / 0.1);
86
+ }
87
+
88
+ @include mg-card-image-zoom;
89
+ }
90
+
60
91
  &__hc.mg-card-book__hc {
61
92
  .mg-card__visual {
62
93
  align-self: flex-start;
63
- border: 1px solid rgba($mg-color-neutral-600, 0.2);
94
+ border: 1px solid rgb(var(--mg-color-neutral-600) / 0.2);
64
95
  max-width: 200px;
65
96
  overflow: hidden;
66
97
 
@@ -72,7 +103,7 @@
72
103
 
73
104
  &:has(.mg-card__visual) {
74
105
  grid-template-rows: unset;
75
- gap: 0 $mg-spacing-100;
106
+ gap: 0 var(--mg-spacing-100);
76
107
 
77
108
  @media (min-width: $mg-breakpoint-mobile) {
78
109
  grid-template-columns: 160px 1fr;
@@ -95,14 +126,14 @@
95
126
  }
96
127
 
97
128
  &__label {
98
- color: $mg-color-tag;
129
+ color: rgb(var(--mg-color-tag));
99
130
  cursor: pointer;
100
131
  display: inline-block;
101
132
  font-size: $mg-font-tag;
102
- margin-right: $mg-spacing-50;
133
+ margin-right: var(--mg-spacing-50);
103
134
 
104
135
  &:hover {
105
- color: $mg-color-tag;
136
+ color: rgb(var(--mg-color-tag));
106
137
  }
107
138
  }
108
139
 
@@ -111,11 +142,12 @@
111
142
  font-size: $mg-font-size-500;
112
143
  font-weight: bold;
113
144
  line-height: $mg-font-line-height-500;
114
- padding-bottom: $mg-spacing-75;
115
- padding-top: $mg-spacing-100;
145
+ padding-bottom: var(--mg-spacing-75);
146
+ padding-top: var(--mg-spacing-100);
147
+ text-wrap: balance;
116
148
 
117
149
  a {
118
- color: $mg-color-interactive;
150
+ color: rgb(var(--mg-color-interactive));
119
151
  cursor: pointer;
120
152
  display: inline;
121
153
  text-decoration: underline;
@@ -123,7 +155,7 @@
123
155
  }
124
156
 
125
157
  .active {
126
- background: $mg-color-neutral-50;
158
+ background: rgb(var(--mg-color-neutral-50));
127
159
  font-weight: bold;
128
160
  }
129
161
  }
@@ -162,8 +194,7 @@
162
194
 
163
195
  // Focus: card-level outline when title link is focused via keyboard
164
196
  &__title a:focus-visible {
165
- outline: 2px solid $mg-color-interactive;
166
- outline-offset: 2px;
197
+ @include mg-focus-ring;
167
198
  }
168
199
 
169
200
  // Hover: thicker underline + nudge chevron
@@ -191,9 +222,9 @@
191
222
 
192
223
  // Color variants (shared accent colours from _variables.scss)
193
224
  $card-variant-colours: (
194
- "secondary": $mg-color-secondary,
195
- "tertiary": $mg-color-tertiary,
196
- "quaternary": $mg-color-quaternary,
225
+ "secondary": rgb(var(--mg-color-secondary)),
226
+ "tertiary": rgb(var(--mg-color-tertiary)),
227
+ "quaternary": rgb(var(--mg-color-quaternary)),
197
228
  );
198
229
 
199
230
  @each $name, $color in $card-variant-colours {
@@ -206,7 +237,7 @@ $card-variant-colours: (
206
237
  // Double class selector ensures this overrides variant colors regardless of source order
207
238
  .mg-card.mg-card--plain-title {
208
239
  .mg-card__title a {
209
- color: $mg-color-text;
240
+ color: rgb(var(--mg-color-text));
210
241
  text-decoration: none;
211
242
  }
212
243
 
@@ -216,12 +247,13 @@ $card-variant-colours: (
216
247
  }
217
248
 
218
249
  .mg-card__summary {
219
- padding-bottom: $mg-spacing-50;
250
+ padding-bottom: var(--mg-spacing-50);
251
+ text-wrap: pretty;
220
252
  }
221
253
 
222
254
  .mg-card__summary a,
223
255
  .mg-card__text-link {
224
- color: $mg-color-interactive;
256
+ color: rgb(var(--mg-color-interactive));
225
257
  }
226
258
 
227
259
  .mg-card__summary a,
@@ -248,11 +280,11 @@ $card-variant-colours: (
248
280
 
249
281
  .mg-card__visual {
250
282
  aspect-ratio: 3/4;
251
- border: 1px solid rgba($mg-color-neutral-600, 0.2);
283
+ border: 1px solid rgb(var(--mg-color-neutral-600) / 0.2);
252
284
  }
253
285
  .mg-card__title {
254
286
  font-size: $mg-font-size-300;
255
- padding-top: $mg-spacing-25;
287
+ padding-top: var(--mg-spacing-25);
256
288
  }
257
289
  }
258
290
 
@@ -271,7 +303,7 @@ $card-variant-colours: (
271
303
  display: flex;
272
304
  flex-direction: column;
273
305
  align-items: flex-start;
274
- gap: $mg-spacing-100;
306
+ gap: var(--mg-spacing-100);
275
307
  max-width: 300px;
276
308
 
277
309
  @media (min-width: $mg-breakpoint-mobile) {
@@ -286,7 +318,7 @@ $card-variant-colours: (
286
318
  .mg-card__visual-label {
287
319
  font-size: $mg-font-tag;
288
320
  font-weight: 700;
289
- color: $mg-color-tag;
321
+ color: rgb(var(--mg-color-tag));
290
322
  width: 100%;
291
323
  }
292
324
 
@@ -358,7 +390,7 @@ $card-variant-colours: (
358
390
 
359
391
  // Icon class container - uses container query units to scale like images
360
392
  .mg-card__icon-wrap {
361
- color: $mg-color-interactive;
393
+ color: rgb(var(--mg-color-interactive));
362
394
  line-height: 1;
363
395
  display: flex;
364
396
  align-items: center;
@@ -398,7 +430,7 @@ $card-variant-colours: (
398
430
  // Colored background behind icon (circle by default, rounded rect in Delta)
399
431
  &--colored {
400
432
  background-color: var(--mg-icon-bg);
401
- border-radius: $mg-card-icon-badge-radius;
433
+ border-radius: var(--mg-card-icon-badge-radius);
402
434
  aspect-ratio: 1;
403
435
  width: 72px;
404
436
  min-width: 72px;
@@ -408,7 +440,7 @@ $card-variant-colours: (
408
440
 
409
441
  .mg-icon {
410
442
  font-size: 32px;
411
- color: var(--mg-icon-fg, #{$mg-color-neutral-700});
443
+ color: var(--mg-icon-fg, rgb(var(--mg-color-neutral-700)));
412
444
  }
413
445
  }
414
446
  }
@@ -435,8 +467,7 @@ $card-variant-colours: (
435
467
  outline: none;
436
468
 
437
469
  &::after {
438
- outline: 2px solid $mg-color-interactive;
439
- outline-offset: 2px;
470
+ @include mg-focus-ring;
440
471
  }
441
472
  }
442
473
  }
@@ -456,7 +487,7 @@ $card-variant-colours: (
456
487
  line-height: $mg-font-line-height-500;
457
488
 
458
489
  a {
459
- color: $mg-color-interactive;
490
+ color: rgb(var(--mg-color-interactive));
460
491
  text-decoration: underline;
461
492
  text-underline-offset: 3px;
462
493
 
@@ -465,25 +496,23 @@ $card-variant-colours: (
465
496
  }
466
497
 
467
498
  &:focus-visible {
468
- outline: 2px solid $mg-color-interactive;
469
- outline-offset: 2px;
470
- border-radius: 2px;
499
+ @include mg-focus-ring;
471
500
  }
472
501
  }
473
502
  }
474
503
 
475
504
  .mg-card__cta {
476
505
  margin-top: auto;
477
- padding-top: $mg-spacing-100;
506
+ padding-top: var(--mg-spacing-100);
478
507
  }
479
508
 
480
509
  .mg-card__link {
481
510
  margin-top: auto;
482
- padding-top: $mg-spacing-75;
511
+ padding-top: var(--mg-spacing-75);
483
512
  margin-bottom: 0;
484
513
 
485
514
  a {
486
- color: $mg-color-interactive;
515
+ color: rgb(var(--mg-color-interactive));
487
516
  text-decoration: none;
488
517
  position: relative;
489
518
  z-index: 2; // above stretched-link cover — local to card stacking context
@@ -493,9 +522,7 @@ $card-variant-colours: (
493
522
  }
494
523
 
495
524
  &:focus-visible {
496
- outline: 2px solid $mg-color-interactive;
497
- outline-offset: 2px;
498
- border-radius: 2px;
525
+ @include mg-focus-ring;
499
526
  }
500
527
  }
501
528
  }
@@ -503,7 +530,7 @@ $card-variant-colours: (
503
530
  // Bordered variant (colored border via CSS custom property)
504
531
  &--bordered {
505
532
  border: 2px solid var(--mg-card-border);
506
- padding: max($mg-card-padding, $mg-spacing-150);
533
+ padding: max(var(--mg-card-padding), var(--mg-spacing-150));
507
534
  }
508
535
 
509
536
  // Centered variant
@@ -523,27 +550,27 @@ $card-variant-colours: (
523
550
  // Negative variant (for dark backgrounds)
524
551
  &--negative {
525
552
  .mg-card__icon-wrap {
526
- color: $mg-color-white;
553
+ color: rgb(var(--mg-color-white));
527
554
  }
528
555
 
529
556
  .mg-card__label {
530
- color: rgba($mg-color-white, 0.8);
557
+ color: rgb(var(--mg-color-neutral-0) / 0.8);
531
558
  }
532
559
 
533
560
  .mg-card__title,
534
561
  .mg-card__title a {
535
- color: $mg-color-white;
562
+ color: rgb(var(--mg-color-white));
536
563
  }
537
564
 
538
565
  .mg-card__summary {
539
- color: rgba($mg-color-white, 0.8);
566
+ color: rgb(var(--mg-color-neutral-0) / 0.8);
540
567
  }
541
568
 
542
569
  .mg-card__link a {
543
- color: $mg-color-white;
570
+ color: rgb(var(--mg-color-white));
544
571
 
545
572
  &:focus-visible {
546
- outline-color: $mg-color-white;
573
+ outline-color: rgb(var(--mg-color-white));
547
574
  }
548
575
  }
549
576
  }