@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
@@ -1,8 +1,12 @@
1
1
  package com.lodev09.truesheet
2
2
 
3
3
  import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.PointerEvents
5
+ import com.facebook.react.uimanager.ReactStylesDiffMap
6
+ import com.facebook.react.uimanager.StateWrapper
4
7
  import com.facebook.react.uimanager.ThemedReactContext
5
8
  import com.facebook.react.uimanager.ViewGroupManager
9
+ import com.facebook.react.uimanager.annotations.ReactProp
6
10
 
7
11
  /**
8
12
  * ViewManager for TrueSheetFooterView
@@ -15,6 +19,16 @@ class TrueSheetFooterViewManager : ViewGroupManager<TrueSheetFooterView>() {
15
19
 
16
20
  override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetFooterView = TrueSheetFooterView(reactContext)
17
21
 
22
+ override fun updateState(view: TrueSheetFooterView, props: ReactStylesDiffMap?, stateWrapper: StateWrapper?): Any? {
23
+ view.stateWrapper = stateWrapper
24
+ return null
25
+ }
26
+
27
+ @ReactProp(name = "pointerEvents")
28
+ fun setPointerEvents(view: TrueSheetFooterView, pointerEventsStr: String?) {
29
+ view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
30
+ }
31
+
18
32
  companion object {
19
33
  const val REACT_CLASS = "TrueSheetFooterView"
20
34
  }
@@ -0,0 +1,38 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import android.annotation.SuppressLint
4
+ import com.facebook.react.uimanager.ThemedReactContext
5
+ import com.facebook.react.views.view.ReactViewGroup
6
+
7
+ /**
8
+ * Delegate interface for header view size changes
9
+ */
10
+ interface TrueSheetHeaderViewDelegate {
11
+ fun headerViewDidChangeSize(width: Int, height: Int)
12
+ }
13
+
14
+ /**
15
+ * Header view that holds the header content
16
+ * Positioned at the top of the sheet content area
17
+ */
18
+ @SuppressLint("ViewConstructor")
19
+ class TrueSheetHeaderView(context: ThemedReactContext) : ReactViewGroup(context) {
20
+ var delegate: TrueSheetHeaderViewDelegate? = null
21
+
22
+ private var lastWidth = 0
23
+ private var lastHeight = 0
24
+
25
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
26
+ super.onSizeChanged(w, h, oldw, oldh)
27
+
28
+ if (w != lastWidth || h != lastHeight) {
29
+ lastWidth = w
30
+ lastHeight = h
31
+ delegate?.headerViewDidChangeSize(w, h)
32
+ }
33
+ }
34
+
35
+ companion object {
36
+ const val TAG_NAME = "TrueSheet"
37
+ }
38
+ }
@@ -0,0 +1,28 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.PointerEvents
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.uimanager.ViewGroupManager
7
+ import com.facebook.react.uimanager.annotations.ReactProp
8
+
9
+ /**
10
+ * ViewManager for TrueSheetHeaderView
11
+ * Manages the header area of the sheet
12
+ */
13
+ @ReactModule(name = TrueSheetHeaderViewManager.REACT_CLASS)
14
+ class TrueSheetHeaderViewManager : ViewGroupManager<TrueSheetHeaderView>() {
15
+
16
+ override fun getName(): String = REACT_CLASS
17
+
18
+ override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetHeaderView = TrueSheetHeaderView(reactContext)
19
+
20
+ @ReactProp(name = "pointerEvents")
21
+ fun setPointerEvents(view: TrueSheetHeaderView, pointerEventsStr: String?) {
22
+ view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
23
+ }
24
+
25
+ companion object {
26
+ const val REACT_CLASS = "TrueSheetHeaderView"
27
+ }
28
+ }
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.ReactMethod
8
8
  import com.facebook.react.module.annotations.ReactModule
9
9
  import com.facebook.react.turbomodule.core.interfaces.TurboModule
10
10
  import com.facebook.react.uimanager.UIManagerHelper
11
+ import com.lodev09.truesheet.core.TrueSheetStackManager
11
12
  import java.util.concurrent.ConcurrentHashMap
12
13
 
13
14
  /**
@@ -21,16 +22,13 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
21
22
 
22
23
  override fun getName(): String = NAME
23
24
 
24
- override fun initialize() {
25
- super.initialize()
26
- }
27
-
28
25
  override fun invalidate() {
29
26
  super.invalidate()
30
- // Clear all registered views on module invalidation
27
+ // Clear all registered views and observer on module invalidation
31
28
  synchronized(viewRegistry) {
32
29
  viewRegistry.clear()
33
30
  }
31
+ TrueSheetStackManager.clear()
34
32
  }
35
33
 
36
34
  /**
@@ -44,19 +42,19 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
44
42
  * @throws OPERATION_FAILED if the operation fails for any other reason
45
43
  */
46
44
  @ReactMethod
47
- fun presentByRef(viewTag: Double, index: Double, promise: Promise) {
45
+ fun presentByRef(viewTag: Double, index: Double, animated: Boolean, promise: Promise) {
48
46
  val tag = viewTag.toInt()
49
47
  val detentIndex = index.toInt()
50
48
 
51
49
  withTrueSheetView(tag, promise) { view ->
52
- view.present(detentIndex) {
50
+ view.present(detentIndex, animated) {
53
51
  promise.resolve(null)
54
52
  }
55
53
  }
56
54
  }
57
55
 
58
56
  /**
59
- * Dismiss a sheet by reference
57
+ * Dismiss a sheet and all sheets presented on top of it
60
58
  *
61
59
  * @param viewTag Native view tag of the sheet component
62
60
  * @param promise Promise that resolves when sheet is fully dismissed
@@ -65,11 +63,31 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
65
63
  * @throws OPERATION_FAILED if the operation fails for any other reason
66
64
  */
67
65
  @ReactMethod
68
- fun dismissByRef(viewTag: Double, promise: Promise) {
66
+ fun dismissByRef(viewTag: Double, animated: Boolean, promise: Promise) {
69
67
  val tag = viewTag.toInt()
70
68
 
71
69
  withTrueSheetView(tag, promise) { view ->
72
- view.dismiss {
70
+ view.dismiss(animated) {
71
+ promise.resolve(null)
72
+ }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Dismiss only the sheets presented on top of this sheet, keeping this sheet presented
78
+ *
79
+ * @param viewTag Native view tag of the sheet component
80
+ * @param promise Promise that resolves when all child sheets are fully dismissed
81
+ * @throws VIEW_NOT_FOUND if the view with the given tag is not found
82
+ * @throws INVALID_VIEW_TYPE if the view is not a TrueSheetView
83
+ * @throws OPERATION_FAILED if the operation fails for any other reason
84
+ */
85
+ @ReactMethod
86
+ fun dismissStackByRef(viewTag: Double, animated: Boolean, promise: Promise) {
87
+ val tag = viewTag.toInt()
88
+
89
+ withTrueSheetView(tag, promise) { view ->
90
+ view.dismissStack(animated) {
73
91
  promise.resolve(null)
74
92
  }
75
93
  }
@@ -87,8 +105,49 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
87
105
  */
88
106
  @ReactMethod
89
107
  fun resizeByRef(viewTag: Double, index: Double, promise: Promise) {
90
- // Resize is just an alias for present
91
- presentByRef(viewTag, index, promise)
108
+ val tag = viewTag.toInt()
109
+ val detentIndex = index.toInt()
110
+
111
+ withTrueSheetView(tag, promise) { view ->
112
+ view.resize(detentIndex) {
113
+ promise.resolve(null)
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Dismiss all presented sheets by dismissing from the bottom of the stack
120
+ *
121
+ * @param animated Whether to animate the dismissals
122
+ * @param promise Promise that resolves when all sheets are dismissed
123
+ */
124
+ @ReactMethod
125
+ fun dismissAll(animated: Boolean, promise: Promise) {
126
+ Handler(Looper.getMainLooper()).post {
127
+ try {
128
+ val rootSheet = TrueSheetStackManager.getRootSheet()
129
+ if (rootSheet == null) {
130
+ promise.resolve(null)
131
+ return@post
132
+ }
133
+
134
+ rootSheet.dismiss(animated) {
135
+ promise.resolve(null)
136
+ }
137
+ } catch (e: Exception) {
138
+ promise.reject("OPERATION_FAILED", "Failed to dismiss all sheets: ${e.message}", e)
139
+ }
140
+ }
141
+ }
142
+
143
+ @ReactMethod
144
+ fun handleBackPress(viewTag: Double, promise: Promise) {
145
+ val tag = viewTag.toInt()
146
+
147
+ withTrueSheetView(tag, promise) { view ->
148
+ view.handleBackPress()
149
+ promise.resolve(null)
150
+ }
92
151
  }
93
152
 
94
153
  /**
@@ -98,29 +157,30 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
98
157
  Handler(Looper.getMainLooper()).post {
99
158
  try {
100
159
  // First try to get from registry (faster)
101
- val view = getSheetByTag(tag)
160
+ var view = getSheetByTag(tag)
102
161
 
103
- if (view != null) {
104
- closure(view)
105
- } else {
106
- // Fallback to UIManager resolution
162
+ // Fallback to UIManager resolution
163
+ if (view == null) {
107
164
  val manager = UIManagerHelper.getUIManagerForReactTag(reactApplicationContext, tag)
108
165
  val resolvedView = manager?.resolveView(tag)
109
166
 
110
- if (resolvedView == null) {
111
- promise.reject("VIEW_NOT_FOUND", "TrueSheetView with tag $tag not found")
112
- return@post
113
- }
114
-
115
167
  if (resolvedView is TrueSheetView) {
116
- closure(resolvedView)
117
- } else {
168
+ view = resolvedView
169
+ } else if (resolvedView != null) {
118
170
  promise.reject(
119
171
  "INVALID_VIEW_TYPE",
120
172
  "View with tag $tag is not a TrueSheetView (got ${resolvedView::class.simpleName})"
121
173
  )
174
+ return@post
122
175
  }
123
176
  }
177
+
178
+ if (view == null) {
179
+ promise.reject("VIEW_NOT_FOUND", "TrueSheetView with tag $tag not found")
180
+ return@post
181
+ }
182
+
183
+ closure(view)
124
184
  } catch (e: Exception) {
125
185
  promise.reject("OPERATION_FAILED", "Failed to execute operation: ${e.message}", e)
126
186
  }
@@ -0,0 +1,106 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import android.view.accessibility.AccessibilityEvent
7
+ import com.facebook.react.uimanager.StateWrapper
8
+ import com.facebook.react.uimanager.ThemedReactContext
9
+ import com.facebook.react.uimanager.events.EventDispatcher
10
+ import com.facebook.react.views.view.ReactViewGroup
11
+ import com.lodev09.truesheet.core.TrueSheetOverlayRootView
12
+ import com.lodev09.truesheet.core.TrueSheetOverlayRootViewDelegate
13
+ import com.lodev09.truesheet.utils.findRootContainerView
14
+
15
+ /**
16
+ * Hidden host that renders its children in a root view attached to the
17
+ * activity's content view, above every presented sheet.
18
+ */
19
+ @SuppressLint("ViewConstructor")
20
+ class TrueSheetOverlayView(private val reactContext: ThemedReactContext) :
21
+ ReactViewGroup(reactContext),
22
+ TrueSheetOverlayRootViewDelegate {
23
+
24
+ private val rootView = TrueSheetOverlayRootView(reactContext).apply {
25
+ delegate = this@TrueSheetOverlayView
26
+ }
27
+
28
+ private var rootContainerView: ViewGroup? = null
29
+
30
+ override var eventDispatcher: EventDispatcher? = null
31
+
32
+ private var lastWidth = 0
33
+ private var lastHeight = 0
34
+
35
+ var stateWrapper: StateWrapper? = null
36
+ set(value) {
37
+ field = value
38
+ pushState()
39
+ }
40
+
41
+ init {
42
+ // The host stays in the React tree for layout only — children render in the root view
43
+ visibility = GONE
44
+ }
45
+
46
+ // ==================== View Hierarchy Management ====================
47
+
48
+ override fun onAttachedToWindow() {
49
+ super.onAttachedToWindow()
50
+ attachRootView()
51
+ }
52
+
53
+ override fun onDetachedFromWindow() {
54
+ detachRootView()
55
+ super.onDetachedFromWindow()
56
+ }
57
+
58
+ private fun attachRootView() {
59
+ if (rootView.parent != null) return
60
+
61
+ val container = findRootContainerView(reactContext) ?: return
62
+ container.addView(rootView)
63
+ rootContainerView = container
64
+ }
65
+
66
+ private fun detachRootView() {
67
+ rootContainerView?.removeView(rootView)
68
+ rootContainerView = null
69
+ }
70
+
71
+ fun onDropInstance() {
72
+ detachRootView()
73
+ rootView.delegate = null
74
+ }
75
+
76
+ override fun addView(child: View?, index: Int) {
77
+ rootView.addView(child, index)
78
+ }
79
+
80
+ override fun getChildCount(): Int = rootView.childCount
81
+
82
+ override fun getChildAt(index: Int): View? = rootView.getChildAt(index)
83
+
84
+ override fun removeViewAt(index: Int) {
85
+ rootView.removeViewAt(index)
86
+ }
87
+
88
+ // Accessibility: children live in the root view since this view is hidden
89
+ override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {}
90
+ override fun dispatchPopulateAccessibilityEvent(event: AccessibilityEvent): Boolean = false
91
+
92
+ // ==================== State ====================
93
+
94
+ override fun overlayRootViewDidChangeSize(width: Int, height: Int) {
95
+ if (width == lastWidth && height == lastHeight) return
96
+
97
+ lastWidth = width
98
+ lastHeight = height
99
+ pushState()
100
+ }
101
+
102
+ private fun pushState() {
103
+ if (lastWidth == 0 && lastHeight == 0) return
104
+ stateWrapper?.let { TrueSheetStateUpdater.updateContainerSize(it, lastWidth, lastHeight) }
105
+ }
106
+ }
@@ -0,0 +1,45 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.PointerEvents
5
+ import com.facebook.react.uimanager.ReactStylesDiffMap
6
+ import com.facebook.react.uimanager.StateWrapper
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.UIManagerHelper
9
+ import com.facebook.react.uimanager.ViewGroupManager
10
+ import com.facebook.react.uimanager.annotations.ReactProp
11
+
12
+ /**
13
+ * ViewManager for TrueSheetOverlayView
14
+ * Renders content above every presented sheet
15
+ */
16
+ @ReactModule(name = TrueSheetOverlayViewManager.REACT_CLASS)
17
+ class TrueSheetOverlayViewManager : ViewGroupManager<TrueSheetOverlayView>() {
18
+
19
+ override fun getName(): String = REACT_CLASS
20
+
21
+ override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetOverlayView = TrueSheetOverlayView(reactContext)
22
+
23
+ override fun onDropViewInstance(view: TrueSheetOverlayView) {
24
+ super.onDropViewInstance(view)
25
+ view.onDropInstance()
26
+ }
27
+
28
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: TrueSheetOverlayView) {
29
+ view.eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)
30
+ }
31
+
32
+ override fun updateState(view: TrueSheetOverlayView, props: ReactStylesDiffMap?, stateWrapper: StateWrapper?): Any? {
33
+ view.stateWrapper = stateWrapper
34
+ return null
35
+ }
36
+
37
+ @ReactProp(name = "pointerEvents")
38
+ fun setPointerEvents(view: TrueSheetOverlayView, pointerEventsStr: String?) {
39
+ view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
40
+ }
41
+
42
+ companion object {
43
+ const val REACT_CLASS = "TrueSheetOverlayView"
44
+ }
45
+ }
@@ -1,6 +1,6 @@
1
1
  package com.lodev09.truesheet
2
2
 
3
- import com.facebook.react.TurboReactPackage
3
+ import com.facebook.react.BaseReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.module.model.ReactModuleInfo
@@ -11,7 +11,7 @@ import com.facebook.react.uimanager.ViewManager
11
11
  * TrueSheet package for Fabric architecture
12
12
  * Registers all view managers and the TurboModule
13
13
  */
14
- class TrueSheetPackage : TurboReactPackage() {
14
+ class TrueSheetPackage : BaseReactPackage() {
15
15
 
16
16
  override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? =
17
17
  when (name) {
@@ -27,7 +27,6 @@ class TrueSheetPackage : TurboReactPackage() {
27
27
  TrueSheetModule::class.java.name,
28
28
  false, // canOverrideExistingModule
29
29
  false, // needsEagerInit
30
- true, // hasConstants
31
30
  false, // isCxxModule
32
31
  true // isTurboModule
33
32
  )
@@ -39,6 +38,9 @@ class TrueSheetPackage : TurboReactPackage() {
39
38
  TrueSheetViewManager(),
40
39
  TrueSheetContainerViewManager(),
41
40
  TrueSheetContentViewManager(),
42
- TrueSheetFooterViewManager()
41
+ TrueSheetHeaderViewManager(),
42
+ TrueSheetFooterViewManager(),
43
+ TrueSheetPeekViewManager(),
44
+ TrueSheetOverlayViewManager()
43
45
  )
44
46
  }
@@ -0,0 +1,72 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.view.ViewParent
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.views.view.ReactViewGroup
7
+
8
+ /**
9
+ * Delegate interface for peek view size changes
10
+ */
11
+ interface TrueSheetPeekViewDelegate {
12
+ fun peekViewDidChangeSize(width: Int, height: Int)
13
+ }
14
+
15
+ /**
16
+ * Peek view that marks part of the content as the sheet's peek content.
17
+ * The peek detent covers the content through this view's bottom edge.
18
+ */
19
+ @SuppressLint("ViewConstructor")
20
+ class TrueSheetPeekView(context: ThemedReactContext) : ReactViewGroup(context) {
21
+ var delegate: TrueSheetPeekViewDelegate? = null
22
+
23
+ override fun onLayout(
24
+ changed: Boolean,
25
+ left: Int,
26
+ top: Int,
27
+ right: Int,
28
+ bottom: Int
29
+ ) {
30
+ super.onLayout(changed, left, top, right, bottom)
31
+
32
+ attachToContainerView()
33
+
34
+ // Position changes matter too — the peek's offset within the content
35
+ // affects the peek detent.
36
+ if (changed) {
37
+ delegate?.peekViewDidChangeSize(width, height)
38
+ }
39
+ }
40
+
41
+ override fun onAttachedToWindow() {
42
+ super.onAttachedToWindow()
43
+ attachToContainerView()
44
+ }
45
+
46
+ /**
47
+ * Peek can be nested anywhere within the content, so it attaches itself to the
48
+ * nearest container instead of being mounted by it. The container also searches
49
+ * for it when the content is added to cover the initial (bottom-up) mount order.
50
+ */
51
+ private fun attachToContainerView() {
52
+ if (delegate != null) return
53
+
54
+ var parent: ViewParent? = parent
55
+ while (parent != null && parent !is TrueSheetContainerView) {
56
+ parent = parent.parent
57
+ }
58
+
59
+ (parent as? TrueSheetContainerView)?.attachPeekView(this)
60
+ }
61
+
62
+ /**
63
+ * Called by the ViewManager when the view is dropped (Fabric unmount)
64
+ */
65
+ fun detachFromContainerView() {
66
+ (delegate as? TrueSheetContainerView)?.detachPeekView(this)
67
+ }
68
+
69
+ companion object {
70
+ const val TAG_NAME = "TrueSheet"
71
+ }
72
+ }
@@ -0,0 +1,33 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.PointerEvents
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.uimanager.ViewGroupManager
7
+ import com.facebook.react.uimanager.annotations.ReactProp
8
+
9
+ /**
10
+ * ViewManager for TrueSheetPeekView
11
+ * Marks part of the content as the sheet's peek content
12
+ */
13
+ @ReactModule(name = TrueSheetPeekViewManager.REACT_CLASS)
14
+ class TrueSheetPeekViewManager : ViewGroupManager<TrueSheetPeekView>() {
15
+
16
+ override fun getName(): String = REACT_CLASS
17
+
18
+ override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetPeekView = TrueSheetPeekView(reactContext)
19
+
20
+ override fun onDropViewInstance(view: TrueSheetPeekView) {
21
+ super.onDropViewInstance(view)
22
+ view.detachFromContainerView()
23
+ }
24
+
25
+ @ReactProp(name = "pointerEvents")
26
+ fun setPointerEvents(view: TrueSheetPeekView, pointerEventsStr: String?) {
27
+ view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
28
+ }
29
+
30
+ companion object {
31
+ const val REACT_CLASS = "TrueSheetPeekView"
32
+ }
33
+ }
@@ -0,0 +1,63 @@
1
+ package com.lodev09.truesheet
2
+
3
+ import com.facebook.react.bridge.WritableNativeMap
4
+ import com.facebook.react.uimanager.PixelUtil.pxToDp
5
+ import com.facebook.react.uimanager.StateWrapper
6
+
7
+ /**
8
+ * Synchronous Fabric state updates via JNI (see TrueSheetStateUpdater.cpp).
9
+ *
10
+ * StateWrapper.updateState commits asynchronously, so the container's Yoga
11
+ * layout lags the sheet by a frame or two during drags. The native bridge
12
+ * commits with `unstable_Immediate`, which mounts synchronously when called
13
+ * from the UI thread — same-frame layout, like iOS.
14
+ */
15
+ object TrueSheetStateUpdater {
16
+ private val isAvailable: Boolean = try {
17
+ System.loadLibrary("react_codegen_TrueSheetSpec")
18
+ true
19
+ } catch (e: UnsatisfiedLinkError) {
20
+ false
21
+ }
22
+
23
+ /** Returns false when unavailable — caller should fall back to async updateState. */
24
+ fun updateState(stateWrapper: StateWrapper, widthDp: Float, heightDp: Float): Boolean =
25
+ isAvailable && nativeUpdateState(stateWrapper, widthDp, heightDp)
26
+
27
+ /**
28
+ * Pushes the container size (px) into the Fabric state — synchronously when
29
+ * the bridge is available, async otherwise.
30
+ */
31
+ fun updateContainerSize(stateWrapper: StateWrapper, widthPx: Int, heightPx: Int) {
32
+ val widthDp = widthPx.toFloat().pxToDp()
33
+ val heightDp = heightPx.toFloat().pxToDp()
34
+
35
+ if (updateState(stateWrapper, widthDp, heightDp)) return
36
+
37
+ val newStateData = WritableNativeMap()
38
+ newStateData.putDouble("containerWidth", widthDp.toDouble())
39
+ newStateData.putDouble("containerHeight", heightDp.toDouble())
40
+ stateWrapper.updateState(newStateData)
41
+ }
42
+
43
+ /** Returns false when unavailable — caller should fall back to async updateState. */
44
+ fun updateFooterState(stateWrapper: StateWrapper, bottomInsetDp: Float): Boolean =
45
+ isAvailable && nativeUpdateFooterState(stateWrapper, bottomInsetDp)
46
+
47
+ /**
48
+ * Publishes the precalculated bottom safe-area inset so a late-mounted
49
+ * footer's first layout is already padded (see TrueSheetFooterViewShadowNode).
50
+ */
51
+ fun setBottomSafeArea(insetDp: Float) {
52
+ if (isAvailable) nativeSetBottomSafeArea(insetDp)
53
+ }
54
+
55
+ @JvmStatic
56
+ private external fun nativeUpdateState(stateWrapper: Any, width: Float, height: Float): Boolean
57
+
58
+ @JvmStatic
59
+ private external fun nativeUpdateFooterState(stateWrapper: Any, bottomInset: Float): Boolean
60
+
61
+ @JvmStatic
62
+ private external fun nativeSetBottomSafeArea(insetDp: Float)
63
+ }