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

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 (367) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +42 -31
  3. package/RNTrueSheet.podspec +10 -2
  4. package/android/build.gradle +2 -1
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +150 -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/TrueSheetPackage.kt +5 -4
  15. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
  16. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
  17. package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
  18. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
  19. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1217 -603
  20. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
  21. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
  22. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
  23. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
  24. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
  25. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
  26. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
  27. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
  28. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
  29. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
  30. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  31. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  32. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
  33. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  34. package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
  35. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
  36. package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
  37. package/android/src/main/jni/CMakeLists.txt +63 -0
  38. package/android/src/main/jni/TrueSheetSpec.h +19 -0
  39. package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
  40. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
  41. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
  42. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
  43. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
  44. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
  45. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
  46. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
  47. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
  48. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
  49. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
  50. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
  51. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
  52. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
  53. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
  54. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
  55. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
  56. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
  57. package/ios/TrueSheetContainerView.h +81 -6
  58. package/ios/TrueSheetContainerView.mm +275 -21
  59. package/ios/TrueSheetContentView.h +38 -1
  60. package/ios/TrueSheetContentView.mm +413 -43
  61. package/ios/TrueSheetFooterView.h +27 -2
  62. package/ios/TrueSheetFooterView.mm +141 -35
  63. package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
  64. package/ios/TrueSheetHeaderView.mm +64 -0
  65. package/ios/TrueSheetModule.mm +92 -5
  66. package/ios/TrueSheetPeekView.h +32 -0
  67. package/ios/TrueSheetPeekView.mm +99 -0
  68. package/ios/TrueSheetView.h +7 -15
  69. package/ios/TrueSheetView.mm +633 -215
  70. package/ios/TrueSheetViewController.h +84 -16
  71. package/ios/TrueSheetViewController.mm +1136 -333
  72. package/ios/core/RNScreensEventObserver.h +46 -0
  73. package/ios/core/RNScreensEventObserver.mm +280 -0
  74. package/ios/core/TrueSheetBlurView.h +27 -0
  75. package/ios/core/TrueSheetBlurView.mm +82 -0
  76. package/ios/core/TrueSheetDetentCalculator.h +107 -0
  77. package/ios/core/TrueSheetDetentCalculator.mm +197 -0
  78. package/ios/core/TrueSheetGrabberView.h +72 -0
  79. package/ios/core/TrueSheetGrabberView.mm +178 -0
  80. package/ios/core/TrueSheetKeyboardObserver.h +39 -0
  81. package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
  82. package/ios/events/TrueSheetDragEvents.h +39 -0
  83. package/ios/events/TrueSheetDragEvents.mm +62 -0
  84. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  85. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  86. package/ios/events/TrueSheetLifecycleEvents.h +40 -0
  87. package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
  88. package/ios/events/TrueSheetStateEvents.h +35 -0
  89. package/ios/events/TrueSheetStateEvents.mm +49 -0
  90. package/ios/tvos/TrueSheetStubs.mm +154 -0
  91. package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
  92. package/ios/utils/BlurUtil.mm +69 -0
  93. package/ios/utils/GestureUtil.h +7 -0
  94. package/ios/utils/GestureUtil.mm +12 -0
  95. package/ios/utils/PlatformUtil.h +15 -0
  96. package/ios/utils/UIView+FirstResponder.h +15 -0
  97. package/ios/utils/UIView+FirstResponder.mm +26 -0
  98. package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
  99. package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
  100. package/ios/utils/WindowUtil.mm +17 -1
  101. package/lib/module/TrueSheet.js +224 -64
  102. package/lib/module/TrueSheet.js.map +1 -1
  103. package/lib/module/TrueSheet.web.js +1201 -0
  104. package/lib/module/TrueSheet.web.js.map +1 -0
  105. package/lib/module/TrueSheetPeek.js +15 -0
  106. package/lib/module/TrueSheetPeek.js.map +1 -0
  107. package/lib/module/TrueSheetPeek.web.js +55 -0
  108. package/lib/module/TrueSheetPeek.web.js.map +1 -0
  109. package/lib/module/TrueSheetProvider.js +28 -0
  110. package/lib/module/TrueSheetProvider.js.map +1 -0
  111. package/lib/module/TrueSheetProvider.web.js +157 -0
  112. package/lib/module/TrueSheetProvider.web.js.map +1 -0
  113. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  114. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  115. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  116. package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  117. package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  118. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
  119. package/lib/module/index.js +3 -3
  120. package/lib/module/index.js.map +1 -1
  121. package/lib/module/mocks/index.js +93 -0
  122. package/lib/module/mocks/index.js.map +1 -0
  123. package/lib/module/mocks/navigation.js +85 -0
  124. package/lib/module/mocks/navigation.js.map +1 -0
  125. package/lib/module/mocks/reanimated.js +91 -0
  126. package/lib/module/mocks/reanimated.js.map +1 -0
  127. package/lib/module/navigation/TrueSheetRouter.js +170 -0
  128. package/lib/module/navigation/TrueSheetRouter.js.map +1 -0
  129. package/lib/module/navigation/TrueSheetView.js +71 -0
  130. package/lib/module/navigation/TrueSheetView.js.map +1 -0
  131. package/lib/module/navigation/createTrueSheetNavigator.js +63 -0
  132. package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -0
  133. package/lib/module/navigation/index.js +6 -0
  134. package/lib/module/navigation/index.js.map +1 -0
  135. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  136. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  137. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  138. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  139. package/lib/module/navigation/screen/index.js +5 -0
  140. package/lib/module/navigation/screen/index.js.map +1 -0
  141. package/lib/module/navigation/screen/types.js +4 -0
  142. package/lib/module/navigation/screen/types.js.map +1 -0
  143. package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
  144. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  145. package/lib/module/navigation/types.js +4 -0
  146. package/lib/module/navigation/types.js.map +1 -0
  147. package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
  148. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
  149. package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
  150. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  151. package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
  152. package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
  153. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  154. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  155. package/lib/module/reanimated/index.js +2 -2
  156. package/lib/module/reanimated/index.js.map +1 -1
  157. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
  158. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
  159. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
  160. package/lib/module/web/constants.js +16 -0
  161. package/lib/module/web/constants.js.map +1 -0
  162. package/lib/module/web/vaul/README.md +9 -0
  163. package/lib/module/web/vaul/browser.js +30 -0
  164. package/lib/module/web/vaul/browser.js.map +1 -0
  165. package/lib/module/web/vaul/constants.js +15 -0
  166. package/lib/module/web/vaul/constants.js.map +1 -0
  167. package/lib/module/web/vaul/context.js +59 -0
  168. package/lib/module/web/vaul/context.js.map +1 -0
  169. package/lib/module/web/vaul/helpers.js +93 -0
  170. package/lib/module/web/vaul/helpers.js.map +1 -0
  171. package/lib/module/web/vaul/index.js +1309 -0
  172. package/lib/module/web/vaul/index.js.map +1 -0
  173. package/lib/module/web/vaul/style.css +287 -0
  174. package/lib/module/web/vaul/style.css.d.js +2 -0
  175. package/lib/module/web/vaul/style.css.d.js.map +1 -0
  176. package/lib/module/web/vaul/types.js +2 -0
  177. package/lib/module/web/vaul/types.js.map +1 -0
  178. package/lib/module/web/vaul/use-composed-refs.js +34 -0
  179. package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
  180. package/lib/module/web/vaul/use-controllable-state.js +54 -0
  181. package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
  182. package/lib/module/web/vaul/use-position-fixed.js +123 -0
  183. package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
  184. package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
  185. package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
  186. package/lib/module/web/vaul/use-scale-background.js +57 -0
  187. package/lib/module/web/vaul/use-scale-background.js.map +1 -0
  188. package/lib/module/web/vaul/use-snap-points.js +305 -0
  189. package/lib/module/web/vaul/use-snap-points.js.map +1 -0
  190. package/lib/typescript/src/TrueSheet.d.ts +51 -14
  191. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  192. package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
  193. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  194. package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
  195. package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
  196. package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
  197. package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
  198. package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
  199. package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
  200. package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
  201. package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
  202. package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
  203. package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
  204. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
  205. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
  206. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
  207. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
  208. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
  209. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
  210. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
  211. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
  212. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
  213. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  214. package/lib/typescript/src/index.d.ts +2 -2
  215. package/lib/typescript/src/index.d.ts.map +1 -1
  216. package/lib/typescript/src/mocks/index.d.ts +43 -0
  217. package/lib/typescript/src/mocks/index.d.ts.map +1 -0
  218. package/lib/typescript/src/mocks/navigation.d.ts +66 -0
  219. package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
  220. package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
  221. package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
  222. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +57 -0
  223. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -0
  224. package/lib/typescript/src/navigation/TrueSheetView.d.ts +10 -0
  225. package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -0
  226. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +35 -0
  227. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -0
  228. package/lib/typescript/src/navigation/index.d.ts +6 -0
  229. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  230. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  231. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  232. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  233. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  234. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  235. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  236. package/lib/typescript/src/navigation/screen/types.d.ts +15 -0
  237. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  238. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
  239. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  240. package/lib/typescript/src/navigation/types.d.ts +153 -0
  241. package/lib/typescript/src/navigation/types.d.ts.map +1 -0
  242. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
  243. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
  244. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  245. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
  246. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
  247. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  248. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  249. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
  250. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
  251. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
  252. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
  253. package/lib/typescript/src/web/constants.d.ts +14 -0
  254. package/lib/typescript/src/web/constants.d.ts.map +1 -0
  255. package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
  256. package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
  257. package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
  258. package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
  259. package/lib/typescript/src/web/vaul/context.d.ts +53 -0
  260. package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
  261. package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
  262. package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
  263. package/lib/typescript/src/web/vaul/index.d.ts +228 -0
  264. package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
  265. package/lib/typescript/src/web/vaul/types.d.ts +7 -0
  266. package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
  267. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
  268. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
  269. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
  270. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
  271. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
  272. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
  273. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
  274. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
  275. package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
  276. package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
  277. package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
  278. package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
  279. package/package.json +78 -34
  280. package/react-native.config.js +9 -2
  281. package/src/TrueSheet.tsx +276 -60
  282. package/src/TrueSheet.types.ts +525 -71
  283. package/src/TrueSheet.web.tsx +1366 -0
  284. package/src/TrueSheetPeek.tsx +11 -0
  285. package/src/TrueSheetPeek.web.tsx +63 -0
  286. package/src/TrueSheetProvider.tsx +33 -0
  287. package/src/TrueSheetProvider.web.tsx +220 -0
  288. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  289. package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  290. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  291. package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  292. package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  293. package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
  294. package/src/index.ts +2 -2
  295. package/src/mocks/index.ts +89 -0
  296. package/src/mocks/navigation.ts +72 -0
  297. package/src/mocks/reanimated.ts +101 -0
  298. package/src/navigation/TrueSheetRouter.ts +234 -0
  299. package/src/navigation/TrueSheetView.tsx +99 -0
  300. package/src/navigation/createTrueSheetNavigator.tsx +93 -0
  301. package/src/navigation/index.ts +14 -0
  302. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  303. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  304. package/src/navigation/screen/index.ts +3 -0
  305. package/src/navigation/screen/types.ts +21 -0
  306. package/src/navigation/screen/useSheetScreenState.ts +107 -0
  307. package/src/navigation/types.ts +219 -0
  308. package/src/navigation/useTrueSheetNavigation.ts +26 -0
  309. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  310. package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
  311. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
  312. package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
  313. package/src/specs/NativeTrueSheetModule.ts +28 -3
  314. package/src/web/constants.ts +13 -0
  315. package/src/web/vaul/README.md +9 -0
  316. package/src/web/vaul/browser.ts +38 -0
  317. package/src/web/vaul/constants.ts +20 -0
  318. package/src/web/vaul/context.ts +101 -0
  319. package/src/web/vaul/helpers.ts +124 -0
  320. package/src/web/vaul/index.tsx +1740 -0
  321. package/src/web/vaul/style.css +287 -0
  322. package/src/web/vaul/style.css.d.ts +1 -0
  323. package/src/web/vaul/types.ts +7 -0
  324. package/src/web/vaul/use-composed-refs.ts +35 -0
  325. package/src/web/vaul/use-controllable-state.ts +66 -0
  326. package/src/web/vaul/use-position-fixed.ts +147 -0
  327. package/src/web/vaul/use-prevent-scroll.ts +309 -0
  328. package/src/web/vaul/use-scale-background.ts +64 -0
  329. package/src/web/vaul/use-snap-points.ts +455 -0
  330. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  331. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  332. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  333. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  334. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  335. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  336. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  337. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  338. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
  339. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  340. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  341. package/android/src/main/res/values/styles.xml +0 -8
  342. package/ios/events/OnDetentChangeEvent.h +0 -28
  343. package/ios/events/OnDetentChangeEvent.mm +0 -30
  344. package/ios/events/OnDidDismissEvent.mm +0 -25
  345. package/ios/events/OnDidPresentEvent.h +0 -28
  346. package/ios/events/OnDidPresentEvent.mm +0 -30
  347. package/ios/events/OnDragBeginEvent.h +0 -28
  348. package/ios/events/OnDragBeginEvent.mm +0 -30
  349. package/ios/events/OnDragChangeEvent.h +0 -28
  350. package/ios/events/OnDragChangeEvent.mm +0 -30
  351. package/ios/events/OnDragEndEvent.h +0 -28
  352. package/ios/events/OnDragEndEvent.mm +0 -30
  353. package/ios/events/OnMountEvent.mm +0 -25
  354. package/ios/events/OnPositionChangeEvent.mm +0 -32
  355. package/ios/events/OnSizeChangeEvent.h +0 -28
  356. package/ios/events/OnSizeChangeEvent.mm +0 -30
  357. package/ios/events/OnWillDismissEvent.mm +0 -25
  358. package/ios/events/OnWillPresentEvent.h +0 -28
  359. package/ios/events/OnWillPresentEvent.mm +0 -30
  360. package/ios/utils/LayoutUtil.h +0 -44
  361. package/ios/utils/LayoutUtil.mm +0 -50
  362. package/lib/module/TrueSheetGrabber.js +0 -51
  363. package/lib/module/TrueSheetGrabber.js.map +0 -1
  364. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  365. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  366. package/src/TrueSheetGrabber.tsx +0 -82
  367. package/src/__mocks__/index.js +0 -67
@@ -0,0 +1,72 @@
1
+ import type { ParamListBase } from '@react-navigation/native';
2
+
3
+ import type { TrueSheetNavigationProp } from '../navigation/types';
4
+
5
+ /**
6
+ * Mock createTrueSheetNavigator for testing.
7
+ * Import from '@lodev09/react-native-true-sheet/navigation/mock' in your test setup.
8
+ */
9
+ export const createTrueSheetNavigator = jest.fn(() => ({
10
+ Navigator: jest.fn(({ children }: { children: React.ReactNode }) => children),
11
+ Screen: jest.fn(() => null),
12
+ Group: jest.fn(() => null),
13
+ }));
14
+
15
+ /**
16
+ * Mock TrueSheetActions for testing.
17
+ */
18
+ export const TrueSheetActions = {
19
+ push: jest.fn((name: string, params?: object) => ({ type: 'PUSH', payload: { name, params } })),
20
+ pop: jest.fn((count?: number) => ({ type: 'POP', payload: { count } })),
21
+ popTo: jest.fn((name: string, params?: object) => ({
22
+ type: 'POP_TO',
23
+ payload: { name, params },
24
+ })),
25
+ popToTop: jest.fn(() => ({ type: 'POP_TO_TOP' })),
26
+ replace: jest.fn((name: string, params?: object) => ({
27
+ type: 'REPLACE',
28
+ payload: { name, params },
29
+ })),
30
+ resize: jest.fn((index: number) => ({ type: 'RESIZE', index })),
31
+ dismiss: jest.fn(() => ({ type: 'DISMISS' })),
32
+ remove: jest.fn(() => ({ type: 'REMOVE' })),
33
+ };
34
+
35
+ /**
36
+ * Mock useTrueSheetNavigation hook for testing.
37
+ */
38
+ export const useTrueSheetNavigation = jest.fn(
39
+ <T extends ParamListBase = ParamListBase>() =>
40
+ ({
41
+ navigate: jest.fn(),
42
+ goBack: jest.fn(),
43
+ reset: jest.fn(),
44
+ setParams: jest.fn(),
45
+ dispatch: jest.fn(),
46
+ isFocused: jest.fn(() => true),
47
+ canGoBack: jest.fn(() => true),
48
+ getId: jest.fn(),
49
+ getParent: jest.fn(),
50
+ getState: jest.fn(),
51
+ addListener: jest.fn(() => jest.fn()),
52
+ removeListener: jest.fn(),
53
+ setOptions: jest.fn(),
54
+ push: jest.fn(),
55
+ pop: jest.fn(),
56
+ popTo: jest.fn(),
57
+ popToTop: jest.fn(),
58
+ replace: jest.fn(),
59
+ resize: jest.fn(),
60
+ }) as unknown as TrueSheetNavigationProp<T>
61
+ );
62
+
63
+ export type { TrueSheetActionType } from '../navigation/TrueSheetRouter';
64
+ export type { DetentInfoEventPayload, PositionChangeEventPayload } from '../TrueSheet.types';
65
+ export type {
66
+ TrueSheetNavigationEventMap,
67
+ TrueSheetNavigationHelpers,
68
+ TrueSheetNavigationOptions,
69
+ TrueSheetNavigationProp,
70
+ TrueSheetNavigationState,
71
+ TrueSheetScreenProps,
72
+ } from '../navigation/types';
@@ -0,0 +1,101 @@
1
+ import React, { createElement, isValidElement, type ReactNode } from 'react';
2
+ import { View } from 'react-native';
3
+ import type { SharedValue } from 'react-native-reanimated';
4
+
5
+ import type { TrueSheetProps, PositionChangeEventPayload } from '../TrueSheet.types';
6
+
7
+ interface TrueSheetState {
8
+ shouldRenderNativeView: boolean;
9
+ }
10
+
11
+ interface MockReanimatedTrueSheetContextValue {
12
+ animatedPosition: SharedValue<number>;
13
+ animatedIndex: SharedValue<number>;
14
+ animatedDetent: SharedValue<number>;
15
+ }
16
+
17
+ const createMockSharedValue = <T>(initialValue: T): SharedValue<T> =>
18
+ ({
19
+ value: initialValue,
20
+ get: () => initialValue,
21
+ set: () => {},
22
+ addListener: () => () => {},
23
+ removeListener: () => {},
24
+ modify: () => {},
25
+ }) as unknown as SharedValue<T>;
26
+
27
+ /**
28
+ * Mock ReanimatedTrueSheet component for testing.
29
+ * Import from '@lodev09/react-native-true-sheet/reanimated/mock' in your test setup.
30
+ */
31
+ export class ReanimatedTrueSheet extends React.Component<TrueSheetProps, TrueSheetState> {
32
+ static instances: Record<string, ReanimatedTrueSheet> = {};
33
+
34
+ static dismiss = jest.fn((_name: string, _animated?: boolean) => Promise.resolve());
35
+ static dismissStack = jest.fn((_name: string, _animated?: boolean) => Promise.resolve());
36
+ static present = jest.fn((_name: string, _index?: number, _animated?: boolean) =>
37
+ Promise.resolve()
38
+ );
39
+ static resize = jest.fn((_name: string, _index: number) => Promise.resolve());
40
+
41
+ dismiss = jest.fn((_animated?: boolean) => Promise.resolve());
42
+ dismissStack = jest.fn((_animated?: boolean) => Promise.resolve());
43
+ present = jest.fn((_index?: number, _animated?: boolean) => Promise.resolve());
44
+ resize = jest.fn((_index: number) => Promise.resolve());
45
+
46
+ componentDidMount() {
47
+ const { name } = this.props;
48
+ if (name) {
49
+ ReanimatedTrueSheet.instances[name] = this;
50
+ }
51
+ }
52
+
53
+ componentWillUnmount() {
54
+ const { name } = this.props;
55
+ if (name) {
56
+ delete ReanimatedTrueSheet.instances[name];
57
+ }
58
+ }
59
+
60
+ private renderHeader(): ReactNode {
61
+ const { header } = this.props;
62
+ if (!header) return null;
63
+ return isValidElement(header) ? header : createElement(header);
64
+ }
65
+
66
+ private renderFooter(): ReactNode {
67
+ const { footer } = this.props;
68
+ if (!footer) return null;
69
+ return isValidElement(footer) ? footer : createElement(footer);
70
+ }
71
+
72
+ render() {
73
+ const { children, style } = this.props;
74
+ return React.createElement(View, { style }, this.renderHeader(), children, this.renderFooter());
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Mock ReanimatedTrueSheetProvider for testing.
80
+ */
81
+ export function ReanimatedTrueSheetProvider({ children }: { children: React.ReactNode }) {
82
+ return children;
83
+ }
84
+
85
+ /**
86
+ * Mock useReanimatedTrueSheet hook for testing.
87
+ */
88
+ export const useReanimatedTrueSheet = jest.fn(
89
+ (): MockReanimatedTrueSheetContextValue => ({
90
+ animatedPosition: createMockSharedValue(0),
91
+ animatedIndex: createMockSharedValue(-1),
92
+ animatedDetent: createMockSharedValue(0),
93
+ })
94
+ );
95
+
96
+ /**
97
+ * Mock useReanimatedPositionChangeHandler hook for testing.
98
+ */
99
+ export const useReanimatedPositionChangeHandler = jest.fn(
100
+ (_handler: (payload: PositionChangeEventPayload) => void, _dependencies?: unknown[]) => jest.fn()
101
+ );
@@ -0,0 +1,234 @@
1
+ import { nanoid } from 'nanoid/non-secure';
2
+ import {
3
+ type CommonActions,
4
+ type ParamListBase,
5
+ type Router,
6
+ StackRouter,
7
+ type StackActionType,
8
+ StackActions,
9
+ type StackRouterOptions,
10
+ } from '@react-navigation/core';
11
+
12
+ import type { TrueSheetNavigationState } from './types';
13
+
14
+ export type TrueSheetRouterOptions = StackRouterOptions;
15
+
16
+ export type TrueSheetActionType =
17
+ | StackActionType
18
+ | ReturnType<typeof CommonActions.goBack>
19
+ | {
20
+ type: 'RESIZE';
21
+ index: number;
22
+ source?: string;
23
+ target?: string;
24
+ }
25
+ | {
26
+ type: 'DISMISS';
27
+ source?: string;
28
+ target?: string;
29
+ }
30
+ | {
31
+ type: 'REMOVE';
32
+ source?: string;
33
+ target?: string;
34
+ };
35
+
36
+ export const TrueSheetActions = {
37
+ ...StackActions,
38
+ resize: (index: number): TrueSheetActionType => ({ type: 'RESIZE', index }),
39
+ dismiss: (): TrueSheetActionType => ({ type: 'DISMISS' }),
40
+ remove: (): TrueSheetActionType => ({ type: 'REMOVE' }),
41
+ };
42
+
43
+ const ensureBaseRoute = <T extends { routes: { name: string }[] }>(
44
+ state: T,
45
+ baseRouteName: string | undefined,
46
+ routeParamList: Record<string, object | undefined> | undefined
47
+ ): T & { index: number; routes: T['routes'] } => {
48
+ if (!baseRouteName) {
49
+ return state as T & { index: number; routes: T['routes'] };
50
+ }
51
+
52
+ const hasBaseRoute = state.routes.some((r) => r.name === baseRouteName);
53
+
54
+ if (!hasBaseRoute) {
55
+ const baseRoute = {
56
+ key: `${baseRouteName}-${nanoid()}`,
57
+ name: baseRouteName,
58
+ params: routeParamList?.[baseRouteName],
59
+ };
60
+
61
+ return {
62
+ ...state,
63
+ index: state.routes.length,
64
+ routes: [baseRoute, ...state.routes],
65
+ } as T & { index: number; routes: T['routes'] };
66
+ }
67
+
68
+ return state as T & { index: number; routes: T['routes'] };
69
+ };
70
+
71
+ export const TrueSheetRouter = (
72
+ routerOptions: StackRouterOptions
73
+ ): Router<TrueSheetNavigationState<ParamListBase>, TrueSheetActionType> => {
74
+ const baseRouter = StackRouter(routerOptions) as unknown as Router<
75
+ TrueSheetNavigationState<ParamListBase>,
76
+ TrueSheetActionType
77
+ >;
78
+
79
+ return {
80
+ ...baseRouter,
81
+ type: 'true-sheet',
82
+
83
+ getInitialState(options) {
84
+ const state = baseRouter.getInitialState(options);
85
+ const baseRouteName = routerOptions.initialRouteName ?? options.routeNames[0];
86
+ const stateWithBaseRoute = ensureBaseRoute(state, baseRouteName, options.routeParamList);
87
+
88
+ return {
89
+ ...stateWithBaseRoute,
90
+ stale: false,
91
+ type: 'true-sheet',
92
+ key: `true-sheet-${nanoid()}`,
93
+ };
94
+ },
95
+
96
+ getStateForAction(state, action, options) {
97
+ switch (action.type) {
98
+ case 'RESIZE': {
99
+ const routeIndex =
100
+ action.target === state.key && action.source
101
+ ? state.routes.findIndex((r) => r.key === action.source)
102
+ : state.index;
103
+
104
+ return {
105
+ ...state,
106
+ routes: state.routes.map((route, i) =>
107
+ i === routeIndex
108
+ ? {
109
+ ...route,
110
+ resizeIndex: action.index,
111
+ resizeKey: (route.resizeKey ?? 0) + 1,
112
+ }
113
+ : route
114
+ ),
115
+ };
116
+ }
117
+
118
+ case 'GO_BACK':
119
+ case 'DISMISS': {
120
+ return this.getStateForAction(state, StackActions.pop(1), options);
121
+ }
122
+
123
+ case 'POP': {
124
+ // Only base screen remains - let parent navigator handle it
125
+ if (state.routes.length <= 1) {
126
+ return null;
127
+ }
128
+
129
+ const count =
130
+ 'payload' in action && typeof action.payload?.count === 'number'
131
+ ? action.payload.count
132
+ : 1;
133
+
134
+ // Calculate how many routes we can actually pop (don't pop base screen)
135
+ const maxPopCount = state.routes.length - 1;
136
+ const actualCount = Math.min(count, maxPopCount);
137
+
138
+ // Base screen - let parent navigator handle it
139
+ if (actualCount <= 0) {
140
+ return null;
141
+ }
142
+
143
+ // Target index is the route we want to stay on (land on after pop)
144
+ // closingIndex is the first route to be dismissed (the one after target)
145
+ const targetIndex = state.routes.length - 1 - actualCount;
146
+ const closingIndex = targetIndex + 1;
147
+
148
+ // Mark only the bottom-most route to pop as closing
149
+ // The sheet's dismiss() will handle dismissing sheets above it first
150
+ return {
151
+ ...state,
152
+ index: closingIndex,
153
+ routes: state.routes.map((route, i) =>
154
+ i === closingIndex ? { ...route, closing: true } : route
155
+ ),
156
+ };
157
+ }
158
+
159
+ case 'POP_TO_TOP': {
160
+ const popCount = state.routes.length - 1;
161
+ return this.getStateForAction(state, StackActions.pop(popCount), options);
162
+ }
163
+
164
+ case 'POP_TO': {
165
+ const targetName =
166
+ 'payload' in action && typeof action.payload?.name === 'string'
167
+ ? action.payload.name
168
+ : null;
169
+
170
+ if (!targetName) {
171
+ return null;
172
+ }
173
+
174
+ const targetIndex = state.routes.findIndex((r) => r.name === targetName);
175
+
176
+ // Target not found or is the current route
177
+ if (targetIndex === -1 || targetIndex >= state.index) {
178
+ return null;
179
+ }
180
+
181
+ const popCount = state.routes.length - 1 - targetIndex;
182
+ return this.getStateForAction(state, StackActions.pop(popCount), options);
183
+ }
184
+
185
+ case 'REMOVE': {
186
+ // Actually remove the closing route and all routes above it
187
+ const routeKey = action.source;
188
+ const routeIndex = routeKey
189
+ ? state.routes.findIndex((r) => r.key === routeKey)
190
+ : state.routes.findIndex((r) => r.closing);
191
+
192
+ if (routeIndex === -1) {
193
+ return state;
194
+ }
195
+
196
+ // Remove the route and all routes above it (they were dismissed together)
197
+ const routes = state.routes.filter((_, i) => i < routeIndex);
198
+
199
+ return {
200
+ ...state,
201
+ index: Math.min(state.index, routes.length - 1),
202
+ routes,
203
+ };
204
+ }
205
+
206
+ default:
207
+ return baseRouter.getStateForAction(state, action, options);
208
+ }
209
+ },
210
+
211
+ getRehydratedState(partialState, { routeNames, routeParamList, routeGetIdList }) {
212
+ if (partialState.stale === false) {
213
+ return partialState;
214
+ }
215
+
216
+ const state = baseRouter.getRehydratedState(partialState, {
217
+ routeNames,
218
+ routeParamList,
219
+ routeGetIdList,
220
+ });
221
+
222
+ const baseRouteName = routerOptions.initialRouteName ?? routeNames[0];
223
+ const stateWithBaseRoute = ensureBaseRoute(state, baseRouteName, routeParamList);
224
+
225
+ return {
226
+ ...stateWithBaseRoute,
227
+ type: 'true-sheet',
228
+ key: `true-sheet-${nanoid()}`,
229
+ };
230
+ },
231
+
232
+ actionCreators: TrueSheetActions,
233
+ };
234
+ };
@@ -0,0 +1,99 @@
1
+ import type { ParamListBase } from '@react-navigation/core';
2
+
3
+ import type {
4
+ TrueSheetDescriptorMap,
5
+ TrueSheetNavigationHelpers,
6
+ TrueSheetNavigationState,
7
+ } from './types';
8
+ import { TrueSheetScreen, type TrueSheetScreenProps } from './screen';
9
+
10
+ let ReanimatedTrueSheetScreen: React.ComponentType<TrueSheetScreenProps> | null = null;
11
+
12
+ const getReanimatedScreen = (): React.ComponentType<TrueSheetScreenProps> => {
13
+ if (!ReanimatedTrueSheetScreen) {
14
+ ReanimatedTrueSheetScreen =
15
+ require('./screen/ReanimatedTrueSheetScreen').ReanimatedTrueSheetScreen;
16
+ }
17
+ return ReanimatedTrueSheetScreen!;
18
+ };
19
+
20
+ const DEFAULT_DETENTS: ('auto' | number)[] = ['auto'];
21
+
22
+ const clampDetentIndex = (index: number, detentsLength: number): number =>
23
+ Math.min(index, Math.max(detentsLength - 1, 0));
24
+
25
+ interface TrueSheetViewProps {
26
+ state: TrueSheetNavigationState<ParamListBase>;
27
+ navigation: TrueSheetNavigationHelpers;
28
+ descriptors: TrueSheetDescriptorMap;
29
+ }
30
+
31
+ export const TrueSheetView = ({ state, navigation, descriptors }: TrueSheetViewProps) => {
32
+ // First route is the base screen, rest are sheets
33
+ const [baseRoute, ...sheetRoutes] = state.routes;
34
+
35
+ const baseDescriptor = baseRoute ? descriptors[baseRoute.key] : null;
36
+
37
+ return (
38
+ <>
39
+ {/* Render base screen */}
40
+ {baseDescriptor?.render()}
41
+
42
+ {/* Render sheet screens */}
43
+ {sheetRoutes.map((route) => {
44
+ const descriptor = descriptors[route.key];
45
+
46
+ if (!descriptor) {
47
+ return null;
48
+ }
49
+
50
+ const { options, navigation: screenNavigation, render } = descriptor;
51
+ const {
52
+ detentIndex = 0,
53
+ detents = DEFAULT_DETENTS,
54
+ reanimated,
55
+ positionChangeHandler,
56
+ ...sheetProps
57
+ } = options;
58
+ const resolvedIndex = clampDetentIndex(route.resizeIndex ?? detentIndex, detents.length);
59
+
60
+ if (reanimated) {
61
+ const ReanimatedScreen = getReanimatedScreen();
62
+ return (
63
+ <ReanimatedScreen
64
+ key={route.key}
65
+ routeKey={route.key}
66
+ closing={route.closing}
67
+ detentIndex={resolvedIndex}
68
+ resizeKey={route.resizeKey}
69
+ detents={detents}
70
+ navigation={screenNavigation}
71
+ emit={navigation.emit}
72
+ positionChangeHandler={positionChangeHandler}
73
+ {...sheetProps}
74
+ >
75
+ {render()}
76
+ </ReanimatedScreen>
77
+ );
78
+ }
79
+
80
+ return (
81
+ <TrueSheetScreen
82
+ key={route.key}
83
+ routeKey={route.key}
84
+ closing={route.closing}
85
+ detentIndex={resolvedIndex}
86
+ resizeKey={route.resizeKey}
87
+ detents={detents}
88
+ navigation={screenNavigation}
89
+ emit={navigation.emit}
90
+ positionChangeHandler={positionChangeHandler}
91
+ {...sheetProps}
92
+ >
93
+ {render()}
94
+ </TrueSheetScreen>
95
+ );
96
+ })}
97
+ </>
98
+ );
99
+ };
@@ -0,0 +1,93 @@
1
+ import {
2
+ createNavigatorFactory,
3
+ type NavigatorTypeBagBase,
4
+ type ParamListBase,
5
+ type StaticConfig,
6
+ type TypedNavigator,
7
+ useNavigationBuilder,
8
+ } from '@react-navigation/core';
9
+
10
+ import { TrueSheetRouter, type TrueSheetRouterOptions } from './TrueSheetRouter';
11
+ import { TrueSheetView } from './TrueSheetView';
12
+ import type {
13
+ TrueSheetActionHelpers,
14
+ TrueSheetNavigationEventMap,
15
+ TrueSheetNavigationOptions,
16
+ TrueSheetNavigationProp,
17
+ TrueSheetNavigationState,
18
+ TrueSheetNavigatorProps,
19
+ } from './types';
20
+
21
+ const TrueSheetNavigator = ({
22
+ id,
23
+ initialRouteName,
24
+ children,
25
+ layout,
26
+ screenListeners,
27
+ screenOptions,
28
+ screenLayout,
29
+ }: TrueSheetNavigatorProps) => {
30
+ const { state, descriptors, navigation, NavigationContent } = useNavigationBuilder<
31
+ TrueSheetNavigationState<ParamListBase>,
32
+ TrueSheetRouterOptions,
33
+ TrueSheetActionHelpers<ParamListBase>,
34
+ TrueSheetNavigationOptions,
35
+ TrueSheetNavigationEventMap
36
+ >(TrueSheetRouter, {
37
+ id,
38
+ initialRouteName,
39
+ children,
40
+ layout,
41
+ screenListeners,
42
+ screenOptions,
43
+ screenLayout,
44
+ });
45
+
46
+ return (
47
+ <NavigationContent>
48
+ <TrueSheetView state={state} navigation={navigation} descriptors={descriptors} />
49
+ </NavigationContent>
50
+ );
51
+ };
52
+
53
+ /**
54
+ * Creates a TrueSheet navigator.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * const Sheet = createTrueSheetNavigator();
59
+ *
60
+ * function App() {
61
+ * return (
62
+ * <Sheet.Navigator>
63
+ * <Sheet.Screen name="Home" component={HomeScreen} />
64
+ * <Sheet.Screen
65
+ * name="Details"
66
+ * component={DetailsSheet}
67
+ * options={{ detents: [0.5, 1] }}
68
+ * />
69
+ * </Sheet.Navigator>
70
+ * );
71
+ * }
72
+ * ```
73
+ */
74
+ export const createTrueSheetNavigator = <
75
+ const ParamList extends ParamListBase,
76
+ const NavigatorID extends string | undefined = undefined,
77
+ const TypeBag extends NavigatorTypeBagBase = {
78
+ ParamList: ParamList;
79
+ NavigatorID: NavigatorID;
80
+ State: TrueSheetNavigationState<ParamList>;
81
+ ScreenOptions: TrueSheetNavigationOptions;
82
+ EventMap: TrueSheetNavigationEventMap;
83
+ NavigationList: {
84
+ [RouteName in keyof ParamList]: TrueSheetNavigationProp<ParamList, RouteName, NavigatorID>;
85
+ };
86
+ Navigator: typeof TrueSheetNavigator;
87
+ },
88
+ const Config extends StaticConfig<TypeBag> = StaticConfig<TypeBag>,
89
+ >(
90
+ config?: Config
91
+ ): TypedNavigator<TypeBag, Config> => {
92
+ return createNavigatorFactory(TrueSheetNavigator)(config);
93
+ };
@@ -0,0 +1,14 @@
1
+ export { createTrueSheetNavigator } from './createTrueSheetNavigator';
2
+ export { TrueSheetActions, type TrueSheetActionType } from './TrueSheetRouter';
3
+ export { useTrueSheetNavigation } from './useTrueSheetNavigation';
4
+
5
+ export type { DetentInfoEventPayload, PositionChangeEventPayload } from '../TrueSheet.types';
6
+
7
+ export type {
8
+ TrueSheetNavigationEventMap,
9
+ TrueSheetNavigationHelpers,
10
+ TrueSheetNavigationOptions,
11
+ TrueSheetNavigationProp,
12
+ TrueSheetNavigationState,
13
+ TrueSheetScreenProps,
14
+ } from './types';
@@ -0,0 +1,61 @@
1
+ import Animated from 'react-native-reanimated';
2
+ import { scheduleOnRN } from 'react-native-worklets';
3
+
4
+ import { useReanimatedPositionChangeHandler } from '../../reanimated';
5
+ import { TrueSheet } from '../../TrueSheet';
6
+ import type { PositionChangeEvent } from '../../TrueSheet.types';
7
+ import type { TrueSheetScreenProps } from './types';
8
+ import { useSheetScreenState } from './useSheetScreenState';
9
+
10
+ const AnimatedTrueSheet = Animated.createAnimatedComponent(TrueSheet);
11
+
12
+ export const ReanimatedTrueSheetScreen = ({
13
+ detentIndex,
14
+ resizeKey,
15
+ navigation,
16
+ emit,
17
+ routeKey,
18
+ closing,
19
+ detents,
20
+ children,
21
+ positionChangeHandler,
22
+ ...sheetProps
23
+ }: TrueSheetScreenProps) => {
24
+ const {
25
+ ref,
26
+ initialDetentIndex,
27
+ eventHandlers: { onPositionChange, ...eventHandlers },
28
+ } = useSheetScreenState({
29
+ detentIndex,
30
+ resizeKey,
31
+ closing,
32
+ navigation,
33
+ routeKey,
34
+ emit,
35
+ });
36
+
37
+ const reanimatedPositionChangeHandler = useReanimatedPositionChangeHandler(
38
+ (payload) => {
39
+ 'worklet';
40
+ positionChangeHandler?.(payload);
41
+ scheduleOnRN(onPositionChange, {
42
+ nativeEvent: payload,
43
+ } as PositionChangeEvent);
44
+ },
45
+ [onPositionChange, positionChangeHandler]
46
+ );
47
+
48
+ return (
49
+ <AnimatedTrueSheet
50
+ ref={ref}
51
+ name={`navigation-sheet-${routeKey}`}
52
+ initialDetentIndex={initialDetentIndex}
53
+ detents={detents}
54
+ onPositionChange={reanimatedPositionChangeHandler}
55
+ {...sheetProps}
56
+ {...eventHandlers}
57
+ >
58
+ {children}
59
+ </AnimatedTrueSheet>
60
+ );
61
+ };