@tpzdsp/next-toolkit 2.5.0 → 3.0.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 (355) hide show
  1. package/package.json +22 -13
  2. package/src/assets/styles/globals.css +75 -95
  3. package/src/assets/styles/ol.css +57 -16
  4. package/src/assets/styles/utils.css +80 -0
  5. package/src/components/Accordion/Accordion.css +85 -0
  6. package/src/components/Accordion/Accordion.stories.tsx +264 -0
  7. package/src/components/Accordion/Accordion.tsx +98 -0
  8. package/src/components/Alert/Alert.css +129 -0
  9. package/src/components/Alert/Alert.stories.tsx +291 -0
  10. package/src/components/Alert/Alert.tsx +76 -0
  11. package/src/components/BackLink/BackLink.css +12 -0
  12. package/src/components/BackLink/BackLink.stories.tsx +52 -0
  13. package/src/components/BackLink/BackLink.tsx +44 -0
  14. package/src/components/BackToTop/BackToTop.css +23 -0
  15. package/src/components/BackToTop/BackToTop.stories.tsx +41 -0
  16. package/src/components/BackToTop/BackToTop.tsx +48 -0
  17. package/src/components/Breadcrumb/Breadcrumb.css +42 -0
  18. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +94 -0
  19. package/src/components/Breadcrumb/Breadcrumb.tsx +135 -0
  20. package/src/components/Button/Button.css +229 -0
  21. package/src/components/Button/Button.stories.tsx +140 -20
  22. package/src/components/Button/Button.tsx +53 -28
  23. package/src/components/Button/ButtonSkeleton.stories.tsx +50 -0
  24. package/src/components/Button/ButtonSkeleton.tsx +14 -0
  25. package/src/components/ButtonGroup/ButtonGroup.css +52 -0
  26. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +156 -0
  27. package/src/components/ButtonGroup/ButtonGroup.tsx +50 -0
  28. package/src/components/ButtonLink/ButtonLink.css +114 -0
  29. package/src/components/ButtonLink/ButtonLink.stories.tsx +38 -51
  30. package/src/components/ButtonLink/ButtonLink.tsx +54 -23
  31. package/src/components/Card/Card.css +13 -0
  32. package/src/components/Card/Card.stories.tsx +98 -57
  33. package/src/components/Card/Card.tsx +4 -13
  34. package/src/components/CardGroup/CardGroup.css +10 -0
  35. package/src/components/CardGroup/CardGroup.stories.tsx +81 -0
  36. package/src/components/CardGroup/CardGroup.tsx +9 -0
  37. package/src/components/Checkbox/Checkbox.css +49 -0
  38. package/src/components/Checkbox/Checkbox.stories.tsx +86 -0
  39. package/src/components/Checkbox/Checkbox.tsx +32 -0
  40. package/src/components/Chip/Chip.css +54 -0
  41. package/src/components/Chip/Chip.stories.tsx +94 -0
  42. package/src/components/Chip/Chip.tsx +34 -0
  43. package/src/components/CookieBanner/CookieBanner.css +19 -0
  44. package/src/components/CookieBanner/CookieBanner.stories.tsx +52 -0
  45. package/src/components/CookieBanner/CookieBanner.tsx +55 -0
  46. package/src/components/CopyButton/CopyButton.stories.tsx +28 -0
  47. package/src/components/CopyButton/CopyButton.tsx +65 -0
  48. package/src/components/DateInput/DateInput.css +13 -0
  49. package/src/components/DateInput/DateInput.stories.tsx +131 -0
  50. package/src/components/DateInput/DateInput.test.tsx +21 -0
  51. package/src/components/DateInput/DateInput.tsx +98 -0
  52. package/src/components/Details/Details.css +28 -0
  53. package/src/components/Details/Details.stories.tsx +48 -0
  54. package/src/components/Details/Details.tsx +41 -0
  55. package/src/components/Dropdown/Dropdown.css +81 -0
  56. package/src/components/Dropdown/Dropdown.stories.tsx +131 -0
  57. package/src/components/Dropdown/Dropdown.tsx +69 -0
  58. package/src/components/ErrorBoundary/ErrorBoundary.stories.tsx +4 -39
  59. package/src/components/ErrorBoundary/ErrorBoundary.tsx +7 -4
  60. package/src/components/ErrorBoundary/ErrorFallback.tsx +32 -66
  61. package/src/components/ErrorModal/ErrorModal.css +32 -0
  62. package/src/components/ErrorModal/ErrorModal.stories.tsx +101 -0
  63. package/src/components/ErrorModal/ErrorModal.tsx +120 -0
  64. package/src/components/ErrorText/ErrorText.css +22 -0
  65. package/src/components/ErrorText/ErrorText.stories.tsx +42 -27
  66. package/src/components/ErrorText/ErrorText.tsx +10 -8
  67. package/src/components/ExternalLink/ExternalLink.css +12 -0
  68. package/src/components/ExternalLink/ExternalLink.stories.tsx +43 -0
  69. package/src/components/ExternalLink/ExternalLink.tsx +43 -0
  70. package/src/components/Fieldset/Fieldset.css +103 -0
  71. package/src/components/Fieldset/Fieldset.stories.tsx +304 -0
  72. package/src/components/Fieldset/Fieldset.tsx +38 -0
  73. package/src/components/FileUpload/FileUpload.css +85 -0
  74. package/src/components/FileUpload/FileUpload.stories.tsx +106 -0
  75. package/src/components/FileUpload/FileUpload.tsx +99 -0
  76. package/src/components/{layout/footer → Footer}/Copyright.tsx +4 -2
  77. package/src/components/Footer/Footer.stories.tsx +24 -0
  78. package/src/components/Footer/Footer.tsx +41 -0
  79. package/src/components/Footer/Licence.tsx +18 -0
  80. package/src/components/{layout/footer → Footer}/MetaLinks.tsx +8 -3
  81. package/src/components/Footer/Small/SmallFooter.tsx +43 -42
  82. package/src/components/Form/FormGroup.css +18 -0
  83. package/src/components/Form/FormGroup.stories.tsx +87 -0
  84. package/src/components/Form/FormGroup.tsx +16 -0
  85. package/src/components/{layout/header → Header}/Header.stories.tsx +26 -12
  86. package/src/components/Header/Header.test.tsx +87 -0
  87. package/src/components/Header/Header.tsx +303 -0
  88. package/src/components/Header/HeaderAppContent.tsx +120 -0
  89. package/src/components/Heading/Heading.css +40 -0
  90. package/src/components/Heading/Heading.stories.tsx +15 -5
  91. package/src/components/Heading/Heading.tsx +21 -44
  92. package/src/components/Heading/HeadingSkeleton.stories.tsx +30 -0
  93. package/src/components/Heading/HeadingSkeleton.tsx +14 -0
  94. package/src/components/Hero/Hero.css +19 -0
  95. package/src/components/Hero/Hero.stories.tsx +41 -0
  96. package/src/components/Hero/Hero.tsx +14 -0
  97. package/src/components/HintText/HintText.css +5 -0
  98. package/src/components/HintText/HintText.stories.tsx +29 -0
  99. package/src/components/HintText/HintText.tsx +13 -0
  100. package/src/components/InfoBox/InfoBox.css +38 -0
  101. package/src/components/InfoBox/InfoBox.stories.tsx +51 -403
  102. package/src/components/InfoBox/InfoBox.tsx +31 -158
  103. package/src/components/Input/Input.css +77 -0
  104. package/src/components/Input/Input.stories.tsx +123 -0
  105. package/src/components/Input/Input.tsx +74 -0
  106. package/src/components/InputGroup/InputGroup.css +140 -0
  107. package/src/components/InputGroup/InputGroup.stories.tsx +125 -0
  108. package/src/components/InputGroup/InputGroup.tsx +47 -0
  109. package/src/components/InsetText/InsetText.css +5 -0
  110. package/src/components/InsetText/InsetText.stories.tsx +30 -0
  111. package/src/components/InsetText/InsetText.tsx +9 -0
  112. package/src/components/Keyboard/Keyboard.css +9 -0
  113. package/src/components/Keyboard/Keyboard.stories.tsx +63 -0
  114. package/src/components/Keyboard/Keyboard.tsx +30 -0
  115. package/src/components/Label/Label.css +27 -0
  116. package/src/components/Label/Label.stories.tsx +40 -0
  117. package/src/components/Label/Label.tsx +17 -0
  118. package/src/components/LayerSwitcher/LayerSwitcher.css +59 -0
  119. package/src/components/LayerSwitcher/LayerSwitcher.stories.tsx +112 -0
  120. package/src/components/LayerSwitcher/LayerSwitcher.tsx +61 -0
  121. package/src/components/Layout/401/401.stories.tsx +23 -0
  122. package/src/components/Layout/401/401.tsx +1 -0
  123. package/src/components/Layout/403/403.stories.tsx +23 -0
  124. package/src/components/Layout/403/403.tsx +21 -0
  125. package/src/components/Layout/404/404.stories.tsx +23 -0
  126. package/src/components/Layout/404/404.tsx +28 -0
  127. package/src/components/Layout/500/500.stories.tsx +56 -0
  128. package/src/components/Layout/500/500.tsx +63 -0
  129. package/src/components/Layout/ButtonGroup/ButtonGroup.css +52 -0
  130. package/src/components/Layout/ButtonGroup/ButtonGroup.stories.tsx +156 -0
  131. package/src/components/Layout/ButtonGroup/ButtonGroup.tsx +50 -0
  132. package/src/components/Layout/HeadingGroup/HeadingGroup.css +21 -0
  133. package/src/components/Layout/HeadingGroup/HeadingGroup.stories.tsx +84 -0
  134. package/src/components/Layout/HeadingGroup/HeadingGroup.tsx +9 -0
  135. package/src/components/Layout/MainWrapper/MainWrapper.css +12 -0
  136. package/src/components/Layout/MainWrapper/MainWrapper.stories.tsx +36 -0
  137. package/src/components/Layout/MainWrapper/MainWrapper.tsx +14 -0
  138. package/src/components/Layout/PageShell/PageShell.css +42 -0
  139. package/src/components/Layout/PageShell/PageShell.stories.tsx +108 -0
  140. package/src/components/Layout/PageShell/PageShell.tsx +31 -0
  141. package/src/components/Layout/ParagraphGroup/ParagraphGroup.css +5 -0
  142. package/src/components/Layout/ParagraphGroup/ParagraphGroup.stories.tsx +34 -0
  143. package/src/components/Layout/ParagraphGroup/ParagraphGroup.tsx +9 -0
  144. package/src/components/Layout/Stack/Stack.css +29 -0
  145. package/src/components/Layout/Stack/Stack.stories.tsx +83 -0
  146. package/src/components/Layout/Stack/Stack.tsx +19 -0
  147. package/src/components/Layout/WidthContainer/WidthContainer.css +17 -0
  148. package/src/components/Layout/WidthContainer/WidthContainer.stories.tsx +59 -0
  149. package/src/components/Layout/WidthContainer/WidthContainer.tsx +13 -0
  150. package/src/components/Legend/Legend.css +95 -0
  151. package/src/components/Legend/Legend.stories.tsx +81 -0
  152. package/src/components/Legend/Legend.tsx +32 -0
  153. package/src/components/Legend/LegendDot.tsx +15 -0
  154. package/src/components/Legend/LegendPanel.stories.tsx +101 -0
  155. package/src/components/Legend/LegendPanel.tsx +68 -0
  156. package/src/components/Legend/LegendSkeleton.stories.tsx +87 -0
  157. package/src/components/Legend/LegendSkeleton.tsx +73 -0
  158. package/src/components/LegendSelect/LegendSelect.css +8 -0
  159. package/src/components/LegendSelect/LegendSelect.stories.tsx +80 -0
  160. package/src/components/LegendSelect/LegendSelect.tsx +26 -0
  161. package/src/components/Link/Link.css +98 -0
  162. package/src/components/Link/Link.stories.tsx +70 -0
  163. package/src/components/Link/Link.tsx +52 -0
  164. package/src/components/LinkButton/LinkButton.css +67 -0
  165. package/src/components/LinkButton/LinkButton.stories.tsx +90 -42
  166. package/src/components/LinkButton/LinkButton.tsx +50 -63
  167. package/src/components/LinkList/LinkList.css +28 -0
  168. package/src/components/LinkList/LinkList.stories.tsx +46 -0
  169. package/src/components/LinkList/LinkList.tsx +23 -0
  170. package/src/components/List/Li.tsx +9 -0
  171. package/src/components/List/List.css +9 -0
  172. package/src/components/List/OrderedList.stories.tsx +36 -0
  173. package/src/components/List/OrderedList.tsx +9 -0
  174. package/src/components/List/UnorderedList.stories.tsx +36 -0
  175. package/src/components/List/UnorderedList.tsx +9 -0
  176. package/src/components/LoadingBox/LoadingBox.css +27 -0
  177. package/src/components/LoadingBox/LoadingBox.stories.tsx +66 -0
  178. package/src/components/LoadingBox/LoadingBox.tsx +40 -0
  179. package/src/components/Modal/Modal.css +114 -0
  180. package/src/components/Modal/Modal.stories.tsx +41 -160
  181. package/src/components/Modal/Modal.tsx +132 -75
  182. package/src/components/NoScriptBanner/NoScriptBanner.css +17 -0
  183. package/src/components/NoScriptBanner/NoScriptBanner.stories.tsx +46 -0
  184. package/src/components/NoScriptBanner/NoScriptBanner.tsx +26 -0
  185. package/src/components/Paragraph/Paragraph.css +22 -0
  186. package/src/components/Paragraph/Paragraph.stories.tsx +1 -42
  187. package/src/components/Paragraph/Paragraph.tsx +4 -3
  188. package/src/components/Paragraph/ParagraphSkeleton.stories.tsx +44 -0
  189. package/src/components/Paragraph/ParagraphSkeleton.tsx +33 -0
  190. package/src/components/PasswordInput/PasswordInput.css +3 -0
  191. package/src/components/PasswordInput/PasswordInput.stories.tsx +47 -0
  192. package/src/components/PasswordInput/PasswordInput.tsx +45 -0
  193. package/src/components/PhaseBanner/PhaseBanner.css +12 -0
  194. package/src/components/PhaseBanner/PhaseBanner.stories.tsx +61 -0
  195. package/src/components/PhaseBanner/PhaseBanner.tsx +17 -0
  196. package/src/components/Popover/Popover.css +43 -0
  197. package/src/components/Popover/Popover.stories.tsx +102 -0
  198. package/src/components/Popover/Popover.tsx +40 -0
  199. package/src/components/Radio/Radio.css +69 -0
  200. package/src/components/Radio/Radio.stories.tsx +169 -0
  201. package/src/components/Radio/Radio.tsx +56 -0
  202. package/src/components/Resizable/Resizable.css +86 -0
  203. package/src/components/Resizable/Resizable.stories.tsx +123 -0
  204. package/src/components/Resizable/Resizable.tsx +86 -0
  205. package/src/components/ScrollArea/ScrollArea.css +9 -0
  206. package/src/components/ScrollArea/ScrollArea.stories.tsx +42 -0
  207. package/src/components/ScrollArea/ScrollArea.tsx +11 -0
  208. package/src/components/SearchBox/SearchBox.stories.tsx +88 -0
  209. package/src/components/SearchBox/SearchBox.tsx +36 -0
  210. package/src/components/Select/AsyncSelect.stories.tsx +84 -0
  211. package/src/components/Select/AsyncSelect.tsx +41 -0
  212. package/src/components/Select/Select.css +194 -0
  213. package/src/components/Select/Select.stories.tsx +162 -0
  214. package/src/components/Select/Select.test.tsx +36 -0
  215. package/src/components/Select/Select.tsx +291 -0
  216. package/src/components/Select/SelectSkeleton.stories.tsx +51 -0
  217. package/src/components/Select/SelectSkeleton.tsx +23 -0
  218. package/src/components/Separator/Separator.css +41 -0
  219. package/src/components/Separator/Separator.stories.tsx +63 -0
  220. package/src/components/Separator/Separator.tsx +42 -0
  221. package/src/components/Sidebar/ResizableSidebar.tsx +118 -0
  222. package/src/components/Sidebar/Sidebar.css +203 -0
  223. package/src/components/Sidebar/Sidebar.stories.tsx +438 -0
  224. package/src/components/Sidebar/Sidebar.tsx +225 -0
  225. package/src/components/Skeleton/Skeleton.css +16 -0
  226. package/src/components/Skeleton/Skeleton.stories.tsx +39 -0
  227. package/src/components/Skeleton/Skeleton.tsx +12 -0
  228. package/src/components/SkipLink/SkipLink.css +16 -0
  229. package/src/components/SkipLink/SkipLink.stories.tsx +40 -0
  230. package/src/components/SkipLink/SkipLink.tsx +15 -0
  231. package/src/components/Spinner/Spinner.css +30 -0
  232. package/src/components/Spinner/Spinner.stories.tsx +36 -0
  233. package/src/components/Spinner/Spinner.tsx +45 -0
  234. package/src/components/StartButton/StartButton.css +13 -0
  235. package/src/components/StartButton/StartButton.stories.tsx +68 -0
  236. package/src/components/StartButton/StartButton.tsx +50 -0
  237. package/src/components/SubmitButton/SubmitButton.stories.tsx +31 -0
  238. package/src/components/SubmitButton/SubmitButton.tsx +14 -0
  239. package/src/components/SummaryList/SummaryList.css +71 -0
  240. package/src/components/SummaryList/SummaryList.stories.tsx +211 -0
  241. package/src/components/SummaryList/SummaryList.tsx +41 -0
  242. package/src/components/SummaryList/SummaryListSkeleton.stories.tsx +67 -0
  243. package/src/components/SummaryList/SummaryListSkeleton.tsx +40 -0
  244. package/src/components/Tabs/Tabs.css +84 -0
  245. package/src/components/Tabs/Tabs.stories.tsx +133 -0
  246. package/src/components/Tabs/Tabs.tsx +66 -0
  247. package/src/components/Tag/Tag.css +8 -0
  248. package/src/components/Tag/Tag.stories.tsx +96 -0
  249. package/src/components/Tag/Tag.tsx +34 -0
  250. package/src/components/Textarea/Textarea.css +38 -0
  251. package/src/components/Textarea/Textarea.stories.tsx +131 -0
  252. package/src/components/Textarea/Textarea.tsx +50 -0
  253. package/src/components/TextareaCount/TextareaCount.css +17 -0
  254. package/src/components/TextareaCount/TextareaCount.stories.tsx +131 -0
  255. package/src/components/TextareaCount/TextareaCount.tsx +108 -0
  256. package/src/components/Tooltip/Tooltip.css +43 -0
  257. package/src/components/Tooltip/Tooltip.stories.tsx +110 -0
  258. package/src/components/Tooltip/Tooltip.tsx +53 -0
  259. package/src/components/WarningText/WarningText.css +20 -0
  260. package/src/components/WarningText/WarningText.stories.tsx +29 -0
  261. package/src/components/WarningText/WarningText.tsx +17 -0
  262. package/src/components/index.ts +342 -61
  263. package/src/errors/errorDisplay.ts +70 -0
  264. package/src/errors/index.ts +1 -0
  265. package/src/http/constants.ts +1 -0
  266. package/src/http/fetch.ts +7 -3
  267. package/src/map/LayerSwitcherPanel.tsx +2 -173
  268. package/src/map/LegendShim.tsx +2 -0
  269. package/src/map/MapComponent.tsx +7 -17
  270. package/src/map/MapControlsOverlay.tsx +68 -175
  271. package/src/map/Popup.tsx +71 -24
  272. package/src/map/geocoder/Geocoder.test.tsx +46 -3
  273. package/src/map/geocoder/Geocoder.tsx +155 -278
  274. package/src/map/index.ts +1 -1
  275. package/src/types/utils.ts +0 -10
  276. package/src/utils/components.ts +96 -0
  277. package/src/utils/index.ts +1 -0
  278. package/src/utils/utils.ts +0 -12
  279. package/src/assets/images/defra-logo.svg +0 -51
  280. package/src/assets/images/ea-logo.svg +0 -58
  281. package/src/assets/images/ogl.svg +0 -1
  282. package/src/components/Button/Button.test.tsx +0 -53
  283. package/src/components/ButtonLink/ButtonLink.test.tsx +0 -154
  284. package/src/components/Card/Card.test.tsx +0 -51
  285. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +0 -75
  286. package/src/components/ErrorBoundary/ErrorFallback.test.tsx +0 -107
  287. package/src/components/ErrorText/ErrorText.test.tsx +0 -33
  288. package/src/components/Heading/Heading.test.tsx +0 -22
  289. package/src/components/Hint/Hint.stories.tsx +0 -58
  290. package/src/components/Hint/Hint.test.tsx +0 -33
  291. package/src/components/Hint/Hint.tsx +0 -12
  292. package/src/components/InfoBox/InfoBox.test.tsx +0 -330
  293. package/src/components/InfoBox/types.ts +0 -6
  294. package/src/components/LinkButton/LinkButton.test.tsx +0 -177
  295. package/src/components/Modal/Modal.test.tsx +0 -246
  296. package/src/components/NotificationBanner/NotificationBanner.stories.tsx +0 -45
  297. package/src/components/NotificationBanner/NotificationBanner.test.tsx +0 -58
  298. package/src/components/NotificationBanner/NotificationBanner.tsx +0 -45
  299. package/src/components/Paragraph/Paragraph.test.tsx +0 -10
  300. package/src/components/SlidingPanel/SlidingPanel.stories.tsx +0 -129
  301. package/src/components/SlidingPanel/SlidingPanel.test.tsx +0 -83
  302. package/src/components/SlidingPanel/SlidingPanel.tsx +0 -258
  303. package/src/components/accordion/Accordion.stories.tsx +0 -234
  304. package/src/components/accordion/Accordion.test.tsx +0 -192
  305. package/src/components/accordion/Accordion.tsx +0 -73
  306. package/src/components/backToTop/BackToTop.stories.tsx +0 -407
  307. package/src/components/backToTop/BackToTop.test.tsx +0 -57
  308. package/src/components/backToTop/BackToTop.tsx +0 -134
  309. package/src/components/chip/Chip.stories.tsx +0 -61
  310. package/src/components/chip/Chip.test.tsx +0 -31
  311. package/src/components/chip/Chip.tsx +0 -23
  312. package/src/components/container/Container.tsx +0 -42
  313. package/src/components/cookieBanner/CookieBanner.stories.tsx +0 -257
  314. package/src/components/cookieBanner/CookieBanner.test.tsx +0 -68
  315. package/src/components/cookieBanner/CookieBanner.tsx +0 -73
  316. package/src/components/divider/RuleDivider.stories.tsx +0 -254
  317. package/src/components/divider/RuleDivider.test.tsx +0 -164
  318. package/src/components/divider/RuleDivider.tsx +0 -23
  319. package/src/components/dropdown/DropdownMenu.test.tsx +0 -211
  320. package/src/components/dropdown/DropdownMenu.tsx +0 -108
  321. package/src/components/dropdown/useDropdownMenu.ts +0 -249
  322. package/src/components/form/Input.stories.tsx +0 -435
  323. package/src/components/form/Input.test.tsx +0 -206
  324. package/src/components/form/Input.tsx +0 -23
  325. package/src/components/form/TextArea.stories.tsx +0 -464
  326. package/src/components/form/TextArea.test.tsx +0 -232
  327. package/src/components/form/TextArea.tsx +0 -23
  328. package/src/components/layout/footer/Footer.tsx +0 -26
  329. package/src/components/layout/footer/Licence.tsx +0 -19
  330. package/src/components/layout/header/Header.test.tsx +0 -36
  331. package/src/components/layout/header/Header.tsx +0 -90
  332. package/src/components/layout/header/HeaderAuthClient.test.tsx +0 -45
  333. package/src/components/layout/header/HeaderAuthClient.tsx +0 -40
  334. package/src/components/layout/header/HeaderNavClient.test.tsx +0 -44
  335. package/src/components/layout/header/HeaderNavClient.tsx +0 -67
  336. package/src/components/link/ExternalLink.test.tsx +0 -102
  337. package/src/components/link/ExternalLink.tsx +0 -29
  338. package/src/components/link/Link.tsx +0 -26
  339. package/src/components/select/Select.stories.tsx +0 -336
  340. package/src/components/select/Select.test.tsx +0 -474
  341. package/src/components/select/Select.tsx +0 -125
  342. package/src/components/select/SelectSkeleton.stories.tsx +0 -194
  343. package/src/components/select/SelectSkeleton.test.tsx +0 -104
  344. package/src/components/select/SelectSkeleton.tsx +0 -23
  345. package/src/components/select/common.ts +0 -3
  346. package/src/components/select/index.ts +0 -18
  347. package/src/components/skipLink/SkipLink.stories.tsx +0 -346
  348. package/src/components/skipLink/SkipLink.test.tsx +0 -22
  349. package/src/components/skipLink/SkipLink.tsx +0 -49
  350. package/src/map/LegendPanel.tsx +0 -85
  351. /package/src/{components → assets}/images/DefraLogo.tsx +0 -0
  352. /package/src/{components → assets}/images/EaLogo.tsx +0 -0
  353. /package/src/{components → assets}/images/OglLogo.tsx +0 -0
  354. /package/src/components/{googleAnalytics → GoogleAnalytics}/GlobalVars.tsx +0 -0
  355. /package/src/components/{googleAnalytics → GoogleAnalytics}/GoogleAnalytics.tsx +0 -0
@@ -0,0 +1,23 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+
3
+ import { Forbidden } from './403';
4
+
5
+ const meta: Meta<typeof Forbidden> = {
6
+ title: 'Components/Layout/403',
7
+ component: Forbidden,
8
+ tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component:
13
+ 'Use Forbidden for displaying text when a user is authenticated but does not have permission to view a page (403).',
14
+ },
15
+ },
16
+ },
17
+ };
18
+
19
+ export default meta;
20
+
21
+ type Story = StoryObj<typeof Forbidden>;
22
+
23
+ export const Default: Story = {};
@@ -0,0 +1,21 @@
1
+ import { SUPPORT_URL } from '../../../utils';
2
+ import { Heading } from '../../Heading/Heading';
3
+ import { Link } from '../../Link/Link';
4
+ import { Paragraph } from '../../Paragraph/Paragraph';
5
+ import { HeadingGroup } from '../HeadingGroup/HeadingGroup';
6
+ import { MainWrapper } from '../MainWrapper/MainWrapper';
7
+
8
+ export const Forbidden = () => {
9
+ return (
10
+ <MainWrapper>
11
+ <HeadingGroup>
12
+ <Heading level="h1">You do not have permission to view this page</Heading>
13
+
14
+ <Paragraph>
15
+ If the web address is correct or you selected a link or button, you can{' '}
16
+ <Link href={SUPPORT_URL}>contact us</Link> to receive support.
17
+ </Paragraph>
18
+ </HeadingGroup>
19
+ </MainWrapper>
20
+ );
21
+ };
@@ -0,0 +1,23 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+
3
+ import { NotFound } from './404';
4
+
5
+ const meta: Meta<typeof NotFound> = {
6
+ title: 'Components/Layout/404',
7
+ component: NotFound,
8
+ tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component:
13
+ 'Use NotFound for a not-found Next.JS page, or other places representing a 404 page.',
14
+ },
15
+ },
16
+ },
17
+ };
18
+
19
+ export default meta;
20
+
21
+ type Story = StoryObj<typeof NotFound>;
22
+
23
+ export const Default: Story = {};
@@ -0,0 +1,28 @@
1
+ import { SUPPORT_URL } from '../../../utils';
2
+ import { Heading } from '../../Heading/Heading';
3
+ import { Link } from '../../Link/Link';
4
+ import { Paragraph } from '../../Paragraph/Paragraph';
5
+ import { HeadingGroup } from '../HeadingGroup/HeadingGroup';
6
+ import { MainWrapper } from '../MainWrapper/MainWrapper';
7
+ import { ParagraphGroup } from '../ParagraphGroup/ParagraphGroup';
8
+
9
+ export const NotFound = () => {
10
+ return (
11
+ <MainWrapper>
12
+ <HeadingGroup>
13
+ <Heading level="h1">Page not found</Heading>
14
+
15
+ <ParagraphGroup>
16
+ <Paragraph>If you typed the web address, check it is correct.</Paragraph>
17
+
18
+ <Paragraph>If you pasted the web address, check you copied the entire address.</Paragraph>
19
+
20
+ <Paragraph>
21
+ If the web address is correct or you selected a link or button, you can{' '}
22
+ <Link href={SUPPORT_URL}>contact us</Link> to receive support.
23
+ </Paragraph>
24
+ </ParagraphGroup>
25
+ </HeadingGroup>
26
+ </MainWrapper>
27
+ );
28
+ };
@@ -0,0 +1,56 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+
3
+ import { InternalServerError } from './500';
4
+ import { ApiError } from '../../../errors/ApiError';
5
+
6
+ const meta: Meta<typeof InternalServerError> = {
7
+ title: 'Components/Layout/500',
8
+ component: InternalServerError,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component:
14
+ 'Use InternalServerError for displaying text when a 500 error occurred. Matches the props Next.js passes automatically to an app/error.tsx boundary, `error` and `reset`, so it can be rendered directly from one. When `reset` is passed a "Try again" button appears; when `error` carries a `digest` (see ApiError) it\'s shown alongside a button to copy the full error details for the app administrator. The raw error message is never shown on the page itself, only via the copy button, to avoid exposing exception internals on a public-facing page.',
15
+ },
16
+ },
17
+ },
18
+ };
19
+
20
+ export default meta;
21
+
22
+ type Story = StoryObj<typeof InternalServerError>;
23
+
24
+ export const Default: Story = {};
25
+
26
+ export const WithReset: Story = {
27
+ parameters: {
28
+ docs: {
29
+ description: {
30
+ story: 'Only `reset` is passed, e.g. no digest was available. Shows a "Try again" button.',
31
+ },
32
+ },
33
+ },
34
+ args: {
35
+ reset: () => {
36
+ console.log('reset called');
37
+ },
38
+ },
39
+ };
40
+
41
+ export const WithApiError: Story = {
42
+ parameters: {
43
+ docs: {
44
+ description: {
45
+ story:
46
+ 'As rendered from app/error.tsx: `error` and `reset` are both passed by Next.js. ApiError always carries a digest, shown as a reference for the app administrator alongside a button to copy the full details (message, details, digest, stack).',
47
+ },
48
+ },
49
+ },
50
+ args: {
51
+ error: ApiError.internalServerError('The upstream sampling points service timed out'),
52
+ reset: () => {
53
+ console.log('reset called');
54
+ },
55
+ },
56
+ };
@@ -0,0 +1,63 @@
1
+ 'use client';
2
+
3
+ import { formatErrorForClipboard, getErrorDisplayInfo } from '../../../errors/errorDisplay';
4
+ import { SUPPORT_URL } from '../../../utils';
5
+ import { Button } from '../../Button/Button';
6
+ import { CopyButton } from '../../CopyButton/CopyButton';
7
+ import { Heading } from '../../Heading/Heading';
8
+ import { HintText } from '../../HintText/HintText';
9
+ import { Link } from '../../Link/Link';
10
+ import { Paragraph } from '../../Paragraph/Paragraph';
11
+ import { ButtonGroup } from '../ButtonGroup/ButtonGroup';
12
+ import { HeadingGroup } from '../HeadingGroup/HeadingGroup';
13
+ import { MainWrapper } from '../MainWrapper/MainWrapper';
14
+ import { ParagraphGroup } from '../ParagraphGroup/ParagraphGroup';
15
+ import { Stack } from '../Stack/Stack';
16
+
17
+ export type InternalServerErrorProps = {
18
+ /** Passed automatically by Next.js when this is used as (or rendered
19
+ * from) an app/error.tsx boundary. When set, a "Try again" button calls
20
+ * it and, if the error carries a digest, it's shown alongside a button to
21
+ * copy the full error details for the app administrator. */
22
+ error?: Error & { digest?: string };
23
+ reset?: () => void;
24
+ };
25
+
26
+ export const InternalServerError = ({ error, reset }: InternalServerErrorProps) => {
27
+ const info = error !== undefined ? getErrorDisplayInfo(error) : null;
28
+
29
+ return (
30
+ <MainWrapper>
31
+ <Stack>
32
+ <HeadingGroup>
33
+ <Heading level="h2">Sorry, there is a problem with the service</Heading>
34
+
35
+ <ParagraphGroup>
36
+ <Paragraph>Try again later.</Paragraph>
37
+
38
+ <Paragraph>
39
+ If the problem persists, you can <Link href={SUPPORT_URL}>contact us</Link> to receive
40
+ support.
41
+ </Paragraph>
42
+ </ParagraphGroup>
43
+ </HeadingGroup>
44
+
45
+ {reset || info ? (
46
+ <div className="flex flex-col gap-gds-1">
47
+ <ButtonGroup>
48
+ {reset ? <Button onClick={reset}>Try again</Button> : null}
49
+
50
+ {info ? (
51
+ <CopyButton appearance="secondary" content={formatErrorForClipboard(info)} />
52
+ ) : null}
53
+ </ButtonGroup>
54
+
55
+ <HintText className="text-sm">
56
+ Copy to share error details with the app administrator.
57
+ </HintText>
58
+ </div>
59
+ ) : null}
60
+ </Stack>
61
+ </MainWrapper>
62
+ );
63
+ };
@@ -0,0 +1,52 @@
1
+ @layer components {
2
+ /* MARK: ButtonGroup
3
+ GDS action group: flex-wrap with center alignment so all button types
4
+ (text, icon, link) sit on the same axis. Buttons handle their own mobile
5
+ full-width behaviour (w-full sm:w-auto), so the group itself stays flex. */
6
+
7
+ .cn-button-group {
8
+ @apply flex flex-wrap items-center gap-gds-2;
9
+ }
10
+
11
+ .cn-button-group[data-orientation='vertical'] {
12
+ @apply flex-col items-start;
13
+ }
14
+
15
+ /* MARK: Compressed
16
+ Removes gap and shares the panel border between adjacent buttons by
17
+ collapsing one border-width of margin. Intended for icon button toolbars
18
+ using appearance="panel". Focused buttons raise above siblings via z-index
19
+ so the inset focus ring is never clipped by a neighbour. */
20
+ .cn-button-group[data-compressed] {
21
+ gap: 0;
22
+
23
+ & > * {
24
+ @apply relative;
25
+ }
26
+
27
+ & > * + * {
28
+ margin-left: calc(var(--border-width-form) * -1);
29
+ }
30
+
31
+ &[data-orientation='vertical'] > * + * {
32
+ margin-left: 0;
33
+ margin-top: calc(var(--border-width-form) * -1);
34
+ }
35
+
36
+ & > *:focus-within {
37
+ z-index: 1;
38
+ }
39
+ }
40
+
41
+ /* MARK: Text */
42
+
43
+ .cn-button-group-text {
44
+ @apply flex items-center text-base;
45
+ }
46
+
47
+ /* MARK: Separator */
48
+
49
+ .cn-button-group-separator {
50
+ @apply self-stretch;
51
+ }
52
+ }
@@ -0,0 +1,156 @@
1
+ import { LuMaximize2, LuMinus, LuPlus } from 'react-icons/lu';
2
+
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ import { ButtonGroup, ButtonGroupSeparator, ButtonGroupText } from './ButtonGroup';
6
+ import { Button } from '../../Button/Button';
7
+ import { LinkButton } from '../../LinkButton/LinkButton';
8
+
9
+ const meta: Meta<typeof ButtonGroup> = {
10
+ title: 'Components/Layout/ButtonGroup',
11
+ component: ButtonGroup,
12
+ tags: ['autodocs'],
13
+ parameters: {
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'Groups related action buttons with consistent GDS-aligned spacing. Use for form submission areas where a primary action is accompanied by a secondary button or cancel link.',
18
+ },
19
+ },
20
+ },
21
+ argTypes: {
22
+ orientation: {
23
+ control: { type: 'radio' },
24
+ options: ['horizontal', 'vertical'],
25
+ },
26
+ },
27
+ args: {
28
+ orientation: 'horizontal',
29
+ },
30
+ };
31
+
32
+ export default meta;
33
+
34
+ type Story = StoryObj<typeof ButtonGroup>;
35
+
36
+ export const PrimaryWithCancel: Story = {
37
+ render: (args) => (
38
+ <ButtonGroup {...args}>
39
+ <Button appearance="primary">Save and continue</Button>
40
+
41
+ <LinkButton href="/">Cancel</LinkButton>
42
+ </ButtonGroup>
43
+ ),
44
+ };
45
+
46
+ export const PrimaryAndSecondary: Story = {
47
+ render: (args) => (
48
+ <ButtonGroup {...args}>
49
+ <Button appearance="primary">Save and continue</Button>
50
+
51
+ <Button appearance="secondary">Save as draft</Button>
52
+ </ButtonGroup>
53
+ ),
54
+ };
55
+
56
+ export const WithText: Story = {
57
+ render: (args) => (
58
+ <ButtonGroup {...args}>
59
+ <Button appearance="primary">Accept all</Button>
60
+
61
+ <ButtonGroupText>or</ButtonGroupText>
62
+
63
+ <LinkButton href="/">Manage preferences</LinkButton>
64
+ </ButtonGroup>
65
+ ),
66
+ };
67
+
68
+ export const Vertical: Story = {
69
+ args: {
70
+ orientation: 'vertical',
71
+ },
72
+ render: (args) => (
73
+ <ButtonGroup {...args}>
74
+ <Button appearance="primary">Save and continue</Button>
75
+
76
+ <Button appearance="secondary">Save as draft</Button>
77
+
78
+ <LinkButton href="/">Cancel</LinkButton>
79
+ </ButtonGroup>
80
+ ),
81
+ };
82
+
83
+ export const WithSeparator: Story = {
84
+ render: (args) => (
85
+ <ButtonGroup {...args}>
86
+ <Button appearance="primary">Save and continue</Button>
87
+
88
+ <Button appearance="secondary">Save as draft</Button>
89
+
90
+ <ButtonGroupSeparator />
91
+
92
+ <Button appearance="destructive">Delete</Button>
93
+ </ButtonGroup>
94
+ ),
95
+ };
96
+
97
+ export const DestructiveGroup: Story = {
98
+ render: (args) => (
99
+ <ButtonGroup {...args}>
100
+ <Button appearance="destructive">Delete account</Button>
101
+
102
+ <LinkButton href="/">Cancel</LinkButton>
103
+ </ButtonGroup>
104
+ ),
105
+ };
106
+
107
+ export const CompressedHorizontal: Story = {
108
+ parameters: {
109
+ docs: {
110
+ description: {
111
+ story:
112
+ 'Compressed removes the gap and shares borders between adjacent panel buttons. Use for map toolbars and icon button clusters.',
113
+ },
114
+ },
115
+ },
116
+ render: () => (
117
+ <ButtonGroup compressed>
118
+ <Button variant="icon" appearance="panel" aria-label="Zoom in">
119
+ <LuPlus aria-hidden />
120
+ </Button>
121
+
122
+ <Button variant="icon" appearance="panel" aria-label="Zoom out">
123
+ <LuMinus aria-hidden />
124
+ </Button>
125
+
126
+ <Button variant="icon" appearance="panel" aria-label="Full screen">
127
+ <LuMaximize2 aria-hidden />
128
+ </Button>
129
+ </ButtonGroup>
130
+ ),
131
+ };
132
+
133
+ export const CompressedVertical: Story = {
134
+ parameters: {
135
+ docs: {
136
+ description: {
137
+ story: 'Compressed vertical, the default layout for map control toolbars.',
138
+ },
139
+ },
140
+ },
141
+ render: () => (
142
+ <ButtonGroup orientation="vertical" compressed role="toolbar" aria-label="Map controls">
143
+ <Button variant="icon" appearance="panel" aria-label="Full screen">
144
+ <LuMaximize2 aria-hidden />
145
+ </Button>
146
+
147
+ <Button variant="icon" appearance="panel" aria-label="Zoom in">
148
+ <LuPlus aria-hidden />
149
+ </Button>
150
+
151
+ <Button variant="icon" appearance="panel" aria-label="Zoom out">
152
+ <LuMinus aria-hidden />
153
+ </Button>
154
+ </ButtonGroup>
155
+ ),
156
+ };
@@ -0,0 +1,50 @@
1
+ import type { ComponentProps } from 'react';
2
+
3
+ import { Slot } from 'radix-ui';
4
+
5
+ import { cn } from '../../../utils/components';
6
+ import { Paragraph } from '../../Paragraph/Paragraph';
7
+ import { Separator } from '../../Separator/Separator';
8
+
9
+ export type ButtonGroupOrientation = 'horizontal' | 'vertical';
10
+
11
+ export type ButtonGroupProps = ComponentProps<'div'> & {
12
+ orientation?: ButtonGroupOrientation;
13
+ compressed?: boolean;
14
+ };
15
+
16
+ export const ButtonGroup = ({
17
+ className,
18
+ orientation = 'horizontal',
19
+ compressed = false,
20
+ ...props
21
+ }: ButtonGroupProps) => (
22
+ <div
23
+ role="group"
24
+ data-slot="button-group"
25
+ data-orientation={orientation}
26
+ data-compressed={compressed || undefined}
27
+ className={cn('cn-button-group', className)}
28
+ {...props}
29
+ />
30
+ );
31
+
32
+ export type ButtonGroupTextProps = ComponentProps<typeof Paragraph> & {
33
+ asChild?: boolean;
34
+ };
35
+
36
+ export const ButtonGroupText = ({ className, asChild = false, ...props }: ButtonGroupTextProps) => {
37
+ const Comp = asChild ? Slot.Root : Paragraph;
38
+
39
+ return <Comp className={cn('cn-button-group-text', className)} {...props} />;
40
+ };
41
+
42
+ export type ButtonGroupSeparatorProps = ComponentProps<typeof Separator>;
43
+
44
+ export const ButtonGroupSeparator = ({ className, ...props }: ButtonGroupSeparatorProps) => (
45
+ <Separator
46
+ data-slot="button-group-separator"
47
+ className={cn('cn-button-group-separator', className)}
48
+ {...props}
49
+ />
50
+ );
@@ -0,0 +1,21 @@
1
+ @layer components {
2
+ /* Space from the heading to its own immediately-following subtitle/lede
3
+ only, one notch tighter than the scale used to look, since Stack now
4
+ owns the (larger) gap between this group and whatever else follows it. */
5
+ .cn-heading-group {
6
+ & h1 {
7
+ @apply mb-gds-3 @sm:mb-gds-4;
8
+ }
9
+ & h2 {
10
+ @apply mb-gds-2 @sm:mb-gds-3;
11
+ }
12
+ & h3 {
13
+ @apply mb-gds-1 @sm:mb-gds-2;
14
+ }
15
+ & h4,
16
+ & h5,
17
+ & h6 {
18
+ @apply mb-gds-1;
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,84 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+
3
+ import { HeadingGroup } from './HeadingGroup';
4
+ import { Heading } from '../../Heading/Heading';
5
+ import { Paragraph } from '../../Paragraph/Paragraph';
6
+
7
+ const meta: Meta<typeof HeadingGroup> = {
8
+ title: 'Components/Layout/HeadingGroup',
9
+ component: HeadingGroup,
10
+ tags: ['autodocs'],
11
+ parameters: {
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'Use a HeadingGroup to group a heading followed by other content with responsive spacing.',
16
+ },
17
+ },
18
+ },
19
+ argTypes: {},
20
+ };
21
+
22
+ export default meta;
23
+
24
+ type Story = StoryObj<typeof HeadingGroup>;
25
+
26
+ export const H1: Story = {
27
+ render: () => (
28
+ <HeadingGroup>
29
+ <Heading level="h1">Water Quality</Heading>
30
+
31
+ <Paragraph>This app is ....</Paragraph>
32
+ </HeadingGroup>
33
+ ),
34
+ };
35
+
36
+ export const H2: Story = {
37
+ render: () => (
38
+ <HeadingGroup>
39
+ <Heading level="h2">Water Quality</Heading>
40
+
41
+ <Paragraph>This app is ....</Paragraph>
42
+ </HeadingGroup>
43
+ ),
44
+ };
45
+
46
+ export const H3: Story = {
47
+ render: () => (
48
+ <HeadingGroup>
49
+ <Heading level="h3">Water Quality</Heading>
50
+
51
+ <Paragraph>This app is ....</Paragraph>
52
+ </HeadingGroup>
53
+ ),
54
+ };
55
+
56
+ export const H4: Story = {
57
+ render: () => (
58
+ <HeadingGroup>
59
+ <Heading level="h4">Water Quality</Heading>
60
+
61
+ <Paragraph>This app is ....</Paragraph>
62
+ </HeadingGroup>
63
+ ),
64
+ };
65
+
66
+ export const H5: Story = {
67
+ render: () => (
68
+ <HeadingGroup>
69
+ <Heading level="h5">Water Quality</Heading>
70
+
71
+ <Paragraph>This app is ....</Paragraph>
72
+ </HeadingGroup>
73
+ ),
74
+ };
75
+
76
+ export const H6: Story = {
77
+ render: () => (
78
+ <HeadingGroup>
79
+ <Heading level="h6">Water Quality</Heading>
80
+
81
+ <Paragraph>This app is ....</Paragraph>
82
+ </HeadingGroup>
83
+ ),
84
+ };
@@ -0,0 +1,9 @@
1
+ import type { ComponentProps } from 'react';
2
+
3
+ import { cn } from '../../../utils/components';
4
+
5
+ export type HeadingGroupProps = ComponentProps<'div'>;
6
+
7
+ export const HeadingGroup = ({ className, ...props }: HeadingGroupProps) => {
8
+ return <div className={cn('cn-heading-group', className)} {...props} />;
9
+ };
@@ -0,0 +1,12 @@
1
+ @layer components {
2
+ /* MARK: MainWrapper
3
+ GDS "main wrapper" object: vertical-only rhythm (20px mobile / 40px
4
+ desktop, matching govuk-main-wrapper) around the page's <main> content.
5
+ Deliberately separate from WidthContainer, which is horizontal-only,
6
+ mirroring GDS's own split, content that sits above <main> but still
7
+ inside the width container (breadcrumbs, phase banners) needs the
8
+ horizontal centering without this padding. */
9
+ .cn-main-wrapper {
10
+ @apply py-gds-4 sm:py-gds-7;
11
+ }
12
+ }
@@ -0,0 +1,36 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+
3
+ import { MainWrapper } from './MainWrapper';
4
+ import { Heading } from '../../Heading/Heading';
5
+ import { Paragraph } from '../../Paragraph/Paragraph';
6
+ import { HeadingGroup } from '../HeadingGroup/HeadingGroup';
7
+
8
+ const meta: Meta<typeof MainWrapper> = {
9
+ title: 'Components/Layout/MainWrapper',
10
+ component: MainWrapper,
11
+ tags: ['autodocs'],
12
+ parameters: {
13
+ docs: {
14
+ description: {
15
+ component:
16
+ "Renders the page's <main> landmark with responsive top/bottom padding, and centers its content with WidthContainer internally, so you don't need to nest the two yourself. Use this for the actual page content area (between things like a Header and Footer), not for full-bleed sections like Hero, those stay directly on WidthContainer since they intentionally have their own vertical rhythm.",
17
+ },
18
+ },
19
+ },
20
+ };
21
+
22
+ export default meta;
23
+
24
+ type Story = StoryObj<typeof MainWrapper>;
25
+
26
+ export const Default: Story = {
27
+ render: () => (
28
+ <MainWrapper>
29
+ <HeadingGroup>
30
+ <Heading level="h1">Water quality</Heading>
31
+
32
+ <Paragraph>Explore water quality sample data collected across England.</Paragraph>
33
+ </HeadingGroup>
34
+ </MainWrapper>
35
+ ),
36
+ };
@@ -0,0 +1,14 @@
1
+ import type { ComponentProps } from 'react';
2
+
3
+ import { cn } from '../../../utils/components';
4
+ import { WidthContainer } from '../WidthContainer/WidthContainer';
5
+
6
+ export type MainWrapperProps = ComponentProps<'main'>;
7
+
8
+ export const MainWrapper = ({ className, children, ...props }: MainWrapperProps) => {
9
+ return (
10
+ <main className={cn('cn-main-wrapper', className)} {...props}>
11
+ <WidthContainer>{children}</WidthContainer>
12
+ </main>
13
+ );
14
+ };