@primer/components 31.2.0-rc.b718ff50 → 31.2.0-rc.decfca99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +5 -2
- package/.github/workflows/release.yml +1 -0
- package/.github/workflows/release_canary.yml +1 -0
- package/CHANGELOG.md +13 -1
- package/dist/browser.esm.js +620 -618
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +188 -186
- package/dist/browser.umd.js.map +1 -1
- package/docs/content/ActionList2.mdx +360 -0
- package/docs/content/StateLabel.md +5 -4
- package/docs/content/getting-started.md +1 -1
- package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
- package/lib/ActionList/Divider.jsx +29 -0
- package/lib/ActionList/Group.jsx +23 -0
- package/lib/ActionList/Header.jsx +66 -0
- package/lib/ActionList/Item.jsx +301 -0
- package/lib/ActionList/List.jsx +138 -0
- package/lib/ActionList/index.js +12 -23
- package/lib/ActionList2/Description.d.ts +12 -0
- package/lib/ActionList2/Description.js +53 -0
- package/lib/ActionList2/Description.jsx +30 -0
- package/lib/ActionList2/Divider.d.ts +5 -0
- package/lib/ActionList2/Divider.js +35 -0
- package/lib/ActionList2/Divider.jsx +22 -0
- package/lib/ActionList2/Group.d.ts +11 -0
- package/lib/ActionList2/Group.js +57 -0
- package/lib/ActionList2/Group.jsx +25 -0
- package/lib/ActionList2/Header.d.ts +26 -0
- package/lib/ActionList2/Header.js +55 -0
- package/lib/ActionList2/Header.jsx +36 -0
- package/lib/ActionList2/Item.d.ts +63 -0
- package/lib/ActionList2/Item.js +244 -0
- package/lib/ActionList2/Item.jsx +174 -0
- package/lib/ActionList2/LinkItem.d.ts +17 -0
- package/lib/ActionList2/LinkItem.js +57 -0
- package/lib/ActionList2/LinkItem.jsx +28 -0
- package/lib/ActionList2/List.d.ts +26 -0
- package/lib/ActionList2/List.js +59 -0
- package/lib/ActionList2/List.jsx +41 -0
- package/lib/ActionList2/Selection.d.ts +5 -0
- package/lib/ActionList2/Selection.js +70 -0
- package/lib/ActionList2/Selection.jsx +36 -0
- package/lib/ActionList2/Visuals.d.ts +9 -0
- package/lib/ActionList2/Visuals.js +90 -0
- package/lib/ActionList2/Visuals.jsx +48 -0
- package/lib/ActionList2/index.d.ts +36 -0
- package/lib/ActionList2/index.js +29 -0
- package/lib/ActionMenu.jsx +73 -0
- package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
- package/lib/AnchoredOverlay/index.js +4 -12
- package/lib/Autocomplete/Autocomplete.d.ts +28 -28
- package/lib/Autocomplete/Autocomplete.jsx +100 -0
- package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
- package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
- package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
- package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
- package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
- package/lib/Autocomplete/index.js +7 -14
- package/lib/Avatar.jsx +34 -0
- package/lib/AvatarPair.jsx +29 -0
- package/lib/AvatarStack.jsx +151 -0
- package/lib/BaseStyles.jsx +65 -0
- package/lib/BorderBox.jsx +18 -0
- package/lib/Box.jsx +10 -0
- package/lib/BranchName.jsx +20 -0
- package/lib/Breadcrumbs.jsx +74 -0
- package/lib/Button/Button.d.ts +25 -25
- package/lib/Button/Button.jsx +60 -0
- package/lib/Button/ButtonBase.jsx +36 -0
- package/lib/Button/ButtonClose.d.ts +45 -45
- package/lib/Button/ButtonClose.jsx +55 -0
- package/lib/Button/ButtonDanger.d.ts +25 -25
- package/lib/Button/ButtonDanger.jsx +63 -0
- package/lib/Button/ButtonGroup.jsx +55 -0
- package/lib/Button/ButtonInvisible.d.ts +25 -25
- package/lib/Button/ButtonInvisible.jsx +52 -0
- package/lib/Button/ButtonOutline.d.ts +25 -25
- package/lib/Button/ButtonOutline.jsx +63 -0
- package/lib/Button/ButtonPrimary.d.ts +25 -25
- package/lib/Button/ButtonPrimary.jsx +62 -0
- package/lib/Button/ButtonStyles.jsx +37 -0
- package/lib/Button/ButtonTableList.jsx +49 -0
- package/lib/Button/index.js +21 -70
- package/lib/Caret.jsx +93 -0
- package/lib/CircleBadge.jsx +43 -0
- package/lib/CircleOcticon.d.ts +42 -42
- package/lib/CircleOcticon.jsx +21 -0
- package/lib/CounterLabel.jsx +44 -0
- package/lib/Details.jsx +21 -0
- package/lib/Dialog/ConfirmationDialog.jsx +146 -0
- package/lib/Dialog/Dialog.jsx +273 -0
- package/lib/Dialog.d.ts +45 -45
- package/lib/Dialog.jsx +131 -0
- package/lib/Dropdown.d.ts +176 -176
- package/lib/Dropdown.jsx +134 -0
- package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
- package/lib/DropdownMenu/DropdownButton.jsx +14 -0
- package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
- package/lib/DropdownMenu/index.js +6 -20
- package/lib/DropdownStyles.js +18 -26
- package/lib/FilterList.d.ts +42 -42
- package/lib/FilterList.jsx +63 -0
- package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
- package/lib/FilteredActionList/index.js +4 -12
- package/lib/FilteredSearch.jsx +29 -0
- package/lib/Flash.jsx +70 -0
- package/lib/Flex.jsx +15 -0
- package/lib/FormGroup.jsx +25 -0
- package/lib/Grid.jsx +15 -0
- package/lib/Header.jsx +90 -0
- package/lib/Heading.jsx +21 -0
- package/lib/Label.jsx +84 -0
- package/lib/LabelGroup.jsx +19 -0
- package/lib/Link.jsx +38 -0
- package/lib/Overlay.jsx +156 -0
- package/lib/Pagehead.jsx +18 -0
- package/lib/Pagination/Pagination.jsx +163 -0
- package/lib/Pagination/index.js +6 -12
- package/lib/Pagination/model.jsx +174 -0
- package/lib/PointerBox.jsx +25 -0
- package/lib/Popover.jsx +210 -0
- package/lib/Portal/Portal.jsx +79 -0
- package/lib/Portal/index.js +5 -16
- package/lib/Position.d.ts +4 -4
- package/lib/Position.jsx +46 -0
- package/lib/ProgressBar.jsx +39 -0
- package/lib/SelectMenu/SelectMenu.d.ts +246 -246
- package/lib/SelectMenu/SelectMenu.jsx +114 -0
- package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
- package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
- package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
- package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
- package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
- package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
- package/lib/SelectMenu/SelectMenuList.jsx +60 -0
- package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
- package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
- package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
- package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
- package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
- package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
- package/lib/SelectMenu/index.js +7 -14
- package/lib/SelectPanel/SelectPanel.jsx +105 -0
- package/lib/SelectPanel/index.js +4 -12
- package/lib/SideNav.jsx +177 -0
- package/lib/Spinner.jsx +35 -0
- package/lib/StateLabel.d.ts +1 -1
- package/lib/StateLabel.js +6 -1
- package/lib/StateLabel.jsx +94 -0
- package/lib/StyledOcticon.jsx +20 -0
- package/lib/SubNav.jsx +104 -0
- package/lib/TabNav.jsx +60 -0
- package/lib/Text.jsx +14 -0
- package/lib/TextInput.jsx +23 -0
- package/lib/TextInputWithTokens.d.ts +28 -28
- package/lib/TextInputWithTokens.jsx +218 -0
- package/lib/ThemeProvider.jsx +130 -0
- package/lib/Timeline.d.ts +43 -43
- package/lib/Timeline.jsx +124 -0
- package/lib/Token/AvatarToken.d.ts +1 -1
- package/lib/Token/AvatarToken.jsx +54 -0
- package/lib/Token/IssueLabelToken.d.ts +1 -1
- package/lib/Token/IssueLabelToken.jsx +125 -0
- package/lib/Token/Token.d.ts +1 -1
- package/lib/Token/Token.jsx +103 -0
- package/lib/Token/TokenBase.jsx +88 -0
- package/lib/Token/_RemoveTokenButton.jsx +108 -0
- package/lib/Token/_TokenTextContainer.jsx +49 -0
- package/lib/Token/index.js +11 -30
- package/lib/Tooltip.jsx +246 -0
- package/lib/Truncate.jsx +27 -0
- package/lib/UnderlineNav.jsx +90 -0
- package/lib/_TextInputWrapper.js +2 -2
- package/lib/_TextInputWrapper.jsx +120 -0
- package/lib/_UnstyledTextInput.jsx +22 -0
- package/lib/__tests__/ActionList.test.jsx +49 -0
- package/lib/__tests__/ActionList.types.test.jsx +45 -0
- package/lib/__tests__/ActionList2.test.d.ts +1 -0
- package/lib/__tests__/ActionList2.test.js +53 -0
- package/lib/__tests__/ActionList2.test.jsx +46 -0
- package/lib/__tests__/ActionMenu.test.jsx +124 -0
- package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
- package/lib/__tests__/Autocomplete.test.jsx +299 -0
- package/lib/__tests__/Avatar.test.jsx +42 -0
- package/lib/__tests__/AvatarStack.test.jsx +43 -0
- package/lib/__tests__/BorderBox.test.jsx +36 -0
- package/lib/__tests__/Box.test.jsx +41 -0
- package/lib/__tests__/BranchName.test.jsx +27 -0
- package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
- package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
- package/lib/__tests__/Button.test.jsx +100 -0
- package/lib/__tests__/Caret.test.jsx +37 -0
- package/lib/__tests__/CircleBadge.test.jsx +55 -0
- package/lib/__tests__/CircleOcticon.test.jsx +45 -0
- package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
- package/lib/__tests__/CounterLabel.test.jsx +36 -0
- package/lib/__tests__/Details.test.jsx +85 -0
- package/lib/__tests__/Dialog.test.jsx +139 -0
- package/lib/__tests__/Dropdown.test.jsx +49 -0
- package/lib/__tests__/DropdownMenu.test.jsx +119 -0
- package/lib/__tests__/FilterList.test.jsx +27 -0
- package/lib/__tests__/FilterListItem.test.jsx +31 -0
- package/lib/__tests__/FilteredSearch.test.jsx +27 -0
- package/lib/__tests__/Flash.test.jsx +36 -0
- package/lib/__tests__/Flex.test.jsx +51 -0
- package/lib/__tests__/FormGroup.test.jsx +36 -0
- package/lib/__tests__/Grid.test.jsx +69 -0
- package/lib/__tests__/Header.test.jsx +45 -0
- package/lib/__tests__/Heading.test.jsx +71 -0
- package/lib/__tests__/KeyPaths.types.test.js +5 -8
- package/lib/__tests__/Label.test.jsx +33 -0
- package/lib/__tests__/LabelGroup.test.jsx +29 -0
- package/lib/__tests__/Link.test.jsx +43 -0
- package/lib/__tests__/Merge.types.test.js +13 -19
- package/lib/__tests__/Overlay.test.jsx +105 -0
- package/lib/__tests__/Pagehead.test.jsx +25 -0
- package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
- package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
- package/lib/__tests__/PointerBox.test.jsx +33 -0
- package/lib/__tests__/Popover.test.jsx +58 -0
- package/lib/__tests__/Portal.test.jsx +102 -0
- package/lib/__tests__/Position.test.jsx +96 -0
- package/lib/__tests__/ProgressBar.test.jsx +38 -0
- package/lib/__tests__/SelectMenu.test.jsx +120 -0
- package/lib/__tests__/SelectPanel.test.jsx +48 -0
- package/lib/__tests__/SideNav.test.jsx +55 -0
- package/lib/__tests__/Spinner.test.jsx +41 -0
- package/lib/__tests__/StateLabel.test.jsx +46 -0
- package/lib/__tests__/StyledOcticon.test.jsx +28 -0
- package/lib/__tests__/SubNav.test.jsx +47 -0
- package/lib/__tests__/SubNavLink.test.jsx +31 -0
- package/lib/__tests__/TabNav.test.jsx +32 -0
- package/lib/__tests__/Text.test.jsx +71 -0
- package/lib/__tests__/TextInput.test.jsx +45 -0
- package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
- package/lib/__tests__/ThemeProvider.test.jsx +314 -0
- package/lib/__tests__/Timeline.test.jsx +51 -0
- package/lib/__tests__/Token.test.jsx +93 -0
- package/lib/__tests__/Tooltip.test.jsx +46 -0
- package/lib/__tests__/Truncate.test.jsx +41 -0
- package/lib/__tests__/UnderlineNav.test.jsx +53 -0
- package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
- package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
- package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
- package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
- package/lib/__tests__/filterObject.test.js +48 -27
- package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
- package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
- package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
- package/lib/__tests__/theme.test.js +33 -34
- package/lib/__tests__/themeGet.test.js +12 -23
- package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
- package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
- package/lib/__tests__/utils/createSlots.test.js +75 -0
- package/lib/__tests__/utils/createSlots.test.jsx +57 -0
- package/lib/behaviors/anchoredPosition.js +205 -234
- package/lib/behaviors/focusTrap.js +121 -157
- package/lib/behaviors/focusZone.js +434 -509
- package/lib/behaviors/scrollIntoViewingArea.js +18 -35
- package/lib/constants.js +39 -43
- package/lib/drafts.d.ts +7 -0
- package/lib/drafts.js +20 -0
- package/lib/hooks/index.js +16 -60
- package/lib/hooks/useAnchoredPosition.js +32 -40
- package/lib/hooks/useCombinedRefs.js +32 -36
- package/lib/hooks/useDetails.jsx +39 -0
- package/lib/hooks/useDialog.js +72 -96
- package/lib/hooks/useFocusTrap.js +43 -60
- package/lib/hooks/useFocusZone.js +54 -50
- package/lib/hooks/useOnEscapePress.js +25 -36
- package/lib/hooks/useOnOutsideClick.jsx +61 -0
- package/lib/hooks/useOpenAndCloseFocus.js +22 -34
- package/lib/hooks/useOverlay.jsx +15 -0
- package/lib/hooks/useProvidedRefOrCreate.js +10 -14
- package/lib/hooks/useProvidedStateOrCreate.js +13 -16
- package/lib/hooks/useRenderForcingRef.js +13 -17
- package/lib/hooks/useResizeObserver.js +15 -18
- package/lib/hooks/useSafeTimeout.js +22 -30
- package/lib/hooks/useScrollFlash.js +16 -23
- package/lib/index.js +161 -636
- package/lib/polyfills/eventListenerSignal.js +37 -45
- package/lib/stories/ActionList2.stories.js +908 -0
- package/lib/stories/TextInput.stories.js +144 -0
- package/lib/sx.d.ts +2 -0
- package/lib/sx.js +10 -14
- package/lib/theme-preval.js +65 -2945
- package/lib/theme.js +3 -12
- package/lib/utils/create-slots.d.ts +17 -0
- package/lib/utils/create-slots.js +105 -0
- package/lib/utils/create-slots.jsx +65 -0
- package/lib/utils/deprecate.jsx +59 -0
- package/lib/utils/isNumeric.jsx +7 -0
- package/lib/utils/iterateFocusableElements.js +63 -85
- package/lib/utils/ssr.jsx +6 -0
- package/lib/utils/test-deprecations.jsx +20 -0
- package/lib/utils/test-helpers.jsx +8 -0
- package/lib/utils/test-matchers.jsx +100 -0
- package/lib/utils/testing.d.ts +14 -1
- package/lib/utils/testing.jsx +206 -0
- package/lib/utils/theme.js +33 -47
- package/lib/utils/types/AriaRole.js +2 -1
- package/lib/utils/types/ComponentProps.js +2 -1
- package/lib/utils/types/Flatten.js +2 -1
- package/lib/utils/types/KeyPaths.js +2 -1
- package/lib/utils/types/MandateProps.js +16 -1
- package/lib/utils/types/Merge.js +2 -1
- package/lib/utils/types/index.js +16 -69
- package/lib/utils/uniqueId.js +5 -8
- package/lib/utils/use-force-update.d.ts +1 -0
- package/lib/utils/use-force-update.js +13 -0
- package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
- package/lib/utils/userAgent.js +8 -12
- package/lib-esm/ActionList2/Description.d.ts +12 -0
- package/lib-esm/ActionList2/Description.js +37 -0
- package/lib-esm/ActionList2/Divider.d.ts +5 -0
- package/lib-esm/ActionList2/Divider.js +23 -0
- package/lib-esm/ActionList2/Group.d.ts +11 -0
- package/lib-esm/ActionList2/Group.js +40 -0
- package/lib-esm/ActionList2/Header.d.ts +26 -0
- package/lib-esm/ActionList2/Header.js +44 -0
- package/lib-esm/ActionList2/Item.d.ts +63 -0
- package/lib-esm/ActionList2/Item.js +210 -0
- package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
- package/lib-esm/ActionList2/LinkItem.js +43 -0
- package/lib-esm/ActionList2/List.d.ts +26 -0
- package/lib-esm/ActionList2/List.js +37 -0
- package/lib-esm/ActionList2/Selection.d.ts +5 -0
- package/lib-esm/ActionList2/Selection.js +52 -0
- package/lib-esm/ActionList2/Visuals.d.ts +9 -0
- package/lib-esm/ActionList2/Visuals.js +68 -0
- package/lib-esm/ActionList2/index.d.ts +36 -0
- package/lib-esm/ActionList2/index.js +33 -0
- package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
- package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
- package/lib-esm/Button/Button.d.ts +25 -25
- package/lib-esm/Button/ButtonClose.d.ts +45 -45
- package/lib-esm/Button/ButtonDanger.d.ts +25 -25
- package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
- package/lib-esm/Button/ButtonOutline.d.ts +25 -25
- package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
- package/lib-esm/CircleOcticon.d.ts +42 -42
- package/lib-esm/Dialog.d.ts +45 -45
- package/lib-esm/Dropdown.d.ts +176 -176
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
- package/lib-esm/FilterList.d.ts +42 -42
- package/lib-esm/Position.d.ts +4 -4
- package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib-esm/StateLabel.d.ts +1 -1
- package/lib-esm/StateLabel.js +7 -2
- package/lib-esm/TextInputWithTokens.d.ts +28 -28
- package/lib-esm/Timeline.d.ts +43 -43
- package/lib-esm/Token/AvatarToken.d.ts +1 -1
- package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
- package/lib-esm/Token/Token.d.ts +1 -1
- package/lib-esm/_TextInputWrapper.js +2 -2
- package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionList2.test.js +41 -0
- package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
- package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
- package/lib-esm/drafts.d.ts +7 -0
- package/lib-esm/drafts.js +8 -0
- package/lib-esm/stories/ActionList2.stories.js +796 -0
- package/lib-esm/stories/TextInput.stories.js +117 -0
- package/lib-esm/sx.d.ts +2 -0
- package/lib-esm/sx.js +3 -1
- package/lib-esm/theme-preval.js +81 -2
- package/lib-esm/utils/create-slots.d.ts +17 -0
- package/lib-esm/utils/create-slots.js +84 -0
- package/lib-esm/utils/testing.d.ts +14 -1
- package/lib-esm/utils/use-force-update.d.ts +1 -0
- package/lib-esm/utils/use-force-update.js +6 -0
- package/package-lock.json +153 -14
- package/package.json +7 -4
- package/script/build +1 -1
- package/src/ActionList2/Description.tsx +49 -0
- package/src/ActionList2/Divider.tsx +24 -0
- package/src/ActionList2/Group.tsx +34 -0
- package/src/ActionList2/Header.tsx +58 -0
- package/src/ActionList2/Item.tsx +245 -0
- package/src/ActionList2/LinkItem.tsx +49 -0
- package/src/ActionList2/List.tsx +55 -0
- package/src/ActionList2/Selection.tsx +40 -0
- package/src/ActionList2/Visuals.tsx +76 -0
- package/src/ActionList2/index.ts +39 -0
- package/src/StateLabel.tsx +14 -2
- package/src/_TextInputWrapper.tsx +7 -0
- package/src/__tests__/ActionList2.test.tsx +47 -0
- package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
- package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
- package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
- package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
- package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
- package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
- package/src/__tests__/utils/createSlots.test.tsx +74 -0
- package/src/drafts.ts +9 -0
- package/src/stories/ActionList2.stories.tsx +1291 -0
- package/src/stories/TextInput.stories.tsx +113 -0
- package/src/sx.ts +3 -0
- package/src/theme-preval.js +1 -0
- package/src/utils/create-slots.tsx +96 -0
- package/src/utils/use-force-update.ts +7 -0
- package/stats.html +1 -1
- package/tsconfig.base.json +20 -0
- package/tsconfig.build.json +2 -2
- package/tsconfig.json +4 -17
@@ -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
|
+
});
|
@@ -0,0 +1,32 @@
|
|
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('TabNav', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.TabNav });
|
15
|
+
testing_1.checkExports('TabNav', {
|
16
|
+
default: __1.TabNav
|
17
|
+
});
|
18
|
+
describe('TabNav.Link', () => {
|
19
|
+
testing_1.behavesAsComponent({ Component: __1.TabNav.Link });
|
20
|
+
});
|
21
|
+
it('should have no axe violations', async () => {
|
22
|
+
const { container } = react_2.render(<__1.TabNav aria-label="main"/>);
|
23
|
+
const results = await jest_axe_1.axe(container);
|
24
|
+
expect(results).toHaveNoViolations();
|
25
|
+
react_2.cleanup();
|
26
|
+
});
|
27
|
+
it('sets aria-label appropriately', () => {
|
28
|
+
const { getByLabelText } = react_2.render(<__1.TabNav aria-label="stuff"/>);
|
29
|
+
expect(getByLabelText('stuff')).toBeTruthy();
|
30
|
+
expect(getByLabelText('stuff').tagName).toEqual('NAV');
|
31
|
+
});
|
32
|
+
});
|
@@ -0,0 +1,71 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const __1 = require("..");
|
8
|
+
const theme_1 = __importDefault(require("../theme"));
|
9
|
+
const testing_1 = require("../utils/testing");
|
10
|
+
const react_2 = require("@testing-library/react");
|
11
|
+
const jest_axe_1 = require("jest-axe");
|
12
|
+
require("babel-polyfill");
|
13
|
+
expect.extend(jest_axe_1.toHaveNoViolations);
|
14
|
+
describe('Text', () => {
|
15
|
+
testing_1.behavesAsComponent({ Component: __1.Text });
|
16
|
+
testing_1.checkExports('Text', {
|
17
|
+
default: __1.Text
|
18
|
+
});
|
19
|
+
it('renders a <span> by default', () => {
|
20
|
+
expect(testing_1.render(<__1.Text />).type).toEqual('span');
|
21
|
+
});
|
22
|
+
it('should have no axe violations', async () => {
|
23
|
+
const { container } = react_2.render(<__1.Text>hello</__1.Text>);
|
24
|
+
const results = await jest_axe_1.axe(container);
|
25
|
+
expect(results).toHaveNoViolations();
|
26
|
+
react_2.cleanup();
|
27
|
+
});
|
28
|
+
it('renders fontSize', () => {
|
29
|
+
for (const fontSize of theme_1.default.fontSizes) {
|
30
|
+
expect(testing_1.render(<__1.Text fontSize={fontSize}/>)).toHaveStyleRule('font-size', testing_1.px(fontSize));
|
31
|
+
}
|
32
|
+
});
|
33
|
+
it('renders responsive fontSize', () => {
|
34
|
+
expect(testing_1.renderStyles(<__1.Text fontSize={[1, 2]}/>)).toEqual({
|
35
|
+
'font-size': testing_1.px(theme_1.default.fontSizes[1]),
|
36
|
+
[`@media screen and (min-width:${testing_1.px(theme_1.default.breakpoints[0])})`]: {
|
37
|
+
'font-size': testing_1.px(theme_1.default.fontSizes[2])
|
38
|
+
}
|
39
|
+
});
|
40
|
+
});
|
41
|
+
it('renders responsive lineHeight', () => {
|
42
|
+
expect(testing_1.renderStyles(<__1.Text lineHeight={['condensed', 'default']}/>)).toEqual({
|
43
|
+
'line-height': String(theme_1.default.lineHeights.condensed),
|
44
|
+
[`@media screen and (min-width:${testing_1.px(theme_1.default.breakpoints[0])})`]: {
|
45
|
+
'line-height': String(theme_1.default.lineHeights.default)
|
46
|
+
}
|
47
|
+
});
|
48
|
+
});
|
49
|
+
it('respects fontWeight', () => {
|
50
|
+
expect(testing_1.render(<__1.Text fontWeight="bold"/>)).toHaveStyleRule('font-weight', '600');
|
51
|
+
expect(testing_1.render(<__1.Text fontWeight="normal"/>)).toHaveStyleRule('font-weight', '400');
|
52
|
+
});
|
53
|
+
it('respects the "fontStyle" prop', () => {
|
54
|
+
expect(testing_1.render(<__1.Text fontStyle="italic"/>)).toHaveStyleRule('font-style', 'italic');
|
55
|
+
expect(testing_1.render(<__1.Text as="i" fontStyle="normal"/>)).toHaveStyleRule('font-style', 'normal');
|
56
|
+
});
|
57
|
+
it('respects lineHeight', () => {
|
58
|
+
for (const [name, value] of Object.entries(theme_1.default.lineHeights)) {
|
59
|
+
expect(testing_1.render(<__1.Text lineHeight={name}/>)).toHaveStyleRule('line-height', String(value));
|
60
|
+
}
|
61
|
+
});
|
62
|
+
it('respects fontFamily="mono"', () => {
|
63
|
+
// styled-components removes the whitespace between font-family values
|
64
|
+
const mono = theme_1.default.fonts.mono.replace(/, /g, ',');
|
65
|
+
expect(testing_1.render(<__1.Text fontFamily="mono"/>)).toHaveStyleRule('font-family', mono);
|
66
|
+
});
|
67
|
+
it('respects other values for fontSize', () => {
|
68
|
+
expect(testing_1.render(<__1.Text fontSize="2em"/>)).toHaveStyleRule('font-size', '2em');
|
69
|
+
expect(testing_1.render(<__1.Text fontSize={100}/>)).toHaveStyleRule('font-size', '100px');
|
70
|
+
});
|
71
|
+
});
|
@@ -0,0 +1,45 @@
|
|
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('TextInput', () => {
|
14
|
+
testing_1.behavesAsComponent({ Component: __1.TextInput, options: { skipAs: true } });
|
15
|
+
testing_1.checkExports('TextInput', {
|
16
|
+
default: __1.TextInput
|
17
|
+
});
|
18
|
+
it('should have no axe violations', async () => {
|
19
|
+
const { container } = react_2.render(<__1.TextInput aria-label="zipcode" name="zipcode" variant="small"/>);
|
20
|
+
const results = await jest_axe_1.axe(container);
|
21
|
+
expect(results).toHaveNoViolations();
|
22
|
+
react_2.cleanup();
|
23
|
+
});
|
24
|
+
it('renders', () => {
|
25
|
+
expect(testing_1.render(<__1.TextInput name="zipcode"/>)).toMatchSnapshot();
|
26
|
+
});
|
27
|
+
it('renders small', () => {
|
28
|
+
expect(testing_1.render(<__1.TextInput name="zipcode" variant="small"/>)).toMatchSnapshot();
|
29
|
+
});
|
30
|
+
it('renders large', () => {
|
31
|
+
expect(testing_1.render(<__1.TextInput name="zipcode" variant="large"/>)).toMatchSnapshot();
|
32
|
+
});
|
33
|
+
it('renders block', () => {
|
34
|
+
expect(testing_1.render(<__1.TextInput name="zipcode" block/>)).toMatchSnapshot();
|
35
|
+
});
|
36
|
+
it('should call onChange prop with input value', () => {
|
37
|
+
const onChangeMock = jest.fn();
|
38
|
+
const component = testing_1.mount(<__1.TextInput onChange={onChangeMock} value="test"/>);
|
39
|
+
component.find('input').simulate('change');
|
40
|
+
expect(onChangeMock).toHaveBeenCalled();
|
41
|
+
});
|
42
|
+
it('should render a password input', () => {
|
43
|
+
expect(testing_1.render(<__1.TextInput name="password" type="password"/>)).toMatchSnapshot();
|
44
|
+
});
|
45
|
+
});
|