@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
@@ -1,129 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
-
3
- import { SlidingPanel } from './SlidingPanel';
4
-
5
- export default {
6
- children: 'SlidingPanel',
7
- component: SlidingPanel,
8
- } as Meta;
9
-
10
- export const AllSlidingPanels: StoryObj<typeof SlidingPanel> = {
11
- render: () => (
12
- <div>
13
- <div>
14
- <SlidingPanel>Left</SlidingPanel>
15
- </div>
16
-
17
- <div>
18
- <SlidingPanel position="center-right">Right</SlidingPanel>
19
- </div>
20
-
21
- <div>
22
- <SlidingPanel position="center-top">Top</SlidingPanel>
23
- </div>
24
-
25
- <div>
26
- <SlidingPanel position="center-bottom">Bottom</SlidingPanel>
27
- </div>
28
- </div>
29
- ),
30
- };
31
-
32
- export const WithAutoFocus: StoryObj<typeof SlidingPanel> = {
33
- render: () => (
34
- <SlidingPanel tabLabel="Auto Focus Demo" position="center-left">
35
- <div>
36
- <h3>Panel with Auto Focus</h3>
37
-
38
- <p>The input below should be focused when the panel opens:</p>
39
-
40
- <input data-autofocus placeholder="I will be focused automatically" />
41
-
42
- <button type="button">Button</button>
43
- </div>
44
- </SlidingPanel>
45
- ),
46
- };
47
-
48
- export const DefaultOpen: StoryObj<typeof SlidingPanel> = {
49
- render: () => (
50
- <SlidingPanel tabLabel="Always Open" position="center-right" defaultOpen>
51
- <div>
52
- <h3>Default Open Panel</h3>
53
-
54
- <p>This panel starts open by default.</p>
55
-
56
- <button type="button">Button 1</button>
57
-
58
- <button type="button">Button 2</button>
59
-
60
- <input placeholder="Input field" />
61
- </div>
62
- </SlidingPanel>
63
- ),
64
- };
65
-
66
- export const FormExample: StoryObj<typeof SlidingPanel> = {
67
- render: () => (
68
- <SlidingPanel tabLabel="Contact Form" position="center-top">
69
- <div>
70
- <h3>Contact Form</h3>
71
-
72
- <form>
73
- <div style={{ marginBottom: '1rem' }}>
74
- <label htmlFor="name">Name:</label>
75
-
76
- <input id="name" type="text" placeholder="Your name" data-autofocus />
77
- </div>
78
-
79
- <div style={{ marginBottom: '1rem' }}>
80
- <label htmlFor="email">Email:</label>
81
-
82
- <input id="email" type="email" placeholder="your@email.com" />
83
- </div>
84
-
85
- <div style={{ marginBottom: '1rem' }}>
86
- <label htmlFor="message">Message:</label>
87
-
88
- <textarea id="message" placeholder="Your message"></textarea>
89
- </div>
90
-
91
- <button type="submit">Send Message</button>
92
-
93
- <button type="button">Cancel</button>
94
- </form>
95
- </div>
96
- </SlidingPanel>
97
- ),
98
- };
99
-
100
- export const NoFocusableElements: StoryObj<typeof SlidingPanel> = {
101
- render: () => (
102
- <SlidingPanel tabLabel="No Focus Elements" position="center-left">
103
- <div>
104
- <h3>Panel Without Focusable Elements</h3>
105
-
106
- <p>This panel only contains text and headings.</p>
107
-
108
- <p>
109
- It should still work properly with focus trapping, even though there are no buttons,
110
- inputs, or other interactive elements.
111
- </p>
112
-
113
- <div>
114
- <strong>Key Features:</strong>
115
- </div>
116
-
117
- <ul>
118
- <li>Opens and closes properly</li>
119
-
120
- <li>Focus trap works correctly</li>
121
-
122
- <li>Escape key closes the panel</li>
123
-
124
- <li>Focus returns to trigger button</li>
125
- </ul>
126
- </div>
127
- </SlidingPanel>
128
- ),
129
- };
@@ -1,83 +0,0 @@
1
- import { SlidingPanel } from './SlidingPanel';
2
- import { act, render, screen, userEvent, waitFor } from '../../test/renderers';
3
-
4
- const positions = ['center-left', 'center-right', 'center-top', 'center-bottom'] as const;
5
-
6
- const getExpectedOpenClass = (pos: string) =>
7
- pos.includes('left') || pos.includes('right') ? 'translate-x-0' : 'translate-y-0';
8
-
9
- const hiddenPositionClasses = {
10
- 'center-left': '-translate-x-full',
11
- 'center-right': 'translate-x-full',
12
- 'center-top': '-translate-y-[200%]',
13
- 'center-bottom': 'translate-y-[200%]',
14
- };
15
-
16
- describe('SlidingPanel', () => {
17
- it.each(positions)('should render closed panel by default at %s', (position) => {
18
- render(
19
- <SlidingPanel position={position} tabLabel="Test">
20
- <p>Panel Content</p>
21
- </SlidingPanel>,
22
- );
23
-
24
- expect(screen.getByRole('button', { name: 'Open Test' })).toBeVisible();
25
-
26
- // Content should still be in the DOM but hidden
27
- const panelContent = screen.queryByText('Panel Content')?.parentElement?.parentElement;
28
-
29
- expect(panelContent).toBeInTheDocument();
30
- expect(panelContent).toHaveClass(hiddenPositionClasses[position]);
31
- });
32
-
33
- it.each(positions)(
34
- 'should render content and correct class after opening %s',
35
- async (position) => {
36
- const user = userEvent.setup();
37
-
38
- render(
39
- <SlidingPanel position={position} tabLabel="Me">
40
- <div>My content</div>
41
- </SlidingPanel>,
42
- );
43
-
44
- await user.click(screen.getByRole('button', { name: 'Open Me' }));
45
-
46
- // Wait one animation frame for isVisible to be set
47
- await act(() => new Promise(requestAnimationFrame));
48
-
49
- const content = await screen.findByText('My content');
50
-
51
- expect(content).toBeVisible();
52
-
53
- // Go up from content div to panel wrapper
54
- const wrapper = content.closest('div')!.parentElement!.parentElement!;
55
-
56
- expect(wrapper.className).toContain(getExpectedOpenClass(position));
57
- },
58
- );
59
-
60
- it.each(positions)('should close panel when "Close" is clicked at %s', async (position) => {
61
- const user = userEvent.setup();
62
-
63
- render(
64
- <SlidingPanel position={position} tabLabel="Trigger" defaultOpen>
65
- <p>Panel Content</p>
66
- </SlidingPanel>,
67
- );
68
-
69
- const panelContent = screen.getByText('Panel Content');
70
-
71
- expect(panelContent).toBeVisible();
72
-
73
- await user.click(screen.getByRole('button', { name: 'Close Trigger' }));
74
-
75
- await waitFor(() => {
76
- expect(panelContent).toBeInTheDocument();
77
- const insideDiv = panelContent?.parentElement?.parentElement;
78
-
79
- expect(insideDiv).not.toBeNull();
80
- expect(insideDiv).toHaveClass(hiddenPositionClasses[position]);
81
- });
82
- });
83
- });
@@ -1,258 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- useState,
5
- useEffect,
6
- type ReactNode,
7
- useRef,
8
- useMemo,
9
- useId,
10
- type CSSProperties,
11
- } from 'react';
12
-
13
- import { FocusTrap } from 'focus-trap-react';
14
-
15
- import type { ExtendProps } from '../../types';
16
- import { cn } from '../../utils';
17
-
18
- type Position = 'center-left' | 'center-right' | 'center-top' | 'center-bottom';
19
-
20
- type Props = {
21
- children: ReactNode;
22
- position?: Position;
23
- tabLabel?: string;
24
- defaultOpen?: boolean;
25
- };
26
-
27
- export type SlidingPanelProps = ExtendProps<'div', Props>;
28
-
29
- export const SlidingPanel = ({
30
- children,
31
- tabLabel = 'Open',
32
- position = 'center-left',
33
- defaultOpen = false,
34
- className,
35
- ...props
36
- }: SlidingPanelProps) => {
37
- const id = useId();
38
-
39
- const [isVisible, setIsVisible] = useState(defaultOpen);
40
- const [isTrapActive, setIsTrapActive] = useState(defaultOpen);
41
- const [panelDimensions, setPanelDimensions] = useState({ width: 0, height: 0 });
42
-
43
- const panelRef = useRef<HTMLDivElement>(null);
44
- const buttonRef = useRef<HTMLButtonElement | null>(null);
45
-
46
- // Required for the `escapeDeactivates` function as these options are an object and only
47
- // capture their environment once, so without a ref, `isVisible` would only ever be
48
- // `false` inside the callback, even if it's change. A `useCallback` doesn't help because
49
- // it creates a new function each time, so the event would still only capture the first created function.
50
- const isVisibleRef = useRef(isVisible);
51
- // tracks if the focus trap was deactivated by clicking outside the trap
52
- const deactivatedByClick = useRef(false);
53
-
54
- useEffect(() => {
55
- isVisibleRef.current = isVisible;
56
-
57
- deactivatedByClick.current = false;
58
-
59
- setIsTrapActive(isVisible);
60
- }, [isVisible]);
61
-
62
- // Measure panel dimensions when visible or when panel content changes
63
- useEffect(() => {
64
- if (!panelRef.current) {
65
- return;
66
- }
67
-
68
- const updateDimensions = () => {
69
- if (panelRef.current) {
70
- const rect = panelRef.current.getBoundingClientRect();
71
- const newDimensions = { width: rect.width, height: rect.height };
72
-
73
- if (
74
- newDimensions.width !== panelDimensions.width ||
75
- newDimensions.height !== panelDimensions.height
76
- ) {
77
- setPanelDimensions(newDimensions);
78
- }
79
- }
80
- };
81
-
82
- // Initial measurement
83
- updateDimensions();
84
-
85
- // Use ResizeObserver to detect content changes
86
- const resizeObserver = new ResizeObserver(updateDimensions);
87
-
88
- resizeObserver.observe(panelRef.current);
89
-
90
- return () => {
91
- resizeObserver.disconnect();
92
- };
93
- }, [isVisible, panelDimensions.height, panelDimensions.width]);
94
-
95
- const panelBase =
96
- 'absolute bg-white shadow-lg p-4 flex flex-col transition-transform duration-300 ease-in-out overflow-auto z-30';
97
-
98
- const panelLayout = {
99
- 'center-left': `top-0 left-0 h-full w-[30%] lg:w-[35%] ${
100
- isVisible ? 'translate-x-0' : '-translate-x-full'
101
- }`,
102
- 'center-right': `top-0 right-0 h-full w-[30%] lg:w-[35%] ${
103
- isVisible ? 'translate-x-0' : 'translate-x-full'
104
- }`,
105
- // Changed: Use max-height and let content determine actual height
106
- 'center-top': `top-0 left-0 w-full max-h-[80vh] ${
107
- isVisible ? 'translate-y-0' : '-translate-y-[200%]'
108
- }`,
109
- 'center-bottom': `bottom-0 left-0 w-full max-h-[80vh] ${
110
- isVisible ? 'translate-y-0' : 'translate-y-[200%]'
111
- }`,
112
- }[position];
113
-
114
- const buttonPosition = {
115
- 'center-left':
116
- 'absolute top-1/2 -translate-y-1/2 transition-all duration-300 ease-in-out rounded-tr-md rounded-br-md [writing-mode:vertical-rl] px-1 py-3',
117
- 'center-right':
118
- 'absolute top-1/2 -translate-y-1/2 transition-all duration-300 ease-in-out rounded-tl-md rounded-bl-md [writing-mode:vertical-rl] px-1 py-3',
119
- 'center-top':
120
- 'absolute left-1/2 -translate-x-1/2 transition-all duration-300 ease-in-out rounded-bl-md rounded-br-md px-3 py-1',
121
- 'center-bottom':
122
- 'absolute left-1/2 -translate-x-1/2 transition-all duration-300 ease-in-out rounded-tl-md rounded-tr-md px-3 py-1',
123
- }[position];
124
-
125
- // Dynamic positioning using actual panel dimensions
126
- const getButtonStyle = useMemo((): CSSProperties => {
127
- if (position === 'center-left') {
128
- return {
129
- left: isVisible ? `${panelDimensions.width}px` : '0px',
130
- };
131
- }
132
-
133
- if (position === 'center-right') {
134
- return {
135
- right: isVisible ? `${panelDimensions.width}px` : '0px',
136
- };
137
- }
138
-
139
- if (position === 'center-top') {
140
- return {
141
- top: isVisible ? `${panelDimensions.height}px` : '0px',
142
- };
143
- }
144
-
145
- if (position === 'center-bottom') {
146
- return {
147
- bottom: isVisible ? `${panelDimensions.height}px` : '0px',
148
- };
149
- }
150
-
151
- return {};
152
- }, [isVisible, panelDimensions.height, panelDimensions.width, position]);
153
-
154
- const openPanel = () => {
155
- setIsVisible(true);
156
- };
157
-
158
- const closePanel = () => {
159
- setIsVisible(false);
160
- };
161
-
162
- return (
163
- <div
164
- className={cn(
165
- 'absolute inset-0 z-30 overflow-hidden pointer-events-none sliding-panel',
166
- className,
167
- )}
168
- {...props}
169
- >
170
- <button
171
- className={`pointer-events-auto ${buttonPosition} bg-gray-700 text-white z-40 focus-yellow`}
172
- style={getButtonStyle}
173
- onClick={() => (isVisible ? closePanel() : openPanel())}
174
- aria-expanded={isVisible}
175
- aria-controls={id}
176
- ref={buttonRef}
177
- type="button"
178
- >
179
- {isVisible ? `Close ${tabLabel}` : `Open ${tabLabel}`}
180
- </button>
181
-
182
- <FocusTrap
183
- active={isTrapActive}
184
- focusTrapOptions={{
185
- escapeDeactivates: () => {
186
- deactivatedByClick.current = false;
187
-
188
- if (isVisibleRef.current) {
189
- closePanel();
190
- }
191
-
192
- return false;
193
- },
194
- clickOutsideDeactivates: () => {
195
- deactivatedByClick.current = true; // mark as mouse-driven
196
-
197
- return true; // still allow it to deactivate
198
- },
199
-
200
- setReturnFocus: (target) => {
201
- // if the user has clicked outside the focus trap we shouldn't return focus as it will steal focus from the element they clicked on
202
- return deactivatedByClick.current ? false : target;
203
- },
204
- onDeactivate: () => {
205
- setIsTrapActive(false);
206
- },
207
- onActivate: () => {
208
- setIsTrapActive(true);
209
- },
210
- /**
211
- * Emergency fallback focus function for FocusTrap.
212
- *
213
- * This function is automatically called by FocusTrap whenever it cannot find
214
- * any tabbable elements within the panel. This commonly occurs in scenarios like:
215
- *
216
- * - Panel opens but async content hasn't loaded yet
217
- * - Panel is closing and content is being unmounted
218
- * - User presses Escape and TableFilters content disappears
219
- * - Dynamic content changes temporarily remove all focusable elements
220
- *
221
- * Without this fallback, FocusTrap throws the error:
222
- * "Your focus-trap must have at least one container with at least one tabbable node in it at all times"
223
- *
224
- * The function ensures there's always a focusable element available by:
225
- * 1. Looking for our guaranteed hidden fallback element with [data-fallback-focus]
226
- * 2. Making it temporarily focusable (tabIndex = 0)
227
- * 3. Returning it to FocusTrap as a safe focus target
228
- * 4. Using document.body as ultimate fallback if something goes wrong
229
- *
230
- * This is especially crucial for complex content like ObservationTableManager
231
- * where TableFilters has async operations that can cause content to disappear
232
- * during panel lifecycle events.
233
- *
234
- * @returns HTMLElement - The element FocusTrap should focus on as a fallback
235
- */
236
- fallbackFocus: () => {
237
- return panelRef.current ?? buttonRef.current ?? document.body;
238
- },
239
- }}
240
- >
241
- <div
242
- ref={panelRef}
243
- tabIndex={-1}
244
- id={id}
245
- role="dialog"
246
- aria-modal="true"
247
- aria-label={`Sliding panel for ${tabLabel}`}
248
- className={`${panelBase} ${panelLayout} pointer-events-auto`}
249
- aria-hidden={!isVisible}
250
- inert={!isVisible}
251
- onPointerDown={() => (!isTrapActive ? setIsTrapActive(true) : void 0)}
252
- >
253
- <div className="mt-4">{children}</div>
254
- </div>
255
- </FocusTrap>
256
- </div>
257
- );
258
- };
@@ -1,234 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
-
3
- import { Accordion } from './Accordion';
4
-
5
- const meta: Meta<typeof Accordion> = {
6
- title: 'Components/Accordion',
7
- component: Accordion,
8
- parameters: {
9
- layout: 'padded',
10
- },
11
- tags: ['autodocs'],
12
- argTypes: {
13
- title: {
14
- control: 'text',
15
- description: 'The title displayed in the accordion header',
16
- },
17
- defaultOpen: {
18
- control: 'boolean',
19
- description: 'Whether the accordion should be open by default',
20
- },
21
- children: {
22
- control: false,
23
- description: 'The content to display when the accordion is expanded',
24
- },
25
- },
26
- };
27
-
28
- export default meta;
29
- type Story = StoryObj<typeof Accordion>;
30
-
31
- export const Default: Story = {
32
- args: {
33
- title: 'Getting Started',
34
- children: (
35
- <div className="space-y-2">
36
- <p>Welcome to our platform! Here&apos;s how to get started:</p>
37
-
38
- <ul className="list-disc list-inside space-y-1">
39
- <li>Create your account</li>
40
-
41
- <li>Verify your email</li>
42
-
43
- <li>Complete your profile</li>
44
- </ul>
45
- </div>
46
- ),
47
- },
48
- };
49
-
50
- export const DefaultOpen: Story = {
51
- args: {
52
- title: 'Features Overview',
53
- defaultOpen: true,
54
- children: (
55
- <div className="space-y-2">
56
- <p>Our platform offers the following features:</p>
57
-
58
- <ul className="list-disc list-inside space-y-1">
59
- <li>Real-time collaboration</li>
60
-
61
- <li>Advanced analytics</li>
62
-
63
- <li>Customizable dashboards</li>
64
-
65
- <li>API integrations</li>
66
- </ul>
67
- </div>
68
- ),
69
- },
70
- };
71
-
72
- export const SimpleContent: Story = {
73
- args: {
74
- title: 'What is React?',
75
- children: <p>React is a JavaScript library for building user interfaces.</p>,
76
- },
77
- };
78
-
79
- export const LongContent: Story = {
80
- args: {
81
- title: 'Terms and Conditions',
82
- children: (
83
- <div className="space-y-4 max-h-64 overflow-y-auto">
84
- <p>
85
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt
86
- ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
87
- ullamco laboris nisi ut aliquip ex ea commodo consequat.
88
- </p>
89
-
90
- <p>
91
- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
92
- nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
93
- deserunt mollit anim id est laborum.
94
- </p>
95
-
96
- <p>
97
- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque
98
- laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi
99
- architecto beatae vitae dicta sunt explicabo.
100
- </p>
101
- </div>
102
- ),
103
- },
104
- };
105
-
106
- export const ComplexContent: Story = {
107
- args: {
108
- title: 'Pricing Plans',
109
- children: (
110
- <div className="space-y-4">
111
- <p>Choose the plan that works best for you:</p>
112
-
113
- <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
114
- <div className="border rounded p-4">
115
- <h4 className="font-semibold">Basic</h4>
116
-
117
- <p className="text-gray-600">$9/month</p>
118
-
119
- <button className="mt-2 px-3 py-1 bg-blue-500 text-white rounded text-sm">
120
- Choose Plan
121
- </button>
122
- </div>
123
-
124
- <div className="border rounded p-4">
125
- <h4 className="font-semibold">Pro</h4>
126
-
127
- <p className="text-gray-600">$29/month</p>
128
-
129
- <button className="mt-2 px-3 py-1 bg-blue-500 text-white rounded text-sm">
130
- Choose Plan
131
- </button>
132
- </div>
133
-
134
- <div className="border rounded p-4">
135
- <h4 className="font-semibold">Enterprise</h4>
136
-
137
- <p className="text-gray-600">Contact us</p>
138
-
139
- <button className="mt-2 px-3 py-1 bg-blue-500 text-white rounded text-sm">
140
- Contact Sales
141
- </button>
142
- </div>
143
- </div>
144
- </div>
145
- ),
146
- },
147
- };
148
-
149
- export const FAQ: Story = {
150
- render: () => (
151
- <div className="space-y-4 max-w-2xl">
152
- <h2 className="text-xl font-bold mb-4">Frequently Asked Questions</h2>
153
-
154
- <Accordion title="How do I reset my password?">
155
- <div className="space-y-2">
156
- <p>To reset your password:</p>
157
-
158
- <ol className="list-decimal list-inside space-y-1">
159
- <li>Go to the login page</li>
160
-
161
- <li>Click &quot;Forgot Password&quot;</li>
162
-
163
- <li>Enter your email address</li>
164
-
165
- <li>Check your email for reset instructions</li>
166
- </ol>
167
- </div>
168
- </Accordion>
169
-
170
- <Accordion title="Can I cancel my subscription anytime?">
171
- <p>
172
- Yes, you can cancel your subscription at any time. Your access will continue until the end
173
- of your current billing period.
174
- </p>
175
- </Accordion>
176
-
177
- <Accordion title="Do you offer refunds?">
178
- <div className="space-y-2">
179
- <p>We offer refunds under the following conditions:</p>
180
-
181
- <ul className="list-disc list-inside space-y-1">
182
- <li>Within 30 days of purchase</li>
183
-
184
- <li>Service was not used extensively</li>
185
-
186
- <li>Technical issues that couldn&apos;t be resolved</li>
187
- </ul>
188
-
189
- <p className="mt-2">Contact support for refund requests.</p>
190
- </div>
191
- </Accordion>
192
-
193
- <Accordion title="Is my data secure?" defaultOpen>
194
- <div className="space-y-2">
195
- <p>Yes, we take data security seriously:</p>
196
-
197
- <ul className="list-disc list-inside space-y-1">
198
- <li>All data is encrypted in transit and at rest</li>
199
-
200
- <li>We use industry-standard security practices</li>
201
-
202
- <li>Regular security audits and penetration testing</li>
203
-
204
- <li>GDPR and CCPA compliant</li>
205
- </ul>
206
- </div>
207
- </Accordion>
208
- </div>
209
- ),
210
- };
211
-
212
- export const Interactive: Story = {
213
- render: () => (
214
- <div className="space-y-6 max-w-lg">
215
- <div>
216
- <h3 className="text-lg font-semibold mb-4">Multiple Accordions</h3>
217
-
218
- <div className="space-y-4">
219
- <Accordion title="Section 1">
220
- <p>Content for the first section.</p>
221
- </Accordion>
222
-
223
- <Accordion title="Section 2" defaultOpen>
224
- <p>Content for the second section (open by default).</p>
225
- </Accordion>
226
-
227
- <Accordion title="Section 3">
228
- <p>Content for the third section.</p>
229
- </Accordion>
230
- </div>
231
- </div>
232
- </div>
233
- ),
234
- };