@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.
- package/.storybook/main.ts +6 -6
- package/.storybook/sgdsArgTypes.ts +84 -43
- package/CHANGELOG.md +26 -0
- package/eslint.config.mjs +32 -0
- package/package.json +8 -3
- package/src/common/AbstractNotificationBanner/AbstractNotificationBanner.tsx +5 -4
- package/src/common/AbstractNotificationBanner/types.ts +15 -0
- package/src/common/ActionLink/ActionLink.tsx +3 -1
- package/src/common/ActionLink/types.ts +8 -0
- package/src/common/ConditionalWrapper/ConditionalWrapper.tsx +10 -2
- package/src/common/ConditionalWrapper/types.ts +4 -0
- package/src/common/FileIcon/FileIcon.tsx +2 -1
- package/src/common/FileIcon/types.ts +7 -0
- package/src/common/HintText/HintText.test.tsx +3 -15
- package/src/common/HintText/HintText.tsx +4 -4
- package/src/common/HintText/types.ts +4 -0
- package/src/common/Icon/Icon.tsx +2 -1
- package/src/common/Icon/types.ts +9 -0
- package/src/common/ScreenReaderText/ScreenReaderText.tsx +1 -1
- package/src/common/WrapperTag/WrapperTag.tsx +5 -3
- package/src/common/WrapperTag/types.ts +3 -0
- package/src/components/Accordion/Accordion.Item.stories.tsx +1 -5
- package/src/components/Accordion/Accordion.stories.tsx +5 -5
- package/src/components/Accordion/Accordion.tsx +5 -4
- package/src/components/Accordion/types.ts +13 -0
- package/src/components/AspectBox/AspectBox.stories.tsx +1 -2
- package/src/components/AspectBox/AspectBox.tsx +5 -4
- package/src/components/AspectBox/types.ts +3 -0
- package/src/components/BackToTop/BackToTop.tsx +3 -2
- package/src/components/BackToTop/types.ts +3 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +4 -2
- package/src/components/Breadcrumbs/types.ts +6 -0
- package/src/components/Button/Button.tsx +2 -1
- package/src/components/Button/ButtonGroup.tsx +3 -1
- package/src/components/Button/types.ts +21 -0
- package/src/components/CategoryItem/CategoryItem.tsx +7 -4
- package/src/components/CategoryItem/types.ts +10 -0
- package/src/components/CategoryList/CategoryList.tsx +4 -2
- package/src/components/CategoryList/types.ts +5 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +3 -3
- package/src/components/Checkbox/Checkbox.tsx +5 -4
- package/src/components/Checkbox/CheckboxGroup.tsx +3 -3
- package/src/components/Checkbox/types.ts +9 -0
- package/src/components/ConfirmationMessage/ConfirmationMessage.tsx +2 -1
- package/src/components/ConfirmationMessage/types.ts +7 -0
- package/src/components/ContentsNav/ContentsNav.stories.tsx +5 -1
- package/src/components/ContentsNav/ContentsNav.tsx +3 -2
- package/src/components/ContentsNav/types.ts +11 -0
- package/src/components/CookieBanner/CookieBanner.Buttons.stories.tsx +3 -3
- package/src/components/CookieBanner/CookieBanner.stories.tsx +6 -6
- package/src/components/CookieBanner/CookieBanner.test.tsx +6 -0
- package/src/components/CookieBanner/CookieBanner.tsx +13 -3
- package/src/components/DatePicker/DatePicker.test.tsx +0 -5
- package/src/components/DatePicker/DatePicker.tsx +3 -2
- package/src/components/DatePicker/types.ts +20 -0
- package/src/components/Details/Details.stories.tsx +1 -1
- package/src/components/Details/Details.tsx +3 -1
- package/src/components/Details/types.ts +4 -0
- package/src/components/ErrorMessage/ErrorMessage.tsx +3 -1
- package/src/components/ErrorMessage/types.ts +3 -0
- package/src/components/ErrorSummary/ErrorSummary.test.tsx +1 -1
- package/src/components/ErrorSummary/ErrorSummary.tsx +3 -2
- package/src/components/ErrorSummary/types.ts +11 -0
- package/src/components/FileDownload/FileDownload.tsx +2 -1
- package/src/components/FileDownload/types.ts +11 -0
- package/src/components/HideThisPage/HideThisPage.tsx +3 -2
- package/src/components/HideThisPage/types.ts +3 -0
- package/src/components/InsetText/InsetText.tsx +1 -1
- package/src/components/NotificationBanner/NotificationBanner.stories.tsx +2 -2
- package/src/components/NotificationBanner/NotificationBanner.tsx +5 -4
- package/src/components/NotificationPanel/NotificationPanel.tsx +2 -1
- package/src/components/NotificationPanel/types.ts +7 -0
- package/src/components/PageHeader/PageHeader.tsx +3 -1
- package/src/components/PageHeader/types.ts +5 -0
- package/src/components/PageMetadata/PageMetadata.stories.tsx +1 -1
- package/src/components/PageMetadata/PageMetadata.tsx +5 -3
- package/src/components/PageMetadata/types.ts +7 -0
- package/src/components/Pagination/Pagination.tsx +5 -3
- package/src/components/Pagination/types.ts +20 -0
- package/src/components/PhaseBanner/PhaseBanner.stories.tsx +1 -4
- package/src/components/PhaseBanner/PhaseBanner.tsx +2 -1
- package/src/components/PhaseBanner/types.ts +3 -0
- package/src/components/Question/Question.tsx +3 -2
- package/src/components/Question/types.ts +9 -0
- package/src/components/RadioButton/RadioButton.tsx +5 -4
- package/src/components/RadioButton/RadioGroup.tsx +2 -1
- package/src/components/RadioButton/types.ts +12 -0
- package/src/components/SearchFacets/SearchFacets.Group.stories.tsx +2 -3
- package/src/components/SearchFacets/SearchFacets.stories.tsx +1 -1
- package/src/components/SearchFacets/SearchFacets.tsx +7 -6
- package/src/components/SearchFacets/types.ts +14 -0
- package/src/components/SearchFilters/SearchFilters.Panel.stories.tsx +18 -7
- package/src/components/SearchFilters/SearchFilters.stories.tsx +1 -1
- package/src/components/SearchFilters/SearchFilters.tsx +4 -3
- package/src/components/SearchFilters/types.ts +14 -0
- package/src/components/SearchResult/SearchResult.stories.tsx +9 -10
- package/src/components/SearchResult/SearchResult.tsx +9 -8
- package/src/components/SearchResult/types.ts +13 -0
- package/src/components/SearchSort/SearchSort.stories.tsx +2 -1
- package/src/components/SearchSort/SearchSort.tsx +2 -1
- package/src/components/SearchSort/types.ts +7 -0
- package/src/components/Select/Select.tsx +5 -4
- package/src/components/Select/types.ts +7 -0
- package/src/components/SequentialNavigation/SequentialNavigation.tsx +6 -4
- package/src/components/SequentialNavigation/types.ts +12 -0
- package/src/components/SideNavigation/SideNavigation.tsx +5 -4
- package/src/components/SideNavigation/types.ts +16 -0
- package/src/components/SiteFooter/SiteFooter.tsx +7 -6
- package/src/components/SiteFooter/types.ts +20 -0
- package/src/components/SiteHeader/SiteHeader.stories.tsx +4 -3
- package/src/components/SiteHeader/SiteHeader.tsx +10 -9
- package/src/components/SiteHeader/types.ts +22 -0
- package/src/components/SiteNavigation/SiteNavigation.tsx +4 -2
- package/src/components/SiteNavigation/types.ts +11 -0
- package/src/components/SiteSearch/SiteSearch.stories.tsx +4 -2
- package/src/components/SiteSearch/SiteSearch.tsx +6 -5
- package/src/components/SiteSearch/types.ts +13 -0
- package/src/components/SkipLinks/SkipLinks.stories.tsx +3 -3
- package/src/components/SkipLinks/SkipLinks.tsx +4 -4
- package/src/components/SkipLinks/types.ts +9 -0
- package/src/components/SummaryCard/SummaryCard.test.tsx +0 -11
- package/src/components/SummaryCard/SummaryCard.tsx +6 -4
- package/src/components/SummaryCard/types.ts +6 -0
- package/src/components/SummaryList/SummaryList.Item.stories.tsx +5 -5
- package/src/components/SummaryList/SummaryList.stories.tsx +1 -1
- package/src/components/SummaryList/SummaryList.test.tsx +1 -6
- package/src/components/SummaryList/SummaryList.tsx +8 -6
- package/src/components/SummaryList/types.ts +7 -0
- package/src/components/Table/Table.tsx +3 -2
- package/src/components/Table/types.ts +6 -0
- package/src/components/Tabs/Tabs.Item.stories.tsx +7 -7
- package/src/components/Tabs/Tabs.stories.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +7 -5
- package/src/components/Tabs/types.ts +19 -0
- package/src/components/Tag/Tag.tsx +3 -1
- package/src/components/Tag/types.ts +5 -0
- package/src/components/TaskList/TaskList.Group.stories.tsx +0 -5
- package/src/components/TaskList/TaskList.stories.tsx +0 -1
- package/src/components/TaskList/TaskList.tsx +12 -9
- package/src/components/TaskList/types.ts +20 -0
- package/src/components/TextInput/TextInput.tsx +6 -6
- package/src/components/TextInput/types.ts +12 -0
- package/src/components/Textarea/Textarea.tsx +6 -5
- package/src/components/WarningText/WarningText.tsx +1 -1
- package/src/hooks/useTracking/useTracking.test.tsx +5 -7
- package/src/hooks/useTracking/useTracking.ts +1 -1
- package/src/images/icons/arrow_upward.tsx +10 -10
- package/src/images/icons/calendar_today.tsx +10 -10
- package/src/images/icons/cancel.tsx +8 -8
- package/src/images/icons/check_circle.tsx +10 -10
- package/src/images/icons/chevron_left.tsx +10 -10
- package/src/images/icons/chevron_right.tsx +10 -10
- package/src/images/icons/close.tsx +10 -10
- package/src/images/icons/description.tsx +10 -10
- package/src/images/icons/double_chevron_left.tsx +8 -8
- package/src/images/icons/double_chevron_right.tsx +8 -8
- package/src/images/icons/error.tsx +10 -10
- package/src/images/icons/expand_less.tsx +10 -10
- package/src/images/icons/expand_more.tsx +10 -10
- package/src/images/icons/list.tsx +13 -13
- package/src/images/icons/menu.tsx +10 -10
- package/src/images/icons/priority_high.tsx +11 -11
- package/src/images/icons/search.tsx +10 -10
- package/src/shared-types.ts +40 -0
- package/vite.config.ts +2 -1
- package/@types/common/AbstractNotificationBanner.d.ts +0 -17
- package/@types/common/ActionLink.d.ts +0 -8
- package/@types/common/ConditionalWrapper.d.ts +0 -6
- package/@types/common/FileIcon.d.ts +0 -7
- package/@types/common/HintText.d.ts +0 -6
- package/@types/common/Icon.d.ts +0 -9
- package/@types/common/ScreenReaderText.d.ts +0 -4
- package/@types/common/WrapperTag.d.ts +0 -5
- package/@types/components/Accordion.d.ts +0 -15
- package/@types/components/AspectBox.d.ts +0 -5
- package/@types/components/BackToTop.d.ts +0 -5
- package/@types/components/Breadcrumbs.d.ts +0 -11
- package/@types/components/Button.d.ts +0 -17
- package/@types/components/ButtonGroup.d.ts +0 -5
- package/@types/components/CategoryItem.d.ts +0 -10
- package/@types/components/CategoryList.d.ts +0 -7
- package/@types/components/Checkbox.d.ts +0 -11
- package/@types/components/ConfirmationMessage.d.ts +0 -7
- package/@types/components/ContentsNav.d.ts +0 -13
- package/@types/components/DatePicker.d.ts +0 -20
- package/@types/components/Details.d.ts +0 -6
- package/@types/components/ErrorMessage.d.ts +0 -5
- package/@types/components/ErrorSummary.d.ts +0 -12
- package/@types/components/FileDownload.d.ts +0 -11
- package/@types/components/HideThisPage.d.ts +0 -5
- package/@types/components/InsetText.d.ts +0 -5
- package/@types/components/Metadata.d.ts +0 -11
- package/@types/components/NotificationPanel.d.ts +0 -7
- package/@types/components/PageHeader.d.ts +0 -7
- package/@types/components/Pagination.d.ts +0 -22
- package/@types/components/PhaseBanner.d.ts +0 -5
- package/@types/components/Question.d.ts +0 -11
- package/@types/components/RadioButton.d.ts +0 -14
- package/@types/components/SearchFacets.d.ts +0 -18
- package/@types/components/SearchFilters.d.ts +0 -14
- package/@types/components/SearchResult.d.ts +0 -30
- package/@types/components/SearchSort.d.ts +0 -9
- package/@types/components/Select.d.ts +0 -7
- package/@types/components/SequentialNavigation.d.ts +0 -14
- package/@types/components/SideNavigation.d.ts +0 -18
- package/@types/components/SiteFooter.d.ts +0 -25
- package/@types/components/SiteHeader.d.ts +0 -20
- package/@types/components/SiteNavigation.d.ts +0 -13
- package/@types/components/SiteSearch.d.ts +0 -14
- package/@types/components/SkipLinks.d.ts +0 -13
- package/@types/components/SummaryCard.d.ts +0 -6
- package/@types/components/SummaryList.d.ts +0 -14
- package/@types/components/Table.d.ts +0 -8
- package/@types/components/Tabs.d.ts +0 -21
- package/@types/components/Tag.d.ts +0 -5
- package/@types/components/TaskList.d.ts +0 -22
- package/@types/components/TextInput.d.ts +0 -12
- package/@types/components/Textarea.d.ts +0 -4
- package/@types/components/WarningText.d.ts +0 -5
- package/@types/global.d.ts +0 -1
- package/@types/sgds.d.ts +0 -49
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -40
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/components/FeatureHeader/FeatureHeader.stories.tsx +0 -60
- package/src/components/FeatureHeader/FeatureHeader.tsx +0 -94
- 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
|
-
({
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
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-
|
|
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
|
-
}:
|
|
10
|
+
}: HideThisPageProps) => {
|
|
10
11
|
const ref = useRef(null);
|
|
11
12
|
|
|
12
13
|
useEffect(() => {
|
|
@@ -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
|
|
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
|
|
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-
|
|
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
|
-
}:
|
|
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=
|
|
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
|
-
}:
|
|
11
|
+
}: NotificationPanelProps) {
|
|
11
12
|
return (
|
|
12
13
|
<div
|
|
13
14
|
aria-live={ariaLive}
|
|
@@ -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
|
-
}:
|
|
10
|
+
}: PageHeaderProps) => {
|
|
9
11
|
return (
|
|
10
12
|
<header
|
|
11
13
|
className={[
|
|
@@ -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
|
|
13
|
+
description: 'Makes the page metadata use the truncated \'inline\' display'
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
args: {
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { MetdataItemProps, MetadataProps } from "./types";
|
|
2
|
+
|
|
3
|
+
const MetadataItem = ({
|
|
2
4
|
children,
|
|
3
5
|
className,
|
|
4
6
|
name,
|
|
5
7
|
...props
|
|
6
|
-
}:
|
|
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
|
-
}:
|
|
29
|
+
}: MetadataProps) => {
|
|
28
30
|
return (
|
|
29
31
|
<dl
|
|
30
32
|
className={[
|
|
@@ -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
|
-
}:
|
|
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:
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
9
|
+
}: PhaseBannerProps) => {
|
|
9
10
|
return (
|
|
10
11
|
<div
|
|
11
12
|
className={[
|
|
@@ -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
|
-
}:
|
|
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
|
|
27
|
+
{hintText && <HintText>{hintText}</HintText>}
|
|
27
28
|
{hasError && errorMessage && <ErrorMessage>{errorMessage}</ErrorMessage>}
|
|
28
29
|
{children}
|
|
29
30
|
</WrapperTag>
|
|
@@ -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
|
-
}:
|
|
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}
|
|
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
|
-
}:
|
|
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
|
|
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: (
|
|
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
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
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<
|
|
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
|
-
}:
|
|
55
|
+
}: SearchFacetsProps) => {
|
|
55
56
|
let facetCount = 0;
|
|
56
57
|
|
|
57
|
-
function processChild(item:
|
|
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: (
|
|
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
|
|
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
|
-
|
|
190
|
+
args: {},
|
|
191
|
+
render: ({ ...args }) => (
|
|
181
192
|
<Filters.Panel
|
|
182
|
-
|
|
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:
|
|
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
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
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
|
-
}:
|
|
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">
|