@undrr/undrr-mangrove 2.1.1 → 2.3.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 (208) hide show
  1. package/README.md +1 -1
  2. package/components/BookCard.js +1 -1
  3. package/components/Breadcrumbs.js +1 -1
  4. package/components/Checkbox.js +1 -1
  5. package/components/Chips.js +1 -1
  6. package/components/ContentCard.js +9 -0
  7. package/components/ContentCard.js.LICENSE.txt +9 -0
  8. package/components/ContentTeaser.js +9 -0
  9. package/components/ContentTeaser.js.LICENSE.txt +9 -0
  10. package/components/CopyButton.js +2 -2
  11. package/components/CtaButton.js +1 -1
  12. package/components/Drawer.js +2 -2
  13. package/components/Drawer.js.LICENSE.txt +1 -1
  14. package/components/DrupalContentPatterns.js +8 -0
  15. package/components/EmbedContainer.js +1 -1
  16. package/components/Footer.js +1 -1
  17. package/components/FormAction.js +1 -1
  18. package/components/FormErrorSummary.js +1 -1
  19. package/components/FormGroup.js +1 -1
  20. package/components/FullWidth.js +1 -1
  21. package/components/Gallery.js +2 -2
  22. package/components/Hero.js +1 -1
  23. package/components/HighlightBox.js +1 -1
  24. package/components/HorizontalBookCard.js +2 -2
  25. package/components/HorizontalBookCard.js.LICENSE.txt +1 -1
  26. package/components/HorizontalCard.js +2 -2
  27. package/components/HorizontalCard.js.LICENSE.txt +1 -1
  28. package/components/IconCard.js +2 -2
  29. package/components/IconCard.js.LICENSE.txt +1 -1
  30. package/components/Legend.js +1 -1
  31. package/components/Loader.js +1 -1
  32. package/components/MegaMenu.js +2 -2
  33. package/components/Notice.js +1 -1
  34. package/components/PageHeader.js +1 -1
  35. package/components/Pager.js +1 -1
  36. package/components/ProgressBar.js +1 -1
  37. package/components/QuoteHighlight.js +2 -2
  38. package/components/QuoteHighlight.js.LICENSE.txt +1 -1
  39. package/components/Radio.js +1 -1
  40. package/components/Range.js +1 -1
  41. package/components/ScrollContainer.js +2 -2
  42. package/components/SegmentedControl.js +1 -1
  43. package/components/Select.js +1 -1
  44. package/components/ServiceNotice.js +2 -2
  45. package/components/ShareButtons.js +2 -2
  46. package/components/ShowMore.js +1 -1
  47. package/components/SkipLink.js +1 -1
  48. package/components/StatsCard.js +2 -2
  49. package/components/StatsCard.js.LICENSE.txt +1 -1
  50. package/components/SyndicationSearchWidget.js +2 -2
  51. package/components/Tab.js +2 -2
  52. package/components/TextCta.js +2 -2
  53. package/components/TextCta.js.LICENSE.txt +1 -1
  54. package/components/TextInput.js +1 -1
  55. package/components/Textarea.js +1 -1
  56. package/components/Tree.js +1 -1
  57. package/components/UserFeedback.js +2 -2
  58. package/components/VerticalCard.js +2 -2
  59. package/components/VerticalCard.js.LICENSE.txt +1 -1
  60. package/components/hydrate.js +1 -1
  61. package/css/style-all.css +19 -14
  62. package/css/style-all.css.map +1 -1
  63. package/css/style-delta.css +19 -14
  64. package/css/style-delta.css.map +1 -1
  65. package/css/style-gutenberg.css +4 -8
  66. package/css/style-gutenberg.css.map +1 -1
  67. package/css/style-irp.css +19 -14
  68. package/css/style-irp.css.map +1 -1
  69. package/css/style-mcr.css +19 -14
  70. package/css/style-mcr.css.map +1 -1
  71. package/css/style-preventionweb.css +19 -14
  72. package/css/style-preventionweb.css.map +1 -1
  73. package/css/style.css +20 -14
  74. package/css/style.css.map +1 -1
  75. package/docs/EDITORIAL-MANUAL.md +1 -1
  76. package/docs/llms-page-building.txt +5 -3
  77. package/error-pages/401.html +1 -1
  78. package/error-pages/403.html +1 -1
  79. package/error-pages/404.html +1 -1
  80. package/error-pages/429.html +1 -1
  81. package/error-pages/500.html +1 -1
  82. package/error-pages/502.html +1 -1
  83. package/error-pages/503.html +1 -1
  84. package/error-pages/504.html +1 -1
  85. package/error-pages/5xx.html +1 -1
  86. package/error-pages/challenge.html +1 -1
  87. package/error-pages/managed-challenge.html +1 -1
  88. package/js/preview-access.js +180 -30
  89. package/package.json +1 -1
  90. package/scss/Atom/BaseTypography/Blockquote/blockquote.scss +2 -0
  91. package/scss/Atom/BaseTypography/Cite/cite.scss +2 -0
  92. package/scss/Atom/BaseTypography/Code/code.scss +2 -0
  93. package/scss/Atom/BaseTypography/Mark/mark.scss +2 -0
  94. package/scss/Atom/BaseTypography/Small/small.scss +2 -0
  95. package/scss/Atom/Icons/icons.scss +3 -2
  96. package/scss/Atom/Images/ImageCaptionCredit/image-caption-credit.scss +3 -0
  97. package/scss/Atom/Images/ImageCredit/image-credit.scss +2 -0
  98. package/scss/Atom/Layout/Container/container.scss +2 -0
  99. package/scss/Atom/Layout/Grid/grid.scss +2 -0
  100. package/scss/Atom/Logo/logo.scss +2 -0
  101. package/scss/Atom/Navigation/MenuItems/menu-items.scss +2 -0
  102. package/scss/Atom/ReachElement/Details/details.scss +3 -0
  103. package/scss/Atom/ReachElement/Figcaption/figcaption.scss +3 -0
  104. package/scss/Atom/StatusLabel/status-label.scss +2 -0
  105. package/scss/Atom/Table/table.scss +4 -0
  106. package/scss/Atom/Tag/tag.scss +3 -0
  107. package/scss/Components/Boilerplate/boilerplate.scss +3 -0
  108. package/scss/Components/Breadcrumbs/breadcrumbs.scss +2 -0
  109. package/scss/Components/Buttons/Chips/chips.scss +3 -0
  110. package/scss/Components/Buttons/CtaButton/buttons.scss +1 -1
  111. package/scss/Components/Buttons/CtaButton/cta-button.scss +4 -0
  112. package/scss/Components/Buttons/ShareButtons/share-buttons.scss +3 -0
  113. package/scss/Components/Cards/Card/card.scss +156 -3
  114. package/scss/Components/Cards/StatsCard/stats-card.scss +14 -2
  115. package/scss/Components/CiteThis/cite-this.scss +2 -0
  116. package/scss/Components/CookieConsentBanner/cookie-consent-banner.scss +2 -0
  117. package/scss/Components/DataViz/Legend/legend.scss +1 -0
  118. package/scss/Components/ErrorPages/error-pages.scss +2 -0
  119. package/scss/Components/Footer/footer.scss +2 -0
  120. package/scss/Components/Forms/FormAction/form-action.scss +2 -0
  121. package/scss/Components/Forms/FormGroup/form-group.scss +2 -0
  122. package/scss/Components/Forms/Range/range.scss +1 -0
  123. package/scss/Components/Forms/SegmentedControl/segmented-control.scss +2 -0
  124. package/scss/Components/Forms/Select/select.scss +2 -0
  125. package/scss/Components/Forms/_form-base.scss +3 -0
  126. package/scss/Components/Gallery/gallery.scss +4 -0
  127. package/scss/Components/Hero/hero.scss +3 -0
  128. package/scss/Components/HighlightBox/highlight-box.scss +3 -0
  129. package/scss/Components/MegaMenu/mega-menu.scss +60 -33
  130. package/scss/Components/MegaMenu/megamenu.scss +1 -1
  131. package/scss/Components/Navigation/Drawer/drawer.scss +1 -0
  132. package/scss/Components/Navigation/Tree/tree.scss +1 -0
  133. package/scss/Components/OnThisPageNav/on-this-page-nav.scss +3 -0
  134. package/scss/Components/PageHeader/page-header.scss +3 -0
  135. package/scss/Components/Pager/pager.scss +3 -0
  136. package/scss/Components/PreviewAccess/preview-access.scss +3 -0
  137. package/scss/Components/QuoteHighlight/quote-highlight.scss +2 -0
  138. package/scss/Components/ScrollContainer/scroll-container.scss +4 -0
  139. package/scss/Components/Snackbar/snackbar.scss +1 -0
  140. package/scss/Components/SyndicationSearchWidget/syndication-search-widget.scss +52 -1
  141. package/scss/Components/Tab/tab.scss +4 -0
  142. package/scss/Components/TableOfContents/table-of-contents.scss +2 -0
  143. package/scss/Components/TextCta/text-cta.scss +3 -0
  144. package/scss/Components/TextCta/textcta.scss +1 -1
  145. package/scss/Components/UserFeedback/user-feedback.scss +3 -0
  146. package/scss/Molecules/ImageCaption/image-caption.scss +2 -0
  147. package/scss/Molecules/SectionHeader/sectionheader.scss +1 -1
  148. package/scss/Patterns/ContentCard/content-card.scss +79 -0
  149. package/scss/Patterns/ContentTeaser/content-teaser.scss +174 -0
  150. package/scss/Patterns/HubHeader/hub-header.scss +3 -0
  151. package/scss/Patterns/RichContent/rich-content.scss +1 -0
  152. package/scss/Patterns/_shared/pattern-demo.scss +1 -1
  153. package/scss/Utilities/Loader/loader.scss +2 -0
  154. package/scss/Utilities/ShowMore/show-more.scss +2 -0
  155. package/scss/Utilities/SkipLink/skip-link.scss +2 -0
  156. package/scss/assets/fonts/noto-kufi-arabic/noto-kufi-arabic.scss +2 -0
  157. package/scss/assets/fonts/noto-sans-arabic/noto-sans-arabic.scss +2 -0
  158. package/scss/assets/fonts/roboto/roboto.scss +12 -12
  159. package/scss/assets/fonts/roboto/sass/_Black.scss +4 -0
  160. package/scss/assets/fonts/roboto/sass/_BlackItalic.scss +4 -0
  161. package/scss/assets/fonts/roboto/sass/_Bold.scss +4 -0
  162. package/scss/assets/fonts/roboto/sass/_BoldItalic.scss +4 -0
  163. package/scss/assets/fonts/roboto/sass/_Italic.scss +4 -0
  164. package/scss/assets/fonts/roboto/sass/_Light.scss +4 -0
  165. package/scss/assets/fonts/roboto/sass/_LightItalic.scss +4 -0
  166. package/scss/assets/fonts/roboto/sass/_Medium.scss +4 -0
  167. package/scss/assets/fonts/roboto/sass/_MediumItalic.scss +4 -0
  168. package/scss/assets/fonts/roboto/sass/_Regular.scss +4 -0
  169. package/scss/assets/fonts/roboto/sass/_variables.scss +1 -2
  170. package/scss/assets/fonts/roboto/sass/roboto.scss +12 -12
  171. package/scss/assets/fonts/roboto-condensed/roboto-condensed.scss +8 -8
  172. package/scss/assets/fonts/roboto-condensed/sass/_Bold.scss +4 -0
  173. package/scss/assets/fonts/roboto-condensed/sass/_BoldItalic.scss +4 -0
  174. package/scss/assets/fonts/roboto-condensed/sass/_Italic.scss +4 -0
  175. package/scss/assets/fonts/roboto-condensed/sass/_Light.scss +4 -0
  176. package/scss/assets/fonts/roboto-condensed/sass/_LightItalic.scss +4 -0
  177. package/scss/assets/fonts/roboto-condensed/sass/_Regular.scss +4 -0
  178. package/scss/assets/fonts/roboto-condensed/sass/_variables.scss +1 -1
  179. package/scss/assets/scss/_components.scss +79 -77
  180. package/scss/assets/scss/_config.scss +183 -0
  181. package/scss/assets/scss/_font-paths.scss +10 -0
  182. package/scss/assets/scss/_fonts.import.scss +2 -0
  183. package/scss/assets/scss/_fonts.scss +13 -55
  184. package/scss/assets/scss/_foundational.scss +6 -3
  185. package/scss/assets/scss/_legacy-warnings.scss +37 -0
  186. package/scss/assets/scss/_mixins.scss +2 -0
  187. package/scss/assets/scss/_style-all.import.scss +11 -0
  188. package/scss/assets/scss/_style-delta.import.scss +11 -0
  189. package/scss/assets/scss/_style-gutenberg.import.scss +11 -0
  190. package/scss/assets/scss/_style-irp.import.scss +11 -0
  191. package/scss/assets/scss/_style-mcr.import.scss +11 -0
  192. package/scss/assets/scss/_style-preventionweb.import.scss +11 -0
  193. package/scss/assets/scss/_style.import.scss +11 -0
  194. package/scss/assets/scss/_theme-delta.scss +2 -1
  195. package/scss/assets/scss/_theme-irp.scss +2 -1
  196. package/scss/assets/scss/_theme-mcr.scss +2 -1
  197. package/scss/assets/scss/_theme-preventionweb.scss +2 -1
  198. package/scss/assets/scss/_utility.scss +3 -0
  199. package/scss/assets/scss/_variables.import.scss +11 -0
  200. package/scss/assets/scss/_variables.scss +5 -230
  201. package/scss/assets/scss/generated/_tokens-mangrove.scss +87 -0
  202. package/scss/assets/scss/style-all.scss +14 -11
  203. package/scss/assets/scss/style-delta.scss +11 -8
  204. package/scss/assets/scss/style-gutenberg.scss +15 -12
  205. package/scss/assets/scss/style-irp.scss +11 -8
  206. package/scss/assets/scss/style-mcr.scss +11 -8
  207. package/scss/assets/scss/style-preventionweb.scss +11 -8
  208. package/scss/assets/scss/style.scss +10 -7
@@ -1,3 +1,7 @@
1
+ @use "../../../scss/font-paths" as *;
2
+ @use "mixins" as *;
3
+ @use "variables" as *;
4
+
1
5
  /* BEGIN Italic */
2
6
  @font-face {
3
7
  font-family: "Roboto Condensed";
@@ -1,3 +1,7 @@
1
+ @use "../../../scss/font-paths" as *;
2
+ @use "mixins" as *;
3
+ @use "variables" as *;
4
+
1
5
  /* BEGIN Light */
2
6
  @font-face {
3
7
  font-family: "Roboto Condensed";
@@ -1,3 +1,7 @@
1
+ @use "../../../scss/font-paths" as *;
2
+ @use "mixins" as *;
3
+ @use "variables" as *;
4
+
1
5
  /* BEGIN Light Italic */
2
6
  @font-face {
3
7
  font-family: "Roboto Condensed";
@@ -1,3 +1,7 @@
1
+ @use "../../../scss/font-paths" as *;
2
+ @use "mixins" as *;
3
+ @use "variables" as *;
4
+
1
5
  /* BEGIN Regular */
2
6
  @font-face {
3
7
  font-family: "Roboto Condensed";
@@ -1 +1 @@
1
- $font-version: "2.137" !default;
1
+ @forward "../../../scss/font-paths" show $font-version;
@@ -1,102 +1,104 @@
1
1
  // A rollup of all Mangrove components
2
2
 
3
3
  // Normalize
4
- @import "../../Utilities/Normalize/normalize";
4
+ @use "../../Utilities/Normalize/normalize" as *;
5
5
 
6
6
  // Atom
7
- @import "../../Atom/BaseTypography/Abbr/abbr";
8
- @import "../../Atom/BaseTypography/Blockquote/blockquote";
9
- @import "../../Atom/BaseTypography/Cite/cite";
10
- @import "../../Atom/BaseTypography/Code/code";
11
- @import "../../Atom/BaseTypography/Mark/mark";
12
- @import "../../Atom/BaseTypography/Quotation/quotation";
13
- @import "../../Atom/BaseTypography/Small/small";
14
- @import "../../Atom/Colors/color";
7
+ @use "../../Atom/BaseTypography/Abbr/abbr" as *;
8
+ @use "../../Atom/BaseTypography/Blockquote/blockquote" as *;
9
+ @use "../../Atom/BaseTypography/Cite/cite" as *;
10
+ @use "../../Atom/BaseTypography/Code/code" as *;
11
+ @use "../../Atom/BaseTypography/Mark/mark" as *;
12
+ @use "../../Atom/BaseTypography/Quotation/quotation" as *;
13
+ @use "../../Atom/BaseTypography/Small/small" as *;
14
+ @use "../../Atom/Colors/color" as *;
15
15
 
16
16
  // Icon definitions — included here so every theme CSS file contains icons.
17
17
  // See: https://github.com/unisdr/undrr-mangrove/issues/906
18
- @import "../../Atom/Icons/icons";
19
- @import "../../Atom/Images/AuthorImage/author-image";
20
- @import "../../Atom/Images/Image/image";
21
- @import "../../Atom/Images/ImageCaptionCredit/image-caption-credit";
22
- @import "../../Atom/Images/ImageCredit/image-credit";
23
- @import "../../Atom/Layout/Container/container";
24
- @import "../../Atom/Layout/Grid/grid";
25
- @import "../../Atom/Logo/logo";
18
+ @use "../../Atom/Icons/icons" as *;
19
+ @use "../../Atom/Images/AuthorImage/author-image" as *;
20
+ @use "../../Atom/Images/Image/image" as *;
21
+ @use "../../Atom/Images/ImageCaptionCredit/image-caption-credit" as *;
22
+ @use "../../Atom/Images/ImageCredit/image-credit" as *;
23
+ @use "../../Atom/Layout/Container/container" as *;
24
+ @use "../../Atom/Layout/Grid/grid" as *;
25
+ @use "../../Atom/Logo/logo" as *;
26
26
 
27
27
  // @import "../../Atom/Layout/Spacing/spacing"; // Retried
28
28
  // @import "../../Atom/Navigation/Breadcrumb/breadcrumb"; // Retried
29
- @import "../../Atom/Navigation/MenuItems/menu-items";
30
- @import "../../Atom/ReachElement/Details/details";
31
- @import "../../Atom/ReachElement/Figcaption/figcaption";
32
- @import "../../Atom/EmptyState/empty-state";
33
- @import "../../Atom/StatusLabel/status-label";
34
- @import "../../Atom/Table/table";
35
- @import "../../Atom/Tag/tag";
36
- @import "../../Atom/Video/video";
29
+ @use "../../Atom/Navigation/MenuItems/menu-items" as *;
30
+ @use "../../Atom/ReachElement/Details/details" as *;
31
+ @use "../../Atom/ReachElement/Figcaption/figcaption" as *;
32
+ @use "../../Atom/EmptyState/empty-state" as *;
33
+ @use "../../Atom/StatusLabel/status-label" as *;
34
+ @use "../../Atom/Table/table" as *;
35
+ @use "../../Atom/Tag/tag" as *;
36
+ @use "../../Atom/Video/video" as *;
37
37
 
38
38
  // Components
39
- @import "../../Components/Boilerplate/boilerplate";
40
- @import "../../Components/Forms/form-base";
41
- @import "../../Components/Forms/FormAction/form-action";
42
- @import "../../Components/Forms/FormGroup/form-group";
43
- @import "../../Components/Forms/TextInput/text-input";
44
- @import "../../Components/Forms/Textarea/textarea";
45
- @import "../../Components/Forms/Checkbox/checkbox";
46
- @import "../../Components/Forms/Radio/radio";
47
- @import "../../Components/Forms/SegmentedControl/segmented-control";
48
- @import "../../Components/Forms/Select/select";
49
- @import "../../Components/Forms/Range/range";
50
- @import "../../Components/Breadcrumbs/breadcrumbs";
39
+ @use "../../Components/Boilerplate/boilerplate" as *;
40
+ @use "../../Components/Forms/form-base" as *;
41
+ @use "../../Components/Forms/FormAction/form-action" as *;
42
+ @use "../../Components/Forms/FormGroup/form-group" as *;
43
+ @use "../../Components/Forms/TextInput/text-input" as *;
44
+ @use "../../Components/Forms/Textarea/textarea" as *;
45
+ @use "../../Components/Forms/Checkbox/checkbox" as *;
46
+ @use "../../Components/Forms/Radio/radio" as *;
47
+ @use "../../Components/Forms/SegmentedControl/segmented-control" as *;
48
+ @use "../../Components/Forms/Select/select" as *;
49
+ @use "../../Components/Forms/Range/range" as *;
50
+ @use "../../Components/Breadcrumbs/breadcrumbs" as *;
51
51
 
52
52
  // Deprecated (February 2026) — removal planned by end of 2026. Use Pager instead.
53
- @import "../../Components/Pager/pager";
54
- @import "../../Components/Gallery/gallery";
55
- @import "../../Components/HighlightBox/highlight-box";
56
- @import "../../Components/QuoteHighlight/quote-highlight";
57
- @import "../../Components/Buttons/Chips/chips";
58
- @import "../../Components/Buttons/CtaButton/cta-button";
59
- @import "../../Components/Buttons/ShareButtons/share-buttons";
60
- @import "../../Components/Buttons/CopyButton/copy-button";
61
- @import "../../Components/MegaMenu/mega-menu";
62
- @import "../../Patterns/HubHeader/hub-header";
63
- @import "../../Components/CiteThis/cite-this";
64
- @import "../../Utilities/PagePatterns/page-patterns";
65
- @import "../../Components/PageHeader/page-header";
66
- @import "../../Components/Cards/Card/card";
67
- @import "../../Components/Cards/StatsCard/stats-card";
68
- @import "../../Components/Snackbar/snackbar";
69
- @import "../../Components/CookieConsentBanner/cookie-consent-banner";
70
- @import "../../Components/Hero/hero";
71
- @import "../../Components/TextCta/text-cta";
72
- @import "../../Components/Notice/notice";
73
- @import "../../Components/ProgressBar/progress-bar";
74
- @import "../../Components/ScrollContainer/scroll-container";
75
- @import "../../Components/Tab/tab";
76
- @import "../../Components/UserFeedback/user-feedback";
53
+ @use "../../Components/Pager/pager" as *;
54
+ @use "../../Components/Gallery/gallery" as *;
55
+ @use "../../Components/HighlightBox/highlight-box" as *;
56
+ @use "../../Components/QuoteHighlight/quote-highlight" as *;
57
+ @use "../../Components/Buttons/Chips/chips" as *;
58
+ @use "../../Components/Buttons/CtaButton/cta-button" as *;
59
+ @use "../../Components/Buttons/ShareButtons/share-buttons" as *;
60
+ @use "../../Components/Buttons/CopyButton/copy-button" as *;
61
+ @use "../../Components/MegaMenu/mega-menu" as *;
62
+ @use "../../Patterns/HubHeader/hub-header" as *;
63
+ @use "../../Components/CiteThis/cite-this" as *;
64
+ @use "../../Utilities/PagePatterns/page-patterns" as *;
65
+ @use "../../Components/PageHeader/page-header" as *;
66
+ @use "../../Components/Cards/Card/card" as *;
67
+ @use "../../Components/Cards/StatsCard/stats-card" as *;
68
+ @use "../../Components/Snackbar/snackbar" as *;
69
+ @use "../../Components/CookieConsentBanner/cookie-consent-banner" as *;
70
+ @use "../../Components/Hero/hero" as *;
71
+ @use "../../Components/TextCta/text-cta" as *;
72
+ @use "../../Components/Notice/notice" as *;
73
+ @use "../../Components/ProgressBar/progress-bar" as *;
74
+ @use "../../Components/ScrollContainer/scroll-container" as *;
75
+ @use "../../Components/Tab/tab" as *;
76
+ @use "../../Components/UserFeedback/user-feedback" as *;
77
77
 
78
78
  // CSS+vanilla-JS component — Drupal integration via Gutenberg block, not a React export.
79
- @import "../../Components/TableOfContents/table-of-contents";
80
- @import "../../Components/OnThisPageNav/on-this-page-nav";
81
- @import "../../Components/PreviewAccess/preview-access";
82
- @import "../../Components/SyndicationSearchWidget/syndication-search-widget";
79
+ @use "../../Components/TableOfContents/table-of-contents" as *;
80
+ @use "../../Components/OnThisPageNav/on-this-page-nav" as *;
81
+ @use "../../Components/PreviewAccess/preview-access" as *;
82
+ @use "../../Components/SyndicationSearchWidget/syndication-search-widget" as *;
83
83
 
84
84
  // CSS+static-HTML component — not a React export. Static pages in dist/assets/error-pages/.
85
- @import "../../Components/ErrorPages/error-pages";
86
- @import "../../Components/Footer/footer";
85
+ @use "../../Components/ErrorPages/error-pages" as *;
86
+ @use "../../Components/Footer/footer" as *;
87
87
 
88
88
  // Molecules
89
- @import "../../Molecules/ImageCaption/image-caption";
89
+ @use "../../Molecules/ImageCaption/image-caption" as *;
90
90
 
91
91
  // Utilities
92
- @import "../../Utilities/EmbedContainer/embed-container";
93
- @import "../../Utilities/Loader/loader";
94
- @import "../../Utilities/FullWidth/full-width";
95
- @import "../../Utilities/ShowMore/show-more";
96
- @import "../../Utilities/SkipLink/skip-link";
97
- @import "../../Components/DataViz/Legend/legend";
98
- @import "../../Components/Navigation/Drawer/drawer";
99
- @import "../../Components/Navigation/Tree/tree";
92
+ @use "../../Utilities/EmbedContainer/embed-container" as *;
93
+ @use "../../Utilities/Loader/loader" as *;
94
+ @use "../../Utilities/FullWidth/full-width" as *;
95
+ @use "../../Utilities/ShowMore/show-more" as *;
96
+ @use "../../Utilities/SkipLink/skip-link" as *;
97
+ @use "../../Components/DataViz/Legend/legend" as *;
98
+ @use "../../Components/Navigation/Drawer/drawer" as *;
99
+ @use "../../Components/Navigation/Tree/tree" as *;
100
100
 
101
101
  // Opt-in editorial defaults follow component styles; classed islands opt out.
102
- @import "../../Patterns/RichContent/rich-content";
102
+ @use "../../Patterns/RichContent/rich-content" as *;
103
+ @use "../../Patterns/ContentTeaser/content-teaser";
104
+ @use "../../Patterns/ContentCard/content-card";
@@ -0,0 +1,183 @@
1
+ // Internal CSS-free build-time configuration and public Sass helpers.
2
+ // Public consumers load variables for the foundational root declarations.
3
+ @use "sass:math";
4
+ @use "sass:meta";
5
+ @forward "tokens-tabs";
6
+ @use "tokens-tabs" as *;
7
+
8
+ // Brand tokens. The palette, the spacing/type/width scales, the semantic
9
+ // tier and every component token a brand can restyle are generated from
10
+ // tokens/mangrove.yaml (the brand-neutral base) merged with tokens/undrr.yaml
11
+ // (UNDRR identity). Editing a value here would be overwritten; edit the YAML
12
+ // and run `yarn build:tokens`.
13
+ @forward "generated/tokens-mangrove";
14
+ @use "generated/tokens-mangrove" as *;
15
+
16
+ // Root font-size anchor: fixed at the browser-standard 16px root (1rem = 16px),
17
+ // used by mg-rem() to convert intended pixel values to rem at build time. The
18
+ // legacy 10px root — the `!default` override and the style-*-legacy.scss
19
+ // variants — was removed in 2.0; consumers use a standard 16px document root.
20
+ $mg-html-font-size: 16; // BUILD-TIME ONLY
21
+
22
+ // Converts an intended pixel value to rem for the 16px root.
23
+ // Example: mg-rem(16) → 1rem, mg-rem(24) → 1.5rem
24
+ @function mg-rem($px) {
25
+ @return math.div($px, $mg-html-font-size) * 1rem;
26
+ }
27
+
28
+ // font file variables
29
+ // Path adjusted for Storybook staticDirs (serves assets/ at root, not /assets/)
30
+ $mgIconFontPath: "../fonts/mangrove-icon-set/font" !default; // BUILD-TIME ONLY
31
+
32
+ // image variables
33
+ $img-path: "~/stories/assets/images"; // BUILD-TIME ONLY
34
+ $img-path-Icon: "~/stories/assets/icons"; // BUILD-TIME ONLY
35
+ $img-path-Iconback: "~/stories/assets/icons"; // BUILD-TIME ONLY
36
+ $img-path-Iconfourback: "~/stories/assets/icons"; // BUILD-TIME ONLY
37
+
38
+ $mg-font-body: $mg-font-size-300;
39
+ $mg-font-tag: $mg-font-size-250 !default;
40
+
41
+ // This is not really a "varaible" but kept here for now
42
+ // until we more fully rationalise our design decisions
43
+ @mixin mg-typography($size) {
44
+ @if $size == "extra-small" {
45
+ font-size: var(--mg-font-size-300);
46
+ } @else if $size == "small" {
47
+ font-size: var(--mg-font-size-400);
48
+ } @else if $size == "medium" {
49
+ font-size: var(--mg-font-size-500);
50
+ padding-top: var(--mg-spacing-250);
51
+ padding-bottom: var(--mg-spacing-150);
52
+ } @else if $size == "large" {
53
+ font-size: var(--mg-font-size-600);
54
+ padding-top: var(--mg-spacing-250);
55
+ padding-bottom: var(--mg-spacing-150);
56
+ } @else if $size == "xlarge" {
57
+ font-size: var(--mg-font-size-900);
58
+ padding-top: var(--mg-spacing-300);
59
+ padding-bottom: var(--mg-spacing-175);
60
+ } @else if $size == "huge" {
61
+ font-size: var(--mg-font-size-1000);
62
+ padding-top: var(--mg-spacing-300);
63
+ padding-bottom: var(--mg-spacing-250);
64
+ } @else if $size == "xhuge" {
65
+ font-size: var(--mg-font-size-1100);
66
+ padding-top: var(--mg-spacing-400);
67
+ padding-bottom: var(--mg-spacing-300);
68
+ }
69
+ }
70
+
71
+ // --- Font faces ---
72
+ // A font stack, rendered for a custom property value with its quoting intact.
73
+
74
+ // Plain interpolation of a Sass list strips the quotes from its quoted
75
+ // members, and a custom property value is parsed as a token stream rather than
76
+ // as a font-family. An override such as
77
+ // `$mg-font-face-sans: "Frutiger 55 Roman", sans-serif` would emit
78
+ // `Frutiger 55 Roman`; `55` is not a valid custom-ident, so the declaration is
79
+ // invalid at computed-value time, the role is never defined, and every element
80
+ // referencing it falls back to the browser's default serif. Frutiger, Univers
81
+ // and Helvetica Neue LT Std all name weights numerically, so this is the
82
+ // common case for the licensed brand faces the `!default` escape hatch exists
83
+ // to admit. `meta.inspect()` renders the list the way Sass wrote it.
84
+
85
+ // It lives here so both role definitions and the fonts module preserve
86
+ // quoted family names in exactly the same way.
87
+ // See unisdr/undrr-mangrove#1098.
88
+ @function mg-font-stack($stack) {
89
+ @return meta.inspect($stack);
90
+ }
91
+
92
+ // Faces name what fonts exist. Roles (--mg-font-family-text / -heading /
93
+ // -display / -ui / -code) name the reader's task and are mapped onto these
94
+ // faces per script in _fonts.scss. No component stylesheet may name a
95
+ // face: it references a role. See unisdr/undrr-mangrove#1098.
96
+
97
+ // Faces keep `!default` so a consumer compiling Mangrove from source can swap
98
+ // in a licensed brand face before the import. That is the only way to introduce
99
+ // a face Mangrove does not ship: a runtime role override
100
+ // (`.mg-theme-* { --mg-font-family-ui: ...; }`) can only re-point a role among
101
+ // the faces _fonts.scss already loads @font-face rules for.
102
+ // These variables live outside the brand mixin, so a Sass override applies to
103
+ // every brand in the combined style-all.css. Per-brand faces need the runtime
104
+ // override instead.
105
+ // Quote any family name that is not a plain CSS identifier — anything with a
106
+ // space, a digit-leading word or punctuation. The public variables `:root` block
107
+ // round-trips these through `mg-font-stack()` so the quotes survive into the
108
+ // emitted custom property; see the note on that function.
109
+ $mg-font-face-sans: "Roboto", sans-serif !default;
110
+ $mg-font-face-sans-condensed: "Roboto Condensed", sans-serif !default;
111
+ $mg-font-face-mono:
112
+ ui-monospace, "SFMono-Regular", "Consolas", "Liberation Mono", "Menlo",
113
+ monospace !default;
114
+
115
+ // Arabic fonts
116
+ // Noto Kufi Arabic for headings, Noto Sans Arabic for body. Decided in
117
+ // unisdr/undrr-mangrove#1089, which replaced Dubai across every brand.
118
+
119
+ // Dubai was inherited from OCHA, but the inheritance was weaker than it looked
120
+ // and had gone out of date on both halves. Dubai was OCHA's ALTERNATIVE
121
+ // subtheme pairing (body only, never headings, Regular only), not their base
122
+ // theme, which used Noto Kufi Arabic. And on 2026-05-28 OCHA's brand guidance
123
+ // moved to Almarai for display and Noto Sans Arabic for body.
124
+
125
+ // Both Noto families are SIL Open Font License 1.1.
126
+
127
+ // This is two Arabic families where 2.0.0-alpha.3 had one. Kufi is a display
128
+ // style -- angular, high contrast, architectural -- so it earns its place in
129
+ // headings and is the wrong choice at body size; Noto Sans Arabic carries the
130
+ // running text and shares Noto Sans' proportions. The second download is
131
+ // subset by unicode-range, so a page pays for the scripts it actually renders.
132
+
133
+ // Only Regular and Bold exist upstream for both families, so Arabic has a
134
+ // 400/700 binary where Latin has a ladder. Nothing is faux bolded: the 600
135
+ // used in _foundational.scss resolves UP to the real Bold. The cost is a lost
136
+ // tier of emphasis, not a rendering defect.
137
+ $mg-font-face-arabic-display: "Noto Kufi Arabic", sans-serif !default;
138
+ $mg-font-face-arabic-sans: "Noto Sans Arabic", sans-serif !default;
139
+
140
+ // BUILD-TIME ONLY — breakpoints cannot be CSS custom properties.
141
+ // @media queries require static values resolved at compile time; var() is invalid there.
142
+ // Do not add --mg-breakpoint-* custom properties.
143
+ $mg-breakpoint-mobile: 480px;
144
+ $mg-breakpoint-tablet: 900px;
145
+ $mg-breakpoint-desktop: 1164px;
146
+ $mg-breakpoint-desktop-wide: 1440px;
147
+
148
+ // tabs
149
+ // BUILD-TIME ONLY: $mg-tabs-border-bottom drives @if conditional in tab.scss.
150
+ // Cannot become a CSS custom property — no runtime conditional equivalent exists.
151
+ // All sub-brands use true. To disable, set to false before @use.
152
+ $mg-tabs-border-bottom: true !default;
153
+
154
+ // Header height
155
+ $header-height-xlarge: 115px;
156
+ $header-height-medium: 75px;
157
+
158
+ /* variables end */
159
+
160
+ // stylelint-disable comment-whitespace-inside -- Preserve the fixed-width source easter egg.
161
+ /*============================================================================+
162
+ | [z-level: -2] [Biome: Server Rack] [Activity: Constructing Frameworks] |
163
+ +=============================================================================+
164
+ |X| d | _ _ _ _ ___ ___ ___ c X |
165
+ |X| [HTML] | w | | | | \| | \| _ \ _ \ [JS] | X |
166
+ |X| \--/ | [===] | |_| | | | |) | / / \--/ | X |
167
+ |X| || | || \___/|_|\_|___/|_|_\_|_\ || | d X |
168
+ |X| || | || | [=O=]X|
169
+ |X| c || | || c \ [DB_]X|
170
+ |X| _||_ | _||_ __ __ _ _ _ ___ ___ _____ __ ___ X |
171
+ |X|d [CSS ] | [NODE] | \/ | /_\ | \| |/ __| _ \/ _ \ \ / / | __| X |
172
+ |X|\ \--/ | \--/ | |\/| |/ _ \| | | (_ | / (_) \ V / | _| X |
173
+ |X|| || | d || |_| |_/_/ \_\_|\_|\___|_|_\\___/ \_/ |___| X |
174
+ |X|| || | || X |
175
+ |X|| || d | || ___ w X |
176
+ |X|| [=O=] | || c |_ ) d [=O=] X |
177
+ |X|| [API] | || [DOM] / / [=O=] [JSON] X |
178
+ |X|\============|==== || ========= \--/ /___| [CMS] || X |
179
+ |X| || || || X |
180
+ +=============================================================================+
181
+ | KEY: d=web-dwarf c=coder-dwarf w=wrangler [=O=]=data forge X=stairwell |
182
+ +============================================================================*/
183
+ // stylelint-enable comment-whitespace-inside
@@ -0,0 +1,10 @@
1
+ // Build-time font asset URLs. Shared by the font entry point and face modules.
2
+ $font-path-roboto: "https://assets.undrr.org/fonts/roboto/v1.0.0" !default;
3
+ $font-path-roboto-condensed: "https://assets.undrr.org/fonts/roboto-condensed/v1.0.0" !default;
4
+ $font-path-noto-kufi-arabic: "https://assets.undrr.org/fonts/noto-kufi-arabic/v1.1.0" !default;
5
+ $font-path-noto-sans-arabic: "https://assets.undrr.org/fonts/noto-sans-arabic/v1.0.0" !default;
6
+
7
+ // Legacy Roboto file-name/version hooks were shared by the import chain.
8
+ // Keep one source for both Roboto families, including configured overrides.
9
+ $FontName: "Roboto" !default;
10
+ $font-version: "2.137" !default;
@@ -0,0 +1,2 @@
1
+ // Legacy globals configure forwarded modules on first load (Sass semantics).
2
+ @forward "fonts";
@@ -1,3 +1,10 @@
1
+ @forward "font-paths";
2
+ @use "../fonts/roboto/roboto" as *;
3
+ @use "../fonts/roboto-condensed/roboto-condensed" as *;
4
+ @use "../fonts/noto-kufi-arabic/noto-kufi-arabic" as *;
5
+ @use "../fonts/noto-sans-arabic/noto-sans-arabic" as *;
6
+ @use "config" as *;
7
+
1
8
  // The font entry point. This file owns everything about type FACES: the asset
2
9
  // paths, the `@font-face` declarations, and the script routing that re-points
3
10
  // the font roles for Arabic. There is one font import, not two —
@@ -30,61 +37,12 @@
30
37
  // read as prose and take `text`.
31
38
  // code code / pre
32
39
 
33
- // IMPORT _variables.scss BEFORE THIS FILE. The script routing at the bottom
34
- // builds its values with `mg-font-stack()` and the `$mg-font-face-*` variables,
35
- // all of which _variables.scss owns, so this file does not compile on its own.
36
- // The failure is a hard `Undefined variable` error rather than a silent
37
- // fallback, but not every build path names both files in the same place — see
38
- // the Drupal list below.
39
-
40
- // IMPORT THIS FILE EXACTLY ONCE PER BUILD. Sass's legacy `@import` re-emits,
41
- // and `@import` is not allowed inside `@if`, so the `@font-face` partials below
42
- // cannot be guarded — a second visit would duplicate all 32 blocks. Every
43
- // supported build path reaches it once and only once:
44
-
45
- // - the seven style*.scss entry points import _variables.scss and then this
46
- // file, both directly;
47
- // - the shared import list every UNDRR Drupal theme compiles
48
- // (undrr_common/scss/_mangrove-components.scss) names `fonts` in its own
49
- // right — first in the list, ahead of breakpoints, mixins, foundational and
50
- // utility. It does NOT name `variables` anywhere: the theme entry point one
51
- // level up supplies that, either as `@use "variables" as *` or as a plain
52
- // `@import`, before it reaches the list. So the ordering rule above is a
53
- // contract across two files, and copying or reordering that list without
54
- // carrying its entry point's `variables` import is a compile error;
55
- // - the per-component recipe in SassIntegration.mdx names both, in order.
56
-
57
- // _foundational.scss therefore does NOT import it. It used to import
58
- // _font-roles.scss, because that file was reachable from the entry points only
59
- // and every production site was compiling the roles with no Arabic map behind
60
- // them: Arabic text asked for Roboto, which has no Arabic coverage, and every
61
- // glyph fell back to the OS default. Silently. Folding the map into the file
62
- // consumers already import closes that hole at the source instead of routing
63
- // around it. A test in __tests__/font-roles.test.js counts the `@font-face`
64
- // blocks in every compiled bundle and in the consumer import list, so adding a
65
- // second import of this file fails the suite rather than shipping quietly.
66
-
67
- /* Roboto */
68
- $font-path-roboto: "https://assets.undrr.org/fonts/roboto/v1.0.0" !default;
69
-
70
- @import "../fonts/roboto/roboto";
71
-
72
- /* Roboto Condensed */
73
- $font-path-roboto-condensed: "https://assets.undrr.org/fonts/roboto-condensed/v1.0.0" !default;
74
-
75
- @import "../fonts/roboto-condensed/roboto-condensed";
76
-
77
- /* Arabic Fonts */
78
-
79
- /* Noto Kufi Arabic - for headings in Arabic */
80
- $font-path-noto-kufi-arabic: "https://assets.undrr.org/fonts/noto-kufi-arabic/v1.1.0" !default;
81
-
82
- @import "../fonts/noto-kufi-arabic/noto-kufi-arabic";
83
-
84
- /* Noto Sans Arabic - for body text in Arabic */
85
- $font-path-noto-sans-arabic: "https://assets.undrr.org/fonts/noto-sans-arabic/v1.0.0" !default;
86
-
87
- @import "../fonts/noto-sans-arabic/noto-sans-arabic";
40
+ // Module dependencies are explicit: variables owns role definitions and
41
+ // font-paths owns configurable asset URLs without loading any face modules.
42
+ // @use emits these faces once even when several consumers depend on fonts.
43
+ // Legacy @import consumers are routed through _fonts.import.scss to preserve
44
+ // pre-import URL assignments. The shared Drupal import list and the published
45
+ // per-component recipe are covered by __tests__/font-roles.test.js.
88
46
 
89
47
  @mixin mg-font-roles-arabic {
90
48
  --mg-font-family-text: #{mg-font-stack($mg-font-face-arabic-sans)};
@@ -1,3 +1,7 @@
1
+ @use "breakpoints" as *;
2
+ @use "mixins" as *;
3
+ @use "config" as *;
4
+
1
5
  /* typography start */
2
6
  *,
3
7
  *::before,
@@ -71,9 +75,8 @@ caption {
71
75
  // Latin face and _fonts.scss re-points to Noto Kufi Arabic. Compile
72
76
  // _foundational.scss without _fonts.scss and the rule still matches but
73
77
  // resolves to Roboto, which has no Arabic coverage. Every documented import
74
- // list names both; _fonts.scss does not import itself into this file, because
75
- // the entry points already import it and Sass's legacy `@import` would emit its
76
- // 32 `@font-face` blocks a second time.
78
+ // list names both. Keep face loading in the fonts module, which emits its
79
+ // 32 text `@font-face` blocks once for every supported entry point.
77
80
  h1:lang(ar),
78
81
  h2:lang(ar),
79
82
  h3:lang(ar) {
@@ -0,0 +1,37 @@
1
+ // Import-only bridges inspect the caller's scope; this module owns the
2
+ // shared diagnostics so entry-point bridges cannot drift from variables.
3
+ @use "sass:map";
4
+
5
+ $legacy-roles: (
6
+ "mg-color-interactive": null,
7
+ "mg-color-interactive-active": null,
8
+ "mg-color-button-background": null,
9
+ "mg-color-button-background--hover": null,
10
+ "mg-border-color-button": null,
11
+ "mg-color-tag": null,
12
+ "mg-color-form-check": null,
13
+ "mg-color-form-focus": null,
14
+ "mg-color-hero": null,
15
+ "mg-color-hero--secondary": null,
16
+ "mg-spacing-150": null,
17
+ "mg-spacing-300": null,
18
+ "mg-font-family": "text",
19
+ "mg-font-family-headings": "ui",
20
+ "mg-font-family-condensed": "ui",
21
+ "mg-font-family-icons": "",
22
+ "mg-font-family-arabic-headings": "heading",
23
+ "mg-font-family-arabic-body": "text",
24
+ );
25
+ $legacy-names: map.keys($legacy-roles);
26
+
27
+ @mixin warn-override($name) {
28
+ $role: map.get($legacy-roles, $name);
29
+
30
+ @if not $role {
31
+ @warn "Mangrove 2.0: `$#{$name}` no longer has any effect — color and spacing tokens are CSS custom properties now. Move the override into a `.mg-theme-* { --#{$name}: ...; }` block (or `:root`). See docs/RELEASE-2.0.md.";
32
+ } @else if $role == "" {
33
+ @warn "Mangrove 2.0: `$#{$name}` no longer exists and has no replacement — it had no stylesheet consumer, and icons.scss names the FontAwesome family directly. See docs/RELEASE-2.0.md.";
34
+ } @else {
35
+ @warn "Mangrove 2.0: `$#{$name}` no longer has any effect — font families are role custom properties now. Move the override into a `.mg-theme-* { --mg-font-family-#{$role}: ...; }` block (or `:root`). See docs/RELEASE-2.0.md.";
36
+ }
37
+ }
@@ -1,3 +1,5 @@
1
+ @use "breakpoints" as *;
2
+
1
3
  // background image gradient
2
4
  @mixin background-image($deg, $colorname, $opacity) {
3
5
  background: linear-gradient($deg, $colorname, $opacity);
@@ -0,0 +1,11 @@
1
+ // Legacy globals configure forwarded modules on first load (Sass semantics).
2
+ @use "sass:meta";
3
+ @use "legacy-warnings";
4
+ @forward "style-all";
5
+
6
+ // Evaluate in the legacy caller scope, after all module forwards.
7
+ @each $_name in legacy-warnings.$legacy-names {
8
+ @if meta.variable-exists($_name) {
9
+ @include legacy-warnings.warn-override($_name);
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ // Legacy globals configure forwarded modules on first load (Sass semantics).
2
+ @use "sass:meta";
3
+ @use "legacy-warnings";
4
+ @forward "style-delta";
5
+
6
+ // Evaluate in the legacy caller scope, after all module forwards.
7
+ @each $_name in legacy-warnings.$legacy-names {
8
+ @if meta.variable-exists($_name) {
9
+ @include legacy-warnings.warn-override($_name);
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ // Legacy globals configure forwarded modules on first load (Sass semantics).
2
+ @use "sass:meta";
3
+ @use "legacy-warnings";
4
+ @forward "style-gutenberg";
5
+
6
+ // Evaluate in the legacy caller scope, after all module forwards.
7
+ @each $_name in legacy-warnings.$legacy-names {
8
+ @if meta.variable-exists($_name) {
9
+ @include legacy-warnings.warn-override($_name);
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ // Legacy globals configure forwarded modules on first load (Sass semantics).
2
+ @use "sass:meta";
3
+ @use "legacy-warnings";
4
+ @forward "style-irp";
5
+
6
+ // Evaluate in the legacy caller scope, after all module forwards.
7
+ @each $_name in legacy-warnings.$legacy-names {
8
+ @if meta.variable-exists($_name) {
9
+ @include legacy-warnings.warn-override($_name);
10
+ }
11
+ }