@primer/components 0.0.0-20211030175556 → 0.0.0-20211030182910
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 +34 -2
- package/dist/browser.esm.js +186 -183
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +190 -187
- package/dist/browser.umd.js.map +1 -1
- package/lib/ActionList/Item.js +3 -3
- package/lib/ActionList/index.js +23 -12
- package/lib/ActionList2/Item.js +3 -1
- package/lib/ActionList2/List.js +1 -2
- package/lib/ActionList2/Selection.js +3 -1
- package/lib/ActionList2/index.js +41 -23
- package/lib/AnchoredOverlay/index.js +12 -4
- package/lib/Autocomplete/Autocomplete.d.ts +1 -0
- package/lib/Autocomplete/AutocompleteInput.d.ts +1 -0
- package/lib/Autocomplete/index.js +14 -7
- package/lib/Avatar.d.ts +1 -2
- package/lib/Avatar.js +1 -1
- package/lib/BranchName.d.ts +1 -2
- package/lib/BranchName.js +1 -1
- package/lib/Button/Button.d.ts +1 -0
- package/lib/Button/ButtonClose.d.ts +2 -1
- package/lib/Button/ButtonDanger.d.ts +1 -0
- package/lib/Button/ButtonInvisible.d.ts +1 -0
- package/lib/Button/ButtonOutline.d.ts +1 -0
- package/lib/Button/ButtonPrimary.d.ts +1 -0
- package/lib/Button/index.js +70 -21
- package/lib/Checkbox.d.ts +29 -0
- package/lib/Checkbox.js +64 -0
- package/lib/CircleOcticon.d.ts +1 -0
- package/lib/Details.d.ts +1 -2
- package/lib/Details.js +1 -3
- package/lib/Dialog.d.ts +3 -2
- package/lib/Dropdown.d.ts +6 -66
- package/lib/DropdownMenu/DropdownButton.d.ts +2 -1
- package/lib/DropdownMenu/index.js +20 -6
- package/lib/DropdownStyles.js +26 -18
- package/lib/FilterList.d.ts +1 -0
- package/lib/FilteredActionList/index.js +12 -4
- package/lib/Heading.d.ts +1 -2
- package/lib/Heading.js +1 -6
- package/lib/NewButton/index.js +12 -5
- package/lib/NewButton/types.js +1 -2
- package/lib/Overlay.d.ts +5 -3
- package/lib/Pagination/index.js +12 -6
- package/lib/Portal/index.js +16 -5
- package/lib/Position.d.ts +4 -4
- package/lib/ProgressBar.d.ts +16 -11
- package/lib/ProgressBar.js +6 -10
- package/lib/SelectMenu/SelectMenu.d.ts +10 -4
- package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuModal.d.ts +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/Spinner.d.ts +1 -2
- package/lib/Spinner.js +1 -3
- package/lib/TextInputWithTokens.d.ts +1 -0
- package/lib/Token/AvatarToken.d.ts +1 -1
- package/lib/Token/IssueLabelToken.d.ts +1 -1
- package/lib/Token/Token.d.ts +1 -1
- package/lib/Token/index.js +30 -11
- 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.d.ts +2 -0
- package/lib/index.js +652 -163
- package/lib/polyfills/eventListenerSignal.js +45 -37
- 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 +2 -1
- package/lib/utils/testing.js +29 -0
- 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/ActionList/Item.js +3 -3
- package/lib-esm/ActionList2/Item.js +3 -1
- package/lib-esm/ActionList2/List.js +1 -2
- package/lib-esm/ActionList2/Selection.js +3 -1
- package/lib-esm/Autocomplete/Autocomplete.d.ts +1 -0
- package/lib-esm/Autocomplete/AutocompleteInput.d.ts +1 -0
- package/lib-esm/Avatar.d.ts +1 -2
- package/lib-esm/Avatar.js +2 -2
- package/lib-esm/BranchName.d.ts +1 -2
- package/lib-esm/BranchName.js +2 -2
- package/lib-esm/Button/Button.d.ts +1 -0
- package/lib-esm/Button/ButtonClose.d.ts +2 -1
- package/lib-esm/Button/ButtonDanger.d.ts +1 -0
- package/lib-esm/Button/ButtonInvisible.d.ts +1 -0
- package/lib-esm/Button/ButtonOutline.d.ts +1 -0
- package/lib-esm/Button/ButtonPrimary.d.ts +1 -0
- package/lib-esm/Checkbox.d.ts +29 -0
- package/lib-esm/Checkbox.js +44 -0
- package/lib-esm/CircleOcticon.d.ts +1 -0
- package/lib-esm/Details.d.ts +1 -2
- package/lib-esm/Details.js +1 -2
- package/lib-esm/Dialog.d.ts +3 -2
- package/lib-esm/Dropdown.d.ts +6 -66
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +2 -1
- package/lib-esm/FilterList.d.ts +1 -0
- package/lib-esm/Heading.d.ts +1 -2
- package/lib-esm/Heading.js +2 -6
- package/lib-esm/Overlay.d.ts +5 -3
- package/lib-esm/Position.d.ts +4 -4
- package/lib-esm/ProgressBar.d.ts +16 -11
- package/lib-esm/ProgressBar.js +7 -11
- package/lib-esm/SelectMenu/SelectMenu.d.ts +10 -4
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib-esm/Spinner.d.ts +1 -2
- package/lib-esm/Spinner.js +1 -2
- package/lib-esm/TextInputWithTokens.d.ts +1 -0
- package/lib-esm/Token/AvatarToken.d.ts +1 -1
- package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
- package/lib-esm/Token/Token.d.ts +1 -1
- package/lib-esm/index.d.ts +2 -0
- package/lib-esm/index.js +1 -0
- package/lib-esm/theme-preval.js +446 -0
- package/lib-esm/utils/testing.d.ts +2 -1
- package/lib-esm/utils/testing.js +24 -0
- package/package.json +4 -5
- 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 -54
- package/lib/ActionList2/Header.d.ts +0 -26
- package/lib/ActionList2/Header.js +0 -55
- 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 -71
- package/lib/Button/Button.jsx +0 -40
- package/lib/Button/ButtonBase.jsx +0 -33
- package/lib/Button/ButtonClose.jsx +0 -53
- package/lib/Button/ButtonDanger.jsx +0 -43
- package/lib/Button/ButtonGroup.jsx +0 -55
- package/lib/Button/ButtonInvisible.jsx +0 -32
- package/lib/Button/ButtonOutline.jsx +0 -43
- package/lib/Button/ButtonPrimary.jsx +0 -42
- package/lib/Button/ButtonStyles.jsx +0 -37
- package/lib/Button/ButtonTableList.jsx +0 -46
- package/lib/Caret.jsx +0 -93
- package/lib/CircleBadge.jsx +0 -42
- package/lib/CircleOcticon.jsx +0 -21
- package/lib/CounterLabel.jsx +0 -43
- package/lib/Details.jsx +0 -21
- package/lib/Dialog/ConfirmationDialog.jsx +0 -146
- package/lib/Dialog/Dialog.jsx +0 -279
- package/lib/Dialog.jsx +0 -129
- package/lib/Dropdown.jsx +0 -131
- package/lib/DropdownMenu/DropdownButton.jsx +0 -14
- package/lib/DropdownMenu/DropdownMenu.jsx +0 -70
- package/lib/FilterList.jsx +0 -59
- package/lib/FilteredActionList/FilteredActionList.jsx +0 -100
- package/lib/FilteredSearch.jsx +0 -28
- package/lib/Flash.jsx +0 -69
- package/lib/Flex.jsx +0 -15
- package/lib/FormGroup.jsx +0 -22
- package/lib/Grid.jsx +0 -15
- package/lib/Header.jsx +0 -83
- package/lib/Heading.jsx +0 -21
- package/lib/Label.jsx +0 -82
- package/lib/LabelGroup.jsx +0 -18
- package/lib/Link.jsx +0 -36
- package/lib/NewButton/button-counter.jsx +0 -14
- package/lib/NewButton/button.jsx +0 -279
- package/lib/Overlay.jsx +0 -154
- package/lib/Pagehead.jsx +0 -17
- package/lib/Pagination/Pagination.jsx +0 -161
- package/lib/Pagination/model.jsx +0 -174
- package/lib/PointerBox.jsx +0 -25
- package/lib/Popover.jsx +0 -202
- 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 -112
- package/lib/SelectMenu/SelectMenuContext.jsx +0 -5
- package/lib/SelectMenu/SelectMenuDivider.jsx +0 -42
- package/lib/SelectMenu/SelectMenuFilter.jsx +0 -58
- package/lib/SelectMenu/SelectMenuFooter.jsx +0 -45
- package/lib/SelectMenu/SelectMenuHeader.jsx +0 -42
- package/lib/SelectMenu/SelectMenuItem.jsx +0 -142
- package/lib/SelectMenu/SelectMenuList.jsx +0 -59
- package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +0 -22
- package/lib/SelectMenu/SelectMenuModal.jsx +0 -118
- package/lib/SelectMenu/SelectMenuTab.jsx +0 -92
- package/lib/SelectMenu/SelectMenuTabPanel.jsx +0 -42
- package/lib/SelectMenu/SelectMenuTabs.jsx +0 -57
- package/lib/SelectPanel/SelectPanel.jsx +0 -105
- package/lib/SideNav.jsx +0 -173
- package/lib/Spinner.jsx +0 -35
- package/lib/StateLabel.jsx +0 -93
- package/lib/StyledOcticon.jsx +0 -18
- package/lib/SubNav.jsx +0 -101
- package/lib/TabNav.jsx +0 -58
- 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 -123
- 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 -24
- package/lib/UnderlineNav.jsx +0 -88
- package/lib/_TextInputWrapper.jsx +0 -120
- package/lib/_UnstyledTextInput.jsx +0 -22
- 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/lib-esm/ActionList2/Header.d.ts +0 -26
- package/lib-esm/ActionList2/Header.js +0 -44
@@ -1,25 +1,34 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
exports
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.focusTrap = focusTrap;
|
7
|
+
|
8
|
+
var _iterateFocusableElements = require("../utils/iterateFocusableElements");
|
9
|
+
|
10
|
+
var _eventListenerSignal = require("../polyfills/eventListenerSignal");
|
11
|
+
|
12
|
+
(0, _eventListenerSignal.polyfill)();
|
7
13
|
const suspendedTrapStack = [];
|
8
14
|
let activeTrap = undefined;
|
15
|
+
|
9
16
|
function tryReactivate() {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
}
|
15
|
-
// @todo If AbortController.prototype.follow is ever implemented, that
|
17
|
+
const trapToReactivate = suspendedTrapStack.pop();
|
18
|
+
|
19
|
+
if (trapToReactivate) {
|
20
|
+
focusTrap(trapToReactivate.container, trapToReactivate.initialFocus, trapToReactivate.originalSignal);
|
21
|
+
}
|
22
|
+
} // @todo If AbortController.prototype.follow is ever implemented, that
|
16
23
|
// could replace this function. @see https://github.com/whatwg/dom/issues/920
|
24
|
+
|
25
|
+
|
17
26
|
function followSignal(signal) {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
const controller = new AbortController();
|
28
|
+
signal.addEventListener('abort', () => {
|
29
|
+
controller.abort();
|
30
|
+
});
|
31
|
+
return controller;
|
23
32
|
}
|
24
33
|
/**
|
25
34
|
* Returns the first focusable child of `container`. If `lastChild` is true,
|
@@ -27,117 +36,144 @@ function followSignal(signal) {
|
|
27
36
|
* @param container
|
28
37
|
* @param lastChild
|
29
38
|
*/
|
39
|
+
|
40
|
+
|
30
41
|
function getFocusableChild(container, lastChild = false) {
|
31
|
-
|
42
|
+
return (0, _iterateFocusableElements.iterateFocusableElements)(container, {
|
43
|
+
reverse: lastChild,
|
44
|
+
strict: true,
|
45
|
+
onlyTabbable: true
|
46
|
+
}).next().value;
|
32
47
|
}
|
48
|
+
/**
|
49
|
+
* Traps focus within the given container.
|
50
|
+
* @param container The container in which to trap focus
|
51
|
+
* @returns AbortController - call `.abort()` to disable the focus trap
|
52
|
+
*/
|
53
|
+
|
54
|
+
|
33
55
|
function focusTrap(container, initialFocus, abortSignal) {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}
|
56
|
+
// Set up an abort controller if a signal was not passed in
|
57
|
+
const controller = new AbortController();
|
58
|
+
const signal = abortSignal !== null && abortSignal !== void 0 ? abortSignal : controller.signal;
|
59
|
+
container.setAttribute('data-focus-trap', 'active');
|
60
|
+
let lastFocusedChild = undefined; // Ensure focus remains in the trap zone by checking that a given recently-focused
|
61
|
+
// element is inside the trap zone. If it isn't, redirect focus to a suitable
|
62
|
+
// element within the trap zone. If need to redirect focus and a suitable element
|
63
|
+
// is not found, focus the container.
|
64
|
+
|
65
|
+
function ensureTrapZoneHasFocus(focusedElement) {
|
66
|
+
if (focusedElement instanceof HTMLElement && document.contains(container)) {
|
67
|
+
if (container.contains(focusedElement)) {
|
68
|
+
// If a child of the trap zone was focused, remember it
|
69
|
+
lastFocusedChild = focusedElement;
|
70
|
+
return;
|
71
|
+
} else {
|
72
|
+
if (lastFocusedChild && (0, _iterateFocusableElements.isTabbable)(lastFocusedChild) && container.contains(lastFocusedChild)) {
|
73
|
+
lastFocusedChild.focus();
|
74
|
+
return;
|
75
|
+
} else if (initialFocus && container.contains(initialFocus)) {
|
76
|
+
initialFocus.focus();
|
77
|
+
return;
|
78
|
+
} else {
|
79
|
+
// Ensure the container is focusable:
|
80
|
+
// - Either the container already has a `tabIndex`
|
81
|
+
// - Or provide a temporary `tabIndex`
|
82
|
+
const containerNeedsTemporaryTabIndex = container.getAttribute('tabindex') === null;
|
83
|
+
|
84
|
+
if (containerNeedsTemporaryTabIndex) {
|
85
|
+
container.setAttribute('tabindex', '-1');
|
86
|
+
} // Focus the container.
|
87
|
+
|
88
|
+
|
89
|
+
container.focus(); // If a temporary `tabIndex` was provided, remove it.
|
90
|
+
|
91
|
+
if (containerNeedsTemporaryTabIndex) {
|
92
|
+
// Once focus has moved from the container to a child within the FocusTrap,
|
93
|
+
// the container can be made un-refocusable by removing `tabIndex`.
|
94
|
+
container.addEventListener('blur', () => container.removeAttribute('tabindex'), {
|
95
|
+
once: true
|
96
|
+
}); // NB: If `tabIndex` was removed *before* `blur`, then certain browsers (e.g. Chrome)
|
97
|
+
// would consider `body` the `activeElement`, and as a result, keyboard navigation
|
98
|
+
// between children would break, since `body` is outside the `FocusTrap`.
|
99
|
+
}
|
100
|
+
|
101
|
+
return;
|
81
102
|
}
|
103
|
+
}
|
82
104
|
}
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
const firstFocusableChild = getFocusableChild(container);
|
90
|
-
const lastFocusableChild = getFocusableChild(container, true);
|
91
|
-
if (target === firstFocusableChild && event.shiftKey) {
|
92
|
-
event.preventDefault();
|
93
|
-
lastFocusableChild?.focus();
|
94
|
-
}
|
95
|
-
else if (target === lastFocusableChild && !event.shiftKey) {
|
96
|
-
event.preventDefault();
|
97
|
-
firstFocusableChild?.focus();
|
98
|
-
}
|
99
|
-
}, { signal: wrappingController.signal });
|
100
|
-
if (activeTrap) {
|
101
|
-
const suspendedTrap = activeTrap;
|
102
|
-
activeTrap.container.setAttribute('data-focus-trap', 'suspended');
|
103
|
-
activeTrap.controller.abort();
|
104
|
-
suspendedTrapStack.push(suspendedTrap);
|
105
|
+
}
|
106
|
+
|
107
|
+
const wrappingController = followSignal(signal);
|
108
|
+
container.addEventListener('keydown', event => {
|
109
|
+
if (event.key !== 'Tab' || event.defaultPrevented) {
|
110
|
+
return;
|
105
111
|
}
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
}
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
activeTrap
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
112
|
+
|
113
|
+
const {
|
114
|
+
target
|
115
|
+
} = event;
|
116
|
+
const firstFocusableChild = getFocusableChild(container);
|
117
|
+
const lastFocusableChild = getFocusableChild(container, true);
|
118
|
+
|
119
|
+
if (target === firstFocusableChild && event.shiftKey) {
|
120
|
+
event.preventDefault();
|
121
|
+
lastFocusableChild === null || lastFocusableChild === void 0 ? void 0 : lastFocusableChild.focus();
|
122
|
+
} else if (target === lastFocusableChild && !event.shiftKey) {
|
123
|
+
event.preventDefault();
|
124
|
+
firstFocusableChild === null || firstFocusableChild === void 0 ? void 0 : firstFocusableChild.focus();
|
125
|
+
}
|
126
|
+
}, {
|
127
|
+
signal: wrappingController.signal
|
128
|
+
});
|
129
|
+
|
130
|
+
if (activeTrap) {
|
131
|
+
const suspendedTrap = activeTrap;
|
132
|
+
activeTrap.container.setAttribute('data-focus-trap', 'suspended');
|
133
|
+
activeTrap.controller.abort();
|
134
|
+
suspendedTrapStack.push(suspendedTrap);
|
135
|
+
} // When this trap is canceled, either by the user or by us for suspension
|
136
|
+
|
137
|
+
|
138
|
+
wrappingController.signal.addEventListener('abort', () => {
|
139
|
+
activeTrap = undefined;
|
140
|
+
}); // Only when user-canceled
|
141
|
+
|
142
|
+
signal.addEventListener('abort', () => {
|
143
|
+
container.removeAttribute('data-focus-trap');
|
135
144
|
const suspendedTrapIndex = suspendedTrapStack.findIndex(t => t.container === container);
|
145
|
+
|
136
146
|
if (suspendedTrapIndex >= 0) {
|
137
|
-
|
138
|
-
}
|
139
|
-
if (!abortSignal) {
|
140
|
-
return controller;
|
147
|
+
suspendedTrapStack.splice(suspendedTrapIndex, 1);
|
141
148
|
}
|
142
|
-
|
143
|
-
|
149
|
+
|
150
|
+
tryReactivate();
|
151
|
+
}); // Prevent focus leaving the trap container
|
152
|
+
|
153
|
+
document.addEventListener('focus', event => {
|
154
|
+
ensureTrapZoneHasFocus(event.target);
|
155
|
+
}, // use capture to ensure we get all events. focus events do not bubble
|
156
|
+
{
|
157
|
+
signal: wrappingController.signal,
|
158
|
+
capture: true
|
159
|
+
}); // focus the first element
|
160
|
+
|
161
|
+
ensureTrapZoneHasFocus(document.activeElement);
|
162
|
+
activeTrap = {
|
163
|
+
container,
|
164
|
+
controller: wrappingController,
|
165
|
+
initialFocus,
|
166
|
+
originalSignal: signal
|
167
|
+
}; // If we are activating a focus trap for a container that was previously
|
168
|
+
// suspended, just remove it from the suspended list.
|
169
|
+
|
170
|
+
const suspendedTrapIndex = suspendedTrapStack.findIndex(t => t.container === container);
|
171
|
+
|
172
|
+
if (suspendedTrapIndex >= 0) {
|
173
|
+
suspendedTrapStack.splice(suspendedTrapIndex, 1);
|
174
|
+
}
|
175
|
+
|
176
|
+
if (!abortSignal) {
|
177
|
+
return controller;
|
178
|
+
}
|
179
|
+
}
|