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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +42 -31
  3. package/RNTrueSheet.podspec +10 -2
  4. package/android/build.gradle +2 -1
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +150 -21
  10. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
  11. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
  12. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
  13. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
  14. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +5 -4
  15. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
  16. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
  17. package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
  18. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
  19. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1217 -603
  20. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
  21. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
  22. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
  23. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
  24. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
  25. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
  26. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
  27. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
  28. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
  29. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
  30. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  31. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  32. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
  33. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  34. package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
  35. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
  36. package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
  37. package/android/src/main/jni/CMakeLists.txt +63 -0
  38. package/android/src/main/jni/TrueSheetSpec.h +19 -0
  39. package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
  40. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
  41. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
  42. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
  43. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
  44. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
  45. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
  46. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
  47. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
  48. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
  49. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
  50. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
  51. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
  52. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
  53. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
  54. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
  55. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
  56. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
  57. package/ios/TrueSheetContainerView.h +81 -6
  58. package/ios/TrueSheetContainerView.mm +275 -21
  59. package/ios/TrueSheetContentView.h +38 -1
  60. package/ios/TrueSheetContentView.mm +413 -43
  61. package/ios/TrueSheetFooterView.h +27 -2
  62. package/ios/TrueSheetFooterView.mm +141 -35
  63. package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
  64. package/ios/TrueSheetHeaderView.mm +64 -0
  65. package/ios/TrueSheetModule.mm +92 -5
  66. package/ios/TrueSheetPeekView.h +32 -0
  67. package/ios/TrueSheetPeekView.mm +99 -0
  68. package/ios/TrueSheetView.h +7 -15
  69. package/ios/TrueSheetView.mm +633 -215
  70. package/ios/TrueSheetViewController.h +84 -16
  71. package/ios/TrueSheetViewController.mm +1136 -333
  72. package/ios/core/RNScreensEventObserver.h +46 -0
  73. package/ios/core/RNScreensEventObserver.mm +280 -0
  74. package/ios/core/TrueSheetBlurView.h +27 -0
  75. package/ios/core/TrueSheetBlurView.mm +82 -0
  76. package/ios/core/TrueSheetDetentCalculator.h +107 -0
  77. package/ios/core/TrueSheetDetentCalculator.mm +197 -0
  78. package/ios/core/TrueSheetGrabberView.h +72 -0
  79. package/ios/core/TrueSheetGrabberView.mm +178 -0
  80. package/ios/core/TrueSheetKeyboardObserver.h +39 -0
  81. package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
  82. package/ios/events/TrueSheetDragEvents.h +39 -0
  83. package/ios/events/TrueSheetDragEvents.mm +62 -0
  84. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  85. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  86. package/ios/events/TrueSheetLifecycleEvents.h +40 -0
  87. package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
  88. package/ios/events/TrueSheetStateEvents.h +35 -0
  89. package/ios/events/TrueSheetStateEvents.mm +49 -0
  90. package/ios/tvos/TrueSheetStubs.mm +154 -0
  91. package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
  92. package/ios/utils/BlurUtil.mm +69 -0
  93. package/ios/utils/GestureUtil.h +7 -0
  94. package/ios/utils/GestureUtil.mm +12 -0
  95. package/ios/utils/PlatformUtil.h +15 -0
  96. package/ios/utils/UIView+FirstResponder.h +15 -0
  97. package/ios/utils/UIView+FirstResponder.mm +26 -0
  98. package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
  99. package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
  100. package/ios/utils/WindowUtil.mm +17 -1
  101. package/lib/module/TrueSheet.js +224 -64
  102. package/lib/module/TrueSheet.js.map +1 -1
  103. package/lib/module/TrueSheet.web.js +1201 -0
  104. package/lib/module/TrueSheet.web.js.map +1 -0
  105. package/lib/module/TrueSheetPeek.js +15 -0
  106. package/lib/module/TrueSheetPeek.js.map +1 -0
  107. package/lib/module/TrueSheetPeek.web.js +55 -0
  108. package/lib/module/TrueSheetPeek.web.js.map +1 -0
  109. package/lib/module/TrueSheetProvider.js +28 -0
  110. package/lib/module/TrueSheetProvider.js.map +1 -0
  111. package/lib/module/TrueSheetProvider.web.js +157 -0
  112. package/lib/module/TrueSheetProvider.web.js.map +1 -0
  113. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  114. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  115. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  116. package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  117. package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  118. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
  119. package/lib/module/index.js +3 -3
  120. package/lib/module/index.js.map +1 -1
  121. package/lib/module/mocks/index.js +93 -0
  122. package/lib/module/mocks/index.js.map +1 -0
  123. package/lib/module/mocks/navigation.js +85 -0
  124. package/lib/module/mocks/navigation.js.map +1 -0
  125. package/lib/module/mocks/reanimated.js +91 -0
  126. package/lib/module/mocks/reanimated.js.map +1 -0
  127. package/lib/module/navigation/TrueSheetRouter.js +170 -0
  128. package/lib/module/navigation/TrueSheetRouter.js.map +1 -0
  129. package/lib/module/navigation/TrueSheetView.js +71 -0
  130. package/lib/module/navigation/TrueSheetView.js.map +1 -0
  131. package/lib/module/navigation/createTrueSheetNavigator.js +63 -0
  132. package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -0
  133. package/lib/module/navigation/index.js +6 -0
  134. package/lib/module/navigation/index.js.map +1 -0
  135. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  136. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  137. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  138. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  139. package/lib/module/navigation/screen/index.js +5 -0
  140. package/lib/module/navigation/screen/index.js.map +1 -0
  141. package/lib/module/navigation/screen/types.js +4 -0
  142. package/lib/module/navigation/screen/types.js.map +1 -0
  143. package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
  144. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  145. package/lib/module/navigation/types.js +4 -0
  146. package/lib/module/navigation/types.js.map +1 -0
  147. package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
  148. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
  149. package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
  150. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  151. package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
  152. package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
  153. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  154. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  155. package/lib/module/reanimated/index.js +2 -2
  156. package/lib/module/reanimated/index.js.map +1 -1
  157. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
  158. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
  159. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
  160. package/lib/module/web/constants.js +16 -0
  161. package/lib/module/web/constants.js.map +1 -0
  162. package/lib/module/web/vaul/README.md +9 -0
  163. package/lib/module/web/vaul/browser.js +30 -0
  164. package/lib/module/web/vaul/browser.js.map +1 -0
  165. package/lib/module/web/vaul/constants.js +15 -0
  166. package/lib/module/web/vaul/constants.js.map +1 -0
  167. package/lib/module/web/vaul/context.js +59 -0
  168. package/lib/module/web/vaul/context.js.map +1 -0
  169. package/lib/module/web/vaul/helpers.js +93 -0
  170. package/lib/module/web/vaul/helpers.js.map +1 -0
  171. package/lib/module/web/vaul/index.js +1309 -0
  172. package/lib/module/web/vaul/index.js.map +1 -0
  173. package/lib/module/web/vaul/style.css +287 -0
  174. package/lib/module/web/vaul/style.css.d.js +2 -0
  175. package/lib/module/web/vaul/style.css.d.js.map +1 -0
  176. package/lib/module/web/vaul/types.js +2 -0
  177. package/lib/module/web/vaul/types.js.map +1 -0
  178. package/lib/module/web/vaul/use-composed-refs.js +34 -0
  179. package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
  180. package/lib/module/web/vaul/use-controllable-state.js +54 -0
  181. package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
  182. package/lib/module/web/vaul/use-position-fixed.js +123 -0
  183. package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
  184. package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
  185. package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
  186. package/lib/module/web/vaul/use-scale-background.js +57 -0
  187. package/lib/module/web/vaul/use-scale-background.js.map +1 -0
  188. package/lib/module/web/vaul/use-snap-points.js +305 -0
  189. package/lib/module/web/vaul/use-snap-points.js.map +1 -0
  190. package/lib/typescript/src/TrueSheet.d.ts +51 -14
  191. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  192. package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
  193. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  194. package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
  195. package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
  196. package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
  197. package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
  198. package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
  199. package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
  200. package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
  201. package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
  202. package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
  203. package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
  204. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
  205. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
  206. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
  207. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
  208. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
  209. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
  210. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
  211. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
  212. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
  213. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  214. package/lib/typescript/src/index.d.ts +2 -2
  215. package/lib/typescript/src/index.d.ts.map +1 -1
  216. package/lib/typescript/src/mocks/index.d.ts +43 -0
  217. package/lib/typescript/src/mocks/index.d.ts.map +1 -0
  218. package/lib/typescript/src/mocks/navigation.d.ts +66 -0
  219. package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
  220. package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
  221. package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
  222. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +57 -0
  223. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -0
  224. package/lib/typescript/src/navigation/TrueSheetView.d.ts +10 -0
  225. package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -0
  226. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +35 -0
  227. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -0
  228. package/lib/typescript/src/navigation/index.d.ts +6 -0
  229. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  230. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  231. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  232. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  233. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  234. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  235. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  236. package/lib/typescript/src/navigation/screen/types.d.ts +15 -0
  237. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  238. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
  239. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  240. package/lib/typescript/src/navigation/types.d.ts +153 -0
  241. package/lib/typescript/src/navigation/types.d.ts.map +1 -0
  242. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
  243. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
  244. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  245. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
  246. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
  247. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  248. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  249. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
  250. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
  251. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
  252. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
  253. package/lib/typescript/src/web/constants.d.ts +14 -0
  254. package/lib/typescript/src/web/constants.d.ts.map +1 -0
  255. package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
  256. package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
  257. package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
  258. package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
  259. package/lib/typescript/src/web/vaul/context.d.ts +53 -0
  260. package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
  261. package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
  262. package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
  263. package/lib/typescript/src/web/vaul/index.d.ts +228 -0
  264. package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
  265. package/lib/typescript/src/web/vaul/types.d.ts +7 -0
  266. package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
  267. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
  268. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
  269. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
  270. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
  271. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
  272. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
  273. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
  274. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
  275. package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
  276. package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
  277. package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
  278. package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
  279. package/package.json +78 -34
  280. package/react-native.config.js +9 -2
  281. package/src/TrueSheet.tsx +276 -60
  282. package/src/TrueSheet.types.ts +525 -71
  283. package/src/TrueSheet.web.tsx +1366 -0
  284. package/src/TrueSheetPeek.tsx +11 -0
  285. package/src/TrueSheetPeek.web.tsx +63 -0
  286. package/src/TrueSheetProvider.tsx +33 -0
  287. package/src/TrueSheetProvider.web.tsx +220 -0
  288. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  289. package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  290. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  291. package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  292. package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  293. package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
  294. package/src/index.ts +2 -2
  295. package/src/mocks/index.ts +89 -0
  296. package/src/mocks/navigation.ts +72 -0
  297. package/src/mocks/reanimated.ts +101 -0
  298. package/src/navigation/TrueSheetRouter.ts +234 -0
  299. package/src/navigation/TrueSheetView.tsx +99 -0
  300. package/src/navigation/createTrueSheetNavigator.tsx +93 -0
  301. package/src/navigation/index.ts +14 -0
  302. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  303. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  304. package/src/navigation/screen/index.ts +3 -0
  305. package/src/navigation/screen/types.ts +21 -0
  306. package/src/navigation/screen/useSheetScreenState.ts +107 -0
  307. package/src/navigation/types.ts +219 -0
  308. package/src/navigation/useTrueSheetNavigation.ts +26 -0
  309. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  310. package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
  311. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
  312. package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
  313. package/src/specs/NativeTrueSheetModule.ts +28 -3
  314. package/src/web/constants.ts +13 -0
  315. package/src/web/vaul/README.md +9 -0
  316. package/src/web/vaul/browser.ts +38 -0
  317. package/src/web/vaul/constants.ts +20 -0
  318. package/src/web/vaul/context.ts +101 -0
  319. package/src/web/vaul/helpers.ts +124 -0
  320. package/src/web/vaul/index.tsx +1740 -0
  321. package/src/web/vaul/style.css +287 -0
  322. package/src/web/vaul/style.css.d.ts +1 -0
  323. package/src/web/vaul/types.ts +7 -0
  324. package/src/web/vaul/use-composed-refs.ts +35 -0
  325. package/src/web/vaul/use-controllable-state.ts +66 -0
  326. package/src/web/vaul/use-position-fixed.ts +147 -0
  327. package/src/web/vaul/use-prevent-scroll.ts +309 -0
  328. package/src/web/vaul/use-scale-background.ts +64 -0
  329. package/src/web/vaul/use-snap-points.ts +455 -0
  330. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  331. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  332. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  333. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  334. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  335. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  336. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  337. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  338. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
  339. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  340. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  341. package/android/src/main/res/values/styles.xml +0 -8
  342. package/ios/events/OnDetentChangeEvent.h +0 -28
  343. package/ios/events/OnDetentChangeEvent.mm +0 -30
  344. package/ios/events/OnDidDismissEvent.mm +0 -25
  345. package/ios/events/OnDidPresentEvent.h +0 -28
  346. package/ios/events/OnDidPresentEvent.mm +0 -30
  347. package/ios/events/OnDragBeginEvent.h +0 -28
  348. package/ios/events/OnDragBeginEvent.mm +0 -30
  349. package/ios/events/OnDragChangeEvent.h +0 -28
  350. package/ios/events/OnDragChangeEvent.mm +0 -30
  351. package/ios/events/OnDragEndEvent.h +0 -28
  352. package/ios/events/OnDragEndEvent.mm +0 -30
  353. package/ios/events/OnMountEvent.mm +0 -25
  354. package/ios/events/OnPositionChangeEvent.mm +0 -32
  355. package/ios/events/OnSizeChangeEvent.h +0 -28
  356. package/ios/events/OnSizeChangeEvent.mm +0 -30
  357. package/ios/events/OnWillDismissEvent.mm +0 -25
  358. package/ios/events/OnWillPresentEvent.h +0 -28
  359. package/ios/events/OnWillPresentEvent.mm +0 -30
  360. package/ios/utils/LayoutUtil.h +0 -44
  361. package/ios/utils/LayoutUtil.mm +0 -50
  362. package/lib/module/TrueSheetGrabber.js +0 -51
  363. package/lib/module/TrueSheetGrabber.js.map +0 -1
  364. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  365. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  366. package/src/TrueSheetGrabber.tsx +0 -82
  367. package/src/__mocks__/index.js +0 -67
@@ -9,18 +9,22 @@
9
9
  #ifdef RCT_NEW_ARCH_ENABLED
10
10
 
11
11
  #import "TrueSheetFooterView.h"
12
- #import <react/renderer/components/TrueSheetSpec/ComponentDescriptors.h>
13
12
  #import <react/renderer/components/TrueSheetSpec/EventEmitters.h>
14
13
  #import <react/renderer/components/TrueSheetSpec/Props.h>
15
14
  #import <react/renderer/components/TrueSheetSpec/RCTComponentViewHelpers.h>
15
+ #import <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h>
16
+ #import <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h>
16
17
  #import "TrueSheetViewController.h"
17
- #import "utils/LayoutUtil.h"
18
+ #import "utils/UIView+ScrollEdgeInteraction.h"
18
19
 
19
20
  using namespace facebook::react;
20
21
 
21
22
  @implementation TrueSheetFooterView {
23
+ TrueSheetFooterViewShadowNode::ConcreteState::Shared _state;
22
24
  CGFloat _lastHeight;
23
- BOOL _didInitialLayout;
25
+ CGFloat _currentKeyboardOffset;
26
+ CGFloat _bottomInset;
27
+ BOOL _keyboardVisible;
24
28
  }
25
29
 
26
30
  + (ComponentDescriptorProvider)componentDescriptorProvider {
@@ -32,70 +36,172 @@ using namespace facebook::react;
32
36
  static const auto defaultProps = std::make_shared<const TrueSheetFooterViewProps>();
33
37
  _props = defaultProps;
34
38
 
35
- // Set background color to clear by default
36
39
  self.backgroundColor = [UIColor clearColor];
40
+ self.isAccessibilityElement = NO;
37
41
 
38
42
  _lastHeight = 0;
39
- _didInitialLayout = NO;
43
+ _currentKeyboardOffset = 0;
44
+ _bottomInset = 0;
45
+ _keyboardVisible = NO;
40
46
  }
41
47
  return self;
42
48
  }
43
49
 
44
- - (void)setupConstraintsWithHeight:(CGFloat)height {
45
- UIView *parentView = self.superview;
46
- if (!parentView) {
50
+ - (void)updateState:(const State::Shared &)state oldState:(const State::Shared &)oldState {
51
+ _state = std::static_pointer_cast<TrueSheetFooterViewShadowNode::ConcreteState const>(state);
52
+ }
53
+
54
+ // Tells the shadow node to pad the footer's bottom edge with the sheet's
55
+ // bottom safe-area inset — the footer owns the sheet's bottom edge, so it
56
+ // absorbs the inset and its background fills it.
57
+ - (void)setBottomInset:(CGFloat)bottomInset {
58
+ if (_bottomInset == bottomInset) {
59
+ return;
60
+ }
61
+ _bottomInset = bottomInset;
62
+ [self pushBottomInsetState];
63
+ }
64
+
65
+ // Skipped while the keyboard is open — an absolute footer rises above the
66
+ // keyboard, so the inset would leave a gap.
67
+ - (void)setKeyboardVisible:(BOOL)keyboardVisible {
68
+ if (_keyboardVisible == keyboardVisible) {
47
69
  return;
48
70
  }
71
+ _keyboardVisible = keyboardVisible;
72
+ [self pushBottomInsetState];
73
+ }
49
74
 
50
- // Remove existing constraints before applying new ones
51
- [LayoutUtil unpinView:self];
75
+ - (void)pushBottomInsetState {
76
+ if (!_state) {
77
+ return;
78
+ }
52
79
 
53
- // Pin footer to bottom and sides of container with specific height
54
- [LayoutUtil pinView:self
55
- toParentView:parentView
56
- edges:UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom
57
- height:height];
80
+ TrueSheetFooterViewState newState;
81
+ newState.bottomInset = _keyboardVisible ? 0 : _bottomInset;
82
+ newState.initialized = true;
83
+ // Immediate so the inset lands before anything reads the footer's height —
84
+ // the async path races the keyboard caret scroll and detent setup, leaving
85
+ // them an inset stale (same reason Android bridges through
86
+ // TrueSheetStateUpdater).
87
+ _state->updateState(std::move(newState), EventQueue::UpdateMode::unstable_Immediate);
88
+ }
58
89
 
59
- _lastHeight = height;
90
+ // Height the footer occupies above the keyboard — its layout height minus the
91
+ // safe-area inset it drops while the keyboard is open.
92
+ - (CGFloat)keyboardOcclusionHeight {
93
+ return MAX(0, _lastHeight - (_keyboardVisible ? 0 : _bottomInset));
60
94
  }
61
95
 
62
- - (void)didMoveToSuperview {
63
- [super didMoveToSuperview];
96
+ #pragma mark - Accessibility
64
97
 
65
- // Setup footer constraints when added to container
66
- if (self.superview) {
67
- CGFloat initialHeight = self.frame.size.height;
68
- [self setupConstraintsWithHeight:initialHeight];
98
+ - (NSArray *)accessibilityElements {
99
+ NSMutableArray *elements = [NSMutableArray array];
100
+ [self collectAccessibilityElementsFromView:self into:elements];
101
+ if (elements.count > 0) {
102
+ return elements;
69
103
  }
104
+
105
+ return [super accessibilityElements];
70
106
  }
71
107
 
108
+ - (void)collectAccessibilityElementsFromView:(UIView *)view into:(NSMutableArray *)elements {
109
+ for (UIView *subview in view.subviews) {
110
+ if (subview.isAccessibilityElement || subview.accessibilityLabel || subview.accessibilityIdentifier) {
111
+ [elements addObject:subview];
112
+ } else if (subview.accessibilityElements.count > 0) {
113
+ [elements addObjectsFromArray:subview.accessibilityElements];
114
+ } else {
115
+ [self collectAccessibilityElementsFromView:subview into:elements];
116
+ }
117
+ }
118
+ }
119
+
120
+ #pragma mark - Layout
121
+
72
122
  - (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics
73
123
  oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics {
74
- CGFloat height = layoutMetrics.frame.size.height;
75
-
76
- // On initial layout, call super to let React Native position the view
77
- // After that, we use Auto Layout constraints instead
78
- if (!_didInitialLayout) {
79
- [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
80
- _didInitialLayout = YES;
81
- }
124
+ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
82
125
 
83
- // Update footer constraints when height changes
126
+ CGFloat height = layoutMetrics.frame.size.height;
84
127
  if (height != _lastHeight) {
85
- [self setupConstraintsWithHeight:height];
128
+ _lastHeight = height;
129
+ [self.delegate footerViewDidChangeSize:CGSizeMake(layoutMetrics.frame.size.width, height)];
86
130
  }
87
131
  }
88
132
 
89
133
  - (void)prepareForRecycle {
90
134
  [super prepareForRecycle];
91
135
 
92
- // Remove footer constraints
93
- [LayoutUtil unpinView:self];
136
+ if (@available(iOS 26.0, *)) {
137
+ [self cleanupEdgeInteraction];
138
+ }
94
139
 
140
+ self.transform = CGAffineTransformIdentity;
141
+ _state = nullptr;
95
142
  _lastHeight = 0;
96
- _didInitialLayout = NO;
143
+ _currentKeyboardOffset = 0;
144
+ _bottomInset = 0;
145
+ _keyboardVisible = NO;
146
+ }
147
+
148
+ #pragma mark - TrueSheetKeyboardObserverDelegate
149
+
150
+ // Yoga owns the footer's frame (pinned to the container's bottom edge), so the
151
+ // keyboard slide is carried by a transform instead of layout. Only an absolute
152
+ // footer floats above the keyboard — a relative footer stays in the layout
153
+ // flow behind it.
154
+ - (void)keyboardWillShow:(CGFloat)height duration:(NSTimeInterval)duration curve:(UIViewAnimationOptions)curve {
155
+ if (!self.keyboardObserver.viewController.absoluteFooter) {
156
+ return;
157
+ }
158
+
159
+ [self setKeyboardVisible:YES];
160
+
161
+ CGFloat keyboardOffset = self.keyboardObserver.viewController.footerKeyboardOffset;
162
+ CGFloat slide = MAX(0, height + keyboardOffset);
163
+ _currentKeyboardOffset = slide;
164
+
165
+ [UIView animateWithDuration:duration
166
+ delay:0
167
+ options:curve | UIViewAnimationOptionBeginFromCurrentState
168
+ animations:^{
169
+ self.transform = CGAffineTransformMakeTranslation(0, -slide);
170
+ }
171
+ completion:nil];
172
+ }
173
+
174
+ - (void)keyboardWillHide:(NSTimeInterval)duration curve:(UIViewAnimationOptions)curve {
175
+ [self setKeyboardVisible:NO];
176
+ _currentKeyboardOffset = 0;
177
+
178
+ [UIView animateWithDuration:duration
179
+ delay:0
180
+ options:curve | UIViewAnimationOptionBeginFromCurrentState
181
+ animations:^{
182
+ self.transform = CGAffineTransformIdentity;
183
+ }
184
+ completion:nil];
185
+ }
186
+
187
+ - (void)applyKeyboardOffset {
188
+ CGFloat height = self.keyboardObserver.currentHeight;
189
+ if (height <= 0 || !self.keyboardObserver.viewController.absoluteFooter) {
190
+ return;
191
+ }
192
+
193
+ [self setKeyboardVisible:YES];
194
+
195
+ CGFloat keyboardOffset = self.keyboardObserver.viewController.footerKeyboardOffset;
196
+ CGFloat slide = MAX(0, height + keyboardOffset);
197
+ _currentKeyboardOffset = slide;
198
+ self.transform = CGAffineTransformMakeTranslation(0, -slide);
97
199
  }
98
200
 
99
201
  @end
100
202
 
203
+ Class<RCTComponentViewProtocol> TrueSheetFooterViewCls(void) {
204
+ return TrueSheetFooterView.class;
205
+ }
206
+
101
207
  #endif
@@ -8,19 +8,22 @@
8
8
 
9
9
  #ifdef RCT_NEW_ARCH_ENABLED
10
10
 
11
- #import <Foundation/Foundation.h>
12
- #import <react/renderer/components/TrueSheetSpec/EventEmitters.h>
13
-
14
- using namespace facebook::react;
11
+ #import <React/RCTViewComponentView.h>
12
+ #import <UIKit/UIKit.h>
15
13
 
16
14
  NS_ASSUME_NONNULL_BEGIN
17
15
 
18
- @interface OnDidDismissEvent : NSObject
16
+ @protocol TrueSheetHeaderViewDelegate <NSObject>
17
+ @optional
18
+ - (void)headerViewDidChangeSize:(CGSize)size;
19
+ @end
20
+
21
+ @interface TrueSheetHeaderView : RCTViewComponentView
19
22
 
20
- + (void)emit:(std::shared_ptr<const facebook::react::EventEmitter>)eventEmitter;
23
+ @property (nonatomic, weak, nullable) id<TrueSheetHeaderViewDelegate> delegate;
21
24
 
22
25
  @end
23
26
 
24
27
  NS_ASSUME_NONNULL_END
25
28
 
26
- #endif // RCT_NEW_ARCH_ENABLED
29
+ #endif
@@ -0,0 +1,64 @@
1
+ //
2
+ // Created by Jovanni Lo (@lodev09)
3
+ // Copyright (c) 2024-present. All rights reserved.
4
+ //
5
+ // This source code is licensed under the MIT license found in the
6
+ // LICENSE file in the root directory of this source tree.
7
+ //
8
+
9
+ #ifdef RCT_NEW_ARCH_ENABLED
10
+
11
+ #import "TrueSheetHeaderView.h"
12
+ #import <react/renderer/components/TrueSheetSpec/ComponentDescriptors.h>
13
+ #import <react/renderer/components/TrueSheetSpec/EventEmitters.h>
14
+ #import <react/renderer/components/TrueSheetSpec/Props.h>
15
+ #import <react/renderer/components/TrueSheetSpec/RCTComponentViewHelpers.h>
16
+ #import "utils/UIView+ScrollEdgeInteraction.h"
17
+
18
+ using namespace facebook::react;
19
+
20
+ @implementation TrueSheetHeaderView {
21
+ CGSize _lastSize;
22
+ }
23
+
24
+ + (ComponentDescriptorProvider)componentDescriptorProvider {
25
+ return concreteComponentDescriptorProvider<TrueSheetHeaderViewComponentDescriptor>();
26
+ }
27
+
28
+ - (instancetype)initWithFrame:(CGRect)frame {
29
+ if (self = [super initWithFrame:frame]) {
30
+ static const auto defaultProps = std::make_shared<const TrueSheetHeaderViewProps>();
31
+ _props = defaultProps;
32
+
33
+ _lastSize = CGSizeZero;
34
+ }
35
+ return self;
36
+ }
37
+
38
+ - (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics
39
+ oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics {
40
+ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
41
+
42
+ CGSize newSize = CGSizeMake(layoutMetrics.frame.size.width, layoutMetrics.frame.size.height);
43
+
44
+ if (!CGSizeEqualToSize(newSize, _lastSize)) {
45
+ _lastSize = newSize;
46
+ [self.delegate headerViewDidChangeSize:newSize];
47
+ }
48
+ }
49
+
50
+ - (void)prepareForRecycle {
51
+ [super prepareForRecycle];
52
+ _lastSize = CGSizeZero;
53
+ if (@available(iOS 26.0, *)) {
54
+ [self cleanupEdgeInteraction];
55
+ }
56
+ }
57
+
58
+ @end
59
+
60
+ Class<RCTComponentViewProtocol> TrueSheetHeaderViewCls(void) {
61
+ return TrueSheetHeaderView.class;
62
+ }
63
+
64
+ #endif
@@ -14,6 +14,7 @@
14
14
  #import "TrueSheetModule.h"
15
15
  #import <React/RCTUtils.h>
16
16
  #import "TrueSheetView.h"
17
+ #import "TrueSheetViewController.h"
17
18
 
18
19
  #import <TrueSheetSpec/TrueSheetSpec.h>
19
20
 
@@ -46,6 +47,7 @@ RCT_EXPORT_MODULE(TrueSheetModule)
46
47
 
47
48
  - (void)presentByRef:(double)viewTag
48
49
  index:(double)index
50
+ animated:(BOOL)animated
49
51
  resolve:(RCTPromiseResolveBlock)resolve
50
52
  reject:(RCTPromiseRejectBlock)reject {
51
53
  RCTExecuteOnMainQueue(^{
@@ -57,7 +59,7 @@ RCT_EXPORT_MODULE(TrueSheetModule)
57
59
  }
58
60
 
59
61
  [trueSheetView presentAtIndex:(NSInteger)index
60
- animated:YES
62
+ animated:animated
61
63
  completion:^(BOOL success, NSError *_Nullable error) {
62
64
  if (success) {
63
65
  resolve(nil);
@@ -68,7 +70,10 @@ RCT_EXPORT_MODULE(TrueSheetModule)
68
70
  });
69
71
  }
70
72
 
71
- - (void)dismissByRef:(double)viewTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
73
+ - (void)dismissByRef:(double)viewTag
74
+ animated:(BOOL)animated
75
+ resolve:(RCTPromiseResolveBlock)resolve
76
+ reject:(RCTPromiseRejectBlock)reject {
72
77
  RCTExecuteOnMainQueue(^{
73
78
  TrueSheetView *trueSheetView = [TrueSheetModule getTrueSheetViewByTag:@((NSInteger)viewTag)];
74
79
 
@@ -77,7 +82,7 @@ RCT_EXPORT_MODULE(TrueSheetModule)
77
82
  return;
78
83
  }
79
84
 
80
- [trueSheetView dismissAnimated:YES
85
+ [trueSheetView dismissAnimated:animated
81
86
  completion:^(BOOL success, NSError *_Nullable error) {
82
87
  if (success) {
83
88
  resolve(nil);
@@ -88,12 +93,94 @@ RCT_EXPORT_MODULE(TrueSheetModule)
88
93
  });
89
94
  }
90
95
 
96
+ - (void)dismissStackByRef:(double)viewTag
97
+ animated:(BOOL)animated
98
+ resolve:(RCTPromiseResolveBlock)resolve
99
+ reject:(RCTPromiseRejectBlock)reject {
100
+ RCTExecuteOnMainQueue(^{
101
+ TrueSheetView *trueSheetView = [TrueSheetModule getTrueSheetViewByTag:@((NSInteger)viewTag)];
102
+
103
+ if (!trueSheetView) {
104
+ reject(@"SHEET_NOT_FOUND", [NSString stringWithFormat:@"No sheet found with tag %d", (int)viewTag], nil);
105
+ return;
106
+ }
107
+
108
+ [trueSheetView
109
+ dismissStackAnimated:animated
110
+ completion:^(BOOL success, NSError *_Nullable error) {
111
+ if (success) {
112
+ resolve(nil);
113
+ } else {
114
+ reject(@"DISMISS_FAILED", error.localizedDescription ?: @"Failed to dismiss stack", error);
115
+ }
116
+ }];
117
+ });
118
+ }
119
+
91
120
  - (void)resizeByRef:(double)viewTag
92
121
  index:(double)index
93
122
  resolve:(RCTPromiseResolveBlock)resolve
94
123
  reject:(RCTPromiseRejectBlock)reject {
95
- // Resize is just present with a different index
96
- [self presentByRef:viewTag index:index resolve:resolve reject:reject];
124
+ RCTExecuteOnMainQueue(^{
125
+ TrueSheetView *trueSheetView = [TrueSheetModule getTrueSheetViewByTag:@((NSInteger)viewTag)];
126
+
127
+ if (!trueSheetView) {
128
+ reject(@"SHEET_NOT_FOUND", [NSString stringWithFormat:@"No sheet found with tag %d", (int)viewTag], nil);
129
+ return;
130
+ }
131
+
132
+ [trueSheetView resizeToIndex:(NSInteger)index
133
+ completion:^(BOOL success, NSError *_Nullable error) {
134
+ if (success) {
135
+ resolve(nil);
136
+ } else {
137
+ reject(@"RESIZE_FAILED", error.localizedDescription ?: @"Failed to resize sheet", error);
138
+ }
139
+ }];
140
+ });
141
+ }
142
+
143
+ - (void)handleBackPress:(double)viewTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
144
+ // No-op on iOS — no hardware back button
145
+ resolve(nil);
146
+ }
147
+
148
+ - (void)dismissAll:(BOOL)animated resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
149
+ RCTExecuteOnMainQueue(^{
150
+ @synchronized(viewRegistry) {
151
+ // Find the root presented sheet (one without a parent TrueSheet)
152
+ TrueSheetView *rootSheet = nil;
153
+
154
+ for (TrueSheetView *view in viewRegistry.allValues) {
155
+ if (!view.viewController.isPresented) {
156
+ continue;
157
+ }
158
+
159
+ UIViewController *presenter = view.viewController.presentingViewController;
160
+ BOOL hasParentSheet = [presenter isKindOfClass:[TrueSheetViewController class]];
161
+
162
+ if (!hasParentSheet) {
163
+ rootSheet = view;
164
+ break;
165
+ }
166
+ }
167
+
168
+ if (!rootSheet) {
169
+ resolve(nil);
170
+ return;
171
+ }
172
+
173
+ [rootSheet emitDismissedPosition];
174
+ [rootSheet dismissAnimated:animated
175
+ completion:^(BOOL success, NSError *_Nullable error) {
176
+ if (success) {
177
+ resolve(nil);
178
+ } else {
179
+ reject(@"DISMISS_FAILED", error.localizedDescription ?: @"Failed to dismiss sheets", error);
180
+ }
181
+ }];
182
+ }
183
+ });
97
184
  }
98
185
 
99
186
  #pragma mark - Helper Methods
@@ -0,0 +1,32 @@
1
+ //
2
+ // Created by Jovanni Lo (@lodev09)
3
+ // Copyright (c) 2024-present. All rights reserved.
4
+ //
5
+ // This source code is licensed under the MIT license found in the
6
+ // LICENSE file in the root directory of this source tree.
7
+ //
8
+
9
+ #ifdef RCT_NEW_ARCH_ENABLED
10
+
11
+ #import <React/RCTViewComponentView.h>
12
+ #import <UIKit/UIKit.h>
13
+
14
+ NS_ASSUME_NONNULL_BEGIN
15
+
16
+ @class TrueSheetPeekView;
17
+
18
+ @protocol TrueSheetPeekViewDelegate <NSObject>
19
+ @optional
20
+ - (void)peekViewDidChangeSize:(CGSize)size;
21
+ - (void)peekViewWillDetach:(TrueSheetPeekView *)peekView;
22
+ @end
23
+
24
+ @interface TrueSheetPeekView : RCTViewComponentView
25
+
26
+ @property (nonatomic, weak, nullable) id<TrueSheetPeekViewDelegate> delegate;
27
+
28
+ @end
29
+
30
+ NS_ASSUME_NONNULL_END
31
+
32
+ #endif
@@ -0,0 +1,99 @@
1
+ //
2
+ // Created by Jovanni Lo (@lodev09)
3
+ // Copyright (c) 2024-present. All rights reserved.
4
+ //
5
+ // This source code is licensed under the MIT license found in the
6
+ // LICENSE file in the root directory of this source tree.
7
+ //
8
+
9
+ #ifdef RCT_NEW_ARCH_ENABLED
10
+
11
+ #import "TrueSheetPeekView.h"
12
+ #import <react/renderer/components/TrueSheetSpec/ComponentDescriptors.h>
13
+ #import <react/renderer/components/TrueSheetSpec/EventEmitters.h>
14
+ #import <react/renderer/components/TrueSheetSpec/Props.h>
15
+ #import <react/renderer/components/TrueSheetSpec/RCTComponentViewHelpers.h>
16
+ #import "TrueSheetContainerView.h"
17
+
18
+ using namespace facebook::react;
19
+
20
+ @implementation TrueSheetPeekView {
21
+ CGRect _lastFrame;
22
+ }
23
+
24
+ + (ComponentDescriptorProvider)componentDescriptorProvider {
25
+ return concreteComponentDescriptorProvider<TrueSheetPeekViewComponentDescriptor>();
26
+ }
27
+
28
+ - (instancetype)initWithFrame:(CGRect)frame {
29
+ if (self = [super initWithFrame:frame]) {
30
+ static const auto defaultProps = std::make_shared<const TrueSheetPeekViewProps>();
31
+ _props = defaultProps;
32
+
33
+ _lastFrame = CGRectZero;
34
+ }
35
+ return self;
36
+ }
37
+
38
+ /**
39
+ * Peek can be nested anywhere within the content, so it attaches itself to the
40
+ * nearest container instead of being mounted by it. The container also searches
41
+ * for it when the content mounts to cover the initial (bottom-up) mount order.
42
+ */
43
+ - (void)attachToContainerView {
44
+ if (self.delegate) {
45
+ return;
46
+ }
47
+
48
+ UIView *view = self.superview;
49
+ while (view && ![view isKindOfClass:[TrueSheetContainerView class]]) {
50
+ view = view.superview;
51
+ }
52
+
53
+ if (view) {
54
+ [(TrueSheetContainerView *)view attachPeekView:self];
55
+ }
56
+ }
57
+
58
+ - (void)didMoveToSuperview {
59
+ [super didMoveToSuperview];
60
+ if (self.superview) {
61
+ [self attachToContainerView];
62
+ }
63
+ }
64
+
65
+ - (void)didMoveToWindow {
66
+ [super didMoveToWindow];
67
+ if (self.window) {
68
+ [self attachToContainerView];
69
+ }
70
+ }
71
+
72
+ - (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics
73
+ oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics {
74
+ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
75
+
76
+ // Compare the whole frame — the peek's offset within the content affects
77
+ // the peek detent, so position changes matter too.
78
+ CGRect newFrame = CGRectMake(layoutMetrics.frame.origin.x, layoutMetrics.frame.origin.y,
79
+ layoutMetrics.frame.size.width, layoutMetrics.frame.size.height);
80
+
81
+ if (!CGRectEqualToRect(newFrame, _lastFrame)) {
82
+ _lastFrame = newFrame;
83
+ [self.delegate peekViewDidChangeSize:newFrame.size];
84
+ }
85
+ }
86
+
87
+ - (void)prepareForRecycle {
88
+ [super prepareForRecycle];
89
+ _lastFrame = CGRectZero;
90
+ [self.delegate peekViewWillDetach:self];
91
+ }
92
+
93
+ @end
94
+
95
+ Class<RCTComponentViewProtocol> TrueSheetPeekViewCls(void) {
96
+ return TrueSheetPeekView.class;
97
+ }
98
+
99
+ #endif
@@ -23,21 +23,7 @@ typedef void (^TrueSheetCompletionBlock)(BOOL success, NSError *_Nullable error)
23
23
 
24
24
  @interface TrueSheetView : RCTViewComponentView
25
25
 
26
- ///**
27
- // * The view controller managing the sheet presentation
28
- // * Exposed so container can access it
29
- // */
30
- //@property (nonatomic, readonly, strong) TrueSheetViewController *controller;
31
- //
32
- ///**
33
- // * Whether the sheet is currently presented
34
- // */
35
- //@property (nonatomic, readonly) BOOL isPresented;
36
- //
37
- ///**
38
- // * The currently active detent index
39
- // */
40
- //@property (nonatomic, readonly, strong, nullable) NSNumber *activeIndex;
26
+ @property (nonatomic, readonly) TrueSheetViewController *viewController;
41
27
 
42
28
  // TurboModule methods
43
29
  - (void)presentAtIndex:(NSInteger)index
@@ -46,6 +32,12 @@ typedef void (^TrueSheetCompletionBlock)(BOOL success, NSError *_Nullable error)
46
32
 
47
33
  - (void)dismissAnimated:(BOOL)animated completion:(nullable TrueSheetCompletionBlock)completion;
48
34
 
35
+ - (void)emitDismissedPosition;
36
+
37
+ - (void)resizeToIndex:(NSInteger)index completion:(nullable TrueSheetCompletionBlock)completion;
38
+
39
+ - (void)dismissStackAnimated:(BOOL)animated completion:(nullable TrueSheetCompletionBlock)completion;
40
+
49
41
  @end
50
42
 
51
43
  NS_ASSUME_NONNULL_END