@nypl/design-system-react-components 0.25.12 → 0.26.1
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 +131 -1
- package/README.md +10 -10
- package/dist/components/Accordion/Accordion.d.ts +6 -4
- package/dist/components/Accordion/AccordionTypes.d.ts +5 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -4
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -1
- package/dist/components/Button/Button.d.ts +2 -2
- package/dist/components/Card/Card.d.ts +22 -29
- package/dist/components/Checkbox/Checkbox.d.ts +3 -3
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +9 -6
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +5 -6
- package/dist/components/Fieldset/Fieldset.d.ts +5 -6
- package/dist/components/Form/Form.d.ts +6 -6
- package/dist/components/Grid/GridTypes.d.ts +7 -7
- package/dist/components/Grid/SimpleGrid.d.ts +1 -1
- package/dist/components/Heading/Heading.d.ts +5 -5
- package/dist/components/Heading/HeadingTypes.d.ts +1 -1
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
- package/dist/components/Hero/Hero.d.ts +9 -5
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
- package/dist/components/Icons/Icon.d.ts +2 -1
- package/dist/components/Icons/IconTypes.d.ts +1 -0
- package/dist/components/Image/Image.d.ts +27 -9
- package/dist/components/Image/ImageTypes.d.ts +4 -4
- package/dist/components/Label/Label.d.ts +7 -4
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/List/List.d.ts +11 -11
- package/dist/components/List/ListTypes.d.ts +1 -1
- package/dist/components/Logo/Logo.d.ts +2 -1
- package/dist/components/Logo/LogoSvgs.d.ts +2 -0
- package/dist/components/Logo/LogoTypes.d.ts +4 -2
- package/dist/components/Notification/Notification.d.ts +7 -7
- package/dist/components/Pagination/Pagination.d.ts +2 -2
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
- package/dist/components/Radio/Radio.d.ts +5 -7
- package/dist/components/RadioGroup/RadioGroup.d.ts +16 -8
- package/dist/components/SearchBar/SearchBar.d.ts +4 -4
- package/dist/components/Select/Select.d.ts +12 -8
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -6
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +0 -4
- package/dist/components/Slider/Slider.d.ts +6 -4
- package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +10 -23
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Tabs/Tabs.d.ts +7 -6
- package/dist/components/Template/Template.d.ts +17 -8
- package/dist/components/Text/Text.d.ts +4 -4
- package/dist/components/Text/TextTypes.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +7 -7
- package/dist/components/Toggle/Toggle.d.ts +8 -10
- package/dist/components/Toggle/{ToggleSizes.d.ts → ToggleTypes.d.ts} +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
- package/dist/design-system-react-components.cjs.development.js +2075 -1468
- 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 +2086 -1483
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/helpers/enums.d.ts +4 -0
- package/dist/hooks/useCarouselStyles.d.ts +3 -2
- package/dist/hooks/useNYPLTheme.d.ts +12 -0
- package/dist/index.d.ts +11 -9
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +7 -12
- package/dist/theme/components/breadcrumb.d.ts +3 -0
- package/dist/theme/components/button.d.ts +10 -2
- package/dist/theme/components/card.d.ts +44 -24
- package/dist/theme/components/checkbox.d.ts +6 -4
- package/dist/theme/components/checkboxGroup.d.ts +4 -2
- package/dist/theme/components/componentWrapper.d.ts +2 -2
- package/dist/theme/components/customTable.d.ts +84 -1
- package/dist/theme/components/fieldset.d.ts +4 -14
- package/dist/theme/components/global.d.ts +25 -18
- package/dist/theme/components/heading.d.ts +53 -0
- package/dist/theme/components/helperErrorText.d.ts +1 -0
- package/dist/theme/components/hero.d.ts +21 -15
- package/dist/theme/components/image.d.ts +1 -1
- package/dist/theme/components/label.d.ts +9 -10
- package/dist/theme/components/list.d.ts +99 -9
- package/dist/theme/components/notification.d.ts +4 -4
- package/dist/theme/components/pagination.d.ts +2 -5
- package/dist/theme/components/radio.d.ts +7 -4
- package/dist/theme/components/radioGroup.d.ts +4 -2
- package/dist/theme/components/select.d.ts +37 -5
- package/dist/theme/components/skeletonLoader.d.ts +2 -2
- package/dist/theme/components/slider.d.ts +6 -3
- package/dist/theme/components/structuredContent.d.ts +197 -0
- package/dist/theme/components/textInput.d.ts +18 -6
- package/dist/theme/components/toggle.d.ts +20 -5
- package/dist/theme/foundations/global.d.ts +2 -0
- package/dist/theme/foundations/radii.d.ts +1 -0
- package/dist/theme/foundations/spacing.d.ts +46 -43
- package/package.json +5 -6
- package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +34 -0
- package/src/components/Accordion/Accordion.stories.mdx +150 -66
- package/src/components/Accordion/Accordion.test.tsx +65 -17
- package/src/components/Accordion/Accordion.tsx +61 -27
- package/src/components/Accordion/AccordionTypes.tsx +5 -0
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +505 -14
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +37 -19
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +57 -36
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +14 -13
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -1
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
- package/src/components/Button/Button.stories.mdx +87 -23
- package/src/components/Button/Button.test.tsx +25 -0
- package/src/components/Button/Button.tsx +18 -7
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
- package/src/components/Card/Card.stories.mdx +493 -329
- package/src/components/Card/Card.test.tsx +138 -18
- package/src/components/Card/Card.tsx +151 -85
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +221 -101
- package/src/components/Chakra/Center.stories.mdx +2 -2
- package/src/components/Chakra/Grid.stories.mdx +4 -4
- package/src/components/Checkbox/Checkbox.stories.mdx +73 -9
- package/src/components/Checkbox/Checkbox.test.tsx +89 -10
- package/src/components/Checkbox/Checkbox.tsx +26 -16
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +209 -6
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +135 -23
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +216 -90
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +39 -26
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +493 -89
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
- package/src/components/DatePicker/DatePicker.test.tsx +94 -15
- package/src/components/DatePicker/DatePicker.tsx +67 -58
- package/src/components/DatePicker/_DatePicker.scss +71 -13
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
- package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
- package/src/components/Fieldset/Fieldset.test.tsx +58 -28
- package/src/components/Fieldset/Fieldset.tsx +35 -30
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
- package/src/components/Form/Form.stories.mdx +118 -47
- package/src/components/Form/Form.test.tsx +59 -16
- package/src/components/Form/Form.tsx +89 -65
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
- package/src/components/Grid/GridTypes.tsx +7 -7
- package/src/components/Grid/SimpleGrid.stories.mdx +87 -41
- package/src/components/Grid/SimpleGrid.test.tsx +24 -9
- package/src/components/Grid/SimpleGrid.tsx +29 -20
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
- package/src/components/Heading/Heading.stories.mdx +56 -25
- package/src/components/Heading/Heading.test.tsx +17 -7
- package/src/components/Heading/Heading.tsx +60 -58
- package/src/components/Heading/HeadingTypes.tsx +1 -1
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +27 -8
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
- package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
- package/src/components/Hero/Hero.stories.mdx +143 -113
- package/src/components/Hero/Hero.test.tsx +146 -58
- package/src/components/Hero/Hero.tsx +144 -112
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -17
- package/src/components/HorizontalRule/HorizontalRule.tsx +9 -25
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
- package/src/components/Icons/Icon.stories.mdx +80 -23
- package/src/components/Icons/Icon.test.tsx +51 -2
- package/src/components/Icons/Icon.tsx +93 -71
- package/src/components/Icons/IconTypes.tsx +1 -0
- package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
- package/src/components/Image/Image.stories.mdx +160 -71
- package/src/components/Image/Image.test.tsx +40 -48
- package/src/components/Image/Image.tsx +80 -48
- package/src/components/Image/ImageTypes.ts +4 -4
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +84 -21
- package/src/components/Label/Label.stories.mdx +42 -20
- package/src/components/Label/Label.test.tsx +42 -17
- package/src/components/Label/Label.tsx +22 -13
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
- package/src/components/Link/Link.stories.mdx +25 -1
- package/src/components/Link/Link.test.tsx +21 -0
- package/src/components/Link/Link.tsx +16 -9
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
- package/src/components/List/List.stories.mdx +75 -40
- package/src/components/List/List.test.tsx +73 -22
- package/src/components/List/List.tsx +44 -28
- package/src/components/List/ListTypes.tsx +1 -1
- package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
- package/src/components/Logo/Logo.stories.mdx +40 -16
- package/src/components/Logo/Logo.test.tsx +29 -2
- package/src/components/Logo/Logo.tsx +28 -11
- package/src/components/Logo/LogoSvgs.tsx +4 -0
- package/src/components/Logo/LogoTypes.tsx +3 -1
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
- package/src/components/Modal/Modal.stories.mdx +13 -0
- package/src/components/Notification/Notification.stories.mdx +29 -5
- package/src/components/Notification/Notification.test.tsx +23 -0
- package/src/components/Notification/Notification.tsx +53 -51
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
- package/src/components/Pagination/Pagination.stories.mdx +27 -6
- package/src/components/Pagination/Pagination.test.tsx +55 -2
- package/src/components/Pagination/Pagination.tsx +12 -9
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
- package/src/components/Placeholder/Placeholder.tsx +3 -1
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +87 -13
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +20 -10
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
- package/src/components/Radio/Radio.stories.mdx +75 -11
- package/src/components/Radio/Radio.test.tsx +83 -9
- package/src/components/Radio/Radio.tsx +70 -62
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +163 -5
- package/src/components/RadioGroup/RadioGroup.stories.mdx +293 -94
- package/src/components/RadioGroup/RadioGroup.test.tsx +193 -68
- package/src/components/RadioGroup/RadioGroup.tsx +110 -101
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1258 -902
- package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
- package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
- package/src/components/SearchBar/SearchBar.tsx +20 -11
- package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
- package/src/components/Select/Select.stories.mdx +151 -62
- package/src/components/Select/Select.test.tsx +56 -44
- package/src/components/Select/Select.tsx +125 -104
- package/src/components/Select/SelectTypes.tsx +5 -0
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +749 -409
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +53 -23
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +14 -8
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +80 -78
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +0 -5
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
- package/src/components/Slider/Slider.stories.mdx +123 -41
- package/src/components/Slider/Slider.test.tsx +65 -17
- package/src/components/Slider/Slider.tsx +30 -23
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
- package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
- package/src/components/StatusBadge/StatusBadge.test.tsx +19 -1
- package/src/components/StatusBadge/StatusBadge.tsx +25 -20
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
- package/src/components/StructuredContent/StructuredContent.stories.mdx +229 -61
- package/src/components/StructuredContent/StructuredContent.test.tsx +162 -101
- package/src/components/StructuredContent/StructuredContent.tsx +98 -103
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
- package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
- package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
- package/src/components/StyleGuide/ColorCard.tsx +4 -4
- package/src/components/StyleGuide/Colors.stories.mdx +1 -2
- package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
- package/src/components/StyleGuide/Forms.stories.mdx +27 -12
- package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
- package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
- package/src/components/StyleGuide/Typography.stories.mdx +47 -33
- package/src/components/Table/Table.stories.mdx +38 -11
- package/src/components/Table/Table.test.tsx +16 -1
- package/src/components/Table/Table.tsx +10 -8
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
- package/src/components/Tabs/Tabs.stories.mdx +59 -10
- package/src/components/Tabs/Tabs.test.tsx +29 -11
- package/src/components/Tabs/Tabs.tsx +28 -21
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
- package/src/components/Template/Template.stories.mdx +73 -32
- package/src/components/Template/Template.test.tsx +68 -5
- package/src/components/Template/Template.tsx +89 -71
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +195 -22
- package/src/components/Text/Text.stories.mdx +32 -15
- package/src/components/Text/Text.test.tsx +14 -11
- package/src/components/Text/Text.tsx +13 -16
- package/src/components/Text/TextTypes.tsx +1 -1
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
- package/src/components/TextInput/TextInput.stories.mdx +73 -27
- package/src/components/TextInput/TextInput.test.tsx +65 -50
- package/src/components/TextInput/TextInput.tsx +123 -115
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
- package/src/components/Toggle/Toggle.stories.mdx +74 -26
- package/src/components/Toggle/Toggle.test.tsx +41 -10
- package/src/components/Toggle/Toggle.tsx +29 -26
- package/src/components/Toggle/{ToggleSizes.tsx → ToggleTypes.tsx} +1 -1
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +191 -4
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +41 -6
- package/src/components/VideoPlayer/VideoPlayer.tsx +134 -120
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
- package/src/docs/Chakra.stories.mdx +50 -9
- package/src/docs/Welcome.stories.mdx +168 -0
- package/src/{components/Card/CardTypes.tsx → helpers/enums.ts} +2 -2
- package/src/hooks/tests/useNYPLTheme.test.tsx +1 -1
- package/src/hooks/useCarouselStyles.stories.mdx +30 -0
- package/src/hooks/useCarouselStyles.ts +3 -2
- package/src/hooks/useNYPLTheme.stories.mdx +101 -0
- package/src/hooks/useNYPLTheme.ts +31 -7
- package/src/hooks/useWindowSize.stories.mdx +23 -0
- package/src/index.ts +11 -15
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/theme/components/accordion.ts +7 -12
- package/src/theme/components/breadcrumb.ts +3 -0
- package/src/theme/components/button.ts +15 -7
- package/src/theme/components/card.ts +56 -36
- package/src/theme/components/checkbox.ts +10 -8
- package/src/theme/components/checkboxGroup.ts +4 -2
- package/src/theme/components/componentWrapper.ts +2 -2
- package/src/theme/components/customTable.ts +39 -31
- package/src/theme/components/fieldset.ts +1 -2
- package/src/theme/components/global.ts +29 -23
- package/src/theme/components/heading.ts +1 -1
- package/src/theme/components/helperErrorText.ts +1 -0
- package/src/theme/components/hero.ts +14 -16
- package/src/theme/components/icon.ts +5 -2
- package/src/theme/components/image.ts +1 -1
- package/src/theme/components/label.ts +4 -3
- package/src/theme/components/list.ts +73 -66
- package/src/theme/components/notification.ts +7 -7
- package/src/theme/components/pagination.ts +2 -5
- package/src/theme/components/progressIndicator.ts +3 -3
- package/src/theme/components/radio.ts +9 -9
- package/src/theme/components/radioGroup.ts +4 -2
- package/src/theme/components/select.ts +35 -16
- package/src/theme/components/skeletonLoader.ts +3 -3
- package/src/theme/components/slider.ts +8 -7
- package/src/theme/components/statusBadge.ts +2 -2
- package/src/theme/components/structuredContent.ts +66 -1
- package/src/theme/components/tabs.ts +2 -2
- package/src/theme/components/template.ts +9 -9
- package/src/theme/components/textInput.ts +13 -12
- package/src/theme/components/toggle.ts +43 -13
- package/src/theme/components/videoPlayer.ts +1 -1
- package/src/theme/foundations/colors.ts +1 -1
- package/src/theme/foundations/radii.ts +1 -0
- package/src/theme/foundations/spacing.ts +70 -22
- package/src/theme/foundations/typography.ts +2 -2
- package/src/utils/componentCategories.ts +28 -21
- package/dist/components/Card/CardTypes.d.ts +0 -4
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +0 -4
- package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +0 -4
- package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
- package/dist/helpers/generateUUID.d.ts +0 -1
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +0 -4
- package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +0 -4
- package/src/docs/Intro.stories.mdx +0 -53
- package/src/helpers/generateUUID.tsx +0 -5
|
@@ -9,14 +9,21 @@ import {
|
|
|
9
9
|
import { withDesign } from "storybook-addon-designs";
|
|
10
10
|
|
|
11
11
|
import Button from "../Button/Button";
|
|
12
|
-
import Form from "../Form/Form";
|
|
12
|
+
import Form, { FormField } from "../Form/Form";
|
|
13
13
|
import Select from "./Select";
|
|
14
|
-
import { SelectTypes } from "./SelectTypes";
|
|
14
|
+
import { SelectTypes, LabelPositions } from "./SelectTypes";
|
|
15
15
|
import { getCategory } from "../../utils/componentCategories";
|
|
16
16
|
import DSProvider from "../../theme/provider";
|
|
17
17
|
import { getStorybookEnumValues } from "../../utils/utils";
|
|
18
18
|
|
|
19
|
-
export const
|
|
19
|
+
export const selectTypesEnumValues = getStorybookEnumValues(
|
|
20
|
+
SelectTypes,
|
|
21
|
+
"SelectTypes"
|
|
22
|
+
);
|
|
23
|
+
export const labelPositionsEnumValues = getStorybookEnumValues(
|
|
24
|
+
LabelPositions,
|
|
25
|
+
"LabelPositions"
|
|
26
|
+
);
|
|
20
27
|
|
|
21
28
|
<Meta
|
|
22
29
|
title={getCategory("Select")}
|
|
@@ -41,6 +48,11 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
|
|
|
41
48
|
isRequired: {
|
|
42
49
|
table: { defaultValue: { summary: false } },
|
|
43
50
|
},
|
|
51
|
+
labelPosition: {
|
|
52
|
+
control: { type: "select" },
|
|
53
|
+
table: { defaultValue: { summary: "LabelPositions.Default" } },
|
|
54
|
+
options: labelPositionsEnumValues.options,
|
|
55
|
+
},
|
|
44
56
|
name: { control: false },
|
|
45
57
|
key: { table: { disable: true } },
|
|
46
58
|
onChange: { control: false },
|
|
@@ -51,10 +63,10 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
|
|
|
51
63
|
showLabel: {
|
|
52
64
|
table: { defaultValue: { summary: true } },
|
|
53
65
|
},
|
|
54
|
-
|
|
66
|
+
showRequiredLabel: {
|
|
55
67
|
table: { defaultValue: { summary: true } },
|
|
56
68
|
},
|
|
57
|
-
|
|
69
|
+
selectType: {
|
|
58
70
|
control: false,
|
|
59
71
|
table: { defaultValue: { summary: "SelectTypes.Default" } },
|
|
60
72
|
},
|
|
@@ -67,7 +79,20 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
|
|
|
67
79
|
| Component Version | DS Version |
|
|
68
80
|
| ----------------- | ---------- |
|
|
69
81
|
| Added | `0.7.0` |
|
|
70
|
-
| Latest | `0.
|
|
82
|
+
| Latest | `0.26.0` |
|
|
83
|
+
|
|
84
|
+
## Table of Contents
|
|
85
|
+
|
|
86
|
+
- [Overview](#overview)
|
|
87
|
+
- [Component Props](#component-props)
|
|
88
|
+
- [Accessibility](#accessibility)
|
|
89
|
+
- [Option Elements](#option-elements)
|
|
90
|
+
- [Labelling Variations](#labelling-variations)
|
|
91
|
+
- [Errored](#errored)
|
|
92
|
+
- [Disabled](#disabled)
|
|
93
|
+
- [Getting Select Input Value](#getting-select-input-value)
|
|
94
|
+
|
|
95
|
+
## Overview
|
|
71
96
|
|
|
72
97
|
<Description of={Select} />
|
|
73
98
|
|
|
@@ -77,18 +102,7 @@ prop, regardless of the label visibility. Additionally, while the `id` prop is
|
|
|
77
102
|
optional, a unique `id` attribute is necessary for accessibility. If the prop
|
|
78
103
|
is left blank, a value will be generated for you.
|
|
79
104
|
|
|
80
|
-
|
|
81
|
-
elements, but the select options _need_ to be child `<option>` HTML elements.
|
|
82
|
-
|
|
83
|
-
```jsx
|
|
84
|
-
<Select labelText="What is your favorite color?" name="color">
|
|
85
|
-
<option value="red">Red</option>
|
|
86
|
-
<option value="green">Green</option>
|
|
87
|
-
<option value="blue">Blue</option>
|
|
88
|
-
<option value="black">Black</option>
|
|
89
|
-
<option value="white">White</option>
|
|
90
|
-
</Select>
|
|
91
|
-
```
|
|
105
|
+
## Component Props
|
|
92
106
|
|
|
93
107
|
<Canvas withToolbar>
|
|
94
108
|
<Story
|
|
@@ -101,18 +115,22 @@ elements, but the select options _need_ to be child `<option>` HTML elements.
|
|
|
101
115
|
isDisabled: false,
|
|
102
116
|
isInvalid: false,
|
|
103
117
|
isRequired: false,
|
|
118
|
+
labelPosition: "LabelPositions.Default",
|
|
104
119
|
labelText: "What is your favorite color?",
|
|
105
120
|
name: "color",
|
|
106
121
|
onChange: undefined,
|
|
107
122
|
showHelperInvalidText: undefined,
|
|
108
123
|
showLabel: true,
|
|
109
|
-
|
|
110
|
-
|
|
124
|
+
showRequiredLabel: true,
|
|
125
|
+
selectType: SelectTypes.Default,
|
|
111
126
|
value: undefined,
|
|
112
127
|
}}
|
|
113
128
|
>
|
|
114
129
|
{(args) => (
|
|
115
|
-
<Select
|
|
130
|
+
<Select
|
|
131
|
+
{...args}
|
|
132
|
+
labelPosition={labelPositionsEnumValues.getValue(args.labelPosition)}
|
|
133
|
+
>
|
|
116
134
|
<option value="red">Red</option>
|
|
117
135
|
<option value="green">Green</option>
|
|
118
136
|
<option value="blue">Blue</option>
|
|
@@ -125,19 +143,60 @@ elements, but the select options _need_ to be child `<option>` HTML elements.
|
|
|
125
143
|
|
|
126
144
|
<ArgsTable story="Select with Controls" />
|
|
127
145
|
|
|
146
|
+
## Accessibility
|
|
147
|
+
|
|
148
|
+
The `Select` component renders an HTML `<select>` element which is accessible.
|
|
149
|
+
It's the developer's responsibility to ensure that the appropriate `<option>`
|
|
150
|
+
elements are provided as children. Internally, a `Label` is associated with the
|
|
151
|
+
`<select>` element.
|
|
152
|
+
|
|
153
|
+
When `showLabel` is set to false, the `labelText` value will be set to the
|
|
154
|
+
`<select>`'s `aria-label` attribute.
|
|
155
|
+
|
|
156
|
+
Resources:
|
|
157
|
+
|
|
158
|
+
- [MDN select: The HTML Select element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select)
|
|
159
|
+
- [Chakra UI Select](https://chakra-ui.com/docs/components/form/select)
|
|
160
|
+
|
|
161
|
+
## Option Elements
|
|
162
|
+
|
|
163
|
+
The `Select` component renders all the necessary wrapping and associated text
|
|
164
|
+
elements, but the select options _need_ to be child `<option>` HTML elements.
|
|
165
|
+
|
|
166
|
+
```jsx
|
|
167
|
+
<Select id="select" labelText="What is your favorite color?" name="color">
|
|
168
|
+
<option value="red">Red</option>
|
|
169
|
+
<option value="green">Green</option>
|
|
170
|
+
<option value="blue">Blue</option>
|
|
171
|
+
<option value="black">Black</option>
|
|
172
|
+
<option value="white">White</option>
|
|
173
|
+
</Select>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
There are two NYPL best practices to consider when using the `Select` component
|
|
177
|
+
and `option` HTML elements:
|
|
178
|
+
|
|
179
|
+
- Use no more than 10 options. If more than 10 options are needed, an
|
|
180
|
+
auto-complete text input is a good alternative.
|
|
181
|
+
- Use at least four options. If fewer than three options are needed, a radio
|
|
182
|
+
button group is a good alternative.
|
|
183
|
+
|
|
128
184
|
## Labelling Variations
|
|
129
185
|
|
|
130
|
-
A Select can be rendered with or without a visible label.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
186
|
+
A Select can be rendered with or without a visible label. If the label is visible,
|
|
187
|
+
it can be displayed above (the default) or inline with the select input using the
|
|
188
|
+
`labelPosition` prop. Note that the label will only display inline when the device
|
|
189
|
+
width exceeds the `--nypl-breakpoint-medium` breakpoint, or 600px. When `showLabel`
|
|
190
|
+
is set to `false`, an `aria-label` attribute is added to the select input to maintain
|
|
191
|
+
accessibility. If the component needs to be required, the `showRequiredLabel` prop
|
|
192
|
+
can be used to show or hide the "Required" text within the `label` element.
|
|
135
193
|
|
|
136
194
|
<Canvas>
|
|
137
195
|
<Story name="Labelling Variations">
|
|
138
196
|
<VStack align="stretch" spacing={8}>
|
|
139
197
|
<Select
|
|
140
198
|
helperText="Display the label"
|
|
199
|
+
id="label-example1"
|
|
141
200
|
labelText="What is your favorite color?"
|
|
142
201
|
name="color"
|
|
143
202
|
>
|
|
@@ -149,6 +208,7 @@ text within the `label` element.
|
|
|
149
208
|
</Select>
|
|
150
209
|
<Select
|
|
151
210
|
helperText="Do not display the label"
|
|
211
|
+
id="label-example2"
|
|
152
212
|
labelText="What is your favorite color?"
|
|
153
213
|
name="color"
|
|
154
214
|
showLabel={false}
|
|
@@ -160,7 +220,8 @@ text within the `label` element.
|
|
|
160
220
|
<option value="white">White</option>
|
|
161
221
|
</Select>
|
|
162
222
|
<Select
|
|
163
|
-
helperText="Display the Required
|
|
223
|
+
helperText="Display the Required text"
|
|
224
|
+
id="label-example3"
|
|
164
225
|
isRequired
|
|
165
226
|
labelText="What is your favorite color?"
|
|
166
227
|
name="color"
|
|
@@ -172,11 +233,25 @@ text within the `label` element.
|
|
|
172
233
|
<option value="white">White</option>
|
|
173
234
|
</Select>
|
|
174
235
|
<Select
|
|
175
|
-
helperText="Do not display the Required
|
|
236
|
+
helperText="Do not display the Required text"
|
|
237
|
+
id="label-example4"
|
|
176
238
|
isRequired
|
|
177
239
|
labelText="What is your favorite color?"
|
|
178
240
|
name="color"
|
|
179
|
-
|
|
241
|
+
showRequiredLabel={false}
|
|
242
|
+
>
|
|
243
|
+
<option value="red">Red</option>
|
|
244
|
+
<option value="green">Green</option>
|
|
245
|
+
<option value="blue">Blue</option>
|
|
246
|
+
<option value="black">Black</option>
|
|
247
|
+
<option value="white">White</option>
|
|
248
|
+
</Select>
|
|
249
|
+
<Select
|
|
250
|
+
helperText="Display the label inline"
|
|
251
|
+
isRequired
|
|
252
|
+
labelText="What is your favorite color?"
|
|
253
|
+
name="color"
|
|
254
|
+
labelPosition={LabelPositions.Inline}
|
|
180
255
|
>
|
|
181
256
|
<option value="red">Red</option>
|
|
182
257
|
<option value="green">Green</option>
|
|
@@ -194,6 +269,7 @@ text within the `label` element.
|
|
|
194
269
|
<DSProvider>
|
|
195
270
|
<Select
|
|
196
271
|
helperText="This is the helper text."
|
|
272
|
+
id="errored"
|
|
197
273
|
invalidText="This is the error text :("
|
|
198
274
|
isInvalid
|
|
199
275
|
labelText="What is your favorite color?"
|
|
@@ -214,6 +290,7 @@ text within the `label` element.
|
|
|
214
290
|
<DSProvider>
|
|
215
291
|
<Select
|
|
216
292
|
helperText="This is the helper text."
|
|
293
|
+
id="disabled"
|
|
217
294
|
invalidText="This is the error text :("
|
|
218
295
|
isDisabled
|
|
219
296
|
labelText="What is your favorite color?"
|
|
@@ -228,14 +305,14 @@ text within the `label` element.
|
|
|
228
305
|
</DSProvider>
|
|
229
306
|
</Canvas>
|
|
230
307
|
|
|
231
|
-
## Getting Select
|
|
308
|
+
## Getting Select Input Value
|
|
232
309
|
|
|
233
310
|
### Controlled Component using `value` and `onChange` props
|
|
234
311
|
|
|
235
|
-
If your application uses controlled React components and the
|
|
236
|
-
component must be controlled, you can pass and extract the
|
|
237
|
-
`value` and `onChange` props. This will be called every time
|
|
238
|
-
value is selected.
|
|
312
|
+
If your application uses controlled React components and the Reservoir Design
|
|
313
|
+
System (DS) `Select` component must be controlled, you can pass and extract the
|
|
314
|
+
value through the `value` and `onChange` props. This will be called every time
|
|
315
|
+
a new `option` value is selected.
|
|
239
316
|
|
|
240
317
|
Try it out: open up the browser's console to see new values being logged on
|
|
241
318
|
each change.
|
|
@@ -251,6 +328,7 @@ export function SelectControlledExample() {
|
|
|
251
328
|
return (
|
|
252
329
|
<Select
|
|
253
330
|
helperText="This is the helper text."
|
|
331
|
+
id="example-1"
|
|
254
332
|
labelText="What is your favorite color?"
|
|
255
333
|
name="color"
|
|
256
334
|
onChange={onChange}
|
|
@@ -276,6 +354,7 @@ export function SelectControlledExample() {
|
|
|
276
354
|
return (
|
|
277
355
|
<Select
|
|
278
356
|
helperText="This is the helper text."
|
|
357
|
+
id="example-1"
|
|
279
358
|
labelText="What is your favorite color?"
|
|
280
359
|
name="color"
|
|
281
360
|
onChange={onChange}
|
|
@@ -314,20 +393,25 @@ export function SelectUncontrolledExample() {
|
|
|
314
393
|
console.log("Using uncontrolled ref:", selectValue);
|
|
315
394
|
};
|
|
316
395
|
return (
|
|
317
|
-
<Form>
|
|
318
|
-
<
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
396
|
+
<Form id="form">
|
|
397
|
+
<FormField>
|
|
398
|
+
<Select
|
|
399
|
+
helperText="This is the helper text."
|
|
400
|
+
id="example-2"
|
|
401
|
+
labelText="What is your favorite color?"
|
|
402
|
+
name="color"
|
|
403
|
+
ref={selectRef}
|
|
404
|
+
>
|
|
405
|
+
<option value="red">Red</option>
|
|
406
|
+
<option value="green">Green</option>
|
|
407
|
+
<option value="blue">Blue</option>
|
|
408
|
+
<option value="black">Black</option>
|
|
409
|
+
<option value="white">White</option>
|
|
410
|
+
</Select>
|
|
411
|
+
<Button id="submit" onClick={onSubmit}>
|
|
412
|
+
Submit
|
|
413
|
+
</Button>
|
|
414
|
+
</FormField>
|
|
331
415
|
</Form>
|
|
332
416
|
);
|
|
333
417
|
}
|
|
@@ -340,20 +424,25 @@ export function SelectUncontrolledExample() {
|
|
|
340
424
|
console.log("Using uncontrolled ref:", selectValue);
|
|
341
425
|
};
|
|
342
426
|
return (
|
|
343
|
-
<Form>
|
|
344
|
-
<
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
427
|
+
<Form id="form">
|
|
428
|
+
<FormField>
|
|
429
|
+
<Select
|
|
430
|
+
helperText="This is the helper text."
|
|
431
|
+
id="example-2"
|
|
432
|
+
labelText="What is your favorite color?"
|
|
433
|
+
name="color"
|
|
434
|
+
ref={selectRef}
|
|
435
|
+
>
|
|
436
|
+
<option value="red">Red</option>
|
|
437
|
+
<option value="green">Green</option>
|
|
438
|
+
<option value="blue">Blue</option>
|
|
439
|
+
<option value="black">Black</option>
|
|
440
|
+
<option value="white">White</option>
|
|
441
|
+
</Select>
|
|
442
|
+
<Button id="submit" onClick={onSubmit}>
|
|
443
|
+
Submit
|
|
444
|
+
</Button>
|
|
445
|
+
</FormField>
|
|
357
446
|
</Form>
|
|
358
447
|
);
|
|
359
448
|
}
|
|
@@ -4,10 +4,12 @@ import { axe } from "jest-axe";
|
|
|
4
4
|
import renderer from "react-test-renderer";
|
|
5
5
|
|
|
6
6
|
import Select from "./Select";
|
|
7
|
+
import { LabelPositions } from "./SelectTypes";
|
|
7
8
|
|
|
8
9
|
const baseProps = {
|
|
9
|
-
labelText: "What is your favorite color?",
|
|
10
10
|
helperText: "This is the helper text.",
|
|
11
|
+
id: "select",
|
|
12
|
+
labelText: "What is your favorite color?",
|
|
11
13
|
name: "color",
|
|
12
14
|
};
|
|
13
15
|
const baseOptions = (
|
|
@@ -79,26 +81,17 @@ describe("Select", () => {
|
|
|
79
81
|
).toHaveAttribute("aria-describedby", `${id}-helperText`);
|
|
80
82
|
});
|
|
81
83
|
|
|
82
|
-
it("renders
|
|
83
|
-
const { rerender } = render(
|
|
84
|
-
expect(screen.getByText(/Optional/i)).toBeInTheDocument();
|
|
85
|
-
|
|
86
|
-
rerender(
|
|
84
|
+
it("renders '(Required)' text in the label", () => {
|
|
85
|
+
const { rerender } = render(
|
|
87
86
|
<Select {...baseProps} isRequired>
|
|
88
87
|
{baseOptions}
|
|
89
88
|
</Select>
|
|
90
89
|
);
|
|
91
|
-
expect(screen.getByText(/Required/i)).toBeInTheDocument();
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
<Select {...baseProps} showOptReqLabel={false}>
|
|
95
|
-
{baseOptions}
|
|
96
|
-
</Select>
|
|
97
|
-
);
|
|
98
|
-
expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
|
|
91
|
+
expect(screen.getByText(/Required/i)).toBeInTheDocument();
|
|
99
92
|
|
|
100
93
|
rerender(
|
|
101
|
-
<Select {...baseProps} isRequired
|
|
94
|
+
<Select {...baseProps} isRequired showRequiredLabel={false}>
|
|
102
95
|
{baseOptions}
|
|
103
96
|
</Select>
|
|
104
97
|
);
|
|
@@ -120,9 +113,9 @@ describe("Select", () => {
|
|
|
120
113
|
).toHaveAttribute("required");
|
|
121
114
|
});
|
|
122
115
|
|
|
123
|
-
it("should not render a required label if '
|
|
116
|
+
it("should not render a required label if 'showRequiredLabel' flag is false, but still render the label", () => {
|
|
124
117
|
render(
|
|
125
|
-
<Select {...baseProps} isRequired
|
|
118
|
+
<Select {...baseProps} isRequired showRequiredLabel={false}>
|
|
126
119
|
{baseOptions}
|
|
127
120
|
</Select>
|
|
128
121
|
);
|
|
@@ -222,44 +215,22 @@ describe("Select", () => {
|
|
|
222
215
|
expect(value).toEqual("white");
|
|
223
216
|
});
|
|
224
217
|
|
|
225
|
-
it("
|
|
226
|
-
const warn = jest.spyOn(console, "warn");
|
|
227
|
-
render(
|
|
228
|
-
<Select {...baseProps}>
|
|
229
|
-
<option value="red">Red</option>
|
|
230
|
-
</Select>
|
|
231
|
-
);
|
|
232
|
-
expect(warn).toHaveBeenCalledWith(
|
|
233
|
-
"NYPL DS recommends that <select> fields have at least 4 options; a radio button group is a good alternative for 3 or fewer options."
|
|
234
|
-
);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
it("should throw warning when there are more than 10 options", () => {
|
|
218
|
+
it("logs a warning when there is no `id` passed", () => {
|
|
238
219
|
const warn = jest.spyOn(console, "warn");
|
|
239
220
|
render(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
<option aria-selected={false}>test4</option>
|
|
245
|
-
<option aria-selected={false}>test5</option>
|
|
246
|
-
<option aria-selected={false}>test6</option>
|
|
247
|
-
<option aria-selected={false}>test7</option>
|
|
248
|
-
<option aria-selected={false}>test8</option>
|
|
249
|
-
<option aria-selected={false}>test9</option>
|
|
250
|
-
<option aria-selected={false}>test10</option>
|
|
251
|
-
<option aria-selected={false}>test11</option>
|
|
221
|
+
// @ts-ignore: Typescript complains when a required prop is not passed, but
|
|
222
|
+
// here we don't want to pass the required prop to make sure the warning appears.
|
|
223
|
+
<Select labelText="What is your favorite color?" name="color">
|
|
224
|
+
{baseOptions}
|
|
252
225
|
</Select>
|
|
253
226
|
);
|
|
254
|
-
|
|
255
227
|
expect(warn).toHaveBeenCalledWith(
|
|
256
|
-
"NYPL
|
|
228
|
+
"NYPL Reservoir Select: This component's required `id` prop was not passed."
|
|
257
229
|
);
|
|
258
230
|
});
|
|
259
231
|
|
|
260
232
|
it("Renders the UI snapshot correctly", () => {
|
|
261
233
|
const siblings = ["Kendall", "Shiv", "Connor", "Roman", "Tom"];
|
|
262
|
-
|
|
263
234
|
const options = siblings.map((sibling) => (
|
|
264
235
|
<option key={sibling}>{sibling}</option>
|
|
265
236
|
));
|
|
@@ -324,6 +295,19 @@ describe("Select", () => {
|
|
|
324
295
|
</Select>
|
|
325
296
|
)
|
|
326
297
|
.toJSON();
|
|
298
|
+
const withLabelInline = renderer
|
|
299
|
+
.create(
|
|
300
|
+
<Select
|
|
301
|
+
id="select"
|
|
302
|
+
isRequired
|
|
303
|
+
labelPosition={LabelPositions.Inline}
|
|
304
|
+
labelText="Which Succession sibling are you?"
|
|
305
|
+
name="succession-sibling"
|
|
306
|
+
>
|
|
307
|
+
{options}
|
|
308
|
+
</Select>
|
|
309
|
+
)
|
|
310
|
+
.toJSON();
|
|
327
311
|
const hasOnChange = renderer
|
|
328
312
|
.create(
|
|
329
313
|
<Select
|
|
@@ -336,12 +320,40 @@ describe("Select", () => {
|
|
|
336
320
|
</Select>
|
|
337
321
|
)
|
|
338
322
|
.toJSON();
|
|
323
|
+
const withChakraProps = renderer
|
|
324
|
+
.create(
|
|
325
|
+
<Select
|
|
326
|
+
id="chakra"
|
|
327
|
+
labelText="Which Succession sibling are you?"
|
|
328
|
+
name="succession-sibling"
|
|
329
|
+
p="20px"
|
|
330
|
+
color="ui.error.primary"
|
|
331
|
+
>
|
|
332
|
+
{options}
|
|
333
|
+
</Select>
|
|
334
|
+
)
|
|
335
|
+
.toJSON();
|
|
336
|
+
const withOtherProps = renderer
|
|
337
|
+
.create(
|
|
338
|
+
<Select
|
|
339
|
+
id="props"
|
|
340
|
+
labelText="Which Succession sibling are you?"
|
|
341
|
+
name="succession-sibling"
|
|
342
|
+
data-testid="props"
|
|
343
|
+
>
|
|
344
|
+
{options}
|
|
345
|
+
</Select>
|
|
346
|
+
)
|
|
347
|
+
.toJSON();
|
|
339
348
|
|
|
340
349
|
expect(primary).toMatchSnapshot();
|
|
341
350
|
expect(disabled).toMatchSnapshot();
|
|
342
351
|
expect(withInvalidText).toMatchSnapshot();
|
|
343
352
|
expect(withHelperText).toMatchSnapshot();
|
|
344
353
|
expect(required).toMatchSnapshot();
|
|
354
|
+
expect(withLabelInline).toMatchSnapshot();
|
|
345
355
|
expect(hasOnChange).toMatchSnapshot();
|
|
356
|
+
expect(withChakraProps).toMatchSnapshot();
|
|
357
|
+
expect(withOtherProps).toMatchSnapshot();
|
|
346
358
|
});
|
|
347
359
|
});
|