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

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 (388) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +42 -31
  3. package/RNTrueSheet.podspec +10 -2
  4. package/android/build.gradle +2 -1
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +156 -21
  10. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
  11. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
  12. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
  13. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
  14. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +5 -4
  15. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
  16. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
  17. package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
  18. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
  19. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1224 -603
  20. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
  21. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
  22. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
  23. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
  24. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
  25. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
  26. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
  27. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
  28. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
  29. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
  30. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  31. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  32. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
  33. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  34. package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
  35. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
  36. package/android/src/main/java/com/lodev09/truesheet/utils/TouchEventDeduper.kt +31 -0
  37. package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
  38. package/android/src/main/jni/CMakeLists.txt +63 -0
  39. package/android/src/main/jni/TrueSheetSpec.h +19 -0
  40. package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
  41. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
  42. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
  43. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
  44. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
  45. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
  46. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
  47. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
  48. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
  49. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
  50. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
  51. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
  52. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
  53. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
  54. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
  55. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
  56. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
  57. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
  58. package/ios/TrueSheetContainerView.h +81 -6
  59. package/ios/TrueSheetContainerView.mm +275 -21
  60. package/ios/TrueSheetContentView.h +38 -1
  61. package/ios/TrueSheetContentView.mm +413 -43
  62. package/ios/TrueSheetFooterView.h +27 -2
  63. package/ios/TrueSheetFooterView.mm +141 -35
  64. package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
  65. package/ios/TrueSheetHeaderView.mm +64 -0
  66. package/ios/TrueSheetModule.mm +92 -5
  67. package/ios/TrueSheetPeekView.h +32 -0
  68. package/ios/TrueSheetPeekView.mm +99 -0
  69. package/ios/TrueSheetView.h +7 -15
  70. package/ios/TrueSheetView.mm +633 -215
  71. package/ios/TrueSheetViewController.h +84 -16
  72. package/ios/TrueSheetViewController.mm +1133 -333
  73. package/ios/core/RNScreensEventObserver.h +46 -0
  74. package/ios/core/RNScreensEventObserver.mm +280 -0
  75. package/ios/core/TrueSheetBlurView.h +27 -0
  76. package/ios/core/TrueSheetBlurView.mm +82 -0
  77. package/ios/core/TrueSheetDetentCalculator.h +107 -0
  78. package/ios/core/TrueSheetDetentCalculator.mm +197 -0
  79. package/ios/core/TrueSheetGrabberView.h +72 -0
  80. package/ios/core/TrueSheetGrabberView.mm +178 -0
  81. package/ios/core/TrueSheetKeyboardObserver.h +39 -0
  82. package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
  83. package/ios/events/TrueSheetDragEvents.h +39 -0
  84. package/ios/events/TrueSheetDragEvents.mm +62 -0
  85. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  86. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  87. package/ios/events/TrueSheetLifecycleEvents.h +40 -0
  88. package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
  89. package/ios/events/TrueSheetStateEvents.h +35 -0
  90. package/ios/events/TrueSheetStateEvents.mm +49 -0
  91. package/ios/tvos/TrueSheetStubs.mm +154 -0
  92. package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
  93. package/ios/utils/BlurUtil.mm +69 -0
  94. package/ios/utils/GestureUtil.h +7 -0
  95. package/ios/utils/GestureUtil.mm +12 -0
  96. package/ios/utils/PlatformUtil.h +15 -0
  97. package/ios/utils/UIView+FirstResponder.h +15 -0
  98. package/ios/utils/UIView+FirstResponder.mm +26 -0
  99. package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
  100. package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
  101. package/ios/utils/WindowUtil.mm +17 -1
  102. package/lib/module/TrueSheet.js +230 -64
  103. package/lib/module/TrueSheet.js.map +1 -1
  104. package/lib/module/TrueSheet.web.js +1203 -0
  105. package/lib/module/TrueSheet.web.js.map +1 -0
  106. package/lib/module/TrueSheetPeek.js +15 -0
  107. package/lib/module/TrueSheetPeek.js.map +1 -0
  108. package/lib/module/TrueSheetPeek.web.js +55 -0
  109. package/lib/module/TrueSheetPeek.web.js.map +1 -0
  110. package/lib/module/TrueSheetProvider.js +28 -0
  111. package/lib/module/TrueSheetProvider.js.map +1 -0
  112. package/lib/module/TrueSheetProvider.web.js +157 -0
  113. package/lib/module/TrueSheetProvider.web.js.map +1 -0
  114. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  115. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  116. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  117. package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  118. package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  119. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
  120. package/lib/module/index.js +3 -3
  121. package/lib/module/index.js.map +1 -1
  122. package/lib/module/mocks/index.js +93 -0
  123. package/lib/module/mocks/index.js.map +1 -0
  124. package/lib/module/mocks/navigation.js +95 -0
  125. package/lib/module/mocks/navigation.js.map +1 -0
  126. package/lib/module/mocks/navigationExpoRouter.js +21 -0
  127. package/lib/module/mocks/navigationExpoRouter.js.map +1 -0
  128. package/lib/module/mocks/reanimated.js +91 -0
  129. package/lib/module/mocks/reanimated.js.map +1 -0
  130. package/lib/module/navigation/TrueSheetNavigatorContent.js +73 -0
  131. package/lib/module/navigation/TrueSheetNavigatorContent.js.map +1 -0
  132. package/lib/module/navigation/actions.js +50 -0
  133. package/lib/module/navigation/actions.js.map +1 -0
  134. package/lib/module/navigation/createTrueSheetRouter.js +166 -0
  135. package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
  136. package/lib/module/navigation/expo-router/index.js +48 -0
  137. package/lib/module/navigation/expo-router/index.js.map +1 -0
  138. package/lib/module/navigation/index.js +47 -0
  139. package/lib/module/navigation/index.js.map +1 -0
  140. package/lib/module/navigation/navigator.js +10 -0
  141. package/lib/module/navigation/navigator.js.map +1 -0
  142. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  143. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  144. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  145. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  146. package/lib/module/navigation/screen/index.js +5 -0
  147. package/lib/module/navigation/screen/index.js.map +1 -0
  148. package/lib/module/navigation/screen/types.js +4 -0
  149. package/lib/module/navigation/screen/types.js.map +1 -0
  150. package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
  151. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  152. package/lib/module/navigation/types.js +4 -0
  153. package/lib/module/navigation/types.js.map +1 -0
  154. package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
  155. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
  156. package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
  157. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  158. package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
  159. package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
  160. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  161. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  162. package/lib/module/reanimated/index.js +2 -2
  163. package/lib/module/reanimated/index.js.map +1 -1
  164. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
  165. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
  166. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
  167. package/lib/module/web/constants.js +16 -0
  168. package/lib/module/web/constants.js.map +1 -0
  169. package/lib/module/web/dom.js +10 -0
  170. package/lib/module/web/dom.js.map +1 -0
  171. package/lib/module/web/vaul/README.md +9 -0
  172. package/lib/module/web/vaul/browser.js +30 -0
  173. package/lib/module/web/vaul/browser.js.map +1 -0
  174. package/lib/module/web/vaul/constants.js +15 -0
  175. package/lib/module/web/vaul/constants.js.map +1 -0
  176. package/lib/module/web/vaul/context.js +59 -0
  177. package/lib/module/web/vaul/context.js.map +1 -0
  178. package/lib/module/web/vaul/helpers.js +99 -0
  179. package/lib/module/web/vaul/helpers.js.map +1 -0
  180. package/lib/module/web/vaul/index.js +1309 -0
  181. package/lib/module/web/vaul/index.js.map +1 -0
  182. package/lib/module/web/vaul/style.css +287 -0
  183. package/lib/module/web/vaul/style.css.d.js +2 -0
  184. package/lib/module/web/vaul/style.css.d.js.map +1 -0
  185. package/lib/module/web/vaul/types.js +2 -0
  186. package/lib/module/web/vaul/types.js.map +1 -0
  187. package/lib/module/web/vaul/use-composed-refs.js +34 -0
  188. package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
  189. package/lib/module/web/vaul/use-controllable-state.js +54 -0
  190. package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
  191. package/lib/module/web/vaul/use-position-fixed.js +123 -0
  192. package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
  193. package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
  194. package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
  195. package/lib/module/web/vaul/use-scale-background.js +57 -0
  196. package/lib/module/web/vaul/use-scale-background.js.map +1 -0
  197. package/lib/module/web/vaul/use-snap-points.js +305 -0
  198. package/lib/module/web/vaul/use-snap-points.js.map +1 -0
  199. package/lib/typescript/src/TrueSheet.d.ts +51 -14
  200. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  201. package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
  202. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  203. package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
  204. package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
  205. package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
  206. package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
  207. package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
  208. package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
  209. package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
  210. package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
  211. package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
  212. package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
  213. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
  214. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
  215. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
  216. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
  217. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
  218. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
  219. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
  220. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
  221. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
  222. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  223. package/lib/typescript/src/index.d.ts +2 -2
  224. package/lib/typescript/src/index.d.ts.map +1 -1
  225. package/lib/typescript/src/mocks/index.d.ts +43 -0
  226. package/lib/typescript/src/mocks/index.d.ts.map +1 -0
  227. package/lib/typescript/src/mocks/navigation.d.ts +70 -0
  228. package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
  229. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts +22 -0
  230. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts.map +1 -0
  231. package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
  232. package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
  233. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts +5 -0
  234. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts.map +1 -0
  235. package/lib/typescript/src/navigation/actions.d.ts +71 -0
  236. package/lib/typescript/src/navigation/actions.d.ts.map +1 -0
  237. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +14 -0
  238. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
  239. package/lib/typescript/src/navigation/expo-router/index.d.ts +37 -0
  240. package/lib/typescript/src/navigation/expo-router/index.d.ts.map +1 -0
  241. package/lib/typescript/src/navigation/index.d.ts +46 -0
  242. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  243. package/lib/typescript/src/navigation/navigator.d.ts +7 -0
  244. package/lib/typescript/src/navigation/navigator.d.ts.map +1 -0
  245. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  246. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  247. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  248. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  249. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  250. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  251. package/lib/typescript/src/navigation/screen/types.d.ts +14 -0
  252. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  253. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +33 -0
  254. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  255. package/lib/typescript/src/navigation/types.d.ts +177 -0
  256. package/lib/typescript/src/navigation/types.d.ts.map +1 -0
  257. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
  258. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
  259. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  260. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
  261. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
  262. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  263. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  264. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
  265. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
  266. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
  267. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
  268. package/lib/typescript/src/web/constants.d.ts +14 -0
  269. package/lib/typescript/src/web/constants.d.ts.map +1 -0
  270. package/lib/typescript/src/web/dom.d.ts +7 -0
  271. package/lib/typescript/src/web/dom.d.ts.map +1 -0
  272. package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
  273. package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
  274. package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
  275. package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
  276. package/lib/typescript/src/web/vaul/context.d.ts +53 -0
  277. package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
  278. package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
  279. package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
  280. package/lib/typescript/src/web/vaul/index.d.ts +228 -0
  281. package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
  282. package/lib/typescript/src/web/vaul/types.d.ts +7 -0
  283. package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
  284. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
  285. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
  286. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
  287. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
  288. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
  289. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
  290. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
  291. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
  292. package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
  293. package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
  294. package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
  295. package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
  296. package/package.json +95 -36
  297. package/react-native.config.js +9 -2
  298. package/src/TrueSheet.tsx +281 -62
  299. package/src/TrueSheet.types.ts +525 -71
  300. package/src/TrueSheet.web.tsx +1362 -0
  301. package/src/TrueSheetPeek.tsx +11 -0
  302. package/src/TrueSheetPeek.web.tsx +64 -0
  303. package/src/TrueSheetProvider.tsx +33 -0
  304. package/src/TrueSheetProvider.web.tsx +220 -0
  305. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  306. package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  307. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  308. package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  309. package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  310. package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
  311. package/src/index.ts +2 -2
  312. package/src/mocks/index.ts +89 -0
  313. package/src/mocks/navigation.ts +79 -0
  314. package/src/mocks/navigationExpoRouter.ts +40 -0
  315. package/src/mocks/reanimated.ts +100 -0
  316. package/src/navigation/TrueSheetNavigatorContent.tsx +106 -0
  317. package/src/navigation/actions.ts +78 -0
  318. package/src/navigation/createTrueSheetRouter.ts +222 -0
  319. package/src/navigation/expo-router/index.ts +89 -0
  320. package/src/navigation/index.ts +81 -0
  321. package/src/navigation/navigator.ts +18 -0
  322. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  323. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  324. package/src/navigation/screen/index.ts +3 -0
  325. package/src/navigation/screen/types.ts +19 -0
  326. package/src/navigation/screen/useSheetScreenState.ts +100 -0
  327. package/src/navigation/types.ts +251 -0
  328. package/src/navigation/useTrueSheetNavigation.ts +26 -0
  329. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  330. package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
  331. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
  332. package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
  333. package/src/specs/NativeTrueSheetModule.ts +28 -3
  334. package/src/web/constants.ts +13 -0
  335. package/src/web/dom.ts +9 -0
  336. package/src/web/vaul/README.md +9 -0
  337. package/src/web/vaul/browser.ts +38 -0
  338. package/src/web/vaul/constants.ts +20 -0
  339. package/src/web/vaul/context.ts +101 -0
  340. package/src/web/vaul/helpers.ts +131 -0
  341. package/src/web/vaul/index.tsx +1740 -0
  342. package/src/web/vaul/style.css +287 -0
  343. package/src/web/vaul/style.css.d.ts +1 -0
  344. package/src/web/vaul/types.ts +7 -0
  345. package/src/web/vaul/use-composed-refs.ts +35 -0
  346. package/src/web/vaul/use-controllable-state.ts +66 -0
  347. package/src/web/vaul/use-position-fixed.ts +147 -0
  348. package/src/web/vaul/use-prevent-scroll.ts +309 -0
  349. package/src/web/vaul/use-scale-background.ts +64 -0
  350. package/src/web/vaul/use-snap-points.ts +455 -0
  351. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  352. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  353. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  354. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  355. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  356. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  357. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  358. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  359. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
  360. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  361. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  362. package/android/src/main/res/values/styles.xml +0 -8
  363. package/ios/events/OnDetentChangeEvent.h +0 -28
  364. package/ios/events/OnDetentChangeEvent.mm +0 -30
  365. package/ios/events/OnDidDismissEvent.mm +0 -25
  366. package/ios/events/OnDidPresentEvent.h +0 -28
  367. package/ios/events/OnDidPresentEvent.mm +0 -30
  368. package/ios/events/OnDragBeginEvent.h +0 -28
  369. package/ios/events/OnDragBeginEvent.mm +0 -30
  370. package/ios/events/OnDragChangeEvent.h +0 -28
  371. package/ios/events/OnDragChangeEvent.mm +0 -30
  372. package/ios/events/OnDragEndEvent.h +0 -28
  373. package/ios/events/OnDragEndEvent.mm +0 -30
  374. package/ios/events/OnMountEvent.mm +0 -25
  375. package/ios/events/OnPositionChangeEvent.mm +0 -32
  376. package/ios/events/OnSizeChangeEvent.h +0 -28
  377. package/ios/events/OnSizeChangeEvent.mm +0 -30
  378. package/ios/events/OnWillDismissEvent.mm +0 -25
  379. package/ios/events/OnWillPresentEvent.h +0 -28
  380. package/ios/events/OnWillPresentEvent.mm +0 -30
  381. package/ios/utils/LayoutUtil.h +0 -44
  382. package/ios/utils/LayoutUtil.mm +0 -50
  383. package/lib/module/TrueSheetGrabber.js +0 -51
  384. package/lib/module/TrueSheetGrabber.js.map +0 -1
  385. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  386. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  387. package/src/TrueSheetGrabber.tsx +0 -82
  388. package/src/__mocks__/index.js +0 -67
@@ -0,0 +1,220 @@
1
+ package com.lodev09.truesheet.core
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import com.lodev09.truesheet.TrueSheetView
6
+
7
+ /**
8
+ * Manages TrueSheet stacking behavior.
9
+ * Tracks presented sheets and handles visibility when sheets stack on top of each other.
10
+ */
11
+ object TrueSheetStackManager {
12
+
13
+ private val presentedSheetStack = mutableListOf<TrueSheetView>()
14
+
15
+ /**
16
+ * Gets the parent sheet at the given index, if any.
17
+ * Only returns a parent if it's in the same container.
18
+ * Must be called within synchronized block.
19
+ */
20
+ private fun getParentSheetAt(index: Int, rootContainer: ViewGroup?): TrueSheetView? {
21
+ if (index <= 0) return null
22
+ return presentedSheetStack[index - 1].takeIf { it.rootContainerView == rootContainer }
23
+ }
24
+
25
+ /**
26
+ * Returns the topmost presented and visible sheet.
27
+ * Must be called within synchronized block.
28
+ */
29
+ private fun findTopmostSheet(): TrueSheetView? =
30
+ presentedSheetStack.lastOrNull {
31
+ it.viewController.isPresented && it.viewController.isSheetVisible
32
+ }
33
+
34
+ /**
35
+ * Registers a sheet in the stack and returns its parent sheet if any.
36
+ * Only returns a parent if it's in the same container (e.g., same Screen).
37
+ */
38
+ @JvmStatic
39
+ fun registerSheet(sheetView: TrueSheetView): TrueSheetView? {
40
+ synchronized(presentedSheetStack) {
41
+ val parentSheet = findTopmostSheet()?.takeIf { it.rootContainerView == sheetView.rootContainerView }
42
+
43
+ if (!presentedSheetStack.contains(sheetView)) {
44
+ presentedSheetStack.add(sheetView)
45
+ }
46
+
47
+ return parentSheet
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Unregisters a sheet from the stack.
53
+ */
54
+ @JvmStatic
55
+ fun unregisterSheet(sheetView: TrueSheetView) {
56
+ synchronized(presentedSheetStack) {
57
+ presentedSheetStack.remove(sheetView)
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Updates parent sheet translation based on the child sheet's position.
63
+ * Only affects parent sheets in the same container.
64
+ */
65
+ @JvmStatic
66
+ fun updateParentTranslation(sheetView: TrueSheetView) {
67
+ synchronized(presentedSheetStack) {
68
+ val index = presentedSheetStack.indexOf(sheetView)
69
+ val parentSheet = getParentSheetAt(index, sheetView.rootContainerView) ?: return
70
+
71
+ // Post to ensure layout is complete before reading position
72
+ sheetView.viewController.post {
73
+ val childMinSheetTop = sheetView.viewController.detentCalculator.getSheetTopForDetentIndex(0)
74
+ val childCurrentSheetTop = sheetView.viewController.detentCalculator.getSheetTopForDetentIndex(
75
+ sheetView.viewController.currentDetentIndex
76
+ )
77
+ // Cap to minimum detent position
78
+ val childSheetTop = maxOf(childMinSheetTop, childCurrentSheetTop)
79
+ parentSheet.updateTranslationForChild(childSheetTop)
80
+ }
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Returns all sheets presented on top of the given sheet (children/descendants)
86
+ * that are in the same container. Returns them in reverse order (top-most first) for proper dismissal.
87
+ */
88
+ @JvmStatic
89
+ fun getSheetsAbove(sheetView: TrueSheetView): List<TrueSheetView> {
90
+ synchronized(presentedSheetStack) {
91
+ val index = presentedSheetStack.indexOf(sheetView)
92
+ if (index < 0 || index >= presentedSheetStack.size - 1) return emptyList()
93
+ val rootContainer = sheetView.rootContainerView
94
+ return presentedSheetStack.subList(index + 1, presentedSheetStack.size)
95
+ .filter { it.rootContainerView == rootContainer }
96
+ .reversed()
97
+ }
98
+ }
99
+
100
+ @JvmStatic
101
+ fun removeSheet(sheetView: TrueSheetView) {
102
+ synchronized(presentedSheetStack) {
103
+ presentedSheetStack.remove(sheetView)
104
+ }
105
+ }
106
+
107
+ @JvmStatic
108
+ fun clear() {
109
+ synchronized(presentedSheetStack) {
110
+ presentedSheetStack.clear()
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Gets the parent sheet of the given sheet, if any.
116
+ * Only returns a parent if it's in the same container.
117
+ */
118
+ @JvmStatic
119
+ fun getParentSheet(sheetView: TrueSheetView): TrueSheetView? {
120
+ synchronized(presentedSheetStack) {
121
+ val index = presentedSheetStack.indexOf(sheetView)
122
+ return getParentSheetAt(index, sheetView.rootContainerView)
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Returns true if the given sheet is the topmost presented sheet in its container.
128
+ */
129
+ @JvmStatic
130
+ fun isTopmostSheet(sheetView: TrueSheetView): Boolean {
131
+ synchronized(presentedSheetStack) {
132
+ val rootContainer = sheetView.rootContainerView
133
+ return presentedSheetStack.lastOrNull { it.rootContainerView == rootContainer } == sheetView
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Returns the topmost presented sheet, or null if none.
139
+ */
140
+ @JvmStatic
141
+ fun getTopmostSheet(): TrueSheetView? {
142
+ synchronized(presentedSheetStack) {
143
+ return findTopmostSheet()
144
+ }
145
+ }
146
+
147
+ private val savedBackgroundImportance = HashMap<View, Int>()
148
+
149
+ /**
150
+ * Hides views behind the topmost dimmed (modal) sheet from accessibility,
151
+ * mirroring BottomSheetDialog behavior. Sheets live in the same window as
152
+ * the app content, so without this TalkBack can traverse behind the sheet.
153
+ *
154
+ * Derived from the current stack state and idempotent — call whenever a
155
+ * sheet presents, dismisses, settles, or changes its dim state.
156
+ */
157
+ @JvmStatic
158
+ fun updateBackgroundAccessibility() {
159
+ synchronized(presentedSheetStack) {
160
+ val topDimmedIndex = presentedSheetStack.indexOfLast {
161
+ it.viewController.run { isPresented && isSheetVisible && !isBeingDismissed && isDimmedAtCurrentDetent }
162
+ }
163
+ val topDimmed = presentedSheetStack.getOrNull(topDimmedIndex)
164
+ val root = topDimmed?.viewController?.coordinatorLayout?.parent as? ViewGroup
165
+
166
+ if (root == null) {
167
+ restoreBackgroundAccessibility()
168
+ return
169
+ }
170
+
171
+ // The dimmed sheet and any sheets above it stay accessible
172
+ val accessibleCoordinators = presentedSheetStack
173
+ .subList(topDimmedIndex, presentedSheetStack.size)
174
+ .mapNotNull { it.viewController.coordinatorLayout }
175
+ .toSet()
176
+
177
+ for (i in 0 until root.childCount) {
178
+ val child = root.getChildAt(i)
179
+ if (child in accessibleCoordinators) {
180
+ savedBackgroundImportance.remove(child)?.let { child.importantForAccessibility = it }
181
+ continue
182
+ }
183
+ if (!savedBackgroundImportance.containsKey(child)) {
184
+ savedBackgroundImportance[child] = child.importantForAccessibility
185
+ }
186
+ child.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
187
+ }
188
+ }
189
+ }
190
+
191
+ private fun restoreBackgroundAccessibility() {
192
+ savedBackgroundImportance.forEach { (view, importance) ->
193
+ view.importantForAccessibility = importance
194
+ }
195
+ savedBackgroundImportance.clear()
196
+ }
197
+
198
+ /**
199
+ * Returns the root presented sheet for dismissAll.
200
+ * Starts from the topmost sheet and walks up to find the root of its stack.
201
+ * Stops at modal boundary (parent hidden by modal) or when there's no parent.
202
+ */
203
+ @JvmStatic
204
+ fun getRootSheet(): TrueSheetView? {
205
+ synchronized(presentedSheetStack) {
206
+ val topmost = presentedSheetStack.lastOrNull { it.viewController.isPresented } ?: return null
207
+
208
+ var current: TrueSheetView = topmost
209
+ while (true) {
210
+ val parent = current.viewController.parentSheetView ?: return current
211
+
212
+ if (parent.viewController.wasHiddenByScreen) {
213
+ return current
214
+ }
215
+
216
+ current = parent
217
+ }
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,71 @@
1
+ package com.lodev09.truesheet.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ /**
8
+ * Fired when dragging begins
9
+ * Payload: { index: number, position: number, detent: number }
10
+ */
11
+ class DragBeginEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
12
+ Event<DragBeginEvent>(surfaceId, viewId) {
13
+
14
+ override fun getEventName(): String = EVENT_NAME
15
+
16
+ override fun getEventData(): WritableMap =
17
+ Arguments.createMap().apply {
18
+ putInt("index", index)
19
+ putDouble("position", position.toDouble())
20
+ putDouble("detent", detent.toDouble())
21
+ }
22
+
23
+ companion object {
24
+ const val EVENT_NAME = "topDragBegin"
25
+ const val REGISTRATION_NAME = "onDragBegin"
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Fired continuously during dragging
31
+ * Payload: { index: number, position: number, detent: number }
32
+ */
33
+ class DragChangeEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
34
+ Event<DragChangeEvent>(surfaceId, viewId) {
35
+
36
+ override fun getEventName(): String = EVENT_NAME
37
+
38
+ override fun getEventData(): WritableMap =
39
+ Arguments.createMap().apply {
40
+ putInt("index", index)
41
+ putDouble("position", position.toDouble())
42
+ putDouble("detent", detent.toDouble())
43
+ }
44
+
45
+ companion object {
46
+ const val EVENT_NAME = "topDragChange"
47
+ const val REGISTRATION_NAME = "onDragChange"
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Fired when dragging ends
53
+ * Payload: { index: number, position: number, detent: number }
54
+ */
55
+ class DragEndEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
56
+ Event<DragEndEvent>(surfaceId, viewId) {
57
+
58
+ override fun getEventName(): String = EVENT_NAME
59
+
60
+ override fun getEventData(): WritableMap =
61
+ Arguments.createMap().apply {
62
+ putInt("index", index)
63
+ putDouble("position", position.toDouble())
64
+ putDouble("detent", detent.toDouble())
65
+ }
66
+
67
+ companion object {
68
+ const val EVENT_NAME = "topDragEnd"
69
+ const val REGISTRATION_NAME = "onDragEnd"
70
+ }
71
+ }
@@ -0,0 +1,65 @@
1
+ package com.lodev09.truesheet.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ /**
8
+ * Fired when the sheet is about to regain focus because a sheet on top of it is being dismissed
9
+ */
10
+ class WillFocusEvent(surfaceId: Int, viewId: Int) : Event<WillFocusEvent>(surfaceId, viewId) {
11
+
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap = Arguments.createMap()
15
+
16
+ companion object {
17
+ const val EVENT_NAME = "topWillFocus"
18
+ const val REGISTRATION_NAME = "onWillFocus"
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Fired when the sheet regains focus after a sheet on top of it is dismissed
24
+ */
25
+ class FocusEvent(surfaceId: Int, viewId: Int) : Event<FocusEvent>(surfaceId, viewId) {
26
+
27
+ override fun getEventName(): String = EVENT_NAME
28
+
29
+ override fun getEventData(): WritableMap = Arguments.createMap()
30
+
31
+ companion object {
32
+ const val EVENT_NAME = "topDidFocus"
33
+ const val REGISTRATION_NAME = "onDidFocus"
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Fired when the sheet is about to lose focus because another sheet is being presented on top of it
39
+ */
40
+ class WillBlurEvent(surfaceId: Int, viewId: Int) : Event<WillBlurEvent>(surfaceId, viewId) {
41
+
42
+ override fun getEventName(): String = EVENT_NAME
43
+
44
+ override fun getEventData(): WritableMap = Arguments.createMap()
45
+
46
+ companion object {
47
+ const val EVENT_NAME = "topWillBlur"
48
+ const val REGISTRATION_NAME = "onWillBlur"
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Fired when the sheet loses focus because another sheet is presented on top of it
54
+ */
55
+ class BlurEvent(surfaceId: Int, viewId: Int) : Event<BlurEvent>(surfaceId, viewId) {
56
+
57
+ override fun getEventName(): String = EVENT_NAME
58
+
59
+ override fun getEventData(): WritableMap = Arguments.createMap()
60
+
61
+ companion object {
62
+ const val EVENT_NAME = "topDidBlur"
63
+ const val REGISTRATION_NAME = "onDidBlur"
64
+ }
65
+ }
@@ -0,0 +1,112 @@
1
+ package com.lodev09.truesheet.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ /**
8
+ * Fired when the sheet component is mounted and ready
9
+ */
10
+ class MountEvent(surfaceId: Int, viewId: Int) : Event<MountEvent>(surfaceId, viewId) {
11
+
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap = Arguments.createMap()
15
+
16
+ companion object {
17
+ const val EVENT_NAME = "topMount"
18
+ const val REGISTRATION_NAME = "onMount"
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Fired before the sheet is presented
24
+ * Payload: { index: number, position: number, detent: number }
25
+ */
26
+ class WillPresentEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
27
+ Event<WillPresentEvent>(surfaceId, viewId) {
28
+
29
+ override fun getEventName(): String = EVENT_NAME
30
+
31
+ override fun getEventData(): WritableMap =
32
+ Arguments.createMap().apply {
33
+ putInt("index", index)
34
+ putDouble("position", position.toDouble())
35
+ putDouble("detent", detent.toDouble())
36
+ }
37
+
38
+ companion object {
39
+ const val EVENT_NAME = "topWillPresent"
40
+ const val REGISTRATION_NAME = "onWillPresent"
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Fired after the sheet is presented
46
+ * Payload: { index: number, position: number, detent: number }
47
+ */
48
+ class DidPresentEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
49
+ Event<DidPresentEvent>(surfaceId, viewId) {
50
+
51
+ override fun getEventName(): String = EVENT_NAME
52
+
53
+ override fun getEventData(): WritableMap =
54
+ Arguments.createMap().apply {
55
+ putInt("index", index)
56
+ putDouble("position", position.toDouble())
57
+ putDouble("detent", detent.toDouble())
58
+ }
59
+
60
+ companion object {
61
+ const val EVENT_NAME = "topDidPresent"
62
+ const val REGISTRATION_NAME = "onDidPresent"
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Fired before the sheet is dismissed
68
+ */
69
+ class WillDismissEvent(surfaceId: Int, viewId: Int) : Event<WillDismissEvent>(surfaceId, viewId) {
70
+
71
+ override fun getEventName(): String = EVENT_NAME
72
+
73
+ override fun getEventData(): WritableMap = Arguments.createMap()
74
+
75
+ companion object {
76
+ const val EVENT_NAME = "topWillDismiss"
77
+ const val REGISTRATION_NAME = "onWillDismiss"
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Fired after the sheet is dismissed
83
+ */
84
+ class DidDismissEvent(surfaceId: Int, viewId: Int) : Event<DidDismissEvent>(surfaceId, viewId) {
85
+
86
+ override fun getEventName(): String = EVENT_NAME
87
+
88
+ override fun getEventData(): WritableMap = Arguments.createMap()
89
+
90
+ companion object {
91
+ const val EVENT_NAME = "topDidDismiss"
92
+ const val REGISTRATION_NAME = "onDidDismiss"
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Fired when the sheet visibility changes due to screen transitions
98
+ */
99
+ class VisibilityChangeEvent(surfaceId: Int, viewId: Int, private val visible: Boolean) : Event<VisibilityChangeEvent>(surfaceId, viewId) {
100
+
101
+ override fun getEventName(): String = EVENT_NAME
102
+
103
+ override fun getEventData(): WritableMap =
104
+ Arguments.createMap().apply {
105
+ putBoolean("visible", visible)
106
+ }
107
+
108
+ companion object {
109
+ const val EVENT_NAME = "topVisibilityChange"
110
+ const val REGISTRATION_NAME = "onVisibilityChange"
111
+ }
112
+ }
@@ -0,0 +1,56 @@
1
+ package com.lodev09.truesheet.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ /**
8
+ * Fired when the detent changes
9
+ * Payload: { index: number, position: number, detent: number }
10
+ */
11
+ class DetentChangeEvent(surfaceId: Int, viewId: Int, private val index: Int, private val position: Float, private val detent: Float) :
12
+ Event<DetentChangeEvent>(surfaceId, viewId) {
13
+
14
+ override fun getEventName(): String = EVENT_NAME
15
+
16
+ override fun getEventData(): WritableMap =
17
+ Arguments.createMap().apply {
18
+ putInt("index", index)
19
+ putDouble("position", position.toDouble())
20
+ putDouble("detent", detent.toDouble())
21
+ }
22
+
23
+ companion object {
24
+ const val EVENT_NAME = "topDetentChange"
25
+ const val REGISTRATION_NAME = "onDetentChange"
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Fired continuously for position updates during drag and animation
31
+ * Payload: { index: number, position: number, detent: number, realtime: boolean }
32
+ */
33
+ class PositionChangeEvent(
34
+ surfaceId: Int,
35
+ viewId: Int,
36
+ private val index: Float,
37
+ private val position: Float,
38
+ private val detent: Float,
39
+ private val realtime: Boolean = false
40
+ ) : Event<PositionChangeEvent>(surfaceId, viewId) {
41
+
42
+ override fun getEventName(): String = EVENT_NAME
43
+
44
+ override fun getEventData(): WritableMap =
45
+ Arguments.createMap().apply {
46
+ putDouble("index", index.toDouble())
47
+ putDouble("position", position.toDouble())
48
+ putDouble("detent", detent.toDouble())
49
+ putBoolean("realtime", realtime)
50
+ }
51
+
52
+ companion object {
53
+ const val EVENT_NAME = "topPositionChange"
54
+ const val REGISTRATION_NAME = "onPositionChange"
55
+ }
56
+ }
@@ -0,0 +1,84 @@
1
+ package com.lodev09.truesheet.utils
2
+
3
+ import android.content.Context
4
+ import android.os.Build
5
+ import android.view.View
6
+ import android.view.inputmethod.InputMethodManager
7
+ import androidx.core.view.ViewCompat
8
+ import androidx.core.view.WindowInsetsAnimationCompat
9
+ import androidx.core.view.WindowInsetsCompat
10
+ import com.facebook.react.uimanager.ThemedReactContext
11
+
12
+ object KeyboardUtils {
13
+
14
+ /**
15
+ * Checks if the soft keyboard is currently visible.
16
+ */
17
+ fun isKeyboardVisible(reactContext: ThemedReactContext): Boolean {
18
+ val rootView = reactContext.currentActivity?.window?.decorView?.rootView ?: return false
19
+ return isKeyboardVisible(rootView)
20
+ }
21
+
22
+ private fun isKeyboardVisible(view: View): Boolean {
23
+ val insets = ViewCompat.getRootWindowInsets(view) ?: return false
24
+ return insets.isVisible(WindowInsetsCompat.Type.ime())
25
+ }
26
+
27
+ /**
28
+ * Dismisses the soft keyboard if currently shown.
29
+ */
30
+ fun dismiss(reactContext: ThemedReactContext) {
31
+ val rootView = reactContext.currentActivity?.window?.decorView?.rootView ?: return
32
+ dismiss(rootView, null)
33
+ }
34
+
35
+ /**
36
+ * Dismisses the soft keyboard with an optional callback when the animation completes.
37
+ */
38
+ fun dismiss(view: View, onComplete: (() -> Unit)?) {
39
+ val imm = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
40
+ val focusedView = view.rootView.findFocus()
41
+
42
+ if (focusedView == null || !isKeyboardVisible(view)) {
43
+ onComplete?.invoke()
44
+ return
45
+ }
46
+
47
+ if (onComplete != null) {
48
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
49
+ ViewCompat.setWindowInsetsAnimationCallback(
50
+ view,
51
+ object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) {
52
+ override fun onProgress(insets: WindowInsetsCompat, runningAnimations: List<WindowInsetsAnimationCompat>): WindowInsetsCompat =
53
+ insets
54
+
55
+ override fun onEnd(animation: WindowInsetsAnimationCompat) {
56
+ ViewCompat.setWindowInsetsAnimationCallback(view, null)
57
+ onComplete()
58
+ }
59
+ }
60
+ )
61
+ } else {
62
+ view.postDelayed({ onComplete() }, 120)
63
+ }
64
+ }
65
+
66
+ imm?.hideSoftInputFromWindow(focusedView.windowToken, 0)
67
+ }
68
+
69
+ /**
70
+ * Shows the soft keyboard for the given view.
71
+ */
72
+ fun show(view: View) {
73
+ val imm = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
74
+ imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
75
+ }
76
+
77
+ /**
78
+ * Gets the current keyboard height from window insets.
79
+ */
80
+ fun getKeyboardHeight(view: View): Int {
81
+ val insets = ViewCompat.getRootWindowInsets(view)
82
+ return insets?.getInsets(WindowInsetsCompat.Type.ime())?.bottom ?: 0
83
+ }
84
+ }