@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.
- package/LICENSE +1 -1
- package/README.md +42 -31
- package/RNTrueSheet.podspec +10 -2
- package/android/build.gradle +2 -1
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +156 -21
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +5 -4
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1224 -603
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
- package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
- package/android/src/main/java/com/lodev09/truesheet/utils/TouchEventDeduper.kt +31 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
- package/android/src/main/jni/CMakeLists.txt +63 -0
- package/android/src/main/jni/TrueSheetSpec.h +19 -0
- package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
- package/ios/TrueSheetContainerView.h +81 -6
- package/ios/TrueSheetContainerView.mm +275 -21
- package/ios/TrueSheetContentView.h +38 -1
- package/ios/TrueSheetContentView.mm +413 -43
- package/ios/TrueSheetFooterView.h +27 -2
- package/ios/TrueSheetFooterView.mm +141 -35
- package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
- package/ios/TrueSheetHeaderView.mm +64 -0
- package/ios/TrueSheetModule.mm +92 -5
- package/ios/TrueSheetPeekView.h +32 -0
- package/ios/TrueSheetPeekView.mm +99 -0
- package/ios/TrueSheetView.h +7 -15
- package/ios/TrueSheetView.mm +633 -215
- package/ios/TrueSheetViewController.h +84 -16
- package/ios/TrueSheetViewController.mm +1133 -333
- package/ios/core/RNScreensEventObserver.h +46 -0
- package/ios/core/RNScreensEventObserver.mm +280 -0
- package/ios/core/TrueSheetBlurView.h +27 -0
- package/ios/core/TrueSheetBlurView.mm +82 -0
- package/ios/core/TrueSheetDetentCalculator.h +107 -0
- package/ios/core/TrueSheetDetentCalculator.mm +197 -0
- package/ios/core/TrueSheetGrabberView.h +72 -0
- package/ios/core/TrueSheetGrabberView.mm +178 -0
- package/ios/core/TrueSheetKeyboardObserver.h +39 -0
- package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
- package/ios/events/TrueSheetDragEvents.h +39 -0
- package/ios/events/TrueSheetDragEvents.mm +62 -0
- package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
- package/ios/events/TrueSheetFocusEvents.mm +49 -0
- package/ios/events/TrueSheetLifecycleEvents.h +40 -0
- package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
- package/ios/events/TrueSheetStateEvents.h +35 -0
- package/ios/events/TrueSheetStateEvents.mm +49 -0
- package/ios/tvos/TrueSheetStubs.mm +154 -0
- package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
- package/ios/utils/BlurUtil.mm +69 -0
- package/ios/utils/GestureUtil.h +7 -0
- package/ios/utils/GestureUtil.mm +12 -0
- package/ios/utils/PlatformUtil.h +15 -0
- package/ios/utils/UIView+FirstResponder.h +15 -0
- package/ios/utils/UIView+FirstResponder.mm +26 -0
- package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
- package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
- package/ios/utils/WindowUtil.mm +17 -1
- package/lib/module/TrueSheet.js +230 -64
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/TrueSheet.web.js +1203 -0
- package/lib/module/TrueSheet.web.js.map +1 -0
- package/lib/module/TrueSheetPeek.js +15 -0
- package/lib/module/TrueSheetPeek.js.map +1 -0
- package/lib/module/TrueSheetPeek.web.js +55 -0
- package/lib/module/TrueSheetPeek.web.js.map +1 -0
- package/lib/module/TrueSheetProvider.js +28 -0
- package/lib/module/TrueSheetProvider.js.map +1 -0
- package/lib/module/TrueSheetProvider.web.js +157 -0
- package/lib/module/TrueSheetProvider.web.js.map +1 -0
- package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/lib/module/index.js +3 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/mocks/index.js +93 -0
- package/lib/module/mocks/index.js.map +1 -0
- package/lib/module/mocks/navigation.js +95 -0
- package/lib/module/mocks/navigation.js.map +1 -0
- package/lib/module/mocks/navigationExpoRouter.js +21 -0
- package/lib/module/mocks/navigationExpoRouter.js.map +1 -0
- package/lib/module/mocks/reanimated.js +91 -0
- package/lib/module/mocks/reanimated.js.map +1 -0
- package/lib/module/navigation/TrueSheetNavigatorContent.js +73 -0
- package/lib/module/navigation/TrueSheetNavigatorContent.js.map +1 -0
- package/lib/module/navigation/actions.js +50 -0
- package/lib/module/navigation/actions.js.map +1 -0
- package/lib/module/navigation/createTrueSheetRouter.js +166 -0
- package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
- package/lib/module/navigation/expo-router/index.js +48 -0
- package/lib/module/navigation/expo-router/index.js.map +1 -0
- package/lib/module/navigation/index.js +47 -0
- package/lib/module/navigation/index.js.map +1 -0
- package/lib/module/navigation/navigator.js +10 -0
- package/lib/module/navigation/navigator.js.map +1 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/index.js +5 -0
- package/lib/module/navigation/screen/index.js.map +1 -0
- package/lib/module/navigation/screen/types.js +4 -0
- package/lib/module/navigation/screen/types.js.map +1 -0
- package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
- package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
- package/lib/module/navigation/types.js +4 -0
- package/lib/module/navigation/types.js.map +1 -0
- package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
- package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
- package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
- package/lib/module/reanimated/index.js +2 -2
- package/lib/module/reanimated/index.js.map +1 -1
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
- package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
- package/lib/module/web/constants.js +16 -0
- package/lib/module/web/constants.js.map +1 -0
- package/lib/module/web/dom.js +10 -0
- package/lib/module/web/dom.js.map +1 -0
- package/lib/module/web/vaul/README.md +9 -0
- package/lib/module/web/vaul/browser.js +30 -0
- package/lib/module/web/vaul/browser.js.map +1 -0
- package/lib/module/web/vaul/constants.js +15 -0
- package/lib/module/web/vaul/constants.js.map +1 -0
- package/lib/module/web/vaul/context.js +59 -0
- package/lib/module/web/vaul/context.js.map +1 -0
- package/lib/module/web/vaul/helpers.js +99 -0
- package/lib/module/web/vaul/helpers.js.map +1 -0
- package/lib/module/web/vaul/index.js +1309 -0
- package/lib/module/web/vaul/index.js.map +1 -0
- package/lib/module/web/vaul/style.css +287 -0
- package/lib/module/web/vaul/style.css.d.js +2 -0
- package/lib/module/web/vaul/style.css.d.js.map +1 -0
- package/lib/module/web/vaul/types.js +2 -0
- package/lib/module/web/vaul/types.js.map +1 -0
- package/lib/module/web/vaul/use-composed-refs.js +34 -0
- package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
- package/lib/module/web/vaul/use-controllable-state.js +54 -0
- package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
- package/lib/module/web/vaul/use-position-fixed.js +123 -0
- package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
- package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
- package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
- package/lib/module/web/vaul/use-scale-background.js +57 -0
- package/lib/module/web/vaul/use-scale-background.js.map +1 -0
- package/lib/module/web/vaul/use-snap-points.js +305 -0
- package/lib/module/web/vaul/use-snap-points.js.map +1 -0
- package/lib/typescript/src/TrueSheet.d.ts +51 -14
- package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
- package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
- package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/mocks/index.d.ts +43 -0
- package/lib/typescript/src/mocks/index.d.ts.map +1 -0
- package/lib/typescript/src/mocks/navigation.d.ts +70 -0
- package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
- package/lib/typescript/src/mocks/navigationExpoRouter.d.ts +22 -0
- package/lib/typescript/src/mocks/navigationExpoRouter.d.ts.map +1 -0
- package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
- package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
- package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts +5 -0
- package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts.map +1 -0
- package/lib/typescript/src/navigation/actions.d.ts +71 -0
- package/lib/typescript/src/navigation/actions.d.ts.map +1 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +14 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
- package/lib/typescript/src/navigation/expo-router/index.d.ts +37 -0
- package/lib/typescript/src/navigation/expo-router/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/index.d.ts +46 -0
- package/lib/typescript/src/navigation/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/navigator.d.ts +7 -0
- package/lib/typescript/src/navigation/navigator.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
- package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/types.d.ts +14 -0
- package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +33 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +177 -0
- package/lib/typescript/src/navigation/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
- package/lib/typescript/src/web/constants.d.ts +14 -0
- package/lib/typescript/src/web/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/dom.d.ts +7 -0
- package/lib/typescript/src/web/dom.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
- package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
- package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/context.d.ts +53 -0
- package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/index.d.ts +228 -0
- package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/types.d.ts +7 -0
- package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
- package/package.json +95 -36
- package/react-native.config.js +9 -2
- package/src/TrueSheet.tsx +281 -62
- package/src/TrueSheet.types.ts +525 -71
- package/src/TrueSheet.web.tsx +1362 -0
- package/src/TrueSheetPeek.tsx +11 -0
- package/src/TrueSheetPeek.web.tsx +64 -0
- package/src/TrueSheetProvider.tsx +33 -0
- package/src/TrueSheetProvider.web.tsx +220 -0
- package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/src/index.ts +2 -2
- package/src/mocks/index.ts +89 -0
- package/src/mocks/navigation.ts +79 -0
- package/src/mocks/navigationExpoRouter.ts +40 -0
- package/src/mocks/reanimated.ts +100 -0
- package/src/navigation/TrueSheetNavigatorContent.tsx +106 -0
- package/src/navigation/actions.ts +78 -0
- package/src/navigation/createTrueSheetRouter.ts +222 -0
- package/src/navigation/expo-router/index.ts +89 -0
- package/src/navigation/index.ts +81 -0
- package/src/navigation/navigator.ts +18 -0
- package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
- package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
- package/src/navigation/screen/index.ts +3 -0
- package/src/navigation/screen/types.ts +19 -0
- package/src/navigation/screen/useSheetScreenState.ts +100 -0
- package/src/navigation/types.ts +251 -0
- package/src/navigation/useTrueSheetNavigation.ts +26 -0
- package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
- package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
- package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
- package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
- package/src/specs/NativeTrueSheetModule.ts +28 -3
- package/src/web/constants.ts +13 -0
- package/src/web/dom.ts +9 -0
- package/src/web/vaul/README.md +9 -0
- package/src/web/vaul/browser.ts +38 -0
- package/src/web/vaul/constants.ts +20 -0
- package/src/web/vaul/context.ts +101 -0
- package/src/web/vaul/helpers.ts +131 -0
- package/src/web/vaul/index.tsx +1740 -0
- package/src/web/vaul/style.css +287 -0
- package/src/web/vaul/style.css.d.ts +1 -0
- package/src/web/vaul/types.ts +7 -0
- package/src/web/vaul/use-composed-refs.ts +35 -0
- package/src/web/vaul/use-controllable-state.ts +66 -0
- package/src/web/vaul/use-position-fixed.ts +147 -0
- package/src/web/vaul/use-prevent-scroll.ts +309 -0
- package/src/web/vaul/use-scale-background.ts +64 -0
- package/src/web/vaul/use-snap-points.ts +455 -0
- package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
- package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
- package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
- package/android/src/main/res/values/styles.xml +0 -8
- package/ios/events/OnDetentChangeEvent.h +0 -28
- package/ios/events/OnDetentChangeEvent.mm +0 -30
- package/ios/events/OnDidDismissEvent.mm +0 -25
- package/ios/events/OnDidPresentEvent.h +0 -28
- package/ios/events/OnDidPresentEvent.mm +0 -30
- package/ios/events/OnDragBeginEvent.h +0 -28
- package/ios/events/OnDragBeginEvent.mm +0 -30
- package/ios/events/OnDragChangeEvent.h +0 -28
- package/ios/events/OnDragChangeEvent.mm +0 -30
- package/ios/events/OnDragEndEvent.h +0 -28
- package/ios/events/OnDragEndEvent.mm +0 -30
- package/ios/events/OnMountEvent.mm +0 -25
- package/ios/events/OnPositionChangeEvent.mm +0 -32
- package/ios/events/OnSizeChangeEvent.h +0 -28
- package/ios/events/OnSizeChangeEvent.mm +0 -30
- package/ios/events/OnWillDismissEvent.mm +0 -25
- package/ios/events/OnWillPresentEvent.h +0 -28
- package/ios/events/OnWillPresentEvent.mm +0 -30
- package/ios/utils/LayoutUtil.h +0 -44
- package/ios/utils/LayoutUtil.mm +0 -50
- package/lib/module/TrueSheetGrabber.js +0 -51
- package/lib/module/TrueSheetGrabber.js.map +0 -1
- package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
- package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
- package/src/TrueSheetGrabber.tsx +0 -82
- 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
|
-
@
|
|
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
|
-
-
|
|
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.
|
|
110
|
+
return _contentView ? _contentView.naturalHeight : 0;
|
|
53
111
|
}
|
|
54
112
|
|
|
55
|
-
- (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|