@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,314 @@
|
|
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("jest-styled-components");
|
8
|
+
const react_2 = __importDefault(require("react"));
|
9
|
+
const __1 = require("..");
|
10
|
+
// window.matchMedia() is not implmented by JSDOM so we have to create a mock:
|
11
|
+
// https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
|
12
|
+
Object.defineProperty(window, 'matchMedia', {
|
13
|
+
writable: true,
|
14
|
+
value: jest.fn().mockImplementation(query => ({
|
15
|
+
matches: false,
|
16
|
+
media: query,
|
17
|
+
onchange: null,
|
18
|
+
addListener: jest.fn(),
|
19
|
+
removeListener: jest.fn(),
|
20
|
+
addEventListener: jest.fn(),
|
21
|
+
removeEventListener: jest.fn(),
|
22
|
+
dispatchEvent: jest.fn()
|
23
|
+
}))
|
24
|
+
});
|
25
|
+
const exampleTheme = {
|
26
|
+
colors: {
|
27
|
+
text: '#f00'
|
28
|
+
},
|
29
|
+
colorSchemes: {
|
30
|
+
light: {
|
31
|
+
colors: {
|
32
|
+
text: 'black'
|
33
|
+
}
|
34
|
+
},
|
35
|
+
dark: {
|
36
|
+
colors: {
|
37
|
+
text: 'white'
|
38
|
+
}
|
39
|
+
},
|
40
|
+
dark_dimmed: {
|
41
|
+
colors: {
|
42
|
+
text: 'gray'
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
};
|
47
|
+
it('respects theme prop', () => {
|
48
|
+
const theme = {
|
49
|
+
colors: {
|
50
|
+
text: '#f00'
|
51
|
+
},
|
52
|
+
space: ['0', '0.25rem']
|
53
|
+
};
|
54
|
+
react_1.render(<__1.ThemeProvider theme={theme}>
|
55
|
+
<__1.Text color="text" mb={1}>
|
56
|
+
Hello
|
57
|
+
</__1.Text>
|
58
|
+
</__1.ThemeProvider>);
|
59
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', '#f00');
|
60
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('margin-bottom', '0.25rem');
|
61
|
+
});
|
62
|
+
it('has default theme', () => {
|
63
|
+
react_1.render(<__1.ThemeProvider>
|
64
|
+
<__1.Text color="fg.default" mb={1}>
|
65
|
+
Hello
|
66
|
+
</__1.Text>
|
67
|
+
</__1.ThemeProvider>);
|
68
|
+
expect(react_1.screen.getByText('Hello')).toMatchSnapshot();
|
69
|
+
});
|
70
|
+
it('inherits theme from parent', () => {
|
71
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme}>
|
72
|
+
<__1.ThemeProvider>
|
73
|
+
<__1.Text color="text">Hello</__1.Text>
|
74
|
+
</__1.ThemeProvider>
|
75
|
+
</__1.ThemeProvider>);
|
76
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
77
|
+
});
|
78
|
+
it('defaults to light color scheme', () => {
|
79
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme}>
|
80
|
+
<__1.Text color="text">Hello</__1.Text>
|
81
|
+
</__1.ThemeProvider>);
|
82
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
83
|
+
});
|
84
|
+
it('defaults to dark color scheme in night mode', () => {
|
85
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="night">
|
86
|
+
<__1.Text color="text">Hello</__1.Text>
|
87
|
+
</__1.ThemeProvider>);
|
88
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
89
|
+
});
|
90
|
+
it('defaults to first color scheme when passed an invalid color scheme name', () => {
|
91
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} dayScheme="foo">
|
92
|
+
<__1.Text color="text">Hello</__1.Text>
|
93
|
+
</__1.ThemeProvider>);
|
94
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
95
|
+
});
|
96
|
+
it('respects nightScheme prop', () => {
|
97
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="night" nightScheme="dark_dimmed">
|
98
|
+
<__1.Text color="text">Hello</__1.Text>
|
99
|
+
</__1.ThemeProvider>);
|
100
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'gray');
|
101
|
+
});
|
102
|
+
it('respects dayScheme prop', () => {
|
103
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="day" dayScheme="dark" nightScheme="dark_dimmed">
|
104
|
+
<__1.Text color="text">Hello</__1.Text>
|
105
|
+
</__1.ThemeProvider>);
|
106
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
107
|
+
});
|
108
|
+
it('works in auto mode', () => {
|
109
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="auto">
|
110
|
+
<__1.Text color="text">Hello</__1.Text>
|
111
|
+
</__1.ThemeProvider>);
|
112
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
113
|
+
});
|
114
|
+
it('works in auto mode (dark)', () => {
|
115
|
+
const matchMediaSpy = jest.spyOn(window, 'matchMedia').mockImplementation(query => ({
|
116
|
+
matches: true,
|
117
|
+
media: query,
|
118
|
+
onchange: null,
|
119
|
+
addListener: jest.fn(),
|
120
|
+
removeListener: jest.fn(),
|
121
|
+
addEventListener: jest.fn(),
|
122
|
+
removeEventListener: jest.fn(),
|
123
|
+
dispatchEvent: jest.fn()
|
124
|
+
}));
|
125
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="auto">
|
126
|
+
<__1.Text color="text">Hello</__1.Text>
|
127
|
+
</__1.ThemeProvider>);
|
128
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
129
|
+
matchMediaSpy.mockRestore();
|
130
|
+
});
|
131
|
+
it('updates when colorMode prop changes', async () => {
|
132
|
+
function App() {
|
133
|
+
const [colorMode, setColorMode] = react_2.default.useState('day');
|
134
|
+
return (<__1.ThemeProvider theme={exampleTheme} colorMode={colorMode}>
|
135
|
+
<__1.Text color="text">{colorMode}</__1.Text>
|
136
|
+
<button onClick={() => setColorMode(colorMode === 'day' ? 'night' : 'day')}>Toggle</button>
|
137
|
+
</__1.ThemeProvider>);
|
138
|
+
}
|
139
|
+
react_1.render(<App />);
|
140
|
+
// starts in day mode (light scheme)
|
141
|
+
expect(react_1.screen.getByText('day')).toHaveStyleRule('color', 'black');
|
142
|
+
react_1.screen.getByRole('button').click();
|
143
|
+
await react_1.waitFor(() =>
|
144
|
+
// clicking the toggle button enables night mode (dark scheme)
|
145
|
+
expect(react_1.screen.getByText('night')).toHaveStyleRule('color', 'white'));
|
146
|
+
});
|
147
|
+
it('updates when dayScheme prop changes', async () => {
|
148
|
+
function App() {
|
149
|
+
const [dayScheme, setDayScheme] = react_2.default.useState('light');
|
150
|
+
return (<__1.ThemeProvider theme={exampleTheme} dayScheme={dayScheme}>
|
151
|
+
<__1.Text color="text">{dayScheme}</__1.Text>
|
152
|
+
<button onClick={() => setDayScheme(dayScheme === 'light' ? 'dark_dimmed' : 'light')}>Toggle</button>
|
153
|
+
</__1.ThemeProvider>);
|
154
|
+
}
|
155
|
+
react_1.render(<App />);
|
156
|
+
// starts in day mode (light scheme)
|
157
|
+
expect(react_1.screen.getByText('light')).toHaveStyleRule('color', 'black');
|
158
|
+
react_1.screen.getByRole('button').click();
|
159
|
+
await react_1.waitFor(() =>
|
160
|
+
// clicking the toggle sets the day scheme to dark_dimmed
|
161
|
+
expect(react_1.screen.getByText('dark_dimmed')).toHaveStyleRule('color', 'gray'));
|
162
|
+
});
|
163
|
+
it('updates when nightScheme prop changes', async () => {
|
164
|
+
function App() {
|
165
|
+
const [nightScheme, setNightScheme] = react_2.default.useState('dark');
|
166
|
+
return (<__1.ThemeProvider theme={exampleTheme} colorMode="night" nightScheme={nightScheme}>
|
167
|
+
<__1.Text color="text">{nightScheme}</__1.Text>
|
168
|
+
<button onClick={() => setNightScheme(nightScheme === 'dark' ? 'dark_dimmed' : 'dark')}>Toggle</button>
|
169
|
+
</__1.ThemeProvider>);
|
170
|
+
}
|
171
|
+
react_1.render(<App />);
|
172
|
+
// starts in night mode (dark scheme)
|
173
|
+
expect(react_1.screen.getByText('dark')).toHaveStyleRule('color', 'white');
|
174
|
+
react_1.screen.getByRole('button').click();
|
175
|
+
await react_1.waitFor(() =>
|
176
|
+
// clicking the toggle button sets the night scheme to dark_dimmed
|
177
|
+
expect(react_1.screen.getByText('dark_dimmed')).toHaveStyleRule('color', 'gray'));
|
178
|
+
});
|
179
|
+
it('inherits colorMode from parent', async () => {
|
180
|
+
function App() {
|
181
|
+
const [colorMode, setcolorMode] = react_2.default.useState('day');
|
182
|
+
return (<__1.ThemeProvider theme={exampleTheme} colorMode={colorMode}>
|
183
|
+
<button onClick={() => setcolorMode(colorMode === 'day' ? 'night' : 'day')}>Toggle</button>
|
184
|
+
<__1.ThemeProvider>
|
185
|
+
<__1.Text color="text">{colorMode}</__1.Text>
|
186
|
+
</__1.ThemeProvider>
|
187
|
+
</__1.ThemeProvider>);
|
188
|
+
}
|
189
|
+
react_1.render(<App />);
|
190
|
+
expect(react_1.screen.getByText('day')).toHaveStyleRule('color', 'black');
|
191
|
+
react_1.screen.getByRole('button').click();
|
192
|
+
await react_1.waitFor(() => expect(react_1.screen.getByText('night')).toHaveStyleRule('color', 'white'));
|
193
|
+
});
|
194
|
+
it('inherits dayScheme from parent', async () => {
|
195
|
+
function App() {
|
196
|
+
const [dayScheme, setDayScheme] = react_2.default.useState('light');
|
197
|
+
return (<__1.ThemeProvider theme={exampleTheme} colorMode="night" dayScheme={dayScheme}>
|
198
|
+
<button onClick={() => setDayScheme(dayScheme === 'light' ? 'dark_dimmed' : 'light')}>Toggle</button>
|
199
|
+
<__1.ThemeProvider colorMode="day">
|
200
|
+
<__1.Text color="text">{dayScheme}</__1.Text>
|
201
|
+
</__1.ThemeProvider>
|
202
|
+
</__1.ThemeProvider>);
|
203
|
+
}
|
204
|
+
react_1.render(<App />);
|
205
|
+
expect(react_1.screen.getByText('light')).toHaveStyleRule('color', 'black');
|
206
|
+
react_1.screen.getByRole('button').click();
|
207
|
+
await react_1.waitFor(() => expect(react_1.screen.getByText('dark_dimmed')).toHaveStyleRule('color', 'gray'));
|
208
|
+
});
|
209
|
+
it('inherits nightScheme from parent', async () => {
|
210
|
+
function App() {
|
211
|
+
const [nightScheme, setNightScheme] = react_2.default.useState('dark');
|
212
|
+
return (<__1.ThemeProvider theme={exampleTheme} colorMode="day" nightScheme={nightScheme}>
|
213
|
+
<button onClick={() => setNightScheme(nightScheme === 'dark' ? 'dark_dimmed' : 'dark')}>Toggle</button>
|
214
|
+
<__1.ThemeProvider colorMode="night">
|
215
|
+
<__1.Text color="text">{nightScheme}</__1.Text>
|
216
|
+
</__1.ThemeProvider>
|
217
|
+
</__1.ThemeProvider>);
|
218
|
+
}
|
219
|
+
react_1.render(<App />);
|
220
|
+
expect(react_1.screen.getByText('dark')).toHaveStyleRule('color', 'white');
|
221
|
+
react_1.screen.getByRole('button').click();
|
222
|
+
await react_1.waitFor(() => expect(react_1.screen.getByText('dark_dimmed')).toHaveStyleRule('color', 'gray'));
|
223
|
+
});
|
224
|
+
describe('setColorMode', () => {
|
225
|
+
it('changes the color mode', () => {
|
226
|
+
function ToggleMode() {
|
227
|
+
const { colorMode, setColorMode } = __1.useTheme();
|
228
|
+
return <button onClick={() => setColorMode(colorMode === 'day' ? 'night' : 'day')}>Toggle</button>;
|
229
|
+
}
|
230
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="day">
|
231
|
+
<__1.Text color="text">Hello</__1.Text>
|
232
|
+
<ToggleMode />
|
233
|
+
</__1.ThemeProvider>);
|
234
|
+
// starts in day mode (light scheme)
|
235
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
236
|
+
react_1.screen.getByRole('button').click();
|
237
|
+
// clicking the toggle button enables night mode (dark scheme)
|
238
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
239
|
+
});
|
240
|
+
});
|
241
|
+
describe('setDayScheme', () => {
|
242
|
+
it('changes the day scheme', () => {
|
243
|
+
function ToggleDayScheme() {
|
244
|
+
const { dayScheme, setDayScheme } = __1.useTheme();
|
245
|
+
return <button onClick={() => setDayScheme(dayScheme === 'light' ? 'dark' : 'light')}>Toggle</button>;
|
246
|
+
}
|
247
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="day">
|
248
|
+
<__1.Text color="text">Hello</__1.Text>
|
249
|
+
<ToggleDayScheme />
|
250
|
+
</__1.ThemeProvider>);
|
251
|
+
// starts in day mode (light scheme)
|
252
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'black');
|
253
|
+
react_1.screen.getByRole('button').click();
|
254
|
+
// clicking the toggle button sets day scheme to dark
|
255
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
256
|
+
});
|
257
|
+
});
|
258
|
+
describe('setNightScheme', () => {
|
259
|
+
it('changes the night scheme', () => {
|
260
|
+
function ToggleNightScheme() {
|
261
|
+
const { nightScheme, setNightScheme } = __1.useTheme();
|
262
|
+
return <button onClick={() => setNightScheme(nightScheme === 'dark' ? 'dark_dimmed' : 'dark')}>Toggle</button>;
|
263
|
+
}
|
264
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} colorMode="night">
|
265
|
+
<__1.Text color="text">Hello</__1.Text>
|
266
|
+
<ToggleNightScheme />
|
267
|
+
</__1.ThemeProvider>);
|
268
|
+
// starts in night mode (dark scheme)
|
269
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'white');
|
270
|
+
react_1.screen.getByRole('button').click();
|
271
|
+
// clicking the toggle button sets night scheme to dark_dimmed
|
272
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('color', 'gray');
|
273
|
+
});
|
274
|
+
});
|
275
|
+
describe('useColorSchemeVar', () => {
|
276
|
+
it('updates value when scheme changes', () => {
|
277
|
+
function ToggleMode() {
|
278
|
+
const { colorMode, setColorMode } = __1.useTheme();
|
279
|
+
return <button onClick={() => setColorMode(colorMode === 'day' ? 'night' : 'day')}>Toggle</button>;
|
280
|
+
}
|
281
|
+
function CustomBg() {
|
282
|
+
const customBg = __1.useColorSchemeVar({
|
283
|
+
light: 'red',
|
284
|
+
dark: 'blue',
|
285
|
+
dark_dimmed: 'green'
|
286
|
+
}, 'inherit');
|
287
|
+
return <__1.Text bg={customBg}>Hello</__1.Text>;
|
288
|
+
}
|
289
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme} nightScheme="dark_dimmed">
|
290
|
+
<CustomBg />
|
291
|
+
<ToggleMode />
|
292
|
+
</__1.ThemeProvider>);
|
293
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('background-color', 'red');
|
294
|
+
react_1.screen.getByRole('button').click();
|
295
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('background-color', 'green');
|
296
|
+
});
|
297
|
+
it('supports fallback value', () => {
|
298
|
+
function ToggleMode() {
|
299
|
+
const { colorMode, setColorMode } = __1.useTheme();
|
300
|
+
return <button onClick={() => setColorMode(colorMode === 'day' ? 'night' : 'day')}>Toggle</button>;
|
301
|
+
}
|
302
|
+
function CustomBg() {
|
303
|
+
const customBg = __1.useColorSchemeVar({ dark: 'blue' }, 'red');
|
304
|
+
return <__1.Text bg={customBg}>Hello</__1.Text>;
|
305
|
+
}
|
306
|
+
react_1.render(<__1.ThemeProvider theme={exampleTheme}>
|
307
|
+
<CustomBg />
|
308
|
+
<ToggleMode />
|
309
|
+
</__1.ThemeProvider>);
|
310
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('background-color', 'red');
|
311
|
+
react_1.screen.getByRole('button').click();
|
312
|
+
expect(react_1.screen.getByText('Hello')).toHaveStyleRule('background-color', 'blue');
|
313
|
+
});
|
314
|
+
});
|
@@ -0,0 +1,51 @@
|
|
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
|
+
require("babel-polyfill");
|
7
|
+
const react_1 = require("@testing-library/react");
|
8
|
+
const jest_axe_1 = require("jest-axe");
|
9
|
+
const testing_1 = require("../utils/testing");
|
10
|
+
const react_2 = __importDefault(require("react"));
|
11
|
+
const __1 = require("..");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
describe('Timeline', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.Timeline });
|
15
|
+
testing_1.checkExports('Timeline', {
|
16
|
+
default: __1.Timeline
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_1.render(<__1.Timeline />);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_1.cleanup();
|
23
|
+
});
|
24
|
+
it('renders with clipSidebar prop', () => {
|
25
|
+
expect(testing_1.render(<__1.Timeline clipSidebar/>)).toMatchSnapshot();
|
26
|
+
});
|
27
|
+
});
|
28
|
+
describe('Timeline.Item', () => {
|
29
|
+
testing_1.behavesAsComponent({ Component: __1.Timeline.Item });
|
30
|
+
it('should have no axe violations', async () => {
|
31
|
+
const { container } = react_1.render(<__1.Timeline.Item />);
|
32
|
+
const results = await jest_axe_1.axe(container);
|
33
|
+
expect(results).toHaveNoViolations();
|
34
|
+
react_1.cleanup();
|
35
|
+
});
|
36
|
+
it('renders with condensed prop', () => {
|
37
|
+
expect(testing_1.render(<__1.Timeline.Item condensed/>)).toMatchSnapshot();
|
38
|
+
});
|
39
|
+
it('adds the Timeline-Item class', () => {
|
40
|
+
expect(testing_1.rendersClass(<__1.Timeline.Item />, 'Timeline-Item')).toEqual(true);
|
41
|
+
});
|
42
|
+
});
|
43
|
+
describe('Timeline.Badge', () => {
|
44
|
+
testing_1.behavesAsComponent({ Component: __1.Timeline.Badge, options: { skipAs: true } });
|
45
|
+
it('should have no axe violations', async () => {
|
46
|
+
const { container } = react_1.render(<__1.Timeline.Badge />);
|
47
|
+
const results = await jest_axe_1.axe(container);
|
48
|
+
expect(results).toHaveNoViolations();
|
49
|
+
react_1.cleanup();
|
50
|
+
});
|
51
|
+
});
|
@@ -0,0 +1,93 @@
|
|
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 Token_1 = __importDefault(require("../Token/Token"));
|
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
|
+
const TokenBase_1 = require("../Token/TokenBase");
|
13
|
+
const Token_2 = require("../Token");
|
14
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
16
|
+
const testTokenComponent = (Component) => {
|
17
|
+
testing_1.behavesAsComponent({ Component: Token_1.default });
|
18
|
+
it('renders a <span>', () => {
|
19
|
+
expect(testing_1.render(<Component text="token"/>).type).toEqual('span');
|
20
|
+
});
|
21
|
+
it('renders a <button> or <a> when specified', () => {
|
22
|
+
expect(testing_1.render(<Component as="button" text="token"/>).type).toEqual('button');
|
23
|
+
expect(testing_1.render(<Component as="a" text="token"/>).type).toEqual('a');
|
24
|
+
});
|
25
|
+
it('renders with a remove button', () => {
|
26
|
+
const onRemoveMock = jest.fn();
|
27
|
+
expect(testing_1.render(<Component text="token" onRemove={onRemoveMock}/>)).toMatchSnapshot();
|
28
|
+
});
|
29
|
+
it('renders button inside the token when the token also has a remove button', () => {
|
30
|
+
const onRemoveMock = jest.fn();
|
31
|
+
const { getByText } = react_2.render(<Component as="button" text="token" onRemove={onRemoveMock}/>);
|
32
|
+
expect(testing_1.render(<Component as="button" text="token" onRemove={onRemoveMock}/>).type).not.toEqual('button');
|
33
|
+
expect(getByText('token').tagName.toLowerCase()).toEqual('button');
|
34
|
+
});
|
35
|
+
it('renders anchor inside the token when the token also has a remove button', () => {
|
36
|
+
const onRemoveMock = jest.fn();
|
37
|
+
const { getByText } = react_2.render(<Component as="a" text="token" onRemove={onRemoveMock}/>);
|
38
|
+
expect(testing_1.render(<Component as="a" text="token" onRemove={onRemoveMock}/>).type).not.toEqual('a');
|
39
|
+
expect(getByText('token').tagName.toLowerCase()).toEqual('a');
|
40
|
+
});
|
41
|
+
it('renders isSelected', () => {
|
42
|
+
expect(testing_1.render(<Component text="token" isSelected/>)).toMatchSnapshot();
|
43
|
+
});
|
44
|
+
it('renders all sizes', () => {
|
45
|
+
const onRemoveMock = jest.fn();
|
46
|
+
const tokenSizeKeys = Object.keys(TokenBase_1.tokenSizes);
|
47
|
+
for (const tokenSizeKey of tokenSizeKeys) {
|
48
|
+
expect(testing_1.render(<Component text="token" size={tokenSizeKey} onRemove={onRemoveMock}/>)).toMatchSnapshot();
|
49
|
+
}
|
50
|
+
});
|
51
|
+
it('calls onRemove when the user clicks the remove button', () => {
|
52
|
+
const onRemoveMock = jest.fn();
|
53
|
+
const component = testing_1.mount(<Component text="token" onRemove={onRemoveMock}/>);
|
54
|
+
component.find('button').simulate('click');
|
55
|
+
expect(onRemoveMock).toHaveBeenCalled();
|
56
|
+
});
|
57
|
+
it('calls onRemove when the user keys Backspace on a focused Token', () => {
|
58
|
+
const onRemoveMock = jest.fn();
|
59
|
+
const { getByText } = react_2.render(<Component text="token" onRemove={onRemoveMock}/>);
|
60
|
+
const domNode = getByText('token');
|
61
|
+
react_2.fireEvent.keyDown(domNode, { key: 'Backspace' });
|
62
|
+
expect(onRemoveMock).toHaveBeenCalled();
|
63
|
+
});
|
64
|
+
it('should have no axe violations', async () => {
|
65
|
+
const { container } = react_2.render(<Component text="token"/>);
|
66
|
+
const results = await jest_axe_1.axe(container);
|
67
|
+
expect(results).toHaveNoViolations();
|
68
|
+
react_2.cleanup();
|
69
|
+
});
|
70
|
+
};
|
71
|
+
describe('Token components', () => {
|
72
|
+
describe('Token', () => {
|
73
|
+
testTokenComponent(Token_1.default);
|
74
|
+
it('renders with a leadingVisual', () => {
|
75
|
+
expect(testing_1.render(<Token_1.default text="token" leadingVisual={() => <div style={{ backgroundColor: 'blue' }}/>}/>)).toMatchSnapshot();
|
76
|
+
});
|
77
|
+
});
|
78
|
+
describe('IssueLabelToken', () => {
|
79
|
+
testTokenComponent(Token_2.IssueLabelToken);
|
80
|
+
it('renders default fill color', () => {
|
81
|
+
const onRemoveMock = jest.fn();
|
82
|
+
expect(testing_1.render(<Token_2.IssueLabelToken text="token" onRemove={onRemoveMock}/>)).toMatchSnapshot();
|
83
|
+
});
|
84
|
+
it('renders custom fill color', () => {
|
85
|
+
const onRemoveMock = jest.fn();
|
86
|
+
expect(testing_1.render(<Token_2.IssueLabelToken text="token" fillColor="#0366d6" onRemove={onRemoveMock}/>)).toMatchSnapshot();
|
87
|
+
});
|
88
|
+
});
|
89
|
+
describe('AvatarToken', () => {
|
90
|
+
const AvatarTokenWithDefaultAvatar = ({ avatarSrc = 'https://avatars.githubusercontent.com/mperrotti', ...rest }) => <Token_2.AvatarToken avatarSrc={avatarSrc} {...rest}/>;
|
91
|
+
testTokenComponent(AvatarTokenWithDefaultAvatar);
|
92
|
+
});
|
93
|
+
});
|
@@ -0,0 +1,46 @@
|
|
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 Tooltip_1 = __importDefault(require("../Tooltip"));
|
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('Tooltip', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: Tooltip_1.default });
|
15
|
+
testing_1.checkExports('Tooltip', {
|
16
|
+
default: Tooltip_1.default
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<Tooltip_1.default text="hi"/>);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('renders a <span> with the "tooltipped" class', () => {
|
25
|
+
expect(testing_1.render(<Tooltip_1.default />).type).toEqual('span');
|
26
|
+
expect(testing_1.renderClasses(<Tooltip_1.default />)).toContain('tooltipped-n');
|
27
|
+
});
|
28
|
+
it('respects the "align" prop', () => {
|
29
|
+
expect(testing_1.rendersClass(<Tooltip_1.default align="left"/>, 'tooltipped-align-left-2')).toBe(true);
|
30
|
+
expect(testing_1.rendersClass(<Tooltip_1.default align="right"/>, 'tooltipped-align-right-2')).toBe(true);
|
31
|
+
});
|
32
|
+
it('respects the "direction" prop', () => {
|
33
|
+
for (const direction of Tooltip_1.default.directions) {
|
34
|
+
expect(testing_1.rendersClass(<Tooltip_1.default direction={direction}/>, `tooltipped-${direction}`)).toBe(true);
|
35
|
+
}
|
36
|
+
});
|
37
|
+
it('respects the "noDelay" prop', () => {
|
38
|
+
expect(testing_1.rendersClass(<Tooltip_1.default noDelay/>, 'tooltipped-no-delay')).toBe(true);
|
39
|
+
});
|
40
|
+
it('respects the "text" prop', () => {
|
41
|
+
expect(testing_1.render(<Tooltip_1.default text="hi"/>).props['aria-label']).toEqual('hi');
|
42
|
+
});
|
43
|
+
it('respects the "wrap" prop', () => {
|
44
|
+
expect(testing_1.rendersClass(<Tooltip_1.default wrap/>, 'tooltipped-multiline')).toBe(true);
|
45
|
+
});
|
46
|
+
});
|
@@ -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 = __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('Truncate', () => {
|
14
|
+
testing_1.behavesAsComponent({
|
15
|
+
Component: __1.Truncate,
|
16
|
+
toRender: () => <__1.Truncate title="a-long-branch-name"/>
|
17
|
+
});
|
18
|
+
testing_1.checkExports('Truncate', {
|
19
|
+
default: __1.Truncate
|
20
|
+
});
|
21
|
+
it('renders a <div> by default', () => {
|
22
|
+
expect(testing_1.render(<__1.Truncate title="a-long-branch-name"/>).type).toEqual('div');
|
23
|
+
});
|
24
|
+
it('should have no axe violations', async () => {
|
25
|
+
const { container } = react_2.render(<__1.Truncate title="a-long-branch-name">a-long-branch-name</__1.Truncate>);
|
26
|
+
const results = await jest_axe_1.axe(container);
|
27
|
+
expect(results).toHaveNoViolations();
|
28
|
+
react_2.cleanup();
|
29
|
+
});
|
30
|
+
it('respects the maxWidth prop', () => {
|
31
|
+
expect(testing_1.render(<__1.Truncate maxWidth={250} title="a-long-branch-name"/>)).toHaveStyleRule('max-width', '250px');
|
32
|
+
});
|
33
|
+
it('respects the inline prop', () => {
|
34
|
+
expect(testing_1.render(<__1.Truncate inline title="a-long-branch-name"/>)).toHaveStyleRule('display', 'inline-block');
|
35
|
+
});
|
36
|
+
it('respects the expandable prop', () => {
|
37
|
+
expect(testing_1.render(<__1.Truncate expandable title="a-long-branch-name"/>)).toHaveStyleRule('max-width', '10000px', {
|
38
|
+
modifier: ':hover'
|
39
|
+
});
|
40
|
+
});
|
41
|
+
});
|
@@ -0,0 +1,53 @@
|
|
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('UnderlineNav', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.UnderlineNav });
|
15
|
+
testing_1.checkExports('UnderlineNav', {
|
16
|
+
default: __1.UnderlineNav
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.UnderlineNav />);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('renders a <nav>', () => {
|
25
|
+
expect(testing_1.render(<__1.UnderlineNav />).type).toEqual('nav');
|
26
|
+
});
|
27
|
+
it('adds the UnderlineNav class', () => {
|
28
|
+
expect(testing_1.rendersClass(<__1.UnderlineNav />, 'UnderlineNav')).toEqual(true);
|
29
|
+
});
|
30
|
+
it('respects the "align" prop', () => {
|
31
|
+
expect(testing_1.rendersClass(<__1.UnderlineNav align="right"/>, 'UnderlineNav--right')).toEqual(true);
|
32
|
+
});
|
33
|
+
it('respects the "full" prop', () => {
|
34
|
+
expect(testing_1.rendersClass(<__1.UnderlineNav full/>, 'UnderlineNav--full')).toEqual(true);
|
35
|
+
});
|
36
|
+
it('sets aria-label to the "label" prop', () => {
|
37
|
+
expect(testing_1.render(<__1.UnderlineNav label="foo"/>).props['aria-label']).toEqual('foo');
|
38
|
+
});
|
39
|
+
it('wraps its children in an "UnderlineNav-body" div', () => {
|
40
|
+
const children = <b>yo</b>;
|
41
|
+
const wrapper = testing_1.mount(<__1.UnderlineNav>{children}</__1.UnderlineNav>);
|
42
|
+
const body = wrapper.find('.UnderlineNav-body');
|
43
|
+
expect(body.exists()).toEqual(true);
|
44
|
+
expect(body.childAt(0).type()).toEqual('b');
|
45
|
+
});
|
46
|
+
it('respects the "actions" prop', () => {
|
47
|
+
const content = <h1>hi!</h1>;
|
48
|
+
const wrapper = testing_1.mount(<__1.UnderlineNav actions={content}/>);
|
49
|
+
const actions = wrapper.find('.UnderlineNav-actions');
|
50
|
+
expect(actions.exists()).toEqual(true);
|
51
|
+
expect(actions.text()).toEqual('hi!');
|
52
|
+
});
|
53
|
+
});
|
@@ -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 = __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('UnderlineNav.Link', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.UnderlineNav.Link });
|
15
|
+
it('renders an <a> by default', () => {
|
16
|
+
expect(testing_1.render(<__1.UnderlineNav.Link />).type).toEqual('a');
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.UnderlineNav.Link href="www.github.com">Go to GitHub</__1.UnderlineNav.Link>);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('respects the "selected" prop', () => {
|
25
|
+
expect(testing_1.render(<__1.UnderlineNav.Link 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.UnderlineNav.Link as={Link} to="#"/>)).toMatchSnapshot();
|
30
|
+
});
|
31
|
+
});
|