@primer/components 31.2.1-rc.f73a0f8c → 32.0.1-rc.44e3df9b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +2 -5
- package/.github/workflows/release.yml +0 -1
- package/.github/workflows/release_canary.yml +0 -1
- package/CHANGELOG.md +74 -4
- package/dist/browser.esm.js +299 -361
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +294 -356
- package/dist/browser.umd.js.map +1 -1
- package/docs/content/ActionList2.mdx +8 -7
- package/docs/content/Breadcrumbs.md +11 -16
- package/docs/content/Buttons.md +7 -17
- package/docs/content/CircleBadge.md +0 -10
- package/docs/content/CounterLabel.md +0 -10
- package/docs/content/Dialog.md +15 -18
- package/docs/content/Dialog2.mdx +1 -0
- package/docs/content/Dropdown.md +11 -18
- package/docs/content/FilterList.md +10 -17
- package/docs/content/FilteredSearch.md +4 -11
- package/docs/content/Flash.md +5 -14
- package/docs/content/FormGroup.md +9 -17
- package/docs/content/Header.md +14 -16
- package/docs/content/Label.md +32 -25
- package/docs/content/LabelGroup.md +4 -14
- package/docs/content/Link.md +8 -17
- package/docs/content/Overlay.mdx +1 -10
- package/docs/content/Pagehead.md +4 -13
- package/docs/content/Pagination.md +10 -19
- package/docs/content/Popover.md +11 -19
- package/docs/content/SelectMenu.md +50 -114
- package/docs/content/SideNav.md +15 -23
- package/docs/content/StateLabel.md +5 -14
- package/docs/content/StyledOcticon.md +7 -16
- package/docs/content/SubNav.md +19 -21
- package/docs/content/TabNav.md +10 -18
- package/docs/content/Timeline.md +34 -24
- package/docs/content/Tooltip.md +8 -17
- package/docs/content/Truncate.md +7 -16
- package/docs/content/UnderlineNav.md +13 -21
- package/docs/package-lock.json +269 -158
- package/docs/package.json +1 -1
- package/lib/ActionList/index.js +23 -12
- package/lib/ActionList2/Group.d.ts +28 -2
- package/lib/ActionList2/Group.js +55 -6
- package/lib/ActionList2/List.d.ts +1 -1
- package/lib/ActionList2/index.js +41 -23
- package/lib/AnchoredOverlay/index.js +12 -4
- package/lib/Autocomplete/Autocomplete.d.ts +3 -3
- package/lib/Autocomplete/AutocompleteInput.d.ts +3 -3
- package/lib/Autocomplete/index.js +14 -7
- package/lib/Breadcrumbs.d.ts +8 -7
- package/lib/Breadcrumbs.js +7 -12
- package/lib/Button/Button.d.ts +2 -3
- package/lib/Button/Button.js +2 -6
- package/lib/Button/ButtonBase.d.ts +5 -8
- package/lib/Button/ButtonBase.js +1 -5
- package/lib/Button/ButtonClose.d.ts +3 -46
- package/lib/Button/ButtonClose.js +1 -1
- package/lib/Button/ButtonDanger.d.ts +2 -3
- package/lib/Button/ButtonDanger.js +2 -6
- package/lib/Button/ButtonInvisible.d.ts +2 -3
- package/lib/Button/ButtonInvisible.js +2 -6
- package/lib/Button/ButtonOutline.d.ts +2 -3
- package/lib/Button/ButtonOutline.js +2 -6
- package/lib/Button/ButtonPrimary.d.ts +2 -3
- package/lib/Button/ButtonPrimary.js +2 -6
- package/lib/Button/ButtonTableList.d.ts +1 -2
- package/lib/Button/ButtonTableList.js +1 -1
- package/lib/Button/index.js +70 -21
- package/lib/CircleBadge.d.ts +4 -5
- package/lib/CircleBadge.js +1 -1
- package/lib/CircleOcticon.d.ts +1 -1
- package/lib/CounterLabel.d.ts +1 -2
- package/lib/CounterLabel.js +1 -1
- package/lib/Dialog/Dialog.d.ts +5 -9
- package/lib/Dialog/Dialog.js +17 -11
- package/lib/Dialog.d.ts +4 -5
- package/lib/Dialog.js +1 -1
- package/lib/Dropdown.d.ts +10 -99
- package/lib/Dropdown.js +3 -3
- package/lib/DropdownMenu/DropdownButton.d.ts +3 -47
- package/lib/DropdownMenu/DropdownButton.js +3 -1
- package/lib/DropdownMenu/index.js +20 -6
- package/lib/DropdownStyles.js +26 -18
- package/lib/FilterList.d.ts +264 -303
- package/lib/FilterList.js +2 -6
- package/lib/FilteredActionList/index.js +12 -4
- package/lib/FilteredSearch.d.ts +1 -2
- package/lib/FilteredSearch.js +1 -1
- package/lib/Flash.d.ts +1 -2
- package/lib/Flash.js +1 -1
- package/lib/FormGroup.d.ts +4 -5
- package/lib/FormGroup.js +2 -2
- package/lib/Header.d.ts +6 -7
- package/lib/Header.js +4 -4
- package/lib/Label.d.ts +1 -2
- package/lib/Label.js +2 -3
- package/lib/LabelGroup.d.ts +1 -2
- package/lib/LabelGroup.js +1 -1
- package/lib/Link.d.ts +1 -2
- package/lib/Link.js +1 -1
- package/lib/NewButton/button.js +34 -42
- package/lib/NewButton/index.js +12 -5
- package/lib/NewButton/types.js +1 -2
- package/lib/Overlay.d.ts +11 -10
- package/lib/Overlay.js +3 -4
- package/lib/Pagehead.d.ts +1 -2
- package/lib/Pagehead.js +1 -1
- package/lib/Pagination/Pagination.js +1 -1
- package/lib/Pagination/index.js +12 -6
- package/lib/Popover.d.ts +4 -5
- package/lib/Popover.js +4 -5
- package/lib/Portal/index.js +16 -5
- package/lib/Position.d.ts +4 -4
- package/lib/SelectMenu/SelectMenu.d.ts +21 -189
- package/lib/SelectMenu/SelectMenu.js +1 -3
- package/lib/SelectMenu/SelectMenuDivider.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuDivider.js +1 -1
- package/lib/SelectMenu/SelectMenuFilter.js +1 -1
- package/lib/SelectMenu/SelectMenuFooter.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuFooter.js +1 -1
- package/lib/SelectMenu/SelectMenuHeader.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuHeader.js +1 -1
- package/lib/SelectMenu/SelectMenuItem.d.ts +2 -3
- package/lib/SelectMenu/SelectMenuItem.js +1 -1
- package/lib/SelectMenu/SelectMenuList.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuList.js +1 -1
- package/lib/SelectMenu/SelectMenuLoadingAnimation.d.ts +2 -2
- package/lib/SelectMenu/SelectMenuLoadingAnimation.js +3 -1
- package/lib/SelectMenu/SelectMenuModal.d.ts +2 -3
- package/lib/SelectMenu/SelectMenuModal.js +1 -1
- package/lib/SelectMenu/SelectMenuTab.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuTab.js +1 -1
- package/lib/SelectMenu/SelectMenuTabPanel.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuTabPanel.js +1 -1
- package/lib/SelectMenu/SelectMenuTabs.d.ts +1 -2
- package/lib/SelectMenu/SelectMenuTabs.js +1 -1
- package/lib/SelectMenu/hooks/useKeyboardNav.js +96 -80
- package/lib/SelectMenu/index.js +14 -7
- package/lib/SelectPanel/index.js +12 -4
- package/lib/SideNav.d.ts +11 -8
- package/lib/SideNav.js +8 -15
- package/lib/StateLabel.d.ts +1 -2
- package/lib/StateLabel.js +6 -5
- package/lib/StyledOcticon.d.ts +1 -2
- package/lib/StyledOcticon.js +1 -3
- package/lib/SubNav.d.ts +5 -11
- package/lib/SubNav.js +7 -12
- package/lib/TabNav.d.ts +3 -4
- package/lib/TabNav.js +2 -2
- package/lib/TextInputWithTokens.d.ts +3 -3
- package/lib/Timeline.d.ts +19 -393
- package/lib/Timeline.js +16 -13
- package/lib/Token/Token.d.ts +1 -1
- package/lib/Token/index.js +30 -11
- package/lib/Tooltip.d.ts +1 -2
- package/lib/Tooltip.js +1 -1
- package/lib/Truncate.d.ts +1 -2
- package/lib/Truncate.js +1 -3
- package/lib/UnderlineNav.d.ts +2 -3
- package/lib/UnderlineNav.js +2 -2
- package/lib/__tests__/Breadcrumbs.test.js +4 -1
- package/lib/__tests__/Breadcrumbs.types.test.d.ts +3 -0
- package/lib/__tests__/Breadcrumbs.types.test.js +25 -0
- package/lib/__tests__/Button.test.js +6 -2
- package/lib/__tests__/CircleBadge.types.test.d.ts +3 -0
- package/lib/__tests__/CircleBadge.types.test.js +28 -0
- package/lib/__tests__/CounterLabel.types.test.d.ts +3 -0
- package/lib/__tests__/CounterLabel.types.test.js +28 -0
- package/lib/__tests__/Dialog.types.test.d.ts +3 -0
- package/lib/__tests__/Dialog.types.test.js +28 -0
- package/lib/__tests__/Dialog2.types.test.d.ts +3 -0
- package/lib/__tests__/Dialog2.types.test.js +31 -0
- package/lib/__tests__/Dropdown.types.test.d.ts +3 -0
- package/lib/__tests__/Dropdown.types.test.js +31 -0
- package/lib/__tests__/FilterList.types.test.d.ts +3 -0
- package/lib/__tests__/FilterList.types.test.js +27 -0
- package/lib/__tests__/FilteredSearch.types.test.d.ts +3 -0
- package/lib/__tests__/FilteredSearch.types.test.js +28 -0
- package/lib/__tests__/Flash.types.test.d.ts +3 -0
- package/lib/__tests__/Flash.types.test.js +28 -0
- package/lib/__tests__/FormGroup.types.test.d.ts +3 -0
- package/lib/__tests__/FormGroup.types.test.js +28 -0
- package/lib/__tests__/Header.types.test.d.ts +3 -0
- package/lib/__tests__/Header.types.test.js +29 -0
- package/lib/__tests__/KeyPaths.types.test.js +8 -5
- package/lib/__tests__/Label.types.test.d.ts +3 -0
- package/lib/__tests__/Label.types.test.js +28 -0
- package/lib/__tests__/LabelGroup.types.test.d.ts +3 -0
- package/lib/__tests__/LabelGroup.types.test.js +28 -0
- package/lib/__tests__/Link.test.js +11 -5
- package/lib/__tests__/Link.types.test.d.ts +3 -0
- package/lib/__tests__/Link.types.test.js +28 -0
- package/lib/__tests__/Merge.types.test.js +19 -13
- package/lib/__tests__/Overlay.types.test.d.ts +3 -0
- package/lib/__tests__/Overlay.types.test.js +35 -0
- package/lib/__tests__/Pagehead.types.test.d.ts +3 -0
- package/lib/__tests__/Pagehead.types.test.js +28 -0
- package/lib/__tests__/Pagination.types.test.d.ts +3 -0
- package/lib/__tests__/Pagination.types.test.js +33 -0
- package/lib/__tests__/Popover.types.test.d.ts +3 -0
- package/lib/__tests__/Popover.types.test.js +27 -0
- package/lib/__tests__/SelectMenu.types.test.d.ts +3 -0
- package/lib/__tests__/SelectMenu.types.test.js +47 -0
- package/lib/__tests__/SideNav.types.test.d.ts +3 -0
- package/lib/__tests__/SideNav.types.test.js +28 -0
- package/lib/__tests__/StateLabel.types.test.d.ts +3 -0
- package/lib/__tests__/StateLabel.types.test.js +28 -0
- package/lib/__tests__/StyledOcticon.types.test.d.ts +3 -0
- package/lib/__tests__/StyledOcticon.types.test.js +32 -0
- package/lib/__tests__/SubNav.types.test.d.ts +3 -0
- package/lib/__tests__/SubNav.types.test.js +27 -0
- package/lib/__tests__/TabNav.types.test.d.ts +3 -0
- package/lib/__tests__/TabNav.types.test.js +25 -0
- package/lib/__tests__/Timeline.types.test.d.ts +3 -0
- package/lib/__tests__/Timeline.types.test.js +31 -0
- package/lib/__tests__/Tooltip.types.test.d.ts +3 -0
- package/lib/__tests__/Tooltip.types.test.js +28 -0
- package/lib/__tests__/Truncate.types.test.d.ts +3 -0
- package/lib/__tests__/Truncate.types.test.js +31 -0
- package/lib/__tests__/UnderlineNav.types.test.d.ts +3 -0
- package/lib/__tests__/UnderlineNav.types.test.js +25 -0
- package/lib/__tests__/behaviors/anchoredPosition.test.js +376 -229
- package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +216 -145
- package/lib/__tests__/filterObject.test.js +27 -48
- package/lib/__tests__/theme.test.js +34 -33
- package/lib/__tests__/themeGet.test.js +23 -12
- package/lib/behaviors/anchoredPosition.js +234 -205
- package/lib/behaviors/focusTrap.js +157 -121
- package/lib/behaviors/focusZone.js +509 -434
- package/lib/behaviors/scrollIntoViewingArea.js +35 -18
- package/lib/constants.js +43 -39
- package/lib/drafts.js +30 -20
- package/lib/hooks/index.js +60 -16
- package/lib/hooks/useAnchoredPosition.js +40 -32
- package/lib/hooks/useCombinedRefs.js +36 -32
- package/lib/hooks/useDialog.js +96 -72
- package/lib/hooks/useFocusTrap.js +60 -43
- package/lib/hooks/useFocusZone.js +50 -54
- package/lib/hooks/useOnEscapePress.js +36 -25
- package/lib/hooks/useOpenAndCloseFocus.js +34 -22
- package/lib/hooks/useProvidedRefOrCreate.js +14 -10
- package/lib/hooks/useProvidedStateOrCreate.js +16 -13
- package/lib/hooks/useRenderForcingRef.js +17 -13
- package/lib/hooks/useResizeObserver.js +18 -15
- package/lib/hooks/useSafeTimeout.js +30 -22
- package/lib/hooks/useScrollFlash.js +23 -16
- package/lib/index.js +644 -163
- package/lib/polyfills/eventListenerSignal.js +45 -37
- package/lib/stories/ActionList2.stories.js +4 -3
- package/lib/stories/ActionMenu.stories.js +1 -3
- package/lib/stories/ConfirmationDialog.stories.js +16 -8
- package/lib/stories/Dialog.stories.js +6 -2
- package/lib/stories/useFocusTrap.stories.js +6 -2
- package/lib/stories/useFocusZone.stories.js +13 -5
- package/lib/sx.js +22 -10
- package/lib/theme-preval.js +3169 -64
- package/lib/theme.js +12 -3
- package/lib/utils/iterateFocusableElements.js +85 -63
- package/lib/utils/testing.d.ts +1 -1
- package/lib/utils/theme.js +47 -33
- package/lib/utils/types/AriaRole.js +1 -2
- package/lib/utils/types/ComponentProps.js +1 -2
- package/lib/utils/types/Flatten.js +1 -2
- package/lib/utils/types/KeyPaths.js +1 -2
- package/lib/utils/types/MandateProps.js +1 -16
- package/lib/utils/types/Merge.js +1 -2
- package/lib/utils/types/index.js +69 -16
- package/lib/utils/uniqueId.js +8 -5
- package/lib/utils/use-force-update.js +14 -8
- package/lib/utils/useIsomorphicLayoutEffect.js +11 -8
- package/lib/utils/userAgent.js +12 -8
- package/lib-esm/ActionList2/Group.d.ts +28 -2
- package/lib-esm/ActionList2/Group.js +52 -5
- package/lib-esm/ActionList2/List.d.ts +1 -1
- package/lib-esm/Autocomplete/Autocomplete.d.ts +3 -3
- package/lib-esm/Autocomplete/AutocompleteInput.d.ts +3 -3
- package/lib-esm/Breadcrumbs.d.ts +8 -7
- package/lib-esm/Breadcrumbs.js +8 -13
- package/lib-esm/Button/Button.d.ts +2 -3
- package/lib-esm/Button/Button.js +2 -2
- package/lib-esm/Button/ButtonBase.d.ts +5 -8
- package/lib-esm/Button/ButtonBase.js +1 -3
- package/lib-esm/Button/ButtonClose.d.ts +3 -46
- package/lib-esm/Button/ButtonClose.js +2 -2
- package/lib-esm/Button/ButtonDanger.d.ts +2 -3
- package/lib-esm/Button/ButtonDanger.js +2 -2
- package/lib-esm/Button/ButtonInvisible.d.ts +2 -3
- package/lib-esm/Button/ButtonInvisible.js +2 -2
- package/lib-esm/Button/ButtonOutline.d.ts +2 -3
- package/lib-esm/Button/ButtonOutline.js +2 -2
- package/lib-esm/Button/ButtonPrimary.d.ts +2 -3
- package/lib-esm/Button/ButtonPrimary.js +2 -2
- package/lib-esm/Button/ButtonTableList.d.ts +1 -2
- package/lib-esm/Button/ButtonTableList.js +2 -2
- package/lib-esm/CircleBadge.d.ts +4 -5
- package/lib-esm/CircleBadge.js +2 -2
- package/lib-esm/CircleOcticon.d.ts +1 -1
- package/lib-esm/CounterLabel.d.ts +1 -2
- package/lib-esm/CounterLabel.js +2 -2
- package/lib-esm/Dialog/Dialog.d.ts +5 -9
- package/lib-esm/Dialog/Dialog.js +12 -12
- package/lib-esm/Dialog.d.ts +4 -5
- package/lib-esm/Dialog.js +2 -2
- package/lib-esm/Dropdown.d.ts +10 -99
- package/lib-esm/Dropdown.js +4 -4
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +3 -47
- package/lib-esm/DropdownMenu/DropdownButton.js +3 -1
- package/lib-esm/FilterList.d.ts +264 -303
- package/lib-esm/FilterList.js +3 -7
- package/lib-esm/FilteredSearch.d.ts +1 -2
- package/lib-esm/FilteredSearch.js +2 -2
- package/lib-esm/Flash.d.ts +1 -2
- package/lib-esm/Flash.js +2 -2
- package/lib-esm/FormGroup.d.ts +4 -5
- package/lib-esm/FormGroup.js +3 -3
- package/lib-esm/Header.d.ts +6 -7
- package/lib-esm/Header.js +5 -5
- package/lib-esm/Label.d.ts +1 -2
- package/lib-esm/Label.js +3 -4
- package/lib-esm/LabelGroup.d.ts +1 -2
- package/lib-esm/LabelGroup.js +2 -2
- package/lib-esm/Link.d.ts +1 -2
- package/lib-esm/Link.js +2 -2
- package/lib-esm/NewButton/button.js +31 -42
- package/lib-esm/Overlay.d.ts +11 -10
- package/lib-esm/Overlay.js +2 -3
- package/lib-esm/Pagehead.d.ts +1 -2
- package/lib-esm/Pagehead.js +2 -2
- package/lib-esm/Pagination/Pagination.js +2 -2
- package/lib-esm/Popover.d.ts +4 -5
- package/lib-esm/Popover.js +4 -5
- package/lib-esm/Position.d.ts +4 -4
- package/lib-esm/SelectMenu/SelectMenu.d.ts +21 -189
- package/lib-esm/SelectMenu/SelectMenu.js +1 -2
- package/lib-esm/SelectMenu/SelectMenuDivider.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuDivider.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuFilter.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuFooter.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuFooter.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuHeader.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuHeader.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +2 -3
- package/lib-esm/SelectMenu/SelectMenuItem.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuList.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuList.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.d.ts +2 -2
- package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.js +3 -2
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +2 -3
- package/lib-esm/SelectMenu/SelectMenuModal.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuTab.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuTab.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuTabPanel.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuTabPanel.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuTabs.d.ts +1 -2
- package/lib-esm/SelectMenu/SelectMenuTabs.js +2 -2
- package/lib-esm/SideNav.d.ts +11 -8
- package/lib-esm/SideNav.js +8 -16
- package/lib-esm/StateLabel.d.ts +1 -2
- package/lib-esm/StateLabel.js +7 -6
- package/lib-esm/StyledOcticon.d.ts +1 -2
- package/lib-esm/StyledOcticon.js +1 -2
- package/lib-esm/SubNav.d.ts +5 -11
- package/lib-esm/SubNav.js +8 -13
- package/lib-esm/TabNav.d.ts +3 -4
- package/lib-esm/TabNav.js +3 -3
- package/lib-esm/TextInputWithTokens.d.ts +3 -3
- package/lib-esm/Timeline.d.ts +19 -393
- package/lib-esm/Timeline.js +12 -13
- package/lib-esm/Token/Token.d.ts +1 -1
- package/lib-esm/Tooltip.d.ts +1 -2
- package/lib-esm/Tooltip.js +2 -2
- package/lib-esm/Truncate.d.ts +1 -2
- package/lib-esm/Truncate.js +1 -2
- package/lib-esm/UnderlineNav.d.ts +2 -3
- package/lib-esm/UnderlineNav.js +3 -3
- package/lib-esm/__tests__/Breadcrumbs.test.js +4 -1
- package/lib-esm/__tests__/Breadcrumbs.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Breadcrumbs.types.test.js +12 -0
- package/lib-esm/__tests__/Button.test.js +6 -2
- package/lib-esm/__tests__/CircleBadge.types.test.d.ts +3 -0
- package/lib-esm/__tests__/CircleBadge.types.test.js +13 -0
- package/lib-esm/__tests__/CounterLabel.types.test.d.ts +3 -0
- package/lib-esm/__tests__/CounterLabel.types.test.js +13 -0
- package/lib-esm/__tests__/Dialog.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Dialog.types.test.js +13 -0
- package/lib-esm/__tests__/Dialog2.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Dialog2.types.test.js +16 -0
- package/lib-esm/__tests__/Dropdown.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Dropdown.types.test.js +17 -0
- package/lib-esm/__tests__/FilterList.types.test.d.ts +3 -0
- package/lib-esm/__tests__/FilterList.types.test.js +13 -0
- package/lib-esm/__tests__/FilteredSearch.types.test.d.ts +3 -0
- package/lib-esm/__tests__/FilteredSearch.types.test.js +13 -0
- package/lib-esm/__tests__/Flash.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Flash.types.test.js +13 -0
- package/lib-esm/__tests__/FormGroup.types.test.d.ts +3 -0
- package/lib-esm/__tests__/FormGroup.types.test.js +13 -0
- package/lib-esm/__tests__/Header.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Header.types.test.js +15 -0
- package/lib-esm/__tests__/Label.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Label.types.test.js +13 -0
- package/lib-esm/__tests__/LabelGroup.types.test.d.ts +3 -0
- package/lib-esm/__tests__/LabelGroup.types.test.js +13 -0
- package/lib-esm/__tests__/Link.test.js +11 -5
- package/lib-esm/__tests__/Link.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Link.types.test.js +13 -0
- package/lib-esm/__tests__/Overlay.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Overlay.types.test.js +20 -0
- package/lib-esm/__tests__/Pagehead.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Pagehead.types.test.js +13 -0
- package/lib-esm/__tests__/Pagination.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Pagination.types.test.js +18 -0
- package/lib-esm/__tests__/Popover.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Popover.types.test.js +13 -0
- package/lib-esm/__tests__/SelectMenu.types.test.d.ts +3 -0
- package/lib-esm/__tests__/SelectMenu.types.test.js +33 -0
- package/lib-esm/__tests__/SideNav.types.test.d.ts +3 -0
- package/lib-esm/__tests__/SideNav.types.test.js +13 -0
- package/lib-esm/__tests__/StateLabel.types.test.d.ts +3 -0
- package/lib-esm/__tests__/StateLabel.types.test.js +13 -0
- package/lib-esm/__tests__/StyledOcticon.types.test.d.ts +3 -0
- package/lib-esm/__tests__/StyledOcticon.types.test.js +16 -0
- package/lib-esm/__tests__/SubNav.types.test.d.ts +3 -0
- package/lib-esm/__tests__/SubNav.types.test.js +14 -0
- package/lib-esm/__tests__/TabNav.types.test.d.ts +3 -0
- package/lib-esm/__tests__/TabNav.types.test.js +12 -0
- package/lib-esm/__tests__/Timeline.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Timeline.types.test.js +18 -0
- package/lib-esm/__tests__/Tooltip.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Tooltip.types.test.js +13 -0
- package/lib-esm/__tests__/Truncate.types.test.d.ts +3 -0
- package/lib-esm/__tests__/Truncate.types.test.js +16 -0
- package/lib-esm/__tests__/UnderlineNav.types.test.d.ts +3 -0
- package/lib-esm/__tests__/UnderlineNav.types.test.js +12 -0
- package/lib-esm/stories/ActionList2.stories.js +4 -3
- package/lib-esm/stories/ActionMenu.stories.js +1 -3
- package/lib-esm/stories/ConfirmationDialog.stories.js +16 -8
- package/lib-esm/stories/Dialog.stories.js +6 -2
- package/lib-esm/stories/useFocusTrap.stories.js +6 -2
- package/lib-esm/stories/useFocusZone.stories.js +13 -5
- package/lib-esm/theme-preval.js +446 -0
- package/lib-esm/utils/testing.d.ts +1 -1
- package/package-lock.json +16 -16
- package/package.json +4 -5
- package/script/build +1 -1
- package/src/ActionList2/Group.tsx +76 -7
- package/src/ActionList2/List.tsx +1 -1
- package/src/Breadcrumbs.tsx +11 -11
- package/src/Button/Button.tsx +2 -3
- package/src/Button/ButtonBase.tsx +2 -6
- package/src/Button/ButtonClose.tsx +2 -6
- package/src/Button/ButtonDanger.tsx +2 -3
- package/src/Button/ButtonInvisible.tsx +2 -3
- package/src/Button/ButtonOutline.tsx +2 -3
- package/src/Button/ButtonPrimary.tsx +2 -3
- package/src/Button/ButtonTableList.tsx +2 -15
- package/src/CircleBadge.tsx +2 -4
- package/src/CounterLabel.tsx +2 -4
- package/src/Dialog/Dialog.tsx +22 -11
- package/src/Dialog.tsx +2 -6
- package/src/Dropdown.tsx +3 -7
- package/src/DropdownMenu/DropdownButton.tsx +1 -1
- package/src/FilterList.tsx +5 -11
- package/src/FilteredSearch.tsx +2 -3
- package/src/Flash.tsx +2 -4
- package/src/FormGroup.tsx +3 -6
- package/src/Header.tsx +4 -14
- package/src/Label.tsx +2 -5
- package/src/LabelGroup.tsx +2 -3
- package/src/Link.tsx +2 -6
- package/src/NewButton/button.tsx +82 -78
- package/src/Overlay.tsx +13 -11
- package/src/Pagehead.tsx +2 -3
- package/src/Pagination/Pagination.tsx +3 -5
- package/src/Popover.tsx +3 -14
- package/src/SelectMenu/SelectMenu.tsx +1 -3
- package/src/SelectMenu/SelectMenuDivider.tsx +2 -3
- package/src/SelectMenu/SelectMenuFilter.tsx +2 -3
- package/src/SelectMenu/SelectMenuFooter.tsx +2 -3
- package/src/SelectMenu/SelectMenuHeader.tsx +2 -4
- package/src/SelectMenu/SelectMenuItem.tsx +2 -3
- package/src/SelectMenu/SelectMenuList.tsx +2 -3
- package/src/SelectMenu/SelectMenuLoadingAnimation.tsx +4 -3
- package/src/SelectMenu/SelectMenuModal.tsx +2 -4
- package/src/SelectMenu/SelectMenuTab.tsx +2 -3
- package/src/SelectMenu/SelectMenuTabPanel.tsx +2 -3
- package/src/SelectMenu/SelectMenuTabs.tsx +2 -3
- package/src/SideNav.tsx +11 -13
- package/src/StateLabel.tsx +3 -5
- package/src/StyledOcticon.tsx +1 -3
- package/src/SubNav.tsx +8 -13
- package/src/TabNav.tsx +3 -7
- package/src/Timeline.tsx +11 -12
- package/src/Tooltip.tsx +3 -3
- package/src/Truncate.tsx +0 -5
- package/src/UnderlineNav.tsx +3 -6
- package/src/__tests__/Breadcrumbs.test.tsx +1 -1
- package/src/__tests__/Breadcrumbs.types.test.tsx +22 -0
- package/src/__tests__/Button.test.tsx +2 -2
- package/src/__tests__/CircleBadge.types.test.tsx +11 -0
- package/src/__tests__/CounterLabel.types.test.tsx +11 -0
- package/src/__tests__/Dialog.types.test.tsx +11 -0
- package/src/__tests__/Dialog2.types.test.tsx +11 -0
- package/src/__tests__/Dropdown.types.test.tsx +21 -0
- package/src/__tests__/FilterList.types.test.tsx +17 -0
- package/src/__tests__/FilteredSearch.types.test.tsx +11 -0
- package/src/__tests__/Flash.types.test.tsx +11 -0
- package/src/__tests__/FormGroup.types.test.tsx +11 -0
- package/src/__tests__/Header.types.test.tsx +19 -0
- package/src/__tests__/Label.types.test.tsx +11 -0
- package/src/__tests__/LabelGroup.types.test.tsx +11 -0
- package/src/__tests__/Link.test.tsx +5 -5
- package/src/__tests__/Link.types.test.tsx +11 -0
- package/src/__tests__/Overlay.types.test.tsx +18 -0
- package/src/__tests__/Pagehead.types.test.tsx +11 -0
- package/src/__tests__/Pagination.types.test.tsx +11 -0
- package/src/__tests__/Popover.types.test.tsx +17 -0
- package/src/__tests__/SelectMenu.types.test.tsx +37 -0
- package/src/__tests__/SideNav.types.test.tsx +11 -0
- package/src/__tests__/StateLabel.types.test.tsx +11 -0
- package/src/__tests__/StyledOcticon.types.test.tsx +12 -0
- package/src/__tests__/SubNav.types.test.tsx +25 -0
- package/src/__tests__/TabNav.types.test.tsx +22 -0
- package/src/__tests__/Timeline.types.test.tsx +31 -0
- package/src/__tests__/Tooltip.types.test.tsx +11 -0
- package/src/__tests__/Truncate.types.test.tsx +11 -0
- package/src/__tests__/UnderlineNav.types.test.tsx +22 -0
- package/src/__tests__/__snapshots__/Label.test.tsx.snap +3 -4
- package/src/__tests__/__snapshots__/Link.test.tsx.snap +1 -2
- package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +5 -0
- package/src/stories/ActionList2.stories.tsx +3 -3
- package/src/stories/ActionMenu.stories.tsx +1 -4
- package/src/stories/ConfirmationDialog.stories.tsx +4 -4
- package/src/stories/Dialog.stories.tsx +2 -2
- package/src/stories/useFocusTrap.stories.tsx +2 -2
- package/src/stories/useFocusZone.stories.tsx +4 -4
- package/stats.html +1 -1
- package/tsconfig.build.json +2 -2
- package/tsconfig.json +17 -4
- package/lib/ActionList/Divider.jsx +0 -29
- package/lib/ActionList/Group.jsx +0 -23
- package/lib/ActionList/Header.jsx +0 -66
- package/lib/ActionList/Item.jsx +0 -288
- package/lib/ActionList/List.jsx +0 -138
- package/lib/ActionList2/Description.jsx +0 -29
- package/lib/ActionList2/Divider.jsx +0 -22
- package/lib/ActionList2/Group.jsx +0 -25
- package/lib/ActionList2/Header.jsx +0 -36
- package/lib/ActionList2/Item.jsx +0 -174
- package/lib/ActionList2/LinkItem.jsx +0 -28
- package/lib/ActionList2/List.jsx +0 -41
- package/lib/ActionList2/Selection.jsx +0 -50
- package/lib/ActionList2/Visuals.jsx +0 -48
- package/lib/ActionMenu.jsx +0 -73
- package/lib/AnchoredOverlay/AnchoredOverlay.jsx +0 -100
- package/lib/Autocomplete/Autocomplete.jsx +0 -100
- package/lib/Autocomplete/AutocompleteContext.jsx +0 -5
- package/lib/Autocomplete/AutocompleteInput.jsx +0 -113
- package/lib/Autocomplete/AutocompleteMenu.jsx +0 -190
- package/lib/Autocomplete/AutocompleteOverlay.jsx +0 -55
- package/lib/Avatar.jsx +0 -34
- package/lib/AvatarPair.jsx +0 -29
- package/lib/AvatarStack.jsx +0 -151
- package/lib/BaseStyles.jsx +0 -65
- package/lib/BorderBox.jsx +0 -18
- package/lib/Box.jsx +0 -10
- package/lib/BranchName.jsx +0 -20
- package/lib/Breadcrumbs.jsx +0 -74
- package/lib/Button/Button.jsx +0 -60
- package/lib/Button/ButtonBase.jsx +0 -36
- package/lib/Button/ButtonClose.jsx +0 -55
- package/lib/Button/ButtonDanger.jsx +0 -63
- package/lib/Button/ButtonGroup.jsx +0 -55
- package/lib/Button/ButtonInvisible.jsx +0 -52
- package/lib/Button/ButtonOutline.jsx +0 -63
- package/lib/Button/ButtonPrimary.jsx +0 -62
- package/lib/Button/ButtonStyles.jsx +0 -37
- package/lib/Button/ButtonTableList.jsx +0 -49
- package/lib/Caret.jsx +0 -93
- package/lib/CircleBadge.jsx +0 -43
- package/lib/CircleOcticon.jsx +0 -21
- package/lib/CounterLabel.jsx +0 -44
- package/lib/Details.jsx +0 -21
- package/lib/Dialog/ConfirmationDialog.jsx +0 -146
- package/lib/Dialog/Dialog.jsx +0 -273
- package/lib/Dialog.jsx +0 -131
- package/lib/Dropdown.jsx +0 -134
- package/lib/DropdownMenu/DropdownButton.jsx +0 -14
- package/lib/DropdownMenu/DropdownMenu.jsx +0 -70
- package/lib/FilterList.jsx +0 -63
- package/lib/FilteredActionList/FilteredActionList.jsx +0 -100
- package/lib/FilteredSearch.jsx +0 -29
- package/lib/Flash.jsx +0 -70
- package/lib/Flex.jsx +0 -15
- package/lib/FormGroup.jsx +0 -25
- package/lib/Grid.jsx +0 -15
- package/lib/Header.jsx +0 -90
- package/lib/Heading.jsx +0 -21
- package/lib/Label.jsx +0 -84
- package/lib/LabelGroup.jsx +0 -19
- package/lib/Link.jsx +0 -38
- package/lib/NewButton/button-counter.jsx +0 -14
- package/lib/NewButton/button.jsx +0 -278
- package/lib/Overlay.jsx +0 -156
- package/lib/Pagehead.jsx +0 -18
- package/lib/Pagination/Pagination.jsx +0 -163
- package/lib/Pagination/model.jsx +0 -174
- package/lib/PointerBox.jsx +0 -25
- package/lib/Popover.jsx +0 -210
- package/lib/Portal/Portal.jsx +0 -79
- package/lib/Position.jsx +0 -46
- package/lib/ProgressBar.jsx +0 -39
- package/lib/SelectMenu/SelectMenu.jsx +0 -114
- package/lib/SelectMenu/SelectMenuContext.jsx +0 -5
- package/lib/SelectMenu/SelectMenuDivider.jsx +0 -43
- package/lib/SelectMenu/SelectMenuFilter.jsx +0 -59
- package/lib/SelectMenu/SelectMenuFooter.jsx +0 -46
- package/lib/SelectMenu/SelectMenuHeader.jsx +0 -44
- package/lib/SelectMenu/SelectMenuItem.jsx +0 -143
- package/lib/SelectMenu/SelectMenuList.jsx +0 -60
- package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +0 -21
- package/lib/SelectMenu/SelectMenuModal.jsx +0 -119
- package/lib/SelectMenu/SelectMenuTab.jsx +0 -93
- package/lib/SelectMenu/SelectMenuTabPanel.jsx +0 -43
- package/lib/SelectMenu/SelectMenuTabs.jsx +0 -58
- package/lib/SelectPanel/SelectPanel.jsx +0 -105
- package/lib/SideNav.jsx +0 -177
- package/lib/Spinner.jsx +0 -35
- package/lib/StateLabel.jsx +0 -94
- package/lib/StyledOcticon.jsx +0 -20
- package/lib/SubNav.jsx +0 -104
- package/lib/TabNav.jsx +0 -60
- package/lib/Text.jsx +0 -14
- package/lib/TextInput.jsx +0 -23
- package/lib/TextInputWithTokens.jsx +0 -218
- package/lib/ThemeProvider.jsx +0 -130
- package/lib/Timeline.jsx +0 -124
- package/lib/Token/AvatarToken.jsx +0 -54
- package/lib/Token/IssueLabelToken.jsx +0 -125
- package/lib/Token/Token.jsx +0 -103
- package/lib/Token/TokenBase.jsx +0 -88
- package/lib/Token/_RemoveTokenButton.jsx +0 -108
- package/lib/Token/_TokenTextContainer.jsx +0 -49
- package/lib/Tooltip.jsx +0 -246
- package/lib/Truncate.jsx +0 -27
- package/lib/UnderlineNav.jsx +0 -90
- package/lib/_TextInputWrapper.jsx +0 -120
- package/lib/_UnstyledTextInput.jsx +0 -22
- package/lib/__tests__/ActionList.test.jsx +0 -49
- package/lib/__tests__/ActionList.types.test.jsx +0 -45
- package/lib/__tests__/ActionList2.test.jsx +0 -46
- package/lib/__tests__/ActionMenu.test.jsx +0 -124
- package/lib/__tests__/AnchoredOverlay.test.jsx +0 -121
- package/lib/__tests__/Autocomplete.test.jsx +0 -299
- package/lib/__tests__/Avatar.test.jsx +0 -42
- package/lib/__tests__/AvatarStack.test.jsx +0 -43
- package/lib/__tests__/BorderBox.test.jsx +0 -36
- package/lib/__tests__/Box.test.jsx +0 -41
- package/lib/__tests__/BranchName.test.jsx +0 -27
- package/lib/__tests__/Breadcrumbs.test.jsx +0 -28
- package/lib/__tests__/BreadcrumbsItem.test.jsx +0 -31
- package/lib/__tests__/Button.test.jsx +0 -100
- package/lib/__tests__/Caret.test.jsx +0 -37
- package/lib/__tests__/CircleBadge.test.jsx +0 -55
- package/lib/__tests__/CircleOcticon.test.jsx +0 -45
- package/lib/__tests__/ConfirmationDialog.test.jsx +0 -119
- package/lib/__tests__/CounterLabel.test.jsx +0 -36
- package/lib/__tests__/Details.test.jsx +0 -85
- package/lib/__tests__/Dialog.test.jsx +0 -139
- package/lib/__tests__/Dropdown.test.jsx +0 -49
- package/lib/__tests__/DropdownMenu.test.jsx +0 -119
- package/lib/__tests__/FilterList.test.jsx +0 -27
- package/lib/__tests__/FilterListItem.test.jsx +0 -31
- package/lib/__tests__/FilteredSearch.test.jsx +0 -27
- package/lib/__tests__/Flash.test.jsx +0 -36
- package/lib/__tests__/Flex.test.jsx +0 -51
- package/lib/__tests__/FormGroup.test.jsx +0 -36
- package/lib/__tests__/Grid.test.jsx +0 -69
- package/lib/__tests__/Header.test.jsx +0 -45
- package/lib/__tests__/Heading.test.jsx +0 -71
- package/lib/__tests__/Label.test.jsx +0 -33
- package/lib/__tests__/LabelGroup.test.jsx +0 -29
- package/lib/__tests__/Link.test.jsx +0 -43
- package/lib/__tests__/NewButton.test.jsx +0 -61
- package/lib/__tests__/Overlay.test.jsx +0 -105
- package/lib/__tests__/Pagehead.test.jsx +0 -25
- package/lib/__tests__/Pagination/Pagination.test.jsx +0 -32
- package/lib/__tests__/Pagination/PaginationModel.test.jsx +0 -118
- package/lib/__tests__/PointerBox.test.jsx +0 -33
- package/lib/__tests__/Popover.test.jsx +0 -58
- package/lib/__tests__/Portal.test.jsx +0 -102
- package/lib/__tests__/Position.test.jsx +0 -96
- package/lib/__tests__/ProgressBar.test.jsx +0 -38
- package/lib/__tests__/SelectMenu.test.jsx +0 -120
- package/lib/__tests__/SelectPanel.test.jsx +0 -48
- package/lib/__tests__/SideNav.test.jsx +0 -55
- package/lib/__tests__/Spinner.test.jsx +0 -41
- package/lib/__tests__/StateLabel.test.jsx +0 -46
- package/lib/__tests__/StyledOcticon.test.jsx +0 -28
- package/lib/__tests__/SubNav.test.jsx +0 -47
- package/lib/__tests__/SubNavLink.test.jsx +0 -31
- package/lib/__tests__/TabNav.test.jsx +0 -32
- package/lib/__tests__/Text.test.jsx +0 -71
- package/lib/__tests__/TextInput.test.jsx +0 -45
- package/lib/__tests__/TextInputWithTokens.test.jsx +0 -302
- package/lib/__tests__/ThemeProvider.test.jsx +0 -314
- package/lib/__tests__/Timeline.test.jsx +0 -51
- package/lib/__tests__/Token.test.jsx +0 -93
- package/lib/__tests__/Tooltip.test.jsx +0 -46
- package/lib/__tests__/Truncate.test.jsx +0 -41
- package/lib/__tests__/UnderlineNav.test.jsx +0 -53
- package/lib/__tests__/UnderlineNavLink.test.jsx +0 -31
- package/lib/__tests__/behaviors/focusTrap.test.jsx +0 -184
- package/lib/__tests__/behaviors/focusZone.test.jsx +0 -406
- package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +0 -58
- package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +0 -29
- package/lib/__tests__/hooks/useOnEscapePress.test.jsx +0 -19
- package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +0 -63
- package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +0 -61
- package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +0 -56
- package/lib/__tests__/useSafeTimeout.test.jsx +0 -36
- package/lib/__tests__/utils/createSlots.test.jsx +0 -57
- package/lib/hooks/useDetails.jsx +0 -39
- package/lib/hooks/useOnOutsideClick.jsx +0 -61
- package/lib/hooks/useOverlay.jsx +0 -15
- package/lib/utils/create-slots.jsx +0 -65
- package/lib/utils/deprecate.jsx +0 -59
- package/lib/utils/isNumeric.jsx +0 -7
- package/lib/utils/ssr.jsx +0 -6
- package/lib/utils/test-deprecations.jsx +0 -20
- package/lib/utils/test-helpers.jsx +0 -8
- package/lib/utils/test-matchers.jsx +0 -100
- package/lib/utils/testing.jsx +0 -206
- package/tsconfig.base.json +0 -20
@@ -1,90 +1,100 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.focusZone = focusZone;
|
7
|
+
exports.hasActiveDescendantAttribute = exports.activeDescendantActivatedIndirectly = exports.activeDescendantActivatedDirectly = exports.isActiveDescendantAttribute = exports.FocusKeys = void 0;
|
8
|
+
|
9
|
+
var _iterateFocusableElements = require("../utils/iterateFocusableElements");
|
10
|
+
|
11
|
+
var _eventListenerSignal = require("../polyfills/eventListenerSignal");
|
12
|
+
|
13
|
+
var _userAgent = require("../utils/userAgent");
|
14
|
+
|
15
|
+
var _uniqueId = require("../utils/uniqueId");
|
16
|
+
|
17
|
+
(0, _eventListenerSignal.polyfill)();
|
9
18
|
// eslint-disable-next-line no-shadow
|
10
|
-
|
19
|
+
let FocusKeys;
|
20
|
+
exports.FocusKeys = FocusKeys;
|
21
|
+
|
11
22
|
(function (FocusKeys) {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
FocusKeys[FocusKeys["AD"] = 64] = "AD";
|
28
|
-
// The Tab key (next)
|
29
|
-
FocusKeys[FocusKeys["Tab"] = 128] = "Tab";
|
30
|
-
FocusKeys[FocusKeys["ArrowAll"] = 3] = "ArrowAll";
|
31
|
-
FocusKeys[FocusKeys["HJKL"] = 12] = "HJKL";
|
32
|
-
FocusKeys[FocusKeys["WASD"] = 96] = "WASD";
|
33
|
-
FocusKeys[FocusKeys["All"] = 511] = "All";
|
34
|
-
})(FocusKeys = exports.FocusKeys || (exports.FocusKeys = {}));
|
23
|
+
FocusKeys[FocusKeys["ArrowHorizontal"] = 1] = "ArrowHorizontal";
|
24
|
+
FocusKeys[FocusKeys["ArrowVertical"] = 2] = "ArrowVertical";
|
25
|
+
FocusKeys[FocusKeys["JK"] = 4] = "JK";
|
26
|
+
FocusKeys[FocusKeys["HL"] = 8] = "HL";
|
27
|
+
FocusKeys[FocusKeys["HomeAndEnd"] = 16] = "HomeAndEnd";
|
28
|
+
FocusKeys[FocusKeys["PageUpDown"] = 256] = "PageUpDown";
|
29
|
+
FocusKeys[FocusKeys["WS"] = 32] = "WS";
|
30
|
+
FocusKeys[FocusKeys["AD"] = 64] = "AD";
|
31
|
+
FocusKeys[FocusKeys["Tab"] = 128] = "Tab";
|
32
|
+
FocusKeys[FocusKeys["ArrowAll"] = FocusKeys.ArrowHorizontal | FocusKeys.ArrowVertical] = "ArrowAll";
|
33
|
+
FocusKeys[FocusKeys["HJKL"] = FocusKeys.HL | FocusKeys.JK] = "HJKL";
|
34
|
+
FocusKeys[FocusKeys["WASD"] = FocusKeys.WS | FocusKeys.AD] = "WASD";
|
35
|
+
FocusKeys[FocusKeys["All"] = FocusKeys.ArrowAll | FocusKeys.HJKL | FocusKeys.HomeAndEnd | FocusKeys.PageUpDown | FocusKeys.WASD | FocusKeys.Tab] = "All";
|
36
|
+
})(FocusKeys || (exports.FocusKeys = FocusKeys = {}));
|
37
|
+
|
35
38
|
const KEY_TO_BIT = {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
39
|
+
ArrowLeft: FocusKeys.ArrowHorizontal,
|
40
|
+
ArrowDown: FocusKeys.ArrowVertical,
|
41
|
+
ArrowUp: FocusKeys.ArrowVertical,
|
42
|
+
ArrowRight: FocusKeys.ArrowHorizontal,
|
43
|
+
h: FocusKeys.HL,
|
44
|
+
j: FocusKeys.JK,
|
45
|
+
k: FocusKeys.JK,
|
46
|
+
l: FocusKeys.HL,
|
47
|
+
a: FocusKeys.AD,
|
48
|
+
s: FocusKeys.WS,
|
49
|
+
w: FocusKeys.WS,
|
50
|
+
d: FocusKeys.AD,
|
51
|
+
Tab: FocusKeys.Tab,
|
52
|
+
Home: FocusKeys.HomeAndEnd,
|
53
|
+
End: FocusKeys.HomeAndEnd,
|
54
|
+
PageUp: FocusKeys.PageUpDown,
|
55
|
+
PageDown: FocusKeys.PageUpDown
|
53
56
|
};
|
54
57
|
const KEY_TO_DIRECTION = {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
58
|
+
ArrowLeft: 'previous',
|
59
|
+
ArrowDown: 'next',
|
60
|
+
ArrowUp: 'previous',
|
61
|
+
ArrowRight: 'next',
|
62
|
+
h: 'previous',
|
63
|
+
j: 'next',
|
64
|
+
k: 'previous',
|
65
|
+
l: 'next',
|
66
|
+
a: 'previous',
|
67
|
+
s: 'next',
|
68
|
+
w: 'previous',
|
69
|
+
d: 'next',
|
70
|
+
Tab: 'next',
|
71
|
+
Home: 'start',
|
72
|
+
End: 'end',
|
73
|
+
PageUp: 'start',
|
74
|
+
PageDown: 'end'
|
72
75
|
};
|
76
|
+
/**
|
77
|
+
* Options that control the behavior of the arrow focus behavior.
|
78
|
+
*/
|
79
|
+
|
73
80
|
function getDirection(keyboardEvent) {
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
const direction = KEY_TO_DIRECTION[keyboardEvent.key];
|
82
|
+
|
83
|
+
if (keyboardEvent.key === 'Tab' && keyboardEvent.shiftKey) {
|
84
|
+
return 'previous';
|
85
|
+
}
|
86
|
+
|
87
|
+
const isMac = (0, _userAgent.isMacOS)();
|
88
|
+
|
89
|
+
if (isMac && keyboardEvent.metaKey || !isMac && keyboardEvent.ctrlKey) {
|
90
|
+
if (keyboardEvent.key === 'ArrowLeft' || keyboardEvent.key === 'ArrowUp') {
|
91
|
+
return 'start';
|
92
|
+
} else if (keyboardEvent.key === 'ArrowRight' || keyboardEvent.key === 'ArrowDown') {
|
93
|
+
return 'end';
|
86
94
|
}
|
87
|
-
|
95
|
+
}
|
96
|
+
|
97
|
+
return direction;
|
88
98
|
}
|
89
99
|
/**
|
90
100
|
* There are some situations where we do not want various keys to affect focus. This function
|
@@ -99,405 +109,470 @@ function getDirection(keyboardEvent) {
|
|
99
109
|
* @param keyboardEvent
|
100
110
|
* @param activeElement
|
101
111
|
*/
|
112
|
+
|
113
|
+
|
102
114
|
function shouldIgnoreFocusHandling(keyboardEvent, activeElement) {
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
+
const key = keyboardEvent.key; // Get the number of characters in `key`, accounting for double-wide UTF-16 chars. If keyLength
|
116
|
+
// is 1, we can assume it's a "printable" character. Otherwise it's likely a control character.
|
117
|
+
// One exception is the Tab key, which is technically printable, but browsers generally assign
|
118
|
+
// its function to move focus rather than type a <TAB> character.
|
119
|
+
|
120
|
+
const keyLength = [...key].length;
|
121
|
+
const isTextInput = activeElement instanceof HTMLInputElement && activeElement.type === 'text' || activeElement instanceof HTMLTextAreaElement; // If we would normally type a character into an input, ignore
|
122
|
+
// Also, Home and End keys should never affect focus when in a text input
|
123
|
+
|
124
|
+
if (isTextInput && (keyLength === 1 || key === 'Home' || key === 'End')) {
|
125
|
+
return true;
|
126
|
+
} // Some situations we want to ignore with <select> elements
|
127
|
+
|
128
|
+
|
129
|
+
if (activeElement instanceof HTMLSelectElement) {
|
130
|
+
// Regular typeable characters change the selection, so ignore those
|
131
|
+
if (keyLength === 1) {
|
132
|
+
return true;
|
133
|
+
} // On macOS, bare ArrowDown opens the select, so ignore that
|
134
|
+
|
135
|
+
|
136
|
+
if (key === 'ArrowDown' && (0, _userAgent.isMacOS)() && !keyboardEvent.metaKey) {
|
137
|
+
return true;
|
138
|
+
} // On other platforms, Alt+ArrowDown opens the select, so ignore that
|
139
|
+
|
140
|
+
|
141
|
+
if (key === 'ArrowDown' && !(0, _userAgent.isMacOS)() && keyboardEvent.altKey) {
|
142
|
+
return true;
|
115
143
|
}
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
144
|
+
} // Ignore page up and page down for textareas
|
145
|
+
|
146
|
+
|
147
|
+
if (activeElement instanceof HTMLTextAreaElement && (key === 'PageUp' || key === 'PageDown')) {
|
148
|
+
return true;
|
149
|
+
}
|
150
|
+
|
151
|
+
if (isTextInput) {
|
152
|
+
const textInput = activeElement;
|
153
|
+
const cursorAtStart = textInput.selectionStart === 0 && textInput.selectionEnd === 0;
|
154
|
+
const cursorAtEnd = textInput.selectionStart === textInput.value.length && textInput.selectionEnd === textInput.value.length; // When in a text area or text input, only move focus left/right if at beginning/end of the field
|
155
|
+
|
156
|
+
if (key === 'ArrowLeft' && !cursorAtStart) {
|
157
|
+
return true;
|
130
158
|
}
|
131
|
-
|
132
|
-
if (
|
159
|
+
|
160
|
+
if (key === 'ArrowRight' && !cursorAtEnd) {
|
161
|
+
return true;
|
162
|
+
} // When in a text area, only move focus up/down if at beginning/end of the field
|
163
|
+
|
164
|
+
|
165
|
+
if (textInput instanceof HTMLTextAreaElement) {
|
166
|
+
if (key === 'ArrowUp' && !cursorAtStart) {
|
133
167
|
return true;
|
168
|
+
}
|
169
|
+
|
170
|
+
if (key === 'ArrowDown' && !cursorAtEnd) {
|
171
|
+
return true;
|
172
|
+
}
|
134
173
|
}
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
const cursorAtEnd = textInput.selectionStart === textInput.value.length && textInput.selectionEnd === textInput.value.length;
|
139
|
-
// When in a text area or text input, only move focus left/right if at beginning/end of the field
|
140
|
-
if (key === 'ArrowLeft' && !cursorAtStart) {
|
141
|
-
return true;
|
142
|
-
}
|
143
|
-
if (key === 'ArrowRight' && !cursorAtEnd) {
|
144
|
-
return true;
|
145
|
-
}
|
146
|
-
// When in a text area, only move focus up/down if at beginning/end of the field
|
147
|
-
if (textInput instanceof HTMLTextAreaElement) {
|
148
|
-
if (key === 'ArrowUp' && !cursorAtStart) {
|
149
|
-
return true;
|
150
|
-
}
|
151
|
-
if (key === 'ArrowDown' && !cursorAtEnd) {
|
152
|
-
return true;
|
153
|
-
}
|
154
|
-
}
|
155
|
-
}
|
156
|
-
return false;
|
174
|
+
}
|
175
|
+
|
176
|
+
return false;
|
157
177
|
}
|
158
|
-
|
178
|
+
|
179
|
+
const isActiveDescendantAttribute = 'data-is-active-descendant';
|
159
180
|
/**
|
160
181
|
* A value of activated-directly for data-is-active-descendant indicates the descendant was activated
|
161
182
|
* by a manual user interaction with intent to move active descendant. This usually translates to the
|
162
183
|
* user pressing one of the bound keys (up/down arrow, etc) to move through the focus zone. This is
|
163
184
|
* intended to be roughly equivalent to the :focus-visible pseudo-class
|
164
185
|
**/
|
165
|
-
|
186
|
+
|
187
|
+
exports.isActiveDescendantAttribute = isActiveDescendantAttribute;
|
188
|
+
const activeDescendantActivatedDirectly = 'activated-directly';
|
166
189
|
/**
|
167
190
|
* A value of activated-indirectly for data-is-active-descendant indicates the descendant was activated
|
168
191
|
* implicitly, and not by a direct key press. This includes focus zone being created from scratch, focusable
|
169
192
|
* elements being added/removed, and mouseover events. This is intended to be roughly equivalent
|
170
193
|
* to :focus:not(:focus-visible)
|
171
194
|
**/
|
172
|
-
|
173
|
-
exports.
|
195
|
+
|
196
|
+
exports.activeDescendantActivatedDirectly = activeDescendantActivatedDirectly;
|
197
|
+
const activeDescendantActivatedIndirectly = 'activated-indirectly';
|
198
|
+
exports.activeDescendantActivatedIndirectly = activeDescendantActivatedIndirectly;
|
199
|
+
const hasActiveDescendantAttribute = 'data-has-active-descendant';
|
174
200
|
/**
|
175
201
|
* Sets up the arrow key focus behavior for all focusable elements in the given `container`.
|
176
202
|
* @param container
|
177
203
|
* @param settings
|
178
204
|
* @returns
|
179
205
|
*/
|
206
|
+
|
207
|
+
exports.hasActiveDescendantAttribute = hasActiveDescendantAttribute;
|
208
|
+
|
180
209
|
function focusZone(container, settings) {
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
210
|
+
var _settings$bindKeys, _settings$focusOutBeh, _settings$focusInStra, _settings$abortSignal;
|
211
|
+
|
212
|
+
const focusableElements = [];
|
213
|
+
const savedTabIndex = new WeakMap();
|
214
|
+
const bindKeys = (_settings$bindKeys = settings === null || settings === void 0 ? void 0 : settings.bindKeys) !== null && _settings$bindKeys !== void 0 ? _settings$bindKeys : (settings !== null && settings !== void 0 && settings.getNextFocusable ? FocusKeys.ArrowAll : FocusKeys.ArrowVertical) | FocusKeys.HomeAndEnd;
|
215
|
+
const focusOutBehavior = (_settings$focusOutBeh = settings === null || settings === void 0 ? void 0 : settings.focusOutBehavior) !== null && _settings$focusOutBeh !== void 0 ? _settings$focusOutBeh : 'stop';
|
216
|
+
const focusInStrategy = (_settings$focusInStra = settings === null || settings === void 0 ? void 0 : settings.focusInStrategy) !== null && _settings$focusInStra !== void 0 ? _settings$focusInStra : 'previous';
|
217
|
+
const activeDescendantControl = settings === null || settings === void 0 ? void 0 : settings.activeDescendantControl;
|
218
|
+
const activeDescendantCallback = settings === null || settings === void 0 ? void 0 : settings.onActiveDescendantChanged;
|
219
|
+
let currentFocusedElement;
|
220
|
+
|
221
|
+
function getFirstFocusableElement() {
|
222
|
+
return focusableElements[0];
|
223
|
+
}
|
224
|
+
|
225
|
+
function isActiveDescendantInputFocused() {
|
226
|
+
return document.activeElement === activeDescendantControl;
|
227
|
+
}
|
228
|
+
|
229
|
+
function updateFocusedElement(to, directlyActivated = false) {
|
230
|
+
const from = currentFocusedElement;
|
231
|
+
currentFocusedElement = to;
|
232
|
+
|
233
|
+
if (activeDescendantControl) {
|
234
|
+
if (to && isActiveDescendantInputFocused()) {
|
235
|
+
setActiveDescendant(from, to, directlyActivated);
|
236
|
+
} else {
|
237
|
+
clearActiveDescendant();
|
238
|
+
}
|
239
|
+
|
240
|
+
return;
|
192
241
|
}
|
193
|
-
|
194
|
-
|
242
|
+
|
243
|
+
if (from && from !== to && savedTabIndex.has(from)) {
|
244
|
+
from.setAttribute('tabindex', '-1');
|
195
245
|
}
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
else {
|
204
|
-
clearActiveDescendant();
|
205
|
-
}
|
206
|
-
return;
|
207
|
-
}
|
208
|
-
if (from && from !== to && savedTabIndex.has(from)) {
|
209
|
-
from.setAttribute('tabindex', '-1');
|
210
|
-
}
|
211
|
-
to?.setAttribute('tabindex', '0');
|
246
|
+
|
247
|
+
to === null || to === void 0 ? void 0 : to.setAttribute('tabindex', '0');
|
248
|
+
}
|
249
|
+
|
250
|
+
function setActiveDescendant(from, to, directlyActivated = false) {
|
251
|
+
if (!to.id) {
|
252
|
+
to.setAttribute('id', (0, _uniqueId.uniqueId)());
|
212
253
|
}
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
}
|
217
|
-
if (from && from !== to) {
|
218
|
-
from.removeAttribute(exports.isActiveDescendantAttribute);
|
219
|
-
}
|
220
|
-
if (!activeDescendantControl ||
|
221
|
-
(!directlyActivated && activeDescendantControl.getAttribute('aria-activedescendant') === to.id)) {
|
222
|
-
// prevent active descendant callback from being called repeatedly if the same element is activated (e.g. via mousemove)
|
223
|
-
return;
|
224
|
-
}
|
225
|
-
activeDescendantControl.setAttribute('aria-activedescendant', to.id);
|
226
|
-
container.setAttribute(exports.hasActiveDescendantAttribute, to.id);
|
227
|
-
to.setAttribute(exports.isActiveDescendantAttribute, directlyActivated ? exports.activeDescendantActivatedDirectly : exports.activeDescendantActivatedIndirectly);
|
228
|
-
activeDescendantCallback?.(to, from, directlyActivated);
|
254
|
+
|
255
|
+
if (from && from !== to) {
|
256
|
+
from.removeAttribute(isActiveDescendantAttribute);
|
229
257
|
}
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
activeDescendantControl?.removeAttribute('aria-activedescendant');
|
235
|
-
container.removeAttribute(exports.hasActiveDescendantAttribute);
|
236
|
-
previouslyActiveElement?.removeAttribute(exports.isActiveDescendantAttribute);
|
237
|
-
activeDescendantCallback?.(undefined, previouslyActiveElement, false);
|
258
|
+
|
259
|
+
if (!activeDescendantControl || !directlyActivated && activeDescendantControl.getAttribute('aria-activedescendant') === to.id) {
|
260
|
+
// prevent active descendant callback from being called repeatedly if the same element is activated (e.g. via mousemove)
|
261
|
+
return;
|
238
262
|
}
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
// value in case we need to disable the behavior
|
250
|
-
if (!savedTabIndex.has(element)) {
|
251
|
-
savedTabIndex.set(element, element.getAttribute('tabindex'));
|
252
|
-
}
|
253
|
-
element.setAttribute('tabindex', '-1');
|
254
|
-
}
|
255
|
-
if (!currentFocusedElement) {
|
256
|
-
updateFocusedElement(getFirstFocusableElement());
|
257
|
-
}
|
263
|
+
|
264
|
+
activeDescendantControl.setAttribute('aria-activedescendant', to.id);
|
265
|
+
container.setAttribute(hasActiveDescendantAttribute, to.id);
|
266
|
+
to.setAttribute(isActiveDescendantAttribute, directlyActivated ? activeDescendantActivatedDirectly : activeDescendantActivatedIndirectly);
|
267
|
+
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(to, from, directlyActivated);
|
268
|
+
}
|
269
|
+
|
270
|
+
function clearActiveDescendant(previouslyActiveElement = currentFocusedElement) {
|
271
|
+
if (focusInStrategy === 'first') {
|
272
|
+
currentFocusedElement = undefined;
|
258
273
|
}
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
274
|
+
|
275
|
+
activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.removeAttribute('aria-activedescendant');
|
276
|
+
container.removeAttribute(hasActiveDescendantAttribute);
|
277
|
+
previouslyActiveElement === null || previouslyActiveElement === void 0 ? void 0 : previouslyActiveElement.removeAttribute(isActiveDescendantAttribute);
|
278
|
+
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(undefined, previouslyActiveElement, false);
|
279
|
+
}
|
280
|
+
|
281
|
+
function beginFocusManagement(...elements) {
|
282
|
+
const filteredElements = elements.filter(e => {
|
283
|
+
var _settings$focusableEl, _settings$focusableEl2;
|
284
|
+
|
285
|
+
return (_settings$focusableEl = settings === null || settings === void 0 ? void 0 : (_settings$focusableEl2 = settings.focusableElementFilter) === null || _settings$focusableEl2 === void 0 ? void 0 : _settings$focusableEl2.call(settings, e)) !== null && _settings$focusableEl !== void 0 ? _settings$focusableEl : true;
|
286
|
+
});
|
287
|
+
|
288
|
+
if (filteredElements.length === 0) {
|
289
|
+
return;
|
290
|
+
} // Insert all elements atomically. Assume that all passed elements are well-ordered.
|
291
|
+
|
292
|
+
|
293
|
+
const insertIndex = focusableElements.findIndex(e => (e.compareDocumentPosition(filteredElements[0]) & Node.DOCUMENT_POSITION_PRECEDING) > 0);
|
294
|
+
focusableElements.splice(insertIndex === -1 ? focusableElements.length : insertIndex, 0, ...filteredElements);
|
295
|
+
|
296
|
+
for (const element of filteredElements) {
|
297
|
+
// Set tabindex="-1" on all tabbable elements, but save the original
|
298
|
+
// value in case we need to disable the behavior
|
299
|
+
if (!savedTabIndex.has(element)) {
|
300
|
+
savedTabIndex.set(element, element.getAttribute('tabindex'));
|
301
|
+
}
|
302
|
+
|
303
|
+
element.setAttribute('tabindex', '-1');
|
304
|
+
}
|
305
|
+
|
306
|
+
if (!currentFocusedElement) {
|
307
|
+
updateFocusedElement(getFirstFocusableElement());
|
308
|
+
}
|
309
|
+
}
|
310
|
+
|
311
|
+
function endFocusManagement(...elements) {
|
312
|
+
for (const element of elements) {
|
313
|
+
const focusableElementIndex = focusableElements.indexOf(element);
|
314
|
+
|
315
|
+
if (focusableElementIndex >= 0) {
|
316
|
+
focusableElements.splice(focusableElementIndex, 1);
|
317
|
+
}
|
318
|
+
|
319
|
+
const savedIndex = savedTabIndex.get(element);
|
320
|
+
|
321
|
+
if (savedIndex !== undefined) {
|
322
|
+
if (savedIndex === null) {
|
323
|
+
element.removeAttribute('tabindex');
|
324
|
+
} else {
|
325
|
+
element.setAttribute('tabindex', savedIndex);
|
280
326
|
}
|
327
|
+
|
328
|
+
savedTabIndex.delete(element);
|
329
|
+
} // If removing the last-focused element, move focus to the first element in the list.
|
330
|
+
|
331
|
+
|
332
|
+
if (element === currentFocusedElement) {
|
333
|
+
const nextElementToFocus = getFirstFocusableElement();
|
334
|
+
updateFocusedElement(nextElementToFocus);
|
335
|
+
}
|
281
336
|
}
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
337
|
+
} // Take all tabbable elements within container under management
|
338
|
+
|
339
|
+
|
340
|
+
beginFocusManagement(...(0, _iterateFocusableElements.iterateFocusableElements)(container)); // Open the first tabbable element for tabbing
|
341
|
+
|
342
|
+
updateFocusedElement(getFirstFocusableElement()); // If the DOM structure of the container changes, make sure we keep our state up-to-date
|
343
|
+
// with respect to the focusable elements cache and its order
|
344
|
+
|
345
|
+
const observer = new MutationObserver(mutations => {
|
346
|
+
// Perform all removals first, in case element order has simply changed
|
347
|
+
for (const mutation of mutations) {
|
348
|
+
for (const removedNode of mutation.removedNodes) {
|
349
|
+
if (removedNode instanceof HTMLElement) {
|
350
|
+
endFocusManagement(...(0, _iterateFocusableElements.iterateFocusableElements)(removedNode));
|
296
351
|
}
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
352
|
+
}
|
353
|
+
}
|
354
|
+
|
355
|
+
for (const mutation of mutations) {
|
356
|
+
for (const addedNode of mutation.addedNodes) {
|
357
|
+
if (addedNode instanceof HTMLElement) {
|
358
|
+
beginFocusManagement(...(0, _iterateFocusableElements.iterateFocusableElements)(addedNode));
|
303
359
|
}
|
360
|
+
}
|
361
|
+
}
|
362
|
+
});
|
363
|
+
observer.observe(container, {
|
364
|
+
subtree: true,
|
365
|
+
childList: true
|
366
|
+
});
|
367
|
+
const controller = new AbortController();
|
368
|
+
const signal = (_settings$abortSignal = settings === null || settings === void 0 ? void 0 : settings.abortSignal) !== null && _settings$abortSignal !== void 0 ? _settings$abortSignal : controller.signal;
|
369
|
+
signal.addEventListener('abort', () => {
|
370
|
+
// Clean up any modifications
|
371
|
+
endFocusManagement(...focusableElements);
|
372
|
+
});
|
373
|
+
let elementIndexFocusedByClick = undefined;
|
374
|
+
container.addEventListener('mousedown', event => {
|
375
|
+
// Since focusin is only called when focus changes, we need to make sure the clicked
|
376
|
+
// element isn't already focused.
|
377
|
+
if (event.target instanceof HTMLElement && event.target !== document.activeElement) {
|
378
|
+
elementIndexFocusedByClick = focusableElements.indexOf(event.target);
|
379
|
+
}
|
380
|
+
}, {
|
381
|
+
signal
|
382
|
+
});
|
383
|
+
|
384
|
+
if (activeDescendantControl) {
|
385
|
+
container.addEventListener('focusin', event => {
|
386
|
+
if (event.target instanceof HTMLElement && focusableElements.includes(event.target)) {
|
387
|
+
// Move focus to the activeDescendantControl if one of the descendants is focused
|
388
|
+
activeDescendantControl.focus();
|
389
|
+
updateFocusedElement(event.target);
|
390
|
+
}
|
304
391
|
});
|
305
|
-
|
306
|
-
|
307
|
-
|
392
|
+
container.addEventListener('mousemove', ({
|
393
|
+
target
|
394
|
+
}) => {
|
395
|
+
if (!(target instanceof Node)) {
|
396
|
+
return;
|
397
|
+
}
|
398
|
+
|
399
|
+
const focusableElement = focusableElements.find(element => element.contains(target));
|
400
|
+
|
401
|
+
if (focusableElement) {
|
402
|
+
updateFocusedElement(focusableElement);
|
403
|
+
}
|
404
|
+
}, {
|
405
|
+
signal,
|
406
|
+
capture: true
|
407
|
+
}); // Listeners specifically on the controlling element
|
408
|
+
|
409
|
+
activeDescendantControl.addEventListener('focusin', () => {
|
410
|
+
// Focus moved into the active descendant input. Activate current or first descendant.
|
411
|
+
if (!currentFocusedElement) {
|
412
|
+
updateFocusedElement(getFirstFocusableElement());
|
413
|
+
} else {
|
414
|
+
setActiveDescendant(undefined, currentFocusedElement);
|
415
|
+
}
|
308
416
|
});
|
309
|
-
|
310
|
-
|
311
|
-
signal.addEventListener('abort', () => {
|
312
|
-
// Clean up any modifications
|
313
|
-
endFocusManagement(...focusableElements);
|
417
|
+
activeDescendantControl.addEventListener('focusout', () => {
|
418
|
+
clearActiveDescendant();
|
314
419
|
});
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
if (event.target instanceof HTMLElement && focusableElements.includes(event.target)) {
|
326
|
-
// Move focus to the activeDescendantControl if one of the descendants is focused
|
327
|
-
activeDescendantControl.focus();
|
328
|
-
updateFocusedElement(event.target);
|
329
|
-
}
|
330
|
-
});
|
331
|
-
container.addEventListener('mousemove', ({ target }) => {
|
332
|
-
if (!(target instanceof Node)) {
|
333
|
-
return;
|
334
|
-
}
|
335
|
-
const focusableElement = focusableElements.find(element => element.contains(target));
|
336
|
-
if (focusableElement) {
|
337
|
-
updateFocusedElement(focusableElement);
|
420
|
+
} else {
|
421
|
+
// This is called whenever focus enters an element in the container
|
422
|
+
container.addEventListener('focusin', event => {
|
423
|
+
if (event.target instanceof HTMLElement) {
|
424
|
+
// If a click initiated the focus movement, we always want to set our internal state
|
425
|
+
// to reflect the clicked element as the currently focused one.
|
426
|
+
if (elementIndexFocusedByClick !== undefined) {
|
427
|
+
if (elementIndexFocusedByClick >= 0) {
|
428
|
+
if (focusableElements[elementIndexFocusedByClick] !== currentFocusedElement) {
|
429
|
+
updateFocusedElement(focusableElements[elementIndexFocusedByClick]);
|
338
430
|
}
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
431
|
+
}
|
432
|
+
|
433
|
+
elementIndexFocusedByClick = undefined;
|
434
|
+
} else {
|
435
|
+
// Set tab indexes and internal state based on the focus handling strategy
|
436
|
+
if (focusInStrategy === 'previous') {
|
437
|
+
updateFocusedElement(event.target);
|
438
|
+
} else if (focusInStrategy === 'closest' || focusInStrategy === 'first') {
|
439
|
+
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
440
|
+
// Regardless of the previously focused element, if we're coming from outside the
|
441
|
+
// container, put focus onto the first encountered element (from above, it's The
|
442
|
+
// first element of the container; from below, it's the last). If the
|
443
|
+
// focusInStrategy is set to "first", lastKeyboardFocusDirection will always
|
444
|
+
// be undefined.
|
445
|
+
const targetElementIndex = lastKeyboardFocusDirection === 'previous' ? focusableElements.length - 1 : 0;
|
446
|
+
const targetElement = focusableElements[targetElementIndex];
|
447
|
+
targetElement === null || targetElement === void 0 ? void 0 : targetElement.focus();
|
448
|
+
return;
|
449
|
+
} else {
|
450
|
+
updateFocusedElement(event.target);
|
345
451
|
}
|
346
|
-
|
347
|
-
|
452
|
+
} else if (typeof focusInStrategy === 'function') {
|
453
|
+
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
454
|
+
const elementToFocus = focusInStrategy(event.relatedTarget);
|
455
|
+
const requestedFocusElementIndex = elementToFocus ? focusableElements.indexOf(elementToFocus) : -1;
|
456
|
+
|
457
|
+
if (requestedFocusElementIndex >= 0 && elementToFocus instanceof HTMLElement) {
|
458
|
+
// Since we are calling focus() this handler will run again synchronously. Therefore,
|
459
|
+
// we don't want to let this invocation finish since it will clobber the value of
|
460
|
+
// currentFocusedElement.
|
461
|
+
elementToFocus.focus();
|
462
|
+
return;
|
463
|
+
} else {
|
464
|
+
// eslint-disable-next-line no-console
|
465
|
+
console.warn('Element requested is not a known focusable element.');
|
466
|
+
}
|
467
|
+
} else {
|
468
|
+
updateFocusedElement(event.target);
|
348
469
|
}
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
470
|
+
}
|
471
|
+
}
|
472
|
+
}
|
473
|
+
|
474
|
+
lastKeyboardFocusDirection = undefined;
|
475
|
+
}, {
|
476
|
+
signal
|
477
|
+
});
|
478
|
+
}
|
479
|
+
|
480
|
+
const keyboardEventRecipient = activeDescendantControl !== null && activeDescendantControl !== void 0 ? activeDescendantControl : container; // If the strategy is "closest", we need to capture the direction that the user
|
481
|
+
// is trying to move focus before our focusin handler is executed.
|
482
|
+
|
483
|
+
let lastKeyboardFocusDirection = undefined;
|
484
|
+
|
485
|
+
if (focusInStrategy === 'closest') {
|
486
|
+
document.addEventListener('keydown', event => {
|
487
|
+
if (event.key === 'Tab') {
|
488
|
+
lastKeyboardFocusDirection = getDirection(event);
|
489
|
+
}
|
490
|
+
}, {
|
491
|
+
signal,
|
492
|
+
capture: true
|
493
|
+
});
|
494
|
+
}
|
495
|
+
|
496
|
+
function getCurrentFocusedIndex() {
|
497
|
+
if (!currentFocusedElement) {
|
498
|
+
return 0;
|
353
499
|
}
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
elementToFocus.focus();
|
398
|
-
return;
|
399
|
-
}
|
400
|
-
else {
|
401
|
-
// eslint-disable-next-line no-console
|
402
|
-
console.warn('Element requested is not a known focusable element.');
|
403
|
-
}
|
404
|
-
}
|
405
|
-
else {
|
406
|
-
updateFocusedElement(event.target);
|
407
|
-
}
|
408
|
-
}
|
409
|
-
}
|
500
|
+
|
501
|
+
const focusedIndex = focusableElements.indexOf(currentFocusedElement);
|
502
|
+
const fallbackIndex = currentFocusedElement === container ? -1 : 0;
|
503
|
+
return focusedIndex !== -1 ? focusedIndex : fallbackIndex;
|
504
|
+
} // "keydown" is the event that triggers DOM focus change, so that is what we use here
|
505
|
+
|
506
|
+
|
507
|
+
keyboardEventRecipient.addEventListener('keydown', event => {
|
508
|
+
if (event.key in KEY_TO_DIRECTION) {
|
509
|
+
const keyBit = KEY_TO_BIT[event.key]; // Check if the pressed key (keyBit) is one that is being used for focus (bindKeys)
|
510
|
+
|
511
|
+
if (!event.defaultPrevented && (keyBit & bindKeys) > 0 && !shouldIgnoreFocusHandling(event, document.activeElement)) {
|
512
|
+
// Moving forward or backward?
|
513
|
+
const direction = getDirection(event);
|
514
|
+
let nextElementToFocus = undefined; // If there is a custom function that retrieves the next focusable element, try calling that first.
|
515
|
+
|
516
|
+
if (settings !== null && settings !== void 0 && settings.getNextFocusable) {
|
517
|
+
var _document$activeEleme;
|
518
|
+
|
519
|
+
nextElementToFocus = settings.getNextFocusable(direction, (_document$activeEleme = document.activeElement) !== null && _document$activeEleme !== void 0 ? _document$activeEleme : undefined, event);
|
520
|
+
}
|
521
|
+
|
522
|
+
if (!nextElementToFocus) {
|
523
|
+
const lastFocusedIndex = getCurrentFocusedIndex();
|
524
|
+
let nextFocusedIndex = lastFocusedIndex;
|
525
|
+
|
526
|
+
if (direction === 'previous') {
|
527
|
+
nextFocusedIndex -= 1;
|
528
|
+
} else if (direction === 'start') {
|
529
|
+
nextFocusedIndex = 0;
|
530
|
+
} else if (direction === 'next') {
|
531
|
+
nextFocusedIndex += 1;
|
532
|
+
} else {
|
533
|
+
// end
|
534
|
+
nextFocusedIndex = focusableElements.length - 1;
|
535
|
+
}
|
536
|
+
|
537
|
+
if (nextFocusedIndex < 0) {
|
538
|
+
// Tab should never cause focus to wrap. Use focusTrap for that behavior.
|
539
|
+
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
540
|
+
nextFocusedIndex = focusableElements.length - 1;
|
541
|
+
} else {
|
542
|
+
nextFocusedIndex = 0;
|
410
543
|
}
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
if (focusInStrategy === 'closest') {
|
419
|
-
document.addEventListener('keydown', event => {
|
420
|
-
if (event.key === 'Tab') {
|
421
|
-
lastKeyboardFocusDirection = getDirection(event);
|
544
|
+
}
|
545
|
+
|
546
|
+
if (nextFocusedIndex >= focusableElements.length) {
|
547
|
+
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
548
|
+
nextFocusedIndex = 0;
|
549
|
+
} else {
|
550
|
+
nextFocusedIndex = focusableElements.length - 1;
|
422
551
|
}
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
552
|
+
}
|
553
|
+
|
554
|
+
if (lastFocusedIndex !== nextFocusedIndex) {
|
555
|
+
nextElementToFocus = focusableElements[nextFocusedIndex];
|
556
|
+
}
|
428
557
|
}
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
const direction = getDirection(event);
|
443
|
-
let nextElementToFocus = undefined;
|
444
|
-
// If there is a custom function that retrieves the next focusable element, try calling that first.
|
445
|
-
if (settings?.getNextFocusable) {
|
446
|
-
nextElementToFocus = settings.getNextFocusable(direction, document.activeElement ?? undefined, event);
|
447
|
-
}
|
448
|
-
if (!nextElementToFocus) {
|
449
|
-
const lastFocusedIndex = getCurrentFocusedIndex();
|
450
|
-
let nextFocusedIndex = lastFocusedIndex;
|
451
|
-
if (direction === 'previous') {
|
452
|
-
nextFocusedIndex -= 1;
|
453
|
-
}
|
454
|
-
else if (direction === 'start') {
|
455
|
-
nextFocusedIndex = 0;
|
456
|
-
}
|
457
|
-
else if (direction === 'next') {
|
458
|
-
nextFocusedIndex += 1;
|
459
|
-
}
|
460
|
-
else {
|
461
|
-
// end
|
462
|
-
nextFocusedIndex = focusableElements.length - 1;
|
463
|
-
}
|
464
|
-
if (nextFocusedIndex < 0) {
|
465
|
-
// Tab should never cause focus to wrap. Use focusTrap for that behavior.
|
466
|
-
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
467
|
-
nextFocusedIndex = focusableElements.length - 1;
|
468
|
-
}
|
469
|
-
else {
|
470
|
-
nextFocusedIndex = 0;
|
471
|
-
}
|
472
|
-
}
|
473
|
-
if (nextFocusedIndex >= focusableElements.length) {
|
474
|
-
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
475
|
-
nextFocusedIndex = 0;
|
476
|
-
}
|
477
|
-
else {
|
478
|
-
nextFocusedIndex = focusableElements.length - 1;
|
479
|
-
}
|
480
|
-
}
|
481
|
-
if (lastFocusedIndex !== nextFocusedIndex) {
|
482
|
-
nextElementToFocus = focusableElements[nextFocusedIndex];
|
483
|
-
}
|
484
|
-
}
|
485
|
-
if (activeDescendantControl) {
|
486
|
-
updateFocusedElement(nextElementToFocus || currentFocusedElement, true);
|
487
|
-
}
|
488
|
-
else if (nextElementToFocus) {
|
489
|
-
lastKeyboardFocusDirection = direction;
|
490
|
-
// updateFocusedElement will be called implicitly when focus moves, as long as the event isn't prevented somehow
|
491
|
-
nextElementToFocus.focus();
|
492
|
-
}
|
493
|
-
// Tab should always allow escaping from this container, so only
|
494
|
-
// preventDefault if tab key press already resulted in a focus movement
|
495
|
-
if (event.key !== 'Tab' || nextElementToFocus) {
|
496
|
-
event.preventDefault();
|
497
|
-
}
|
498
|
-
}
|
558
|
+
|
559
|
+
if (activeDescendantControl) {
|
560
|
+
updateFocusedElement(nextElementToFocus || currentFocusedElement, true);
|
561
|
+
} else if (nextElementToFocus) {
|
562
|
+
lastKeyboardFocusDirection = direction; // updateFocusedElement will be called implicitly when focus moves, as long as the event isn't prevented somehow
|
563
|
+
|
564
|
+
nextElementToFocus.focus();
|
565
|
+
} // Tab should always allow escaping from this container, so only
|
566
|
+
// preventDefault if tab key press already resulted in a focus movement
|
567
|
+
|
568
|
+
|
569
|
+
if (event.key !== 'Tab' || nextElementToFocus) {
|
570
|
+
event.preventDefault();
|
499
571
|
}
|
500
|
-
|
501
|
-
|
502
|
-
}
|
503
|
-
|
572
|
+
}
|
573
|
+
}
|
574
|
+
}, {
|
575
|
+
signal
|
576
|
+
});
|
577
|
+
return controller;
|
578
|
+
}
|