@tamagui/native 2.0.0-rc.9 → 2.1.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/.turbo/turbo-build.log +2 -0
- package/dist/cjs/PressBoundary.cjs +92 -0
- package/dist/cjs/PressBoundary.native.js +105 -0
- package/dist/cjs/PressBoundary.native.js.map +1 -0
- package/dist/cjs/burntState.cjs +14 -12
- package/dist/cjs/burntState.native.js +18 -16
- package/dist/cjs/burntState.native.js.map +1 -1
- package/dist/cjs/components.cjs +20 -15
- package/dist/cjs/components.native.js +24 -22
- package/dist/cjs/components.native.js.map +1 -1
- package/dist/cjs/gesture-handler.cjs +36 -0
- package/dist/cjs/gesture-handler.native.js +39 -0
- package/dist/cjs/gesture-handler.native.js.map +1 -0
- package/dist/cjs/gestureState.cjs +201 -23
- package/dist/cjs/gestureState.native.js +217 -39
- package/dist/cjs/gestureState.native.js.map +1 -1
- package/dist/cjs/globalState.cjs +17 -11
- package/dist/cjs/globalState.native.js +17 -11
- package/dist/cjs/globalState.native.js.map +1 -1
- package/dist/cjs/index.cjs +27 -20
- package/dist/cjs/index.native.js +27 -20
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keyboardControllerState.cjs +14 -12
- package/dist/cjs/keyboardControllerState.native.js +23 -21
- package/dist/cjs/keyboardControllerState.native.js.map +1 -1
- package/dist/cjs/linearGradientState.cjs +14 -12
- package/dist/cjs/linearGradientState.native.js +17 -15
- package/dist/cjs/linearGradientState.native.js.map +1 -1
- package/dist/cjs/nativeMenuContext.cjs +29 -0
- package/dist/cjs/nativeMenuContext.native.js +32 -0
- package/dist/cjs/nativeMenuContext.native.js.map +1 -0
- package/dist/cjs/portalState.cjs +14 -12
- package/dist/cjs/portalState.native.js +17 -15
- package/dist/cjs/portalState.native.js.map +1 -1
- package/dist/cjs/safeAreaState.cjs +38 -30
- package/dist/cjs/safeAreaState.native.js +39 -31
- package/dist/cjs/safeAreaState.native.js.map +1 -1
- package/dist/cjs/setup-burnt.cjs +9 -8
- package/dist/cjs/setup-burnt.native.js +9 -8
- package/dist/cjs/setup-burnt.native.js.map +1 -1
- package/dist/cjs/setup-expo-linear-gradient.cjs +9 -8
- package/dist/cjs/setup-expo-linear-gradient.native.js +9 -8
- package/dist/cjs/setup-expo-linear-gradient.native.js.map +1 -1
- package/dist/cjs/setup-gesture-handler.cjs +69 -20
- package/dist/cjs/setup-gesture-handler.native.js +69 -20
- package/dist/cjs/setup-gesture-handler.native.js.map +1 -1
- package/dist/cjs/setup-keyboard-controller.native.js +20 -17
- package/dist/cjs/setup-safe-area.cjs +3 -1
- package/dist/cjs/setup-safe-area.native.js +15 -17
- package/dist/cjs/setup-safe-area.native.js.map +1 -1
- package/dist/cjs/setup-teleport.cjs +13 -13
- package/dist/cjs/setup-teleport.native.js +13 -13
- package/dist/cjs/setup-teleport.native.js.map +1 -1
- package/dist/cjs/setup-worklets.cjs +11 -8
- package/dist/cjs/setup-worklets.native.js +11 -8
- package/dist/cjs/setup-worklets.native.js.map +1 -1
- package/dist/cjs/setup-zeego.cjs +12 -9
- package/dist/cjs/setup-zeego.native.js +12 -9
- package/dist/cjs/setup-zeego.native.js.map +1 -1
- package/dist/cjs/types.cjs +7 -5
- package/dist/cjs/types.native.js +7 -5
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/workletsState.cjs +14 -12
- package/dist/cjs/workletsState.native.js +20 -18
- package/dist/cjs/workletsState.native.js.map +1 -1
- package/dist/cjs/zeegoState.cjs +14 -12
- package/dist/cjs/zeegoState.native.js +18 -16
- package/dist/cjs/zeegoState.native.js.map +1 -1
- package/dist/esm/PressBoundary.mjs +56 -0
- package/dist/esm/PressBoundary.mjs.map +1 -0
- package/dist/esm/PressBoundary.native.js +66 -0
- package/dist/esm/PressBoundary.native.js.map +1 -0
- package/dist/esm/burntState.mjs +2 -2
- package/dist/esm/burntState.native.js +2 -2
- package/dist/esm/components.mjs +6 -3
- package/dist/esm/components.mjs.map +1 -1
- package/dist/esm/components.native.js +10 -10
- package/dist/esm/components.native.js.map +1 -1
- package/dist/esm/gesture-handler.mjs +6 -0
- package/dist/esm/gesture-handler.mjs.map +1 -0
- package/dist/esm/gesture-handler.native.js +6 -0
- package/dist/esm/gesture-handler.native.js.map +1 -0
- package/dist/esm/gestureState.mjs +186 -13
- package/dist/esm/gestureState.mjs.map +1 -1
- package/dist/esm/gestureState.native.js +198 -25
- package/dist/esm/gestureState.native.js.map +1 -1
- package/dist/esm/globalState.mjs +5 -1
- package/dist/esm/globalState.mjs.map +1 -1
- package/dist/esm/globalState.native.js +5 -1
- package/dist/esm/globalState.native.js.map +1 -1
- package/dist/esm/index.js +12 -28
- package/dist/esm/index.js.map +1 -6
- package/dist/esm/index.mjs +3 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +3 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/keyboardControllerState.mjs +2 -2
- package/dist/esm/keyboardControllerState.native.js +2 -2
- package/dist/esm/linearGradientState.mjs +2 -2
- package/dist/esm/linearGradientState.native.js +2 -2
- package/dist/esm/nativeMenuContext.mjs +4 -0
- package/dist/esm/nativeMenuContext.mjs.map +1 -0
- package/dist/esm/nativeMenuContext.native.js +4 -0
- package/dist/esm/nativeMenuContext.native.js.map +1 -0
- package/dist/esm/portalState.mjs +2 -2
- package/dist/esm/portalState.native.js +2 -2
- package/dist/esm/safeAreaState.mjs +26 -20
- package/dist/esm/safeAreaState.mjs.map +1 -1
- package/dist/esm/safeAreaState.native.js +26 -20
- package/dist/esm/safeAreaState.native.js.map +1 -1
- package/dist/esm/setup-burnt.mjs +9 -8
- package/dist/esm/setup-burnt.mjs.map +1 -1
- package/dist/esm/setup-burnt.native.js +9 -8
- package/dist/esm/setup-burnt.native.js.map +1 -1
- package/dist/esm/setup-expo-linear-gradient.mjs +9 -8
- package/dist/esm/setup-expo-linear-gradient.mjs.map +1 -1
- package/dist/esm/setup-expo-linear-gradient.native.js +9 -8
- package/dist/esm/setup-expo-linear-gradient.native.js.map +1 -1
- package/dist/esm/setup-gesture-handler.mjs +43 -21
- package/dist/esm/setup-gesture-handler.mjs.map +1 -1
- package/dist/esm/setup-gesture-handler.native.js +43 -21
- package/dist/esm/setup-gesture-handler.native.js.map +1 -1
- package/dist/esm/setup-keyboard-controller.native.js +20 -17
- package/dist/esm/setup-safe-area.mjs +2 -0
- package/dist/esm/setup-safe-area.mjs.map +1 -1
- package/dist/esm/setup-safe-area.native.js +15 -17
- package/dist/esm/setup-safe-area.native.js.map +1 -1
- package/dist/esm/setup-teleport.mjs +13 -13
- package/dist/esm/setup-teleport.mjs.map +1 -1
- package/dist/esm/setup-teleport.native.js +13 -13
- package/dist/esm/setup-teleport.native.js.map +1 -1
- package/dist/esm/setup-worklets.mjs +11 -8
- package/dist/esm/setup-worklets.mjs.map +1 -1
- package/dist/esm/setup-worklets.native.js +11 -8
- package/dist/esm/setup-worklets.native.js.map +1 -1
- package/dist/esm/setup-zeego.mjs +12 -9
- package/dist/esm/setup-zeego.mjs.map +1 -1
- package/dist/esm/setup-zeego.native.js +12 -9
- package/dist/esm/setup-zeego.native.js.map +1 -1
- package/dist/esm/workletsState.mjs +2 -2
- package/dist/esm/workletsState.native.js +2 -2
- package/dist/esm/zeegoState.mjs +2 -2
- package/dist/esm/zeegoState.native.js +2 -2
- package/gesture-handler/index.cjs +1 -0
- package/gesture-handler/index.js +1 -0
- package/gesture-handler/index.native.cjs +1 -0
- package/gesture-handler/index.native.js +1 -0
- package/gesture-handler.cjs +1 -0
- package/package.json +48 -77
- package/setup-burnt/index.cjs +2 -0
- package/setup-burnt/index.js +2 -0
- package/setup-burnt/index.native.cjs +2 -0
- package/setup-burnt/index.native.js +2 -0
- package/setup-expo-linear-gradient/index.cjs +2 -0
- package/setup-expo-linear-gradient/index.js +2 -0
- package/setup-expo-linear-gradient/index.native.cjs +2 -0
- package/setup-expo-linear-gradient/index.native.js +2 -0
- package/setup-gesture-handler/index.cjs +2 -0
- package/setup-gesture-handler/index.js +2 -0
- package/setup-gesture-handler/index.native.cjs +2 -0
- package/setup-gesture-handler/index.native.js +2 -0
- package/setup-keyboard-controller/index.cjs +2 -0
- package/setup-keyboard-controller/index.js +2 -0
- package/setup-keyboard-controller/index.native.cjs +2 -0
- package/setup-keyboard-controller/index.native.js +2 -0
- package/setup-safe-area/index.cjs +2 -0
- package/setup-safe-area/index.js +2 -0
- package/setup-safe-area/index.native.cjs +2 -0
- package/setup-safe-area/index.native.js +2 -0
- package/setup-teleport/index.cjs +2 -0
- package/setup-teleport/index.js +2 -0
- package/setup-teleport/index.native.cjs +2 -0
- package/setup-teleport/index.native.js +2 -0
- package/setup-worklets/index.cjs +2 -0
- package/setup-worklets/index.js +2 -0
- package/setup-worklets/index.native.cjs +2 -0
- package/setup-worklets/index.native.js +2 -0
- package/setup-zeego/index.cjs +2 -0
- package/setup-zeego/index.js +2 -0
- package/setup-zeego/index.native.cjs +2 -0
- package/setup-zeego/index.native.js +2 -0
- package/src/PressBoundary.tsx +81 -0
- package/src/gesture-handler.ts +17 -0
- package/src/gestureState.ts +319 -11
- package/src/index.ts +13 -1
- package/src/nativeMenuContext.ts +4 -0
- package/src/setup-gesture-handler.ts +52 -10
- package/src/types.ts +4 -0
- package/tsconfig.json +12 -0
- package/types/PressBoundary.d.ts +14 -0
- package/types/PressBoundary.d.ts.map +11 -0
- package/types/burntState.d.ts.map +2 -2
- package/types/components.d.ts.map +2 -2
- package/types/gesture-handler.d.ts +8 -0
- package/types/gesture-handler.d.ts.map +11 -0
- package/types/gestureState.d.ts +5 -0
- package/types/gestureState.d.ts.map +4 -4
- package/types/globalState.d.ts.map +2 -2
- package/types/index.d.ts +4 -1
- package/types/index.d.ts.map +4 -4
- package/types/keyboardControllerState.d.ts.map +2 -2
- package/types/linearGradientState.d.ts.map +2 -2
- package/types/nativeMenuContext.d.ts +4 -0
- package/types/nativeMenuContext.d.ts.map +11 -0
- package/types/portalState.d.ts.map +2 -2
- package/types/safeAreaState.d.ts.map +2 -2
- package/types/setup-burnt.d.ts.map +2 -2
- package/types/setup-expo-linear-gradient.d.ts.map +2 -2
- package/types/setup-gesture-handler.d.ts +8 -1
- package/types/setup-gesture-handler.d.ts.map +4 -4
- package/types/setup-keyboard-controller.d.ts.map +2 -2
- package/types/setup-keyboard-controller.web.d.ts.map +2 -2
- package/types/setup-safe-area.d.ts.map +2 -2
- package/types/setup-teleport.d.ts.map +2 -2
- package/types/setup-worklets.d.ts.map +2 -2
- package/types/setup-zeego.d.ts.map +2 -2
- package/types/types.d.ts +1 -0
- package/types/types.d.ts.map +4 -4
- package/types/workletsState.d.ts.map +2 -2
- package/types/zeegoState.d.ts.map +2 -2
- package/dist/cjs/burntState.js +0 -39
- package/dist/cjs/burntState.js.map +0 -6
- package/dist/cjs/components.js +0 -41
- package/dist/cjs/components.js.map +0 -6
- package/dist/cjs/gestureState.js +0 -57
- package/dist/cjs/gestureState.js.map +0 -6
- package/dist/cjs/globalState.js +0 -34
- package/dist/cjs/globalState.js.map +0 -6
- package/dist/cjs/index.js +0 -33
- package/dist/cjs/index.js.map +0 -6
- package/dist/cjs/keyboardControllerState.js +0 -42
- package/dist/cjs/keyboardControllerState.js.map +0 -6
- package/dist/cjs/linearGradientState.js +0 -38
- package/dist/cjs/linearGradientState.js.map +0 -6
- package/dist/cjs/portalState.js +0 -38
- package/dist/cjs/portalState.js.map +0 -6
- package/dist/cjs/safeAreaState.js +0 -48
- package/dist/cjs/safeAreaState.js.map +0 -6
- package/dist/cjs/setup-burnt.js +0 -18
- package/dist/cjs/setup-burnt.js.map +0 -6
- package/dist/cjs/setup-expo-linear-gradient.js +0 -17
- package/dist/cjs/setup-expo-linear-gradient.js.map +0 -6
- package/dist/cjs/setup-gesture-handler.js +0 -24
- package/dist/cjs/setup-gesture-handler.js.map +0 -6
- package/dist/cjs/setup-keyboard-controller.js +0 -1
- package/dist/cjs/setup-keyboard-controller.js.map +0 -6
- package/dist/cjs/setup-safe-area.js +0 -2
- package/dist/cjs/setup-safe-area.js.map +0 -6
- package/dist/cjs/setup-teleport.js +0 -17
- package/dist/cjs/setup-teleport.js.map +0 -6
- package/dist/cjs/setup-worklets.js +0 -20
- package/dist/cjs/setup-worklets.js.map +0 -6
- package/dist/cjs/setup-zeego.js +0 -19
- package/dist/cjs/setup-zeego.js.map +0 -6
- package/dist/cjs/types.js +0 -14
- package/dist/cjs/types.js.map +0 -6
- package/dist/cjs/workletsState.js +0 -41
- package/dist/cjs/workletsState.js.map +0 -6
- package/dist/cjs/zeegoState.js +0 -39
- package/dist/cjs/zeegoState.js.map +0 -6
- package/dist/esm/burntState.js +0 -23
- package/dist/esm/burntState.js.map +0 -6
- package/dist/esm/components.js +0 -26
- package/dist/esm/components.js.map +0 -6
- package/dist/esm/gestureState.js +0 -41
- package/dist/esm/gestureState.js.map +0 -6
- package/dist/esm/globalState.js +0 -18
- package/dist/esm/globalState.js.map +0 -6
- package/dist/esm/keyboardControllerState.js +0 -26
- package/dist/esm/keyboardControllerState.js.map +0 -6
- package/dist/esm/linearGradientState.js +0 -22
- package/dist/esm/linearGradientState.js.map +0 -6
- package/dist/esm/portalState.js +0 -22
- package/dist/esm/portalState.js.map +0 -6
- package/dist/esm/safeAreaState.js +0 -32
- package/dist/esm/safeAreaState.js.map +0 -6
- package/dist/esm/setup-burnt.js +0 -18
- package/dist/esm/setup-burnt.js.map +0 -6
- package/dist/esm/setup-expo-linear-gradient.js +0 -17
- package/dist/esm/setup-expo-linear-gradient.js.map +0 -6
- package/dist/esm/setup-gesture-handler.js +0 -24
- package/dist/esm/setup-gesture-handler.js.map +0 -6
- package/dist/esm/setup-keyboard-controller.js +0 -1
- package/dist/esm/setup-keyboard-controller.js.map +0 -6
- package/dist/esm/setup-safe-area.js +0 -2
- package/dist/esm/setup-safe-area.js.map +0 -6
- package/dist/esm/setup-teleport.js +0 -17
- package/dist/esm/setup-teleport.js.map +0 -6
- package/dist/esm/setup-worklets.js +0 -20
- package/dist/esm/setup-worklets.js.map +0 -6
- package/dist/esm/setup-zeego.js +0 -19
- package/dist/esm/setup-zeego.js.map +0 -6
- package/dist/esm/types.js +0 -1
- package/dist/esm/types.js.map +0 -6
- package/dist/esm/workletsState.js +0 -25
- package/dist/esm/workletsState.js.map +0 -6
- package/dist/esm/zeegoState.js +0 -23
- package/dist/esm/zeegoState.js.map +0 -6
package/src/gestureState.ts
CHANGED
|
@@ -6,8 +6,123 @@ const state = createGlobalState<GestureState>(`gesture`, {
|
|
|
6
6
|
Gesture: null,
|
|
7
7
|
GestureDetector: null,
|
|
8
8
|
ScrollView: null,
|
|
9
|
+
RootView: null,
|
|
9
10
|
})
|
|
10
11
|
|
|
12
|
+
type GestureEnabledFreezeState = {
|
|
13
|
+
frozen: boolean
|
|
14
|
+
enabled: boolean
|
|
15
|
+
warned: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const GESTURE_ENABLED_FREEZE_KEY = '__tamagui_gesture_enabled_freeze__'
|
|
19
|
+
|
|
20
|
+
function getGestureEnabledFreezeState(): GestureEnabledFreezeState {
|
|
21
|
+
const g = globalThis as typeof globalThis & {
|
|
22
|
+
[GESTURE_ENABLED_FREEZE_KEY]?: GestureEnabledFreezeState
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!g[GESTURE_ENABLED_FREEZE_KEY]) {
|
|
26
|
+
g[GESTURE_ENABLED_FREEZE_KEY] = {
|
|
27
|
+
frozen: false,
|
|
28
|
+
enabled: false,
|
|
29
|
+
warned: false,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return g[GESTURE_ENABLED_FREEZE_KEY]!
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function warnGestureEnabledMutationIgnored(source: string) {
|
|
37
|
+
const freezeState = getGestureEnabledFreezeState()
|
|
38
|
+
|
|
39
|
+
if (freezeState.warned || process.env.NODE_ENV === 'production') {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
freezeState.warned = true
|
|
44
|
+
|
|
45
|
+
console.warn(
|
|
46
|
+
`[Tamagui] Ignored ${source} because gesture handler press events were already ` +
|
|
47
|
+
`${freezeState.enabled ? 'enabled' : 'disabled'} when TamaguiProvider mounted. ` +
|
|
48
|
+
`Configure gesture handler mode before the first render.`
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function canChangeGestureHandlerEnabled(
|
|
53
|
+
nextEnabled: boolean,
|
|
54
|
+
source: string
|
|
55
|
+
): boolean {
|
|
56
|
+
const freezeState = getGestureEnabledFreezeState()
|
|
57
|
+
|
|
58
|
+
if (!freezeState.frozen || freezeState.enabled === nextEnabled) {
|
|
59
|
+
return true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
warnGestureEnabledMutationIgnored(source)
|
|
63
|
+
return false
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let pressGestureDebugId = 0
|
|
67
|
+
let externalPressDebugId = 0
|
|
68
|
+
|
|
69
|
+
// distance in dp the finger may travel before a press is treated as a
|
|
70
|
+
// scroll/drag and cancelled. tracked in absolute (screen) coordinates by the
|
|
71
|
+
// Tap's onTouchesMove (see createPressGesture) so a view translating under a
|
|
72
|
+
// stationary finger - a sheet sliding on keyboard open/close, a sheet open
|
|
73
|
+
// animation - does not cancel the press; only genuine finger travel does.
|
|
74
|
+
// this also makes scroll-cancels-press work for any scroll container (a plain
|
|
75
|
+
// RN ScrollView/FlatList or an RNGH one), since the press cancels itself
|
|
76
|
+
// rather than relying on a parent RNGH gesture to steal it.
|
|
77
|
+
const PRESS_MOVE_CANCEL_DISTANCE = 12
|
|
78
|
+
const PRESS_MOVE_CANCEL_DISTANCE_SQ =
|
|
79
|
+
PRESS_MOVE_CANCEL_DISTANCE * PRESS_MOVE_CANCEL_DISTANCE
|
|
80
|
+
|
|
81
|
+
// minimal shapes of the RNGH gesture events createPressGesture reads. RNGH is
|
|
82
|
+
// injected at runtime (GestureState.Gesture is untyped), so this module keeps
|
|
83
|
+
// no type dependency on react-native-gesture-handler - these name just the
|
|
84
|
+
// fields the press gesture touches.
|
|
85
|
+
type GesturePoint = {
|
|
86
|
+
absoluteX: number
|
|
87
|
+
absoluteY: number
|
|
88
|
+
}
|
|
89
|
+
type GestureBeginEvent = Partial<GesturePoint>
|
|
90
|
+
type GestureTouchEvent = {
|
|
91
|
+
changedTouches?: GesturePoint[]
|
|
92
|
+
allTouches?: GesturePoint[]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
type PressOwnerSource = 'internal' | 'external' | null
|
|
96
|
+
|
|
97
|
+
function getEventPointerId(e: any): number | null {
|
|
98
|
+
const pointerId =
|
|
99
|
+
e?.pointerId ??
|
|
100
|
+
e?.pointer?.id ??
|
|
101
|
+
e?.event?.pointerId ??
|
|
102
|
+
e?.event?.pointer?.id ??
|
|
103
|
+
e?.nativeEvent?.pointerId ??
|
|
104
|
+
e?.nativeEvent?.id ??
|
|
105
|
+
e?.event?.nativeEvent?.pointerId ??
|
|
106
|
+
e?.event?.nativeEvent?.id ??
|
|
107
|
+
null
|
|
108
|
+
|
|
109
|
+
return pointerId == null || Number.isNaN(pointerId) ? null : Number(pointerId)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Global press coordination - ensures only innermost pressable fires press events,
|
|
114
|
+
* matching RN Pressable/responder system semantics where deepest component wins.
|
|
115
|
+
* Uses a grace period to allow child gestures to steal ownership from parent,
|
|
116
|
+
* since RNGH fires parent gestures before child gestures.
|
|
117
|
+
*/
|
|
118
|
+
const pressState = {
|
|
119
|
+
owner: null as object | null,
|
|
120
|
+
ownerId: null as number | null,
|
|
121
|
+
ownerSource: null as PressOwnerSource,
|
|
122
|
+
ownerPointerId: null as number | null,
|
|
123
|
+
timestamp: 0,
|
|
124
|
+
}
|
|
125
|
+
|
|
11
126
|
export interface Insets {
|
|
12
127
|
top?: number
|
|
13
128
|
left?: number
|
|
@@ -16,6 +131,7 @@ export interface Insets {
|
|
|
16
131
|
}
|
|
17
132
|
|
|
18
133
|
export type PressGestureConfig = {
|
|
134
|
+
debugName?: string | null
|
|
19
135
|
onPressIn?: (e: any) => void
|
|
20
136
|
onPressOut?: (e: any) => void
|
|
21
137
|
onPress?: (e: any) => void
|
|
@@ -32,6 +148,49 @@ export interface GestureHandlerAccessor {
|
|
|
32
148
|
createPressGesture(config: PressGestureConfig): any
|
|
33
149
|
}
|
|
34
150
|
|
|
151
|
+
export type ExternalPressOwnershipToken = object
|
|
152
|
+
|
|
153
|
+
function resetPressOwner() {
|
|
154
|
+
pressState.owner = null
|
|
155
|
+
pressState.ownerId = null
|
|
156
|
+
pressState.ownerSource = null
|
|
157
|
+
pressState.ownerPointerId = null
|
|
158
|
+
pressState.timestamp = 0
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function resetStaleOwner(now: number, debugName?: string | null) {
|
|
162
|
+
if (now - pressState.timestamp > 2000) {
|
|
163
|
+
resetPressOwner()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function claimExternalPressOwnership(
|
|
168
|
+
debugName?: string | null
|
|
169
|
+
): ExternalPressOwnershipToken {
|
|
170
|
+
const now = Date.now()
|
|
171
|
+
resetStaleOwner(now, debugName)
|
|
172
|
+
|
|
173
|
+
const token = {}
|
|
174
|
+
const ownerId = ++externalPressDebugId
|
|
175
|
+
|
|
176
|
+
pressState.owner = token
|
|
177
|
+
pressState.ownerId = ownerId
|
|
178
|
+
pressState.ownerSource = 'external'
|
|
179
|
+
pressState.timestamp = now
|
|
180
|
+
|
|
181
|
+
return token
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function releaseExternalPressOwnership(
|
|
185
|
+
token: ExternalPressOwnershipToken | null | undefined,
|
|
186
|
+
debugName?: string | null
|
|
187
|
+
): void {
|
|
188
|
+
if (!token || pressState.owner !== token) {
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
resetPressOwner()
|
|
192
|
+
}
|
|
193
|
+
|
|
35
194
|
export function getGestureHandler(): GestureHandlerAccessor {
|
|
36
195
|
return {
|
|
37
196
|
get isEnabled(): boolean {
|
|
@@ -41,10 +200,21 @@ export function getGestureHandler(): GestureHandlerAccessor {
|
|
|
41
200
|
return state.get()
|
|
42
201
|
},
|
|
43
202
|
set(updates: Partial<GestureState>): void {
|
|
203
|
+
if (
|
|
204
|
+
updates.enabled !== undefined &&
|
|
205
|
+
!canChangeGestureHandlerEnabled(updates.enabled, 'getGestureHandler().set()')
|
|
206
|
+
) {
|
|
207
|
+
return
|
|
208
|
+
}
|
|
209
|
+
|
|
44
210
|
Object.assign(state.get(), updates)
|
|
45
211
|
},
|
|
46
212
|
|
|
47
213
|
disable(): void {
|
|
214
|
+
if (!canChangeGestureHandlerEnabled(false, 'getGestureHandler().disable()')) {
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
|
|
48
218
|
state.get().enabled = false
|
|
49
219
|
},
|
|
50
220
|
|
|
@@ -54,19 +224,153 @@ export function getGestureHandler(): GestureHandlerAccessor {
|
|
|
54
224
|
|
|
55
225
|
const longPressDuration = config.delayLongPress ?? 500
|
|
56
226
|
|
|
57
|
-
//
|
|
58
|
-
|
|
227
|
+
// unique token for this gesture instance - used to track ownership
|
|
228
|
+
const myToken = {}
|
|
229
|
+
const myDebugId = ++pressGestureDebugId
|
|
230
|
+
// mutable gesture state kept on an object so handler bodies that get
|
|
231
|
+
// workletized by react-native-worklets (>=0.7.4) see live values.
|
|
232
|
+
// primitive `let`s get frozen into the worklet's serialized __closure
|
|
233
|
+
// at factory time, so reassignments from workletized handlers never
|
|
234
|
+
// propagate out. object property mutation goes through the captured
|
|
235
|
+
// reference and is always observed.
|
|
236
|
+
const flags = {
|
|
237
|
+
didLongPress: false,
|
|
238
|
+
didPressIn: false,
|
|
239
|
+
pressInTimer: null as ReturnType<typeof setTimeout> | null,
|
|
240
|
+
// absolute (screen) coords of the press start, and whether the finger
|
|
241
|
+
// has since travelled far enough to be treated as a scroll/drag.
|
|
242
|
+
moveStartX: null as number | null,
|
|
243
|
+
moveStartY: 0,
|
|
244
|
+
cancelledByMove: false,
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Grace period for child gestures to steal ownership from parent.
|
|
248
|
+
// RNGH fires parent before child, but we want innermost to win.
|
|
249
|
+
// Claims typically span a few ms, 24ms gives enough room to observe
|
|
250
|
+
// ordering while debugging slower frames.
|
|
251
|
+
const GRACE_PERIOD_MS = process.env.TAMAGUI_RNGH_PRESS_DELAY
|
|
252
|
+
? +process.env.TAMAGUI_RNGH_PRESS_DELAY
|
|
253
|
+
: 24
|
|
254
|
+
|
|
255
|
+
const tryClaimOwnership = (e: any) => {
|
|
256
|
+
const now = Date.now()
|
|
257
|
+
resetStaleOwner(now, config.debugName)
|
|
258
|
+
|
|
259
|
+
const currentPointerId = getEventPointerId(e)
|
|
260
|
+
const isSameTouchPointer =
|
|
261
|
+
currentPointerId == null ||
|
|
262
|
+
pressState.ownerPointerId == null ||
|
|
263
|
+
pressState.ownerPointerId === currentPointerId
|
|
264
|
+
|
|
265
|
+
if (
|
|
266
|
+
pressState.owner === null ||
|
|
267
|
+
(pressState.ownerSource === 'internal' && isSameTouchPointer)
|
|
268
|
+
) {
|
|
269
|
+
pressState.owner = myToken
|
|
270
|
+
pressState.ownerId = myDebugId
|
|
271
|
+
pressState.ownerSource = 'internal'
|
|
272
|
+
pressState.ownerPointerId = currentPointerId
|
|
273
|
+
pressState.timestamp = now
|
|
274
|
+
}
|
|
275
|
+
return pressState.owner === myToken
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const isOwner = () => pressState.owner === myToken
|
|
279
|
+
|
|
280
|
+
const releaseOwnership = () => {
|
|
281
|
+
if (flags.pressInTimer) {
|
|
282
|
+
clearTimeout(flags.pressInTimer)
|
|
283
|
+
flags.pressInTimer = null
|
|
284
|
+
}
|
|
285
|
+
if (pressState.owner === myToken) {
|
|
286
|
+
resetPressOwner()
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const firePressIn = (e: any) => {
|
|
291
|
+
if (!flags.didPressIn && isOwner()) {
|
|
292
|
+
flags.didPressIn = true
|
|
293
|
+
config.onPressIn?.(e)
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const schedulePressIn = (e: any) => {
|
|
298
|
+
if (flags.pressInTimer) {
|
|
299
|
+
clearTimeout(flags.pressInTimer)
|
|
300
|
+
}
|
|
301
|
+
flags.pressInTimer = setTimeout(() => {
|
|
302
|
+
flags.pressInTimer = null
|
|
303
|
+
if (isOwner()) {
|
|
304
|
+
firePressIn(e)
|
|
305
|
+
}
|
|
306
|
+
}, GRACE_PERIOD_MS + 1)
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Tap gesture for regular presses.
|
|
310
|
+
//
|
|
311
|
+
// maxDuration is long so long-presses aren't cut off. We deliberately do
|
|
312
|
+
// not use RNGH's .maxDistance(): it measures finger travel in the gesture
|
|
313
|
+
// view's own coordinate space, so a view that translates under a
|
|
314
|
+
// stationary finger (a sheet sliding on keyboard open/close, a sheet open
|
|
315
|
+
// animation) reads as finger movement and silently cancels the press -
|
|
316
|
+
// onPress never fires. Instead onTouchesMove tracks the finger in
|
|
317
|
+
// absolute (screen) coordinates and cancels only on genuine finger
|
|
318
|
+
// travel. That also makes scroll-cancels-press work for any scroll
|
|
319
|
+
// container, since the press cancels itself instead of depending on a
|
|
320
|
+
// parent RNGH gesture to steal the touch.
|
|
59
321
|
const tap = Gesture.Tap()
|
|
60
322
|
.runOnJS(true)
|
|
61
323
|
.maxDuration(10000) // allow very long presses
|
|
62
|
-
.onBegin((e:
|
|
63
|
-
|
|
324
|
+
.onBegin((e: GestureBeginEvent) => {
|
|
325
|
+
flags.didLongPress = false
|
|
326
|
+
flags.didPressIn = false
|
|
327
|
+
flags.cancelledByMove = false
|
|
328
|
+
flags.moveStartX = typeof e.absoluteX === 'number' ? e.absoluteX : null
|
|
329
|
+
flags.moveStartY = typeof e.absoluteY === 'number' ? e.absoluteY : 0
|
|
330
|
+
tryClaimOwnership(e)
|
|
331
|
+
// Defer onPressIn until after the grace window so child pressables
|
|
332
|
+
// can steal ownership, but flush it on tap end for very fast taps.
|
|
333
|
+
schedulePressIn(e)
|
|
334
|
+
})
|
|
335
|
+
.onTouchesMove((e: GestureTouchEvent) => {
|
|
336
|
+
if (flags.cancelledByMove || flags.moveStartX === null) return
|
|
337
|
+
const touch = e.changedTouches?.[0] ?? e.allTouches?.[0]
|
|
338
|
+
if (!touch) return
|
|
339
|
+
const dx = touch.absoluteX - flags.moveStartX
|
|
340
|
+
const dy = touch.absoluteY - flags.moveStartY
|
|
341
|
+
if (dx * dx + dy * dy <= PRESS_MOVE_CANCEL_DISTANCE_SQ) return
|
|
342
|
+
// finger has travelled far enough to be a scroll/drag, not a tap.
|
|
343
|
+
// release the pressStyle now (mid-scroll, so it doesn't stay stuck)
|
|
344
|
+
// and make onEnd skip onPress on finger lift.
|
|
345
|
+
flags.cancelledByMove = true
|
|
346
|
+
if (flags.pressInTimer) {
|
|
347
|
+
clearTimeout(flags.pressInTimer)
|
|
348
|
+
flags.pressInTimer = null
|
|
349
|
+
}
|
|
350
|
+
if (flags.didPressIn) {
|
|
351
|
+
flags.didPressIn = false
|
|
352
|
+
config.onPressOut?.(e)
|
|
353
|
+
}
|
|
354
|
+
releaseOwnership()
|
|
64
355
|
})
|
|
65
|
-
.onEnd((e:
|
|
66
|
-
|
|
356
|
+
.onEnd((e: unknown) => {
|
|
357
|
+
if (isOwner() && !flags.didLongPress && !flags.cancelledByMove) {
|
|
358
|
+
firePressIn(e)
|
|
359
|
+
config.onPress?.(e)
|
|
360
|
+
}
|
|
67
361
|
})
|
|
68
|
-
.onFinalize((e:
|
|
69
|
-
|
|
362
|
+
.onFinalize((e: unknown) => {
|
|
363
|
+
if (isOwner()) {
|
|
364
|
+
config.onPressOut?.(e)
|
|
365
|
+
releaseOwnership()
|
|
366
|
+
} else if (flags.didPressIn) {
|
|
367
|
+
// we already fired onPressIn but lost ownership before finalize
|
|
368
|
+
// (e.g. finger dragged onto a sibling pressable and that one
|
|
369
|
+
// claimed ownership). fire onPressOut so callers can clear their
|
|
370
|
+
// press state - otherwise pressStyle stays stuck on this view.
|
|
371
|
+
flags.didPressIn = false
|
|
372
|
+
config.onPressOut?.(e)
|
|
373
|
+
}
|
|
70
374
|
})
|
|
71
375
|
|
|
72
376
|
if (config.hitSlop) tap.hitSlop(config.hitSlop)
|
|
@@ -78,9 +382,13 @@ export function getGestureHandler(): GestureHandlerAccessor {
|
|
|
78
382
|
const longPress = Gesture.LongPress()
|
|
79
383
|
.runOnJS(true)
|
|
80
384
|
.minDuration(longPressDuration)
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
|
|
385
|
+
.onStart((e: any) => {
|
|
386
|
+
flags.didLongPress = true
|
|
387
|
+
if (isOwner()) {
|
|
388
|
+
firePressIn(e)
|
|
389
|
+
config.onLongPress?.(e)
|
|
390
|
+
}
|
|
391
|
+
})
|
|
84
392
|
|
|
85
393
|
if (config.hitSlop) longPress.hitSlop(config.hitSlop)
|
|
86
394
|
|
package/src/index.ts
CHANGED
|
@@ -42,7 +42,18 @@ export type { PortalAccessor } from './portalState'
|
|
|
42
42
|
|
|
43
43
|
// gesture handler
|
|
44
44
|
export { getGestureHandler } from './gestureState'
|
|
45
|
-
export
|
|
45
|
+
export {
|
|
46
|
+
claimExternalPressOwnership as unstable_claimExternalPressOwnership,
|
|
47
|
+
releaseExternalPressOwnership as unstable_releaseExternalPressOwnership,
|
|
48
|
+
} from './gestureState'
|
|
49
|
+
export type {
|
|
50
|
+
ExternalPressOwnershipToken,
|
|
51
|
+
GestureHandlerAccessor,
|
|
52
|
+
PressGestureConfig,
|
|
53
|
+
} from './gestureState'
|
|
54
|
+
// NOTE: setupGestureHandler is exported from setup-gesture-handler.ts entry point,
|
|
55
|
+
// not here, to avoid bundler pulling in RNGH require during tree-shaking
|
|
56
|
+
export type { GestureHandlerConfig } from './setup-gesture-handler'
|
|
46
57
|
|
|
47
58
|
// worklets
|
|
48
59
|
export { getWorklets } from './workletsState'
|
|
@@ -67,6 +78,7 @@ export type { KeyboardControllerState } from './keyboardControllerState'
|
|
|
67
78
|
// zeego (native menus)
|
|
68
79
|
export { getZeego } from './zeegoState'
|
|
69
80
|
export type { ZeegoAccessor } from './zeegoState'
|
|
81
|
+
export { NativeMenuContext } from './nativeMenuContext'
|
|
70
82
|
|
|
71
83
|
// burnt (native toasts)
|
|
72
84
|
export { getBurnt } from './burntState'
|
|
@@ -5,41 +5,83 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```tsx
|
|
8
|
+
* // auto-setup with all features enabled
|
|
8
9
|
* import '@tamagui/native/setup-gesture-handler'
|
|
10
|
+
*
|
|
11
|
+
* // or configure selectively
|
|
12
|
+
* import { setupGestureHandler } from '@tamagui/native/setup-gesture-handler'
|
|
13
|
+
* setupGestureHandler({ pressEvents: true, sheet: false })
|
|
9
14
|
* ```
|
|
10
15
|
*
|
|
11
16
|
* This automatically detects and configures react-native-gesture-handler
|
|
12
17
|
* for use with Sheet and other gesture-aware components.
|
|
13
18
|
*/
|
|
14
19
|
|
|
15
|
-
import { getGestureHandler } from './gestureState'
|
|
20
|
+
import { canChangeGestureHandlerEnabled, getGestureHandler } from './gestureState'
|
|
21
|
+
|
|
22
|
+
export interface GestureHandlerConfig {
|
|
23
|
+
/** use RNGH for press events on Tamagui components (default: true) */
|
|
24
|
+
pressEvents?: boolean
|
|
25
|
+
/** use RNGH for Sheet drag gestures (default: true) */
|
|
26
|
+
sheet?: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let currentConfig: GestureHandlerConfig = {
|
|
30
|
+
pressEvents: true,
|
|
31
|
+
sheet: true,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getGestureHandlerConfig(): GestureHandlerConfig {
|
|
35
|
+
return currentConfig
|
|
36
|
+
}
|
|
16
37
|
|
|
17
|
-
function
|
|
38
|
+
export function setupGestureHandler(config?: GestureHandlerConfig): void {
|
|
18
39
|
const g = globalThis as any
|
|
19
|
-
|
|
20
|
-
|
|
40
|
+
|
|
41
|
+
// override config if provided
|
|
42
|
+
if (config) {
|
|
43
|
+
currentConfig = config
|
|
44
|
+
|
|
45
|
+
if (
|
|
46
|
+
config.pressEvents !== undefined &&
|
|
47
|
+
!canChangeGestureHandlerEnabled(
|
|
48
|
+
config.pressEvents !== false,
|
|
49
|
+
'setupGestureHandler()'
|
|
50
|
+
)
|
|
51
|
+
) {
|
|
52
|
+
currentConfig = {
|
|
53
|
+
...currentConfig,
|
|
54
|
+
pressEvents: getGestureHandler().isEnabled,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
21
57
|
}
|
|
58
|
+
|
|
59
|
+
// allow re-running setup to change config
|
|
60
|
+
const isFirstRun = !g.__tamagui_native_gesture_setup_complete
|
|
22
61
|
g.__tamagui_native_gesture_setup_complete = true
|
|
23
62
|
|
|
24
63
|
try {
|
|
25
64
|
// dynamically require RNGH - it should already be imported by the app
|
|
26
65
|
const rngh = require('react-native-gesture-handler')
|
|
27
|
-
const { Gesture, GestureDetector, ScrollView } = rngh
|
|
66
|
+
const { Gesture, GestureDetector, ScrollView, GestureHandlerRootView } = rngh
|
|
28
67
|
|
|
29
68
|
if (Gesture && GestureDetector) {
|
|
69
|
+
// only enable if pressEvents is true
|
|
30
70
|
getGestureHandler().set({
|
|
31
|
-
enabled:
|
|
71
|
+
enabled: currentConfig.pressEvents !== false,
|
|
32
72
|
Gesture,
|
|
33
73
|
GestureDetector,
|
|
34
74
|
ScrollView: ScrollView || null,
|
|
75
|
+
RootView: GestureHandlerRootView || null,
|
|
35
76
|
})
|
|
36
77
|
|
|
37
|
-
//
|
|
78
|
+
// sheet state - only enable if sheet is true
|
|
38
79
|
g.__tamagui_sheet_gesture_state__ = {
|
|
39
|
-
enabled:
|
|
80
|
+
enabled: currentConfig.sheet !== false,
|
|
40
81
|
Gesture,
|
|
41
82
|
GestureDetector,
|
|
42
83
|
ScrollView: ScrollView || null,
|
|
84
|
+
RootView: GestureHandlerRootView || null,
|
|
43
85
|
}
|
|
44
86
|
}
|
|
45
87
|
} catch {
|
|
@@ -47,5 +89,5 @@ function setup() {
|
|
|
47
89
|
}
|
|
48
90
|
}
|
|
49
91
|
|
|
50
|
-
// run setup immediately on import
|
|
51
|
-
|
|
92
|
+
// run setup immediately on import (can be overridden by calling setupGestureHandler)
|
|
93
|
+
setupGestureHandler()
|
package/src/types.ts
CHANGED
|
@@ -10,6 +10,10 @@ export interface GestureState {
|
|
|
10
10
|
Gesture: any
|
|
11
11
|
GestureDetector: any
|
|
12
12
|
ScrollView: any
|
|
13
|
+
// rngh's GestureHandlerRootView. native portals can render outside the app's
|
|
14
|
+
// root gesture view, so components that portal rngh gestures need to
|
|
15
|
+
// re-establish one around their content.
|
|
16
|
+
RootView: any
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
export interface WorkletsState {
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { View, type ViewProps } from "react-native";
|
|
3
|
+
export interface PressBoundaryProps extends ViewProps {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Alias for enabling the boundary. The behavior is limited to Tamagui's
|
|
7
|
+
* shared press ownership and does not patch arbitrary RN bubbling.
|
|
8
|
+
*/
|
|
9
|
+
stopPropagation?: boolean;
|
|
10
|
+
debugName?: string | null;
|
|
11
|
+
}
|
|
12
|
+
export declare const PressBoundary: React.ForwardRefExoticComponent<PressBoundaryProps & React.RefAttributes<View>>;
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=PressBoundary.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,WAAW,iBAAiB;AAOrC,iBAAiB,2BAA2B,UAAU;CACpD;;;;;CAKA;CACA;;AAiBF,OAAO,cAAM,eAAe,MAAM,0BAChC,qBAAqB,MAAM,cAAc",
|
|
3
|
+
"names": [],
|
|
4
|
+
"sources": [
|
|
5
|
+
"src/PressBoundary.tsx"
|
|
6
|
+
],
|
|
7
|
+
"version": 3,
|
|
8
|
+
"sourcesContent": [
|
|
9
|
+
"import React from 'react'\nimport { View, type ViewProps } from 'react-native'\nimport {\n claimExternalPressOwnership,\n releaseExternalPressOwnership,\n type ExternalPressOwnershipToken,\n} from './gestureState'\n\nexport interface PressBoundaryProps extends ViewProps {\n enabled?: boolean\n /**\n * Alias for enabling the boundary. The behavior is limited to Tamagui's\n * shared press ownership and does not patch arbitrary RN bubbling.\n */\n stopPropagation?: boolean\n debugName?: string | null\n}\n\nfunction composeFirst<T extends (...args: any[]) => void>(ours: T, theirs?: T) {\n return (...args: Parameters<T>) => {\n ours(...args)\n theirs?.(...args)\n }\n}\n\nfunction composeLast<T extends (...args: any[]) => void>(theirs: T | undefined, ours: T) {\n return (...args: Parameters<T>) => {\n theirs?.(...args)\n ours(...args)\n }\n}\n\nexport const PressBoundary: React.ForwardRefExoticComponent<\n PressBoundaryProps & React.RefAttributes<View>\n> = React.forwardRef<View, PressBoundaryProps>(function PressBoundary(\n {\n enabled,\n stopPropagation,\n debugName,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n onResponderGrant,\n onResponderRelease,\n onResponderTerminate,\n ...props\n },\n forwardedRef\n) {\n const tokenRef = React.useRef<ExternalPressOwnershipToken | null>(null)\n const isEnabled = enabled ?? stopPropagation ?? true\n\n const claim = React.useCallback((): void => {\n if (!isEnabled) return\n if (tokenRef.current) {\n releaseExternalPressOwnership(tokenRef.current, debugName)\n }\n tokenRef.current = claimExternalPressOwnership(debugName)\n }, [debugName, isEnabled])\n\n const release = React.useCallback((): void => {\n if (!tokenRef.current) return\n releaseExternalPressOwnership(tokenRef.current, debugName)\n tokenRef.current = null\n }, [debugName])\n\n React.useEffect(() => release, [release])\n\n return (\n <View\n ref={forwardedRef}\n {...props}\n onTouchStart={composeFirst(claim, onTouchStart)}\n onTouchEnd={composeLast(onTouchEnd, release)}\n onTouchCancel={composeLast(onTouchCancel, release)}\n onResponderGrant={composeFirst(claim, onResponderGrant)}\n onResponderRelease={composeLast(onResponderRelease, release)}\n onResponderTerminate={composeLast(onResponderTerminate, release)}\n />\n )\n})\n"
|
|
10
|
+
]
|
|
11
|
+
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"sources": [
|
|
5
5
|
"src/burntState.ts"
|
|
6
6
|
],
|
|
7
|
+
"version": 3,
|
|
7
8
|
"sourcesContent": [
|
|
8
9
|
"import { createGlobalState } from './globalState'\nimport type { BurntState } from './types'\n\nconst state = createGlobalState<BurntState>(`burnt`, {\n enabled: false,\n toast: null,\n dismissAllAlerts: null,\n})\n\nexport interface BurntAccessor {\n readonly isEnabled: boolean\n readonly state: BurntState\n set(newState: BurntState): void\n}\n\nexport function getBurnt(): BurntAccessor {\n return {\n get isEnabled(): boolean {\n return state.get().enabled\n },\n get state(): BurntState {\n return state.get()\n },\n set(newState: BurntState): void {\n state.set(newState)\n },\n }\n}\n"
|
|
9
|
-
]
|
|
10
|
-
"version": 3
|
|
10
|
+
]
|
|
11
11
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"sources": [
|
|
5
5
|
"src/components.tsx"
|
|
6
6
|
],
|
|
7
|
+
"version": 3,
|
|
7
8
|
"sourcesContent": [
|
|
8
9
|
"import type { ReactNode } from 'react'\nimport { getPortal } from './portalState'\nimport type {\n NativePortalProps,\n NativePortalHostProps,\n NativePortalProviderProps,\n} from './types'\n\nexport type { NativePortalProps, NativePortalHostProps, NativePortalProviderProps }\n\n/**\n * Renders children into a teleport Portal when available.\n * Returns null when teleport is not set up (allows fallback handling by caller).\n */\nexport function NativePortal({\n hostName = 'root',\n children,\n}: NativePortalProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return null\n\n const { Portal } = (globalThis as any).__tamagui_teleport\n return <Portal hostName={hostName}>{children}</Portal>\n}\n\n/**\n * Renders a teleport PortalHost when available.\n * Returns null when teleport is not set up.\n */\nexport function NativePortalHost({ name }: NativePortalHostProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return null\n\n const { PortalHost } = (globalThis as any).__tamagui_teleport\n return <PortalHost name={name} />\n}\n\n/**\n * Wraps children with teleport PortalProvider when available.\n * Returns children as-is when teleport is not set up.\n */\nexport function NativePortalProvider({ children }: NativePortalProviderProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return <>{children}</>\n\n const { PortalProvider } = (globalThis as any).__tamagui_teleport\n return <PortalProvider>{children}</PortalProvider>\n}\n"
|
|
9
|
-
]
|
|
10
|
-
"version": 3
|
|
10
|
+
]
|
|
11
11
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { getGestureHandler } from "./gestureState";
|
|
2
|
+
export type { ExternalPressOwnershipToken, GestureHandlerAccessor, PressGestureConfig } from "./gestureState";
|
|
3
|
+
export { claimExternalPressOwnership as unstable_claimExternalPressOwnership, releaseExternalPressOwnership as unstable_releaseExternalPressOwnership } from "./gestureState";
|
|
4
|
+
export { PressBoundary } from "./PressBoundary";
|
|
5
|
+
export type { PressBoundaryProps } from "./PressBoundary";
|
|
6
|
+
export { getGestureHandlerConfig, setupGestureHandler, type GestureHandlerConfig } from "./setup-gesture-handler";
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=gesture-handler.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mappings": "AAAA,SAAS,yBAAyB;AAClC,cACE,6BACA,wBACA,0BACK;AACP,SACE,+BAA+B,sCAC/B,iCAAiC,8CAC5B;AACP,SAAS,qBAAqB;AAC9B,cAAc,0BAA0B;AACxC,SACE,yBACA,0BACK,4BACA",
|
|
3
|
+
"names": [],
|
|
4
|
+
"sources": [
|
|
5
|
+
"src/gesture-handler.ts"
|
|
6
|
+
],
|
|
7
|
+
"version": 3,
|
|
8
|
+
"sourcesContent": [
|
|
9
|
+
"export { getGestureHandler } from './gestureState'\nexport type {\n ExternalPressOwnershipToken,\n GestureHandlerAccessor,\n PressGestureConfig,\n} from './gestureState'\nexport {\n claimExternalPressOwnership as unstable_claimExternalPressOwnership,\n releaseExternalPressOwnership as unstable_releaseExternalPressOwnership,\n} from './gestureState'\nexport { PressBoundary } from './PressBoundary'\nexport type { PressBoundaryProps } from './PressBoundary'\nexport {\n getGestureHandlerConfig,\n setupGestureHandler,\n type GestureHandlerConfig,\n} from './setup-gesture-handler'\n"
|
|
10
|
+
]
|
|
11
|
+
}
|
package/types/gestureState.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GestureState } from "./types";
|
|
2
|
+
export declare function canChangeGestureHandlerEnabled(nextEnabled: boolean, source: string): boolean;
|
|
2
3
|
export interface Insets {
|
|
3
4
|
top?: number;
|
|
4
5
|
left?: number;
|
|
@@ -6,6 +7,7 @@ export interface Insets {
|
|
|
6
7
|
right?: number;
|
|
7
8
|
}
|
|
8
9
|
export type PressGestureConfig = {
|
|
10
|
+
debugName?: string | null;
|
|
9
11
|
onPressIn?: (e: any) => void;
|
|
10
12
|
onPressOut?: (e: any) => void;
|
|
11
13
|
onPress?: (e: any) => void;
|
|
@@ -20,6 +22,9 @@ export interface GestureHandlerAccessor {
|
|
|
20
22
|
disable(): void;
|
|
21
23
|
createPressGesture(config: PressGestureConfig): any;
|
|
22
24
|
}
|
|
25
|
+
export type ExternalPressOwnershipToken = object;
|
|
26
|
+
export declare function claimExternalPressOwnership(debugName?: string | null): ExternalPressOwnershipToken;
|
|
27
|
+
export declare function releaseExternalPressOwnership(token: ExternalPressOwnershipToken | null | undefined, debugName?: string | null): void;
|
|
23
28
|
export declare function getGestureHandler(): GestureHandlerAccessor;
|
|
24
29
|
|
|
25
30
|
//# sourceMappingURL=gestureState.d.ts.map
|