@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,102 @@
|
|
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 index_1 = __importStar(require("../Portal/index"));
|
26
|
+
const react_1 = require("@testing-library/react");
|
27
|
+
const react_2 = __importDefault(require("react"));
|
28
|
+
const BaseStyles_1 = __importDefault(require("../BaseStyles"));
|
29
|
+
describe('Portal', () => {
|
30
|
+
it('renders a default portal into document.body (no BaseStyles present)', () => {
|
31
|
+
const { baseElement } = react_1.render(<index_1.default>123test123</index_1.default>);
|
32
|
+
const generatedRoot = baseElement.querySelector('#__primerPortalRoot__');
|
33
|
+
expect(generatedRoot).toBeInstanceOf(HTMLElement);
|
34
|
+
expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
|
35
|
+
baseElement.innerHTML = '';
|
36
|
+
});
|
37
|
+
it('renders a default portal into nearest BaseStyles element', () => {
|
38
|
+
const toRender = (<div id="renderedRoot">
|
39
|
+
<BaseStyles_1.default>
|
40
|
+
<div id="baseStylesRoot">
|
41
|
+
<index_1.default>123test123</index_1.default>
|
42
|
+
</div>
|
43
|
+
</BaseStyles_1.default>
|
44
|
+
</div>);
|
45
|
+
const { baseElement } = react_1.render(toRender);
|
46
|
+
const baseStylesRoot = baseElement.querySelector('#baseStylesRoot');
|
47
|
+
const baseStylesElement = baseStylesRoot?.parentElement;
|
48
|
+
const generatedRoot = baseStylesElement?.querySelector('#__primerPortalRoot__');
|
49
|
+
expect(baseStylesRoot).toBeInstanceOf(HTMLElement);
|
50
|
+
expect(baseStylesElement).toBeInstanceOf(HTMLElement);
|
51
|
+
expect(generatedRoot).toBeInstanceOf(HTMLElement);
|
52
|
+
expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
|
53
|
+
baseElement.innerHTML = '';
|
54
|
+
});
|
55
|
+
it('renders into the custom portal root (default root name - declarative)', () => {
|
56
|
+
const toRender = (<div id="renderedRoot">
|
57
|
+
<div id="__primerPortalRoot__"></div>
|
58
|
+
<index_1.default>123test123</index_1.default>
|
59
|
+
</div>);
|
60
|
+
const { baseElement } = react_1.render(toRender);
|
61
|
+
const renderedRoot = baseElement.querySelector('#renderedRoot');
|
62
|
+
const portalRoot = renderedRoot?.querySelector('#__primerPortalRoot__');
|
63
|
+
expect(portalRoot).toBeInstanceOf(HTMLElement);
|
64
|
+
expect(portalRoot?.textContent?.trim()).toEqual('123test123');
|
65
|
+
baseElement.innerHTML = '';
|
66
|
+
});
|
67
|
+
it('renders into the custom portal root (default root name - imperative)', () => {
|
68
|
+
const portalRootJSX = <div id="myPortalRoot"></div>;
|
69
|
+
let { baseElement } = react_1.render(portalRootJSX);
|
70
|
+
const portalRoot = baseElement.querySelector('#myPortalRoot');
|
71
|
+
expect(portalRoot).toBeInstanceOf(HTMLElement);
|
72
|
+
index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot'));
|
73
|
+
const toRender = <index_1.default>123test123</index_1.default>;
|
74
|
+
({ baseElement } = react_1.render(toRender));
|
75
|
+
expect(portalRoot?.textContent?.trim()).toEqual('123test123');
|
76
|
+
baseElement.innerHTML = '';
|
77
|
+
});
|
78
|
+
it('renders into multiple custom portal roots (named)', () => {
|
79
|
+
const portalRootJSX = (<main>
|
80
|
+
<div id="myPortalRoot1"></div>
|
81
|
+
<div id="myPortalRoot2"></div>
|
82
|
+
</main>);
|
83
|
+
let { baseElement } = react_1.render(portalRootJSX);
|
84
|
+
const fancyPortalRoot1 = baseElement.querySelector('#myPortalRoot1');
|
85
|
+
const fancyPortalRoot2 = baseElement.querySelector('#myPortalRoot2');
|
86
|
+
expect(fancyPortalRoot1).toBeInstanceOf(HTMLElement);
|
87
|
+
expect(fancyPortalRoot2).toBeInstanceOf(HTMLElement);
|
88
|
+
index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot1'), 'fancyPortal1');
|
89
|
+
index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot2'), 'fancyPortal2');
|
90
|
+
const toRender = (<>
|
91
|
+
<index_1.default>123test123</index_1.default>
|
92
|
+
<index_1.default containerName="fancyPortal1">456test456</index_1.default>
|
93
|
+
<index_1.default containerName="fancyPortal2">789test789</index_1.default>
|
94
|
+
</>);
|
95
|
+
({ baseElement } = react_1.render(toRender));
|
96
|
+
const generatedRoot = baseElement.querySelector('#__primerPortalRoot__');
|
97
|
+
expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
|
98
|
+
expect(fancyPortalRoot1?.textContent?.trim()).toEqual('456test456');
|
99
|
+
expect(fancyPortalRoot2?.textContent?.trim()).toEqual('789test789');
|
100
|
+
baseElement.innerHTML = '';
|
101
|
+
});
|
102
|
+
});
|
@@ -0,0 +1,96 @@
|
|
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('position components', () => {
|
14
|
+
describe('Absolute', () => {
|
15
|
+
testing_1.behavesAsComponent({ Component: __1.Absolute });
|
16
|
+
testing_1.checkExports('Position', {
|
17
|
+
default: __1.Position,
|
18
|
+
Absolute: __1.Absolute,
|
19
|
+
Fixed: __1.Fixed,
|
20
|
+
Relative: __1.Relative,
|
21
|
+
Sticky: __1.Sticky
|
22
|
+
});
|
23
|
+
it('should have no axe violations', async () => {
|
24
|
+
const { container } = react_2.render(<__1.Absolute />);
|
25
|
+
const results = await jest_axe_1.axe(container);
|
26
|
+
expect(results).toHaveNoViolations();
|
27
|
+
react_2.cleanup();
|
28
|
+
});
|
29
|
+
it('sets position: absolute', () => {
|
30
|
+
expect(testing_1.render(<__1.Absolute />)).toHaveStyleRule('position', 'absolute');
|
31
|
+
});
|
32
|
+
it('can render other components with the as prop', () => {
|
33
|
+
const result = testing_1.render(<__1.Absolute as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
|
34
|
+
expect(result).toHaveStyleRule('position', 'absolute');
|
35
|
+
expect(result).toHaveStyleRule('border-width', '1px');
|
36
|
+
expect(result).toHaveStyleRule('border-style', 'solid');
|
37
|
+
});
|
38
|
+
});
|
39
|
+
describe('Fixed', () => {
|
40
|
+
testing_1.behavesAsComponent({ Component: __1.Fixed });
|
41
|
+
it('respects the "as" prop', () => {
|
42
|
+
expect(testing_1.render(<__1.Fixed as="span"/>).type).toEqual('span');
|
43
|
+
});
|
44
|
+
it('should have no axe violations', async () => {
|
45
|
+
const { container } = react_2.render(<__1.Fixed />);
|
46
|
+
const results = await jest_axe_1.axe(container);
|
47
|
+
expect(results).toHaveNoViolations();
|
48
|
+
react_2.cleanup();
|
49
|
+
});
|
50
|
+
it('sets position: fixed', () => {
|
51
|
+
expect(testing_1.render(<__1.Fixed />)).toHaveStyleRule('position', 'fixed');
|
52
|
+
});
|
53
|
+
it('can render other components with the as prop', () => {
|
54
|
+
const result = testing_1.render(<__1.Fixed as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
|
55
|
+
expect(result).toHaveStyleRule('position', 'fixed');
|
56
|
+
expect(result).toHaveStyleRule('border-width', '1px');
|
57
|
+
expect(result).toHaveStyleRule('border-style', 'solid');
|
58
|
+
});
|
59
|
+
});
|
60
|
+
describe('Relative', () => {
|
61
|
+
testing_1.behavesAsComponent({ Component: __1.Relative });
|
62
|
+
it('should have no axe violations', async () => {
|
63
|
+
const { container } = react_2.render(<__1.Relative />);
|
64
|
+
const results = await jest_axe_1.axe(container);
|
65
|
+
expect(results).toHaveNoViolations();
|
66
|
+
react_2.cleanup();
|
67
|
+
});
|
68
|
+
it('sets position: relative', () => {
|
69
|
+
expect(testing_1.render(<__1.Relative />)).toHaveStyleRule('position', 'relative');
|
70
|
+
});
|
71
|
+
it('can render other components with the as prop', () => {
|
72
|
+
const result = testing_1.render(<__1.Relative as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
|
73
|
+
expect(result).toHaveStyleRule('position', 'relative');
|
74
|
+
expect(result).toHaveStyleRule('border-width', '1px');
|
75
|
+
expect(result).toHaveStyleRule('border-style', 'solid');
|
76
|
+
});
|
77
|
+
});
|
78
|
+
describe('Sticky', () => {
|
79
|
+
testing_1.behavesAsComponent({ Component: __1.Sticky });
|
80
|
+
it('should have no axe violations', async () => {
|
81
|
+
const { container } = react_2.render(<__1.Sticky />);
|
82
|
+
const results = await jest_axe_1.axe(container);
|
83
|
+
expect(results).toHaveNoViolations();
|
84
|
+
react_2.cleanup();
|
85
|
+
});
|
86
|
+
it('sets position: sticky', () => {
|
87
|
+
expect(testing_1.render(<__1.Sticky />)).toHaveStyleRule('position', 'sticky');
|
88
|
+
});
|
89
|
+
it('can render other components with the as prop', () => {
|
90
|
+
const result = testing_1.render(<__1.Sticky as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
|
91
|
+
expect(result).toHaveStyleRule('position', 'sticky');
|
92
|
+
expect(result).toHaveStyleRule('border-width', '1px');
|
93
|
+
expect(result).toHaveStyleRule('border-style', 'solid');
|
94
|
+
});
|
95
|
+
});
|
96
|
+
});
|
@@ -0,0 +1,38 @@
|
|
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('ProgressBar', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.ProgressBar });
|
15
|
+
testing_1.checkExports('ProgressBar', {
|
16
|
+
default: __1.ProgressBar
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.ProgressBar progress={80} barSize="small"/>);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('respects the "barSize" prop', () => {
|
25
|
+
expect(testing_1.render(<__1.ProgressBar progress={80} barSize="small"/>)).toHaveStyleRule('height', '5px');
|
26
|
+
expect(testing_1.render(<__1.ProgressBar progress={80} barSize="default"/>)).toHaveStyleRule('height', '8px');
|
27
|
+
expect(testing_1.render(<__1.ProgressBar progress={80} barSize="large"/>)).toHaveStyleRule('height', '10px');
|
28
|
+
});
|
29
|
+
it('respects the "inline" prop', () => {
|
30
|
+
expect(testing_1.render(<__1.ProgressBar progress={80} inline/>)).toHaveStyleRule('display', 'inline-flex');
|
31
|
+
});
|
32
|
+
it('respects the "width" prop', () => {
|
33
|
+
expect(testing_1.render(<__1.ProgressBar progress={80} inline width="100px"/>)).toHaveStyleRule('width', '100px');
|
34
|
+
});
|
35
|
+
it('respects the "progress" prop', () => {
|
36
|
+
expect(testing_1.render(<__1.ProgressBar progress={80}/>)).toMatchSnapshot();
|
37
|
+
});
|
38
|
+
});
|
@@ -0,0 +1,120 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const testing_1 = require("../utils/testing");
|
9
|
+
const react_2 = require("@testing-library/react");
|
10
|
+
const jest_axe_1 = require("jest-axe");
|
11
|
+
require("babel-polyfill");
|
12
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
13
|
+
const BasicSelectMenu = ({ onClick, as, align = 'left' }) => {
|
14
|
+
return (<__1.SelectMenu as={as}>
|
15
|
+
<__1.Button as="summary">Projects</__1.Button>
|
16
|
+
<__1.SelectMenu.Modal title="Projects" align={align}>
|
17
|
+
<__1.SelectMenu.List>
|
18
|
+
<__1.SelectMenu.Item selected href="#">
|
19
|
+
Primer Components bugs
|
20
|
+
</__1.SelectMenu.Item>
|
21
|
+
<__1.SelectMenu.Item onClick={onClick} as={as} data-test="menu-item" href="#">
|
22
|
+
Primer Components roadmap
|
23
|
+
</__1.SelectMenu.Item>
|
24
|
+
<__1.SelectMenu.Divider>stuff</__1.SelectMenu.Divider>
|
25
|
+
<__1.SelectMenu.Item href="#"> Project 3</__1.SelectMenu.Item>
|
26
|
+
<__1.SelectMenu.Item href="#">Project 4</__1.SelectMenu.Item>
|
27
|
+
<__1.SelectMenu.Footer>footer</__1.SelectMenu.Footer>
|
28
|
+
</__1.SelectMenu.List>
|
29
|
+
</__1.SelectMenu.Modal>
|
30
|
+
</__1.SelectMenu>);
|
31
|
+
};
|
32
|
+
const MenuWithTabs = ({ onClick }) => {
|
33
|
+
return (<__1.SelectMenu initialTab="Organization">
|
34
|
+
<__1.Button as="summary">Projects</__1.Button>
|
35
|
+
<__1.SelectMenu.Modal title="Projects">
|
36
|
+
<__1.SelectMenu.Tabs>
|
37
|
+
<__1.SelectMenu.Tab index={0} onClick={onClick} data-test="repo-tab" tabName="Repository"/>
|
38
|
+
<__1.SelectMenu.Tab index={1} tabName="Organization"/>
|
39
|
+
</__1.SelectMenu.Tabs>
|
40
|
+
<__1.SelectMenu.TabPanel tabName="Repository">
|
41
|
+
<__1.SelectMenu.Item href="#">Primer Components bugs</__1.SelectMenu.Item>
|
42
|
+
<__1.SelectMenu.Item href="#">Primer Components roadmap</__1.SelectMenu.Item>
|
43
|
+
<__1.SelectMenu.Item href="#"> Project 3</__1.SelectMenu.Item>
|
44
|
+
<__1.SelectMenu.Item href="#">Project 4</__1.SelectMenu.Item>
|
45
|
+
</__1.SelectMenu.TabPanel>
|
46
|
+
<__1.SelectMenu.TabPanel tabName="Organization">
|
47
|
+
<__1.SelectMenu.Item href="#"> Project 2</__1.SelectMenu.Item>
|
48
|
+
</__1.SelectMenu.TabPanel>
|
49
|
+
<__1.SelectMenu.Footer>Showing 3 of 3</__1.SelectMenu.Footer>
|
50
|
+
</__1.SelectMenu.Modal>
|
51
|
+
</__1.SelectMenu>);
|
52
|
+
};
|
53
|
+
describe('SelectMenu', () => {
|
54
|
+
testing_1.checkExports('SelectMenu', {
|
55
|
+
default: __1.SelectMenu
|
56
|
+
});
|
57
|
+
for (const Comp of [
|
58
|
+
__1.SelectMenu.List,
|
59
|
+
__1.SelectMenu.Divider,
|
60
|
+
__1.SelectMenu.Filter,
|
61
|
+
__1.SelectMenu.Item,
|
62
|
+
__1.SelectMenu.List,
|
63
|
+
__1.SelectMenu.Modal,
|
64
|
+
__1.SelectMenu.Tabs,
|
65
|
+
__1.SelectMenu.Tab,
|
66
|
+
__1.SelectMenu.TabPanel,
|
67
|
+
__1.SelectMenu.Header
|
68
|
+
]) {
|
69
|
+
it('sets a valid displayName', () => {
|
70
|
+
expect(Comp.displayName).toMatch(testing_1.COMPONENT_DISPLAY_NAME_REGEX);
|
71
|
+
});
|
72
|
+
}
|
73
|
+
it('should have no axe violations', async () => {
|
74
|
+
const { container } = react_2.render(<BasicSelectMenu />);
|
75
|
+
const results = await jest_axe_1.axe(container);
|
76
|
+
expect(results).toHaveNoViolations();
|
77
|
+
react_2.cleanup();
|
78
|
+
});
|
79
|
+
it('does not allow the "as" prop on SelectMenu', () => {
|
80
|
+
const component = testing_1.mount(<BasicSelectMenu as="span"/>);
|
81
|
+
expect(component.find('details').length).toEqual(1);
|
82
|
+
});
|
83
|
+
it('shows correct initial tab', () => {
|
84
|
+
const testInstance = testing_1.renderRoot(<MenuWithTabs />);
|
85
|
+
expect(testInstance.findByProps({ 'aria-selected': true }).props.children).toBe('Organization');
|
86
|
+
});
|
87
|
+
it('clicking on a tab opens the tab', () => {
|
88
|
+
const component = testing_1.mount(<MenuWithTabs />);
|
89
|
+
const tab = component.find("[data-test='repo-tab']").first();
|
90
|
+
tab.simulate('click');
|
91
|
+
expect(tab.getDOMNode().attributes.getNamedItem('aria-selected')).toBeTruthy();
|
92
|
+
});
|
93
|
+
it('selected items have aria-checked', () => {
|
94
|
+
const testInstance = testing_1.renderRoot(<BasicSelectMenu />);
|
95
|
+
expect(testInstance.findByProps({ 'aria-checked': true }).props.children[1]).toBe('Primer Components bugs');
|
96
|
+
});
|
97
|
+
it('clicking on a list item calls user provided onClick handler', () => {
|
98
|
+
const mockClick = jest.fn();
|
99
|
+
const component = testing_1.mount(<BasicSelectMenu onClick={mockClick}/>);
|
100
|
+
const item = component.find("[data-test='menu-item']").first();
|
101
|
+
item.simulate('click');
|
102
|
+
expect(mockClick.mock.calls.length).toEqual(1);
|
103
|
+
});
|
104
|
+
it('clicking on a tab calls user provided onClick handler', () => {
|
105
|
+
const mockClick = jest.fn();
|
106
|
+
const component = testing_1.mount(<MenuWithTabs onClick={mockClick}/>);
|
107
|
+
const item = component.find("[data-test='repo-tab']").first();
|
108
|
+
item.simulate('click');
|
109
|
+
expect(mockClick.mock.calls.length).toEqual(1);
|
110
|
+
});
|
111
|
+
it('clicking on an item closes the modal', () => {
|
112
|
+
const component = testing_1.mount(<BasicSelectMenu />);
|
113
|
+
const item = component.find("[data-test='menu-item']").first();
|
114
|
+
item.simulate('click');
|
115
|
+
expect(component.getDOMNode().attributes.getNamedItem('open')).toBeFalsy();
|
116
|
+
});
|
117
|
+
it('right-aligned modal has right: 0px', () => {
|
118
|
+
expect(testing_1.render(<BasicSelectMenu align="right"/>)).toMatchSnapshot();
|
119
|
+
});
|
120
|
+
});
|
@@ -0,0 +1,48 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = require("@testing-library/react");
|
7
|
+
require("babel-polyfill");
|
8
|
+
const jest_axe_1 = require("jest-axe");
|
9
|
+
const react_2 = __importDefault(require("react"));
|
10
|
+
const theme_1 = __importDefault(require("../theme"));
|
11
|
+
const SelectPanel_1 = require("../SelectPanel");
|
12
|
+
const testing_1 = require("../utils/testing");
|
13
|
+
const __1 = require("..");
|
14
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
15
|
+
const items = [{ text: 'Foo' }, { text: 'Bar' }, { text: 'Baz' }, { text: 'Bon' }];
|
16
|
+
function SimpleSelectPanel() {
|
17
|
+
const [selected, setSelected] = react_2.default.useState([]);
|
18
|
+
const [, setFilter] = react_2.default.useState('');
|
19
|
+
const [open, setOpen] = react_2.default.useState(false);
|
20
|
+
return (<__1.ThemeProvider theme={theme_1.default}>
|
21
|
+
<__1.SSRProvider>
|
22
|
+
<__1.BaseStyles>
|
23
|
+
<SelectPanel_1.SelectPanel items={items} placeholder="Select Items" placeholderText="Filter Items" selected={selected} onSelectedChange={setSelected} onFilterChange={setFilter} open={open} onOpenChange={setOpen}/>
|
24
|
+
<div id="portal-root"></div>
|
25
|
+
</__1.BaseStyles>
|
26
|
+
</__1.SSRProvider>
|
27
|
+
</__1.ThemeProvider>);
|
28
|
+
}
|
29
|
+
describe('SelectPanel', () => {
|
30
|
+
afterEach(() => {
|
31
|
+
jest.clearAllMocks();
|
32
|
+
});
|
33
|
+
testing_1.behavesAsComponent({
|
34
|
+
Component: SelectPanel_1.SelectPanel,
|
35
|
+
options: { skipAs: true, skipSx: true },
|
36
|
+
toRender: () => <SimpleSelectPanel />
|
37
|
+
});
|
38
|
+
testing_1.checkExports('SelectPanel', {
|
39
|
+
default: undefined,
|
40
|
+
SelectPanel: SelectPanel_1.SelectPanel
|
41
|
+
});
|
42
|
+
it('should have no axe violations', async () => {
|
43
|
+
const { container } = react_1.render(<SimpleSelectPanel />);
|
44
|
+
const results = await jest_axe_1.axe(container);
|
45
|
+
expect(results).toHaveNoViolations();
|
46
|
+
react_1.cleanup();
|
47
|
+
});
|
48
|
+
});
|
@@ -0,0 +1,55 @@
|
|
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('SideNav', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.SideNav });
|
15
|
+
testing_1.checkExports('SideNav', {
|
16
|
+
default: __1.SideNav
|
17
|
+
});
|
18
|
+
describe('SideNav.Link', () => {
|
19
|
+
testing_1.behavesAsComponent({ Component: __1.SideNav.Link });
|
20
|
+
});
|
21
|
+
it('should have no axe violations', async () => {
|
22
|
+
const { container } = react_2.render(<__1.SideNav>
|
23
|
+
<__1.SideNav.Link href="#">One</__1.SideNav.Link>
|
24
|
+
<__1.SideNav.Link href="#" selected>
|
25
|
+
Two
|
26
|
+
</__1.SideNav.Link>
|
27
|
+
</__1.SideNav>);
|
28
|
+
const results = await jest_axe_1.axe(container);
|
29
|
+
expect(results).toHaveNoViolations();
|
30
|
+
react_2.cleanup();
|
31
|
+
});
|
32
|
+
it('renders a <nav> and <a>', () => {
|
33
|
+
expect(testing_1.render(<__1.SideNav />).type).toEqual('nav');
|
34
|
+
expect(testing_1.render(<__1.SideNav.Link />).type).toEqual('a');
|
35
|
+
});
|
36
|
+
it('sets aria-label appropriately', () => {
|
37
|
+
expect(testing_1.render(<__1.SideNav aria-label="foo"/>).props['aria-label']).toEqual('foo');
|
38
|
+
});
|
39
|
+
it('sets aria-current on a selected link', () => {
|
40
|
+
const elem = (<__1.SideNav>
|
41
|
+
<__1.SideNav.Link href="#one">One</__1.SideNav.Link>
|
42
|
+
<__1.SideNav.Link href="#two" selected>
|
43
|
+
Two
|
44
|
+
</__1.SideNav.Link>
|
45
|
+
</__1.SideNav>);
|
46
|
+
const wrapper = testing_1.mount(elem);
|
47
|
+
expect(wrapper.find('[aria-current="page"]').text()).toEqual('Two');
|
48
|
+
});
|
49
|
+
it('sets different styles for SideNavs with the lightweight variant', () => {
|
50
|
+
const regular = testing_1.render(<__1.SideNav />);
|
51
|
+
const lightweight = testing_1.render(<__1.SideNav variant="lightweight"/>);
|
52
|
+
expect(regular.props.className).toEqual(expect.stringContaining('variant-normal'));
|
53
|
+
expect(lightweight.props.className).toEqual(expect.stringContaining('variant-lightweight'));
|
54
|
+
});
|
55
|
+
});
|
@@ -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('Spinner', () => {
|
14
|
+
afterEach(() => {
|
15
|
+
react_2.cleanup();
|
16
|
+
});
|
17
|
+
testing_1.behavesAsComponent({
|
18
|
+
Component: __1.Spinner
|
19
|
+
});
|
20
|
+
testing_1.checkExports('Spinner', {
|
21
|
+
default: __1.Spinner
|
22
|
+
});
|
23
|
+
it('should have no axe violations', async () => {
|
24
|
+
const { container } = react_2.render(<__1.Spinner />);
|
25
|
+
const results = await jest_axe_1.axe(container);
|
26
|
+
expect(results).toHaveNoViolations();
|
27
|
+
});
|
28
|
+
it('should respect size arguments', () => {
|
29
|
+
const expectSize = (input, expectedSize) => {
|
30
|
+
const { container } = react_2.render(<__1.Spinner size={input}/>);
|
31
|
+
const svg = container.querySelector('svg');
|
32
|
+
expect(svg.getAttribute('height')).toEqual(expectedSize);
|
33
|
+
expect(svg.getAttribute('width')).toEqual(expectedSize);
|
34
|
+
};
|
35
|
+
// default: medium
|
36
|
+
expectSize(undefined, '32px');
|
37
|
+
expectSize('small', '16px');
|
38
|
+
expectSize('medium', '32px');
|
39
|
+
expectSize('large', '64px');
|
40
|
+
});
|
41
|
+
});
|
@@ -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 __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('StateLabel', () => {
|
14
|
+
testing_1.behavesAsComponent({
|
15
|
+
Component: __1.StateLabel,
|
16
|
+
toRender: () => <__1.StateLabel status="issueOpened">Open</__1.StateLabel>,
|
17
|
+
options: {
|
18
|
+
// Rendering a StyledOcticon seems to break getComputedStyles, which
|
19
|
+
// the sx prop implementation test uses to make sure the prop is working correctly.
|
20
|
+
// Despite my best efforts, I cannot figure out why this is happening. So,
|
21
|
+
// unfortunately, we will simply skip this test.
|
22
|
+
skipSx: true
|
23
|
+
}
|
24
|
+
});
|
25
|
+
testing_1.checkExports('StateLabel', {
|
26
|
+
default: __1.StateLabel
|
27
|
+
});
|
28
|
+
it('should have no axe violations', async () => {
|
29
|
+
const { container } = react_2.render(<__1.StateLabel status="issueOpened"/>);
|
30
|
+
const results = await jest_axe_1.axe(container);
|
31
|
+
expect(results).toHaveNoViolations();
|
32
|
+
react_2.cleanup();
|
33
|
+
});
|
34
|
+
it('respects the status prop', () => {
|
35
|
+
expect(testing_1.render(<__1.StateLabel status="issueOpened"/>)).toMatchSnapshot();
|
36
|
+
expect(testing_1.render(<__1.StateLabel status="issueClosed"/>)).toMatchSnapshot();
|
37
|
+
expect(testing_1.render(<__1.StateLabel status="pullMerged"/>)).toMatchSnapshot();
|
38
|
+
});
|
39
|
+
it('respects the variant prop', () => {
|
40
|
+
expect(testing_1.render(<__1.StateLabel variant="small" status="issueOpened"/>)).toMatchSnapshot();
|
41
|
+
expect(testing_1.render(<__1.StateLabel variant="normal" status="issueOpened"/>)).toMatchSnapshot();
|
42
|
+
});
|
43
|
+
it('renders children', () => {
|
44
|
+
expect(testing_1.render(<__1.StateLabel status="issueOpened">hi</__1.StateLabel>)).toMatchSnapshot();
|
45
|
+
});
|
46
|
+
});
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const octicons_react_1 = require("@primer/octicons-react");
|
8
|
+
const __1 = require("..");
|
9
|
+
const testing_1 = require("../utils/testing");
|
10
|
+
const react_2 = require("@testing-library/react");
|
11
|
+
const jest_axe_1 = require("jest-axe");
|
12
|
+
require("babel-polyfill");
|
13
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
14
|
+
describe('StyledOcticon', () => {
|
15
|
+
testing_1.behavesAsComponent({
|
16
|
+
Component: __1.StyledOcticon,
|
17
|
+
toRender: () => <__1.StyledOcticon icon={octicons_react_1.XIcon}/>
|
18
|
+
});
|
19
|
+
testing_1.checkExports('StyledOcticon', {
|
20
|
+
default: __1.StyledOcticon
|
21
|
+
});
|
22
|
+
it('should have no axe violations', async () => {
|
23
|
+
const { container } = react_2.render(<__1.StyledOcticon icon={octicons_react_1.XIcon}/>);
|
24
|
+
const results = await jest_axe_1.axe(container);
|
25
|
+
expect(results).toHaveNoViolations();
|
26
|
+
react_2.cleanup();
|
27
|
+
});
|
28
|
+
});
|
@@ -0,0 +1,47 @@
|
|
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('SubNav', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.SubNav });
|
15
|
+
testing_1.checkExports('SubNav', {
|
16
|
+
default: __1.SubNav
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.SubNav />);
|
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.SubNav />).type).toEqual('nav');
|
26
|
+
});
|
27
|
+
it('adds the SubNav class', () => {
|
28
|
+
expect(testing_1.rendersClass(<__1.SubNav />, 'SubNav')).toEqual(true);
|
29
|
+
});
|
30
|
+
it('sets aria-label to the "label" prop', () => {
|
31
|
+
expect(testing_1.render(<__1.SubNav label="foo"/>).props['aria-label']).toEqual('foo');
|
32
|
+
});
|
33
|
+
it('wraps its children in an "SubNav-body" div', () => {
|
34
|
+
const children = <b>yo</b>;
|
35
|
+
const wrapper = testing_1.mount(<__1.SubNav>{children}</__1.SubNav>);
|
36
|
+
const body = wrapper.find('.SubNav-body');
|
37
|
+
expect(body.exists()).toEqual(true);
|
38
|
+
expect(body.childAt(0).type()).toEqual('b');
|
39
|
+
});
|
40
|
+
it('respects the "actions" prop', () => {
|
41
|
+
const content = <h1>hi!</h1>;
|
42
|
+
const wrapper = testing_1.mount(<__1.SubNav actions={content}/>);
|
43
|
+
const actions = wrapper.find('.SubNav-actions');
|
44
|
+
expect(actions.exists()).toEqual(true);
|
45
|
+
expect(actions.text()).toEqual('hi!');
|
46
|
+
});
|
47
|
+
});
|
@@ -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('SubNav.Link', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.SubNav.Link });
|
15
|
+
it('renders an <a> by default', () => {
|
16
|
+
expect(testing_1.render(<__1.SubNav.Link />).type).toEqual('a');
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.SubNav.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.SubNav.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.SubNav.Link as={Link} to="#"/>)).toMatchSnapshot();
|
30
|
+
});
|
31
|
+
});
|