@nypl/design-system-react-components 0.25.7 → 0.25.10
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/CHANGELOG.md +119 -1
- package/README.md +1 -1
- package/dist/components/Button/Button.d.ts +6 -6
- package/dist/components/Button/ButtonTypes.d.ts +0 -1
- package/dist/components/Card/Card.d.ts +6 -4
- package/dist/components/Checkbox/Checkbox.d.ts +3 -2
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
- package/dist/components/DatePicker/DatePicker.d.ts +4 -3
- package/dist/components/Fieldset/Fieldset.d.ts +1 -3
- package/dist/components/Form/Form.d.ts +15 -14
- package/dist/components/Form/FormTypes.d.ts +2 -2
- package/dist/components/Heading/Heading.d.ts +7 -3
- package/dist/components/Heading/HeadingTypes.d.ts +6 -6
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +3 -3
- package/dist/components/Icons/Icon.d.ts +4 -4
- package/dist/components/Icons/IconSvgs.d.ts +1 -21
- package/dist/components/Icons/IconTypes.d.ts +1 -23
- package/dist/components/Image/Image.d.ts +11 -3
- package/dist/components/Image/ImageTypes.d.ts +3 -1
- package/dist/components/Link/LinkTypes.d.ts +1 -0
- package/dist/components/Logo/Logo.d.ts +28 -0
- package/dist/components/Logo/LogoSvgs.d.ts +18 -0
- package/dist/components/Logo/LogoTypes.d.ts +30 -0
- package/dist/components/Modal/Modal.d.ts +0 -4
- package/dist/components/Notification/Notification.d.ts +4 -2
- package/dist/components/Placeholder/Placeholder.d.ts +3 -5
- package/dist/components/Radio/Radio.d.ts +6 -5
- package/dist/components/RadioGroup/RadioGroup.d.ts +6 -5
- package/dist/components/SearchBar/SearchBar.d.ts +15 -7
- package/dist/components/Select/Select.d.ts +5 -2
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
- package/dist/components/Slider/Slider.d.ts +3 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
- package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
- package/dist/components/Table/Table.d.ts +29 -0
- package/dist/components/Template/Template.d.ts +30 -6
- package/dist/components/Text/Text.d.ts +2 -2
- package/dist/components/TextInput/TextInput.d.ts +4 -3
- package/dist/components/Toggle/Toggle.d.ts +48 -0
- package/dist/components/Toggle/ToggleSizes.d.ts +4 -0
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +17 -6
- package/dist/design-system-react-components.cjs.development.js +4698 -4405
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +5862 -5573
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +13 -8
- package/dist/resources.scss +0 -2
- package/dist/styles.css +2 -2
- package/dist/theme/components/breadcrumb.d.ts +1 -1
- package/dist/theme/components/button.d.ts +0 -12
- package/dist/theme/components/card.d.ts +14 -2
- package/dist/theme/components/customTable.d.ts +56 -0
- package/dist/theme/components/fieldset.d.ts +2 -2
- package/dist/theme/components/global.d.ts +1 -1
- package/dist/theme/components/heading.d.ts +4 -0
- package/dist/theme/components/label.d.ts +1 -1
- package/dist/theme/components/link.d.ts +14 -1
- package/dist/theme/components/list.d.ts +0 -2
- package/dist/theme/components/logo.d.ts +4 -0
- package/dist/theme/components/notification.d.ts +8 -4
- package/dist/theme/components/searchBar.d.ts +7 -13
- package/dist/theme/components/select.d.ts +1 -0
- package/dist/theme/components/structuredContent.d.ts +33 -0
- package/dist/theme/components/template.d.ts +10 -10
- package/dist/theme/components/textInput.d.ts +2 -0
- package/dist/theme/components/toggle.d.ts +71 -0
- package/dist/theme/foundations/spacing.d.ts +2 -0
- package/dist/utils/utils.d.ts +10 -0
- package/package.json +40 -37
- package/src/__tests__/utils/utils.test.ts +23 -1
- package/src/components/Accordion/Accordion.stories.mdx +16 -15
- package/src/components/Accordion/Accordion.test.tsx +45 -1
- package/src/components/Accordion/Accordion.tsx +20 -8
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
- package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
- package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
- package/src/components/Autosuggest/_Autosuggest.scss +2 -6
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +43 -13
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +25 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +103 -4
- package/src/components/Button/Button.stories.mdx +93 -48
- package/src/components/Button/Button.test.tsx +0 -12
- package/src/components/Button/Button.tsx +7 -8
- package/src/components/Button/ButtonTypes.tsx +0 -1
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
- package/src/components/Card/Card.stories.mdx +246 -64
- package/src/components/Card/Card.test.tsx +45 -22
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +75 -37
- package/src/components/Chakra/Box.stories.mdx +3 -3
- package/src/components/Chakra/Center.stories.mdx +5 -5
- package/src/components/Chakra/Flex.stories.mdx +113 -0
- package/src/components/Chakra/Grid.stories.mdx +14 -17
- package/src/components/Chakra/Stack.stories.mdx +2 -2
- package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
- package/src/components/Checkbox/Checkbox.tsx +13 -8
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
- package/src/components/DatePicker/DatePicker.test.tsx +14 -12
- package/src/components/DatePicker/DatePicker.tsx +13 -10
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +41 -22
- package/src/components/Fieldset/Fieldset.stories.mdx +20 -9
- package/src/components/Fieldset/Fieldset.tsx +2 -4
- package/src/components/Form/Form.stories.mdx +75 -49
- package/src/components/Form/Form.test.tsx +92 -3
- package/src/components/Form/Form.tsx +28 -23
- package/src/components/Form/FormTypes.tsx +2 -2
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
- package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
- package/src/components/Heading/Heading.stories.mdx +59 -23
- package/src/components/Heading/Heading.test.tsx +82 -18
- package/src/components/Heading/Heading.tsx +31 -31
- package/src/components/Heading/HeadingTypes.tsx +6 -6
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
- package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
- package/src/components/Hero/Hero.stories.mdx +72 -53
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +11 -9
- package/src/components/HorizontalRule/HorizontalRule.tsx +4 -6
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
- package/src/components/Icons/Icon.stories.mdx +77 -75
- package/src/components/Icons/Icon.tsx +4 -5
- package/src/components/Icons/IconSvgs.tsx +2 -42
- package/src/components/Icons/IconTypes.tsx +1 -24
- package/src/components/Image/Image.stories.mdx +214 -104
- package/src/components/Image/Image.test.tsx +10 -0
- package/src/components/Image/Image.tsx +21 -10
- package/src/components/Image/ImageTypes.ts +2 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
- package/src/components/Label/Label.stories.mdx +21 -20
- package/src/components/Link/Link.stories.mdx +103 -53
- package/src/components/Link/Link.test.tsx +108 -7
- package/src/components/Link/Link.tsx +58 -19
- package/src/components/Link/LinkTypes.tsx +1 -0
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +261 -0
- package/src/components/List/List.stories.mdx +37 -25
- package/src/components/List/List.tsx +1 -1
- package/src/components/Logo/Logo.stories.mdx +220 -0
- package/src/components/Logo/Logo.test.tsx +98 -0
- package/src/components/Logo/Logo.tsx +97 -0
- package/src/components/Logo/LogoSvgs.tsx +34 -0
- package/src/components/Logo/LogoTypes.tsx +32 -0
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
- package/src/components/Modal/Modal.stories.mdx +20 -5
- package/src/components/Modal/Modal.tsx +2 -8
- package/src/components/Notification/Notification.stories.mdx +96 -40
- package/src/components/Notification/Notification.test.tsx +62 -16
- package/src/components/Notification/Notification.tsx +26 -9
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +121 -0
- package/src/components/Pagination/Pagination.stories.mdx +19 -9
- package/src/components/Pagination/Pagination.tsx +3 -3
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +42 -0
- package/src/components/Placeholder/Placeholder.tsx +7 -14
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +74 -46
- package/src/components/Radio/Radio.stories.mdx +39 -19
- package/src/components/Radio/Radio.tsx +13 -9
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
- package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
- package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
- package/src/components/RadioGroup/RadioGroup.tsx +97 -94
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +24 -21
- package/src/components/SearchBar/SearchBar.Test.tsx +160 -34
- package/src/components/SearchBar/SearchBar.stories.mdx +116 -34
- package/src/components/SearchBar/SearchBar.tsx +70 -50
- package/src/components/Select/Select.stories.mdx +177 -66
- package/src/components/Select/Select.test.tsx +91 -2
- package/src/components/Select/Select.tsx +29 -13
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
- package/src/components/Slider/Slider.stories.mdx +74 -23
- package/src/components/Slider/Slider.test.tsx +35 -0
- package/src/components/Slider/Slider.tsx +22 -11
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +67 -30
- package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
- package/src/components/StatusBadge/StatusBadge.tsx +2 -1
- package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
- package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
- package/src/components/StructuredContent/StructuredContent.tsx +153 -0
- package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
- package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
- package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
- package/src/components/StyleGuide/ColorCard.tsx +1 -2
- package/src/components/StyleGuide/Colors.stories.mdx +3 -11
- package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
- package/src/components/StyleGuide/Forms.stories.mdx +2 -10
- package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
- package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
- package/src/components/StyleGuide/Typography.stories.mdx +64 -76
- package/src/components/Table/Table.stories.mdx +165 -0
- package/src/components/Table/Table.test.tsx +137 -0
- package/src/components/Table/Table.tsx +126 -0
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
- package/src/components/Tabs/Tabs.stories.mdx +20 -14
- package/src/components/Tabs/Tabs.test.tsx +21 -5
- package/src/components/Tabs/Tabs.tsx +33 -18
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
- package/src/components/Template/Template.stories.mdx +132 -49
- package/src/components/Template/Template.test.tsx +128 -6
- package/src/components/Template/Template.tsx +93 -13
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +169 -0
- package/src/components/Text/Text.stories.mdx +33 -11
- package/src/components/Text/Text.tsx +2 -2
- package/src/components/TextInput/TextInput.stories.mdx +84 -17
- package/src/components/TextInput/TextInput.test.tsx +96 -0
- package/src/components/TextInput/TextInput.tsx +12 -8
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
- package/src/components/Toggle/Toggle.stories.mdx +200 -0
- package/src/components/Toggle/Toggle.test.tsx +140 -0
- package/src/components/Toggle/Toggle.tsx +123 -0
- package/src/components/Toggle/ToggleSizes.tsx +4 -0
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +255 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +96 -25
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +103 -1
- package/src/components/VideoPlayer/VideoPlayer.tsx +72 -22
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +57 -3
- package/src/docs/Chakra.stories.mdx +5 -8
- package/src/docs/Intro.stories.mdx +2 -2
- package/src/index.ts +19 -6
- package/src/styles/base/_03-base.scss +1 -1
- package/src/styles/base/_place-holder.scss +7 -7
- package/src/styles.scss +1 -5
- package/src/theme/components/breadcrumb.ts +5 -5
- package/src/theme/components/button.ts +5 -12
- package/src/theme/components/card.ts +9 -7
- package/src/theme/components/checkbox.ts +1 -1
- package/src/theme/components/customTable.ts +63 -0
- package/src/theme/components/datePicker.ts +1 -1
- package/src/theme/components/global.ts +7 -7
- package/src/theme/components/heading.ts +13 -11
- package/src/theme/components/helperErrorText.ts +1 -1
- package/src/theme/components/icon.ts +2 -2
- package/src/theme/components/image.ts +9 -1
- package/src/theme/components/link.ts +17 -5
- package/src/theme/components/list.ts +1 -3
- package/src/theme/components/logo.ts +54 -0
- package/src/theme/components/notification.ts +9 -7
- package/src/theme/components/searchBar.ts +7 -13
- package/src/theme/components/select.ts +1 -0
- package/src/theme/components/statusBadge.ts +1 -1
- package/src/theme/components/structuredContent.ts +54 -0
- package/src/theme/components/template.ts +10 -10
- package/src/theme/components/text.ts +6 -6
- package/src/theme/components/textInput.ts +1 -0
- package/src/theme/components/toggle.ts +69 -0
- package/src/theme/components/videoPlayer.ts +0 -2
- package/src/theme/foundations/global.ts +2 -2
- package/src/theme/foundations/spacing.ts +3 -0
- package/src/theme/foundations/typography.ts +84 -12
- package/src/theme/index.ts +8 -0
- package/src/utils/componentCategories.ts +5 -2
- package/src/utils/utils.ts +17 -0
- package/dist/__tests__/utils/bem.test.d.ts +0 -1
- package/dist/components/CardEdition/CardEdition.d.ts +0 -21
- package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
- package/dist/components/Input/Input.d.ts +0 -36
- package/dist/components/Input/Input.stories.d.ts +0 -29
- package/dist/components/Input/InputTypes.d.ts +0 -6
- package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
- package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
- package/dist/helpers/getCSSVariable.d.ts +0 -1
- package/dist/interfaces.d.ts +0 -3
- package/dist/utils/bem.d.ts +0 -1
- package/src/__tests__/utils/bem.test.ts +0 -37
- package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
- package/src/components/CardEdition/CardEdition.test.tsx +0 -395
- package/src/components/CardEdition/CardEdition.tsx +0 -60
- package/src/components/CardEdition/_CardEdition.scss +0 -137
- package/src/components/Input/Input.stories.tsx +0 -133
- package/src/components/Input/Input.test.tsx +0 -266
- package/src/components/Input/Input.tsx +0 -81
- package/src/components/Input/InputTypes.tsx +0 -8
- package/src/components/Input/_Input.scss +0 -78
- package/src/components/StyleGuide/UIDocCard.tsx +0 -36
- package/src/helpers/CSSVariablesHelper.tsx +0 -34
- package/src/helpers/getCSSVariable.tsx +0 -5
- package/src/interfaces.ts +0 -3
- package/src/utils/bem.ts +0 -44
|
@@ -1,23 +1,26 @@
|
|
|
1
|
+
import { VStack } from "@chakra-ui/react";
|
|
1
2
|
import {
|
|
2
|
-
Meta,
|
|
3
|
-
Story,
|
|
4
|
-
Canvas,
|
|
5
3
|
ArgsTable,
|
|
4
|
+
Canvas,
|
|
6
5
|
Description,
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
Meta,
|
|
7
|
+
Story,
|
|
8
|
+
} from "@storybook/addon-docs";
|
|
9
9
|
import {
|
|
10
10
|
BrowserRouter as Router,
|
|
11
11
|
Link as ReactRouterLink,
|
|
12
12
|
} from "react-router-dom";
|
|
13
|
-
import {
|
|
13
|
+
import { withDesign } from "storybook-addon-designs";
|
|
14
14
|
|
|
15
15
|
import Link from "./Link";
|
|
16
16
|
import { LinkTypes } from "./LinkTypes";
|
|
17
17
|
import Icon from "../Icons/Icon";
|
|
18
|
-
import { IconAlign, IconSizes } from "../Icons/IconTypes";
|
|
18
|
+
import { IconAlign, IconNames, IconSizes } from "../Icons/IconTypes";
|
|
19
19
|
import { getCategory } from "../../utils/componentCategories";
|
|
20
20
|
import DSProvider from "../../theme/provider";
|
|
21
|
+
import { getStorybookEnumValues } from "../../utils/utils";
|
|
22
|
+
|
|
23
|
+
export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
|
|
21
24
|
|
|
22
25
|
<Meta
|
|
23
26
|
title={getCategory("Link")}
|
|
@@ -26,19 +29,20 @@ import DSProvider from "../../theme/provider";
|
|
|
26
29
|
parameters={{
|
|
27
30
|
design: {
|
|
28
31
|
type: "figma",
|
|
29
|
-
url:
|
|
30
|
-
"https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36854%3A24387",
|
|
32
|
+
url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36854%3A24387",
|
|
31
33
|
},
|
|
32
34
|
jest: ["Link.test.tsx"],
|
|
33
35
|
}}
|
|
34
36
|
argTypes={{
|
|
35
|
-
|
|
37
|
+
additionalStyles: { control: false },
|
|
38
|
+
attributes: { control: false },
|
|
36
39
|
children: { table: { disable: true } },
|
|
40
|
+
key: { table: { disable: true } },
|
|
41
|
+
ref: { table: { disable: true } },
|
|
37
42
|
type: {
|
|
38
|
-
control: {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
options: LinkTypes,
|
|
43
|
+
control: { type: "select" },
|
|
44
|
+
table: { defaultValue: { summary: "LinkTypes.Default" } },
|
|
45
|
+
options: enumValues.options,
|
|
42
46
|
},
|
|
43
47
|
}}
|
|
44
48
|
/>
|
|
@@ -48,29 +52,34 @@ import DSProvider from "../../theme/provider";
|
|
|
48
52
|
| Component Version | DS Version |
|
|
49
53
|
| ----------------- | ---------- |
|
|
50
54
|
| Added | `0.0.4` |
|
|
51
|
-
| Latest | `0.25.
|
|
55
|
+
| Latest | `0.25.9` |
|
|
52
56
|
|
|
53
57
|
<Description of={Link} />
|
|
54
58
|
|
|
55
59
|
<Canvas withToolbar>
|
|
56
60
|
<Story
|
|
57
|
-
name="
|
|
61
|
+
name="Link with Controls"
|
|
58
62
|
args={{
|
|
59
|
-
|
|
60
|
-
type: LinkTypes.Action,
|
|
61
|
-
href: "https://nypl.org",
|
|
62
|
-
className: "custom-class",
|
|
63
|
+
additionalStyles: undefined,
|
|
63
64
|
attributes: {
|
|
64
65
|
rel: "nofollow",
|
|
65
66
|
onClick: (e) => e.preventDefault(),
|
|
66
67
|
},
|
|
68
|
+
className: "custom-class",
|
|
69
|
+
href: "https://nypl.org",
|
|
70
|
+
id: "nypl-link",
|
|
71
|
+
type: "LinkTypes.Action",
|
|
67
72
|
}}
|
|
68
73
|
>
|
|
69
|
-
{(args) =>
|
|
74
|
+
{(args) => (
|
|
75
|
+
<Link {...args} type={enumValues.getValue(args.type)}>
|
|
76
|
+
Link
|
|
77
|
+
</Link>
|
|
78
|
+
)}
|
|
70
79
|
</Story>
|
|
71
80
|
</Canvas>
|
|
72
81
|
|
|
73
|
-
<ArgsTable story="
|
|
82
|
+
<ArgsTable story="Link with Controls" />
|
|
74
83
|
|
|
75
84
|
## Links With Icons
|
|
76
85
|
|
|
@@ -90,12 +99,20 @@ links with icons. Icons can be rendered to the left or right of the link text.
|
|
|
90
99
|
Clock Link
|
|
91
100
|
</Link>
|
|
92
101
|
<Link type={LinkTypes.Action} href="#passed-in-link">
|
|
93
|
-
<Icon
|
|
102
|
+
<Icon
|
|
103
|
+
name={IconNames.Check}
|
|
104
|
+
align={IconAlign.Left}
|
|
105
|
+
size={IconSizes.Small}
|
|
106
|
+
/>
|
|
94
107
|
Check Link
|
|
95
108
|
</Link>
|
|
96
109
|
<Link type={LinkTypes.Action} href="#passed-in-link-right">
|
|
97
110
|
Check Link Right
|
|
98
|
-
<Icon
|
|
111
|
+
<Icon
|
|
112
|
+
name={IconNames.Check}
|
|
113
|
+
align={IconAlign.Right}
|
|
114
|
+
size={IconSizes.Small}
|
|
115
|
+
/>
|
|
99
116
|
</Link>
|
|
100
117
|
</VStack>
|
|
101
118
|
</Story>
|
|
@@ -103,8 +120,29 @@ links with icons. Icons can be rendered to the left or right of the link text.
|
|
|
103
120
|
|
|
104
121
|
## Anchor Element Rendering
|
|
105
122
|
|
|
106
|
-
`Link` can wrap an existing `<a>`
|
|
107
|
-
an `<a>`
|
|
123
|
+
`Link` can wrap an existing `<a>` element (and `Icon` component) or it
|
|
124
|
+
can use the `href` prop to generate an `<a>` element.
|
|
125
|
+
|
|
126
|
+
```jsx
|
|
127
|
+
// Existing anchor element
|
|
128
|
+
<Link type={LinkTypes.Action}>
|
|
129
|
+
<a href="#existing-anchor-tag">link</a>
|
|
130
|
+
</Link>
|
|
131
|
+
|
|
132
|
+
// Also works with an icon component. Make sure to wrap the icon and anchor
|
|
133
|
+
// in a single element for this pattern.
|
|
134
|
+
<Link type={LinkTypes.Action}>
|
|
135
|
+
<>
|
|
136
|
+
<Icon name={IconNames.Check} align={IconAlign.Left} size={IconSizes.Small} />
|
|
137
|
+
<a href="#existing-anchor-tag">check link</a>
|
|
138
|
+
</>
|
|
139
|
+
</Link>
|
|
140
|
+
|
|
141
|
+
// Otherwise, the `href` prop will generate an `<a>` tag.
|
|
142
|
+
<Link type={LinkTypes.Action} href="#passed-in-link">
|
|
143
|
+
link
|
|
144
|
+
</Link>
|
|
145
|
+
```
|
|
108
146
|
|
|
109
147
|
<Canvas>
|
|
110
148
|
<Story name="Anchor Element Rendering">
|
|
@@ -113,11 +151,23 @@ an `<a>` tag.
|
|
|
113
151
|
<Link type={LinkTypes.Action}>
|
|
114
152
|
<a href="#existing-anchor-tag">link</a>
|
|
115
153
|
</Link>{" "}
|
|
116
|
-
with the <a>
|
|
154
|
+
with the <a> element as a child of the `Link` component. This is a{" "}
|
|
117
155
|
<Link type={LinkTypes.Action} href="#passed-in-link">
|
|
118
156
|
link
|
|
119
157
|
</Link>{" "}
|
|
120
|
-
where the Link component uses the `href` prop and has a string-only
|
|
158
|
+
where the `Link` component uses the `href` prop and has a string-only
|
|
159
|
+
child. Finally, this is a{" "}
|
|
160
|
+
<Link type={LinkTypes.Action}>
|
|
161
|
+
<>
|
|
162
|
+
<Icon
|
|
163
|
+
name={IconNames.Check}
|
|
164
|
+
align={IconAlign.Left}
|
|
165
|
+
size={IconSizes.Small}
|
|
166
|
+
/>
|
|
167
|
+
<a href="#existing-anchor-tag">link</a>
|
|
168
|
+
</>
|
|
169
|
+
</Link>{" "}
|
|
170
|
+
with a check icon.
|
|
121
171
|
</>
|
|
122
172
|
</Story>
|
|
123
173
|
</Canvas>
|
|
@@ -145,9 +195,11 @@ an `<a>` tag.
|
|
|
145
195
|
|
|
146
196
|
The Design System's `Link` component should wrap around `react-router`'s own
|
|
147
197
|
`Link` component. To avoid name conflicts, rename either the Design System's
|
|
148
|
-
or `react-router`'s `Link` component.
|
|
198
|
+
or `react-router`'s `Link` component. Any of the following patterns are valid.
|
|
149
199
|
|
|
150
200
|
```jsx
|
|
201
|
+
// In this first example, React Router's `Link` component
|
|
202
|
+
// is renamed as `ReactRouterLink`.
|
|
151
203
|
import {
|
|
152
204
|
BrowserRouter as Router,
|
|
153
205
|
Link as ReactRouterLink,
|
|
@@ -158,8 +210,9 @@ import { Link, LinkTypes } from "@nypl/design-system-react-components";
|
|
|
158
210
|
<ReactRouterLink to="#">Next Page</ReactRouterLink>
|
|
159
211
|
</Link>;
|
|
160
212
|
|
|
161
|
-
//
|
|
162
|
-
|
|
213
|
+
// In this second example, React Router's `Link` component
|
|
214
|
+
// is not renamed but the DS's `Link` component is renamed
|
|
215
|
+
// to `DSLink`.
|
|
163
216
|
import { BrowserRouter, Link } from "react-router-dom";
|
|
164
217
|
import {
|
|
165
218
|
Link as DSLink,
|
|
@@ -170,8 +223,9 @@ import {
|
|
|
170
223
|
<Link to="#">Next Page</Link>
|
|
171
224
|
</DSLink>;
|
|
172
225
|
|
|
173
|
-
//
|
|
174
|
-
|
|
226
|
+
// In this third example, React Router's `Link` component
|
|
227
|
+
// is not renamed and the DS's `Link` component is
|
|
228
|
+
// imported and rendered as `DS.Link`.
|
|
175
229
|
import { BrowserRouter, Link } from "react-router-dom";
|
|
176
230
|
import DS from "@nypl/design-system-react-components";
|
|
177
231
|
|
|
@@ -201,34 +255,30 @@ pages in a NextJS app.
|
|
|
201
255
|
```jsx
|
|
202
256
|
import { Link, LinkTypes } from "@nypl/design-system-react-components";
|
|
203
257
|
|
|
204
|
-
|
|
258
|
+
/**
|
|
259
|
+
* This is just an example wrapper that works similarly to NextJS' `Link`
|
|
205
260
|
* component. In real life, NextJS's `Link` component will pass down the
|
|
206
261
|
* `href` and `passHref` props and a `ref` to make routing functional.
|
|
207
262
|
*/
|
|
208
|
-
export const NextJsLink = (props: HTMLAnchorElement) =>
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
);
|
|
217
|
-
|
|
263
|
+
export const NextJsLink = (props: HTMLAnchorElement) =>
|
|
264
|
+
React.cloneElement(
|
|
265
|
+
props.children,
|
|
266
|
+
{ ...props },
|
|
267
|
+
props.children.props.children
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
// Note that NextJS' `href` and `passHref` props are required.
|
|
218
271
|
<NextJsLink href="#" passHref>
|
|
219
272
|
<Link type={LinkTypes.Action}>Next Page</Link>
|
|
220
273
|
</NextJsLink>;
|
|
221
274
|
```
|
|
222
275
|
|
|
223
|
-
export const NextJsLink = (props) =>
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
)}
|
|
230
|
-
</div>
|
|
231
|
-
);
|
|
276
|
+
export const NextJsLink = (props) =>
|
|
277
|
+
React.cloneElement(
|
|
278
|
+
props.children,
|
|
279
|
+
{ ...props },
|
|
280
|
+
props.children.props.children
|
|
281
|
+
);
|
|
232
282
|
|
|
233
283
|
<Canvas>
|
|
234
284
|
<DSProvider>
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
1
|
import { render, screen } from "@testing-library/react";
|
|
3
2
|
import { axe } from "jest-axe";
|
|
4
|
-
|
|
5
|
-
import Link from "./Link";
|
|
6
|
-
import { LinkTypes } from "./LinkTypes";
|
|
3
|
+
import * as React from "react";
|
|
7
4
|
import {
|
|
8
5
|
BrowserRouter as Router,
|
|
9
6
|
Link as ReactRouterLink,
|
|
10
7
|
} from "react-router-dom";
|
|
8
|
+
import renderer from "react-test-renderer";
|
|
9
|
+
|
|
10
|
+
import Link from "./Link";
|
|
11
|
+
import { LinkTypes } from "./LinkTypes";
|
|
11
12
|
import Icon from "../Icons/Icon";
|
|
12
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
IconAlign,
|
|
15
|
+
IconNames,
|
|
16
|
+
IconRotationTypes,
|
|
17
|
+
IconSizes,
|
|
18
|
+
} from "../Icons/IconTypes";
|
|
13
19
|
|
|
14
20
|
describe("Link Accessibility", () => {
|
|
15
21
|
it("passes axe accessibility test for children component", async () => {
|
|
@@ -120,11 +126,11 @@ describe("Link", () => {
|
|
|
120
126
|
|
|
121
127
|
it("throws an error if text is passed but no url is passed", () => {
|
|
122
128
|
expect(() => render(<Link>Test</Link>)).toThrowError(
|
|
123
|
-
"Link needs
|
|
129
|
+
"`Link` needs the `href` prop."
|
|
124
130
|
);
|
|
125
131
|
});
|
|
126
132
|
|
|
127
|
-
it("throws an error if more than one child is passed", () => {
|
|
133
|
+
it("throws an error if more than one child element is passed", () => {
|
|
128
134
|
expect(() =>
|
|
129
135
|
render(
|
|
130
136
|
<Link>
|
|
@@ -139,6 +145,101 @@ describe("Link", () => {
|
|
|
139
145
|
).toThrowError("Please pass only one child into `Link`.");
|
|
140
146
|
});
|
|
141
147
|
|
|
148
|
+
it("renders the UI snapshot correctly", () => {
|
|
149
|
+
const standard = renderer
|
|
150
|
+
.create(
|
|
151
|
+
<Link href="#passed-in-link" id="standard-link" type={LinkTypes.Action}>
|
|
152
|
+
Standard
|
|
153
|
+
</Link>
|
|
154
|
+
)
|
|
155
|
+
.toJSON();
|
|
156
|
+
const typeForwards = renderer
|
|
157
|
+
.create(
|
|
158
|
+
<Link
|
|
159
|
+
href="#passed-in-link"
|
|
160
|
+
id="forwards-link"
|
|
161
|
+
type={LinkTypes.Forwards}
|
|
162
|
+
>
|
|
163
|
+
Forwards
|
|
164
|
+
</Link>
|
|
165
|
+
)
|
|
166
|
+
.toJSON();
|
|
167
|
+
const typeBackwards = renderer
|
|
168
|
+
.create(
|
|
169
|
+
<Link
|
|
170
|
+
href="#passed-in-link"
|
|
171
|
+
id="backwards-link"
|
|
172
|
+
type={LinkTypes.Backwards}
|
|
173
|
+
>
|
|
174
|
+
Backwards
|
|
175
|
+
</Link>
|
|
176
|
+
)
|
|
177
|
+
.toJSON();
|
|
178
|
+
const typeExternal = renderer
|
|
179
|
+
.create(
|
|
180
|
+
<Link
|
|
181
|
+
href="#passed-in-link"
|
|
182
|
+
id="external-link"
|
|
183
|
+
type={LinkTypes.External}
|
|
184
|
+
>
|
|
185
|
+
External
|
|
186
|
+
</Link>
|
|
187
|
+
)
|
|
188
|
+
.toJSON();
|
|
189
|
+
const typeButton = renderer
|
|
190
|
+
.create(
|
|
191
|
+
<Link href="#passed-in-link" id="button-link" type={LinkTypes.Button}>
|
|
192
|
+
Button
|
|
193
|
+
</Link>
|
|
194
|
+
)
|
|
195
|
+
.toJSON();
|
|
196
|
+
const withIconChild = renderer
|
|
197
|
+
.create(
|
|
198
|
+
<Link href="#passed-in-link" id="icon-link" type={LinkTypes.Action}>
|
|
199
|
+
<Icon
|
|
200
|
+
align={IconAlign.Left}
|
|
201
|
+
className="more-link"
|
|
202
|
+
iconRotation={IconRotationTypes.Rotate0}
|
|
203
|
+
id="link-icon"
|
|
204
|
+
name={IconNames.Download}
|
|
205
|
+
/>
|
|
206
|
+
Download
|
|
207
|
+
</Link>
|
|
208
|
+
)
|
|
209
|
+
.toJSON();
|
|
210
|
+
const withAchorChild = renderer
|
|
211
|
+
.create(
|
|
212
|
+
<Link id="anchor-link" type={LinkTypes.Action}>
|
|
213
|
+
<a href="#existing-anchor-tag">check link</a>
|
|
214
|
+
</Link>
|
|
215
|
+
)
|
|
216
|
+
.toJSON();
|
|
217
|
+
const withAchorChildAndIcon = renderer
|
|
218
|
+
.create(
|
|
219
|
+
<Link id="anchor-icon-link" type={LinkTypes.Action}>
|
|
220
|
+
<>
|
|
221
|
+
<Icon
|
|
222
|
+
align={IconAlign.Left}
|
|
223
|
+
id="link-icon"
|
|
224
|
+
name={IconNames.Check}
|
|
225
|
+
size={IconSizes.Small}
|
|
226
|
+
/>
|
|
227
|
+
<a href="#existing-anchor-tag">check link</a>
|
|
228
|
+
</>
|
|
229
|
+
</Link>
|
|
230
|
+
)
|
|
231
|
+
.toJSON();
|
|
232
|
+
|
|
233
|
+
expect(standard).toMatchSnapshot();
|
|
234
|
+
expect(typeForwards).toMatchSnapshot();
|
|
235
|
+
expect(typeBackwards).toMatchSnapshot();
|
|
236
|
+
expect(typeExternal).toMatchSnapshot();
|
|
237
|
+
expect(typeButton).toMatchSnapshot();
|
|
238
|
+
expect(withIconChild).toMatchSnapshot();
|
|
239
|
+
expect(withAchorChild).toMatchSnapshot();
|
|
240
|
+
expect(withAchorChildAndIcon).toMatchSnapshot();
|
|
241
|
+
});
|
|
242
|
+
|
|
142
243
|
// TODO:
|
|
143
244
|
// it("Passes the ref to the input element", () => {
|
|
144
245
|
// const ref = React.createRef<HTMLAnchorElement>();
|
|
@@ -27,7 +27,7 @@ export interface LinkProps {
|
|
|
27
27
|
* Renders the `Link` children components with a direction arrow icon based
|
|
28
28
|
* on the `Backwards` or `Forwards` `LinkTypes` type.
|
|
29
29
|
*/
|
|
30
|
-
function getWithDirectionIcon(children, type: LinkTypes) {
|
|
30
|
+
function getWithDirectionIcon(children, type: LinkTypes, linkId) {
|
|
31
31
|
let iconRotation;
|
|
32
32
|
let iconAlign;
|
|
33
33
|
let icon = null;
|
|
@@ -42,12 +42,15 @@ function getWithDirectionIcon(children, type: LinkTypes) {
|
|
|
42
42
|
iconAlign = IconAlign.Right;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
const iconId = `${linkId}-icon`;
|
|
46
|
+
|
|
45
47
|
icon = (
|
|
46
48
|
<Icon
|
|
47
|
-
name={IconNames.Arrow}
|
|
48
49
|
align={iconAlign}
|
|
49
|
-
iconRotation={iconRotation}
|
|
50
50
|
className="more-link"
|
|
51
|
+
iconRotation={iconRotation}
|
|
52
|
+
id={iconId}
|
|
53
|
+
name={IconNames.Arrow}
|
|
51
54
|
/>
|
|
52
55
|
);
|
|
53
56
|
|
|
@@ -60,6 +63,25 @@ function getWithDirectionIcon(children, type: LinkTypes) {
|
|
|
60
63
|
);
|
|
61
64
|
}
|
|
62
65
|
|
|
66
|
+
function getExternalIcon(children, linkId) {
|
|
67
|
+
const iconId = `${linkId}-icon`;
|
|
68
|
+
const icon = (
|
|
69
|
+
<Icon
|
|
70
|
+
align={IconAlign.Right}
|
|
71
|
+
className="more-link"
|
|
72
|
+
id={iconId}
|
|
73
|
+
name={IconNames.ActionLaunch}
|
|
74
|
+
/>
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<>
|
|
79
|
+
{children}
|
|
80
|
+
{icon}
|
|
81
|
+
</>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
63
85
|
/**
|
|
64
86
|
* A component that uses an `href` prop or a child anchor element, to create
|
|
65
87
|
* an anchor element with added styling and conventions.
|
|
@@ -87,25 +109,31 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
87
109
|
let variant = "link";
|
|
88
110
|
|
|
89
111
|
if (typeof children === "string" && !href) {
|
|
90
|
-
throw new Error("Link needs
|
|
112
|
+
throw new Error("`Link` needs the `href` prop.");
|
|
91
113
|
}
|
|
92
114
|
|
|
93
115
|
if (
|
|
94
116
|
type === LinkTypes.Action ||
|
|
95
117
|
type === LinkTypes.Forwards ||
|
|
96
|
-
type === LinkTypes.Backwards
|
|
118
|
+
type === LinkTypes.Backwards ||
|
|
119
|
+
type === LinkTypes.External
|
|
97
120
|
) {
|
|
98
121
|
variant = "moreLink";
|
|
99
122
|
} else if (type === LinkTypes.Button) {
|
|
100
123
|
variant = "button";
|
|
101
124
|
}
|
|
102
125
|
const style = useStyleConfig("Link", { variant });
|
|
103
|
-
// Render with specific direction arrows
|
|
104
|
-
//
|
|
126
|
+
// Render with specific direction arrows if the type is
|
|
127
|
+
// Forwards or Backwards. Or render with the launch icon
|
|
128
|
+
// if the type is External. Otherwise, do not add an icon.
|
|
105
129
|
const newChildren =
|
|
106
|
-
type === LinkTypes.Forwards || type === LinkTypes.Backwards
|
|
107
|
-
|
|
108
|
-
|
|
130
|
+
((type === LinkTypes.Forwards || type === LinkTypes.Backwards) &&
|
|
131
|
+
getWithDirectionIcon(children, type, id)) ||
|
|
132
|
+
(type === LinkTypes.External && getExternalIcon(children, id)) ||
|
|
133
|
+
children;
|
|
134
|
+
|
|
135
|
+
const rel = type === LinkTypes.External ? "nofollow" : null;
|
|
136
|
+
const target = type === LinkTypes.External ? "_blank" : null;
|
|
109
137
|
|
|
110
138
|
if (!href) {
|
|
111
139
|
// React Types error makes this fail:
|
|
@@ -116,15 +144,24 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
116
144
|
}
|
|
117
145
|
const childrenToClone: any = children[0] ? children[0] : children;
|
|
118
146
|
const childProps = childrenToClone.props;
|
|
119
|
-
return
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
147
|
+
return (
|
|
148
|
+
<Box as="span" __css={style}>
|
|
149
|
+
{React.cloneElement(
|
|
150
|
+
childrenToClone,
|
|
151
|
+
{
|
|
152
|
+
className,
|
|
153
|
+
...linkProps,
|
|
154
|
+
...childProps,
|
|
155
|
+
ref,
|
|
156
|
+
rel,
|
|
157
|
+
target,
|
|
158
|
+
// Useful if more styles are needed for the custom
|
|
159
|
+
// anchor element or link component.
|
|
160
|
+
style: additionalStyles,
|
|
161
|
+
},
|
|
162
|
+
[childrenToClone.props.children]
|
|
163
|
+
)}
|
|
164
|
+
</Box>
|
|
128
165
|
);
|
|
129
166
|
} else {
|
|
130
167
|
return (
|
|
@@ -132,6 +169,8 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
132
169
|
as="a"
|
|
133
170
|
className={className}
|
|
134
171
|
ref={ref}
|
|
172
|
+
rel={rel}
|
|
173
|
+
target={target}
|
|
135
174
|
{...linkProps}
|
|
136
175
|
__css={{ ...style, ...additionalStyles }}
|
|
137
176
|
>
|