@tamagui/sheet 2.0.0-1769233344020 → 2.0.0-1769288527117

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 (146) 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 +88 -17
  17. package/dist/cjs/SheetScrollView.js +85 -26
  18. package/dist/cjs/SheetScrollView.js.map +1 -1
  19. package/dist/cjs/SheetScrollView.native.js +102 -19
  20. package/dist/cjs/SheetScrollView.native.js.map +1 -1
  21. package/dist/cjs/gestureState.cjs +39 -0
  22. package/dist/cjs/gestureState.js +34 -0
  23. package/dist/cjs/gestureState.js.map +6 -0
  24. package/dist/cjs/gestureState.native.js +42 -0
  25. package/dist/cjs/gestureState.native.js.map +1 -0
  26. package/dist/cjs/setupGestureHandler.cjs +46 -0
  27. package/dist/cjs/setupGestureHandler.js +38 -0
  28. package/dist/cjs/setupGestureHandler.js.map +6 -0
  29. package/dist/cjs/setupGestureHandler.native.js +50 -0
  30. package/dist/cjs/setupGestureHandler.native.js.map +1 -0
  31. package/dist/cjs/useGestureHandlerPan.cjs +126 -0
  32. package/dist/cjs/useGestureHandlerPan.js +117 -0
  33. package/dist/cjs/useGestureHandlerPan.js.map +6 -0
  34. package/dist/cjs/useGestureHandlerPan.native.js +135 -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 +87 -26
  55. package/dist/esm/SheetScrollView.js.map +1 -1
  56. package/dist/esm/SheetScrollView.mjs +89 -18
  57. package/dist/esm/SheetScrollView.mjs.map +1 -1
  58. package/dist/esm/SheetScrollView.native.js +103 -20
  59. package/dist/esm/SheetScrollView.native.js.map +1 -1
  60. package/dist/esm/gestureState.js +18 -0
  61. package/dist/esm/gestureState.js.map +6 -0
  62. package/dist/esm/gestureState.mjs +13 -0
  63. package/dist/esm/gestureState.mjs.map +1 -0
  64. package/dist/esm/gestureState.native.js +13 -0
  65. package/dist/esm/gestureState.native.js.map +1 -0
  66. package/dist/esm/setupGestureHandler.js +22 -0
  67. package/dist/esm/setupGestureHandler.js.map +6 -0
  68. package/dist/esm/setupGestureHandler.mjs +22 -0
  69. package/dist/esm/setupGestureHandler.mjs.map +1 -0
  70. package/dist/esm/setupGestureHandler.native.js +23 -0
  71. package/dist/esm/setupGestureHandler.native.js.map +1 -0
  72. package/dist/esm/useGestureHandlerPan.js +102 -0
  73. package/dist/esm/useGestureHandlerPan.js.map +6 -0
  74. package/dist/esm/useGestureHandlerPan.mjs +103 -0
  75. package/dist/esm/useGestureHandlerPan.mjs.map +1 -0
  76. package/dist/esm/useGestureHandlerPan.native.js +109 -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 +87 -26
  97. package/dist/jsx/SheetScrollView.js.map +1 -1
  98. package/dist/jsx/SheetScrollView.mjs +89 -18
  99. package/dist/jsx/SheetScrollView.mjs.map +1 -1
  100. package/dist/jsx/SheetScrollView.native.js +102 -19
  101. package/dist/jsx/SheetScrollView.native.js.map +1 -1
  102. package/dist/jsx/gestureState.js +18 -0
  103. package/dist/jsx/gestureState.js.map +6 -0
  104. package/dist/jsx/gestureState.mjs +13 -0
  105. package/dist/jsx/gestureState.mjs.map +1 -0
  106. package/dist/jsx/gestureState.native.js +42 -0
  107. package/dist/jsx/gestureState.native.js.map +1 -0
  108. package/dist/jsx/setupGestureHandler.js +22 -0
  109. package/dist/jsx/setupGestureHandler.js.map +6 -0
  110. package/dist/jsx/setupGestureHandler.mjs +22 -0
  111. package/dist/jsx/setupGestureHandler.mjs.map +1 -0
  112. package/dist/jsx/setupGestureHandler.native.js +50 -0
  113. package/dist/jsx/setupGestureHandler.native.js.map +1 -0
  114. package/dist/jsx/useGestureHandlerPan.js +102 -0
  115. package/dist/jsx/useGestureHandlerPan.js.map +6 -0
  116. package/dist/jsx/useGestureHandlerPan.mjs +103 -0
  117. package/dist/jsx/useGestureHandlerPan.mjs.map +1 -0
  118. package/dist/jsx/useGestureHandlerPan.native.js +135 -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 +169 -20
  125. package/src/gestureState.ts +24 -0
  126. package/src/setupGestureHandler.ts +34 -0
  127. package/src/types.tsx +15 -0
  128. package/src/useGestureHandlerPan.tsx +312 -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/GestureSheetContext.d.ts +36 -0
  133. package/types/GestureSheetContext.d.ts.map +1 -0
  134. package/types/SheetImplementationCustom.d.ts.map +1 -1
  135. package/types/SheetScrollView.d.ts.map +1 -1
  136. package/types/gestureState.d.ts +11 -0
  137. package/types/gestureState.d.ts.map +1 -0
  138. package/types/gestureState.native.d.ts +12 -0
  139. package/types/setupGestureHandler.d.ts +11 -0
  140. package/types/setupGestureHandler.d.ts.map +1 -0
  141. package/types/setupGestureHandler.native.d.ts +41 -0
  142. package/types/types.d.ts +8 -0
  143. package/types/types.d.ts.map +1 -1
  144. package/types/useGestureHandlerPan.d.ts +43 -0
  145. package/types/useGestureHandlerPan.d.ts.map +1 -0
  146. package/types/useGestureHandlerPan.native.d.ts +33 -0
@@ -0,0 +1,312 @@
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
+ // BUG #1 FIX: Check if scroll content is actually scrollable
177
+ // If content doesn't fill the ScrollView, gestures should pass through to sheet
178
+ const hasScrollableContent = scrollBridge.hasScrollableContent !== false
179
+
180
+ if (!isCurrentlyAtTop) {
181
+ // sheet not at top position
182
+ if (isSwipingDown) {
183
+ // swiping down while sheet not at top
184
+ // BUG #1 FIX: if content not scrollable, pan always handles
185
+ // only scroll if scrollY > 0 AND content is scrollable, otherwise pan handles
186
+ panHandles = !nodeIsScrolling || !hasScrollableContent
187
+ } else {
188
+ // swiping up while sheet not at top -> pan drags sheet up
189
+ panHandles = true
190
+ }
191
+ } else {
192
+ // sheet is at top position
193
+ if (isSwipingDown) {
194
+ // swiping down at top
195
+ if (nodeIsScrolling && hasScrollableContent) {
196
+ // scroll > 0 and content scrollable, let scroll handle (scroll back towards 0)
197
+ panHandles = false
198
+ } else if (gs.scrollEngaged && hasScrollableContent) {
199
+ // scroll WAS > 0 but now is 0 -> handoff from scroll to pan
200
+ // pan takes over to drag sheet down
201
+ // console.warn('[RNGH-Pan] *** HANDOFF FROM SCROLL TO PAN ***')
202
+ panHandles = true
203
+ } else {
204
+ // scroll never engaged OR content not scrollable, just drag sheet down
205
+ panHandles = true
206
+ }
207
+ } else {
208
+ // swiping up at top
209
+ // if there's scrollable content, let scroll handle so user can scroll into content
210
+ // resistance only applies when there's NO scrollable content
211
+ if (hasScrollableContent) {
212
+ // content is scrollable - let scroll handle (user wants to scroll down into content)
213
+ panHandles = false
214
+ } else {
215
+ // no scrollable content -> pan handles for resistance effect
216
+ panHandles = true
217
+ }
218
+ }
219
+ }
220
+
221
+ // console.warn('[RNGH-Pan] decision', { panHandles, isCurrentlyAtTop, isSwipingDown, nodeIsScrolling, scrollEngaged: gs.scrollEngaged, hasScrollableContent, currentPos: currentPos.toFixed(1), minY })
222
+
223
+ if (panHandles) {
224
+ // pan handles - disable scroll and move sheet
225
+ // when not at top: lock scroll to 0 (sheet is being dragged)
226
+ // when at top: lock at current position (handoff from scroll to pan)
227
+ const lockTo = isCurrentlyAtTop ? undefined : 0
228
+ scrollBridge.setScrollEnabled?.(false, lockTo)
229
+
230
+ // accumulate the delta for position calculation
231
+ gs.accumulatedOffset += deltaY
232
+ const newPosition = resisted(gs.startY + gs.accumulatedOffset, minY)
233
+
234
+ // update position
235
+ scrollBridge.paneY = newPosition
236
+ setAnimatedPosition(newPosition)
237
+ scrollBridge.setParentDragging(newPosition > minY)
238
+ } else {
239
+ // scroll handles - enable scroll so it can move freely
240
+ scrollBridge.setScrollEnabled?.(true)
241
+ // don't accumulate offset when scroll is handling
242
+ }
243
+ })
244
+ .onEnd((event: { velocityY: number }) => {
245
+ const { velocityY } = event
246
+ const currentPos = gs.startY + gs.accumulatedOffset
247
+
248
+ // console.warn('[RNGH-Pan] onEnd', { velocityY, currentPos, accumulatedOffset: gs.accumulatedOffset, scrollY: scrollBridge.y })
249
+
250
+ // clear scroll lock
251
+ scrollBridge.scrollLockY = undefined
252
+
253
+ // if sheet is at top and scroll is engaged, just stay at top
254
+ if (currentPos <= minY + AT_TOP_THRESHOLD && scrollBridge.y > 0) {
255
+ onEnd(0)
256
+ return
257
+ }
258
+
259
+ // find closest snap point using current position and velocity
260
+ const velocity = velocityY / 1000
261
+ const projectedEnd = currentPos + frameSize * velocity * 0.2
262
+
263
+ let closestPoint = 0
264
+ let minDist = Number.POSITIVE_INFINITY
265
+
266
+ for (let i = 0; i < positions.length; i++) {
267
+ const pos = positions[i]
268
+ const dist = Math.abs(projectedEnd - pos)
269
+ if (dist < minDist) {
270
+ minDist = dist
271
+ closestPoint = i
272
+ }
273
+ }
274
+
275
+ onEnd(closestPoint)
276
+ })
277
+ .onFinalize(() => {
278
+ // console.warn('[RNGH-Pan] onFinalize')
279
+ // clear scroll lock on finalize too (safety)
280
+ scrollBridge.scrollLockY = undefined
281
+ })
282
+ .runOnJS(true)
283
+
284
+ // if we have a scroll gesture ref, make pan simultaneous with it
285
+ // this allows both gestures to run and we decide in onChange who handles it
286
+ if (scrollGestureRef?.current) {
287
+ // console.warn('[RNGH-Pan] adding simultaneousWithExternalGesture for scroll')
288
+ return gesture.simultaneousWithExternalGesture(scrollGestureRef.current)
289
+ }
290
+
291
+ return gesture
292
+ }, [
293
+ gestureHandlerEnabled,
294
+ disableDrag,
295
+ isShowingInnerSheet,
296
+ frameSize,
297
+ positions,
298
+ scrollBridge,
299
+ getCurrentPosition,
300
+ resisted,
301
+ onStart,
302
+ onEnd,
303
+ setIsDragging,
304
+ setAnimatedPosition,
305
+ ])
306
+
307
+ return {
308
+ panGesture,
309
+ panGestureRef,
310
+ gestureHandlerEnabled,
311
+ }
312
+ }
@@ -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,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,11 @@
1
+ /**
2
+ * Re-export gesture state from @tamagui/native.
3
+ * Sheet uses this for backward compatibility with existing code.
4
+ */
5
+ import { type GestureState } from '@tamagui/native';
6
+ export type { GestureState as GestureHandlerState } from '@tamagui/native';
7
+ export declare function isGestureHandlerEnabled(): boolean;
8
+ export declare function getGestureHandlerState(): GestureState;
9
+ export declare function setGestureHandlerState(updates: Partial<GestureState>): void;
10
+ export declare const setGestureState: typeof setGestureHandlerState;
11
+ //# 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,EAAqB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEtE,YAAY,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAG1E,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,sBAAsB,IAAI,YAAY,CAErD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAE3E;AAGD,eAAO,MAAM,eAAe,+BAAyB,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,11 @@
1
+ /**
2
+ * Legacy setup - prefer `import '@tamagui/native/setup-gesture-handler'` instead.
3
+ */
4
+ export declare function isGestureHandlerEnabled(): boolean;
5
+ export interface SetupGestureHandlerConfig {
6
+ Gesture: any;
7
+ GestureDetector: any;
8
+ ScrollView?: any;
9
+ }
10
+ export declare function setupGestureHandler(config: SetupGestureHandlerConfig): void;
11
+ //# sourceMappingURL=setupGestureHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupGestureHandler.d.ts","sourceRoot":"","sources":["../src/setupGestureHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,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
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,CAqQ/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