@scottish-government/designsystem-react 0.13.0 → 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 (332) hide show
  1. package/.storybook/sgdsArgTypes.ts +23 -0
  2. package/CHANGELOG.md +23 -0
  3. package/LICENSE.txt +21 -0
  4. package/README.md +3 -0
  5. package/dist/common/AbstractNotificationBanner/AbstractNotificationBanner.d.ts +3 -2
  6. package/dist/common/AbstractNotificationBanner/AbstractNotificationBanner.jsx +8 -7
  7. package/dist/common/AbstractNotificationBanner/types.d.ts +13 -0
  8. package/dist/common/AbstractNotificationBanner/types.js +2 -0
  9. package/dist/common/ActionLink/ActionLink.d.ts +2 -1
  10. package/dist/common/ActionLink/types.d.ts +7 -0
  11. package/dist/common/ActionLink/types.js +2 -0
  12. package/dist/common/ConditionalWrapper/ConditionalWrapper.d.ts +2 -1
  13. package/dist/common/ConditionalWrapper/ConditionalWrapper.jsx +4 -2
  14. package/dist/common/ConditionalWrapper/types.d.ts +4 -0
  15. package/dist/common/ConditionalWrapper/types.js +2 -0
  16. package/dist/common/FileIcon/FileIcon.d.ts +2 -1
  17. package/dist/common/FileIcon/types.d.ts +6 -0
  18. package/dist/common/FileIcon/types.js +2 -0
  19. package/dist/common/HintText/HintText.d.ts +2 -1
  20. package/dist/common/HintText/HintText.jsx +3 -3
  21. package/dist/common/HintText/types.d.ts +4 -0
  22. package/dist/common/HintText/types.js +2 -0
  23. package/dist/common/Icon/Icon.d.ts +2 -1
  24. package/dist/common/Icon/Icon.jsx +3 -2
  25. package/dist/common/Icon/types.d.ts +8 -0
  26. package/dist/common/Icon/types.js +2 -0
  27. package/dist/common/ScreenReaderText/ScreenReaderText.d.ts +1 -1
  28. package/dist/common/WrapperTag/WrapperTag.d.ts +385 -1
  29. package/dist/common/WrapperTag/WrapperTag.jsx +5 -2
  30. package/dist/common/WrapperTag/types.d.ts +3 -0
  31. package/dist/common/WrapperTag/types.js +2 -0
  32. package/dist/components/Accordion/Accordion.d.ts +3 -2
  33. package/dist/components/Accordion/Accordion.jsx +12 -11
  34. package/dist/components/Accordion/types.d.ts +11 -0
  35. package/dist/components/Accordion/types.js +2 -0
  36. package/dist/components/AspectBox/AspectBox.d.ts +2 -1
  37. package/dist/components/AspectBox/AspectBox.jsx +3 -9
  38. package/dist/components/AspectBox/types.d.ts +3 -0
  39. package/dist/components/AspectBox/types.js +2 -0
  40. package/dist/components/BackToTop/BackToTop.d.ts +2 -1
  41. package/dist/components/BackToTop/BackToTop.jsx +4 -3
  42. package/dist/components/BackToTop/types.d.ts +3 -0
  43. package/dist/components/BackToTop/types.js +2 -0
  44. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +3 -2
  45. package/dist/components/Breadcrumbs/Breadcrumbs.jsx +6 -2
  46. package/dist/components/Breadcrumbs/types.d.ts +5 -0
  47. package/dist/components/Breadcrumbs/types.js +2 -0
  48. package/dist/components/Button/Button.d.ts +2 -1
  49. package/dist/components/Button/Button.jsx +4 -3
  50. package/dist/components/Button/ButtonGroup.d.ts +2 -1
  51. package/dist/components/Button/ButtonGroup.jsx +9 -4
  52. package/dist/components/Button/types.d.ts +20 -0
  53. package/dist/components/Button/types.js +2 -0
  54. package/dist/components/Card/Card.d.ts +34 -0
  55. package/dist/components/Card/Card.jsx +118 -0
  56. package/dist/components/Card/index.d.ts +1 -0
  57. package/dist/components/Card/index.js +8 -0
  58. package/dist/components/Card/types.d.ts +26 -0
  59. package/dist/components/Card/types.js +2 -0
  60. package/dist/components/CategoryItem/CategoryItem.d.ts +2 -1
  61. package/dist/components/CategoryItem/CategoryItem.jsx +8 -5
  62. package/dist/components/CategoryItem/types.d.ts +9 -0
  63. package/dist/components/CategoryItem/types.js +2 -0
  64. package/dist/components/CategoryList/CategoryList.d.ts +2 -1
  65. package/dist/components/CategoryList/CategoryList.jsx +3 -2
  66. package/dist/components/CategoryList/types.d.ts +5 -0
  67. package/dist/components/CategoryList/types.js +2 -0
  68. package/dist/components/Checkbox/Checkbox.d.ts +2 -1
  69. package/dist/components/Checkbox/Checkbox.jsx +4 -3
  70. package/dist/components/Checkbox/CheckboxGroup.d.ts +2 -1
  71. package/dist/components/Checkbox/CheckboxGroup.jsx +5 -4
  72. package/dist/components/Checkbox/types.d.ts +7 -0
  73. package/dist/components/Checkbox/types.js +2 -0
  74. package/dist/components/ConfirmationMessage/ConfirmationMessage.d.ts +2 -1
  75. package/dist/components/ConfirmationMessage/ConfirmationMessage.jsx +3 -2
  76. package/dist/components/ConfirmationMessage/types.d.ts +6 -0
  77. package/dist/components/ConfirmationMessage/types.js +2 -0
  78. package/dist/components/ContentsNav/ContentsNav.d.ts +3 -2
  79. package/dist/components/ContentsNav/ContentsNav.jsx +7 -5
  80. package/dist/components/ContentsNav/types.d.ts +9 -0
  81. package/dist/components/ContentsNav/types.js +2 -0
  82. package/dist/components/CookieBanner/CookieBanner.d.ts +3 -2
  83. package/dist/components/CookieBanner/CookieBanner.jsx +13 -3
  84. package/dist/components/DatePicker/DatePicker.d.ts +2 -1
  85. package/dist/components/DatePicker/DatePicker.jsx +7 -7
  86. package/dist/components/DatePicker/types.d.ts +18 -0
  87. package/dist/components/DatePicker/types.js +2 -0
  88. package/dist/components/Details/Details.d.ts +2 -1
  89. package/dist/components/Details/Details.jsx +6 -2
  90. package/dist/components/Details/types.d.ts +4 -0
  91. package/dist/components/Details/types.js +2 -0
  92. package/dist/components/ErrorMessage/ErrorMessage.d.ts +2 -1
  93. package/dist/components/ErrorMessage/ErrorMessage.jsx +6 -2
  94. package/dist/components/ErrorMessage/types.d.ts +3 -0
  95. package/dist/components/ErrorMessage/types.js +2 -0
  96. package/dist/components/ErrorSummary/ErrorSummary.d.ts +3 -2
  97. package/dist/components/ErrorSummary/ErrorSummary.jsx +6 -2
  98. package/dist/components/ErrorSummary/types.d.ts +8 -0
  99. package/dist/components/ErrorSummary/types.js +2 -0
  100. package/dist/components/FeatureHeader/FeatureHeader.d.ts +7 -5
  101. package/dist/components/FeatureHeader/FeatureHeader.jsx +87 -50
  102. package/dist/components/FeatureHeader/types.d.ts +12 -0
  103. package/dist/components/FeatureHeader/types.js +2 -0
  104. package/dist/components/FileDownload/FileDownload.d.ts +2 -1
  105. package/dist/components/FileDownload/FileDownload.jsx +4 -3
  106. package/dist/components/FileDownload/types.d.ts +10 -0
  107. package/dist/components/FileDownload/types.js +2 -0
  108. package/dist/components/HideThisPage/HideThisPage.d.ts +2 -1
  109. package/dist/components/HideThisPage/HideThisPage.jsx +5 -4
  110. package/dist/components/HideThisPage/types.d.ts +3 -0
  111. package/dist/components/HideThisPage/types.js +2 -0
  112. package/dist/components/InsetText/InsetText.d.ts +1 -1
  113. package/dist/components/InsetText/InsetText.jsx +6 -2
  114. package/dist/components/NotificationBanner/NotificationBanner.d.ts +3 -2
  115. package/dist/components/NotificationBanner/NotificationBanner.jsx +5 -4
  116. package/dist/components/NotificationPanel/NotificationPanel.d.ts +2 -1
  117. package/dist/components/NotificationPanel/NotificationPanel.jsx +3 -2
  118. package/dist/components/NotificationPanel/types.d.ts +6 -0
  119. package/dist/components/NotificationPanel/types.js +2 -0
  120. package/dist/components/NotificationTag/NotificationTag.d.ts +6 -0
  121. package/dist/components/NotificationTag/NotificationTag.jsx +20 -0
  122. package/dist/components/NotificationTag/index.d.ts +1 -0
  123. package/dist/components/NotificationTag/index.js +8 -0
  124. package/dist/components/NotificationTag/types.d.ts +5 -0
  125. package/dist/components/NotificationTag/types.js +2 -0
  126. package/dist/components/PageHeader/PageHeader.d.ts +2 -1
  127. package/dist/components/PageHeader/PageHeader.jsx +6 -2
  128. package/dist/components/PageHeader/types.d.ts +5 -0
  129. package/dist/components/PageHeader/types.js +2 -0
  130. package/dist/components/PageMetadata/PageMetadata.d.ts +3 -2
  131. package/dist/components/PageMetadata/PageMetadata.jsx +8 -4
  132. package/dist/components/PageMetadata/types.d.ts +6 -0
  133. package/dist/components/PageMetadata/types.js +2 -0
  134. package/dist/components/Pagination/Pagination.d.ts +3 -2
  135. package/dist/components/Pagination/Pagination.jsx +7 -5
  136. package/dist/components/Pagination/types.d.ts +18 -0
  137. package/dist/components/Pagination/types.js +2 -0
  138. package/dist/components/PhaseBanner/PhaseBanner.d.ts +2 -1
  139. package/dist/components/PhaseBanner/PhaseBanner.jsx +3 -2
  140. package/dist/components/PhaseBanner/types.d.ts +3 -0
  141. package/dist/components/PhaseBanner/types.js +2 -0
  142. package/dist/components/Question/Question.d.ts +2 -1
  143. package/dist/components/Question/Question.jsx +4 -3
  144. package/dist/components/Question/types.d.ts +9 -0
  145. package/dist/components/Question/types.js +2 -0
  146. package/dist/components/RadioButton/RadioButton.d.ts +2 -1
  147. package/dist/components/RadioButton/RadioButton.jsx +4 -3
  148. package/dist/components/RadioButton/RadioGroup.d.ts +2 -1
  149. package/dist/components/RadioButton/RadioGroup.jsx +3 -2
  150. package/dist/components/RadioButton/types.d.ts +10 -0
  151. package/dist/components/RadioButton/types.js +2 -0
  152. package/dist/components/SearchFacets/SearchFacets.d.ts +4 -3
  153. package/dist/components/SearchFacets/SearchFacets.jsx +3 -2
  154. package/dist/components/SearchFacets/types.d.ts +12 -0
  155. package/dist/components/SearchFacets/types.js +2 -0
  156. package/dist/components/SearchFilters/SearchFilters.d.ts +5 -4
  157. package/dist/components/SearchFilters/types.d.ts +12 -0
  158. package/dist/components/SearchFilters/types.js +2 -0
  159. package/dist/components/SearchResult/SearchResult.d.ts +8 -11
  160. package/dist/components/SearchResult/SearchResult.jsx +6 -7
  161. package/dist/components/SearchResult/types.d.ts +11 -0
  162. package/dist/components/SearchResult/types.js +2 -0
  163. package/dist/components/SearchSort/SearchSort.d.ts +2 -1
  164. package/dist/components/SearchSort/SearchSort.jsx +3 -2
  165. package/dist/components/SearchSort/types.d.ts +7 -0
  166. package/dist/components/SearchSort/types.js +2 -0
  167. package/dist/components/Select/Select.d.ts +2 -1
  168. package/dist/components/Select/Select.jsx +4 -3
  169. package/dist/components/Select/types.d.ts +6 -0
  170. package/dist/components/Select/types.js +2 -0
  171. package/dist/components/SequentialNavigation/SequentialNavigation.d.ts +4 -3
  172. package/dist/components/SequentialNavigation/SequentialNavigation.jsx +10 -6
  173. package/dist/components/SequentialNavigation/types.d.ts +10 -0
  174. package/dist/components/SequentialNavigation/types.js +2 -0
  175. package/dist/components/SideNavigation/SideNavigation.d.ts +4 -3
  176. package/dist/components/SideNavigation/SideNavigation.jsx +10 -7
  177. package/dist/components/SideNavigation/types.d.ts +13 -0
  178. package/dist/components/SideNavigation/types.js +2 -0
  179. package/dist/components/SiteFooter/SiteFooter.d.ts +6 -5
  180. package/dist/components/SiteFooter/SiteFooter.jsx +4 -3
  181. package/dist/components/SiteFooter/types.d.ts +16 -0
  182. package/dist/components/SiteFooter/types.js +2 -0
  183. package/dist/components/SiteHeader/SiteHeader.d.ts +6 -5
  184. package/dist/components/SiteHeader/SiteHeader.jsx +1 -1
  185. package/dist/components/SiteHeader/types.d.ts +20 -0
  186. package/dist/components/SiteHeader/types.js +2 -0
  187. package/dist/components/SiteNavigation/SiteNavigation.d.ts +3 -2
  188. package/dist/components/SiteNavigation/SiteNavigation.jsx +12 -4
  189. package/dist/components/SiteNavigation/types.d.ts +9 -0
  190. package/dist/components/SiteNavigation/types.js +2 -0
  191. package/dist/components/SiteSearch/SiteSearch.d.ts +2 -1
  192. package/dist/components/SiteSearch/SiteSearch.jsx +12 -11
  193. package/dist/components/SiteSearch/types.d.ts +17 -0
  194. package/dist/components/SiteSearch/types.js +2 -0
  195. package/dist/components/SkipLinks/SkipLinks.d.ts +3 -2
  196. package/dist/components/SkipLinks/SkipLinks.jsx +4 -4
  197. package/dist/components/SkipLinks/types.d.ts +8 -0
  198. package/dist/components/SkipLinks/types.js +2 -0
  199. package/dist/components/SummaryCard/SummaryCard.d.ts +4 -2
  200. package/dist/components/SummaryCard/SummaryCard.jsx +5 -4
  201. package/dist/components/SummaryCard/types.d.ts +5 -0
  202. package/dist/components/SummaryCard/types.js +2 -0
  203. package/dist/components/SummaryList/SummaryList.d.ts +6 -4
  204. package/dist/components/SummaryList/SummaryList.jsx +5 -4
  205. package/dist/components/SummaryList/types.d.ts +6 -0
  206. package/dist/components/SummaryList/types.js +2 -0
  207. package/dist/components/Table/Table.d.ts +2 -1
  208. package/dist/components/Table/Table.jsx +5 -4
  209. package/dist/components/Table/types.d.ts +6 -0
  210. package/dist/components/Table/types.js +2 -0
  211. package/dist/components/Tabs/Tabs.d.ts +3 -2
  212. package/dist/components/Tabs/Tabs.jsx +6 -5
  213. package/dist/components/Tabs/types.d.ts +16 -0
  214. package/dist/components/Tabs/types.js +2 -0
  215. package/dist/components/Tag/Tag.d.ts +2 -1
  216. package/dist/components/Tag/Tag.jsx +7 -3
  217. package/dist/components/Tag/types.d.ts +4 -0
  218. package/dist/components/Tag/types.js +2 -0
  219. package/dist/components/TaskList/TaskList.d.ts +4 -3
  220. package/dist/components/TaskList/TaskList.jsx +11 -8
  221. package/dist/components/TaskList/types.d.ts +17 -0
  222. package/dist/components/TaskList/types.js +2 -0
  223. package/dist/components/TextInput/TextInput.d.ts +2 -1
  224. package/dist/components/TextInput/TextInput.jsx +10 -9
  225. package/dist/components/TextInput/types.d.ts +11 -0
  226. package/dist/components/TextInput/types.js +2 -0
  227. package/dist/components/Textarea/Textarea.d.ts +2 -1
  228. package/dist/components/Textarea/Textarea.jsx +6 -5
  229. package/dist/components/WarningText/WarningText.d.ts +1 -1
  230. package/dist/components/WarningText/WarningText.jsx +6 -2
  231. package/dist/hooks/useTracking/useTracking.js +0 -1
  232. package/package.json +5 -3
  233. package/src/common/AbstractNotificationBanner/AbstractNotificationBanner.tsx +8 -6
  234. package/src/common/Icon/Icon.tsx +3 -2
  235. package/src/components/Accordion/Accordion.test.tsx +11 -0
  236. package/src/components/Accordion/Accordion.tsx +11 -10
  237. package/src/components/AspectBox/AspectBox.tsx +4 -11
  238. package/src/components/BackToTop/BackToTop.test.tsx +21 -1
  239. package/src/components/BackToTop/BackToTop.tsx +4 -3
  240. package/src/components/Breadcrumbs/Breadcrumbs.tsx +3 -2
  241. package/src/components/Button/Button.tsx +4 -3
  242. package/src/components/Button/ButtonGroup.stories.tsx +22 -0
  243. package/src/components/Button/ButtonGroup.test.tsx +21 -0
  244. package/src/components/Button/ButtonGroup.tsx +6 -3
  245. package/src/components/Button/types.ts +1 -0
  246. package/src/components/Card/Card.stories.tsx +446 -0
  247. package/src/components/Card/Card.test.tsx +282 -0
  248. package/src/components/Card/Card.tsx +208 -0
  249. package/src/components/Card/index.ts +1 -0
  250. package/src/components/Card/types.ts +30 -0
  251. package/src/components/CategoryItem/CategoryItem.tsx +3 -2
  252. package/src/components/CategoryList/CategoryList.tsx +3 -2
  253. package/src/components/Checkbox/Checkbox.test.tsx +30 -0
  254. package/src/components/Checkbox/Checkbox.tsx +3 -3
  255. package/src/components/Checkbox/CheckboxGroup.test.tsx +10 -0
  256. package/src/components/Checkbox/CheckboxGroup.tsx +5 -4
  257. package/src/components/ConfirmationMessage/ConfirmationMessage.tsx +3 -2
  258. package/src/components/ContentsNav/ContentsNav.tsx +8 -5
  259. package/src/components/CookieBanner/CookieBanner.test.tsx +18 -1
  260. package/src/components/CookieBanner/CookieBanner.tsx +4 -3
  261. package/src/components/DatePicker/DatePicker.test.tsx +52 -14
  262. package/src/components/DatePicker/DatePicker.tsx +6 -7
  263. package/src/components/DatePicker/types.ts +2 -3
  264. package/src/components/Details/Details.tsx +3 -2
  265. package/src/components/ErrorMessage/ErrorMessage.tsx +3 -2
  266. package/src/components/ErrorSummary/ErrorSummary.tsx +3 -2
  267. package/src/components/FeatureHeader/FeatureHeader.stories.tsx +223 -0
  268. package/src/components/FeatureHeader/FeatureHeader.test.tsx +298 -0
  269. package/src/components/FeatureHeader/FeatureHeader.tsx +119 -0
  270. package/src/components/FeatureHeader/index.ts +1 -0
  271. package/src/components/FeatureHeader/types.ts +13 -0
  272. package/src/components/FileDownload/FileDownload.test.tsx +1 -5
  273. package/src/components/FileDownload/FileDownload.tsx +4 -3
  274. package/src/components/HideThisPage/HideThisPage.test.tsx +12 -1
  275. package/src/components/HideThisPage/HideThisPage.tsx +5 -4
  276. package/src/components/InsetText/InsetText.tsx +4 -2
  277. package/src/components/NotificationBanner/NotificationBanner.test.tsx +10 -0
  278. package/src/components/NotificationBanner/NotificationBanner.tsx +4 -3
  279. package/src/components/NotificationPanel/NotificationPanel.tsx +3 -2
  280. package/src/components/NotificationTag/NotificationTag.stories.tsx +68 -0
  281. package/src/components/NotificationTag/NotificationTag.test.tsx +70 -0
  282. package/src/components/NotificationTag/NotificationTag.tsx +32 -0
  283. package/src/components/NotificationTag/index.ts +1 -0
  284. package/src/components/NotificationTag/types.ts +5 -0
  285. package/src/components/PageHeader/PageHeader.tsx +3 -2
  286. package/src/components/PageMetadata/PageMetadata.tsx +5 -4
  287. package/src/components/Pagination/Pagination.test.tsx +20 -0
  288. package/src/components/Pagination/Pagination.tsx +7 -5
  289. package/src/components/PhaseBanner/PhaseBanner.tsx +3 -2
  290. package/src/components/Question/Question.tsx +3 -2
  291. package/src/components/Question/types.ts +2 -2
  292. package/src/components/RadioButton/RadioButton.test.tsx +30 -0
  293. package/src/components/RadioButton/RadioButton.tsx +3 -3
  294. package/src/components/RadioButton/RadioGroup.tsx +3 -2
  295. package/src/components/SearchFacets/SearchFacets.stories.tsx +1 -1
  296. package/src/components/SearchFacets/SearchFacets.tsx +3 -2
  297. package/src/components/SearchResult/SearchResult.stories.tsx +14 -13
  298. package/src/components/SearchResult/SearchResult.test.tsx +5 -4
  299. package/src/components/SearchResult/SearchResult.tsx +6 -7
  300. package/src/components/SearchSort/SearchSort.tsx +3 -2
  301. package/src/components/Select/Select.test.tsx +42 -0
  302. package/src/components/Select/Select.tsx +3 -2
  303. package/src/components/SequentialNavigation/SequentialNavigation.tsx +7 -6
  304. package/src/components/SideNavigation/SideNavigation.test.tsx +24 -0
  305. package/src/components/SideNavigation/SideNavigation.tsx +10 -7
  306. package/src/components/SiteFooter/SiteFooter.tsx +3 -2
  307. package/src/components/SiteHeader/SiteHeader.test.tsx +29 -16
  308. package/src/components/SiteHeader/SiteHeader.tsx +1 -1
  309. package/src/components/SiteNavigation/SiteNavigation.test.tsx +16 -1
  310. package/src/components/SiteNavigation/SiteNavigation.tsx +9 -4
  311. package/src/components/SiteSearch/SiteSearch.test.tsx +22 -0
  312. package/src/components/SiteSearch/SiteSearch.tsx +10 -9
  313. package/src/components/SiteSearch/types.ts +7 -1
  314. package/src/components/SkipLinks/SkipLinks.tsx +4 -4
  315. package/src/components/SummaryCard/SummaryCard.tsx +3 -2
  316. package/src/components/SummaryList/SummaryList.tsx +3 -3
  317. package/src/components/Table/Table.test.tsx +36 -0
  318. package/src/components/Table/Table.tsx +5 -4
  319. package/src/components/Tabs/Tabs.test.tsx +14 -0
  320. package/src/components/Tabs/Tabs.tsx +6 -5
  321. package/src/components/Tag/Tag.tsx +4 -3
  322. package/src/components/TaskList/TaskList.tsx +5 -4
  323. package/src/components/TextInput/TextInput.test.tsx +53 -1
  324. package/src/components/TextInput/TextInput.tsx +12 -7
  325. package/src/components/Textarea/Textarea.test.tsx +53 -1
  326. package/src/components/Textarea/Textarea.tsx +5 -4
  327. package/src/components/WarningText/WarningText.tsx +4 -2
  328. package/src/hooks/useTracking/useTracking.ts +0 -1
  329. package/src/shared-types.ts +3 -3
  330. package/static/images/illustration.svg +502 -0
  331. package/tsconfig.json +0 -3
  332. package/vite.config.ts +4 -0
@@ -1,8 +1,8 @@
1
1
  import React, { Children, useEffect, useRef, useId } from 'react';
2
2
  import WrapperTag from '../../common/WrapperTag';
3
- // @ts-expect-error no types from core SGDS
4
3
  import DSTabs from '@scottish-government/design-system/src/components/tabs/tabs';
5
4
  import { TabListItemProps, TabsItemProps, TabsProps } from './types';
5
+ import clsx from 'clsx';
6
6
 
7
7
  const TabItem = ({
8
8
  isBorderless,
@@ -14,11 +14,11 @@ const TabItem = ({
14
14
  }: TabsItemProps) => {
15
15
  return (
16
16
  <div
17
- className={[
17
+ className={clsx([
18
18
  'ds_tabs__content',
19
19
  !isBorderless && 'ds_tabs__content--bordered',
20
20
  className
21
- ].join(' ')}
21
+ ])}
22
22
  data-label={tabLabel}
23
23
  id={id}
24
24
  {...props}
@@ -54,6 +54,7 @@ const Tabs = ({
54
54
  const headingId = `${baseId}-heading`;
55
55
 
56
56
  useEffect(() => {
57
+ /* istanbul ignore else */
57
58
  if (ref.current) {
58
59
  new DSTabs(ref.current).init();
59
60
  }
@@ -78,11 +79,11 @@ const Tabs = ({
78
79
 
79
80
  return (
80
81
  <div
81
- className={[
82
+ className={clsx([
82
83
  'ds_tabs',
83
84
  isManual && 'ds_tabs--manual',
84
85
  className
85
- ].join(' ')}
86
+ ])}
86
87
  ref={ref}
87
88
  {...props}
88
89
  >
@@ -1,4 +1,5 @@
1
1
  import { TagProps } from "./types";
2
+ import clsx from 'clsx';
2
3
 
3
4
  const Tag = ({
4
5
  children,
@@ -8,11 +9,11 @@ const Tag = ({
8
9
  }: TagProps) => {
9
10
  return (
10
11
  <span
11
- className={[
12
+ className={clsx([
12
13
  'ds_tag',
13
14
  className,
14
- colour && `ds_tag--${colour}`,
15
- ].join(' ')}
15
+ colour && `ds_tag--${colour}`
16
+ ])}
16
17
  {...props}
17
18
  >
18
19
  {children}
@@ -4,6 +4,7 @@ import HintText from '../../common/HintText';
4
4
  import ScreenReaderText from '../../common/ScreenReaderText';
5
5
  import Tag from '../Tag';
6
6
  import { TaskListGroupProps, TaskListItemProps, TaskListProps } from './types';
7
+ import clsx from 'clsx';
7
8
 
8
9
  const TaskItem = ({
9
10
  children,
@@ -36,10 +37,10 @@ const TaskItem = ({
36
37
 
37
38
  return (
38
39
  <li
39
- className={[
40
+ className={clsx([
40
41
  'ds_task-list__task',
41
42
  className
42
- ].join(' ')}
43
+ ])}
43
44
  id={id}
44
45
  {...props}
45
46
  >
@@ -83,10 +84,10 @@ const TaskGroup = ({
83
84
  }: TaskListGroupProps) => {
84
85
  return (
85
86
  <li
86
- className={[
87
+ className={clsx([
87
88
  'ds_task-list-group__section',
88
89
  className
89
- ].join(' ')}
90
+ ])}
90
91
  {...props}
91
92
  >
92
93
  <h2 className="ds_task-list-heading">{title}</h2>
@@ -58,7 +58,6 @@ test('text input with character count', () => {
58
58
  const textInput = screen.getByRole('textbox');
59
59
  const textInputWrapper = textInput.parentElement;
60
60
 
61
- expect(textInputWrapper).toHaveAttribute('data-maxlength', MAX_LENGTH.toString());
62
61
  expect(textInputWrapper).toHaveAttribute('data-module', 'ds-character-count');
63
62
  });
64
63
 
@@ -232,6 +231,44 @@ test('text input with change function', () => {
232
231
  expect(ONCHANGE_FUNCTION).toHaveBeenCalled();
233
232
  });
234
233
 
234
+ test('text input with onBlur that is not a function', () => {
235
+ render(
236
+ <TextInput
237
+ id={INPUT_ID}
238
+ label={LABEL_TEXT}
239
+ // @ts-expect-error onBlur is not a function
240
+ onBlur='foo'
241
+ />
242
+ );
243
+
244
+ const textInput = screen.getByRole('textbox');
245
+
246
+ fireEvent.blur(textInput);
247
+
248
+ // todo: assertion
249
+ // success indicated by no errors thrown
250
+ // error would be thrown on an untestable thread
251
+ });
252
+
253
+ test('text input with onChange that is not a function', () => {
254
+ render(
255
+ <TextInput
256
+ id={INPUT_ID}
257
+ label={LABEL_TEXT}
258
+ // @ts-expect-error onChange is not a function
259
+ onChange='foo'
260
+ />
261
+ );
262
+
263
+ const textInput = screen.getByRole('textbox');
264
+
265
+ fireEvent.change(textInput, {target: {value: 'foo'}});
266
+
267
+ // todo: assertion
268
+ // success indicated by no errors thrown
269
+ // error would be thrown on an untestable thread
270
+ });
271
+
235
272
  test('text input with placeholder text', () => {
236
273
  const PLACEHOLDER_TEXT = 'foo';
237
274
 
@@ -299,6 +336,21 @@ test('text input with error message', () => {
299
336
  expect(errorMessageElement).toHaveClass('ds_question__error-message');
300
337
  });
301
338
 
339
+ test('instantiating/initialising DS component script', () => {
340
+ render(
341
+ <TextInput
342
+ id={INPUT_ID}
343
+ label={LABEL_TEXT}
344
+ maxlength={200}
345
+ />
346
+ );
347
+
348
+ const textInput = screen.getByRole('textbox');
349
+ const textInputContainer = textInput.parentElement;
350
+ expect(textInputContainer).toHaveClass('js-initialised');
351
+ expect(textInputContainer).toHaveClass('js-instantiated');
352
+ });
353
+
302
354
  test('passing additional props', () => {
303
355
  render(
304
356
  <TextInput
@@ -1,11 +1,11 @@
1
1
  import { useEffect, useRef } from 'react';
2
- // @ts-expect-error no types from core SGDS
3
- import DSCharacterCount from '@scottish-government/design-system/src/forms/character-count/character-count';
2
+ import DSCharacterCount from '@scottish-government/design-system/src/components/character-count/character-count';
4
3
  import Button from '../Button';
5
4
  import ConditionalWrapper from '../../common/ConditionalWrapper';
6
5
  import ErrorMessage from '../ErrorMessage';
7
6
  import HintText from '../../common/HintText';
8
7
  import { TextInputProps } from './types';
8
+ import clsx from 'clsx';
9
9
 
10
10
  const TextInput = ({
11
11
  buttonIcon,
@@ -33,13 +33,18 @@ const TextInput = ({
33
33
  const errorMessageId = `error-message-${id}`;
34
34
  const hintTextId = `hint-text-${id}`;
35
35
  const ref = useRef(null);
36
- const inputWrapperClasses = `${hasButton ? 'ds_input__wrapper ds_input__wrapper--has-icon' : ''} ${isCurrency ? 'ds_currency-wrapper' : ''}`;
36
+ const inputWrapperClasses = clsx(
37
+ hasButton && 'ds_input__wrapper',
38
+ hasButton && 'ds_input__wrapper--has-icon',
39
+ isCurrency && 'ds_currency-wrapper'
40
+ );
37
41
  const describedbys: string[] = [];
38
42
 
39
43
  if (hintText) { describedbys.push(hintTextId) };
40
44
  if (errorMessage) { describedbys.push(errorMessageId) };
41
45
 
42
46
  useEffect(() => {
47
+ /* istanbul ignore else */
43
48
  if (ref.current) {
44
49
  new DSCharacterCount(ref.current).init();
45
50
  }
@@ -72,12 +77,12 @@ const TextInput = ({
72
77
  <input
73
78
  aria-describedby={describedbys.join(' ')}
74
79
  aria-invalid={hasError}
75
- className={[
80
+ className={clsx([
76
81
  'ds_input',
77
82
  className,
78
- hasError ? 'ds_input--error' : '',
79
- width ? `ds_input--${width}` : '',
80
- ].join(' ')}
83
+ hasError && 'ds_input--error',
84
+ width && `ds_input--${width}`,
85
+ ])}
81
86
  defaultValue={value}
82
87
  id={id}
83
88
  maxLength={maxlength}
@@ -43,7 +43,6 @@ test('textarea with character count', () => {
43
43
  const textarea = screen.getByRole('textbox');
44
44
  const textareaWrapper = textarea.parentElement;
45
45
 
46
- expect(textareaWrapper).toHaveAttribute('data-maxlength', MAX_LENGTH.toString());
47
46
  expect(textareaWrapper).toHaveAttribute('data-module', 'ds-character-count');
48
47
  });
49
48
 
@@ -135,6 +134,44 @@ test('textarea with change function', () => {
135
134
  expect(ONCHANGE_FUNCTION).toHaveBeenCalled();
136
135
  });
137
136
 
137
+ test('textarea with onBlur that is not a function', () => {
138
+ render(
139
+ <Textarea
140
+ id={TEXTAREA_ID}
141
+ label={LABEL_TEXT}
142
+ // @ts-expect-error onBlur is not a function
143
+ onBlur='foo'
144
+ />
145
+ );
146
+
147
+ const textarea = screen.getByRole('textbox');
148
+
149
+ fireEvent.blur(textarea);
150
+
151
+ // todo: assertion
152
+ // success indicated by no errors thrown
153
+ // error would be thrown on an untestable thread
154
+ });
155
+
156
+ test('textarea with onChange that is not a function', () => {
157
+ render(
158
+ <Textarea
159
+ id={TEXTAREA_ID}
160
+ label={LABEL_TEXT}
161
+ // @ts-expect-error onChange is not a function
162
+ onChange='foo'
163
+ />
164
+ );
165
+
166
+ const textarea = screen.getByRole('textbox');
167
+
168
+ fireEvent.change(textarea, {target: {value: 'foo'}});
169
+
170
+ // todo: assertion
171
+ // success indicated by no errors thrown
172
+ // error would be thrown on an untestable thread
173
+ });
174
+
138
175
  test('textarea with placeholder text', () => {
139
176
  const PLACEHOLDER_TEXT = 'foo';
140
177
 
@@ -203,6 +240,21 @@ test('textarea with error message', () => {
203
240
  expect(errorMessageElement).toHaveClass('ds_question__error-message');
204
241
  });
205
242
 
243
+ test('instantiating/initialising DS component script', () => {
244
+ render(
245
+ <Textarea
246
+ id={TEXTAREA_ID}
247
+ label={LABEL_TEXT}
248
+ maxlength={200}
249
+ />
250
+ );
251
+
252
+ const textarea = screen.getByRole('textbox');
253
+ const textareaContainer = textarea.parentElement;
254
+ expect(textareaContainer).toHaveClass('js-initialised');
255
+ expect(textareaContainer).toHaveClass('js-instantiated');
256
+ });
257
+
206
258
  test('passing additional props', () => {
207
259
  render(
208
260
  <Textarea
@@ -1,10 +1,10 @@
1
1
  import { useEffect, useRef } from 'react';
2
- // @ts-expect-error no types from core SGDS
3
- import DSCharacterCount from '@scottish-government/design-system/src/forms/character-count/character-count';
2
+ import DSCharacterCount from '@scottish-government/design-system/src/components/character-count/character-count';
4
3
  import ConditionalWrapper from '../../common/ConditionalWrapper';
5
4
  import ErrorMessage from '../ErrorMessage';
6
5
  import HintText from '../../common/HintText';
7
6
  import { TextInputBase } from '../../shared-types';
7
+ import clsx from 'clsx';
8
8
 
9
9
  const Textarea = ({
10
10
  className,
@@ -32,6 +32,7 @@ const Textarea = ({
32
32
  if (errorMessage) { describedbys.push(errorMessageId) };
33
33
 
34
34
  useEffect(() => {
35
+ /* istanbul ignore else */
35
36
  if (ref.current) {
36
37
  new DSCharacterCount(ref.current).init();
37
38
  }
@@ -61,11 +62,11 @@ const Textarea = ({
61
62
  <textarea
62
63
  aria-describedby={describedbys.join(' ')}
63
64
  aria-invalid={hasError}
64
- className={[
65
+ className={clsx([
65
66
  'ds_input',
66
67
  hasError && 'ds_input--error',
67
68
  className
68
- ].join(' ')}
69
+ ])}
69
70
  defaultValue={value}
70
71
  id={id}
71
72
  maxLength={maxlength}
@@ -1,3 +1,5 @@
1
+ import clsx from 'clsx';
2
+
1
3
  const WarningText = ({
2
4
  children,
3
5
  className,
@@ -5,10 +7,10 @@ const WarningText = ({
5
7
  }: React.AllHTMLAttributes<HTMLElement>) => {
6
8
  return (
7
9
  <div
8
- className={[
10
+ className={clsx([
9
11
  'ds_warning-text',
10
12
  className
11
- ].join(' ')}
13
+ ])}
12
14
  {...props}
13
15
  >
14
16
  <strong className="ds_warning-text__icon" aria-hidden="true"></strong>
@@ -1,6 +1,5 @@
1
1
  import { useEffect } from 'react';
2
2
 
3
- // @ts-expect-error no types from core SGDS
4
3
  import DSTracking from '@scottish-government/design-system/src/base/tools/tracking/tracking';
5
4
 
6
5
  export default function () {
@@ -18,7 +18,7 @@ export type LinkComponentProps = {
18
18
  export type LinkComponent = (linkComponent: LinkComponentProps) => React.ReactNode;
19
19
 
20
20
  export interface CheckboxRadioBase<T> extends React.InputHTMLAttributes<T> {
21
- hintText?: string;
21
+ hintText?: string | React.ReactNode;
22
22
  label: string;
23
23
  onBlur?: React.FocusEventHandler<T>;
24
24
  onChange?: React.ChangeEventHandler<T>;
@@ -26,9 +26,9 @@ export interface CheckboxRadioBase<T> extends React.InputHTMLAttributes<T> {
26
26
  }
27
27
 
28
28
  export interface FormFieldBase<T> extends React.AllHTMLAttributes <T> {
29
- errorMessage?: string;
29
+ errorMessage?: string | React.ReactNode;
30
30
  hasError?: boolean;
31
- hintText?: string;
31
+ hintText?: string | React.ReactNode;
32
32
  label: string;
33
33
  onBlur?: React.FocusEventHandler<T>;
34
34
  onChange?: React.ChangeEventHandler<T>;