@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
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 lodev09
3
+ Copyright (c) 2026 lodev09
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
6
6
  in the Software without restriction, including without limitation the rights
package/README.md CHANGED
@@ -1,59 +1,90 @@
1
- # React Native True Sheet
1
+ # React Native TrueSheet
2
2
 
3
- [![CI](https://github.com/lodev09/react-native-true-sheet/actions/workflows/ci.yml/badge.svg)](https://github.com/lodev09/react-native-true-sheet/actions/workflows/ci.yml)
3
+ [![CI](https://github.com/lodev09/react-native-true-sheet/actions/workflows/checks.yml/badge.svg)](https://github.com/lodev09/react-native-true-sheet/actions/workflows/checks.yml)
4
4
  [![NPM Downloads](https://img.shields.io/npm/d18m/%40lodev09%2Freact-native-true-sheet)](https://www.npmjs.com/package/@lodev09/react-native-true-sheet)
5
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/lodev09/react-native-true-sheet)
5
6
 
6
7
  The true native bottom sheet experience for your React Native Apps. 💩
7
8
 
8
- <img alt="React Native True Sheet - IOS" src="docs/static/img/preview.gif" width="300" height="600" /><img alt="React Native True Sheet - Android" src="docs/static/img/preview-2.gif" width="300" height="600" />
9
+ <img alt="React Native True Sheet - iPad" src="docs/public/img/preview-ipad.gif" width="744" /><br>
10
+ <img alt="React Native True Sheet - IOS" src="docs/public/img/preview-ios.gif" width="248" height="500" /><img alt="React Native True Sheet - Android" src="docs/public/img/preview-android.gif" width="248" height="500" /><img alt="React Native True Sheet - Web" src="docs/public/img/preview-web.gif" width="248" height="500" />
9
11
 
10
12
  ## Features
11
13
 
12
14
  * ⚡ **Powered by Fabric** - Built on React Native's new architecture for maximum performance
13
- * 🎯 **Type-safe** - Full TypeScript support with Codegen-generated native interfaces
14
- * 🚀 **Blazing fast** - Direct C++ communication, no bridge overhead
15
- * 🎨 **Native** - Implemented in the native realm
16
- * 🔄 **Imperative API** - Asynchronus `ref` [methods](https://sheet.lodev09.com/reference/methods#ref-methods)
15
+ * 🚀 **Fully Native** - Implemented in the native realm, zero JS hacks
16
+ * **Accessible** - Native accessibility and screen reader support out of the box
17
+ * 🔄 **Flexible API** - Use [imperative methods](https://sheet.lodev09.com/reference/methods#ref-methods) or [lifecycle events](https://sheet.lodev09.com/reference/events)
18
+ * ⌨️ **Keyboard Handling** - Built-in [keyboard handling](https://sheet.lodev09.com/guides/keyboard) with automatic adjustment
19
+ * 📐 **Side Sheets** - Native [side sheet](https://sheet.lodev09.com/guides/side-sheets) support for iPad and Android tablets
20
+ * 🪟 **Liquid Glass** - [iOS 26+ Liquid Glass](https://sheet.lodev09.com/guides/liquid-glass) support out of the box, featured in [Expo Blog](https://expo.dev/blog/how-to-create-apple-maps-style-liquid-glass-sheets)
21
+ * 🐎 **Reanimated** - First-class support for [react-native-reanimated](https://sheet.lodev09.com/guides/reanimated)
22
+ * 🧭 **React Navigation** - Built-in [sheet navigator](https://sheet.lodev09.com/guides/navigation) for seamless navigation integration
23
+ * 🌐 **Web Support** - Full [web support](https://sheet.lodev09.com/guides/web) out of the box
24
+
25
+ ## 🎉 What's New in v4
26
+
27
+ > [!TIP]
28
+ > ✨ **v4 is in beta!** It rewrites the layout engine — the sheet now lays out synchronously per detent, so the container is sized to the sheet's visible height and tracks it in realtime while dragging.
29
+
30
+ * 📏 **Synchronous layout** - Content resizes in the same frame as the sheet, no more lag
31
+ * 📐 **`auto` detent with scrollables** - The sheet now sizes itself to a `ScrollView`/`FlatList`'s content height
32
+ * 📜 **`scrollableRef`** - Pass a `ScrollView`/`FlatList` ref to wire nested scrolling, keyboard insets, and `auto` detent sizing
33
+ * 🦶 **Relative footers** - Footers take up space below the content by default
34
+ * 🧭 **Expo Router** - First-class support via the `Sheet` layout from `/navigation/expo-router`
35
+ * 🍞 **`TrueSheetOverlay`** - Render toasts, dialogs, and other [overlays above your sheets](https://sheet.lodev09.com/guides/overlays) — no more `FullWindowOverlay`/`Modal` workarounds
36
+ * 🔍 **Element inspector** - React Native's dev menu inspector now works inside a presented sheet
37
+
38
+ ```sh
39
+ npx expo install @lodev09/react-native-true-sheet@beta
40
+ ```
41
+
42
+ See the [Migration Guide](docs/docs/migration.mdx) to upgrade. **v3 is still supported** for React Native 0.81+ and remains the `latest` release on npm.
17
43
 
18
44
  ## Installation
19
45
 
20
46
  > [!IMPORTANT]
21
47
  > **Version 3.0+ requires React Native's New Architecture (Fabric)**
22
- > For the old architecture, use version 2.x. See the [Migration Guide (v2 → v3)](https://sheet.lodev09.com/migration) for upgrading.
48
+ > For the old architecture, use version 2.x. See the [Migration Guide](https://sheet.lodev09.com/migration) for upgrading.
23
49
 
24
50
  ### Prerequisites
25
51
 
26
- - React Native >= 0.81
27
- - New Architecture enabled (`RCT_NEW_ARCH_ENABLED=1` for iOS, `newArchEnabled=true` for Android)
52
+ - React Native 0.82+ (0.81+ on v3)
53
+ - New Architecture enabled
54
+ - Xcode 26.1+
28
55
 
29
- ### Install
56
+ ### Compatibility
57
+
58
+ | TrueSheet | React Native | Expo SDK |
59
+ |------------|--------------|----------|
60
+ | 4.0+ | 0.82+ | 55+ |
61
+ | 3.7 - 3.11 | 0.81+ | 54+ |
62
+ | 3.6 | 0.80 | 52-53 |
63
+
64
+ ### Expo
30
65
 
31
66
  ```sh
32
- yarn add @lodev09/react-native-true-sheet
33
- ```
34
- ```sh
35
- npm i @lodev09/react-native-true-sheet
67
+ npx expo install @lodev09/react-native-true-sheet
36
68
  ```
37
69
 
38
- ### iOS Setup
70
+ ### Bare React Native
39
71
 
40
72
  ```sh
73
+ yarn add @lodev09/react-native-true-sheet
41
74
  cd ios && pod install
42
75
  ```
43
76
 
44
- > **Note:** If you need old architecture support, use version 2.x:
45
- > ```sh
46
- > yarn add @lodev09/react-native-true-sheet@^2.0.0
47
- > ```
77
+ These install v3. For v4, append `@beta` see [🎉 What's New in v4](#-whats-new-in-v4).
48
78
 
49
79
  ## Documentation
50
80
 
51
81
  - [Example](example)
52
- - [Guides](https://sheet.lodev09.com/category/guides)
53
- - [Reference](https://sheet.lodev09.com/category/reference)
54
- - [Migration Guide (v2 → v3)](https://sheet.lodev09.com/migration)
82
+ - [Configuration](https://sheet.lodev09.com/reference/configuration)
83
+ - [Lifecycle Events](https://sheet.lodev09.com/reference/events)
84
+ - [React Navigation](https://sheet.lodev09.com/guides/navigation)
55
85
  - [Troubleshooting](https://sheet.lodev09.com/troubleshooting)
56
86
  - [Testing with Jest](https://sheet.lodev09.com/guides/jest)
87
+ - [Migrating to v3](https://sheet.lodev09.com/migration-v3)
57
88
 
58
89
  ## Usage
59
90
 
@@ -81,7 +112,6 @@ export const App = () => {
81
112
  <TrueSheet
82
113
  ref={sheet}
83
114
  detents={['auto', 1]}
84
- cornerRadius={24}
85
115
  >
86
116
  <Button onPress={dismiss} title="Dismiss" />
87
117
  </TrueSheet>
@@ -90,17 +120,19 @@ export const App = () => {
90
120
  }
91
121
  ```
92
122
 
93
- ## Testing
123
+ ## AI Skills
94
124
 
95
- TrueSheet includes built-in Jest mocks for easy testing. Simply mock the package in your tests:
125
+ Skills are reusable AI capabilities that give your AI coding agent knowledge about TrueSheet. With the right skill loaded, your agent can pick the right patterns, avoid common mistakes, and generate correct code without you having to explain the library every time.
96
126
 
97
- ```tsx
98
- jest.mock('@lodev09/react-native-true-sheet');
127
+ ```sh
128
+ npx skills add lodev09/react-native-true-sheet
99
129
  ```
100
130
 
101
- All methods (`present`, `dismiss`, `resize`) are mocked as Jest functions, allowing you to test your components without native dependencies.
131
+ This will install the **TrueSheet Usage** skill into your project.
132
+
133
+ ## That map is awesome!
102
134
 
103
- **[Full Testing Guide](https://sheet.lodev09.com/guides/jest)**
135
+ Yes it is! Checkout [`@lugg/maps`](https://github.com/lugg/maps), a universal maps library for React Native that I'm developing at [Lugg](https://lugg.com).
104
136
 
105
137
  ## Contributing
106
138
 
@@ -10,11 +10,19 @@ Pod::Spec.new do |s|
10
10
  s.license = package["license"]
11
11
  s.authors = package["author"]
12
12
 
13
- s.platforms = { :ios => min_ios_version_supported }
13
+ s.platforms = { :ios => min_ios_version_supported, :tvos => min_ios_version_supported }
14
14
  s.source = { :git => "https://github.com/lodev09/react-native-true-sheet.git", :tag => "#{s.version}" }
15
15
 
16
- s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
16
+ # tvOS compiles stubs only — sheets are not supported there, but codegen
17
+ # still registers the components so the classes must exist (#722)
18
+ s.ios.source_files = "ios/**/*.{h,m,mm,swift,cpp}", "common/cpp/**/*.{cpp,h}"
19
+ s.ios.exclude_files = "ios/tvos/**/*"
20
+ s.tvos.source_files = "ios/tvos/**/*.mm", "common/cpp/**/*.{cpp,h}"
17
21
  s.private_header_files = "ios/**/*.h"
18
22
 
23
+ s.pod_target_xcconfig = {
24
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\""
25
+ }
26
+
19
27
  install_modules_dependencies(s)
20
28
  end
@@ -17,7 +17,28 @@ buildscript {
17
17
 
18
18
 
19
19
  apply plugin: "com.android.library"
20
- apply plugin: "kotlin-android"
20
+ // Android Gradle Plugin 9 ships built-in Kotlin support and applies the Kotlin
21
+ // plugin itself. Applying it a second time fails the configuration phase with
22
+ // "Cannot add extension with name 'kotlin'". Apply it only when AGP is not
23
+ // providing Kotlin: AGP 8 and older, or AGP 9 with android.builtInKotlin=false.
24
+ def shouldApplyKotlinPlugin() {
25
+ def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
26
+ if (agpMajor <= 8) {
27
+ return true
28
+ }
29
+ // AGP 10 removes the opt-out: built-in Kotlin is always active there.
30
+ if (agpMajor >= 10) {
31
+ return false
32
+ }
33
+ def propertyVal = providers.gradleProperty("android.builtInKotlin").orNull
34
+ def builtInKotlinEnabled = propertyVal != null ? propertyVal.toBoolean() : true
35
+ return !builtInKotlinEnabled
36
+ }
37
+
38
+ if (shouldApplyKotlinPlugin()) {
39
+ apply plugin: "kotlin-android"
40
+ }
41
+
21
42
  apply plugin: "com.facebook.react"
22
43
 
23
44
  def getExtOrIntegerDefault(name) {
@@ -96,10 +117,11 @@ repositories {
96
117
  }
97
118
 
98
119
  def kotlin_version = getExtOrDefault("kotlinVersion")
120
+ def material_version = getExtOrDefault("materialVersion") ?: "1.12.0"
99
121
 
100
122
  dependencies {
101
123
  implementation "com.facebook.react:react-android"
102
124
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
103
- implementation "com.google.android.material:material:1.12.0"
125
+ implementation "com.google.android.material:material:$material_version"
104
126
  }
105
127
 
@@ -2,107 +2,249 @@ package com.lodev09.truesheet
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.view.View
5
- import androidx.core.view.isNotEmpty
5
+ import android.view.ViewGroup
6
6
  import com.facebook.react.uimanager.ThemedReactContext
7
+ import com.facebook.react.uimanager.events.EventDispatcher
8
+ import com.facebook.react.util.RNLog
7
9
  import com.facebook.react.views.view.ReactViewGroup
8
10
 
9
- /**
10
- * Delegate interface for container view changes
11
- */
12
11
  interface TrueSheetContainerViewDelegate {
12
+ val eventDispatcher: EventDispatcher?
13
13
  fun containerViewContentDidChangeSize(width: Int, height: Int)
14
+ fun containerViewContentDidScroll()
15
+ fun containerViewScrollViewDidChange()
16
+ fun containerViewHeaderDidChangeSize(width: Int, height: Int)
14
17
  fun containerViewFooterDidChangeSize(width: Int, height: Int)
18
+ fun containerViewPeekDidChangeSize(width: Int, height: Int)
15
19
  }
16
20
 
17
21
  /**
18
- * Container view that manages the bottom sheet content and holds content and footer views.
19
- * Simplified to be a lightweight content manager - events are now handled via dialog delegate.
22
+ * Container view that manages the sheet's content, header, and footer views.
23
+ * Size changes are forwarded to the delegate for sheet reconfiguration.
20
24
  */
21
25
  @SuppressLint("ViewConstructor")
22
- class TrueSheetContainerView(private val reactContext: ThemedReactContext) :
26
+ class TrueSheetContainerView(reactContext: ThemedReactContext) :
23
27
  ReactViewGroup(reactContext),
24
28
  TrueSheetContentViewDelegate,
25
- TrueSheetFooterViewDelegate {
29
+ TrueSheetHeaderViewDelegate,
30
+ TrueSheetFooterViewDelegate,
31
+ TrueSheetPeekViewDelegate {
26
32
 
27
33
  var delegate: TrueSheetContainerViewDelegate? = null
28
34
 
35
+ var contentView: TrueSheetContentView? = null
36
+ var headerView: TrueSheetHeaderView? = null
37
+ var footerView: TrueSheetFooterView? = null
38
+ var peekView: TrueSheetPeekView? = null
39
+
40
+ var contentHeight: Int = 0
41
+ var headerHeight: Int = 0
42
+ var footerHeight: Int = 0
43
+
29
44
  /**
30
- * Reference to content view (first child)
45
+ * Distance from the top of the content view to the bottom of the peek view.
46
+ * Includes the peek view's offset within the content (padding, views above it)
47
+ * so the peek detent reveals everything down to the peek content's bottom edge.
31
48
  */
32
- val contentView: TrueSheetContentView?
33
- get() = if (isNotEmpty() && getChildAt(0) is TrueSheetContentView) {
34
- getChildAt(0) as TrueSheetContentView
35
- } else {
36
- null
49
+ val peekContentHeight: Int
50
+ get() {
51
+ val peek = peekView ?: return 0
52
+ val content = contentView ?: return peek.height
53
+
54
+ var bottom = peek.height
55
+ var view: View = peek
56
+ while (view !== content) {
57
+ bottom += view.top
58
+ view = view.parent as? View ?: return peek.height
59
+ }
60
+
61
+ return bottom
37
62
  }
38
63
 
64
+ var absoluteFooter: Boolean = false
65
+
39
66
  /**
40
- * Reference to footer view (second child)
67
+ * Bottom safe-area inset the footer absorbs as padding — the footer
68
+ * owns the sheet's bottom edge, so its background fills the inset.
41
69
  */
42
- val footerView: TrueSheetFooterView?
43
- get() = if (childCount > 1 && getChildAt(1) is TrueSheetFooterView) {
44
- getChildAt(1) as TrueSheetFooterView
45
- } else {
46
- null
70
+ var footerBottomInset: Int = 0
71
+ set(value) {
72
+ field = value
73
+ footerView?.setBottomInset(value)
74
+ }
75
+ var scrollableOptions: ScrollableOptions? = null
76
+ set(value) {
77
+ field = value
78
+ contentView?.scrollableOptions = value
47
79
  }
48
80
 
49
- /**
50
- * The content view height
51
- */
52
- val contentHeight: Int
53
- get() = contentView?.height ?: 0
81
+ // React tag of the user-provided scrollable within the content (see the scrollableRef prop)
82
+ var scrollableHandle: Int = -1
83
+ set(value) {
84
+ field = value
85
+ contentView?.scrollableHandle = value
86
+ }
54
87
 
55
88
  /**
56
- * The footer view height
89
+ * Bottom safe-area inset the plugged scrollable applies as content padding
90
+ * while it can scroll (see ScrollableOptions.contentInsetAdjustment)
57
91
  */
58
- val footerHeight: Int
59
- get() = footerView?.height ?: 0
92
+ var scrollableBottomInset: Int = 0
93
+ set(value) {
94
+ field = value
95
+ contentView?.bottomInset = value
96
+ }
97
+
98
+ override val eventDispatcher: EventDispatcher?
99
+ get() = delegate?.eventDispatcher
60
100
 
61
101
  init {
62
- // Container should not clip children to allow footer to position absolutely
102
+ // Allow footer to position outside container bounds
63
103
  clipChildren = false
64
104
  clipToPadding = false
65
105
  }
66
106
 
107
+ fun setupScrollable() {
108
+ contentView?.setupScrollable()
109
+ }
110
+
111
+ fun setupKeyboardHandler() {
112
+ contentView?.setupKeyboardHandler()
113
+ }
114
+
115
+ fun cleanupKeyboardHandler() {
116
+ contentView?.cleanupKeyboardHandler()
117
+ }
118
+
67
119
  override fun addView(child: View?, index: Int) {
68
120
  super.addView(child, index)
69
121
 
70
- // Set up delegate when content view is added
71
- if (child is TrueSheetContentView) {
72
- child.delegate = this
122
+ when (child) {
123
+ is TrueSheetContentView -> {
124
+ child.delegate = this
125
+ child.scrollableOptions = scrollableOptions
126
+ child.scrollableHandle = scrollableHandle
127
+ child.bottomInset = scrollableBottomInset
128
+ contentView = child
129
+
130
+ // State lands before the view is attached, so pull the current value
131
+ contentHeight = child.naturalHeight
132
+
133
+ // Children mount bottom-up, so the content subtree is complete here.
134
+ // Late-mounted peek views attach themselves instead (see TrueSheetPeekView).
135
+ findPeekView(child)?.let { attachPeekView(it) }
136
+ }
137
+
138
+ is TrueSheetHeaderView -> {
139
+ child.delegate = this
140
+ headerView = child
141
+ }
142
+
143
+ is TrueSheetFooterView -> {
144
+ child.delegate = this
145
+ child.setBottomInset(footerBottomInset)
146
+ footerView = child
147
+ }
73
148
  }
149
+ }
74
150
 
75
- // Set up delegate when footer view is added
76
- if (child is TrueSheetFooterView) {
77
- child.delegate = this
151
+ override fun removeViewAt(index: Int) {
152
+ when (val view = getChildAt(index)) {
153
+ is TrueSheetContentView -> {
154
+ view.delegate = null
155
+ contentView = null
156
+ contentViewDidChangeSize(0, 0)
157
+ }
158
+
159
+ is TrueSheetHeaderView -> {
160
+ view.delegate = null
161
+ headerView = null
162
+ headerViewDidChangeSize(0, 0)
163
+ }
164
+
165
+ is TrueSheetFooterView -> {
166
+ view.delegate = null
167
+ footerView = null
168
+ footerViewDidChangeSize(0, 0)
169
+ }
78
170
  }
171
+
172
+ super.removeViewAt(index)
79
173
  }
80
174
 
81
- override fun removeView(view: View?) {
82
- // Clean up delegate when content view is removed
83
- if (view is TrueSheetContentView) {
84
- view.delegate = null
175
+ // ==================== Peek View ====================
176
+
177
+ private fun findPeekView(view: View): TrueSheetPeekView? {
178
+ if (view is TrueSheetPeekView) return view
179
+
180
+ if (view is ViewGroup) {
181
+ for (i in 0 until view.childCount) {
182
+ findPeekView(view.getChildAt(i))?.let { return it }
183
+ }
85
184
  }
86
185
 
87
- // Clean up delegate when footer view is removed
88
- if (view is TrueSheetFooterView) {
89
- view.delegate = null
186
+ return null
187
+ }
188
+
189
+ fun attachPeekView(view: TrueSheetPeekView) {
190
+ if (peekView === view) return
191
+
192
+ if (peekView != null) {
193
+ RNLog.w(context as ThemedReactContext, "TrueSheet: Sheet can only have one peek component.")
194
+ return
90
195
  }
91
196
 
92
- super.removeView(view)
197
+ peekView = view
198
+ view.delegate = this
199
+ peekViewDidChangeSize(view.width, view.height)
93
200
  }
94
201
 
95
- // ==================== TrueSheetContentViewDelegate Implementation ====================
202
+ fun detachPeekView(view: TrueSheetPeekView) {
203
+ if (peekView !== view) return
204
+
205
+ view.delegate = null
206
+ peekView = null
207
+ peekViewDidChangeSize(0, 0)
208
+ }
209
+
210
+ // ==================== Delegate Implementations ====================
96
211
 
97
212
  override fun contentViewDidChangeSize(width: Int, height: Int) {
98
- // Forward content size changes to controller for sheet resizing
213
+ contentHeight = height
99
214
  delegate?.containerViewContentDidChangeSize(width, height)
100
215
  }
101
216
 
102
- // ==================== TrueSheetFooterViewDelegate Implementation ====================
217
+ override val footerKeyboardOcclusion: Int
218
+ get() = if (absoluteFooter) footerView?.keyboardOcclusionHeight ?: 0 else -(footerView?.height ?: 0)
219
+
220
+ override val hasRelativeFooter: Boolean
221
+ get() = footerView != null && !absoluteFooter
222
+
223
+ override fun contentViewDidScroll() {
224
+ delegate?.containerViewContentDidScroll()
225
+ }
226
+
227
+ override fun contentViewScrollViewDidChange() {
228
+ delegate?.containerViewScrollViewDidChange()
229
+ }
230
+
231
+ override fun headerViewDidChangeSize(width: Int, height: Int) {
232
+ headerHeight = height
233
+ delegate?.containerViewHeaderDidChangeSize(width, height)
234
+ }
103
235
 
104
236
  override fun footerViewDidChangeSize(width: Int, height: Int) {
105
- // Forward footer size changes to host view for repositioning
237
+ footerHeight = height
106
238
  delegate?.containerViewFooterDidChangeSize(width, height)
239
+ // A relative footer takes over the bottom inset — drop the scrollable's
240
+ contentView?.updateContentInset()
241
+ }
242
+
243
+ override fun peekViewDidChangeSize(width: Int, height: Int) {
244
+ delegate?.containerViewPeekDidChangeSize(width, height)
245
+ }
246
+
247
+ companion object {
248
+ const val TAG_NAME = "TrueSheet"
107
249
  }
108
250
  }
@@ -1,8 +1,10 @@
1
1
  package com.lodev09.truesheet
2
2
 
3
3
  import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.PointerEvents
4
5
  import com.facebook.react.uimanager.ThemedReactContext
5
6
  import com.facebook.react.uimanager.ViewGroupManager
7
+ import com.facebook.react.uimanager.annotations.ReactProp
6
8
 
7
9
  /**
8
10
  * ViewManager for TrueSheetContainerView
@@ -15,6 +17,11 @@ class TrueSheetContainerViewManager : ViewGroupManager<TrueSheetContainerView>()
15
17
 
16
18
  override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetContainerView = TrueSheetContainerView(reactContext)
17
19
 
20
+ @ReactProp(name = "pointerEvents")
21
+ fun setPointerEvents(view: TrueSheetContainerView, pointerEventsStr: String?) {
22
+ view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
23
+ }
24
+
18
25
  companion object {
19
26
  const val REACT_CLASS = "TrueSheetContainerView"
20
27
  }