@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,94 +1,119 @@
1
- import ConditionalWrapper from "../../common/ConditionalWrapper";
1
+ import React, { Children, createContext, useContext } from 'react';
2
+ import { FeatureHeaderProps, FeatureHeaderPrimaryProps } from './types';
3
+ import { ConditionalWrapper, WrapperTag } from '../../common';
4
+ import clsx from 'clsx';
2
5
 
3
- const Content = ({ children, className, ...props }: any /* SGDS.Component.FeatureHeader.Primary*/) => {
6
+ type FeatureHeaderSettingsContextProps = {
7
+ hasCoverImage?: boolean,
8
+ hasNoImagePadding?: boolean
9
+ }
10
+
11
+ const FeatureHeaderSettingsContext = createContext<FeatureHeaderSettingsContextProps>({
12
+ hasCoverImage: undefined,
13
+ hasNoImagePadding: undefined
14
+ });
15
+
16
+ const Primary = ({
17
+ children,
18
+ title,
19
+ ...props
20
+ }: FeatureHeaderPrimaryProps) => {
4
21
  return (
5
- <div className={['ds_feature-header__primary', className].join(' ')} {...props}>
22
+ <div
23
+ className="ds_feature-header__primary"
24
+ {...props}
25
+ >
26
+ <h1 className="ds_feature-header__title">
27
+ {title}
28
+ </h1>
6
29
  {children}
7
30
  </div>
8
- );
9
- }
31
+ )
32
+ };
33
+
34
+ const Secondary = ({
35
+ children,
36
+ ...props
37
+ }: React.AllHTMLAttributes<HTMLDivElement>) => {
38
+ const hasCoverImage = useContext(FeatureHeaderSettingsContext).hasCoverImage;
39
+ const hasNoImagePadding = useContext(FeatureHeaderSettingsContext).hasNoImagePadding;
40
+
41
+ children = Children.map(children, child => {
42
+ const thisChild = child as React.ReactElement<HTMLElement>;
43
+ if (thisChild && ['img', 'svg', 'picture'].includes(thisChild.type as string)) {
44
+ return React.cloneElement(thisChild, { className: 'ds_feature-header__image' });
45
+ } else {
46
+ return child;
47
+ }
48
+ });
10
49
 
11
- const Media = ({ children, className, isCover, noPadding, ...props }: any /* SGDS.Component.FeatureHeader.Secondary*/) => {
12
50
  return (
13
- <div className={[
51
+ <div className={clsx([
14
52
  'ds_feature-header__secondary',
15
- isCover && 'ds_feature-header__secondary--cover',
16
- noPadding && 'ds_feature-header__secondary--no-padding',
17
- className
18
- ].join(' ')} {...props}>
53
+ hasCoverImage && 'ds_feature-header__secondary--cover',
54
+ hasNoImagePadding && 'ds_feature-header__secondary--no-padding'
55
+ ])}
56
+ {...props}
57
+ >
19
58
  {children}
20
59
  </div>
21
60
  );
22
- }
61
+ };
23
62
 
24
63
  const FeatureHeader = ({
25
- backgroundColour = 'NONE',
64
+ backgroundColor,
26
65
  children,
27
66
  className,
67
+ hasCoverImage,
68
+ hasNoImagePadding,
69
+ id,
28
70
  isFullWidth,
29
- isTopAligned,
30
71
  isWideText,
72
+ isTopAlignImage,
73
+ tagName = 'div',
31
74
  ...props
32
- }: any /* SGDS.Component.FeatureHeader*/) => {
33
- let backgroundColorClass = '';
34
-
35
- switch (backgroundColour) {
36
- case 'BRAND':
37
- backgroundColorClass = 'ds_feature-header--background';
38
- break;
39
- case 'SECONDARY':
40
- backgroundColorClass = 'ds_feature-header--background-secondary';
41
- break;
42
- case 'TERTIARY':
43
- backgroundColorClass = 'ds_feature-header--background-tertiary';
44
- break;
45
- case 'NONE':
46
- break;
47
- default:
48
- backgroundColorClass = '';
49
- break;
75
+ }: FeatureHeaderProps) => {
76
+ let backgroundColorClassName;
77
+ if (backgroundColor === 'secondary') {
78
+ backgroundColorClassName = 'ds_feature-header--background-secondary';
79
+ } else if (backgroundColor === 'tertiary') {
80
+ backgroundColorClassName = 'ds_feature-header--background-tertiary';
81
+ } else if (backgroundColor === 'brand') {
82
+ backgroundColorClassName = 'ds_feature-header--background';
50
83
  }
51
84
 
52
85
  return (
53
- <header
54
- className={[
86
+ <WrapperTag
87
+ className={clsx([
55
88
  'ds_feature-header',
56
89
  isFullWidth && 'ds_feature-header--fullwidth',
57
- isTopAligned && 'ds_feature-header--top',
58
90
  isWideText && 'ds_feature-header--wide',
59
- backgroundColorClass,
91
+ isTopAlignImage && 'ds_feature-header--top',
92
+ backgroundColorClassName && backgroundColorClassName,
60
93
  className
61
- ].join(' ')}
94
+ ])}
95
+ id={id}
96
+ tagName={tagName}
62
97
  {...props}
63
98
  >
64
99
  <ConditionalWrapper
65
- condition={isFullWidth}
100
+ condition={!!isFullWidth}
66
101
  wrapper={(children: React.JSX.Element) => <div className="ds_wrapper">{children}</div>}
67
102
  >
68
- {children}
103
+ <FeatureHeaderSettingsContext value={{
104
+ hasCoverImage, hasNoImagePadding
105
+ }}>
106
+ {children}
107
+ </FeatureHeaderSettingsContext>
69
108
  </ConditionalWrapper>
70
- </header>
109
+ </WrapperTag>
71
110
  );
72
111
  };
73
112
 
74
113
  FeatureHeader.displayName = 'FeatureHeader';
75
- Content.displayName = 'FeatureHeader.Content';
76
- Media.displayName = 'FeatureHeader.Media';
77
- FeatureHeader.Content = Content;
78
- FeatureHeader.Media = Media;
114
+ Primary.displayName = 'FeatureHeader.Primary';
115
+ Secondary.displayName = 'FeatureHeader.Secondary';
116
+ FeatureHeader.Primary = Primary;
117
+ FeatureHeader.Secondary = Secondary;
79
118
 
80
119
  export default FeatureHeader;
81
-
82
-
83
- /*
84
-
85
- <FeatureHeader backgroundColour="NONE/BRAND/SECONDARY/TERTIARY" isFullWidth isWideText isTopAligned>
86
- <FeatureHeader.Content>
87
- {children}
88
- </FeatureHeader.Content>
89
- <FeatureHeader.Media noPadding isCover>
90
- {children}
91
- </FeatureHeader.Media>
92
- </FeatureHeader>
93
-
94
- */
@@ -0,0 +1,13 @@
1
+ export interface FeatureHeaderPrimaryProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ title: string
3
+ }
4
+
5
+ export interface FeatureHeaderProps extends React.AllHTMLAttributes<HTMLElement> {
6
+ backgroundColor?: 'secondary' | 'tertiary' | 'brand'
7
+ hasCoverImage?: boolean
8
+ hasNoImagePadding?: boolean
9
+ isFullWidth?: boolean
10
+ isWideText?: boolean
11
+ isTopAlignImage?: boolean
12
+ tagName?: 'div' | 'header'
13
+ }
@@ -53,10 +53,6 @@ test('highlighted file download', () => {
53
53
  expect(fileDownload).toHaveClass('ds_file-download--highlighted');
54
54
  });
55
55
 
56
- // test('file download with specific icon', () => {
57
-
58
- // });
59
-
60
56
  test('file download with cover image', () => {
61
57
  const COVER_URL = 'my-image.png';
62
58
 
@@ -66,7 +62,7 @@ test('file download with cover image', () => {
66
62
 
67
63
  const thumbnailImage = screen.getByRole('presentation', {hidden: true});
68
64
 
69
- expect(thumbnailImage).toHaveClass('ds_file-download__thumbnail-image');
65
+ expect(thumbnailImage).toHaveClass('ds_file-download__thumbnail-image', 'ds_file-download__thumbnail-image--outlined');
70
66
  expect(thumbnailImage).toHaveAttribute('alt', '');
71
67
  expect(thumbnailImage).toHaveAttribute('src', COVER_URL);
72
68
  expect(thumbnailImage.tagName).toEqual('IMG');
@@ -1,5 +1,7 @@
1
1
  import { useId } from 'react';
2
2
  import FileIcon from '../../common/FileIcon';
3
+ import { FileDownloadProps } from './types';
4
+ import clsx from 'clsx';
3
5
 
4
6
  const FileDownload = ({
5
7
  className,
@@ -11,22 +13,22 @@ const FileDownload = ({
11
13
  fileUrl,
12
14
  title,
13
15
  ...props
14
- }: SGDS.Component.FileDownload) => {
16
+ }: FileDownloadProps) => {
15
17
  const hasMetadata = !!fileType || !!fileSize;
16
18
  const metaContainerId = `file-download-${useId()}`;
17
19
 
18
20
  return (
19
- <div className={[
21
+ <div className={clsx([
20
22
  'ds_file-download',
21
23
  isHighlighted && 'ds_file-download--highlighted',
22
24
  className
23
- ].join(' ')}
25
+ ])}
24
26
  {...props}
25
27
  >
26
28
  <div className="ds_file-download__thumbnail">
27
29
  <a className="ds_file-download__thumbnail-link" aria-hidden="true" tabIndex={-1} href={fileUrl}>
28
30
  {cover ?
29
- <img alt="" className="ds_file-download__thumbnail-image" src={cover}/>
31
+ <img alt="" className="ds_file-download__thumbnail-image ds_file-download__thumbnail-image--outlined" src={cover}/>
30
32
  :
31
33
  <FileIcon ariaLabel="" className="ds_file-download__thumbnail-image" icon={icon} />
32
34
  }
@@ -0,0 +1,11 @@
1
+ import { DocumentIconName } from '../../shared-types';
2
+
3
+ export interface FileDownloadProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ cover?: string;
5
+ fileSize?: string;
6
+ fileType?: string;
7
+ fileUrl: string;
8
+ icon?: DocumentIconName;
9
+ isHighlighted?: boolean;
10
+ title: string;
11
+ }
@@ -49,7 +49,18 @@ test('custom escape URL', () => {
49
49
  const link = within(hideThisPageElement).getByRole('link');
50
50
 
51
51
  expect(link).toHaveAttribute('href', ESCAPE_URL);
52
- })
52
+ });
53
+
54
+ test('instantiating/initialising DS component script', () => {
55
+ render(
56
+ <HideThisPage data-testid="htp" />
57
+ );
58
+
59
+ const hideThisPageElement = screen.getByTestId('htp');
60
+ const link = within(hideThisPageElement).getByRole('link');
61
+ expect(link).toHaveClass('js-initialised');
62
+ expect(link).toHaveClass('js-instantiated');
63
+ });
53
64
 
54
65
  test('passing additional props', () => {
55
66
  render(
@@ -1,17 +1,19 @@
1
1
  import React, { useEffect, useRef } from 'react';
2
- // @ts-ignore
3
2
  import DSHideThisPage from '@scottish-government/design-system/src/components/hide-this-page/hide-this-page';
3
+ import { HideThisPageProps } from './types';
4
+ import clsx from 'clsx';
4
5
 
5
6
  const HideThisPage = ({
6
7
  className,
7
8
  escapeUrl = 'https://www.bbc.co.uk/weather',
8
9
  ...props
9
- }: SGDS.Component.HideThisPage) => {
10
+ }: HideThisPageProps) => {
10
11
  const ref = useRef(null);
11
12
 
12
13
  useEffect(() => {
14
+ /* istanbul ignore else */
13
15
  if (ref.current) {
14
- new DSHideThisPage().init();
16
+ new DSHideThisPage(ref.current).init();
15
17
 
16
18
  const HIDE_THIS_PAGE_DIV_ID = 'hide-this-page-instruction';
17
19
  if (!document.getElementById(HIDE_THIS_PAGE_DIV_ID)) {
@@ -29,10 +31,10 @@ const HideThisPage = ({
29
31
 
30
32
  return (
31
33
  <div
32
- className={[
34
+ className={clsx([
33
35
  'ds_hide-page',
34
36
  className
35
- ].join(' ')}
37
+ ])}
36
38
  ref={ref}
37
39
  {...props}
38
40
  >
@@ -0,0 +1,3 @@
1
+ export interface HideThisPageProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ escapeUrl?: string;
3
+ }
@@ -1,14 +1,16 @@
1
+ import clsx from 'clsx';
2
+
1
3
  const InsetText = ({
2
4
  children,
3
5
  className,
4
6
  ...props
5
- }: SGDS.Component.InsetText) => {
7
+ }: React.AllHTMLAttributes<HTMLElement>) => {
6
8
  return (
7
9
  <div
8
- className={[
10
+ className={clsx([
9
11
  'ds_inset-text',
10
12
  className
11
- ].join(' ')}
13
+ ])}
12
14
  {...props}
13
15
  >
14
16
  <div className="ds_inset-text__text">
@@ -13,7 +13,7 @@ const meta = {
13
13
  description: 'Makes the icon display in the alternative colour scheme'
14
14
  },
15
15
  hasIcon: {
16
- description: 'Shows the high priority icon on the notification banner',
16
+ description: 'Shows the \'high priority\' icon on the notification banner',
17
17
  control: 'boolean'
18
18
  },
19
19
  hasInverseIcon: {
@@ -22,7 +22,7 @@ const meta = {
22
22
  },
23
23
  isDismissable: {
24
24
  control: 'boolean',
25
- description: 'Shows a close button on the notification banner'
25
+ description: 'Shows a \'close\' button on the notification banner'
26
26
  },
27
27
  title: {
28
28
  description: 'A hidden title for the notification banner, useful for screen reader users',
@@ -42,3 +42,13 @@ test('notification banner with icon', () => {
42
42
  expect(bannerIcon).toHaveClass('ds_icon');
43
43
  expect(bannerIcon).toHaveAttribute('aria-hidden');
44
44
  });
45
+
46
+ test('instantiating/initialising DS component script', () => {
47
+ render(
48
+ <NotificationBanner data-testid="notification-banner" />
49
+ );
50
+
51
+ const notificationBanner = screen.getByTestId('notification-banner');
52
+ expect(notificationBanner).toHaveClass('js-initialised');
53
+ expect(notificationBanner).toHaveClass('js-instantiated');
54
+ });
@@ -1,7 +1,8 @@
1
1
  import { useEffect, useRef } from 'react';
2
2
  import AbstractNotificationBanner from '../../common/AbstractNotificationBanner';
3
- // @ts-ignore
4
3
  import DSNotificationBanner from '@scottish-government/design-system/src/components/notification-banner/notification-banner';
4
+ import { AbstractNotificationBannerProps } from '../../common/AbstractNotificationBanner/types';
5
+ import clsx from 'clsx';
5
6
 
6
7
  const NotificationBanner = ({
7
8
  children,
@@ -10,12 +11,13 @@ const NotificationBanner = ({
10
11
  hasIcon,
11
12
  hasInverseIcon,
12
13
  isDismissable,
13
- title,
14
+ title = 'Information',
14
15
  ...props
15
- }: SGDS.Common.AbstractNotificationBanner) => {
16
+ }: AbstractNotificationBannerProps) => {
16
17
  const ref = useRef(null);
17
18
 
18
19
  useEffect(() => {
20
+ /* istanbul ignore else */
19
21
  if (ref.current) {
20
22
  new DSNotificationBanner(ref.current).init();
21
23
  }
@@ -23,16 +25,16 @@ const NotificationBanner = ({
23
25
 
24
26
  return (
25
27
  <AbstractNotificationBanner
26
- className={[
28
+ className={clsx([
27
29
  'ds_reversed',
28
30
  className
29
- ].join(' ')}
31
+ ])}
30
32
  isDismissable={isDismissable}
31
33
  icon={hasIcon ? "PriorityHigh" : undefined}
32
34
  hasColourIcon={hasColourIcon}
33
35
  hasInverseIcon={hasInverseIcon}
34
36
  ref={ref}
35
- title="Information"
37
+ title={title}
36
38
  {...props}
37
39
  >
38
40
  {children}
@@ -1,4 +1,6 @@
1
1
  import WrapperTag from '../../common/WrapperTag';
2
+ import { NotificationPanelProps } from './types';
3
+ import clsx from 'clsx';
2
4
 
3
5
  const NotificationPanel = function ({
4
6
  ariaLive,
@@ -7,14 +9,14 @@ const NotificationPanel = function ({
7
9
  headingLevel = 'h1',
8
10
  title,
9
11
  ...props
10
- }: SGDS.Component.NotificationPanel) {
12
+ }: NotificationPanelProps) {
11
13
  return (
12
14
  <div
13
15
  aria-live={ariaLive}
14
- className={[
16
+ className={clsx([
15
17
  'ds_notification-panel',
16
18
  className
17
- ].join(' ')}
19
+ ])}
18
20
  {...props}
19
21
  >
20
22
  <WrapperTag
@@ -0,0 +1,7 @@
1
+ import { HeadingLevel } from '../../shared-types';
2
+
3
+ export interface NotificationPanelProps extends React.AllHTMLAttributes<HTMLDivElement> {
4
+ ariaLive?: React.AriaAttributes['aria-live'];
5
+ headingLevel?: HeadingLevel;
6
+ title: string;
7
+ }
@@ -0,0 +1,68 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import argTypes from '../../../.storybook/sgdsArgTypes';
3
+
4
+ import NotificationTag from './NotificationTag';
5
+
6
+ const meta = {
7
+ title: 'Components/Notification Tag',
8
+ component: NotificationTag,
9
+ argTypes: {
10
+ children: argTypes.children(),
11
+ description: {
12
+ description: 'Additional description for screen readers',
13
+ type: 'string'
14
+ },
15
+ label: {
16
+ description: 'Visible label, leave blank for a dot notification tag',
17
+ type: 'string'
18
+ },
19
+ isHidden: {
20
+ description: 'Hides the tag from screen readers',
21
+ control: 'boolean',
22
+ },
23
+ },
24
+ args: {
25
+ label: '99+',
26
+ description: 'Unread notifications'
27
+ }
28
+ } satisfies Meta<typeof NotificationTag>;
29
+
30
+ export default meta;
31
+ type Story = StoryObj<typeof meta>;
32
+
33
+ export const Default: Story = {
34
+ render: (args) => (
35
+ <NotificationTag {...args}
36
+ >
37
+ <svg className="ds_icon ds_icon--40" aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 40" width="30" height="40" fill="none">
38
+ <path d="m2.77792 35c-.75 0-1.40056-.2754-1.95167-.8262-.550833-.5512-.82625-1.2017-.82625-1.9517v-24.44418c0-.75.275417-1.40056.82625-1.95167.55111-.55083 1.20167-.82625 1.95167-.82625h24.44418c.75 0 1.4005.27542 1.9517.82625.5508.55111.8262 1.20167.8262 1.95167v24.44418c0 .75-.2754 1.4005-.8262 1.9517-.5512.5508-1.2017.8262-1.9517.8262zm5.19416-6.6387h8.75002c.3936 0 .7235-.1337.9896-.4009.2664-.2672.3995-.5982.3995-.9929 0-.395-.1331-.7244-.3995-.9883-.2661-.2639-.596-.3959-.9896-.3959h-8.75002c-.39333 0-.72319.1336-.98958.4009-.26611.2669-.39917.5979-.39917.9929s.13306.7244.39917.9883c.26639.2639.59625.3959.98958.3959zm0-6.9726h14.05582c.3933 0 .7232-.1334.9896-.4004.2661-.2672.3992-.5983.3992-.9933 0-.3947-.1331-.724-.3992-.9879-.2664-.2639-.5963-.3959-.9896-.3959h-14.05582c-.39333 0-.72319.1335-.98958.4005-.26611.2672-.39917.5983-.39917.9933 0 .3947.13306.724.39917.9879.26639.2639.59625.3958.98958.3958zm0-6.972h14.05582c.3933 0 .7232-.1336.9896-.4009.2661-.2669.3992-.5979.3992-.9929s-.1331-.7244-.3992-.9883c-.2664-.2639-.5963-.3958-.9896-.3958h-14.05582c-.39333 0-.72319.1336-.98958.4008-.26611.2672-.39917.5982-.39917.9929 0 .395.13306.7244.39917.9883.26639.2639.59625.3959.98958.3959z" />
39
+ </svg>
40
+ </NotificationTag>
41
+ )
42
+ };
43
+
44
+ export const Dot: Story = {
45
+ args: {
46
+ label: ''
47
+ },
48
+ render: (args) => (
49
+ <NotificationTag {...args}
50
+ >
51
+ <svg className="ds_icon ds_icon--40" aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 40" width="30" height="40" fill="none">
52
+ <path d="m2.77792 35c-.75 0-1.40056-.2754-1.95167-.8262-.550833-.5512-.82625-1.2017-.82625-1.9517v-24.44418c0-.75.275417-1.40056.82625-1.95167.55111-.55083 1.20167-.82625 1.95167-.82625h24.44418c.75 0 1.4005.27542 1.9517.82625.5508.55111.8262 1.20167.8262 1.95167v24.44418c0 .75-.2754 1.4005-.8262 1.9517-.5512.5508-1.2017.8262-1.9517.8262zm5.19416-6.6387h8.75002c.3936 0 .7235-.1337.9896-.4009.2664-.2672.3995-.5982.3995-.9929 0-.395-.1331-.7244-.3995-.9883-.2661-.2639-.596-.3959-.9896-.3959h-8.75002c-.39333 0-.72319.1336-.98958.4009-.26611.2669-.39917.5979-.39917.9929s.13306.7244.39917.9883c.26639.2639.59625.3959.98958.3959zm0-6.9726h14.05582c.3933 0 .7232-.1334.9896-.4004.2661-.2672.3992-.5983.3992-.9933 0-.3947-.1331-.724-.3992-.9879-.2664-.2639-.5963-.3959-.9896-.3959h-14.05582c-.39333 0-.72319.1335-.98958.4005-.26611.2672-.39917.5983-.39917.9933 0 .3947.13306.724.39917.9879.26639.2639.59625.3958.98958.3958zm0-6.972h14.05582c.3933 0 .7232-.1336.9896-.4009.2661-.2669.3992-.5979.3992-.9929s-.1331-.7244-.3992-.9883c-.2664-.2639-.5963-.3958-.9896-.3958h-14.05582c-.39333 0-.72319.1336-.98958.4008-.26611.2672-.39917.5982-.39917.9929 0 .395.13306.7244.39917.9883.26639.2639.59625.3959.98958.3959z" />
53
+ </svg>
54
+ </NotificationTag>
55
+ )
56
+ };
57
+
58
+ export const Hidden: Story = {
59
+ render: (args) => (
60
+ <NotificationTag {...args}
61
+ isHidden
62
+ >
63
+ <svg className="ds_icon ds_icon--40" aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 40" width="30" height="40" fill="none">
64
+ <path d="m2.77792 35c-.75 0-1.40056-.2754-1.95167-.8262-.550833-.5512-.82625-1.2017-.82625-1.9517v-24.44418c0-.75.275417-1.40056.82625-1.95167.55111-.55083 1.20167-.82625 1.95167-.82625h24.44418c.75 0 1.4005.27542 1.9517.82625.5508.55111.8262 1.20167.8262 1.95167v24.44418c0 .75-.2754 1.4005-.8262 1.9517-.5512.5508-1.2017.8262-1.9517.8262zm5.19416-6.6387h8.75002c.3936 0 .7235-.1337.9896-.4009.2664-.2672.3995-.5982.3995-.9929 0-.395-.1331-.7244-.3995-.9883-.2661-.2639-.596-.3959-.9896-.3959h-8.75002c-.39333 0-.72319.1336-.98958.4009-.26611.2669-.39917.5979-.39917.9929s.13306.7244.39917.9883c.26639.2639.59625.3959.98958.3959zm0-6.9726h14.05582c.3933 0 .7232-.1334.9896-.4004.2661-.2672.3992-.5983.3992-.9933 0-.3947-.1331-.724-.3992-.9879-.2664-.2639-.5963-.3959-.9896-.3959h-14.05582c-.39333 0-.72319.1335-.98958.4005-.26611.2672-.39917.5983-.39917.9933 0 .3947.13306.724.39917.9879.26639.2639.59625.3958.98958.3958zm0-6.972h14.05582c.3933 0 .7232-.1336.9896-.4009.2661-.2669.3992-.5979.3992-.9929s-.1331-.7244-.3992-.9883c-.2664-.2639-.5963-.3958-.9896-.3958h-14.05582c-.39333 0-.72319.1336-.98958.4008-.26611.2672-.39917.5982-.39917.9929 0 .395.13306.7244.39917.9883.26639.2639.59625.3959.98958.3959z" />
65
+ </svg>
66
+ </NotificationTag>
67
+ )
68
+ };
@@ -0,0 +1,70 @@
1
+ import { test, expect } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import NotificationTag from './NotificationTag';
4
+
5
+ const NOTIFICATION_TAG_LABEL = '11';
6
+ const NOTIFICATION_TAG_DESCRIPTION = 'new messages';
7
+ const NOTIFICATION_TAG_ICON = 'SVG icon';
8
+
9
+ test('notification tag renders correctly', () => {
10
+ render(
11
+ <NotificationTag label={NOTIFICATION_TAG_LABEL} description={NOTIFICATION_TAG_DESCRIPTION} data-testid="notification-tag">{NOTIFICATION_TAG_ICON}</NotificationTag>
12
+ );
13
+
14
+ const notificationTag = screen.getByTestId('notification-tag');
15
+ const notificationTagWrapper = notificationTag.parentElement;
16
+ const notificationTagDescription = notificationTag.lastChild;
17
+
18
+ expect(notificationTag).toHaveClass('ds_notification-tag');
19
+ expect(notificationTag.nodeName).toEqual('SPAN');
20
+ expect(notificationTag).not.toHaveAttribute('aria-hidden');
21
+ expect(notificationTagWrapper).toHaveClass('ds_notification-tag__wrapper');
22
+ expect(notificationTagWrapper?.nodeName).toEqual('SPAN');
23
+ expect(notificationTagDescription).toHaveClass('visually-hidden');
24
+ expect(notificationTagDescription?.nodeName).toEqual('SPAN');
25
+ });
26
+
27
+ test('notification tag with dot', () => {
28
+ render(
29
+ <NotificationTag data-testid="notification-tag">
30
+ {NOTIFICATION_TAG_ICON}
31
+ </NotificationTag>
32
+ );
33
+
34
+ const notificationTag = screen.getByTestId('notification-tag');
35
+
36
+ expect(notificationTag).toHaveClass('ds_notification-tag--dot');
37
+ });
38
+
39
+ test('aria-hidden on notification tag', () => {
40
+ render(
41
+ <NotificationTag isHidden data-testid="notification-tag">
42
+ {NOTIFICATION_TAG_ICON}
43
+ </NotificationTag>
44
+ );
45
+
46
+ const notificationTag = screen.getByTestId('notification-tag');
47
+ expect(notificationTag.getAttribute('aria-hidden')).toEqual('true');
48
+ });
49
+
50
+ test('passing additional props', () => {
51
+ render(
52
+ <NotificationTag data-test="foo" data-testid="notification-tag">
53
+ {NOTIFICATION_TAG_ICON}
54
+ </NotificationTag>
55
+ );
56
+
57
+ const notificationTag = screen.getByTestId('notification-tag');
58
+ expect(notificationTag?.dataset.test).toEqual('foo');
59
+ });
60
+
61
+ test('passing additional CSS class', () => {
62
+ render(
63
+ <NotificationTag className="foo" data-testid="notification-tag">
64
+ {NOTIFICATION_TAG_ICON}
65
+ </NotificationTag>
66
+ );
67
+
68
+ const notificationTag = screen.getByTestId('notification-tag');
69
+ expect(notificationTag).toHaveClass('foo', 'ds_notification-tag');
70
+ });
@@ -0,0 +1,32 @@
1
+ import { NotificationTagProps } from "./types";
2
+ import clsx from 'clsx';
3
+
4
+ const NotificationTag = ({
5
+ children,
6
+ className,
7
+ description,
8
+ isHidden,
9
+ label,
10
+ ...props
11
+ }: NotificationTagProps) => {
12
+ return (
13
+ <span className="ds_notification-tag__wrapper">
14
+ {children}
15
+ <span
16
+ aria-hidden={isHidden ? "true" : undefined}
17
+ className={clsx([
18
+ 'ds_notification-tag',
19
+ !label && 'ds_notification-tag--dot',
20
+ className
21
+ ])}
22
+ {...props}
23
+ >
24
+ {label} {description && <span className="visually-hidden">{description}</span>}
25
+ </span>
26
+ </span>
27
+ )
28
+ };
29
+
30
+ NotificationTag.displayName = 'NotificationTag';
31
+
32
+ export default NotificationTag;
@@ -0,0 +1 @@
1
+ export { default } from './NotificationTag';
@@ -0,0 +1,5 @@
1
+ export interface NotificationTagProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ description?: string
3
+ isHidden?: boolean
4
+ label?: string
5
+ }