@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,7 +1,8 @@
1
1
  import { useContext } from 'react';
2
2
  import { CheckboxRadioContext } from '../../utils/context';
3
-
4
3
  import HintText from '../../common/HintText';
4
+ import { CheckboxProps } from './types';
5
+ import clsx from 'clsx';
5
6
 
6
7
  const Checkbox = ({
7
8
  checked,
@@ -13,17 +14,17 @@ const Checkbox = ({
13
14
  name,
14
15
  onBlur,
15
16
  onChange
16
- }: SGDS.Component.Checkbox) => {
17
+ }: CheckboxProps) => {
17
18
  const hintTextId = `hint-text-${id}`;
18
19
  const behaviour = isExclusive && 'exclusive';
19
20
 
20
- function handleBlur(event: React.FocusEvent) {
21
+ function handleBlur(event: React.FocusEvent<HTMLInputElement>) {
21
22
  if (typeof onBlur === 'function') {
22
23
  onBlur(event);
23
24
  }
24
25
  }
25
26
 
26
- function handleChange(event: React.ChangeEvent) {
27
+ function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
27
28
  if (typeof onChange === 'function') {
28
29
  onChange(event);
29
30
  }
@@ -35,10 +36,10 @@ const Checkbox = ({
35
36
  <>
36
37
  {isExclusive && <p className="ds_checkbox-separator">or</p>}
37
38
  <div
38
- className={[
39
+ className={clsx([
39
40
  'ds_checkbox',
40
41
  isSmall && 'ds_checkbox--small'
41
- ].join(' ')}>
42
+ ])}>
42
43
 
43
44
  <input
44
45
  aria-describedby={hintText ? hintTextId : undefined}
@@ -54,7 +55,7 @@ const Checkbox = ({
54
55
  className="ds_checkbox__label"
55
56
  htmlFor={id}
56
57
  >{label}</label>
57
- {hintText && <HintText id={hintTextId} text={hintText} />}
58
+ {hintText && <HintText id={hintTextId}>{hintText}</HintText>}
58
59
  </div>
59
60
  </>
60
61
  );
@@ -18,6 +18,16 @@ test('checkbox group renders correctly', () => {
18
18
  expect(checkboxContainer).not.toHaveClass('ds_checkbox--small');
19
19
  });
20
20
 
21
+ test('instantiating/initialising DS component script', () => {
22
+ render(
23
+ <CheckboxGroup data-testid="checkboxgroup" />
24
+ );
25
+
26
+ const checkboxGroup = screen.getByTestId('checkboxgroup');
27
+ expect(checkboxGroup).toHaveClass('js-initialised');
28
+ expect(checkboxGroup).toHaveClass('js-instantiated');
29
+ });
30
+
21
31
  test('passing additional props', () => {
22
32
  render(
23
33
  <CheckboxGroup data-testid="checkboxgroup" data-test="foo" />
@@ -1,18 +1,19 @@
1
1
  import React, { useEffect, useRef } from 'react';
2
2
  import { CheckboxRadioContext } from '../../utils/context';
3
-
4
- // @ts-ignore
5
- import DSCheckboxes from '@scottish-government/design-system/src/forms/checkbox/checkboxes'
3
+ import DSCheckboxes from '@scottish-government/design-system/src/components/checkbox/checkboxes'
4
+ import { CheckboxGroupProps } from './types';
5
+ import clsx from 'clsx';
6
6
 
7
7
  export const CheckboxGroup = ({
8
8
  children,
9
9
  className,
10
10
  isSmall,
11
11
  ...props
12
- }: SGDS.Component.Checkbox.Group) => {
12
+ }: CheckboxGroupProps) => {
13
13
  const ref = useRef(null);
14
14
 
15
15
  useEffect(() => {
16
+ /* istanbul ignore else */
16
17
  if (ref.current) {
17
18
  new DSCheckboxes(ref.current).init();
18
19
  }
@@ -20,11 +21,11 @@ export const CheckboxGroup = ({
20
21
 
21
22
  return (
22
23
  <div
23
- className={[
24
+ className={clsx([
24
25
  'ds_checkboxes',
25
26
  'ds_field-group',
26
27
  className
27
- ].join(' ')}
28
+ ])}
28
29
  data-module="ds-checkboxes"
29
30
  ref={ref}
30
31
  {...props}
@@ -0,0 +1,9 @@
1
+ import { CheckboxRadioBase } from '../../shared-types';
2
+
3
+ export interface CheckboxGroupProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ isSmall?: boolean;
5
+ }
6
+
7
+ export interface CheckboxProps extends CheckboxRadioBase<HTMLInputElement> {
8
+ isExclusive?: boolean;
9
+ }
@@ -1,5 +1,7 @@
1
1
  import Icon from '../../common/Icon';
2
2
  import WrapperTag from '../../common/WrapperTag';
3
+ import { ConfirmationMessageProps } from './types';
4
+ import clsx from 'clsx';
3
5
 
4
6
  const ConfirmationMessage = ({
5
7
  ariaLive = 'polite',
@@ -8,14 +10,14 @@ const ConfirmationMessage = ({
8
10
  headingLevel = 'h3',
9
11
  title,
10
12
  ...props
11
- }: SGDS.Component.ConfirmationMessage) => {
13
+ }: ConfirmationMessageProps) => {
12
14
  return (
13
15
  <div
14
16
  aria-live={ariaLive}
15
- className={[
17
+ className={clsx([
16
18
  'ds_confirmation-message',
17
19
  className
18
- ].join(' ')}
20
+ ])}
19
21
  {...props}
20
22
  >
21
23
  <Icon className="ds_confirmation-message__icon" icon="CheckCircle" iconSize="24" />
@@ -0,0 +1,7 @@
1
+ import { HeadingLevel } from '../../shared-types';
2
+
3
+ export interface ConfirmationMessageProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ ariaLive: React.AriaAttributes['aria-live'];
5
+ headingLevel: HeadingLevel;
6
+ title: string;
7
+ }
@@ -16,7 +16,7 @@ const meta = {
16
16
  },
17
17
  args: {
18
18
  children: <>
19
- <ContentsNav.Item current>
19
+ <ContentsNav.Item isCurrent>
20
20
  Apply for Blue Badge
21
21
  </ContentsNav.Item>
22
22
  <ContentsNav.Item href="#2">
@@ -39,4 +39,8 @@ export default meta;
39
39
  type Story = StoryObj<typeof meta>;
40
40
 
41
41
  export const Default: Story = {
42
+ args: {
43
+ ariaLabel: 'Contents navigation',
44
+ title: 'Contents'
45
+ }
42
46
  };
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
+ import { ContentsNavItemProps, ContentsNavProps } from './types';
3
+ import clsx from 'clsx';
2
4
 
3
5
  const ContentsNavItem = ({
4
6
  children,
5
7
  isCurrent,
6
8
  href,
7
9
  linkComponent
8
- }: SGDS.Component.ContentsNav.ContentsNavItem) => {
10
+ }: ContentsNavItemProps) => {
9
11
  const classNames = ['ds_contents-nav__link'];
10
12
  let ariaCurrent: React.AriaAttributes["aria-current"];
11
13
 
@@ -14,13 +16,15 @@ const ContentsNavItem = ({
14
16
  ariaCurrent = 'page';
15
17
  }
16
18
 
19
+ const classNamesString = clsx(classNames);
20
+
17
21
  function processChildren(children: React.ReactNode) {
18
22
  if (linkComponent) {
19
- return linkComponent({ className: classNames.join(' '), href, children });
23
+ return linkComponent({ className: classNamesString, href, children });
20
24
  } else if (href) {
21
- return <a href={href} aria-current={ariaCurrent ? ariaCurrent : undefined} className={classNames.join(' ')}>{children}</a>;
25
+ return <a href={href} aria-current={ariaCurrent ? ariaCurrent : undefined} className={classNamesString}>{children}</a>;
22
26
  } else {
23
- return <span aria-current={ariaCurrent ? ariaCurrent : undefined} className={classNames.join(' ')}>{children}</span>;
27
+ return <span aria-current={ariaCurrent ? ariaCurrent : undefined} className={classNamesString}>{children}</span>;
24
28
  }
25
29
  }
26
30
 
@@ -39,14 +43,14 @@ const ContentsNav = ({
39
43
  className,
40
44
  title = 'Contents',
41
45
  ...props
42
- }: SGDS.Component.ContentsNav) => {
46
+ }: ContentsNavProps) => {
43
47
  return (
44
48
  <nav
45
49
  aria-label={ariaLabel}
46
- className={[
50
+ className={clsx([
47
51
  'ds_contents-nav',
48
52
  className
49
- ].join(' ')}
53
+ ])}
50
54
  {...props}
51
55
  >
52
56
  <h2 className="ds_contents-nav__title">{title}</h2>
@@ -0,0 +1,11 @@
1
+ import { LinkComponent } from "../../shared-types";
2
+
3
+ export interface ContentsNavItemProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ isCurrent?: boolean;
5
+ linkComponent?: LinkComponent;
6
+ }
7
+
8
+ export interface ContentsNavProps extends React.AllHTMLAttributes<HTMLElement> {
9
+ ariaLabel: React.AriaAttributes['aria-label'];
10
+ title: string;
11
+ }
@@ -12,9 +12,9 @@ const meta = {
12
12
  },
13
13
  args: {
14
14
  children: [
15
- <Button className="js-accept-all-cookies" small buttonStyle="secondary">Accept all cookies</Button>,
16
- <Button className="js-accept-essential-cookies" small buttonStyle="secondary">Use essential cookies only</Button>,
17
- <a href="/cookies/">Set cookie preferences</a>
15
+ <Button className="js-accept-all-cookies" isSmall buttonStyle="secondary" key="1">Accept all cookies</Button>,
16
+ <Button className="js-accept-essential-cookies" isSmall buttonStyle="secondary" key="2">Use essential cookies only</Button>,
17
+ <a href="/cookies/" key="3">Set cookie preferences</a>
18
18
  ]
19
19
  }
20
20
  } satisfies Meta<typeof CookieBanner.Buttons>;
@@ -12,13 +12,13 @@ const meta = {
12
12
  },
13
13
  args: {
14
14
  children: [
15
- <p key="foo">We use <a href="/cookies/">cookies</a> to collect anonymous data to help us improve your site browsing
15
+ <p key="1">We use <a href="/cookies/">cookies</a> to collect anonymous data to help us improve your site browsing
16
16
  experience.</p>,
17
- <p key="bar">Click 'Accept all cookies' to agree to all cookies that collect anonymous data.
18
- To only allow the cookies that make the site work, click 'Use essential cookies only.' Visit 'Set cookie preferences' to control specific cookies.</p>,
19
- <CookieBanner.Buttons>
20
- <Button className="js-accept-all-cookies" small buttonStyle="secondary">Accept all cookies</Button>
21
- <Button className="js-accept-essential-cookies" small buttonStyle="secondary">Use essential cookies only</Button>
17
+ <p key="2">Click &lsquo;Accept all cookies&rsquo; to agree to all cookies that collect anonymous data.
18
+ To only allow the cookies that make the site work, click &lsquo;Use essential cookies only.&rsquo; Visit &lsquo;Set cookie preferences&rsquo; to control specific cookies.</p>,
19
+ <CookieBanner.Buttons key="3">
20
+ <Button className="js-accept-all-cookies" isSmall buttonStyle="secondary">Accept all cookies</Button>
21
+ <Button className="js-accept-essential-cookies" isSmall buttonStyle="secondary">Use essential cookies only</Button>
22
22
  <a href="/cookies/">Set cookie preferences</a>
23
23
  </CookieBanner.Buttons>
24
24
  ]
@@ -4,8 +4,9 @@
4
4
  */
5
5
 
6
6
  import { test, expect } from 'vitest';
7
- import { render } from '@testing-library/react';
7
+ import { render, screen } from '@testing-library/react';
8
8
  import CookieBanner from './CookieBanner';
9
+ import Button from '../Button/Button';
9
10
 
10
11
  const BANNER_TEXT = 'We need to tell you about something';
11
12
 
@@ -16,6 +17,11 @@ test('cookie banner renders correctly', () => {
16
17
  render(
17
18
  <CookieBanner>
18
19
  {BANNER_TEXT}
20
+ <CookieBanner.Buttons>
21
+ <Button className="js-accept-all-cookies" isSmall buttonStyle="secondary">Accept all cookies</Button>
22
+ <Button className="js-accept-essential-cookies" isSmall buttonStyle="secondary">Use essential cookies only</Button>
23
+ <a href="/cookies/">Set cookie preferences</a>
24
+ </CookieBanner.Buttons>
19
25
  </CookieBanner>
20
26
  );
21
27
 
@@ -23,3 +29,20 @@ test('cookie banner renders correctly', () => {
23
29
 
24
30
  expect(bannerContainer).toHaveClass('ds_notification', 'ds_notification--large', 'ds_notification--cookie', 'js-initial-cookie-content');
25
31
  });
32
+
33
+ test('instantiating/initialising DS component script', () => {
34
+ render(
35
+ <CookieBanner data-testid="cookie-banner" >
36
+ {BANNER_TEXT}
37
+ <CookieBanner.Buttons>
38
+ <Button className="js-accept-all-cookies" isSmall buttonStyle="secondary">Accept all cookies</Button>
39
+ <Button className="js-accept-essential-cookies" isSmall buttonStyle="secondary">Use essential cookies only</Button>
40
+ <a href="/cookies/">Set cookie preferences</a>
41
+ </CookieBanner.Buttons>
42
+ </CookieBanner>
43
+ );
44
+
45
+ const cookieBanner = screen.getByTestId('cookie-banner');
46
+ expect(cookieBanner).toHaveClass('js-initialised');
47
+ expect(cookieBanner).toHaveClass('js-instantiated');
48
+ });
@@ -1,25 +1,36 @@
1
1
 
2
+ import { useEffect, useRef } from 'react';
2
3
  import AbstractNotificationBanner from '../../common/AbstractNotificationBanner';
3
- // @ts-ignore
4
4
  import DSCookieBanner from '@scottish-government/design-system/src/components/cookie-notification/cookie-notification.js';
5
+ import { AbstractNotificationBannerProps } from '../../common/AbstractNotificationBanner/types';
6
+ import clsx from 'clsx';
5
7
 
6
8
  const CookieBanner = ({
7
9
  children,
8
10
  className,
9
- title,
11
+ title = 'Information',
10
12
  ...props
11
- }: SGDS.Common.AbstractNotificationBanner) => {
13
+ }: AbstractNotificationBannerProps) => {
14
+ const ref = useRef(null);
15
+
16
+ useEffect(() => {
17
+ /* istanbul ignore else */
18
+ if (ref.current) {
19
+ new DSCookieBanner(ref.current).init();
20
+ }
21
+ }, [ref]);
12
22
 
13
23
  return (
14
24
  <>
15
25
  <AbstractNotificationBanner
16
- className={[
26
+ className={clsx([
17
27
  'ds_notification--large',
18
28
  'ds_notification--cookie',
19
29
  'js-initial-cookie-content',
20
30
  className
21
- ].join(' ')}
31
+ ])}
22
32
  data-module="ds-cookie-notification"
33
+ ref={ref}
23
34
  title={title}
24
35
  {...props}
25
36
  >
@@ -24,8 +24,6 @@ test('date picker renders correctly', () => {
24
24
  expect(label.tagName).toEqual('LABEL');
25
25
  expect(textInput).toHaveClass('ds_input', 'ds_input--fixed-10');
26
26
  expect(textInput.id).toEqual(DATE_PICKER_ID);
27
-
28
- // todo: check for DS script being fired
29
27
  });
30
28
 
31
29
  test('date picker with disabled dates', () => {
@@ -61,23 +59,6 @@ test('date picker with hint text', () => {
61
59
  expect(textInput).toHaveAttribute('aria-describedby', hintTextEl.id);
62
60
  });
63
61
 
64
- test('date picker with custom icon path', () => {
65
- const ICON_PATH = '/my/icon/path'
66
-
67
- render(
68
- <DatePicker
69
- id={DATE_PICKER_ID}
70
- label={LABEL_TEXT}
71
- iconPath={ICON_PATH}
72
- />
73
- );
74
- const datePicker = screen.getAllByRole('generic')[1];
75
- const label = within(datePicker).getByText(LABEL_TEXT);
76
- const textInput = within(datePicker).getByRole('textbox');
77
-
78
- // todo
79
- });
80
-
81
62
  test('date picker with max date', () => {
82
63
  const MAX_DATE = '28/05/2023'
83
64
 
@@ -144,6 +125,44 @@ test('date picker with change fn', () => {
144
125
  expect(ONCHANGE_FUNCTION).toHaveBeenCalled();
145
126
  });
146
127
 
128
+ test('date picker with onBlur that is not a function', () => {
129
+ render(
130
+ <DatePicker
131
+ id={DATE_PICKER_ID}
132
+ label={LABEL_TEXT}
133
+ // @ts-expect-error onBlur is not a function
134
+ onBlur='foo'
135
+ />
136
+ );
137
+ const datePicker = screen.getAllByRole('generic')[1];
138
+ const textInput = within(datePicker).getByRole('textbox');
139
+
140
+ fireEvent.blur(textInput);
141
+
142
+ // todo: assertion
143
+ // success indicated by no errors thrown
144
+ // error would be thrown on an untestable thread
145
+ });
146
+
147
+ test('date picker with onChange that is not a function', () => {
148
+ render(
149
+ <DatePicker
150
+ id={DATE_PICKER_ID}
151
+ label={LABEL_TEXT}
152
+ // @ts-expect-error onChange is not a function
153
+ onChange='foo'
154
+ />
155
+ );
156
+ const datePicker = screen.getAllByRole('generic')[1];
157
+ const textInput = within(datePicker).getByRole('textbox');
158
+
159
+ fireEvent.change(textInput, { target: { value: 'foo' } });
160
+
161
+ // todo: assertion
162
+ // success indicated by no errors thrown
163
+ // error would be thrown on an untestable thread
164
+ });
165
+
147
166
  test('date picker with initial value', () => {
148
167
  const INITIAL_VALUE = '28/05/2023';
149
168
 
@@ -226,6 +245,20 @@ test('date picker with error message', () => {
226
245
  expect(errorMessageElement).toHaveClass('ds_question__error-message');
227
246
  });
228
247
 
248
+ test('instantiating/initialising DS component script', () => {
249
+ render(
250
+ <DatePicker
251
+ id={DATE_PICKER_ID}
252
+ label={LABEL_TEXT}
253
+ data-test="foo"
254
+ />
255
+ )
256
+
257
+ const datePicker = screen.getAllByRole('generic')[1];
258
+ expect(datePicker).toHaveClass('js-initialised');
259
+ expect(datePicker).toHaveClass('js-instantiated');
260
+ });
261
+
229
262
  test('passing additional props', () => {
230
263
  render(
231
264
  <DatePicker
@@ -1,8 +1,9 @@
1
1
  import { useEffect, useRef } from 'react';
2
- // @ts-ignore
3
2
  import DSDatePicker from '@scottish-government/design-system/src/components/date-picker/date-picker';
4
3
  import ErrorMessage from '../ErrorMessage';
5
4
  import TextInput from '../TextInput';
5
+ import { DatePickerProps } from './types';
6
+ import clsx from 'clsx';
6
7
 
7
8
  const DatePicker = ({
8
9
  className,
@@ -12,7 +13,6 @@ const DatePicker = ({
12
13
  hasError,
13
14
  hintText,
14
15
  id,
15
- iconPath = './',
16
16
  label,
17
17
  maxDate,
18
18
  minDate,
@@ -23,17 +23,17 @@ const DatePicker = ({
23
23
  value,
24
24
  width = 'fixed-10',
25
25
  ...props
26
- }: SGDS.Component.DatePicker) => {
26
+ }: DatePickerProps) => {
27
27
  const ref = useRef(null);
28
28
 
29
29
  useEffect(() => {
30
+ /* istanbul ignore else */
30
31
  if (ref.current) {
31
32
  new DSDatePicker(ref.current, {
32
- dateSelectCallback,
33
- imagePath: iconPath
33
+ dateSelectCallback
34
34
  }).init();
35
35
  }
36
- }, [ref, dateSelectCallback, iconPath]);
36
+ }, [ref, dateSelectCallback]);
37
37
 
38
38
  function handleBlur(event: React.FocusEvent) {
39
39
  if (typeof onBlur === 'function') {
@@ -49,11 +49,11 @@ const DatePicker = ({
49
49
 
50
50
  return (
51
51
  <div
52
- className={[
52
+ className={clsx([
53
53
  "ds_datepicker",
54
54
  multiple && "ds_datepicker--multiple",
55
55
  className
56
- ].join(' ')}
56
+ ])}
57
57
  data-disableddates={disabledDates}
58
58
  data-maxdate={maxDate}
59
59
  data-mindate={minDate}
@@ -0,0 +1,19 @@
1
+ import { InputWidth } from "../../shared-types";
2
+
3
+ export interface DatePickerProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ dateSelectCallback?: (date: Date) => void;
5
+ disabledDates?: string;
6
+ hasError?: boolean;
7
+ errorMessage?: string | React.ReactNode;
8
+ id: string;
9
+ hintText?: string | React.ReactNode;
10
+ label: string;
11
+ maxDate?: string;
12
+ minDate?: string;
13
+ isMultiple?: boolean;
14
+ name?: string;
15
+ onBlur?: React.EventHandler<React.FocusEvent>;
16
+ onChange?: React.EventHandler<React.FormEvent>;
17
+ value?: string;
18
+ width?: InputWidth;
19
+ }
@@ -9,7 +9,7 @@ const meta = {
9
9
  argTypes: {
10
10
  children: argTypes.children(),
11
11
  summary: {
12
- description: 'Text to use for the details component\'s summary element',
12
+ description: 'Text to use for the details component\'s \'summary\' element',
13
13
  type: {
14
14
  name: 'string',
15
15
  required: true
@@ -1,15 +1,18 @@
1
+ import { DetailsProps } from "./types";
2
+ import clsx from 'clsx';
3
+
1
4
  const Details = ({
2
5
  children,
3
6
  className,
4
7
  summary,
5
8
  ...props
6
- }: SGDS.Component.Details) => {
9
+ }: DetailsProps) => {
7
10
  return (
8
11
  <details
9
- className={[
12
+ className={clsx([
10
13
  "ds_details",
11
14
  className
12
- ].join(' ')}
15
+ ])}
13
16
  {...props}
14
17
  >
15
18
  <summary className="ds_details__summary">
@@ -0,0 +1,4 @@
1
+ export interface DetailsProps extends React.AllHTMLAttributes<HTMLDetailsElement> {
2
+ title?: string;
3
+ summary: string;
4
+ }
@@ -1,15 +1,18 @@
1
+ import { ErrorMessageProps } from "./types";
2
+ import clsx from 'clsx';
3
+
1
4
  const ErrorMessage = ({
2
5
  children,
3
6
  className,
4
7
  id,
5
8
  ...props
6
- }: SGDS.Component.ErrorMessage) => {
9
+ }: ErrorMessageProps) => {
7
10
  return (
8
11
  <p
9
- className={[
12
+ className={clsx([
10
13
  'ds_question__error-message',
11
14
  className
12
- ].join(' ')}
15
+ ])}
13
16
  id={id}
14
17
  {...props}
15
18
  >
@@ -0,0 +1,3 @@
1
+ export interface ErrorMessageProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ id?: string;
3
+ }
@@ -74,7 +74,7 @@ test('error summary item with no link', () => {
74
74
  test('error summary item with custom element', () => {
75
75
  render(
76
76
  <ErrorSummary.Item fragmentId={ERROR_FRAGMENT_ID} linkComponent={
77
- ({ className, ...props }) => (
77
+ ({ ...props }) => (
78
78
  <strong role="link" {...props}/>
79
79
  )}>
80
80
  {ERROR_TEXT}
@@ -1,10 +1,12 @@
1
1
  import { useId } from 'react';
2
+ import { ErrorSummaryItemProps, ErrorSummaryProps } from './types';
3
+ import clsx from 'clsx';
2
4
 
3
5
  const ErrorSummaryItem = ({
4
6
  children,
5
7
  fragmentId,
6
8
  linkComponent
7
- }: SGDS.Component.ErrorSummary.Item) => {
9
+ }: ErrorSummaryItemProps) => {
8
10
  const HREF = '#' + fragmentId;
9
11
 
10
12
  function processChildren(children: React.ReactNode) {
@@ -29,14 +31,14 @@ const ErrorSummary = ({
29
31
  className,
30
32
  title = 'There is a problem',
31
33
  ...props
32
- }: SGDS.Component.ErrorSummary) => {
34
+ }: ErrorSummaryProps) => {
33
35
  const summaryTitleId = useId();
34
36
 
35
37
  return (
36
- <div className={[
38
+ <div className={clsx([
37
39
  'ds_error-summary',
38
40
  className
39
- ].join(' ')}
41
+ ])}
40
42
  aria-labelledby={summaryTitleId}
41
43
  role="alert"
42
44
  {...props}
@@ -0,0 +1,11 @@
1
+
2
+ import { LinkComponent } from '../../shared-types';
3
+
4
+ export interface ErrorSummaryItemProps extends React.AllHTMLAttributes<HTMLElement> {
5
+ fragmentId: string;
6
+ linkComponent?: LinkComponent;
7
+ }
8
+
9
+ export interface ErrorSummaryProps extends React.AllHTMLAttributes<HTMLElement> {
10
+ title: string;
11
+ }