@scottish-government/designsystem-react 0.12.1 → 1.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 (490) hide show
  1. package/.storybook/main.ts +6 -6
  2. package/.storybook/sgdsArgTypes.ts +107 -43
  3. package/CHANGELOG.md +49 -0
  4. package/LICENSE.txt +21 -0
  5. package/README.md +3 -0
  6. package/dist/common/AbstractNotificationBanner/AbstractNotificationBanner.d.ts +3 -2
  7. package/dist/common/AbstractNotificationBanner/AbstractNotificationBanner.jsx +8 -7
  8. package/dist/common/AbstractNotificationBanner/types.d.ts +13 -0
  9. package/dist/common/AbstractNotificationBanner/types.js +2 -0
  10. package/dist/common/ActionLink/ActionLink.d.ts +2 -1
  11. package/dist/common/ActionLink/types.d.ts +7 -0
  12. package/dist/common/ActionLink/types.js +2 -0
  13. package/dist/common/ConditionalWrapper/ConditionalWrapper.d.ts +2 -1
  14. package/dist/common/ConditionalWrapper/ConditionalWrapper.jsx +4 -2
  15. package/dist/common/ConditionalWrapper/types.d.ts +4 -0
  16. package/dist/common/ConditionalWrapper/types.js +2 -0
  17. package/dist/common/FileIcon/FileIcon.d.ts +2 -1
  18. package/dist/common/FileIcon/types.d.ts +6 -0
  19. package/dist/common/FileIcon/types.js +2 -0
  20. package/dist/common/HintText/HintText.d.ts +2 -1
  21. package/dist/common/HintText/HintText.jsx +3 -3
  22. package/dist/common/HintText/types.d.ts +4 -0
  23. package/dist/common/HintText/types.js +2 -0
  24. package/dist/common/Icon/Icon.d.ts +2 -1
  25. package/dist/common/Icon/Icon.jsx +3 -2
  26. package/dist/common/Icon/types.d.ts +8 -0
  27. package/dist/common/Icon/types.js +2 -0
  28. package/dist/common/ScreenReaderText/ScreenReaderText.d.ts +1 -1
  29. package/dist/common/WrapperTag/WrapperTag.d.ts +385 -1
  30. package/dist/common/WrapperTag/WrapperTag.jsx +5 -2
  31. package/dist/common/WrapperTag/types.d.ts +3 -0
  32. package/dist/common/WrapperTag/types.js +2 -0
  33. package/dist/components/Accordion/Accordion.d.ts +3 -2
  34. package/dist/components/Accordion/Accordion.jsx +12 -11
  35. package/dist/components/Accordion/types.d.ts +11 -0
  36. package/dist/components/Accordion/types.js +2 -0
  37. package/dist/components/AspectBox/AspectBox.d.ts +2 -1
  38. package/dist/components/AspectBox/AspectBox.jsx +3 -9
  39. package/dist/components/AspectBox/types.d.ts +3 -0
  40. package/dist/components/AspectBox/types.js +2 -0
  41. package/dist/components/BackToTop/BackToTop.d.ts +2 -1
  42. package/dist/components/BackToTop/BackToTop.jsx +4 -3
  43. package/dist/components/BackToTop/types.d.ts +3 -0
  44. package/dist/components/BackToTop/types.js +2 -0
  45. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +3 -2
  46. package/dist/components/Breadcrumbs/Breadcrumbs.jsx +6 -2
  47. package/dist/components/Breadcrumbs/types.d.ts +5 -0
  48. package/dist/components/Breadcrumbs/types.js +2 -0
  49. package/dist/components/Button/Button.d.ts +2 -1
  50. package/dist/components/Button/Button.jsx +4 -3
  51. package/dist/components/Button/ButtonGroup.d.ts +2 -1
  52. package/dist/components/Button/ButtonGroup.jsx +9 -4
  53. package/dist/components/Button/types.d.ts +20 -0
  54. package/dist/components/Button/types.js +2 -0
  55. package/dist/components/Card/Card.d.ts +34 -0
  56. package/dist/components/Card/Card.jsx +118 -0
  57. package/dist/components/Card/index.d.ts +1 -0
  58. package/dist/components/Card/index.js +8 -0
  59. package/dist/components/Card/types.d.ts +26 -0
  60. package/dist/components/Card/types.js +2 -0
  61. package/dist/components/CategoryItem/CategoryItem.d.ts +2 -1
  62. package/dist/components/CategoryItem/CategoryItem.jsx +8 -5
  63. package/dist/components/CategoryItem/types.d.ts +9 -0
  64. package/dist/components/CategoryItem/types.js +2 -0
  65. package/dist/components/CategoryList/CategoryList.d.ts +2 -1
  66. package/dist/components/CategoryList/CategoryList.jsx +3 -2
  67. package/dist/components/CategoryList/types.d.ts +5 -0
  68. package/dist/components/CategoryList/types.js +2 -0
  69. package/dist/components/Checkbox/Checkbox.d.ts +2 -1
  70. package/dist/components/Checkbox/Checkbox.jsx +4 -3
  71. package/dist/components/Checkbox/CheckboxGroup.d.ts +2 -1
  72. package/dist/components/Checkbox/CheckboxGroup.jsx +5 -4
  73. package/dist/components/Checkbox/types.d.ts +7 -0
  74. package/dist/components/Checkbox/types.js +2 -0
  75. package/dist/components/ConfirmationMessage/ConfirmationMessage.d.ts +2 -1
  76. package/dist/components/ConfirmationMessage/ConfirmationMessage.jsx +3 -2
  77. package/dist/components/ConfirmationMessage/types.d.ts +6 -0
  78. package/dist/components/ConfirmationMessage/types.js +2 -0
  79. package/dist/components/ContentsNav/ContentsNav.d.ts +3 -2
  80. package/dist/components/ContentsNav/ContentsNav.jsx +7 -5
  81. package/dist/components/ContentsNav/types.d.ts +9 -0
  82. package/dist/components/ContentsNav/types.js +2 -0
  83. package/dist/components/CookieBanner/CookieBanner.d.ts +3 -2
  84. package/dist/components/CookieBanner/CookieBanner.jsx +13 -3
  85. package/dist/components/DatePicker/DatePicker.d.ts +2 -1
  86. package/dist/components/DatePicker/DatePicker.jsx +7 -7
  87. package/dist/components/DatePicker/types.d.ts +18 -0
  88. package/dist/components/DatePicker/types.js +2 -0
  89. package/dist/components/Details/Details.d.ts +2 -1
  90. package/dist/components/Details/Details.jsx +6 -2
  91. package/dist/components/Details/types.d.ts +4 -0
  92. package/dist/components/Details/types.js +2 -0
  93. package/dist/components/ErrorMessage/ErrorMessage.d.ts +2 -1
  94. package/dist/components/ErrorMessage/ErrorMessage.jsx +6 -2
  95. package/dist/components/ErrorMessage/types.d.ts +3 -0
  96. package/dist/components/ErrorMessage/types.js +2 -0
  97. package/dist/components/ErrorSummary/ErrorSummary.d.ts +3 -2
  98. package/dist/components/ErrorSummary/ErrorSummary.jsx +6 -2
  99. package/dist/components/ErrorSummary/types.d.ts +8 -0
  100. package/dist/components/ErrorSummary/types.js +2 -0
  101. package/dist/components/FeatureHeader/FeatureHeader.d.ts +7 -5
  102. package/dist/components/FeatureHeader/FeatureHeader.jsx +87 -50
  103. package/dist/components/FeatureHeader/types.d.ts +12 -0
  104. package/dist/components/FeatureHeader/types.js +2 -0
  105. package/dist/components/FileDownload/FileDownload.d.ts +2 -1
  106. package/dist/components/FileDownload/FileDownload.jsx +4 -3
  107. package/dist/components/FileDownload/types.d.ts +10 -0
  108. package/dist/components/FileDownload/types.js +2 -0
  109. package/dist/components/HideThisPage/HideThisPage.d.ts +2 -1
  110. package/dist/components/HideThisPage/HideThisPage.jsx +5 -4
  111. package/dist/components/HideThisPage/types.d.ts +3 -0
  112. package/dist/components/HideThisPage/types.js +2 -0
  113. package/dist/components/InsetText/InsetText.d.ts +1 -1
  114. package/dist/components/InsetText/InsetText.jsx +6 -2
  115. package/dist/components/NotificationBanner/NotificationBanner.d.ts +3 -2
  116. package/dist/components/NotificationBanner/NotificationBanner.jsx +5 -4
  117. package/dist/components/NotificationPanel/NotificationPanel.d.ts +2 -1
  118. package/dist/components/NotificationPanel/NotificationPanel.jsx +3 -2
  119. package/dist/components/NotificationPanel/types.d.ts +6 -0
  120. package/dist/components/NotificationPanel/types.js +2 -0
  121. package/dist/components/NotificationTag/NotificationTag.d.ts +6 -0
  122. package/dist/components/NotificationTag/NotificationTag.jsx +20 -0
  123. package/dist/components/NotificationTag/index.d.ts +1 -0
  124. package/dist/components/NotificationTag/index.js +8 -0
  125. package/dist/components/NotificationTag/types.d.ts +5 -0
  126. package/dist/components/NotificationTag/types.js +2 -0
  127. package/dist/components/PageHeader/PageHeader.d.ts +2 -1
  128. package/dist/components/PageHeader/PageHeader.jsx +6 -2
  129. package/dist/components/PageHeader/types.d.ts +5 -0
  130. package/dist/components/PageHeader/types.js +2 -0
  131. package/dist/components/PageMetadata/PageMetadata.d.ts +3 -2
  132. package/dist/components/PageMetadata/PageMetadata.jsx +8 -4
  133. package/dist/components/PageMetadata/types.d.ts +6 -0
  134. package/dist/components/PageMetadata/types.js +2 -0
  135. package/dist/components/Pagination/Pagination.d.ts +3 -2
  136. package/dist/components/Pagination/Pagination.jsx +7 -5
  137. package/dist/components/Pagination/types.d.ts +18 -0
  138. package/dist/components/Pagination/types.js +2 -0
  139. package/dist/components/PhaseBanner/PhaseBanner.d.ts +2 -1
  140. package/dist/components/PhaseBanner/PhaseBanner.jsx +3 -2
  141. package/dist/components/PhaseBanner/types.d.ts +3 -0
  142. package/dist/components/PhaseBanner/types.js +2 -0
  143. package/dist/components/Question/Question.d.ts +2 -1
  144. package/dist/components/Question/Question.jsx +4 -3
  145. package/dist/components/Question/types.d.ts +9 -0
  146. package/dist/components/Question/types.js +2 -0
  147. package/dist/components/RadioButton/RadioButton.d.ts +2 -1
  148. package/dist/components/RadioButton/RadioButton.jsx +4 -3
  149. package/dist/components/RadioButton/RadioGroup.d.ts +2 -1
  150. package/dist/components/RadioButton/RadioGroup.jsx +3 -2
  151. package/dist/components/RadioButton/types.d.ts +10 -0
  152. package/dist/components/RadioButton/types.js +2 -0
  153. package/dist/components/SearchFacets/SearchFacets.d.ts +4 -3
  154. package/dist/components/SearchFacets/SearchFacets.jsx +3 -2
  155. package/dist/components/SearchFacets/types.d.ts +12 -0
  156. package/dist/components/SearchFacets/types.js +2 -0
  157. package/dist/components/SearchFilters/SearchFilters.d.ts +5 -4
  158. package/dist/components/SearchFilters/types.d.ts +12 -0
  159. package/dist/components/SearchFilters/types.js +2 -0
  160. package/dist/components/SearchResult/SearchResult.d.ts +8 -11
  161. package/dist/components/SearchResult/SearchResult.jsx +6 -7
  162. package/dist/components/SearchResult/types.d.ts +11 -0
  163. package/dist/components/SearchResult/types.js +2 -0
  164. package/dist/components/SearchSort/SearchSort.d.ts +2 -1
  165. package/dist/components/SearchSort/SearchSort.jsx +3 -2
  166. package/dist/components/SearchSort/types.d.ts +7 -0
  167. package/dist/components/SearchSort/types.js +2 -0
  168. package/dist/components/Select/Select.d.ts +2 -1
  169. package/dist/components/Select/Select.jsx +4 -3
  170. package/dist/components/Select/types.d.ts +6 -0
  171. package/dist/components/Select/types.js +2 -0
  172. package/dist/components/SequentialNavigation/SequentialNavigation.d.ts +4 -3
  173. package/dist/components/SequentialNavigation/SequentialNavigation.jsx +10 -6
  174. package/dist/components/SequentialNavigation/types.d.ts +10 -0
  175. package/dist/components/SequentialNavigation/types.js +2 -0
  176. package/dist/components/SideNavigation/SideNavigation.d.ts +4 -3
  177. package/dist/components/SideNavigation/SideNavigation.jsx +10 -7
  178. package/dist/components/SideNavigation/types.d.ts +13 -0
  179. package/dist/components/SideNavigation/types.js +2 -0
  180. package/dist/components/SiteFooter/SiteFooter.d.ts +6 -5
  181. package/dist/components/SiteFooter/SiteFooter.jsx +4 -3
  182. package/dist/components/SiteFooter/types.d.ts +16 -0
  183. package/dist/components/SiteFooter/types.js +2 -0
  184. package/dist/components/SiteHeader/SiteHeader.d.ts +6 -5
  185. package/dist/components/SiteHeader/SiteHeader.jsx +1 -1
  186. package/dist/components/SiteHeader/types.d.ts +20 -0
  187. package/dist/components/SiteHeader/types.js +2 -0
  188. package/dist/components/SiteNavigation/SiteNavigation.d.ts +3 -2
  189. package/dist/components/SiteNavigation/SiteNavigation.jsx +12 -4
  190. package/dist/components/SiteNavigation/types.d.ts +9 -0
  191. package/dist/components/SiteNavigation/types.js +2 -0
  192. package/dist/components/SiteSearch/SiteSearch.d.ts +2 -1
  193. package/dist/components/SiteSearch/SiteSearch.jsx +12 -11
  194. package/dist/components/SiteSearch/types.d.ts +17 -0
  195. package/dist/components/SiteSearch/types.js +2 -0
  196. package/dist/components/SkipLinks/SkipLinks.d.ts +3 -2
  197. package/dist/components/SkipLinks/SkipLinks.jsx +4 -4
  198. package/dist/components/SkipLinks/types.d.ts +8 -0
  199. package/dist/components/SkipLinks/types.js +2 -0
  200. package/dist/components/SummaryCard/SummaryCard.d.ts +4 -2
  201. package/dist/components/SummaryCard/SummaryCard.jsx +5 -4
  202. package/dist/components/SummaryCard/types.d.ts +5 -0
  203. package/dist/components/SummaryCard/types.js +2 -0
  204. package/dist/components/SummaryList/SummaryList.d.ts +6 -4
  205. package/dist/components/SummaryList/SummaryList.jsx +5 -4
  206. package/dist/components/SummaryList/types.d.ts +6 -0
  207. package/dist/components/SummaryList/types.js +2 -0
  208. package/dist/components/Table/Table.d.ts +2 -1
  209. package/dist/components/Table/Table.jsx +5 -4
  210. package/dist/components/Table/types.d.ts +6 -0
  211. package/dist/components/Table/types.js +2 -0
  212. package/dist/components/Tabs/Tabs.d.ts +3 -2
  213. package/dist/components/Tabs/Tabs.jsx +6 -5
  214. package/dist/components/Tabs/types.d.ts +16 -0
  215. package/dist/components/Tabs/types.js +2 -0
  216. package/dist/components/Tag/Tag.d.ts +2 -1
  217. package/dist/components/Tag/Tag.jsx +7 -3
  218. package/dist/components/Tag/types.d.ts +4 -0
  219. package/dist/components/Tag/types.js +2 -0
  220. package/dist/components/TaskList/TaskList.d.ts +4 -3
  221. package/dist/components/TaskList/TaskList.jsx +11 -8
  222. package/dist/components/TaskList/types.d.ts +17 -0
  223. package/dist/components/TaskList/types.js +2 -0
  224. package/dist/components/TextInput/TextInput.d.ts +2 -1
  225. package/dist/components/TextInput/TextInput.jsx +10 -9
  226. package/dist/components/TextInput/types.d.ts +11 -0
  227. package/dist/components/TextInput/types.js +2 -0
  228. package/dist/components/Textarea/Textarea.d.ts +2 -1
  229. package/dist/components/Textarea/Textarea.jsx +6 -5
  230. package/dist/components/WarningText/WarningText.d.ts +1 -1
  231. package/dist/components/WarningText/WarningText.jsx +6 -2
  232. package/dist/hooks/useTracking/useTracking.js +0 -1
  233. package/eslint.config.mjs +32 -0
  234. package/package.json +12 -5
  235. package/src/common/AbstractNotificationBanner/AbstractNotificationBanner.tsx +13 -10
  236. package/src/common/AbstractNotificationBanner/types.ts +15 -0
  237. package/src/common/ActionLink/ActionLink.tsx +3 -1
  238. package/src/common/ActionLink/types.ts +8 -0
  239. package/src/common/ConditionalWrapper/ConditionalWrapper.tsx +10 -2
  240. package/src/common/ConditionalWrapper/types.ts +4 -0
  241. package/src/common/FileIcon/FileIcon.tsx +2 -1
  242. package/src/common/FileIcon/types.ts +7 -0
  243. package/src/common/HintText/HintText.test.tsx +3 -15
  244. package/src/common/HintText/HintText.tsx +4 -4
  245. package/src/common/HintText/types.ts +4 -0
  246. package/src/common/Icon/Icon.tsx +5 -3
  247. package/src/common/Icon/types.ts +9 -0
  248. package/src/common/ScreenReaderText/ScreenReaderText.tsx +1 -1
  249. package/src/common/WrapperTag/WrapperTag.tsx +5 -3
  250. package/src/common/WrapperTag/types.ts +3 -0
  251. package/src/components/Accordion/Accordion.Item.stories.tsx +1 -5
  252. package/src/components/Accordion/Accordion.stories.tsx +5 -5
  253. package/src/components/Accordion/Accordion.test.tsx +11 -0
  254. package/src/components/Accordion/Accordion.tsx +15 -13
  255. package/src/components/Accordion/types.ts +13 -0
  256. package/src/components/AspectBox/AspectBox.stories.tsx +1 -2
  257. package/src/components/AspectBox/AspectBox.tsx +8 -14
  258. package/src/components/AspectBox/types.ts +3 -0
  259. package/src/components/BackToTop/BackToTop.test.tsx +21 -1
  260. package/src/components/BackToTop/BackToTop.tsx +6 -4
  261. package/src/components/BackToTop/types.ts +3 -0
  262. package/src/components/Breadcrumbs/Breadcrumbs.tsx +7 -4
  263. package/src/components/Breadcrumbs/types.ts +6 -0
  264. package/src/components/Button/Button.tsx +6 -4
  265. package/src/components/Button/ButtonGroup.stories.tsx +22 -0
  266. package/src/components/Button/ButtonGroup.test.tsx +21 -0
  267. package/src/components/Button/ButtonGroup.tsx +9 -4
  268. package/src/components/Button/types.ts +22 -0
  269. package/src/components/Card/Card.stories.tsx +446 -0
  270. package/src/components/Card/Card.test.tsx +282 -0
  271. package/src/components/Card/Card.tsx +208 -0
  272. package/src/components/Card/index.ts +1 -0
  273. package/src/components/Card/types.ts +30 -0
  274. package/src/components/CategoryItem/CategoryItem.tsx +10 -6
  275. package/src/components/CategoryItem/types.ts +10 -0
  276. package/src/components/CategoryList/CategoryList.tsx +7 -4
  277. package/src/components/CategoryList/types.ts +5 -0
  278. package/src/components/Checkbox/Checkbox.stories.tsx +3 -3
  279. package/src/components/Checkbox/Checkbox.test.tsx +30 -0
  280. package/src/components/Checkbox/Checkbox.tsx +8 -7
  281. package/src/components/Checkbox/CheckboxGroup.test.tsx +10 -0
  282. package/src/components/Checkbox/CheckboxGroup.tsx +7 -6
  283. package/src/components/Checkbox/types.ts +9 -0
  284. package/src/components/ConfirmationMessage/ConfirmationMessage.tsx +5 -3
  285. package/src/components/ConfirmationMessage/types.ts +7 -0
  286. package/src/components/ContentsNav/ContentsNav.stories.tsx +5 -1
  287. package/src/components/ContentsNav/ContentsNav.tsx +11 -7
  288. package/src/components/ContentsNav/types.ts +11 -0
  289. package/src/components/CookieBanner/CookieBanner.Buttons.stories.tsx +3 -3
  290. package/src/components/CookieBanner/CookieBanner.stories.tsx +6 -6
  291. package/src/components/CookieBanner/CookieBanner.test.tsx +24 -1
  292. package/src/components/CookieBanner/CookieBanner.tsx +16 -5
  293. package/src/components/DatePicker/DatePicker.test.tsx +52 -19
  294. package/src/components/DatePicker/DatePicker.tsx +8 -8
  295. package/src/components/DatePicker/types.ts +19 -0
  296. package/src/components/Details/Details.stories.tsx +1 -1
  297. package/src/components/Details/Details.tsx +6 -3
  298. package/src/components/Details/types.ts +4 -0
  299. package/src/components/ErrorMessage/ErrorMessage.tsx +6 -3
  300. package/src/components/ErrorMessage/types.ts +3 -0
  301. package/src/components/ErrorSummary/ErrorSummary.test.tsx +1 -1
  302. package/src/components/ErrorSummary/ErrorSummary.tsx +6 -4
  303. package/src/components/ErrorSummary/types.ts +11 -0
  304. package/src/components/FeatureHeader/FeatureHeader.stories.tsx +186 -23
  305. package/src/components/FeatureHeader/FeatureHeader.test.tsx +298 -0
  306. package/src/components/FeatureHeader/FeatureHeader.tsx +83 -58
  307. package/src/components/FeatureHeader/types.ts +13 -0
  308. package/src/components/FileDownload/FileDownload.test.tsx +1 -5
  309. package/src/components/FileDownload/FileDownload.tsx +6 -4
  310. package/src/components/FileDownload/types.ts +11 -0
  311. package/src/components/HideThisPage/HideThisPage.test.tsx +12 -1
  312. package/src/components/HideThisPage/HideThisPage.tsx +7 -5
  313. package/src/components/HideThisPage/types.ts +3 -0
  314. package/src/components/InsetText/InsetText.tsx +5 -3
  315. package/src/components/NotificationBanner/NotificationBanner.stories.tsx +2 -2
  316. package/src/components/NotificationBanner/NotificationBanner.test.tsx +10 -0
  317. package/src/components/NotificationBanner/NotificationBanner.tsx +8 -6
  318. package/src/components/NotificationPanel/NotificationPanel.tsx +5 -3
  319. package/src/components/NotificationPanel/types.ts +7 -0
  320. package/src/components/NotificationTag/NotificationTag.stories.tsx +68 -0
  321. package/src/components/NotificationTag/NotificationTag.test.tsx +70 -0
  322. package/src/components/NotificationTag/NotificationTag.tsx +32 -0
  323. package/src/components/NotificationTag/index.ts +1 -0
  324. package/src/components/NotificationTag/types.ts +5 -0
  325. package/src/components/PageHeader/PageHeader.tsx +6 -3
  326. package/src/components/PageHeader/types.ts +5 -0
  327. package/src/components/PageMetadata/PageMetadata.stories.tsx +1 -1
  328. package/src/components/PageMetadata/PageMetadata.tsx +10 -7
  329. package/src/components/PageMetadata/types.ts +7 -0
  330. package/src/components/Pagination/Pagination.test.tsx +20 -0
  331. package/src/components/Pagination/Pagination.tsx +12 -8
  332. package/src/components/Pagination/types.ts +20 -0
  333. package/src/components/PhaseBanner/PhaseBanner.stories.tsx +1 -4
  334. package/src/components/PhaseBanner/PhaseBanner.tsx +5 -3
  335. package/src/components/PhaseBanner/types.ts +3 -0
  336. package/src/components/Question/Question.tsx +6 -4
  337. package/src/components/Question/types.ts +9 -0
  338. package/src/components/RadioButton/RadioButton.test.tsx +30 -0
  339. package/src/components/RadioButton/RadioButton.tsx +8 -7
  340. package/src/components/RadioButton/RadioGroup.tsx +5 -3
  341. package/src/components/RadioButton/types.ts +12 -0
  342. package/src/components/SearchFacets/SearchFacets.Group.stories.tsx +2 -3
  343. package/src/components/SearchFacets/SearchFacets.stories.tsx +2 -2
  344. package/src/components/SearchFacets/SearchFacets.tsx +10 -8
  345. package/src/components/SearchFacets/types.ts +14 -0
  346. package/src/components/SearchFilters/SearchFilters.Panel.stories.tsx +18 -7
  347. package/src/components/SearchFilters/SearchFilters.stories.tsx +1 -1
  348. package/src/components/SearchFilters/SearchFilters.tsx +4 -3
  349. package/src/components/SearchFilters/types.ts +14 -0
  350. package/src/components/SearchResult/SearchResult.stories.tsx +23 -23
  351. package/src/components/SearchResult/SearchResult.test.tsx +5 -4
  352. package/src/components/SearchResult/SearchResult.tsx +15 -15
  353. package/src/components/SearchResult/types.ts +13 -0
  354. package/src/components/SearchSort/SearchSort.stories.tsx +2 -1
  355. package/src/components/SearchSort/SearchSort.tsx +5 -3
  356. package/src/components/SearchSort/types.ts +7 -0
  357. package/src/components/Select/Select.test.tsx +42 -0
  358. package/src/components/Select/Select.tsx +8 -6
  359. package/src/components/Select/types.ts +7 -0
  360. package/src/components/SequentialNavigation/SequentialNavigation.tsx +13 -10
  361. package/src/components/SequentialNavigation/types.ts +12 -0
  362. package/src/components/SideNavigation/SideNavigation.test.tsx +24 -0
  363. package/src/components/SideNavigation/SideNavigation.tsx +14 -10
  364. package/src/components/SideNavigation/types.ts +16 -0
  365. package/src/components/SiteFooter/SiteFooter.tsx +10 -8
  366. package/src/components/SiteFooter/types.ts +20 -0
  367. package/src/components/SiteHeader/SiteHeader.stories.tsx +4 -3
  368. package/src/components/SiteHeader/SiteHeader.test.tsx +29 -16
  369. package/src/components/SiteHeader/SiteHeader.tsx +10 -9
  370. package/src/components/SiteHeader/types.ts +22 -0
  371. package/src/components/SiteNavigation/SiteNavigation.test.tsx +16 -1
  372. package/src/components/SiteNavigation/SiteNavigation.tsx +13 -6
  373. package/src/components/SiteNavigation/types.ts +11 -0
  374. package/src/components/SiteSearch/SiteSearch.stories.tsx +4 -2
  375. package/src/components/SiteSearch/SiteSearch.test.tsx +22 -0
  376. package/src/components/SiteSearch/SiteSearch.tsx +15 -13
  377. package/src/components/SiteSearch/types.ts +19 -0
  378. package/src/components/SkipLinks/SkipLinks.stories.tsx +3 -3
  379. package/src/components/SkipLinks/SkipLinks.tsx +7 -7
  380. package/src/components/SkipLinks/types.ts +9 -0
  381. package/src/components/SummaryCard/SummaryCard.test.tsx +0 -11
  382. package/src/components/SummaryCard/SummaryCard.tsx +9 -6
  383. package/src/components/SummaryCard/types.ts +6 -0
  384. package/src/components/SummaryList/SummaryList.Item.stories.tsx +5 -5
  385. package/src/components/SummaryList/SummaryList.stories.tsx +1 -1
  386. package/src/components/SummaryList/SummaryList.test.tsx +1 -6
  387. package/src/components/SummaryList/SummaryList.tsx +11 -9
  388. package/src/components/SummaryList/types.ts +7 -0
  389. package/src/components/Table/Table.test.tsx +36 -0
  390. package/src/components/Table/Table.tsx +7 -5
  391. package/src/components/Table/types.ts +6 -0
  392. package/src/components/Tabs/Tabs.Item.stories.tsx +7 -7
  393. package/src/components/Tabs/Tabs.stories.tsx +3 -3
  394. package/src/components/Tabs/Tabs.test.tsx +14 -0
  395. package/src/components/Tabs/Tabs.tsx +12 -9
  396. package/src/components/Tabs/types.ts +19 -0
  397. package/src/components/Tag/Tag.tsx +7 -4
  398. package/src/components/Tag/types.ts +5 -0
  399. package/src/components/TaskList/TaskList.Group.stories.tsx +0 -5
  400. package/src/components/TaskList/TaskList.stories.tsx +0 -1
  401. package/src/components/TaskList/TaskList.tsx +17 -13
  402. package/src/components/TaskList/types.ts +20 -0
  403. package/src/components/TextInput/TextInput.test.tsx +53 -1
  404. package/src/components/TextInput/TextInput.tsx +17 -12
  405. package/src/components/TextInput/types.ts +12 -0
  406. package/src/components/Textarea/Textarea.test.tsx +53 -1
  407. package/src/components/Textarea/Textarea.tsx +10 -8
  408. package/src/components/WarningText/WarningText.tsx +5 -3
  409. package/src/hooks/useTracking/useTracking.test.tsx +5 -7
  410. package/src/hooks/useTracking/useTracking.ts +0 -1
  411. package/src/images/icons/arrow_upward.tsx +10 -10
  412. package/src/images/icons/calendar_today.tsx +10 -10
  413. package/src/images/icons/cancel.tsx +8 -8
  414. package/src/images/icons/check_circle.tsx +10 -10
  415. package/src/images/icons/chevron_left.tsx +10 -10
  416. package/src/images/icons/chevron_right.tsx +10 -10
  417. package/src/images/icons/close.tsx +10 -10
  418. package/src/images/icons/description.tsx +10 -10
  419. package/src/images/icons/double_chevron_left.tsx +8 -8
  420. package/src/images/icons/double_chevron_right.tsx +8 -8
  421. package/src/images/icons/error.tsx +10 -10
  422. package/src/images/icons/expand_less.tsx +10 -10
  423. package/src/images/icons/expand_more.tsx +10 -10
  424. package/src/images/icons/list.tsx +13 -13
  425. package/src/images/icons/menu.tsx +10 -10
  426. package/src/images/icons/priority_high.tsx +11 -11
  427. package/src/images/icons/search.tsx +10 -10
  428. package/src/shared-types.ts +40 -0
  429. package/static/images/illustration.svg +502 -0
  430. package/tsconfig.json +0 -3
  431. package/vite.config.ts +6 -1
  432. package/@types/common/AbstractNotificationBanner.d.ts +0 -17
  433. package/@types/common/ActionLink.d.ts +0 -8
  434. package/@types/common/ConditionalWrapper.d.ts +0 -6
  435. package/@types/common/FileIcon.d.ts +0 -7
  436. package/@types/common/HintText.d.ts +0 -6
  437. package/@types/common/Icon.d.ts +0 -9
  438. package/@types/common/ScreenReaderText.d.ts +0 -4
  439. package/@types/common/WrapperTag.d.ts +0 -5
  440. package/@types/components/Accordion.d.ts +0 -15
  441. package/@types/components/AspectBox.d.ts +0 -5
  442. package/@types/components/BackToTop.d.ts +0 -5
  443. package/@types/components/Breadcrumbs.d.ts +0 -11
  444. package/@types/components/Button.d.ts +0 -17
  445. package/@types/components/ButtonGroup.d.ts +0 -5
  446. package/@types/components/CategoryItem.d.ts +0 -10
  447. package/@types/components/CategoryList.d.ts +0 -7
  448. package/@types/components/Checkbox.d.ts +0 -11
  449. package/@types/components/ConfirmationMessage.d.ts +0 -7
  450. package/@types/components/ContentsNav.d.ts +0 -13
  451. package/@types/components/DatePicker.d.ts +0 -20
  452. package/@types/components/Details.d.ts +0 -6
  453. package/@types/components/ErrorMessage.d.ts +0 -5
  454. package/@types/components/ErrorSummary.d.ts +0 -12
  455. package/@types/components/FileDownload.d.ts +0 -11
  456. package/@types/components/HideThisPage.d.ts +0 -5
  457. package/@types/components/InsetText.d.ts +0 -5
  458. package/@types/components/Metadata.d.ts +0 -11
  459. package/@types/components/NotificationPanel.d.ts +0 -7
  460. package/@types/components/PageHeader.d.ts +0 -7
  461. package/@types/components/Pagination.d.ts +0 -22
  462. package/@types/components/PhaseBanner.d.ts +0 -5
  463. package/@types/components/Question.d.ts +0 -11
  464. package/@types/components/RadioButton.d.ts +0 -14
  465. package/@types/components/SearchFacets.d.ts +0 -18
  466. package/@types/components/SearchFilters.d.ts +0 -14
  467. package/@types/components/SearchResult.d.ts +0 -30
  468. package/@types/components/SearchSort.d.ts +0 -9
  469. package/@types/components/Select.d.ts +0 -7
  470. package/@types/components/SequentialNavigation.d.ts +0 -14
  471. package/@types/components/SideNavigation.d.ts +0 -18
  472. package/@types/components/SiteFooter.d.ts +0 -25
  473. package/@types/components/SiteHeader.d.ts +0 -20
  474. package/@types/components/SiteNavigation.d.ts +0 -13
  475. package/@types/components/SiteSearch.d.ts +0 -14
  476. package/@types/components/SkipLinks.d.ts +0 -13
  477. package/@types/components/SummaryCard.d.ts +0 -6
  478. package/@types/components/SummaryList.d.ts +0 -14
  479. package/@types/components/Table.d.ts +0 -8
  480. package/@types/components/Tabs.d.ts +0 -21
  481. package/@types/components/Tag.d.ts +0 -5
  482. package/@types/components/TaskList.d.ts +0 -22
  483. package/@types/components/TextInput.d.ts +0 -12
  484. package/@types/components/Textarea.d.ts +0 -4
  485. package/@types/components/WarningText.d.ts +0 -5
  486. package/@types/global.d.ts +0 -1
  487. package/@types/sgds.d.ts +0 -49
  488. package/dist/index.d.ts +0 -4
  489. package/dist/index.js +0 -40
  490. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,9 +1,8 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import argTypes from '../../../.storybook/sgdsArgTypes';
3
-
4
3
  import SearchResult from './SearchResult';
5
-
6
- //@ts-ignore
4
+ import Metadata from '../PageMetadata';
5
+ // @ts-expect-error no types
7
6
  import coo from '../../../static/images/highland-cow.jpg';
8
7
 
9
8
  const meta = {
@@ -13,7 +12,8 @@ const meta = {
13
12
  children: argTypes.children()
14
13
  },
15
14
  args: {
16
- title: 'Application incomplete'
15
+ title: 'Greenhouse gas statistics 1990-2022',
16
+ href: '#foo'
17
17
  }
18
18
  } satisfies Meta<typeof SearchResult>;
19
19
 
@@ -22,7 +22,7 @@ type Story = StoryObj<typeof meta>;
22
22
 
23
23
  export const Default: Story = {
24
24
  render: (args) => (
25
- <SearchResult href="#foo" title="Greenhouse gas statistics 1990-2022" {...args}>
25
+ <SearchResult {...args}>
26
26
  <SearchResult.Content>
27
27
  Official statistics showing emissions of greenhouse gases in Scotland over the period 1990 to 2022.
28
28
  </SearchResult.Content>
@@ -30,27 +30,27 @@ export const Default: Story = {
30
30
  )
31
31
  };
32
32
 
33
- export const Metadata: Story = {
33
+ export const WithMetadata: Story = {
34
34
  render: (args) => (
35
- <SearchResult href="#foo" title="Greenhouse gas statistics 1990-2022" {...args}>
35
+ <SearchResult {...args}>
36
36
  <SearchResult.Content>
37
37
  Official statistics showing emissions of greenhouse gases in Scotland over the period 1990 to 2022.
38
38
  </SearchResult.Content>
39
- <SearchResult.Meta>
40
- <SearchResult.MetaItem name="Publication type">
39
+ <SearchResult.Metadata>
40
+ <Metadata.Item name="Publication type">
41
41
  Statistics
42
- </SearchResult.MetaItem>
43
- <SearchResult.MetaItem name="Date">
42
+ </Metadata.Item>
43
+ <Metadata.Item name="Date">
44
44
  18 June 2024
45
- </SearchResult.MetaItem>
46
- </SearchResult.Meta>
45
+ </Metadata.Item>
46
+ </SearchResult.Metadata>
47
47
  </SearchResult>
48
48
  )
49
49
  };
50
50
 
51
51
  export const Context: Story = {
52
52
  render: (args) => (
53
- <SearchResult href="#foo" title="Greenhouse gas statistics 1990-2022" {...args}>
53
+ <SearchResult {...args}>
54
54
  <SearchResult.Content>
55
55
  Official statistics showing emissions of greenhouse gases in Scotland over the period 1990 to 2022.
56
56
  </SearchResult.Content>
@@ -64,7 +64,7 @@ export const Context: Story = {
64
64
 
65
65
  export const Media: Story = {
66
66
  render: (args) => (
67
- <SearchResult href="#foo" title="Application incomplete" {...args}>
67
+ <SearchResult {...args}>
68
68
  <SearchResult.Content>
69
69
  <SearchResult.Media>
70
70
  <img src={coo} alt="" />
@@ -77,7 +77,7 @@ export const Media: Story = {
77
77
 
78
78
  export const Promoted: Story = {
79
79
  render: (args) => (
80
- <SearchResult isPromoted href="#foo" title="Greenhouse gas statistics 1990-2022" {...args}>
80
+ <SearchResult isPromoted {...args}>
81
81
  <SearchResult.Content>
82
82
  Official statistics showing emissions of greenhouse gases in Scotland over the period 1990 to 2022.
83
83
  </SearchResult.Content>
@@ -87,21 +87,21 @@ export const Promoted: Story = {
87
87
 
88
88
  export const KitchenSink: Story = {
89
89
  render: (args) => (
90
- <SearchResult isPromoted href="#foo" title="Application incomplete" {...args}>
90
+ <SearchResult isPromoted {...args}>
91
91
  <SearchResult.Content>
92
92
  <SearchResult.Media>
93
93
  <img src={coo} alt="" />
94
94
  </SearchResult.Media>
95
95
  Official statistics showing emissions of greenhouse gases in Scotland over the period 1990 to 2022.
96
96
  </SearchResult.Content>
97
- <SearchResult.Meta>
98
- <SearchResult.MetaItem name="Publication type">
97
+ <SearchResult.Metadata>
98
+ <Metadata.Item name="Publication type">
99
99
  Statistics
100
- </SearchResult.MetaItem>
101
- <SearchResult.MetaItem name="Date">
100
+ </Metadata.Item>
101
+ <Metadata.Item name="Date">
102
102
  18 June 2024
103
- </SearchResult.MetaItem>
104
- </SearchResult.Meta>
103
+ </Metadata.Item>
104
+ </SearchResult.Metadata>
105
105
  <SearchResult.Context title="Part of">
106
106
  <SearchResult.ContextItem><a href="#">Environment statistics</a></SearchResult.ContextItem>
107
107
  <SearchResult.ContextItem><a href="#">Energy statistics</a></SearchResult.ContextItem>
@@ -1,6 +1,7 @@
1
1
  import { test, expect } from 'vitest';
2
2
  import { render, screen, within } from '@testing-library/react';
3
3
  import SearchResult from './SearchResult';
4
+ import Metadata from '../PageMetadata';
4
5
 
5
6
  const RESULT_TITLE = 'My title';
6
7
  const RESULT_HREF = '#foo';
@@ -15,11 +16,11 @@ test('search result renders correctly', () => {
15
16
  <SearchResult.Content>
16
17
  {RESULT_CONTENT}
17
18
  </SearchResult.Content>
18
- <SearchResult.Meta>
19
- <SearchResult.MetaItem name={META_KEY}>
19
+ <SearchResult.Metadata>
20
+ <Metadata.Item name={META_KEY}>
20
21
  {META_VALUE}
21
- </SearchResult.MetaItem>
22
- </SearchResult.Meta>
22
+ </Metadata.Item>
23
+ </SearchResult.Metadata>
23
24
  <SearchResult.Context>
24
25
  <SearchResult.ContextItem>{CONTEXT_VALUE}</SearchResult.ContextItem>
25
26
  </SearchResult.Context>
@@ -2,18 +2,20 @@ import { Children, createContext, useContext } from 'react';
2
2
  import ConditionalWrapper from '../../common/ConditionalWrapper';
3
3
  import AspectBox from '../AspectBox';
4
4
  import Metadata from '../PageMetadata';
5
+ import { SearchResultContextProps, SearchResultProps } from './types';
6
+ import clsx from 'clsx';
5
7
 
6
8
  const SearchResultLinkHrefContext = createContext('');
7
9
 
8
10
  const SearchResultContent = ({
9
11
  children
10
- }: SGDS.Component.SearchResult.Content) => {
11
- const otherChildren: any[] = [];
12
+ }: React.AllHTMLAttributes<HTMLElement>) => {
13
+ const otherChildren: React.ReactNode[] = [];
12
14
  let imageChild: React.ReactNode = null;
13
15
 
14
16
  // assign to slots
15
17
  Children.forEach(children, (child: React.ReactNode) => {
16
- const thisChild = child as React.ReactElement<any>;
18
+ const thisChild = child as React.JSX.Element;
17
19
  if (thisChild && thisChild.type === SearchResultMedia) {
18
20
  imageChild = thisChild;
19
21
  } else {
@@ -37,7 +39,7 @@ const SearchResultContent = ({
37
39
  const SearchResultContext = ({
38
40
  children,
39
41
  title = 'Part of'
40
- }: SGDS.Component.SearchResult.Context) => {
42
+ }: SearchResultContextProps) => {
41
43
  return (
42
44
  <dl className="ds_search-result__context">
43
45
  <dt className="ds_search-result__context-key">{title}:</dt>
@@ -48,7 +50,7 @@ const SearchResultContext = ({
48
50
 
49
51
  const SearchResultContextItem = ({
50
52
  children
51
- }: SGDS.Component.SearchResult.ContextItem) => {
53
+ }: React.AllHTMLAttributes<HTMLElement>) => {
52
54
  return (
53
55
  <dd className="ds_search-result__context-value">
54
56
  {children}
@@ -58,7 +60,7 @@ const SearchResultContextItem = ({
58
60
 
59
61
  const SearchResultMedia = ({
60
62
  children
61
- }: SGDS.Component.SearchResult.Media) => {
63
+ }: React.AllHTMLAttributes<HTMLElement>) => {
62
64
  return (
63
65
  <div className="ds_search-result__media-wrapper">
64
66
  <a className="ds_search-result__media-link" href={useContext(SearchResultLinkHrefContext)} tabIndex={-1} aria-hidden="true">
@@ -72,7 +74,7 @@ const SearchResultMedia = ({
72
74
 
73
75
  const SearchResultMeta = ({
74
76
  children
75
- }: SGDS.Component.SearchResult.Meta) => {
77
+ }: React.AllHTMLAttributes<HTMLElement>) => {
76
78
  return (
77
79
  <Metadata className="ds_search-result__metadata" isInline>
78
80
  {children}
@@ -88,14 +90,14 @@ const SearchResult = ({
88
90
  promotedTitle = 'Recommended',
89
91
  title,
90
92
  ...props
91
- }: SGDS.Component.SearchResult) => {
93
+ }: SearchResultProps) => {
92
94
  const LINK_CLASS = 'ds_search-result__link';
93
95
 
94
96
  return (
95
- <div className={[
97
+ <div className={clsx([
96
98
  'ds_search-result',
97
- isPromoted ? 'ds_search-result--promoted' : ''
98
- ].join(' ')}
99
+ isPromoted && 'ds_search-result--promoted'
100
+ ])}
99
101
  {...props}
100
102
  >
101
103
  <ConditionalWrapper
@@ -124,14 +126,12 @@ SearchResult.Content = SearchResultContent;
124
126
  SearchResult.Context = SearchResultContext;
125
127
  SearchResult.ContextItem = SearchResultContextItem;
126
128
  SearchResult.Media = SearchResultMedia;
127
- SearchResult.Meta = SearchResultMeta;
128
- SearchResult.MetaItem = Metadata.Item;
129
+ SearchResult.Metadata = SearchResultMeta;
129
130
 
130
131
  SearchResultContent.displayName = 'SearchResult.Content';
131
132
  SearchResultContext.displayName = 'SearchResult.Context';
132
133
  SearchResultContextItem.displayName = 'SearchResult.ContextItem';
133
134
  SearchResultMedia.displayName = 'SearchResult.Media';
134
- SearchResultMeta.displayName = 'SearchResult.Meta';
135
- SearchResult.MetaItem.displayName = 'SearchResult.MetaItem';
135
+ SearchResultMeta.displayName = 'SearchResult.Metadata';
136
136
 
137
137
  export default SearchResult;
@@ -0,0 +1,13 @@
1
+ import { LinkComponent } from "../../shared-types";
2
+
3
+ export interface SearchResultContextProps extends React.AllHTMLAttributes<HTMLDListElement> {
4
+ title: string;
5
+ }
6
+
7
+ export interface SearchResultProps extends React.AllHTMLAttributes<HTMLElement> {
8
+ href: string;
9
+ isPromoted?: boolean;
10
+ linkComponent?: LinkComponent;
11
+ promotedTitle?: string;
12
+ title: string;
13
+ }
@@ -14,7 +14,8 @@ const meta = {
14
14
  },
15
15
  args: {
16
16
  id: 'sort-by',
17
- label: 'Sort by'
17
+ label: 'Sort by',
18
+ children: <></>
18
19
  }
19
20
  } satisfies Meta<typeof SearchSort>;
20
21
 
@@ -1,6 +1,8 @@
1
1
  import { AllHTMLAttributes } from "react";
2
2
  import Button from "../Button";
3
3
  import Select from "../Select";
4
+ import { SearchSortProps } from "./types";
5
+ import clsx from 'clsx';
4
6
 
5
7
  const Option = ({
6
8
  children,
@@ -20,13 +22,13 @@ const SearchSort = ({
20
22
  label = 'Sort by',
21
23
  onApply,
22
24
  ...props
23
- }: SGDS.Component.SearchSort) => {
25
+ }: SearchSortProps) => {
24
26
  return (
25
27
  <div
26
- className={[
28
+ className={clsx([
27
29
  'ds_sort-options',
28
30
  className
29
- ].join(' ')}
31
+ ])}
30
32
  {...props}
31
33
  >
32
34
  <Select id={id} label={label}>
@@ -0,0 +1,7 @@
1
+ export interface SearchSortProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ children: React.ReactNode;
3
+ className?: string;
4
+ id?: string;
5
+ label?: string;
6
+ onApply?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
7
+ }
@@ -134,6 +134,48 @@ test('select with change function', () => {
134
134
  expect(ONCHANGE_FUNCTION).toHaveBeenCalled();
135
135
  });
136
136
 
137
+ test('select with onBlur that is not a function', () => {
138
+ render(
139
+ <Select
140
+ id={SELECT_ID}
141
+ label={LABEL_TEXT}
142
+ // @ts-expect-error onBlur is not a function
143
+ onBlur='foo'
144
+ >
145
+ {OPTIONS}
146
+ </Select>
147
+ );
148
+
149
+ const select = screen.getByRole('combobox');
150
+
151
+ fireEvent.blur(select);
152
+
153
+ // todo: assertion
154
+ // success indicated by no errors thrown
155
+ // error would be thrown on an untestable thread
156
+ });
157
+
158
+ test('select with onChange that is not a function', () => {
159
+ render(
160
+ <Select
161
+ id={SELECT_ID}
162
+ label={LABEL_TEXT}
163
+ // @ts-expect-error onChange is not a function
164
+ onChange='foo'
165
+ >
166
+ {OPTIONS}
167
+ </Select>
168
+ );
169
+
170
+ const select = screen.getByRole('combobox');
171
+
172
+ fireEvent.change(select, {target: {value: 'button'}});
173
+
174
+ // todo: assertion
175
+ // success indicated by no errors thrown
176
+ // error would be thrown on an untestable thread
177
+ });
178
+
137
179
  test('select with placeholder option', () => {
138
180
  const PLACEHOLDER_TEXT = 'foo';
139
181
 
@@ -1,5 +1,7 @@
1
1
  import ErrorMessage from '../ErrorMessage';
2
2
  import HintText from '../../common/HintText';
3
+ import { SelectProps } from './types';
4
+ import clsx from 'clsx';
3
5
 
4
6
  const Select = function ({
5
7
  children,
@@ -16,7 +18,7 @@ const Select = function ({
16
18
  placeholder,
17
19
  width,
18
20
  ...props
19
- }: SGDS.Component.Select) {
21
+ }: SelectProps) {
20
22
  const errorMessageId = `error-message-${id}`;
21
23
  const hintTextId = `hint-text-${id}`;
22
24
  const describedbys: string[] = [];
@@ -24,13 +26,13 @@ const Select = function ({
24
26
  if (hintText) { describedbys.push(hintTextId) };
25
27
  if (errorMessage) { describedbys.push(errorMessageId) };
26
28
 
27
- function handleBlur(event: React.FocusEvent) {
29
+ function handleBlur(event: React.FocusEvent<HTMLSelectElement>) {
28
30
  if (typeof onBlur === 'function') {
29
31
  onBlur(event);
30
32
  }
31
33
  }
32
34
 
33
- function handleChange(event: React.ChangeEvent) {
35
+ function handleChange(event: React.ChangeEvent<HTMLSelectElement>) {
34
36
  if (typeof onChange === 'function') {
35
37
  onChange(event);
36
38
  }
@@ -39,15 +41,15 @@ const Select = function ({
39
41
  return (
40
42
  <>
41
43
  <label className="ds_label" htmlFor={id}>{label}</label>
42
- {hintText && <HintText id={hintTextId} text={hintText} />}
44
+ {hintText && <HintText id={hintTextId}>{hintText}</HintText>}
43
45
  {errorMessage && <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>}
44
46
  <div
45
- className={[
47
+ className={clsx([
46
48
  "ds_select-wrapper",
47
49
  hasError && 'ds_input--error',
48
50
  width && `ds_input--${width}`,
49
51
  className
50
- ].join(' ')}
52
+ ])}
51
53
  {...props}
52
54
  >
53
55
  <select
@@ -0,0 +1,7 @@
1
+ import { FormFieldBase, InputWidth } from "../../shared-types";
2
+
3
+ export interface SelectProps extends FormFieldBase<HTMLElement> {
4
+ defaultValue?: string;
5
+ placeholder?: string;
6
+ width?: InputWidth;
7
+ }
@@ -1,19 +1,22 @@
1
+ import { SequentialNavigationLinkProps, SequentialNavigationProps } from "./types";
2
+ import clsx from 'clsx';
3
+
1
4
  const SeqNavLink = ({
2
5
  children,
3
6
  href,
4
7
  isPrev,
5
8
  linkComponent,
6
9
  textLabel
7
- }: SGDS.Component.SequentialNavigation.Link) => {
8
- const LINK_CLASSES = [
10
+ }:SequentialNavigationLinkProps) => {
11
+ const LINK_CLASSES = clsx([
9
12
  'ds_sequential-nav__button',
10
13
  isPrev ? 'ds_sequential-nav__button--left' : 'ds_sequential-nav__button--right'
11
- ].join(' ');
14
+ ]);
12
15
 
13
- const ITEM_CLASSES = [
16
+ const ITEM_CLASSES = clsx([
14
17
  'ds_sequential-nav__item',
15
18
  isPrev ? 'ds_sequential-nav__item--prev' : 'ds_sequential-nav__item--next'
16
- ].join(' ');
19
+ ]);
17
20
 
18
21
  function processChildren(children: React.ReactNode) {
19
22
  const linkInner = <span className="ds_sequential-nav__text" data-label={textLabel}>{children}</span>
@@ -39,7 +42,7 @@ const NextLink = ({
39
42
  href,
40
43
  linkComponent,
41
44
  textLabel = 'Next'
42
- }: SGDS.Component.SequentialNavigation.Link) => {
45
+ }: SequentialNavigationLinkProps) => {
43
46
  return <SeqNavLink href={href} linkComponent={linkComponent} textLabel={textLabel}>{children}</SeqNavLink>
44
47
  };
45
48
 
@@ -48,7 +51,7 @@ const PreviousLink = ({
48
51
  href,
49
52
  linkComponent,
50
53
  textLabel = 'Previous'
51
- }: SGDS.Component.SequentialNavigation.Link) => {
54
+ }: SequentialNavigationLinkProps) => {
52
55
  return <SeqNavLink href={href} linkComponent={linkComponent} textLabel={textLabel} isPrev>{children}</SeqNavLink>
53
56
  };
54
57
 
@@ -57,13 +60,13 @@ const SequentialNavigation = ({
57
60
  children,
58
61
  className,
59
62
  ...props
60
- }: SGDS.Component.SequentialNavigation) => {
63
+ }: SequentialNavigationProps) => {
61
64
  return (
62
65
  <nav
63
- className={[
66
+ className={clsx([
64
67
  'ds_sequential-nav',
65
68
  className
66
- ].join(' ')}
69
+ ])}
67
70
  aria-label={ariaLabel}
68
71
  {...props}
69
72
  >
@@ -0,0 +1,12 @@
1
+ import { LinkComponent } from "../../shared-types";
2
+
3
+ export interface SequentialNavigationLinkProps extends React.AllHTMLAttributes<HTMLDivElement> {
4
+ href: string;
5
+ isPrev?: boolean;
6
+ linkComponent?: LinkComponent;
7
+ textLabel?: string;
8
+ }
9
+
10
+ export interface SequentialNavigationProps extends React.AllHTMLAttributes<HTMLElement> {
11
+ ariaLabel?: React.AriaAttributes['aria-label'];
12
+ }
@@ -109,6 +109,30 @@ test('side nav link with custom element', () => {
109
109
  expect(link?.textContent).toEqual(LINK_TEXT);
110
110
  });
111
111
 
112
+ test('instantiating/initialising DS component script', () => {
113
+ render(
114
+ <SideNavigation>
115
+ <SideNavigation.List>
116
+ <SideNavigation.Item href="#dates" title="Dates"/>
117
+ </SideNavigation.List>
118
+ </SideNavigation>
119
+ );
120
+
121
+ const sideNavigation = screen.getByRole('navigation');
122
+ expect(sideNavigation).toHaveClass('js-initialised');
123
+ expect(sideNavigation).toHaveClass('js-instantiated');
124
+ });
125
+
126
+ test('instantiating/initialising DS component script: no children', () => {
127
+ render(
128
+ <SideNavigation />
129
+ );
130
+
131
+ const sideNavigation = screen.getByRole('navigation');
132
+ expect(sideNavigation).not.toHaveClass('js-initialised');
133
+ expect(sideNavigation).not.toHaveClass('js-instantiated');
134
+ });
135
+
112
136
  test('passing additional props', () => {
113
137
  render(
114
138
  <SideNavigation data-test="foo" />
@@ -1,11 +1,12 @@
1
1
  import { useEffect, useRef } from 'react';
2
- // @ts-ignore
3
2
  import DSSideNavigation from '@scottish-government/design-system/src/components/side-navigation/side-navigation';
3
+ import { SideNavigationItemProps, SideNavigationListProps, SideNavigationProps } from './types';
4
+ import clsx from 'clsx';
4
5
 
5
6
  const SideNavigationList = function ({
6
7
  children,
7
8
  isRoot
8
- }: SGDS.Component.SideNavigation.List) {
9
+ }: SideNavigationListProps) {
9
10
  return (
10
11
  <ul className="ds_side-navigation__list"
11
12
  id={isRoot ? 'side-navigation-root' : undefined }
@@ -21,15 +22,15 @@ const SideNavigationItem = function ({
21
22
  isCurrent = false,
22
23
  linkComponent,
23
24
  title
24
- }: SGDS.Component.SideNavigation.Item) {
25
+ }: SideNavigationItemProps) {
25
26
  const LINK_CLASS = 'ds_side-navigation__link';
26
27
 
27
28
  return (
28
29
  <li
29
- className={[
30
+ className={clsx([
30
31
  'ds_side-navigation__item',
31
32
  children && 'ds_side-navigation__item--has-children'
32
- ].join(' ')}
33
+ ])}
33
34
  >
34
35
  {isCurrent ?
35
36
  <span className={LINK_CLASS + ' ds_current'}>{title}</span> :
@@ -47,22 +48,25 @@ const SideNavigation = function ({
47
48
  children,
48
49
  className,
49
50
  ...props
50
- }: SGDS.Component.SideNavigation) {
51
+ }: SideNavigationProps) {
51
52
  const ref = useRef(null);
52
53
 
53
54
  useEffect(() => {
54
- if (ref.current && children) {
55
- new DSSideNavigation(ref.current).init();
55
+ /* istanbul ignore else */
56
+ if (ref.current) {
57
+ if (children) {
58
+ new DSSideNavigation(ref.current).init();
59
+ }
56
60
  }
57
61
  }, [ref]);
58
62
 
59
63
  return (
60
64
  <nav
61
65
  aria-label={ariaLabel}
62
- className={[
66
+ className={clsx([
63
67
  'ds_side-navigation',
64
68
  className
65
- ].join(' ')}
69
+ ])}
66
70
  data-module="ds-side-navigation"
67
71
  ref={ref}
68
72
  {...props}
@@ -0,0 +1,16 @@
1
+ import { LinkComponent } from "../../shared-types";
2
+
3
+ export interface SideNavigationListProps extends React.AllHTMLAttributes<HTMLUListElement> {
4
+ isRoot?: boolean;
5
+ }
6
+
7
+ export interface SideNavigationItemProps extends React.AllHTMLAttributes<HTMLLIElement> {
8
+ isCurrent?: boolean;
9
+ href: string;
10
+ linkComponent?: LinkComponent;
11
+ title: string;
12
+ }
13
+
14
+ export interface SideNavigationProps extends React.AllHTMLAttributes<HTMLElement> {
15
+ ariaLabel?: string;
16
+ }
@@ -1,10 +1,12 @@
1
1
  import React, { Children } from 'react';
2
2
  import ConditionalWrapper from '../../common/ConditionalWrapper';
3
+ import { SiteFooterLicenseProps, SiteFooterLinkProps, SiteFooterOrgProps, SiteFooterProps } from './types';
4
+ import clsx from 'clsx';
3
5
 
4
6
  const License = ({
5
7
  children,
6
8
  ...props
7
- }: SGDS.Component.SiteFooter.License) => {
9
+ }: SiteFooterLicenseProps) => {
8
10
  return (
9
11
  <div className="ds_site-footer__copyright" {...props}>
10
12
  {children}
@@ -15,7 +17,7 @@ const License = ({
15
17
  const Links = ({
16
18
  children,
17
19
  ...props
18
- }: SGDS.Component.SiteFooter.Links) => {
20
+ }: React.AllHTMLAttributes<HTMLUListElement>) => {
19
21
  return (
20
22
  <ul className="ds_site-footer__site-items" {...props}>
21
23
  {children}
@@ -28,7 +30,7 @@ const Link = ({
28
30
  href,
29
31
  linkComponent,
30
32
  ...props
31
- }: SGDS.Component.SiteFooter.Link) => {
33
+ }: SiteFooterLinkProps) => {
32
34
  function processChildren(children: React.ReactNode) {
33
35
  if (linkComponent) {
34
36
  return linkComponent({ href, children });
@@ -49,9 +51,9 @@ const Org = ({
49
51
  title,
50
52
  children,
51
53
  ...props
52
- }: SGDS.Component.SiteFooter.Org) => {
54
+ }: SiteFooterOrgProps) => {
53
55
  children = Children.map(children, child => {
54
- let thisChild = child as React.ReactElement<HTMLElement>;
56
+ const thisChild = child as React.ReactElement<HTMLElement>;
55
57
  if (thisChild && ['img', 'svg', 'picture'].includes(thisChild.type as string)) {
56
58
  return React.cloneElement(thisChild, { className: 'ds_site-footer__org-logo' });
57
59
  } else {
@@ -75,13 +77,13 @@ const SiteFooter = ({
75
77
  children,
76
78
  className,
77
79
  ...props
78
- }: SGDS.Component.SiteFooter) => {
80
+ }: SiteFooterProps) => {
79
81
  return (
80
82
  <footer
81
- className={[
83
+ className={clsx([
82
84
  "ds_site-footer",
83
85
  className
84
- ].join(' ')}
86
+ ])}
85
87
  {...props}
86
88
  >
87
89
  <div className="ds_wrapper">