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

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