@scottish-government/designsystem-react 0.12.1 → 0.13.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 (227) hide show
  1. package/.storybook/main.ts +6 -6
  2. package/.storybook/sgdsArgTypes.ts +84 -43
  3. package/CHANGELOG.md +26 -0
  4. package/eslint.config.mjs +32 -0
  5. package/package.json +8 -3
  6. package/src/common/AbstractNotificationBanner/AbstractNotificationBanner.tsx +5 -4
  7. package/src/common/AbstractNotificationBanner/types.ts +15 -0
  8. package/src/common/ActionLink/ActionLink.tsx +3 -1
  9. package/src/common/ActionLink/types.ts +8 -0
  10. package/src/common/ConditionalWrapper/ConditionalWrapper.tsx +10 -2
  11. package/src/common/ConditionalWrapper/types.ts +4 -0
  12. package/src/common/FileIcon/FileIcon.tsx +2 -1
  13. package/src/common/FileIcon/types.ts +7 -0
  14. package/src/common/HintText/HintText.test.tsx +3 -15
  15. package/src/common/HintText/HintText.tsx +4 -4
  16. package/src/common/HintText/types.ts +4 -0
  17. package/src/common/Icon/Icon.tsx +2 -1
  18. package/src/common/Icon/types.ts +9 -0
  19. package/src/common/ScreenReaderText/ScreenReaderText.tsx +1 -1
  20. package/src/common/WrapperTag/WrapperTag.tsx +5 -3
  21. package/src/common/WrapperTag/types.ts +3 -0
  22. package/src/components/Accordion/Accordion.Item.stories.tsx +1 -5
  23. package/src/components/Accordion/Accordion.stories.tsx +5 -5
  24. package/src/components/Accordion/Accordion.tsx +5 -4
  25. package/src/components/Accordion/types.ts +13 -0
  26. package/src/components/AspectBox/AspectBox.stories.tsx +1 -2
  27. package/src/components/AspectBox/AspectBox.tsx +5 -4
  28. package/src/components/AspectBox/types.ts +3 -0
  29. package/src/components/BackToTop/BackToTop.tsx +3 -2
  30. package/src/components/BackToTop/types.ts +3 -0
  31. package/src/components/Breadcrumbs/Breadcrumbs.tsx +4 -2
  32. package/src/components/Breadcrumbs/types.ts +6 -0
  33. package/src/components/Button/Button.tsx +2 -1
  34. package/src/components/Button/ButtonGroup.tsx +3 -1
  35. package/src/components/Button/types.ts +21 -0
  36. package/src/components/CategoryItem/CategoryItem.tsx +7 -4
  37. package/src/components/CategoryItem/types.ts +10 -0
  38. package/src/components/CategoryList/CategoryList.tsx +4 -2
  39. package/src/components/CategoryList/types.ts +5 -0
  40. package/src/components/Checkbox/Checkbox.stories.tsx +3 -3
  41. package/src/components/Checkbox/Checkbox.tsx +5 -4
  42. package/src/components/Checkbox/CheckboxGroup.tsx +3 -3
  43. package/src/components/Checkbox/types.ts +9 -0
  44. package/src/components/ConfirmationMessage/ConfirmationMessage.tsx +2 -1
  45. package/src/components/ConfirmationMessage/types.ts +7 -0
  46. package/src/components/ContentsNav/ContentsNav.stories.tsx +5 -1
  47. package/src/components/ContentsNav/ContentsNav.tsx +3 -2
  48. package/src/components/ContentsNav/types.ts +11 -0
  49. package/src/components/CookieBanner/CookieBanner.Buttons.stories.tsx +3 -3
  50. package/src/components/CookieBanner/CookieBanner.stories.tsx +6 -6
  51. package/src/components/CookieBanner/CookieBanner.test.tsx +6 -0
  52. package/src/components/CookieBanner/CookieBanner.tsx +13 -3
  53. package/src/components/DatePicker/DatePicker.test.tsx +0 -5
  54. package/src/components/DatePicker/DatePicker.tsx +3 -2
  55. package/src/components/DatePicker/types.ts +20 -0
  56. package/src/components/Details/Details.stories.tsx +1 -1
  57. package/src/components/Details/Details.tsx +3 -1
  58. package/src/components/Details/types.ts +4 -0
  59. package/src/components/ErrorMessage/ErrorMessage.tsx +3 -1
  60. package/src/components/ErrorMessage/types.ts +3 -0
  61. package/src/components/ErrorSummary/ErrorSummary.test.tsx +1 -1
  62. package/src/components/ErrorSummary/ErrorSummary.tsx +3 -2
  63. package/src/components/ErrorSummary/types.ts +11 -0
  64. package/src/components/FileDownload/FileDownload.tsx +2 -1
  65. package/src/components/FileDownload/types.ts +11 -0
  66. package/src/components/HideThisPage/HideThisPage.tsx +3 -2
  67. package/src/components/HideThisPage/types.ts +3 -0
  68. package/src/components/InsetText/InsetText.tsx +1 -1
  69. package/src/components/NotificationBanner/NotificationBanner.stories.tsx +2 -2
  70. package/src/components/NotificationBanner/NotificationBanner.tsx +5 -4
  71. package/src/components/NotificationPanel/NotificationPanel.tsx +2 -1
  72. package/src/components/NotificationPanel/types.ts +7 -0
  73. package/src/components/PageHeader/PageHeader.tsx +3 -1
  74. package/src/components/PageHeader/types.ts +5 -0
  75. package/src/components/PageMetadata/PageMetadata.stories.tsx +1 -1
  76. package/src/components/PageMetadata/PageMetadata.tsx +5 -3
  77. package/src/components/PageMetadata/types.ts +7 -0
  78. package/src/components/Pagination/Pagination.tsx +5 -3
  79. package/src/components/Pagination/types.ts +20 -0
  80. package/src/components/PhaseBanner/PhaseBanner.stories.tsx +1 -4
  81. package/src/components/PhaseBanner/PhaseBanner.tsx +2 -1
  82. package/src/components/PhaseBanner/types.ts +3 -0
  83. package/src/components/Question/Question.tsx +3 -2
  84. package/src/components/Question/types.ts +9 -0
  85. package/src/components/RadioButton/RadioButton.tsx +5 -4
  86. package/src/components/RadioButton/RadioGroup.tsx +2 -1
  87. package/src/components/RadioButton/types.ts +12 -0
  88. package/src/components/SearchFacets/SearchFacets.Group.stories.tsx +2 -3
  89. package/src/components/SearchFacets/SearchFacets.stories.tsx +1 -1
  90. package/src/components/SearchFacets/SearchFacets.tsx +7 -6
  91. package/src/components/SearchFacets/types.ts +14 -0
  92. package/src/components/SearchFilters/SearchFilters.Panel.stories.tsx +18 -7
  93. package/src/components/SearchFilters/SearchFilters.stories.tsx +1 -1
  94. package/src/components/SearchFilters/SearchFilters.tsx +4 -3
  95. package/src/components/SearchFilters/types.ts +14 -0
  96. package/src/components/SearchResult/SearchResult.stories.tsx +9 -10
  97. package/src/components/SearchResult/SearchResult.tsx +9 -8
  98. package/src/components/SearchResult/types.ts +13 -0
  99. package/src/components/SearchSort/SearchSort.stories.tsx +2 -1
  100. package/src/components/SearchSort/SearchSort.tsx +2 -1
  101. package/src/components/SearchSort/types.ts +7 -0
  102. package/src/components/Select/Select.tsx +5 -4
  103. package/src/components/Select/types.ts +7 -0
  104. package/src/components/SequentialNavigation/SequentialNavigation.tsx +6 -4
  105. package/src/components/SequentialNavigation/types.ts +12 -0
  106. package/src/components/SideNavigation/SideNavigation.tsx +5 -4
  107. package/src/components/SideNavigation/types.ts +16 -0
  108. package/src/components/SiteFooter/SiteFooter.tsx +7 -6
  109. package/src/components/SiteFooter/types.ts +20 -0
  110. package/src/components/SiteHeader/SiteHeader.stories.tsx +4 -3
  111. package/src/components/SiteHeader/SiteHeader.tsx +10 -9
  112. package/src/components/SiteHeader/types.ts +22 -0
  113. package/src/components/SiteNavigation/SiteNavigation.tsx +4 -2
  114. package/src/components/SiteNavigation/types.ts +11 -0
  115. package/src/components/SiteSearch/SiteSearch.stories.tsx +4 -2
  116. package/src/components/SiteSearch/SiteSearch.tsx +6 -5
  117. package/src/components/SiteSearch/types.ts +13 -0
  118. package/src/components/SkipLinks/SkipLinks.stories.tsx +3 -3
  119. package/src/components/SkipLinks/SkipLinks.tsx +4 -4
  120. package/src/components/SkipLinks/types.ts +9 -0
  121. package/src/components/SummaryCard/SummaryCard.test.tsx +0 -11
  122. package/src/components/SummaryCard/SummaryCard.tsx +6 -4
  123. package/src/components/SummaryCard/types.ts +6 -0
  124. package/src/components/SummaryList/SummaryList.Item.stories.tsx +5 -5
  125. package/src/components/SummaryList/SummaryList.stories.tsx +1 -1
  126. package/src/components/SummaryList/SummaryList.test.tsx +1 -6
  127. package/src/components/SummaryList/SummaryList.tsx +8 -6
  128. package/src/components/SummaryList/types.ts +7 -0
  129. package/src/components/Table/Table.tsx +3 -2
  130. package/src/components/Table/types.ts +6 -0
  131. package/src/components/Tabs/Tabs.Item.stories.tsx +7 -7
  132. package/src/components/Tabs/Tabs.stories.tsx +3 -3
  133. package/src/components/Tabs/Tabs.tsx +7 -5
  134. package/src/components/Tabs/types.ts +19 -0
  135. package/src/components/Tag/Tag.tsx +3 -1
  136. package/src/components/Tag/types.ts +5 -0
  137. package/src/components/TaskList/TaskList.Group.stories.tsx +0 -5
  138. package/src/components/TaskList/TaskList.stories.tsx +0 -1
  139. package/src/components/TaskList/TaskList.tsx +12 -9
  140. package/src/components/TaskList/types.ts +20 -0
  141. package/src/components/TextInput/TextInput.tsx +6 -6
  142. package/src/components/TextInput/types.ts +12 -0
  143. package/src/components/Textarea/Textarea.tsx +6 -5
  144. package/src/components/WarningText/WarningText.tsx +1 -1
  145. package/src/hooks/useTracking/useTracking.test.tsx +5 -7
  146. package/src/hooks/useTracking/useTracking.ts +1 -1
  147. package/src/images/icons/arrow_upward.tsx +10 -10
  148. package/src/images/icons/calendar_today.tsx +10 -10
  149. package/src/images/icons/cancel.tsx +8 -8
  150. package/src/images/icons/check_circle.tsx +10 -10
  151. package/src/images/icons/chevron_left.tsx +10 -10
  152. package/src/images/icons/chevron_right.tsx +10 -10
  153. package/src/images/icons/close.tsx +10 -10
  154. package/src/images/icons/description.tsx +10 -10
  155. package/src/images/icons/double_chevron_left.tsx +8 -8
  156. package/src/images/icons/double_chevron_right.tsx +8 -8
  157. package/src/images/icons/error.tsx +10 -10
  158. package/src/images/icons/expand_less.tsx +10 -10
  159. package/src/images/icons/expand_more.tsx +10 -10
  160. package/src/images/icons/list.tsx +13 -13
  161. package/src/images/icons/menu.tsx +10 -10
  162. package/src/images/icons/priority_high.tsx +11 -11
  163. package/src/images/icons/search.tsx +10 -10
  164. package/src/shared-types.ts +40 -0
  165. package/vite.config.ts +2 -1
  166. package/@types/common/AbstractNotificationBanner.d.ts +0 -17
  167. package/@types/common/ActionLink.d.ts +0 -8
  168. package/@types/common/ConditionalWrapper.d.ts +0 -6
  169. package/@types/common/FileIcon.d.ts +0 -7
  170. package/@types/common/HintText.d.ts +0 -6
  171. package/@types/common/Icon.d.ts +0 -9
  172. package/@types/common/ScreenReaderText.d.ts +0 -4
  173. package/@types/common/WrapperTag.d.ts +0 -5
  174. package/@types/components/Accordion.d.ts +0 -15
  175. package/@types/components/AspectBox.d.ts +0 -5
  176. package/@types/components/BackToTop.d.ts +0 -5
  177. package/@types/components/Breadcrumbs.d.ts +0 -11
  178. package/@types/components/Button.d.ts +0 -17
  179. package/@types/components/ButtonGroup.d.ts +0 -5
  180. package/@types/components/CategoryItem.d.ts +0 -10
  181. package/@types/components/CategoryList.d.ts +0 -7
  182. package/@types/components/Checkbox.d.ts +0 -11
  183. package/@types/components/ConfirmationMessage.d.ts +0 -7
  184. package/@types/components/ContentsNav.d.ts +0 -13
  185. package/@types/components/DatePicker.d.ts +0 -20
  186. package/@types/components/Details.d.ts +0 -6
  187. package/@types/components/ErrorMessage.d.ts +0 -5
  188. package/@types/components/ErrorSummary.d.ts +0 -12
  189. package/@types/components/FileDownload.d.ts +0 -11
  190. package/@types/components/HideThisPage.d.ts +0 -5
  191. package/@types/components/InsetText.d.ts +0 -5
  192. package/@types/components/Metadata.d.ts +0 -11
  193. package/@types/components/NotificationPanel.d.ts +0 -7
  194. package/@types/components/PageHeader.d.ts +0 -7
  195. package/@types/components/Pagination.d.ts +0 -22
  196. package/@types/components/PhaseBanner.d.ts +0 -5
  197. package/@types/components/Question.d.ts +0 -11
  198. package/@types/components/RadioButton.d.ts +0 -14
  199. package/@types/components/SearchFacets.d.ts +0 -18
  200. package/@types/components/SearchFilters.d.ts +0 -14
  201. package/@types/components/SearchResult.d.ts +0 -30
  202. package/@types/components/SearchSort.d.ts +0 -9
  203. package/@types/components/Select.d.ts +0 -7
  204. package/@types/components/SequentialNavigation.d.ts +0 -14
  205. package/@types/components/SideNavigation.d.ts +0 -18
  206. package/@types/components/SiteFooter.d.ts +0 -25
  207. package/@types/components/SiteHeader.d.ts +0 -20
  208. package/@types/components/SiteNavigation.d.ts +0 -13
  209. package/@types/components/SiteSearch.d.ts +0 -14
  210. package/@types/components/SkipLinks.d.ts +0 -13
  211. package/@types/components/SummaryCard.d.ts +0 -6
  212. package/@types/components/SummaryList.d.ts +0 -14
  213. package/@types/components/Table.d.ts +0 -8
  214. package/@types/components/Tabs.d.ts +0 -21
  215. package/@types/components/Tag.d.ts +0 -5
  216. package/@types/components/TaskList.d.ts +0 -22
  217. package/@types/components/TextInput.d.ts +0 -12
  218. package/@types/components/Textarea.d.ts +0 -4
  219. package/@types/components/WarningText.d.ts +0 -5
  220. package/@types/global.d.ts +0 -1
  221. package/@types/sgds.d.ts +0 -49
  222. package/dist/index.d.ts +0 -4
  223. package/dist/index.js +0 -40
  224. package/dist/tsconfig.tsbuildinfo +0 -1
  225. package/src/components/FeatureHeader/FeatureHeader.stories.tsx +0 -60
  226. package/src/components/FeatureHeader/FeatureHeader.tsx +0 -94
  227. package/src/components/FeatureHeader/index.ts +0 -1
@@ -74,7 +74,7 @@ test('error summary item with no link', () => {
74
74
  test('error summary item with custom element', () => {
75
75
  render(
76
76
  <ErrorSummary.Item fragmentId={ERROR_FRAGMENT_ID} linkComponent={
77
- ({ className, ...props }) => (
77
+ ({ ...props }) => (
78
78
  <strong role="link" {...props}/>
79
79
  )}>
80
80
  {ERROR_TEXT}
@@ -1,10 +1,11 @@
1
1
  import { useId } from 'react';
2
+ import { ErrorSummaryItemProps, ErrorSummaryProps } from './types';
2
3
 
3
4
  const ErrorSummaryItem = ({
4
5
  children,
5
6
  fragmentId,
6
7
  linkComponent
7
- }: SGDS.Component.ErrorSummary.Item) => {
8
+ }: ErrorSummaryItemProps) => {
8
9
  const HREF = '#' + fragmentId;
9
10
 
10
11
  function processChildren(children: React.ReactNode) {
@@ -29,7 +30,7 @@ const ErrorSummary = ({
29
30
  className,
30
31
  title = 'There is a problem',
31
32
  ...props
32
- }: SGDS.Component.ErrorSummary) => {
33
+ }: ErrorSummaryProps) => {
33
34
  const summaryTitleId = useId();
34
35
 
35
36
  return (
@@ -0,0 +1,11 @@
1
+
2
+ import { LinkComponent } from '../../shared-types';
3
+
4
+ export interface ErrorSummaryItemProps extends React.AllHTMLAttributes<HTMLElement> {
5
+ fragmentId: string;
6
+ linkComponent?: LinkComponent;
7
+ }
8
+
9
+ export interface ErrorSummaryProps extends React.AllHTMLAttributes<HTMLElement> {
10
+ title: string;
11
+ }
@@ -1,5 +1,6 @@
1
1
  import { useId } from 'react';
2
2
  import FileIcon from '../../common/FileIcon';
3
+ import { FileDownloadProps } from './types';
3
4
 
4
5
  const FileDownload = ({
5
6
  className,
@@ -11,7 +12,7 @@ const FileDownload = ({
11
12
  fileUrl,
12
13
  title,
13
14
  ...props
14
- }: SGDS.Component.FileDownload) => {
15
+ }: FileDownloadProps) => {
15
16
  const hasMetadata = !!fileType || !!fileSize;
16
17
  const metaContainerId = `file-download-${useId()}`;
17
18
 
@@ -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
+ }
@@ -1,12 +1,13 @@
1
1
  import React, { useEffect, useRef } from 'react';
2
- // @ts-ignore
2
+ // @ts-expect-error no types from core SGDS
3
3
  import DSHideThisPage from '@scottish-government/design-system/src/components/hide-this-page/hide-this-page';
4
+ import { HideThisPageProps } from './types';
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(() => {
@@ -0,0 +1,3 @@
1
+ export interface HideThisPageProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ escapeUrl?: string;
3
+ }
@@ -2,7 +2,7 @@ const InsetText = ({
2
2
  children,
3
3
  className,
4
4
  ...props
5
- }: SGDS.Component.InsetText) => {
5
+ }: React.AllHTMLAttributes<HTMLElement>) => {
6
6
  return (
7
7
  <div
8
8
  className={[
@@ -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',
@@ -1,7 +1,8 @@
1
1
  import { useEffect, useRef } from 'react';
2
2
  import AbstractNotificationBanner from '../../common/AbstractNotificationBanner';
3
- // @ts-ignore
3
+ // @ts-expect-error no types from core SGDS
4
4
  import DSNotificationBanner from '@scottish-government/design-system/src/components/notification-banner/notification-banner';
5
+ import { AbstractNotificationBannerProps } from '../../common/AbstractNotificationBanner/types';
5
6
 
6
7
  const NotificationBanner = ({
7
8
  children,
@@ -10,9 +11,9 @@ 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(() => {
@@ -32,7 +33,7 @@ const NotificationBanner = ({
32
33
  hasColourIcon={hasColourIcon}
33
34
  hasInverseIcon={hasInverseIcon}
34
35
  ref={ref}
35
- title="Information"
36
+ title={title}
36
37
  {...props}
37
38
  >
38
39
  {children}
@@ -1,4 +1,5 @@
1
1
  import WrapperTag from '../../common/WrapperTag';
2
+ import { NotificationPanelProps } from './types';
2
3
 
3
4
  const NotificationPanel = function ({
4
5
  ariaLive,
@@ -7,7 +8,7 @@ const NotificationPanel = function ({
7
8
  headingLevel = 'h1',
8
9
  title,
9
10
  ...props
10
- }: SGDS.Component.NotificationPanel) {
11
+ }: NotificationPanelProps) {
11
12
  return (
12
13
  <div
13
14
  aria-live={ariaLive}
@@ -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
+ }
@@ -1,3 +1,5 @@
1
+ import { PageHeaderProps } from "./types";
2
+
1
3
  const PageHeader = ({
2
4
  children,
3
5
  className,
@@ -5,7 +7,7 @@ const PageHeader = ({
5
7
  title,
6
8
  titleId,
7
9
  ...props
8
- }: SGDS.Component.PageHeader) => {
10
+ }: PageHeaderProps) => {
9
11
  return (
10
12
  <header
11
13
  className={[
@@ -0,0 +1,5 @@
1
+ export interface PageHeaderProps extends React.AllHTMLAttributes<HTMLHeadingElement> {
2
+ label?: string;
3
+ title: string;
4
+ titleId?: string;
5
+ }
@@ -10,7 +10,7 @@ const meta = {
10
10
  children: argTypes.children(),
11
11
  isInline: {
12
12
  control: 'boolean',
13
- description: 'Makes the page metadata use the truncated inline display'
13
+ description: 'Makes the page metadata use the truncated \'inline\' display'
14
14
  },
15
15
  },
16
16
  args: {
@@ -1,9 +1,11 @@
1
- const MetadataItem= ({
1
+ import { MetdataItemProps, MetadataProps } from "./types";
2
+
3
+ const MetadataItem = ({
2
4
  children,
3
5
  className,
4
6
  name,
5
7
  ...props
6
- }: SGDS.Component.Metadata.Item) => {
8
+ }: MetdataItemProps) => {
7
9
  return (
8
10
  <div className={[
9
11
  'ds_metadata__item',
@@ -24,7 +26,7 @@ const Metadata = ({
24
26
  className,
25
27
  isInline,
26
28
  ...props
27
- }: SGDS.Component.Metadata) => {
29
+ }: MetadataProps) => {
28
30
  return (
29
31
  <dl
30
32
  className={[
@@ -0,0 +1,7 @@
1
+ export interface MetdataItemProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ name: string;
3
+ }
4
+
5
+ export interface MetadataProps extends React.AllHTMLAttributes<HTMLDListElement> {
6
+ isInline?: boolean;
7
+ }
@@ -1,4 +1,6 @@
1
1
  import Icon from "../../common/Icon";
2
+ import { PaginationPageProps, PaginationProps } from "./types";
3
+ import { LinkComponentProps } from "../../shared-types";
2
4
 
3
5
  export const Page = ({
4
6
  ariaLabel,
@@ -8,7 +10,7 @@ export const Page = ({
8
10
  isCurrent = false,
9
11
  linkComponent,
10
12
  onClick
11
- }: SGDS.Component.Pagination.Page) => {
13
+ }: PaginationPageProps) => {
12
14
  function handleClick(event: React.MouseEvent) {
13
15
  if (typeof onClick === 'function') {
14
16
  onClick(event);
@@ -22,7 +24,7 @@ export const Page = ({
22
24
  isCurrent ? 'ds_current' : undefined
23
25
  ].join(' ');
24
26
 
25
- const linkProps: SGDS.LinkComponentProps = {
27
+ const linkProps: LinkComponentProps = {
26
28
  'aria-label': ariaLabel,
27
29
  href: href,
28
30
  onClick: handleClick
@@ -68,7 +70,7 @@ const Pagination = ({
68
70
  totalPages,
69
71
  linkComponent,
70
72
  ...props
71
- }: SGDS.Component.Pagination) => {
73
+ }: PaginationProps) => {
72
74
  padding = Number(padding);
73
75
  page = Number(page);
74
76
 
@@ -0,0 +1,20 @@
1
+ import { LinkComponent } from '../../shared-types';
2
+
3
+ export interface PaginationPageProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ ariaLabel: React.AriaAttributes['aria-label'];
5
+ isCurrent?: boolean;
6
+ href: string;
7
+ linkComponent?: LinkComponent;
8
+ onClick?: React.EventHandler<React.FormEvent>;
9
+ }
10
+
11
+ export interface PaginationProps extends React.AllHTMLAttributes<HTMLElement> {
12
+ ariaLabel: React.AriaAttributes['aria-label'];
13
+ className?: string;
14
+ linkComponent?: LinkComponent;
15
+ onClick?: React.EventHandler<React.FormEvent>;
16
+ padding: number;
17
+ page: number;
18
+ pattern: string;
19
+ totalPages: number;
20
+ }
@@ -31,8 +31,5 @@ export const CustomContent: Story = {
31
31
  args: {
32
32
  phaseName: 'Beta',
33
33
  children: <>This is a new service. Your <a href="#foo">feedback</a> will help us to improve it.</>
34
- },
35
- render: (args: any) => (
36
- <PhaseBanner {...args}></PhaseBanner>
37
- )
34
+ }
38
35
  };
@@ -1,11 +1,12 @@
1
1
  import Tag from "../Tag/Tag";
2
+ import { PhaseBannerProps } from "./types";
2
3
 
3
4
  const PhaseBanner = ({
4
5
  children,
5
6
  className,
6
7
  phaseName,
7
8
  ...props
8
- }: SGDS.Component.PhaseBanner) => {
9
+ }: PhaseBannerProps) => {
9
10
  return (
10
11
  <div
11
12
  className={[
@@ -0,0 +1,3 @@
1
+ export interface PhaseBannerProps extends React.AllHTMLAttributes<HTMLDivElement> {
2
+ phaseName: string;
3
+ }
@@ -1,6 +1,7 @@
1
1
  import ErrorMessage from '../ErrorMessage';
2
2
  import HintText from '../../common/HintText'
3
3
  import WrapperTag from '../../common/WrapperTag';
4
+ import { QuestionProps } from './types';
4
5
 
5
6
  const Question = function ({
6
7
  children,
@@ -11,7 +12,7 @@ const Question = function ({
11
12
  legend,
12
13
  tagName = 'div',
13
14
  ...props
14
- }: SGDS.Component.Question) {
15
+ }: QuestionProps) {
15
16
  return (
16
17
  <WrapperTag
17
18
  tagName={tagName}
@@ -23,7 +24,7 @@ const Question = function ({
23
24
  {...props}
24
25
  >
25
26
  {legend && <legend>{legend}</legend>}
26
- {hintText && <HintText text={hintText} />}
27
+ {hintText && <HintText>{hintText}</HintText>}
27
28
  {hasError && errorMessage && <ErrorMessage>{errorMessage}</ErrorMessage>}
28
29
  {children}
29
30
  </WrapperTag>
@@ -0,0 +1,9 @@
1
+ type QuestionTags = 'div' | 'fieldset';
2
+
3
+ export interface QuestionProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ errorMessage?: string;
5
+ hasError?: boolean;
6
+ hintText?: string;
7
+ legend?: string;
8
+ tagName: QuestionTags;
9
+ }
@@ -2,6 +2,7 @@ import { useContext } from 'react';
2
2
 
3
3
  import HintText from '../../common/HintText';
4
4
  import { CheckboxRadioContext } from '../../utils/context';
5
+ import { RadioButtonProps } from './types';
5
6
 
6
7
  const RadioButton = ({
7
8
  checked,
@@ -12,16 +13,16 @@ const RadioButton = ({
12
13
  name,
13
14
  onBlur,
14
15
  onChange
15
- }: SGDS.Component.RadioButton) => {
16
+ }: RadioButtonProps) => {
16
17
  const hintTextId = `hint-text-${id}`;
17
18
 
18
- function handleBlur(event: React.FocusEvent) {
19
+ function handleBlur(event: React.FocusEvent<HTMLInputElement>) {
19
20
  if (typeof onBlur === 'function') {
20
21
  onBlur(event);
21
22
  }
22
23
  }
23
24
 
24
- function handleChange(event: React.ChangeEvent) {
25
+ function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
25
26
  if (typeof onChange === 'function') {
26
27
  onChange(event);
27
28
  }
@@ -49,7 +50,7 @@ const RadioButton = ({
49
50
  className="ds_radio__label"
50
51
  htmlFor={id}
51
52
  >{label}</label>
52
- {hintText && <HintText id={hintTextId} text={hintText} />}
53
+ {hintText && <HintText id={hintTextId}>{hintText}</HintText>}
53
54
  </div>
54
55
  );
55
56
  };
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { CheckboxRadioContext } from '../../utils/context';
3
+ import { RadioGroupProps } from './types';
3
4
 
4
5
  const RadioGroup = ({
5
6
  children,
@@ -8,7 +9,7 @@ const RadioGroup = ({
8
9
  isSmall,
9
10
  name = '',
10
11
  ...props
11
- }: SGDS.Component.RadioButton.Group) => {
12
+ }: RadioGroupProps) => {
12
13
  return (
13
14
  <div
14
15
  className={[
@@ -0,0 +1,12 @@
1
+ import { CheckboxRadioBase } from "../../shared-types";
2
+
3
+ export interface RadioGroupProps extends React.AllHTMLAttributes<HTMLElement> {
4
+ isInline?: boolean;
5
+ name?: string;
6
+ isSmall?: boolean;
7
+ }
8
+
9
+ export interface RadioButtonProps extends CheckboxRadioBase<HTMLInputElement> {
10
+ id: string;
11
+ name?: string;
12
+ }
@@ -2,7 +2,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import argTypes from '../../../.storybook/sgdsArgTypes';
3
3
 
4
4
  import Facets from './SearchFacets';
5
- import { join } from 'path';
6
5
 
7
6
  const meta = {
8
7
  title: 'Components/Search results/Facets/Group',
@@ -37,7 +36,7 @@ export default meta;
37
36
  type Story = StoryObj<typeof meta>;
38
37
 
39
38
  export const Default: Story = {
40
- render: (args: any) => (
39
+ render: ({ ... args }) => (
41
40
  <Facets.Group {...args}>
42
41
  <Facets.Item title="Advice and guidance" />
43
42
  <Facets.Item title="Factsheet"/>
@@ -47,7 +46,7 @@ export const Default: Story = {
47
46
  };
48
47
 
49
48
  export const CustomJoinContent: Story = {
50
- render: (args: any) => (
49
+ render: () => (
51
50
  <Facets.Group joinContent="and" title="Updated between">
52
51
  <Facets.Item accessibleName="Updated after 01/10/2025" title="01/10/2025" />
53
52
  <Facets.Item accessibleName="Updated before 31/10/2025" title="31/10/2025"/>
@@ -18,7 +18,7 @@ export default meta;
18
18
  type Story = StoryObj<typeof meta>;
19
19
 
20
20
  export const Default: Story = {
21
- render: (args: any) => (
21
+ render: ({ ...args }) => (
22
22
  <Facets {...args}>
23
23
  <Facets.Group title="Content type">
24
24
  <Facets.Item title="Advice and guidance" />
@@ -1,6 +1,7 @@
1
1
  import React, { Children } from 'react';
2
2
  import Icon from "../../common/Icon";
3
3
  import { Cancel } from '../../../src/images/icons';
4
+ import { SearchFacetsGroupProps, SearchFacetsItemProps, SearchFacetsProps } from './types';
4
5
 
5
6
  const FacetsItem = ({
6
7
  accessibleName,
@@ -8,7 +9,7 @@ const FacetsItem = ({
8
9
  onClick,
9
10
  title,
10
11
  ...props
11
- }: SGDS.Component.SearchFacets.Item) => {
12
+ }: SearchFacetsItemProps) => {
12
13
  accessibleName = accessibleName ? accessibleName : title;
13
14
 
14
15
  return (
@@ -31,7 +32,7 @@ const FacetsGroup = ({
31
32
  joinContent = 'or',
32
33
  title,
33
34
  ...props
34
- }: SGDS.Component.SearchFacets.Group) => {
35
+ }: SearchFacetsGroupProps) => {
35
36
  return (
36
37
  <div className="ds_facet-group" {...props}>
37
38
  <dt className="ds_facet__group-title">
@@ -39,7 +40,7 @@ const FacetsGroup = ({
39
40
  </dt>
40
41
  {
41
42
  Children.map(children, (child, index) => {
42
- const thisChild = child as React.ReactElement<SGDS.Component.SearchFacets.Item>
43
+ const thisChild = child as React.ReactElement<SearchFacetsItemProps>
43
44
  return React.cloneElement(thisChild, { joinContent: index > 0 ? joinContent : undefined, key: 'facet' + index });
44
45
  })
45
46
  }
@@ -51,10 +52,10 @@ const Facets = ({
51
52
  children,
52
53
  className,
53
54
  ...props
54
- }: SGDS.Component.SearchFacets) => {
55
+ }: SearchFacetsProps) => {
55
56
  let facetCount = 0;
56
57
 
57
- function processChild(item: any) {
58
+ function processChild(item: React.JSX.Element) {
58
59
  if (item.type.displayName === 'Facets.Item') {
59
60
  facetCount = facetCount + 1;
60
61
 
@@ -66,7 +67,7 @@ const Facets = ({
66
67
  }
67
68
 
68
69
  Children.forEach(children, child => {
69
- processChild(child);
70
+ processChild(child as React.JSX.Element);
70
71
  });
71
72
 
72
73
  return (
@@ -0,0 +1,14 @@
1
+ export interface SearchFacetsGroupProps extends React.AllHTMLAttributes<HTMLElement> {
2
+ joinContent?: string;
3
+ title: string;
4
+ }
5
+
6
+ export interface SearchFacetsItemProps extends React.AllHTMLAttributes<HTMLElement> {
7
+ accessibleName?: string;
8
+ joinContent?: string;
9
+ title: string;
10
+ }
11
+
12
+ export interface SearchFacetsProps extends React.AllHTMLAttributes<HTMLElement> {
13
+ headingId?: string;
14
+ }
@@ -39,12 +39,22 @@ const meta = {
39
39
  name: 'number'
40
40
  }
41
41
  }
42
+ },
43
+ args: {
44
+ heading: 'Filter',
45
+ legend: 'Select which publication types you would like to see'
42
46
  }
43
47
  } satisfies Meta<typeof Filters.Panel>;
44
48
 
45
49
  export default meta;
46
50
  type Story = StoryObj<typeof meta>;
47
51
 
52
+ type ContentTypeType = {
53
+ label: string;
54
+ value: string;
55
+ checked?: boolean;
56
+ };
57
+
48
58
  const CONTENT_TYPES = [
49
59
  {
50
60
  label: 'Advice and guidance',
@@ -134,7 +144,7 @@ CONTENT_TYPES_WITH_SELECTED[4].checked = true;
134
144
  CONTENT_TYPES_WITH_SELECTED[7].checked = true;
135
145
 
136
146
  export const Default: Story = {
137
- render: (args: any) => (
147
+ render: () => (
138
148
  <Filters.Panel
139
149
  heading="Filter by date"
140
150
  legend="Filter by date"
@@ -155,12 +165,12 @@ export const Default: Story = {
155
165
  };
156
166
 
157
167
  export const Scrollable: Story = {
158
- render: (args: any) => (
168
+ render: ({ ...args }) => (
159
169
  <Filters.Panel
170
+ {...args}
160
171
  heading="Content type"
161
172
  isScrollable
162
173
  legend="Select which publication types you would like to see"
163
- {...args}
164
174
  >
165
175
  <Filters.CheckboxGroup>
166
176
  {CONTENT_TYPES.map((type) => (
@@ -177,16 +187,17 @@ export const Scrollable: Story = {
177
187
  };
178
188
 
179
189
  export const WithActiveFilterCount: Story = {
180
- render: (args: any) => (
190
+ args: {},
191
+ render: ({ ...args }) => (
181
192
  <Filters.Panel
182
- activeFilterCount={CONTENT_TYPES_WITH_SELECTED.filter((item: any) => item.checked).length}
193
+ {...args}
194
+ activeFilterCount={CONTENT_TYPES_WITH_SELECTED.filter((item: ContentTypeType) => item.checked).length}
183
195
  heading="Content type"
184
196
  isScrollable
185
197
  legend="Select which publication types you would like to see"
186
- {...args}
187
198
  >
188
199
  <Filters.CheckboxGroup>
189
- {CONTENT_TYPES_WITH_SELECTED.map((type: any) => (
200
+ {CONTENT_TYPES_WITH_SELECTED.map((type: ContentTypeType) => (
190
201
  <Checkbox
191
202
  checked={type.checked || false}
192
203
  key={type.value}
@@ -104,7 +104,7 @@ const CONTENT_TYPES = [
104
104
  ];
105
105
 
106
106
  export const Default: Story = {
107
- render: (args: any) => (
107
+ render: ({ ...args }) => (
108
108
  <Filters {...args}>
109
109
  <Filters.Panel legend="Select which publication types you would like to see" heading="Content type">
110
110
  <Filters.CheckboxGroup>
@@ -3,6 +3,7 @@ import Button from "../Button";
3
3
  import SkipLinks from "../SkipLinks";
4
4
  import ConditionalWrapper from "../../common/ConditionalWrapper";
5
5
  import { CheckboxGroup } from "../Checkbox";
6
+ import { SearchFiltersPanelProps, SearchFiltersCheckboxGroupProps, SearchFiltersProps } from "./types";
6
7
 
7
8
  export const FilterPanel = ({
8
9
  activeFilterCount = 0,
@@ -11,7 +12,7 @@ export const FilterPanel = ({
11
12
  legend,
12
13
  heading = 'Filter',
13
14
  ...props
14
- }: SGDS.Component.SearchFilters.Panel) => {
15
+ }: SearchFiltersPanelProps) => {
15
16
  const headingWithCount = <>
16
17
  {heading}
17
18
  {activeFilterCount > 0 && <div className="ds_search-filters__filter-count">({activeFilterCount} selected)</div>}
@@ -36,7 +37,7 @@ export const FilterPanel = ({
36
37
  const FilterCheckboxGroup = ({
37
38
  children,
38
39
  ...props
39
- }: any) => {
40
+ }: SearchFiltersCheckboxGroupProps) => {
40
41
  return (
41
42
  <CheckboxGroup
42
43
  className="ds_search-filters__checkboxes"
@@ -52,7 +53,7 @@ const Filters = ({
52
53
  children,
53
54
  searchResultsContainerId = 'search-results',
54
55
  ...props
55
- }: SGDS.Component.SearchFilters) => {
56
+ }: SearchFiltersProps) => {
56
57
  return (
57
58
  <div className="ds_search-filters" {...props}>
58
59
  <div className="ds_details ds_no-margin" data-module="ds-details">