@strapi/design-system 1.2.7 → 1.3.0-beta.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/.eslintignore +3 -0
- package/.eslintrc.js +38 -0
- package/.prettierrc.js +7 -0
- package/.storybook/components/Theme.js +28 -0
- package/.storybook/main.js +13 -0
- package/.storybook/manager.js +12 -0
- package/.storybook/preview.js +42 -0
- package/.storybook/utils/createCustomTheme.js +26 -0
- package/LICENSE +20 -0
- package/__mocks__/fileMock.js +1 -0
- package/__mocks__/styleMock.js +1 -0
- package/babel.config.js +5 -0
- package/createIndexFiles.js +34 -0
- package/global-setup.js +4 -0
- package/jest.config.js +17 -0
- package/package.json +3 -3
- package/playwright.config.js +39 -0
- package/src/Accordion/Accordion.js +148 -0
- package/src/Accordion/Accordion.stories.mdx +327 -0
- package/src/Accordion/AccordionContent.js +26 -0
- package/src/Accordion/AccordionContext.js +5 -0
- package/src/Accordion/AccordionGroup.js +114 -0
- package/src/Accordion/AccordionToggle.js +192 -0
- package/src/Accordion/__tests__/Accordion.e2e.js +32 -0
- package/src/Accordion/__tests__/AccordionKeyboard.e2e.js +73 -0
- package/src/Accordion/index.js +4 -0
- package/src/Accordion/utils.js +15 -0
- package/src/Alert/Alert.js +144 -0
- package/src/Alert/Alert.stories.mdx +135 -0
- package/src/Alert/__tests__/Alert.e2e.js +39 -0
- package/src/Alert/index.js +1 -0
- package/src/Alert/utils.js +35 -0
- package/src/Avatar/Avatar.js +110 -0
- package/src/Avatar/Avatar.stories.mdx +67 -0
- package/src/Avatar/AvatarGroup.js +9 -0
- package/src/Avatar/__tests__/Avatar.e2e.js +23 -0
- package/src/Avatar/__tests__/Avatar.spec.js +153 -0
- package/src/Avatar/constants.js +2 -0
- package/src/Avatar/index.js +2 -0
- package/src/Badge/Badge.js +41 -0
- package/src/Badge/Badge.stories.mdx +57 -0
- package/src/Badge/__tests__/Badge.e2e.js +23 -0
- package/src/Badge/index.js +1 -0
- package/src/BaseButton/BaseButton.js +46 -0
- package/src/BaseButton/BaseButton.stories.mdx +32 -0
- package/src/BaseButton/__tests__/BaseButton.e2e.js +23 -0
- package/src/BaseButton/index.js +1 -0
- package/src/BaseCheckbox/BaseCheckbox.js +133 -0
- package/src/BaseCheckbox/BaseCheckbox.stories.mdx +107 -0
- package/src/BaseCheckbox/__tests__/BaseCheckbox.e2e.js +94 -0
- package/src/BaseCheckbox/assets/checkmark-black.svg +6 -0
- package/src/BaseCheckbox/assets/checkmark.svg +6 -0
- package/src/BaseCheckbox/index.js +1 -0
- package/src/BaseCheckbox/utils.js +7 -0
- package/src/BaseLink/BaseLink.js +38 -0
- package/src/BaseLink/BaseLink.stories.mdx +34 -0
- package/src/BaseLink/__tests__/BaseLink.e2e.js +23 -0
- package/src/BaseLink/__tests__/BaseLink.spec.js +26 -0
- package/src/BaseLink/index.js +1 -0
- package/src/BaseRadio/BaseRadio.js +69 -0
- package/src/BaseRadio/BaseRadio.stories.mdx +110 -0
- package/src/BaseRadio/RadioGroup.js +36 -0
- package/src/BaseRadio/__tests__/BaseRadio.e2e.js +90 -0
- package/src/BaseRadio/context.js +3 -0
- package/src/BaseRadio/index.js +2 -0
- package/src/BaseRadio/utils.js +30 -0
- package/src/Box/Box.js +104 -0
- package/src/Box/Box.stories.mdx +57 -0
- package/src/Box/BoxProps.js +99 -0
- package/src/Box/__tests__/Box.e2e.js +23 -0
- package/src/Box/__tests__/Box.spec.js +36 -0
- package/src/Box/index.js +1 -0
- package/src/Breadcrumbs/Breadcrumbs.js +58 -0
- package/src/Breadcrumbs/Breadcrumbs.stories.mdx +47 -0
- package/src/Breadcrumbs/__tests__/Breadcrumbs.e2e.js +23 -0
- package/src/Breadcrumbs/index.js +1 -0
- package/src/Button/Button.js +138 -0
- package/src/Button/Button.stories.mdx +216 -0
- package/src/Button/__tests__/Button.e2e.js +89 -0
- package/src/Button/__tests__/utils.spec.js +19 -0
- package/src/Button/constants.js +12 -0
- package/src/Button/index.js +1 -0
- package/src/Button/utils.js +170 -0
- package/src/Card/Card.js +35 -0
- package/src/Card/Card.stories.mdx +202 -0
- package/src/Card/CardAction.js +13 -0
- package/src/Card/CardAsset.js +49 -0
- package/src/Card/CardBadge.js +18 -0
- package/src/Card/CardBody.js +11 -0
- package/src/Card/CardCheckbox.js +14 -0
- package/src/Card/CardContent.js +16 -0
- package/src/Card/CardContext.js +5 -0
- package/src/Card/CardHeader.js +12 -0
- package/src/Card/CardTimer.js +23 -0
- package/src/Card/CardTitle.js +12 -0
- package/src/Card/__tests__/Card.e2e.js +164 -0
- package/src/Card/index.js +10 -0
- package/src/Card/story-assets/first.jpg +0 -0
- package/src/CarouselInput/Carousel.js +138 -0
- package/src/CarouselInput/Carousel.stories.mdx +149 -0
- package/src/CarouselInput/CarouselActions.js +6 -0
- package/src/CarouselInput/CarouselImage.js +39 -0
- package/src/CarouselInput/CarouselInput.js +80 -0
- package/src/CarouselInput/CarouselSlide.js +32 -0
- package/src/CarouselInput/__tests__/CarouselImage.e2e.js +15 -0
- package/src/CarouselInput/__tests__/CarouselInput.e2e.js +48 -0
- package/src/CarouselInput/index.js +5 -0
- package/src/CarouselInput/story-assets/first.jpg +0 -0
- package/src/Checkbox/Checkbox.js +63 -0
- package/src/Checkbox/Checkbox.stories.mdx +190 -0
- package/src/Checkbox/__tests__/Checkbox.e2e.js +96 -0
- package/src/Checkbox/index.js +1 -0
- package/src/Combobox/Combobox.js +421 -0
- package/src/Combobox/Combobox.stories.mdx +191 -0
- package/src/Combobox/ComboboxList.js +22 -0
- package/src/Combobox/ComboboxOption.js +36 -0
- package/src/Combobox/__tests__/Combobox.e2e.js +133 -0
- package/src/Combobox/__tests__/utils.spec.js +94 -0
- package/src/Combobox/components.js +69 -0
- package/src/Combobox/index.js +2 -0
- package/src/Combobox/utils.js +97 -0
- package/src/DatePicker/DatePicker.js +132 -0
- package/src/DatePicker/DatePicker.stories.mdx +172 -0
- package/src/DatePicker/DatePickerCalendar.js +134 -0
- package/src/DatePicker/DatePickerTd.js +51 -0
- package/src/DatePicker/DatePickerTh.js +39 -0
- package/src/DatePicker/__tests__/DatePicker.e2e.js +94 -0
- package/src/DatePicker/__tests__/DatePicker.spec.js +40 -0
- package/src/DatePicker/compareDates.js +9 -0
- package/src/DatePicker/components.js +45 -0
- package/src/DatePicker/index.js +1 -0
- package/src/DatePicker/utils/formatDate.js +5 -0
- package/src/DatePicker/utils/generateWeeks.js +58 -0
- package/src/DatePicker/utils/getDayOfWeek.js +24 -0
- package/src/DatePicker/utils/getMonths.js +10 -0
- package/src/DatePicker/utils/getYears.js +19 -0
- package/src/DatePicker/utils/index.js +5 -0
- package/src/DatePicker/utils/tests/generateWeeks.spec.js +136 -0
- package/src/DatePicker/utils/tests/getMonths.spec.js +21 -0
- package/src/DatePicker/utils/tests/getYears.spec.js +21 -0
- package/src/DateTimePicker/DateTimePicker.js +151 -0
- package/src/DateTimePicker/DateTimePicker.stories.mdx +114 -0
- package/src/DateTimePicker/DateTimePickerProps.js +85 -0
- package/src/DateTimePicker/__tests__/DateTimePicker.e2e.js +103 -0
- package/src/DateTimePicker/__tests__/DateTimePicker.spec.js +89 -0
- package/src/DateTimePicker/__tests__/__snapshots__/DateTimePicker.spec.js.snap +448 -0
- package/src/DateTimePicker/__tests__/parseDate.test.js +10 -0
- package/src/DateTimePicker/index.js +1 -0
- package/src/DateTimePicker/parseDate.js +11 -0
- package/src/Dialog/Dialog.js +86 -0
- package/src/Dialog/Dialog.stories.mdx +78 -0
- package/src/Dialog/DialogBody.js +36 -0
- package/src/Dialog/DialogFooter.js +38 -0
- package/src/Dialog/__tests__/Dialog.e2e.js +20 -0
- package/src/Dialog/__tests__/Dialog.spec.js +28 -0
- package/src/Dialog/index.js +3 -0
- package/src/DismissibleLayer/DismissibleLayer.js +87 -0
- package/src/DismissibleLayer/DismissibleLayer.stories.mdx +50 -0
- package/src/DismissibleLayer/__test__/DimissibleLayer.spec.js +44 -0
- package/src/DismissibleLayer/index.js +1 -0
- package/src/Divider/Divider.js +26 -0
- package/src/Divider/Divider.stories.mdx +55 -0
- package/src/Divider/__tests__/Divider.e2e.js +23 -0
- package/src/Divider/index.js +1 -0
- package/src/EmptyStateLayout/EmptyStateLayout.js +48 -0
- package/src/EmptyStateLayout/EmptyStateLayout.stories.mdx +87 -0
- package/src/EmptyStateLayout/__tests__/EmptyStateLayout.e2e.js +31 -0
- package/src/EmptyStateLayout/index.js +1 -0
- package/src/EmptyStateLayout/story-assets/Illo.js +51 -0
- package/src/Field/Field.js +29 -0
- package/src/Field/Field.stories.mdx +237 -0
- package/src/Field/FieldAction.js +25 -0
- package/src/Field/FieldContext.js +4 -0
- package/src/Field/FieldError.js +17 -0
- package/src/Field/FieldHint.js +17 -0
- package/src/Field/FieldInput.js +129 -0
- package/src/Field/FieldLabel.js +50 -0
- package/src/Field/__tests__/Field.e2e.js +61 -0
- package/src/Field/index.js +7 -0
- package/src/Flex/Flex.js +26 -0
- package/src/Flex/Flex.stories.mdx +45 -0
- package/src/Flex/FlexProps.js +41 -0
- package/src/Flex/__tests__/Flex.e2e.js +23 -0
- package/src/Flex/index.js +1 -0
- package/src/FocusTrap/ExampleComponent.js +71 -0
- package/src/FocusTrap/FocusTrap.js +83 -0
- package/src/FocusTrap/FocusTrap.stories.mdx +32 -0
- package/src/FocusTrap/__tests__/FocusTrap.e2e.js +126 -0
- package/src/FocusTrap/index.js +1 -0
- package/src/Grid/Grid.js +30 -0
- package/src/Grid/Grid.stories.mdx +112 -0
- package/src/Grid/GridContext.js +5 -0
- package/src/Grid/GridItem.js +40 -0
- package/src/Grid/__tests__/Grid.e2e.js +23 -0
- package/src/Grid/index.js +2 -0
- package/src/Icon/Icon.js +27 -0
- package/src/Icon/Icon.stories.mdx +41 -0
- package/src/Icon/__tests__/Icon.e2e.js +21 -0
- package/src/Icon/index.js +1 -0
- package/src/IconButton/IconButton.js +175 -0
- package/src/IconButton/IconButton.stories.mdx +153 -0
- package/src/IconButton/__tests__/IconButton.e2e.js +57 -0
- package/src/IconButton/index.js +1 -0
- package/src/KeyboardNavigable/KeyboardNavigable.js +96 -0
- package/src/KeyboardNavigable/index.js +1 -0
- package/src/Layout/ActionLayout.js +40 -0
- package/src/Layout/ContentLayout.js +15 -0
- package/src/Layout/GridLayout.js +12 -0
- package/src/Layout/GridLayout.stories.mdx +36 -0
- package/src/Layout/HeaderLayout.js +170 -0
- package/src/Layout/HeaderLayout.stories.mdx +175 -0
- package/src/Layout/Layout.js +31 -0
- package/src/Layout/Layout.stories.mdx +240 -0
- package/src/Layout/TwoColsLayout.js +26 -0
- package/src/Layout/TwoColsLayout.stories.mdx +46 -0
- package/src/Layout/__tests__/GridLayout.e2e.js +23 -0
- package/src/Layout/__tests__/HeaderLayout.e2e.js +83 -0
- package/src/Layout/__tests__/Layout.e2e.js +23 -0
- package/src/Layout/__tests__/TwoColsLayout.e2e.js +23 -0
- package/src/Layout/index.js +6 -0
- package/src/Link/Link.js +105 -0
- package/src/Link/Link.stories.mdx +57 -0
- package/src/Link/__tests__/Link.e2e.js +23 -0
- package/src/Link/index.js +1 -0
- package/src/LinkButton/LinkButton.js +113 -0
- package/src/LinkButton/LinkButton.stories.mdx +153 -0
- package/src/LinkButton/__tests__/LinkButton.e2e.js +89 -0
- package/src/LinkButton/index.js +1 -0
- package/src/LiveRegions/LiveRegions.js +13 -0
- package/src/LiveRegions/LiveRegions.stories.mdx +76 -0
- package/src/LiveRegions/StoryComponent.js +26 -0
- package/src/LiveRegions/__tests__/LiveRegions.spec.js +200 -0
- package/src/LiveRegions/constants.js +5 -0
- package/src/LiveRegions/index.js +1 -0
- package/src/LiveRegions/useNotifyAT.js +39 -0
- package/src/Loader/Loader.js +40 -0
- package/src/Loader/Loader.stories.mdx +48 -0
- package/src/Loader/__tests__/Loader.e2e.js +23 -0
- package/src/Loader/assets/loader.svg +3 -0
- package/src/Loader/index.js +1 -0
- package/src/Main/Main.js +24 -0
- package/src/Main/SkipToContent.js +29 -0
- package/src/Main/index.js +2 -0
- package/src/MainNav/MainNav.js +31 -0
- package/src/MainNav/MainNav.stories.mdx +197 -0
- package/src/MainNav/MainNavContext.js +5 -0
- package/src/MainNav/NavBrand.js +76 -0
- package/src/MainNav/NavCondense.js +44 -0
- package/src/MainNav/NavLink.js +143 -0
- package/src/MainNav/NavSection.js +53 -0
- package/src/MainNav/NavSections.js +20 -0
- package/src/MainNav/NavUser.js +53 -0
- package/src/MainNav/__tests__/MainNav.e2e.js +23 -0
- package/src/MainNav/index.js +7 -0
- package/src/MainNav/strapi-img.png +0 -0
- package/src/ModalLayout/ModalBody.js +12 -0
- package/src/ModalLayout/ModalContext.js +4 -0
- package/src/ModalLayout/ModalFooter.js +37 -0
- package/src/ModalLayout/ModalHeader.js +35 -0
- package/src/ModalLayout/ModalLayout.js +58 -0
- package/src/ModalLayout/ModalLayout.stories.mdx +100 -0
- package/src/ModalLayout/__tests__/ModalLayout.e2e.js +19 -0
- package/src/ModalLayout/__tests__/ModalLayout.spec.js +596 -0
- package/src/ModalLayout/index.js +4 -0
- package/src/NumberInput/NumberInput.js +253 -0
- package/src/NumberInput/NumberInput.stories.mdx +319 -0
- package/src/NumberInput/__tests__/NumberInput.e2e.js +194 -0
- package/src/NumberInput/index.js +1 -0
- package/src/Pagination/Pagination.js +37 -0
- package/src/Pagination/Pagination.stories.mdx +97 -0
- package/src/Pagination/PaginationContext.js +4 -0
- package/src/Pagination/__tests__/Pagination.e2e.js +23 -0
- package/src/Pagination/assets/next.svg +3 -0
- package/src/Pagination/assets/previous.svg +3 -0
- package/src/Pagination/components.js +147 -0
- package/src/Pagination/index.js +2 -0
- package/src/Popover/Popover.js +167 -0
- package/src/Popover/Popover.stories.mdx +167 -0
- package/src/Popover/__tests__/Popover.e2e.js +48 -0
- package/src/Popover/__tests__/Popover.spec.js +153 -0
- package/src/Popover/index.js +1 -0
- package/src/Portal/Portal.js +25 -0
- package/src/Portal/Portal.stories.mdx +33 -0
- package/src/Portal/__tests__/Portal.e2e.js +23 -0
- package/src/Portal/index.js +1 -0
- package/src/ProgressBar/ProgressBar.js +57 -0
- package/src/ProgressBar/ProgressBar.stories.mdx +47 -0
- package/src/ProgressBar/__tests__/ProgressBar.e2e.js +41 -0
- package/src/ProgressBar/index.js +1 -0
- package/src/Radio/Radio.js +25 -0
- package/src/Radio/Radio.stories.mdx +66 -0
- package/src/Radio/__tests__/Radio.e2e.js +66 -0
- package/src/Radio/__tests__/Radio.spec.js +56 -0
- package/src/Radio/index.js +2 -0
- package/src/RawTable/RawCell.js +182 -0
- package/src/RawTable/RawTable.js +123 -0
- package/src/RawTable/RawTable.stories.mdx +258 -0
- package/src/RawTable/RawTableContext.js +10 -0
- package/src/RawTable/RawTbody.js +18 -0
- package/src/RawTable/RawThead.js +15 -0
- package/src/RawTable/RawTr.js +20 -0
- package/src/RawTable/__tests__/RawTable.e2e.js +344 -0
- package/src/RawTable/focusFocusable.js +7 -0
- package/src/RawTable/index.js +5 -0
- package/src/Searchbar/SearchForm.js +3 -0
- package/src/Searchbar/Searchbar.js +103 -0
- package/src/Searchbar/Searchbar.stories.mdx +115 -0
- package/src/Searchbar/__tests__/Searchbar.e2e.js +52 -0
- package/src/Searchbar/index.js +2 -0
- package/src/Select/MultiSelectNested.js +31 -0
- package/src/Select/OptGroup.js +27 -0
- package/src/Select/Option.js +123 -0
- package/src/Select/Select.js +318 -0
- package/src/Select/Select.stories.mdx +362 -0
- package/src/Select/SelectButton.js +77 -0
- package/src/Select/SelectList.js +113 -0
- package/src/Select/SelectTags.js +50 -0
- package/src/Select/__tests__/Select.e2e.js +238 -0
- package/src/Select/__tests__/Select.spec.js +1020 -0
- package/src/Select/components.js +51 -0
- package/src/Select/constants.js +6 -0
- package/src/Select/hooks/useButtonRef.js +31 -0
- package/src/Select/hooks/useListRef.js +35 -0
- package/src/Select/index.js +5 -0
- package/src/Select/utils.js +27 -0
- package/src/SimpleMenu/SimpleMenu.js +252 -0
- package/src/SimpleMenu/SimpleMenu.stories.mdx +220 -0
- package/src/SimpleMenu/__tests__/SimpleMenu.e2e.js +98 -0
- package/src/SimpleMenu/__tests__/SimpleMenu.spec.js +48 -0
- package/src/SimpleMenu/index.js +1 -0
- package/src/SimpleMenu/utils.js +12 -0
- package/src/Stack/Stack.js +75 -0
- package/src/Stack/Stack.stories.mdx +66 -0
- package/src/Stack/__tests__/Stack.e2e.js +43 -0
- package/src/Stack/index.js +1 -0
- package/src/Status/Status.js +76 -0
- package/src/Status/Status.stories.mdx +80 -0
- package/src/Status/__tests__/Status.e2e.js +23 -0
- package/src/Status/__tests__/Status.spec.js +48 -0
- package/src/Status/index.js +1 -0
- package/src/SubNav/SubNav.js +25 -0
- package/src/SubNav/SubNav.stories.mdx +234 -0
- package/src/SubNav/SubNavHeader.js +122 -0
- package/src/SubNav/SubNavLink.js +92 -0
- package/src/SubNav/SubNavLinkSection.js +75 -0
- package/src/SubNav/SubNavSection.js +75 -0
- package/src/SubNav/SubNavSectionLabel.js +67 -0
- package/src/SubNav/SubNavSections.js +20 -0
- package/src/SubNav/__tests__/SubNav.e2e.js +23 -0
- package/src/SubNav/index.js +6 -0
- package/src/Switch/Switch.js +97 -0
- package/src/Switch/Switch.stories.mdx +76 -0
- package/src/Switch/__tests__/Switch.e2e.js +33 -0
- package/src/Switch/index.js +1 -0
- package/src/Table/Cell.js +49 -0
- package/src/Table/TFooter.js +58 -0
- package/src/Table/Table.js +96 -0
- package/src/Table/Table.stories.mdx +330 -0
- package/src/Table/Tbody.js +13 -0
- package/src/Table/Thead.js +11 -0
- package/src/Table/Tr.js +28 -0
- package/src/Table/__tests__/Table.e2e.js +41 -0
- package/src/Table/index.js +6 -0
- package/src/Tabs/TabGroup.js +46 -0
- package/src/Tabs/TabPanels.js +32 -0
- package/src/Tabs/Tabs.js +227 -0
- package/src/Tabs/Tabs.stories.mdx +211 -0
- package/src/Tabs/TabsContext.js +5 -0
- package/src/Tabs/__tests__/Tabs.e2e.js +253 -0
- package/src/Tabs/components.js +66 -0
- package/src/Tabs/index.js +3 -0
- package/src/Tabs/useTabsFocus.js +28 -0
- package/src/Tag/Tag.js +72 -0
- package/src/Tag/Tag.stories.mdx +47 -0
- package/src/Tag/__tests__/Tag.e2e.js +37 -0
- package/src/Tag/index.js +1 -0
- package/src/TextButton/TextButton.js +102 -0
- package/src/TextButton/TextButton.stories.mdx +71 -0
- package/src/TextButton/__tests__/TextButton.e2e.js +23 -0
- package/src/TextButton/index.js +1 -0
- package/src/TextInput/TextInput.js +67 -0
- package/src/TextInput/TextInput.stories.mdx +228 -0
- package/src/TextInput/__tests__/TextInput.e2e.js +73 -0
- package/src/TextInput/index.js +1 -0
- package/src/Textarea/Textarea.js +74 -0
- package/src/Textarea/Textarea.stories.mdx +105 -0
- package/src/Textarea/TextareaInput.js +77 -0
- package/src/Textarea/__tests__/Textarea.e2e.js +37 -0
- package/src/Textarea/index.js +1 -0
- package/src/ThemeProvider/ThemeProvider.js +193 -0
- package/src/ThemeProvider/hooks.js +5 -0
- package/src/ThemeProvider/index.js +2 -0
- package/src/TimePicker/TimePicker.js +128 -0
- package/src/TimePicker/TimePicker.stories.mdx +171 -0
- package/src/TimePicker/__tests__/TimePicker.e2e.js +37 -0
- package/src/TimePicker/__tests__/TimePicker.spec.js +2099 -0
- package/src/TimePicker/index.js +1 -0
- package/src/ToggleCheckbox/ToggleCheckbox.js +169 -0
- package/src/ToggleCheckbox/ToggleCheckbox.stories.mdx +96 -0
- package/src/ToggleCheckbox/__tests__/ToggleCheckbox.e2e.js +59 -0
- package/src/ToggleCheckbox/index.js +1 -0
- package/src/ToggleInput/ToggleInput.js +89 -0
- package/src/ToggleInput/ToggleInput.stories.mdx +171 -0
- package/src/ToggleInput/__tests__/ToggleInput.e2e.js +109 -0
- package/src/ToggleInput/index.js +1 -0
- package/src/Tooltip/Tooltip.js +72 -0
- package/src/Tooltip/Tooltip.stories.mdx +127 -0
- package/src/Tooltip/__tests__/Tooltip.e2e.js +33 -0
- package/src/Tooltip/__tests__/Tooltip.spec.js +306 -0
- package/src/Tooltip/hooks/useTooltipHandlers.js +39 -0
- package/src/Tooltip/hooks/useTooltipLayout.js +21 -0
- package/src/Tooltip/index.js +1 -0
- package/src/Tooltip/utils/__tests__/positionTooltip.spec.js +114 -0
- package/src/Tooltip/utils/positionTooltip.js +83 -0
- package/src/Typography/Typography.js +24 -0
- package/src/Typography/Typography.stories.mdx +86 -0
- package/src/Typography/TypographyProps.js +30 -0
- package/src/Typography/__tests__/Typography.e2e.js +25 -0
- package/src/Typography/__tests__/Typography.spec.js +32 -0
- package/src/Typography/__tests__/__snapshots__/Typography.spec.js.snap +103 -0
- package/src/Typography/constants.js +9 -0
- package/src/Typography/index.js +1 -0
- package/src/Typography/utils.js +69 -0
- package/src/VisuallyHidden/VisuallyHidden.js +12 -0
- package/src/VisuallyHidden/index.js +1 -0
- package/src/helpers/__tests__/useId.spec.js +39 -0
- package/src/helpers/escapeSelector.js +1 -0
- package/src/helpers/genId.js +2 -0
- package/src/helpers/getDefaultLocale.js +33 -0
- package/src/helpers/getFocusableNodes.js +35 -0
- package/src/helpers/handleResponsiveValues.js +34 -0
- package/src/helpers/keyboardKeys.js +17 -0
- package/src/helpers/setOpacity.js +4 -0
- package/src/helpers/setTabIndexOnFirstItem.js +7 -0
- package/src/helpers/useElementOnScreen.js +27 -0
- package/src/helpers/useId.js +8 -0
- package/src/helpers/useIntersection.js +31 -0
- package/src/helpers/useLockScroll.js +14 -0
- package/src/helpers/usePrevious.js +9 -0
- package/src/helpers/useResizeObserver.js +22 -0
- package/src/index.js +65 -0
- package/src/themes/ColorButton.js +24 -0
- package/src/themes/Theme.stories.mdx +227 -0
- package/src/themes/__tests__/extendTheme.spec.js +119 -0
- package/src/themes/colors.js +46 -0
- package/src/themes/common-theme.js +19 -0
- package/src/themes/darkTheme/dark-colors.js +49 -0
- package/src/themes/darkTheme/dark-shadows.js +10 -0
- package/src/themes/darkTheme/index.js +9 -0
- package/src/themes/extendTheme.js +60 -0
- package/src/themes/index.js +4 -0
- package/src/themes/lightTheme/index.js +9 -0
- package/src/themes/lightTheme/light-colors.js +49 -0
- package/src/themes/lightTheme/light-shadows.js +10 -0
- package/src/themes/sizes.js +10 -0
- package/src/themes/utils.js +50 -0
- package/src/v2/Breadcrumbs/Breadcrumbs.js +45 -0
- package/src/v2/Breadcrumbs/Breadcrumbs.stories.mdx +129 -0
- package/src/v2/Breadcrumbs/Crumb.js +30 -0
- package/src/v2/Breadcrumbs/CrumbLink.js +33 -0
- package/src/v2/Breadcrumbs/CrumbSimpleMenu.js +30 -0
- package/src/v2/Breadcrumbs/Divider.js +16 -0
- package/src/v2/Breadcrumbs/__tests__/Breadcrumbs.e2e.js +47 -0
- package/src/v2/Breadcrumbs/__tests__/Breadcrumbs.spec.js +47 -0
- package/src/v2/Breadcrumbs/index.js +4 -0
- package/src/v2/Link/Link.js +79 -0
- package/src/v2/Link/Link.stories.mdx +113 -0
- package/src/v2/Link/__tests__/Link.e2e.js +23 -0
- package/src/v2/Link/index.js +1 -0
- package/src/v2/LinkButton/LinkButton.js +105 -0
- package/src/v2/LinkButton/LinkButton.stories.mdx +153 -0
- package/src/v2/LinkButton/__tests__/LinkButton.e2e.js +89 -0
- package/src/v2/LinkButton/index.js +1 -0
- package/src/v2/MainNav/MainNav.js +31 -0
- package/src/v2/MainNav/MainNav.stories.mdx +197 -0
- package/src/v2/MainNav/MainNavContext.js +5 -0
- package/src/v2/MainNav/NavBrand.js +79 -0
- package/src/v2/MainNav/NavCondense.js +44 -0
- package/src/v2/MainNav/NavLink.js +143 -0
- package/src/v2/MainNav/NavSection.js +53 -0
- package/src/v2/MainNav/NavSections.js +20 -0
- package/src/v2/MainNav/NavUser.js +53 -0
- package/src/v2/MainNav/__tests__/MainNav.e2e.js +23 -0
- package/src/v2/MainNav/index.js +7 -0
- package/src/v2/MainNav/strapi-img.png +0 -0
- package/src/v2/Pagination/Pagination.js +37 -0
- package/src/v2/Pagination/Pagination.stories.mdx +97 -0
- package/src/v2/Pagination/PaginationContext.js +4 -0
- package/src/v2/Pagination/__tests__/Pagination.e2e.js +23 -0
- package/src/v2/Pagination/assets/next.svg +3 -0
- package/src/v2/Pagination/assets/previous.svg +3 -0
- package/src/v2/Pagination/components.js +136 -0
- package/src/v2/Pagination/index.js +2 -0
- package/src/v2/SimpleMenu/SimpleMenu.js +252 -0
- package/src/v2/SimpleMenu/SimpleMenu.stories.mdx +220 -0
- package/src/v2/SimpleMenu/__tests__/SimpleMenu.e2e.js +100 -0
- package/src/v2/SimpleMenu/__tests__/SimpleMenu.spec.js +48 -0
- package/src/v2/SimpleMenu/index.js +1 -0
- package/src/v2/SimpleMenu/utils.js +12 -0
- package/src/v2/SubNav/SubNav.js +25 -0
- package/src/v2/SubNav/SubNav.stories.mdx +234 -0
- package/src/v2/SubNav/SubNavHeader.js +122 -0
- package/src/v2/SubNav/SubNavLink.js +95 -0
- package/src/v2/SubNav/SubNavLinkSection.js +75 -0
- package/src/v2/SubNav/SubNavSection.js +75 -0
- package/src/v2/SubNav/SubNavSectionLabel.js +67 -0
- package/src/v2/SubNav/SubNavSections.js +20 -0
- package/src/v2/SubNav/__tests__/SubNav.e2e.js +23 -0
- package/src/v2/SubNav/index.js +6 -0
- package/src/v2/index.js +7 -0
- package/test-bundler.js +35 -0
- package/tests/check-exports.spec.js +36 -0
- package/webpack.config.js +84 -0
- package/Accordion.development.js +0 -775
- package/Accordion.js +0 -9
- package/Accordion.production.js +0 -1
- package/Alert.development.js +0 -562
- package/Alert.js +0 -9
- package/Alert.production.js +0 -1
- package/Avatar.development.js +0 -485
- package/Avatar.js +0 -9
- package/Avatar.production.js +0 -1
- package/Badge.development.js +0 -494
- package/Badge.js +0 -9
- package/Badge.production.js +0 -1
- package/BaseButton.development.js +0 -285
- package/BaseButton.js +0 -9
- package/BaseButton.production.js +0 -1
- package/BaseCheckbox.development.js +0 -309
- package/BaseCheckbox.js +0 -9
- package/BaseCheckbox.production.js +0 -1
- package/BaseLink.development.js +0 -273
- package/BaseLink.js +0 -9
- package/BaseLink.production.js +0 -1
- package/BaseRadio.development.js +0 -321
- package/BaseRadio.js +0 -9
- package/BaseRadio.production.js +0 -1
- package/Box.development.js +0 -341
- package/Box.js +0 -9
- package/Box.production.js +0 -1
- package/Breadcrumbs.development.js +0 -518
- package/Breadcrumbs.js +0 -9
- package/Breadcrumbs.production.js +0 -1
- package/Button.development.js +0 -573
- package/Button.js +0 -9
- package/Button.production.js +0 -1
- package/Card.development.js +0 -746
- package/Card.js +0 -9
- package/Card.production.js +0 -1
- package/CarouselInput.development.js +0 -898
- package/CarouselInput.js +0 -9
- package/CarouselInput.production.js +0 -1
- package/Checkbox.development.js +0 -722
- package/Checkbox.js +0 -9
- package/Checkbox.production.js +0 -1
- package/Combobox.development.js +0 -934
- package/Combobox.js +0 -9
- package/Combobox.production.js +0 -1
- package/DatePicker.development.js +0 -1323
- package/DatePicker.js +0 -9
- package/DatePicker.production.js +0 -1
- package/Dialog.development.js +0 -741
- package/Dialog.js +0 -9
- package/Dialog.production.js +0 -1
- package/DismissibleLayer.development.js +0 -218
- package/DismissibleLayer.js +0 -9
- package/DismissibleLayer.production.js +0 -1
- package/Divider.development.js +0 -398
- package/Divider.js +0 -9
- package/Divider.production.js +0 -1
- package/EmptyStateLayout.development.js +0 -425
- package/EmptyStateLayout.js +0 -9
- package/EmptyStateLayout.production.js +0 -1
- package/Field.development.js +0 -614
- package/Field.js +0 -9
- package/Field.production.js +0 -1
- package/Flex.development.js +0 -377
- package/Flex.js +0 -9
- package/Flex.production.js +0 -1
- package/FocusTrap.development.js +0 -341
- package/FocusTrap.js +0 -9
- package/FocusTrap.production.js +0 -1
- package/Grid.development.js +0 -422
- package/Grid.js +0 -9
- package/Grid.production.js +0 -1
- package/Icon.development.js +0 -376
- package/Icon.js +0 -9
- package/Icon.production.js +0 -1
- package/IconButton.development.js +0 -684
- package/IconButton.js +0 -9
- package/IconButton.production.js +0 -1
- package/KeyboardNavigable.development.js +0 -454
- package/KeyboardNavigable.js +0 -9
- package/KeyboardNavigable.production.js +0 -1
- package/Layout.development.js +0 -626
- package/Layout.js +0 -9
- package/Layout.production.js +0 -1
- package/Link.development.js +0 -492
- package/Link.js +0 -9
- package/Link.production.js +0 -1
- package/LinkButton.development.js +0 -573
- package/LinkButton.js +0 -9
- package/LinkButton.production.js +0 -1
- package/LiveRegions.development.js +0 -147
- package/LiveRegions.js +0 -9
- package/LiveRegions.production.js +0 -1
- package/Loader.development.js +0 -309
- package/Loader.js +0 -9
- package/Loader.production.js +0 -1
- package/Main.development.js +0 -410
- package/Main.js +0 -9
- package/Main.production.js +0 -1
- package/MainNav.development.js +0 -957
- package/MainNav.js +0 -9
- package/MainNav.production.js +0 -1
- package/ModalLayout.development.js +0 -895
- package/ModalLayout.js +0 -9
- package/ModalLayout.production.js +0 -1
- package/NumberInput.development.js +0 -733
- package/NumberInput.js +0 -9
- package/NumberInput.production.js +0 -1
- package/Pagination.development.js +0 -587
- package/Pagination.js +0 -9
- package/Pagination.production.js +0 -1
- package/Popover.development.js +0 -481
- package/Popover.js +0 -9
- package/Popover.production.js +0 -1
- package/Portal.development.js +0 -212
- package/Portal.js +0 -9
- package/Portal.production.js +0 -1
- package/ProgressBar.development.js +0 -273
- package/ProgressBar.js +0 -9
- package/ProgressBar.production.js +0 -1
- package/Radio.development.js +0 -518
- package/Radio.js +0 -9
- package/Radio.production.js +0 -1
- package/RawTable.development.js +0 -549
- package/RawTable.js +0 -9
- package/RawTable.production.js +0 -1
- package/Searchbar.development.js +0 -696
- package/Searchbar.js +0 -9
- package/Searchbar.production.js +0 -1
- package/Select.development.js +0 -1063
- package/Select.js +0 -9
- package/Select.production.js +0 -1
- package/SimpleMenu.development.js +0 -821
- package/SimpleMenu.js +0 -9
- package/SimpleMenu.production.js +0 -1
- package/Stack.development.js +0 -434
- package/Stack.js +0 -9
- package/Stack.production.js +0 -1
- package/Status.development.js +0 -494
- package/Status.js +0 -9
- package/Status.production.js +0 -1
- package/SubNav.development.js +0 -1123
- package/SubNav.js +0 -9
- package/SubNav.production.js +0 -1
- package/Switch.development.js +0 -434
- package/Switch.js +0 -9
- package/Switch.production.js +0 -1
- package/Table.development.js +0 -741
- package/Table.js +0 -9
- package/Table.production.js +0 -1
- package/Tabs.development.js +0 -590
- package/Tabs.js +0 -9
- package/Tabs.production.js +0 -1
- package/Tag.development.js +0 -494
- package/Tag.js +0 -9
- package/Tag.production.js +0 -1
- package/TextButton.development.js +0 -517
- package/TextButton.js +0 -9
- package/TextButton.production.js +0 -1
- package/TextInput.development.js +0 -662
- package/TextInput.js +0 -9
- package/TextInput.production.js +0 -1
- package/Textarea.development.js +0 -674
- package/Textarea.js +0 -9
- package/Textarea.production.js +0 -1
- package/ThemeProvider.development.js +0 -300
- package/ThemeProvider.js +0 -9
- package/ThemeProvider.production.js +0 -1
- package/TimePicker.development.js +0 -1098
- package/TimePicker.js +0 -9
- package/TimePicker.production.js +0 -1
- package/ToggleCheckbox.development.js +0 -542
- package/ToggleCheckbox.js +0 -9
- package/ToggleCheckbox.production.js +0 -1
- package/ToggleInput.development.js +0 -745
- package/ToggleInput.js +0 -9
- package/ToggleInput.production.js +0 -1
- package/Tooltip.development.js +0 -588
- package/Tooltip.js +0 -9
- package/Tooltip.production.js +0 -1
- package/Typography.development.js +0 -276
- package/Typography.js +0 -9
- package/Typography.production.js +0 -1
- package/VisuallyHidden.development.js +0 -146
- package/VisuallyHidden.js +0 -9
- package/VisuallyHidden.production.js +0 -1
- package/index.development.js +0 -4290
- package/index.js +0 -9
- package/index.production.js +0 -1
- package/themes.development.js +0 -254
- package/themes.js +0 -9
- package/themes.production.js +0 -1
- package/v2/Breadcrumbs.development.js +0 -906
- package/v2/Breadcrumbs.js +0 -9
- package/v2/Breadcrumbs.production.js +0 -1
- package/v2/Link.development.js +0 -505
- package/v2/Link.js +0 -9
- package/v2/Link.production.js +0 -1
- package/v2/LinkButton.development.js +0 -586
- package/v2/LinkButton.js +0 -9
- package/v2/LinkButton.production.js +0 -1
- package/v2/MainNav.development.js +0 -970
- package/v2/MainNav.js +0 -9
- package/v2/MainNav.production.js +0 -1
- package/v2/Pagination.development.js +0 -600
- package/v2/Pagination.js +0 -9
- package/v2/Pagination.production.js +0 -1
- package/v2/SimpleMenu.development.js +0 -834
- package/v2/SimpleMenu.js +0 -9
- package/v2/SimpleMenu.production.js +0 -1
- package/v2/SubNav.development.js +0 -1136
- package/v2/SubNav.js +0 -9
- package/v2/SubNav.production.js +0 -1
- package/v2/index.development.js +0 -1740
- package/v2/index.js +0 -9
- package/v2/index.production.js +0 -1
- package/v2/package.json +0 -81
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Flex';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* eslint-disable react/prop-types */
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import Cross from '@strapi/icons/Cross';
|
|
4
|
+
import { Box } from '../Box';
|
|
5
|
+
import { Stack } from '../Stack';
|
|
6
|
+
import { Typography } from '../Typography';
|
|
7
|
+
import { Button } from '../Button';
|
|
8
|
+
import { Flex } from '../Flex';
|
|
9
|
+
|
|
10
|
+
import { FocusTrap } from './FocusTrap';
|
|
11
|
+
|
|
12
|
+
const TrappedComponent = ({ onClose }) => {
|
|
13
|
+
const [newLastVisible, setNewLastVisible] = useState(false);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<FocusTrap onEscape={onClose}>
|
|
17
|
+
<Box background="neutral0" padding={4} hasRadius style={{ width: '600px' }}>
|
|
18
|
+
<Stack spacing={2}>
|
|
19
|
+
<Flex justifyContent="space-between">
|
|
20
|
+
<Typography variant="beta" as="h2">
|
|
21
|
+
Hey folks!
|
|
22
|
+
</Typography>
|
|
23
|
+
<button style={{ border: 'none', background: 'transparent' }} onClick={onClose} aria-label="Close">
|
|
24
|
+
<Cross aria-hidden={true} />
|
|
25
|
+
</button>
|
|
26
|
+
</Flex>
|
|
27
|
+
<Box paddingTop={2} paddingBottom={2}>
|
|
28
|
+
<Typography>
|
|
29
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
|
|
30
|
+
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
|
|
31
|
+
ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
|
32
|
+
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
|
|
33
|
+
mollit anim id est laborum.
|
|
34
|
+
</Typography>
|
|
35
|
+
</Box>
|
|
36
|
+
<Flex justifyContent="space-between">
|
|
37
|
+
<Button id="second">Second focusable</Button>
|
|
38
|
+
<Button id="last" onClick={() => setNewLastVisible(true)}>
|
|
39
|
+
Last focusable (at the beginning)
|
|
40
|
+
</Button>
|
|
41
|
+
|
|
42
|
+
{newLastVisible && <Button id="real-last">Last focusable (at the end)</Button>}
|
|
43
|
+
</Flex>
|
|
44
|
+
</Stack>
|
|
45
|
+
</Box>
|
|
46
|
+
</FocusTrap>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const ExampleComponent = () => {
|
|
51
|
+
const [visible, setVisible] = useState(false);
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<Box background="neutral150" padding={10}>
|
|
55
|
+
<Stack spacing={2}>
|
|
56
|
+
{visible && <TrappedComponent onClose={() => setVisible(false)} />}
|
|
57
|
+
<Box background="neutral0" padding={4} hasRadius style={{ width: '600px' }}>
|
|
58
|
+
<Typography variant="beta" as="h2">
|
|
59
|
+
Outside the trap!
|
|
60
|
+
</Typography>
|
|
61
|
+
|
|
62
|
+
<Box paddingTop={2}>
|
|
63
|
+
<Button onClick={() => setVisible(true)} id="trigger">
|
|
64
|
+
Open the trap
|
|
65
|
+
</Button>
|
|
66
|
+
</Box>
|
|
67
|
+
</Box>
|
|
68
|
+
</Stack>
|
|
69
|
+
</Box>
|
|
70
|
+
);
|
|
71
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { getFocusableNodes } from '../helpers/getFocusableNodes';
|
|
4
|
+
import { KeyboardKeys } from '../helpers/keyboardKeys';
|
|
5
|
+
|
|
6
|
+
export const FocusTrap = ({ onEscape, restoreFocus, ...props }) => {
|
|
7
|
+
const trappedRef = useRef(null);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Restore the focus to the previously focused element (often, it's the CTA that opened the trap)
|
|
11
|
+
*/
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (restoreFocus) {
|
|
14
|
+
const currentFocus = document.activeElement;
|
|
15
|
+
|
|
16
|
+
return () => {
|
|
17
|
+
currentFocus.focus();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}, [restoreFocus]);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Sends the focus to the first element of the focus trap tree
|
|
24
|
+
*/
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!trappedRef.current) return;
|
|
27
|
+
|
|
28
|
+
const focusableChildren = getFocusableNodes(trappedRef.current);
|
|
29
|
+
|
|
30
|
+
if (focusableChildren.length > 0) {
|
|
31
|
+
const firstElement = focusableChildren[0];
|
|
32
|
+
|
|
33
|
+
firstElement.focus();
|
|
34
|
+
} else {
|
|
35
|
+
console.warn(
|
|
36
|
+
'[FocusTrap]: it seems there are no focusable elements in the focus trap tree. Make sure there s at least one.',
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}, []);
|
|
40
|
+
|
|
41
|
+
const handleKeyDown = (e) => {
|
|
42
|
+
if (e.key === KeyboardKeys.ESCAPE && onEscape) {
|
|
43
|
+
return onEscape();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (e.key !== KeyboardKeys.TAB) return;
|
|
47
|
+
|
|
48
|
+
const focusableChildren = getFocusableNodes(trappedRef.current);
|
|
49
|
+
|
|
50
|
+
if (focusableChildren.length > 0) {
|
|
51
|
+
const firstElement = focusableChildren[0];
|
|
52
|
+
const lastElement = focusableChildren[focusableChildren.length - 1];
|
|
53
|
+
|
|
54
|
+
// e.shiftKey allows to verify reverse tab
|
|
55
|
+
if (e.shiftKey) {
|
|
56
|
+
if (firstElement === document.activeElement) {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
lastElement.focus();
|
|
59
|
+
}
|
|
60
|
+
} else if (lastElement === document.activeElement) {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
firstElement.focus();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return <div ref={trappedRef} onKeyDown={handleKeyDown} {...props} />;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
FocusTrap.defaultProps = {
|
|
71
|
+
restoreFocus: true,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
FocusTrap.propTypes = {
|
|
75
|
+
/**
|
|
76
|
+
* A callback called on escape key. Useful to deactivate the focus trap.
|
|
77
|
+
*/
|
|
78
|
+
onEscape: PropTypes.func,
|
|
79
|
+
/**
|
|
80
|
+
* A boolean value to define whether the focus should be restored or not.
|
|
81
|
+
*/
|
|
82
|
+
restoreFocus: PropTypes.bool,
|
|
83
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!--- FocusTrap.stories.mdx --->
|
|
2
|
+
|
|
3
|
+
import { Meta, Story, Canvas } from '@storybook/addon-docs';
|
|
4
|
+
import { ArgsTable } from '@storybook/addon-docs';
|
|
5
|
+
import { FocusTrap } from './FocusTrap';
|
|
6
|
+
import { ExampleComponent } from './ExampleComponent';
|
|
7
|
+
|
|
8
|
+
<Meta title="Design System/Technical Components/FocusTrap" component={FocusTrap} />
|
|
9
|
+
|
|
10
|
+
# FocusTrap
|
|
11
|
+
|
|
12
|
+
The FocusTrap restricts keyboard navigation to a certain zone of the screen. For instance, it can be used in a modal to limit tab navigation to a specific context.
|
|
13
|
+
|
|
14
|
+
## Imports
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
import FocusTrap from '@strapi/parts/FocusTrap';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
To use it, wrap your code into a `<FocusTrap onEscape={onClose}>` block.
|
|
23
|
+
|
|
24
|
+
<Canvas>
|
|
25
|
+
<Story name="base">
|
|
26
|
+
<ExampleComponent />
|
|
27
|
+
</Story>
|
|
28
|
+
</Canvas>
|
|
29
|
+
|
|
30
|
+
## Props
|
|
31
|
+
|
|
32
|
+
<ArgsTable of={FocusTrap} />
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { injectAxe, checkA11y } from 'axe-playwright';
|
|
2
|
+
|
|
3
|
+
import { test, expect } from '@playwright/test';
|
|
4
|
+
|
|
5
|
+
test.describe.parallel('FocusTrap', () => {
|
|
6
|
+
test.describe('light mode', () => {
|
|
7
|
+
test.beforeEach(async ({ page }) => {
|
|
8
|
+
// This is the URL of the Storybook Iframe
|
|
9
|
+
await page.goto('/iframe.html?id=design-system-technical-components-focustrap--base&viewMode=story');
|
|
10
|
+
await injectAxe(page);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test.beforeEach(async ({ page }) => {
|
|
14
|
+
await page.focus('#trigger');
|
|
15
|
+
await page.keyboard.press('Space');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
19
|
+
await checkA11y(page);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('focuses the first focusable element when opening the focus trap', async ({ page }) => {
|
|
23
|
+
await expect(page.locator('[aria-label="Close"]')).toBeFocused();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('restores focus when pressing Escape', async ({ page }) => {
|
|
27
|
+
await page.waitForSelector('[aria-label="Close"]');
|
|
28
|
+
await page.keyboard.press('Escape');
|
|
29
|
+
|
|
30
|
+
await expect(page.locator('#trigger')).toBeFocused();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test.describe('Pressing Tab in the trap', () => {
|
|
34
|
+
test('traps the focus when pressing Tab for Firefox and Chrome', async ({ page, browserName }) => {
|
|
35
|
+
test.skip(browserName === 'webkit', 'Still working on it');
|
|
36
|
+
await page.keyboard.press('Tab');
|
|
37
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
38
|
+
|
|
39
|
+
await page.keyboard.press('Tab');
|
|
40
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
41
|
+
|
|
42
|
+
await page.keyboard.press('Tab');
|
|
43
|
+
await expect(page.locator('[aria-label="Close"]')).toBeFocused();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('traps the focus when pressing Tab for Webkit', async ({ page, browserName }) => {
|
|
47
|
+
test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
|
|
48
|
+
await page.waitForSelector('[aria-label="Close"]');
|
|
49
|
+
await page.keyboard.press('Alt+Tab');
|
|
50
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
51
|
+
|
|
52
|
+
await page.keyboard.press('Alt+Tab');
|
|
53
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
54
|
+
|
|
55
|
+
await page.keyboard.press('Alt+Tab');
|
|
56
|
+
await expect(page.locator('[aria-label="Close"]')).toBeFocused();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('traps the focus when dynamically adding an element in the focus tree and pressing Tab for Firefox and Chrome', async ({
|
|
60
|
+
page,
|
|
61
|
+
browserName,
|
|
62
|
+
}) => {
|
|
63
|
+
test.skip(browserName === 'webkit', 'Still working on it');
|
|
64
|
+
await page.keyboard.press('Tab');
|
|
65
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
66
|
+
|
|
67
|
+
await page.keyboard.press('Tab');
|
|
68
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
69
|
+
await page.click('#last');
|
|
70
|
+
|
|
71
|
+
await page.keyboard.press('Tab');
|
|
72
|
+
await expect(page.locator('#real-last')).toBeFocused();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('traps the focus when pressing Tab with click for Webkit', async ({ page, browserName }) => {
|
|
76
|
+
test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
|
|
77
|
+
await page.waitForSelector('[aria-label="Close"]');
|
|
78
|
+
await page.keyboard.press('Alt+Tab');
|
|
79
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
80
|
+
|
|
81
|
+
await page.keyboard.press('Alt+Tab');
|
|
82
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
83
|
+
await page.click('#last');
|
|
84
|
+
|
|
85
|
+
await page.keyboard.press('Alt+Tab');
|
|
86
|
+
await expect(page.locator('#real-last')).toBeFocused();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test.describe('Pressing Shift+Tab in the trap', () => {
|
|
91
|
+
test('traps the focus when pressing Tab for Firefox and Chrome', async ({ page, browserName }) => {
|
|
92
|
+
test.skip(browserName === 'webkit', 'Still working on it');
|
|
93
|
+
await page.keyboard.press('Shift+Tab');
|
|
94
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
95
|
+
|
|
96
|
+
await page.keyboard.press('Shift+Tab');
|
|
97
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
98
|
+
|
|
99
|
+
await page.keyboard.press('Shift+Tab');
|
|
100
|
+
await expect(page.locator('[aria-label="Close"]')).toBeFocused();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('traps the focus when pressing Tab for Webkit', async ({ page, browserName }) => {
|
|
104
|
+
test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
|
|
105
|
+
await page.waitForSelector('[aria-label="Close"]');
|
|
106
|
+
await page.keyboard.press('Alt+Shift+Tab');
|
|
107
|
+
await expect(page.locator('#last')).toBeFocused();
|
|
108
|
+
|
|
109
|
+
await page.keyboard.press('Alt+Shift+Tab');
|
|
110
|
+
await expect(page.locator('#second')).toBeFocused();
|
|
111
|
+
|
|
112
|
+
await page.keyboard.press('Alt+Shift+Tab');
|
|
113
|
+
await expect(page.locator('[aria-label="Close"]')).toBeFocused();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test.describe('dark mode', () => {
|
|
119
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
120
|
+
// This is the URL of the Storybook Iframe
|
|
121
|
+
await page.goto('/iframe.html?id=design-system-technical-components-focustrap--base&viewMode=story&theme=dark');
|
|
122
|
+
await injectAxe(page);
|
|
123
|
+
await checkA11y(page);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './FocusTrap';
|
package/src/Grid/Grid.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { GridContext } from './GridContext';
|
|
5
|
+
import { Box } from '../Box';
|
|
6
|
+
import handleResponsiveValues from '../helpers/handleResponsiveValues';
|
|
7
|
+
|
|
8
|
+
const GridWrapper = styled(Box)`
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-columns: repeat(${({ gridCols }) => gridCols}, 1fr);
|
|
11
|
+
${({ theme, gap }) => handleResponsiveValues('gap', gap, theme)}
|
|
12
|
+
`;
|
|
13
|
+
|
|
14
|
+
export const Grid = ({ gap, gridCols, ...props }) => {
|
|
15
|
+
return (
|
|
16
|
+
<GridContext.Provider value={{ gap, gridCols }}>
|
|
17
|
+
<GridWrapper gap={gap} gridCols={gridCols} {...props} />
|
|
18
|
+
</GridContext.Provider>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
Grid.defaultProps = {
|
|
23
|
+
gap: 0,
|
|
24
|
+
gridCols: 12,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
Grid.propTypes = {
|
|
28
|
+
gap: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),
|
|
29
|
+
gridCols: PropTypes.number,
|
|
30
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<!--- Grid.stories.mdx --->
|
|
2
|
+
|
|
3
|
+
import { Meta, Story, Canvas } from '@storybook/addon-docs';
|
|
4
|
+
import { ArgsTable } from '@storybook/addon-docs';
|
|
5
|
+
import { Grid } from './Grid';
|
|
6
|
+
import { GridItem } from './GridItem';
|
|
7
|
+
import { Typography } from '../Typography';
|
|
8
|
+
|
|
9
|
+
<Meta title="Design System/Technical Components/Grid" component={Grid} />
|
|
10
|
+
|
|
11
|
+
# Grid
|
|
12
|
+
|
|
13
|
+
A grid system helps the content to follow a logical order and increase readability.
|
|
14
|
+
|
|
15
|
+
**Baseline**
|
|
16
|
+
The Strapi type stack specifies 14px/0.875rem for the base font size, which produces an 8px x-height. The x-height is halved to produce a 4px baseline.
|
|
17
|
+
This baseline convention naturally flows on to the rest of the grid system, which includes icons, components, and layout dimensions. Always try to align objects on the 8px grid, but where necessary use good judgement to fine tune your designs to 4px. The 4px baseline is there to allow more flexibility for line heights and smaller adjustments.
|
|
18
|
+
|
|
19
|
+
[View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Grid)
|
|
20
|
+
|
|
21
|
+
## Imports
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { Grid, GridItem } from '@strapi/design-system/Grid';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
The component allows to create a Grid on the screen using the CSS grid feature. This component extends the `<Box />` one and can receive the same props.
|
|
30
|
+
|
|
31
|
+
<Canvas>
|
|
32
|
+
<Story name="base">
|
|
33
|
+
<Grid gap={5}>
|
|
34
|
+
<GridItem col={1} background="primary100">
|
|
35
|
+
<Typography>First</Typography>
|
|
36
|
+
</GridItem>
|
|
37
|
+
<GridItem col={1} background="primary100">
|
|
38
|
+
<Typography>Second</Typography>
|
|
39
|
+
</GridItem>
|
|
40
|
+
<GridItem col={1} background="primary100">
|
|
41
|
+
<Typography>Third</Typography>
|
|
42
|
+
</GridItem>
|
|
43
|
+
<GridItem col={1} background="primary100" color="primary700">
|
|
44
|
+
<Typography>Last</Typography>
|
|
45
|
+
</GridItem>
|
|
46
|
+
</Grid>
|
|
47
|
+
</Story>
|
|
48
|
+
</Canvas>
|
|
49
|
+
|
|
50
|
+
The following is a representation of the 12 columns Grid presented in the documentation.
|
|
51
|
+
|
|
52
|
+
<Canvas>
|
|
53
|
+
<Story name="base grid">
|
|
54
|
+
<Grid gap={5}>
|
|
55
|
+
{Array(12)
|
|
56
|
+
.fill(null)
|
|
57
|
+
.map((_, i) => (
|
|
58
|
+
<GridItem key={i} background="warning200" col={1}>
|
|
59
|
+
<Typography>{i + 1}</Typography>
|
|
60
|
+
</GridItem>
|
|
61
|
+
))}
|
|
62
|
+
</Grid>
|
|
63
|
+
</Story>
|
|
64
|
+
</Canvas>
|
|
65
|
+
|
|
66
|
+
A more complex one
|
|
67
|
+
|
|
68
|
+
<Canvas>
|
|
69
|
+
<Story name="complex grid">
|
|
70
|
+
<Grid gap={{ desktop: 5, tablet: 2, mobile: 1 }} background={'primary200'}>
|
|
71
|
+
<GridItem background="neutral100" padding={1} col={6} s={12}>
|
|
72
|
+
<Typography>Some box 1</Typography>
|
|
73
|
+
</GridItem>
|
|
74
|
+
<GridItem background="neutral100" padding={1} col={6} s={12}>
|
|
75
|
+
<Typography>Some box 2</Typography>
|
|
76
|
+
</GridItem>
|
|
77
|
+
<GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
|
|
78
|
+
<Typography>Some box 3</Typography>
|
|
79
|
+
</GridItem>
|
|
80
|
+
<GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
|
|
81
|
+
<Typography>Some box 4</Typography>
|
|
82
|
+
</GridItem>
|
|
83
|
+
<GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
|
|
84
|
+
<Typography>Some box 5</Typography>
|
|
85
|
+
</GridItem>
|
|
86
|
+
<GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
|
|
87
|
+
<Typography>Some box 6</Typography>
|
|
88
|
+
</GridItem>
|
|
89
|
+
<GridItem background="neutral100" padding={1} col={8} xs={12}>
|
|
90
|
+
<Typography>Some box 7</Typography>
|
|
91
|
+
</GridItem>
|
|
92
|
+
<GridItem background="neutral100" padding={1} col={2} xs={12}>
|
|
93
|
+
<Typography>Some box 8</Typography>
|
|
94
|
+
</GridItem>
|
|
95
|
+
<GridItem background="neutral100" padding={5} col={2} xs={12}>
|
|
96
|
+
<Typography>Some box 9</Typography>
|
|
97
|
+
</GridItem>
|
|
98
|
+
</Grid>
|
|
99
|
+
</Story>
|
|
100
|
+
</Canvas>
|
|
101
|
+
|
|
102
|
+
## Props
|
|
103
|
+
|
|
104
|
+
The Grid and GridItem components wraps all their children in the (Box)[https://design-system-git-main-strapijs.vercel.app/?path=/docs/design-system-technical-components-box--base] component, so you can pass all Box props to change their style.
|
|
105
|
+
|
|
106
|
+
### Grid Props
|
|
107
|
+
|
|
108
|
+
<ArgsTable of={Grid} />
|
|
109
|
+
|
|
110
|
+
### GridItem Props
|
|
111
|
+
|
|
112
|
+
<ArgsTable of={GridItem} />
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { Box } from '../Box';
|
|
5
|
+
import { useGrid } from './GridContext';
|
|
6
|
+
|
|
7
|
+
const GridItemWrapper = styled.div`
|
|
8
|
+
grid-column: span ${({ col }) => col};
|
|
9
|
+
max-width: 100%;
|
|
10
|
+
|
|
11
|
+
${({ theme }) => theme.mediaQueries.tablet} {
|
|
12
|
+
grid-column: span ${({ s }) => s};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
${({ theme }) => theme.mediaQueries.mobile} {
|
|
16
|
+
grid-column: span ${({ xs }) => xs};
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
export const GridItem = ({ col, xs, s, ...props }) => {
|
|
21
|
+
const { gap, gridCols } = useGrid();
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<GridItemWrapper gap={gap} gridCols={gridCols} col={col} xs={xs} s={s}>
|
|
25
|
+
<Box {...props} />
|
|
26
|
+
</GridItemWrapper>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
GridItem.defaultProps = {
|
|
31
|
+
col: undefined,
|
|
32
|
+
s: undefined,
|
|
33
|
+
xs: undefined,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
GridItem.propTypes = {
|
|
37
|
+
col: PropTypes.number,
|
|
38
|
+
s: PropTypes.number,
|
|
39
|
+
xs: PropTypes.number,
|
|
40
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { injectAxe, checkA11y } from 'axe-playwright';
|
|
2
|
+
|
|
3
|
+
import { test } from '@playwright/test';
|
|
4
|
+
|
|
5
|
+
test.describe.parallel('Grid', () => {
|
|
6
|
+
test.describe('light mode', () => {
|
|
7
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
8
|
+
// This is the URL of the Storybook Iframe
|
|
9
|
+
await page.goto('/iframe.html?id=design-system-technical-components-grid--base&viewMode=story');
|
|
10
|
+
await injectAxe(page);
|
|
11
|
+
await checkA11y(page);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test.describe('dark mode', () => {
|
|
16
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
17
|
+
// This is the URL of the Storybook Iframe
|
|
18
|
+
await page.goto('/iframe.html?id=design-system-technical-components-grid--base&viewMode=story&theme=dark');
|
|
19
|
+
await injectAxe(page);
|
|
20
|
+
await checkA11y(page);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
package/src/Icon/Icon.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { Box } from '../Box';
|
|
4
|
+
import styled from 'styled-components';
|
|
5
|
+
|
|
6
|
+
const IconWrapper = styled(Box)`
|
|
7
|
+
path {
|
|
8
|
+
fill: ${({ color, theme }) => theme.colors[color]};
|
|
9
|
+
}
|
|
10
|
+
${({ theme, colors }) => colors(theme)}
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
export const Icon = React.forwardRef((props, ref) => {
|
|
14
|
+
return <IconWrapper ref={ref} {...props} />;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
Icon.displayName = 'Icon';
|
|
18
|
+
|
|
19
|
+
Icon.defaultProps = {
|
|
20
|
+
color: 'neutral600',
|
|
21
|
+
colors: () => undefined,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
Icon.propTypes = {
|
|
25
|
+
color: PropTypes.string,
|
|
26
|
+
colors: PropTypes.func,
|
|
27
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!--- BaseButton.stories.mdx --->
|
|
2
|
+
|
|
3
|
+
import { Meta, Story, Canvas } from '@storybook/addon-docs';
|
|
4
|
+
import { ArgsTable } from '@storybook/addon-docs';
|
|
5
|
+
import Pencil from '@strapi/icons/Pencil';
|
|
6
|
+
import Play from '@strapi/icons/Play';
|
|
7
|
+
import Trash from '@strapi/icons/Trash';
|
|
8
|
+
import Plus from '@strapi/icons/Plus';
|
|
9
|
+
import { Icon } from './Icon';
|
|
10
|
+
import { Stack } from '../Stack';
|
|
11
|
+
|
|
12
|
+
<Meta title="Design System/Technical Components/Icon" component={Icon} />
|
|
13
|
+
|
|
14
|
+
## Imports
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
import { Icon } from '@strapi/design-system/Icon';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
# Icon
|
|
21
|
+
|
|
22
|
+
The `Icon` component is used to customize Strapi icons.
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
<Canvas withSource="open">
|
|
27
|
+
<Story name="base">
|
|
28
|
+
<Stack spacing={3} horizontal>
|
|
29
|
+
<Icon width={`${25 / 16}rem`} height={`${25 / 16}rem`} color="secondary500" as={Pencil} />
|
|
30
|
+
<Icon width={`${15 / 16}rem`} height={`${15 / 16}rem`} color="alternative500" as={Play} />
|
|
31
|
+
<Icon width={`${30 / 16}rem`} height={`${30 / 16}rem`} color="danger500" as={Trash} />
|
|
32
|
+
<Icon as={Plus} />
|
|
33
|
+
</Stack>
|
|
34
|
+
</Story>
|
|
35
|
+
</Canvas>
|
|
36
|
+
|
|
37
|
+
## Props
|
|
38
|
+
|
|
39
|
+
The Icon component wraps all its children in the (Box)[https://design-system-git-main-strapijs.vercel.app/?path=/docs/design-system-technical-components-box--base] component, so you can pass all Box props to change its style.
|
|
40
|
+
|
|
41
|
+
<ArgsTable of={Icon} />
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { injectAxe, checkA11y } from 'axe-playwright';
|
|
2
|
+
|
|
3
|
+
import { test } from '@playwright/test';
|
|
4
|
+
|
|
5
|
+
test.describe.parallel('IconButton', () => {
|
|
6
|
+
test.describe('light mode', () => {
|
|
7
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
8
|
+
await page.goto('/iframe.html?id=design-system-technical-components-icon&viewMode=story');
|
|
9
|
+
await injectAxe(page);
|
|
10
|
+
await checkA11y(page);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test.describe('dark mode', () => {
|
|
15
|
+
test('triggers axe on the document', async ({ page }) => {
|
|
16
|
+
await page.goto('/iframe.html?id=design-system-technical-components-icon&viewMode=story&theme=dark');
|
|
17
|
+
await injectAxe(page);
|
|
18
|
+
await checkA11y(page);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Icon';
|