@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
@@ -2,59 +2,222 @@ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import argTypes from '../../../.storybook/sgdsArgTypes';
3
3
 
4
4
  import FeatureHeader from './FeatureHeader';
5
+ import Button from '../Button';
6
+ // @ts-expect-error no types
7
+ import photograph from '../../../static/images/highland-cow.jpg';
8
+ // @ts-expect-error no types
9
+ import illustration from '../../../static/images/illustration.svg';
10
+
11
+
12
+
13
+ type foo = typeof FeatureHeader;
5
14
 
6
- //@ts-ignore
7
- import coo from '../../../static/images/highland-cow.jpg';
8
15
 
9
16
  const meta = {
10
- title: 'Components/Feature header',
17
+ title: 'Components/FeatureHeader',
11
18
  component: FeatureHeader,
12
19
  argTypes: {
13
- children: argTypes.children()
20
+ backgroundColor: argTypes.select({options: ['none', 'secondary', 'tertiary', 'brand']}),
21
+ children: argTypes.children(),
22
+ hasCoverImage: argTypes.boolean(),
23
+ hasNoImagePadding: argTypes.boolean(),
24
+ id: argTypes.id({ type: { name: 'string', required: false } }),
25
+ isFullWidth: argTypes.boolean(),
26
+ isWideText: argTypes.boolean(),
27
+ isTopAlignImage: argTypes.boolean(),
28
+ tagName: argTypes.select({ options: ['div', 'header'] })
14
29
  },
30
+ args: {
31
+ backgroundColor: 'secondary'
32
+ }
33
+ } satisfies Meta<foo & { image: string }>;
34
+
35
+ export default meta;
36
+ type Story = StoryObj<typeof meta>;
37
+
38
+ export const Default: Story = {
15
39
  args: {
16
40
  children: <>
17
- <FeatureHeader.Content>
18
- <h1>Design standards</h1>
19
- <p>The patterns included here have been developed for use by government, public sector and third sector non-commercial organisations in Scotland.</p>
20
- </FeatureHeader.Content>
21
- <FeatureHeader.Media>
41
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
42
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
43
+ <p>The Design System is open source and free to use.</p>
44
+ </FeatureHeader.Primary>
45
+ <FeatureHeader.Secondary>
22
46
  <img
23
- className="ds_feature-header__image"
24
- alt="A highland cow nuzzling its calf"
25
- src={coo}
47
+ alt=""
48
+ src={illustration}
26
49
  />
27
- </FeatureHeader.Media>
50
+ </FeatureHeader.Secondary>
28
51
  </>
29
52
  }
30
- } satisfies Meta<typeof FeatureHeader>;
53
+ };
31
54
 
32
- export default meta;
33
- type Story = StoryObj<typeof meta>;
34
55
 
35
- export const Default: Story = {
56
+ export const WithoutContent: Story = {
57
+ name: 'Without content',
58
+ args: {
59
+ children: <>
60
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
61
+ </FeatureHeader.Primary>
62
+ <FeatureHeader.Secondary>
63
+ <img
64
+ alt=""
65
+ src={illustration}
66
+ />
67
+ </FeatureHeader.Secondary>
68
+ </>
69
+ }
70
+ };
71
+
72
+ export const WithCallToAction: Story = {
73
+ name: 'Call to action',
74
+ args: {
75
+ children: <>
76
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
77
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
78
+ <p>The Design System is open source and free to use.</p>
79
+ <Button href="#foo" icon="ChevronRight">Get started</Button>
80
+ </FeatureHeader.Primary>
81
+ <FeatureHeader.Secondary>
82
+ <img
83
+ alt=""
84
+ src={illustration}
85
+ />
86
+ </FeatureHeader.Secondary>
87
+ </>
88
+ }
89
+ };
90
+
91
+ export const WithCoverImage: Story = {
92
+ name: 'Cover image',
93
+ args: {
94
+ children: <>
95
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
96
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
97
+ <p>The Design System is open source and free to use.</p>
98
+ </FeatureHeader.Primary>
99
+ <FeatureHeader.Secondary>
100
+ <img
101
+ alt=""
102
+ src={illustration}
103
+ />
104
+ </FeatureHeader.Secondary>
105
+ </>,
106
+ hasCoverImage: true
107
+ }
108
+ };
109
+
110
+ export const WithCoverImagePhotograph: Story = {
111
+ name: 'Cover image (photograph)',
36
112
  args: {
37
- backgroundColour: 'TERTIARY'
113
+ children: <>
114
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
115
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
116
+ <p>The Design System is open source and free to use.</p>
117
+ </FeatureHeader.Primary>
118
+ <FeatureHeader.Secondary>
119
+ <img
120
+ alt=""
121
+ src={photograph}
122
+ />
123
+ </FeatureHeader.Secondary>
124
+ </>,
125
+ hasCoverImage: true
38
126
  }
39
127
  };
40
128
 
41
129
  export const FullWidth: Story = {
130
+ name: 'Full width',
42
131
  args: {
43
- backgroundColour: 'TERTIARY',
132
+ children: <>
133
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
134
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
135
+ <p>The Design System is open source and free to use.</p>
136
+ </FeatureHeader.Primary>
137
+ <FeatureHeader.Secondary>
138
+ <img
139
+ alt=""
140
+ src={illustration}
141
+ />
142
+ </FeatureHeader.Secondary>
143
+ </>,
44
144
  isFullWidth: true
45
145
  }
46
146
  };
47
147
 
48
- export const TopAlign: Story = {
148
+ export const FullWidthImagePaddingRemoved: Story = {
149
+ name: 'Full width with image padding removed',
49
150
  args: {
50
- backgroundColour: 'TERTIARY',
51
- isTopAligned: true
151
+ children: <>
152
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
153
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
154
+ <p>The Design System is open source and free to use.</p>
155
+ </FeatureHeader.Primary>
156
+ <FeatureHeader.Secondary>
157
+ <img
158
+ alt=""
159
+ src={illustration}
160
+ />
161
+ </FeatureHeader.Secondary>
162
+ </>,
163
+ hasNoImagePadding: true,
164
+ isFullWidth: true
52
165
  }
53
166
  };
54
167
 
55
168
  export const WideText: Story = {
169
+ name: 'Wide text',
56
170
  args: {
57
- backgroundColour: 'TERTIARY',
171
+ children: <>
172
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
173
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
174
+ <p>The Design System is open source and free to use.</p>
175
+ </FeatureHeader.Primary>
176
+ <FeatureHeader.Secondary>
177
+ <img
178
+ alt=""
179
+ src={illustration}
180
+ />
181
+ </FeatureHeader.Secondary>
182
+ </>,
58
183
  isWideText: true
59
184
  }
60
185
  };
186
+
187
+ export const TopAlign: Story = {
188
+ name: 'Top aligned image',
189
+ args: {
190
+ children: <>
191
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
192
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
193
+ <p>The Design System is open source and free to use.</p>
194
+ </FeatureHeader.Primary>
195
+ <FeatureHeader.Secondary>
196
+ <img
197
+ alt=""
198
+ src={illustration}
199
+ />
200
+ </FeatureHeader.Secondary>
201
+ </>,
202
+ isTopAlignImage: true
203
+ }
204
+ };
205
+
206
+ export const TopAlignPhotograph: Story = {
207
+ name: 'Top aligned image (photograph)',
208
+ args: {
209
+ children: <>
210
+ <FeatureHeader.Primary title="Design and build accessible digital services for Scotland">
211
+ <p>The Scottish Government Design System provides static web assets for websites and web applications for the Scottish Government and other Scottish public sector bodies.</p>
212
+ <p>The Design System is open source and free to use.</p>
213
+ </FeatureHeader.Primary>
214
+ <FeatureHeader.Secondary>
215
+ <img
216
+ alt=""
217
+ src={photograph}
218
+ />
219
+ </FeatureHeader.Secondary>
220
+ </>,
221
+ isTopAlignImage: true
222
+ }
223
+ };
@@ -0,0 +1,298 @@
1
+ import { test, expect, describe } from 'vitest';
2
+ import { render, screen, within } from '@testing-library/react';
3
+ import FeatureHeader from './FeatureHeader';
4
+
5
+ const TITLE_TEXT = 'Design and build accessible digital services for Scotland';
6
+
7
+ describe('feature header', () => {
8
+ test('feature header renders correctly', () => {
9
+ render(
10
+ <FeatureHeader data-testid="feature-header">
11
+ <FeatureHeader.Primary
12
+ data-testid="feature-header-primary"
13
+ title={TITLE_TEXT}
14
+ >
15
+ </FeatureHeader.Primary>
16
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
17
+ <img src="foo" data-testid="feature-header-image" />
18
+ </FeatureHeader.Secondary>
19
+ </FeatureHeader>
20
+ );
21
+
22
+ const featureHeaderElement = screen.getByTestId('feature-header');
23
+ const featureHeaderPrimaryElement = screen.getByTestId('feature-header-primary');
24
+ const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary');
25
+ const featureHeaderTitleElement = within(featureHeaderPrimaryElement).getByRole('heading');
26
+ const featureHeaderImageElement = screen.getByTestId('feature-header-image');
27
+
28
+ expect(featureHeaderElement).toHaveClass('ds_feature-header');
29
+ expect(featureHeaderElement.tagName).toEqual('DIV');
30
+
31
+ expect(featureHeaderPrimaryElement).toHaveClass('ds_feature-header__primary');
32
+ expect(featureHeaderPrimaryElement.tagName).toEqual('DIV');
33
+ expect(featureHeaderPrimaryElement.parentElement).toEqual(featureHeaderElement);
34
+
35
+ expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary');
36
+ expect(featureHeaderSecondaryElement.tagName).toEqual('DIV');
37
+ expect(featureHeaderSecondaryElement.parentElement).toEqual(featureHeaderElement);
38
+ expect(featureHeaderSecondaryElement.previousElementSibling).toEqual(featureHeaderPrimaryElement);
39
+
40
+ expect(featureHeaderTitleElement).toHaveClass('ds_feature-header__title');
41
+ expect(featureHeaderTitleElement.tagName).toEqual('H1');
42
+ expect(featureHeaderTitleElement.textContent).toEqual(TITLE_TEXT);
43
+
44
+ expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image');
45
+ });
46
+
47
+ test('image CSS class added to svg element correctly', () => {
48
+ render(
49
+ <FeatureHeader data-testid="feature-header">
50
+ <FeatureHeader.Primary
51
+ data-testid="feature-header-primary"
52
+ title={TITLE_TEXT}
53
+ >
54
+ </FeatureHeader.Primary>
55
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
56
+ <svg version="1.1"
57
+ data-testid="feature-header-image"
58
+ width="300"
59
+ height="200"
60
+ xmlns="http://www.w3.org/2000/svg">
61
+ </svg>
62
+ </FeatureHeader.Secondary>
63
+ </FeatureHeader>
64
+ );
65
+
66
+ const featureHeaderImageElement = screen.getByTestId('feature-header-image');
67
+
68
+ expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image');
69
+ });
70
+
71
+ test('image CSS class added to picture element correctly', () => {
72
+ render(
73
+ <FeatureHeader data-testid="feature-header">
74
+ <FeatureHeader.Primary
75
+ data-testid="feature-header-primary"
76
+ title={TITLE_TEXT}
77
+ >
78
+ </FeatureHeader.Primary>
79
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
80
+ <picture data-testid="feature-header-image">
81
+ </picture>
82
+ </FeatureHeader.Secondary>
83
+ </FeatureHeader>
84
+ );
85
+
86
+ const featureHeaderImageElement = screen.getByTestId('feature-header-image');
87
+
88
+ expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image');
89
+ });
90
+
91
+ test('image CSS class NOT added to other elements in Secondary', () => {
92
+ render(
93
+ <FeatureHeader data-testid="feature-header">
94
+ <FeatureHeader.Primary
95
+ data-testid="feature-header-primary"
96
+ title={TITLE_TEXT}
97
+ >
98
+ </FeatureHeader.Primary>
99
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
100
+ <p data-testid="feature-header-non-image">
101
+ </p>
102
+ </FeatureHeader.Secondary>
103
+ </FeatureHeader>
104
+ );
105
+
106
+ const featureHeaderNonImageElement = screen.getByTestId('feature-header-non-image');
107
+
108
+ expect(featureHeaderNonImageElement).not.toHaveClass('ds_feature-header__image');
109
+ });
110
+
111
+ test('ds_wrapper class included when full width', () => {
112
+ render(
113
+ <FeatureHeader
114
+ data-testid="feature-header"
115
+ isFullWidth
116
+ >
117
+ <FeatureHeader.Primary
118
+ data-testid="feature-header-primary"
119
+ title={TITLE_TEXT}
120
+ >
121
+ </FeatureHeader.Primary>
122
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
123
+ <img src="foo" data-testid="feature-header-image" />
124
+ </FeatureHeader.Secondary>
125
+ </FeatureHeader>
126
+ );
127
+
128
+ const featureHeaderElement = screen.getByTestId('feature-header');
129
+ const featureHeaderPrimaryElement = screen.getByTestId('feature-header-primary');
130
+ const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary');
131
+
132
+ const featureHeaderWrapperElement = featureHeaderElement.querySelector('.ds_wrapper');
133
+
134
+ expect(featureHeaderWrapperElement).toBeInTheDocument();
135
+ expect(featureHeaderWrapperElement?.parentElement).toEqual(featureHeaderElement);
136
+ expect(featureHeaderPrimaryElement.parentElement).toEqual(featureHeaderWrapperElement);
137
+ expect(featureHeaderSecondaryElement.parentElement).toEqual(featureHeaderWrapperElement);
138
+ });
139
+
140
+ test('feature header has correct CSS class for secondary background', () => {
141
+ render(
142
+ <FeatureHeader
143
+ data-testid="feature-header"
144
+ backgroundColor="secondary"
145
+ />
146
+ );
147
+
148
+ const featureHeaderElement = screen.getByTestId('feature-header');
149
+
150
+ expect(featureHeaderElement).toHaveClass('ds_feature-header--background-secondary');
151
+ });
152
+
153
+ test('feature header has correct CSS class for tertiary background', () => {
154
+ render(
155
+ <FeatureHeader
156
+ data-testid="feature-header"
157
+ backgroundColor="tertiary"
158
+ />
159
+ );
160
+
161
+ const featureHeaderElement = screen.getByTestId('feature-header');
162
+
163
+ expect(featureHeaderElement).toHaveClass('ds_feature-header--background-tertiary');
164
+ });
165
+
166
+ test('feature header has correct CSS class for brand background', () => {
167
+ render(
168
+ <FeatureHeader
169
+ data-testid="feature-header"
170
+ backgroundColor="brand"
171
+ />
172
+ );
173
+
174
+ const featureHeaderElement = screen.getByTestId('feature-header');
175
+
176
+ expect(featureHeaderElement).toHaveClass('ds_feature-header--background');
177
+ });
178
+
179
+ test('feature header does nothing with unrecognised background colours', () => {
180
+ render(
181
+ <FeatureHeader
182
+ data-testid="feature-header"
183
+ // @ts-expect-error deliberately invalid value
184
+ backgroundColor="foo"
185
+ />
186
+ );
187
+
188
+ const featureHeaderElement = screen.getByTestId('feature-header');
189
+ const cleanedClass = featureHeaderElement.getAttribute('class')?.trim().replace(/\s+/g, ' ');
190
+
191
+ expect(cleanedClass).toEqual('ds_feature-header');
192
+ });
193
+
194
+ test('feature header as HEADER element', () => {
195
+ render(
196
+ <FeatureHeader
197
+ data-testid="feature-header"
198
+ tagName="header"
199
+ />
200
+ );
201
+
202
+ const featureHeaderElement = screen.getByTestId('feature-header');
203
+
204
+ expect(featureHeaderElement.tagName).toEqual('HEADER');
205
+ });
206
+
207
+ test('feature header with wide text', () => {
208
+ render(
209
+ <FeatureHeader
210
+ data-testid="feature-header"
211
+ isWideText
212
+ />
213
+ );
214
+
215
+ const featureHeaderElement = screen.getByTestId('feature-header');
216
+
217
+ expect(featureHeaderElement).toHaveClass('ds_feature-header--wide');
218
+ });
219
+
220
+ test('feature header with top aligned image', () => {
221
+ render(
222
+ <FeatureHeader
223
+ data-testid="feature-header"
224
+ isTopAlignImage
225
+ />
226
+ );
227
+
228
+ const featureHeaderElement = screen.getByTestId('feature-header');
229
+
230
+ expect(featureHeaderElement).toHaveClass('ds_feature-header--top');
231
+ });
232
+
233
+ test('feature header with cover image', () => {
234
+ render(
235
+ <FeatureHeader
236
+ data-testid="feature-header"
237
+ hasCoverImage
238
+ >
239
+ <FeatureHeader.Primary
240
+ data-testid="feature-header-primary"
241
+ title={TITLE_TEXT}
242
+ >
243
+ </FeatureHeader.Primary>
244
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
245
+ <img src="foo" data-testid="feature-header-image" />
246
+ </FeatureHeader.Secondary>
247
+ </FeatureHeader>
248
+ );
249
+
250
+ const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary');
251
+
252
+ expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary--cover');
253
+ });
254
+
255
+ test('feature header with no image padding', () => {
256
+ render(
257
+ <FeatureHeader
258
+ data-testid="feature-header"
259
+ hasNoImagePadding
260
+ >
261
+ <FeatureHeader.Primary
262
+ data-testid="feature-header-primary"
263
+ title={TITLE_TEXT}
264
+ >
265
+ </FeatureHeader.Primary>
266
+ <FeatureHeader.Secondary data-testid="feature-header-secondary">
267
+ <img src="foo" data-testid="feature-header-image" />
268
+ </FeatureHeader.Secondary>
269
+ </FeatureHeader>
270
+ );
271
+
272
+ const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary');
273
+
274
+ expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary--no-padding');
275
+ });
276
+
277
+ test('passing additional props', () => {
278
+ render(
279
+ <FeatureHeader data-testid="feature-header"
280
+ data-test="foo"
281
+ />
282
+ );
283
+
284
+ const featureHeaderElement = screen.getByTestId('feature-header');
285
+ expect(featureHeaderElement?.dataset.test).toEqual('foo');
286
+ });
287
+
288
+ test('passing additional CSS classes', () => {
289
+ render(
290
+ <FeatureHeader data-testid="feature-header"
291
+ className="foo"
292
+ />
293
+ );
294
+
295
+ const featureHeaderElement = screen.getByTestId('feature-header');
296
+ expect(featureHeaderElement).toHaveClass('foo');
297
+ });
298
+ });