@primer/components 31.2.0-rc.b718ff50 → 31.2.0-rc.decfca99
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 +13 -1
- package/dist/browser.esm.js +620 -618
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +188 -186
- package/dist/browser.umd.js.map +1 -1
- package/docs/content/ActionList2.mdx +360 -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.jsx +301 -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 +53 -0
- package/lib/ActionList2/Description.jsx +30 -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 +244 -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 +70 -0
- package/lib/ActionList2/Selection.jsx +36 -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.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/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.js +2 -2
- 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__/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 +7 -0
- package/lib/drafts.js +20 -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.js +161 -636
- package/lib/polyfills/eventListenerSignal.js +37 -45
- package/lib/stories/ActionList2.stories.js +908 -0
- package/lib/stories/TextInput.stories.js +144 -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/ActionList2/Description.d.ts +12 -0
- package/lib-esm/ActionList2/Description.js +37 -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 +210 -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 +52 -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.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/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/_TextInputWrapper.js +2 -2
- package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionList2.test.js +41 -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 +7 -0
- package/lib-esm/drafts.js +8 -0
- package/lib-esm/stories/ActionList2.stories.js +796 -0
- package/lib-esm/stories/TextInput.stories.js +117 -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/ActionList2/Description.tsx +49 -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 +245 -0
- package/src/ActionList2/LinkItem.tsx +49 -0
- package/src/ActionList2/List.tsx +55 -0
- package/src/ActionList2/Selection.tsx +40 -0
- package/src/ActionList2/Visuals.tsx +76 -0
- package/src/ActionList2/index.ts +39 -0
- package/src/StateLabel.tsx +14 -2
- package/src/_TextInputWrapper.tsx +7 -0
- package/src/__tests__/ActionList2.test.tsx +47 -0
- package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +1 -0
- 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__/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 +9 -0
- package/src/stories/ActionList2.stories.tsx +1291 -0
- package/src/stories/TextInput.stories.tsx +113 -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
@@ -1,226 +1,155 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const scrollIntoViewingArea_1 = require("../../behaviors/scrollIntoViewingArea");
|
5
4
|
function scrollPositionFormula(positionData, isChildAboveViewingArea) {
|
6
|
-
|
7
|
-
|
8
|
-
childEdgePosition
|
9
|
-
|
10
|
-
|
11
|
-
const marginOffset = margin * (isChildAboveViewingArea ? -1 : 1);
|
12
|
-
return childEdgePosition - viewingAreaEdgePosition + marginOffset;
|
13
|
-
} // The DOMRect constructor isn't available in JSDOM, so we improvise here.
|
14
|
-
|
15
|
-
|
5
|
+
const { viewingAreaEdgePosition, childEdgePosition, margin } = positionData;
|
6
|
+
const marginOffset = margin * (isChildAboveViewingArea ? -1 : 1);
|
7
|
+
return childEdgePosition - viewingAreaEdgePosition + marginOffset;
|
8
|
+
}
|
9
|
+
// The DOMRect constructor isn't available in JSDOM, so we improvise here.
|
16
10
|
function makeDOMRect(x, y, width, height) {
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
} // Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
|
11
|
+
return {
|
12
|
+
x,
|
13
|
+
y,
|
14
|
+
width,
|
15
|
+
height,
|
16
|
+
top: y,
|
17
|
+
left: x,
|
18
|
+
right: x + width,
|
19
|
+
bottom: y + height,
|
20
|
+
toJSON() {
|
21
|
+
return this;
|
22
|
+
}
|
23
|
+
};
|
24
|
+
}
|
25
|
+
// Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
|
33
26
|
// correct dimensions. JSDOM will handle the rest of the DOM API used by getAnchoredPosition.
|
34
|
-
|
35
|
-
|
36
27
|
function createVirtualDOM(viewingAreaRect, childRect) {
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
47
|
-
|
48
|
-
return {
|
49
|
-
viewingArea,
|
50
|
-
child
|
51
|
-
};
|
28
|
+
const viewingArea = document.createElement('div');
|
29
|
+
viewingArea.style.overflow = 'auto';
|
30
|
+
viewingArea.id = 'viewingArea';
|
31
|
+
// eslint-disable-next-line github/unescaped-html-literal
|
32
|
+
viewingArea.innerHTML = '<div id="child"></div>';
|
33
|
+
const child = viewingArea.querySelector('#child');
|
34
|
+
child.getBoundingClientRect = () => childRect;
|
35
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
36
|
+
return { viewingArea, child };
|
52
37
|
}
|
53
|
-
|
54
38
|
describe('scrollIntoViewingArea', () => {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
77
|
-
|
78
|
-
viewingArea.scrollTop = 0;
|
79
|
-
|
80
|
-
child.getBoundingClientRect = () => childRect;
|
81
|
-
|
82
|
-
(0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea);
|
83
|
-
expect(scrollToMock).toHaveBeenCalledWith({
|
84
|
-
behavior: 'smooth',
|
85
|
-
top: expectedScrollPosition
|
86
|
-
});
|
87
|
-
});
|
88
|
-
describe('y-axis', () => {
|
89
|
-
it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
|
90
|
-
const scrollToMock = jest.fn();
|
91
|
-
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
92
|
-
writable: true,
|
93
|
-
value: scrollToMock
|
94
|
-
});
|
95
|
-
const childHeight = 50;
|
96
|
-
const viewAreaHeight = 100;
|
97
|
-
const childStart = viewAreaHeight + 10;
|
98
|
-
const scrollMargin = 10;
|
99
|
-
const expectedScrollPosition = scrollPositionFormula({
|
100
|
-
viewingAreaEdgePosition: viewAreaHeight,
|
101
|
-
childEdgePosition: childStart + childHeight,
|
102
|
-
margin: scrollMargin
|
103
|
-
}, false);
|
104
|
-
const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
|
105
|
-
const childRect = makeDOMRect(0, childStart, 100, childHeight);
|
106
|
-
const {
|
107
|
-
viewingArea,
|
108
|
-
child
|
109
|
-
} = createVirtualDOM(viewingAreaRect, childRect);
|
110
|
-
|
111
|
-
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
112
|
-
|
113
|
-
viewingArea.scrollTop = 0;
|
114
|
-
|
115
|
-
child.getBoundingClientRect = () => childRect;
|
116
|
-
|
117
|
-
(0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
|
118
|
-
expect(scrollToMock).toHaveBeenCalledWith({
|
119
|
-
behavior: 'auto',
|
120
|
-
top: expectedScrollPosition
|
121
|
-
});
|
122
|
-
});
|
123
|
-
it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
|
124
|
-
const scrollToMock = jest.fn();
|
125
|
-
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
126
|
-
writable: true,
|
127
|
-
value: scrollToMock
|
128
|
-
});
|
129
|
-
const childHeight = 50;
|
130
|
-
const childStart = childHeight * -1 - 10;
|
131
|
-
const scrollMargin = 10;
|
132
|
-
const expectedScrollPosition = scrollPositionFormula({
|
133
|
-
viewingAreaEdgePosition: 0,
|
134
|
-
childEdgePosition: childStart,
|
135
|
-
margin: scrollMargin
|
136
|
-
}, true);
|
137
|
-
const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
|
138
|
-
const childRect = makeDOMRect(0, childStart, 100, childHeight);
|
139
|
-
const {
|
140
|
-
viewingArea,
|
141
|
-
child
|
142
|
-
} = createVirtualDOM(viewingAreaRect, childRect);
|
143
|
-
|
144
|
-
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
145
|
-
|
146
|
-
viewingArea.scrollTop = 0;
|
147
|
-
|
148
|
-
child.getBoundingClientRect = () => childRect;
|
149
|
-
|
150
|
-
(0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
|
151
|
-
expect(scrollToMock).toHaveBeenCalledWith({
|
152
|
-
behavior: 'auto',
|
153
|
-
top: expectedScrollPosition
|
154
|
-
});
|
39
|
+
it('scrolls the expected amount when only the viewingArea element and child element are passed to the function', () => {
|
40
|
+
const scrollToMock = jest.fn();
|
41
|
+
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
42
|
+
writable: true,
|
43
|
+
value: scrollToMock
|
44
|
+
});
|
45
|
+
const childHeight = 50;
|
46
|
+
const viewAreaHeight = 100;
|
47
|
+
const childStart = viewAreaHeight + 10;
|
48
|
+
const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaHeight, childEdgePosition: childStart + childHeight, margin: 8 }, false);
|
49
|
+
const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
|
50
|
+
const childRect = makeDOMRect(0, childStart, 100, childHeight);
|
51
|
+
const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
|
52
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
53
|
+
viewingArea.scrollTop = 0;
|
54
|
+
child.getBoundingClientRect = () => childRect;
|
55
|
+
scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea);
|
56
|
+
expect(scrollToMock).toHaveBeenCalledWith({
|
57
|
+
behavior: 'smooth',
|
58
|
+
top: expectedScrollPosition
|
59
|
+
});
|
155
60
|
});
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
61
|
+
describe('y-axis', () => {
|
62
|
+
it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
|
63
|
+
const scrollToMock = jest.fn();
|
64
|
+
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
65
|
+
writable: true,
|
66
|
+
value: scrollToMock
|
67
|
+
});
|
68
|
+
const childHeight = 50;
|
69
|
+
const viewAreaHeight = 100;
|
70
|
+
const childStart = viewAreaHeight + 10;
|
71
|
+
const scrollMargin = 10;
|
72
|
+
const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaHeight, childEdgePosition: childStart + childHeight, margin: scrollMargin }, false);
|
73
|
+
const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
|
74
|
+
const childRect = makeDOMRect(0, childStart, 100, childHeight);
|
75
|
+
const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
|
76
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
77
|
+
viewingArea.scrollTop = 0;
|
78
|
+
child.getBoundingClientRect = () => childRect;
|
79
|
+
scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
|
80
|
+
expect(scrollToMock).toHaveBeenCalledWith({
|
81
|
+
behavior: 'auto',
|
82
|
+
top: expectedScrollPosition
|
83
|
+
});
|
84
|
+
});
|
85
|
+
it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
|
86
|
+
const scrollToMock = jest.fn();
|
87
|
+
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
88
|
+
writable: true,
|
89
|
+
value: scrollToMock
|
90
|
+
});
|
91
|
+
const childHeight = 50;
|
92
|
+
const childStart = childHeight * -1 - 10;
|
93
|
+
const scrollMargin = 10;
|
94
|
+
const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: 0, childEdgePosition: childStart, margin: scrollMargin }, true);
|
95
|
+
const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
|
96
|
+
const childRect = makeDOMRect(0, childStart, 100, childHeight);
|
97
|
+
const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
|
98
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
99
|
+
viewingArea.scrollTop = 0;
|
100
|
+
child.getBoundingClientRect = () => childRect;
|
101
|
+
scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
|
102
|
+
expect(scrollToMock).toHaveBeenCalledWith({
|
103
|
+
behavior: 'auto',
|
104
|
+
top: expectedScrollPosition
|
105
|
+
});
|
106
|
+
});
|
191
107
|
});
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
108
|
+
describe('x-axis', () => {
|
109
|
+
it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
|
110
|
+
const scrollToMock = jest.fn();
|
111
|
+
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
112
|
+
writable: true,
|
113
|
+
value: scrollToMock
|
114
|
+
});
|
115
|
+
const childWidth = 50;
|
116
|
+
const viewAreaWidth = 100;
|
117
|
+
const childStart = viewAreaWidth + 10;
|
118
|
+
const scrollMargin = 10;
|
119
|
+
const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaWidth, childEdgePosition: childStart + childWidth, margin: scrollMargin }, false);
|
120
|
+
const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaWidth);
|
121
|
+
const childRect = makeDOMRect(childStart, 0, childWidth, 100);
|
122
|
+
const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
|
123
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
124
|
+
viewingArea.scrollLeft = 0;
|
125
|
+
child.getBoundingClientRect = () => childRect;
|
126
|
+
scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
|
127
|
+
expect(scrollToMock).toHaveBeenCalledWith({
|
128
|
+
behavior: 'auto',
|
129
|
+
left: expectedScrollPosition
|
130
|
+
});
|
131
|
+
});
|
132
|
+
it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
|
133
|
+
const scrollToMock = jest.fn();
|
134
|
+
Object.defineProperty(window.Element.prototype, 'scrollTo', {
|
135
|
+
writable: true,
|
136
|
+
value: scrollToMock
|
137
|
+
});
|
138
|
+
const childWidth = 50;
|
139
|
+
const childStart = childWidth * -1 - 10;
|
140
|
+
const scrollMargin = 10;
|
141
|
+
const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: 0, childEdgePosition: childStart, margin: scrollMargin }, true);
|
142
|
+
const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
|
143
|
+
const childRect = makeDOMRect(childStart, 0, childWidth, 100);
|
144
|
+
const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
|
145
|
+
viewingArea.getBoundingClientRect = () => viewingAreaRect;
|
146
|
+
viewingArea.scrollTop = 0;
|
147
|
+
child.getBoundingClientRect = () => childRect;
|
148
|
+
scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
|
149
|
+
expect(scrollToMock).toHaveBeenCalledWith({
|
150
|
+
behavior: 'auto',
|
151
|
+
left: expectedScrollPosition
|
152
|
+
});
|
153
|
+
});
|
224
154
|
});
|
225
|
-
|
226
|
-
});
|
155
|
+
});
|
@@ -1,30 +1,51 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const theme_1 = require("../utils/theme");
|
5
4
|
describe('filterObject', () => {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
5
|
+
const colors = {
|
6
|
+
scale: {
|
7
|
+
gray: [
|
8
|
+
'#fafbfc',
|
9
|
+
'#f6f8fa',
|
10
|
+
'#e1e4e8',
|
11
|
+
'#d1d5da',
|
12
|
+
'#959da5',
|
13
|
+
'#6a737d',
|
14
|
+
'#586069',
|
15
|
+
'#444d56',
|
16
|
+
'#2f363d',
|
17
|
+
'#24292e'
|
18
|
+
]
|
19
|
+
},
|
20
|
+
btn: {
|
21
|
+
shadow: '0 1px 0 rgba(27,31,35,0.04)'
|
22
|
+
}
|
19
23
|
};
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
it('filters out shadow values', () => {
|
25
|
+
const expected = {
|
26
|
+
scale: {
|
27
|
+
gray: [
|
28
|
+
'#fafbfc',
|
29
|
+
'#f6f8fa',
|
30
|
+
'#e1e4e8',
|
31
|
+
'#d1d5da',
|
32
|
+
'#959da5',
|
33
|
+
'#6a737d',
|
34
|
+
'#586069',
|
35
|
+
'#444d56',
|
36
|
+
'#2f363d',
|
37
|
+
'#24292e'
|
38
|
+
]
|
39
|
+
}
|
40
|
+
};
|
41
|
+
expect(theme_1.filterObject(colors, (value) => theme_1.isColorValue(value))).toEqual(expected);
|
42
|
+
});
|
43
|
+
it('filters out color values', () => {
|
44
|
+
const expected = {
|
45
|
+
btn: {
|
46
|
+
shadow: '0 1px 0 rgba(27,31,35,0.04)'
|
47
|
+
}
|
48
|
+
};
|
49
|
+
expect(theme_1.filterObject(colors, (value) => theme_1.isShadowValue(value))).toEqual(expected);
|
50
|
+
});
|
51
|
+
});
|
@@ -0,0 +1,29 @@
|
|
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 useAnchoredPosition_1 = require("../../hooks/useAnchoredPosition");
|
8
|
+
const react_2 = require("@testing-library/react");
|
9
|
+
const Component = ({ callback }) => {
|
10
|
+
const floatingElementRef = react_1.default.useRef(null);
|
11
|
+
const anchorElementRef = react_1.default.useRef(null);
|
12
|
+
callback(useAnchoredPosition_1.useAnchoredPosition({ floatingElementRef, anchorElementRef }));
|
13
|
+
return (<div style={{ position: 'absolute' }}>
|
14
|
+
<div style={{ position: 'absolute', top: '20px', left: '20px', height: '50px', width: '50px' }} ref={floatingElementRef}/>
|
15
|
+
<div ref={anchorElementRef}/>
|
16
|
+
</div>);
|
17
|
+
};
|
18
|
+
it('should should return a position', () => {
|
19
|
+
const cb = jest.fn();
|
20
|
+
react_2.render(<Component callback={cb}/>);
|
21
|
+
expect(cb).toHaveBeenCalledTimes(2);
|
22
|
+
expect(cb.mock.calls[1][0]['position']).toMatchInlineSnapshot(`
|
23
|
+
Object {
|
24
|
+
"anchorSide": "outside-bottom",
|
25
|
+
"left": 0,
|
26
|
+
"top": 4,
|
27
|
+
}
|
28
|
+
`);
|
29
|
+
});
|
@@ -0,0 +1,19 @@
|
|
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 useOnEscapePress_1 = require("../../hooks/useOnEscapePress");
|
7
|
+
const react_1 = require("@testing-library/react");
|
8
|
+
const react_2 = __importDefault(require("react"));
|
9
|
+
it('should call function when user presses escape', () => {
|
10
|
+
const functionToCall = jest.fn();
|
11
|
+
const Component = () => {
|
12
|
+
useOnEscapePress_1.useOnEscapePress(functionToCall);
|
13
|
+
return <div>content</div>;
|
14
|
+
};
|
15
|
+
const { getByText } = react_1.render(<Component />);
|
16
|
+
const domNode = getByText('content');
|
17
|
+
react_1.fireEvent.keyDown(domNode, { key: 'Escape', code: 'Escape', keyCode: 27, charCode: 27 });
|
18
|
+
expect(functionToCall).toHaveBeenCalledTimes(1);
|
19
|
+
});
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
5
|
+
}) : (function(o, m, k, k2) {
|
6
|
+
if (k2 === undefined) k2 = k;
|
7
|
+
o[k2] = m[k];
|
8
|
+
}));
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
11
|
+
}) : function(o, v) {
|
12
|
+
o["default"] = v;
|
13
|
+
});
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
15
|
+
if (mod && mod.__esModule) return mod;
|
16
|
+
var result = {};
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
18
|
+
__setModuleDefault(result, mod);
|
19
|
+
return result;
|
20
|
+
};
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
23
|
+
};
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
25
|
+
const useOnOutsideClick_1 = require("../../hooks/useOnOutsideClick");
|
26
|
+
const react_1 = require("@testing-library/react");
|
27
|
+
const react_2 = __importStar(require("react"));
|
28
|
+
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
29
|
+
const Component = ({ callback }) => {
|
30
|
+
const containerRef = react_2.useRef(null);
|
31
|
+
const outerButton = react_2.useRef(null);
|
32
|
+
const secondButton = react_2.useRef(null);
|
33
|
+
useOnOutsideClick_1.useOnOutsideClick({ ignoreClickRefs: [secondButton], containerRef, onClickOutside: callback });
|
34
|
+
return (<div>
|
35
|
+
<button ref={outerButton}>button</button>
|
36
|
+
<button ref={secondButton}>button two</button>
|
37
|
+
<div ref={containerRef}>content</div>
|
38
|
+
</div>);
|
39
|
+
};
|
40
|
+
it('should call function when user clicks outside container', () => {
|
41
|
+
const mockFunction = jest.fn();
|
42
|
+
const { getByText } = react_1.render(<Component callback={mockFunction}/>);
|
43
|
+
user_event_1.default.click(getByText('button'));
|
44
|
+
expect(mockFunction).toHaveBeenCalledTimes(1);
|
45
|
+
});
|
46
|
+
it('should not call function when user right clicks', () => {
|
47
|
+
const mockFunction = jest.fn();
|
48
|
+
const { getByText } = react_1.render(<Component callback={mockFunction}/>);
|
49
|
+
user_event_1.default.click(getByText('button'), { button: 1 });
|
50
|
+
expect(mockFunction).toHaveBeenCalledTimes(0);
|
51
|
+
});
|
52
|
+
it('should not call function when clicking on ignored refs', () => {
|
53
|
+
const mockFunction = jest.fn();
|
54
|
+
const { getByText } = react_1.render(<Component callback={mockFunction}/>);
|
55
|
+
user_event_1.default.click(getByText('button two'));
|
56
|
+
expect(mockFunction).toHaveBeenCalledTimes(0);
|
57
|
+
});
|
58
|
+
it('should not call function when clicking inside container', () => {
|
59
|
+
const mockFunction = jest.fn();
|
60
|
+
const { getByText } = react_1.render(<Component callback={mockFunction}/>);
|
61
|
+
user_event_1.default.click(getByText('content'));
|
62
|
+
expect(mockFunction).toHaveBeenCalledTimes(0);
|
63
|
+
});
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
5
|
+
}) : (function(o, m, k, k2) {
|
6
|
+
if (k2 === undefined) k2 = k;
|
7
|
+
o[k2] = m[k];
|
8
|
+
}));
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
11
|
+
}) : function(o, v) {
|
12
|
+
o["default"] = v;
|
13
|
+
});
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
15
|
+
if (mod && mod.__esModule) return mod;
|
16
|
+
var result = {};
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
18
|
+
__setModuleDefault(result, mod);
|
19
|
+
return result;
|
20
|
+
};
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
22
|
+
const react_1 = __importStar(require("react"));
|
23
|
+
const react_2 = require("@testing-library/react");
|
24
|
+
const useOpenAndCloseFocus_1 = require("../../hooks/useOpenAndCloseFocus");
|
25
|
+
const Component = () => {
|
26
|
+
const containerRef = react_1.useRef(null);
|
27
|
+
const returnFocusRef = react_1.useRef(null);
|
28
|
+
const noButtonRef = react_1.useRef(null);
|
29
|
+
useOpenAndCloseFocus_1.useOpenAndCloseFocus({ containerRef, initialFocusRef: noButtonRef, returnFocusRef });
|
30
|
+
return (<>
|
31
|
+
<button ref={returnFocusRef}>trigger</button>
|
32
|
+
<div ref={containerRef}>
|
33
|
+
<button>yes</button>
|
34
|
+
<button ref={noButtonRef}>no</button>
|
35
|
+
</div>
|
36
|
+
</>);
|
37
|
+
};
|
38
|
+
const ComponentTwo = () => {
|
39
|
+
const buttonRef = react_1.useRef(null);
|
40
|
+
const containerRef = react_1.useRef(null);
|
41
|
+
useOpenAndCloseFocus_1.useOpenAndCloseFocus({ containerRef, returnFocusRef: buttonRef });
|
42
|
+
return (<>
|
43
|
+
<button ref={buttonRef}>button trigger</button>
|
44
|
+
<div ref={containerRef}>
|
45
|
+
<button>yes</button>
|
46
|
+
<button>no</button>
|
47
|
+
</div>
|
48
|
+
</>);
|
49
|
+
};
|
50
|
+
it('should focus element passed into function', async () => {
|
51
|
+
const { getByText } = react_2.render(<Component />);
|
52
|
+
await react_2.waitFor(() => getByText('no'));
|
53
|
+
const noButton = getByText('no');
|
54
|
+
expect(document.activeElement).toEqual(noButton);
|
55
|
+
});
|
56
|
+
it('should focus first element when nothing is passed', async () => {
|
57
|
+
const { getByText } = react_2.render(<ComponentTwo />);
|
58
|
+
await react_2.waitFor(() => getByText('yes'));
|
59
|
+
const yesButton = getByText('yes');
|
60
|
+
expect(document.activeElement).toEqual(yesButton);
|
61
|
+
});
|