@lodev09/react-native-true-sheet 4.0.0-beta.0 → 4.0.0-beta.10

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 (430) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +62 -30
  3. package/RNTrueSheet.podspec +10 -2
  4. package/android/build.gradle +24 -2
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +189 -47
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +401 -19
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +18 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +145 -21
  10. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
  11. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
  12. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
  13. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
  14. package/android/src/main/java/com/lodev09/truesheet/TrueSheetOverlayView.kt +106 -0
  15. package/android/src/main/java/com/lodev09/truesheet/TrueSheetOverlayViewManager.kt +45 -0
  16. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +6 -4
  17. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
  18. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
  19. package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +63 -0
  20. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +564 -226
  21. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1399 -598
  22. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +161 -29
  23. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
  24. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
  25. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
  26. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +375 -0
  27. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +299 -0
  28. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
  29. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
  30. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
  31. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetOverlayRootView.kt +137 -0
  32. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
  33. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  34. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  35. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +127 -0
  36. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  37. package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
  38. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
  39. package/android/src/main/java/com/lodev09/truesheet/utils/TouchEventDeduper.kt +31 -0
  40. package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +42 -0
  41. package/android/src/main/jni/CMakeLists.txt +63 -0
  42. package/android/src/main/jni/TrueSheetSpec.h +20 -0
  43. package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
  44. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +16 -0
  45. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +68 -0
  46. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +33 -0
  47. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
  48. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +39 -0
  49. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
  50. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +63 -0
  51. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
  52. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
  53. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
  54. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
  55. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
  56. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetLayoutUtils.h +46 -0
  57. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewComponentDescriptor.h +21 -0
  58. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.cpp +17 -0
  59. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.h +36 -0
  60. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
  61. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +30 -0
  62. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
  63. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
  64. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
  65. package/ios/TrueSheetContainerView.h +88 -6
  66. package/ios/TrueSheetContainerView.mm +278 -21
  67. package/ios/TrueSheetContentView.h +54 -1
  68. package/ios/TrueSheetContentView.mm +371 -47
  69. package/ios/TrueSheetFooterView.h +33 -2
  70. package/ios/TrueSheetFooterView.mm +187 -35
  71. package/ios/{events/OnWillDismissEvent.h → TrueSheetHeaderView.h} +10 -7
  72. package/ios/TrueSheetHeaderView.mm +64 -0
  73. package/ios/TrueSheetModule.h +2 -7
  74. package/ios/TrueSheetModule.mm +98 -20
  75. package/ios/TrueSheetOverlayView.h +32 -0
  76. package/ios/TrueSheetOverlayView.mm +161 -0
  77. package/ios/TrueSheetPeekView.h +32 -0
  78. package/ios/TrueSheetPeekView.mm +99 -0
  79. package/ios/TrueSheetView.h +7 -15
  80. package/ios/TrueSheetView.mm +775 -215
  81. package/ios/TrueSheetViewController.h +94 -16
  82. package/ios/TrueSheetViewController.mm +1316 -331
  83. package/ios/core/RNScreensEventObserver.h +46 -0
  84. package/ios/core/RNScreensEventObserver.mm +280 -0
  85. package/ios/core/TrueSheetBlurView.h +27 -0
  86. package/ios/core/TrueSheetBlurView.mm +82 -0
  87. package/ios/core/TrueSheetDetentCalculator.h +107 -0
  88. package/ios/core/TrueSheetDetentCalculator.mm +197 -0
  89. package/ios/core/TrueSheetGrabberView.h +72 -0
  90. package/ios/core/TrueSheetGrabberView.mm +188 -0
  91. package/ios/core/TrueSheetKeyboardObserver.h +39 -0
  92. package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
  93. package/ios/core/TrueSheetOverlayContainerView.h +31 -0
  94. package/ios/core/TrueSheetOverlayContainerView.mm +35 -0
  95. package/ios/events/TrueSheetDragEvents.h +39 -0
  96. package/ios/events/TrueSheetDragEvents.mm +62 -0
  97. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  98. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  99. package/ios/events/TrueSheetLifecycleEvents.h +42 -0
  100. package/ios/events/TrueSheetLifecycleEvents.mm +79 -0
  101. package/ios/events/TrueSheetStateEvents.h +35 -0
  102. package/ios/events/TrueSheetStateEvents.mm +49 -0
  103. package/ios/tvos/TrueSheetStubs.mm +166 -0
  104. package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
  105. package/ios/utils/BlurUtil.mm +69 -0
  106. package/ios/utils/GestureUtil.h +7 -0
  107. package/ios/utils/GestureUtil.mm +12 -0
  108. package/ios/utils/PlatformUtil.h +15 -0
  109. package/ios/utils/UIView+FirstResponder.h +15 -0
  110. package/ios/utils/UIView+FirstResponder.mm +26 -0
  111. package/ios/utils/UIView+ScrollEdgeInteraction.h +26 -0
  112. package/ios/utils/UIView+ScrollEdgeInteraction.mm +84 -0
  113. package/ios/utils/WindowUtil.mm +17 -1
  114. package/lib/module/TrueSheet.js +349 -74
  115. package/lib/module/TrueSheet.js.map +1 -1
  116. package/lib/module/TrueSheet.web.js +1270 -0
  117. package/lib/module/TrueSheet.web.js.map +1 -0
  118. package/lib/module/TrueSheetOverlay.js +30 -0
  119. package/lib/module/TrueSheetOverlay.js.map +1 -0
  120. package/lib/module/TrueSheetOverlay.web.js +35 -0
  121. package/lib/module/TrueSheetOverlay.web.js.map +1 -0
  122. package/lib/module/TrueSheetPeek.js +15 -0
  123. package/lib/module/TrueSheetPeek.js.map +1 -0
  124. package/lib/module/TrueSheetPeek.web.js +55 -0
  125. package/lib/module/TrueSheetPeek.web.js.map +1 -0
  126. package/lib/module/TrueSheetProvider.js +28 -0
  127. package/lib/module/TrueSheetProvider.js.map +1 -0
  128. package/lib/module/TrueSheetProvider.web.js +157 -0
  129. package/lib/module/TrueSheetProvider.web.js.map +1 -0
  130. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  131. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  132. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  133. package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  134. package/lib/module/fabric/TrueSheetOverlayViewNativeComponent.ts +12 -0
  135. package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  136. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +110 -18
  137. package/lib/module/index.js +4 -3
  138. package/lib/module/index.js.map +1 -1
  139. package/lib/module/mocks/index.js +103 -0
  140. package/lib/module/mocks/index.js.map +1 -0
  141. package/lib/module/mocks/navigation.js +95 -0
  142. package/lib/module/mocks/navigation.js.map +1 -0
  143. package/lib/module/mocks/navigationExpoRouter.js +21 -0
  144. package/lib/module/mocks/navigationExpoRouter.js.map +1 -0
  145. package/lib/module/mocks/reanimated.js +91 -0
  146. package/lib/module/mocks/reanimated.js.map +1 -0
  147. package/lib/module/navigation/TrueSheetNavigatorContent.js +73 -0
  148. package/lib/module/navigation/TrueSheetNavigatorContent.js.map +1 -0
  149. package/lib/module/navigation/actions.js +50 -0
  150. package/lib/module/navigation/actions.js.map +1 -0
  151. package/lib/module/navigation/base-types.js +2 -0
  152. package/lib/module/navigation/base-types.js.map +1 -0
  153. package/lib/module/navigation/createTrueSheetRouter.js +157 -0
  154. package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
  155. package/lib/module/navigation/expo-router/base-types.js +2 -0
  156. package/lib/module/navigation/expo-router/base-types.js.map +1 -0
  157. package/lib/module/navigation/expo-router/index.js +50 -0
  158. package/lib/module/navigation/expo-router/index.js.map +1 -0
  159. package/lib/module/navigation/expo-router/types.js +4 -0
  160. package/lib/module/navigation/expo-router/types.js.map +1 -0
  161. package/lib/module/navigation/index.js +47 -0
  162. package/lib/module/navigation/index.js.map +1 -0
  163. package/lib/module/navigation/navigator.js +10 -0
  164. package/lib/module/navigation/navigator.js.map +1 -0
  165. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  166. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  167. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  168. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  169. package/lib/module/navigation/screen/index.js +5 -0
  170. package/lib/module/navigation/screen/index.js.map +1 -0
  171. package/lib/module/navigation/screen/types.js +4 -0
  172. package/lib/module/navigation/screen/types.js.map +1 -0
  173. package/lib/module/navigation/screen/useSheetScreenState.js +69 -0
  174. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  175. package/lib/module/navigation/types.js +4 -0
  176. package/lib/module/navigation/types.js.map +1 -0
  177. package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
  178. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
  179. package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
  180. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  181. package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
  182. package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
  183. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  184. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  185. package/lib/module/reanimated/index.js +2 -2
  186. package/lib/module/reanimated/index.js.map +1 -1
  187. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
  188. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
  189. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
  190. package/lib/module/web/constants.js +16 -0
  191. package/lib/module/web/constants.js.map +1 -0
  192. package/lib/module/web/dom.js +10 -0
  193. package/lib/module/web/dom.js.map +1 -0
  194. package/lib/module/web/vaul/README.md +9 -0
  195. package/lib/module/web/vaul/browser.js +30 -0
  196. package/lib/module/web/vaul/browser.js.map +1 -0
  197. package/lib/module/web/vaul/constants.js +19 -0
  198. package/lib/module/web/vaul/constants.js.map +1 -0
  199. package/lib/module/web/vaul/context.js +59 -0
  200. package/lib/module/web/vaul/context.js.map +1 -0
  201. package/lib/module/web/vaul/helpers.js +99 -0
  202. package/lib/module/web/vaul/helpers.js.map +1 -0
  203. package/lib/module/web/vaul/index.js +1342 -0
  204. package/lib/module/web/vaul/index.js.map +1 -0
  205. package/lib/module/web/vaul/style.css +287 -0
  206. package/lib/module/web/vaul/style.css.d.js +2 -0
  207. package/lib/module/web/vaul/style.css.d.js.map +1 -0
  208. package/lib/module/web/vaul/types.js +2 -0
  209. package/lib/module/web/vaul/types.js.map +1 -0
  210. package/lib/module/web/vaul/use-composed-refs.js +34 -0
  211. package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
  212. package/lib/module/web/vaul/use-controllable-state.js +54 -0
  213. package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
  214. package/lib/module/web/vaul/use-position-fixed.js +123 -0
  215. package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
  216. package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
  217. package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
  218. package/lib/module/web/vaul/use-scale-background.js +57 -0
  219. package/lib/module/web/vaul/use-scale-background.js.map +1 -0
  220. package/lib/module/web/vaul/use-snap-points.js +305 -0
  221. package/lib/module/web/vaul/use-snap-points.js.map +1 -0
  222. package/lib/typescript/src/TrueSheet.d.ts +57 -14
  223. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  224. package/lib/typescript/src/TrueSheet.types.d.ts +535 -55
  225. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  226. package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
  227. package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
  228. package/lib/typescript/src/TrueSheetOverlay.d.ts +8 -0
  229. package/lib/typescript/src/TrueSheetOverlay.d.ts.map +1 -0
  230. package/lib/typescript/src/TrueSheetOverlay.web.d.ts +8 -0
  231. package/lib/typescript/src/TrueSheetOverlay.web.d.ts.map +1 -0
  232. package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
  233. package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
  234. package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
  235. package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
  236. package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
  237. package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
  238. package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
  239. package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
  240. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
  241. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
  242. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
  243. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
  244. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
  245. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
  246. package/lib/typescript/src/fabric/TrueSheetOverlayViewNativeComponent.d.ts +6 -0
  247. package/lib/typescript/src/fabric/TrueSheetOverlayViewNativeComponent.d.ts.map +1 -0
  248. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
  249. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
  250. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +71 -16
  251. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  252. package/lib/typescript/src/index.d.ts +3 -2
  253. package/lib/typescript/src/index.d.ts.map +1 -1
  254. package/lib/typescript/src/mocks/index.d.ts +47 -0
  255. package/lib/typescript/src/mocks/index.d.ts.map +1 -0
  256. package/lib/typescript/src/mocks/navigation.d.ts +70 -0
  257. package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
  258. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts +22 -0
  259. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts.map +1 -0
  260. package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
  261. package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
  262. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts +5 -0
  263. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts.map +1 -0
  264. package/lib/typescript/src/navigation/actions.d.ts +71 -0
  265. package/lib/typescript/src/navigation/actions.d.ts.map +1 -0
  266. package/lib/typescript/src/navigation/base-types.d.ts +9 -0
  267. package/lib/typescript/src/navigation/base-types.d.ts.map +1 -0
  268. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +3 -0
  269. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
  270. package/lib/typescript/src/navigation/expo-router/base-types.d.ts +8 -0
  271. package/lib/typescript/src/navigation/expo-router/base-types.d.ts.map +1 -0
  272. package/lib/typescript/src/navigation/expo-router/index.d.ts +37 -0
  273. package/lib/typescript/src/navigation/expo-router/index.d.ts.map +1 -0
  274. package/lib/typescript/src/navigation/expo-router/types.d.ts +44 -0
  275. package/lib/typescript/src/navigation/expo-router/types.d.ts.map +1 -0
  276. package/lib/typescript/src/navigation/index.d.ts +45 -0
  277. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  278. package/lib/typescript/src/navigation/navigator.d.ts +7 -0
  279. package/lib/typescript/src/navigation/navigator.d.ts.map +1 -0
  280. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  281. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  282. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  283. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  284. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  285. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  286. package/lib/typescript/src/navigation/screen/types.d.ts +14 -0
  287. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  288. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +34 -0
  289. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  290. package/lib/typescript/src/navigation/types.d.ts +213 -0
  291. package/lib/typescript/src/navigation/types.d.ts.map +1 -0
  292. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
  293. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
  294. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  295. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
  296. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
  297. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  298. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  299. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
  300. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
  301. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
  302. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
  303. package/lib/typescript/src/web/constants.d.ts +14 -0
  304. package/lib/typescript/src/web/constants.d.ts.map +1 -0
  305. package/lib/typescript/src/web/dom.d.ts +7 -0
  306. package/lib/typescript/src/web/dom.d.ts.map +1 -0
  307. package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
  308. package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
  309. package/lib/typescript/src/web/vaul/constants.d.ts +14 -0
  310. package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
  311. package/lib/typescript/src/web/vaul/context.d.ts +54 -0
  312. package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
  313. package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
  314. package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
  315. package/lib/typescript/src/web/vaul/index.d.ts +234 -0
  316. package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
  317. package/lib/typescript/src/web/vaul/types.d.ts +7 -0
  318. package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
  319. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
  320. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
  321. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
  322. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
  323. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
  324. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
  325. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
  326. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
  327. package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
  328. package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
  329. package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
  330. package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
  331. package/package.json +104 -37
  332. package/react-native.config.js +10 -2
  333. package/src/TrueSheet.tsx +424 -70
  334. package/src/TrueSheet.types.ts +602 -72
  335. package/src/TrueSheet.web.tsx +1437 -0
  336. package/src/TrueSheetOverlay.tsx +24 -0
  337. package/src/TrueSheetOverlay.web.tsx +33 -0
  338. package/src/TrueSheetPeek.tsx +11 -0
  339. package/src/TrueSheetPeek.web.tsx +64 -0
  340. package/src/TrueSheetProvider.tsx +33 -0
  341. package/src/TrueSheetProvider.web.tsx +220 -0
  342. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  343. package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  344. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  345. package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  346. package/src/fabric/TrueSheetOverlayViewNativeComponent.ts +12 -0
  347. package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  348. package/src/fabric/TrueSheetViewNativeComponent.ts +110 -18
  349. package/src/index.ts +3 -2
  350. package/src/mocks/index.ts +96 -0
  351. package/src/mocks/navigation.ts +79 -0
  352. package/src/mocks/navigationExpoRouter.ts +41 -0
  353. package/src/mocks/reanimated.ts +100 -0
  354. package/src/navigation/TrueSheetNavigatorContent.tsx +106 -0
  355. package/src/navigation/actions.ts +78 -0
  356. package/src/navigation/base-types.ts +20 -0
  357. package/src/navigation/createTrueSheetRouter.ts +194 -0
  358. package/src/navigation/expo-router/base-types.ts +18 -0
  359. package/src/navigation/expo-router/index.ts +90 -0
  360. package/src/navigation/expo-router/types.ts +116 -0
  361. package/src/navigation/index.ts +80 -0
  362. package/src/navigation/navigator.ts +18 -0
  363. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  364. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  365. package/src/navigation/screen/index.ts +3 -0
  366. package/src/navigation/screen/types.ts +19 -0
  367. package/src/navigation/screen/useSheetScreenState.ts +102 -0
  368. package/src/navigation/types.ts +302 -0
  369. package/src/navigation/useTrueSheetNavigation.ts +26 -0
  370. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  371. package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
  372. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
  373. package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
  374. package/src/specs/NativeTrueSheetModule.ts +28 -3
  375. package/src/web/constants.ts +13 -0
  376. package/src/web/dom.ts +9 -0
  377. package/src/web/vaul/README.md +9 -0
  378. package/src/web/vaul/browser.ts +38 -0
  379. package/src/web/vaul/constants.ts +24 -0
  380. package/src/web/vaul/context.ts +102 -0
  381. package/src/web/vaul/helpers.ts +131 -0
  382. package/src/web/vaul/index.tsx +1785 -0
  383. package/src/web/vaul/style.css +287 -0
  384. package/src/web/vaul/style.css.d.ts +1 -0
  385. package/src/web/vaul/types.ts +7 -0
  386. package/src/web/vaul/use-composed-refs.ts +35 -0
  387. package/src/web/vaul/use-controllable-state.ts +66 -0
  388. package/src/web/vaul/use-position-fixed.ts +147 -0
  389. package/src/web/vaul/use-prevent-scroll.ts +309 -0
  390. package/src/web/vaul/use-scale-background.ts +64 -0
  391. package/src/web/vaul/use-snap-points.ts +455 -0
  392. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  393. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  394. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  395. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  396. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  397. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  398. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  399. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  400. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
  401. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  402. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  403. package/android/src/main/res/values/styles.xml +0 -8
  404. package/ios/events/OnDetentChangeEvent.h +0 -28
  405. package/ios/events/OnDetentChangeEvent.mm +0 -30
  406. package/ios/events/OnDidDismissEvent.h +0 -26
  407. package/ios/events/OnDidDismissEvent.mm +0 -25
  408. package/ios/events/OnDidPresentEvent.h +0 -28
  409. package/ios/events/OnDidPresentEvent.mm +0 -30
  410. package/ios/events/OnDragBeginEvent.h +0 -28
  411. package/ios/events/OnDragBeginEvent.mm +0 -30
  412. package/ios/events/OnDragChangeEvent.h +0 -28
  413. package/ios/events/OnDragChangeEvent.mm +0 -30
  414. package/ios/events/OnDragEndEvent.h +0 -28
  415. package/ios/events/OnDragEndEvent.mm +0 -30
  416. package/ios/events/OnMountEvent.mm +0 -25
  417. package/ios/events/OnPositionChangeEvent.mm +0 -32
  418. package/ios/events/OnSizeChangeEvent.h +0 -28
  419. package/ios/events/OnSizeChangeEvent.mm +0 -30
  420. package/ios/events/OnWillDismissEvent.mm +0 -25
  421. package/ios/events/OnWillPresentEvent.h +0 -28
  422. package/ios/events/OnWillPresentEvent.mm +0 -30
  423. package/ios/utils/LayoutUtil.h +0 -44
  424. package/ios/utils/LayoutUtil.mm +0 -50
  425. package/lib/module/TrueSheetGrabber.js +0 -51
  426. package/lib/module/TrueSheetGrabber.js.map +0 -1
  427. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  428. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  429. package/src/TrueSheetGrabber.tsx +0 -82
  430. package/src/__mocks__/index.js +0 -67
@@ -0,0 +1,102 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
2
+
3
+ import { TrueSheet } from '../../TrueSheet';
4
+ import type {
5
+ DetentChangeEvent,
6
+ DetentInfoEventPayload,
7
+ DidBlurEvent,
8
+ DidFocusEvent,
9
+ DidPresentEvent,
10
+ DragBeginEvent,
11
+ DragChangeEvent,
12
+ DragEndEvent,
13
+ PositionChangeEvent,
14
+ PositionChangeEventPayload,
15
+ WillBlurEvent,
16
+ WillDismissEvent,
17
+ DismissAttemptEvent,
18
+ WillFocusEvent,
19
+ WillPresentEvent,
20
+ } from '../../TrueSheet.types';
21
+ import type { TrueSheetDispatch, TrueSheetEmitFn, TrueSheetNavigationEventMap } from '../types';
22
+ import { TrueSheetActions } from '../actions';
23
+
24
+ interface UseSheetScreenStateProps {
25
+ detentIndex: number;
26
+ resizeKey?: number;
27
+ closing?: boolean;
28
+ dispatch: TrueSheetDispatch;
29
+ routeKey: string;
30
+ emit: TrueSheetEmitFn;
31
+ }
32
+
33
+ export const useSheetScreenState = (props: UseSheetScreenStateProps) => {
34
+ const { detentIndex, resizeKey, closing, dispatch, routeKey, emit } = props;
35
+
36
+ const ref = useRef<TrueSheet>(null);
37
+ const isDismissedRef = useRef(false);
38
+ const isFirstRenderRef = useRef(true);
39
+ const initialDetentIndexRef = useRef(detentIndex);
40
+
41
+ useEffect(() => {
42
+ if (closing && !isDismissedRef.current) {
43
+ isDismissedRef.current = true;
44
+ ref.current?.dismiss();
45
+ }
46
+ }, [closing]);
47
+
48
+ useEffect(() => {
49
+ if (isFirstRenderRef.current) {
50
+ isFirstRenderRef.current = false;
51
+ return;
52
+ }
53
+ ref.current?.resize(detentIndex);
54
+ }, [detentIndex, resizeKey]);
55
+
56
+ const emitEvent = useCallback(
57
+ (
58
+ type: keyof TrueSheetNavigationEventMap,
59
+ data: DetentInfoEventPayload | PositionChangeEventPayload | undefined
60
+ ) => {
61
+ emit({
62
+ type,
63
+ target: routeKey,
64
+ data,
65
+ } as Parameters<TrueSheetEmitFn>[0]);
66
+ },
67
+ [emit, routeKey]
68
+ );
69
+
70
+ const onDidDismiss = useCallback(() => {
71
+ emitEvent('sheetDidDismiss', undefined);
72
+ isDismissedRef.current = true;
73
+ dispatch({ ...TrueSheetActions.remove(), source: routeKey });
74
+ }, [emitEvent, dispatch, routeKey]);
75
+
76
+ const eventHandlers = useMemo(
77
+ () => ({
78
+ onWillPresent: (e: WillPresentEvent) => emitEvent('sheetWillPresent', e.nativeEvent),
79
+ onDidPresent: (e: DidPresentEvent) => emitEvent('sheetDidPresent', e.nativeEvent),
80
+ onWillDismiss: (_e: WillDismissEvent) => emitEvent('sheetWillDismiss', undefined),
81
+ onDidDismiss,
82
+ onDismissAttempt: (_e: DismissAttemptEvent) => emitEvent('sheetDismissAttempt', undefined),
83
+ onDetentChange: (e: DetentChangeEvent) => emitEvent('sheetDetentChange', e.nativeEvent),
84
+ onDragBegin: (e: DragBeginEvent) => emitEvent('sheetDragBegin', e.nativeEvent),
85
+ onDragChange: (e: DragChangeEvent) => emitEvent('sheetDragChange', e.nativeEvent),
86
+ onDragEnd: (e: DragEndEvent) => emitEvent('sheetDragEnd', e.nativeEvent),
87
+ onPositionChange: (e: PositionChangeEvent) => emitEvent('sheetPositionChange', e.nativeEvent),
88
+ onWillFocus: (_e: WillFocusEvent) => emitEvent('sheetWillFocus', undefined),
89
+ onDidFocus: (_e: DidFocusEvent) => emitEvent('sheetDidFocus', undefined),
90
+ onWillBlur: (_e: WillBlurEvent) => emitEvent('sheetWillBlur', undefined),
91
+ onDidBlur: (_e: DidBlurEvent) => emitEvent('sheetDidBlur', undefined),
92
+ }),
93
+ [emitEvent, onDidDismiss]
94
+ );
95
+
96
+ return {
97
+ ref,
98
+ initialDetentIndex: initialDetentIndexRef.current,
99
+ emitEvent,
100
+ eventHandlers,
101
+ };
102
+ };
@@ -0,0 +1,302 @@
1
+ import type { NavigatorArgs } from 'standard-navigation';
2
+
3
+ import type {
4
+ DetentInfoEventPayload,
5
+ PositionChangeEventPayload,
6
+ TrueSheetProps,
7
+ } from '../TrueSheet.types';
8
+ import type { TrueSheetActionType } from './actions';
9
+ import type {
10
+ DefaultNavigatorOptions,
11
+ Descriptor,
12
+ NavigationAction,
13
+ NavigationHelpers,
14
+ NavigationProp,
15
+ NavigationState,
16
+ ParamListBase,
17
+ RouteProp,
18
+ Router,
19
+ StackActionHelpers,
20
+ StackRouterOptions,
21
+ } from './base-types';
22
+
23
+ export type PositionChangeHandler = (payload: PositionChangeEventPayload) => void;
24
+
25
+ export type TrueSheetNavigationEventMap = {
26
+ /**
27
+ * Event fired when the sheet is about to be presented.
28
+ */
29
+ sheetWillPresent: { data: DetentInfoEventPayload };
30
+ /**
31
+ * Event fired when the sheet has been presented.
32
+ */
33
+ sheetDidPresent: { data: DetentInfoEventPayload };
34
+ /**
35
+ * Event fired when the sheet is about to be dismissed.
36
+ */
37
+ sheetWillDismiss: { data: undefined };
38
+ /**
39
+ * Event fired when the sheet has been dismissed.
40
+ */
41
+ sheetDidDismiss: { data: undefined };
42
+ /**
43
+ * Event fired when the user tries to dismiss a non-dismissible sheet.
44
+ */
45
+ sheetDismissAttempt: { data: undefined };
46
+ /**
47
+ * Event fired when the sheet's detent changes.
48
+ */
49
+ sheetDetentChange: { data: DetentInfoEventPayload };
50
+ /**
51
+ * Event fired when the user starts dragging the sheet.
52
+ */
53
+ sheetDragBegin: { data: DetentInfoEventPayload };
54
+ /**
55
+ * Event fired while the user is dragging the sheet.
56
+ */
57
+ sheetDragChange: { data: DetentInfoEventPayload };
58
+ /**
59
+ * Event fired when the user stops dragging the sheet.
60
+ */
61
+ sheetDragEnd: { data: DetentInfoEventPayload };
62
+ /**
63
+ * Event fired when the sheet's position changes.
64
+ */
65
+ sheetPositionChange: { data: PositionChangeEventPayload };
66
+ /**
67
+ * Event fired when the sheet is about to regain focus.
68
+ */
69
+ sheetWillFocus: { data: undefined };
70
+ /**
71
+ * Event fired when the sheet regains focus.
72
+ */
73
+ sheetDidFocus: { data: undefined };
74
+ /**
75
+ * Event fired when the sheet is about to lose focus.
76
+ */
77
+ sheetWillBlur: { data: undefined };
78
+ /**
79
+ * Event fired when the sheet loses focus.
80
+ */
81
+ sheetDidBlur: { data: undefined };
82
+ };
83
+
84
+ /**
85
+ * A navigation state tagged as `true-sheet`, with the sheet fields the router
86
+ * adds to each route.
87
+ * Generic over the base state so each entry point can bind its own
88
+ * `NavigationState` — see `./base-types`.
89
+ */
90
+ export type TrueSheetStateOf<State extends { routes: readonly unknown[] }> = Omit<
91
+ State,
92
+ 'routes'
93
+ > & {
94
+ type: 'true-sheet';
95
+ routes: (State['routes'][number] & {
96
+ resizeIndex?: number;
97
+ resizeKey?: number;
98
+ closing?: boolean;
99
+ })[];
100
+ };
101
+
102
+ export type TrueSheetNavigationState<ParamList extends ParamListBase> = TrueSheetStateOf<
103
+ NavigationState<ParamList>
104
+ >;
105
+
106
+ export type TrueSheetRouterState = TrueSheetNavigationState<ParamListBase>;
107
+
108
+ export type TrueSheetRouterOptions = StackRouterOptions;
109
+
110
+ export type TrueSheetRouter = Router<TrueSheetRouterState, TrueSheetActionType>;
111
+
112
+ /**
113
+ * The wrapped router factory — also the shape `createTrueSheetRouter` accepts,
114
+ * pre-instantiated so either entry point's `StackRouterFactory` fits it.
115
+ */
116
+ export type TrueSheetRouterFactory = (options: TrueSheetRouterOptions) => TrueSheetRouter;
117
+
118
+ /**
119
+ * The base `StackRouter` factory to wrap, typed generically over the state and
120
+ * action types the wrapper threads through — `StackRouter` is structural and
121
+ * never touches the sheet-specific fields.
122
+ * Injected by each entry point so the shared router never imports
123
+ * `@react-navigation/*` at runtime (Expo Router apps don't install it).
124
+ */
125
+ export type StackRouterFactory = <
126
+ State extends NavigationState<ParamListBase>,
127
+ Action extends NavigationAction,
128
+ >(
129
+ options: TrueSheetRouterOptions
130
+ ) => Router<State, Action>;
131
+
132
+ /**
133
+ * `TrueSheetNavigationEventMap` in the `standard-navigation` event-map shape.
134
+ */
135
+ export type TrueSheetStandardEventMap = {
136
+ [K in keyof TrueSheetNavigationEventMap]: {
137
+ data: TrueSheetNavigationEventMap[K]['data'];
138
+ canPreventDefault: false;
139
+ };
140
+ };
141
+
142
+ export type TrueSheetRoute = TrueSheetNavigationState<ParamListBase>['routes'][number];
143
+
144
+ export type TrueSheetDispatch = (action: TrueSheetActionType) => void;
145
+
146
+ export type TrueSheetEmitFn = NavigatorArgs<
147
+ TrueSheetNavigationOptions,
148
+ TrueSheetStandardEventMap
149
+ >['emitter']['emit'];
150
+
151
+ /**
152
+ * Props injected into the navigator content by each adapter
153
+ * (React Navigation's `mapper` / Expo Router's `createProps`).
154
+ * Raw routes carry the custom fields (`closing`, `resizeIndex`, `resizeKey`)
155
+ * that the standard state strips out.
156
+ */
157
+ export interface TrueSheetNavigatorContentExtraProps {
158
+ routes: TrueSheetRoute[];
159
+ dispatch: TrueSheetDispatch;
160
+ }
161
+
162
+ /**
163
+ * Generic over the base helpers so each entry point can bind its own
164
+ * `StackActionHelpers` — see `./base-types`.
165
+ */
166
+ export type TrueSheetActionHelpersOf<Helpers> = Helpers & {
167
+ /**
168
+ * Resize the sheet to a specific detent index.
169
+ */
170
+ resize(index?: number): void;
171
+ };
172
+
173
+ export type TrueSheetActionHelpers<ParamList extends ParamListBase> = TrueSheetActionHelpersOf<
174
+ StackActionHelpers<ParamList>
175
+ >;
176
+
177
+ export type TrueSheetNavigationProp<
178
+ ParamList extends ParamListBase,
179
+ RouteName extends keyof ParamList = string,
180
+ NavigatorID extends string | undefined = undefined,
181
+ > = NavigationProp<
182
+ ParamList,
183
+ RouteName,
184
+ NavigatorID,
185
+ TrueSheetNavigationState<ParamList>,
186
+ TrueSheetNavigationOptions,
187
+ TrueSheetNavigationEventMap
188
+ > &
189
+ TrueSheetActionHelpers<ParamList>;
190
+
191
+ export type TrueSheetScreenProps<
192
+ ParamList extends ParamListBase,
193
+ RouteName extends keyof ParamList = string,
194
+ NavigatorID extends string | undefined = undefined,
195
+ > = {
196
+ navigation: TrueSheetNavigationProp<ParamList, RouteName, NavigatorID>;
197
+ route: RouteProp<ParamList, RouteName>;
198
+ };
199
+
200
+ export type TrueSheetNavigationHelpers = NavigationHelpers<
201
+ ParamListBase,
202
+ TrueSheetNavigationEventMap
203
+ >;
204
+
205
+ export type TrueSheetNavigationSheetProps = Pick<
206
+ TrueSheetProps,
207
+ | 'detents'
208
+ | 'backgroundColor'
209
+ | 'cornerRadius'
210
+ | 'dismissible'
211
+ | 'draggable'
212
+ | 'grabber'
213
+ | 'grabberOptions'
214
+ | 'accessibilityOptions'
215
+ | 'dimmed'
216
+ | 'dimmedDetentIndex'
217
+ | 'backgroundBlur'
218
+ | 'blurOptions'
219
+ | 'maxContentHeight'
220
+ | 'maxContentWidth'
221
+ | 'presentation'
222
+ | 'style'
223
+ | 'header'
224
+ | 'headerStyle'
225
+ | 'headerOptions'
226
+ | 'footer'
227
+ | 'footerStyle'
228
+ | 'footerOptions'
229
+ | 'scrollableRef'
230
+ | 'scrollableOptions'
231
+ | 'insetAdjustment'
232
+ | 'anchor'
233
+ | 'anchorOffset'
234
+ | 'elevation'
235
+ | 'detached'
236
+ | 'detachedOffset'
237
+ >;
238
+
239
+ /**
240
+ * Screen options for TrueSheet navigator screens.
241
+ */
242
+ export type TrueSheetNavigationOptions = TrueSheetNavigationSheetProps & {
243
+ /**
244
+ * The detent index to present at.
245
+ * @default 0
246
+ */
247
+ detentIndex?: number;
248
+
249
+ /**
250
+ * Use ReanimatedTrueSheet for this screen.
251
+ * Enables worklet-based `onPositionChange` events.
252
+ *
253
+ * @default false
254
+ */
255
+ reanimated?: boolean;
256
+
257
+ /**
258
+ * A callback that receives position change events.
259
+ * When `reanimated` is enabled, this must be a worklet function.
260
+ *
261
+ * @example
262
+ * ```tsx
263
+ * <Navigator.Screen
264
+ * name="Sheet"
265
+ * options={{
266
+ * reanimated: true,
267
+ * positionChangeHandler: (payload) => {
268
+ * 'worklet';
269
+ * animatedValue.value = payload.position;
270
+ * },
271
+ * }}
272
+ * />
273
+ * ```
274
+ */
275
+ positionChangeHandler?: PositionChangeHandler;
276
+ };
277
+
278
+ export type TrueSheetNavigatorProps = DefaultNavigatorOptions<
279
+ ParamListBase,
280
+ string | undefined,
281
+ TrueSheetNavigationState<ParamListBase>,
282
+ TrueSheetNavigationOptions,
283
+ TrueSheetNavigationEventMap,
284
+ unknown
285
+ > & {
286
+ /**
287
+ * The name of the route to use as the base screen.
288
+ * This screen will be rendered as a regular screen, while other screens are presented as sheets.
289
+ * Defaults to the first screen defined in the navigator.
290
+ */
291
+ initialRouteName?: string;
292
+ };
293
+
294
+ export type TrueSheetDescriptor = Descriptor<
295
+ TrueSheetNavigationOptions,
296
+ TrueSheetNavigationProp<ParamListBase>,
297
+ RouteProp<ParamListBase>
298
+ >;
299
+
300
+ export type TrueSheetDescriptorMap = {
301
+ [key: string]: TrueSheetDescriptor;
302
+ };
@@ -0,0 +1,26 @@
1
+ import { useNavigation, type ParamListBase } from '@react-navigation/native';
2
+
3
+ import type { TrueSheetNavigationProp } from './types';
4
+
5
+ /**
6
+ * Hook to access TrueSheet navigation with the resize helper.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * function MySheet() {
11
+ * const navigation = useTrueSheetNavigation();
12
+ *
13
+ * // Resize to a specific detent
14
+ * const handleExpand = () => {
15
+ * navigation.resize(1); // Resize to second detent
16
+ * };
17
+ *
18
+ * return (
19
+ * <Button title="Expand" onPress={handleExpand} />
20
+ * );
21
+ * }
22
+ * ```
23
+ */
24
+ export const useTrueSheetNavigation = <
25
+ T extends ParamListBase = ParamListBase,
26
+ >(): TrueSheetNavigationProp<T> => useNavigation<TrueSheetNavigationProp<T>>();
@@ -70,24 +70,29 @@ const AnimatedTrueSheet = Animated.createAnimatedComponent(TrueSheet);
70
70
  export const ReanimatedTrueSheet = forwardRef<TrueSheet, ReanimatedTrueSheetProps>((props, ref) => {
71
71
  const { onPositionChange, ...rest } = props;
72
72
 
73
- const { animatedPosition, animatedIndex } = useReanimatedTrueSheet();
73
+ const { animatedPosition, animatedIndex, animatedDetent } = useReanimatedTrueSheet();
74
74
 
75
75
  const positionChangeHandler = useReanimatedPositionChangeHandler((payload) => {
76
76
  'worklet';
77
77
 
78
- // When transitioning=true, we animate the position manually for smooth transitions.
79
- // This is used when native can't provide real-time position updates during animations.
80
- if (payload.transitioning) {
78
+ if (payload.realtime) {
79
+ // Update directly when we have real-time values (during drag or animation tracking)
80
+ animatedPosition.value = payload.position;
81
+ animatedIndex.value = payload.index;
82
+ animatedDetent.value = payload.detent;
83
+ } else {
84
+ // Animate position, index, and detent when not real-time
81
85
  if (Platform.OS === 'android') {
82
86
  animatedPosition.value = withTiming(payload.position, TIMING_CONFIG);
87
+ animatedIndex.value = withTiming(payload.index, TIMING_CONFIG);
88
+ animatedDetent.value = withTiming(payload.detent, TIMING_CONFIG);
83
89
  } else {
84
90
  animatedPosition.value = withSpring(payload.position, SPRING_CONFIG);
91
+ animatedIndex.value = withSpring(payload.index, SPRING_CONFIG);
92
+ animatedDetent.value = withSpring(payload.detent, SPRING_CONFIG);
85
93
  }
86
- } else {
87
- animatedPosition.value = payload.position;
88
94
  }
89
95
 
90
- animatedIndex.value = payload.index;
91
96
  onPositionChange?.({ nativeEvent: payload } as PositionChangeEvent);
92
97
  });
93
98
 
@@ -0,0 +1,75 @@
1
+ import { forwardRef, useEffect } from 'react';
2
+ import { useWindowDimensions } from 'react-native';
3
+
4
+ import { TrueSheet } from '../TrueSheet';
5
+ import type { TrueSheetProps, PositionChangeEvent } from '../TrueSheet.types';
6
+ import { useReanimatedTrueSheet } from './ReanimatedTrueSheetProvider';
7
+
8
+ interface ReanimatedTrueSheetProps extends TrueSheetProps {
9
+ /**
10
+ * Callback for position changes.
11
+ *
12
+ * @see {@link TrueSheetProps.onPositionChange}
13
+ */
14
+ onPositionChange?: TrueSheetProps['onPositionChange'];
15
+ }
16
+
17
+ /**
18
+ * Reanimated-enabled version of TrueSheet for web that automatically syncs
19
+ * position with the provider's shared value.
20
+ * Must be used within a ReanimatedTrueSheetProvider.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * import { ReanimatedTrueSheet, ReanimatedTrueSheetProvider } from '@lodev09/react-native-true-sheet/reanimated'
25
+ *
26
+ * function MyScreen() {
27
+ * const sheetRef = useRef<TrueSheet>(null)
28
+ *
29
+ * return (
30
+ * <ReanimatedTrueSheetProvider>
31
+ * <View>
32
+ * <ReanimatedTrueSheet
33
+ * ref={sheetRef}
34
+ * detents={[0.25, 0.5, 1]}
35
+ * initialDetentIndex={1}
36
+ * >
37
+ * <Text>Sheet Content</Text>
38
+ * </ReanimatedTrueSheet>
39
+ * </View>
40
+ * </ReanimatedTrueSheetProvider>
41
+ * )
42
+ * }
43
+ * ```
44
+ */
45
+ export const ReanimatedTrueSheet = forwardRef<TrueSheet, ReanimatedTrueSheetProps>((props, ref) => {
46
+ const { onPositionChange, detents = [0.5, 1], ...rest } = props;
47
+ const { height: windowHeight } = useWindowDimensions();
48
+
49
+ const { animatedPosition, animatedIndex, animatedDetent } = useReanimatedTrueSheet();
50
+
51
+ // Reset animated values when component unmounts
52
+ useEffect(() => {
53
+ return () => {
54
+ animatedPosition.value = windowHeight;
55
+ animatedIndex.value = -1;
56
+ animatedDetent.value = 0;
57
+ };
58
+ }, [windowHeight]);
59
+
60
+ const handlePositionChange = (event: PositionChangeEvent) => {
61
+ const { position, index, detent } = event.nativeEvent;
62
+
63
+ // Sync with provider's shared values
64
+ animatedPosition.value = position;
65
+ animatedIndex.value = index;
66
+ animatedDetent.value = detent;
67
+
68
+ // Call user's callback
69
+ onPositionChange?.(event);
70
+ };
71
+
72
+ return (
73
+ <TrueSheet ref={ref} detents={detents} onPositionChange={handlePositionChange} {...rest} />
74
+ );
75
+ });
@@ -4,13 +4,19 @@ import { useSharedValue, type SharedValue } from 'react-native-reanimated';
4
4
 
5
5
  export interface ReanimatedTrueSheetContextValue {
6
6
  /**
7
- * Shared value representing the current sheet position (Y offset from bottom)
7
+ * Shared value representing the current sheet position (Y offset from top of screen)
8
8
  */
9
9
  animatedPosition: SharedValue<number>;
10
10
  /**
11
- * Shared value representing the current detent index
11
+ * Shared value representing the current detent index as a continuous float.
12
+ * Interpolates smoothly between -1 (off-screen) and the target detent index.
12
13
  */
13
14
  animatedIndex: SharedValue<number>;
15
+ /**
16
+ * Shared value representing the current detent value (0-1 fraction of screen height).
17
+ * Interpolates smoothly between detent values as the sheet is dragged.
18
+ */
19
+ animatedDetent: SharedValue<number>;
14
20
  }
15
21
 
16
22
  const ReanimatedTrueSheetContext = createContext<ReanimatedTrueSheetContextValue | null>(null);
@@ -40,13 +46,11 @@ export const ReanimatedTrueSheetProvider = ({ children }: ReanimatedTrueSheetPro
40
46
  const { height } = useWindowDimensions();
41
47
  const animatedPosition = useSharedValue(height);
42
48
  const animatedIndex = useSharedValue(-1);
49
+ const animatedDetent = useSharedValue(0);
43
50
 
44
- const value = useMemo(
45
- () => ({
46
- animatedPosition,
47
- animatedIndex,
48
- }),
49
- [animatedPosition, animatedIndex]
51
+ const value = useMemo<ReanimatedTrueSheetContextValue>(
52
+ () => ({ animatedPosition, animatedIndex, animatedDetent }),
53
+ [animatedPosition, animatedIndex, animatedDetent]
50
54
  );
51
55
 
52
56
  return (
@@ -0,0 +1,31 @@
1
+ import { useCallback } from 'react';
2
+ import type { PositionChangeEvent, PositionChangeEventPayload } from '../TrueSheet.types';
3
+
4
+ type PositionChangeHandler = (
5
+ payload: PositionChangeEventPayload,
6
+ context: Record<string, unknown>
7
+ ) => void;
8
+
9
+ /**
10
+ * Web implementation of useReanimatedPositionChangeHandler.
11
+ *
12
+ * Returns a simple callback wrapper. The worklet directive is ignored on web
13
+ * since there's no native UI thread.
14
+ *
15
+ * @param handler - The position change handler function
16
+ * @param _dependencies - Unused on web, kept for API compatibility
17
+ * @returns An event handler compatible with onPositionChange prop
18
+ */
19
+ export const useReanimatedPositionChangeHandler = (
20
+ handler: PositionChangeHandler,
21
+ _dependencies: unknown[] = []
22
+ ) => {
23
+ const context: Record<string, unknown> = {};
24
+
25
+ return useCallback(
26
+ (event: PositionChangeEvent) => {
27
+ handler(event.nativeEvent, context);
28
+ },
29
+ [handler]
30
+ );
31
+ };
@@ -13,18 +13,29 @@ interface Spec extends TurboModule {
13
13
  * Present a sheet by reference
14
14
  * @param viewTag - Native view tag of the sheet component
15
15
  * @param index - Detent index to present at
16
+ * @param animated - Whether to animate the presentation
16
17
  * @returns Promise that resolves when sheet is fully presented
17
18
  * @throws PRESENT_FAILED if presentation fails
18
19
  */
19
- presentByRef(viewTag: number, index: number): Promise<void>;
20
+ presentByRef(viewTag: number, index: number, animated: boolean): Promise<void>;
20
21
 
21
22
  /**
22
- * Dismiss a sheet by reference
23
+ * Dismiss a sheet and all sheets presented on top of it
23
24
  * @param viewTag - Native view tag of the sheet component
25
+ * @param animated - Whether to animate the dismissal
24
26
  * @returns Promise that resolves when sheet is fully dismissed
25
27
  * @throws DISMISS_FAILED if dismissal fails
26
28
  */
27
- dismissByRef(viewTag: number): Promise<void>;
29
+ dismissByRef(viewTag: number, animated: boolean): Promise<void>;
30
+
31
+ /**
32
+ * Dismiss only the sheets presented on top of this sheet, keeping this sheet presented
33
+ * @param viewTag - Native view tag of the sheet component
34
+ * @param animated - Whether to animate the dismissal
35
+ * @returns Promise that resolves when all child sheets are fully dismissed
36
+ * @throws DISMISS_FAILED if dismissal fails
37
+ */
38
+ dismissStackByRef(viewTag: number, animated: boolean): Promise<void>;
28
39
 
29
40
  /**
30
41
  * Resize a sheet to a different index by reference
@@ -33,6 +44,20 @@ interface Spec extends TurboModule {
33
44
  * @returns Promise that resolves when resize is complete
34
45
  */
35
46
  resizeByRef(viewTag: number, index: number): Promise<void>;
47
+
48
+ /**
49
+ * Dismiss all presented sheets
50
+ * @param animated - Whether to animate the dismissals
51
+ * @returns Promise that resolves when all sheets are dismissed
52
+ */
53
+ dismissAll(animated: boolean): Promise<void>;
54
+
55
+ /**
56
+ * Handle back press for a sheet (Android only)
57
+ * Dismisses or collapses to the lowest detent natively
58
+ * @param viewTag - Native view tag of the sheet component
59
+ */
60
+ handleBackPress(viewTag: number): Promise<void>;
36
61
  }
37
62
 
38
63
  export default TurboModuleRegistry.get<Spec>('TrueSheetModule');
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_CORNER_RADIUS = 16;
2
+ export const DEFAULT_MAX_WIDTH = 640;
3
+ export const DEFAULT_FORM_SHEET_WIDTH = 580;
4
+ export const DEFAULT_FORM_SHEET_HEIGHT_RATIO = 0.5;
5
+ export const COLOR_SURFACE_CONTAINER_LOW_LIGHT = '#F7F2FA';
6
+ export const COLOR_SURFACE_CONTAINER_LOW_DARK = '#1D1B20';
7
+ export const DEFAULT_ANCHOR_OFFSET = 16;
8
+ export const DEFAULT_DETACHED_OFFSET = 16;
9
+ export const DEFAULT_GRABBER_COLOR_LIGHT = 'rgba(0, 0, 0, 0.3)';
10
+ export const DEFAULT_GRABBER_COLOR_DARK = 'rgba(255, 255, 255, 0.3)';
11
+ export const DEFAULT_GRABBER_WIDTH = 32;
12
+ export const DEFAULT_GRABBER_HEIGHT = 4;
13
+ export const DEFAULT_GRABBER_TOP_MARGIN = 8;
package/src/web/dom.ts ADDED
@@ -0,0 +1,9 @@
1
+ /// <reference lib="dom" />
2
+ import type { View } from 'react-native';
3
+
4
+ /**
5
+ * Resolves a React Native web `View` ref value to its underlying DOM element —
6
+ * RN-web refs expose the host DOM node directly.
7
+ */
8
+ export const getDOMElement = (view: View | null): HTMLElement | null =>
9
+ view instanceof HTMLElement ? view : null;