@primer/components 31.0.0-rc.c90c1dae → 31.0.0
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/package.json +1 -1
- package/.changeset/README.md +0 -8
- package/.changeset/config.json +0 -10
- package/.devcontainer/devcontainer.json +0 -8
- package/.eslintrc.json +0 -137
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/new_component_proposal_template.md +0 -41
- package/.github/dependabot.yml +0 -18
- package/.github/pull_request_template.md +0 -18
- package/.github/workflows/check_for_changeset.yml +0 -25
- package/.github/workflows/ci.yml +0 -31
- package/.github/workflows/deploy_preview.yml +0 -47
- package/.github/workflows/deploy_production.yml +0 -70
- package/.github/workflows/release.yml +0 -35
- package/.github/workflows/release_canary.yml +0 -70
- package/.github/workflows/release_candidate.yml +0 -60
- package/.github/workflows/size.yml +0 -13
- package/.github/workflows/stale.yml +0 -26
- package/.gitignore +0 -10
- package/.npmrc +0 -4
- package/.nvmrc +0 -1
- package/.storybook/main.js +0 -11
- package/.storybook/preview.js +0 -113
- package/.vscode/launch.json +0 -21
- package/.vscode/settings.json +0 -13
- package/@types/@styled-system/index.d.ts +0 -0
- package/@types/@styled-system/prop-types/index.d.ts +0 -1
- package/@types/@styled-system/props/index.d.ts +0 -1
- package/@types/jest-styled-components/index.d.ts +0 -1
- package/CODEOWNERS +0 -2
- package/babel-defines.js +0 -13
- package/babel.config.js +0 -39
- package/contributor-docs/CODE_OF_CONDUCT.md +0 -76
- package/contributor-docs/CONTRIBUTING.md +0 -274
- package/contributor-docs/adrs/adr-001-typescript.md +0 -23
- package/contributor-docs/adrs/adr-002-behavior-isolation.md +0 -108
- package/contributor-docs/adrs/adr-003-prop-norms.md +0 -72
- package/contributor-docs/behaviors.md +0 -132
- package/contributor-docs/component-contents-api-patterns.md +0 -316
- package/contributor-docs/principles.md +0 -39
- package/docs/.eslintrc +0 -0
- package/docs/.gitignore +0 -91
- package/docs/components/PropsList.js +0 -5
- package/docs/components/State.js +0 -9
- package/docs/components/constants.js +0 -34
- package/docs/components/index.js +0 -2
- package/docs/content/ActionList.mdx +0 -99
- package/docs/content/ActionMenu.mdx +0 -80
- package/docs/content/AnchoredOverlay.mdx +0 -37
- package/docs/content/Autocomplete.mdx +0 -627
- package/docs/content/Avatar.mdx +0 -33
- package/docs/content/AvatarStack.mdx +0 -37
- package/docs/content/BorderBox.md +0 -46
- package/docs/content/Box.md +0 -74
- package/docs/content/BranchName.md +0 -18
- package/docs/content/Breadcrumbs.md +0 -52
- package/docs/content/Buttons.md +0 -56
- package/docs/content/CircleBadge.md +0 -45
- package/docs/content/CircleOcticon.md +0 -18
- package/docs/content/CounterLabel.md +0 -32
- package/docs/content/Details.md +0 -105
- package/docs/content/Dialog.md +0 -108
- package/docs/content/Dialog2.mdx +0 -179
- package/docs/content/Dropdown.md +0 -72
- package/docs/content/DropdownMenu.mdx +0 -49
- package/docs/content/FilterList.md +0 -44
- package/docs/content/FilteredSearch.md +0 -39
- package/docs/content/Flash.md +0 -44
- package/docs/content/Flex.md +0 -58
- package/docs/content/FormGroup.md +0 -46
- package/docs/content/Grid.md +0 -59
- package/docs/content/Header.md +0 -79
- package/docs/content/Heading.md +0 -22
- package/docs/content/Label.md +0 -42
- package/docs/content/LabelGroup.md +0 -31
- package/docs/content/Link.md +0 -37
- package/docs/content/Overlay.mdx +0 -94
- package/docs/content/Pagehead.md +0 -27
- package/docs/content/Pagination.md +0 -187
- package/docs/content/PointerBox.md +0 -81
- package/docs/content/Popover.md +0 -137
- package/docs/content/Portal.mdx +0 -78
- package/docs/content/Position.md +0 -100
- package/docs/content/ProgressBar.mdx +0 -29
- package/docs/content/SelectMenu.md +0 -435
- package/docs/content/SelectPanel.mdx +0 -67
- package/docs/content/SideNav.md +0 -179
- package/docs/content/Spinner.mdx +0 -32
- package/docs/content/StateLabel.md +0 -35
- package/docs/content/StyledOcticon.md +0 -36
- package/docs/content/SubNav.md +0 -102
- package/docs/content/TabNav.md +0 -50
- package/docs/content/Text.md +0 -31
- package/docs/content/TextInput.md +0 -34
- package/docs/content/TextInputTokens.mdx +0 -89
- package/docs/content/TextInputWithTokens.mdx +0 -97
- package/docs/content/Timeline.md +0 -138
- package/docs/content/Token.mdx +0 -381
- package/docs/content/Tooltip.md +0 -41
- package/docs/content/Truncate.md +0 -64
- package/docs/content/UnderlineNav.md +0 -53
- package/docs/content/anchoredPosition.mdx +0 -163
- package/docs/content/core-concepts.md +0 -70
- package/docs/content/focusTrap.mdx +0 -103
- package/docs/content/focusZone.mdx +0 -145
- package/docs/content/getting-started.md +0 -138
- package/docs/content/index.md +0 -33
- package/docs/content/linting.md +0 -35
- package/docs/content/overriding-styles.mdx +0 -82
- package/docs/content/philosophy.md +0 -23
- package/docs/content/primer-theme.md +0 -89
- package/docs/content/ssr.mdx +0 -43
- package/docs/content/system-props.mdx +0 -37
- package/docs/content/theme-reference.md +0 -16
- package/docs/content/theming.md +0 -249
- package/docs/content/useOnEscapePress.mdx +0 -56
- package/docs/content/useOnOutsideClick.mdx +0 -57
- package/docs/content/useOpenAndCloseFocus.mdx +0 -49
- package/docs/content/useOverlay.mdx +0 -62
- package/docs/content/useSafeTimeout.mdx +0 -32
- package/docs/gatsby-config.js +0 -30
- package/docs/gatsby-node.js +0 -101
- package/docs/package-lock.json +0 -20756
- package/docs/package.json +0 -36
- package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +0 -23
- package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +0 -41
- package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +0 -54
- package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +0 -133
- package/docs/src/@primer/gatsby-theme-doctocat/primer-components-hero.svg +0 -1411
- package/docs/src/props.js +0 -77
- package/jest.config.js +0 -13
- package/lib/__tests__/ActionList.test.d.ts +0 -1
- package/lib/__tests__/ActionList.test.js +0 -69
- package/lib/__tests__/ActionList.types.test.d.ts +0 -6
- package/lib/__tests__/ActionList.types.test.js +0 -69
- package/lib/__tests__/ActionMenu.test.d.ts +0 -1
- package/lib/__tests__/ActionMenu.test.js +0 -151
- package/lib/__tests__/AnchoredOverlay.test.d.ts +0 -1
- package/lib/__tests__/AnchoredOverlay.test.js +0 -160
- package/lib/__tests__/Autocomplete.test.d.ts +0 -1
- package/lib/__tests__/Autocomplete.test.js +0 -528
- package/lib/__tests__/Avatar.test.d.ts +0 -1
- package/lib/__tests__/Avatar.test.js +0 -67
- package/lib/__tests__/AvatarStack.test.d.ts +0 -1
- package/lib/__tests__/AvatarStack.test.js +0 -71
- package/lib/__tests__/BorderBox.test.d.ts +0 -1
- package/lib/__tests__/BorderBox.test.js +0 -58
- package/lib/__tests__/Box.test.d.ts +0 -1
- package/lib/__tests__/Box.test.js +0 -78
- package/lib/__tests__/BranchName.test.d.ts +0 -1
- package/lib/__tests__/BranchName.test.js +0 -36
- package/lib/__tests__/Breadcrumbs.test.d.ts +0 -1
- package/lib/__tests__/Breadcrumbs.test.js +0 -37
- package/lib/__tests__/BreadcrumbsItem.test.d.ts +0 -1
- package/lib/__tests__/BreadcrumbsItem.test.js +0 -49
- package/lib/__tests__/Button.test.d.ts +0 -1
- package/lib/__tests__/Button.test.js +0 -143
- package/lib/__tests__/Caret.test.d.ts +0 -1
- package/lib/__tests__/Caret.test.js +0 -52
- package/lib/__tests__/CircleBadge.test.d.ts +0 -1
- package/lib/__tests__/CircleBadge.test.js +0 -83
- package/lib/__tests__/CircleOcticon.test.d.ts +0 -1
- package/lib/__tests__/CircleOcticon.test.js +0 -71
- package/lib/__tests__/ConfirmationDialog.test.d.ts +0 -1
- package/lib/__tests__/ConfirmationDialog.test.js +0 -134
- package/lib/__tests__/CounterLabel.test.d.ts +0 -1
- package/lib/__tests__/CounterLabel.test.js +0 -58
- package/lib/__tests__/Details.test.d.ts +0 -1
- package/lib/__tests__/Details.test.js +0 -117
- package/lib/__tests__/Dialog.test.d.ts +0 -1
- package/lib/__tests__/Dialog.test.js +0 -184
- package/lib/__tests__/Dropdown.test.d.ts +0 -1
- package/lib/__tests__/Dropdown.test.js +0 -63
- package/lib/__tests__/DropdownMenu.test.d.ts +0 -1
- package/lib/__tests__/DropdownMenu.test.js +0 -150
- package/lib/__tests__/FilterList.test.d.ts +0 -1
- package/lib/__tests__/FilterList.test.js +0 -36
- package/lib/__tests__/FilterListItem.test.d.ts +0 -1
- package/lib/__tests__/FilterListItem.test.js +0 -46
- package/lib/__tests__/FilteredSearch.test.d.ts +0 -1
- package/lib/__tests__/FilteredSearch.test.js +0 -36
- package/lib/__tests__/Flash.test.d.ts +0 -1
- package/lib/__tests__/Flash.test.js +0 -62
- package/lib/__tests__/Flex.test.d.ts +0 -1
- package/lib/__tests__/Flex.test.js +0 -74
- package/lib/__tests__/FormGroup.test.d.ts +0 -1
- package/lib/__tests__/FormGroup.test.js +0 -54
- package/lib/__tests__/Grid.test.d.ts +0 -1
- package/lib/__tests__/Grid.test.js +0 -104
- package/lib/__tests__/Header.test.d.ts +0 -1
- package/lib/__tests__/Header.test.js +0 -58
- package/lib/__tests__/Heading.test.d.ts +0 -1
- package/lib/__tests__/Heading.test.js +0 -109
- package/lib/__tests__/Label.test.d.ts +0 -1
- package/lib/__tests__/Label.test.js +0 -46
- package/lib/__tests__/LabelGroup.test.d.ts +0 -1
- package/lib/__tests__/LabelGroup.test.js +0 -38
- package/lib/__tests__/Link.test.d.ts +0 -1
- package/lib/__tests__/Link.test.js +0 -70
- package/lib/__tests__/Merge.types.test.d.ts +0 -30
- package/lib/__tests__/Merge.types.test.js +0 -27
- package/lib/__tests__/Overlay.test.d.ts +0 -1
- package/lib/__tests__/Overlay.test.js +0 -145
- package/lib/__tests__/Pagehead.test.d.ts +0 -1
- package/lib/__tests__/Pagehead.test.js +0 -37
- package/lib/__tests__/Pagination/Pagination.test.d.ts +0 -1
- package/lib/__tests__/Pagination/Pagination.test.js +0 -47
- package/lib/__tests__/Pagination/PaginationModel.test.d.ts +0 -1
- package/lib/__tests__/Pagination/PaginationModel.test.js +0 -186
- package/lib/__tests__/PointerBox.test.d.ts +0 -1
- package/lib/__tests__/PointerBox.test.js +0 -46
- package/lib/__tests__/Popover.test.d.ts +0 -1
- package/lib/__tests__/Popover.test.js +0 -66
- package/lib/__tests__/Portal.test.d.ts +0 -1
- package/lib/__tests__/Portal.test.js +0 -124
- package/lib/__tests__/Position.test.d.ts +0 -1
- package/lib/__tests__/Position.test.js +0 -143
- package/lib/__tests__/ProgressBar.test.d.ts +0 -1
- package/lib/__tests__/ProgressBar.test.js +0 -68
- package/lib/__tests__/SelectMenu.test.d.ts +0 -1
- package/lib/__tests__/SelectMenu.test.js +0 -155
- package/lib/__tests__/SelectPanel.test.d.ts +0 -1
- package/lib/__tests__/SelectPanel.test.js +0 -80
- package/lib/__tests__/SideNav.test.d.ts +0 -1
- package/lib/__tests__/SideNav.test.js +0 -71
- package/lib/__tests__/Spinner.test.d.ts +0 -1
- package/lib/__tests__/Spinner.test.js +0 -53
- package/lib/__tests__/StateLabel.test.d.ts +0 -1
- package/lib/__tests__/StateLabel.test.js +0 -71
- package/lib/__tests__/StyledOcticon.test.d.ts +0 -1
- package/lib/__tests__/StyledOcticon.test.js +0 -40
- package/lib/__tests__/SubNav.test.d.ts +0 -1
- package/lib/__tests__/SubNav.test.js +0 -62
- package/lib/__tests__/SubNavLink.test.d.ts +0 -1
- package/lib/__tests__/SubNavLink.test.js +0 -49
- package/lib/__tests__/TabNav.test.d.ts +0 -1
- package/lib/__tests__/TabNav.test.js +0 -49
- package/lib/__tests__/Text.test.d.ts +0 -1
- package/lib/__tests__/Text.test.js +0 -105
- package/lib/__tests__/TextInput.test.d.ts +0 -1
- package/lib/__tests__/TextInput.test.js +0 -78
- package/lib/__tests__/TextInputWithTokens.test.d.ts +0 -1
- package/lib/__tests__/TextInputWithTokens.test.js +0 -389
- package/lib/__tests__/ThemeProvider.test.d.ts +0 -1
- package/lib/__tests__/ThemeProvider.test.js +0 -444
- package/lib/__tests__/Timeline.test.d.ts +0 -1
- package/lib/__tests__/Timeline.test.js +0 -75
- package/lib/__tests__/Token.test.d.ts +0 -1
- package/lib/__tests__/Token.test.js +0 -180
- package/lib/__tests__/Tooltip.test.d.ts +0 -1
- package/lib/__tests__/Tooltip.test.js +0 -69
- package/lib/__tests__/Truncate.test.d.ts +0 -1
- package/lib/__tests__/Truncate.test.js +0 -63
- package/lib/__tests__/UnderlineNav.test.d.ts +0 -1
- package/lib/__tests__/UnderlineNav.test.js +0 -72
- package/lib/__tests__/UnderlineNavLink.test.d.ts +0 -1
- package/lib/__tests__/UnderlineNavLink.test.js +0 -51
- package/lib/__tests__/behaviors/anchoredPosition.test.d.ts +0 -1
- package/lib/__tests__/behaviors/anchoredPosition.test.js +0 -390
- package/lib/__tests__/behaviors/focusTrap.test.d.ts +0 -1
- package/lib/__tests__/behaviors/focusTrap.test.js +0 -234
- package/lib/__tests__/behaviors/focusZone.test.d.ts +0 -1
- package/lib/__tests__/behaviors/focusZone.test.js +0 -570
- package/lib/__tests__/behaviors/iterateFocusableElements.test.d.ts +0 -1
- package/lib/__tests__/behaviors/iterateFocusableElements.test.js +0 -55
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +0 -1
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +0 -226
- package/lib/__tests__/filterObject.test.d.ts +0 -1
- package/lib/__tests__/filterObject.test.js +0 -30
- package/lib/__tests__/hooks/useAnchoredPosition.test.d.ts +0 -1
- package/lib/__tests__/hooks/useAnchoredPosition.test.js +0 -54
- package/lib/__tests__/hooks/useOnEscapePress.test.d.ts +0 -1
- package/lib/__tests__/hooks/useOnEscapePress.test.js +0 -32
- package/lib/__tests__/hooks/useOnOutsideClick.test.d.ts +0 -1
- package/lib/__tests__/hooks/useOnOutsideClick.test.js +0 -87
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.d.ts +0 -1
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.js +0 -60
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.d.ts +0 -1
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.js +0 -45
- package/lib/__tests__/theme.test.d.ts +0 -1
- package/lib/__tests__/theme.test.js +0 -36
- package/lib/__tests__/themeGet.test.d.ts +0 -1
- package/lib/__tests__/themeGet.test.js +0 -25
- package/lib/__tests__/useSafeTimeout.test.d.ts +0 -1
- package/lib/__tests__/useSafeTimeout.test.js +0 -45
- package/lib/stories/ActionList.stories.js +0 -453
- package/lib/stories/ActionMenu.stories.js +0 -338
- package/lib/stories/AnchoredOverlay.stories.js +0 -127
- package/lib/stories/Autocomplete.stories.js +0 -608
- package/lib/stories/AvatarStack.stories.js +0 -49
- package/lib/stories/Button.stories.js +0 -125
- package/lib/stories/ConfirmationDialog.stories.js +0 -111
- package/lib/stories/Dialog.stories.js +0 -265
- package/lib/stories/DropdownMenu.stories.js +0 -122
- package/lib/stories/IssueLabelToken.stories.js +0 -165
- package/lib/stories/Overlay.stories.js +0 -204
- package/lib/stories/Portal.stories.js +0 -104
- package/lib/stories/ProfileToken.stories.js +0 -162
- package/lib/stories/SelectPanel.stories.js +0 -399
- package/lib/stories/TextInputWithTokens.stories.js +0 -235
- package/lib/stories/ThemeProvider.stories.js +0 -102
- package/lib/stories/Token.stories.js +0 -159
- package/lib/stories/useAnchoredPosition.stories.js +0 -351
- package/lib/stories/useFocusTrap.stories.js +0 -356
- package/lib/stories/useFocusZone.stories.js +0 -599
- package/lib-esm/__tests__/ActionList.test.d.ts +0 -1
- package/lib-esm/__tests__/ActionList.test.js +0 -57
- package/lib-esm/__tests__/ActionList.types.test.d.ts +0 -6
- package/lib-esm/__tests__/ActionList.types.test.js +0 -45
- package/lib-esm/__tests__/ActionMenu.test.d.ts +0 -1
- package/lib-esm/__tests__/ActionMenu.test.js +0 -139
- package/lib-esm/__tests__/AnchoredOverlay.test.d.ts +0 -1
- package/lib-esm/__tests__/AnchoredOverlay.test.js +0 -134
- package/lib-esm/__tests__/Autocomplete.test.d.ts +0 -1
- package/lib-esm/__tests__/Autocomplete.test.js +0 -494
- package/lib-esm/__tests__/Avatar.test.d.ts +0 -1
- package/lib-esm/__tests__/Avatar.test.js +0 -56
- package/lib-esm/__tests__/AvatarStack.test.d.ts +0 -1
- package/lib-esm/__tests__/AvatarStack.test.js +0 -58
- package/lib-esm/__tests__/BorderBox.test.d.ts +0 -1
- package/lib-esm/__tests__/BorderBox.test.js +0 -47
- package/lib-esm/__tests__/Box.test.d.ts +0 -1
- package/lib-esm/__tests__/Box.test.js +0 -67
- package/lib-esm/__tests__/BranchName.test.d.ts +0 -1
- package/lib-esm/__tests__/BranchName.test.js +0 -26
- package/lib-esm/__tests__/Breadcrumbs.test.d.ts +0 -1
- package/lib-esm/__tests__/Breadcrumbs.test.js +0 -27
- package/lib-esm/__tests__/BreadcrumbsItem.test.d.ts +0 -1
- package/lib-esm/__tests__/BreadcrumbsItem.test.js +0 -39
- package/lib-esm/__tests__/Button.test.d.ts +0 -1
- package/lib-esm/__tests__/Button.test.js +0 -133
- package/lib-esm/__tests__/Caret.test.d.ts +0 -1
- package/lib-esm/__tests__/Caret.test.js +0 -42
- package/lib-esm/__tests__/CircleBadge.test.d.ts +0 -1
- package/lib-esm/__tests__/CircleBadge.test.js +0 -70
- package/lib-esm/__tests__/CircleOcticon.test.d.ts +0 -1
- package/lib-esm/__tests__/CircleOcticon.test.js +0 -59
- package/lib-esm/__tests__/ConfirmationDialog.test.d.ts +0 -1
- package/lib-esm/__tests__/ConfirmationDialog.test.js +0 -113
- package/lib-esm/__tests__/CounterLabel.test.d.ts +0 -1
- package/lib-esm/__tests__/CounterLabel.test.js +0 -47
- package/lib-esm/__tests__/Details.test.d.ts +0 -1
- package/lib-esm/__tests__/Details.test.js +0 -107
- package/lib-esm/__tests__/Dialog.test.d.ts +0 -1
- package/lib-esm/__tests__/Dialog.test.js +0 -171
- package/lib-esm/__tests__/Dropdown.test.d.ts +0 -1
- package/lib-esm/__tests__/Dropdown.test.js +0 -53
- package/lib-esm/__tests__/DropdownMenu.test.d.ts +0 -1
- package/lib-esm/__tests__/DropdownMenu.test.js +0 -137
- package/lib-esm/__tests__/FilterList.test.d.ts +0 -1
- package/lib-esm/__tests__/FilterList.test.js +0 -26
- package/lib-esm/__tests__/FilterListItem.test.d.ts +0 -1
- package/lib-esm/__tests__/FilterListItem.test.js +0 -36
- package/lib-esm/__tests__/FilteredSearch.test.d.ts +0 -1
- package/lib-esm/__tests__/FilteredSearch.test.js +0 -26
- package/lib-esm/__tests__/Flash.test.d.ts +0 -1
- package/lib-esm/__tests__/Flash.test.js +0 -51
- package/lib-esm/__tests__/Flex.test.d.ts +0 -1
- package/lib-esm/__tests__/Flex.test.js +0 -64
- package/lib-esm/__tests__/FormGroup.test.d.ts +0 -1
- package/lib-esm/__tests__/FormGroup.test.js +0 -44
- package/lib-esm/__tests__/Grid.test.d.ts +0 -1
- package/lib-esm/__tests__/Grid.test.js +0 -94
- package/lib-esm/__tests__/Header.test.d.ts +0 -1
- package/lib-esm/__tests__/Header.test.js +0 -48
- package/lib-esm/__tests__/Heading.test.d.ts +0 -1
- package/lib-esm/__tests__/Heading.test.js +0 -99
- package/lib-esm/__tests__/Label.test.d.ts +0 -1
- package/lib-esm/__tests__/Label.test.js +0 -36
- package/lib-esm/__tests__/LabelGroup.test.d.ts +0 -1
- package/lib-esm/__tests__/LabelGroup.test.js +0 -26
- package/lib-esm/__tests__/Link.test.d.ts +0 -1
- package/lib-esm/__tests__/Link.test.js +0 -60
- package/lib-esm/__tests__/Merge.types.test.d.ts +0 -30
- package/lib-esm/__tests__/Merge.types.test.js +0 -14
- package/lib-esm/__tests__/Overlay.test.d.ts +0 -1
- package/lib-esm/__tests__/Overlay.test.js +0 -123
- package/lib-esm/__tests__/Pagehead.test.d.ts +0 -1
- package/lib-esm/__tests__/Pagehead.test.js +0 -26
- package/lib-esm/__tests__/Pagination/Pagination.test.d.ts +0 -1
- package/lib-esm/__tests__/Pagination/Pagination.test.js +0 -35
- package/lib-esm/__tests__/Pagination/PaginationModel.test.d.ts +0 -1
- package/lib-esm/__tests__/Pagination/PaginationModel.test.js +0 -182
- package/lib-esm/__tests__/PointerBox.test.d.ts +0 -1
- package/lib-esm/__tests__/PointerBox.test.js +0 -36
- package/lib-esm/__tests__/Popover.test.d.ts +0 -1
- package/lib-esm/__tests__/Popover.test.js +0 -53
- package/lib-esm/__tests__/Portal.test.d.ts +0 -1
- package/lib-esm/__tests__/Portal.test.js +0 -104
- package/lib-esm/__tests__/Position.test.d.ts +0 -1
- package/lib-esm/__tests__/Position.test.js +0 -133
- package/lib-esm/__tests__/ProgressBar.test.d.ts +0 -1
- package/lib-esm/__tests__/ProgressBar.test.js +0 -58
- package/lib-esm/__tests__/SelectMenu.test.d.ts +0 -1
- package/lib-esm/__tests__/SelectMenu.test.js +0 -145
- package/lib-esm/__tests__/SelectPanel.test.d.ts +0 -1
- package/lib-esm/__tests__/SelectPanel.test.js +0 -65
- package/lib-esm/__tests__/SideNav.test.d.ts +0 -1
- package/lib-esm/__tests__/SideNav.test.js +0 -60
- package/lib-esm/__tests__/Spinner.test.d.ts +0 -1
- package/lib-esm/__tests__/Spinner.test.js +0 -43
- package/lib-esm/__tests__/StateLabel.test.d.ts +0 -1
- package/lib-esm/__tests__/StateLabel.test.js +0 -61
- package/lib-esm/__tests__/StyledOcticon.test.d.ts +0 -1
- package/lib-esm/__tests__/StyledOcticon.test.js +0 -29
- package/lib-esm/__tests__/SubNav.test.d.ts +0 -1
- package/lib-esm/__tests__/SubNav.test.js +0 -50
- package/lib-esm/__tests__/SubNavLink.test.d.ts +0 -1
- package/lib-esm/__tests__/SubNavLink.test.js +0 -39
- package/lib-esm/__tests__/TabNav.test.d.ts +0 -1
- package/lib-esm/__tests__/TabNav.test.js +0 -39
- package/lib-esm/__tests__/Text.test.d.ts +0 -1
- package/lib-esm/__tests__/Text.test.js +0 -93
- package/lib-esm/__tests__/TextInput.test.d.ts +0 -1
- package/lib-esm/__tests__/TextInput.test.js +0 -68
- package/lib-esm/__tests__/TextInputWithTokens.test.d.ts +0 -1
- package/lib-esm/__tests__/TextInputWithTokens.test.js +0 -341
- package/lib-esm/__tests__/ThemeProvider.test.d.ts +0 -1
- package/lib-esm/__tests__/ThemeProvider.test.js +0 -408
- package/lib-esm/__tests__/Timeline.test.d.ts +0 -1
- package/lib-esm/__tests__/Timeline.test.js +0 -65
- package/lib-esm/__tests__/Token.test.d.ts +0 -1
- package/lib-esm/__tests__/Token.test.js +0 -166
- package/lib-esm/__tests__/Tooltip.test.d.ts +0 -1
- package/lib-esm/__tests__/Tooltip.test.js +0 -59
- package/lib-esm/__tests__/Truncate.test.d.ts +0 -1
- package/lib-esm/__tests__/Truncate.test.js +0 -53
- package/lib-esm/__tests__/UnderlineNav.test.d.ts +0 -1
- package/lib-esm/__tests__/UnderlineNav.test.js +0 -60
- package/lib-esm/__tests__/UnderlineNavLink.test.d.ts +0 -1
- package/lib-esm/__tests__/UnderlineNavLink.test.js +0 -41
- package/lib-esm/__tests__/behaviors/anchoredPosition.test.d.ts +0 -1
- package/lib-esm/__tests__/behaviors/anchoredPosition.test.js +0 -388
- package/lib-esm/__tests__/behaviors/focusTrap.test.d.ts +0 -1
- package/lib-esm/__tests__/behaviors/focusTrap.test.js +0 -227
- package/lib-esm/__tests__/behaviors/focusZone.test.d.ts +0 -1
- package/lib-esm/__tests__/behaviors/focusZone.test.js +0 -487
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.test.d.ts +0 -1
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.test.js +0 -48
- package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +0 -1
- package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.js +0 -224
- package/lib-esm/__tests__/filterObject.test.d.ts +0 -1
- package/lib-esm/__tests__/filterObject.test.js +0 -27
- package/lib-esm/__tests__/hooks/useAnchoredPosition.test.d.ts +0 -1
- package/lib-esm/__tests__/hooks/useAnchoredPosition.test.js +0 -46
- package/lib-esm/__tests__/hooks/useOnEscapePress.test.d.ts +0 -1
- package/lib-esm/__tests__/hooks/useOnEscapePress.test.js +0 -23
- package/lib-esm/__tests__/hooks/useOnOutsideClick.test.d.ts +0 -1
- package/lib-esm/__tests__/hooks/useOnOutsideClick.test.js +0 -68
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.test.d.ts +0 -1
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.test.js +0 -52
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.test.d.ts +0 -1
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.test.js +0 -36
- package/lib-esm/__tests__/theme.test.d.ts +0 -1
- package/lib-esm/__tests__/theme.test.js +0 -33
- package/lib-esm/__tests__/themeGet.test.d.ts +0 -1
- package/lib-esm/__tests__/themeGet.test.js +0 -22
- package/lib-esm/__tests__/useSafeTimeout.test.d.ts +0 -1
- package/lib-esm/__tests__/useSafeTimeout.test.js +0 -39
- package/lib-esm/stories/ActionList.stories.js +0 -394
- package/lib-esm/stories/ActionMenu.stories.js +0 -293
- package/lib-esm/stories/AnchoredOverlay.stories.js +0 -101
- package/lib-esm/stories/Autocomplete.stories.js +0 -549
- package/lib-esm/stories/AvatarStack.stories.js +0 -32
- package/lib-esm/stories/Button.stories.js +0 -86
- package/lib-esm/stories/ConfirmationDialog.stories.js +0 -86
- package/lib-esm/stories/Dialog.stories.js +0 -240
- package/lib-esm/stories/DropdownMenu.stories.js +0 -94
- package/lib-esm/stories/IssueLabelToken.stories.js +0 -139
- package/lib-esm/stories/Overlay.stories.js +0 -173
- package/lib-esm/stories/Portal.stories.js +0 -68
- package/lib-esm/stories/ProfileToken.stories.js +0 -136
- package/lib-esm/stories/SelectPanel.stories.js +0 -334
- package/lib-esm/stories/TextInputWithTokens.stories.js +0 -196
- package/lib-esm/stories/ThemeProvider.stories.js +0 -83
- package/lib-esm/stories/Token.stories.js +0 -133
- package/lib-esm/stories/useAnchoredPosition.stories.js +0 -313
- package/lib-esm/stories/useFocusTrap.stories.js +0 -309
- package/lib-esm/stories/useFocusZone.stories.js +0 -554
- package/migrating.md +0 -250
- package/now.json +0 -17
- package/package-lock.json +0 -29369
- package/rollup.config.js +0 -36
- package/script/build +0 -19
- package/script/build-storybook +0 -10
- package/script/setup +0 -12
- package/src/ActionList/Divider.tsx +0 -25
- package/src/ActionList/Group.tsx +0 -45
- package/src/ActionList/Header.tsx +0 -74
- package/src/ActionList/Item.tsx +0 -483
- package/src/ActionList/List.tsx +0 -258
- package/src/ActionList/index.ts +0 -21
- package/src/ActionMenu.tsx +0 -106
- package/src/AnchoredOverlay/AnchoredOverlay.tsx +0 -191
- package/src/AnchoredOverlay/index.ts +0 -2
- package/src/Autocomplete/Autocomplete.tsx +0 -103
- package/src/Autocomplete/AutocompleteContext.tsx +0 -19
- package/src/Autocomplete/AutocompleteInput.tsx +0 -179
- package/src/Autocomplete/AutocompleteMenu.tsx +0 -341
- package/src/Autocomplete/AutocompleteOverlay.tsx +0 -68
- package/src/Autocomplete/index.ts +0 -2
- package/src/Avatar.tsx +0 -46
- package/src/AvatarPair.tsx +0 -35
- package/src/AvatarStack.tsx +0 -159
- package/src/BaseStyles.tsx +0 -53
- package/src/BorderBox.tsx +0 -18
- package/src/Box.tsx +0 -54
- package/src/BranchName.tsx +0 -19
- package/src/Breadcrumbs.tsx +0 -101
- package/src/Button/Button.tsx +0 -40
- package/src/Button/ButtonBase.tsx +0 -43
- package/src/Button/ButtonClose.tsx +0 -40
- package/src/Button/ButtonDanger.tsx +0 -43
- package/src/Button/ButtonGroup.tsx +0 -55
- package/src/Button/ButtonInvisible.tsx +0 -32
- package/src/Button/ButtonOutline.tsx +0 -43
- package/src/Button/ButtonPrimary.tsx +0 -41
- package/src/Button/ButtonStyles.tsx +0 -36
- package/src/Button/ButtonTableList.tsx +0 -58
- package/src/Button/index.ts +0 -16
- package/src/Caret.tsx +0 -133
- package/src/CircleBadge.tsx +0 -55
- package/src/CircleOcticon.tsx +0 -37
- package/src/CounterLabel.tsx +0 -52
- package/src/Details.tsx +0 -23
- package/src/Dialog/ConfirmationDialog.tsx +0 -184
- package/src/Dialog/Dialog.tsx +0 -432
- package/src/Dialog.tsx +0 -149
- package/src/Dropdown.tsx +0 -158
- package/src/DropdownMenu/DropdownButton.tsx +0 -15
- package/src/DropdownMenu/DropdownMenu.tsx +0 -115
- package/src/DropdownMenu/index.ts +0 -4
- package/src/DropdownStyles.ts +0 -128
- package/src/FilterList.tsx +0 -81
- package/src/FilteredActionList/FilteredActionList.tsx +0 -142
- package/src/FilteredActionList/index.ts +0 -2
- package/src/FilteredSearch.tsx +0 -28
- package/src/Flash.tsx +0 -77
- package/src/Flex.tsx +0 -15
- package/src/FormGroup.tsx +0 -27
- package/src/Grid.tsx +0 -15
- package/src/Header.tsx +0 -84
- package/src/Heading.tsx +0 -21
- package/src/Label.tsx +0 -75
- package/src/LabelGroup.tsx +0 -18
- package/src/Link.tsx +0 -46
- package/src/Overlay.tsx +0 -197
- package/src/Pagehead.tsx +0 -17
- package/src/Pagination/Pagination.tsx +0 -214
- package/src/Pagination/index.ts +0 -4
- package/src/Pagination/model.tsx +0 -187
- package/src/PointerBox.tsx +0 -31
- package/src/Popover.tsx +0 -236
- package/src/Portal/Portal.tsx +0 -96
- package/src/Portal/index.ts +0 -5
- package/src/Position.tsx +0 -63
- package/src/ProgressBar.tsx +0 -52
- package/src/SelectMenu/SelectMenu.tsx +0 -125
- package/src/SelectMenu/SelectMenuContext.tsx +0 -9
- package/src/SelectMenu/SelectMenuDivider.tsx +0 -25
- package/src/SelectMenu/SelectMenuFilter.tsx +0 -51
- package/src/SelectMenu/SelectMenuFooter.tsx +0 -28
- package/src/SelectMenu/SelectMenuHeader.tsx +0 -50
- package/src/SelectMenu/SelectMenuItem.tsx +0 -137
- package/src/SelectMenu/SelectMenuList.tsx +0 -42
- package/src/SelectMenu/SelectMenuLoadingAnimation.tsx +0 -24
- package/src/SelectMenu/SelectMenuModal.tsx +0 -121
- package/src/SelectMenu/SelectMenuTab.tsx +0 -88
- package/src/SelectMenu/SelectMenuTabPanel.tsx +0 -30
- package/src/SelectMenu/SelectMenuTabs.tsx +0 -44
- package/src/SelectMenu/hooks/useKeyboardNav.js +0 -90
- package/src/SelectMenu/index.ts +0 -15
- package/src/SelectPanel/SelectPanel.tsx +0 -173
- package/src/SelectPanel/index.ts +0 -2
- package/src/SideNav.tsx +0 -193
- package/src/Spinner.tsx +0 -59
- package/src/StateLabel.tsx +0 -102
- package/src/StyledOcticon.tsx +0 -24
- package/src/SubNav.tsx +0 -129
- package/src/TabNav.tsx +0 -77
- package/src/Text.tsx +0 -13
- package/src/TextInput.tsx +0 -68
- package/src/TextInputWithTokens.tsx +0 -271
- package/src/ThemeProvider.tsx +0 -176
- package/src/Timeline.tsx +0 -141
- package/src/Token/AvatarToken.tsx +0 -54
- package/src/Token/IssueLabelToken.tsx +0 -150
- package/src/Token/Token.tsx +0 -112
- package/src/Token/TokenBase.tsx +0 -134
- package/src/Token/_RemoveTokenButton.tsx +0 -98
- package/src/Token/_TokenTextContainer.tsx +0 -47
- package/src/Token/index.ts +0 -3
- package/src/Tooltip.tsx +0 -263
- package/src/Truncate.tsx +0 -36
- package/src/UnderlineNav.tsx +0 -110
- package/src/_TextInputWrapper.tsx +0 -105
- package/src/_UnstyledTextInput.tsx +0 -19
- package/src/__tests__/.eslintrc.json +0 -11
- package/src/__tests__/ActionList.test.tsx +0 -53
- package/src/__tests__/ActionList.types.test.tsx +0 -51
- package/src/__tests__/ActionMenu.test.tsx +0 -136
- package/src/__tests__/AnchoredOverlay.test.tsx +0 -150
- package/src/__tests__/Autocomplete.test.tsx +0 -444
- package/src/__tests__/Avatar.test.tsx +0 -44
- package/src/__tests__/AvatarStack.test.tsx +0 -48
- package/src/__tests__/BorderBox.test.tsx +0 -43
- package/src/__tests__/Box.test.tsx +0 -42
- package/src/__tests__/BranchName.test.tsx +0 -26
- package/src/__tests__/Breadcrumbs.test.tsx +0 -27
- package/src/__tests__/BreadcrumbsItem.test.tsx +0 -31
- package/src/__tests__/Button.test.tsx +0 -128
- package/src/__tests__/Caret.test.tsx +0 -36
- package/src/__tests__/CircleBadge.test.tsx +0 -66
- package/src/__tests__/CircleOcticon.test.tsx +0 -50
- package/src/__tests__/ConfirmationDialog.test.tsx +0 -120
- package/src/__tests__/CounterLabel.test.tsx +0 -50
- package/src/__tests__/Details.test.tsx +0 -115
- package/src/__tests__/Dialog.test.tsx +0 -155
- package/src/__tests__/Dropdown.test.tsx +0 -53
- package/src/__tests__/DropdownMenu.test.tsx +0 -136
- package/src/__tests__/FilterList.test.tsx +0 -26
- package/src/__tests__/FilterListItem.test.tsx +0 -31
- package/src/__tests__/FilteredSearch.test.tsx +0 -26
- package/src/__tests__/Flash.test.tsx +0 -45
- package/src/__tests__/Flex.test.tsx +0 -58
- package/src/__tests__/FormGroup.test.tsx +0 -38
- package/src/__tests__/Grid.test.tsx +0 -82
- package/src/__tests__/Header.test.tsx +0 -49
- package/src/__tests__/Heading.test.tsx +0 -91
- package/src/__tests__/Label.test.tsx +0 -34
- package/src/__tests__/LabelGroup.test.tsx +0 -30
- package/src/__tests__/Link.test.tsx +0 -47
- package/src/__tests__/Merge.types.test.ts +0 -39
- package/src/__tests__/Overlay.test.tsx +0 -103
- package/src/__tests__/Pagehead.test.tsx +0 -23
- package/src/__tests__/Pagination/Pagination.test.tsx +0 -30
- package/src/__tests__/Pagination/PaginationModel.test.tsx +0 -133
- package/src/__tests__/Pagination/__snapshots__/Pagination.test.tsx.snap +0 -184
- package/src/__tests__/PointerBox.test.tsx +0 -34
- package/src/__tests__/Popover.test.tsx +0 -68
- package/src/__tests__/Portal.test.tsx +0 -103
- package/src/__tests__/Position.test.tsx +0 -117
- package/src/__tests__/ProgressBar.test.tsx +0 -40
- package/src/__tests__/SelectMenu.test.tsx +0 -142
- package/src/__tests__/SelectPanel.test.tsx +0 -63
- package/src/__tests__/SideNav.test.tsx +0 -62
- package/src/__tests__/Spinner.test.tsx +0 -42
- package/src/__tests__/StateLabel.test.tsx +0 -48
- package/src/__tests__/StyledOcticon.test.tsx +0 -26
- package/src/__tests__/SubNav.test.tsx +0 -50
- package/src/__tests__/SubNavLink.test.tsx +0 -31
- package/src/__tests__/TabNav.test.tsx +0 -32
- package/src/__tests__/Text.test.tsx +0 -78
- package/src/__tests__/TextInput.test.tsx +0 -49
- package/src/__tests__/TextInputWithTokens.test.tsx +0 -262
- package/src/__tests__/ThemeProvider.test.tsx +0 -441
- package/src/__tests__/Timeline.test.tsx +0 -58
- package/src/__tests__/Token.test.tsx +0 -118
- package/src/__tests__/Tooltip.test.tsx +0 -52
- package/src/__tests__/Truncate.test.tsx +0 -43
- package/src/__tests__/UnderlineNav.test.tsx +0 -58
- package/src/__tests__/UnderlineNavLink.test.tsx +0 -31
- package/src/__tests__/__snapshots__/ActionList.test.tsx.snap +0 -223
- package/src/__tests__/__snapshots__/ActionMenu.test.tsx.snap +0 -80
- package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +0 -332
- package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +0 -3414
- package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -19
- package/src/__tests__/__snapshots__/AvatarStack.test.tsx.snap +0 -377
- package/src/__tests__/__snapshots__/BorderBox.test.tsx.snap +0 -14
- package/src/__tests__/__snapshots__/Box.test.tsx.snap +0 -201
- package/src/__tests__/__snapshots__/BranchName.test.tsx.snap +0 -17
- package/src/__tests__/__snapshots__/Breadcrumbs.test.tsx.snap +0 -29
- package/src/__tests__/__snapshots__/BreadcrumbsItem.test.tsx.snap +0 -79
- package/src/__tests__/__snapshots__/Button.test.tsx.snap +0 -840
- package/src/__tests__/__snapshots__/Caret.test.tsx.snap +0 -373
- package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +0 -141
- package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +0 -64
- package/src/__tests__/__snapshots__/ConfirmationDialog.test.tsx.snap +0 -89
- package/src/__tests__/__snapshots__/CounterLabel.test.tsx.snap +0 -22
- package/src/__tests__/__snapshots__/Details.test.tsx.snap +0 -15
- package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +0 -200
- package/src/__tests__/__snapshots__/Dropdown.test.tsx.snap +0 -249
- package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +0 -106
- package/src/__tests__/__snapshots__/FilterList.test.tsx.snap +0 -13
- package/src/__tests__/__snapshots__/FilterListItem.test.tsx.snap +0 -80
- package/src/__tests__/__snapshots__/FilteredSearch.test.tsx.snap +0 -32
- package/src/__tests__/__snapshots__/Flash.test.tsx.snap +0 -32
- package/src/__tests__/__snapshots__/Flex.test.tsx.snap +0 -130
- package/src/__tests__/__snapshots__/FormGroup.test.tsx.snap +0 -25
- package/src/__tests__/__snapshots__/Grid.test.tsx.snap +0 -178
- package/src/__tests__/__snapshots__/Header.test.tsx.snap +0 -79
- package/src/__tests__/__snapshots__/Heading.test.tsx.snap +0 -13
- package/src/__tests__/__snapshots__/Label.test.tsx.snap +0 -74
- package/src/__tests__/__snapshots__/LabelGroup.test.tsx.snap +0 -15
- package/src/__tests__/__snapshots__/Link.test.tsx.snap +0 -213
- package/src/__tests__/__snapshots__/Pagehead.test.tsx.snap +0 -15
- package/src/__tests__/__snapshots__/PointerBox.test.tsx.snap +0 -174
- package/src/__tests__/__snapshots__/Popover.test.tsx.snap +0 -4687
- package/src/__tests__/__snapshots__/Position.test.tsx.snap +0 -44
- package/src/__tests__/__snapshots__/ProgressBar.test.tsx.snap +0 -53
- package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +0 -469
- package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +0 -123
- package/src/__tests__/__snapshots__/SideNav.test.tsx.snap +0 -143
- package/src/__tests__/__snapshots__/Spinner.test.tsx.snap +0 -33
- package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +0 -388
- package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +0 -25
- package/src/__tests__/__snapshots__/SubNav.test.tsx.snap +0 -44
- package/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap +0 -199
- package/src/__tests__/__snapshots__/TabNav.test.tsx.snap +0 -58
- package/src/__tests__/__snapshots__/Text.test.tsx.snap +0 -7
- package/src/__tests__/__snapshots__/TextInput.test.tsx.snap +0 -440
- package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +0 -5308
- package/src/__tests__/__snapshots__/ThemeProvider.test.tsx.snap +0 -15
- package/src/__tests__/__snapshots__/Timeline.test.tsx.snap +0 -159
- package/src/__tests__/__snapshots__/Token.test.tsx.snap +0 -3787
- package/src/__tests__/__snapshots__/Tooltip.test.tsx.snap +0 -227
- package/src/__tests__/__snapshots__/Truncate.test.tsx.snap +0 -17
- package/src/__tests__/__snapshots__/UnderlineNav.test.tsx.snap +0 -59
- package/src/__tests__/__snapshots__/UnderlineNavLink.test.tsx.snap +0 -130
- package/src/__tests__/behaviors/anchoredPosition.test.ts +0 -295
- package/src/__tests__/behaviors/focusTrap.test.tsx +0 -236
- package/src/__tests__/behaviors/focusZone.test.tsx +0 -549
- package/src/__tests__/behaviors/iterateFocusableElements.test.tsx +0 -61
- package/src/__tests__/behaviors/scrollIntoViewingArea.test.ts +0 -195
- package/src/__tests__/filterObject.test.ts +0 -54
- package/src/__tests__/hooks/useAnchoredPosition.test.tsx +0 -31
- package/src/__tests__/hooks/useOnEscapePress.test.tsx +0 -16
- package/src/__tests__/hooks/useOnOutsideClick.test.tsx +0 -48
- package/src/__tests__/hooks/useOpenAndCloseFocus.test.tsx +0 -48
- package/src/__tests__/hooks/useProvidedStateOrCreate.test.tsx +0 -39
- package/src/__tests__/theme.test.ts +0 -41
- package/src/__tests__/themeGet.test.ts +0 -15
- package/src/__tests__/useSafeTimeout.test.tsx +0 -36
- package/src/behaviors/anchoredPosition.ts +0 -442
- package/src/behaviors/focusTrap.ts +0 -184
- package/src/behaviors/focusZone.ts +0 -713
- package/src/behaviors/scrollIntoViewingArea.ts +0 -27
- package/src/constants.ts +0 -62
- package/src/hooks/index.ts +0 -11
- package/src/hooks/useAnchoredPosition.ts +0 -53
- package/src/hooks/useCombinedRefs.ts +0 -40
- package/src/hooks/useDetails.tsx +0 -54
- package/src/hooks/useDialog.ts +0 -121
- package/src/hooks/useFocusTrap.ts +0 -80
- package/src/hooks/useFocusZone.ts +0 -64
- package/src/hooks/useOnEscapePress.ts +0 -63
- package/src/hooks/useOnOutsideClick.tsx +0 -82
- package/src/hooks/useOpenAndCloseFocus.ts +0 -32
- package/src/hooks/useOverlay.tsx +0 -34
- package/src/hooks/useProvidedRefOrCreate.ts +0 -14
- package/src/hooks/useProvidedStateOrCreate.ts +0 -27
- package/src/hooks/useRenderForcingRef.ts +0 -22
- package/src/hooks/useResizeObserver.ts +0 -11
- package/src/hooks/useSafeTimeout.ts +0 -38
- package/src/hooks/useScrollFlash.ts +0 -21
- package/src/index.ts +0 -170
- package/src/polyfills/eventListenerSignal.ts +0 -66
- package/src/stories/ActionList.stories.tsx +0 -437
- package/src/stories/ActionMenu.stories.tsx +0 -322
- package/src/stories/AnchoredOverlay.stories.tsx +0 -117
- package/src/stories/Autocomplete.stories.tsx +0 -572
- package/src/stories/AvatarStack.stories.tsx +0 -37
- package/src/stories/Button.stories.tsx +0 -92
- package/src/stories/ConfirmationDialog.stories.tsx +0 -105
- package/src/stories/Dialog.stories.tsx +0 -240
- package/src/stories/DropdownMenu.stories.tsx +0 -84
- package/src/stories/IssueLabelToken.stories.tsx +0 -138
- package/src/stories/Overlay.stories.tsx +0 -213
- package/src/stories/Portal.stories.tsx +0 -109
- package/src/stories/ProfileToken.stories.tsx +0 -129
- package/src/stories/SelectPanel.stories.tsx +0 -353
- package/src/stories/TextInputWithTokens.stories.tsx +0 -146
- package/src/stories/ThemeProvider.stories.tsx +0 -104
- package/src/stories/Token.stories.tsx +0 -126
- package/src/stories/useAnchoredPosition.stories.tsx +0 -320
- package/src/stories/useFocusTrap.stories.tsx +0 -400
- package/src/stories/useFocusZone.stories.tsx +0 -663
- package/src/sx.ts +0 -9
- package/src/theme-preval.js +0 -79
- package/src/theme.ts +0 -3
- package/src/utils/deprecate.tsx +0 -73
- package/src/utils/isNumeric.tsx +0 -4
- package/src/utils/iterateFocusableElements.ts +0 -121
- package/src/utils/ssr.tsx +0 -1
- package/src/utils/test-deprecations.tsx +0 -19
- package/src/utils/test-helpers.tsx +0 -7
- package/src/utils/test-matchers.tsx +0 -109
- package/src/utils/testing.tsx +0 -242
- package/src/utils/theme.js +0 -64
- package/src/utils/types/AriaRole.ts +0 -71
- package/src/utils/types/ComponentProps.ts +0 -13
- package/src/utils/types/Flatten.ts +0 -4
- package/src/utils/types/MandateProps.ts +0 -19
- package/src/utils/types/Merge.ts +0 -20
- package/src/utils/types/index.ts +0 -5
- package/src/utils/uniqueId.ts +0 -6
- package/src/utils/userAgent.ts +0 -7
- package/stats.html +0 -3279
- package/tsconfig.build.json +0 -7
- package/tsconfig.json +0 -20
@@ -1,713 +0,0 @@
|
|
1
|
-
import {iterateFocusableElements} from '../utils/iterateFocusableElements'
|
2
|
-
import {polyfill as eventListenerSignalPolyfill} from '../polyfills/eventListenerSignal'
|
3
|
-
import {isMacOS} from '../utils/userAgent'
|
4
|
-
import {uniqueId} from '../utils/uniqueId'
|
5
|
-
|
6
|
-
eventListenerSignalPolyfill()
|
7
|
-
|
8
|
-
export type Direction = 'previous' | 'next' | 'start' | 'end'
|
9
|
-
|
10
|
-
export type FocusMovementKeys =
|
11
|
-
| 'ArrowLeft'
|
12
|
-
| 'ArrowDown'
|
13
|
-
| 'ArrowUp'
|
14
|
-
| 'ArrowRight'
|
15
|
-
| 'h'
|
16
|
-
| 'j'
|
17
|
-
| 'k'
|
18
|
-
| 'l'
|
19
|
-
| 'a'
|
20
|
-
| 's'
|
21
|
-
| 'w'
|
22
|
-
| 'd'
|
23
|
-
| 'Tab'
|
24
|
-
| 'Home'
|
25
|
-
| 'End'
|
26
|
-
| 'PageUp'
|
27
|
-
| 'PageDown'
|
28
|
-
|
29
|
-
// eslint-disable-next-line no-shadow
|
30
|
-
export enum FocusKeys {
|
31
|
-
// Left and right arrow keys (previous and next, respectively)
|
32
|
-
ArrowHorizontal = 0b000000001,
|
33
|
-
|
34
|
-
// Up and down arrow keys (previous and next, respectively)
|
35
|
-
ArrowVertical = 0b000000010,
|
36
|
-
|
37
|
-
// The "J" and "K" keys (next and previous, respectively)
|
38
|
-
JK = 0b000000100,
|
39
|
-
|
40
|
-
// The "H" and "L" keys (previous and next, respectively)
|
41
|
-
HL = 0b000001000,
|
42
|
-
|
43
|
-
// The Home and End keys (previous and next, respectively, to end)
|
44
|
-
HomeAndEnd = 0b000010000,
|
45
|
-
|
46
|
-
// The PgUp and PgDn keys (previous and next, respectively, to end)
|
47
|
-
PageUpDown = 0b100000000,
|
48
|
-
|
49
|
-
// The "W" and "S" keys (previous and next, respectively)
|
50
|
-
WS = 0b000100000,
|
51
|
-
|
52
|
-
// The "A" and "D" keys (previous and next, respectively)
|
53
|
-
AD = 0b001000000,
|
54
|
-
|
55
|
-
// The Tab key (next)
|
56
|
-
Tab = 0b010000000,
|
57
|
-
|
58
|
-
ArrowAll = FocusKeys.ArrowHorizontal | FocusKeys.ArrowVertical,
|
59
|
-
HJKL = FocusKeys.HL | FocusKeys.JK,
|
60
|
-
WASD = FocusKeys.WS | FocusKeys.AD,
|
61
|
-
All = FocusKeys.ArrowAll |
|
62
|
-
FocusKeys.HJKL |
|
63
|
-
FocusKeys.HomeAndEnd |
|
64
|
-
FocusKeys.PageUpDown |
|
65
|
-
FocusKeys.WASD |
|
66
|
-
FocusKeys.Tab
|
67
|
-
}
|
68
|
-
|
69
|
-
const KEY_TO_BIT = {
|
70
|
-
ArrowLeft: FocusKeys.ArrowHorizontal,
|
71
|
-
ArrowDown: FocusKeys.ArrowVertical,
|
72
|
-
ArrowUp: FocusKeys.ArrowVertical,
|
73
|
-
ArrowRight: FocusKeys.ArrowHorizontal,
|
74
|
-
h: FocusKeys.HL,
|
75
|
-
j: FocusKeys.JK,
|
76
|
-
k: FocusKeys.JK,
|
77
|
-
l: FocusKeys.HL,
|
78
|
-
a: FocusKeys.AD,
|
79
|
-
s: FocusKeys.WS,
|
80
|
-
w: FocusKeys.WS,
|
81
|
-
d: FocusKeys.AD,
|
82
|
-
Tab: FocusKeys.Tab,
|
83
|
-
Home: FocusKeys.HomeAndEnd,
|
84
|
-
End: FocusKeys.HomeAndEnd,
|
85
|
-
PageUp: FocusKeys.PageUpDown,
|
86
|
-
PageDown: FocusKeys.PageUpDown
|
87
|
-
} as {[k in FocusMovementKeys]: FocusKeys}
|
88
|
-
|
89
|
-
const KEY_TO_DIRECTION = {
|
90
|
-
ArrowLeft: 'previous',
|
91
|
-
ArrowDown: 'next',
|
92
|
-
ArrowUp: 'previous',
|
93
|
-
ArrowRight: 'next',
|
94
|
-
h: 'previous',
|
95
|
-
j: 'next',
|
96
|
-
k: 'previous',
|
97
|
-
l: 'next',
|
98
|
-
a: 'previous',
|
99
|
-
s: 'next',
|
100
|
-
w: 'previous',
|
101
|
-
d: 'next',
|
102
|
-
Tab: 'next',
|
103
|
-
Home: 'start',
|
104
|
-
End: 'end',
|
105
|
-
PageUp: 'start',
|
106
|
-
PageDown: 'end'
|
107
|
-
} as {[k in FocusMovementKeys]: Direction}
|
108
|
-
|
109
|
-
/**
|
110
|
-
* Options that control the behavior of the arrow focus behavior.
|
111
|
-
*/
|
112
|
-
export interface FocusZoneSettings {
|
113
|
-
/**
|
114
|
-
* Choose the behavior applied in cases where focus is currently at either the first or
|
115
|
-
* last element of the container.
|
116
|
-
*
|
117
|
-
* "stop" - do nothing and keep focus where it was
|
118
|
-
* "wrap" - wrap focus around to the first element from the last, or the last element from the first
|
119
|
-
*
|
120
|
-
* Default: "stop"
|
121
|
-
*/
|
122
|
-
focusOutBehavior?: 'stop' | 'wrap'
|
123
|
-
|
124
|
-
/**
|
125
|
-
* If set, this will be called to get the next focusable element. If this function
|
126
|
-
* returns null, we will try to determine the next direction ourselves. Use the
|
127
|
-
* `bindKeys` option to customize which keys are listened to.
|
128
|
-
*
|
129
|
-
* The function can accept a Direction, indicating the direction focus should move,
|
130
|
-
* the HTMLElement that was previously focused, and lastly the `KeyboardEvent` object
|
131
|
-
* created by the original `"keydown"` event.
|
132
|
-
*/
|
133
|
-
getNextFocusable?: (direction: Direction, from: Element | undefined, event: KeyboardEvent) => HTMLElement | undefined
|
134
|
-
|
135
|
-
/**
|
136
|
-
* Called to decide if a focusable element is allowed to participate in the arrow
|
137
|
-
* key focus behavior.
|
138
|
-
*
|
139
|
-
* By default, all focusable elements within the given container will participate
|
140
|
-
* in the arrow key focus behavior. If you need to withhold some elements from
|
141
|
-
* participation, implement this callback to return false for those elements.
|
142
|
-
*/
|
143
|
-
focusableElementFilter?: (element: HTMLElement) => boolean
|
144
|
-
|
145
|
-
/**
|
146
|
-
* Bit flags that identify keys that will be bound to. Each available key either
|
147
|
-
* moves focus to the "next" element or the "previous" element, so it is best
|
148
|
-
* to only bind the keys that make sense to move focus in your UI. Use the `FocusKeys`
|
149
|
-
* object to discover supported keys.
|
150
|
-
*
|
151
|
-
* Use the bitwise "OR" operator (`|`) to combine key types. For example,
|
152
|
-
* `FocusKeys.WASD | FocusKeys.HJKL` represents all of W, A, S, D, H, J, K, and L.
|
153
|
-
*
|
154
|
-
* A note on FocusKeys.PageUpDown: This behavior does not support paging, so by default
|
155
|
-
* using these keys will result in the same behavior as Home and End. To override this
|
156
|
-
* behavior, implement `getNextFocusable`.
|
157
|
-
*
|
158
|
-
* The default for this setting is `FocusKeys.ArrowVertical | FocusKeys.HomeAndEnd`, unless
|
159
|
-
* `getNextFocusable` is provided, in which case `FocusKeys.ArrowAll | FocusKeys.HomeAndEnd`
|
160
|
-
* is used as the default.
|
161
|
-
*/
|
162
|
-
bindKeys?: FocusKeys
|
163
|
-
|
164
|
-
/**
|
165
|
-
* If provided, this signal can be used to disable the behavior and remove any
|
166
|
-
* event listeners.
|
167
|
-
*/
|
168
|
-
abortSignal?: AbortSignal
|
169
|
-
|
170
|
-
/**
|
171
|
-
* If `activeDescendantControl` is supplied, do not move focus or alter `tabindex` on
|
172
|
-
* any element. Instead, manage `aria-activedescendant` according to the ARIA best
|
173
|
-
* practices guidelines.
|
174
|
-
* @see https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_focus_activedescendant
|
175
|
-
*
|
176
|
-
* The given `activeDescendantControl` will be given an `aria-controls` attribute that
|
177
|
-
* references the ID of the `container`. Additionally, it will be given an
|
178
|
-
* `aria-activedescendant` attribute that references the ID of the currently-active
|
179
|
-
* descendant.
|
180
|
-
*
|
181
|
-
* This element will retain DOM focus as arrow keys are pressed.
|
182
|
-
*/
|
183
|
-
activeDescendantControl?: HTMLElement
|
184
|
-
|
185
|
-
/**
|
186
|
-
* Called each time the active descendant changes. Note that either of the parameters
|
187
|
-
* may be undefined, e.g. when an element in the container first becomes active, or
|
188
|
-
* when the controlling element becomes unfocused.
|
189
|
-
*/
|
190
|
-
onActiveDescendantChanged?: (
|
191
|
-
newActiveDescendant: HTMLElement | undefined,
|
192
|
-
previousActiveDescendant: HTMLElement | undefined,
|
193
|
-
directlyActivated: boolean
|
194
|
-
) => void
|
195
|
-
|
196
|
-
/**
|
197
|
-
* This option allows customization of the behavior that determines which of the
|
198
|
-
* focusable elements should be focused when focus enters the container via the Tab key.
|
199
|
-
*
|
200
|
-
* When set to "first", whenever focus enters the container via Tab, we will focus the
|
201
|
-
* first focusable element. When set to "previous", the most recently focused element
|
202
|
-
* will be focused (fallback to first if there was no previous).
|
203
|
-
*
|
204
|
-
* The "closest" strategy works like "first", except either the first or the last element
|
205
|
-
* of the container will be focused, depending on the direction from which focus comes.
|
206
|
-
*
|
207
|
-
* If a function is provided, this function should return the HTMLElement intended
|
208
|
-
* to receive focus. This is useful if you want to focus the currently "selected"
|
209
|
-
* item or element.
|
210
|
-
*
|
211
|
-
* Default: "previous"
|
212
|
-
*
|
213
|
-
* For more information, @see https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_general_within
|
214
|
-
*/
|
215
|
-
focusInStrategy?: 'first' | 'closest' | 'previous' | ((previousFocusedElement: Element) => HTMLElement | undefined)
|
216
|
-
}
|
217
|
-
|
218
|
-
function getDirection(keyboardEvent: KeyboardEvent) {
|
219
|
-
const direction = KEY_TO_DIRECTION[keyboardEvent.key as keyof typeof KEY_TO_DIRECTION]
|
220
|
-
if (keyboardEvent.key === 'Tab' && keyboardEvent.shiftKey) {
|
221
|
-
return 'previous'
|
222
|
-
}
|
223
|
-
const isMac = isMacOS()
|
224
|
-
if ((isMac && keyboardEvent.metaKey) || (!isMac && keyboardEvent.ctrlKey)) {
|
225
|
-
if (keyboardEvent.key === 'ArrowLeft' || keyboardEvent.key === 'ArrowUp') {
|
226
|
-
return 'start'
|
227
|
-
} else if (keyboardEvent.key === 'ArrowRight' || keyboardEvent.key === 'ArrowDown') {
|
228
|
-
return 'end'
|
229
|
-
}
|
230
|
-
}
|
231
|
-
return direction
|
232
|
-
}
|
233
|
-
|
234
|
-
/**
|
235
|
-
* There are some situations where we do not want various keys to affect focus. This function
|
236
|
-
* checks for those situations.
|
237
|
-
* 1. Home and End should not move focus when a text input or textarea is active
|
238
|
-
* 2. Keys that would normally type characters into an input or navigate a select element should be ignored
|
239
|
-
* 3. The down arrow sometimes should not move focus when a select is active since that sometimes invokes the dropdown
|
240
|
-
* 4. Page Up and Page Down within a textarea should not have any effect
|
241
|
-
* 5. When in a text input or textarea, left should only move focus if the cursor is at the beginning of the input
|
242
|
-
* 6. When in a text input or textarea, right should only move focus if the cursor is at the end of the input
|
243
|
-
* 7. When in a textarea, up and down should only move focus if cursor is at the beginning or end, respectively.
|
244
|
-
* @param keyboardEvent
|
245
|
-
* @param activeElement
|
246
|
-
*/
|
247
|
-
function shouldIgnoreFocusHandling(keyboardEvent: KeyboardEvent, activeElement: Element | null) {
|
248
|
-
const key = keyboardEvent.key
|
249
|
-
|
250
|
-
// Get the number of characters in `key`, accounting for double-wide UTF-16 chars. If keyLength
|
251
|
-
// is 1, we can assume it's a "printable" character. Otherwise it's likely a control character.
|
252
|
-
// One exception is the Tab key, which is technically printable, but browsers generally assign
|
253
|
-
// its function to move focus rather than type a <TAB> character.
|
254
|
-
const keyLength = [...key].length
|
255
|
-
|
256
|
-
const isTextInput =
|
257
|
-
(activeElement instanceof HTMLInputElement && activeElement.type === 'text') ||
|
258
|
-
activeElement instanceof HTMLTextAreaElement
|
259
|
-
|
260
|
-
// If we would normally type a character into an input, ignore
|
261
|
-
// Also, Home and End keys should never affect focus when in a text input
|
262
|
-
if (isTextInput && (keyLength === 1 || key === 'Home' || key === 'End')) {
|
263
|
-
return true
|
264
|
-
}
|
265
|
-
|
266
|
-
// Some situations we want to ignore with <select> elements
|
267
|
-
if (activeElement instanceof HTMLSelectElement) {
|
268
|
-
// Regular typeable characters change the selection, so ignore those
|
269
|
-
if (keyLength === 1) {
|
270
|
-
return true
|
271
|
-
}
|
272
|
-
// On macOS, bare ArrowDown opens the select, so ignore that
|
273
|
-
if (key === 'ArrowDown' && isMacOS() && !keyboardEvent.metaKey) {
|
274
|
-
return true
|
275
|
-
}
|
276
|
-
// On other platforms, Alt+ArrowDown opens the select, so ignore that
|
277
|
-
if (key === 'ArrowDown' && !isMacOS() && keyboardEvent.altKey) {
|
278
|
-
return true
|
279
|
-
}
|
280
|
-
}
|
281
|
-
|
282
|
-
// Ignore page up and page down for textareas
|
283
|
-
if (activeElement instanceof HTMLTextAreaElement && (key === 'PageUp' || key === 'PageDown')) {
|
284
|
-
return true
|
285
|
-
}
|
286
|
-
|
287
|
-
if (isTextInput) {
|
288
|
-
const textInput = activeElement as HTMLInputElement | HTMLTextAreaElement
|
289
|
-
const cursorAtStart = textInput.selectionStart === 0 && textInput.selectionEnd === 0
|
290
|
-
const cursorAtEnd =
|
291
|
-
textInput.selectionStart === textInput.value.length && textInput.selectionEnd === textInput.value.length
|
292
|
-
|
293
|
-
// When in a text area or text input, only move focus left/right if at beginning/end of the field
|
294
|
-
if (key === 'ArrowLeft' && !cursorAtStart) {
|
295
|
-
return true
|
296
|
-
}
|
297
|
-
if (key === 'ArrowRight' && !cursorAtEnd) {
|
298
|
-
return true
|
299
|
-
}
|
300
|
-
|
301
|
-
// When in a text area, only move focus up/down if at beginning/end of the field
|
302
|
-
if (textInput instanceof HTMLTextAreaElement) {
|
303
|
-
if (key === 'ArrowUp' && !cursorAtStart) {
|
304
|
-
return true
|
305
|
-
}
|
306
|
-
if (key === 'ArrowDown' && !cursorAtEnd) {
|
307
|
-
return true
|
308
|
-
}
|
309
|
-
}
|
310
|
-
}
|
311
|
-
|
312
|
-
return false
|
313
|
-
}
|
314
|
-
|
315
|
-
export const isActiveDescendantAttribute = 'data-is-active-descendant'
|
316
|
-
/**
|
317
|
-
* A value of activated-directly for data-is-active-descendant indicates the descendant was activated
|
318
|
-
* by a manual user interaction with intent to move active descendant. This usually translates to the
|
319
|
-
* user pressing one of the bound keys (up/down arrow, etc) to move through the focus zone. This is
|
320
|
-
* intended to be roughly equivalent to the :focus-visible pseudo-class
|
321
|
-
**/
|
322
|
-
export const activeDescendantActivatedDirectly = 'activated-directly'
|
323
|
-
/**
|
324
|
-
* A value of activated-indirectly for data-is-active-descendant indicates the descendant was activated
|
325
|
-
* implicitly, and not by a direct key press. This includes focus zone being created from scratch, focusable
|
326
|
-
* elements being added/removed, and mouseover events. This is intended to be roughly equivalent
|
327
|
-
* to :focus:not(:focus-visible)
|
328
|
-
**/
|
329
|
-
export const activeDescendantActivatedIndirectly = 'activated-indirectly'
|
330
|
-
export const hasActiveDescendantAttribute = 'data-has-active-descendant'
|
331
|
-
|
332
|
-
/**
|
333
|
-
* Sets up the arrow key focus behavior for all focusable elements in the given `container`.
|
334
|
-
* @param container
|
335
|
-
* @param settings
|
336
|
-
* @returns
|
337
|
-
*/
|
338
|
-
export function focusZone(container: HTMLElement, settings?: FocusZoneSettings): AbortController {
|
339
|
-
const focusableElements: HTMLElement[] = []
|
340
|
-
const savedTabIndex = new WeakMap<HTMLElement, string | null>()
|
341
|
-
const bindKeys =
|
342
|
-
settings?.bindKeys ??
|
343
|
-
(settings?.getNextFocusable ? FocusKeys.ArrowAll : FocusKeys.ArrowVertical) | FocusKeys.HomeAndEnd
|
344
|
-
const focusOutBehavior = settings?.focusOutBehavior ?? 'stop'
|
345
|
-
const focusInStrategy = settings?.focusInStrategy ?? 'previous'
|
346
|
-
const activeDescendantControl = settings?.activeDescendantControl
|
347
|
-
const activeDescendantCallback = settings?.onActiveDescendantChanged
|
348
|
-
let currentFocusedElement: HTMLElement | undefined
|
349
|
-
|
350
|
-
function getFirstFocusableElement() {
|
351
|
-
return focusableElements[0] as HTMLElement | undefined
|
352
|
-
}
|
353
|
-
|
354
|
-
function isActiveDescendantInputFocused() {
|
355
|
-
return document.activeElement === activeDescendantControl
|
356
|
-
}
|
357
|
-
|
358
|
-
function updateFocusedElement(to?: HTMLElement, directlyActivated = false) {
|
359
|
-
const from = currentFocusedElement
|
360
|
-
currentFocusedElement = to
|
361
|
-
|
362
|
-
if (activeDescendantControl) {
|
363
|
-
if (to && isActiveDescendantInputFocused()) {
|
364
|
-
setActiveDescendant(from, to, directlyActivated)
|
365
|
-
} else {
|
366
|
-
clearActiveDescendant()
|
367
|
-
}
|
368
|
-
|
369
|
-
return
|
370
|
-
}
|
371
|
-
|
372
|
-
if (from && from !== to && savedTabIndex.has(from)) {
|
373
|
-
from.setAttribute('tabindex', '-1')
|
374
|
-
}
|
375
|
-
|
376
|
-
to?.setAttribute('tabindex', '0')
|
377
|
-
}
|
378
|
-
|
379
|
-
function setActiveDescendant(from: HTMLElement | undefined, to: HTMLElement, directlyActivated = false) {
|
380
|
-
if (!to.id) {
|
381
|
-
to.setAttribute('id', uniqueId())
|
382
|
-
}
|
383
|
-
|
384
|
-
if (from && from !== to) {
|
385
|
-
from.removeAttribute(isActiveDescendantAttribute)
|
386
|
-
}
|
387
|
-
|
388
|
-
if (
|
389
|
-
!activeDescendantControl ||
|
390
|
-
(!directlyActivated && activeDescendantControl.getAttribute('aria-activedescendant') === to.id)
|
391
|
-
) {
|
392
|
-
// prevent active descendant callback from being called repeatedly if the same element is activated (e.g. via mousemove)
|
393
|
-
return
|
394
|
-
}
|
395
|
-
|
396
|
-
activeDescendantControl.setAttribute('aria-activedescendant', to.id)
|
397
|
-
container.setAttribute(hasActiveDescendantAttribute, to.id)
|
398
|
-
to.setAttribute(
|
399
|
-
isActiveDescendantAttribute,
|
400
|
-
directlyActivated ? activeDescendantActivatedDirectly : activeDescendantActivatedIndirectly
|
401
|
-
)
|
402
|
-
activeDescendantCallback?.(to, from, directlyActivated)
|
403
|
-
}
|
404
|
-
|
405
|
-
function clearActiveDescendant(previouslyActiveElement = currentFocusedElement) {
|
406
|
-
if (focusInStrategy === 'first') {
|
407
|
-
currentFocusedElement = undefined
|
408
|
-
}
|
409
|
-
|
410
|
-
activeDescendantControl?.removeAttribute('aria-activedescendant')
|
411
|
-
container.removeAttribute(hasActiveDescendantAttribute)
|
412
|
-
previouslyActiveElement?.removeAttribute(isActiveDescendantAttribute)
|
413
|
-
activeDescendantCallback?.(undefined, previouslyActiveElement, false)
|
414
|
-
}
|
415
|
-
|
416
|
-
function beginFocusManagement(...elements: HTMLElement[]) {
|
417
|
-
const filteredElements = elements.filter(e => settings?.focusableElementFilter?.(e) ?? true)
|
418
|
-
if (filteredElements.length === 0) {
|
419
|
-
return
|
420
|
-
}
|
421
|
-
// Insert all elements atomically. Assume that all passed elements are well-ordered.
|
422
|
-
const insertIndex = focusableElements.findIndex(
|
423
|
-
e => (e.compareDocumentPosition(filteredElements[0]) & Node.DOCUMENT_POSITION_PRECEDING) > 0
|
424
|
-
)
|
425
|
-
focusableElements.splice(insertIndex === -1 ? focusableElements.length : insertIndex, 0, ...filteredElements)
|
426
|
-
for (const element of filteredElements) {
|
427
|
-
// Set tabindex="-1" on all tabbable elements, but save the original
|
428
|
-
// value in case we need to disable the behavior
|
429
|
-
if (!savedTabIndex.has(element)) {
|
430
|
-
savedTabIndex.set(element, element.getAttribute('tabindex'))
|
431
|
-
}
|
432
|
-
element.setAttribute('tabindex', '-1')
|
433
|
-
}
|
434
|
-
|
435
|
-
if (!currentFocusedElement) {
|
436
|
-
updateFocusedElement(getFirstFocusableElement())
|
437
|
-
}
|
438
|
-
}
|
439
|
-
|
440
|
-
function endFocusManagement(...elements: HTMLElement[]) {
|
441
|
-
for (const element of elements) {
|
442
|
-
const focusableElementIndex = focusableElements.indexOf(element)
|
443
|
-
if (focusableElementIndex >= 0) {
|
444
|
-
focusableElements.splice(focusableElementIndex, 1)
|
445
|
-
}
|
446
|
-
const savedIndex = savedTabIndex.get(element)
|
447
|
-
if (savedIndex !== undefined) {
|
448
|
-
if (savedIndex === null) {
|
449
|
-
element.removeAttribute('tabindex')
|
450
|
-
} else {
|
451
|
-
element.setAttribute('tabindex', savedIndex)
|
452
|
-
}
|
453
|
-
savedTabIndex.delete(element)
|
454
|
-
}
|
455
|
-
|
456
|
-
// If removing the last-focused element, move focus to the first element in the list.
|
457
|
-
if (element === currentFocusedElement) {
|
458
|
-
const nextElementToFocus = getFirstFocusableElement()
|
459
|
-
updateFocusedElement(nextElementToFocus)
|
460
|
-
}
|
461
|
-
}
|
462
|
-
}
|
463
|
-
|
464
|
-
// Take all tabbable elements within container under management
|
465
|
-
beginFocusManagement(...iterateFocusableElements(container))
|
466
|
-
|
467
|
-
// Open the first tabbable element for tabbing
|
468
|
-
updateFocusedElement(getFirstFocusableElement())
|
469
|
-
|
470
|
-
// If the DOM structure of the container changes, make sure we keep our state up-to-date
|
471
|
-
// with respect to the focusable elements cache and its order
|
472
|
-
const observer = new MutationObserver(mutations => {
|
473
|
-
// Perform all removals first, in case element order has simply changed
|
474
|
-
for (const mutation of mutations) {
|
475
|
-
for (const removedNode of mutation.removedNodes) {
|
476
|
-
if (removedNode instanceof HTMLElement) {
|
477
|
-
endFocusManagement(...iterateFocusableElements(removedNode))
|
478
|
-
}
|
479
|
-
}
|
480
|
-
}
|
481
|
-
for (const mutation of mutations) {
|
482
|
-
for (const addedNode of mutation.addedNodes) {
|
483
|
-
if (addedNode instanceof HTMLElement) {
|
484
|
-
beginFocusManagement(...iterateFocusableElements(addedNode))
|
485
|
-
}
|
486
|
-
}
|
487
|
-
}
|
488
|
-
})
|
489
|
-
|
490
|
-
observer.observe(container, {
|
491
|
-
subtree: true,
|
492
|
-
childList: true
|
493
|
-
})
|
494
|
-
|
495
|
-
const controller = new AbortController()
|
496
|
-
const signal = settings?.abortSignal ?? controller.signal
|
497
|
-
|
498
|
-
signal.addEventListener('abort', () => {
|
499
|
-
// Clean up any modifications
|
500
|
-
endFocusManagement(...focusableElements)
|
501
|
-
})
|
502
|
-
|
503
|
-
let elementIndexFocusedByClick: number | undefined = undefined
|
504
|
-
container.addEventListener(
|
505
|
-
'mousedown',
|
506
|
-
event => {
|
507
|
-
// Since focusin is only called when focus changes, we need to make sure the clicked
|
508
|
-
// element isn't already focused.
|
509
|
-
if (event.target instanceof HTMLElement && event.target !== document.activeElement) {
|
510
|
-
elementIndexFocusedByClick = focusableElements.indexOf(event.target)
|
511
|
-
}
|
512
|
-
},
|
513
|
-
{signal}
|
514
|
-
)
|
515
|
-
|
516
|
-
if (activeDescendantControl) {
|
517
|
-
container.addEventListener('focusin', event => {
|
518
|
-
if (event.target instanceof HTMLElement && focusableElements.includes(event.target)) {
|
519
|
-
// Move focus to the activeDescendantControl if one of the descendants is focused
|
520
|
-
activeDescendantControl.focus()
|
521
|
-
updateFocusedElement(event.target)
|
522
|
-
}
|
523
|
-
})
|
524
|
-
container.addEventListener(
|
525
|
-
'mousemove',
|
526
|
-
({target}) => {
|
527
|
-
if (!(target instanceof Node)) {
|
528
|
-
return
|
529
|
-
}
|
530
|
-
|
531
|
-
const focusableElement = focusableElements.find(element => element.contains(target))
|
532
|
-
|
533
|
-
if (focusableElement) {
|
534
|
-
updateFocusedElement(focusableElement)
|
535
|
-
}
|
536
|
-
},
|
537
|
-
{signal, capture: true}
|
538
|
-
)
|
539
|
-
|
540
|
-
// Listeners specifically on the controlling element
|
541
|
-
activeDescendantControl.addEventListener('focusin', () => {
|
542
|
-
// Focus moved into the active descendant input. Activate current or first descendant.
|
543
|
-
if (!currentFocusedElement) {
|
544
|
-
updateFocusedElement(getFirstFocusableElement())
|
545
|
-
} else {
|
546
|
-
setActiveDescendant(undefined, currentFocusedElement)
|
547
|
-
}
|
548
|
-
})
|
549
|
-
activeDescendantControl.addEventListener('focusout', () => {
|
550
|
-
clearActiveDescendant()
|
551
|
-
})
|
552
|
-
} else {
|
553
|
-
// This is called whenever focus enters an element in the container
|
554
|
-
container.addEventListener(
|
555
|
-
'focusin',
|
556
|
-
event => {
|
557
|
-
if (event.target instanceof HTMLElement) {
|
558
|
-
// If a click initiated the focus movement, we always want to set our internal state
|
559
|
-
// to reflect the clicked element as the currently focused one.
|
560
|
-
if (elementIndexFocusedByClick !== undefined) {
|
561
|
-
if (elementIndexFocusedByClick >= 0) {
|
562
|
-
if (focusableElements[elementIndexFocusedByClick] !== currentFocusedElement) {
|
563
|
-
updateFocusedElement(focusableElements[elementIndexFocusedByClick])
|
564
|
-
}
|
565
|
-
}
|
566
|
-
elementIndexFocusedByClick = undefined
|
567
|
-
} else {
|
568
|
-
// Set tab indexes and internal state based on the focus handling strategy
|
569
|
-
if (focusInStrategy === 'previous') {
|
570
|
-
updateFocusedElement(event.target)
|
571
|
-
} else if (focusInStrategy === 'closest' || focusInStrategy === 'first') {
|
572
|
-
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
573
|
-
// Regardless of the previously focused element, if we're coming from outside the
|
574
|
-
// container, put focus onto the first encountered element (from above, it's The
|
575
|
-
// first element of the container; from below, it's the last). If the
|
576
|
-
// focusInStrategy is set to "first", lastKeyboardFocusDirection will always
|
577
|
-
// be undefined.
|
578
|
-
const targetElementIndex = lastKeyboardFocusDirection === 'previous' ? focusableElements.length - 1 : 0
|
579
|
-
const targetElement = focusableElements[targetElementIndex] as HTMLElement | undefined
|
580
|
-
targetElement?.focus()
|
581
|
-
return
|
582
|
-
} else {
|
583
|
-
updateFocusedElement(event.target)
|
584
|
-
}
|
585
|
-
} else if (typeof focusInStrategy === 'function') {
|
586
|
-
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
587
|
-
const elementToFocus = focusInStrategy(event.relatedTarget)
|
588
|
-
const requestedFocusElementIndex = elementToFocus ? focusableElements.indexOf(elementToFocus) : -1
|
589
|
-
if (requestedFocusElementIndex >= 0 && elementToFocus instanceof HTMLElement) {
|
590
|
-
// Since we are calling focus() this handler will run again synchronously. Therefore,
|
591
|
-
// we don't want to let this invocation finish since it will clobber the value of
|
592
|
-
// currentFocusedElement.
|
593
|
-
elementToFocus.focus()
|
594
|
-
return
|
595
|
-
} else {
|
596
|
-
// eslint-disable-next-line no-console
|
597
|
-
console.warn('Element requested is not a known focusable element.')
|
598
|
-
}
|
599
|
-
} else {
|
600
|
-
updateFocusedElement(event.target)
|
601
|
-
}
|
602
|
-
}
|
603
|
-
}
|
604
|
-
}
|
605
|
-
lastKeyboardFocusDirection = undefined
|
606
|
-
},
|
607
|
-
{signal}
|
608
|
-
)
|
609
|
-
}
|
610
|
-
|
611
|
-
const keyboardEventRecipient = activeDescendantControl ?? container
|
612
|
-
|
613
|
-
// If the strategy is "closest", we need to capture the direction that the user
|
614
|
-
// is trying to move focus before our focusin handler is executed.
|
615
|
-
let lastKeyboardFocusDirection: Direction | undefined = undefined
|
616
|
-
if (focusInStrategy === 'closest') {
|
617
|
-
document.addEventListener(
|
618
|
-
'keydown',
|
619
|
-
event => {
|
620
|
-
if (event.key === 'Tab') {
|
621
|
-
lastKeyboardFocusDirection = getDirection(event)
|
622
|
-
}
|
623
|
-
},
|
624
|
-
{signal, capture: true}
|
625
|
-
)
|
626
|
-
}
|
627
|
-
|
628
|
-
function getCurrentFocusedIndex() {
|
629
|
-
if (!currentFocusedElement) {
|
630
|
-
return 0
|
631
|
-
}
|
632
|
-
|
633
|
-
const focusedIndex = focusableElements.indexOf(currentFocusedElement)
|
634
|
-
const fallbackIndex = currentFocusedElement === container ? -1 : 0
|
635
|
-
|
636
|
-
return focusedIndex !== -1 ? focusedIndex : fallbackIndex
|
637
|
-
}
|
638
|
-
|
639
|
-
// "keydown" is the event that triggers DOM focus change, so that is what we use here
|
640
|
-
keyboardEventRecipient.addEventListener(
|
641
|
-
'keydown',
|
642
|
-
event => {
|
643
|
-
if (event.key in KEY_TO_DIRECTION) {
|
644
|
-
const keyBit = KEY_TO_BIT[event.key as keyof typeof KEY_TO_BIT]
|
645
|
-
// Check if the pressed key (keyBit) is one that is being used for focus (bindKeys)
|
646
|
-
if (
|
647
|
-
!event.defaultPrevented &&
|
648
|
-
(keyBit & bindKeys) > 0 &&
|
649
|
-
!shouldIgnoreFocusHandling(event, document.activeElement)
|
650
|
-
) {
|
651
|
-
// Moving forward or backward?
|
652
|
-
const direction = getDirection(event)
|
653
|
-
|
654
|
-
let nextElementToFocus: HTMLElement | undefined = undefined
|
655
|
-
|
656
|
-
// If there is a custom function that retrieves the next focusable element, try calling that first.
|
657
|
-
if (settings?.getNextFocusable) {
|
658
|
-
nextElementToFocus = settings.getNextFocusable(direction, document.activeElement ?? undefined, event)
|
659
|
-
}
|
660
|
-
if (!nextElementToFocus) {
|
661
|
-
const lastFocusedIndex = getCurrentFocusedIndex()
|
662
|
-
let nextFocusedIndex = lastFocusedIndex
|
663
|
-
if (direction === 'previous') {
|
664
|
-
nextFocusedIndex -= 1
|
665
|
-
} else if (direction === 'start') {
|
666
|
-
nextFocusedIndex = 0
|
667
|
-
} else if (direction === 'next') {
|
668
|
-
nextFocusedIndex += 1
|
669
|
-
} else {
|
670
|
-
// end
|
671
|
-
nextFocusedIndex = focusableElements.length - 1
|
672
|
-
}
|
673
|
-
|
674
|
-
if (nextFocusedIndex < 0) {
|
675
|
-
// Tab should never cause focus to wrap. Use focusTrap for that behavior.
|
676
|
-
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
677
|
-
nextFocusedIndex = focusableElements.length - 1
|
678
|
-
} else {
|
679
|
-
nextFocusedIndex = 0
|
680
|
-
}
|
681
|
-
}
|
682
|
-
if (nextFocusedIndex >= focusableElements.length) {
|
683
|
-
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
684
|
-
nextFocusedIndex = 0
|
685
|
-
} else {
|
686
|
-
nextFocusedIndex = focusableElements.length - 1
|
687
|
-
}
|
688
|
-
}
|
689
|
-
if (lastFocusedIndex !== nextFocusedIndex) {
|
690
|
-
nextElementToFocus = focusableElements[nextFocusedIndex]
|
691
|
-
}
|
692
|
-
}
|
693
|
-
|
694
|
-
if (activeDescendantControl) {
|
695
|
-
updateFocusedElement(nextElementToFocus || currentFocusedElement, true)
|
696
|
-
} else if (nextElementToFocus) {
|
697
|
-
lastKeyboardFocusDirection = direction
|
698
|
-
|
699
|
-
// updateFocusedElement will be called implicitly when focus moves, as long as the event isn't prevented somehow
|
700
|
-
nextElementToFocus.focus()
|
701
|
-
}
|
702
|
-
// Tab should always allow escaping from this container, so only
|
703
|
-
// preventDefault if tab key press already resulted in a focus movement
|
704
|
-
if (event.key !== 'Tab' || nextElementToFocus) {
|
705
|
-
event.preventDefault()
|
706
|
-
}
|
707
|
-
}
|
708
|
-
}
|
709
|
-
},
|
710
|
-
{signal}
|
711
|
-
)
|
712
|
-
return controller
|
713
|
-
}
|