@tamagui/focus-scope 1.127.3 → 1.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/FocusScope.cjs +30 -9
- package/dist/cjs/FocusScope.js +49 -21
- package/dist/cjs/FocusScope.js.map +1 -1
- package/dist/cjs/FocusScopeController.cjs +76 -0
- package/dist/cjs/FocusScopeController.js +69 -0
- package/dist/cjs/FocusScopeController.js.map +6 -0
- package/dist/cjs/FocusScopeController.native.js +67 -0
- package/dist/cjs/FocusScopeController.native.js.map +6 -0
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +3 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/{FocusScopeProps.cjs → types.cjs} +2 -2
- package/dist/cjs/{FocusScopeProps.js → types.js} +3 -3
- package/dist/cjs/{FocusScopeProps.js.map → types.js.map} +1 -1
- package/dist/cjs/{FocusScopeProps.native.js → types.native.js} +3 -3
- package/dist/cjs/types.native.js.map +6 -0
- package/dist/esm/FocusScope.js +51 -21
- package/dist/esm/FocusScope.js.map +1 -1
- package/dist/esm/FocusScope.mjs +30 -9
- package/dist/esm/FocusScope.mjs.map +1 -1
- package/dist/esm/FocusScopeController.js +48 -0
- package/dist/esm/FocusScopeController.js.map +6 -0
- package/dist/esm/FocusScopeController.mjs +39 -0
- package/dist/esm/FocusScopeController.mjs.map +1 -0
- package/dist/esm/FocusScopeController.native.js +41 -0
- package/dist/esm/FocusScopeController.native.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/types.native.js +2 -0
- package/dist/jsx/FocusScope.js +51 -21
- package/dist/jsx/FocusScope.js.map +1 -1
- package/dist/jsx/FocusScope.mjs +30 -9
- package/dist/jsx/FocusScope.mjs.map +1 -1
- package/dist/jsx/FocusScopeController.js +48 -0
- package/dist/jsx/FocusScopeController.js.map +6 -0
- package/dist/jsx/FocusScopeController.mjs +39 -0
- package/dist/jsx/FocusScopeController.mjs.map +1 -0
- package/dist/jsx/FocusScopeController.native.js +39 -0
- package/dist/jsx/FocusScopeController.native.js.map +6 -0
- package/dist/jsx/index.js +1 -0
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +1 -0
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +1 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/types.js +1 -0
- package/dist/jsx/types.mjs +2 -0
- package/dist/jsx/types.native.js +1 -0
- package/package.json +7 -5
- package/src/FocusScope.native.tsx +1 -1
- package/src/FocusScope.tsx +84 -38
- package/src/FocusScopeController.tsx +78 -0
- package/src/index.ts +1 -0
- package/src/{FocusScopeProps.tsx → types.tsx} +10 -0
- package/types/FocusScope.d.ts +1 -1
- package/types/FocusScope.d.ts.map +1 -1
- package/types/FocusScope.native.d.ts +1 -1
- package/types/FocusScope.native.d.ts.map +1 -1
- package/types/FocusScopeController.d.ts +19 -0
- package/types/FocusScopeController.d.ts.map +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/{FocusScopeProps.d.ts → types.d.ts} +11 -1
- package/types/types.d.ts.map +1 -0
- package/dist/cjs/FocusScopeProps.native.js.map +0 -6
- package/dist/esm/FocusScopeProps.js +0 -1
- package/dist/esm/FocusScopeProps.mjs +0 -2
- package/dist/esm/FocusScopeProps.native.js +0 -2
- package/dist/jsx/FocusScopeProps.js +0 -1
- package/dist/jsx/FocusScopeProps.mjs +0 -2
- package/dist/jsx/FocusScopeProps.native.js +0 -1
- package/types/FocusScopeProps.d.ts.map +0 -1
- /package/dist/esm/{FocusScopeProps.js.map → types.js.map} +0 -0
- /package/dist/esm/{FocusScopeProps.mjs.map → types.mjs.map} +0 -0
- /package/dist/esm/{FocusScopeProps.native.js.map → types.native.js.map} +0 -0
- /package/dist/jsx/{FocusScopeProps.js.map → types.js.map} +0 -0
- /package/dist/jsx/{FocusScopeProps.mjs.map → types.mjs.map} +0 -0
- /package/dist/jsx/{FocusScopeProps.native.js.map → types.native.js.map} +0 -0
package/dist/jsx/FocusScope.mjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { useComposedRefs } from "@tamagui/compose-refs";
|
|
2
|
-
import { useEvent } from "@tamagui/use-event";
|
|
3
2
|
import { startTransition } from "@tamagui/start-transition";
|
|
3
|
+
import { fullyIdle, sleep, useAsyncEffect } from "@tamagui/use-async";
|
|
4
|
+
import { useEvent } from "@tamagui/use-event";
|
|
4
5
|
import * as React from "react";
|
|
6
|
+
import { useFocusScopeControllerContext } from "./FocusScopeController.mjs";
|
|
5
7
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
6
8
|
const AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount",
|
|
7
9
|
AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount",
|
|
@@ -9,11 +11,28 @@ const AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount",
|
|
|
9
11
|
bubbles: !1,
|
|
10
12
|
cancelable: !0
|
|
11
13
|
},
|
|
12
|
-
FocusScope = React.forwardRef(function (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
FocusScope = React.forwardRef(function ({
|
|
15
|
+
__scopeFocusScope,
|
|
16
|
+
...props
|
|
17
|
+
}, forwardedRef) {
|
|
18
|
+
const context = useFocusScopeControllerContext("FocusScope", __scopeFocusScope, {
|
|
19
|
+
warn: !1,
|
|
20
|
+
fallback: {}
|
|
21
|
+
}),
|
|
22
|
+
mergedProps = {
|
|
23
|
+
...props,
|
|
24
|
+
enabled: context.enabled ?? props.enabled,
|
|
25
|
+
loop: context.loop ?? props.loop,
|
|
26
|
+
trapped: context.trapped ?? props.trapped,
|
|
27
|
+
onMountAutoFocus: context.onMountAutoFocus ?? props.onMountAutoFocus,
|
|
28
|
+
onUnmountAutoFocus: context.onUnmountAutoFocus ?? props.onUnmountAutoFocus,
|
|
29
|
+
forceUnmount: context.forceUnmount ?? props.forceUnmount,
|
|
30
|
+
focusOnIdle: context.focusOnIdle ?? props.focusOnIdle
|
|
31
|
+
},
|
|
32
|
+
childProps = useFocusScope(mergedProps, forwardedRef);
|
|
33
|
+
return typeof mergedProps.children == "function" ? /* @__PURE__ */jsx(Fragment, {
|
|
34
|
+
children: mergedProps.children(childProps)
|
|
35
|
+
}) : React.cloneElement(React.Children.only(mergedProps.children), childProps);
|
|
17
36
|
});
|
|
18
37
|
function useFocusScope(props, forwardedRef) {
|
|
19
38
|
const {
|
|
@@ -23,6 +42,7 @@ function useFocusScope(props, forwardedRef) {
|
|
|
23
42
|
onMountAutoFocus: onMountAutoFocusProp,
|
|
24
43
|
onUnmountAutoFocus: onUnmountAutoFocusProp,
|
|
25
44
|
forceUnmount,
|
|
45
|
+
focusOnIdle = !0,
|
|
26
46
|
children,
|
|
27
47
|
...scopeProps
|
|
28
48
|
} = props,
|
|
@@ -68,13 +88,14 @@ function useFocusScope(props, forwardedRef) {
|
|
|
68
88
|
return document.addEventListener("focusin", handleFocusIn), document.addEventListener("focusout", handleFocusOut), () => {
|
|
69
89
|
controller.abort(), document.removeEventListener("focusin", handleFocusIn), document.removeEventListener("focusout", handleFocusOut);
|
|
70
90
|
};
|
|
71
|
-
}, [trapped, forceUnmount, container, focusScope.paused]),
|
|
91
|
+
}, [trapped, forceUnmount, container, focusScope.paused]), useAsyncEffect(async signal => {
|
|
72
92
|
if (!enabled || !container || forceUnmount) return;
|
|
73
93
|
focusScopesStack.add(focusScope);
|
|
74
94
|
const previouslyFocusedElement = document.activeElement;
|
|
75
95
|
if (!container.contains(previouslyFocusedElement)) {
|
|
76
96
|
const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);
|
|
77
97
|
if (container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus), container.dispatchEvent(mountEvent), !mountEvent.defaultPrevented) {
|
|
98
|
+
focusOnIdle && (await sleep(typeof focusOnIdle == "number" ? focusOnIdle : 16, signal), await fullyIdle(signal));
|
|
78
99
|
const candidates = removeLinks(getTabbableCandidates(container));
|
|
79
100
|
focusFirst(candidates, {
|
|
80
101
|
select: !0
|
|
@@ -88,7 +109,7 @@ function useFocusScope(props, forwardedRef) {
|
|
|
88
109
|
select: !0
|
|
89
110
|
}), container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus), focusScopesStack.remove(focusScope);
|
|
90
111
|
};
|
|
91
|
-
}, [enabled, container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
|
112
|
+
}, [enabled, container, forceUnmount, onMountAutoFocus, onUnmountAutoFocus, focusScope, focusOnIdle]);
|
|
92
113
|
const handleKeyDown = React.useCallback(event => {
|
|
93
114
|
if (!trapped || !loop || focusScope.paused) return;
|
|
94
115
|
const isTabKey = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey,
|
|
@@ -157,7 +178,7 @@ function isSelectableInput(element) {
|
|
|
157
178
|
function focus(element, {
|
|
158
179
|
select = !1
|
|
159
180
|
} = {}) {
|
|
160
|
-
if (element?.focus) {
|
|
181
|
+
if (console.trace("focus", element), element?.focus) {
|
|
161
182
|
const previouslyFocusedElement = document.activeElement;
|
|
162
183
|
element.focus({
|
|
163
184
|
preventScroll: !0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useComposedRefs","
|
|
1
|
+
{"version":3,"names":["useComposedRefs","startTransition","fullyIdle","sleep","useAsyncEffect","useEvent","React","useFocusScopeControllerContext","Fragment","jsx","AUTOFOCUS_ON_MOUNT","AUTOFOCUS_ON_UNMOUNT","EVENT_OPTIONS","bubbles","cancelable","FocusScope","forwardRef","__scopeFocusScope","props","forwardedRef","context","warn","fallback","mergedProps","enabled","loop","trapped","onMountAutoFocus","onUnmountAutoFocus","forceUnmount","focusOnIdle","childProps","useFocusScope","children","cloneElement","Children","only","onMountAutoFocusProp","onUnmountAutoFocusProp","scopeProps","container","setContainer","useState","lastFocusedElementRef","useRef","setContainerTransition","useCallback","node","composedRefs","focusScope","paused","pause","resume","current","useEffect","controller","AbortController","handleFocusIn","event","target","contains","addEventListener","handleBlur","signal","focus","select","handleFocusOut","abort","relatedTarget","document","removeEventListener","focusScopesStack","add","previouslyFocusedElement","activeElement","mountEvent","CustomEvent","dispatchEvent","defaultPrevented","candidates","removeLinks","getTabbableCandidates","focusFirst","unmountEvent","body","remove","handleKeyDown","isTabKey","key","altKey","ctrlKey","metaKey","focusedElement","container2","currentTarget","first","last","getTabbableEdges","shiftKey","preventDefault","tabIndex","ref","onKeyDown","candidate","findVisible","reverse","nodes","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","acceptNode","isHiddenInput","tagName","type","disabled","hidden","FILTER_SKIP","FILTER_ACCEPT","nextNode","push","currentNode","elements","element","isHidden","upTo","getComputedStyle","visibility","display","parentElement","isSelectableInput","HTMLInputElement","console","trace","preventScroll","createFocusScopesStack","stack","activeFocusScope","arrayRemove","unshift","array","item","updatedArray","index","indexOf","splice","items","filter"],"sources":["../../src/FocusScope.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createContextScope } from "@tamagui/create-context";
|
|
2
|
+
import { useEvent } from "@tamagui/use-event";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
const FOCUS_SCOPE_CONTROLLER_NAME = "FocusScopeController", [createFocusScopeControllerContext, createFocusScopeControllerScope] = createContextScope(FOCUS_SCOPE_CONTROLLER_NAME), [FocusScopeControllerProvider, useFocusScopeControllerContext] = createFocusScopeControllerContext(
|
|
6
|
+
FOCUS_SCOPE_CONTROLLER_NAME
|
|
7
|
+
);
|
|
8
|
+
function FocusScopeController(props) {
|
|
9
|
+
const {
|
|
10
|
+
__scopeFocusScope,
|
|
11
|
+
children,
|
|
12
|
+
enabled,
|
|
13
|
+
loop,
|
|
14
|
+
trapped,
|
|
15
|
+
onMountAutoFocus,
|
|
16
|
+
onUnmountAutoFocus,
|
|
17
|
+
forceUnmount,
|
|
18
|
+
focusOnIdle
|
|
19
|
+
} = props, stableOnMountAutoFocus = useEvent(onMountAutoFocus), stableOnUnmountAutoFocus = useEvent(onUnmountAutoFocus), contextValue = React.useMemo(
|
|
20
|
+
() => ({
|
|
21
|
+
enabled,
|
|
22
|
+
loop,
|
|
23
|
+
trapped,
|
|
24
|
+
onMountAutoFocus: stableOnMountAutoFocus,
|
|
25
|
+
onUnmountAutoFocus: stableOnUnmountAutoFocus,
|
|
26
|
+
forceUnmount,
|
|
27
|
+
focusOnIdle
|
|
28
|
+
}),
|
|
29
|
+
[
|
|
30
|
+
enabled,
|
|
31
|
+
loop,
|
|
32
|
+
trapped,
|
|
33
|
+
stableOnMountAutoFocus,
|
|
34
|
+
stableOnUnmountAutoFocus,
|
|
35
|
+
forceUnmount,
|
|
36
|
+
focusOnIdle
|
|
37
|
+
]
|
|
38
|
+
);
|
|
39
|
+
return /* @__PURE__ */ jsx(FocusScopeControllerProvider, { scope: __scopeFocusScope, ...contextValue, children });
|
|
40
|
+
}
|
|
41
|
+
const FocusScopeControllerComponent = FocusScopeController;
|
|
42
|
+
export {
|
|
43
|
+
FocusScopeControllerComponent as FocusScopeController,
|
|
44
|
+
FocusScopeControllerProvider,
|
|
45
|
+
createFocusScopeControllerScope,
|
|
46
|
+
useFocusScopeControllerContext
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=FocusScopeController.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/FocusScopeController.tsx"],
|
|
4
|
+
"mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,gBAAgB;AACzB,YAAY,WAAW;AA8DnB;AA1DJ,MAAM,8BAA8B,wBAE9B,CAAC,mCAAmC,+BAA+B,IACvE,mBAAmB,2BAA2B,GAI1C,CAAC,8BAA8B,8BAA8B,IACjE;AAAA,EACE;AACF;AAUF,SAAS,qBAAqB,OAA+C;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAEE,yBAAyB,SAAS,gBAAgB,GAClD,2BAA2B,SAAS,kBAAkB,GAEtD,eAAe,MAAM;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,oBAAC,gCAA6B,OAAO,mBAAoB,GAAG,cACzD,UACH;AAEJ;AAEA,MAAM,gCAAgC;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createContextScope } from "@tamagui/create-context";
|
|
2
|
+
import { useEvent } from "@tamagui/use-event";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
const FOCUS_SCOPE_CONTROLLER_NAME = "FocusScopeController",
|
|
6
|
+
[createFocusScopeControllerContext, createFocusScopeControllerScope] = createContextScope(FOCUS_SCOPE_CONTROLLER_NAME),
|
|
7
|
+
[FocusScopeControllerProvider, useFocusScopeControllerContext] = createFocusScopeControllerContext(FOCUS_SCOPE_CONTROLLER_NAME);
|
|
8
|
+
function FocusScopeController(props) {
|
|
9
|
+
const {
|
|
10
|
+
__scopeFocusScope,
|
|
11
|
+
children,
|
|
12
|
+
enabled,
|
|
13
|
+
loop,
|
|
14
|
+
trapped,
|
|
15
|
+
onMountAutoFocus,
|
|
16
|
+
onUnmountAutoFocus,
|
|
17
|
+
forceUnmount,
|
|
18
|
+
focusOnIdle
|
|
19
|
+
} = props,
|
|
20
|
+
stableOnMountAutoFocus = useEvent(onMountAutoFocus),
|
|
21
|
+
stableOnUnmountAutoFocus = useEvent(onUnmountAutoFocus),
|
|
22
|
+
contextValue = React.useMemo(() => ({
|
|
23
|
+
enabled,
|
|
24
|
+
loop,
|
|
25
|
+
trapped,
|
|
26
|
+
onMountAutoFocus: stableOnMountAutoFocus,
|
|
27
|
+
onUnmountAutoFocus: stableOnUnmountAutoFocus,
|
|
28
|
+
forceUnmount,
|
|
29
|
+
focusOnIdle
|
|
30
|
+
}), [enabled, loop, trapped, stableOnMountAutoFocus, stableOnUnmountAutoFocus, forceUnmount, focusOnIdle]);
|
|
31
|
+
return /* @__PURE__ */jsx(FocusScopeControllerProvider, {
|
|
32
|
+
scope: __scopeFocusScope,
|
|
33
|
+
...contextValue,
|
|
34
|
+
children
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const FocusScopeControllerComponent = FocusScopeController;
|
|
38
|
+
export { FocusScopeControllerComponent as FocusScopeController, FocusScopeControllerProvider, createFocusScopeControllerScope, useFocusScopeControllerContext };
|
|
39
|
+
//# sourceMappingURL=FocusScopeController.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContextScope","useEvent","React","jsx","FOCUS_SCOPE_CONTROLLER_NAME","createFocusScopeControllerContext","createFocusScopeControllerScope","FocusScopeControllerProvider","useFocusScopeControllerContext","FocusScopeController","props","__scopeFocusScope","children","enabled","loop","trapped","onMountAutoFocus","onUnmountAutoFocus","forceUnmount","focusOnIdle","stableOnMountAutoFocus","stableOnUnmountAutoFocus","contextValue","useMemo","scope","FocusScopeControllerComponent"],"sources":["../../src/FocusScopeController.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,kBAAA,QAA0B;AACnC,SAASC,QAAA,QAAgB;AACzB,YAAYC,KAAA,MAAW;AA8DnB,SAAAC,GAAA;AA1DJ,MAAMC,2BAAA,GAA8B;EAE9B,CAACC,iCAAA,EAAmCC,+BAA+B,IACvEN,kBAAA,CAAmBI,2BAA2B;EAI1C,CAACG,4BAAA,EAA8BC,8BAA8B,IACjEH,iCAAA,CACED,2BACF;AAUF,SAASK,qBAAqBC,KAAA,EAA+C;EAC3E,MAAM;MACJC,iBAAA;MACAC,QAAA;MACAC,OAAA;MACAC,IAAA;MACAC,OAAA;MACAC,gBAAA;MACAC,kBAAA;MACAC,YAAA;MACAC;IACF,IAAIT,KAAA;IAEEU,sBAAA,GAAyBnB,QAAA,CAASe,gBAAgB;IAClDK,wBAAA,GAA2BpB,QAAA,CAASgB,kBAAkB;IAEtDK,YAAA,GAAepB,KAAA,CAAMqB,OAAA,CACzB,OAAO;MACLV,OAAA;MACAC,IAAA;MACAC,OAAA;MACAC,gBAAA,EAAkBI,sBAAA;MAClBH,kBAAA,EAAoBI,wBAAA;MACpBH,YAAA;MACAC;IACF,IACA,CACEN,OAAA,EACAC,IAAA,EACAC,OAAA,EACAK,sBAAA,EACAC,wBAAA,EACAH,YAAA,EACAC,WAAA,CAEJ;EAEA,OACE,eAAAhB,GAAA,CAACI,4BAAA;IAA6BiB,KAAA,EAAOb,iBAAA;IAAoB,GAAGW,YAAA;IACzDV;EAAA,CACH;AAEJ;AAEA,MAAMa,6BAAA,GAAgChB,oBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContextScope } from "@tamagui/create-context";
|
|
3
|
+
import { useEvent } from "@tamagui/use-event";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
var FOCUS_SCOPE_CONTROLLER_NAME = "FocusScopeController", [createFocusScopeControllerContext, createFocusScopeControllerScope] = createContextScope(FOCUS_SCOPE_CONTROLLER_NAME), [FocusScopeControllerProvider, useFocusScopeControllerContext] = createFocusScopeControllerContext(FOCUS_SCOPE_CONTROLLER_NAME);
|
|
6
|
+
function FocusScopeController(props) {
|
|
7
|
+
var { __scopeFocusScope, children, enabled, loop, trapped, onMountAutoFocus, onUnmountAutoFocus, forceUnmount, focusOnIdle } = props, stableOnMountAutoFocus = useEvent(onMountAutoFocus), stableOnUnmountAutoFocus = useEvent(onUnmountAutoFocus), contextValue = React.useMemo(function() {
|
|
8
|
+
return {
|
|
9
|
+
enabled,
|
|
10
|
+
loop,
|
|
11
|
+
trapped,
|
|
12
|
+
onMountAutoFocus: stableOnMountAutoFocus,
|
|
13
|
+
onUnmountAutoFocus: stableOnUnmountAutoFocus,
|
|
14
|
+
forceUnmount,
|
|
15
|
+
focusOnIdle
|
|
16
|
+
};
|
|
17
|
+
}, [
|
|
18
|
+
enabled,
|
|
19
|
+
loop,
|
|
20
|
+
trapped,
|
|
21
|
+
stableOnMountAutoFocus,
|
|
22
|
+
stableOnUnmountAutoFocus,
|
|
23
|
+
forceUnmount,
|
|
24
|
+
focusOnIdle
|
|
25
|
+
]);
|
|
26
|
+
return /* @__PURE__ */ _jsx(FocusScopeControllerProvider, {
|
|
27
|
+
scope: __scopeFocusScope,
|
|
28
|
+
...contextValue,
|
|
29
|
+
children
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
var FocusScopeControllerComponent = FocusScopeController;
|
|
33
|
+
export {
|
|
34
|
+
FocusScopeControllerComponent as FocusScopeController,
|
|
35
|
+
FocusScopeControllerProvider,
|
|
36
|
+
createFocusScopeControllerScope,
|
|
37
|
+
useFocusScopeControllerContext
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=FocusScopeController.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/FocusScopeController.tsx"],
|
|
4
|
+
"mappings": ";AAAA,SAASA,0BAA0B;AACnC,SAASC,gBAAgB;AACzB,YAAYC,WAAW;AAIvB,IAAMC,8BAA8B,wBAE9B,CAACC,mCAAmCC,+BAAAA,IACxCL,mBAAmBG,2BAAAA,GAIf,CAACG,8BAA8BC,8BAAAA,IACnCH,kCACED,2BAAAA;AAWJ,SAASK,qBAAqBC,OAA6C;AACzE,MAAM,EACJC,mBACAC,UACAC,SACAC,MACAC,SACAC,kBACAC,oBACAC,cACAC,YAAW,IACTT,OAEEU,yBAAyBlB,SAASc,gBAAAA,GAClCK,2BAA2BnB,SAASe,kBAAAA,GAEpCK,eAAenB,MAAMoB,QACzB,WAAA;WAAO;MACLV;MACAC;MACAC;MACAC,kBAAkBI;MAClBH,oBAAoBI;MACpBH;MACAC;IACF;KACA;IACEN;IACAC;IACAC;IACAK;IACAC;IACAH;IACAC;GACD;AAGH,SACE,qBAACZ,8BAAAA;IAA6BiB,OAAOb;IAAoB,GAAGW;;;AAIhE;AAEA,IAAMG,gCAAgChB;",
|
|
5
|
+
"names": ["createContextScope", "useEvent", "React", "FOCUS_SCOPE_CONTROLLER_NAME", "createFocusScopeControllerContext", "createFocusScopeControllerScope", "FocusScopeControllerProvider", "useFocusScopeControllerContext", "FocusScopeController", "props", "__scopeFocusScope", "children", "enabled", "loop", "trapped", "onMountAutoFocus", "onUnmountAutoFocus", "forceUnmount", "focusOnIdle", "stableOnMountAutoFocus", "stableOnUnmountAutoFocus", "contextValue", "useMemo", "scope", "FocusScopeControllerComponent"]
|
|
6
|
+
}
|
package/dist/jsx/index.js
CHANGED
package/dist/jsx/index.js.map
CHANGED
package/dist/jsx/index.mjs
CHANGED
package/dist/jsx/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc","ignoreList":[]}
|
package/dist/jsx/index.native.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/focus-scope",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.128.0",
|
|
4
4
|
"sideEffects": true,
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -34,12 +34,14 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@tamagui/compose-refs": "1.
|
|
38
|
-
"@tamagui/
|
|
39
|
-
"@tamagui/
|
|
37
|
+
"@tamagui/compose-refs": "1.128.0",
|
|
38
|
+
"@tamagui/create-context": "1.128.0",
|
|
39
|
+
"@tamagui/start-transition": "1.128.0",
|
|
40
|
+
"@tamagui/use-async": "1.128.0",
|
|
41
|
+
"@tamagui/use-event": "1.128.0"
|
|
40
42
|
},
|
|
41
43
|
"devDependencies": {
|
|
42
|
-
"@tamagui/build": "1.
|
|
44
|
+
"@tamagui/build": "1.128.0",
|
|
43
45
|
"react": "*"
|
|
44
46
|
},
|
|
45
47
|
"publishConfig": {
|
package/src/FocusScope.tsx
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { useComposedRefs } from '@tamagui/compose-refs'
|
|
2
|
-
import { useEvent } from '@tamagui/use-event'
|
|
3
2
|
import { startTransition } from '@tamagui/start-transition'
|
|
3
|
+
import { fullyIdle, sleep, useAsyncEffect } from '@tamagui/use-async'
|
|
4
|
+
import { useEvent } from '@tamagui/use-event'
|
|
4
5
|
import * as React from 'react'
|
|
6
|
+
import { useFocusScopeControllerContext } from './FocusScopeController'
|
|
7
|
+
import type { FocusScopeProps, ScopedProps } from './types'
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
// We'll define the controller context hook here to avoid circular imports
|
|
10
|
+
let useFocusScopeControllerContextInternal: any = null
|
|
7
11
|
|
|
8
12
|
const AUTOFOCUS_ON_MOUNT = 'focusScope.autoFocusOnMount'
|
|
9
13
|
const AUTOFOCUS_ON_UNMOUNT = 'focusScope.autoFocusOnUnmount'
|
|
@@ -18,14 +22,37 @@ type FocusableTarget = HTMLElement | { focus(): void }
|
|
|
18
22
|
type FocusScopeElement = HTMLDivElement
|
|
19
23
|
|
|
20
24
|
const FocusScope = React.forwardRef<FocusScopeElement, FocusScopeProps>(
|
|
21
|
-
function FocusScope(
|
|
22
|
-
|
|
25
|
+
function FocusScope(
|
|
26
|
+
{ __scopeFocusScope, ...props }: ScopedProps<FocusScopeProps>,
|
|
27
|
+
forwardedRef
|
|
28
|
+
) {
|
|
29
|
+
// Check for controller context and merge props
|
|
30
|
+
const context = useFocusScopeControllerContext('FocusScope', __scopeFocusScope, {
|
|
31
|
+
warn: false,
|
|
32
|
+
fallback: {},
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const mergedProps: FocusScopeProps = {
|
|
36
|
+
...props,
|
|
37
|
+
enabled: context.enabled ?? props.enabled,
|
|
38
|
+
loop: context.loop ?? props.loop,
|
|
39
|
+
trapped: context.trapped ?? props.trapped,
|
|
40
|
+
onMountAutoFocus: context.onMountAutoFocus ?? props.onMountAutoFocus,
|
|
41
|
+
onUnmountAutoFocus: context.onUnmountAutoFocus ?? props.onUnmountAutoFocus,
|
|
42
|
+
forceUnmount: context.forceUnmount ?? props.forceUnmount,
|
|
43
|
+
focusOnIdle: context.focusOnIdle ?? props.focusOnIdle,
|
|
44
|
+
}
|
|
23
45
|
|
|
24
|
-
|
|
25
|
-
|
|
46
|
+
const childProps = useFocusScope(mergedProps, forwardedRef)
|
|
47
|
+
|
|
48
|
+
if (typeof mergedProps.children === 'function') {
|
|
49
|
+
return <>{mergedProps.children(childProps)}</>
|
|
26
50
|
}
|
|
27
51
|
|
|
28
|
-
return React.cloneElement(
|
|
52
|
+
return React.cloneElement(
|
|
53
|
+
React.Children.only(mergedProps.children) as any,
|
|
54
|
+
childProps
|
|
55
|
+
)
|
|
29
56
|
}
|
|
30
57
|
)
|
|
31
58
|
|
|
@@ -44,6 +71,7 @@ export function useFocusScope(
|
|
|
44
71
|
onMountAutoFocus: onMountAutoFocusProp,
|
|
45
72
|
onUnmountAutoFocus: onUnmountAutoFocusProp,
|
|
46
73
|
forceUnmount,
|
|
74
|
+
focusOnIdle = true,
|
|
47
75
|
children,
|
|
48
76
|
...scopeProps
|
|
49
77
|
} = props
|
|
@@ -111,45 +139,62 @@ export function useFocusScope(
|
|
|
111
139
|
}
|
|
112
140
|
}, [trapped, forceUnmount, container, focusScope.paused])
|
|
113
141
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
142
|
+
useAsyncEffect(
|
|
143
|
+
async (signal) => {
|
|
144
|
+
if (!enabled) return
|
|
145
|
+
if (!container) return
|
|
146
|
+
if (forceUnmount) return
|
|
147
|
+
|
|
148
|
+
focusScopesStack.add(focusScope)
|
|
149
|
+
const previouslyFocusedElement = document.activeElement as HTMLElement | null
|
|
150
|
+
const hasFocusedCandidate = container.contains(previouslyFocusedElement)
|
|
151
|
+
|
|
152
|
+
if (!hasFocusedCandidate) {
|
|
153
|
+
const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS)
|
|
154
|
+
container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus)
|
|
155
|
+
container.dispatchEvent(mountEvent)
|
|
156
|
+
if (!mountEvent.defaultPrevented) {
|
|
157
|
+
// wait for idle before focusing to prevent reflows during animations
|
|
158
|
+
if (focusOnIdle) {
|
|
159
|
+
await sleep(typeof focusOnIdle === 'number' ? focusOnIdle : 16, signal)
|
|
160
|
+
await fullyIdle(signal)
|
|
161
|
+
}
|
|
122
162
|
|
|
123
|
-
|
|
124
|
-
const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS)
|
|
125
|
-
container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus)
|
|
126
|
-
container.dispatchEvent(mountEvent)
|
|
127
|
-
if (!mountEvent.defaultPrevented) {
|
|
128
|
-
const candidates = removeLinks(getTabbableCandidates(container))
|
|
163
|
+
const candidates = removeLinks(getTabbableCandidates(container))
|
|
129
164
|
|
|
130
|
-
|
|
165
|
+
focusFirst(candidates, { select: true })
|
|
131
166
|
|
|
132
|
-
|
|
133
|
-
|
|
167
|
+
if (document.activeElement === previouslyFocusedElement) {
|
|
168
|
+
focus(container)
|
|
169
|
+
}
|
|
134
170
|
}
|
|
135
171
|
}
|
|
136
|
-
}
|
|
137
172
|
|
|
138
|
-
|
|
139
|
-
|
|
173
|
+
return () => {
|
|
174
|
+
container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus)
|
|
140
175
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
176
|
+
const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS)
|
|
177
|
+
container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus)
|
|
178
|
+
container.dispatchEvent(unmountEvent)
|
|
179
|
+
if (!unmountEvent.defaultPrevented) {
|
|
180
|
+
focus(previouslyFocusedElement ?? document.body, { select: true })
|
|
181
|
+
}
|
|
182
|
+
// we need to remove the listener after we `dispatchEvent`
|
|
183
|
+
container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus)
|
|
149
184
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
185
|
+
focusScopesStack.remove(focusScope)
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
[
|
|
189
|
+
enabled,
|
|
190
|
+
container,
|
|
191
|
+
forceUnmount,
|
|
192
|
+
onMountAutoFocus,
|
|
193
|
+
onUnmountAutoFocus,
|
|
194
|
+
focusScope,
|
|
195
|
+
focusOnIdle,
|
|
196
|
+
]
|
|
197
|
+
)
|
|
153
198
|
|
|
154
199
|
// Takes care of looping focus (when tabbing whilst at the edges)
|
|
155
200
|
const handleKeyDown = React.useCallback(
|
|
@@ -275,6 +320,7 @@ function isSelectableInput(
|
|
|
275
320
|
}
|
|
276
321
|
|
|
277
322
|
function focus(element?: FocusableTarget | null, { select = false } = {}) {
|
|
323
|
+
console.trace('focus', element)
|
|
278
324
|
// only focus if that element is focusable
|
|
279
325
|
if (element?.focus) {
|
|
280
326
|
const previouslyFocusedElement = document.activeElement
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createContextScope } from '@tamagui/create-context'
|
|
2
|
+
import { useEvent } from '@tamagui/use-event'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import type { FocusScopeProps } from './types'
|
|
5
|
+
import type { ScopedProps } from './types'
|
|
6
|
+
|
|
7
|
+
const FOCUS_SCOPE_CONTROLLER_NAME = 'FocusScopeController'
|
|
8
|
+
|
|
9
|
+
const [createFocusScopeControllerContext, createFocusScopeControllerScope] =
|
|
10
|
+
createContextScope(FOCUS_SCOPE_CONTROLLER_NAME)
|
|
11
|
+
|
|
12
|
+
type FocusScopeControllerContextValue = Omit<FocusScopeProps, 'children'>
|
|
13
|
+
|
|
14
|
+
const [FocusScopeControllerProvider, useFocusScopeControllerContext] =
|
|
15
|
+
createFocusScopeControllerContext<FocusScopeControllerContextValue>(
|
|
16
|
+
FOCUS_SCOPE_CONTROLLER_NAME
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
/* -------------------------------------------------------------------------------------------------
|
|
20
|
+
* FocusScopeController
|
|
21
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
22
|
+
|
|
23
|
+
export interface FocusScopeControllerProps extends FocusScopeControllerContextValue {
|
|
24
|
+
children?: React.ReactNode
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function FocusScopeController(props: ScopedProps<FocusScopeControllerProps>) {
|
|
28
|
+
const {
|
|
29
|
+
__scopeFocusScope,
|
|
30
|
+
children,
|
|
31
|
+
enabled,
|
|
32
|
+
loop,
|
|
33
|
+
trapped,
|
|
34
|
+
onMountAutoFocus,
|
|
35
|
+
onUnmountAutoFocus,
|
|
36
|
+
forceUnmount,
|
|
37
|
+
focusOnIdle,
|
|
38
|
+
} = props
|
|
39
|
+
|
|
40
|
+
const stableOnMountAutoFocus = useEvent(onMountAutoFocus)
|
|
41
|
+
const stableOnUnmountAutoFocus = useEvent(onUnmountAutoFocus)
|
|
42
|
+
|
|
43
|
+
const contextValue = React.useMemo(
|
|
44
|
+
() => ({
|
|
45
|
+
enabled,
|
|
46
|
+
loop,
|
|
47
|
+
trapped,
|
|
48
|
+
onMountAutoFocus: stableOnMountAutoFocus,
|
|
49
|
+
onUnmountAutoFocus: stableOnUnmountAutoFocus,
|
|
50
|
+
forceUnmount,
|
|
51
|
+
focusOnIdle,
|
|
52
|
+
}),
|
|
53
|
+
[
|
|
54
|
+
enabled,
|
|
55
|
+
loop,
|
|
56
|
+
trapped,
|
|
57
|
+
stableOnMountAutoFocus,
|
|
58
|
+
stableOnUnmountAutoFocus,
|
|
59
|
+
forceUnmount,
|
|
60
|
+
focusOnIdle,
|
|
61
|
+
]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<FocusScopeControllerProvider scope={__scopeFocusScope} {...contextValue}>
|
|
66
|
+
{children}
|
|
67
|
+
</FocusScopeControllerProvider>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const FocusScopeControllerComponent = FocusScopeController
|
|
72
|
+
|
|
73
|
+
export {
|
|
74
|
+
createFocusScopeControllerScope,
|
|
75
|
+
FocusScopeControllerComponent as FocusScopeController,
|
|
76
|
+
FocusScopeControllerProvider,
|
|
77
|
+
useFocusScopeControllerContext,
|
|
78
|
+
}
|
package/src/index.ts
CHANGED