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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +62 -30
  3. package/RNTrueSheet.podspec +10 -2
  4. package/android/build.gradle +24 -2
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +189 -47
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +401 -19
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +18 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +145 -21
  10. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
  11. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
  12. package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
  13. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
  14. package/android/src/main/java/com/lodev09/truesheet/TrueSheetOverlayView.kt +106 -0
  15. package/android/src/main/java/com/lodev09/truesheet/TrueSheetOverlayViewManager.kt +45 -0
  16. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +6 -4
  17. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
  18. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
  19. package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +63 -0
  20. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +564 -226
  21. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1399 -598
  22. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +161 -29
  23. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
  24. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
  25. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
  26. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +375 -0
  27. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +299 -0
  28. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
  29. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
  30. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
  31. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetOverlayRootView.kt +137 -0
  32. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
  33. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  34. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  35. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +127 -0
  36. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  37. package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
  38. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
  39. package/android/src/main/java/com/lodev09/truesheet/utils/TouchEventDeduper.kt +31 -0
  40. package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +42 -0
  41. package/android/src/main/jni/CMakeLists.txt +63 -0
  42. package/android/src/main/jni/TrueSheetSpec.h +20 -0
  43. package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
  44. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +16 -0
  45. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +68 -0
  46. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +33 -0
  47. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
  48. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +39 -0
  49. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
  50. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +63 -0
  51. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
  52. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
  53. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
  54. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
  55. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
  56. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetLayoutUtils.h +46 -0
  57. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewComponentDescriptor.h +21 -0
  58. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.cpp +17 -0
  59. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.h +36 -0
  60. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
  61. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +30 -0
  62. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
  63. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
  64. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
  65. package/ios/TrueSheetContainerView.h +88 -6
  66. package/ios/TrueSheetContainerView.mm +278 -21
  67. package/ios/TrueSheetContentView.h +54 -1
  68. package/ios/TrueSheetContentView.mm +371 -47
  69. package/ios/TrueSheetFooterView.h +33 -2
  70. package/ios/TrueSheetFooterView.mm +187 -35
  71. package/ios/{events/OnWillDismissEvent.h → TrueSheetHeaderView.h} +10 -7
  72. package/ios/TrueSheetHeaderView.mm +64 -0
  73. package/ios/TrueSheetModule.h +2 -7
  74. package/ios/TrueSheetModule.mm +98 -20
  75. package/ios/TrueSheetOverlayView.h +32 -0
  76. package/ios/TrueSheetOverlayView.mm +161 -0
  77. package/ios/TrueSheetPeekView.h +32 -0
  78. package/ios/TrueSheetPeekView.mm +99 -0
  79. package/ios/TrueSheetView.h +7 -15
  80. package/ios/TrueSheetView.mm +775 -215
  81. package/ios/TrueSheetViewController.h +94 -16
  82. package/ios/TrueSheetViewController.mm +1316 -331
  83. package/ios/core/RNScreensEventObserver.h +46 -0
  84. package/ios/core/RNScreensEventObserver.mm +280 -0
  85. package/ios/core/TrueSheetBlurView.h +27 -0
  86. package/ios/core/TrueSheetBlurView.mm +82 -0
  87. package/ios/core/TrueSheetDetentCalculator.h +107 -0
  88. package/ios/core/TrueSheetDetentCalculator.mm +197 -0
  89. package/ios/core/TrueSheetGrabberView.h +72 -0
  90. package/ios/core/TrueSheetGrabberView.mm +188 -0
  91. package/ios/core/TrueSheetKeyboardObserver.h +39 -0
  92. package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
  93. package/ios/core/TrueSheetOverlayContainerView.h +31 -0
  94. package/ios/core/TrueSheetOverlayContainerView.mm +35 -0
  95. package/ios/events/TrueSheetDragEvents.h +39 -0
  96. package/ios/events/TrueSheetDragEvents.mm +62 -0
  97. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  98. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  99. package/ios/events/TrueSheetLifecycleEvents.h +42 -0
  100. package/ios/events/TrueSheetLifecycleEvents.mm +79 -0
  101. package/ios/events/TrueSheetStateEvents.h +35 -0
  102. package/ios/events/TrueSheetStateEvents.mm +49 -0
  103. package/ios/tvos/TrueSheetStubs.mm +166 -0
  104. package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
  105. package/ios/utils/BlurUtil.mm +69 -0
  106. package/ios/utils/GestureUtil.h +7 -0
  107. package/ios/utils/GestureUtil.mm +12 -0
  108. package/ios/utils/PlatformUtil.h +15 -0
  109. package/ios/utils/UIView+FirstResponder.h +15 -0
  110. package/ios/utils/UIView+FirstResponder.mm +26 -0
  111. package/ios/utils/UIView+ScrollEdgeInteraction.h +26 -0
  112. package/ios/utils/UIView+ScrollEdgeInteraction.mm +84 -0
  113. package/ios/utils/WindowUtil.mm +17 -1
  114. package/lib/module/TrueSheet.js +349 -74
  115. package/lib/module/TrueSheet.js.map +1 -1
  116. package/lib/module/TrueSheet.web.js +1270 -0
  117. package/lib/module/TrueSheet.web.js.map +1 -0
  118. package/lib/module/TrueSheetOverlay.js +30 -0
  119. package/lib/module/TrueSheetOverlay.js.map +1 -0
  120. package/lib/module/TrueSheetOverlay.web.js +35 -0
  121. package/lib/module/TrueSheetOverlay.web.js.map +1 -0
  122. package/lib/module/TrueSheetPeek.js +15 -0
  123. package/lib/module/TrueSheetPeek.js.map +1 -0
  124. package/lib/module/TrueSheetPeek.web.js +55 -0
  125. package/lib/module/TrueSheetPeek.web.js.map +1 -0
  126. package/lib/module/TrueSheetProvider.js +28 -0
  127. package/lib/module/TrueSheetProvider.js.map +1 -0
  128. package/lib/module/TrueSheetProvider.web.js +157 -0
  129. package/lib/module/TrueSheetProvider.web.js.map +1 -0
  130. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  131. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  132. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  133. package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  134. package/lib/module/fabric/TrueSheetOverlayViewNativeComponent.ts +12 -0
  135. package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  136. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +110 -18
  137. package/lib/module/index.js +4 -3
  138. package/lib/module/index.js.map +1 -1
  139. package/lib/module/mocks/index.js +103 -0
  140. package/lib/module/mocks/index.js.map +1 -0
  141. package/lib/module/mocks/navigation.js +95 -0
  142. package/lib/module/mocks/navigation.js.map +1 -0
  143. package/lib/module/mocks/navigationExpoRouter.js +21 -0
  144. package/lib/module/mocks/navigationExpoRouter.js.map +1 -0
  145. package/lib/module/mocks/reanimated.js +91 -0
  146. package/lib/module/mocks/reanimated.js.map +1 -0
  147. package/lib/module/navigation/TrueSheetNavigatorContent.js +73 -0
  148. package/lib/module/navigation/TrueSheetNavigatorContent.js.map +1 -0
  149. package/lib/module/navigation/actions.js +50 -0
  150. package/lib/module/navigation/actions.js.map +1 -0
  151. package/lib/module/navigation/base-types.js +2 -0
  152. package/lib/module/navigation/base-types.js.map +1 -0
  153. package/lib/module/navigation/createTrueSheetRouter.js +157 -0
  154. package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
  155. package/lib/module/navigation/expo-router/base-types.js +2 -0
  156. package/lib/module/navigation/expo-router/base-types.js.map +1 -0
  157. package/lib/module/navigation/expo-router/index.js +50 -0
  158. package/lib/module/navigation/expo-router/index.js.map +1 -0
  159. package/lib/module/navigation/expo-router/types.js +4 -0
  160. package/lib/module/navigation/expo-router/types.js.map +1 -0
  161. package/lib/module/navigation/index.js +47 -0
  162. package/lib/module/navigation/index.js.map +1 -0
  163. package/lib/module/navigation/navigator.js +10 -0
  164. package/lib/module/navigation/navigator.js.map +1 -0
  165. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  166. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  167. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  168. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  169. package/lib/module/navigation/screen/index.js +5 -0
  170. package/lib/module/navigation/screen/index.js.map +1 -0
  171. package/lib/module/navigation/screen/types.js +4 -0
  172. package/lib/module/navigation/screen/types.js.map +1 -0
  173. package/lib/module/navigation/screen/useSheetScreenState.js +69 -0
  174. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  175. package/lib/module/navigation/types.js +4 -0
  176. package/lib/module/navigation/types.js.map +1 -0
  177. package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
  178. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
  179. package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
  180. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  181. package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
  182. package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
  183. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  184. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  185. package/lib/module/reanimated/index.js +2 -2
  186. package/lib/module/reanimated/index.js.map +1 -1
  187. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
  188. package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
  189. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
  190. package/lib/module/web/constants.js +16 -0
  191. package/lib/module/web/constants.js.map +1 -0
  192. package/lib/module/web/dom.js +10 -0
  193. package/lib/module/web/dom.js.map +1 -0
  194. package/lib/module/web/vaul/README.md +9 -0
  195. package/lib/module/web/vaul/browser.js +30 -0
  196. package/lib/module/web/vaul/browser.js.map +1 -0
  197. package/lib/module/web/vaul/constants.js +19 -0
  198. package/lib/module/web/vaul/constants.js.map +1 -0
  199. package/lib/module/web/vaul/context.js +59 -0
  200. package/lib/module/web/vaul/context.js.map +1 -0
  201. package/lib/module/web/vaul/helpers.js +99 -0
  202. package/lib/module/web/vaul/helpers.js.map +1 -0
  203. package/lib/module/web/vaul/index.js +1342 -0
  204. package/lib/module/web/vaul/index.js.map +1 -0
  205. package/lib/module/web/vaul/style.css +287 -0
  206. package/lib/module/web/vaul/style.css.d.js +2 -0
  207. package/lib/module/web/vaul/style.css.d.js.map +1 -0
  208. package/lib/module/web/vaul/types.js +2 -0
  209. package/lib/module/web/vaul/types.js.map +1 -0
  210. package/lib/module/web/vaul/use-composed-refs.js +34 -0
  211. package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
  212. package/lib/module/web/vaul/use-controllable-state.js +54 -0
  213. package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
  214. package/lib/module/web/vaul/use-position-fixed.js +123 -0
  215. package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
  216. package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
  217. package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
  218. package/lib/module/web/vaul/use-scale-background.js +57 -0
  219. package/lib/module/web/vaul/use-scale-background.js.map +1 -0
  220. package/lib/module/web/vaul/use-snap-points.js +305 -0
  221. package/lib/module/web/vaul/use-snap-points.js.map +1 -0
  222. package/lib/typescript/src/TrueSheet.d.ts +57 -14
  223. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  224. package/lib/typescript/src/TrueSheet.types.d.ts +535 -55
  225. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  226. package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
  227. package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
  228. package/lib/typescript/src/TrueSheetOverlay.d.ts +8 -0
  229. package/lib/typescript/src/TrueSheetOverlay.d.ts.map +1 -0
  230. package/lib/typescript/src/TrueSheetOverlay.web.d.ts +8 -0
  231. package/lib/typescript/src/TrueSheetOverlay.web.d.ts.map +1 -0
  232. package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
  233. package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
  234. package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
  235. package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
  236. package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
  237. package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
  238. package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
  239. package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
  240. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
  241. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
  242. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
  243. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
  244. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
  245. package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
  246. package/lib/typescript/src/fabric/TrueSheetOverlayViewNativeComponent.d.ts +6 -0
  247. package/lib/typescript/src/fabric/TrueSheetOverlayViewNativeComponent.d.ts.map +1 -0
  248. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
  249. package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
  250. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +71 -16
  251. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  252. package/lib/typescript/src/index.d.ts +3 -2
  253. package/lib/typescript/src/index.d.ts.map +1 -1
  254. package/lib/typescript/src/mocks/index.d.ts +47 -0
  255. package/lib/typescript/src/mocks/index.d.ts.map +1 -0
  256. package/lib/typescript/src/mocks/navigation.d.ts +70 -0
  257. package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
  258. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts +22 -0
  259. package/lib/typescript/src/mocks/navigationExpoRouter.d.ts.map +1 -0
  260. package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
  261. package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
  262. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts +5 -0
  263. package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts.map +1 -0
  264. package/lib/typescript/src/navigation/actions.d.ts +71 -0
  265. package/lib/typescript/src/navigation/actions.d.ts.map +1 -0
  266. package/lib/typescript/src/navigation/base-types.d.ts +9 -0
  267. package/lib/typescript/src/navigation/base-types.d.ts.map +1 -0
  268. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +3 -0
  269. package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
  270. package/lib/typescript/src/navigation/expo-router/base-types.d.ts +8 -0
  271. package/lib/typescript/src/navigation/expo-router/base-types.d.ts.map +1 -0
  272. package/lib/typescript/src/navigation/expo-router/index.d.ts +37 -0
  273. package/lib/typescript/src/navigation/expo-router/index.d.ts.map +1 -0
  274. package/lib/typescript/src/navigation/expo-router/types.d.ts +44 -0
  275. package/lib/typescript/src/navigation/expo-router/types.d.ts.map +1 -0
  276. package/lib/typescript/src/navigation/index.d.ts +45 -0
  277. package/lib/typescript/src/navigation/index.d.ts.map +1 -0
  278. package/lib/typescript/src/navigation/navigator.d.ts +7 -0
  279. package/lib/typescript/src/navigation/navigator.d.ts.map +1 -0
  280. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  281. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  282. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  283. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  284. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  285. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  286. package/lib/typescript/src/navigation/screen/types.d.ts +14 -0
  287. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  288. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +34 -0
  289. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  290. package/lib/typescript/src/navigation/types.d.ts +213 -0
  291. package/lib/typescript/src/navigation/types.d.ts.map +1 -0
  292. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
  293. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
  294. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  295. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
  296. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
  297. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  298. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  299. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
  300. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
  301. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
  302. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
  303. package/lib/typescript/src/web/constants.d.ts +14 -0
  304. package/lib/typescript/src/web/constants.d.ts.map +1 -0
  305. package/lib/typescript/src/web/dom.d.ts +7 -0
  306. package/lib/typescript/src/web/dom.d.ts.map +1 -0
  307. package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
  308. package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
  309. package/lib/typescript/src/web/vaul/constants.d.ts +14 -0
  310. package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
  311. package/lib/typescript/src/web/vaul/context.d.ts +54 -0
  312. package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
  313. package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
  314. package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
  315. package/lib/typescript/src/web/vaul/index.d.ts +234 -0
  316. package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
  317. package/lib/typescript/src/web/vaul/types.d.ts +7 -0
  318. package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
  319. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
  320. package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
  321. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
  322. package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
  323. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
  324. package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
  325. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
  326. package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
  327. package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
  328. package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
  329. package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
  330. package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
  331. package/package.json +104 -37
  332. package/react-native.config.js +10 -2
  333. package/src/TrueSheet.tsx +424 -70
  334. package/src/TrueSheet.types.ts +602 -72
  335. package/src/TrueSheet.web.tsx +1437 -0
  336. package/src/TrueSheetOverlay.tsx +24 -0
  337. package/src/TrueSheetOverlay.web.tsx +33 -0
  338. package/src/TrueSheetPeek.tsx +11 -0
  339. package/src/TrueSheetPeek.web.tsx +64 -0
  340. package/src/TrueSheetProvider.tsx +33 -0
  341. package/src/TrueSheetProvider.web.tsx +220 -0
  342. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
  343. package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
  344. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
  345. package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
  346. package/src/fabric/TrueSheetOverlayViewNativeComponent.ts +12 -0
  347. package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
  348. package/src/fabric/TrueSheetViewNativeComponent.ts +110 -18
  349. package/src/index.ts +3 -2
  350. package/src/mocks/index.ts +96 -0
  351. package/src/mocks/navigation.ts +79 -0
  352. package/src/mocks/navigationExpoRouter.ts +41 -0
  353. package/src/mocks/reanimated.ts +100 -0
  354. package/src/navigation/TrueSheetNavigatorContent.tsx +106 -0
  355. package/src/navigation/actions.ts +78 -0
  356. package/src/navigation/base-types.ts +20 -0
  357. package/src/navigation/createTrueSheetRouter.ts +194 -0
  358. package/src/navigation/expo-router/base-types.ts +18 -0
  359. package/src/navigation/expo-router/index.ts +90 -0
  360. package/src/navigation/expo-router/types.ts +116 -0
  361. package/src/navigation/index.ts +80 -0
  362. package/src/navigation/navigator.ts +18 -0
  363. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  364. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  365. package/src/navigation/screen/index.ts +3 -0
  366. package/src/navigation/screen/types.ts +19 -0
  367. package/src/navigation/screen/useSheetScreenState.ts +102 -0
  368. package/src/navigation/types.ts +302 -0
  369. package/src/navigation/useTrueSheetNavigation.ts +26 -0
  370. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  371. package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
  372. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
  373. package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
  374. package/src/specs/NativeTrueSheetModule.ts +28 -3
  375. package/src/web/constants.ts +13 -0
  376. package/src/web/dom.ts +9 -0
  377. package/src/web/vaul/README.md +9 -0
  378. package/src/web/vaul/browser.ts +38 -0
  379. package/src/web/vaul/constants.ts +24 -0
  380. package/src/web/vaul/context.ts +102 -0
  381. package/src/web/vaul/helpers.ts +131 -0
  382. package/src/web/vaul/index.tsx +1785 -0
  383. package/src/web/vaul/style.css +287 -0
  384. package/src/web/vaul/style.css.d.ts +1 -0
  385. package/src/web/vaul/types.ts +7 -0
  386. package/src/web/vaul/use-composed-refs.ts +35 -0
  387. package/src/web/vaul/use-controllable-state.ts +66 -0
  388. package/src/web/vaul/use-position-fixed.ts +147 -0
  389. package/src/web/vaul/use-prevent-scroll.ts +309 -0
  390. package/src/web/vaul/use-scale-background.ts +64 -0
  391. package/src/web/vaul/use-snap-points.ts +455 -0
  392. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  393. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  394. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  395. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  396. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  397. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  398. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  399. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  400. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
  401. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  402. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  403. package/android/src/main/res/values/styles.xml +0 -8
  404. package/ios/events/OnDetentChangeEvent.h +0 -28
  405. package/ios/events/OnDetentChangeEvent.mm +0 -30
  406. package/ios/events/OnDidDismissEvent.h +0 -26
  407. package/ios/events/OnDidDismissEvent.mm +0 -25
  408. package/ios/events/OnDidPresentEvent.h +0 -28
  409. package/ios/events/OnDidPresentEvent.mm +0 -30
  410. package/ios/events/OnDragBeginEvent.h +0 -28
  411. package/ios/events/OnDragBeginEvent.mm +0 -30
  412. package/ios/events/OnDragChangeEvent.h +0 -28
  413. package/ios/events/OnDragChangeEvent.mm +0 -30
  414. package/ios/events/OnDragEndEvent.h +0 -28
  415. package/ios/events/OnDragEndEvent.mm +0 -30
  416. package/ios/events/OnMountEvent.mm +0 -25
  417. package/ios/events/OnPositionChangeEvent.mm +0 -32
  418. package/ios/events/OnSizeChangeEvent.h +0 -28
  419. package/ios/events/OnSizeChangeEvent.mm +0 -30
  420. package/ios/events/OnWillDismissEvent.mm +0 -25
  421. package/ios/events/OnWillPresentEvent.h +0 -28
  422. package/ios/events/OnWillPresentEvent.mm +0 -30
  423. package/ios/utils/LayoutUtil.h +0 -44
  424. package/ios/utils/LayoutUtil.mm +0 -50
  425. package/lib/module/TrueSheetGrabber.js +0 -51
  426. package/lib/module/TrueSheetGrabber.js.map +0 -1
  427. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  428. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  429. package/src/TrueSheetGrabber.tsx +0 -82
  430. package/src/__mocks__/index.js +0 -67
@@ -9,25 +9,57 @@
9
9
  #ifdef RCT_NEW_ARCH_ENABLED
10
10
 
11
11
  #import "TrueSheetContainerView.h"
12
+ #import <React/RCTScrollViewComponentView.h>
13
+ #import "TrueSheetContentView.h"
14
+ #import "TrueSheetFooterView.h"
15
+ #import "TrueSheetHeaderView.h"
16
+ #import "TrueSheetPeekView.h"
17
+ #import "TrueSheetViewController.h"
18
+ #import "core/TrueSheetKeyboardObserver.h"
19
+ #import "utils/UIView+ScrollEdgeInteraction.h"
20
+
12
21
  #import <react/renderer/components/TrueSheetSpec/ComponentDescriptors.h>
13
22
  #import <react/renderer/components/TrueSheetSpec/EventEmitters.h>
14
23
  #import <react/renderer/components/TrueSheetSpec/Props.h>
15
24
  #import <react/renderer/components/TrueSheetSpec/RCTComponentViewHelpers.h>
16
- #import "TrueSheetContentView.h"
17
- #import "TrueSheetFooterView.h"
18
25
 
19
26
  #import <React/RCTConversions.h>
27
+ #import <React/RCTLog.h>
20
28
 
21
29
  using namespace facebook::react;
22
30
 
23
- @interface TrueSheetContainerView () <TrueSheetContentViewDelegate>
31
+ @implementation ScrollableOptions
32
+
33
+ - (instancetype)init {
34
+ if (self = [super init]) {
35
+ _contentInsetAdjustment = YES;
36
+ _keyboardScrollOffset = 0;
37
+ _keyboardOffset = 0;
38
+ _scrollingExpandsSheet = YES;
39
+ _topScrollEdgeEffect = TrueSheetViewTopScrollEdgeEffect::Hidden;
40
+ _bottomScrollEdgeEffect = TrueSheetViewBottomScrollEdgeEffect::Hidden;
41
+ }
42
+ return self;
43
+ }
44
+
45
+ @end
46
+
47
+ @interface TrueSheetContainerView () <TrueSheetContentViewDelegate,
48
+ TrueSheetHeaderViewDelegate,
49
+ TrueSheetFooterViewDelegate,
50
+ TrueSheetPeekViewDelegate>
24
51
  @end
25
52
 
26
53
  @implementation TrueSheetContainerView {
27
54
  TrueSheetContentView *_contentView;
55
+ TrueSheetHeaderView *_headerView;
28
56
  TrueSheetFooterView *_footerView;
57
+ TrueSheetPeekView *__weak _peekView;
58
+ TrueSheetKeyboardObserver *_keyboardObserver;
29
59
  }
30
60
 
61
+ #pragma mark - Initialization
62
+
31
63
  + (ComponentDescriptorProvider)componentDescriptorProvider {
32
64
  return concreteComponentDescriptorProvider<TrueSheetContainerViewComponentDescriptor>();
33
65
  }
@@ -38,62 +70,187 @@ using namespace facebook::react;
38
70
  _props = defaultProps;
39
71
 
40
72
  self.backgroundColor = [UIColor clearColor];
41
-
42
73
  _contentView = nil;
74
+ _headerView = nil;
43
75
  _footerView = nil;
76
+ self.isAccessibilityElement = NO;
44
77
  }
45
78
  return self;
46
79
  }
47
80
 
48
- - (void)dealloc {
81
+ #pragma mark - Accessibility
82
+
83
+ - (NSArray *)accessibilityElements {
84
+ NSMutableArray *elements = [NSMutableArray array];
85
+ if (_headerView) {
86
+ [elements addObject:_headerView];
87
+ }
88
+ if (_contentView) {
89
+ [elements addObject:_contentView];
90
+ }
91
+ if (_footerView) {
92
+ // Footer hosts are layout containers; expose their children when present so
93
+ // VoiceOver and XCTest can target the actual footer controls.
94
+ NSArray *footerElements = _footerView.accessibilityElements;
95
+ if (footerElements.count > 0) {
96
+ [elements addObjectsFromArray:footerElements];
97
+ } else {
98
+ [elements addObject:_footerView];
99
+ }
100
+ }
101
+ return elements;
49
102
  }
50
103
 
104
+ - (BOOL)hasAccessibilityFooterElements {
105
+ return _footerView && _footerView.accessibilityElements.count > 0;
106
+ }
107
+
108
+ #pragma mark - Layout
109
+
51
110
  - (CGFloat)contentHeight {
52
- return _contentView ? _contentView.frame.size.height : 0;
111
+ return _contentView ? _contentView.naturalHeight : 0;
53
112
  }
54
113
 
55
- - (void)layoutFooter {
56
- if (_footerView) {
57
- // Force footer to reapply constraints on size change
58
- CGFloat height = _footerView.frame.size.height;
59
- if (height > 0) {
60
- [_footerView setupConstraintsWithHeight:height];
114
+ - (CGFloat)headerHeight {
115
+ return _headerView ? _headerView.frame.size.height : 0;
116
+ }
117
+
118
+ - (CGFloat)footerHeight {
119
+ return _footerView ? _footerView.frame.size.height : 0;
120
+ }
121
+
122
+ - (CGFloat)footerAppliedBottomInset {
123
+ return _footerView ? _footerView.appliedBottomInset : 0;
124
+ }
125
+
126
+ // Distance from the top of the content view to the bottom of the peek view.
127
+ // Includes the peek view's offset within the content (padding, views above it)
128
+ // so the peek detent reveals everything down to the peek content's bottom edge.
129
+ - (CGFloat)peekContentHeight {
130
+ if (!_peekView) {
131
+ return 0;
132
+ }
133
+
134
+ if (!_contentView || ![_peekView isDescendantOfView:_contentView]) {
135
+ return _peekView.frame.size.height;
136
+ }
137
+
138
+ return CGRectGetMaxY([_peekView convertRect:_peekView.bounds toView:_contentView]);
139
+ }
140
+
141
+ - (void)updateFooterKeyboardOffset {
142
+ [_footerView applyKeyboardOffset];
143
+ }
144
+
145
+ - (void)setFooterBottomInset:(CGFloat)footerBottomInset {
146
+ _footerBottomInset = footerBottomInset;
147
+ [_footerView setBottomInset:footerBottomInset];
148
+ }
149
+
150
+ - (void)setScrollableOptions:(ScrollableOptions *)scrollableOptions {
151
+ _scrollableOptions = scrollableOptions;
152
+ _contentView.keyboardScrollOffset = scrollableOptions ? scrollableOptions.keyboardScrollOffset : 0;
153
+ _contentView.keyboardOffset = scrollableOptions ? scrollableOptions.keyboardOffset : 0;
154
+ }
155
+
156
+ - (void)setupScrollable {
157
+ if (_contentView) {
158
+ _contentView.scrollableHandle = _scrollableHandle;
159
+ _contentView.contentInsetAdjustment = _contentInsetAdjustment;
160
+ [_contentView setupScrollable];
161
+ [_contentView applyScrollEdgeEffects:_scrollableOptions];
162
+ if (@available(iOS 26.0, *)) {
163
+ [self setupEdgeInteractions];
61
164
  }
62
165
  }
63
166
  }
64
167
 
168
+ - (void)setupEdgeInteractions API_AVAILABLE(ios(26.0)) {
169
+ if (!_contentView) {
170
+ return;
171
+ }
172
+
173
+ auto topEffect =
174
+ _scrollableOptions ? _scrollableOptions.topScrollEdgeEffect : TrueSheetViewTopScrollEdgeEffect::Hidden;
175
+ auto bottomEffect =
176
+ _scrollableOptions ? _scrollableOptions.bottomScrollEdgeEffect : TrueSheetViewBottomScrollEdgeEffect::Hidden;
177
+
178
+ BOOL topHidden = topEffect == TrueSheetViewTopScrollEdgeEffect::Hidden;
179
+ BOOL bottomHidden = bottomEffect == TrueSheetViewBottomScrollEdgeEffect::Hidden;
180
+
181
+ RCTScrollViewComponentView *scrollViewComponent = [_contentView findScrollView];
182
+ UIScrollView *scrollView = scrollViewComponent.scrollView;
183
+
184
+ if (_headerView) {
185
+ [_headerView setupEdgeInteractionWithScrollView:topHidden ? nil : scrollView edge:UIRectEdgeTop];
186
+ }
187
+ if (_footerView) {
188
+ [_footerView setupEdgeInteractionWithScrollView:bottomHidden ? nil : scrollView edge:UIRectEdgeBottom];
189
+ }
190
+ }
191
+
192
+ #pragma mark - Child Component Mounting
193
+
65
194
  - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index {
66
195
  [super mountChildComponentView:childComponentView index:index];
67
196
 
68
- // Handle content view mounting
69
197
  if ([childComponentView isKindOfClass:[TrueSheetContentView class]]) {
70
198
  if (_contentView != nil) {
71
- NSLog(@"TrueSheet: Container can only have one content component.");
199
+ RCTLogWarn(@"TrueSheet: Container can only have one content component.");
72
200
  return;
73
201
  }
74
-
75
202
  _contentView = (TrueSheetContentView *)childComponentView;
76
203
  _contentView.delegate = self;
204
+ _contentView.footerView = _footerView;
205
+
206
+ // Children mount bottom-up, so the content subtree is complete here.
207
+ // Late-mounted peek views attach themselves instead (see TrueSheetPeekView).
208
+ TrueSheetPeekView *peekView = [self findPeekViewIn:_contentView];
209
+ if (peekView) {
210
+ [self attachPeekView:peekView];
211
+ }
212
+ }
213
+
214
+ if ([childComponentView isKindOfClass:[TrueSheetHeaderView class]]) {
215
+ if (_headerView != nil) {
216
+ RCTLogWarn(@"TrueSheet: Container can only have one header component.");
217
+ return;
218
+ }
219
+ _headerView = (TrueSheetHeaderView *)childComponentView;
220
+ _headerView.delegate = self;
221
+ [self headerViewDidChangeSize:_headerView.frame.size];
77
222
  }
78
223
 
79
- // Handle footer view mounting
80
224
  if ([childComponentView isKindOfClass:[TrueSheetFooterView class]]) {
81
225
  if (_footerView != nil) {
82
- NSLog(@"TrueSheet: Container can only have one footer component.");
226
+ RCTLogWarn(@"TrueSheet: Container can only have one footer component.");
83
227
  return;
84
228
  }
85
-
86
229
  _footerView = (TrueSheetFooterView *)childComponentView;
230
+ _footerView.delegate = self;
231
+ _contentView.footerView = _footerView;
232
+ [_footerView setBottomInset:_footerBottomInset];
233
+ [self footerViewDidChangeSize:_footerView.frame.size];
87
234
  }
88
235
  }
89
236
 
90
237
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index {
91
238
  if ([childComponentView isKindOfClass:[TrueSheetContentView class]]) {
239
+ _contentView.delegate = nil;
92
240
  _contentView = nil;
93
241
  }
94
242
 
243
+ if ([childComponentView isKindOfClass:[TrueSheetHeaderView class]]) {
244
+ _headerView.delegate = nil;
245
+ _headerView = nil;
246
+ [self headerViewDidChangeSize:CGSizeZero];
247
+ }
248
+
95
249
  if ([childComponentView isKindOfClass:[TrueSheetFooterView class]]) {
250
+ _footerView.delegate = nil;
96
251
  _footerView = nil;
252
+ _contentView.footerView = nil;
253
+ [self footerViewDidChangeSize:CGSizeZero];
97
254
  }
98
255
 
99
256
  [super unmountChildComponentView:childComponentView index:index];
@@ -106,12 +263,112 @@ using namespace facebook::react;
106
263
  #pragma mark - TrueSheetContentViewDelegate
107
264
 
108
265
  - (void)contentViewDidChangeSize:(CGSize)newSize {
109
- // Forward content size changes to host view for sheet resizing
110
- if ([self.delegate respondsToSelector:@selector(containerViewContentDidChangeSize:)]) {
111
- [self.delegate containerViewContentDidChangeSize:newSize];
266
+ [self.delegate containerViewContentDidChangeSize:newSize];
267
+ }
268
+
269
+ - (void)contentViewScrollViewDidChange {
270
+ [self.delegate containerViewScrollViewDidChange];
271
+ }
272
+
273
+ #pragma mark - TrueSheetHeaderViewDelegate
274
+
275
+ - (void)headerViewDidChangeSize:(CGSize)newSize {
276
+ [self.delegate containerViewHeaderDidChangeSize:newSize];
277
+ if (@available(iOS 26.0, *)) {
278
+ [self setupEdgeInteractions];
279
+ }
280
+ }
281
+
282
+ #pragma mark - TrueSheetFooterViewDelegate
283
+
284
+ - (void)footerViewDidChangeSize:(CGSize)newSize {
285
+ [self.delegate containerViewFooterDidChangeSize:newSize];
286
+ if (@available(iOS 26.0, *)) {
287
+ [self setupEdgeInteractions];
288
+ }
289
+ }
290
+
291
+ #pragma mark - TrueSheetPeekViewDelegate
292
+
293
+ - (nullable TrueSheetPeekView *)findPeekViewIn:(UIView *)view {
294
+ if ([view isKindOfClass:[TrueSheetPeekView class]]) {
295
+ return (TrueSheetPeekView *)view;
296
+ }
297
+
298
+ for (UIView *subview in view.subviews) {
299
+ TrueSheetPeekView *found = [self findPeekViewIn:subview];
300
+ if (found) {
301
+ return found;
302
+ }
303
+ }
304
+
305
+ return nil;
306
+ }
307
+
308
+ - (void)attachPeekView:(TrueSheetPeekView *)peekView {
309
+ if (_peekView == peekView) {
310
+ return;
311
+ }
312
+
313
+ if (_peekView != nil) {
314
+ RCTLogWarn(@"TrueSheet: Sheet can only have one peek component.");
315
+ return;
316
+ }
317
+
318
+ _peekView = peekView;
319
+ peekView.delegate = self;
320
+ [self peekViewDidChangeSize:peekView.frame.size];
321
+ }
322
+
323
+ - (void)peekViewDidChangeSize:(CGSize)newSize {
324
+ [self.delegate containerViewPeekDidChangeSize:newSize];
325
+ }
326
+
327
+ - (void)peekViewWillDetach:(TrueSheetPeekView *)peekView {
328
+ if (_peekView != peekView) {
329
+ return;
112
330
  }
331
+
332
+ _peekView.delegate = nil;
333
+ _peekView = nil;
334
+ [self peekViewDidChangeSize:CGSizeZero];
335
+ }
336
+
337
+ #pragma mark - Keyboard Observer
338
+
339
+ - (void)setupKeyboardObserverWithViewController:(UIViewController *)viewController {
340
+ [self cleanupKeyboardObserver];
341
+
342
+ _keyboardObserver = [[TrueSheetKeyboardObserver alloc] init];
343
+ _keyboardObserver.viewController = (TrueSheetViewController *)viewController;
344
+
345
+ if (_contentView) {
346
+ _contentView.keyboardObserver = _keyboardObserver;
347
+ [_keyboardObserver addDelegate:_contentView];
348
+ }
349
+
350
+ if (_footerView) {
351
+ _footerView.keyboardObserver = _keyboardObserver;
352
+ [_keyboardObserver addDelegate:_footerView];
353
+ }
354
+
355
+ [_keyboardObserver start];
356
+ }
357
+
358
+ - (void)cleanupKeyboardObserver {
359
+ if (_keyboardObserver) {
360
+ [_keyboardObserver stop];
361
+ _keyboardObserver = nil;
362
+ }
363
+
364
+ _contentView.keyboardObserver = nil;
365
+ _footerView.keyboardObserver = nil;
113
366
  }
114
367
 
115
368
  @end
116
369
 
370
+ Class<RCTComponentViewProtocol> TrueSheetContainerViewCls(void) {
371
+ return TrueSheetContainerView.class;
372
+ }
373
+
117
374
  #endif
@@ -8,28 +8,81 @@
8
8
 
9
9
  #ifdef RCT_NEW_ARCH_ENABLED
10
10
 
11
+ #import <React/RCTMountingTransactionObserving.h>
11
12
  #import <React/RCTSurfaceTouchHandler.h>
12
13
  #import <React/RCTViewComponentView.h>
13
14
  #import <UIKit/UIKit.h>
14
15
  #import <react/renderer/core/LayoutMetrics.h>
16
+ #import "core/TrueSheetKeyboardObserver.h"
15
17
 
16
18
  @class TrueSheetViewController;
19
+ @class TrueSheetFooterView;
17
20
  @class RCTScrollViewComponentView;
21
+ @class ScrollableOptions;
18
22
 
19
23
  NS_ASSUME_NONNULL_BEGIN
20
24
 
21
25
  @protocol TrueSheetContentViewDelegate <NSObject>
22
26
 
23
27
  - (void)contentViewDidChangeSize:(CGSize)newSize;
28
+ - (void)contentViewScrollViewDidChange;
24
29
 
25
30
  @end
26
31
 
27
- @interface TrueSheetContentView : RCTViewComponentView
32
+ @interface TrueSheetContentView
33
+ : RCTViewComponentView <TrueSheetKeyboardObserverDelegate, RCTMountingTransactionObserving>
28
34
 
29
35
  @property (nonatomic, weak, nullable) id<TrueSheetContentViewDelegate> delegate;
36
+ @property (nonatomic, assign) CGFloat keyboardScrollOffset;
37
+
38
+ /**
39
+ * Adjustment added to the keyboard bottom inset applied to the detected
40
+ * scrollable — negative values reduce the inset (e.g. to cancel out safe-area
41
+ * padding already baked into the content's paddingBottom).
42
+ */
43
+ @property (nonatomic, assign) CGFloat keyboardOffset;
44
+
45
+ @property (nonatomic, weak, nullable) TrueSheetKeyboardObserver *keyboardObserver;
46
+
47
+ /**
48
+ * Sibling footer view — a relative footer shields part of the keyboard's
49
+ * overlap from the inset; an absolute footer extends the caret reveal target.
50
+ */
51
+ @property (nonatomic, weak, nullable) TrueSheetFooterView *footerView;
52
+
53
+ /**
54
+ * Content height measured unconstrained by the shadow node — the height the
55
+ * content wants regardless of container bounds (see
56
+ * TrueSheetContentViewShadowNode). Falls back to the frame height before the
57
+ * first state update.
58
+ */
59
+ @property (nonatomic, readonly) CGFloat naturalHeight;
60
+
61
+ /**
62
+ * React tag of the user-provided scrollable (see the `scrollableRef` prop).
63
+ * Setting a new handle clears the currently resolved ScrollView.
64
+ */
65
+ @property (nonatomic, assign) NSInteger scrollableHandle;
66
+
67
+ /**
68
+ * Sets the resolved ScrollView's `contentInsetAdjustmentBehavior` to
69
+ * `automatic` while plugged so UIKit applies the bottom safe-area inset to
70
+ * the scroll content. The previous behavior is restored on clear.
71
+ */
72
+ @property (nonatomic, assign) BOOL contentInsetAdjustment;
30
73
 
31
74
  - (RCTScrollViewComponentView *_Nullable)findScrollView;
32
75
 
76
+ /**
77
+ * Resolve the ScrollView from `scrollableHandle`, wiring keyboard handling
78
+ */
79
+ - (void)setupScrollable;
80
+
81
+ /**
82
+ * Apply scroll edge effects to the detected scroll view (iOS 26+)
83
+ */
84
+ - (void)applyScrollEdgeEffects:(nullable ScrollableOptions *)options;
85
+
33
86
  @end
34
87
 
35
88
  NS_ASSUME_NONNULL_END