@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
@@ -0,0 +1,6 @@
1
+ export interface SummaryListItemProps extends React.LiHTMLAttributes<HTMLLIElement> {
2
+ title: string;
3
+ }
4
+ export interface SummaryListProps extends React.OlHTMLAttributes<HTMLOListElement> {
5
+ isBorderless?: boolean;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,6 @@
1
+ import { TableProps } from './types';
1
2
  declare const Table: {
2
- ({ children, className, smallscreen, ...props }: SGDS.Component.Table): import("react").JSX.Element;
3
+ ({ children, className, smallscreen, ...props }: TableProps): import("react").JSX.Element;
3
4
  displayName: string;
4
5
  };
5
6
  export default Table;
@@ -4,19 +4,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = require("react");
7
- // @ts-ignore
8
7
  const table_1 = __importDefault(require("@scottish-government/design-system/src/components/table/table"));
8
+ const clsx_1 = __importDefault(require("clsx"));
9
9
  const Table = ({ children, className, smallscreen, ...props }) => {
10
10
  const ref = (0, react_1.useRef)(null);
11
11
  (0, react_1.useEffect)(() => {
12
+ /* istanbul ignore else */
12
13
  if (ref.current) {
13
- new table_1.default().init();
14
+ new table_1.default(ref.current).init();
14
15
  }
15
16
  }, [ref]);
16
- return (<table className={[
17
+ return (<table className={(0, clsx_1.default)([
17
18
  'ds_table',
18
19
  className
19
- ].join(' ')} data-smallscreen={smallscreen} ref={ref} {...props}>
20
+ ])} data-smallscreen={smallscreen} ref={ref} {...props}>
20
21
  {children}
21
22
  </table>);
22
23
  };
@@ -0,0 +1,6 @@
1
+ type SmallScreen = 'scrolling' | 'boxes';
2
+ export interface TableProps extends React.AllHTMLAttributes<HTMLTableElement> {
3
+ className?: string;
4
+ smallscreen?: SmallScreen;
5
+ }
6
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
+ import { TabsItemProps, TabsProps } from './types';
2
3
  declare const Tabs: {
3
- ({ baseId, children, className, headingLevel, isBorderless, isManual, title, ...props }: SGDS.Component.Tabs): React.JSX.Element;
4
+ ({ baseId, children, className, headingLevel, isBorderless, isManual, title, ...props }: TabsProps): React.JSX.Element;
4
5
  displayName: string;
5
6
  Item: {
6
- ({ isBorderless, children, className, id, tabLabel, ...props }: SGDS.Component.Tabs.Item): React.JSX.Element;
7
+ ({ isBorderless, children, className, id, tabLabel, ...props }: TabsItemProps): React.JSX.Element;
7
8
  displayName: string;
8
9
  };
9
10
  };
@@ -38,14 +38,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const react_1 = __importStar(require("react"));
40
40
  const WrapperTag_1 = __importDefault(require("../../common/WrapperTag"));
41
- // @ts-ignore
42
41
  const tabs_1 = __importDefault(require("@scottish-government/design-system/src/components/tabs/tabs"));
42
+ const clsx_1 = __importDefault(require("clsx"));
43
43
  const TabItem = ({ isBorderless, children, className, id, tabLabel, ...props }) => {
44
- return (<div className={[
44
+ return (<div className={(0, clsx_1.default)([
45
45
  'ds_tabs__content',
46
46
  !isBorderless && 'ds_tabs__content--bordered',
47
47
  className
48
- ].join(' ')} id={id} {...props}>
48
+ ])} data-label={tabLabel} id={id} {...props}>
49
49
  {children}
50
50
  </div>);
51
51
  };
@@ -58,6 +58,7 @@ const Tabs = ({ baseId = 'tabs', children, className, headingLevel = 'h2', isBor
58
58
  const ref = (0, react_1.useRef)(null);
59
59
  const headingId = `${baseId}-heading`;
60
60
  (0, react_1.useEffect)(() => {
61
+ /* istanbul ignore else */
61
62
  if (ref.current) {
62
63
  new tabs_1.default(ref.current).init();
63
64
  }
@@ -76,11 +77,11 @@ const Tabs = ({ baseId = 'tabs', children, className, headingLevel = 'h2', isBor
76
77
  return <TabListItem href={`#${child.props.id}`}>{child.props.tabLabel}</TabListItem>;
77
78
  }
78
79
  });
79
- return (<div className={[
80
+ return (<div className={(0, clsx_1.default)([
80
81
  'ds_tabs',
81
82
  isManual && 'ds_tabs--manual',
82
83
  className
83
- ].join(' ')} ref={ref} {...props}>
84
+ ])} ref={ref} {...props}>
84
85
  <WrapperTag_1.default id={headingId} className="ds_tabs__title" tagName={headingLevel}>
85
86
  {title}
86
87
  </WrapperTag_1.default>
@@ -0,0 +1,16 @@
1
+ import { HeadingLevel } from '../../shared-types';
2
+ export interface TabsItemProps extends React.AllHTMLAttributes<HTMLElement> {
3
+ isBorderless?: boolean;
4
+ id: string;
5
+ tabLabel: string;
6
+ }
7
+ export interface TabListItemProps extends React.AllHTMLAttributes<HTMLLIElement> {
8
+ href: string;
9
+ }
10
+ export interface TabsProps extends React.AllHTMLAttributes<HTMLElement> {
11
+ baseId: string;
12
+ isBorderless?: boolean;
13
+ headingLevel?: HeadingLevel;
14
+ isManual?: boolean;
15
+ title: string;
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,6 @@
1
+ import { TagProps } from "./types";
1
2
  declare const Tag: {
2
- ({ children, className, colour, ...props }: SGDS.Component.Tag): import("react").JSX.Element;
3
+ ({ children, className, colour, ...props }: TagProps): import("react").JSX.Element;
3
4
  displayName: string;
4
5
  };
5
6
  export default Tag;
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const clsx_1 = __importDefault(require("clsx"));
3
7
  const Tag = ({ children, className, colour, ...props }) => {
4
- return (<span className={[
8
+ return (<span className={(0, clsx_1.default)([
5
9
  'ds_tag',
6
10
  className,
7
- colour && `ds_tag--${colour}`,
8
- ].join(' ')} {...props}>
11
+ colour && `ds_tag--${colour}`
12
+ ])} {...props}>
9
13
  {children}
10
14
  </span>);
11
15
  };
@@ -0,0 +1,4 @@
1
+ import { TagColour } from '../../shared-types';
2
+ export interface TagProps extends React.AllHTMLAttributes<HTMLElement> {
3
+ colour?: TagColour;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,12 +1,13 @@
1
+ import { TaskListGroupProps, TaskListItemProps, TaskListProps } from './types';
1
2
  declare const TaskList: {
2
- ({ children, className, headingId, title, ...props }: SGDS.Component.TaskList): import("react").JSX.Element;
3
+ ({ children, className, headingId, title, ...props }: TaskListProps): import("react").JSX.Element;
3
4
  displayName: string;
4
5
  Item: {
5
- ({ children, className, href, id, isComplete, linkComponent, statusText, tagColour, title, ...props }: SGDS.Component.TaskList.Item): import("react").JSX.Element;
6
+ ({ children, className, href, id, isComplete, linkComponent, statusText, tagColour, title, ...props }: TaskListItemProps): import("react").JSX.Element;
6
7
  displayName: string;
7
8
  };
8
9
  Group: {
9
- ({ children, className, intro, title, ...props }: SGDS.Component.TaskList.Group): import("react").JSX.Element;
10
+ ({ children, className, intro, title, ...props }: TaskListGroupProps): import("react").JSX.Element;
10
11
  displayName: string;
11
12
  };
12
13
  };
@@ -8,6 +8,7 @@ const ConditionalWrapper_1 = __importDefault(require("../../common/ConditionalWr
8
8
  const HintText_1 = __importDefault(require("../../common/HintText"));
9
9
  const ScreenReaderText_1 = __importDefault(require("../../common/ScreenReaderText"));
10
10
  const Tag_1 = __importDefault(require("../Tag"));
11
+ const clsx_1 = __importDefault(require("clsx"));
11
12
  const TaskItem = ({ children, className, href, id, isComplete = false, linkComponent, statusText, tagColour = 'grey', title, ...props }) => {
12
13
  if (isComplete) {
13
14
  tagColour = 'green';
@@ -15,17 +16,19 @@ const TaskItem = ({ children, className, href, id, isComplete = false, linkCompo
15
16
  }
16
17
  const LINK_CLASS = 'ds_task-list__task-link';
17
18
  function getLinkElement(children) {
19
+ let linkElement;
18
20
  if (linkComponent) {
19
- return linkComponent({ className: LINK_CLASS, href, children });
21
+ linkElement = linkComponent({ className: LINK_CLASS, href, children });
20
22
  }
21
- else if (href) {
22
- return <a href={href} className={LINK_CLASS}>{children}</a>;
23
+ else {
24
+ linkElement = <a href={href} className={LINK_CLASS}>{children}</a>;
23
25
  }
26
+ return linkElement;
24
27
  }
25
- return (<li className={[
28
+ return (<li className={(0, clsx_1.default)([
26
29
  'ds_task-list__task',
27
30
  className
28
- ].join(' ')} id={id} {...props}>
31
+ ])} id={id} {...props}>
29
32
  <div className="ds_task-list__task-details">
30
33
  <h3 className="ds_task-list__task-heading">
31
34
  <ConditionalWrapper_1.default condition={typeof href !== 'undefined'} wrapper={(children) => getLinkElement(children)}>
@@ -49,10 +52,10 @@ const TaskItem = ({ children, className, href, id, isComplete = false, linkCompo
49
52
  * @returns {JSX.Element} - The element
50
53
  */
51
54
  const TaskGroup = ({ children, className, intro, title, ...props }) => {
52
- return (<li className={[
55
+ return (<li className={(0, clsx_1.default)([
53
56
  'ds_task-list-group__section',
54
57
  className
55
- ].join(' ')} {...props}>
58
+ ])} {...props}>
56
59
  <h2 className="ds_task-list-heading">{title}</h2>
57
60
  {intro && <p className="ds_task-list-intro">{intro}</p>}
58
61
  <ul className="ds_task-list">
@@ -62,7 +65,7 @@ const TaskGroup = ({ children, className, intro, title, ...props }) => {
62
65
  };
63
66
  const TaskList = ({ children, className, headingId = 'task-list', title, ...props }) => {
64
67
  let taskCount = 0;
65
- let incompleteTaskIds = [];
68
+ const incompleteTaskIds = [];
66
69
  let completedTasksCount = 0;
67
70
  function processChild(item) {
68
71
  if (item.type.displayName === 'TaskList.Item') {
@@ -0,0 +1,17 @@
1
+ import { LinkComponent, TagColour } from '../../shared-types';
2
+ export interface TaskListGroupProps extends React.AllHTMLAttributes<HTMLElement> {
3
+ intro?: string;
4
+ title: string;
5
+ }
6
+ export interface TaskListItemProps extends React.AllHTMLAttributes<HTMLElement> {
7
+ href?: string;
8
+ id?: string;
9
+ isComplete?: boolean;
10
+ linkComponent?: LinkComponent;
11
+ statusText?: string;
12
+ tagColour?: TagColour;
13
+ title: string;
14
+ }
15
+ export interface TaskListProps extends React.AllHTMLAttributes<HTMLElement> {
16
+ headingId?: string;
17
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,6 @@
1
+ import { TextInputProps } from './types';
1
2
  declare const TextInput: {
2
- ({ buttonIcon, buttonText, children, className, countThreshold, width, isCurrency, currencySymbol, errorMessage, hasButton, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, type, value, ...props }: SGDS.Component.TextInput): import("react").JSX.Element;
3
+ ({ buttonIcon, buttonText, className, countThreshold, width, isCurrency, currencySymbol, errorMessage, hasButton, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, type, value, ...props }: TextInputProps): import("react").JSX.Element;
3
4
  displayName: string;
4
5
  };
5
6
  export default TextInput;
@@ -4,17 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = require("react");
7
- // @ts-ignore
8
- const character_count_1 = __importDefault(require("@scottish-government/design-system/src/forms/character-count/character-count"));
7
+ const character_count_1 = __importDefault(require("@scottish-government/design-system/src/components/character-count/character-count"));
9
8
  const Button_1 = __importDefault(require("../Button"));
10
9
  const ConditionalWrapper_1 = __importDefault(require("../../common/ConditionalWrapper"));
11
10
  const ErrorMessage_1 = __importDefault(require("../ErrorMessage"));
12
11
  const HintText_1 = __importDefault(require("../../common/HintText"));
13
- const TextInput = ({ buttonIcon, buttonText, children, className, countThreshold, width, isCurrency, currencySymbol, errorMessage, hasButton = false, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, type = 'text', value, ...props }) => {
12
+ const clsx_1 = __importDefault(require("clsx"));
13
+ const TextInput = ({ buttonIcon, buttonText, className, countThreshold, width, isCurrency, currencySymbol, errorMessage, hasButton = false, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, type = 'text', value, ...props }) => {
14
14
  const errorMessageId = `error-message-${id}`;
15
15
  const hintTextId = `hint-text-${id}`;
16
16
  const ref = (0, react_1.useRef)(null);
17
- const inputWrapperClasses = `${hasButton ? 'ds_input__wrapper ds_input__wrapper--has-icon' : ''} ${isCurrency ? 'ds_currency-wrapper' : ''}`;
17
+ const inputWrapperClasses = (0, clsx_1.default)(hasButton && 'ds_input__wrapper', hasButton && 'ds_input__wrapper--has-icon', isCurrency && 'ds_currency-wrapper');
18
18
  const describedbys = [];
19
19
  if (hintText) {
20
20
  describedbys.push(hintTextId);
@@ -25,6 +25,7 @@ const TextInput = ({ buttonIcon, buttonText, children, className, countThreshold
25
25
  }
26
26
  ;
27
27
  (0, react_1.useEffect)(() => {
28
+ /* istanbul ignore else */
28
29
  if (ref.current) {
29
30
  new character_count_1.default(ref.current).init();
30
31
  }
@@ -41,15 +42,15 @@ const TextInput = ({ buttonIcon, buttonText, children, className, countThreshold
41
42
  }
42
43
  return (<ConditionalWrapper_1.default condition={typeof maxlength !== 'undefined' && maxlength > 0} wrapper={(children) => <div ref={ref} data-threshold={countThreshold} data-module="ds-character-count">{children}</div>}>
43
44
  <label className="ds_label" htmlFor={id}>{label}</label>
44
- {hintText && <HintText_1.default id={hintTextId} text={hintText}/>}
45
+ {hintText && <HintText_1.default id={hintTextId}>{hintText}</HintText_1.default>}
45
46
  {errorMessage && <ErrorMessage_1.default id={errorMessageId}>{errorMessage}</ErrorMessage_1.default>}
46
47
  <ConditionalWrapper_1.default condition={hasButton || typeof isCurrency !== 'undefined' && isCurrency} wrapper={(children) => <div className={inputWrapperClasses} data-symbol={currencySymbol}>{children}</div>}>
47
- <input aria-describedby={describedbys.join(' ')} aria-invalid={hasError} className={[
48
+ <input aria-describedby={describedbys.join(' ')} aria-invalid={hasError} className={(0, clsx_1.default)([
48
49
  'ds_input',
49
50
  className,
50
- hasError ? 'ds_input--error' : '',
51
- width ? `ds_input--${width}` : '',
52
- ].join(' ')} defaultValue={value} id={id} maxLength={maxlength} name={name || id} onBlur={handleBlur} onChange={handleChange} placeholder={placeholder} type={type} {...props}/>
51
+ hasError && 'ds_input--error',
52
+ width && `ds_input--${width}`,
53
+ ])} defaultValue={value} id={id} maxLength={maxlength} name={name || id} onBlur={handleBlur} onChange={handleChange} placeholder={placeholder} type={type} {...props}/>
53
54
  {hasButton && (buttonText || buttonIcon) && <Button_1.default isIconOnly icon={buttonIcon}>{buttonText}</Button_1.default>}
54
55
  </ConditionalWrapper_1.default>
55
56
  </ConditionalWrapper_1.default>);
@@ -0,0 +1,11 @@
1
+ import { IconName, InputWidth, TextInputBase } from '../../shared-types';
2
+ export interface TextInputProps extends TextInputBase<HTMLInputElement> {
3
+ buttonIcon?: IconName;
4
+ buttonText?: string;
5
+ className?: string;
6
+ currencySymbol?: string;
7
+ hasButton?: boolean;
8
+ isCurrency?: boolean;
9
+ type?: string;
10
+ width?: InputWidth;
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,6 @@
1
+ import { TextInputBase } from '../../shared-types';
1
2
  declare const Textarea: {
2
- ({ className, countThreshold, errorMessage, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, rows, value, ...props }: SGDS.Component.Textarea): import("react").JSX.Element;
3
+ ({ className, countThreshold, errorMessage, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, rows, value, ...props }: TextInputBase<HTMLTextAreaElement>): import("react").JSX.Element;
3
4
  displayName: string;
4
5
  };
5
6
  export default Textarea;
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = require("react");
7
- // @ts-ignore
8
- const character_count_1 = __importDefault(require("@scottish-government/design-system/src/forms/character-count/character-count"));
7
+ const character_count_1 = __importDefault(require("@scottish-government/design-system/src/components/character-count/character-count"));
9
8
  const ConditionalWrapper_1 = __importDefault(require("../../common/ConditionalWrapper"));
10
9
  const ErrorMessage_1 = __importDefault(require("../ErrorMessage"));
11
10
  const HintText_1 = __importDefault(require("../../common/HintText"));
11
+ const clsx_1 = __importDefault(require("clsx"));
12
12
  const Textarea = ({ className, countThreshold, errorMessage, hasError, hintText, id, label, maxlength, name, onBlur, onChange, placeholder, rows = 4, value, ...props }) => {
13
13
  const errorMessageId = `error-message-${id}`;
14
14
  const hintTextId = `hint-text-${id}`;
@@ -23,6 +23,7 @@ const Textarea = ({ className, countThreshold, errorMessage, hasError, hintText,
23
23
  }
24
24
  ;
25
25
  (0, react_1.useEffect)(() => {
26
+ /* istanbul ignore else */
26
27
  if (ref.current) {
27
28
  new character_count_1.default(ref.current).init();
28
29
  }
@@ -39,14 +40,14 @@ const Textarea = ({ className, countThreshold, errorMessage, hasError, hintText,
39
40
  }
40
41
  return (<ConditionalWrapper_1.default condition={typeof maxlength !== 'undefined' && maxlength > 0} wrapper={(children) => <div ref={ref} data-threshold={countThreshold} data-module="ds-character-count">{children}</div>}>
41
42
  <label className="ds_label" htmlFor={id}>{label}</label>
42
- {hintText && <HintText_1.default id={hintTextId} text={hintText}/>}
43
+ {hintText && <HintText_1.default id={hintTextId}>{hintText}</HintText_1.default>}
43
44
  {errorMessage && <ErrorMessage_1.default id={errorMessageId}>{errorMessage}</ErrorMessage_1.default>}
44
45
 
45
- <textarea aria-describedby={describedbys.join(' ')} aria-invalid={hasError} className={[
46
+ <textarea aria-describedby={describedbys.join(' ')} aria-invalid={hasError} className={(0, clsx_1.default)([
46
47
  'ds_input',
47
48
  hasError && 'ds_input--error',
48
49
  className
49
- ].join(' ')} defaultValue={value} id={id} maxLength={maxlength} name={name || id} onBlur={handleBlur} onChange={handleChange} placeholder={placeholder} rows={rows} {...props}/>
50
+ ])} defaultValue={value} id={id} maxLength={maxlength} name={name || id} onBlur={handleBlur} onChange={handleChange} placeholder={placeholder} rows={rows} {...props}/>
50
51
 
51
52
  </ConditionalWrapper_1.default>);
52
53
  };
@@ -1,5 +1,5 @@
1
1
  declare const WarningText: {
2
- ({ children, className, ...props }: SGDS.Component.WarningText): import("react").JSX.Element;
2
+ ({ children, className, ...props }: React.AllHTMLAttributes<HTMLElement>): import("react").JSX.Element;
3
3
  displayName: string;
4
4
  };
5
5
  export default WarningText;
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const clsx_1 = __importDefault(require("clsx"));
3
7
  const WarningText = ({ children, className, ...props }) => {
4
- return (<div className={[
8
+ return (<div className={(0, clsx_1.default)([
5
9
  'ds_warning-text',
6
10
  className
7
- ].join(' ')} {...props}>
11
+ ])} {...props}>
8
12
  <strong className="ds_warning-text__icon" aria-hidden="true"></strong>
9
13
  <strong className="visually-hidden">Warning</strong>
10
14
  <div className="ds_warning-text__text">
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = default_1;
7
7
  const react_1 = require("react");
8
- //@ts-ignore
9
8
  const tracking_1 = __importDefault(require("@scottish-government/design-system/src/base/tools/tracking/tracking"));
10
9
  function default_1() {
11
10
  (0, react_1.useEffect)(() => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@scottish-government/designsystem-react",
3
3
  "description": "A React/JSX implementation of the Scottish Government Design System",
4
- "version": "0.13.0",
4
+ "version": "1.0.0",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "Scottish Government Digital Design System team",
@@ -12,20 +12,21 @@
12
12
  "main": "dist/index.js",
13
13
  "scripts": {
14
14
  "build": "npx eslint && npm run svgr && npm run tsc",
15
- "coverage": "vitest test.tsx run --coverage",
16
15
  "svgr": "npx @svgr/cli node_modules/@scottish-government/design-system/src/images/icons/svg --config-file .svgrrc",
17
16
  "svgr_documents": "npx @svgr/cli node_modules/@scottish-government/design-system/src/images/documents/svg --config-file .svgrrc_documents",
18
17
  "test": "vitest test.tsx",
18
+ "test:coverage": "vitest test.tsx run --coverage",
19
19
  "tsc": "node ./node_modules/typescript/bin/tsc",
20
20
  "storybook": "storybook dev -p 6006",
21
21
  "build-storybook": "storybook build"
22
22
  },
23
23
  "peerDependencies": {
24
- "@scottish-government/design-system": "^3.2.1"
24
+ "@scottish-government/design-system": "^4.0.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@chromatic-com/storybook": "^4.1.3",
28
28
  "@eslint/js": "^9.39.1",
29
+ "@scottish-government/design-system": "^4.0.0",
29
30
  "@storybook/addon-a11y": "^10.0.8",
30
31
  "@storybook/addon-docs": "^10.0.8",
31
32
  "@storybook/addon-onboarding": "^10.0.8",
@@ -43,6 +44,7 @@
43
44
  "@vitest/browser": "4.0.10",
44
45
  "@vitest/browser-playwright": "^4.0.10",
45
46
  "@vitest/coverage-v8": "^4.0.10",
47
+ "clsx": "^2.1.1",
46
48
  "eslint": "^9.39.1",
47
49
  "eslint-plugin-react": "^7.37.5",
48
50
  "globals": "^16.5.0",
@@ -2,6 +2,7 @@ import { Children } from 'react';
2
2
  import Icon from '../Icon';
3
3
  import ScreenReaderText from '../ScreenReaderText';
4
4
  import { AbstractNotificationBannerProps, AbstractNotificationBannerButtonsProps } from './types';
5
+ import clsx from 'clsx';
5
6
 
6
7
  const Buttons = ({
7
8
  children
@@ -33,29 +34,30 @@ const AbstractNotificationBanner = ({
33
34
 
34
35
  return (
35
36
  <div
36
- className={[
37
+ className={clsx([
37
38
  'ds_notification',
38
39
  className
39
- ].join(' ')}
40
+ ])}
40
41
  data-module="ds-notification"
41
42
  {...props}
42
43
  >
43
44
  <div className="ds_wrapper">
44
45
  <div className={
45
- [
46
+ clsx([
46
47
  'ds_notification__content',
47
48
  isDismissable && 'ds_notification__content--has-close'
48
- ].join(' ')}
49
+ ])}
49
50
  >
50
51
  <h2 className="visually-hidden">{title}</h2>
51
52
 
52
53
  {icon &&
53
54
  <span
54
- className={[
55
+ className={clsx([
55
56
  'ds_notification__icon',
56
57
  hasInverseIcon && 'ds_notification__icon--inverse',
57
58
  hasColourIcon && 'ds_notification__icon--colour'
58
- ].join(' ')} aria-hidden="true">
59
+ ])}
60
+ aria-hidden="true">
59
61
  <Icon icon={icon} />
60
62
  </span>
61
63
  }
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import * as Icons from '../../images/icons';
3
3
  import { IconProps } from './types';
4
+ import clsx from 'clsx';
4
5
 
5
6
  const Icon = ({
6
7
  ariaLabel,
@@ -15,12 +16,12 @@ const Icon = ({
15
16
  <IconComponent
16
17
  aria-hidden={ariaLabel ? undefined : true}
17
18
  aria-label={ariaLabel}
18
- className={[
19
+ className={clsx([
19
20
  'ds_icon',
20
21
  className,
21
22
  isFilled && 'ds_icon--fill',
22
23
  iconSize && `ds_icon--${iconSize}`
23
- ].join(' ')}
24
+ ])}
24
25
  />
25
26
  );
26
27
  };
@@ -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,8 +1,8 @@
1
1
  import React, { createContext, useContext, useEffect, useRef, useId } from 'react';
2
2
  import WrapperTag from '../../common/WrapperTag';
3
- // @ts-expect-error no types from core SGDS
4
3
  import DSAccordion from '@scottish-government/design-system/src/components/accordion/accordion';
5
4
  import { AccordionItemProps, AccordionProps } from './types';
5
+ import clsx from 'clsx';
6
6
 
7
7
  let accordionItemCounter = 0;
8
8
  const AccordionHeadingLevelContext = createContext('h3');
@@ -31,19 +31,19 @@ const AccordionItem = ({
31
31
 
32
32
  return (
33
33
  <div
34
- className={[
34
+ className={clsx([
35
35
  'ds_accordion-item',
36
36
  className
37
- ].join(' ')}
37
+ ])}
38
38
  id={processedId}
39
39
  {...props}
40
40
  >
41
41
  <input
42
42
  aria-labelledby={`panel-${processedId}-heading`}
43
- className={[
43
+ className={clsx([
44
44
  'ds_accordion-item__control',
45
45
  'visually-hidden'
46
- ].join(' ')}
46
+ ])}
47
47
  defaultChecked={isOpen}
48
48
  id={`${processedId}-control`}
49
49
  type="checkbox"
@@ -82,6 +82,7 @@ const Accordion = ({
82
82
  const ref = useRef(null);
83
83
 
84
84
  useEffect(() => {
85
+ /* istanbul ignore else */
85
86
  if (ref.current) {
86
87
  new DSAccordion(ref.current).init();
87
88
  }
@@ -93,21 +94,21 @@ const Accordion = ({
93
94
 
94
95
  return (
95
96
  <div
96
- className={[
97
+ className={clsx([
97
98
  'ds_accordion',
98
- isSmall ? 'ds_accordion--small' : '',
99
+ isSmall && 'ds_accordion--small',
99
100
  className
100
- ].join(' ')}
101
+ ])}
101
102
  ref={ref}
102
103
  {...props}
103
104
  >
104
105
  { !hideOpenAll && (
105
106
  <button
106
- className={[
107
+ className={clsx([
107
108
  'ds_accordion__open-all',
108
109
  'ds_link',
109
110
  'js-open-all'
110
- ].join(' ')}
111
+ ])}
111
112
  type='button'
112
113
  >
113
114
  Open all