@nypl/design-system-react-components 0.25.0 → 0.25.4
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 +142 -1
- package/README.md +98 -50
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +15 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/Button.d.ts +13 -8
- package/dist/components/Button/ButtonTypes.d.ts +3 -1
- package/dist/components/Card/Card.d.ts +36 -52
- package/dist/components/Card/CardTypes.d.ts +2 -17
- package/dist/components/Checkbox/Checkbox.d.ts +17 -13
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +45 -0
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
- package/dist/components/DatePicker/DatePicker.d.ts +37 -35
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/Form/Form.d.ts +13 -8
- package/dist/components/Form/FormTypes.d.ts +2 -8
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
- package/dist/components/Hero/Hero.d.ts +19 -14
- package/dist/components/Hero/HeroTypes.d.ts +10 -5
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
- package/dist/components/Icons/Icon.d.ts +19 -14
- package/dist/components/Icons/IconSvgs.d.ts +11 -0
- package/dist/components/Icons/IconTypes.d.ts +89 -64
- package/dist/components/Image/Image.d.ts +19 -9
- package/dist/components/Image/ImageTypes.d.ts +20 -0
- package/dist/components/Label/Label.d.ts +5 -17
- package/dist/components/Link/Link.d.ts +12 -12
- 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 +45 -27
- package/dist/components/Select/Select.d.ts +34 -35
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
- package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
- package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/Template/Template.d.ts +91 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/Text/TextTypes.d.ts +6 -0
- package/dist/components/TextInput/TextInput.d.ts +44 -31
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -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 +6473 -2630
- 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 +6463 -2631
- 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 +19 -7
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +25 -0
- package/dist/theme/components/breadcrumb.d.ts +90 -0
- package/dist/theme/components/button.d.ts +39 -15
- package/dist/theme/components/card.d.ts +168 -0
- package/dist/theme/components/checkbox.d.ts +12 -8
- 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 +65 -0
- package/dist/theme/components/globalMixins.d.ts +23 -0
- package/dist/theme/components/heading.d.ts +55 -20
- package/dist/theme/components/helperErrorText.d.ts +10 -0
- package/dist/theme/components/hero.d.ts +493 -0
- package/dist/theme/components/horizontalRule.d.ts +14 -0
- package/dist/theme/components/icon.d.ts +13 -0
- package/dist/theme/components/image.d.ts +31 -0
- package/dist/theme/components/label.d.ts +18 -0
- package/dist/theme/components/link.d.ts +49 -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/radio.d.ts +8 -7
- package/dist/theme/components/radioGroup.d.ts +12 -0
- package/dist/theme/components/searchBar.d.ts +20 -0
- package/dist/theme/components/select.d.ts +67 -0
- package/dist/theme/components/skeletonLoader.d.ts +98 -0
- package/dist/theme/components/slider.d.ts +51 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/tabs.d.ts +63 -12
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +20 -0
- package/dist/theme/components/textInput.d.ts +112 -0
- 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 +8 -0
- package/dist/theme/foundations/radii.d.ts +5 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/theme/foundations/spacing.d.ts +16 -16
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +72 -82
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +223 -34
- package/src/components/Accordion/Accordion.test.tsx +135 -19
- package/src/components/Accordion/Accordion.tsx +81 -56
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -4
- package/src/components/Autosuggest/Autosuggest.stories.tsx +3 -2
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +48 -50
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +54 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +75 -73
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -0
- package/src/components/Button/Button.stories.mdx +45 -36
- package/src/components/Button/Button.test.tsx +37 -11
- package/src/components/Button/Button.tsx +22 -34
- package/src/components/Button/ButtonTypes.tsx +2 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +50 -8
- package/src/components/Card/Card.stories.mdx +314 -273
- package/src/components/Card/Card.test.tsx +157 -91
- package/src/components/Card/Card.tsx +195 -145
- package/src/components/Card/CardTypes.tsx +2 -19
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
- package/src/components/CardEdition/CardEdition.stories.tsx +26 -53
- package/src/components/CardEdition/CardEdition.test.tsx +23 -31
- package/src/components/CardEdition/_CardEdition.scss +22 -23
- package/src/components/Chakra/Box.stories.mdx +15 -16
- package/src/components/Chakra/Center.stories.mdx +56 -24
- package/src/components/Chakra/Grid.stories.mdx +92 -0
- package/src/components/Chakra/Stack.stories.mdx +38 -21
- package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
- package/src/components/Checkbox/Checkbox.test.tsx +47 -2
- package/src/components/Checkbox/Checkbox.tsx +44 -41
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +92 -7
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +329 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +372 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +152 -0
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1326 -0
- 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 +165 -134
- package/src/components/DatePicker/_DatePicker.scss +33 -66
- 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 +70 -27
- package/src/components/Form/Form.test.tsx +58 -45
- package/src/components/Form/Form.tsx +50 -21
- package/src/components/Form/FormTypes.tsx +3 -8
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +268 -0
- package/src/components/Grid/SimpleGrid.test.tsx +66 -0
- package/src/components/Grid/SimpleGrid.tsx +37 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
- package/src/components/Heading/Heading.stories.mdx +3 -3
- package/src/components/Heading/Heading.tsx +12 -6
- 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 +198 -121
- package/src/components/Hero/Hero.test.tsx +537 -107
- package/src/components/Hero/Hero.tsx +79 -92
- package/src/components/Hero/HeroTypes.tsx +18 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- 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 +94 -77
- package/src/components/Icons/Icon.test.tsx +48 -22
- package/src/components/Icons/Icon.tsx +78 -61
- package/src/components/Icons/IconSvgs.tsx +22 -0
- package/src/components/Icons/IconTypes.tsx +91 -64
- 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/Label/Label.stories.mdx +28 -7
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +21 -34
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +41 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +117 -100
- package/src/components/List/List.stories.mdx +124 -51
- 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 +119 -111
- package/src/components/Notification/Notification.test.tsx +102 -126
- package/src/components/Notification/Notification.tsx +157 -161
- 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 -140
- 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 +4 -5
- package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
- package/src/components/RadioGroup/RadioGroup.tsx +21 -29
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
- package/src/components/SearchBar/SearchBar.Test.tsx +170 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +294 -219
- package/src/components/SearchBar/SearchBar.tsx +161 -46
- package/src/components/Select/Select.stories.mdx +188 -170
- package/src/components/Select/Select.test.tsx +132 -375
- package/src/components/Select/Select.tsx +121 -165
- package/src/components/Select/SelectTypes.tsx +5 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +33 -76
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +75 -70
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
- 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/StatusBadge/StatusBadge.stories.mdx +91 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
- package/src/components/StatusBadge/StatusBadge.tsx +24 -25
- package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +17 -17
- package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
- package/src/components/StyleGuide/Buttons.stories.mdx +102 -86
- package/src/components/StyleGuide/ColorCard.tsx +46 -0
- package/src/components/StyleGuide/Colors.stories.mdx +196 -0
- 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 +119 -127
- 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 +88 -67
- package/src/components/Template/Template.stories.mdx +572 -0
- package/src/components/Template/Template.test.tsx +124 -0
- package/src/components/Template/Template.tsx +226 -0
- package/src/components/Text/Text.stories.mdx +70 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +55 -0
- package/src/components/Text/TextTypes.tsx +6 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
- package/src/components/TextInput/TextInput.stories.mdx +89 -90
- package/src/components/TextInput/TextInput.test.tsx +84 -85
- package/src/components/TextInput/TextInput.tsx +121 -95
- package/src/components/TextInput/TextInputTypes.tsx +8 -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 +246 -65
- package/src/docs/Intro.stories.mdx +18 -13
- 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 +39 -16
- 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/_03-base.scss +25 -0
- 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 -62
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +91 -71
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +22 -29
- 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 +82 -0
- package/src/theme/components/globalMixins.ts +24 -0
- package/src/theme/components/heading.ts +25 -13
- package/src/theme/components/helperErrorText.ts +9 -0
- package/src/theme/components/hero.ts +240 -0
- package/src/theme/components/horizontalRule.ts +13 -0
- package/src/theme/components/icon.ts +79 -0
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +10 -0
- package/src/theme/components/link.ts +51 -0
- 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 +22 -33
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/searchBar.ts +21 -0
- package/src/theme/components/select.ts +53 -0
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/statusBadge.ts +26 -0
- package/src/theme/components/tabs.ts +102 -69
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +31 -0
- package/src/theme/components/textInput.ts +62 -0
- package/src/theme/components/videoPlayer.ts +49 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/colors.ts +29 -13
- package/src/theme/foundations/global.ts +8 -0
- package/src/theme/foundations/radii.ts +6 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/foundations/spacing.ts +24 -24
- package/src/theme/index.ts +74 -13
- package/src/utils/componentCategories.ts +12 -5
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
- 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/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
- package/dist/components/Template/Template.stories.d.ts +0 -30
- package/dist/theme/components/customRadioGroup.d.ts +0 -17
- package/src/components/Accordion/Accordion.stories.tsx +0 -66
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Button/_Button.scss +0 -56
- package/src/components/Card/_Card.scss +0 -308
- package/src/components/Form/_Form.scss +0 -67
- package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
- package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- 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/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -289
- package/src/components/Template/Template.stories.tsx +0 -86
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
- package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
- package/src/styles/01-colors/_colors-brand.scss +0 -56
- package/src/styles/01-colors/_colors-utility.scss +0 -65
- 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/_04-base.scss +0 -19
- package/src/styles/base/_card-grid.scss +0 -78
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customRadioGroup.ts +0 -18
|
@@ -1,106 +1,127 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
Box,
|
|
4
|
+
Input as ChakraInput,
|
|
5
|
+
Textarea as ChakraTextarea,
|
|
6
|
+
useMultiStyleConfig,
|
|
7
|
+
} from "@chakra-ui/react";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
TextInputTypes,
|
|
11
|
+
TextInputFormats,
|
|
12
|
+
TextInputVariants,
|
|
13
|
+
} from "./TextInputTypes";
|
|
4
14
|
import Label from "../Label/Label";
|
|
5
15
|
import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
6
16
|
import generateUUID from "../../helpers/generateUUID";
|
|
7
17
|
|
|
8
18
|
export interface InputProps {
|
|
9
|
-
/**
|
|
19
|
+
/** Optionally pass in additional Chakra-based styles. */
|
|
20
|
+
additionalStyles?: { [key: string]: any };
|
|
21
|
+
/** Additional attributes to pass to the `<input>` or `<textarea>` element */
|
|
10
22
|
attributes?: { [key: string]: any };
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
|
|
23
|
+
/** A class name for the TextInput parent div. */
|
|
24
|
+
className?: string;
|
|
25
|
+
/** The starting value of the input field. */
|
|
26
|
+
defaultValue?: string;
|
|
27
|
+
/** Populates the HelperErrorText for the standard state */
|
|
28
|
+
helperText?: string;
|
|
29
|
+
/** ID that other components can cross reference for accessibility purposes */
|
|
30
|
+
id?: string;
|
|
31
|
+
/** Populates the HelperErrorText for the error state */
|
|
32
|
+
invalidText?: string;
|
|
33
|
+
/** Adds the `disabled` and `aria-disabled` prop to the input when true */
|
|
34
|
+
isDisabled?: boolean;
|
|
35
|
+
/** Adds errored styling to the input/textarea and helper text elements */
|
|
36
|
+
isInvalid?: boolean;
|
|
37
|
+
/** Will add `required` and `aria-required` props to the input/textarea elements */
|
|
38
|
+
isRequired?: boolean;
|
|
15
39
|
/** Provides text for a `Label` component if `showLabel` is set to true;
|
|
16
|
-
* populates
|
|
40
|
+
* populates an `aria-label` attribute if `showLabel` is set to false. */
|
|
17
41
|
labelText: string;
|
|
42
|
+
/** Used to reference the input element in forms. */
|
|
43
|
+
name?: string;
|
|
44
|
+
/** The action to perform on the `input`/`textarea`'s onChange function */
|
|
45
|
+
onChange?: (
|
|
46
|
+
event:
|
|
47
|
+
| React.ChangeEvent<HTMLInputElement>
|
|
48
|
+
| React.ChangeEvent<HTMLTextAreaElement>
|
|
49
|
+
) => void;
|
|
50
|
+
/** Populates the placeholder for the input/textarea elements */
|
|
51
|
+
placeholder?: string;
|
|
52
|
+
/** Offers the ability to hide the helper/invalid text. */
|
|
53
|
+
showHelperInvalidText?: boolean;
|
|
18
54
|
/** Offers the ability to show the label onscreen or hide it. Refer to the
|
|
19
55
|
* `labelText` property for more information. */
|
|
20
56
|
showLabel?: boolean;
|
|
21
57
|
/** Offers the ability to show the "Required"/"Optional" label onscreen or
|
|
22
58
|
* hide it. True by default. */
|
|
23
59
|
showOptReqLabel?: boolean;
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
/** Populates the
|
|
29
|
-
placeholder?: string;
|
|
30
|
-
/** Populates the value of the input */
|
|
60
|
+
/** The amount to increase or decrease when using the number type. */
|
|
61
|
+
step?: number;
|
|
62
|
+
/** HTML Input types as defined by MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input */
|
|
63
|
+
type?: TextInputTypes;
|
|
64
|
+
/** Populates the value of the input/textarea elements */
|
|
31
65
|
value?: string;
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
/** ID that other components can cross reference for accessibility purposes */
|
|
35
|
-
id?: string;
|
|
36
|
-
/** Helper for modifiers array; adds 'errored' styling */
|
|
37
|
-
errored?: boolean;
|
|
38
|
-
/** Adds the 'disabled' prop to the input when true */
|
|
39
|
-
disabled?: boolean;
|
|
40
|
-
/** Modifiers array for use with BEM. See how to work with modifiers and BEM
|
|
41
|
-
* here: http://getbem.com/introduction/ */
|
|
42
|
-
modifiers?: string[];
|
|
43
|
-
/** The action to perform on the `<input>`'s onChange function */
|
|
44
|
-
onChange?: (
|
|
45
|
-
event:
|
|
46
|
-
| React.ChangeEvent<HTMLInputElement>
|
|
47
|
-
| React.ChangeEvent<HTMLTextAreaElement>
|
|
48
|
-
) => void;
|
|
66
|
+
/** The variant to display. */
|
|
67
|
+
variantType?: TextInputVariants;
|
|
49
68
|
}
|
|
50
69
|
|
|
51
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* The type used for `ref`s. We want to extend both `input` and `textarea`
|
|
52
72
|
* since both are available to create through `TextInput`.
|
|
53
73
|
*/
|
|
54
74
|
export type TextInputRefType = HTMLInputElement & HTMLTextAreaElement;
|
|
55
75
|
|
|
56
|
-
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
76
|
+
/**
|
|
77
|
+
* Renders either an `input` element with a specified type or a `textarea`
|
|
78
|
+
* element. All types will render an accessible `Label` component and an
|
|
79
|
+
* optional `HelperErrorText` component.
|
|
59
80
|
*/
|
|
60
81
|
const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
61
82
|
(props, ref: React.Ref<TextInputRefType>) => {
|
|
62
83
|
const {
|
|
84
|
+
additionalStyles = {},
|
|
63
85
|
attributes = {},
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
labelText,
|
|
67
|
-
showLabel = true,
|
|
68
|
-
showOptReqLabel = true,
|
|
86
|
+
className,
|
|
87
|
+
defaultValue,
|
|
69
88
|
helperText,
|
|
89
|
+
id = generateUUID(),
|
|
70
90
|
invalidText,
|
|
91
|
+
isDisabled = false,
|
|
92
|
+
isInvalid = false,
|
|
93
|
+
isRequired = false,
|
|
94
|
+
labelText,
|
|
95
|
+
name,
|
|
96
|
+
onChange,
|
|
71
97
|
placeholder,
|
|
98
|
+
showHelperInvalidText = true,
|
|
99
|
+
showLabel = true,
|
|
100
|
+
showOptReqLabel = true,
|
|
101
|
+
step = 1,
|
|
102
|
+
type = TextInputTypes.text,
|
|
72
103
|
value,
|
|
73
|
-
|
|
74
|
-
disabled,
|
|
75
|
-
errored,
|
|
76
|
-
onChange,
|
|
77
|
-
modifiers = [],
|
|
78
|
-
id = generateUUID(),
|
|
104
|
+
variantType = TextInputVariants.Default,
|
|
79
105
|
} = props;
|
|
80
|
-
|
|
106
|
+
const styles = useMultiStyleConfig("TextInput", { variant: variantType });
|
|
107
|
+
const finalStyles = { ...styles, ...additionalStyles };
|
|
81
108
|
const isTextArea = type === TextInputTypes.textarea;
|
|
82
109
|
const isHidden = type === TextInputTypes.hidden;
|
|
83
|
-
const optReqFlag =
|
|
84
|
-
const
|
|
110
|
+
const optReqFlag = isRequired ? "Required" : "Optional";
|
|
111
|
+
const finalInvalidText = invalidText
|
|
85
112
|
? invalidText
|
|
86
113
|
: "There is an error related to this field.";
|
|
87
|
-
let footnote
|
|
114
|
+
let footnote: string | React.ReactNode = isInvalid
|
|
115
|
+
? finalInvalidText
|
|
116
|
+
: helperText;
|
|
117
|
+
let fieldOutput;
|
|
88
118
|
let options;
|
|
89
119
|
|
|
90
|
-
if (!showLabel)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
if (isTextArea) {
|
|
97
|
-
modifiers.push("textarea");
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (errored) {
|
|
101
|
-
footnote = errorOutput;
|
|
102
|
-
} else {
|
|
103
|
-
footnote = helperText;
|
|
120
|
+
if (!showLabel) {
|
|
121
|
+
attributes["aria-label"] =
|
|
122
|
+
labelText && footnote ? `${labelText} - ${footnote}` : labelText;
|
|
123
|
+
} else if (helperText) {
|
|
124
|
+
attributes["aria-describedby"] = `${id}-helperText`;
|
|
104
125
|
}
|
|
105
126
|
|
|
106
127
|
if (
|
|
@@ -118,54 +139,59 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
|
118
139
|
);
|
|
119
140
|
}
|
|
120
141
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
142
|
+
// When the type is "hidden", the input element needs fewer attributes.
|
|
143
|
+
options = isHidden
|
|
144
|
+
? { id, "aria-hidden": isHidden, name, onChange, ref }
|
|
145
|
+
: {
|
|
146
|
+
"aria-required": isRequired,
|
|
147
|
+
defaultValue,
|
|
148
|
+
id,
|
|
149
|
+
isDisabled,
|
|
150
|
+
isRequired,
|
|
151
|
+
isInvalid,
|
|
152
|
+
placeholder,
|
|
153
|
+
name,
|
|
154
|
+
onChange,
|
|
155
|
+
ref,
|
|
156
|
+
// The `step` attribute is useful for the number type.
|
|
157
|
+
step: type === TextInputTypes.number ? step : null,
|
|
158
|
+
...attributes,
|
|
159
|
+
};
|
|
133
160
|
// For `input` and `textarea`, all attributes are the same but `input`
|
|
134
161
|
// also needs `type` and `value` to render correctly.
|
|
135
162
|
if (!isTextArea) {
|
|
136
163
|
options = { type, value, ...options } as any;
|
|
164
|
+
fieldOutput = <ChakraInput {...options} __css={finalStyles.input} />;
|
|
165
|
+
} else {
|
|
166
|
+
fieldOutput = (
|
|
167
|
+
<ChakraTextarea {...options} __css={finalStyles.textarea}>
|
|
168
|
+
{value}
|
|
169
|
+
</ChakraTextarea>
|
|
170
|
+
);
|
|
137
171
|
}
|
|
138
172
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
options,
|
|
142
|
-
isTextArea ? value : null
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
const transformedInput = (
|
|
146
|
-
<div className="textinput">
|
|
173
|
+
return (
|
|
174
|
+
<Box __css={finalStyles} className={className}>
|
|
147
175
|
{labelText && showLabel && !isHidden && (
|
|
148
176
|
<Label
|
|
149
177
|
htmlFor={id}
|
|
150
178
|
optReqFlag={showOptReqLabel && optReqFlag}
|
|
151
|
-
id={id
|
|
179
|
+
id={`${id}-label`}
|
|
152
180
|
>
|
|
153
181
|
{labelText}
|
|
154
182
|
</Label>
|
|
155
183
|
)}
|
|
156
184
|
{fieldOutput}
|
|
157
|
-
{
|
|
158
|
-
<
|
|
159
|
-
{
|
|
160
|
-
|
|
185
|
+
{footnote && showHelperInvalidText && !isHidden && (
|
|
186
|
+
<Box __css={finalStyles.helper} aria-disabled={isDisabled}>
|
|
187
|
+
<HelperErrorText isInvalid={isInvalid} id={`${id}-helperText`}>
|
|
188
|
+
{footnote}
|
|
189
|
+
</HelperErrorText>
|
|
190
|
+
</Box>
|
|
161
191
|
)}
|
|
162
|
-
</
|
|
192
|
+
</Box>
|
|
163
193
|
);
|
|
164
|
-
|
|
165
|
-
return transformedInput;
|
|
166
194
|
}
|
|
167
195
|
);
|
|
168
196
|
|
|
169
|
-
TextInput.displayName = "TextInput";
|
|
170
|
-
|
|
171
197
|
export default TextInput;
|
|
@@ -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,13 @@ export enum TextInputFormats {
|
|
|
23
24
|
url = "https://domain.com",
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
// Only used internally in `TextInput` and `SearchBar`.
|
|
28
|
+
export enum TextInputVariants {
|
|
29
|
+
Default = "default",
|
|
30
|
+
SearchBar = "searchBar",
|
|
31
|
+
SearchBarSelect = "searchBarSelect",
|
|
32
|
+
}
|
|
33
|
+
|
|
26
34
|
/*
|
|
27
35
|
export enum TextInputPatterns {
|
|
28
36
|
// eslint-disable-next-line prettier/prettier
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
Story,
|
|
4
4
|
Canvas,
|
|
5
5
|
ArgsTable,
|
|
6
|
-
Preview,
|
|
7
6
|
Description,
|
|
8
7
|
} from "@storybook/addon-docs/blocks";
|
|
9
8
|
import { withDesign } from "storybook-addon-designs";
|
|
10
9
|
|
|
10
|
+
import DSProvider from "../../theme/provider";
|
|
11
11
|
import VideoPlayer from "./VideoPlayer";
|
|
12
12
|
import { VideoPlayerTypes } from "./VideoPlayerTypes";
|
|
13
13
|
import { action } from "@storybook/addon-actions";
|
|
@@ -37,7 +37,7 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
37
37
|
| Component Version | DS Version |
|
|
38
38
|
| ----------------- | ---------- |
|
|
39
39
|
| Added | `0.23.2` |
|
|
40
|
-
| Latest | `0.
|
|
40
|
+
| Latest | `0.25.2` |
|
|
41
41
|
|
|
42
42
|
<Description of={VideoPlayer} />
|
|
43
43
|
|
|
@@ -45,7 +45,7 @@ The `VideoPlayer` component is used to embed a `Vimeo` or `YouTube` video player
|
|
|
45
45
|
|
|
46
46
|
The `aspectRatio` prop is used to control the sizing of the space allotted for the video rendering. Ultimately, the `aspectRatio` prop should be set to match the aspect ratio of the video that is being rendered. The default aspect ratio is `16:9`.
|
|
47
47
|
|
|
48
|
-
<
|
|
48
|
+
<Canvas withToolbar>
|
|
49
49
|
<Story
|
|
50
50
|
name="VideoPlayer"
|
|
51
51
|
args={{
|
|
@@ -71,7 +71,7 @@ The `aspectRatio` prop is used to control the sizing of the space allotted for t
|
|
|
71
71
|
/>
|
|
72
72
|
)}
|
|
73
73
|
</Story>
|
|
74
|
-
</
|
|
74
|
+
</Canvas>
|
|
75
75
|
|
|
76
76
|
<ArgsTable story="VideoPlayer" />
|
|
77
77
|
|
|
@@ -93,3 +93,16 @@ https://vimeo.com/474719268
|
|
|
93
93
|
https://www.youtube.com/watch?v=[VIDEO_ID]
|
|
94
94
|
https://www.youtube.com/watch?v=nm-dD2tx6bk
|
|
95
95
|
```
|
|
96
|
+
|
|
97
|
+
## Errored
|
|
98
|
+
|
|
99
|
+
If the necessary props are not passed to the `VideoPlayer` component, the component UI will display an error message.
|
|
100
|
+
|
|
101
|
+
<Canvas>
|
|
102
|
+
<DSProvider>
|
|
103
|
+
<VideoPlayer
|
|
104
|
+
type={VideoPlayerTypes.Vimeo}
|
|
105
|
+
videoId="https://vimeo.com/474719268"
|
|
106
|
+
/>
|
|
107
|
+
</DSProvider>
|
|
108
|
+
</Canvas>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { render, screen } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
4
5
|
|
|
5
6
|
import VideoPlayer from "./VideoPlayer";
|
|
6
7
|
import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
|
|
@@ -26,9 +27,7 @@ describe("VideoPlayer", () => {
|
|
|
26
27
|
});
|
|
27
28
|
|
|
28
29
|
it("Renders VideoPlayer container", () => {
|
|
29
|
-
expect(
|
|
30
|
-
utils.container.querySelector(".video-player")
|
|
31
|
-
).toBeInTheDocument();
|
|
30
|
+
expect(screen.getByTestId("video-player-component")).toBeInTheDocument();
|
|
32
31
|
});
|
|
33
32
|
|
|
34
33
|
it("Renders VideoPlayer iframe", () => {
|
|
@@ -45,7 +44,6 @@ describe("VideoPlayer", () => {
|
|
|
45
44
|
|
|
46
45
|
describe("Vimeo player", () => {
|
|
47
46
|
const videoId = "474719268";
|
|
48
|
-
let utils;
|
|
49
47
|
|
|
50
48
|
beforeEach(() => {
|
|
51
49
|
utils = render(
|
|
@@ -53,12 +51,6 @@ describe("VideoPlayer", () => {
|
|
|
53
51
|
);
|
|
54
52
|
});
|
|
55
53
|
|
|
56
|
-
it("Renders VideoPlayer container", () => {
|
|
57
|
-
expect(
|
|
58
|
-
utils.container.querySelector(".video-player")
|
|
59
|
-
).toBeInTheDocument();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
54
|
it("Renders VideoPlayer iframe", () => {
|
|
63
55
|
expect(screen.getByTitle("Vimeo video player")).toBeInTheDocument();
|
|
64
56
|
});
|
|
@@ -97,6 +89,22 @@ describe("VideoPlayer", () => {
|
|
|
97
89
|
it("Renders HelperErrorText component", () => {
|
|
98
90
|
expect(screen.getByText("Video Player helper text.")).toBeInTheDocument();
|
|
99
91
|
});
|
|
92
|
+
|
|
93
|
+
it("does not render the helper text", () => {
|
|
94
|
+
utils.rerender(
|
|
95
|
+
<VideoPlayer
|
|
96
|
+
videoType={VideoPlayerTypes.YouTube}
|
|
97
|
+
videoId={videoId}
|
|
98
|
+
headingText="Video Player Heading"
|
|
99
|
+
descriptionText="Video Player description text."
|
|
100
|
+
helperText="Video Player helper text."
|
|
101
|
+
showHelperInvalidText={false}
|
|
102
|
+
/>
|
|
103
|
+
);
|
|
104
|
+
expect(
|
|
105
|
+
screen.queryByText("Video Player helper text.")
|
|
106
|
+
).not.toBeInTheDocument();
|
|
107
|
+
});
|
|
100
108
|
});
|
|
101
109
|
|
|
102
110
|
describe("custom iframe title", () => {
|
|
@@ -112,64 +120,57 @@ describe("VideoPlayer", () => {
|
|
|
112
120
|
});
|
|
113
121
|
});
|
|
114
122
|
|
|
115
|
-
describe("
|
|
116
|
-
it("
|
|
117
|
-
|
|
123
|
+
describe("prop validation", () => {
|
|
124
|
+
it("Throws error if videoId not formatted properly", () => {
|
|
125
|
+
render(
|
|
118
126
|
<VideoPlayer
|
|
119
127
|
videoType={VideoPlayerTypes.Vimeo}
|
|
120
|
-
videoId="474719268"
|
|
128
|
+
videoId="http://vimeo.com/474719268"
|
|
121
129
|
aspectRatio={VideoPlayerAspectRatios.FourByThree}
|
|
122
130
|
/>
|
|
123
131
|
);
|
|
124
|
-
expect(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
132
|
+
expect(
|
|
133
|
+
screen.getByText(
|
|
134
|
+
"This video player has not been configured properly. Please contact the site administrator."
|
|
135
|
+
)
|
|
136
|
+
).toBeInTheDocument();
|
|
128
137
|
});
|
|
138
|
+
});
|
|
129
139
|
|
|
130
|
-
|
|
131
|
-
|
|
140
|
+
it("renders the UI snapshot correctly", () => {
|
|
141
|
+
const videoPlayerWithoutText = renderer
|
|
142
|
+
.create(
|
|
132
143
|
<VideoPlayer
|
|
133
|
-
|
|
144
|
+
id="video-player-without-text"
|
|
134
145
|
videoId="474719268"
|
|
135
|
-
|
|
146
|
+
videoType={VideoPlayerTypes.Vimeo}
|
|
136
147
|
/>
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it("Renders with 1:1 aspect ratio", () => {
|
|
145
|
-
const utils = render(
|
|
148
|
+
)
|
|
149
|
+
.toJSON();
|
|
150
|
+
const videoPlayerWithText = renderer
|
|
151
|
+
.create(
|
|
146
152
|
<VideoPlayer
|
|
147
|
-
|
|
153
|
+
descriptionText="VideoPlayer description"
|
|
154
|
+
headingText="VideoPlayer Heading"
|
|
155
|
+
id="video-player-with-text"
|
|
156
|
+
helperText="VideoPlayer helper test."
|
|
148
157
|
videoId="474719268"
|
|
149
|
-
|
|
158
|
+
videoType={VideoPlayerTypes.Vimeo}
|
|
150
159
|
/>
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
"video-player video-player--square "
|
|
156
|
-
);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
describe("prop validation", () => {
|
|
161
|
-
it("Throws error if videoId not formatted properly", () => {
|
|
162
|
-
const utils = render(
|
|
160
|
+
)
|
|
161
|
+
.toJSON();
|
|
162
|
+
const videoPlayerError = renderer
|
|
163
|
+
.create(
|
|
163
164
|
<VideoPlayer
|
|
165
|
+
id="video-player-error"
|
|
166
|
+
videoId="https://vimeo.com/474719268"
|
|
164
167
|
videoType={VideoPlayerTypes.Vimeo}
|
|
165
|
-
videoId="http://vimeo.com/474719268"
|
|
166
|
-
aspectRatio={VideoPlayerAspectRatios.FourByThree}
|
|
167
168
|
/>
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
169
|
+
)
|
|
170
|
+
.toJSON();
|
|
171
|
+
|
|
172
|
+
expect(videoPlayerWithoutText).toMatchSnapshot();
|
|
173
|
+
expect(videoPlayerWithText).toMatchSnapshot();
|
|
174
|
+
expect(videoPlayerError).toMatchSnapshot();
|
|
174
175
|
});
|
|
175
176
|
});
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
2
|
+
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
3
|
+
import ComponentWrapper from "../ComponentWrapper/ComponentWrapper";
|
|
4
|
+
import generateUUID from "../../helpers/generateUUID";
|
|
5
|
+
import { getVariant } from "../../utils/utils";
|
|
3
6
|
import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
|
|
4
|
-
import Heading from "../Heading/Heading";
|
|
5
|
-
import { HeadingLevels } from "../Heading/HeadingTypes";
|
|
6
|
-
import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
7
7
|
|
|
8
8
|
export interface VideoPlayerProps {
|
|
9
9
|
/** Optional aspect ratio prop to control the sizing of the video player; if omitted, the video player defaults to `sixteen-by-nine` */
|
|
10
10
|
aspectRatio?: VideoPlayerAspectRatios;
|
|
11
|
-
/** Optional additional attributes passed to the video player iframe */
|
|
12
|
-
attributes?: { [key: string]: any };
|
|
13
11
|
/** Optional className you can add in addition to `video-player` */
|
|
14
12
|
className?: string;
|
|
15
13
|
/** Optional string to set the text for a video description */
|
|
16
14
|
descriptionText?: string;
|
|
15
|
+
/** Optional string to set the text for a `Heading` component */
|
|
16
|
+
headingText?: string;
|
|
17
17
|
/** Optional string to set the text for a `HelperErrorText` component */
|
|
18
18
|
helperText?: string;
|
|
19
|
+
/** ID that other components can cross reference for accessibility purposes */
|
|
20
|
+
id?: string;
|
|
19
21
|
/** Optional title to be added to the `<iframe>` element for improved accessibility; this title should describe in a few words the content of the video; if omitted, a generic title will be added */
|
|
20
22
|
iframeTitle?: string;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
/** Optional string to set the text for a `Heading` component */
|
|
24
|
-
headingText?: string;
|
|
23
|
+
/** Offers the ability to hide the helper/invalid text. */
|
|
24
|
+
showHelperInvalidText?: boolean;
|
|
25
25
|
/** Required YouTube or Vimeo video ID. This value can be pulled from a video's YouTube or Vimeo URL. */
|
|
26
26
|
videoId: string;
|
|
27
27
|
/** Required. Used to specify which video service is being used. */
|
|
@@ -33,13 +33,13 @@ export default function VideoPlayer(
|
|
|
33
33
|
) {
|
|
34
34
|
const {
|
|
35
35
|
aspectRatio,
|
|
36
|
-
attributes = {},
|
|
37
36
|
className,
|
|
38
37
|
descriptionText,
|
|
38
|
+
headingText,
|
|
39
39
|
helperText,
|
|
40
|
+
id = generateUUID(),
|
|
40
41
|
iframeTitle,
|
|
41
|
-
|
|
42
|
-
headingText,
|
|
42
|
+
showHelperInvalidText = true,
|
|
43
43
|
videoId,
|
|
44
44
|
videoType,
|
|
45
45
|
} = props;
|
|
@@ -57,31 +57,16 @@ export default function VideoPlayer(
|
|
|
57
57
|
const errorMessage =
|
|
58
58
|
"<strong>Error:</strong> This video player has not been configured properly. Please contact the site administrator.";
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
aspectRatio && modifiers.push(aspectRatio);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const embedCode = (
|
|
65
|
-
<iframe
|
|
66
|
-
src={videoSrc}
|
|
67
|
-
title={iframeTitleFinal}
|
|
68
|
-
frameBorder="0"
|
|
69
|
-
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture"
|
|
70
|
-
allowFullScreen
|
|
71
|
-
{...attributes}
|
|
72
|
-
/>
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
let errored = false;
|
|
60
|
+
let isInvalid = false;
|
|
76
61
|
if (!videoType && !videoId) {
|
|
77
62
|
console.warn("VideoPlayer requires the `videoType` and `videoId` props");
|
|
78
|
-
|
|
63
|
+
isInvalid = true;
|
|
79
64
|
} else if (!videoType) {
|
|
80
65
|
console.warn("VideoPlayer requires the `videoType` prop");
|
|
81
|
-
|
|
66
|
+
isInvalid = true;
|
|
82
67
|
} else if (!videoId) {
|
|
83
68
|
console.warn("VideoPlayer requires the `videoId` prop");
|
|
84
|
-
|
|
69
|
+
isInvalid = true;
|
|
85
70
|
}
|
|
86
71
|
|
|
87
72
|
if (
|
|
@@ -92,31 +77,45 @@ export default function VideoPlayer(
|
|
|
92
77
|
videoId.includes("vimeo")
|
|
93
78
|
) {
|
|
94
79
|
console.warn("VideoPlayer `videoId` prop is not configured properly");
|
|
95
|
-
|
|
80
|
+
isInvalid = true;
|
|
96
81
|
}
|
|
97
82
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
83
|
+
const variant = isInvalid
|
|
84
|
+
? "invalid"
|
|
85
|
+
: getVariant(aspectRatio, VideoPlayerAspectRatios);
|
|
86
|
+
const styles = useMultiStyleConfig("VideoPlayer", { variant });
|
|
87
|
+
|
|
88
|
+
const embedCode = (
|
|
89
|
+
<Box
|
|
90
|
+
as="iframe"
|
|
91
|
+
src={videoSrc}
|
|
92
|
+
title={iframeTitleFinal}
|
|
93
|
+
frameBorder="0"
|
|
94
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture"
|
|
95
|
+
allowFullScreen
|
|
96
|
+
__css={styles.iframe}
|
|
97
|
+
/>
|
|
98
|
+
);
|
|
101
99
|
|
|
102
100
|
return (
|
|
103
|
-
<
|
|
104
|
-
{
|
|
101
|
+
<Box
|
|
102
|
+
className={className}
|
|
103
|
+
data-testid="video-player-component"
|
|
104
|
+
id={id}
|
|
105
|
+
__css={styles}
|
|
106
|
+
>
|
|
107
|
+
{isInvalid ? (
|
|
105
108
|
<span dangerouslySetInnerHTML={{ __html: errorMessage }} />
|
|
106
109
|
) : (
|
|
107
|
-
|
|
108
|
-
{headingText
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
{
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
{helperText && (
|
|
116
|
-
<HelperErrorText isError={false}>{helperText}</HelperErrorText>
|
|
117
|
-
)}
|
|
118
|
-
</>
|
|
110
|
+
<ComponentWrapper
|
|
111
|
+
headingText={headingText ? headingText : null}
|
|
112
|
+
descriptionText={descriptionText ? descriptionText : null}
|
|
113
|
+
helperText={helperText && showHelperInvalidText ? helperText : null}
|
|
114
|
+
id={`${id}-componentWrapper`}
|
|
115
|
+
>
|
|
116
|
+
<Box __css={styles.inside}>{embedCode}</Box>
|
|
117
|
+
</ComponentWrapper>
|
|
119
118
|
)}
|
|
120
|
-
</
|
|
119
|
+
</Box>
|
|
121
120
|
);
|
|
122
121
|
}
|