@tamagui/sheet 2.0.0-1769233344020 → 2.0.0-1769256574467

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.
Files changed (150) hide show
  1. package/dist/cjs/GestureDetectorWrapper.cjs +48 -0
  2. package/dist/cjs/GestureDetectorWrapper.js +29 -0
  3. package/dist/cjs/GestureDetectorWrapper.js.map +6 -0
  4. package/dist/cjs/GestureDetectorWrapper.native.js +53 -0
  5. package/dist/cjs/GestureDetectorWrapper.native.js.map +1 -0
  6. package/dist/cjs/GestureSheetContext.cjs +52 -0
  7. package/dist/cjs/GestureSheetContext.js +43 -0
  8. package/dist/cjs/GestureSheetContext.js.map +6 -0
  9. package/dist/cjs/GestureSheetContext.native.js +56 -0
  10. package/dist/cjs/GestureSheetContext.native.js.map +1 -0
  11. package/dist/cjs/SheetImplementationCustom.cjs +85 -40
  12. package/dist/cjs/SheetImplementationCustom.js +81 -58
  13. package/dist/cjs/SheetImplementationCustom.js.map +1 -1
  14. package/dist/cjs/SheetImplementationCustom.native.js +105 -50
  15. package/dist/cjs/SheetImplementationCustom.native.js.map +1 -1
  16. package/dist/cjs/SheetScrollView.cjs +80 -8
  17. package/dist/cjs/SheetScrollView.js +76 -10
  18. package/dist/cjs/SheetScrollView.js.map +1 -1
  19. package/dist/cjs/SheetScrollView.native.js +94 -10
  20. package/dist/cjs/SheetScrollView.native.js.map +1 -1
  21. package/dist/cjs/gestureState.cjs +31 -0
  22. package/dist/cjs/gestureState.js +24 -0
  23. package/dist/cjs/gestureState.js.map +6 -0
  24. package/dist/cjs/gestureState.native.js +34 -0
  25. package/dist/cjs/gestureState.native.js.map +1 -0
  26. package/dist/cjs/setupGestureHandler.cjs +43 -0
  27. package/dist/cjs/setupGestureHandler.js +35 -0
  28. package/dist/cjs/setupGestureHandler.js.map +6 -0
  29. package/dist/cjs/setupGestureHandler.native.js +47 -0
  30. package/dist/cjs/setupGestureHandler.native.js.map +1 -0
  31. package/dist/cjs/useGestureHandlerPan.cjs +125 -0
  32. package/dist/cjs/useGestureHandlerPan.js +116 -0
  33. package/dist/cjs/useGestureHandlerPan.js.map +6 -0
  34. package/dist/cjs/useGestureHandlerPan.native.js +134 -0
  35. package/dist/cjs/useGestureHandlerPan.native.js.map +1 -0
  36. package/dist/esm/GestureDetectorWrapper.js +15 -0
  37. package/dist/esm/GestureDetectorWrapper.js.map +6 -0
  38. package/dist/esm/GestureDetectorWrapper.mjs +25 -0
  39. package/dist/esm/GestureDetectorWrapper.mjs.map +1 -0
  40. package/dist/esm/GestureDetectorWrapper.native.js +27 -0
  41. package/dist/esm/GestureDetectorWrapper.native.js.map +1 -0
  42. package/dist/esm/GestureSheetContext.js +28 -0
  43. package/dist/esm/GestureSheetContext.js.map +6 -0
  44. package/dist/esm/GestureSheetContext.mjs +28 -0
  45. package/dist/esm/GestureSheetContext.mjs.map +1 -0
  46. package/dist/esm/GestureSheetContext.native.js +29 -0
  47. package/dist/esm/GestureSheetContext.native.js.map +1 -0
  48. package/dist/esm/SheetImplementationCustom.js +83 -57
  49. package/dist/esm/SheetImplementationCustom.js.map +1 -1
  50. package/dist/esm/SheetImplementationCustom.mjs +85 -40
  51. package/dist/esm/SheetImplementationCustom.mjs.map +1 -1
  52. package/dist/esm/SheetImplementationCustom.native.js +105 -50
  53. package/dist/esm/SheetImplementationCustom.native.js.map +1 -1
  54. package/dist/esm/SheetScrollView.js +77 -9
  55. package/dist/esm/SheetScrollView.js.map +1 -1
  56. package/dist/esm/SheetScrollView.mjs +80 -8
  57. package/dist/esm/SheetScrollView.mjs.map +1 -1
  58. package/dist/esm/SheetScrollView.native.js +94 -10
  59. package/dist/esm/SheetScrollView.native.js.map +1 -1
  60. package/dist/esm/gestureState.js +13 -0
  61. package/dist/esm/gestureState.js.map +6 -0
  62. package/dist/esm/gestureState.mjs +5 -0
  63. package/dist/esm/gestureState.mjs.map +1 -0
  64. package/dist/esm/gestureState.native.js +5 -0
  65. package/dist/esm/gestureState.native.js.map +1 -0
  66. package/dist/esm/setupGestureHandler.js +19 -0
  67. package/dist/esm/setupGestureHandler.js.map +6 -0
  68. package/dist/esm/setupGestureHandler.mjs +19 -0
  69. package/dist/esm/setupGestureHandler.mjs.map +1 -0
  70. package/dist/esm/setupGestureHandler.native.js +20 -0
  71. package/dist/esm/setupGestureHandler.native.js.map +1 -0
  72. package/dist/esm/useGestureHandlerPan.js +101 -0
  73. package/dist/esm/useGestureHandlerPan.js.map +6 -0
  74. package/dist/esm/useGestureHandlerPan.mjs +102 -0
  75. package/dist/esm/useGestureHandlerPan.mjs.map +1 -0
  76. package/dist/esm/useGestureHandlerPan.native.js +108 -0
  77. package/dist/esm/useGestureHandlerPan.native.js.map +1 -0
  78. package/dist/jsx/GestureDetectorWrapper.js +15 -0
  79. package/dist/jsx/GestureDetectorWrapper.js.map +6 -0
  80. package/dist/jsx/GestureDetectorWrapper.mjs +25 -0
  81. package/dist/jsx/GestureDetectorWrapper.mjs.map +1 -0
  82. package/dist/jsx/GestureDetectorWrapper.native.js +53 -0
  83. package/dist/jsx/GestureDetectorWrapper.native.js.map +1 -0
  84. package/dist/jsx/GestureSheetContext.js +28 -0
  85. package/dist/jsx/GestureSheetContext.js.map +6 -0
  86. package/dist/jsx/GestureSheetContext.mjs +28 -0
  87. package/dist/jsx/GestureSheetContext.mjs.map +1 -0
  88. package/dist/jsx/GestureSheetContext.native.js +56 -0
  89. package/dist/jsx/GestureSheetContext.native.js.map +1 -0
  90. package/dist/jsx/SheetImplementationCustom.js +83 -57
  91. package/dist/jsx/SheetImplementationCustom.js.map +1 -1
  92. package/dist/jsx/SheetImplementationCustom.mjs +85 -40
  93. package/dist/jsx/SheetImplementationCustom.mjs.map +1 -1
  94. package/dist/jsx/SheetImplementationCustom.native.js +105 -50
  95. package/dist/jsx/SheetImplementationCustom.native.js.map +1 -1
  96. package/dist/jsx/SheetScrollView.js +77 -9
  97. package/dist/jsx/SheetScrollView.js.map +1 -1
  98. package/dist/jsx/SheetScrollView.mjs +80 -8
  99. package/dist/jsx/SheetScrollView.mjs.map +1 -1
  100. package/dist/jsx/SheetScrollView.native.js +94 -10
  101. package/dist/jsx/SheetScrollView.native.js.map +1 -1
  102. package/dist/jsx/gestureState.js +13 -0
  103. package/dist/jsx/gestureState.js.map +6 -0
  104. package/dist/jsx/gestureState.mjs +5 -0
  105. package/dist/jsx/gestureState.mjs.map +1 -0
  106. package/dist/jsx/gestureState.native.js +34 -0
  107. package/dist/jsx/gestureState.native.js.map +1 -0
  108. package/dist/jsx/setupGestureHandler.js +19 -0
  109. package/dist/jsx/setupGestureHandler.js.map +6 -0
  110. package/dist/jsx/setupGestureHandler.mjs +19 -0
  111. package/dist/jsx/setupGestureHandler.mjs.map +1 -0
  112. package/dist/jsx/setupGestureHandler.native.js +47 -0
  113. package/dist/jsx/setupGestureHandler.native.js.map +1 -0
  114. package/dist/jsx/useGestureHandlerPan.js +101 -0
  115. package/dist/jsx/useGestureHandlerPan.js.map +6 -0
  116. package/dist/jsx/useGestureHandlerPan.mjs +102 -0
  117. package/dist/jsx/useGestureHandlerPan.mjs.map +1 -0
  118. package/dist/jsx/useGestureHandlerPan.native.js +134 -0
  119. package/dist/jsx/useGestureHandlerPan.native.js.map +1 -0
  120. package/package.json +48 -21
  121. package/src/GestureDetectorWrapper.tsx +41 -0
  122. package/src/GestureSheetContext.tsx +62 -0
  123. package/src/SheetImplementationCustom.tsx +124 -57
  124. package/src/SheetScrollView.tsx +157 -8
  125. package/src/gestureState.ts +17 -0
  126. package/src/setupGestureHandler.ts +32 -0
  127. package/src/types.tsx +15 -0
  128. package/src/useGestureHandlerPan.tsx +299 -0
  129. package/types/GestureDetectorWrapper.d.ts +14 -0
  130. package/types/GestureDetectorWrapper.d.ts.map +1 -0
  131. package/types/GestureDetectorWrapper.native.d.ts +14 -0
  132. package/types/GestureDetectorWrapper.native.d.ts.map +1 -0
  133. package/types/GestureSheetContext.d.ts +36 -0
  134. package/types/GestureSheetContext.d.ts.map +1 -0
  135. package/types/SheetImplementationCustom.d.ts.map +1 -1
  136. package/types/SheetScrollView.d.ts.map +1 -1
  137. package/types/gestureState.d.ts +9 -0
  138. package/types/gestureState.d.ts.map +1 -0
  139. package/types/gestureState.native.d.ts +12 -0
  140. package/types/gestureState.native.d.ts.map +1 -0
  141. package/types/setupGestureHandler.d.ts +12 -0
  142. package/types/setupGestureHandler.d.ts.map +1 -0
  143. package/types/setupGestureHandler.native.d.ts +41 -0
  144. package/types/setupGestureHandler.native.d.ts.map +1 -0
  145. package/types/types.d.ts +8 -0
  146. package/types/types.d.ts.map +1 -1
  147. package/types/useGestureHandlerPan.d.ts +43 -0
  148. package/types/useGestureHandlerPan.d.ts.map +1 -0
  149. package/types/useGestureHandlerPan.native.d.ts +33 -0
  150. package/types/useGestureHandlerPan.native.d.ts.map +1 -0
@@ -0,0 +1,299 @@
1
+ import { useCallback, useMemo, useRef, type RefObject } from 'react'
2
+ import { getGestureHandlerState, isGestureHandlerEnabled } from './gestureState'
3
+ import type { ScrollBridge } from './types'
4
+
5
+ // threshold in pixels for considering sheet "at top" position
6
+ // allows for small measurement variations
7
+ const AT_TOP_THRESHOLD = 5
8
+
9
+ interface GesturePanConfig {
10
+ positions: number[]
11
+ frameSize: number
12
+ setPosition: (pos: number) => void
13
+ animateTo: (pos: number) => void
14
+ stopSpring: () => void
15
+ scrollBridge: ScrollBridge
16
+ setIsDragging: (val: boolean) => void
17
+ getCurrentPosition: () => number
18
+ resisted: (val: number, minY: number) => number
19
+ disableDrag?: boolean
20
+ isShowingInnerSheet?: boolean
21
+ // set the animated position directly (for smooth dragging)
22
+ setAnimatedPosition: (val: number) => void
23
+ // ref to scroll gesture for simultaneousWithExternalGesture
24
+ scrollGestureRef?: RefObject<any> | null
25
+ }
26
+
27
+ interface GesturePanResult {
28
+ panGesture: any | null
29
+ panGestureRef: RefObject<any>
30
+ gestureHandlerEnabled: boolean
31
+ }
32
+
33
+ /**
34
+ * Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
35
+ * This provides native-quality gesture coordination between Sheet and ScrollView.
36
+ *
37
+ * Uses state-based decision pattern (like gorhom/bottom-sheet and react-native-actions-sheet):
38
+ * - Both pan and scroll gestures run simultaneously
39
+ * - In onChange, we decide whether to process pan or let scroll handle it
40
+ * - scrollBridge.setScrollEnabled toggles scroll on/off as needed
41
+ *
42
+ * Decision matrix:
43
+ * 1. Sheet not fully open + swiping up -> pan handles (disable scroll)
44
+ * 2. Sheet fully open + swiping up -> scroll handles (blockPan)
45
+ * 3. Sheet not fully open + swiping down -> pan handles (unless scrolled)
46
+ * 4. Sheet fully open + swiping down + scrollY=0 -> pan handles
47
+ * 5. Sheet fully open + swiping down + scrollY>0 -> scroll handles (blockPan)
48
+ *
49
+ * Returns null for the gesture if RNGH is not available or drag is disabled.
50
+ */
51
+ export function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult {
52
+ const {
53
+ positions,
54
+ frameSize,
55
+ setPosition,
56
+ animateTo,
57
+ stopSpring,
58
+ scrollBridge,
59
+ setIsDragging,
60
+ getCurrentPosition,
61
+ resisted,
62
+ disableDrag,
63
+ isShowingInnerSheet,
64
+ setAnimatedPosition,
65
+ scrollGestureRef,
66
+ } = config
67
+
68
+ const gestureHandlerEnabled = isGestureHandlerEnabled()
69
+ const panGestureRef = useRef<any>(null)
70
+
71
+ // use refs for values that need to persist across gesture lifecycle
72
+ // (useMemo closure variables get reset when gesture is recreated)
73
+ const gestureStateRef = useRef({
74
+ startY: 0,
75
+ // track last translation when pan was active (for position calculation after handoff)
76
+ lastPanTranslationY: 0,
77
+ // accumulated position offset from all pan movements
78
+ accumulatedOffset: 0,
79
+ // track previous translation for direction detection (like actions-sheet)
80
+ prevTranslationY: 0,
81
+ // track if scroll was engaged (scrollY > 0) at some point
82
+ scrollEngaged: false,
83
+ })
84
+
85
+ const onStart = useCallback(() => {
86
+ stopSpring()
87
+ setIsDragging(true)
88
+ }, [stopSpring, setIsDragging])
89
+
90
+ const onEnd = useCallback(
91
+ (closestPoint: number) => {
92
+ setIsDragging(false)
93
+ scrollBridge.setParentDragging(false)
94
+ // re-enable scroll when gesture ends
95
+ scrollBridge.setScrollEnabled?.(true)
96
+ setPosition(closestPoint)
97
+ animateTo(closestPoint)
98
+ },
99
+ [setIsDragging, scrollBridge, setPosition, animateTo]
100
+ )
101
+
102
+ const panGesture = useMemo(() => {
103
+ // don't create gesture if disabled or RNGH not available
104
+ if (!gestureHandlerEnabled || disableDrag || isShowingInnerSheet || !frameSize) {
105
+ return null
106
+ }
107
+
108
+ const { Gesture } = getGestureHandlerState()
109
+ if (!Gesture) {
110
+ return null
111
+ }
112
+
113
+ const minY = positions[0]
114
+ const gs = gestureStateRef.current // shorthand
115
+
116
+ // simultaneousHandlers pattern from react-native-actions-sheet
117
+ // both gestures run simultaneously, we use blockPan to decide who handles
118
+ // console.warn('[RNGH-Pan] CREATING gesture, minY:', minY, 'frameSize:', frameSize)
119
+ const gesture = Gesture.Pan()
120
+ .withRef(panGestureRef)
121
+ // NO manualActivation - let both gestures run via simultaneousHandlers
122
+ .failOffsetX([-20, 20])
123
+ .shouldCancelWhenOutside(false)
124
+ .onBegin(() => {
125
+ // check position at gesture begin - before direction is known
126
+ const pos = getCurrentPosition()
127
+ const atTop = pos <= minY + AT_TOP_THRESHOLD
128
+ const currentScrollY = scrollBridge.y
129
+ // console.warn('[RNGH-Pan] onBegin', { pos, minY, atTop, currentScrollY })
130
+ gs.startY = pos
131
+ gs.lastPanTranslationY = 0
132
+ gs.accumulatedOffset = 0
133
+ gs.prevTranslationY = 0
134
+ gs.scrollEngaged = currentScrollY > 0 // track if scroll is already engaged
135
+
136
+ // if sheet not at top, DISABLE SCROLL immediately and lock to 0
137
+ // this prevents scroll from firing before pan takes over
138
+ if (!atTop) {
139
+ scrollBridge.setScrollEnabled?.(false, 0)
140
+ }
141
+ })
142
+ .onStart(() => {
143
+ // console.warn('[RNGH-Pan] onStart', { startY: gs.startY, minY })
144
+ scrollBridge.initialPosition = gs.startY
145
+ onStart()
146
+ })
147
+ .onChange((event: { translationY: number; velocityY: number }) => {
148
+ const { translationY } = event
149
+
150
+ // determine direction by comparing translations (like react-native-actions-sheet)
151
+ // this is more reliable than velocity which can be noisy during direction changes
152
+ const isSwipingDown = gs.prevTranslationY < translationY
153
+ const deltaY = translationY - gs.prevTranslationY
154
+ gs.prevTranslationY = translationY
155
+
156
+ const scrollY = scrollBridge.y
157
+ // track if scroll has been engaged at some point (needed for handoff detection)
158
+ if (scrollY > 0) {
159
+ gs.scrollEngaged = true
160
+ }
161
+
162
+ // calculate current sheet position based on accumulated offset
163
+ const currentPos = gs.startY + gs.accumulatedOffset
164
+ const isCurrentlyAtTop = currentPos <= minY + AT_TOP_THRESHOLD
165
+ const nodeIsScrolling = scrollY > 0
166
+
167
+ // console.warn('[RNGH-Pan] onChange', { translationY: translationY.toFixed(1), deltaY: deltaY.toFixed(1), currentPos: currentPos.toFixed(1), minY, isCurrentlyAtTop, isSwipingDown, scrollY, scrollEngaged: gs.scrollEngaged })
168
+
169
+ // decision matrix (from react-native-actions-sheet pattern)
170
+ // each frame, decide who handles the movement based on current state
171
+ //
172
+ // Key insight: we track accumulated offset separately from translation
173
+ // This allows seamless handoffs between pan and scroll
174
+ let panHandles = false
175
+
176
+ if (!isCurrentlyAtTop) {
177
+ // sheet not at top position
178
+ if (isSwipingDown) {
179
+ // swiping down while sheet not at top
180
+ // only scroll if scrollY > 0, otherwise pan handles
181
+ panHandles = !nodeIsScrolling
182
+ } else {
183
+ // swiping up while sheet not at top -> pan drags sheet up
184
+ panHandles = true
185
+ }
186
+ } else {
187
+ // sheet is at top position
188
+ if (isSwipingDown) {
189
+ // swiping down at top
190
+ if (nodeIsScrolling) {
191
+ // scroll > 0, let scroll handle (scroll back towards 0)
192
+ panHandles = false
193
+ } else if (gs.scrollEngaged) {
194
+ // scroll WAS > 0 but now is 0 -> handoff from scroll to pan
195
+ // pan takes over to drag sheet down
196
+ // console.warn('[RNGH-Pan] *** HANDOFF FROM SCROLL TO PAN ***')
197
+ panHandles = true
198
+ } else {
199
+ // scroll never engaged, just drag sheet down
200
+ panHandles = true
201
+ }
202
+ } else {
203
+ // swiping up at top -> scroll handles (scroll content)
204
+ panHandles = false
205
+ }
206
+ }
207
+
208
+ // console.warn('[RNGH-Pan] decision', { panHandles, isCurrentlyAtTop, isSwipingDown, nodeIsScrolling, scrollEngaged: gs.scrollEngaged, currentPos: currentPos.toFixed(1), minY })
209
+
210
+ if (panHandles) {
211
+ // pan handles - disable scroll and move sheet
212
+ // when not at top: lock scroll to 0 (sheet is being dragged)
213
+ // when at top: lock at current position (handoff from scroll to pan)
214
+ const lockTo = isCurrentlyAtTop ? undefined : 0
215
+ scrollBridge.setScrollEnabled?.(false, lockTo)
216
+
217
+ // accumulate the delta for position calculation
218
+ gs.accumulatedOffset += deltaY
219
+ const newPosition = resisted(gs.startY + gs.accumulatedOffset, minY)
220
+
221
+ // update position
222
+ scrollBridge.paneY = newPosition
223
+ setAnimatedPosition(newPosition)
224
+ scrollBridge.setParentDragging(newPosition > minY)
225
+ } else {
226
+ // scroll handles - enable scroll so it can move freely
227
+ scrollBridge.setScrollEnabled?.(true)
228
+ // don't accumulate offset when scroll is handling
229
+ }
230
+ })
231
+ .onEnd((event: { velocityY: number }) => {
232
+ const { velocityY } = event
233
+ const currentPos = gs.startY + gs.accumulatedOffset
234
+
235
+ // console.warn('[RNGH-Pan] onEnd', { velocityY, currentPos, accumulatedOffset: gs.accumulatedOffset, scrollY: scrollBridge.y })
236
+
237
+ // clear scroll lock
238
+ scrollBridge.scrollLockY = undefined
239
+
240
+ // if sheet is at top and scroll is engaged, just stay at top
241
+ if (currentPos <= minY + AT_TOP_THRESHOLD && scrollBridge.y > 0) {
242
+ onEnd(0)
243
+ return
244
+ }
245
+
246
+ // find closest snap point using current position and velocity
247
+ const velocity = velocityY / 1000
248
+ const projectedEnd = currentPos + frameSize * velocity * 0.2
249
+
250
+ let closestPoint = 0
251
+ let minDist = Number.POSITIVE_INFINITY
252
+
253
+ for (let i = 0; i < positions.length; i++) {
254
+ const pos = positions[i]
255
+ const dist = Math.abs(projectedEnd - pos)
256
+ if (dist < minDist) {
257
+ minDist = dist
258
+ closestPoint = i
259
+ }
260
+ }
261
+
262
+ onEnd(closestPoint)
263
+ })
264
+ .onFinalize(() => {
265
+ // console.warn('[RNGH-Pan] onFinalize')
266
+ // clear scroll lock on finalize too (safety)
267
+ scrollBridge.scrollLockY = undefined
268
+ })
269
+ .runOnJS(true)
270
+
271
+ // if we have a scroll gesture ref, make pan simultaneous with it
272
+ // this allows both gestures to run and we decide in onChange who handles it
273
+ if (scrollGestureRef?.current) {
274
+ // console.warn('[RNGH-Pan] adding simultaneousWithExternalGesture for scroll')
275
+ return gesture.simultaneousWithExternalGesture(scrollGestureRef.current)
276
+ }
277
+
278
+ return gesture
279
+ }, [
280
+ gestureHandlerEnabled,
281
+ disableDrag,
282
+ isShowingInnerSheet,
283
+ frameSize,
284
+ positions,
285
+ scrollBridge,
286
+ getCurrentPosition,
287
+ resisted,
288
+ onStart,
289
+ onEnd,
290
+ setIsDragging,
291
+ setAnimatedPosition,
292
+ ])
293
+
294
+ return {
295
+ panGesture,
296
+ panGestureRef,
297
+ gestureHandlerEnabled,
298
+ }
299
+ }
@@ -0,0 +1,14 @@
1
+ import type React from 'react';
2
+ import { type ViewStyle } from 'react-native';
3
+ interface GestureDetectorWrapperProps {
4
+ gesture: any;
5
+ children: React.ReactNode;
6
+ style?: ViewStyle;
7
+ }
8
+ /**
9
+ * Conditionally wraps children with GestureDetector when RNGH is available.
10
+ * Uses a plain View wrapper that GestureDetector can attach gesture handlers to.
11
+ */
12
+ export declare function GestureDetectorWrapper({ gesture, children, style, }: GestureDetectorWrapperProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=GestureDetectorWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureDetectorWrapper.d.ts","sourceRoot":"","sources":["../src/GestureDetectorWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAGnD,UAAU,2BAA2B;IACnC,OAAO,EAAE,GAAG,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE,2BAA2B,2CAsB7B"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ interface GestureDetectorWrapperProps {
3
+ gesture: any;
4
+ children: React.ReactNode;
5
+ }
6
+ /**
7
+ * Conditionally wraps children with GestureDetector when RNGH is available.
8
+ * Falls back to just rendering children when RNGH is not set up.
9
+ *
10
+ * @platform native
11
+ */
12
+ export declare function GestureDetectorWrapper({ gesture, children, }: GestureDetectorWrapperProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=GestureDetectorWrapper.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureDetectorWrapper.native.d.ts","sourceRoot":"","sources":["../src/GestureDetectorWrapper.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,2BAA2B;IACnC,OAAO,EAAE,GAAG,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,GACT,EAAE,2BAA2B,2CAQ7B"}
@@ -0,0 +1,36 @@
1
+ import type React from 'react';
2
+ import { type RefObject } from 'react';
3
+ export interface GestureSheetContextValue {
4
+ /**
5
+ * The sheet's pan gesture object, used for simultaneousHandlers
6
+ * in ScrollView to coordinate gestures
7
+ */
8
+ panGesture: any | null;
9
+ /**
10
+ * Ref to the pan gesture for simultaneousHandlers prop
11
+ */
12
+ panGestureRef: RefObject<any> | null;
13
+ /**
14
+ * Whether the sheet is currently being dragged by the user
15
+ */
16
+ isDragging: boolean;
17
+ /**
18
+ * Set whether panning should be blocked (e.g., when scrolling)
19
+ */
20
+ setBlockPan: (blocked: boolean) => void;
21
+ /**
22
+ * Whether pan gesture is currently blocked
23
+ */
24
+ blockPan: boolean;
25
+ }
26
+ export declare function useGestureSheetContext(): GestureSheetContextValue | null;
27
+ export interface GestureSheetProviderProps {
28
+ children: React.ReactNode;
29
+ isDragging: boolean;
30
+ blockPan: boolean;
31
+ setBlockPan: (blocked: boolean) => void;
32
+ panGesture: any | null;
33
+ panGestureRef: RefObject<any> | null;
34
+ }
35
+ export declare function GestureSheetProvider({ children, isDragging, blockPan, setBlockPan, panGesture, panGestureRef, }: GestureSheetProviderProps): import("react/jsx-runtime").JSX.Element;
36
+ //# sourceMappingURL=GestureSheetContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureSheetContext.d.ts","sourceRoot":"","sources":["../src/GestureSheetContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjE,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB;;OAEG;IACH,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACpC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,wBAAgB,sBAAsB,IAAI,wBAAwB,GAAG,IAAI,CAExE;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;CACrC;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,GACd,EAAE,yBAAyB,2CAY3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"SheetImplementationCustom.d.ts","sourceRoot":"","sources":["../src/SheetImplementationCustom.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAOvC,OAAO,EAAsC,IAAI,EAAE,MAAM,cAAc,CAAA;AAIvE,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,SAAS,CAAA;AAWzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAgkBrC,CAAA"}
1
+ {"version":3,"file":"SheetImplementationCustom.d.ts","sourceRoot":"","sources":["../src/SheetImplementationCustom.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAOvC,OAAO,EAAsC,IAAI,EAAE,MAAM,cAAc,CAAA;AAMvE,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,SAAS,CAAA;AAYzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA+nBrC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SheetScrollView.d.ts","sourceRoot":"","sources":["../src/SheetScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAY9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAiQ3B,CAAA"}
1
+ {"version":3,"file":"SheetScrollView.d.ts","sourceRoot":"","sources":["../src/SheetScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAc9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAoZ3B,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Re-export gesture state from @tamagui/native.
3
+ * Sheet uses this for backward compatibility with existing code.
4
+ */
5
+ export { isGestureHandlerEnabled, getGestureHandlerState, } from '@tamagui/native';
6
+ export type { GestureState as GestureHandlerState } from '@tamagui/native';
7
+ export { setGestureHandlerState } from '@tamagui/native';
8
+ export { setGestureHandlerState as setGestureState } from '@tamagui/native';
9
+ //# sourceMappingURL=gestureState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gestureState.d.ts","sourceRoot":"","sources":["../src/gestureState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAG1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAGxD,OAAO,EAAE,sBAAsB,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { PanGesture } from 'react-native-gesture-handler';
2
+ export type GestureHandlerState = {
3
+ enabled: boolean;
4
+ GestureDetector: any | null;
5
+ Gesture: any | null;
6
+ };
7
+ export declare function setGestureHandlerState(newState: GestureHandlerState): void;
8
+ export declare function getGestureHandlerState(): GestureHandlerState;
9
+ export declare function isGestureHandlerEnabled(): boolean;
10
+ export declare function createPanGesture(): PanGesture | null;
11
+ export declare function getGestureDetector(): any | null;
12
+ //# sourceMappingURL=gestureState.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gestureState.native.d.ts","sourceRoot":"","sources":["../src/gestureState.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,GAAG,GAAG,IAAI,CAAA;IAC3B,OAAO,EAAE,GAAG,GAAG,IAAI,CAAA;CACpB,CAAA;AAQD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAE1E;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAGD,wBAAgB,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAGpD;AAGD,wBAAgB,kBAAkB,IAAI,GAAG,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Legacy setup - prefer `import '@tamagui/native/setup-gesture-handler'` instead.
3
+ */
4
+ import { isGestureHandlerEnabled } from '@tamagui/native';
5
+ export { isGestureHandlerEnabled };
6
+ export interface SetupGestureHandlerConfig {
7
+ Gesture: any;
8
+ GestureDetector: any;
9
+ ScrollView?: any;
10
+ }
11
+ export declare function setupGestureHandler(config: SetupGestureHandlerConfig): void;
12
+ //# sourceMappingURL=setupGestureHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupGestureHandler.d.ts","sourceRoot":"","sources":["../src/setupGestureHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAA0B,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEjF,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAElC,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,GAAG,CAAA;IACZ,eAAe,EAAE,GAAG,CAAA;IACpB,UAAU,CAAC,EAAE,GAAG,CAAA;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAiB3E"}
@@ -0,0 +1,41 @@
1
+ export interface GestureHandlerConfig {
2
+ /**
3
+ * The Gesture object from react-native-gesture-handler
4
+ * Used to create Pan, Native, and other gesture types
5
+ */
6
+ Gesture: any;
7
+ /**
8
+ * The GestureDetector component from react-native-gesture-handler
9
+ * Used to wrap components that should respond to gestures
10
+ */
11
+ GestureDetector: any;
12
+ }
13
+ /**
14
+ * Sets up native gesture handler support for Sheet.
15
+ * Call this function early in your app (e.g., in index.js) to enable smooth
16
+ * gesture coordination between Sheet and ScrollView on iOS.
17
+ *
18
+ * When enabled, Sheet uses react-native-gesture-handler's simultaneousHandlers
19
+ * for native-quality gesture coordination. Without this setup, Sheet falls back
20
+ * to React Native's PanResponder which has minor limitations on iOS.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * import { setupGestureHandler } from '@tamagui/sheet/setup-gesture-handler'
25
+ * import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler'
26
+ *
27
+ * // Call once at app startup
28
+ * setupGestureHandler({ Gesture, GestureDetector })
29
+ *
30
+ * // Wrap your app with GestureHandlerRootView
31
+ * export default function App() {
32
+ * return (
33
+ * <GestureHandlerRootView style={{ flex: 1 }}>
34
+ * <YourApp />
35
+ * </GestureHandlerRootView>
36
+ * )
37
+ * }
38
+ * ```
39
+ */
40
+ export declare function setupGestureHandler(config: GestureHandlerConfig): void;
41
+ //# sourceMappingURL=setupGestureHandler.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupGestureHandler.native.d.ts","sourceRoot":"","sources":["../src/setupGestureHandler.native.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,OAAO,EAAE,GAAG,CAAA;IACZ;;;OAGG;IACH,eAAe,EAAE,GAAG,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAwBtE"}
package/types/types.d.ts CHANGED
@@ -89,6 +89,14 @@ export type ScrollBridge = {
89
89
  onParentDragging: (props: (val: boolean) => void) => () => void;
90
90
  setParentDragging: (val: boolean) => void;
91
91
  onFinishAnimate?: () => void;
92
+ blockPan?: boolean;
93
+ initialPosition?: number;
94
+ isScrollablePositionLocked?: boolean;
95
+ setScrollEnabled?: (enabled: boolean, lockTo?: number) => void;
96
+ _lastTouchY?: number;
97
+ scrollLockY?: number;
98
+ forceScrollTo?: (y: number) => void;
99
+ isAtTop?: boolean;
92
100
  };
93
101
  export {};
94
102
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type RefObject } from 'react';
2
+ import type { ScrollBridge } from './types';
3
+ interface GesturePanConfig {
4
+ positions: number[];
5
+ frameSize: number;
6
+ setPosition: (pos: number) => void;
7
+ animateTo: (pos: number) => void;
8
+ stopSpring: () => void;
9
+ scrollBridge: ScrollBridge;
10
+ setIsDragging: (val: boolean) => void;
11
+ getCurrentPosition: () => number;
12
+ resisted: (val: number, minY: number) => number;
13
+ disableDrag?: boolean;
14
+ isShowingInnerSheet?: boolean;
15
+ setAnimatedPosition: (val: number) => void;
16
+ scrollGestureRef?: RefObject<any> | null;
17
+ }
18
+ interface GesturePanResult {
19
+ panGesture: any | null;
20
+ panGestureRef: RefObject<any>;
21
+ gestureHandlerEnabled: boolean;
22
+ }
23
+ /**
24
+ * Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
25
+ * This provides native-quality gesture coordination between Sheet and ScrollView.
26
+ *
27
+ * Uses state-based decision pattern (like gorhom/bottom-sheet and react-native-actions-sheet):
28
+ * - Both pan and scroll gestures run simultaneously
29
+ * - In onChange, we decide whether to process pan or let scroll handle it
30
+ * - scrollBridge.setScrollEnabled toggles scroll on/off as needed
31
+ *
32
+ * Decision matrix:
33
+ * 1. Sheet not fully open + swiping up -> pan handles (disable scroll)
34
+ * 2. Sheet fully open + swiping up -> scroll handles (blockPan)
35
+ * 3. Sheet not fully open + swiping down -> pan handles (unless scrolled)
36
+ * 4. Sheet fully open + swiping down + scrollY=0 -> pan handles
37
+ * 5. Sheet fully open + swiping down + scrollY>0 -> scroll handles (blockPan)
38
+ *
39
+ * Returns null for the gesture if RNGH is not available or drag is disabled.
40
+ */
41
+ export declare function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult;
42
+ export {};
43
+ //# sourceMappingURL=useGestureHandlerPan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGestureHandlerPan.d.ts","sourceRoot":"","sources":["../src/useGestureHandlerPan.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM3C,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kBAAkB,EAAE,MAAM,MAAM,CAAA;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAE1C,gBAAgB,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;CACzC;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7B,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAwP/E"}
@@ -0,0 +1,33 @@
1
+ import type { PanGesture } from 'react-native-gesture-handler';
2
+ import type { ScrollBridge } from './types';
3
+ interface GesturePanConfig {
4
+ positions: number[];
5
+ frameSize: number;
6
+ setPosition: (pos: number) => void;
7
+ animateTo: (pos: number) => void;
8
+ stopSpring: () => void;
9
+ scrollBridge: ScrollBridge;
10
+ setIsDragging: (val: boolean) => void;
11
+ getCurrentPosition: () => number;
12
+ resisted: (val: number, minY: number) => number;
13
+ hasScrollView: boolean;
14
+ disableDrag?: boolean;
15
+ isShowingInnerSheet?: boolean;
16
+ }
17
+ interface GesturePanResult {
18
+ panGesture: PanGesture | null;
19
+ panGestureRef: React.RefObject<PanGesture | null>;
20
+ gestureHandlerEnabled: boolean;
21
+ }
22
+ /**
23
+ * Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
24
+ * This provides native-quality gesture coordination between Sheet and ScrollView.
25
+ *
26
+ * Based on patterns from react-native-actions-sheet and gorhom/bottom-sheet.
27
+ *
28
+ * @platform native - This hook only returns a gesture on native platforms.
29
+ * On web, it returns null for the gesture.
30
+ */
31
+ export declare function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult;
32
+ export {};
33
+ //# sourceMappingURL=useGestureHandlerPan.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGestureHandlerPan.native.d.ts","sourceRoot":"","sources":["../src/useGestureHandlerPan.native.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kBAAkB,EAAE,MAAM,MAAM,CAAA;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;IAC7B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IACjD,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CA0K/E"}