@tamagui/focus-scope 1.43.2 → 1.43.3
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/dist/cjs/FocusScope.js +123 -115
- package/dist/cjs/FocusScope.js.map +2 -2
- package/dist/esm/FocusScope.js +121 -114
- package/dist/esm/FocusScope.js.map +2 -2
- package/dist/jsx/FocusScope.js +120 -114
- package/dist/jsx/FocusScope.js.map +2 -2
- package/dist/jsx/FocusScope.mjs +120 -114
- package/dist/jsx/FocusScope.mjs.map +2 -2
- package/package.json +4 -4
- package/src/FocusScope.tsx +136 -126
- package/src/FocusScopeProps.tsx +7 -1
- package/types/FocusScope.d.ts +11 -0
- package/types/FocusScope.d.ts.map +1 -1
- package/types/FocusScopeProps.d.ts +5 -1
- package/types/FocusScopeProps.d.ts.map +1 -1
package/dist/cjs/FocusScope.js
CHANGED
|
@@ -28,139 +28,146 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var FocusScope_exports = {};
|
|
30
30
|
__export(FocusScope_exports, {
|
|
31
|
-
FocusScope: () => FocusScope
|
|
31
|
+
FocusScope: () => FocusScope,
|
|
32
|
+
useFocusScope: () => useFocusScope
|
|
32
33
|
});
|
|
33
34
|
module.exports = __toCommonJS(FocusScope_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
34
36
|
var import_compose_refs = require("@tamagui/compose-refs");
|
|
35
37
|
var import_use_event = require("@tamagui/use-event");
|
|
36
38
|
var React = __toESM(require("react"));
|
|
37
39
|
const AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
|
|
38
40
|
const AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
|
|
39
41
|
const EVENT_OPTIONS = { bubbles: false, cancelable: true };
|
|
40
|
-
const FOCUS_SCOPE_NAME = "FocusScope";
|
|
41
42
|
const FocusScope = React.forwardRef(
|
|
42
|
-
(props, forwardedRef)
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
43
|
+
function FocusScope2(props, forwardedRef) {
|
|
44
|
+
const childProps = useFocusScope(props, forwardedRef);
|
|
45
|
+
if (typeof props.children === "function") {
|
|
46
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: props.children(childProps) });
|
|
47
|
+
}
|
|
48
|
+
return React.cloneElement(React.Children.only(props.children), childProps);
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
function useFocusScope(props, forwardedRef) {
|
|
52
|
+
const {
|
|
53
|
+
loop = false,
|
|
54
|
+
trapped = false,
|
|
55
|
+
onMountAutoFocus: onMountAutoFocusProp,
|
|
56
|
+
onUnmountAutoFocus: onUnmountAutoFocusProp,
|
|
57
|
+
forceUnmount,
|
|
58
|
+
...scopeProps
|
|
59
|
+
} = props;
|
|
60
|
+
const [container, setContainer] = React.useState(null);
|
|
61
|
+
const onMountAutoFocus = (0, import_use_event.useEvent)(onMountAutoFocusProp);
|
|
62
|
+
const onUnmountAutoFocus = (0, import_use_event.useEvent)(onUnmountAutoFocusProp);
|
|
63
|
+
const lastFocusedElementRef = React.useRef(null);
|
|
64
|
+
const composedRefs = (0, import_compose_refs.useComposedRefs)(forwardedRef, (node) => setContainer(node));
|
|
65
|
+
const focusScope = React.useRef({
|
|
66
|
+
paused: false,
|
|
67
|
+
pause() {
|
|
68
|
+
this.paused = true;
|
|
69
|
+
},
|
|
70
|
+
resume() {
|
|
71
|
+
this.paused = false;
|
|
72
|
+
}
|
|
73
|
+
}).current;
|
|
74
|
+
React.useEffect(() => {
|
|
75
|
+
if (!trapped)
|
|
76
|
+
return;
|
|
77
|
+
function handleFocusIn(event) {
|
|
78
|
+
if (focusScope.paused || !container)
|
|
79
|
+
return;
|
|
80
|
+
const target = event.target;
|
|
81
|
+
if (container.contains(target)) {
|
|
82
|
+
lastFocusedElementRef.current = target;
|
|
83
|
+
} else {
|
|
84
|
+
focus(lastFocusedElementRef.current, { select: true });
|
|
64
85
|
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (!
|
|
86
|
+
}
|
|
87
|
+
function handleFocusOut(event) {
|
|
88
|
+
if (focusScope.paused || !container)
|
|
68
89
|
return;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return;
|
|
72
|
-
const target = event.target;
|
|
73
|
-
if (container.contains(target)) {
|
|
74
|
-
lastFocusedElementRef.current = target;
|
|
75
|
-
} else {
|
|
76
|
-
focus(lastFocusedElementRef.current, { select: true });
|
|
77
|
-
}
|
|
90
|
+
if (!container.contains(event.relatedTarget)) {
|
|
91
|
+
focus(lastFocusedElementRef.current, { select: true });
|
|
78
92
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
}
|
|
94
|
+
document.addEventListener("focusin", handleFocusIn);
|
|
95
|
+
document.addEventListener("focusout", handleFocusOut);
|
|
96
|
+
return () => {
|
|
97
|
+
document.removeEventListener("focusin", handleFocusIn);
|
|
98
|
+
document.removeEventListener("focusout", handleFocusOut);
|
|
99
|
+
};
|
|
100
|
+
}, [trapped, forceUnmount, container, focusScope.paused]);
|
|
101
|
+
React.useEffect(() => {
|
|
102
|
+
if (!container)
|
|
103
|
+
return;
|
|
104
|
+
if (forceUnmount)
|
|
105
|
+
return;
|
|
106
|
+
focusScopesStack.add(focusScope);
|
|
107
|
+
const previouslyFocusedElement = document.activeElement;
|
|
108
|
+
const hasFocusedCandidate = container.contains(previouslyFocusedElement);
|
|
109
|
+
if (!hasFocusedCandidate) {
|
|
110
|
+
const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);
|
|
111
|
+
container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
|
|
112
|
+
container.dispatchEvent(mountEvent);
|
|
113
|
+
if (!mountEvent.defaultPrevented) {
|
|
114
|
+
focusFirst(removeLinks(getTabbableCandidates(container)), { select: true });
|
|
115
|
+
if (document.activeElement === previouslyFocusedElement) {
|
|
116
|
+
focus(container);
|
|
84
117
|
}
|
|
85
118
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
119
|
+
}
|
|
120
|
+
return () => {
|
|
121
|
+
container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
|
|
122
|
+
const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);
|
|
123
|
+
container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
|
|
124
|
+
container.dispatchEvent(unmountEvent);
|
|
125
|
+
if (!unmountEvent.defaultPrevented) {
|
|
126
|
+
focus(previouslyFocusedElement ?? document.body, { select: true });
|
|
127
|
+
}
|
|
128
|
+
container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
|
|
129
|
+
focusScopesStack.remove(focusScope);
|
|
130
|
+
};
|
|
131
|
+
}, [container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
|
132
|
+
const handleKeyDown = React.useCallback(
|
|
133
|
+
(event) => {
|
|
134
|
+
if (!trapped)
|
|
135
|
+
return;
|
|
136
|
+
if (!loop)
|
|
95
137
|
return;
|
|
96
|
-
if (
|
|
138
|
+
if (focusScope.paused)
|
|
97
139
|
return;
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
140
|
+
const isTabKey = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
141
|
+
const focusedElement = document.activeElement;
|
|
142
|
+
if (isTabKey && focusedElement) {
|
|
143
|
+
const container2 = event.currentTarget;
|
|
144
|
+
const [first, last] = getTabbableEdges(container2);
|
|
145
|
+
const hasTabbableElementsInside = first && last;
|
|
146
|
+
if (!hasTabbableElementsInside) {
|
|
147
|
+
if (focusedElement === container2)
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
} else {
|
|
150
|
+
if (!event.shiftKey && focusedElement === last) {
|
|
151
|
+
event.preventDefault();
|
|
152
|
+
if (loop)
|
|
153
|
+
focus(first, { select: true });
|
|
154
|
+
} else if (event.shiftKey && focusedElement === first) {
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
if (loop)
|
|
157
|
+
focus(last, { select: true });
|
|
109
158
|
}
|
|
110
159
|
}
|
|
111
160
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
};
|
|
123
|
-
}, [container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
|
124
|
-
const handleKeyDown = React.useCallback(
|
|
125
|
-
(event) => {
|
|
126
|
-
if (!(loop || trapped))
|
|
127
|
-
return;
|
|
128
|
-
if (focusScope.paused)
|
|
129
|
-
return;
|
|
130
|
-
const isTabKey = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
131
|
-
const focusedElement = document.activeElement;
|
|
132
|
-
if (isTabKey && focusedElement) {
|
|
133
|
-
const container2 = event.currentTarget;
|
|
134
|
-
const [first, last] = getTabbableEdges(container2);
|
|
135
|
-
const hasTabbableElementsInside = first && last;
|
|
136
|
-
if (!hasTabbableElementsInside) {
|
|
137
|
-
if (focusedElement === container2)
|
|
138
|
-
event.preventDefault();
|
|
139
|
-
} else {
|
|
140
|
-
if (!event.shiftKey && focusedElement === last) {
|
|
141
|
-
event.preventDefault();
|
|
142
|
-
if (loop)
|
|
143
|
-
focus(first, { select: true });
|
|
144
|
-
} else if (event.shiftKey && focusedElement === first) {
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
if (loop)
|
|
147
|
-
focus(last, { select: true });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
[loop, trapped, focusScope.paused]
|
|
153
|
-
);
|
|
154
|
-
const child = React.Children.only(children);
|
|
155
|
-
return React.cloneElement(child, {
|
|
156
|
-
tabIndex: -1,
|
|
157
|
-
...scopeProps,
|
|
158
|
-
ref: composedRefs,
|
|
159
|
-
onKeyDown: handleKeyDown
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
);
|
|
163
|
-
FocusScope.displayName = FOCUS_SCOPE_NAME;
|
|
161
|
+
},
|
|
162
|
+
[loop, trapped, focusScope.paused]
|
|
163
|
+
);
|
|
164
|
+
return {
|
|
165
|
+
tabIndex: -1,
|
|
166
|
+
...scopeProps,
|
|
167
|
+
ref: composedRefs,
|
|
168
|
+
onKeyDown: handleKeyDown
|
|
169
|
+
};
|
|
170
|
+
}
|
|
164
171
|
function focusFirst(candidates, { select = false } = {}) {
|
|
165
172
|
const previouslyFocusedElement = document.activeElement;
|
|
166
173
|
for (const candidate of candidates) {
|
|
@@ -250,6 +257,7 @@ function removeLinks(items) {
|
|
|
250
257
|
}
|
|
251
258
|
// Annotate the CommonJS export names for ESM import in node:
|
|
252
259
|
0 && (module.exports = {
|
|
253
|
-
FocusScope
|
|
260
|
+
FocusScope,
|
|
261
|
+
useFocusScope
|
|
254
262
|
});
|
|
255
263
|
//# sourceMappingURL=FocusScope.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/FocusScope.tsx"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAgC;AAChC,uBAAyB;AACzB,YAAuB;AAIvB,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAC7B,MAAM,gBAAgB,EAAE,SAAS,OAAO,YAAY,KAAK;
|
|
5
|
-
"names": ["container"]
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["FocusScope", "container"]
|
|
6
6
|
}
|
package/dist/esm/FocusScope.js
CHANGED
|
@@ -1,133 +1,139 @@
|
|
|
1
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
1
2
|
import { useComposedRefs } from "@tamagui/compose-refs";
|
|
2
3
|
import { useEvent } from "@tamagui/use-event";
|
|
3
4
|
import * as React from "react";
|
|
4
5
|
const AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
|
|
5
6
|
const AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
|
|
6
7
|
const EVENT_OPTIONS = { bubbles: false, cancelable: true };
|
|
7
|
-
const FOCUS_SCOPE_NAME = "FocusScope";
|
|
8
8
|
const FocusScope = React.forwardRef(
|
|
9
|
-
(props, forwardedRef)
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
9
|
+
function FocusScope2(props, forwardedRef) {
|
|
10
|
+
const childProps = useFocusScope(props, forwardedRef);
|
|
11
|
+
if (typeof props.children === "function") {
|
|
12
|
+
return /* @__PURE__ */ jsx(Fragment, { children: props.children(childProps) });
|
|
13
|
+
}
|
|
14
|
+
return React.cloneElement(React.Children.only(props.children), childProps);
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
function useFocusScope(props, forwardedRef) {
|
|
18
|
+
const {
|
|
19
|
+
loop = false,
|
|
20
|
+
trapped = false,
|
|
21
|
+
onMountAutoFocus: onMountAutoFocusProp,
|
|
22
|
+
onUnmountAutoFocus: onUnmountAutoFocusProp,
|
|
23
|
+
forceUnmount,
|
|
24
|
+
...scopeProps
|
|
25
|
+
} = props;
|
|
26
|
+
const [container, setContainer] = React.useState(null);
|
|
27
|
+
const onMountAutoFocus = useEvent(onMountAutoFocusProp);
|
|
28
|
+
const onUnmountAutoFocus = useEvent(onUnmountAutoFocusProp);
|
|
29
|
+
const lastFocusedElementRef = React.useRef(null);
|
|
30
|
+
const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node));
|
|
31
|
+
const focusScope = React.useRef({
|
|
32
|
+
paused: false,
|
|
33
|
+
pause() {
|
|
34
|
+
this.paused = true;
|
|
35
|
+
},
|
|
36
|
+
resume() {
|
|
37
|
+
this.paused = false;
|
|
38
|
+
}
|
|
39
|
+
}).current;
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
if (!trapped)
|
|
42
|
+
return;
|
|
43
|
+
function handleFocusIn(event) {
|
|
44
|
+
if (focusScope.paused || !container)
|
|
45
|
+
return;
|
|
46
|
+
const target = event.target;
|
|
47
|
+
if (container.contains(target)) {
|
|
48
|
+
lastFocusedElementRef.current = target;
|
|
49
|
+
} else {
|
|
50
|
+
focus(lastFocusedElementRef.current, { select: true });
|
|
31
51
|
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (!
|
|
52
|
+
}
|
|
53
|
+
function handleFocusOut(event) {
|
|
54
|
+
if (focusScope.paused || !container)
|
|
35
55
|
return;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return;
|
|
39
|
-
const target = event.target;
|
|
40
|
-
if (container.contains(target)) {
|
|
41
|
-
lastFocusedElementRef.current = target;
|
|
42
|
-
} else {
|
|
43
|
-
focus(lastFocusedElementRef.current, { select: true });
|
|
44
|
-
}
|
|
56
|
+
if (!container.contains(event.relatedTarget)) {
|
|
57
|
+
focus(lastFocusedElementRef.current, { select: true });
|
|
45
58
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
}
|
|
60
|
+
document.addEventListener("focusin", handleFocusIn);
|
|
61
|
+
document.addEventListener("focusout", handleFocusOut);
|
|
62
|
+
return () => {
|
|
63
|
+
document.removeEventListener("focusin", handleFocusIn);
|
|
64
|
+
document.removeEventListener("focusout", handleFocusOut);
|
|
65
|
+
};
|
|
66
|
+
}, [trapped, forceUnmount, container, focusScope.paused]);
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
if (!container)
|
|
69
|
+
return;
|
|
70
|
+
if (forceUnmount)
|
|
71
|
+
return;
|
|
72
|
+
focusScopesStack.add(focusScope);
|
|
73
|
+
const previouslyFocusedElement = document.activeElement;
|
|
74
|
+
const hasFocusedCandidate = container.contains(previouslyFocusedElement);
|
|
75
|
+
if (!hasFocusedCandidate) {
|
|
76
|
+
const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);
|
|
77
|
+
container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
|
|
78
|
+
container.dispatchEvent(mountEvent);
|
|
79
|
+
if (!mountEvent.defaultPrevented) {
|
|
80
|
+
focusFirst(removeLinks(getTabbableCandidates(container)), { select: true });
|
|
81
|
+
if (document.activeElement === previouslyFocusedElement) {
|
|
82
|
+
focus(container);
|
|
51
83
|
}
|
|
52
84
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
85
|
+
}
|
|
86
|
+
return () => {
|
|
87
|
+
container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
|
|
88
|
+
const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);
|
|
89
|
+
container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
|
|
90
|
+
container.dispatchEvent(unmountEvent);
|
|
91
|
+
if (!unmountEvent.defaultPrevented) {
|
|
92
|
+
focus(previouslyFocusedElement ?? document.body, { select: true });
|
|
93
|
+
}
|
|
94
|
+
container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
|
|
95
|
+
focusScopesStack.remove(focusScope);
|
|
96
|
+
};
|
|
97
|
+
}, [container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
|
98
|
+
const handleKeyDown = React.useCallback(
|
|
99
|
+
(event) => {
|
|
100
|
+
if (!trapped)
|
|
101
|
+
return;
|
|
102
|
+
if (!loop)
|
|
62
103
|
return;
|
|
63
|
-
if (
|
|
104
|
+
if (focusScope.paused)
|
|
64
105
|
return;
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
106
|
+
const isTabKey = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
107
|
+
const focusedElement = document.activeElement;
|
|
108
|
+
if (isTabKey && focusedElement) {
|
|
109
|
+
const container2 = event.currentTarget;
|
|
110
|
+
const [first, last] = getTabbableEdges(container2);
|
|
111
|
+
const hasTabbableElementsInside = first && last;
|
|
112
|
+
if (!hasTabbableElementsInside) {
|
|
113
|
+
if (focusedElement === container2)
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
} else {
|
|
116
|
+
if (!event.shiftKey && focusedElement === last) {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
if (loop)
|
|
119
|
+
focus(first, { select: true });
|
|
120
|
+
} else if (event.shiftKey && focusedElement === first) {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
if (loop)
|
|
123
|
+
focus(last, { select: true });
|
|
76
124
|
}
|
|
77
125
|
}
|
|
78
126
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
};
|
|
90
|
-
}, [container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
|
91
|
-
const handleKeyDown = React.useCallback(
|
|
92
|
-
(event) => {
|
|
93
|
-
if (!(loop || trapped))
|
|
94
|
-
return;
|
|
95
|
-
if (focusScope.paused)
|
|
96
|
-
return;
|
|
97
|
-
const isTabKey = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
98
|
-
const focusedElement = document.activeElement;
|
|
99
|
-
if (isTabKey && focusedElement) {
|
|
100
|
-
const container2 = event.currentTarget;
|
|
101
|
-
const [first, last] = getTabbableEdges(container2);
|
|
102
|
-
const hasTabbableElementsInside = first && last;
|
|
103
|
-
if (!hasTabbableElementsInside) {
|
|
104
|
-
if (focusedElement === container2)
|
|
105
|
-
event.preventDefault();
|
|
106
|
-
} else {
|
|
107
|
-
if (!event.shiftKey && focusedElement === last) {
|
|
108
|
-
event.preventDefault();
|
|
109
|
-
if (loop)
|
|
110
|
-
focus(first, { select: true });
|
|
111
|
-
} else if (event.shiftKey && focusedElement === first) {
|
|
112
|
-
event.preventDefault();
|
|
113
|
-
if (loop)
|
|
114
|
-
focus(last, { select: true });
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
[loop, trapped, focusScope.paused]
|
|
120
|
-
);
|
|
121
|
-
const child = React.Children.only(children);
|
|
122
|
-
return React.cloneElement(child, {
|
|
123
|
-
tabIndex: -1,
|
|
124
|
-
...scopeProps,
|
|
125
|
-
ref: composedRefs,
|
|
126
|
-
onKeyDown: handleKeyDown
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
);
|
|
130
|
-
FocusScope.displayName = FOCUS_SCOPE_NAME;
|
|
127
|
+
},
|
|
128
|
+
[loop, trapped, focusScope.paused]
|
|
129
|
+
);
|
|
130
|
+
return {
|
|
131
|
+
tabIndex: -1,
|
|
132
|
+
...scopeProps,
|
|
133
|
+
ref: composedRefs,
|
|
134
|
+
onKeyDown: handleKeyDown
|
|
135
|
+
};
|
|
136
|
+
}
|
|
131
137
|
function focusFirst(candidates, { select = false } = {}) {
|
|
132
138
|
const previouslyFocusedElement = document.activeElement;
|
|
133
139
|
for (const candidate of candidates) {
|
|
@@ -216,6 +222,7 @@ function removeLinks(items) {
|
|
|
216
222
|
return items.filter((item) => item.tagName !== "A");
|
|
217
223
|
}
|
|
218
224
|
export {
|
|
219
|
-
FocusScope
|
|
225
|
+
FocusScope,
|
|
226
|
+
useFocusScope
|
|
220
227
|
};
|
|
221
228
|
//# sourceMappingURL=FocusScope.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/FocusScope.tsx"],
|
|
4
|
-
"mappings": "
|
|
5
|
-
"names": ["container"]
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["FocusScope", "container"]
|
|
6
6
|
}
|