@primer/components 31.2.0-rc.c7f73427 → 31.2.1-rc.0e01900c
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/.github/workflows/ci.yml +5 -2
- package/.github/workflows/release.yml +1 -0
- package/.github/workflows/release_canary.yml +1 -0
- package/CHANGELOG.md +18 -0
- package/dist/browser.esm.js +656 -645
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +211 -200
- package/dist/browser.umd.js.map +1 -1
- package/docs/content/ActionList2.mdx +358 -0
- package/docs/content/StateLabel.md +5 -4
- package/docs/content/getting-started.md +1 -1
- package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
- package/lib/ActionList/Divider.jsx +29 -0
- package/lib/ActionList/Group.jsx +23 -0
- package/lib/ActionList/Header.jsx +66 -0
- package/lib/ActionList/Item.js +28 -19
- package/lib/ActionList/Item.jsx +311 -0
- package/lib/ActionList/List.jsx +138 -0
- package/lib/ActionList/index.js +12 -23
- package/lib/ActionList2/Description.d.ts +12 -0
- package/lib/ActionList2/Description.js +57 -0
- package/lib/ActionList2/Description.jsx +29 -0
- package/lib/ActionList2/Divider.d.ts +5 -0
- package/lib/ActionList2/Divider.js +35 -0
- package/lib/ActionList2/Divider.jsx +22 -0
- package/lib/ActionList2/Group.d.ts +11 -0
- package/lib/ActionList2/Group.js +57 -0
- package/lib/ActionList2/Group.jsx +25 -0
- package/lib/ActionList2/Header.d.ts +26 -0
- package/lib/ActionList2/Header.js +55 -0
- package/lib/ActionList2/Header.jsx +36 -0
- package/lib/ActionList2/Item.d.ts +63 -0
- package/lib/ActionList2/Item.js +242 -0
- package/lib/ActionList2/Item.jsx +174 -0
- package/lib/ActionList2/LinkItem.d.ts +17 -0
- package/lib/ActionList2/LinkItem.js +57 -0
- package/lib/ActionList2/LinkItem.jsx +28 -0
- package/lib/ActionList2/List.d.ts +26 -0
- package/lib/ActionList2/List.js +59 -0
- package/lib/ActionList2/List.jsx +41 -0
- package/lib/ActionList2/Selection.d.ts +5 -0
- package/lib/ActionList2/Selection.js +84 -0
- package/lib/ActionList2/Selection.jsx +50 -0
- package/lib/ActionList2/Visuals.d.ts +9 -0
- package/lib/ActionList2/Visuals.js +90 -0
- package/lib/ActionList2/Visuals.jsx +48 -0
- package/lib/ActionList2/index.d.ts +36 -0
- package/lib/ActionList2/index.js +29 -0
- package/lib/ActionMenu.jsx +73 -0
- package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
- package/lib/AnchoredOverlay/index.js +4 -12
- package/lib/Autocomplete/Autocomplete.d.ts +28 -28
- package/lib/Autocomplete/Autocomplete.jsx +100 -0
- package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
- package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
- package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
- package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
- package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
- package/lib/Autocomplete/index.js +7 -14
- package/lib/Avatar.jsx +34 -0
- package/lib/AvatarPair.jsx +29 -0
- package/lib/AvatarStack.jsx +151 -0
- package/lib/BaseStyles.jsx +65 -0
- package/lib/BorderBox.jsx +18 -0
- package/lib/Box.jsx +10 -0
- package/lib/BranchName.jsx +20 -0
- package/lib/Breadcrumbs.jsx +74 -0
- package/lib/Button/Button.d.ts +25 -25
- package/lib/Button/Button.jsx +60 -0
- package/lib/Button/ButtonBase.jsx +36 -0
- package/lib/Button/ButtonClose.d.ts +45 -45
- package/lib/Button/ButtonClose.jsx +55 -0
- package/lib/Button/ButtonDanger.d.ts +25 -25
- package/lib/Button/ButtonDanger.jsx +63 -0
- package/lib/Button/ButtonGroup.jsx +55 -0
- package/lib/Button/ButtonInvisible.d.ts +25 -25
- package/lib/Button/ButtonInvisible.jsx +52 -0
- package/lib/Button/ButtonOutline.d.ts +25 -25
- package/lib/Button/ButtonOutline.jsx +63 -0
- package/lib/Button/ButtonPrimary.d.ts +25 -25
- package/lib/Button/ButtonPrimary.jsx +62 -0
- package/lib/Button/ButtonStyles.jsx +37 -0
- package/lib/Button/ButtonTableList.jsx +49 -0
- package/lib/Button/index.js +21 -70
- package/lib/Caret.jsx +93 -0
- package/lib/CircleBadge.jsx +43 -0
- package/lib/CircleOcticon.d.ts +42 -42
- package/lib/CircleOcticon.jsx +21 -0
- package/lib/CounterLabel.jsx +44 -0
- package/lib/Details.jsx +21 -0
- package/lib/Dialog/ConfirmationDialog.jsx +146 -0
- package/lib/Dialog/Dialog.js +1 -0
- package/lib/Dialog/Dialog.jsx +273 -0
- package/lib/Dialog.d.ts +45 -45
- package/lib/Dialog.jsx +131 -0
- package/lib/Dropdown.d.ts +176 -176
- package/lib/Dropdown.jsx +134 -0
- package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
- package/lib/DropdownMenu/DropdownButton.jsx +14 -0
- package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
- package/lib/DropdownMenu/index.js +6 -20
- package/lib/DropdownStyles.js +18 -26
- package/lib/FilterList.d.ts +42 -42
- package/lib/FilterList.jsx +63 -0
- package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
- package/lib/FilteredActionList/index.js +4 -12
- package/lib/FilteredSearch.jsx +29 -0
- package/lib/Flash.jsx +70 -0
- package/lib/Flex.jsx +15 -0
- package/lib/FormGroup.jsx +25 -0
- package/lib/Grid.jsx +15 -0
- package/lib/Header.jsx +90 -0
- package/lib/Heading.jsx +21 -0
- package/lib/Label.jsx +84 -0
- package/lib/LabelGroup.jsx +19 -0
- package/lib/Link.jsx +38 -0
- package/lib/NewButton/button-counter.d.ts +6 -0
- package/lib/NewButton/button-counter.js +31 -0
- package/lib/NewButton/button-counter.jsx +14 -0
- package/lib/NewButton/button.d.ts +13 -0
- package/lib/NewButton/button.js +316 -0
- package/lib/NewButton/button.jsx +278 -0
- package/lib/NewButton/index.d.ts +14 -0
- package/lib/NewButton/index.js +8 -0
- package/lib/NewButton/types.d.ts +32 -0
- package/lib/NewButton/types.js +2 -0
- package/lib/Overlay.jsx +156 -0
- package/lib/Pagehead.jsx +18 -0
- package/lib/Pagination/Pagination.jsx +163 -0
- package/lib/Pagination/index.js +6 -12
- package/lib/Pagination/model.jsx +174 -0
- package/lib/PointerBox.jsx +25 -0
- package/lib/Popover.jsx +210 -0
- package/lib/Portal/Portal.jsx +79 -0
- package/lib/Portal/index.js +5 -16
- package/lib/Position.d.ts +4 -4
- package/lib/Position.jsx +46 -0
- package/lib/ProgressBar.jsx +39 -0
- package/lib/SelectMenu/SelectMenu.d.ts +246 -246
- package/lib/SelectMenu/SelectMenu.jsx +114 -0
- package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
- package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
- package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
- package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
- package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
- package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
- package/lib/SelectMenu/SelectMenuList.jsx +60 -0
- package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
- package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
- package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
- package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
- package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
- package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
- package/lib/SelectMenu/index.js +7 -14
- package/lib/SelectPanel/SelectPanel.jsx +105 -0
- package/lib/SelectPanel/index.js +4 -12
- package/lib/SideNav.jsx +177 -0
- package/lib/Spinner.jsx +35 -0
- package/lib/StateLabel.d.ts +1 -1
- package/lib/StateLabel.js +6 -1
- package/lib/StateLabel.jsx +94 -0
- package/lib/StyledOcticon.jsx +20 -0
- package/lib/SubNav.jsx +104 -0
- package/lib/TabNav.jsx +60 -0
- package/lib/Text.jsx +14 -0
- package/lib/TextInput.jsx +23 -0
- package/lib/TextInputWithTokens.d.ts +28 -28
- package/lib/TextInputWithTokens.jsx +218 -0
- package/lib/ThemeProvider.jsx +130 -0
- package/lib/Timeline.d.ts +43 -43
- package/lib/Timeline.jsx +124 -0
- package/lib/Token/AvatarToken.d.ts +1 -1
- package/lib/Token/AvatarToken.jsx +54 -0
- package/lib/Token/IssueLabelToken.d.ts +1 -1
- package/lib/Token/IssueLabelToken.jsx +125 -0
- package/lib/Token/Token.d.ts +1 -1
- package/lib/Token/Token.jsx +103 -0
- package/lib/Token/TokenBase.jsx +88 -0
- package/lib/Token/_RemoveTokenButton.jsx +108 -0
- package/lib/Token/_TokenTextContainer.jsx +49 -0
- package/lib/Token/index.js +11 -30
- package/lib/Tooltip.jsx +246 -0
- package/lib/Truncate.jsx +27 -0
- package/lib/UnderlineNav.jsx +90 -0
- package/lib/_TextInputWrapper.jsx +120 -0
- package/lib/_UnstyledTextInput.jsx +22 -0
- package/lib/__tests__/ActionList.test.jsx +49 -0
- package/lib/__tests__/ActionList.types.test.jsx +45 -0
- package/lib/__tests__/ActionList2.test.d.ts +1 -0
- package/lib/__tests__/ActionList2.test.js +53 -0
- package/lib/__tests__/ActionList2.test.jsx +46 -0
- package/lib/__tests__/ActionMenu.test.jsx +124 -0
- package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
- package/lib/__tests__/Autocomplete.test.jsx +299 -0
- package/lib/__tests__/Avatar.test.jsx +42 -0
- package/lib/__tests__/AvatarStack.test.jsx +43 -0
- package/lib/__tests__/BorderBox.test.jsx +36 -0
- package/lib/__tests__/Box.test.jsx +41 -0
- package/lib/__tests__/BranchName.test.jsx +27 -0
- package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
- package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
- package/lib/__tests__/Button.test.jsx +100 -0
- package/lib/__tests__/Caret.test.jsx +37 -0
- package/lib/__tests__/CircleBadge.test.jsx +55 -0
- package/lib/__tests__/CircleOcticon.test.jsx +45 -0
- package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
- package/lib/__tests__/CounterLabel.test.jsx +36 -0
- package/lib/__tests__/Details.test.jsx +85 -0
- package/lib/__tests__/Dialog.test.jsx +139 -0
- package/lib/__tests__/Dropdown.test.jsx +49 -0
- package/lib/__tests__/DropdownMenu.test.jsx +119 -0
- package/lib/__tests__/FilterList.test.jsx +27 -0
- package/lib/__tests__/FilterListItem.test.jsx +31 -0
- package/lib/__tests__/FilteredSearch.test.jsx +27 -0
- package/lib/__tests__/Flash.test.jsx +36 -0
- package/lib/__tests__/Flex.test.jsx +51 -0
- package/lib/__tests__/FormGroup.test.jsx +36 -0
- package/lib/__tests__/Grid.test.jsx +69 -0
- package/lib/__tests__/Header.test.jsx +45 -0
- package/lib/__tests__/Heading.test.jsx +71 -0
- package/lib/__tests__/KeyPaths.types.test.js +5 -8
- package/lib/__tests__/Label.test.jsx +33 -0
- package/lib/__tests__/LabelGroup.test.jsx +29 -0
- package/lib/__tests__/Link.test.jsx +43 -0
- package/lib/__tests__/Merge.types.test.js +13 -19
- package/lib/__tests__/NewButton.test.d.ts +1 -0
- package/lib/__tests__/NewButton.test.js +95 -0
- package/lib/__tests__/NewButton.test.jsx +61 -0
- package/lib/__tests__/Overlay.test.jsx +105 -0
- package/lib/__tests__/Pagehead.test.jsx +25 -0
- package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
- package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
- package/lib/__tests__/PointerBox.test.jsx +33 -0
- package/lib/__tests__/Popover.test.jsx +58 -0
- package/lib/__tests__/Portal.test.jsx +102 -0
- package/lib/__tests__/Position.test.jsx +96 -0
- package/lib/__tests__/ProgressBar.test.jsx +38 -0
- package/lib/__tests__/SelectMenu.test.jsx +120 -0
- package/lib/__tests__/SelectPanel.test.jsx +48 -0
- package/lib/__tests__/SideNav.test.jsx +55 -0
- package/lib/__tests__/Spinner.test.jsx +41 -0
- package/lib/__tests__/StateLabel.test.jsx +46 -0
- package/lib/__tests__/StyledOcticon.test.jsx +28 -0
- package/lib/__tests__/SubNav.test.jsx +47 -0
- package/lib/__tests__/SubNavLink.test.jsx +31 -0
- package/lib/__tests__/TabNav.test.jsx +32 -0
- package/lib/__tests__/Text.test.jsx +71 -0
- package/lib/__tests__/TextInput.test.jsx +45 -0
- package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
- package/lib/__tests__/ThemeProvider.test.jsx +314 -0
- package/lib/__tests__/Timeline.test.jsx +51 -0
- package/lib/__tests__/Token.test.jsx +93 -0
- package/lib/__tests__/Tooltip.test.jsx +46 -0
- package/lib/__tests__/Truncate.test.jsx +41 -0
- package/lib/__tests__/UnderlineNav.test.jsx +53 -0
- package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
- package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
- package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
- package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
- package/lib/__tests__/filterObject.test.js +48 -27
- package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
- package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
- package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
- package/lib/__tests__/theme.test.js +33 -34
- package/lib/__tests__/themeGet.test.js +12 -23
- package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
- package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
- package/lib/__tests__/utils/createSlots.test.js +75 -0
- package/lib/__tests__/utils/createSlots.test.jsx +57 -0
- package/lib/behaviors/anchoredPosition.js +205 -234
- package/lib/behaviors/focusTrap.js +121 -157
- package/lib/behaviors/focusZone.js +434 -509
- package/lib/behaviors/scrollIntoViewingArea.js +18 -35
- package/lib/constants.js +39 -43
- package/lib/drafts.d.ts +8 -0
- package/lib/drafts.js +21 -0
- package/lib/hooks/index.js +16 -60
- package/lib/hooks/useAnchoredPosition.js +32 -40
- package/lib/hooks/useCombinedRefs.js +32 -36
- package/lib/hooks/useDetails.jsx +39 -0
- package/lib/hooks/useDialog.js +72 -96
- package/lib/hooks/useFocusTrap.js +43 -60
- package/lib/hooks/useFocusZone.js +54 -50
- package/lib/hooks/useOnEscapePress.js +25 -36
- package/lib/hooks/useOnOutsideClick.jsx +61 -0
- package/lib/hooks/useOpenAndCloseFocus.js +22 -34
- package/lib/hooks/useOverlay.jsx +15 -0
- package/lib/hooks/useProvidedRefOrCreate.js +10 -14
- package/lib/hooks/useProvidedStateOrCreate.js +13 -16
- package/lib/hooks/useRenderForcingRef.js +13 -17
- package/lib/hooks/useResizeObserver.js +15 -18
- package/lib/hooks/useSafeTimeout.js +22 -30
- package/lib/hooks/useScrollFlash.js +16 -23
- package/lib/index.d.ts +2 -0
- package/lib/index.js +163 -636
- package/lib/polyfills/eventListenerSignal.js +37 -45
- package/lib/stories/ActionList2.stories.js +908 -0
- package/lib/stories/NewButton.stories.js +230 -0
- package/lib/sx.d.ts +2 -0
- package/lib/sx.js +10 -14
- package/lib/theme-preval.js +65 -2945
- package/lib/theme.js +3 -12
- package/lib/utils/create-slots.d.ts +17 -0
- package/lib/utils/create-slots.js +105 -0
- package/lib/utils/create-slots.jsx +65 -0
- package/lib/utils/deprecate.jsx +59 -0
- package/lib/utils/isNumeric.jsx +7 -0
- package/lib/utils/iterateFocusableElements.js +63 -85
- package/lib/utils/ssr.jsx +6 -0
- package/lib/utils/test-deprecations.jsx +20 -0
- package/lib/utils/test-helpers.jsx +8 -0
- package/lib/utils/test-matchers.jsx +100 -0
- package/lib/utils/testing.d.ts +14 -1
- package/lib/utils/testing.jsx +206 -0
- package/lib/utils/theme.js +33 -47
- package/lib/utils/types/AriaRole.js +2 -1
- package/lib/utils/types/ComponentProps.js +2 -1
- package/lib/utils/types/Flatten.js +2 -1
- package/lib/utils/types/KeyPaths.js +2 -1
- package/lib/utils/types/MandateProps.js +16 -1
- package/lib/utils/types/Merge.js +2 -1
- package/lib/utils/types/index.js +16 -69
- package/lib/utils/uniqueId.js +5 -8
- package/lib/utils/use-force-update.d.ts +1 -0
- package/lib/utils/use-force-update.js +13 -0
- package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
- package/lib/utils/userAgent.js +8 -12
- package/lib-esm/ActionList/Item.js +28 -19
- package/lib-esm/ActionList2/Description.d.ts +12 -0
- package/lib-esm/ActionList2/Description.js +41 -0
- package/lib-esm/ActionList2/Divider.d.ts +5 -0
- package/lib-esm/ActionList2/Divider.js +23 -0
- package/lib-esm/ActionList2/Group.d.ts +11 -0
- package/lib-esm/ActionList2/Group.js +40 -0
- package/lib-esm/ActionList2/Header.d.ts +26 -0
- package/lib-esm/ActionList2/Header.js +44 -0
- package/lib-esm/ActionList2/Item.d.ts +63 -0
- package/lib-esm/ActionList2/Item.js +208 -0
- package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
- package/lib-esm/ActionList2/LinkItem.js +43 -0
- package/lib-esm/ActionList2/List.d.ts +26 -0
- package/lib-esm/ActionList2/List.js +37 -0
- package/lib-esm/ActionList2/Selection.d.ts +5 -0
- package/lib-esm/ActionList2/Selection.js +66 -0
- package/lib-esm/ActionList2/Visuals.d.ts +9 -0
- package/lib-esm/ActionList2/Visuals.js +68 -0
- package/lib-esm/ActionList2/index.d.ts +36 -0
- package/lib-esm/ActionList2/index.js +33 -0
- package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
- package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
- package/lib-esm/Button/Button.d.ts +25 -25
- package/lib-esm/Button/ButtonClose.d.ts +45 -45
- package/lib-esm/Button/ButtonDanger.d.ts +25 -25
- package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
- package/lib-esm/Button/ButtonOutline.d.ts +25 -25
- package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
- package/lib-esm/CircleOcticon.d.ts +42 -42
- package/lib-esm/Dialog/Dialog.js +1 -0
- package/lib-esm/Dialog.d.ts +45 -45
- package/lib-esm/Dropdown.d.ts +176 -176
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
- package/lib-esm/FilterList.d.ts +42 -42
- package/lib-esm/NewButton/button-counter.d.ts +6 -0
- package/lib-esm/NewButton/button-counter.js +18 -0
- package/lib-esm/NewButton/button.d.ts +13 -0
- package/lib-esm/NewButton/button.js +298 -0
- package/lib-esm/NewButton/index.d.ts +14 -0
- package/lib-esm/NewButton/index.js +5 -0
- package/lib-esm/NewButton/types.d.ts +32 -0
- package/lib-esm/NewButton/types.js +1 -0
- package/lib-esm/Position.d.ts +4 -4
- package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib-esm/StateLabel.d.ts +1 -1
- package/lib-esm/StateLabel.js +7 -2
- package/lib-esm/TextInputWithTokens.d.ts +28 -28
- package/lib-esm/Timeline.d.ts +43 -43
- package/lib-esm/Token/AvatarToken.d.ts +1 -1
- package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
- package/lib-esm/Token/Token.d.ts +1 -1
- package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionList2.test.js +41 -0
- package/lib-esm/__tests__/NewButton.test.d.ts +1 -0
- package/lib-esm/__tests__/NewButton.test.js +84 -0
- package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
- package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
- package/lib-esm/drafts.d.ts +8 -0
- package/lib-esm/drafts.js +9 -0
- package/lib-esm/index.d.ts +2 -0
- package/lib-esm/index.js +1 -0
- package/lib-esm/stories/ActionList2.stories.js +796 -0
- package/lib-esm/stories/NewButton.stories.js +178 -0
- package/lib-esm/sx.d.ts +2 -0
- package/lib-esm/sx.js +3 -1
- package/lib-esm/theme-preval.js +81 -2
- package/lib-esm/utils/create-slots.d.ts +17 -0
- package/lib-esm/utils/create-slots.js +84 -0
- package/lib-esm/utils/testing.d.ts +14 -1
- package/lib-esm/utils/use-force-update.d.ts +1 -0
- package/lib-esm/utils/use-force-update.js +6 -0
- package/package-lock.json +153 -14
- package/package.json +7 -4
- package/script/build +1 -1
- package/src/ActionList/Item.tsx +32 -19
- package/src/ActionList2/Description.tsx +52 -0
- package/src/ActionList2/Divider.tsx +24 -0
- package/src/ActionList2/Group.tsx +34 -0
- package/src/ActionList2/Header.tsx +58 -0
- package/src/ActionList2/Item.tsx +246 -0
- package/src/ActionList2/LinkItem.tsx +49 -0
- package/src/ActionList2/List.tsx +55 -0
- package/src/ActionList2/Selection.tsx +60 -0
- package/src/ActionList2/Visuals.tsx +76 -0
- package/src/ActionList2/index.ts +39 -0
- package/src/Dialog/Dialog.tsx +1 -0
- package/src/NewButton/button-counter.tsx +15 -0
- package/src/NewButton/button.tsx +279 -0
- package/src/NewButton/index.ts +10 -0
- package/src/NewButton/types.ts +36 -0
- package/src/StateLabel.tsx +14 -2
- package/src/__tests__/ActionList2.test.tsx +47 -0
- package/src/__tests__/NewButton.test.tsx +70 -0
- package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +722 -255
- package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +300 -0
- package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
- package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
- package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
- package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
- package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
- package/src/__tests__/utils/createSlots.test.tsx +74 -0
- package/src/drafts.ts +10 -0
- package/src/index.ts +2 -0
- package/src/stories/ActionList2.stories.tsx +1291 -0
- package/src/stories/NewButton.stories.tsx +201 -0
- package/src/sx.ts +3 -0
- package/src/theme-preval.js +1 -0
- package/src/utils/create-slots.tsx +96 -0
- package/src/utils/use-force-update.ts +7 -0
- package/stats.html +1 -1
- package/tsconfig.base.json +20 -0
- package/tsconfig.build.json +2 -2
- package/tsconfig.json +4 -17
@@ -0,0 +1,299 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const testing_1 = require("../utils/testing");
|
8
|
+
const react_2 = require("@testing-library/react");
|
9
|
+
const jest_axe_1 = require("jest-axe");
|
10
|
+
require("babel-polyfill");
|
11
|
+
const Autocomplete_1 = __importDefault(require("../Autocomplete"));
|
12
|
+
const index_1 = require("../index");
|
13
|
+
const theme_1 = __importDefault(require("../theme"));
|
14
|
+
const BaseStyles_1 = __importDefault(require("../BaseStyles"));
|
15
|
+
const ThemeProvider_1 = require("../ThemeProvider");
|
16
|
+
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
17
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
18
|
+
const mockItems = [
|
19
|
+
{ text: 'zero', id: 0 },
|
20
|
+
{ text: 'one', id: 1 },
|
21
|
+
{ text: 'two', id: 2 },
|
22
|
+
{ text: 'three', id: 3 },
|
23
|
+
{ text: 'four', id: 4 },
|
24
|
+
{ text: 'five', id: 5 },
|
25
|
+
{ text: 'six', id: 6 },
|
26
|
+
{ text: 'seven', id: 7 },
|
27
|
+
{ text: 'twenty', id: 20 },
|
28
|
+
{ text: 'twentyone', id: 21 }
|
29
|
+
];
|
30
|
+
const AUTOCOMPLETE_LABEL = 'Autocomplete field';
|
31
|
+
const LabelledAutocomplete = ({ inputProps = {}, menuProps }) => {
|
32
|
+
const { ['aria-labelledby']: ariaLabelledBy = 'autocompleteLabel', ...menuPropsRest } = menuProps;
|
33
|
+
const { id = 'autocompleteInput', ...inputPropsRest } = inputProps;
|
34
|
+
return (<ThemeProvider_1.ThemeProvider theme={theme_1.default}>
|
35
|
+
<index_1.SSRProvider>
|
36
|
+
<BaseStyles_1.default>
|
37
|
+
{/* eslint-disable-next-line jsx-a11y/label-has-for */}
|
38
|
+
<label htmlFor={id} id={ariaLabelledBy}>
|
39
|
+
Autocomplete field
|
40
|
+
</label>
|
41
|
+
<Autocomplete_1.default id="autocompleteId">
|
42
|
+
<Autocomplete_1.default.Input id={id} {...inputPropsRest}/>
|
43
|
+
<Autocomplete_1.default.Overlay>
|
44
|
+
<Autocomplete_1.default.Menu aria-labelledby={ariaLabelledBy} {...menuPropsRest}/>
|
45
|
+
</Autocomplete_1.default.Overlay>
|
46
|
+
</Autocomplete_1.default>
|
47
|
+
</BaseStyles_1.default>
|
48
|
+
</index_1.SSRProvider>
|
49
|
+
</ThemeProvider_1.ThemeProvider>);
|
50
|
+
};
|
51
|
+
describe('Autocomplete', () => {
|
52
|
+
describe('snapshots', () => {
|
53
|
+
it('renders a single select input', () => {
|
54
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
55
|
+
<Autocomplete_1.default id="autocompleteId">
|
56
|
+
<Autocomplete_1.default.Input />
|
57
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectedItemIds={[]}/>
|
58
|
+
</Autocomplete_1.default>
|
59
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
60
|
+
});
|
61
|
+
it('renders a multiselect input', () => {
|
62
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
63
|
+
<Autocomplete_1.default id="autocompleteId">
|
64
|
+
<Autocomplete_1.default.Input />
|
65
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectedItemIds={[]} selectionVariant="multiple"/>
|
66
|
+
</Autocomplete_1.default>
|
67
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
68
|
+
});
|
69
|
+
it('renders a multiselect input with selected menu items', () => {
|
70
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
71
|
+
<Autocomplete_1.default id="autocompleteId">
|
72
|
+
<Autocomplete_1.default.Input />
|
73
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectedItemIds={[0, 1, 2]} selectionVariant="multiple"/>
|
74
|
+
</Autocomplete_1.default>
|
75
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
76
|
+
});
|
77
|
+
it('renders a menu that contains an item to add to the menu', () => {
|
78
|
+
const handleAddItemMock = jest.fn();
|
79
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
80
|
+
<Autocomplete_1.default id="autocompleteId">
|
81
|
+
<Autocomplete_1.default.Input />
|
82
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectionVariant="multiple" selectedItemIds={[]} addNewItem={{
|
83
|
+
text: 'Add new item',
|
84
|
+
handleAddItem: handleAddItemMock
|
85
|
+
}}/>
|
86
|
+
</Autocomplete_1.default>
|
87
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
88
|
+
});
|
89
|
+
it('renders a custom empty state message', () => {
|
90
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
91
|
+
<Autocomplete_1.default id="autocompleteId">
|
92
|
+
<Autocomplete_1.default.Input />
|
93
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={[]} selectedItemIds={[]} emptyStateText="No results"/>
|
94
|
+
</Autocomplete_1.default>
|
95
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
96
|
+
});
|
97
|
+
it('renders a loading state', () => {
|
98
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
99
|
+
<Autocomplete_1.default id="autocompleteId">
|
100
|
+
<Autocomplete_1.default.Input />
|
101
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" loading items={[]} selectedItemIds={[]}/>
|
102
|
+
</Autocomplete_1.default>
|
103
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
104
|
+
});
|
105
|
+
it('renders with a custom text input component', () => {
|
106
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
107
|
+
<Autocomplete_1.default id="autocompleteId">
|
108
|
+
<Autocomplete_1.default.Input as={() => <input type="text" id="customInput"/>}/>
|
109
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectedItemIds={[]}/>
|
110
|
+
</Autocomplete_1.default>
|
111
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
112
|
+
});
|
113
|
+
it('renders with an input value', () => {
|
114
|
+
expect(testing_1.render(<index_1.SSRProvider>
|
115
|
+
<Autocomplete_1.default id="autocompleteId">
|
116
|
+
<Autocomplete_1.default.Input value="test"/>
|
117
|
+
<Autocomplete_1.default.Menu aria-labelledby="labelId" items={mockItems} selectedItemIds={[]}/>
|
118
|
+
</Autocomplete_1.default>
|
119
|
+
</index_1.SSRProvider>)).toMatchSnapshot();
|
120
|
+
});
|
121
|
+
});
|
122
|
+
describe('Autocomplete.Input', () => {
|
123
|
+
it('calls onChange', () => {
|
124
|
+
const onChangeMock = jest.fn();
|
125
|
+
const { container } = react_2.render(<LabelledAutocomplete inputProps={{ onChange: onChangeMock }} menuProps={{ items: mockItems, selectedItemIds: [] }}/>);
|
126
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
127
|
+
expect(onChangeMock).not.toHaveBeenCalled();
|
128
|
+
inputNode && user_event_1.default.type(inputNode, 'z');
|
129
|
+
expect(onChangeMock).toHaveBeenCalled();
|
130
|
+
});
|
131
|
+
it('calls onFocus', () => {
|
132
|
+
const onFocusMock = jest.fn();
|
133
|
+
const { container } = react_2.render(<LabelledAutocomplete inputProps={{ onFocus: onFocusMock }} menuProps={{ items: mockItems, selectedItemIds: [] }}/>);
|
134
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
135
|
+
expect(onFocusMock).not.toHaveBeenCalled();
|
136
|
+
inputNode && react_2.fireEvent.focus(inputNode);
|
137
|
+
expect(onFocusMock).toHaveBeenCalled();
|
138
|
+
});
|
139
|
+
it('calls onKeyDown', () => {
|
140
|
+
const onKeyDownMock = jest.fn();
|
141
|
+
const { getByLabelText } = react_2.render(<LabelledAutocomplete inputProps={{ onKeyDown: onKeyDownMock }} menuProps={{ items: [], selectedItemIds: [] }}/>);
|
142
|
+
const inputNode = getByLabelText(AUTOCOMPLETE_LABEL);
|
143
|
+
expect(onKeyDownMock).not.toHaveBeenCalled();
|
144
|
+
react_2.fireEvent.keyDown(inputNode, { key: 'Shift' });
|
145
|
+
expect(onKeyDownMock).toHaveBeenCalled();
|
146
|
+
});
|
147
|
+
it('calls onKeyUp', () => {
|
148
|
+
const onKeyUpMock = jest.fn();
|
149
|
+
const { getByLabelText } = react_2.render(<LabelledAutocomplete inputProps={{ onKeyUp: onKeyUpMock }} menuProps={{ items: [], selectedItemIds: [] }}/>);
|
150
|
+
const inputNode = getByLabelText(AUTOCOMPLETE_LABEL);
|
151
|
+
expect(onKeyUpMock).not.toHaveBeenCalled();
|
152
|
+
react_2.fireEvent.keyUp(inputNode, { key: 'Shift' });
|
153
|
+
expect(onKeyUpMock).toHaveBeenCalled();
|
154
|
+
});
|
155
|
+
it('calls onKeyPress', () => {
|
156
|
+
const onKeyPressMock = jest.fn();
|
157
|
+
const { getByLabelText } = react_2.render(<LabelledAutocomplete inputProps={{ onKeyPress: onKeyPressMock }} menuProps={{ items: [], selectedItemIds: [] }}/>);
|
158
|
+
const inputNode = getByLabelText(AUTOCOMPLETE_LABEL);
|
159
|
+
expect(onKeyPressMock).not.toHaveBeenCalled();
|
160
|
+
user_event_1.default.type(inputNode, '{enter}');
|
161
|
+
expect(onKeyPressMock).toHaveBeenCalled();
|
162
|
+
});
|
163
|
+
it('opens the menu when the input is focused', () => {
|
164
|
+
const { getByLabelText } = react_2.render(<LabelledAutocomplete menuProps={{ items: [], selectedItemIds: [] }}/>);
|
165
|
+
const inputNode = getByLabelText(AUTOCOMPLETE_LABEL);
|
166
|
+
expect(inputNode.getAttribute('aria-expanded')).not.toBe('true');
|
167
|
+
react_2.fireEvent.focus(inputNode);
|
168
|
+
expect(inputNode.getAttribute('aria-expanded')).toBe('true');
|
169
|
+
});
|
170
|
+
it('closes the menu when the input is blurred', () => {
|
171
|
+
const { getByLabelText } = react_2.render(<LabelledAutocomplete menuProps={{ items: [], selectedItemIds: [] }}/>);
|
172
|
+
const inputNode = getByLabelText(AUTOCOMPLETE_LABEL);
|
173
|
+
expect(inputNode.getAttribute('aria-expanded')).not.toBe('true');
|
174
|
+
react_2.fireEvent.focus(inputNode);
|
175
|
+
expect(inputNode.getAttribute('aria-expanded')).toBe('true');
|
176
|
+
// eslint-disable-next-line github/no-blur
|
177
|
+
react_2.fireEvent.blur(inputNode);
|
178
|
+
// wait a tick for blur to finish
|
179
|
+
setTimeout(() => {
|
180
|
+
expect(inputNode.getAttribute('aria-expanded')).not.toBe('true');
|
181
|
+
}, 0);
|
182
|
+
});
|
183
|
+
it('sets the input value to the suggested item text and highlights the untyped part of the word', () => {
|
184
|
+
const { container, getByDisplayValue } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [] }}/>);
|
185
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
186
|
+
inputNode && user_event_1.default.type(inputNode, 'ze');
|
187
|
+
expect(getByDisplayValue('zero')).toBeDefined();
|
188
|
+
});
|
189
|
+
it('does not show or highlight suggestion text after the user hits Backspace until they hit another key', () => {
|
190
|
+
const { container, getByDisplayValue } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [] }}/>);
|
191
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
192
|
+
expect(inputNode.selectionStart).toBe(0);
|
193
|
+
inputNode && user_event_1.default.type(inputNode, 'ze');
|
194
|
+
expect(getByDisplayValue('zero')).toBeDefined();
|
195
|
+
expect(inputNode.selectionStart).toBe(2);
|
196
|
+
expect(inputNode.selectionEnd).toBe(4);
|
197
|
+
inputNode && user_event_1.default.type(inputNode, '{backspace}');
|
198
|
+
expect(inputNode.selectionStart).toBe(2);
|
199
|
+
expect(getByDisplayValue('ze')).toBeDefined();
|
200
|
+
inputNode && user_event_1.default.type(inputNode, 'r');
|
201
|
+
expect(inputNode.selectionStart).toBe(3);
|
202
|
+
expect(inputNode.selectionEnd).toBe(4);
|
203
|
+
expect(getByDisplayValue('zero')).toBeDefined();
|
204
|
+
});
|
205
|
+
it('clears the input value when when the user hits Escape', () => {
|
206
|
+
const { container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [] }}/>);
|
207
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
208
|
+
expect(inputNode?.getAttribute('aria-expanded')).not.toBe('true');
|
209
|
+
inputNode && user_event_1.default.type(inputNode, 'ze');
|
210
|
+
expect(inputNode?.getAttribute('aria-expanded')).toBe('true');
|
211
|
+
inputNode && user_event_1.default.type(inputNode, '{esc}');
|
212
|
+
expect(inputNode?.getAttribute('aria-expanded')).not.toBe('true');
|
213
|
+
});
|
214
|
+
});
|
215
|
+
describe('Autocomplete.Menu', () => {
|
216
|
+
it('calls a custom filter function', () => {
|
217
|
+
const filterFnMock = jest.fn();
|
218
|
+
const { container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], filterFn: filterFnMock }}/>);
|
219
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
220
|
+
inputNode && user_event_1.default.type(inputNode, 'ze');
|
221
|
+
expect(filterFnMock).toHaveBeenCalled();
|
222
|
+
});
|
223
|
+
it('calls a custom sort function when the menu closes', () => {
|
224
|
+
const sortOnCloseFnMock = jest.fn();
|
225
|
+
const { container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], sortOnCloseFn: sortOnCloseFnMock }}/>);
|
226
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
227
|
+
// `sortOnCloseFnMock` will be called in a `.sort()` on render to check if the
|
228
|
+
// current sort order matches the result of `sortOnCloseFnMock`
|
229
|
+
expect(sortOnCloseFnMock).toHaveBeenCalledTimes(mockItems.length - 1);
|
230
|
+
if (inputNode) {
|
231
|
+
user_event_1.default.type(inputNode, 'ze');
|
232
|
+
// eslint-disable-next-line github/no-blur
|
233
|
+
react_2.fireEvent.blur(inputNode);
|
234
|
+
}
|
235
|
+
// wait a tick for blur to finish
|
236
|
+
setTimeout(() => {
|
237
|
+
expect(sortOnCloseFnMock).toHaveBeenCalledTimes(mockItems.length);
|
238
|
+
}, 0);
|
239
|
+
});
|
240
|
+
it("calls onOpenChange with the menu's open state", () => {
|
241
|
+
const onOpenChangeMock = jest.fn();
|
242
|
+
const { container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], onOpenChange: onOpenChangeMock }}/>);
|
243
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
244
|
+
inputNode && user_event_1.default.type(inputNode, 'ze');
|
245
|
+
expect(onOpenChangeMock).toHaveBeenCalled();
|
246
|
+
});
|
247
|
+
it('calls onSelectedChange with the data for the selected items', () => {
|
248
|
+
const onSelectedChangeMock = jest.fn();
|
249
|
+
const { container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], onSelectedChange: onSelectedChangeMock }}/>);
|
250
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
251
|
+
expect(onSelectedChangeMock).not.toHaveBeenCalled();
|
252
|
+
if (inputNode) {
|
253
|
+
react_2.fireEvent.focus(inputNode);
|
254
|
+
user_event_1.default.type(inputNode, '{enter}');
|
255
|
+
}
|
256
|
+
// wait a tick for the keyboard event to be dispatched to the menu item
|
257
|
+
setTimeout(() => {
|
258
|
+
expect(onSelectedChangeMock).toHaveBeenCalledWith([mockItems[0]]);
|
259
|
+
}, 0);
|
260
|
+
});
|
261
|
+
it('does not close the menu when clicking an item in the menu if selectionVariant=multiple', () => {
|
262
|
+
const { getByText, container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], selectionVariant: 'multiple' }}/>);
|
263
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
264
|
+
const itemToClickNode = getByText(mockItems[1].text);
|
265
|
+
expect(inputNode?.getAttribute('aria-expanded')).not.toBe('true');
|
266
|
+
inputNode && react_2.fireEvent.focus(inputNode);
|
267
|
+
expect(inputNode?.getAttribute('aria-expanded')).toBe('true');
|
268
|
+
react_2.fireEvent.click(itemToClickNode);
|
269
|
+
inputNode && user_event_1.default.type(inputNode, '{enter}');
|
270
|
+
expect(inputNode?.getAttribute('aria-expanded')).toBe('true');
|
271
|
+
});
|
272
|
+
it('closes the menu when clicking an item in the menu if selectionVariant=single', () => {
|
273
|
+
const { getByText, container } = react_2.render(<LabelledAutocomplete menuProps={{ items: mockItems, selectedItemIds: [], selectionVariant: 'single' }}/>);
|
274
|
+
const inputNode = container.querySelector('#autocompleteInput');
|
275
|
+
const itemToClickNode = getByText(mockItems[1].text);
|
276
|
+
expect(inputNode?.getAttribute('aria-expanded')).not.toBe('true');
|
277
|
+
inputNode && react_2.fireEvent.focus(inputNode);
|
278
|
+
expect(inputNode?.getAttribute('aria-expanded')).toBe('true');
|
279
|
+
react_2.fireEvent.click(itemToClickNode);
|
280
|
+
expect(inputNode?.getAttribute('aria-expanded')).not.toBe('true');
|
281
|
+
});
|
282
|
+
it('calls handleAddItem with new item data when passing addNewItem', () => {
|
283
|
+
const handleAddItemMock = jest.fn();
|
284
|
+
const { getByText } = react_2.render(<LabelledAutocomplete menuProps={{
|
285
|
+
items: mockItems,
|
286
|
+
selectedItemIds: [],
|
287
|
+
selectionVariant: 'multiple',
|
288
|
+
addNewItem: {
|
289
|
+
text: 'Add new item',
|
290
|
+
handleAddItem: handleAddItemMock
|
291
|
+
}
|
292
|
+
}}/>);
|
293
|
+
const addNewItemNode = getByText('Add new item');
|
294
|
+
expect(handleAddItemMock).not.toHaveBeenCalled();
|
295
|
+
react_2.fireEvent.click(addNewItemNode);
|
296
|
+
expect(handleAddItemMock).toHaveBeenCalled();
|
297
|
+
});
|
298
|
+
});
|
299
|
+
});
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const theme_1 = __importDefault(require("../theme"));
|
9
|
+
const testing_1 = require("../utils/testing");
|
10
|
+
const react_2 = require("@testing-library/react");
|
11
|
+
const jest_axe_1 = require("jest-axe");
|
12
|
+
require("babel-polyfill");
|
13
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
14
|
+
describe('Avatar', () => {
|
15
|
+
testing_1.behavesAsComponent({ Component: __1.Avatar });
|
16
|
+
testing_1.checkExports('Avatar', {
|
17
|
+
default: __1.Avatar
|
18
|
+
});
|
19
|
+
it('should have no axe violations', async () => {
|
20
|
+
const { container } = react_2.render(<__1.Avatar src="primer.png"/>);
|
21
|
+
const results = await jest_axe_1.axe(container);
|
22
|
+
expect(results).toHaveNoViolations();
|
23
|
+
react_2.cleanup();
|
24
|
+
});
|
25
|
+
it('renders small by default', () => {
|
26
|
+
const size = 20;
|
27
|
+
const result = testing_1.render(<__1.Avatar src="primer.png"/>);
|
28
|
+
expect(result.props.width).toEqual(size);
|
29
|
+
expect(result.props.height).toEqual(size);
|
30
|
+
});
|
31
|
+
it('respects the size prop', () => {
|
32
|
+
const result = testing_1.render(<__1.Avatar size={40} src="primer.png" alt="github"/>);
|
33
|
+
expect(result.props.width).toEqual(40);
|
34
|
+
expect(result.props.height).toEqual(40);
|
35
|
+
});
|
36
|
+
it('passes through the src prop', () => {
|
37
|
+
expect(testing_1.render(<__1.Avatar src="primer.png" alt=""/>).props.src).toEqual('primer.png');
|
38
|
+
});
|
39
|
+
it('respects margin props', () => {
|
40
|
+
expect(testing_1.render(<__1.Avatar m={2} src="primer.png" alt=""/>)).toHaveStyleRule('margin', testing_1.px(theme_1.default.space[2]));
|
41
|
+
});
|
42
|
+
});
|
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const testing_1 = require("../utils/testing");
|
9
|
+
const react_2 = require("@testing-library/react");
|
10
|
+
const jest_axe_1 = require("jest-axe");
|
11
|
+
require("babel-polyfill");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
const avatarComp = (<__1.AvatarStack>
|
14
|
+
<img src="https://avatars.githubusercontent.com/primer" alt=""/>
|
15
|
+
<img src="https://avatars.githubusercontent.com/github" alt=""/>
|
16
|
+
<img src="https://avatars.githubusercontent.com/primer" alt=""/>
|
17
|
+
<img src="https://avatars.githubusercontent.com/github" alt=""/>
|
18
|
+
</__1.AvatarStack>);
|
19
|
+
const rightAvatarComp = (<__1.AvatarStack alignRight>
|
20
|
+
<img src="https://avatars.githubusercontent.com/primer" alt=""/>
|
21
|
+
<img src="https://avatars.githubusercontent.com/github" alt=""/>
|
22
|
+
<img src="https://avatars.githubusercontent.com/primer" alt=""/>
|
23
|
+
<img src="https://avatars.githubusercontent.com/github" alt=""/>
|
24
|
+
</__1.AvatarStack>);
|
25
|
+
describe('Avatar', () => {
|
26
|
+
testing_1.behavesAsComponent({
|
27
|
+
Component: __1.AvatarStack,
|
28
|
+
toRender: () => avatarComp,
|
29
|
+
options: { skipAs: true }
|
30
|
+
});
|
31
|
+
testing_1.checkExports('AvatarStack', {
|
32
|
+
default: __1.AvatarStack
|
33
|
+
});
|
34
|
+
it('should have no axe violations', async () => {
|
35
|
+
const { container } = react_2.render(avatarComp);
|
36
|
+
const results = await jest_axe_1.axe(container);
|
37
|
+
expect(results).toHaveNoViolations();
|
38
|
+
react_2.cleanup();
|
39
|
+
});
|
40
|
+
it('respects alignRight props', () => {
|
41
|
+
expect(testing_1.render(rightAvatarComp)).toMatchSnapshot();
|
42
|
+
});
|
43
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const theme_1 = __importDefault(require("../theme"));
|
8
|
+
const __1 = require("..");
|
9
|
+
const testing_1 = require("../utils/testing");
|
10
|
+
const react_2 = require("@testing-library/react");
|
11
|
+
const jest_axe_1 = require("jest-axe");
|
12
|
+
require("babel-polyfill");
|
13
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
14
|
+
describe('BorderBox', () => {
|
15
|
+
testing_1.behavesAsComponent({ Component: __1.BorderBox });
|
16
|
+
testing_1.checkExports('BorderBox', {
|
17
|
+
default: __1.BorderBox
|
18
|
+
});
|
19
|
+
it('should have no axe violations', async () => {
|
20
|
+
const { container } = react_2.render(<__1.BorderBox />);
|
21
|
+
const results = await jest_axe_1.axe(container);
|
22
|
+
expect(results).toHaveNoViolations();
|
23
|
+
react_2.cleanup();
|
24
|
+
});
|
25
|
+
it('renders borders', () => {
|
26
|
+
expect(testing_1.render(<__1.BorderBox borderColor="success.emphasis"/>)).toHaveStyleRule('border-color', theme_1.default.colorSchemes.light.colors.success?.emphasis);
|
27
|
+
expect(testing_1.render(<__1.BorderBox borderBottom={0}/>)).toHaveStyleRule('border-bottom', '0');
|
28
|
+
});
|
29
|
+
it('renders border radius', () => {
|
30
|
+
expect(testing_1.render(<__1.BorderBox borderRadius={2}/>)).toHaveStyleRule('border-radius', theme_1.default.radii[2]);
|
31
|
+
});
|
32
|
+
// the test returns the box shadow value without spaces, so had to manually provide the expected string here
|
33
|
+
it('renders box shadow', () => {
|
34
|
+
expect(testing_1.render(<__1.BorderBox boxShadow="shadow.small"/>)).toHaveStyleRule('box-shadow', theme_1.default.colorSchemes.light.shadows.shadow?.small);
|
35
|
+
});
|
36
|
+
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = require("@testing-library/react");
|
7
|
+
require("babel-polyfill");
|
8
|
+
const jest_axe_1 = require("jest-axe");
|
9
|
+
const react_2 = __importDefault(require("react"));
|
10
|
+
const __1 = require("..");
|
11
|
+
const theme_1 = __importDefault(require("../theme"));
|
12
|
+
const testing_1 = require("../utils/testing");
|
13
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
14
|
+
describe('Box', () => {
|
15
|
+
testing_1.behavesAsComponent({ Component: __1.Box });
|
16
|
+
testing_1.checkExports('Box', {
|
17
|
+
default: __1.Box
|
18
|
+
});
|
19
|
+
it('should have no axe violations', async () => {
|
20
|
+
const { container } = react_1.render(<__1.Box />);
|
21
|
+
const results = await jest_axe_1.axe(container);
|
22
|
+
expect(results).toHaveNoViolations();
|
23
|
+
react_1.cleanup();
|
24
|
+
});
|
25
|
+
it('renders margin', () => {
|
26
|
+
expect(testing_1.render(<__1.Box m={1} theme={theme_1.default}/>)).toMatchSnapshot();
|
27
|
+
expect(testing_1.render(<__1.Box m={[0, 1, 2, 3]} theme={theme_1.default}/>)).toMatchSnapshot();
|
28
|
+
expect(testing_1.render(<__1.Box m={[1, 1, 1, 3]} theme={theme_1.default}/>)).toMatchSnapshot();
|
29
|
+
});
|
30
|
+
it('renders padding', () => {
|
31
|
+
expect(testing_1.render(<__1.Box p={1} theme={theme_1.default}/>)).toMatchSnapshot();
|
32
|
+
expect(testing_1.render(<__1.Box p={[0, 1, 2, 3]} theme={theme_1.default}/>)).toMatchSnapshot();
|
33
|
+
expect(testing_1.render(<__1.Box p={[1, 1, 1, 3]} theme={theme_1.default}/>)).toMatchSnapshot();
|
34
|
+
});
|
35
|
+
it('respects display', () => {
|
36
|
+
expect(testing_1.render(<__1.Box display="inline"/>)).toMatchSnapshot();
|
37
|
+
expect(testing_1.render(<__1.Box display="inline-block"/>)).toMatchSnapshot();
|
38
|
+
expect(testing_1.render(<__1.Box display="none"/>)).toMatchSnapshot();
|
39
|
+
expect(testing_1.render(<__1.Box display={['none', 'none', 'block']} theme={theme_1.default}/>)).toMatchSnapshot();
|
40
|
+
});
|
41
|
+
});
|
@@ -0,0 +1,27 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const testing_1 = require("../utils/testing");
|
9
|
+
const react_2 = require("@testing-library/react");
|
10
|
+
const jest_axe_1 = require("jest-axe");
|
11
|
+
require("babel-polyfill");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
describe('BranchName', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.BranchName });
|
15
|
+
testing_1.checkExports('BranchName', {
|
16
|
+
default: __1.BranchName
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.BranchName />);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('renders an <a> by default', () => {
|
25
|
+
expect(testing_1.render(<__1.BranchName />).type).toEqual('a');
|
26
|
+
});
|
27
|
+
});
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const testing_1 = require("../utils/testing");
|
9
|
+
const react_2 = require("@testing-library/react");
|
10
|
+
const jest_axe_1 = require("jest-axe");
|
11
|
+
require("babel-polyfill");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
describe('Breadcrumbs', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.Breadcrumbs });
|
15
|
+
testing_1.checkExports('Breadcrumbs', {
|
16
|
+
default: __1.Breadcrumbs,
|
17
|
+
Breadcrumb: __1.Breadcrumb
|
18
|
+
});
|
19
|
+
it('should have no axe violations', async () => {
|
20
|
+
const { container } = react_2.render(<__1.Breadcrumbs />);
|
21
|
+
const results = await jest_axe_1.axe(container);
|
22
|
+
expect(results).toHaveNoViolations();
|
23
|
+
react_2.cleanup();
|
24
|
+
});
|
25
|
+
it('renders a <nav>', () => {
|
26
|
+
expect(testing_1.render(<__1.Breadcrumbs />).type).toEqual('nav');
|
27
|
+
});
|
28
|
+
});
|
@@ -0,0 +1,31 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = require("@testing-library/react");
|
7
|
+
require("babel-polyfill");
|
8
|
+
const jest_axe_1 = require("jest-axe");
|
9
|
+
const react_2 = __importDefault(require("react"));
|
10
|
+
const __1 = require("..");
|
11
|
+
const testing_1 = require("../utils/testing");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
describe('Breadcrumbs.Item', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.Breadcrumbs.Item });
|
15
|
+
it('renders an <a> by default', () => {
|
16
|
+
expect(testing_1.render(<__1.Breadcrumbs.Item />).type).toEqual('a');
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_1.render(<__1.Breadcrumbs.Item />);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_1.cleanup();
|
23
|
+
});
|
24
|
+
it('respects the "selected" prop', () => {
|
25
|
+
expect(testing_1.render(<__1.Breadcrumbs.Item selected/>)).toMatchSnapshot();
|
26
|
+
});
|
27
|
+
it('adds activeClassName={SELECTED_CLASS} when it gets a "to" prop', () => {
|
28
|
+
const Link = ({ theme: _ignoredTheme, ...props }) => <div {...props}/>;
|
29
|
+
expect(testing_1.render(<__1.Breadcrumbs.Item as={Link} to="#"/>)).toMatchSnapshot();
|
30
|
+
});
|
31
|
+
});
|
@@ -0,0 +1,100 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const testing_1 = require("../utils/testing");
|
9
|
+
const react_2 = require("@testing-library/react");
|
10
|
+
const jest_axe_1 = require("jest-axe");
|
11
|
+
require("babel-polyfill");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
14
|
+
function noop() { }
|
15
|
+
describe('Button', () => {
|
16
|
+
testing_1.behavesAsComponent({ Component: __1.Button });
|
17
|
+
testing_1.checkExports('Button', {
|
18
|
+
default: __1.Button,
|
19
|
+
ButtonPrimary: __1.ButtonPrimary,
|
20
|
+
ButtonDanger: __1.ButtonDanger,
|
21
|
+
ButtonOutline: __1.ButtonOutline,
|
22
|
+
ButtonInvisible: __1.ButtonInvisible,
|
23
|
+
ButtonGroup: __1.ButtonGroup,
|
24
|
+
ButtonTableList: __1.ButtonTableList,
|
25
|
+
ButtonClose: __1.ButtonClose
|
26
|
+
});
|
27
|
+
it('renders a <button>', () => {
|
28
|
+
expect(testing_1.render(<__1.Button />).type).toEqual('button');
|
29
|
+
});
|
30
|
+
it('should have no axe violations', async () => {
|
31
|
+
const { container } = react_2.render(<__1.Button>Click here</__1.Button>);
|
32
|
+
const results = await jest_axe_1.axe(container);
|
33
|
+
expect(results).toHaveNoViolations();
|
34
|
+
react_2.cleanup();
|
35
|
+
});
|
36
|
+
it('preserves "onClick" prop', () => {
|
37
|
+
expect(testing_1.render(<__1.Button onClick={noop}/>).props.onClick).toEqual(noop);
|
38
|
+
});
|
39
|
+
it('respects width props', () => {
|
40
|
+
expect(testing_1.render(<__1.Button width={200}/>)).toHaveStyleRule('width', '200px');
|
41
|
+
});
|
42
|
+
it('respects the "disabled" prop', () => {
|
43
|
+
const item = testing_1.render(<__1.Button disabled/>);
|
44
|
+
expect(item.props.disabled).toEqual(true);
|
45
|
+
expect(item).toMatchSnapshot();
|
46
|
+
});
|
47
|
+
it('respects the "variant" prop', () => {
|
48
|
+
expect(testing_1.render(<__1.Button variant="small"/>)).toHaveStyleRule('font-size', '12px');
|
49
|
+
expect(testing_1.render(<__1.Button variant="large"/>)).toHaveStyleRule('font-size', '16px');
|
50
|
+
});
|
51
|
+
it('respects the "fontSize" prop over the "variant" prop', () => {
|
52
|
+
expect(testing_1.render(<__1.Button variant="small" fontSize={20}/>)).toHaveStyleRule('font-size', '20px');
|
53
|
+
});
|
54
|
+
});
|
55
|
+
describe('ButtonPrimary', () => {
|
56
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonPrimary });
|
57
|
+
it('renders a <button>', () => {
|
58
|
+
expect(testing_1.render(<__1.ButtonPrimary />).type).toEqual('button');
|
59
|
+
});
|
60
|
+
it('renders correct disabled styles', () => {
|
61
|
+
const item = testing_1.render(<__1.ButtonPrimary disabled/>);
|
62
|
+
expect(item).toMatchSnapshot();
|
63
|
+
});
|
64
|
+
});
|
65
|
+
describe('ButtonDanger', () => {
|
66
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonDanger });
|
67
|
+
it('renders a <button>', () => {
|
68
|
+
expect(testing_1.render(<__1.ButtonDanger />).type).toEqual('button');
|
69
|
+
});
|
70
|
+
it('renders correct disabled styles', () => {
|
71
|
+
const item = testing_1.render(<__1.ButtonDanger disabled/>);
|
72
|
+
expect(item).toMatchSnapshot();
|
73
|
+
});
|
74
|
+
});
|
75
|
+
describe('ButtonOutline', () => {
|
76
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonOutline });
|
77
|
+
it('renders a <button> by default', () => {
|
78
|
+
expect(testing_1.render(<__1.ButtonOutline />).type).toEqual('button');
|
79
|
+
});
|
80
|
+
it('renders correct disabled styles', () => {
|
81
|
+
const item = testing_1.render(<__1.ButtonOutline disabled/>);
|
82
|
+
expect(item).toMatchSnapshot();
|
83
|
+
});
|
84
|
+
});
|
85
|
+
describe('ButtonInvisible', () => {
|
86
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonOutline });
|
87
|
+
it('renders a <button> by default', () => {
|
88
|
+
expect(testing_1.render(<__1.ButtonInvisible />).type).toEqual('button');
|
89
|
+
});
|
90
|
+
it('renders correct disabled styles', () => {
|
91
|
+
const item = testing_1.render(<__1.ButtonInvisible disabled/>);
|
92
|
+
expect(item).toMatchSnapshot();
|
93
|
+
});
|
94
|
+
});
|
95
|
+
describe('ButtonGroup', () => {
|
96
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonGroup });
|
97
|
+
});
|
98
|
+
describe('ButtonTableList', () => {
|
99
|
+
testing_1.behavesAsComponent({ Component: __1.ButtonTableList });
|
100
|
+
});
|