@nypl/design-system-react-components 0.25.1 → 0.25.5
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 +118 -1
- package/README.md +98 -50
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
- package/dist/components/Button/Button.d.ts +13 -8
- package/dist/components/Button/ButtonTypes.d.ts +2 -1
- package/dist/components/Card/Card.d.ts +36 -52
- package/dist/components/Card/CardTypes.d.ts +0 -15
- package/dist/components/Checkbox/Checkbox.d.ts +17 -13
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -2
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
- package/dist/components/DatePicker/DatePicker.d.ts +36 -34
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
- package/dist/components/Icons/Icon.d.ts +8 -0
- package/dist/components/Icons/IconSvgs.d.ts +11 -0
- package/dist/components/Icons/IconTypes.d.ts +11 -0
- package/dist/components/Image/Image.d.ts +19 -9
- package/dist/components/Image/ImageTypes.d.ts +20 -0
- package/dist/components/Link/Link.d.ts +4 -0
- package/dist/components/List/List.d.ts +19 -14
- package/dist/components/Notification/Notification.d.ts +37 -16
- package/dist/components/Pagination/Pagination.d.ts +16 -13
- package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
- package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
- package/dist/components/Radio/Radio.d.ts +2 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
- package/dist/components/SearchBar/SearchBar.d.ts +3 -3
- package/dist/components/Select/Select.d.ts +2 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +12 -0
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
- package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
- package/dist/design-system-react-components.cjs.development.js +6131 -3715
- 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 +6124 -3699
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
- package/dist/hooks/useCarouselStyles.d.ts +16 -0
- package/dist/hooks/useNYPLTheme.d.ts +54 -0
- package/dist/hooks/useWindowSize.d.ts +10 -0
- package/dist/index.d.ts +13 -8
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- package/dist/theme/components/button.d.ts +22 -8
- package/dist/theme/components/card.d.ts +168 -0
- package/dist/theme/components/checkbox.d.ts +5 -1
- package/dist/theme/components/checkboxGroup.d.ts +12 -0
- package/dist/theme/components/componentWrapper.d.ts +11 -0
- package/dist/theme/components/datePicker.d.ts +16 -0
- package/dist/theme/components/fieldset.d.ts +27 -0
- package/dist/theme/components/global.d.ts +23 -13
- package/dist/theme/components/globalMixins.d.ts +9 -1
- package/dist/theme/components/heading.d.ts +5 -0
- package/dist/theme/components/helperErrorText.d.ts +10 -0
- package/dist/theme/components/hero.d.ts +1 -0
- package/dist/theme/components/horizontalRule.d.ts +14 -0
- package/dist/theme/components/image.d.ts +31 -0
- package/dist/theme/components/label.d.ts +5 -3
- package/dist/theme/components/link.d.ts +4 -0
- package/dist/theme/components/list.d.ts +89 -0
- package/dist/theme/components/notification.d.ts +75 -0
- package/dist/theme/components/pagination.d.ts +19 -0
- package/dist/theme/components/progressIndicator.d.ts +50 -0
- package/dist/theme/components/radioGroup.d.ts +12 -0
- package/dist/theme/components/select.d.ts +11 -2
- package/dist/theme/components/skeletonLoader.d.ts +98 -0
- package/dist/theme/components/slider.d.ts +51 -0
- package/dist/theme/components/tabs.d.ts +54 -3
- package/dist/theme/components/textInput.d.ts +8 -1
- package/dist/theme/components/videoPlayer.d.ts +40 -0
- package/dist/theme/foundations/breakpoints.d.ts +8 -8
- package/dist/theme/foundations/global.d.ts +6 -1
- package/dist/theme/foundations/radii.d.ts +5 -0
- package/dist/theme/foundations/spacing.d.ts +16 -16
- package/package.json +72 -83
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +39 -44
- package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +2 -1
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +14 -10
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +23 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +199 -1
- package/src/components/Button/Button.stories.mdx +15 -10
- package/src/components/Button/Button.test.tsx +21 -7
- package/src/components/Button/Button.tsx +22 -34
- package/src/components/Button/ButtonTypes.tsx +1 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
- package/src/components/Card/Card.stories.mdx +296 -259
- package/src/components/Card/Card.test.tsx +156 -84
- package/src/components/Card/Card.tsx +195 -145
- package/src/components/Card/CardTypes.tsx +0 -17
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
- package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
- package/src/components/CardEdition/_CardEdition.scss +22 -23
- package/src/components/Chakra/Box.stories.mdx +15 -16
- package/src/components/Chakra/Center.stories.mdx +31 -16
- package/src/components/Chakra/Grid.stories.mdx +28 -15
- package/src/components/Chakra/Stack.stories.mdx +35 -18
- package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
- package/src/components/Checkbox/Checkbox.test.tsx +47 -2
- package/src/components/Checkbox/Checkbox.tsx +39 -33
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +29 -2
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -18
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +47 -81
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
- package/src/components/DatePicker/DatePicker.test.tsx +264 -64
- package/src/components/DatePicker/DatePicker.tsx +159 -128
- package/src/components/DatePicker/_DatePicker.scss +33 -67
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
- package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
- package/src/components/Fieldset/Fieldset.test.tsx +125 -0
- package/src/components/Fieldset/Fieldset.tsx +52 -0
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
- package/src/components/Form/Form.stories.mdx +24 -6
- package/src/components/Form/Form.test.tsx +1 -1
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
- package/src/components/Grid/SimpleGrid.test.tsx +4 -4
- package/src/components/Heading/Heading.stories.mdx +3 -4
- package/src/components/Heading/Heading.tsx +5 -5
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
- package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
- package/src/components/Hero/Hero.stories.mdx +12 -2
- package/src/components/Hero/Hero.tsx +1 -1
- package/src/components/Hero/HeroTypes.tsx +1 -0
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
- package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
- package/src/components/Icons/Icon.stories.mdx +12 -4
- package/src/components/Icons/Icon.test.tsx +18 -0
- package/src/components/Icons/Icon.tsx +16 -1
- package/src/components/Icons/IconSvgs.tsx +22 -0
- package/src/components/Icons/IconTypes.tsx +11 -0
- package/src/components/Image/Image.stories.mdx +220 -0
- package/src/components/Image/Image.test.tsx +131 -29
- package/src/components/Image/Image.tsx +84 -56
- package/src/components/Image/ImageTypes.ts +22 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
- package/src/components/Input/Input.stories.tsx +23 -67
- package/src/components/Input/Input.test.tsx +4 -4
- package/src/components/Input/_Input.scss +23 -14
- package/src/components/Link/Link.tsx +4 -1
- package/src/components/List/List.stories.mdx +124 -49
- package/src/components/List/List.test.tsx +142 -63
- package/src/components/List/List.tsx +89 -93
- package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
- package/src/components/Modal/Modal.stories.mdx +3 -3
- package/src/components/Modal/_Modal.scss +2 -2
- package/src/components/Notification/Notification.stories.mdx +109 -112
- package/src/components/Notification/Notification.test.tsx +99 -110
- package/src/components/Notification/Notification.tsx +156 -159
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
- package/src/components/Pagination/Pagination.stories.mdx +26 -27
- package/src/components/Pagination/Pagination.stories.tsx +11 -16
- package/src/components/Pagination/Pagination.test.tsx +276 -146
- package/src/components/Pagination/Pagination.tsx +174 -154
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
- package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
- package/src/components/Radio/Radio.test.tsx +20 -4
- package/src/components/Radio/Radio.tsx +6 -3
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
- package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
- package/src/components/RadioGroup/RadioGroup.tsx +19 -19
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
- package/src/components/SearchBar/SearchBar.Test.tsx +20 -1
- package/src/components/SearchBar/SearchBar.stories.mdx +113 -8
- package/src/components/SearchBar/SearchBar.tsx +20 -10
- package/src/components/Select/Select.test.tsx +12 -0
- package/src/components/Select/Select.tsx +5 -2
- package/src/components/Select/SelectTypes.tsx +1 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
- package/src/components/Slider/Slider.stories.mdx +529 -0
- package/src/components/Slider/Slider.test.tsx +653 -0
- package/src/components/Slider/Slider.tsx +303 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
- package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
- package/src/components/StyleGuide/Buttons.stories.mdx +89 -73
- package/src/components/StyleGuide/ColorCard.tsx +46 -0
- package/src/components/StyleGuide/Colors.stories.mdx +171 -311
- package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
- package/src/components/StyleGuide/Forms.stories.mdx +9 -7
- package/src/components/StyleGuide/Iconography.stories.mdx +85 -91
- package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
- package/src/components/StyleGuide/Typography.stories.mdx +202 -189
- package/src/components/StyleGuide/UIDocCard.tsx +1 -1
- package/src/components/Tabs/Tabs.stories.mdx +73 -11
- package/src/components/Tabs/Tabs.tsx +87 -64
- package/src/components/Template/Template.stories.mdx +25 -27
- package/src/components/TextInput/TextInput.stories.mdx +1 -1
- package/src/components/TextInput/TextInput.test.tsx +22 -2
- package/src/components/TextInput/TextInput.tsx +28 -8
- package/src/components/TextInput/TextInputTypes.tsx +2 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
- package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
- package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
- package/src/docs/Chakra.stories.mdx +244 -63
- package/src/docs/Intro.stories.mdx +5 -2
- package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
- package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
- package/src/hooks/useCarouselStyles.ts +34 -0
- package/src/hooks/useNYPLTheme.ts +67 -0
- package/src/hooks/useWindowSize.ts +40 -0
- package/src/index.ts +22 -19
- package/src/resources.scss +5 -5
- package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
- package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
- package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
- package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
- package/src/styles/base/_place-holder.scss +14 -3
- package/src/styles/{03-space → space}/_space-inline.scss +14 -14
- package/src/styles/{03-space → space}/_space-inset.scss +10 -10
- package/src/styles/space/_space-stack.scss +116 -0
- package/src/styles.scss +13 -60
- package/src/theme/components/button.ts +21 -15
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +8 -3
- package/src/theme/components/checkboxGroup.ts +8 -0
- package/src/theme/components/componentWrapper.ts +10 -0
- package/src/theme/components/datePicker.ts +17 -0
- package/src/theme/components/fieldset.ts +18 -0
- package/src/theme/components/global.ts +26 -15
- package/src/theme/components/globalMixins.ts +9 -1
- package/src/theme/components/heading.ts +10 -5
- package/src/theme/components/helperErrorText.ts +9 -0
- package/src/theme/components/hero.ts +4 -3
- package/src/theme/components/horizontalRule.ts +13 -0
- package/src/theme/components/icon.ts +9 -9
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +3 -10
- package/src/theme/components/link.ts +5 -1
- package/src/theme/components/list.ts +73 -0
- package/src/theme/components/notification.ts +93 -0
- package/src/theme/components/pagination.ts +20 -0
- package/src/theme/components/progressIndicator.ts +62 -0
- package/src/theme/components/radio.ts +2 -2
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/select.ts +6 -3
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/statusBadge.ts +1 -2
- package/src/theme/components/tabs.ts +49 -19
- package/src/theme/components/template.ts +8 -8
- package/src/theme/components/textInput.ts +5 -4
- package/src/theme/components/videoPlayer.ts +49 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/global.ts +6 -1
- package/src/theme/foundations/radii.ts +6 -0
- package/src/theme/foundations/spacing.ts +24 -24
- package/src/theme/index.ts +41 -10
- package/src/utils/componentCategories.ts +4 -3
- package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
- package/dist/components/Image/Image.stories.d.ts +0 -18
- package/dist/components/List/List.stories.d.ts +0 -7
- package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
- package/dist/theme/components/customRadioGroup.d.ts +0 -18
- package/src/components/Button/_Button.scss +0 -32
- package/src/components/Card/_Card.scss +0 -308
- package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
- package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
- package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/List/List.stories.tsx +0 -139
- package/src/components/List/_List.scss +0 -76
- package/src/components/Notification/_Notification.scss +0 -110
- package/src/components/Pagination/_Pagination.scss +0 -40
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
- package/src/styles/01-colors/_colors-brand.scss +0 -62
- package/src/styles/01-colors/_colors-utility.scss +0 -67
- package/src/styles/02-typography/_type-scale.css +0 -11
- package/src/styles/02-typography/_type-weight.css +0 -7
- package/src/styles/02-typography/_typefaces.css +0 -4
- package/src/styles/03-space/_space-stack.scss +0 -116
- package/src/styles/03-space/_space.css +0 -30
- package/src/styles/base/_card-grid.scss +0 -78
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customCheckboxGroup.ts +0 -12
- package/src/theme/components/customRadioGroup.ts +0 -12
|
@@ -70,12 +70,20 @@ export const animalCrossing = [
|
|
|
70
70
|
{
|
|
71
71
|
label: "Mr. Resetti",
|
|
72
72
|
content:
|
|
73
|
-
"<strong>Mr. Resetti</strong>, full name Sonny Resetti, is a fictional
|
|
73
|
+
"<strong>Mr. Resetti</strong>, full name Sonny Resetti, is a fictional " +
|
|
74
|
+
"character from the Animal Crossing series of video games by Nintendo. " +
|
|
75
|
+
"His first appearance was in the Nintendo 64 game Dōbutsu no Mori, " +
|
|
76
|
+
"released in Europe and North America on the GameCube as Animal Crossing.",
|
|
74
77
|
},
|
|
75
78
|
{
|
|
76
79
|
label: "Zucker",
|
|
77
80
|
content:
|
|
78
|
-
"<strong>Zucker</strong> is a lazy octopus villager who first appeared
|
|
81
|
+
"<strong>Zucker</strong> is a lazy octopus villager who first appeared " +
|
|
82
|
+
"in New Leaf. His Japanese name and general appearance refers to the " +
|
|
83
|
+
"Japanese snack takoyaki, which is a fried ball of dough commonly " +
|
|
84
|
+
"filled with minced octopus. His catchphrase is a reference to how he " +
|
|
85
|
+
"is an underwater animal. He has the same initial phrase as Bertha. He " +
|
|
86
|
+
"has the nature hobby.",
|
|
79
87
|
},
|
|
80
88
|
];
|
|
81
89
|
|
|
@@ -100,8 +108,13 @@ _Note: this is the recommended approach._
|
|
|
100
108
|
|
|
101
109
|
We recommended passing in the data for the `Tabs` component through the `data`
|
|
102
110
|
prop. This allows the consumer to pass in well-formed data and always generate
|
|
103
|
-
the correct DOM.
|
|
104
|
-
|
|
111
|
+
the correct DOM.
|
|
112
|
+
|
|
113
|
+
Internally in the DS `Tabs` component:
|
|
114
|
+
|
|
115
|
+
- we map through the data array and generate the appropriate components needed
|
|
116
|
+
for the layout.
|
|
117
|
+
- adds the carousel feature for the mobile view.
|
|
105
118
|
|
|
106
119
|
Note that HTML is allowed in the `content` property in each object as part of the
|
|
107
120
|
string or as straight HTML.
|
|
@@ -122,12 +135,36 @@ const animalCrossing = [
|
|
|
122
135
|
content:
|
|
123
136
|
"<p>Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is ...",
|
|
124
137
|
},
|
|
138
|
+
{
|
|
139
|
+
label: "Mr. Resetti",
|
|
140
|
+
content:
|
|
141
|
+
"<strong>Mr. Resetti</strong>, full name Sonny Resetti, is a ...",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
label: "Zucker",
|
|
145
|
+
content:
|
|
146
|
+
"<strong>Zucker</strong> is a lazy octopus villager who first ...",
|
|
147
|
+
},
|
|
125
148
|
];
|
|
126
149
|
|
|
127
150
|
// ...
|
|
128
151
|
<Tabs contentData={animalCrossing} />;
|
|
129
152
|
```
|
|
130
153
|
|
|
154
|
+
## Responsive Mobile Carousel
|
|
155
|
+
|
|
156
|
+
For both, the `contentData` prop approach and the children component approach
|
|
157
|
+
(described below in this document), the mobile carousel feature is built. This
|
|
158
|
+
adds "previous" and "next" arrows in the tab list for users to scroll through
|
|
159
|
+
all the tabs while the panel stays static.
|
|
160
|
+
|
|
161
|
+
Note that for the children component approach, we expect a `TabList` component
|
|
162
|
+
to be passed or else the mobile carousel will _not_ be built. More on this in
|
|
163
|
+
the [With Children Components](#with-children-components) section.
|
|
164
|
+
|
|
165
|
+
To view and test this in Storybook, go to the "Canvas" tab and change the
|
|
166
|
+
viewport in the Storybook toolbar at the top of the page.
|
|
167
|
+
|
|
131
168
|
## With Callback Event Function
|
|
132
169
|
|
|
133
170
|
If you need to keep track of the index of current tab that was selected, pass
|
|
@@ -178,7 +215,10 @@ available components, you will probably have to iterate or map through an array
|
|
|
178
215
|
to get the desired outcome. The DS `Tabs` component does this internally for
|
|
179
216
|
you so this should be a last resort option.
|
|
180
217
|
|
|
181
|
-
Make sure
|
|
218
|
+
Make sure that:
|
|
219
|
+
|
|
220
|
+
- all five components are imported to use this approach.
|
|
221
|
+
- the structure follows the example below for the mobile carousel to render properly.
|
|
182
222
|
|
|
183
223
|
```jsx
|
|
184
224
|
import {
|
|
@@ -197,11 +237,16 @@ import {
|
|
|
197
237
|
<Tab>Tom Nook</Tab>
|
|
198
238
|
<Tab>Isabelle</Tab>
|
|
199
239
|
<Tab>K.K. Slider</Tab>
|
|
240
|
+
<Tab>Mr. Resetti</Tab>
|
|
241
|
+
<Tab>Zucker</Tab>
|
|
200
242
|
</TabList>
|
|
201
243
|
<TabPanels>
|
|
202
244
|
<TabPanel>
|
|
203
|
-
|
|
204
|
-
|
|
245
|
+
<p>
|
|
246
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
|
|
247
|
+
character in the Animal Crossing series who operates the village
|
|
248
|
+
store.
|
|
249
|
+
</p>
|
|
205
250
|
</TabPanel>
|
|
206
251
|
<TabPanel>
|
|
207
252
|
Isabelle, known as Shizue in Japan, is a fictional character from the
|
|
@@ -210,10 +255,27 @@ import {
|
|
|
210
255
|
serves as the secretary to the player character.
|
|
211
256
|
</TabPanel>
|
|
212
257
|
<TabPanel>
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
258
|
+
<p>
|
|
259
|
+
Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
|
|
260
|
+
fictional character within the Animal Crossing franchise. One of the
|
|
261
|
+
franchise's most popular characters, he debuted in the title Animal
|
|
262
|
+
Crossing, and has appeared in every installment since.
|
|
263
|
+
</p>
|
|
264
|
+
</TabPanel>
|
|
265
|
+
<TabPanel>
|
|
266
|
+
<strong>Mr. Resetti</strong>, full name Sonny Resetti, is a fictional
|
|
267
|
+
character from the Animal Crossing series of video games by Nintendo.
|
|
268
|
+
His first appearance was in the Nintendo 64 game Dōbutsu no Mori,
|
|
269
|
+
released in Europe and North America on the GameCube as Animal
|
|
270
|
+
Crossing.
|
|
271
|
+
</TabPanel>
|
|
272
|
+
<TabPanel>
|
|
273
|
+
<strong>Zucker</strong> is a lazy octopus villager who first appeared
|
|
274
|
+
in New Leaf. His Japanese name and general appearance refers to the
|
|
275
|
+
Japanese snack takoyaki, which is a fried ball of dough commonly
|
|
276
|
+
filled with minced octopus. His catchphrase is a reference to how he
|
|
277
|
+
is an underwater animal. He has the same initial phrase as Bertha. He
|
|
278
|
+
has the nature hobby.
|
|
217
279
|
</TabPanel>
|
|
218
280
|
</TabPanels>
|
|
219
281
|
</Tabs>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import {
|
|
3
3
|
Box,
|
|
4
|
-
Tabs as ChakraTabs,
|
|
5
|
-
TabList,
|
|
6
4
|
Tab,
|
|
5
|
+
TabList,
|
|
7
6
|
TabPanels,
|
|
8
7
|
TabPanel,
|
|
8
|
+
Tabs as ChakraTabs,
|
|
9
9
|
useMultiStyleConfig,
|
|
10
10
|
} from "@chakra-ui/react";
|
|
11
11
|
|
|
@@ -14,6 +14,8 @@ import { IconNames, IconRotationTypes, IconSizes } from "../Icons/IconTypes";
|
|
|
14
14
|
import Icon from "../Icons/Icon";
|
|
15
15
|
import { ButtonTypes } from "../Button/ButtonTypes";
|
|
16
16
|
import Button from "../Button/Button";
|
|
17
|
+
import useCarouselStyles from "../../hooks/useCarouselStyles";
|
|
18
|
+
import useWindowSize from "../../hooks/useWindowSize";
|
|
17
19
|
|
|
18
20
|
// The general shape of the data object for each Tab.
|
|
19
21
|
export interface TabsContentDataProps {
|
|
@@ -44,7 +46,7 @@ const onClickHash = (tabHash) => {
|
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
/**
|
|
47
|
-
* This returns an object with `Tab` and `TabPanel` components to
|
|
49
|
+
* This returns an object with `Tab` and `TabPanel` components to rendered in
|
|
48
50
|
* `TabList` and `TabPanels` components respectively.
|
|
49
51
|
*/
|
|
50
52
|
const getElementsFromContentData = (data, useHash) => {
|
|
@@ -61,8 +63,7 @@ const getElementsFromContentData = (data, useHash) => {
|
|
|
61
63
|
"needed, consider other navigational patterns."
|
|
62
64
|
);
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
data.map((tab, index) => {
|
|
66
|
+
data.forEach((tab, index) => {
|
|
66
67
|
let tempPanel;
|
|
67
68
|
// For URL hash enabled tabs, we need to add a custom `onClick` to handle the URL hash.
|
|
68
69
|
const tempTab = (
|
|
@@ -89,7 +90,10 @@ const getElementsFromContentData = (data, useHash) => {
|
|
|
89
90
|
panels.push(tempPanel);
|
|
90
91
|
});
|
|
91
92
|
|
|
92
|
-
return {
|
|
93
|
+
return {
|
|
94
|
+
tabs: <TabList>{tabs}</TabList>,
|
|
95
|
+
panels: <TabPanels>{panels}</TabPanels>,
|
|
96
|
+
};
|
|
93
97
|
};
|
|
94
98
|
|
|
95
99
|
/**
|
|
@@ -104,7 +108,7 @@ const getElementsFromChildren = (children) => {
|
|
|
104
108
|
return {};
|
|
105
109
|
}
|
|
106
110
|
|
|
107
|
-
children.
|
|
111
|
+
children.forEach((child) => {
|
|
108
112
|
if (child.type === TabList || child.props.mdxType === "TabList") {
|
|
109
113
|
tabs.push(child);
|
|
110
114
|
|
|
@@ -139,9 +143,68 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
|
|
|
139
143
|
useHash = false,
|
|
140
144
|
} = props;
|
|
141
145
|
const styles = useMultiStyleConfig("Tabs", {});
|
|
146
|
+
// Just an estimate of the tab width for the mobile carousel.
|
|
147
|
+
const initTabWidth = 65;
|
|
148
|
+
// An estimate for the tab width for larger device widths.
|
|
149
|
+
const mediumTabWidth = 40;
|
|
150
|
+
const [tabWidth, setTabWidth] = React.useState(initTabWidth);
|
|
151
|
+
const windowDimensions = useWindowSize();
|
|
142
152
|
const { tabs, panels } = contentData
|
|
143
153
|
? getElementsFromContentData(contentData, useHash)
|
|
144
154
|
: getElementsFromChildren(children);
|
|
155
|
+
// `tabs` is an array for the children component approach but an object for
|
|
156
|
+
// the `contentData` prop approach. We need to get the right props key value
|
|
157
|
+
// to set the carousel's length.
|
|
158
|
+
const tabProps = tabs[0] ? tabs[0]?.props : (tabs as any).props;
|
|
159
|
+
const { prevSlide, nextSlide, carouselStyle, goToStart } = useCarouselStyles(
|
|
160
|
+
tabProps?.children?.length,
|
|
161
|
+
tabWidth
|
|
162
|
+
);
|
|
163
|
+
React.useEffect(() => {
|
|
164
|
+
if (windowDimensions.width > 320) {
|
|
165
|
+
setTabWidth(mediumTabWidth);
|
|
166
|
+
} else {
|
|
167
|
+
setTabWidth(initTabWidth);
|
|
168
|
+
}
|
|
169
|
+
// If we are on larger viewports, reset the carousel so all tabs display.
|
|
170
|
+
if (windowDimensions.width > 600) {
|
|
171
|
+
goToStart();
|
|
172
|
+
}
|
|
173
|
+
}, [goToStart, windowDimensions.width]);
|
|
174
|
+
const previousButton = (
|
|
175
|
+
<Button
|
|
176
|
+
buttonType={ButtonTypes.Primary}
|
|
177
|
+
attributes={{
|
|
178
|
+
"aria-label": "Previous",
|
|
179
|
+
...styles.buttonArrows,
|
|
180
|
+
left: "0",
|
|
181
|
+
}}
|
|
182
|
+
onClick={prevSlide}
|
|
183
|
+
>
|
|
184
|
+
<Icon
|
|
185
|
+
name={IconNames.Arrow}
|
|
186
|
+
iconRotation={IconRotationTypes.Rotate90}
|
|
187
|
+
size={IconSizes.Small}
|
|
188
|
+
/>
|
|
189
|
+
</Button>
|
|
190
|
+
);
|
|
191
|
+
const nextButton = (
|
|
192
|
+
<Button
|
|
193
|
+
buttonType={ButtonTypes.Primary}
|
|
194
|
+
attributes={{
|
|
195
|
+
"aria-label": "Next",
|
|
196
|
+
...styles.buttonArrows,
|
|
197
|
+
right: "0",
|
|
198
|
+
}}
|
|
199
|
+
onClick={nextSlide}
|
|
200
|
+
>
|
|
201
|
+
<Icon
|
|
202
|
+
name={IconNames.Arrow}
|
|
203
|
+
iconRotation={IconRotationTypes.Rotate270}
|
|
204
|
+
size={IconSizes.Small}
|
|
205
|
+
/>
|
|
206
|
+
</Button>
|
|
207
|
+
);
|
|
145
208
|
|
|
146
209
|
if (children && contentData?.length) {
|
|
147
210
|
console.warn(
|
|
@@ -152,67 +215,27 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
|
|
|
152
215
|
return (
|
|
153
216
|
<ChakraTabs
|
|
154
217
|
id={id}
|
|
155
|
-
// The following lazy loads each panel whenever it is needed.
|
|
156
|
-
isLazy
|
|
157
218
|
onChange={onChange}
|
|
158
219
|
defaultIndex={defaultIndex}
|
|
159
220
|
variant="enclosed"
|
|
221
|
+
// The following lazy loads each panel whenever it is needed.
|
|
222
|
+
isLazy
|
|
160
223
|
>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}}
|
|
177
|
-
>
|
|
178
|
-
<Icon
|
|
179
|
-
name={IconNames.Arrow}
|
|
180
|
-
iconRotation={IconRotationTypes.Rotate90}
|
|
181
|
-
size={IconSizes.Small}
|
|
182
|
-
/>
|
|
183
|
-
</Button>
|
|
184
|
-
<TabList>{tabs}</TabList>
|
|
185
|
-
<Button
|
|
186
|
-
buttonType={ButtonTypes.Primary}
|
|
187
|
-
attributes={{
|
|
188
|
-
"aria-label": "Next",
|
|
189
|
-
...styles.buttonArrows,
|
|
190
|
-
}}
|
|
191
|
-
>
|
|
192
|
-
<Icon
|
|
193
|
-
name={IconNames.Arrow}
|
|
194
|
-
iconRotation={IconRotationTypes.Rotate270}
|
|
195
|
-
size={IconSizes.Small}
|
|
196
|
-
/>
|
|
197
|
-
</Button>
|
|
198
|
-
</Box>
|
|
199
|
-
<TabPanels>{panels}</TabPanels>
|
|
200
|
-
</>
|
|
201
|
-
) : (
|
|
202
|
-
<>
|
|
203
|
-
<Box
|
|
204
|
-
__css={styles.tablistWrapper}
|
|
205
|
-
sx={{
|
|
206
|
-
"&::-webkit-scrollbar": {
|
|
207
|
-
display: "none",
|
|
208
|
-
},
|
|
209
|
-
}}
|
|
210
|
-
>
|
|
211
|
-
{tabs}
|
|
212
|
-
</Box>
|
|
213
|
-
{panels}
|
|
214
|
-
</>
|
|
215
|
-
)}
|
|
224
|
+
<Box
|
|
225
|
+
__css={styles.tablistWrapper}
|
|
226
|
+
sx={{
|
|
227
|
+
"&::-webkit-scrollbar": {
|
|
228
|
+
display: "none",
|
|
229
|
+
},
|
|
230
|
+
}}
|
|
231
|
+
>
|
|
232
|
+
{previousButton}
|
|
233
|
+
<Box __css={styles.carouselParent}>
|
|
234
|
+
<Box {...carouselStyle}>{tabs}</Box>
|
|
235
|
+
</Box>
|
|
236
|
+
{nextButton}
|
|
237
|
+
</Box>
|
|
238
|
+
{panels}
|
|
216
239
|
</ChakraTabs>
|
|
217
240
|
);
|
|
218
241
|
}
|
|
@@ -22,6 +22,7 @@ import Placeholder from "../Placeholder/Placeholder";
|
|
|
22
22
|
import Hero from "../Hero/Hero";
|
|
23
23
|
import { HeroTypes } from "../Hero/HeroTypes";
|
|
24
24
|
import Image from "../Image/Image";
|
|
25
|
+
import { ImageRatios, ImageSizes } from "../Image/ImageTypes";
|
|
25
26
|
import Breadcrumbs from "../Breadcrumbs/Breadcrumbs";
|
|
26
27
|
import HorizontalRule from "../HorizontalRule/HorizontalRule";
|
|
27
28
|
import Heading from "../Heading/Heading";
|
|
@@ -35,13 +36,7 @@ import Form, { FormRow, FormField } from "../Form/Form";
|
|
|
35
36
|
import TextInput from "../TextInput/TextInput";
|
|
36
37
|
import Button from "../Button/Button";
|
|
37
38
|
import Link from "../Link/Link";
|
|
38
|
-
import Card, {
|
|
39
|
-
CardImage,
|
|
40
|
-
CardHeading,
|
|
41
|
-
CardContent,
|
|
42
|
-
CardActions,
|
|
43
|
-
} from "../Card/Card";
|
|
44
|
-
import { CardImageRatios, CardImageSizes } from "../Card/CardTypes";
|
|
39
|
+
import Card, { CardHeading, CardContent, CardActions } from "../Card/Card";
|
|
45
40
|
import Accordion from "../Accordion/Accordion";
|
|
46
41
|
import { faqContent } from "../Accordion/Accordion.stories.mdx";
|
|
47
42
|
import { NotificationTypes } from "../Notification/NotificationTypes";
|
|
@@ -452,17 +447,20 @@ This is best viewed in the Storybook "Canvas" and not "Docs" section.
|
|
|
452
447
|
</TemplateHeader>
|
|
453
448
|
<TemplateContent sidebar="right">
|
|
454
449
|
<TemplateContentTop>
|
|
455
|
-
<Notification
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
450
|
+
<Notification
|
|
451
|
+
notificationType={NotificationTypes.Announcement}
|
|
452
|
+
notificationHeading="Announcement Notification"
|
|
453
|
+
notificationContent={
|
|
454
|
+
<>
|
|
455
|
+
This is an "announcement" Notification with a heading. Cras
|
|
456
|
+
mattis consectetur purus sit amet fermentum. Maecenas faucibus
|
|
457
|
+
mollis interdum. Morbi leo risus, porta ac consectetur ac,
|
|
458
|
+
vestibulum at eros. Cum sociis natoque penatibus et magnis dis
|
|
459
|
+
parturient montes, nascetur ridiculus mus. Vivamus sagittis
|
|
460
|
+
lacus vel augue laoreet rutrum faucibus dolor auctor.
|
|
461
|
+
</>
|
|
462
|
+
}
|
|
463
|
+
/>
|
|
466
464
|
</TemplateContentTop>
|
|
467
465
|
<TemplateContentPrimary>
|
|
468
466
|
<p>This is the main content!</p>
|
|
@@ -506,13 +504,13 @@ This is best viewed in the Storybook "Canvas" and not "Docs" section.
|
|
|
506
504
|
center
|
|
507
505
|
imageSrc="https://placeimg.com/400/200/animals"
|
|
508
506
|
imageAlt="Alt text"
|
|
509
|
-
imageAspectRatio={
|
|
510
|
-
imageSize={
|
|
507
|
+
imageAspectRatio={ImageRatios.Square}
|
|
508
|
+
imageSize={ImageSizes.Small}
|
|
511
509
|
>
|
|
512
|
-
<CardHeading level={HeadingLevels.
|
|
510
|
+
<CardHeading level={HeadingLevels.Two} id="heading1">
|
|
513
511
|
Small Animal Image
|
|
514
512
|
</CardHeading>
|
|
515
|
-
<CardHeading level={HeadingLevels.
|
|
513
|
+
<CardHeading level={HeadingLevels.Three} id="heading2">
|
|
516
514
|
Animal info
|
|
517
515
|
</CardHeading>
|
|
518
516
|
<CardContent>
|
|
@@ -527,12 +525,12 @@ This is best viewed in the Storybook "Canvas" and not "Docs" section.
|
|
|
527
525
|
id="custom-card"
|
|
528
526
|
imageAlt="Alt text"
|
|
529
527
|
imageSrc="https://cdn-d8.nypl.org/s3fs-public/2020-05/NYPL_MainFacadeRev2Cam2.png"
|
|
530
|
-
imageAspectRatio={
|
|
528
|
+
imageAspectRatio={ImageRatios.SixteenByNine}
|
|
531
529
|
layout="horizontal"
|
|
532
530
|
backgroundColor="#616161"
|
|
533
531
|
foregroundColor="#FFF"
|
|
534
532
|
>
|
|
535
|
-
<CardHeading id="heading1" level={
|
|
533
|
+
<CardHeading id="heading1-footer" level={HeadingLevels.Two}>
|
|
536
534
|
Footer
|
|
537
535
|
</CardHeading>
|
|
538
536
|
<CardContent>
|
|
@@ -544,25 +542,25 @@ This is best viewed in the Storybook "Canvas" and not "Docs" section.
|
|
|
544
542
|
</CardContent>
|
|
545
543
|
<CardActions>
|
|
546
544
|
<Link
|
|
547
|
-
href="javascript:void(0);"
|
|
548
545
|
attributes={{
|
|
549
546
|
style: { color: "#FFF", textDecoration: "underline" },
|
|
550
547
|
}}
|
|
548
|
+
href="#"
|
|
551
549
|
>
|
|
552
550
|
Facebook
|
|
553
551
|
</Link>
|
|
554
552
|
,<Link
|
|
555
|
-
href="javascript:void(0);"
|
|
556
553
|
attributes={{
|
|
557
554
|
style: { color: "#FFF", textDecoration: "underline" },
|
|
558
555
|
}}
|
|
556
|
+
href="#"
|
|
559
557
|
>
|
|
560
558
|
Instagram
|
|
561
559
|
</Link>,<Link
|
|
562
|
-
href="javascript:void(0);"
|
|
563
560
|
attributes={{
|
|
564
561
|
style: { color: "#FFF", textDecoration: "underline" },
|
|
565
562
|
}}
|
|
563
|
+
href="#"
|
|
566
564
|
>
|
|
567
565
|
Twitter
|
|
568
566
|
</Link>
|
|
@@ -180,18 +180,21 @@ describe("Renders TextInput with auto-generated ID, hidden label and visible hel
|
|
|
180
180
|
});
|
|
181
181
|
|
|
182
182
|
describe("TextInput shows error state", () => {
|
|
183
|
+
let rerender;
|
|
183
184
|
beforeEach(() => {
|
|
184
|
-
render(
|
|
185
|
+
const utils = render(
|
|
185
186
|
<TextInput
|
|
186
187
|
id="myTextInputError"
|
|
187
188
|
labelText="Custom Input Label"
|
|
188
189
|
helperText="Custom Helper Text"
|
|
189
190
|
invalidText="Custom Error Text"
|
|
190
191
|
placeholder="Input Placeholder"
|
|
191
|
-
isInvalid
|
|
192
|
+
isInvalid
|
|
192
193
|
type={TextInputTypes.text}
|
|
193
194
|
/>
|
|
194
195
|
);
|
|
196
|
+
|
|
197
|
+
rerender = utils.rerender;
|
|
195
198
|
});
|
|
196
199
|
|
|
197
200
|
it("renders Input component", () => {
|
|
@@ -207,6 +210,23 @@ describe("TextInput shows error state", () => {
|
|
|
207
210
|
expect(screen.getByText("Custom Error Text")).toBeInTheDocument();
|
|
208
211
|
});
|
|
209
212
|
|
|
213
|
+
it("does not render the invalid text when 'showHelperInvalidText' is set to false", () => {
|
|
214
|
+
rerender(
|
|
215
|
+
<TextInput
|
|
216
|
+
id="myTextInputError"
|
|
217
|
+
labelText="Custom Input Label"
|
|
218
|
+
helperText="Custom Helper Text"
|
|
219
|
+
invalidText="Custom Error Text"
|
|
220
|
+
placeholder="Input Placeholder"
|
|
221
|
+
showHelperInvalidText={false}
|
|
222
|
+
type={TextInputTypes.text}
|
|
223
|
+
isInvalid
|
|
224
|
+
/>
|
|
225
|
+
);
|
|
226
|
+
expect(screen.queryByText("Custom Helper Text")).not.toBeInTheDocument();
|
|
227
|
+
expect(screen.queryByText("Custom Error Text")).not.toBeInTheDocument();
|
|
228
|
+
});
|
|
229
|
+
|
|
210
230
|
it("input shows error state", () => {
|
|
211
231
|
expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
|
|
212
232
|
"aria-invalid"
|
|
@@ -16,10 +16,14 @@ import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
|
16
16
|
import generateUUID from "../../helpers/generateUUID";
|
|
17
17
|
|
|
18
18
|
export interface InputProps {
|
|
19
|
+
/** Optionally pass in additional Chakra-based styles. */
|
|
20
|
+
additionalStyles?: { [key: string]: any };
|
|
19
21
|
/** Additional attributes to pass to the `<input>` or `<textarea>` element */
|
|
20
22
|
attributes?: { [key: string]: any };
|
|
21
23
|
/** A class name for the TextInput parent div. */
|
|
22
24
|
className?: string;
|
|
25
|
+
/** The starting value of the input field. */
|
|
26
|
+
defaultValue?: string;
|
|
23
27
|
/** Populates the HelperErrorText for the standard state */
|
|
24
28
|
helperText?: string;
|
|
25
29
|
/** ID that other components can cross reference for accessibility purposes */
|
|
@@ -35,6 +39,8 @@ export interface InputProps {
|
|
|
35
39
|
/** Provides text for a `Label` component if `showLabel` is set to true;
|
|
36
40
|
* populates an `aria-label` attribute if `showLabel` is set to false. */
|
|
37
41
|
labelText: string;
|
|
42
|
+
/** Used to reference the input element in forms. */
|
|
43
|
+
name?: string;
|
|
38
44
|
/** The action to perform on the `input`/`textarea`'s onChange function */
|
|
39
45
|
onChange?: (
|
|
40
46
|
event:
|
|
@@ -43,12 +49,16 @@ export interface InputProps {
|
|
|
43
49
|
) => void;
|
|
44
50
|
/** Populates the placeholder for the input/textarea elements */
|
|
45
51
|
placeholder?: string;
|
|
52
|
+
/** Offers the ability to hide the helper/invalid text. */
|
|
53
|
+
showHelperInvalidText?: boolean;
|
|
46
54
|
/** Offers the ability to show the label onscreen or hide it. Refer to the
|
|
47
55
|
* `labelText` property for more information. */
|
|
48
56
|
showLabel?: boolean;
|
|
49
57
|
/** Offers the ability to show the "Required"/"Optional" label onscreen or
|
|
50
58
|
* hide it. True by default. */
|
|
51
59
|
showOptReqLabel?: boolean;
|
|
60
|
+
/** The amount to increase or decrease when using the number type. */
|
|
61
|
+
step?: number;
|
|
52
62
|
/** HTML Input types as defined by MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input */
|
|
53
63
|
type?: TextInputTypes;
|
|
54
64
|
/** Populates the value of the input/textarea elements */
|
|
@@ -71,8 +81,10 @@ export type TextInputRefType = HTMLInputElement & HTMLTextAreaElement;
|
|
|
71
81
|
const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
72
82
|
(props, ref: React.Ref<TextInputRefType>) => {
|
|
73
83
|
const {
|
|
84
|
+
additionalStyles = {},
|
|
74
85
|
attributes = {},
|
|
75
86
|
className,
|
|
87
|
+
defaultValue,
|
|
76
88
|
helperText,
|
|
77
89
|
id = generateUUID(),
|
|
78
90
|
invalidText,
|
|
@@ -80,15 +92,19 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
|
80
92
|
isInvalid = false,
|
|
81
93
|
isRequired = false,
|
|
82
94
|
labelText,
|
|
95
|
+
name,
|
|
83
96
|
onChange,
|
|
84
97
|
placeholder,
|
|
98
|
+
showHelperInvalidText = true,
|
|
85
99
|
showLabel = true,
|
|
86
100
|
showOptReqLabel = true,
|
|
101
|
+
step = 1,
|
|
87
102
|
type = TextInputTypes.text,
|
|
88
103
|
value,
|
|
89
104
|
variantType = TextInputVariants.Default,
|
|
90
105
|
} = props;
|
|
91
106
|
const styles = useMultiStyleConfig("TextInput", { variant: variantType });
|
|
107
|
+
const finalStyles = { ...styles, ...additionalStyles };
|
|
92
108
|
const isTextArea = type === TextInputTypes.textarea;
|
|
93
109
|
const isHidden = type === TextInputTypes.hidden;
|
|
94
110
|
const optReqFlag = isRequired ? "Required" : "Optional";
|
|
@@ -125,33 +141,37 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
|
125
141
|
|
|
126
142
|
// When the type is "hidden", the input element needs fewer attributes.
|
|
127
143
|
options = isHidden
|
|
128
|
-
? { id, "aria-hidden": isHidden, onChange, ref }
|
|
144
|
+
? { id, "aria-hidden": isHidden, name, onChange, ref }
|
|
129
145
|
: {
|
|
130
|
-
id,
|
|
131
146
|
"aria-required": isRequired,
|
|
147
|
+
defaultValue,
|
|
148
|
+
id,
|
|
132
149
|
isDisabled,
|
|
133
150
|
isRequired,
|
|
134
151
|
isInvalid,
|
|
135
152
|
placeholder,
|
|
153
|
+
name,
|
|
136
154
|
onChange,
|
|
137
155
|
ref,
|
|
156
|
+
// The `step` attribute is useful for the number type.
|
|
157
|
+
step: type === TextInputTypes.number ? step : null,
|
|
138
158
|
...attributes,
|
|
139
159
|
};
|
|
140
160
|
// For `input` and `textarea`, all attributes are the same but `input`
|
|
141
161
|
// also needs `type` and `value` to render correctly.
|
|
142
162
|
if (!isTextArea) {
|
|
143
163
|
options = { type, value, ...options } as any;
|
|
144
|
-
fieldOutput = <ChakraInput {...options} __css={
|
|
164
|
+
fieldOutput = <ChakraInput {...options} __css={finalStyles.input} />;
|
|
145
165
|
} else {
|
|
146
166
|
fieldOutput = (
|
|
147
|
-
<ChakraTextarea {...options} __css={
|
|
167
|
+
<ChakraTextarea {...options} __css={finalStyles.textarea}>
|
|
148
168
|
{value}
|
|
149
169
|
</ChakraTextarea>
|
|
150
170
|
);
|
|
151
171
|
}
|
|
152
172
|
|
|
153
173
|
return (
|
|
154
|
-
<Box __css={
|
|
174
|
+
<Box __css={finalStyles} className={className}>
|
|
155
175
|
{labelText && showLabel && !isHidden && (
|
|
156
176
|
<Label
|
|
157
177
|
htmlFor={id}
|
|
@@ -162,9 +182,9 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
|
162
182
|
</Label>
|
|
163
183
|
)}
|
|
164
184
|
{fieldOutput}
|
|
165
|
-
{footnote && !isHidden && (
|
|
166
|
-
<Box __css={
|
|
167
|
-
<HelperErrorText
|
|
185
|
+
{footnote && showHelperInvalidText && !isHidden && (
|
|
186
|
+
<Box __css={finalStyles.helper} aria-disabled={isDisabled}>
|
|
187
|
+
<HelperErrorText isInvalid={isInvalid} id={`${id}-helperText`}>
|
|
168
188
|
{footnote}
|
|
169
189
|
</HelperErrorText>
|
|
170
190
|
</Box>
|
|
@@ -11,6 +11,7 @@ export enum TextInputTypes {
|
|
|
11
11
|
url = "url",
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Only used internally in `TextInput`.
|
|
14
15
|
export enum TextInputFormats {
|
|
15
16
|
email = "jdoe@domain.com",
|
|
16
17
|
hidden = "",
|
|
@@ -23,6 +24,7 @@ export enum TextInputFormats {
|
|
|
23
24
|
url = "https://domain.com",
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
// Only used internally in `TextInput` and `SearchBar`.
|
|
26
28
|
export enum TextInputVariants {
|
|
27
29
|
Default = "default",
|
|
28
30
|
SearchBar = "searchBar",
|