@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,8 +1,16 @@
1
1
  /**
2
2
  * Wraps all children in a specified HTML tag if a condition is met.
3
3
  */
4
- const ConditionalWrapper = ({ condition, wrapper, children }:SGDS.Common.ConditionalWrapper) =>
5
- condition ? wrapper(children) : children;
4
+
5
+ import { ConditionalWrapperProps } from "./types";
6
+
7
+ const ConditionalWrapper = ({
8
+ condition,
9
+ wrapper,
10
+ children
11
+ }: ConditionalWrapperProps) => {
12
+ return condition ? wrapper(children as React.JSX.Element) : children;
13
+ };
6
14
 
7
15
  ConditionalWrapper.displayName = 'ConditionalWrapper';
8
16
 
@@ -0,0 +1,4 @@
1
+ export interface ConditionalWrapperProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ condition: boolean;
3
+ wrapper: (children: React.JSX.Element) => React.JSX.Element;
4
+ }
@@ -1,11 +1,12 @@
1
1
  import React from 'react';
2
2
  import * as FileIcons from '../../images/documents';
3
+ import { FileIconProps } from './types';
3
4
 
4
5
  const FileIcon = ({
5
6
  ariaLabel = '',
6
7
  className,
7
8
  icon
8
- }: SGDS.Common.FileIcon) => {
9
+ }: FileIconProps) => {
9
10
  const FileIconComponent = FileIcons[icon];
10
11
 
11
12
  return (
@@ -0,0 +1,7 @@
1
+ import { DocumentIconName } from '../../shared-types';
2
+
3
+ export interface FileIconProps extends React.AllHTMLAttributes<SVGSVGElement> {
4
+ ariaLabel?: React.AriaAttributes['aria-label'];
5
+ className?: string;
6
+ icon: DocumentIconName;
7
+ }
@@ -9,8 +9,9 @@ test('hint test renders correctly', () => {
9
9
  render(
10
10
  <HintText data-testid="hint-text"
11
11
  id={HINT_TEXT_ID}
12
- text={HINT_TEXT_CONTENT}
13
- />
12
+ >
13
+ {HINT_TEXT_CONTENT}
14
+ </HintText>
14
15
  );
15
16
 
16
17
  const hintText = screen.getByTestId('hint-text');
@@ -20,19 +21,6 @@ test('hint test renders correctly', () => {
20
21
  expect(hintText.textContent).toEqual(HINT_TEXT_CONTENT);
21
22
  });
22
23
 
23
- test('hint test with children instead of text', () => {
24
- render(
25
- <HintText data-testid="hint-text"
26
- id={HINT_TEXT_ID}
27
- >
28
- <span>{HINT_TEXT_CONTENT}</span>
29
- </HintText>
30
- );
31
-
32
- const hintText = screen.getByTestId('hint-text');
33
- expect(hintText.innerHTML).toEqual(`<span>${HINT_TEXT_CONTENT}</span>`);
34
- });
35
-
36
24
  test('passing additional props', () => {
37
25
  render(
38
26
  <HintText data-testid="hint-text"
@@ -1,17 +1,17 @@
1
+ import { HintTextProps } from "./types";
2
+
1
3
  const HintText = ({
2
4
  children,
3
5
  id,
4
- text,
5
6
  ...props
6
- }: SGDS.Common.HintText) => {
7
+ }: HintTextProps) => {
7
8
  return (
8
9
  <p
9
10
  className="ds_hint-text"
10
- dangerouslySetInnerHTML={text ? { __html: text } : undefined}
11
11
  id={id}
12
12
  {...props}
13
13
  >
14
- {!text ? children : null}
14
+ {children}
15
15
  </p>
16
16
  );
17
17
  };
@@ -0,0 +1,4 @@
1
+ export interface HintTextProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ id?: string;
3
+ text?: string;
4
+ }
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
  import * as Icons from '../../images/icons';
3
+ import { IconProps } from './types';
4
+ import clsx from 'clsx';
3
5
 
4
6
  const Icon = ({
5
7
  ariaLabel,
@@ -7,19 +9,19 @@ const Icon = ({
7
9
  isFilled,
8
10
  icon,
9
11
  iconSize
10
- }: SGDS.Common.Icon) => {
12
+ }: IconProps) => {
11
13
  const IconComponent = Icons[icon];
12
14
 
13
15
  return (
14
16
  <IconComponent
15
17
  aria-hidden={ariaLabel ? undefined : true}
16
18
  aria-label={ariaLabel}
17
- className={[
19
+ className={clsx([
18
20
  'ds_icon',
19
21
  className,
20
22
  isFilled && 'ds_icon--fill',
21
23
  iconSize && `ds_icon--${iconSize}`
22
- ].join(' ')}
24
+ ])}
23
25
  />
24
26
  );
25
27
  };
@@ -0,0 +1,9 @@
1
+ import { IconName } from '../../shared-types';
2
+
3
+ export interface IconProps extends React.AllHTMLAttributes<SVGSVGElement> {
4
+ ariaLabel?: React.AriaAttributes['aria-label'];
5
+ className?: string;
6
+ isFilled?: boolean;
7
+ icon: IconName;
8
+ iconSize?: string;
9
+ }
@@ -1,7 +1,7 @@
1
1
  const ScreenReaderText = ({
2
2
  children,
3
3
  ...props
4
- }: SGDS.Common.ScreenReaderText) => {
4
+ }: React.AllHTMLAttributes<HTMLElement>) => {
5
5
  return (
6
6
  <span
7
7
  className="visually-hidden"
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * Wraps all children in a specified HTML tag.
3
3
  */
4
+ import React from 'react';
5
+ import { WrapperTagProps } from './types';
6
+
4
7
  const WrapperTag = ({
5
8
  children,
6
9
  tagName = 'div',
7
10
  ...props
8
- }: SGDS.Common.WrapperTag) => {
9
- const TagName = tagName;
10
- return <TagName {...props}>{children}</TagName>;
11
+ }: WrapperTagProps) => {
12
+ return React.createElement(tagName, props, children);
11
13
  };
12
14
 
13
15
  WrapperTag.displayName = 'WrapperTag';
@@ -0,0 +1,3 @@
1
+ export interface WrapperTagProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ tagName?: string;
3
+ }
@@ -1,5 +1,4 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import argTypes from '../../../.storybook/sgdsArgTypes';
3
2
 
4
3
  import Accordion from './Accordion';
5
4
 
@@ -15,9 +14,6 @@ const meta = {
15
14
  required: true
16
15
  }
17
16
  },
18
- headingLevel: argTypes.headingLevel({
19
- description: 'Heading level for the component\'s heading. It is best to set this on the parent Accordion.'
20
- }),
21
17
  id: {
22
18
  description: 'ID to use for the accordion item if you want to override the automatically generated default',
23
19
  type: 'string'
@@ -37,7 +33,7 @@ const meta = {
37
33
  Veterans are entitled to the same healthcare as any citizen. And there are health care options and support available specifically for veterans.
38
34
  </p>
39
35
  <p>
40
- If you have a health condition that's related to your service, you're entitled to priority treatment based on clinical need.
36
+ If you have a health condition that&apos;s related to your service, you&apos;re entitled to priority treatment based on clinical need.
41
37
  </p>
42
38
  </>
43
39
  }
@@ -12,7 +12,7 @@ const meta = {
12
12
  }),
13
13
  hideOpenAll: {
14
14
  control: 'boolean',
15
- description: 'Do not show the open all button',
15
+ description: 'Do not show the \'open all\' button',
16
16
  type: 'boolean'
17
17
  },
18
18
  children: {
@@ -26,17 +26,17 @@ const meta = {
26
26
  Veterans are entitled to the same healthcare as any citizen. And there are health care options and support available specifically for veterans.
27
27
  </p>
28
28
  <p>
29
- If you have a health condition that's related to your service, you're entitled to priority treatment based on clinical need.
29
+ If you have a health condition that&apos;s related to your service, you&apos;re entitled to priority treatment based on clinical need.
30
30
  </p>
31
31
  </Accordion.Item>
32
32
  <Accordion.Item id='accordion-2' heading='Employability for veterans'>
33
33
  <p>
34
- If you're looking for a job, there are several organisations that can help you <a href="#accordion-link">find a job or develop new skills</a>.
34
+ If you&apos;re looking for a job, there are several organisations that can help you <a href="#accordion-link">find a job or develop new skills</a>.
35
35
  </p>
36
36
  </Accordion.Item>
37
37
  <Accordion.Item id='accordion-3' heading='Housing for veterans'>
38
38
  <p>
39
- If you need <a href="#accordion-link"> help finding a place to live</a> there's support specifically for veterans.
39
+ If you need <a href="#accordion-link"> help finding a place to live</a> there&apos;s support specifically for veterans.
40
40
  </p>
41
41
  </Accordion.Item>
42
42
  </>
@@ -53,7 +53,7 @@ export const Default: Story = {
53
53
  export const HideOpenAll: Story = {
54
54
  args: {
55
55
  hideOpenAll: true
56
- },
56
+ }
57
57
  }
58
58
 
59
59
  export const InvalidNoChildren: Story = {
@@ -99,6 +99,17 @@ test('accordion with custom heading level', () => {
99
99
  expect(firstAccordionTitle?.tagName).toEqual(HEADING_LEVEL.toUpperCase());
100
100
  });
101
101
 
102
+ test('instantiating/initialising DS component script', () => {
103
+ render(
104
+ <Accordion id={ACCORDION_ID} data-testid={ACCORDION_ID} data-test="foo">
105
+ </Accordion>
106
+ )
107
+
108
+ const accordion = screen.getByTestId(ACCORDION_ID);
109
+ expect(accordion).toHaveClass('js-initialised');
110
+ expect(accordion).toHaveClass('js-instantiated');
111
+ });
112
+
102
113
  test('passing additional props to accordion', () => {
103
114
  render(
104
115
  <Accordion id={ACCORDION_ID} data-testid={ACCORDION_ID} data-test="foo">
@@ -1,7 +1,8 @@
1
1
  import React, { createContext, useContext, useEffect, useRef, useId } from 'react';
2
2
  import WrapperTag from '../../common/WrapperTag';
3
- // @ts-ignore
4
3
  import DSAccordion from '@scottish-government/design-system/src/components/accordion/accordion';
4
+ import { AccordionItemProps, AccordionProps } from './types';
5
+ import clsx from 'clsx';
5
6
 
6
7
  let accordionItemCounter = 0;
7
8
  const AccordionHeadingLevelContext = createContext('h3');
@@ -14,11 +15,11 @@ const AccordionItem = ({
14
15
  heading,
15
16
  title,
16
17
  ...props
17
- }: SGDS.Component.Accordion.Item) => {
18
+ }: AccordionItemProps) => {
18
19
  accordionItemCounter = accordionItemCounter + 1;
19
20
  const processedId = rawId || `accordion-item-${useId()}`;
20
21
 
21
- let headingLevel = useContext(AccordionHeadingLevelContext);
22
+ const headingLevel = useContext(AccordionHeadingLevelContext);
22
23
 
23
24
  if (title) {
24
25
  console.warn(
@@ -30,19 +31,19 @@ const AccordionItem = ({
30
31
 
31
32
  return (
32
33
  <div
33
- className={[
34
+ className={clsx([
34
35
  'ds_accordion-item',
35
36
  className
36
- ].join(' ')}
37
+ ])}
37
38
  id={processedId}
38
39
  {...props}
39
40
  >
40
41
  <input
41
42
  aria-labelledby={`panel-${processedId}-heading`}
42
- className={[
43
+ className={clsx([
43
44
  'ds_accordion-item__control',
44
45
  'visually-hidden'
45
- ].join(' ')}
46
+ ])}
46
47
  defaultChecked={isOpen}
47
48
  id={`${processedId}-control`}
48
49
  type="checkbox"
@@ -77,10 +78,11 @@ const Accordion = ({
77
78
  hideOpenAll,
78
79
  isSmall,
79
80
  ...props
80
- }: SGDS.Component.Accordion) => {
81
+ }: AccordionProps) => {
81
82
  const ref = useRef(null);
82
83
 
83
84
  useEffect(() => {
85
+ /* istanbul ignore else */
84
86
  if (ref.current) {
85
87
  new DSAccordion(ref.current).init();
86
88
  }
@@ -92,21 +94,21 @@ const Accordion = ({
92
94
 
93
95
  return (
94
96
  <div
95
- className={[
97
+ className={clsx([
96
98
  'ds_accordion',
97
- isSmall ? 'ds_accordion--small' : '',
99
+ isSmall && 'ds_accordion--small',
98
100
  className
99
- ].join(' ')}
101
+ ])}
100
102
  ref={ref}
101
103
  {...props}
102
104
  >
103
105
  { !hideOpenAll && (
104
106
  <button
105
- className={[
107
+ className={clsx([
106
108
  'ds_accordion__open-all',
107
109
  'ds_link',
108
110
  'js-open-all'
109
- ].join(' ')}
111
+ ])}
110
112
  type='button'
111
113
  >
112
114
  Open all
@@ -0,0 +1,13 @@
1
+ import { HeadingLevel } from "../../shared-types";
2
+
3
+ export interface AccordionItemProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ id?: string;
5
+ heading: string | React.ReactNode;
6
+ isOpen?: boolean;
7
+ }
8
+
9
+ export interface AccordionProps extends React.AllHTMLAttributes<HTMLElement> {
10
+ headingLevel?: HeadingLevel;
11
+ hideOpenAll?: boolean;
12
+ isSmall?: boolean;
13
+ }
@@ -1,7 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import argTypes from '../../../.storybook/sgdsArgTypes';
3
-
4
- // @ts-ignore
3
+ // @ts-expect-error no types
5
4
  import coo from '../../../static/images/highland-cow.jpg';
6
5
  import AspectBox from './AspectBox';
7
6
 
@@ -1,22 +1,16 @@
1
- import React, { Children, useEffect, useRef } from 'react';
2
- // @ts-ignore
3
- import DSAspectBox from '@scottish-government/design-system/src/components/aspect-box/aspect-box-fallback';
1
+ import React, { Children, useRef } from 'react';
2
+ import { AspectBoxProps } from './types';
3
+ import clsx from 'clsx';
4
4
 
5
5
  const AspectBox = ({
6
6
  children,
7
7
  className,
8
8
  ratio,
9
9
  ...props
10
- }: SGDS.Component.AspectBox) => {
10
+ }: AspectBoxProps) => {
11
11
  const ref = useRef(null);
12
12
 
13
- useEffect(() => {
14
- if (ref.current) {
15
- new DSAspectBox(ref.current).init();
16
- }
17
- }, [ref]);
18
-
19
- function processChild(child: any) {
13
+ function processChild(child: React.JSX.Element) {
20
14
  if (['img', 'svg', 'picture'].includes(child.type)) {
21
15
  return React.cloneElement(child, { className: 'ds_aspect-box__inner' });
22
16
  }
@@ -41,15 +35,15 @@ const AspectBox = ({
41
35
 
42
36
  return (
43
37
  <div
44
- className={[
38
+ className={clsx([
45
39
  'ds_aspect-box',
46
40
  ratioClassName,
47
41
  className
48
- ].join(' ')}
42
+ ])}
49
43
  ref={ref}
50
44
  {...props}
51
45
  >
52
- {Children.map(children, child => processChild(child))}
46
+ {Children.map(children, child => processChild(child as React.JSX.Element))}
53
47
  </div>
54
48
  );
55
49
  };
@@ -0,0 +1,3 @@
1
+ export interface AspectBoxProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ ratio?: 'square' | '1:1' | '4:3' | '16:9' | '21:9';
3
+ }
@@ -1,7 +1,16 @@
1
- import { test, expect } from 'vitest';
1
+ import { test, expect, vi } from 'vitest';
2
2
  import { render, screen, within } from '@testing-library/react';
3
3
  import BackToTop from './BackToTop';
4
4
 
5
+ // Mock the ResizeObserver
6
+ class ResizeObserverMock {
7
+ constructor() {}
8
+ observe() { return vi.fn() }
9
+ unobserve() { return vi.fn() }
10
+ disconnect() { return vi.fn() }
11
+ };
12
+ vi.stubGlobal('ResizeObserver', ResizeObserverMock);
13
+
5
14
  test('back to top renders correctly', () => {
6
15
  render(
7
16
  <BackToTop data-test="foo" />
@@ -34,6 +43,17 @@ test('renders with custom href', () => {
34
43
  expect(button).toHaveAttribute('href', '#foo');
35
44
  });
36
45
 
46
+ test('instantiating/initialising DS component script', () => {
47
+ render(
48
+ <BackToTop />
49
+ );
50
+
51
+ const button = screen.getByRole('link');
52
+ const container = button.parentElement;
53
+ expect(container).toHaveClass('js-initialised');
54
+ expect(container).toHaveClass('js-instantiated');
55
+ });
56
+
37
57
  test('passing additional props', () => {
38
58
  render(
39
59
  <BackToTop data-test="foo" />
@@ -1,16 +1,18 @@
1
1
  import { useEffect, useRef } from 'react';
2
2
  import Icon from '../../common/Icon';
3
- // @ts-ignore
4
3
  import DSBackToTop from '@scottish-government/design-system/src/components/back-to-top/back-to-top';
4
+ import { BackToTopProps } from './types';
5
+ import clsx from 'clsx';
5
6
 
6
7
  const BackToTop = ({
7
8
  className,
8
9
  href = '#page-top',
9
10
  ...props
10
- }: SGDS.Component.BackToTop) => {
11
+ }: BackToTopProps) => {
11
12
  const ref = useRef(null);
12
13
 
13
14
  useEffect(() => {
15
+ /* istanbul ignore else */
14
16
  if (ref.current) {
15
17
  new DSBackToTop(ref.current).init();
16
18
  }
@@ -18,10 +20,10 @@ const BackToTop = ({
18
20
 
19
21
  return (
20
22
  <div
21
- className={[
23
+ className={clsx([
22
24
  'ds_back-to-top',
23
25
  className
24
- ].join(' ')}
26
+ ])}
25
27
  ref={ref}
26
28
  {...props}
27
29
  >
@@ -0,0 +1,3 @@
1
+ export interface BackToTopProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ href?: string;
3
+ }
@@ -1,10 +1,13 @@
1
+ import { BreadcrumbItemProps } from "./types";
2
+ import clsx from 'clsx';
3
+
1
4
  const BreadcrumbItem = ({
2
5
  children,
3
6
  isHidden,
4
7
  href,
5
8
  linkComponent,
6
9
  ...props
7
- }: SGDS.Component.Breadcrumbs.Item) => {
10
+ }: BreadcrumbItemProps) => {
8
11
  const BREADCRUMB_LINK_CLASSNAME = 'ds_breadcrumbs__link';
9
12
 
10
13
  function processChildren(children: React.ReactNode) {
@@ -18,10 +21,10 @@ const BreadcrumbItem = ({
18
21
  }
19
22
 
20
23
  return (
21
- <li className={[
24
+ <li className={clsx([
22
25
  'ds_breadcrumbs__item',
23
26
  isHidden && 'visually-hidden'
24
- ].join(' ')}
27
+ ])}
25
28
  {...props}
26
29
  >
27
30
  {processChildren(children)}
@@ -32,7 +35,7 @@ const BreadcrumbItem = ({
32
35
  const Breadcrumbs = ({
33
36
  children,
34
37
  ...props
35
- }: SGDS.Component.Breadcrumbs) => {
38
+ }: React.AllHTMLAttributes<HTMLElement>) => {
36
39
  return (
37
40
  <nav
38
41
  aria-label="Breadcrumb"
@@ -0,0 +1,6 @@
1
+ import { LinkComponent } from "../../shared-types";
2
+
3
+ export interface BreadcrumbItemProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ isHidden?: boolean;
5
+ linkComponent?: LinkComponent;
6
+ }
@@ -1,6 +1,8 @@
1
1
  import Icon from '../../common/Icon';
2
2
  import ScreenReaderText from '../../common/ScreenReaderText';
3
3
  import WrapperTag from '../../common/WrapperTag';
4
+ import { ButtonProps } from './types';
5
+ import clsx from 'clsx';
4
6
 
5
7
  const Button = ({
6
8
  buttonStyle,
@@ -15,7 +17,7 @@ const Button = ({
15
17
  type = 'button',
16
18
  width,
17
19
  ...props
18
- }: SGDS.Component.Button) => {
20
+ }: ButtonProps) => {
19
21
  // determine which HTML tag to use
20
22
  let tagName = 'button';
21
23
  if (href) {
@@ -25,15 +27,15 @@ const Button = ({
25
27
  return (
26
28
  <WrapperTag
27
29
  tagName={tagName}
28
- className={[
30
+ className={clsx([
29
31
  !hasLinkStyle ? 'ds_button' : 'ds_link',
30
32
  width && `ds_button--${width}`,
31
33
  buttonStyle && `ds_button--${buttonStyle}`,
32
34
  isSmall && 'ds_button--small',
33
- (icon && !isIconOnly) ? 'ds_button--has-icon' : undefined,
35
+ (icon && !isIconOnly) && 'ds_button--has-icon',
34
36
  isIconLeft && 'ds_button--has-icon--left',
35
37
  className
36
- ].join(' ')}
38
+ ])}
37
39
  href={href}
38
40
  {...(tagName === 'button' ? { type: type } : {})}
39
41
  {...props}
@@ -17,6 +17,15 @@ const meta = {
17
17
  summary: 'boolean'
18
18
  }
19
19
  }
20
+ },
21
+ isWrap: {
22
+ description: 'Force wrap buttons on small screens',
23
+ control: 'boolean',
24
+ table: {
25
+ type: {
26
+ summary: 'boolean'
27
+ }
28
+ }
20
29
  }
21
30
  },
22
31
  args: {
@@ -39,3 +48,16 @@ export const Inline: Story = {
39
48
  isInline: true
40
49
  }
41
50
  };
51
+
52
+ export const Wrap: Story = {
53
+ args: {
54
+ isWrap: true
55
+ }
56
+ };
57
+
58
+ export const InlineWrap: Story = {
59
+ args: {
60
+ isInline: true,
61
+ isWrap: true
62
+ }
63
+ };
@@ -24,6 +24,27 @@ test('inline button group', () => {
24
24
  expect(buttonGroup).toHaveClass('ds_button-group--inline');
25
25
  });
26
26
 
27
+ test('wrap button group', () => {
28
+ render(
29
+ <ButtonGroup isWrap data-testid="button-group">
30
+
31
+ </ButtonGroup>
32
+ );
33
+ const buttonGroup = screen.getByTestId('button-group');
34
+ expect(buttonGroup).toHaveClass('ds_button-group--wrap');
35
+ });
36
+
37
+ test('inline-wrap button group', () => {
38
+ render(
39
+ <ButtonGroup isInline isWrap data-testid="button-group">
40
+
41
+ </ButtonGroup>
42
+ );
43
+ const buttonGroup = screen.getByTestId('button-group');
44
+ expect(buttonGroup).toHaveClass('ds_button-group--inline');
45
+ expect(buttonGroup).toHaveClass('ds_button-group--wrap');
46
+ });
47
+
27
48
  test('passing additional props', () => {
28
49
  render(
29
50
  <ButtonGroup data-test="foo" data-testid="button-group">