@primer/components 31.2.0 → 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/.changeset/README.md +8 -0
- package/.changeset/config.json +10 -0
- package/.devcontainer/devcontainer.json +8 -0
- package/.eslintrc.json +137 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/new_component_proposal_template.md +41 -0
- package/.github/dependabot.yml +18 -0
- package/.github/pull_request_template.md +18 -0
- package/.github/workflows/check_for_changeset.yml +25 -0
- package/.github/workflows/ci.yml +34 -0
- package/.github/workflows/deploy_preview.yml +47 -0
- package/.github/workflows/deploy_production.yml +70 -0
- package/.github/workflows/release.yml +36 -0
- package/.github/workflows/release_canary.yml +71 -0
- package/.github/workflows/release_candidate.yml +60 -0
- package/.github/workflows/size.yml +13 -0
- package/.github/workflows/stale.yml +26 -0
- package/.gitignore +10 -0
- package/.npmrc +4 -0
- package/.nvmrc +1 -0
- package/.storybook/main.js +9 -0
- package/.storybook/preview.js +117 -0
- package/.vscode/launch.json +21 -0
- package/.vscode/settings.json +13 -0
- package/@types/@styled-system/index.d.ts +0 -0
- package/@types/@styled-system/prop-types/index.d.ts +1 -0
- package/@types/@styled-system/props/index.d.ts +1 -0
- package/@types/jest-styled-components/index.d.ts +1 -0
- package/CHANGELOG.md +8 -0
- package/CODEOWNERS +2 -0
- package/babel-defines.js +13 -0
- package/babel.config.js +39 -0
- package/contributor-docs/CODE_OF_CONDUCT.md +76 -0
- package/contributor-docs/CONTRIBUTING.md +274 -0
- package/contributor-docs/adrs/adr-001-typescript.md +23 -0
- package/contributor-docs/adrs/adr-002-behavior-isolation.md +108 -0
- package/contributor-docs/adrs/adr-003-prop-norms.md +72 -0
- package/contributor-docs/behaviors.md +132 -0
- package/contributor-docs/component-contents-api-patterns.md +316 -0
- package/contributor-docs/principles.md +39 -0
- package/dist/browser.esm.js +32 -21
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +35 -24
- package/dist/browser.umd.js.map +1 -1
- package/docs/.eslintrc +0 -0
- package/docs/.gitignore +91 -0
- package/docs/components/PropsList.js +5 -0
- package/docs/components/State.js +9 -0
- package/docs/components/constants.js +34 -0
- package/docs/components/index.js +2 -0
- package/docs/content/ActionList.mdx +99 -0
- package/docs/content/ActionList2.mdx +358 -0
- package/docs/content/ActionMenu.mdx +80 -0
- package/docs/content/AnchoredOverlay.mdx +37 -0
- package/docs/content/Autocomplete.mdx +657 -0
- package/docs/content/Avatar.mdx +33 -0
- package/docs/content/AvatarStack.mdx +37 -0
- package/docs/content/BorderBox.md +46 -0
- package/docs/content/Box.md +74 -0
- package/docs/content/BranchName.md +18 -0
- package/docs/content/Breadcrumbs.md +52 -0
- package/docs/content/Buttons.md +56 -0
- package/docs/content/CircleBadge.md +45 -0
- package/docs/content/CircleOcticon.md +18 -0
- package/docs/content/CounterLabel.md +32 -0
- package/docs/content/Details.md +105 -0
- package/docs/content/Dialog.md +108 -0
- package/docs/content/Dialog2.mdx +179 -0
- package/docs/content/Dropdown.md +72 -0
- package/docs/content/DropdownMenu.mdx +49 -0
- package/docs/content/FilterList.md +44 -0
- package/docs/content/FilteredSearch.md +39 -0
- package/docs/content/Flash.md +44 -0
- package/docs/content/Flex.md +58 -0
- package/docs/content/FormGroup.md +46 -0
- package/docs/content/Grid.md +59 -0
- package/docs/content/Header.md +79 -0
- package/docs/content/Heading.md +22 -0
- package/docs/content/Label.md +42 -0
- package/docs/content/LabelGroup.md +31 -0
- package/docs/content/Link.md +37 -0
- package/docs/content/Overlay.mdx +94 -0
- package/docs/content/Pagehead.md +27 -0
- package/docs/content/Pagination.md +187 -0
- package/docs/content/PointerBox.md +81 -0
- package/docs/content/Popover.md +137 -0
- package/docs/content/Portal.mdx +78 -0
- package/docs/content/Position.md +100 -0
- package/docs/content/ProgressBar.mdx +29 -0
- package/docs/content/SelectMenu.md +435 -0
- package/docs/content/SelectPanel.mdx +67 -0
- package/docs/content/SideNav.md +179 -0
- package/docs/content/Spinner.mdx +32 -0
- package/docs/content/StateLabel.md +36 -0
- package/docs/content/StyledOcticon.md +36 -0
- package/docs/content/SubNav.md +102 -0
- package/docs/content/TabNav.md +50 -0
- package/docs/content/Text.md +31 -0
- package/docs/content/TextInput.md +34 -0
- package/docs/content/TextInputTokens.mdx +89 -0
- package/docs/content/TextInputWithTokens.mdx +211 -0
- package/docs/content/Timeline.md +138 -0
- package/docs/content/Token.mdx +381 -0
- package/docs/content/Tooltip.md +41 -0
- package/docs/content/Truncate.md +64 -0
- package/docs/content/UnderlineNav.md +53 -0
- package/docs/content/anchoredPosition.mdx +163 -0
- package/docs/content/core-concepts.md +70 -0
- package/docs/content/focusTrap.mdx +103 -0
- package/docs/content/focusZone.mdx +145 -0
- package/docs/content/getting-started.md +138 -0
- package/docs/content/index.md +33 -0
- package/docs/content/linting.md +35 -0
- package/docs/content/overriding-styles.mdx +82 -0
- package/docs/content/philosophy.md +23 -0
- package/docs/content/primer-theme.md +89 -0
- package/docs/content/ssr.mdx +43 -0
- package/docs/content/system-props.mdx +37 -0
- package/docs/content/theme-reference.md +16 -0
- package/docs/content/theming.md +272 -0
- package/docs/content/useOnEscapePress.mdx +56 -0
- package/docs/content/useOnOutsideClick.mdx +57 -0
- package/docs/content/useOpenAndCloseFocus.mdx +49 -0
- package/docs/content/useOverlay.mdx +62 -0
- package/docs/content/useSafeTimeout.mdx +32 -0
- package/docs/gatsby-config.js +30 -0
- package/docs/gatsby-node.js +101 -0
- package/docs/package-lock.json +20756 -0
- package/docs/package.json +36 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +21 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +41 -0
- package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +73 -0
- package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +133 -0
- package/docs/src/@primer/gatsby-theme-doctocat/primer-components-hero.svg +1411 -0
- package/docs/src/props.js +77 -0
- package/jest.config.js +13 -0
- package/lib/ActionList/Item.js +28 -19
- package/lib/ActionList/Item.jsx +21 -11
- package/lib/ActionList2/Description.js +8 -4
- package/lib/ActionList2/Description.jsx +2 -3
- package/lib/ActionList2/Item.js +7 -9
- package/lib/ActionList2/Item.jsx +6 -6
- package/lib/ActionList2/Selection.d.ts +1 -1
- package/lib/ActionList2/Selection.js +29 -15
- package/lib/ActionList2/Selection.jsx +19 -5
- package/lib/NewButton/button.js +6 -6
- package/lib/NewButton/button.jsx +4 -4
- package/lib/__tests__/ActionList.test.d.ts +1 -0
- package/lib/__tests__/ActionList.test.js +69 -0
- package/lib/__tests__/ActionList.test.jsx +49 -0
- package/lib/__tests__/ActionList.types.test.d.ts +6 -0
- package/lib/__tests__/ActionList.types.test.js +69 -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.d.ts +1 -0
- package/lib/__tests__/ActionMenu.test.js +151 -0
- package/lib/__tests__/ActionMenu.test.jsx +124 -0
- package/lib/__tests__/AnchoredOverlay.test.d.ts +1 -0
- package/lib/__tests__/AnchoredOverlay.test.js +162 -0
- package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
- package/lib/__tests__/Autocomplete.test.d.ts +1 -0
- package/lib/__tests__/Autocomplete.test.js +528 -0
- package/lib/__tests__/Autocomplete.test.jsx +299 -0
- package/lib/__tests__/Avatar.test.d.ts +1 -0
- package/lib/__tests__/Avatar.test.js +67 -0
- package/lib/__tests__/Avatar.test.jsx +42 -0
- package/lib/__tests__/AvatarStack.test.d.ts +1 -0
- package/lib/__tests__/AvatarStack.test.js +71 -0
- package/lib/__tests__/AvatarStack.test.jsx +43 -0
- package/lib/__tests__/BorderBox.test.d.ts +1 -0
- package/lib/__tests__/BorderBox.test.js +58 -0
- package/lib/__tests__/BorderBox.test.jsx +36 -0
- package/lib/__tests__/Box.test.d.ts +1 -0
- package/lib/__tests__/Box.test.js +78 -0
- package/lib/__tests__/Box.test.jsx +41 -0
- package/lib/__tests__/BranchName.test.d.ts +1 -0
- package/lib/__tests__/BranchName.test.js +36 -0
- package/lib/__tests__/BranchName.test.jsx +27 -0
- package/lib/__tests__/Breadcrumbs.test.d.ts +1 -0
- package/lib/__tests__/Breadcrumbs.test.js +37 -0
- package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
- package/lib/__tests__/BreadcrumbsItem.test.d.ts +1 -0
- package/lib/__tests__/BreadcrumbsItem.test.js +49 -0
- package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
- package/lib/__tests__/Button.test.d.ts +1 -0
- package/lib/__tests__/Button.test.js +143 -0
- package/lib/__tests__/Button.test.jsx +100 -0
- package/lib/__tests__/Caret.test.d.ts +1 -0
- package/lib/__tests__/Caret.test.js +52 -0
- package/lib/__tests__/Caret.test.jsx +37 -0
- package/lib/__tests__/CircleBadge.test.d.ts +1 -0
- package/lib/__tests__/CircleBadge.test.js +83 -0
- package/lib/__tests__/CircleBadge.test.jsx +55 -0
- package/lib/__tests__/CircleOcticon.test.d.ts +1 -0
- package/lib/__tests__/CircleOcticon.test.js +71 -0
- package/lib/__tests__/CircleOcticon.test.jsx +45 -0
- package/lib/__tests__/ConfirmationDialog.test.d.ts +1 -0
- package/lib/__tests__/ConfirmationDialog.test.js +134 -0
- package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
- package/lib/__tests__/CounterLabel.test.d.ts +1 -0
- package/lib/__tests__/CounterLabel.test.js +58 -0
- package/lib/__tests__/CounterLabel.test.jsx +36 -0
- package/lib/__tests__/Details.test.d.ts +1 -0
- package/lib/__tests__/Details.test.js +117 -0
- package/lib/__tests__/Details.test.jsx +85 -0
- package/lib/__tests__/Dialog.test.d.ts +1 -0
- package/lib/__tests__/Dialog.test.js +184 -0
- package/lib/__tests__/Dialog.test.jsx +139 -0
- package/lib/__tests__/Dropdown.test.d.ts +1 -0
- package/lib/__tests__/Dropdown.test.js +63 -0
- package/lib/__tests__/Dropdown.test.jsx +49 -0
- package/lib/__tests__/DropdownMenu.test.d.ts +1 -0
- package/lib/__tests__/DropdownMenu.test.js +150 -0
- package/lib/__tests__/DropdownMenu.test.jsx +119 -0
- package/lib/__tests__/FilterList.test.d.ts +1 -0
- package/lib/__tests__/FilterList.test.js +36 -0
- package/lib/__tests__/FilterList.test.jsx +27 -0
- package/lib/__tests__/FilterListItem.test.d.ts +1 -0
- package/lib/__tests__/FilterListItem.test.js +46 -0
- package/lib/__tests__/FilterListItem.test.jsx +31 -0
- package/lib/__tests__/FilteredSearch.test.d.ts +1 -0
- package/lib/__tests__/FilteredSearch.test.js +36 -0
- package/lib/__tests__/FilteredSearch.test.jsx +27 -0
- package/lib/__tests__/Flash.test.d.ts +1 -0
- package/lib/__tests__/Flash.test.js +62 -0
- package/lib/__tests__/Flash.test.jsx +36 -0
- package/lib/__tests__/Flex.test.d.ts +1 -0
- package/lib/__tests__/Flex.test.js +74 -0
- package/lib/__tests__/Flex.test.jsx +51 -0
- package/lib/__tests__/FormGroup.test.d.ts +1 -0
- package/lib/__tests__/FormGroup.test.js +54 -0
- package/lib/__tests__/FormGroup.test.jsx +36 -0
- package/lib/__tests__/Grid.test.d.ts +1 -0
- package/lib/__tests__/Grid.test.js +104 -0
- package/lib/__tests__/Grid.test.jsx +69 -0
- package/lib/__tests__/Header.test.d.ts +1 -0
- package/lib/__tests__/Header.test.js +58 -0
- package/lib/__tests__/Header.test.jsx +45 -0
- package/lib/__tests__/Heading.test.d.ts +1 -0
- package/lib/__tests__/Heading.test.js +109 -0
- package/lib/__tests__/Heading.test.jsx +71 -0
- package/lib/__tests__/KeyPaths.types.test.d.ts +11 -0
- package/lib/__tests__/KeyPaths.types.test.js +7 -0
- package/lib/__tests__/Label.test.d.ts +1 -0
- package/lib/__tests__/Label.test.js +46 -0
- package/lib/__tests__/Label.test.jsx +33 -0
- package/lib/__tests__/LabelGroup.test.d.ts +1 -0
- package/lib/__tests__/LabelGroup.test.js +38 -0
- package/lib/__tests__/LabelGroup.test.jsx +29 -0
- package/lib/__tests__/Link.test.d.ts +1 -0
- package/lib/__tests__/Link.test.js +70 -0
- package/lib/__tests__/Link.test.jsx +43 -0
- package/lib/__tests__/Merge.types.test.d.ts +30 -0
- package/lib/__tests__/Merge.types.test.js +21 -0
- 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.d.ts +1 -0
- package/lib/__tests__/Overlay.test.js +145 -0
- package/lib/__tests__/Overlay.test.jsx +105 -0
- package/lib/__tests__/Pagehead.test.d.ts +1 -0
- package/lib/__tests__/Pagehead.test.js +37 -0
- package/lib/__tests__/Pagehead.test.jsx +25 -0
- package/lib/__tests__/Pagination/Pagination.test.d.ts +1 -0
- package/lib/__tests__/Pagination/Pagination.test.js +47 -0
- package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
- package/lib/__tests__/Pagination/PaginationModel.test.d.ts +1 -0
- package/lib/__tests__/Pagination/PaginationModel.test.js +186 -0
- package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
- package/lib/__tests__/PointerBox.test.d.ts +1 -0
- package/lib/__tests__/PointerBox.test.js +46 -0
- package/lib/__tests__/PointerBox.test.jsx +33 -0
- package/lib/__tests__/Popover.test.d.ts +1 -0
- package/lib/__tests__/Popover.test.js +66 -0
- package/lib/__tests__/Popover.test.jsx +58 -0
- package/lib/__tests__/Portal.test.d.ts +1 -0
- package/lib/__tests__/Portal.test.js +124 -0
- package/lib/__tests__/Portal.test.jsx +102 -0
- package/lib/__tests__/Position.test.d.ts +1 -0
- package/lib/__tests__/Position.test.js +143 -0
- package/lib/__tests__/Position.test.jsx +96 -0
- package/lib/__tests__/ProgressBar.test.d.ts +1 -0
- package/lib/__tests__/ProgressBar.test.js +68 -0
- package/lib/__tests__/ProgressBar.test.jsx +38 -0
- package/lib/__tests__/SelectMenu.test.d.ts +1 -0
- package/lib/__tests__/SelectMenu.test.js +155 -0
- package/lib/__tests__/SelectMenu.test.jsx +120 -0
- package/lib/__tests__/SelectPanel.test.d.ts +1 -0
- package/lib/__tests__/SelectPanel.test.js +80 -0
- package/lib/__tests__/SelectPanel.test.jsx +48 -0
- package/lib/__tests__/SideNav.test.d.ts +1 -0
- package/lib/__tests__/SideNav.test.js +71 -0
- package/lib/__tests__/SideNav.test.jsx +55 -0
- package/lib/__tests__/Spinner.test.d.ts +1 -0
- package/lib/__tests__/Spinner.test.js +53 -0
- package/lib/__tests__/Spinner.test.jsx +41 -0
- package/lib/__tests__/StateLabel.test.d.ts +1 -0
- package/lib/__tests__/StateLabel.test.js +71 -0
- package/lib/__tests__/StateLabel.test.jsx +46 -0
- package/lib/__tests__/StyledOcticon.test.d.ts +1 -0
- package/lib/__tests__/StyledOcticon.test.js +40 -0
- package/lib/__tests__/StyledOcticon.test.jsx +28 -0
- package/lib/__tests__/SubNav.test.d.ts +1 -0
- package/lib/__tests__/SubNav.test.js +62 -0
- package/lib/__tests__/SubNav.test.jsx +47 -0
- package/lib/__tests__/SubNavLink.test.d.ts +1 -0
- package/lib/__tests__/SubNavLink.test.js +49 -0
- package/lib/__tests__/SubNavLink.test.jsx +31 -0
- package/lib/__tests__/TabNav.test.d.ts +1 -0
- package/lib/__tests__/TabNav.test.js +49 -0
- package/lib/__tests__/TabNav.test.jsx +32 -0
- package/lib/__tests__/Text.test.d.ts +1 -0
- package/lib/__tests__/Text.test.js +105 -0
- package/lib/__tests__/Text.test.jsx +71 -0
- package/lib/__tests__/TextInput.test.d.ts +1 -0
- package/lib/__tests__/TextInput.test.js +78 -0
- package/lib/__tests__/TextInput.test.jsx +45 -0
- package/lib/__tests__/TextInputWithTokens.test.d.ts +1 -0
- package/lib/__tests__/TextInputWithTokens.test.js +572 -0
- package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
- package/lib/__tests__/ThemeProvider.test.d.ts +1 -0
- package/lib/__tests__/ThemeProvider.test.js +444 -0
- package/lib/__tests__/ThemeProvider.test.jsx +314 -0
- package/lib/__tests__/Timeline.test.d.ts +1 -0
- package/lib/__tests__/Timeline.test.js +75 -0
- package/lib/__tests__/Timeline.test.jsx +51 -0
- package/lib/__tests__/Token.test.d.ts +1 -0
- package/lib/__tests__/Token.test.js +180 -0
- package/lib/__tests__/Token.test.jsx +93 -0
- package/lib/__tests__/Tooltip.test.d.ts +1 -0
- package/lib/__tests__/Tooltip.test.js +69 -0
- package/lib/__tests__/Tooltip.test.jsx +46 -0
- package/lib/__tests__/Truncate.test.d.ts +1 -0
- package/lib/__tests__/Truncate.test.js +63 -0
- package/lib/__tests__/Truncate.test.jsx +41 -0
- package/lib/__tests__/UnderlineNav.test.d.ts +1 -0
- package/lib/__tests__/UnderlineNav.test.js +72 -0
- package/lib/__tests__/UnderlineNav.test.jsx +53 -0
- package/lib/__tests__/UnderlineNavLink.test.d.ts +1 -0
- package/lib/__tests__/UnderlineNavLink.test.js +51 -0
- package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
- package/lib/__tests__/behaviors/anchoredPosition.test.d.ts +1 -0
- package/lib/__tests__/behaviors/anchoredPosition.test.js +243 -0
- package/lib/__tests__/behaviors/focusTrap.test.d.ts +1 -0
- package/lib/__tests__/behaviors/focusTrap.test.js +234 -0
- package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
- package/lib/__tests__/behaviors/focusZone.test.d.ts +1 -0
- package/lib/__tests__/behaviors/focusZone.test.js +570 -0
- package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.test.d.ts +1 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.test.js +55 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +1 -0
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +155 -0
- package/lib/__tests__/filterObject.test.d.ts +1 -0
- package/lib/__tests__/filterObject.test.js +51 -0
- package/lib/__tests__/hooks/useAnchoredPosition.test.d.ts +1 -0
- package/lib/__tests__/hooks/useAnchoredPosition.test.js +54 -0
- package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
- package/lib/__tests__/hooks/useOnEscapePress.test.d.ts +1 -0
- package/lib/__tests__/hooks/useOnEscapePress.test.js +32 -0
- package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
- package/lib/__tests__/hooks/useOnOutsideClick.test.d.ts +1 -0
- package/lib/__tests__/hooks/useOnOutsideClick.test.js +87 -0
- package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.d.ts +1 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.js +60 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.d.ts +1 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.js +45 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
- package/lib/__tests__/theme.test.d.ts +1 -0
- package/lib/__tests__/theme.test.js +35 -0
- package/lib/__tests__/themeGet.test.d.ts +1 -0
- package/lib/__tests__/themeGet.test.js +14 -0
- package/lib/__tests__/useSafeTimeout.test.d.ts +1 -0
- package/lib/__tests__/useSafeTimeout.test.js +45 -0
- 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/stories/ActionList.stories.js +454 -0
- package/lib/stories/ActionList2.stories.js +908 -0
- package/lib/stories/ActionMenu.stories.js +350 -0
- package/lib/stories/AnchoredOverlay.stories.js +127 -0
- package/lib/stories/Autocomplete.stories.js +619 -0
- package/lib/stories/AvatarStack.stories.js +49 -0
- package/lib/stories/Button.stories.js +125 -0
- package/lib/stories/ConfirmationDialog.stories.js +111 -0
- package/lib/stories/Dialog.stories.js +265 -0
- package/lib/stories/DropdownMenu.stories.js +122 -0
- package/lib/stories/IssueLabelToken.stories.js +165 -0
- package/lib/stories/NewButton.stories.js +230 -0
- package/lib/stories/Overlay.stories.js +204 -0
- package/lib/stories/Portal.stories.js +104 -0
- package/lib/stories/ProfileToken.stories.js +162 -0
- package/lib/stories/SelectPanel.stories.js +399 -0
- package/lib/stories/TextInput.stories.js +144 -0
- package/lib/stories/TextInputWithTokens.stories.js +252 -0
- package/lib/stories/ThemeProvider.stories.js +102 -0
- package/lib/stories/Token.stories.js +176 -0
- package/lib/stories/useAnchoredPosition.stories.js +351 -0
- package/lib/stories/useFocusTrap.stories.js +356 -0
- package/lib/stories/useFocusZone.stories.js +599 -0
- package/lib-esm/ActionList/Item.js +28 -19
- package/lib-esm/ActionList2/Description.js +8 -4
- package/lib-esm/ActionList2/Item.js +7 -9
- package/lib-esm/ActionList2/Selection.d.ts +1 -1
- package/lib-esm/ActionList2/Selection.js +29 -15
- package/lib-esm/NewButton/button.js +6 -6
- package/lib-esm/__tests__/ActionList.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionList.test.js +57 -0
- package/lib-esm/__tests__/ActionList.types.test.d.ts +6 -0
- package/lib-esm/__tests__/ActionList.types.test.js +45 -0
- package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionList2.test.js +41 -0
- package/lib-esm/__tests__/ActionMenu.test.d.ts +1 -0
- package/lib-esm/__tests__/ActionMenu.test.js +139 -0
- package/lib-esm/__tests__/AnchoredOverlay.test.d.ts +1 -0
- package/lib-esm/__tests__/AnchoredOverlay.test.js +136 -0
- package/lib-esm/__tests__/Autocomplete.test.d.ts +1 -0
- package/lib-esm/__tests__/Autocomplete.test.js +494 -0
- package/lib-esm/__tests__/Avatar.test.d.ts +1 -0
- package/lib-esm/__tests__/Avatar.test.js +56 -0
- package/lib-esm/__tests__/AvatarStack.test.d.ts +1 -0
- package/lib-esm/__tests__/AvatarStack.test.js +58 -0
- package/lib-esm/__tests__/BorderBox.test.d.ts +1 -0
- package/lib-esm/__tests__/BorderBox.test.js +47 -0
- package/lib-esm/__tests__/Box.test.d.ts +1 -0
- package/lib-esm/__tests__/Box.test.js +67 -0
- package/lib-esm/__tests__/BranchName.test.d.ts +1 -0
- package/lib-esm/__tests__/BranchName.test.js +26 -0
- package/lib-esm/__tests__/Breadcrumbs.test.d.ts +1 -0
- package/lib-esm/__tests__/Breadcrumbs.test.js +27 -0
- package/lib-esm/__tests__/BreadcrumbsItem.test.d.ts +1 -0
- package/lib-esm/__tests__/BreadcrumbsItem.test.js +39 -0
- package/lib-esm/__tests__/Button.test.d.ts +1 -0
- package/lib-esm/__tests__/Button.test.js +133 -0
- package/lib-esm/__tests__/Caret.test.d.ts +1 -0
- package/lib-esm/__tests__/Caret.test.js +42 -0
- package/lib-esm/__tests__/CircleBadge.test.d.ts +1 -0
- package/lib-esm/__tests__/CircleBadge.test.js +70 -0
- package/lib-esm/__tests__/CircleOcticon.test.d.ts +1 -0
- package/lib-esm/__tests__/CircleOcticon.test.js +59 -0
- package/lib-esm/__tests__/ConfirmationDialog.test.d.ts +1 -0
- package/lib-esm/__tests__/ConfirmationDialog.test.js +113 -0
- package/lib-esm/__tests__/CounterLabel.test.d.ts +1 -0
- package/lib-esm/__tests__/CounterLabel.test.js +47 -0
- package/lib-esm/__tests__/Details.test.d.ts +1 -0
- package/lib-esm/__tests__/Details.test.js +107 -0
- package/lib-esm/__tests__/Dialog.test.d.ts +1 -0
- package/lib-esm/__tests__/Dialog.test.js +171 -0
- package/lib-esm/__tests__/Dropdown.test.d.ts +1 -0
- package/lib-esm/__tests__/Dropdown.test.js +53 -0
- package/lib-esm/__tests__/DropdownMenu.test.d.ts +1 -0
- package/lib-esm/__tests__/DropdownMenu.test.js +137 -0
- package/lib-esm/__tests__/FilterList.test.d.ts +1 -0
- package/lib-esm/__tests__/FilterList.test.js +26 -0
- package/lib-esm/__tests__/FilterListItem.test.d.ts +1 -0
- package/lib-esm/__tests__/FilterListItem.test.js +36 -0
- package/lib-esm/__tests__/FilteredSearch.test.d.ts +1 -0
- package/lib-esm/__tests__/FilteredSearch.test.js +26 -0
- package/lib-esm/__tests__/Flash.test.d.ts +1 -0
- package/lib-esm/__tests__/Flash.test.js +51 -0
- package/lib-esm/__tests__/Flex.test.d.ts +1 -0
- package/lib-esm/__tests__/Flex.test.js +64 -0
- package/lib-esm/__tests__/FormGroup.test.d.ts +1 -0
- package/lib-esm/__tests__/FormGroup.test.js +44 -0
- package/lib-esm/__tests__/Grid.test.d.ts +1 -0
- package/lib-esm/__tests__/Grid.test.js +94 -0
- package/lib-esm/__tests__/Header.test.d.ts +1 -0
- package/lib-esm/__tests__/Header.test.js +48 -0
- package/lib-esm/__tests__/Heading.test.d.ts +1 -0
- package/lib-esm/__tests__/Heading.test.js +99 -0
- package/lib-esm/__tests__/KeyPaths.types.test.d.ts +11 -0
- package/lib-esm/__tests__/KeyPaths.types.test.js +3 -0
- package/lib-esm/__tests__/Label.test.d.ts +1 -0
- package/lib-esm/__tests__/Label.test.js +36 -0
- package/lib-esm/__tests__/LabelGroup.test.d.ts +1 -0
- package/lib-esm/__tests__/LabelGroup.test.js +26 -0
- package/lib-esm/__tests__/Link.test.d.ts +1 -0
- package/lib-esm/__tests__/Link.test.js +60 -0
- package/lib-esm/__tests__/Merge.types.test.d.ts +30 -0
- package/lib-esm/__tests__/Merge.types.test.js +14 -0
- package/lib-esm/__tests__/NewButton.test.d.ts +1 -0
- package/lib-esm/__tests__/NewButton.test.js +84 -0
- package/lib-esm/__tests__/Overlay.test.d.ts +1 -0
- package/lib-esm/__tests__/Overlay.test.js +123 -0
- package/lib-esm/__tests__/Pagehead.test.d.ts +1 -0
- package/lib-esm/__tests__/Pagehead.test.js +26 -0
- package/lib-esm/__tests__/Pagination/Pagination.test.d.ts +1 -0
- package/lib-esm/__tests__/Pagination/Pagination.test.js +35 -0
- package/lib-esm/__tests__/Pagination/PaginationModel.test.d.ts +1 -0
- package/lib-esm/__tests__/Pagination/PaginationModel.test.js +182 -0
- package/lib-esm/__tests__/PointerBox.test.d.ts +1 -0
- package/lib-esm/__tests__/PointerBox.test.js +36 -0
- package/lib-esm/__tests__/Popover.test.d.ts +1 -0
- package/lib-esm/__tests__/Popover.test.js +53 -0
- package/lib-esm/__tests__/Portal.test.d.ts +1 -0
- package/lib-esm/__tests__/Portal.test.js +104 -0
- package/lib-esm/__tests__/Position.test.d.ts +1 -0
- package/lib-esm/__tests__/Position.test.js +133 -0
- package/lib-esm/__tests__/ProgressBar.test.d.ts +1 -0
- package/lib-esm/__tests__/ProgressBar.test.js +58 -0
- package/lib-esm/__tests__/SelectMenu.test.d.ts +1 -0
- package/lib-esm/__tests__/SelectMenu.test.js +145 -0
- package/lib-esm/__tests__/SelectPanel.test.d.ts +1 -0
- package/lib-esm/__tests__/SelectPanel.test.js +65 -0
- package/lib-esm/__tests__/SideNav.test.d.ts +1 -0
- package/lib-esm/__tests__/SideNav.test.js +60 -0
- package/lib-esm/__tests__/Spinner.test.d.ts +1 -0
- package/lib-esm/__tests__/Spinner.test.js +43 -0
- package/lib-esm/__tests__/StateLabel.test.d.ts +1 -0
- package/lib-esm/__tests__/StateLabel.test.js +61 -0
- package/lib-esm/__tests__/StyledOcticon.test.d.ts +1 -0
- package/lib-esm/__tests__/StyledOcticon.test.js +29 -0
- package/lib-esm/__tests__/SubNav.test.d.ts +1 -0
- package/lib-esm/__tests__/SubNav.test.js +50 -0
- package/lib-esm/__tests__/SubNavLink.test.d.ts +1 -0
- package/lib-esm/__tests__/SubNavLink.test.js +39 -0
- package/lib-esm/__tests__/TabNav.test.d.ts +1 -0
- package/lib-esm/__tests__/TabNav.test.js +39 -0
- package/lib-esm/__tests__/Text.test.d.ts +1 -0
- package/lib-esm/__tests__/Text.test.js +93 -0
- package/lib-esm/__tests__/TextInput.test.d.ts +1 -0
- package/lib-esm/__tests__/TextInput.test.js +68 -0
- package/lib-esm/__tests__/TextInputWithTokens.test.d.ts +1 -0
- package/lib-esm/__tests__/TextInputWithTokens.test.js +511 -0
- package/lib-esm/__tests__/ThemeProvider.test.d.ts +1 -0
- package/lib-esm/__tests__/ThemeProvider.test.js +408 -0
- package/lib-esm/__tests__/Timeline.test.d.ts +1 -0
- package/lib-esm/__tests__/Timeline.test.js +65 -0
- package/lib-esm/__tests__/Token.test.d.ts +1 -0
- package/lib-esm/__tests__/Token.test.js +166 -0
- package/lib-esm/__tests__/Tooltip.test.d.ts +1 -0
- package/lib-esm/__tests__/Tooltip.test.js +59 -0
- package/lib-esm/__tests__/Truncate.test.d.ts +1 -0
- package/lib-esm/__tests__/Truncate.test.js +53 -0
- package/lib-esm/__tests__/UnderlineNav.test.d.ts +1 -0
- package/lib-esm/__tests__/UnderlineNav.test.js +60 -0
- package/lib-esm/__tests__/UnderlineNavLink.test.d.ts +1 -0
- package/lib-esm/__tests__/UnderlineNavLink.test.js +41 -0
- package/lib-esm/__tests__/behaviors/anchoredPosition.test.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/anchoredPosition.test.js +388 -0
- package/lib-esm/__tests__/behaviors/focusTrap.test.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/focusTrap.test.js +227 -0
- package/lib-esm/__tests__/behaviors/focusZone.test.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/focusZone.test.js +487 -0
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.test.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.test.js +48 -0
- package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.js +224 -0
- package/lib-esm/__tests__/filterObject.test.d.ts +1 -0
- package/lib-esm/__tests__/filterObject.test.js +27 -0
- package/lib-esm/__tests__/hooks/useAnchoredPosition.test.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useAnchoredPosition.test.js +46 -0
- package/lib-esm/__tests__/hooks/useOnEscapePress.test.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOnEscapePress.test.js +23 -0
- package/lib-esm/__tests__/hooks/useOnOutsideClick.test.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOnOutsideClick.test.js +68 -0
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.test.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.test.js +52 -0
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.test.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.test.js +36 -0
- package/lib-esm/__tests__/theme.test.d.ts +1 -0
- package/lib-esm/__tests__/theme.test.js +33 -0
- package/lib-esm/__tests__/themeGet.test.d.ts +1 -0
- package/lib-esm/__tests__/themeGet.test.js +22 -0
- package/lib-esm/__tests__/useSafeTimeout.test.d.ts +1 -0
- package/lib-esm/__tests__/useSafeTimeout.test.js +39 -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/stories/ActionList.stories.js +395 -0
- package/lib-esm/stories/ActionList2.stories.js +796 -0
- package/lib-esm/stories/ActionMenu.stories.js +305 -0
- package/lib-esm/stories/AnchoredOverlay.stories.js +101 -0
- package/lib-esm/stories/Autocomplete.stories.js +560 -0
- package/lib-esm/stories/AvatarStack.stories.js +32 -0
- package/lib-esm/stories/Button.stories.js +86 -0
- package/lib-esm/stories/ConfirmationDialog.stories.js +86 -0
- package/lib-esm/stories/Dialog.stories.js +240 -0
- package/lib-esm/stories/DropdownMenu.stories.js +94 -0
- package/lib-esm/stories/IssueLabelToken.stories.js +139 -0
- package/lib-esm/stories/NewButton.stories.js +178 -0
- package/lib-esm/stories/Overlay.stories.js +173 -0
- package/lib-esm/stories/Portal.stories.js +68 -0
- package/lib-esm/stories/ProfileToken.stories.js +136 -0
- package/lib-esm/stories/SelectPanel.stories.js +334 -0
- package/lib-esm/stories/TextInput.stories.js +117 -0
- package/lib-esm/stories/TextInputWithTokens.stories.js +210 -0
- package/lib-esm/stories/ThemeProvider.stories.js +83 -0
- package/lib-esm/stories/Token.stories.js +146 -0
- package/lib-esm/stories/useAnchoredPosition.stories.js +313 -0
- package/lib-esm/stories/useFocusTrap.stories.js +309 -0
- package/lib-esm/stories/useFocusZone.stories.js +554 -0
- package/migrating.md +250 -0
- package/now.json +17 -0
- package/package-lock.json +66509 -0
- package/package.json +1 -1
- package/rollup.config.js +36 -0
- package/script/build +21 -0
- package/script/build-storybook +10 -0
- package/script/setup +12 -0
- package/src/ActionList/Divider.tsx +25 -0
- package/src/ActionList/Group.tsx +45 -0
- package/src/ActionList/Header.tsx +74 -0
- package/src/ActionList/Item.tsx +509 -0
- package/src/ActionList/List.tsx +258 -0
- package/src/ActionList/index.ts +21 -0
- 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/ActionMenu.tsx +106 -0
- package/src/AnchoredOverlay/AnchoredOverlay.tsx +191 -0
- package/src/AnchoredOverlay/index.ts +2 -0
- package/src/Autocomplete/Autocomplete.tsx +103 -0
- package/src/Autocomplete/AutocompleteContext.tsx +19 -0
- package/src/Autocomplete/AutocompleteInput.tsx +179 -0
- package/src/Autocomplete/AutocompleteMenu.tsx +341 -0
- package/src/Autocomplete/AutocompleteOverlay.tsx +68 -0
- package/src/Autocomplete/index.ts +2 -0
- package/src/Avatar.tsx +46 -0
- package/src/AvatarPair.tsx +35 -0
- package/src/AvatarStack.tsx +159 -0
- package/src/BaseStyles.tsx +53 -0
- package/src/BorderBox.tsx +18 -0
- package/src/Box.tsx +54 -0
- package/src/BranchName.tsx +19 -0
- package/src/Breadcrumbs.tsx +101 -0
- package/src/Button/Button.tsx +40 -0
- package/src/Button/ButtonBase.tsx +43 -0
- package/src/Button/ButtonClose.tsx +40 -0
- package/src/Button/ButtonDanger.tsx +43 -0
- package/src/Button/ButtonGroup.tsx +55 -0
- package/src/Button/ButtonInvisible.tsx +32 -0
- package/src/Button/ButtonOutline.tsx +43 -0
- package/src/Button/ButtonPrimary.tsx +41 -0
- package/src/Button/ButtonStyles.tsx +36 -0
- package/src/Button/ButtonTableList.tsx +58 -0
- package/src/Button/index.ts +16 -0
- package/src/Caret.tsx +133 -0
- package/src/CircleBadge.tsx +55 -0
- package/src/CircleOcticon.tsx +37 -0
- package/src/CounterLabel.tsx +52 -0
- package/src/Details.tsx +23 -0
- package/src/Dialog/ConfirmationDialog.tsx +184 -0
- package/src/Dialog/Dialog.tsx +433 -0
- package/src/Dialog.tsx +149 -0
- package/src/Dropdown.tsx +158 -0
- package/src/DropdownMenu/DropdownButton.tsx +15 -0
- package/src/DropdownMenu/DropdownMenu.tsx +115 -0
- package/src/DropdownMenu/index.ts +4 -0
- package/src/DropdownStyles.ts +128 -0
- package/src/FilterList.tsx +81 -0
- package/src/FilteredActionList/FilteredActionList.tsx +142 -0
- package/src/FilteredActionList/index.ts +2 -0
- package/src/FilteredSearch.tsx +28 -0
- package/src/Flash.tsx +77 -0
- package/src/Flex.tsx +15 -0
- package/src/FormGroup.tsx +27 -0
- package/src/Grid.tsx +15 -0
- package/src/Header.tsx +84 -0
- package/src/Heading.tsx +21 -0
- package/src/Label.tsx +75 -0
- package/src/LabelGroup.tsx +18 -0
- package/src/Link.tsx +46 -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/Overlay.tsx +198 -0
- package/src/Pagehead.tsx +17 -0
- package/src/Pagination/Pagination.tsx +214 -0
- package/src/Pagination/index.ts +4 -0
- package/src/Pagination/model.tsx +187 -0
- package/src/PointerBox.tsx +31 -0
- package/src/Popover.tsx +236 -0
- package/src/Portal/Portal.tsx +97 -0
- package/src/Portal/index.ts +5 -0
- package/src/Position.tsx +63 -0
- package/src/ProgressBar.tsx +52 -0
- package/src/SelectMenu/SelectMenu.tsx +125 -0
- package/src/SelectMenu/SelectMenuContext.tsx +9 -0
- package/src/SelectMenu/SelectMenuDivider.tsx +25 -0
- package/src/SelectMenu/SelectMenuFilter.tsx +51 -0
- package/src/SelectMenu/SelectMenuFooter.tsx +28 -0
- package/src/SelectMenu/SelectMenuHeader.tsx +50 -0
- package/src/SelectMenu/SelectMenuItem.tsx +137 -0
- package/src/SelectMenu/SelectMenuList.tsx +42 -0
- package/src/SelectMenu/SelectMenuLoadingAnimation.tsx +24 -0
- package/src/SelectMenu/SelectMenuModal.tsx +121 -0
- package/src/SelectMenu/SelectMenuTab.tsx +88 -0
- package/src/SelectMenu/SelectMenuTabPanel.tsx +30 -0
- package/src/SelectMenu/SelectMenuTabs.tsx +44 -0
- package/src/SelectMenu/hooks/useKeyboardNav.js +90 -0
- package/src/SelectMenu/index.ts +15 -0
- package/src/SelectPanel/SelectPanel.tsx +173 -0
- package/src/SelectPanel/index.ts +2 -0
- package/src/SideNav.tsx +193 -0
- package/src/Spinner.tsx +59 -0
- package/src/StateLabel.tsx +114 -0
- package/src/StyledOcticon.tsx +24 -0
- package/src/SubNav.tsx +129 -0
- package/src/TabNav.tsx +77 -0
- package/src/Text.tsx +13 -0
- package/src/TextInput.tsx +68 -0
- package/src/TextInputWithTokens.tsx +351 -0
- package/src/ThemeProvider.tsx +176 -0
- package/src/Timeline.tsx +141 -0
- package/src/Token/AvatarToken.tsx +54 -0
- package/src/Token/IssueLabelToken.tsx +150 -0
- package/src/Token/Token.tsx +126 -0
- package/src/Token/TokenBase.tsx +129 -0
- package/src/Token/_RemoveTokenButton.tsx +111 -0
- package/src/Token/_TokenTextContainer.tsx +47 -0
- package/src/Token/index.ts +3 -0
- package/src/Tooltip.tsx +263 -0
- package/src/Truncate.tsx +36 -0
- package/src/UnderlineNav.tsx +110 -0
- package/src/_TextInputWrapper.tsx +113 -0
- package/src/_UnstyledTextInput.tsx +19 -0
- package/src/__tests__/.eslintrc.json +11 -0
- package/src/__tests__/ActionList.test.tsx +53 -0
- package/src/__tests__/ActionList.types.test.tsx +51 -0
- package/src/__tests__/ActionList2.test.tsx +47 -0
- package/src/__tests__/ActionMenu.test.tsx +136 -0
- package/src/__tests__/AnchoredOverlay.test.tsx +150 -0
- package/src/__tests__/Autocomplete.test.tsx +444 -0
- package/src/__tests__/Avatar.test.tsx +44 -0
- package/src/__tests__/AvatarStack.test.tsx +48 -0
- package/src/__tests__/BorderBox.test.tsx +43 -0
- package/src/__tests__/Box.test.tsx +42 -0
- package/src/__tests__/BranchName.test.tsx +26 -0
- package/src/__tests__/Breadcrumbs.test.tsx +27 -0
- package/src/__tests__/BreadcrumbsItem.test.tsx +31 -0
- package/src/__tests__/Button.test.tsx +128 -0
- package/src/__tests__/Caret.test.tsx +36 -0
- package/src/__tests__/CircleBadge.test.tsx +66 -0
- package/src/__tests__/CircleOcticon.test.tsx +50 -0
- package/src/__tests__/ConfirmationDialog.test.tsx +120 -0
- package/src/__tests__/CounterLabel.test.tsx +50 -0
- package/src/__tests__/Details.test.tsx +115 -0
- package/src/__tests__/Dialog.test.tsx +155 -0
- package/src/__tests__/Dropdown.test.tsx +53 -0
- package/src/__tests__/DropdownMenu.test.tsx +136 -0
- package/src/__tests__/FilterList.test.tsx +26 -0
- package/src/__tests__/FilterListItem.test.tsx +31 -0
- package/src/__tests__/FilteredSearch.test.tsx +26 -0
- package/src/__tests__/Flash.test.tsx +45 -0
- package/src/__tests__/Flex.test.tsx +58 -0
- package/src/__tests__/FormGroup.test.tsx +38 -0
- package/src/__tests__/Grid.test.tsx +82 -0
- package/src/__tests__/Header.test.tsx +49 -0
- package/src/__tests__/Heading.test.tsx +91 -0
- package/src/__tests__/KeyPaths.types.test.ts +14 -0
- package/src/__tests__/Label.test.tsx +34 -0
- package/src/__tests__/LabelGroup.test.tsx +30 -0
- package/src/__tests__/Link.test.tsx +47 -0
- package/src/__tests__/Merge.types.test.ts +39 -0
- package/src/__tests__/NewButton.test.tsx +70 -0
- package/src/__tests__/Overlay.test.tsx +103 -0
- package/src/__tests__/Pagehead.test.tsx +23 -0
- package/src/__tests__/Pagination/Pagination.test.tsx +30 -0
- package/src/__tests__/Pagination/PaginationModel.test.tsx +133 -0
- package/src/__tests__/Pagination/__snapshots__/Pagination.test.tsx.snap +184 -0
- package/src/__tests__/PointerBox.test.tsx +34 -0
- package/src/__tests__/Popover.test.tsx +68 -0
- package/src/__tests__/Portal.test.tsx +103 -0
- package/src/__tests__/Position.test.tsx +117 -0
- package/src/__tests__/ProgressBar.test.tsx +40 -0
- package/src/__tests__/SelectMenu.test.tsx +142 -0
- package/src/__tests__/SelectPanel.test.tsx +63 -0
- package/src/__tests__/SideNav.test.tsx +62 -0
- package/src/__tests__/Spinner.test.tsx +42 -0
- package/src/__tests__/StateLabel.test.tsx +48 -0
- package/src/__tests__/StyledOcticon.test.tsx +26 -0
- package/src/__tests__/SubNav.test.tsx +50 -0
- package/src/__tests__/SubNavLink.test.tsx +31 -0
- package/src/__tests__/TabNav.test.tsx +32 -0
- package/src/__tests__/Text.test.tsx +78 -0
- package/src/__tests__/TextInput.test.tsx +49 -0
- package/src/__tests__/TextInputWithTokens.test.tsx +422 -0
- package/src/__tests__/ThemeProvider.test.tsx +441 -0
- package/src/__tests__/Timeline.test.tsx +58 -0
- package/src/__tests__/Token.test.tsx +118 -0
- package/src/__tests__/Tooltip.test.tsx +52 -0
- package/src/__tests__/Truncate.test.tsx +43 -0
- package/src/__tests__/UnderlineNav.test.tsx +58 -0
- package/src/__tests__/UnderlineNavLink.test.tsx +31 -0
- package/src/__tests__/__snapshots__/ActionList.test.tsx.snap +223 -0
- package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/ActionMenu.test.tsx.snap +80 -0
- package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +232 -0
- package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +3888 -0
- package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +19 -0
- package/src/__tests__/__snapshots__/AvatarStack.test.tsx.snap +377 -0
- package/src/__tests__/__snapshots__/BorderBox.test.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/Box.test.tsx.snap +201 -0
- package/src/__tests__/__snapshots__/BranchName.test.tsx.snap +17 -0
- package/src/__tests__/__snapshots__/Breadcrumbs.test.tsx.snap +29 -0
- package/src/__tests__/__snapshots__/BreadcrumbsItem.test.tsx.snap +79 -0
- package/src/__tests__/__snapshots__/Button.test.tsx.snap +840 -0
- package/src/__tests__/__snapshots__/Caret.test.tsx.snap +373 -0
- package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +142 -0
- package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +65 -0
- package/src/__tests__/__snapshots__/ConfirmationDialog.test.tsx.snap +89 -0
- package/src/__tests__/__snapshots__/CounterLabel.test.tsx.snap +22 -0
- package/src/__tests__/__snapshots__/Details.test.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +201 -0
- package/src/__tests__/__snapshots__/Dropdown.test.tsx.snap +249 -0
- package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +107 -0
- package/src/__tests__/__snapshots__/FilterList.test.tsx.snap +13 -0
- package/src/__tests__/__snapshots__/FilterListItem.test.tsx.snap +80 -0
- package/src/__tests__/__snapshots__/FilteredSearch.test.tsx.snap +32 -0
- package/src/__tests__/__snapshots__/Flash.test.tsx.snap +32 -0
- package/src/__tests__/__snapshots__/Flex.test.tsx.snap +130 -0
- package/src/__tests__/__snapshots__/FormGroup.test.tsx.snap +25 -0
- package/src/__tests__/__snapshots__/Grid.test.tsx.snap +178 -0
- package/src/__tests__/__snapshots__/Header.test.tsx.snap +79 -0
- package/src/__tests__/__snapshots__/Heading.test.tsx.snap +13 -0
- package/src/__tests__/__snapshots__/Label.test.tsx.snap +74 -0
- package/src/__tests__/__snapshots__/LabelGroup.test.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Link.test.tsx.snap +213 -0
- package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +300 -0
- package/src/__tests__/__snapshots__/Pagehead.test.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/PointerBox.test.tsx.snap +174 -0
- package/src/__tests__/__snapshots__/Popover.test.tsx.snap +4687 -0
- package/src/__tests__/__snapshots__/Position.test.tsx.snap +44 -0
- package/src/__tests__/__snapshots__/ProgressBar.test.tsx.snap +53 -0
- package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +473 -0
- package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +124 -0
- package/src/__tests__/__snapshots__/SideNav.test.tsx.snap +143 -0
- package/src/__tests__/__snapshots__/Spinner.test.tsx.snap +33 -0
- package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +395 -0
- package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +26 -0
- package/src/__tests__/__snapshots__/SubNav.test.tsx.snap +44 -0
- package/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap +199 -0
- package/src/__tests__/__snapshots__/TabNav.test.tsx.snap +58 -0
- package/src/__tests__/__snapshots__/Text.test.tsx.snap +7 -0
- package/src/__tests__/__snapshots__/TextInput.test.tsx.snap +446 -0
- package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +6045 -0
- package/src/__tests__/__snapshots__/ThemeProvider.test.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Timeline.test.tsx.snap +159 -0
- package/src/__tests__/__snapshots__/Token.test.tsx.snap +3811 -0
- package/src/__tests__/__snapshots__/Tooltip.test.tsx.snap +227 -0
- package/src/__tests__/__snapshots__/Truncate.test.tsx.snap +17 -0
- package/src/__tests__/__snapshots__/UnderlineNav.test.tsx.snap +59 -0
- package/src/__tests__/__snapshots__/UnderlineNavLink.test.tsx.snap +130 -0
- package/src/__tests__/behaviors/anchoredPosition.test.ts +295 -0
- package/src/__tests__/behaviors/focusTrap.test.tsx +236 -0
- package/src/__tests__/behaviors/focusZone.test.tsx +549 -0
- package/src/__tests__/behaviors/iterateFocusableElements.test.tsx +61 -0
- package/src/__tests__/behaviors/scrollIntoViewingArea.test.ts +195 -0
- package/src/__tests__/filterObject.test.ts +54 -0
- package/src/__tests__/hooks/useAnchoredPosition.test.tsx +31 -0
- package/src/__tests__/hooks/useOnEscapePress.test.tsx +16 -0
- package/src/__tests__/hooks/useOnOutsideClick.test.tsx +48 -0
- package/src/__tests__/hooks/useOpenAndCloseFocus.test.tsx +48 -0
- package/src/__tests__/hooks/useProvidedStateOrCreate.test.tsx +39 -0
- package/src/__tests__/theme.test.ts +41 -0
- package/src/__tests__/themeGet.test.ts +15 -0
- package/src/__tests__/useSafeTimeout.test.tsx +36 -0
- package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
- package/src/__tests__/utils/createSlots.test.tsx +74 -0
- package/src/behaviors/anchoredPosition.ts +442 -0
- package/src/behaviors/focusTrap.ts +184 -0
- package/src/behaviors/focusZone.ts +713 -0
- package/src/behaviors/scrollIntoViewingArea.ts +27 -0
- package/src/constants.ts +62 -0
- package/src/drafts.ts +10 -0
- package/src/hooks/index.ts +11 -0
- package/src/hooks/useAnchoredPosition.ts +54 -0
- package/src/hooks/useCombinedRefs.ts +40 -0
- package/src/hooks/useDetails.tsx +54 -0
- package/src/hooks/useDialog.ts +121 -0
- package/src/hooks/useFocusTrap.ts +80 -0
- package/src/hooks/useFocusZone.ts +64 -0
- package/src/hooks/useOnEscapePress.ts +63 -0
- package/src/hooks/useOnOutsideClick.tsx +82 -0
- package/src/hooks/useOpenAndCloseFocus.ts +32 -0
- package/src/hooks/useOverlay.tsx +34 -0
- package/src/hooks/useProvidedRefOrCreate.ts +14 -0
- package/src/hooks/useProvidedStateOrCreate.ts +27 -0
- package/src/hooks/useRenderForcingRef.ts +22 -0
- package/src/hooks/useResizeObserver.ts +11 -0
- package/src/hooks/useSafeTimeout.ts +38 -0
- package/src/hooks/useScrollFlash.ts +21 -0
- package/src/index.ts +172 -0
- package/src/polyfills/eventListenerSignal.ts +66 -0
- package/src/stories/ActionList.stories.tsx +436 -0
- package/src/stories/ActionList2.stories.tsx +1291 -0
- package/src/stories/ActionMenu.stories.tsx +334 -0
- package/src/stories/AnchoredOverlay.stories.tsx +117 -0
- package/src/stories/Autocomplete.stories.tsx +655 -0
- package/src/stories/AvatarStack.stories.tsx +37 -0
- package/src/stories/Button.stories.tsx +92 -0
- package/src/stories/ConfirmationDialog.stories.tsx +105 -0
- package/src/stories/Dialog.stories.tsx +240 -0
- package/src/stories/DropdownMenu.stories.tsx +84 -0
- package/src/stories/IssueLabelToken.stories.tsx +138 -0
- package/src/stories/NewButton.stories.tsx +201 -0
- package/src/stories/Overlay.stories.tsx +213 -0
- package/src/stories/Portal.stories.tsx +109 -0
- package/src/stories/ProfileToken.stories.tsx +129 -0
- package/src/stories/SelectPanel.stories.tsx +353 -0
- package/src/stories/TextInput.stories.tsx +113 -0
- package/src/stories/TextInputWithTokens.stories.tsx +155 -0
- package/src/stories/ThemeProvider.stories.tsx +104 -0
- package/src/stories/Token.stories.tsx +137 -0
- package/src/stories/useAnchoredPosition.stories.tsx +332 -0
- package/src/stories/useFocusTrap.stories.tsx +400 -0
- package/src/stories/useFocusZone.stories.tsx +663 -0
- package/src/sx.ts +24 -0
- package/src/theme-preval.js +80 -0
- package/src/theme.ts +89 -0
- package/src/utils/create-slots.tsx +96 -0
- package/src/utils/deprecate.tsx +73 -0
- package/src/utils/isNumeric.tsx +4 -0
- package/src/utils/iterateFocusableElements.ts +121 -0
- package/src/utils/ssr.tsx +1 -0
- package/src/utils/test-deprecations.tsx +19 -0
- package/src/utils/test-helpers.tsx +7 -0
- package/src/utils/test-matchers.tsx +109 -0
- package/src/utils/testing.tsx +242 -0
- package/src/utils/theme.js +64 -0
- package/src/utils/types/AriaRole.ts +71 -0
- package/src/utils/types/ComponentProps.ts +13 -0
- package/src/utils/types/Flatten.ts +4 -0
- package/src/utils/types/KeyPaths.ts +10 -0
- package/src/utils/types/MandateProps.ts +19 -0
- package/src/utils/types/Merge.ts +20 -0
- package/src/utils/types/index.ts +5 -0
- package/src/utils/uniqueId.ts +6 -0
- package/src/utils/use-force-update.ts +7 -0
- package/src/utils/useIsomorphicLayoutEffect.ts +10 -0
- package/src/utils/userAgent.ts +7 -0
- package/stats.html +3279 -0
- package/tsconfig.base.json +20 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.json +7 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import {ForwardRefComponent as PolymorphicForwardRefComponent} from '@radix-ui/react-polymorphic'
|
3
|
+
import Link from '../Link'
|
4
|
+
import {SxProp, merge} from '../sx'
|
5
|
+
import {Item, ItemProps} from './Item'
|
6
|
+
|
7
|
+
// adopted from React.AnchorHTMLAttributes
|
8
|
+
type LinkProps = {
|
9
|
+
download?: string
|
10
|
+
href?: string
|
11
|
+
hrefLang?: string
|
12
|
+
media?: string
|
13
|
+
ping?: string
|
14
|
+
rel?: string
|
15
|
+
target?: string
|
16
|
+
type?: string
|
17
|
+
referrerPolicy?: React.AnchorHTMLAttributes<HTMLAnchorElement>['referrerPolicy']
|
18
|
+
}
|
19
|
+
|
20
|
+
// LinkItem does not support selected, variants, etc.
|
21
|
+
type LinkItemProps = Pick<ItemProps, 'children' | 'sx'> & LinkProps
|
22
|
+
|
23
|
+
export const LinkItem = React.forwardRef(({sx = {}, as: Component, ...props}, forwardedRef) => {
|
24
|
+
const styles = {
|
25
|
+
// occupy full size of Item
|
26
|
+
paddingX: 2,
|
27
|
+
paddingY: '6px', // custom value off the scale
|
28
|
+
display: 'flex',
|
29
|
+
flexGrow: 1, // full width
|
30
|
+
borderRadius: 2,
|
31
|
+
|
32
|
+
// inherit Item styles
|
33
|
+
color: 'inherit',
|
34
|
+
'&:hover': {color: 'inherit', textDecoration: 'none'}
|
35
|
+
}
|
36
|
+
|
37
|
+
return (
|
38
|
+
<Item
|
39
|
+
sx={{paddingY: 0, paddingX: 0}}
|
40
|
+
_PrivateItemWrapper={({children}) => (
|
41
|
+
<Link as={Component} sx={merge(styles, sx as SxProp)} {...props} ref={forwardedRef}>
|
42
|
+
{children}
|
43
|
+
</Link>
|
44
|
+
)}
|
45
|
+
>
|
46
|
+
{props.children}
|
47
|
+
</Item>
|
48
|
+
)
|
49
|
+
}) as PolymorphicForwardRefComponent<'a', LinkItemProps>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import {ForwardRefComponent as PolymorphicForwardRefComponent} from '@radix-ui/react-polymorphic'
|
3
|
+
import styled from 'styled-components'
|
4
|
+
import sx, {SxProp, merge} from '../sx'
|
5
|
+
import {AriaRole} from '../utils/types'
|
6
|
+
|
7
|
+
export type ListProps = {
|
8
|
+
/**
|
9
|
+
* `inset` children are offset (vertically and horizontally) from `List`’s edges, `full` children are flush (vertically and horizontally) with `List` edges
|
10
|
+
*/
|
11
|
+
variant?: 'inset' | 'full'
|
12
|
+
/**
|
13
|
+
* Whether multiple Items or a single Item can be selected.
|
14
|
+
*/
|
15
|
+
selectionVariant?: 'single' | 'multiple'
|
16
|
+
/**
|
17
|
+
* Display a divider above each `Item` in this `List` when it does not follow a `Header` or `Divider`.
|
18
|
+
*/
|
19
|
+
showDividers?: boolean
|
20
|
+
/**
|
21
|
+
* The ARIA role describing the function of `List` component. `listbox` or `menu` are a common values.
|
22
|
+
*/
|
23
|
+
role?: AriaRole
|
24
|
+
} & SxProp
|
25
|
+
|
26
|
+
type ContextProps = Omit<ListProps, 'sx'>
|
27
|
+
export const ListContext = React.createContext<ContextProps>({})
|
28
|
+
|
29
|
+
const ListBox = styled.ul<SxProp>(sx)
|
30
|
+
|
31
|
+
export const List = React.forwardRef<HTMLUListElement, ListProps>(
|
32
|
+
(
|
33
|
+
{variant = 'inset', selectionVariant, showDividers = false, sx: sxProp = {}, ...props},
|
34
|
+
forwardedRef
|
35
|
+
): JSX.Element => {
|
36
|
+
const styles = {
|
37
|
+
margin: 0,
|
38
|
+
paddingInlineStart: 0, // reset ul styles
|
39
|
+
paddingY: variant === 'inset' ? 2 : 0
|
40
|
+
}
|
41
|
+
|
42
|
+
return (
|
43
|
+
<ListBox
|
44
|
+
sx={merge(styles, sxProp as SxProp)}
|
45
|
+
aria-multiselectable={selectionVariant === 'multiple' ? true : undefined}
|
46
|
+
{...props}
|
47
|
+
ref={forwardedRef}
|
48
|
+
>
|
49
|
+
<ListContext.Provider value={{variant, selectionVariant, showDividers}}>{props.children}</ListContext.Provider>
|
50
|
+
</ListBox>
|
51
|
+
)
|
52
|
+
}
|
53
|
+
) as PolymorphicForwardRefComponent<'ul', ListProps>
|
54
|
+
|
55
|
+
List.displayName = 'ActionList'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import {CheckIcon} from '@primer/octicons-react'
|
3
|
+
import {ListContext} from './List'
|
4
|
+
import {GroupContext} from './Group'
|
5
|
+
import {ItemProps} from './Item'
|
6
|
+
import {LeadingVisualContainer} from './Visuals'
|
7
|
+
|
8
|
+
type SelectionProps = Pick<ItemProps, 'selected'>
|
9
|
+
export const Selection: React.FC<SelectionProps> = ({selected}) => {
|
10
|
+
const {selectionVariant: listSelectionVariant} = React.useContext(ListContext)
|
11
|
+
const {selectionVariant: groupSelectionVariant} = React.useContext(GroupContext)
|
12
|
+
|
13
|
+
/** selectionVariant in Group can override the selectionVariant in List root */
|
14
|
+
const selectionVariant = typeof groupSelectionVariant !== 'undefined' ? groupSelectionVariant : listSelectionVariant
|
15
|
+
|
16
|
+
// if selectionVariant is not set on List, don't show selection
|
17
|
+
if (!selectionVariant) {
|
18
|
+
// to avoid confusion, fail loudly instead of silently ignoring
|
19
|
+
if (selected)
|
20
|
+
throw new Error(
|
21
|
+
'For Item to be selected, ActionList or ActionList.Group needs to have a selectionVariant defined'
|
22
|
+
)
|
23
|
+
return null
|
24
|
+
}
|
25
|
+
|
26
|
+
if (selectionVariant === 'single') {
|
27
|
+
return <LeadingVisualContainer>{selected && <CheckIcon />}</LeadingVisualContainer>
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* selectionVariant is multiple
|
32
|
+
* we use a svg instead of an input because there should not
|
33
|
+
* be an interactive element inside an option
|
34
|
+
* svg copied from primer/css
|
35
|
+
*/
|
36
|
+
return (
|
37
|
+
<LeadingVisualContainer
|
38
|
+
sx={{
|
39
|
+
rect: {
|
40
|
+
fill: selected ? 'accent.fg' : 'canvas.default',
|
41
|
+
stroke: selected ? 'accent.fg' : 'border.default'
|
42
|
+
},
|
43
|
+
path: {
|
44
|
+
fill: 'fg.onEmphasis',
|
45
|
+
boxShadow: 'shadow.small',
|
46
|
+
opacity: selected ? 1 : 0
|
47
|
+
}
|
48
|
+
}}
|
49
|
+
>
|
50
|
+
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
51
|
+
<rect x="2" y="2" width="12" height="12" rx="4"></rect>
|
52
|
+
<path
|
53
|
+
fillRule="evenodd"
|
54
|
+
strokeWidth="0"
|
55
|
+
d="M4.03231 8.69862C3.84775 8.20646 4.49385 7.77554 4.95539 7.77554C5.41693 7.77554 6.80154 9.85246 6.80154 9.85246C6.80154 9.85246 10.2631 4.314 10.4938 4.08323C10.7246 3.85246 11.8785 4.08323 11.4169 5.00631C11.0081 5.82388 7.26308 11.4678 7.26308 11.4678C7.26308 11.4678 6.80154 12.1602 6.34 11.4678C5.87846 10.7755 4.21687 9.19077 4.03231 8.69862Z"
|
56
|
+
/>
|
57
|
+
</svg>
|
58
|
+
</LeadingVisualContainer>
|
59
|
+
)
|
60
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Box from '../Box'
|
3
|
+
import {SxProp, merge} from '../sx'
|
4
|
+
import {get} from '../constants'
|
5
|
+
import {getVariantStyles, Slot, ItemContext, TEXT_ROW_HEIGHT} from './Item'
|
6
|
+
|
7
|
+
type VisualProps = SxProp & React.HTMLAttributes<HTMLSpanElement>
|
8
|
+
|
9
|
+
export const LeadingVisualContainer: React.FC<VisualProps> = ({sx = {}, ...props}) => {
|
10
|
+
return (
|
11
|
+
<Box
|
12
|
+
as="span"
|
13
|
+
sx={merge(
|
14
|
+
{
|
15
|
+
height: TEXT_ROW_HEIGHT, // match height of text row
|
16
|
+
minWidth: get('space.3'),
|
17
|
+
maxWidth: TEXT_ROW_HEIGHT, // square (same as height)
|
18
|
+
display: 'flex',
|
19
|
+
justifyContent: 'center',
|
20
|
+
alignItems: 'center',
|
21
|
+
flexShrink: 0,
|
22
|
+
marginRight: 2
|
23
|
+
},
|
24
|
+
sx as SxProp
|
25
|
+
)}
|
26
|
+
{...props}
|
27
|
+
/>
|
28
|
+
)
|
29
|
+
}
|
30
|
+
|
31
|
+
export type LeadingVisualProps = VisualProps
|
32
|
+
export const LeadingVisual: React.FC<VisualProps> = ({sx = {}, ...props}) => {
|
33
|
+
return (
|
34
|
+
<Slot name="LeadingVisual">
|
35
|
+
{({variant, disabled}: ItemContext) => (
|
36
|
+
<LeadingVisualContainer
|
37
|
+
sx={merge(
|
38
|
+
{
|
39
|
+
color: getVariantStyles(variant, disabled).iconColor,
|
40
|
+
svg: {fontSize: 0}
|
41
|
+
},
|
42
|
+
sx as SxProp
|
43
|
+
)}
|
44
|
+
{...props}
|
45
|
+
>
|
46
|
+
{props.children}
|
47
|
+
</LeadingVisualContainer>
|
48
|
+
)}
|
49
|
+
</Slot>
|
50
|
+
)
|
51
|
+
}
|
52
|
+
|
53
|
+
export type TrailingVisualProps = VisualProps
|
54
|
+
export const TrailingVisual: React.FC<VisualProps> = ({sx = {}, ...props}) => {
|
55
|
+
return (
|
56
|
+
<Slot name="TrailingVisual">
|
57
|
+
{({variant, disabled}: ItemContext) => (
|
58
|
+
<Box
|
59
|
+
as="span"
|
60
|
+
sx={merge(
|
61
|
+
{
|
62
|
+
height: '20px', // match height of text row
|
63
|
+
flexShrink: 0,
|
64
|
+
color: getVariantStyles(variant, disabled).annotationColor,
|
65
|
+
marginLeft: 2
|
66
|
+
},
|
67
|
+
sx as SxProp
|
68
|
+
)}
|
69
|
+
{...props}
|
70
|
+
>
|
71
|
+
{props.children}
|
72
|
+
</Box>
|
73
|
+
)}
|
74
|
+
</Slot>
|
75
|
+
)
|
76
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import {List} from './List'
|
2
|
+
import {Group} from './Group'
|
3
|
+
import {Item} from './Item'
|
4
|
+
import {LinkItem} from './LinkItem'
|
5
|
+
import {Divider} from './Divider'
|
6
|
+
import {Description} from './Description'
|
7
|
+
import {LeadingVisual, TrailingVisual} from './Visuals'
|
8
|
+
|
9
|
+
export type {ListProps as ActionListProps} from './List'
|
10
|
+
export type {GroupProps} from './Group'
|
11
|
+
export type {ItemProps} from './Item'
|
12
|
+
export type {DescriptionProps} from './Description'
|
13
|
+
export type {LeadingVisualProps, TrailingVisualProps} from './Visuals'
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Collection of list-related components.
|
17
|
+
*/
|
18
|
+
export const ActionList = Object.assign(List, {
|
19
|
+
/** Collects related `Items` in an `ActionList`. */
|
20
|
+
Group,
|
21
|
+
|
22
|
+
/** An actionable or selectable `Item` */
|
23
|
+
Item,
|
24
|
+
|
25
|
+
/** A `Item` that renders a full-size anchor inside ListItem */
|
26
|
+
LinkItem,
|
27
|
+
|
28
|
+
/** Visually separates `Item`s or `Group`s in an `ActionList`. */
|
29
|
+
Divider,
|
30
|
+
|
31
|
+
/** Secondary text which provides additional information about an `Item`. */
|
32
|
+
Description,
|
33
|
+
|
34
|
+
/** Icon (or similar) positioned before `Item` text. */
|
35
|
+
LeadingVisual,
|
36
|
+
|
37
|
+
/** Icon (or similar) positioned after `Item` text. */
|
38
|
+
TrailingVisual
|
39
|
+
})
|
@@ -0,0 +1,106 @@
|
|
1
|
+
import {GroupedListProps, List, ListPropsBase} from './ActionList/List'
|
2
|
+
import {Item, ItemProps} from './ActionList/Item'
|
3
|
+
import {Divider} from './ActionList/Divider'
|
4
|
+
import Button, {ButtonProps} from './Button'
|
5
|
+
import React, {useCallback, useMemo} from 'react'
|
6
|
+
import {AnchoredOverlay} from './AnchoredOverlay'
|
7
|
+
import {useProvidedStateOrCreate} from './hooks/useProvidedStateOrCreate'
|
8
|
+
import {OverlayProps} from './Overlay'
|
9
|
+
import {useProvidedRefOrCreate} from './hooks'
|
10
|
+
import {AnchoredOverlayWrapperAnchorProps} from './AnchoredOverlay/AnchoredOverlay'
|
11
|
+
|
12
|
+
interface ActionMenuBaseProps extends Partial<Omit<GroupedListProps, keyof ListPropsBase>>, ListPropsBase {
|
13
|
+
/**
|
14
|
+
* Content that is passed into the renderAnchor component, which is a button by default.
|
15
|
+
*/
|
16
|
+
anchorContent?: React.ReactNode
|
17
|
+
|
18
|
+
/**
|
19
|
+
* A callback that triggers both on clicks and keyboard events. This callback will be overridden by item level `onAction` callbacks.
|
20
|
+
*/
|
21
|
+
onAction?: (props: ItemProps, event?: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>) => void
|
22
|
+
|
23
|
+
/**
|
24
|
+
* If defined, will control the open/closed state of the overlay. Must be used in conjuction with `setOpen`.
|
25
|
+
*/
|
26
|
+
open?: boolean
|
27
|
+
|
28
|
+
/**
|
29
|
+
* If defined, will control the open/closed state of the overlay. Must be used in conjuction with `open`.
|
30
|
+
*/
|
31
|
+
setOpen?: (s: boolean) => void
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Props to be spread on the internal `Overlay` component.
|
35
|
+
*/
|
36
|
+
overlayProps?: Partial<OverlayProps>
|
37
|
+
}
|
38
|
+
|
39
|
+
export type ActionMenuProps = ActionMenuBaseProps & AnchoredOverlayWrapperAnchorProps
|
40
|
+
|
41
|
+
const ActionMenuItem = (props: ItemProps) => <Item role="menuitem" {...props} />
|
42
|
+
|
43
|
+
ActionMenuItem.displayName = 'ActionMenu.Item'
|
44
|
+
|
45
|
+
const ActionMenuBase = ({
|
46
|
+
anchorContent,
|
47
|
+
renderAnchor = <T extends ButtonProps>(props: T) => <Button {...props} />,
|
48
|
+
anchorRef: externalAnchorRef,
|
49
|
+
onAction,
|
50
|
+
open,
|
51
|
+
setOpen,
|
52
|
+
overlayProps,
|
53
|
+
items,
|
54
|
+
...listProps
|
55
|
+
}: ActionMenuProps): JSX.Element => {
|
56
|
+
const [combinedOpenState, setCombinedOpenState] = useProvidedStateOrCreate(open, setOpen, false)
|
57
|
+
const anchorRef = useProvidedRefOrCreate(externalAnchorRef)
|
58
|
+
const onOpen = useCallback(() => setCombinedOpenState(true), [setCombinedOpenState])
|
59
|
+
const onClose = useCallback(() => setCombinedOpenState(false), [setCombinedOpenState])
|
60
|
+
|
61
|
+
const renderMenuAnchor = useMemo(() => {
|
62
|
+
if (renderAnchor === null) {
|
63
|
+
return null
|
64
|
+
}
|
65
|
+
return <T extends React.HTMLAttributes<HTMLElement>>(props: T) => {
|
66
|
+
return renderAnchor({
|
67
|
+
'aria-label': 'menu',
|
68
|
+
children: anchorContent,
|
69
|
+
...props
|
70
|
+
})
|
71
|
+
}
|
72
|
+
}, [anchorContent, renderAnchor])
|
73
|
+
|
74
|
+
const itemsToRender = useMemo(() => {
|
75
|
+
return items.map(item => {
|
76
|
+
return {
|
77
|
+
...item,
|
78
|
+
role: 'menuitem',
|
79
|
+
onAction: (props, event) => {
|
80
|
+
const actionCallback = item.onAction ?? onAction
|
81
|
+
actionCallback?.(props as ItemProps, event)
|
82
|
+
if (!event.defaultPrevented) {
|
83
|
+
onClose()
|
84
|
+
}
|
85
|
+
}
|
86
|
+
} as ItemProps
|
87
|
+
})
|
88
|
+
}, [items, onAction, onClose])
|
89
|
+
|
90
|
+
return (
|
91
|
+
<AnchoredOverlay
|
92
|
+
renderAnchor={renderMenuAnchor}
|
93
|
+
anchorRef={anchorRef}
|
94
|
+
open={combinedOpenState}
|
95
|
+
onOpen={onOpen}
|
96
|
+
onClose={onClose}
|
97
|
+
overlayProps={overlayProps}
|
98
|
+
>
|
99
|
+
<List {...listProps} role="menu" items={itemsToRender} />
|
100
|
+
</AnchoredOverlay>
|
101
|
+
)
|
102
|
+
}
|
103
|
+
|
104
|
+
ActionMenuBase.displayName = 'ActionMenu'
|
105
|
+
|
106
|
+
export const ActionMenu = Object.assign(ActionMenuBase, {Divider, Item: ActionMenuItem})
|
@@ -0,0 +1,191 @@
|
|
1
|
+
import React, {useCallback, useEffect} from 'react'
|
2
|
+
import Overlay, {OverlayProps} from '../Overlay'
|
3
|
+
import {FocusTrapHookSettings, useFocusTrap} from '../hooks/useFocusTrap'
|
4
|
+
import {FocusZoneHookSettings, useFocusZone} from '../hooks/useFocusZone'
|
5
|
+
import {useAnchoredPosition, useProvidedRefOrCreate, useRenderForcingRef} from '../hooks'
|
6
|
+
import {useSSRSafeId} from '@react-aria/ssr'
|
7
|
+
import {PositionSettings} from '../behaviors/anchoredPosition'
|
8
|
+
|
9
|
+
interface AnchoredOverlayPropsWithAnchor {
|
10
|
+
/**
|
11
|
+
* A custom function component used to render the anchor element.
|
12
|
+
* Will receive the selected text as `children` prop when an item is activated.
|
13
|
+
*/
|
14
|
+
renderAnchor: <T extends React.HTMLAttributes<HTMLElement>>(props: T) => JSX.Element
|
15
|
+
|
16
|
+
/**
|
17
|
+
* An override to the internal ref that will be spread on to the renderAnchor
|
18
|
+
*/
|
19
|
+
anchorRef?: React.RefObject<HTMLElement>
|
20
|
+
}
|
21
|
+
|
22
|
+
interface AnchoredOverlayPropsWithoutAnchor {
|
23
|
+
/**
|
24
|
+
* A custom function component used to render the anchor element.
|
25
|
+
* When renderAnchor is null, an anchorRef is required.
|
26
|
+
*/
|
27
|
+
renderAnchor: null
|
28
|
+
|
29
|
+
/**
|
30
|
+
* An override to the internal renderAnchor ref that will be used to position the overlay.
|
31
|
+
* When renderAnchor is null this can be used to make an anchor that is detached from ActionMenu.
|
32
|
+
*/
|
33
|
+
anchorRef: React.RefObject<HTMLElement>
|
34
|
+
}
|
35
|
+
|
36
|
+
export type AnchoredOverlayWrapperAnchorProps =
|
37
|
+
| Partial<AnchoredOverlayPropsWithAnchor>
|
38
|
+
| AnchoredOverlayPropsWithoutAnchor
|
39
|
+
|
40
|
+
interface AnchoredOverlayBaseProps extends Pick<OverlayProps, 'height' | 'width'> {
|
41
|
+
/**
|
42
|
+
* Determines whether the overlay portion of the component should be shown or not
|
43
|
+
*/
|
44
|
+
open: boolean
|
45
|
+
|
46
|
+
/**
|
47
|
+
* A callback which is called whenever the overlay is currently closed and an "open gesture" is detected.
|
48
|
+
*/
|
49
|
+
onOpen?: (gesture: 'anchor-click' | 'anchor-key-press') => unknown
|
50
|
+
|
51
|
+
/**
|
52
|
+
* A callback which is called whenever the overlay is currently open and a "close gesture" is detected.
|
53
|
+
*/
|
54
|
+
onClose?: (gesture: 'anchor-click' | 'click-outside' | 'escape') => unknown
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Props to be spread on the internal `Overlay` component.
|
58
|
+
*/
|
59
|
+
overlayProps?: Partial<OverlayProps>
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Settings to apply to the Focus Zone on the internal `Overlay` component.
|
63
|
+
*/
|
64
|
+
focusTrapSettings?: Partial<FocusTrapHookSettings>
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Settings to apply to the Focus Zone on the internal `Overlay` component.
|
68
|
+
*/
|
69
|
+
focusZoneSettings?: Partial<FocusZoneHookSettings>
|
70
|
+
}
|
71
|
+
|
72
|
+
export type AnchoredOverlayProps = AnchoredOverlayBaseProps &
|
73
|
+
(AnchoredOverlayPropsWithAnchor | AnchoredOverlayPropsWithoutAnchor) &
|
74
|
+
Partial<Pick<PositionSettings, 'align' | 'side'>>
|
75
|
+
|
76
|
+
/**
|
77
|
+
* An `AnchoredOverlay` provides an anchor that will open a floating overlay positioned relative to the anchor.
|
78
|
+
* The overlay can be opened and navigated using keyboard or mouse.
|
79
|
+
*/
|
80
|
+
export const AnchoredOverlay: React.FC<AnchoredOverlayProps> = ({
|
81
|
+
renderAnchor,
|
82
|
+
anchorRef: externalAnchorRef,
|
83
|
+
children,
|
84
|
+
open,
|
85
|
+
onOpen,
|
86
|
+
onClose,
|
87
|
+
height,
|
88
|
+
width,
|
89
|
+
overlayProps,
|
90
|
+
focusTrapSettings,
|
91
|
+
focusZoneSettings,
|
92
|
+
side,
|
93
|
+
align
|
94
|
+
}) => {
|
95
|
+
const anchorRef = useProvidedRefOrCreate(externalAnchorRef)
|
96
|
+
const [overlayRef, updateOverlayRef] = useRenderForcingRef<HTMLDivElement>()
|
97
|
+
const anchorId = useSSRSafeId()
|
98
|
+
|
99
|
+
const onClickOutside = useCallback(() => onClose?.('click-outside'), [onClose])
|
100
|
+
const onEscape = useCallback(() => onClose?.('escape'), [onClose])
|
101
|
+
|
102
|
+
const onAnchorKeyDown = useCallback(
|
103
|
+
(event: React.KeyboardEvent<HTMLElement>) => {
|
104
|
+
if (!event.defaultPrevented) {
|
105
|
+
if (!open && ['ArrowDown', 'ArrowUp', ' ', 'Enter'].includes(event.key)) {
|
106
|
+
onOpen?.('anchor-key-press')
|
107
|
+
event.preventDefault()
|
108
|
+
}
|
109
|
+
}
|
110
|
+
},
|
111
|
+
[open, onOpen]
|
112
|
+
)
|
113
|
+
const onAnchorClick = useCallback(
|
114
|
+
(event: React.MouseEvent<HTMLElement>) => {
|
115
|
+
if (event.defaultPrevented || event.button !== 0) {
|
116
|
+
return
|
117
|
+
}
|
118
|
+
if (!open) {
|
119
|
+
onOpen?.('anchor-click')
|
120
|
+
} else {
|
121
|
+
onClose?.('anchor-click')
|
122
|
+
}
|
123
|
+
},
|
124
|
+
[open, onOpen, onClose]
|
125
|
+
)
|
126
|
+
|
127
|
+
const {position} = useAnchoredPosition(
|
128
|
+
{
|
129
|
+
anchorElementRef: anchorRef,
|
130
|
+
floatingElementRef: overlayRef,
|
131
|
+
side,
|
132
|
+
align
|
133
|
+
},
|
134
|
+
[overlayRef.current]
|
135
|
+
)
|
136
|
+
|
137
|
+
useEffect(() => {
|
138
|
+
// ensure overlay ref gets cleared when closed, so position can reset between closing/re-opening
|
139
|
+
if (!open && overlayRef.current) {
|
140
|
+
updateOverlayRef(null)
|
141
|
+
}
|
142
|
+
}, [open, overlayRef, updateOverlayRef])
|
143
|
+
|
144
|
+
useFocusZone({
|
145
|
+
containerRef: overlayRef,
|
146
|
+
disabled: !open || !position,
|
147
|
+
...focusZoneSettings
|
148
|
+
})
|
149
|
+
useFocusTrap({containerRef: overlayRef, disabled: !open || !position, ...focusTrapSettings})
|
150
|
+
|
151
|
+
return (
|
152
|
+
<>
|
153
|
+
{renderAnchor &&
|
154
|
+
renderAnchor({
|
155
|
+
ref: anchorRef,
|
156
|
+
id: anchorId,
|
157
|
+
'aria-labelledby': anchorId,
|
158
|
+
'aria-haspopup': 'true',
|
159
|
+
tabIndex: 0,
|
160
|
+
onClick: onAnchorClick,
|
161
|
+
onKeyDown: onAnchorKeyDown
|
162
|
+
})}
|
163
|
+
{open ? (
|
164
|
+
<Overlay
|
165
|
+
returnFocusRef={anchorRef}
|
166
|
+
onClickOutside={onClickOutside}
|
167
|
+
ignoreClickRefs={[anchorRef]}
|
168
|
+
onEscape={onEscape}
|
169
|
+
ref={updateOverlayRef}
|
170
|
+
role="none"
|
171
|
+
visibility={position ? 'visible' : 'hidden'}
|
172
|
+
height={height}
|
173
|
+
width={width}
|
174
|
+
top={position?.top || 0}
|
175
|
+
left={position?.left || 0}
|
176
|
+
anchorSide={position?.anchorSide}
|
177
|
+
{...overlayProps}
|
178
|
+
>
|
179
|
+
{children}
|
180
|
+
</Overlay>
|
181
|
+
) : null}
|
182
|
+
</>
|
183
|
+
)
|
184
|
+
}
|
185
|
+
|
186
|
+
AnchoredOverlay.displayName = 'AnchoredOverlay'
|
187
|
+
|
188
|
+
AnchoredOverlay.defaultProps = {
|
189
|
+
side: 'outside-bottom',
|
190
|
+
align: 'start'
|
191
|
+
}
|
@@ -0,0 +1,103 @@
|
|
1
|
+
import React, {useCallback, useReducer, useRef} from 'react'
|
2
|
+
import {useSSRSafeId} from '@react-aria/ssr'
|
3
|
+
import {ComponentProps} from '../utils/types'
|
4
|
+
import {AutocompleteContext} from './AutocompleteContext'
|
5
|
+
import AutocompleteInput from './AutocompleteInput'
|
6
|
+
import AutocompleteMenu from './AutocompleteMenu'
|
7
|
+
import AutocompleteOverlay from './AutocompleteOverlay'
|
8
|
+
|
9
|
+
type Action =
|
10
|
+
| {type: 'showMenu' | 'isMenuDirectlyActivated'; payload: boolean}
|
11
|
+
| {type: 'autocompleteSuggestion' | 'inputValue'; payload: string}
|
12
|
+
| {type: 'selectedItemLength'; payload: number}
|
13
|
+
|
14
|
+
interface State {
|
15
|
+
inputValue: string
|
16
|
+
showMenu: boolean
|
17
|
+
isMenuDirectlyActivated: boolean
|
18
|
+
autocompleteSuggestion: string
|
19
|
+
selectedItemLength: number
|
20
|
+
}
|
21
|
+
|
22
|
+
const initialState = {
|
23
|
+
inputValue: '',
|
24
|
+
showMenu: false,
|
25
|
+
isMenuDirectlyActivated: false,
|
26
|
+
autocompleteSuggestion: '',
|
27
|
+
selectedItemLength: 0
|
28
|
+
}
|
29
|
+
|
30
|
+
const reducer = (state: State, action: Action) => {
|
31
|
+
const {type, payload} = action
|
32
|
+
switch (type) {
|
33
|
+
case 'inputValue':
|
34
|
+
return {...state, inputValue: payload as State['inputValue']}
|
35
|
+
case 'showMenu':
|
36
|
+
return {...state, showMenu: payload as State['showMenu']}
|
37
|
+
case 'isMenuDirectlyActivated':
|
38
|
+
return {...state, isMenuDirectlyActivated: payload as State['isMenuDirectlyActivated']}
|
39
|
+
case 'autocompleteSuggestion':
|
40
|
+
return {...state, autocompleteSuggestion: payload as State['autocompleteSuggestion']}
|
41
|
+
case 'selectedItemLength':
|
42
|
+
return {...state, selectedItemLength: payload as State['selectedItemLength']}
|
43
|
+
default:
|
44
|
+
return state
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
const Autocomplete: React.FC<{id?: string}> = ({children, id: idProp}) => {
|
49
|
+
const activeDescendantRef = useRef<HTMLElement>(null)
|
50
|
+
const scrollContainerRef = useRef<HTMLDivElement>(null)
|
51
|
+
const inputRef = useRef<HTMLInputElement>(null)
|
52
|
+
const [state, dispatch] = useReducer(reducer, initialState)
|
53
|
+
const {inputValue, showMenu, autocompleteSuggestion, isMenuDirectlyActivated, selectedItemLength} = state
|
54
|
+
const setInputValue = useCallback((value: State['inputValue']) => {
|
55
|
+
dispatch({type: 'inputValue', payload: value})
|
56
|
+
}, [])
|
57
|
+
const setShowMenu = useCallback((value: State['showMenu']) => {
|
58
|
+
dispatch({type: 'showMenu', payload: value})
|
59
|
+
}, [])
|
60
|
+
const setAutocompleteSuggestion = useCallback((value: State['autocompleteSuggestion']) => {
|
61
|
+
dispatch({type: 'autocompleteSuggestion', payload: value})
|
62
|
+
}, [])
|
63
|
+
const setIsMenuDirectlyActivated = useCallback((value: State['isMenuDirectlyActivated']) => {
|
64
|
+
dispatch({type: 'isMenuDirectlyActivated', payload: value})
|
65
|
+
}, [])
|
66
|
+
const setSelectedItemLength = useCallback((value: State['selectedItemLength']) => {
|
67
|
+
dispatch({type: 'selectedItemLength', payload: value})
|
68
|
+
}, [])
|
69
|
+
const id = useSSRSafeId(idProp)
|
70
|
+
|
71
|
+
return (
|
72
|
+
<AutocompleteContext.Provider
|
73
|
+
value={{
|
74
|
+
activeDescendantRef,
|
75
|
+
autocompleteSuggestion,
|
76
|
+
id,
|
77
|
+
inputRef,
|
78
|
+
inputValue,
|
79
|
+
isMenuDirectlyActivated,
|
80
|
+
scrollContainerRef,
|
81
|
+
selectedItemLength,
|
82
|
+
setAutocompleteSuggestion,
|
83
|
+
setInputValue,
|
84
|
+
setIsMenuDirectlyActivated,
|
85
|
+
setShowMenu,
|
86
|
+
setSelectedItemLength,
|
87
|
+
showMenu
|
88
|
+
}}
|
89
|
+
>
|
90
|
+
{children}
|
91
|
+
</AutocompleteContext.Provider>
|
92
|
+
)
|
93
|
+
}
|
94
|
+
|
95
|
+
export type AutocompleteProps = ComponentProps<typeof Autocomplete>
|
96
|
+
export type {AutocompleteInputProps} from './AutocompleteInput'
|
97
|
+
export type {AutocompleteMenuProps} from './AutocompleteMenu'
|
98
|
+
export type {AutocompleteOverlayProps} from './AutocompleteOverlay'
|
99
|
+
export default Object.assign(Autocomplete, {
|
100
|
+
Input: AutocompleteInput,
|
101
|
+
Menu: AutocompleteMenu,
|
102
|
+
Overlay: AutocompleteOverlay
|
103
|
+
})
|