@primer/components 0.0.0-20219922627 → 0.0.0-2022530201059
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/CHANGELOG.md +105 -492
- package/README.md +16 -16
- package/codemods/lib/modifyProps.js +7 -9
- package/codemods/lib/prettify.js +1 -1
- package/codemods/lib/replaceImportSource.js +5 -5
- package/dist/browser.esm.js +801 -1115
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +815 -1134
- package/dist/browser.umd.js.map +1 -1
- package/index.d.ts +940 -0
- package/lib/AvatarPair.js +5 -6
- package/lib/AvatarStack.js +10 -10
- package/lib/BaseStyles.js +19 -18
- package/lib/BorderBox.js +5 -4
- package/lib/Box.js +2 -2
- package/lib/BranchName.js +1 -1
- package/lib/{Breadcrumbs.js → Breadcrumb.js} +23 -33
- package/lib/Button/Button.js +3 -3
- package/lib/Button/ButtonClose.js +4 -4
- package/lib/Button/ButtonDanger.js +2 -2
- package/lib/Button/ButtonInvisible.js +3 -3
- package/lib/Button/ButtonOutline.js +2 -2
- package/lib/Button/ButtonPrimary.js +2 -2
- package/lib/Button/ButtonTableList.js +1 -1
- package/lib/CircleBadge.js +1 -1
- package/lib/CircleOcticon.js +7 -9
- package/lib/CounterLabel.js +2 -2
- package/lib/Dialog.js +14 -13
- package/lib/Dropdown.js +2 -2
- package/lib/DropdownStyles.js +6 -6
- package/lib/FilterList.js +1 -1
- package/lib/Flash.js +1 -1
- package/lib/Flex.js +0 -3
- package/lib/Grid.js +3 -4
- package/lib/Header.js +2 -3
- package/lib/Label.js +4 -4
- package/lib/Link.js +12 -1
- package/lib/Overlay.js +35 -120
- package/lib/Pagehead.js +1 -1
- package/lib/Pagination/Pagination.js +2 -3
- package/lib/Popover.js +3 -3
- package/lib/Portal/Portal.js +12 -20
- package/lib/Position.js +27 -46
- package/lib/ProgressBar.js +1 -1
- package/lib/SelectMenu/SelectMenu.js +4 -4
- package/lib/SelectMenu/SelectMenuContext.js +1 -1
- package/lib/SelectMenu/SelectMenuDivider.js +3 -3
- package/lib/SelectMenu/SelectMenuFilter.js +6 -6
- package/lib/SelectMenu/SelectMenuFooter.js +3 -3
- package/lib/SelectMenu/SelectMenuHeader.js +2 -2
- package/lib/SelectMenu/SelectMenuItem.js +4 -4
- package/lib/SelectMenu/SelectMenuList.js +3 -3
- package/lib/SelectMenu/SelectMenuLoadingAnimation.js +15 -4
- package/lib/SelectMenu/SelectMenuModal.js +7 -7
- package/lib/SelectMenu/SelectMenuTab.js +3 -3
- package/lib/SelectMenu/SelectMenuTabPanel.js +3 -3
- package/lib/SelectMenu/SelectMenuTabs.js +2 -2
- package/lib/SelectMenu/hooks/useKeyboardNav.js +0 -2
- package/lib/SideNav.js +12 -20
- package/lib/StateLabel.js +4 -4
- package/lib/SubNav.js +3 -5
- package/lib/TabNav.js +3 -3
- package/lib/TextInput.js +19 -24
- package/lib/ThemeProvider.js +15 -32
- package/lib/Timeline.js +29 -24
- package/lib/Tooltip.js +1 -2
- package/lib/UnderlineNav.js +2 -2
- package/lib/behaviors/anchoredPosition.js +9 -17
- package/lib/behaviors/focusTrap.js +14 -32
- package/lib/behaviors/focusZone.js +148 -218
- package/lib/constants.js +2 -3
- package/lib/hooks/index.js +1 -9
- package/lib/hooks/useAnchoredPosition.js +4 -11
- package/lib/hooks/useDialog.js +1 -1
- package/lib/hooks/useFocusTrap.js +8 -26
- package/lib/hooks/useFocusZone.js +7 -7
- package/lib/hooks/useMouseIntent.js +58 -0
- package/lib/hooks/useOnEscapePress.js +10 -53
- package/lib/hooks/useOnOutsideClick.js +35 -62
- package/lib/hooks/useOpenAndCloseFocus.js +1 -1
- package/lib/hooks/useOverlay.js +17 -5
- package/lib/hooks/useSafeTimeout.js +0 -1
- package/lib/index.js +12 -76
- package/lib/polyfills/eventListenerSignal.js +1 -6
- package/lib/stories/Button.stories.js +114 -0
- package/lib/stories/Overlay.stories.js +102 -0
- package/lib/stories/Portal.stories.js +108 -0
- package/lib/stories/ThemeProvider.stories.js +95 -0
- package/lib/stories/useAnchoredPosition.stories.js +349 -0
- package/lib/stories/useFocusTrap.stories.js +278 -0
- package/lib/stories/useFocusZone.stories.js +490 -0
- package/lib/theme-preval.js +2057 -5148
- package/lib/utils/deprecate.js +2 -3
- package/lib/utils/isNumeric.js +0 -1
- package/lib/utils/iterateFocusableElements.js +1 -1
- package/lib/utils/test-deprecations.js +0 -1
- package/lib/utils/test-matchers.js +12 -3
- package/lib/utils/testing.js +4 -4
- package/lib/utils/theme.js +1 -1
- package/lib/utils/uniqueId.js +0 -1
- package/lib-esm/AvatarPair.js +5 -6
- package/lib-esm/AvatarStack.js +11 -11
- package/lib-esm/BaseStyles.js +16 -16
- package/lib-esm/BorderBox.js +3 -5
- package/lib-esm/Box.js +2 -2
- package/lib-esm/BranchName.js +1 -1
- package/lib-esm/{Breadcrumbs.js → Breadcrumb.js} +22 -32
- package/lib-esm/Button/Button.js +1 -1
- package/lib-esm/Button/ButtonClose.js +2 -2
- package/lib-esm/Button/ButtonInvisible.js +1 -1
- package/lib-esm/Button/ButtonTableList.js +1 -1
- package/lib-esm/CircleBadge.js +1 -1
- package/lib-esm/CircleOcticon.js +6 -9
- package/lib-esm/CounterLabel.js +2 -2
- package/lib-esm/Dialog.js +12 -10
- package/lib-esm/Dropdown.js +2 -2
- package/lib-esm/DropdownStyles.js +6 -6
- package/lib-esm/FilterList.js +1 -1
- package/lib-esm/Flash.js +1 -1
- package/lib-esm/Flex.js +0 -4
- package/lib-esm/Grid.js +2 -5
- package/lib-esm/Header.js +0 -1
- package/lib-esm/Label.js +2 -2
- package/lib-esm/Link.js +12 -1
- package/lib-esm/Overlay.js +37 -115
- package/lib-esm/Pagehead.js +1 -1
- package/lib-esm/Pagination/Pagination.js +2 -3
- package/lib-esm/Popover.js +3 -3
- package/lib-esm/Portal/Portal.js +12 -19
- package/lib-esm/Portal/index.js +1 -1
- package/lib-esm/Position.js +20 -45
- package/lib-esm/ProgressBar.js +1 -1
- package/lib-esm/SelectMenu/SelectMenu.js +3 -3
- package/lib-esm/SelectMenu/SelectMenuContext.js +1 -1
- package/lib-esm/SelectMenu/SelectMenuDivider.js +1 -1
- package/lib-esm/SelectMenu/SelectMenuFilter.js +4 -4
- package/lib-esm/SelectMenu/SelectMenuFooter.js +1 -1
- package/lib-esm/SelectMenu/SelectMenuHeader.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuItem.js +2 -2
- package/lib-esm/SelectMenu/SelectMenuList.js +1 -1
- package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.js +10 -5
- package/lib-esm/SelectMenu/SelectMenuModal.js +5 -5
- package/lib-esm/SelectMenu/SelectMenuTab.js +1 -1
- package/lib-esm/SelectMenu/SelectMenuTabPanel.js +1 -1
- package/lib-esm/SelectMenu/hooks/useKeyboardNav.js +0 -2
- package/lib-esm/SideNav.js +7 -16
- package/lib-esm/StateLabel.js +4 -4
- package/lib-esm/SubNav.js +4 -7
- package/lib-esm/TabNav.js +4 -5
- package/lib-esm/TextInput.js +17 -23
- package/lib-esm/ThemeProvider.js +16 -31
- package/lib-esm/Timeline.js +24 -19
- package/lib-esm/Tooltip.js +1 -2
- package/lib-esm/UnderlineNav.js +3 -4
- package/lib-esm/behaviors/anchoredPosition.js +9 -17
- package/lib-esm/behaviors/focusTrap.js +14 -32
- package/lib-esm/behaviors/focusZone.js +148 -213
- package/lib-esm/constants.js +1 -2
- package/lib-esm/hooks/index.js +1 -2
- package/lib-esm/hooks/useAnchoredPosition.js +5 -10
- package/lib-esm/hooks/useDialog.js +1 -1
- package/lib-esm/hooks/useFocusTrap.js +8 -25
- package/lib-esm/hooks/useFocusZone.js +5 -5
- package/lib-esm/hooks/useMouseIntent.js +50 -0
- package/lib-esm/hooks/useOnEscapePress.js +10 -53
- package/lib-esm/hooks/useOnOutsideClick.js +37 -62
- package/lib-esm/hooks/useOpenAndCloseFocus.js +1 -1
- package/lib-esm/hooks/useOverlay.js +16 -5
- package/lib-esm/hooks/useSafeTimeout.js +0 -1
- package/lib-esm/index.js +10 -19
- package/lib-esm/polyfills/eventListenerSignal.js +1 -6
- package/lib-esm/stories/Button.stories.js +79 -0
- package/lib-esm/stories/Overlay.stories.js +80 -0
- package/lib-esm/stories/Portal.stories.js +72 -0
- package/lib-esm/stories/ThemeProvider.stories.js +76 -0
- package/lib-esm/stories/useAnchoredPosition.stories.js +311 -0
- package/lib-esm/stories/useFocusTrap.stories.js +234 -0
- package/lib-esm/stories/useFocusZone.stories.js +445 -0
- package/lib-esm/theme-preval.js +2057 -5148
- package/lib-esm/utils/deprecate.js +2 -3
- package/lib-esm/utils/isNumeric.js +0 -1
- package/lib-esm/utils/iterateFocusableElements.js +1 -1
- package/lib-esm/utils/test-deprecations.js +1 -1
- package/lib-esm/utils/test-matchers.js +11 -3
- package/lib-esm/utils/testing.js +6 -6
- package/lib-esm/utils/theme.js +1 -1
- package/lib-esm/utils/types.js +0 -1
- package/lib-esm/utils/uniqueId.js +0 -1
- package/package.json +95 -103
- package/codemods/__tests__/deprecateUtilityComponents.js +0 -200
- package/codemods/__tests__/removeSystemProps.js +0 -225
- package/codemods/deprecateUtilityComponents.js +0 -111
- package/codemods/removeSystemProps.js +0 -312
- package/lib/ActionList/Divider.d.ts +0 -9
- package/lib/ActionList/Divider.js +0 -40
- package/lib/ActionList/Group.d.ts +0 -28
- package/lib/ActionList/Group.js +0 -35
- package/lib/ActionList/Header.d.ts +0 -29
- package/lib/ActionList/Header.js +0 -51
- package/lib/ActionList/Item.d.ts +0 -92
- package/lib/ActionList/Item.js +0 -288
- package/lib/ActionList/List.d.ts +0 -87
- package/lib/ActionList/List.js +0 -199
- package/lib/ActionList/index.d.ts +0 -17
- package/lib/ActionList/index.js +0 -29
- package/lib/ActionMenu.d.ts +0 -40
- package/lib/ActionMenu.js +0 -103
- package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +0 -61
- package/lib/AnchoredOverlay/AnchoredOverlay.js +0 -116
- package/lib/AnchoredOverlay/index.d.ts +0 -2
- package/lib/AnchoredOverlay/index.js +0 -13
- package/lib/Avatar.d.ts +0 -15
- package/lib/AvatarPair.d.ts +0 -8
- package/lib/AvatarStack.d.ts +0 -8
- package/lib/BaseStyles.d.ts +0 -14
- package/lib/BorderBox.d.ts +0 -7
- package/lib/Box.d.ts +0 -6
- package/lib/BranchName.d.ts +0 -6
- package/lib/Breadcrumbs.d.ts +0 -40
- package/lib/Button/Button.d.ts +0 -284
- package/lib/Button/ButtonBase.d.ts +0 -12
- package/lib/Button/ButtonClose.d.ts +0 -321
- package/lib/Button/ButtonDanger.d.ts +0 -284
- package/lib/Button/ButtonGroup.d.ts +0 -4
- package/lib/Button/ButtonInvisible.d.ts +0 -284
- package/lib/Button/ButtonOutline.d.ts +0 -284
- package/lib/Button/ButtonPrimary.d.ts +0 -284
- package/lib/Button/ButtonStyles.d.ts +0 -2
- package/lib/Button/ButtonTableList.d.ts +0 -6
- package/lib/Button/index.d.ts +0 -16
- package/lib/Caret.d.ts +0 -21
- package/lib/CircleBadge.d.ts +0 -25
- package/lib/CircleOcticon.d.ts +0 -391
- package/lib/CounterLabel.d.ts +0 -8
- package/lib/DatePicker/DatePicker.d.ts +0 -35
- package/lib/DatePicker/DatePicker.js +0 -37
- package/lib/DatePicker/DatePickerPanel.d.ts +0 -0
- package/lib/DatePicker/DatePickerPanel.js +0 -1
- package/lib/DatePicker/Day.d.ts +0 -12
- package/lib/DatePicker/Day.js +0 -44
- package/lib/DatePicker/Month.d.ts +0 -10
- package/lib/DatePicker/Month.js +0 -28
- package/lib/DatePicker/index.d.ts +0 -2
- package/lib/DatePicker/index.js +0 -13
- package/lib/Details.d.ts +0 -6
- package/lib/Dialog/ConfirmationDialog.d.ts +0 -44
- package/lib/Dialog/ConfirmationDialog.js +0 -191
- package/lib/Dialog/Dialog.d.ts +0 -167
- package/lib/Dialog/Dialog.js +0 -304
- package/lib/Dialog.d.ts +0 -406
- package/lib/Dropdown.d.ts +0 -1262
- package/lib/DropdownMenu/DropdownButton.d.ts +0 -323
- package/lib/DropdownMenu/DropdownButton.js +0 -31
- package/lib/DropdownMenu/DropdownMenu.d.ts +0 -43
- package/lib/DropdownMenu/DropdownMenu.js +0 -94
- package/lib/DropdownMenu/index.d.ts +0 -4
- package/lib/DropdownMenu/index.js +0 -21
- package/lib/DropdownStyles.d.ts +0 -3
- package/lib/FilterList.d.ts +0 -321
- package/lib/FilteredActionList/FilteredActionList.d.ts +0 -16
- package/lib/FilteredActionList/FilteredActionList.js +0 -163
- package/lib/FilteredActionList/index.d.ts +0 -2
- package/lib/FilteredActionList/index.js +0 -13
- package/lib/FilteredSearch.d.ts +0 -6
- package/lib/Flash.d.ts +0 -9
- package/lib/Flex.d.ts +0 -7
- package/lib/FormGroup.d.ts +0 -12
- package/lib/Grid.d.ts +0 -7
- package/lib/Header.d.ts +0 -24
- package/lib/Heading.d.ts +0 -6
- package/lib/Label.d.ts +0 -11
- package/lib/LabelGroup.d.ts +0 -6
- package/lib/Link.d.ts +0 -10
- package/lib/Overlay.d.ts +0 -62
- package/lib/Pagehead.d.ts +0 -6
- package/lib/Pagination/Pagination.d.ts +0 -24
- package/lib/Pagination/index.d.ts +0 -3
- package/lib/Pagination/model.d.ts +0 -26
- package/lib/PointerBox.d.ts +0 -11
- package/lib/Popover.d.ts +0 -21
- package/lib/Portal/Portal.d.ts +0 -25
- package/lib/Portal/index.d.ts +0 -4
- package/lib/Position.d.ts +0 -34
- package/lib/ProgressBar.d.ts +0 -21
- package/lib/SelectMenu/SelectMenu.d.ts +0 -1832
- package/lib/SelectMenu/SelectMenuContext.d.ts +0 -8
- package/lib/SelectMenu/SelectMenuDivider.d.ts +0 -6
- package/lib/SelectMenu/SelectMenuFilter.d.ts +0 -9
- package/lib/SelectMenu/SelectMenuFooter.d.ts +0 -6
- package/lib/SelectMenu/SelectMenuHeader.d.ts +0 -11
- package/lib/SelectMenu/SelectMenuItem.d.ts +0 -15
- package/lib/SelectMenu/SelectMenuList.d.ts +0 -6
- package/lib/SelectMenu/SelectMenuLoadingAnimation.d.ts +0 -7
- package/lib/SelectMenu/SelectMenuModal.d.ts +0 -15
- package/lib/SelectMenu/SelectMenuTab.d.ts +0 -14
- package/lib/SelectMenu/SelectMenuTabPanel.d.ts +0 -13
- package/lib/SelectMenu/SelectMenuTabs.d.ts +0 -11
- package/lib/SelectMenu/hooks/useKeyboardNav.d.ts +0 -2
- package/lib/SelectMenu/index.d.ts +0 -2
- package/lib/SelectPanel/SelectPanel.d.ts +0 -25
- package/lib/SelectPanel/SelectPanel.js +0 -147
- package/lib/SelectPanel/index.d.ts +0 -2
- package/lib/SelectPanel/index.js +0 -13
- package/lib/SideNav.d.ts +0 -31
- package/lib/Spinner.d.ts +0 -17
- package/lib/Spinner.js +0 -60
- package/lib/StateLabel.d.ts +0 -16
- package/lib/StyledOcticon.d.ts +0 -12
- package/lib/SubNav.d.ts +0 -32
- package/lib/TabNav.d.ts +0 -20
- package/lib/Text.d.ts +0 -6
- package/lib/TextInput.d.ts +0 -22
- package/lib/ThemeProvider.d.ts +0 -26
- package/lib/Timeline.d.ts +0 -407
- package/lib/Tooltip.d.ts +0 -18
- package/lib/Truncate.d.ts +0 -11
- package/lib/UnderlineNav.d.ts +0 -25
- package/lib/behaviors/anchoredPosition.d.ts +0 -89
- package/lib/behaviors/focusTrap.d.ts +0 -12
- package/lib/behaviors/focusZone.d.ts +0 -137
- package/lib/constants.d.ts +0 -20
- package/lib/hooks/index.d.ts +0 -11
- package/lib/hooks/useAnchoredPosition.d.ts +0 -20
- package/lib/hooks/useCombinedRefs.d.ts +0 -10
- package/lib/hooks/useCombinedRefs.js +0 -49
- package/lib/hooks/useDetails.d.ts +0 -17
- package/lib/hooks/useDialog.d.ts +0 -16
- package/lib/hooks/useFocusTrap.d.ts +0 -32
- package/lib/hooks/useFocusZone.d.ts +0 -23
- package/lib/hooks/useOnEscapePress.d.ts +0 -23
- package/lib/hooks/useOnOutsideClick.d.ts +0 -8
- package/lib/hooks/useOpenAndCloseFocus.d.ts +0 -7
- package/lib/hooks/useOverlay.d.ts +0 -14
- package/lib/hooks/useProvidedRefOrCreate.d.ts +0 -10
- package/lib/hooks/useProvidedStateOrCreate.d.ts +0 -10
- package/lib/hooks/useProvidedStateOrCreate.js +0 -27
- package/lib/hooks/useRenderForcingRef.d.ts +0 -8
- package/lib/hooks/useRenderForcingRef.js +0 -25
- package/lib/hooks/useResizeObserver.d.ts +0 -1
- package/lib/hooks/useResizeObserver.js +0 -20
- package/lib/hooks/useSafeTimeout.d.ts +0 -12
- package/lib/hooks/useScrollFlash.d.ts +0 -6
- package/lib/hooks/useScrollFlash.js +0 -29
- package/lib/index.d.ts +0 -111
- package/lib/polyfills/eventListenerSignal.d.ts +0 -6
- package/lib/sx.d.ts +0 -6
- package/lib/theme-preval.d.ts +0 -49
- package/lib/theme.d.ts +0 -2
- package/lib/utils/deprecate.d.ts +0 -18
- package/lib/utils/isNumeric.d.ts +0 -1
- package/lib/utils/iterateFocusableElements.d.ts +0 -42
- package/lib/utils/ssr.d.ts +0 -1
- package/lib/utils/ssr.js +0 -19
- package/lib/utils/test-deprecations.d.ts +0 -1
- package/lib/utils/test-helpers.d.ts +0 -0
- package/lib/utils/test-helpers.js +0 -9
- package/lib/utils/test-matchers.d.ts +0 -1
- package/lib/utils/testing.d.ts +0 -1028
- package/lib/utils/theme.d.ts +0 -9
- package/lib/utils/types.d.ts +0 -14
- package/lib/utils/uniqueId.d.ts +0 -1
- package/lib/utils/userAgent.d.ts +0 -1
- package/lib-esm/ActionList/Divider.d.ts +0 -9
- package/lib-esm/ActionList/Divider.js +0 -23
- package/lib-esm/ActionList/Group.d.ts +0 -28
- package/lib-esm/ActionList/Group.js +0 -24
- package/lib-esm/ActionList/Header.d.ts +0 -29
- package/lib-esm/ActionList/Header.js +0 -33
- package/lib-esm/ActionList/Item.d.ts +0 -92
- package/lib-esm/ActionList/Item.js +0 -253
- package/lib-esm/ActionList/List.d.ts +0 -87
- package/lib-esm/ActionList/List.js +0 -181
- package/lib-esm/ActionList/index.d.ts +0 -17
- package/lib-esm/ActionList/index.js +0 -18
- package/lib-esm/ActionMenu.d.ts +0 -40
- package/lib-esm/ActionMenu.js +0 -82
- package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +0 -61
- package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +0 -96
- package/lib-esm/AnchoredOverlay/index.d.ts +0 -2
- package/lib-esm/AnchoredOverlay/index.js +0 -1
- package/lib-esm/Avatar.d.ts +0 -15
- package/lib-esm/AvatarPair.d.ts +0 -8
- package/lib-esm/AvatarStack.d.ts +0 -8
- package/lib-esm/BaseStyles.d.ts +0 -14
- package/lib-esm/BorderBox.d.ts +0 -7
- package/lib-esm/Box.d.ts +0 -6
- package/lib-esm/BranchName.d.ts +0 -6
- package/lib-esm/Breadcrumbs.d.ts +0 -40
- package/lib-esm/Button/Button.d.ts +0 -284
- package/lib-esm/Button/ButtonBase.d.ts +0 -12
- package/lib-esm/Button/ButtonClose.d.ts +0 -321
- package/lib-esm/Button/ButtonDanger.d.ts +0 -284
- package/lib-esm/Button/ButtonGroup.d.ts +0 -4
- package/lib-esm/Button/ButtonInvisible.d.ts +0 -284
- package/lib-esm/Button/ButtonOutline.d.ts +0 -284
- package/lib-esm/Button/ButtonPrimary.d.ts +0 -284
- package/lib-esm/Button/ButtonStyles.d.ts +0 -2
- package/lib-esm/Button/ButtonTableList.d.ts +0 -6
- package/lib-esm/Button/index.d.ts +0 -16
- package/lib-esm/Caret.d.ts +0 -21
- package/lib-esm/CircleBadge.d.ts +0 -25
- package/lib-esm/CircleOcticon.d.ts +0 -391
- package/lib-esm/CounterLabel.d.ts +0 -8
- package/lib-esm/DatePicker/DatePicker.d.ts +0 -35
- package/lib-esm/DatePicker/DatePicker.js +0 -24
- package/lib-esm/DatePicker/DatePickerPanel.d.ts +0 -0
- package/lib-esm/DatePicker/DatePickerPanel.js +0 -0
- package/lib-esm/DatePicker/Day.d.ts +0 -12
- package/lib-esm/DatePicker/Day.js +0 -26
- package/lib-esm/DatePicker/Month.d.ts +0 -10
- package/lib-esm/DatePicker/Month.js +0 -13
- package/lib-esm/DatePicker/index.d.ts +0 -2
- package/lib-esm/DatePicker/index.js +0 -1
- package/lib-esm/Details.d.ts +0 -6
- package/lib-esm/Dialog/ConfirmationDialog.d.ts +0 -44
- package/lib-esm/Dialog/ConfirmationDialog.js +0 -169
- package/lib-esm/Dialog/Dialog.d.ts +0 -167
- package/lib-esm/Dialog/Dialog.js +0 -274
- package/lib-esm/Dialog.d.ts +0 -406
- package/lib-esm/Dropdown.d.ts +0 -1262
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +0 -323
- package/lib-esm/DropdownMenu/DropdownButton.js +0 -16
- package/lib-esm/DropdownMenu/DropdownMenu.d.ts +0 -43
- package/lib-esm/DropdownMenu/DropdownMenu.js +0 -77
- package/lib-esm/DropdownMenu/index.d.ts +0 -4
- package/lib-esm/DropdownMenu/index.js +0 -2
- package/lib-esm/DropdownStyles.d.ts +0 -3
- package/lib-esm/FilterList.d.ts +0 -321
- package/lib-esm/FilteredActionList/FilteredActionList.d.ts +0 -16
- package/lib-esm/FilteredActionList/FilteredActionList.js +0 -137
- package/lib-esm/FilteredActionList/index.d.ts +0 -2
- package/lib-esm/FilteredActionList/index.js +0 -1
- package/lib-esm/FilteredSearch.d.ts +0 -6
- package/lib-esm/Flash.d.ts +0 -9
- package/lib-esm/Flex.d.ts +0 -7
- package/lib-esm/FormGroup.d.ts +0 -12
- package/lib-esm/Grid.d.ts +0 -7
- package/lib-esm/Header.d.ts +0 -24
- package/lib-esm/Heading.d.ts +0 -6
- package/lib-esm/Label.d.ts +0 -11
- package/lib-esm/LabelGroup.d.ts +0 -6
- package/lib-esm/Link.d.ts +0 -10
- package/lib-esm/Overlay.d.ts +0 -62
- package/lib-esm/Pagehead.d.ts +0 -6
- package/lib-esm/Pagination/Pagination.d.ts +0 -24
- package/lib-esm/Pagination/index.d.ts +0 -3
- package/lib-esm/Pagination/model.d.ts +0 -26
- package/lib-esm/PointerBox.d.ts +0 -11
- package/lib-esm/Popover.d.ts +0 -21
- package/lib-esm/Portal/Portal.d.ts +0 -25
- package/lib-esm/Portal/index.d.ts +0 -4
- package/lib-esm/Position.d.ts +0 -34
- package/lib-esm/ProgressBar.d.ts +0 -21
- package/lib-esm/SelectMenu/SelectMenu.d.ts +0 -1832
- package/lib-esm/SelectMenu/SelectMenuContext.d.ts +0 -8
- package/lib-esm/SelectMenu/SelectMenuDivider.d.ts +0 -6
- package/lib-esm/SelectMenu/SelectMenuFilter.d.ts +0 -9
- package/lib-esm/SelectMenu/SelectMenuFooter.d.ts +0 -6
- package/lib-esm/SelectMenu/SelectMenuHeader.d.ts +0 -11
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +0 -15
- package/lib-esm/SelectMenu/SelectMenuList.d.ts +0 -6
- package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.d.ts +0 -7
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +0 -15
- package/lib-esm/SelectMenu/SelectMenuTab.d.ts +0 -14
- package/lib-esm/SelectMenu/SelectMenuTabPanel.d.ts +0 -13
- package/lib-esm/SelectMenu/SelectMenuTabs.d.ts +0 -11
- package/lib-esm/SelectMenu/hooks/useKeyboardNav.d.ts +0 -2
- package/lib-esm/SelectMenu/index.d.ts +0 -2
- package/lib-esm/SelectPanel/SelectPanel.d.ts +0 -25
- package/lib-esm/SelectPanel/SelectPanel.js +0 -127
- package/lib-esm/SelectPanel/index.d.ts +0 -2
- package/lib-esm/SelectPanel/index.js +0 -1
- package/lib-esm/SideNav.d.ts +0 -31
- package/lib-esm/Spinner.d.ts +0 -17
- package/lib-esm/Spinner.js +0 -46
- package/lib-esm/StateLabel.d.ts +0 -16
- package/lib-esm/StyledOcticon.d.ts +0 -12
- package/lib-esm/SubNav.d.ts +0 -32
- package/lib-esm/TabNav.d.ts +0 -20
- package/lib-esm/Text.d.ts +0 -6
- package/lib-esm/TextInput.d.ts +0 -22
- package/lib-esm/ThemeProvider.d.ts +0 -26
- package/lib-esm/Timeline.d.ts +0 -407
- package/lib-esm/Tooltip.d.ts +0 -18
- package/lib-esm/Truncate.d.ts +0 -11
- package/lib-esm/UnderlineNav.d.ts +0 -25
- package/lib-esm/behaviors/anchoredPosition.d.ts +0 -89
- package/lib-esm/behaviors/focusTrap.d.ts +0 -12
- package/lib-esm/behaviors/focusZone.d.ts +0 -137
- package/lib-esm/constants.d.ts +0 -20
- package/lib-esm/hooks/index.d.ts +0 -11
- package/lib-esm/hooks/useAnchoredPosition.d.ts +0 -20
- package/lib-esm/hooks/useCombinedRefs.d.ts +0 -10
- package/lib-esm/hooks/useCombinedRefs.js +0 -36
- package/lib-esm/hooks/useDetails.d.ts +0 -17
- package/lib-esm/hooks/useDialog.d.ts +0 -16
- package/lib-esm/hooks/useFocusTrap.d.ts +0 -32
- package/lib-esm/hooks/useFocusZone.d.ts +0 -23
- package/lib-esm/hooks/useOnEscapePress.d.ts +0 -23
- package/lib-esm/hooks/useOnOutsideClick.d.ts +0 -8
- package/lib-esm/hooks/useOpenAndCloseFocus.d.ts +0 -7
- package/lib-esm/hooks/useOverlay.d.ts +0 -14
- package/lib-esm/hooks/useProvidedRefOrCreate.d.ts +0 -10
- package/lib-esm/hooks/useProvidedStateOrCreate.d.ts +0 -10
- package/lib-esm/hooks/useProvidedStateOrCreate.js +0 -20
- package/lib-esm/hooks/useRenderForcingRef.d.ts +0 -8
- package/lib-esm/hooks/useRenderForcingRef.js +0 -18
- package/lib-esm/hooks/useResizeObserver.d.ts +0 -1
- package/lib-esm/hooks/useResizeObserver.js +0 -10
- package/lib-esm/hooks/useSafeTimeout.d.ts +0 -12
- package/lib-esm/hooks/useScrollFlash.d.ts +0 -6
- package/lib-esm/hooks/useScrollFlash.js +0 -22
- package/lib-esm/index.d.ts +0 -111
- package/lib-esm/polyfills/eventListenerSignal.d.ts +0 -6
- package/lib-esm/sx.d.ts +0 -6
- package/lib-esm/theme-preval.d.ts +0 -49
- package/lib-esm/theme.d.ts +0 -2
- package/lib-esm/utils/deprecate.d.ts +0 -18
- package/lib-esm/utils/isNumeric.d.ts +0 -1
- package/lib-esm/utils/iterateFocusableElements.d.ts +0 -42
- package/lib-esm/utils/ssr.d.ts +0 -1
- package/lib-esm/utils/ssr.js +0 -1
- package/lib-esm/utils/test-deprecations.d.ts +0 -1
- package/lib-esm/utils/test-helpers.d.ts +0 -0
- package/lib-esm/utils/test-helpers.js +0 -7
- package/lib-esm/utils/test-matchers.d.ts +0 -1
- package/lib-esm/utils/testing.d.ts +0 -1028
- package/lib-esm/utils/theme.d.ts +0 -9
- package/lib-esm/utils/types.d.ts +0 -14
- package/lib-esm/utils/uniqueId.d.ts +0 -1
- package/lib-esm/utils/userAgent.d.ts +0 -1
@@ -1,9 +1,8 @@
|
|
1
|
-
import { iterateFocusableElements } from '../utils/iterateFocusableElements';
|
1
|
+
import { isFocusable, iterateFocusableElements } from '../utils/iterateFocusableElements';
|
2
2
|
import { polyfill as eventListenerSignalPolyfill } from '../polyfills/eventListenerSignal';
|
3
3
|
import { isMacOS } from '../utils/userAgent';
|
4
4
|
import { uniqueId } from '../utils/uniqueId';
|
5
5
|
eventListenerSignalPolyfill();
|
6
|
-
// eslint-disable-next-line no-shadow
|
7
6
|
export let FocusKeys;
|
8
7
|
|
9
8
|
(function (FocusKeys) {
|
@@ -163,24 +162,21 @@ function shouldIgnoreFocusHandling(keyboardEvent, activeElement) {
|
|
163
162
|
return false;
|
164
163
|
}
|
165
164
|
|
166
|
-
|
167
|
-
/**
|
168
|
-
* A value of activated-directly for data-is-active-descendant indicates the descendant was activated
|
169
|
-
* by a manual user interaction with intent to move active descendant. This usually translates to the
|
170
|
-
* user pressing one of the bound keys (up/down arrow, etc) to move through the focus zone. This is
|
171
|
-
* intended to be roughly equivalent to the :focus-visible pseudo-class
|
172
|
-
**/
|
165
|
+
const subscriptions = [];
|
173
166
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
167
|
+
function notifyActiveElement(element) {
|
168
|
+
for (const subscription of subscriptions) {
|
169
|
+
subscription(element);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
function subscribeToActiveElementChanges(callback) {
|
174
|
+
subscriptions.push(callback);
|
175
|
+
return () => {
|
176
|
+
const index = subscriptions.indexOf(callback);
|
177
|
+
subscriptions.splice(index, 1);
|
178
|
+
};
|
179
|
+
}
|
184
180
|
/**
|
185
181
|
* Sets up the arrow key focus behavior for all focusable elements in the given `container`.
|
186
182
|
* @param container
|
@@ -188,6 +184,7 @@ export const hasActiveDescendantAttribute = 'data-has-active-descendant';
|
|
188
184
|
* @returns
|
189
185
|
*/
|
190
186
|
|
187
|
+
|
191
188
|
export function focusZone(container, settings) {
|
192
189
|
var _settings$bindKeys, _settings$focusOutBeh, _settings$focusInStra, _settings$abortSignal;
|
193
190
|
|
@@ -198,66 +195,34 @@ export function focusZone(container, settings) {
|
|
198
195
|
const focusInStrategy = (_settings$focusInStra = settings === null || settings === void 0 ? void 0 : settings.focusInStrategy) !== null && _settings$focusInStra !== void 0 ? _settings$focusInStra : 'previous';
|
199
196
|
const activeDescendantControl = settings === null || settings === void 0 ? void 0 : settings.activeDescendantControl;
|
200
197
|
const activeDescendantCallback = settings === null || settings === void 0 ? void 0 : settings.onActiveDescendantChanged;
|
201
|
-
let currentFocusedElement;
|
202
198
|
|
203
|
-
function
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
function isActiveDescendantInputFocused() {
|
208
|
-
return document.activeElement === activeDescendantControl;
|
209
|
-
}
|
210
|
-
|
211
|
-
function updateFocusedElement(to, directlyActivated = false) {
|
212
|
-
const from = currentFocusedElement;
|
213
|
-
currentFocusedElement = to;
|
214
|
-
|
215
|
-
if (activeDescendantControl) {
|
216
|
-
if (to && isActiveDescendantInputFocused()) {
|
217
|
-
setActiveDescendant(from, to, directlyActivated);
|
218
|
-
} else {
|
219
|
-
clearActiveDescendant();
|
220
|
-
}
|
221
|
-
|
222
|
-
return;
|
223
|
-
}
|
224
|
-
|
225
|
-
if (from && from !== to && savedTabIndex.has(from)) {
|
226
|
-
from.setAttribute('tabindex', '-1');
|
199
|
+
function updateTabIndex(from, to) {
|
200
|
+
if (!activeDescendantControl) {
|
201
|
+
from === null || from === void 0 ? void 0 : from.setAttribute('tabindex', '-1');
|
202
|
+
to === null || to === void 0 ? void 0 : to.setAttribute('tabindex', '0');
|
227
203
|
}
|
228
|
-
|
229
|
-
to === null || to === void 0 ? void 0 : to.setAttribute('tabindex', '0');
|
230
204
|
}
|
231
205
|
|
232
|
-
function setActiveDescendant(from, to
|
206
|
+
function setActiveDescendant(from, to) {
|
233
207
|
if (!to.id) {
|
234
208
|
to.setAttribute('id', uniqueId());
|
235
209
|
}
|
236
210
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
if (!activeDescendantControl || !directlyActivated && activeDescendantControl.getAttribute('aria-activedescendant') === to.id) {
|
242
|
-
// prevent active descendant callback from being called repeatedly if the same element is activated (e.g. via mousemove)
|
243
|
-
return;
|
244
|
-
}
|
245
|
-
|
246
|
-
activeDescendantControl.setAttribute('aria-activedescendant', to.id);
|
247
|
-
container.setAttribute(hasActiveDescendantAttribute, to.id);
|
248
|
-
to.setAttribute(isActiveDescendantAttribute, directlyActivated ? activeDescendantActivatedDirectly : activeDescendantActivatedIndirectly);
|
249
|
-
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(to, from, directlyActivated);
|
211
|
+
currentFocusedElement = to;
|
212
|
+
activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.setAttribute('aria-activedescendant', to.id);
|
213
|
+
notifyActiveElement(to);
|
214
|
+
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(to, from);
|
250
215
|
}
|
251
216
|
|
252
|
-
function
|
217
|
+
function suspendActiveDescendant() {
|
218
|
+
activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.removeAttribute('aria-activedescendant');
|
219
|
+
activeDescendantSuspended = true;
|
220
|
+
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(undefined, currentFocusedElement);
|
221
|
+
currentFocusedElement = undefined;
|
222
|
+
|
253
223
|
if (focusInStrategy === 'first') {
|
254
|
-
|
224
|
+
currentFocusedIndex = 0;
|
255
225
|
}
|
256
|
-
|
257
|
-
activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.removeAttribute('aria-activedescendant');
|
258
|
-
container.removeAttribute(hasActiveDescendantAttribute);
|
259
|
-
previouslyActiveElement === null || previouslyActiveElement === void 0 ? void 0 : previouslyActiveElement.removeAttribute(isActiveDescendantAttribute);
|
260
|
-
activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(undefined, previouslyActiveElement, false);
|
261
226
|
}
|
262
227
|
|
263
228
|
function beginFocusManagement(...elements) {
|
@@ -284,10 +249,6 @@ export function focusZone(container, settings) {
|
|
284
249
|
|
285
250
|
element.setAttribute('tabindex', '-1');
|
286
251
|
}
|
287
|
-
|
288
|
-
if (!currentFocusedElement) {
|
289
|
-
updateFocusedElement(getFirstFocusableElement());
|
290
|
-
}
|
291
252
|
}
|
292
253
|
|
293
254
|
function endFocusManagement(...elements) {
|
@@ -295,7 +256,13 @@ export function focusZone(container, settings) {
|
|
295
256
|
const focusableElementIndex = focusableElements.indexOf(element);
|
296
257
|
|
297
258
|
if (focusableElementIndex >= 0) {
|
298
|
-
focusableElements.splice(focusableElementIndex, 1);
|
259
|
+
focusableElements.splice(focusableElementIndex, 1); // If removing the last-focused element, set tabindex=0 to the first element in the list.
|
260
|
+
|
261
|
+
if (element === currentFocusedElement && focusableElements.length > 0) {
|
262
|
+
updateTabIndex(undefined, focusableElements[0]);
|
263
|
+
currentFocusedElement = focusableElements[0];
|
264
|
+
currentFocusedIndex = 0;
|
265
|
+
}
|
299
266
|
}
|
300
267
|
|
301
268
|
const savedIndex = savedTabIndex.get(element);
|
@@ -308,38 +275,44 @@ export function focusZone(container, settings) {
|
|
308
275
|
}
|
309
276
|
|
310
277
|
savedTabIndex.delete(element);
|
311
|
-
} // If removing the last-focused element, move focus to the first element in the list.
|
312
|
-
|
313
|
-
|
314
|
-
if (element === currentFocusedElement) {
|
315
|
-
const nextElementToFocus = getFirstFocusableElement();
|
316
|
-
updateFocusedElement(nextElementToFocus);
|
317
278
|
}
|
318
279
|
}
|
319
280
|
} // Take all tabbable elements within container under management
|
320
281
|
|
321
282
|
|
322
|
-
beginFocusManagement(...iterateFocusableElements(container)); //
|
283
|
+
beginFocusManagement(...iterateFocusableElements(container)); // If multiple focus zones have overlapping DOM, we need to know about
|
284
|
+
// any changes that result from others so that the "previous" active element
|
285
|
+
// stays consistent.
|
323
286
|
|
324
|
-
|
325
|
-
|
287
|
+
const unsubscribeFromActiveElementChanges = subscribeToActiveElementChanges(activeElement => {
|
288
|
+
if (focusInStrategy === 'previous') {
|
289
|
+
const tabbableElementIndex = focusableElements.indexOf(activeElement);
|
326
290
|
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
endFocusManagement(...iterateFocusableElements(removedNode));
|
333
|
-
}
|
291
|
+
if (tabbableElementIndex >= 0) {
|
292
|
+
const nextFocusedElement = focusableElements[tabbableElementIndex];
|
293
|
+
const previousFocusedElement = focusableElements[currentFocusedIndex];
|
294
|
+
updateTabIndex(previousFocusedElement, nextFocusedElement);
|
295
|
+
currentFocusedIndex = tabbableElementIndex;
|
334
296
|
}
|
335
297
|
}
|
298
|
+
}); // Open the first tabbable element for tabbing
|
299
|
+
|
300
|
+
updateTabIndex(undefined, focusableElements[0]); // If the DOM structure of the container changes, make sure we keep our state up-to-date
|
301
|
+
// with respect to the focusable elements cache and its order
|
336
302
|
|
303
|
+
const observer = new MutationObserver(mutations => {
|
337
304
|
for (const mutation of mutations) {
|
338
305
|
for (const addedNode of mutation.addedNodes) {
|
339
|
-
if (addedNode instanceof HTMLElement) {
|
306
|
+
if (addedNode instanceof HTMLElement && isFocusable(addedNode)) {
|
340
307
|
beginFocusManagement(...iterateFocusableElements(addedNode));
|
341
308
|
}
|
342
309
|
}
|
310
|
+
|
311
|
+
for (const removedNode of mutation.removedNodes) {
|
312
|
+
if (removedNode instanceof HTMLElement && savedTabIndex.has(removedNode)) {
|
313
|
+
endFocusManagement(...iterateFocusableElements(removedNode));
|
314
|
+
}
|
315
|
+
}
|
343
316
|
}
|
344
317
|
});
|
345
318
|
observer.observe(container, {
|
@@ -351,7 +324,13 @@ export function focusZone(container, settings) {
|
|
351
324
|
signal.addEventListener('abort', () => {
|
352
325
|
// Clean up any modifications
|
353
326
|
endFocusManagement(...focusableElements);
|
354
|
-
|
327
|
+
unsubscribeFromActiveElementChanges();
|
328
|
+
}); // When using activedescendant focusing, the first focus-in is caused by our listeners
|
329
|
+
// meaning we have to approach zero. This is safe since we clamp the value before using it.
|
330
|
+
|
331
|
+
let currentFocusedIndex = 0;
|
332
|
+
let activeDescendantSuspended = activeDescendantControl ? true : false;
|
333
|
+
let currentFocusedElement = activeDescendantControl ? undefined : focusableElements[0];
|
355
334
|
let elementIndexFocusedByClick = undefined;
|
356
335
|
container.addEventListener('mousedown', event => {
|
357
336
|
// Since focusin is only called when focus changes, we need to make sure the clicked
|
@@ -361,75 +340,35 @@ export function focusZone(container, settings) {
|
|
361
340
|
}
|
362
341
|
}, {
|
363
342
|
signal
|
364
|
-
});
|
365
|
-
|
366
|
-
if (activeDescendantControl) {
|
367
|
-
container.addEventListener('focusin', event => {
|
368
|
-
if (event.target instanceof HTMLElement && focusableElements.includes(event.target)) {
|
369
|
-
// Move focus to the activeDescendantControl if one of the descendants is focused
|
370
|
-
activeDescendantControl.focus();
|
371
|
-
updateFocusedElement(event.target);
|
372
|
-
}
|
373
|
-
});
|
374
|
-
container.addEventListener('mousemove', ({
|
375
|
-
target
|
376
|
-
}) => {
|
377
|
-
if (!(target instanceof Node)) {
|
378
|
-
return;
|
379
|
-
}
|
380
|
-
|
381
|
-
const focusableElement = focusableElements.find(element => element.contains(target));
|
343
|
+
}); // This is called whenever focus enters the container
|
382
344
|
|
383
|
-
|
384
|
-
updateFocusedElement(focusableElement);
|
385
|
-
}
|
386
|
-
}, {
|
387
|
-
signal,
|
388
|
-
capture: true
|
389
|
-
}); // Listeners specifically on the controlling element
|
390
|
-
|
391
|
-
activeDescendantControl.addEventListener('focusin', () => {
|
392
|
-
// Focus moved into the active descendant input. Activate current or first descendant.
|
393
|
-
if (!currentFocusedElement) {
|
394
|
-
updateFocusedElement(getFirstFocusableElement());
|
395
|
-
} else {
|
396
|
-
setActiveDescendant(undefined, currentFocusedElement);
|
397
|
-
}
|
398
|
-
});
|
399
|
-
activeDescendantControl.addEventListener('focusout', () => {
|
400
|
-
clearActiveDescendant();
|
401
|
-
});
|
402
|
-
} else {
|
403
|
-
// This is called whenever focus enters an element in the container
|
345
|
+
if (!activeDescendantControl) {
|
404
346
|
container.addEventListener('focusin', event => {
|
405
347
|
if (event.target instanceof HTMLElement) {
|
406
348
|
// If a click initiated the focus movement, we always want to set our internal state
|
407
349
|
// to reflect the clicked element as the currently focused one.
|
408
|
-
if (elementIndexFocusedByClick
|
350
|
+
if (elementIndexFocusedByClick != undefined) {
|
409
351
|
if (elementIndexFocusedByClick >= 0) {
|
410
352
|
if (focusableElements[elementIndexFocusedByClick] !== currentFocusedElement) {
|
411
|
-
|
353
|
+
updateTabIndex(currentFocusedElement, focusableElements[elementIndexFocusedByClick]);
|
412
354
|
}
|
355
|
+
|
356
|
+
currentFocusedIndex = elementIndexFocusedByClick;
|
413
357
|
}
|
414
358
|
|
415
359
|
elementIndexFocusedByClick = undefined;
|
416
360
|
} else {
|
417
361
|
// Set tab indexes and internal state based on the focus handling strategy
|
418
362
|
if (focusInStrategy === 'previous') {
|
419
|
-
|
420
|
-
} else if (focusInStrategy === '
|
421
|
-
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
363
|
+
updateTabIndex(currentFocusedElement, event.target);
|
364
|
+
} else if (focusInStrategy === 'first') {
|
365
|
+
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget) && event.target !== focusableElements[0]) {
|
422
366
|
// Regardless of the previously focused element, if we're coming from outside the
|
423
|
-
// container, put focus onto the first
|
424
|
-
|
425
|
-
|
426
|
-
// be undefined.
|
427
|
-
const targetElementIndex = lastKeyboardFocusDirection === 'previous' ? focusableElements.length - 1 : 0;
|
428
|
-
const targetElement = focusableElements[targetElementIndex];
|
429
|
-
targetElement === null || targetElement === void 0 ? void 0 : targetElement.focus();
|
430
|
-
return;
|
367
|
+
// container, put focus onto the first element.
|
368
|
+
currentFocusedIndex = 0;
|
369
|
+
focusableElements[0].focus();
|
431
370
|
} else {
|
432
|
-
|
371
|
+
updateTabIndex(currentFocusedElement, event.target);
|
433
372
|
}
|
434
373
|
} else if (typeof focusInStrategy === 'function') {
|
435
374
|
if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
|
@@ -437,54 +376,31 @@ export function focusZone(container, settings) {
|
|
437
376
|
const requestedFocusElementIndex = elementToFocus ? focusableElements.indexOf(elementToFocus) : -1;
|
438
377
|
|
439
378
|
if (requestedFocusElementIndex >= 0 && elementToFocus instanceof HTMLElement) {
|
440
|
-
// Since we are calling focus() this handler will run again synchronously. Therefore,
|
379
|
+
currentFocusedIndex = requestedFocusElementIndex; // Since we are calling focus() this handler will run again synchronously. Therefore,
|
441
380
|
// we don't want to let this invocation finish since it will clobber the value of
|
442
381
|
// currentFocusedElement.
|
382
|
+
|
443
383
|
elementToFocus.focus();
|
444
384
|
return;
|
445
385
|
} else {
|
446
|
-
//
|
386
|
+
// Should we warn here?
|
447
387
|
console.warn('Element requested is not a known focusable element.');
|
448
388
|
}
|
449
389
|
} else {
|
450
|
-
|
390
|
+
updateTabIndex(currentFocusedElement, event.target);
|
451
391
|
}
|
452
392
|
}
|
453
393
|
}
|
454
|
-
}
|
455
|
-
|
456
|
-
lastKeyboardFocusDirection = undefined;
|
457
|
-
}, {
|
458
|
-
signal
|
459
|
-
});
|
460
|
-
}
|
461
394
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
let lastKeyboardFocusDirection = undefined;
|
466
|
-
|
467
|
-
if (focusInStrategy === 'closest') {
|
468
|
-
document.addEventListener('keydown', event => {
|
469
|
-
if (event.key === 'Tab') {
|
470
|
-
lastKeyboardFocusDirection = getDirection(event);
|
395
|
+
notifyActiveElement(event.target);
|
396
|
+
currentFocusedElement = event.target;
|
471
397
|
}
|
472
398
|
}, {
|
473
|
-
signal
|
474
|
-
capture: true
|
399
|
+
signal
|
475
400
|
});
|
476
401
|
}
|
477
402
|
|
478
|
-
|
479
|
-
if (!currentFocusedElement) {
|
480
|
-
return 0;
|
481
|
-
}
|
482
|
-
|
483
|
-
const focusedIndex = focusableElements.indexOf(currentFocusedElement);
|
484
|
-
const fallbackIndex = currentFocusedElement === container ? -1 : 0;
|
485
|
-
return focusedIndex !== -1 ? focusedIndex : fallbackIndex;
|
486
|
-
} // "keydown" is the event that triggers DOM focus change, so that is what we use here
|
487
|
-
|
403
|
+
const keyboardEventRecipient = activeDescendantControl !== null && activeDescendantControl !== void 0 ? activeDescendantControl : container; // "keydown" is the event that triggers DOM focus change, so that is what we use here
|
488
404
|
|
489
405
|
keyboardEventRecipient.addEventListener('keydown', event => {
|
490
406
|
if (event.key in KEY_TO_DIRECTION) {
|
@@ -493,57 +409,65 @@ export function focusZone(container, settings) {
|
|
493
409
|
if (!event.defaultPrevented && (keyBit & bindKeys) > 0 && !shouldIgnoreFocusHandling(event, document.activeElement)) {
|
494
410
|
// Moving forward or backward?
|
495
411
|
const direction = getDirection(event);
|
496
|
-
let nextElementToFocus = undefined;
|
412
|
+
let nextElementToFocus = undefined;
|
497
413
|
|
498
|
-
if (
|
499
|
-
|
414
|
+
if (activeDescendantSuspended) {
|
415
|
+
activeDescendantSuspended = false;
|
416
|
+
nextElementToFocus = focusableElements[currentFocusedIndex];
|
417
|
+
} else {
|
418
|
+
// If there is a custom function that retrieves the next focusable element, try calling that first.
|
419
|
+
if (settings !== null && settings !== void 0 && settings.getNextFocusable) {
|
420
|
+
var _document$activeEleme;
|
500
421
|
|
501
|
-
|
502
|
-
|
422
|
+
nextElementToFocus = settings.getNextFocusable(direction, (_document$activeEleme = document.activeElement) !== null && _document$activeEleme !== void 0 ? _document$activeEleme : undefined, event);
|
423
|
+
}
|
503
424
|
|
504
|
-
|
505
|
-
|
506
|
-
|
425
|
+
if (!nextElementToFocus) {
|
426
|
+
const lastFocusedIndex = currentFocusedIndex;
|
427
|
+
|
428
|
+
if (direction === 'previous') {
|
429
|
+
currentFocusedIndex -= 1;
|
430
|
+
} else if (direction === 'start') {
|
431
|
+
currentFocusedIndex = 0;
|
432
|
+
} else if (direction === 'next') {
|
433
|
+
currentFocusedIndex += 1;
|
434
|
+
} else if (direction === 'end') {
|
435
|
+
currentFocusedIndex = focusableElements.length - 1;
|
436
|
+
}
|
507
437
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
nextFocusedIndex = focusableElements.length - 1;
|
517
|
-
}
|
438
|
+
if (currentFocusedIndex < 0) {
|
439
|
+
// Tab should never cause focus to wrap. Use focusTrap for that behavior.
|
440
|
+
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
441
|
+
currentFocusedIndex = focusableElements.length - 1;
|
442
|
+
} else {
|
443
|
+
if (activeDescendantControl) {
|
444
|
+
suspendActiveDescendant();
|
445
|
+
}
|
518
446
|
|
519
|
-
|
520
|
-
|
521
|
-
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
522
|
-
nextFocusedIndex = focusableElements.length - 1;
|
523
|
-
} else {
|
524
|
-
nextFocusedIndex = 0;
|
447
|
+
currentFocusedIndex = 0;
|
448
|
+
}
|
525
449
|
}
|
526
|
-
}
|
527
450
|
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
451
|
+
if (currentFocusedIndex >= focusableElements.length) {
|
452
|
+
if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
|
453
|
+
currentFocusedIndex = 0;
|
454
|
+
} else {
|
455
|
+
currentFocusedIndex = focusableElements.length - 1;
|
456
|
+
}
|
533
457
|
}
|
534
|
-
}
|
535
458
|
|
536
|
-
|
537
|
-
|
459
|
+
if (lastFocusedIndex !== currentFocusedIndex) {
|
460
|
+
nextElementToFocus = focusableElements[currentFocusedIndex];
|
461
|
+
}
|
538
462
|
}
|
539
463
|
}
|
540
464
|
|
541
|
-
if (
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
465
|
+
if (nextElementToFocus) {
|
466
|
+
if (activeDescendantControl) {
|
467
|
+
setActiveDescendant(currentFocusedElement, nextElementToFocus);
|
468
|
+
} else {
|
469
|
+
nextElementToFocus.focus();
|
470
|
+
}
|
547
471
|
} // Tab should always allow escaping from this container, so only
|
548
472
|
// preventDefault if tab key press already resulted in a focus movement
|
549
473
|
|
@@ -553,8 +477,19 @@ export function focusZone(container, settings) {
|
|
553
477
|
}
|
554
478
|
}
|
555
479
|
}
|
480
|
+
|
481
|
+
if (event.key === 'Escape' && !activeDescendantSuspended && activeDescendantControl) {
|
482
|
+
suspendActiveDescendant();
|
483
|
+
}
|
556
484
|
}, {
|
557
485
|
signal
|
558
486
|
});
|
487
|
+
|
488
|
+
if (activeDescendantControl) {
|
489
|
+
activeDescendantControl.addEventListener('focusout', () => {
|
490
|
+
suspendActiveDescendant();
|
491
|
+
});
|
492
|
+
}
|
493
|
+
|
559
494
|
return controller;
|
560
495
|
}
|
package/lib-esm/constants.js
CHANGED
package/lib-esm/hooks/index.js
CHANGED
@@ -3,5 +3,4 @@ export { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
|
|
3
3
|
export { useOnEscapePress } from './useOnEscapePress';
|
4
4
|
export { useOpenAndCloseFocus } from './useOpenAndCloseFocus';
|
5
5
|
export { useAnchoredPosition } from './useAnchoredPosition';
|
6
|
-
export { useOverlay } from './useOverlay';
|
7
|
-
export { useRenderForcingRef } from './useRenderForcingRef';
|
6
|
+
export { useOverlay } from './useOverlay';
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { getAnchoredPosition } from '../behaviors/anchoredPosition';
|
3
3
|
import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
|
4
|
-
import { useResizeObserver } from './useResizeObserver';
|
5
4
|
|
6
5
|
/**
|
7
6
|
* Calculates the top and left values for an absolutely-positioned floating element
|
@@ -12,20 +11,16 @@ import { useResizeObserver } from './useResizeObserver';
|
|
12
11
|
* @returns An object of {top: number, left: number} to absolutely-position the
|
13
12
|
* floating element.
|
14
13
|
*/
|
15
|
-
export function useAnchoredPosition(settings, dependencies
|
14
|
+
export function useAnchoredPosition(settings, dependencies) {
|
16
15
|
const floatingElementRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.floatingElementRef);
|
17
16
|
const anchorElementRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.anchorElementRef);
|
18
17
|
const [position, setPosition] = React.useState(undefined);
|
19
|
-
|
18
|
+
React.useEffect(() => {
|
20
19
|
if (floatingElementRef.current instanceof Element && anchorElementRef.current instanceof Element) {
|
21
20
|
setPosition(getAnchoredPosition(floatingElementRef.current, anchorElementRef.current, settings));
|
22
|
-
}
|
23
|
-
|
24
|
-
|
25
|
-
}, // eslint-disable-next-line react-hooks/exhaustive-deps
|
26
|
-
[floatingElementRef, anchorElementRef, ...dependencies]);
|
27
|
-
React.useLayoutEffect(updatePosition, [updatePosition]);
|
28
|
-
useResizeObserver(updatePosition);
|
21
|
+
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
22
|
+
|
23
|
+
}, dependencies !== null && dependencies !== void 0 ? dependencies : []);
|
29
24
|
return {
|
30
25
|
floatingElementRef,
|
31
26
|
anchorElementRef,
|
@@ -42,7 +42,7 @@ function useDialog({
|
|
42
42
|
}
|
43
43
|
}, [isOpen, initialFocusRef, closeButtonRef]);
|
44
44
|
const getFocusableItem = useCallback((e, movement) => {
|
45
|
-
if (modalRef.current) {
|
45
|
+
if (modalRef && modalRef.current) {
|
46
46
|
const items = Array.from(modalRef.current.querySelectorAll('*')).filter(focusable);
|
47
47
|
if (items.length === 0) return;
|
48
48
|
e.preventDefault();
|
@@ -7,31 +7,11 @@ import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
|
|
7
7
|
* that should trap focus.
|
8
8
|
* @param settings {FocusTrapHookSettings}
|
9
9
|
*/
|
10
|
-
export function useFocusTrap(settings
|
10
|
+
export function useFocusTrap(settings) {
|
11
11
|
const containerRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.containerRef);
|
12
12
|
const initialFocusRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.initialFocusRef);
|
13
13
|
const disabled = settings === null || settings === void 0 ? void 0 : settings.disabled;
|
14
14
|
const abortController = React.useRef();
|
15
|
-
const previousFocusedElement = React.useRef(null); // If we are enabling a focus trap and haven't already stored the previously focused element
|
16
|
-
// go ahead an do that so we can restore later when the trap is disabled.
|
17
|
-
|
18
|
-
if (!previousFocusedElement.current && !(settings !== null && settings !== void 0 && settings.disabled)) {
|
19
|
-
previousFocusedElement.current = document.activeElement;
|
20
|
-
} // This function removes the event listeners that enable the focus trap and restores focus
|
21
|
-
// to the previously-focused element (if necessary).
|
22
|
-
|
23
|
-
|
24
|
-
function disableTrap() {
|
25
|
-
var _abortController$curr;
|
26
|
-
|
27
|
-
(_abortController$curr = abortController.current) === null || _abortController$curr === void 0 ? void 0 : _abortController$curr.abort();
|
28
|
-
|
29
|
-
if (settings !== null && settings !== void 0 && settings.restoreFocusOnCleanUp && previousFocusedElement.current instanceof HTMLElement) {
|
30
|
-
previousFocusedElement.current.focus();
|
31
|
-
previousFocusedElement.current = null;
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
15
|
React.useEffect(() => {
|
36
16
|
if (containerRef.current instanceof HTMLElement) {
|
37
17
|
if (!disabled) {
|
@@ -39,14 +19,17 @@ export function useFocusTrap(settings, dependencies = []) {
|
|
39
19
|
|
40
20
|
abortController.current = focusTrap(containerRef.current, (_initialFocusRef$curr = initialFocusRef.current) !== null && _initialFocusRef$curr !== void 0 ? _initialFocusRef$curr : undefined);
|
41
21
|
return () => {
|
42
|
-
|
22
|
+
var _abortController$curr;
|
23
|
+
|
24
|
+
(_abortController$curr = abortController.current) === null || _abortController$curr === void 0 ? void 0 : _abortController$curr.abort();
|
43
25
|
};
|
44
26
|
} else {
|
45
|
-
|
27
|
+
var _abortController$curr2;
|
28
|
+
|
29
|
+
(_abortController$curr2 = abortController.current) === null || _abortController$curr2 === void 0 ? void 0 : _abortController$curr2.abort();
|
46
30
|
}
|
47
31
|
}
|
48
|
-
},
|
49
|
-
[containerRef, initialFocusRef, disabled, ...dependencies]);
|
32
|
+
}, [containerRef, initialFocusRef, disabled]);
|
50
33
|
return {
|
51
34
|
containerRef,
|
52
35
|
initialFocusRef
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import React, { useEffect } from 'react';
|
2
2
|
import { focusZone } from '../behaviors/focusZone';
|
3
3
|
import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
|
4
|
-
export function useFocusZone(settings = {}, dependencies
|
4
|
+
export function useFocusZone(settings = {}, dependencies) {
|
5
5
|
const containerRef = useProvidedRefOrCreate(settings.containerRef);
|
6
6
|
const useActiveDescendant = !!settings.activeDescendantFocus;
|
7
7
|
const passedActiveDescendantRef = typeof settings.activeDescendantFocus === 'boolean' || !settings.activeDescendantFocus ? undefined : settings.activeDescendantFocus;
|
8
8
|
const activeDescendantControlRef = useProvidedRefOrCreate(passedActiveDescendantRef);
|
9
|
-
const disabled = settings.disabled;
|
9
|
+
const disabled = settings === null || settings === void 0 ? void 0 : settings.disabled;
|
10
10
|
const abortController = React.useRef();
|
11
11
|
useEffect(() => {
|
12
12
|
if (containerRef.current instanceof HTMLElement && (!useActiveDescendant || activeDescendantControlRef.current instanceof HTMLElement)) {
|
@@ -27,9 +27,9 @@ export function useFocusZone(settings = {}, dependencies = []) {
|
|
27
27
|
|
28
28
|
(_abortController$curr2 = abortController.current) === null || _abortController$curr2 === void 0 ? void 0 : _abortController$curr2.abort();
|
29
29
|
}
|
30
|
-
}
|
31
|
-
|
32
|
-
|
30
|
+
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
31
|
+
|
32
|
+
}, dependencies !== null && dependencies !== void 0 ? dependencies : []);
|
33
33
|
return {
|
34
34
|
containerRef,
|
35
35
|
activeDescendantControlRef
|