@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.
- package/LICENSE +1 -1
- package/README.md +62 -30
- package/RNTrueSheet.podspec +10 -2
- package/android/build.gradle +24 -2
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +189 -47
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +401 -19
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +18 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +145 -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/TrueSheetOverlayView.kt +106 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetOverlayViewManager.kt +45 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +6 -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 +63 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +564 -226
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1399 -598
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +161 -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 +375 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +299 -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/TrueSheetOverlayRootView.kt +137 -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 +127 -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 +42 -0
- package/android/src/main/jni/CMakeLists.txt +63 -0
- package/android/src/main/jni/TrueSheetSpec.h +20 -0
- package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +16 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +68 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +33 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +39 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +63 -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/TrueSheetLayoutUtils.h +46 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewComponentDescriptor.h +21 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.cpp +17 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetOverlayViewShadowNode.h +36 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +30 -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 +88 -6
- package/ios/TrueSheetContainerView.mm +278 -21
- package/ios/TrueSheetContentView.h +54 -1
- package/ios/TrueSheetContentView.mm +371 -47
- package/ios/TrueSheetFooterView.h +33 -2
- package/ios/TrueSheetFooterView.mm +187 -35
- package/ios/{events/OnWillDismissEvent.h → TrueSheetHeaderView.h} +10 -7
- package/ios/TrueSheetHeaderView.mm +64 -0
- package/ios/TrueSheetModule.h +2 -7
- package/ios/TrueSheetModule.mm +98 -20
- package/ios/TrueSheetOverlayView.h +32 -0
- package/ios/TrueSheetOverlayView.mm +161 -0
- package/ios/TrueSheetPeekView.h +32 -0
- package/ios/TrueSheetPeekView.mm +99 -0
- package/ios/TrueSheetView.h +7 -15
- package/ios/TrueSheetView.mm +775 -215
- package/ios/TrueSheetViewController.h +94 -16
- package/ios/TrueSheetViewController.mm +1316 -331
- 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 +188 -0
- package/ios/core/TrueSheetKeyboardObserver.h +39 -0
- package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
- package/ios/core/TrueSheetOverlayContainerView.h +31 -0
- package/ios/core/TrueSheetOverlayContainerView.mm +35 -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 +42 -0
- package/ios/events/TrueSheetLifecycleEvents.mm +79 -0
- package/ios/events/TrueSheetStateEvents.h +35 -0
- package/ios/events/TrueSheetStateEvents.mm +49 -0
- package/ios/tvos/TrueSheetStubs.mm +166 -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/utils/UIView+ScrollEdgeInteraction.h +26 -0
- package/ios/utils/UIView+ScrollEdgeInteraction.mm +84 -0
- package/ios/utils/WindowUtil.mm +17 -1
- package/lib/module/TrueSheet.js +349 -74
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/TrueSheet.web.js +1270 -0
- package/lib/module/TrueSheet.web.js.map +1 -0
- package/lib/module/TrueSheetOverlay.js +30 -0
- package/lib/module/TrueSheetOverlay.js.map +1 -0
- package/lib/module/TrueSheetOverlay.web.js +35 -0
- package/lib/module/TrueSheetOverlay.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/TrueSheetOverlayViewNativeComponent.ts +12 -0
- package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetViewNativeComponent.ts +110 -18
- package/lib/module/index.js +4 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/mocks/index.js +103 -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/base-types.js +2 -0
- package/lib/module/navigation/base-types.js.map +1 -0
- package/lib/module/navigation/createTrueSheetRouter.js +157 -0
- package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
- package/lib/module/navigation/expo-router/base-types.js +2 -0
- package/lib/module/navigation/expo-router/base-types.js.map +1 -0
- package/lib/module/navigation/expo-router/index.js +50 -0
- package/lib/module/navigation/expo-router/index.js.map +1 -0
- package/lib/module/navigation/expo-router/types.js +4 -0
- package/lib/module/navigation/expo-router/types.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 +69 -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 +19 -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 +1342 -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 +57 -14
- package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.types.d.ts +535 -55
- 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/TrueSheetOverlay.d.ts +8 -0
- package/lib/typescript/src/TrueSheetOverlay.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetOverlay.web.d.ts +8 -0
- package/lib/typescript/src/TrueSheetOverlay.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/TrueSheetOverlayViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetOverlayViewNativeComponent.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 +71 -16
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/mocks/index.d.ts +47 -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/base-types.d.ts +9 -0
- package/lib/typescript/src/navigation/base-types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +3 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
- package/lib/typescript/src/navigation/expo-router/base-types.d.ts +8 -0
- package/lib/typescript/src/navigation/expo-router/base-types.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/expo-router/types.d.ts +44 -0
- package/lib/typescript/src/navigation/expo-router/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/index.d.ts +45 -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 +34 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +213 -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 +14 -0
- package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/context.d.ts +54 -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 +234 -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 +104 -37
- package/react-native.config.js +10 -2
- package/src/TrueSheet.tsx +424 -70
- package/src/TrueSheet.types.ts +602 -72
- package/src/TrueSheet.web.tsx +1437 -0
- package/src/TrueSheetOverlay.tsx +24 -0
- package/src/TrueSheetOverlay.web.tsx +33 -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/TrueSheetOverlayViewNativeComponent.ts +12 -0
- package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetViewNativeComponent.ts +110 -18
- package/src/index.ts +3 -2
- package/src/mocks/index.ts +96 -0
- package/src/mocks/navigation.ts +79 -0
- package/src/mocks/navigationExpoRouter.ts +41 -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/base-types.ts +20 -0
- package/src/navigation/createTrueSheetRouter.ts +194 -0
- package/src/navigation/expo-router/base-types.ts +18 -0
- package/src/navigation/expo-router/index.ts +90 -0
- package/src/navigation/expo-router/types.ts +116 -0
- package/src/navigation/index.ts +80 -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 +102 -0
- package/src/navigation/types.ts +302 -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 +24 -0
- package/src/web/vaul/context.ts +102 -0
- package/src/web/vaul/helpers.ts +131 -0
- package/src/web/vaul/index.tsx +1785 -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.h +0 -26
- 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
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
package com.lodev09.truesheet
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.module.annotations.ReactModule
|
|
4
|
+
import com.facebook.react.uimanager.PointerEvents
|
|
5
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
6
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
4
7
|
import com.facebook.react.uimanager.ThemedReactContext
|
|
5
8
|
import com.facebook.react.uimanager.ViewGroupManager
|
|
9
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
6
10
|
|
|
7
11
|
/**
|
|
8
12
|
* ViewManager for TrueSheetFooterView
|
|
@@ -15,6 +19,16 @@ class TrueSheetFooterViewManager : ViewGroupManager<TrueSheetFooterView>() {
|
|
|
15
19
|
|
|
16
20
|
override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetFooterView = TrueSheetFooterView(reactContext)
|
|
17
21
|
|
|
22
|
+
override fun updateState(view: TrueSheetFooterView, props: ReactStylesDiffMap?, stateWrapper: StateWrapper?): Any? {
|
|
23
|
+
view.stateWrapper = stateWrapper
|
|
24
|
+
return null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@ReactProp(name = "pointerEvents")
|
|
28
|
+
fun setPointerEvents(view: TrueSheetFooterView, pointerEventsStr: String?) {
|
|
29
|
+
view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
|
|
30
|
+
}
|
|
31
|
+
|
|
18
32
|
companion object {
|
|
19
33
|
const val REACT_CLASS = "TrueSheetFooterView"
|
|
20
34
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
5
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Delegate interface for header view size changes
|
|
9
|
+
*/
|
|
10
|
+
interface TrueSheetHeaderViewDelegate {
|
|
11
|
+
fun headerViewDidChangeSize(width: Int, height: Int)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Header view that holds the header content
|
|
16
|
+
* Positioned at the top of the sheet content area
|
|
17
|
+
*/
|
|
18
|
+
@SuppressLint("ViewConstructor")
|
|
19
|
+
class TrueSheetHeaderView(context: ThemedReactContext) : ReactViewGroup(context) {
|
|
20
|
+
var delegate: TrueSheetHeaderViewDelegate? = null
|
|
21
|
+
|
|
22
|
+
private var lastWidth = 0
|
|
23
|
+
private var lastHeight = 0
|
|
24
|
+
|
|
25
|
+
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
|
26
|
+
super.onSizeChanged(w, h, oldw, oldh)
|
|
27
|
+
|
|
28
|
+
if (w != lastWidth || h != lastHeight) {
|
|
29
|
+
lastWidth = w
|
|
30
|
+
lastHeight = h
|
|
31
|
+
delegate?.headerViewDidChangeSize(w, h)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
companion object {
|
|
36
|
+
const val TAG_NAME = "TrueSheet"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
4
|
+
import com.facebook.react.uimanager.PointerEvents
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
7
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ViewManager for TrueSheetHeaderView
|
|
11
|
+
* Manages the header area of the sheet
|
|
12
|
+
*/
|
|
13
|
+
@ReactModule(name = TrueSheetHeaderViewManager.REACT_CLASS)
|
|
14
|
+
class TrueSheetHeaderViewManager : ViewGroupManager<TrueSheetHeaderView>() {
|
|
15
|
+
|
|
16
|
+
override fun getName(): String = REACT_CLASS
|
|
17
|
+
|
|
18
|
+
override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetHeaderView = TrueSheetHeaderView(reactContext)
|
|
19
|
+
|
|
20
|
+
@ReactProp(name = "pointerEvents")
|
|
21
|
+
fun setPointerEvents(view: TrueSheetHeaderView, pointerEventsStr: String?) {
|
|
22
|
+
view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
companion object {
|
|
26
|
+
const val REACT_CLASS = "TrueSheetHeaderView"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.ReactMethod
|
|
|
8
8
|
import com.facebook.react.module.annotations.ReactModule
|
|
9
9
|
import com.facebook.react.turbomodule.core.interfaces.TurboModule
|
|
10
10
|
import com.facebook.react.uimanager.UIManagerHelper
|
|
11
|
+
import com.lodev09.truesheet.core.TrueSheetStackManager
|
|
11
12
|
import java.util.concurrent.ConcurrentHashMap
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -21,16 +22,13 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
|
|
|
21
22
|
|
|
22
23
|
override fun getName(): String = NAME
|
|
23
24
|
|
|
24
|
-
override fun initialize() {
|
|
25
|
-
super.initialize()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
25
|
override fun invalidate() {
|
|
29
26
|
super.invalidate()
|
|
30
|
-
// Clear all registered views on module invalidation
|
|
27
|
+
// Clear all registered views and observer on module invalidation
|
|
31
28
|
synchronized(viewRegistry) {
|
|
32
29
|
viewRegistry.clear()
|
|
33
30
|
}
|
|
31
|
+
TrueSheetStackManager.clear()
|
|
34
32
|
}
|
|
35
33
|
|
|
36
34
|
/**
|
|
@@ -44,19 +42,19 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
|
|
|
44
42
|
* @throws OPERATION_FAILED if the operation fails for any other reason
|
|
45
43
|
*/
|
|
46
44
|
@ReactMethod
|
|
47
|
-
fun presentByRef(viewTag: Double, index: Double, promise: Promise) {
|
|
45
|
+
fun presentByRef(viewTag: Double, index: Double, animated: Boolean, promise: Promise) {
|
|
48
46
|
val tag = viewTag.toInt()
|
|
49
47
|
val detentIndex = index.toInt()
|
|
50
48
|
|
|
51
49
|
withTrueSheetView(tag, promise) { view ->
|
|
52
|
-
view.present(detentIndex) {
|
|
50
|
+
view.present(detentIndex, animated) {
|
|
53
51
|
promise.resolve(null)
|
|
54
52
|
}
|
|
55
53
|
}
|
|
56
54
|
}
|
|
57
55
|
|
|
58
56
|
/**
|
|
59
|
-
* Dismiss a sheet
|
|
57
|
+
* Dismiss a sheet and all sheets presented on top of it
|
|
60
58
|
*
|
|
61
59
|
* @param viewTag Native view tag of the sheet component
|
|
62
60
|
* @param promise Promise that resolves when sheet is fully dismissed
|
|
@@ -65,11 +63,31 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
|
|
|
65
63
|
* @throws OPERATION_FAILED if the operation fails for any other reason
|
|
66
64
|
*/
|
|
67
65
|
@ReactMethod
|
|
68
|
-
fun dismissByRef(viewTag: Double, promise: Promise) {
|
|
66
|
+
fun dismissByRef(viewTag: Double, animated: Boolean, promise: Promise) {
|
|
69
67
|
val tag = viewTag.toInt()
|
|
70
68
|
|
|
71
69
|
withTrueSheetView(tag, promise) { view ->
|
|
72
|
-
view.dismiss {
|
|
70
|
+
view.dismiss(animated) {
|
|
71
|
+
promise.resolve(null)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Dismiss only the sheets presented on top of this sheet, keeping this sheet presented
|
|
78
|
+
*
|
|
79
|
+
* @param viewTag Native view tag of the sheet component
|
|
80
|
+
* @param promise Promise that resolves when all child sheets are fully dismissed
|
|
81
|
+
* @throws VIEW_NOT_FOUND if the view with the given tag is not found
|
|
82
|
+
* @throws INVALID_VIEW_TYPE if the view is not a TrueSheetView
|
|
83
|
+
* @throws OPERATION_FAILED if the operation fails for any other reason
|
|
84
|
+
*/
|
|
85
|
+
@ReactMethod
|
|
86
|
+
fun dismissStackByRef(viewTag: Double, animated: Boolean, promise: Promise) {
|
|
87
|
+
val tag = viewTag.toInt()
|
|
88
|
+
|
|
89
|
+
withTrueSheetView(tag, promise) { view ->
|
|
90
|
+
view.dismissStack(animated) {
|
|
73
91
|
promise.resolve(null)
|
|
74
92
|
}
|
|
75
93
|
}
|
|
@@ -87,8 +105,49 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
|
|
|
87
105
|
*/
|
|
88
106
|
@ReactMethod
|
|
89
107
|
fun resizeByRef(viewTag: Double, index: Double, promise: Promise) {
|
|
90
|
-
|
|
91
|
-
|
|
108
|
+
val tag = viewTag.toInt()
|
|
109
|
+
val detentIndex = index.toInt()
|
|
110
|
+
|
|
111
|
+
withTrueSheetView(tag, promise) { view ->
|
|
112
|
+
view.resize(detentIndex) {
|
|
113
|
+
promise.resolve(null)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Dismiss all presented sheets by dismissing from the bottom of the stack
|
|
120
|
+
*
|
|
121
|
+
* @param animated Whether to animate the dismissals
|
|
122
|
+
* @param promise Promise that resolves when all sheets are dismissed
|
|
123
|
+
*/
|
|
124
|
+
@ReactMethod
|
|
125
|
+
fun dismissAll(animated: Boolean, promise: Promise) {
|
|
126
|
+
Handler(Looper.getMainLooper()).post {
|
|
127
|
+
try {
|
|
128
|
+
val rootSheet = TrueSheetStackManager.getRootSheet()
|
|
129
|
+
if (rootSheet == null) {
|
|
130
|
+
promise.resolve(null)
|
|
131
|
+
return@post
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
rootSheet.dismiss(animated) {
|
|
135
|
+
promise.resolve(null)
|
|
136
|
+
}
|
|
137
|
+
} catch (e: Exception) {
|
|
138
|
+
promise.reject("OPERATION_FAILED", "Failed to dismiss all sheets: ${e.message}", e)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@ReactMethod
|
|
144
|
+
fun handleBackPress(viewTag: Double, promise: Promise) {
|
|
145
|
+
val tag = viewTag.toInt()
|
|
146
|
+
|
|
147
|
+
withTrueSheetView(tag, promise) { view ->
|
|
148
|
+
view.handleBackPress()
|
|
149
|
+
promise.resolve(null)
|
|
150
|
+
}
|
|
92
151
|
}
|
|
93
152
|
|
|
94
153
|
/**
|
|
@@ -98,29 +157,30 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
|
|
|
98
157
|
Handler(Looper.getMainLooper()).post {
|
|
99
158
|
try {
|
|
100
159
|
// First try to get from registry (faster)
|
|
101
|
-
|
|
160
|
+
var view = getSheetByTag(tag)
|
|
102
161
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
} else {
|
|
106
|
-
// Fallback to UIManager resolution
|
|
162
|
+
// Fallback to UIManager resolution
|
|
163
|
+
if (view == null) {
|
|
107
164
|
val manager = UIManagerHelper.getUIManagerForReactTag(reactApplicationContext, tag)
|
|
108
165
|
val resolvedView = manager?.resolveView(tag)
|
|
109
166
|
|
|
110
|
-
if (resolvedView == null) {
|
|
111
|
-
promise.reject("VIEW_NOT_FOUND", "TrueSheetView with tag $tag not found")
|
|
112
|
-
return@post
|
|
113
|
-
}
|
|
114
|
-
|
|
115
167
|
if (resolvedView is TrueSheetView) {
|
|
116
|
-
|
|
117
|
-
} else {
|
|
168
|
+
view = resolvedView
|
|
169
|
+
} else if (resolvedView != null) {
|
|
118
170
|
promise.reject(
|
|
119
171
|
"INVALID_VIEW_TYPE",
|
|
120
172
|
"View with tag $tag is not a TrueSheetView (got ${resolvedView::class.simpleName})"
|
|
121
173
|
)
|
|
174
|
+
return@post
|
|
122
175
|
}
|
|
123
176
|
}
|
|
177
|
+
|
|
178
|
+
if (view == null) {
|
|
179
|
+
promise.reject("VIEW_NOT_FOUND", "TrueSheetView with tag $tag not found")
|
|
180
|
+
return@post
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
closure(view)
|
|
124
184
|
} catch (e: Exception) {
|
|
125
185
|
promise.reject("OPERATION_FAILED", "Failed to execute operation: ${e.message}", e)
|
|
126
186
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.view.View
|
|
5
|
+
import android.view.ViewGroup
|
|
6
|
+
import android.view.accessibility.AccessibilityEvent
|
|
7
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
8
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
9
|
+
import com.facebook.react.uimanager.events.EventDispatcher
|
|
10
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
11
|
+
import com.lodev09.truesheet.core.TrueSheetOverlayRootView
|
|
12
|
+
import com.lodev09.truesheet.core.TrueSheetOverlayRootViewDelegate
|
|
13
|
+
import com.lodev09.truesheet.utils.findRootContainerView
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Hidden host that renders its children in a root view attached to the
|
|
17
|
+
* activity's content view, above every presented sheet.
|
|
18
|
+
*/
|
|
19
|
+
@SuppressLint("ViewConstructor")
|
|
20
|
+
class TrueSheetOverlayView(private val reactContext: ThemedReactContext) :
|
|
21
|
+
ReactViewGroup(reactContext),
|
|
22
|
+
TrueSheetOverlayRootViewDelegate {
|
|
23
|
+
|
|
24
|
+
private val rootView = TrueSheetOverlayRootView(reactContext).apply {
|
|
25
|
+
delegate = this@TrueSheetOverlayView
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private var rootContainerView: ViewGroup? = null
|
|
29
|
+
|
|
30
|
+
override var eventDispatcher: EventDispatcher? = null
|
|
31
|
+
|
|
32
|
+
private var lastWidth = 0
|
|
33
|
+
private var lastHeight = 0
|
|
34
|
+
|
|
35
|
+
var stateWrapper: StateWrapper? = null
|
|
36
|
+
set(value) {
|
|
37
|
+
field = value
|
|
38
|
+
pushState()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
init {
|
|
42
|
+
// The host stays in the React tree for layout only — children render in the root view
|
|
43
|
+
visibility = GONE
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ==================== View Hierarchy Management ====================
|
|
47
|
+
|
|
48
|
+
override fun onAttachedToWindow() {
|
|
49
|
+
super.onAttachedToWindow()
|
|
50
|
+
attachRootView()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override fun onDetachedFromWindow() {
|
|
54
|
+
detachRootView()
|
|
55
|
+
super.onDetachedFromWindow()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private fun attachRootView() {
|
|
59
|
+
if (rootView.parent != null) return
|
|
60
|
+
|
|
61
|
+
val container = findRootContainerView(reactContext) ?: return
|
|
62
|
+
container.addView(rootView)
|
|
63
|
+
rootContainerView = container
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private fun detachRootView() {
|
|
67
|
+
rootContainerView?.removeView(rootView)
|
|
68
|
+
rootContainerView = null
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
fun onDropInstance() {
|
|
72
|
+
detachRootView()
|
|
73
|
+
rootView.delegate = null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override fun addView(child: View?, index: Int) {
|
|
77
|
+
rootView.addView(child, index)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override fun getChildCount(): Int = rootView.childCount
|
|
81
|
+
|
|
82
|
+
override fun getChildAt(index: Int): View? = rootView.getChildAt(index)
|
|
83
|
+
|
|
84
|
+
override fun removeViewAt(index: Int) {
|
|
85
|
+
rootView.removeViewAt(index)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Accessibility: children live in the root view since this view is hidden
|
|
89
|
+
override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {}
|
|
90
|
+
override fun dispatchPopulateAccessibilityEvent(event: AccessibilityEvent): Boolean = false
|
|
91
|
+
|
|
92
|
+
// ==================== State ====================
|
|
93
|
+
|
|
94
|
+
override fun overlayRootViewDidChangeSize(width: Int, height: Int) {
|
|
95
|
+
if (width == lastWidth && height == lastHeight) return
|
|
96
|
+
|
|
97
|
+
lastWidth = width
|
|
98
|
+
lastHeight = height
|
|
99
|
+
pushState()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private fun pushState() {
|
|
103
|
+
if (lastWidth == 0 && lastHeight == 0) return
|
|
104
|
+
stateWrapper?.let { TrueSheetStateUpdater.updateContainerSize(it, lastWidth, lastHeight) }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
4
|
+
import com.facebook.react.uimanager.PointerEvents
|
|
5
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
6
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
8
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
9
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
10
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* ViewManager for TrueSheetOverlayView
|
|
14
|
+
* Renders content above every presented sheet
|
|
15
|
+
*/
|
|
16
|
+
@ReactModule(name = TrueSheetOverlayViewManager.REACT_CLASS)
|
|
17
|
+
class TrueSheetOverlayViewManager : ViewGroupManager<TrueSheetOverlayView>() {
|
|
18
|
+
|
|
19
|
+
override fun getName(): String = REACT_CLASS
|
|
20
|
+
|
|
21
|
+
override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetOverlayView = TrueSheetOverlayView(reactContext)
|
|
22
|
+
|
|
23
|
+
override fun onDropViewInstance(view: TrueSheetOverlayView) {
|
|
24
|
+
super.onDropViewInstance(view)
|
|
25
|
+
view.onDropInstance()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
override fun addEventEmitters(reactContext: ThemedReactContext, view: TrueSheetOverlayView) {
|
|
29
|
+
view.eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
override fun updateState(view: TrueSheetOverlayView, props: ReactStylesDiffMap?, stateWrapper: StateWrapper?): Any? {
|
|
33
|
+
view.stateWrapper = stateWrapper
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@ReactProp(name = "pointerEvents")
|
|
38
|
+
fun setPointerEvents(view: TrueSheetOverlayView, pointerEventsStr: String?) {
|
|
39
|
+
view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
companion object {
|
|
43
|
+
const val REACT_CLASS = "TrueSheetOverlayView"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
package com.lodev09.truesheet
|
|
2
2
|
|
|
3
|
-
import com.facebook.react.
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
4
|
import com.facebook.react.bridge.NativeModule
|
|
5
5
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
6
|
import com.facebook.react.module.model.ReactModuleInfo
|
|
@@ -11,7 +11,7 @@ import com.facebook.react.uimanager.ViewManager
|
|
|
11
11
|
* TrueSheet package for Fabric architecture
|
|
12
12
|
* Registers all view managers and the TurboModule
|
|
13
13
|
*/
|
|
14
|
-
class TrueSheetPackage :
|
|
14
|
+
class TrueSheetPackage : BaseReactPackage() {
|
|
15
15
|
|
|
16
16
|
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? =
|
|
17
17
|
when (name) {
|
|
@@ -27,7 +27,6 @@ class TrueSheetPackage : TurboReactPackage() {
|
|
|
27
27
|
TrueSheetModule::class.java.name,
|
|
28
28
|
false, // canOverrideExistingModule
|
|
29
29
|
false, // needsEagerInit
|
|
30
|
-
true, // hasConstants
|
|
31
30
|
false, // isCxxModule
|
|
32
31
|
true // isTurboModule
|
|
33
32
|
)
|
|
@@ -39,6 +38,9 @@ class TrueSheetPackage : TurboReactPackage() {
|
|
|
39
38
|
TrueSheetViewManager(),
|
|
40
39
|
TrueSheetContainerViewManager(),
|
|
41
40
|
TrueSheetContentViewManager(),
|
|
42
|
-
|
|
41
|
+
TrueSheetHeaderViewManager(),
|
|
42
|
+
TrueSheetFooterViewManager(),
|
|
43
|
+
TrueSheetPeekViewManager(),
|
|
44
|
+
TrueSheetOverlayViewManager()
|
|
43
45
|
)
|
|
44
46
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.view.ViewParent
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Delegate interface for peek view size changes
|
|
10
|
+
*/
|
|
11
|
+
interface TrueSheetPeekViewDelegate {
|
|
12
|
+
fun peekViewDidChangeSize(width: Int, height: Int)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Peek view that marks part of the content as the sheet's peek content.
|
|
17
|
+
* The peek detent covers the content through this view's bottom edge.
|
|
18
|
+
*/
|
|
19
|
+
@SuppressLint("ViewConstructor")
|
|
20
|
+
class TrueSheetPeekView(context: ThemedReactContext) : ReactViewGroup(context) {
|
|
21
|
+
var delegate: TrueSheetPeekViewDelegate? = null
|
|
22
|
+
|
|
23
|
+
override fun onLayout(
|
|
24
|
+
changed: Boolean,
|
|
25
|
+
left: Int,
|
|
26
|
+
top: Int,
|
|
27
|
+
right: Int,
|
|
28
|
+
bottom: Int
|
|
29
|
+
) {
|
|
30
|
+
super.onLayout(changed, left, top, right, bottom)
|
|
31
|
+
|
|
32
|
+
attachToContainerView()
|
|
33
|
+
|
|
34
|
+
// Position changes matter too — the peek's offset within the content
|
|
35
|
+
// affects the peek detent.
|
|
36
|
+
if (changed) {
|
|
37
|
+
delegate?.peekViewDidChangeSize(width, height)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override fun onAttachedToWindow() {
|
|
42
|
+
super.onAttachedToWindow()
|
|
43
|
+
attachToContainerView()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Peek can be nested anywhere within the content, so it attaches itself to the
|
|
48
|
+
* nearest container instead of being mounted by it. The container also searches
|
|
49
|
+
* for it when the content is added to cover the initial (bottom-up) mount order.
|
|
50
|
+
*/
|
|
51
|
+
private fun attachToContainerView() {
|
|
52
|
+
if (delegate != null) return
|
|
53
|
+
|
|
54
|
+
var parent: ViewParent? = parent
|
|
55
|
+
while (parent != null && parent !is TrueSheetContainerView) {
|
|
56
|
+
parent = parent.parent
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
(parent as? TrueSheetContainerView)?.attachPeekView(this)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Called by the ViewManager when the view is dropped (Fabric unmount)
|
|
64
|
+
*/
|
|
65
|
+
fun detachFromContainerView() {
|
|
66
|
+
(delegate as? TrueSheetContainerView)?.detachPeekView(this)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
companion object {
|
|
70
|
+
const val TAG_NAME = "TrueSheet"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
4
|
+
import com.facebook.react.uimanager.PointerEvents
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
7
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ViewManager for TrueSheetPeekView
|
|
11
|
+
* Marks part of the content as the sheet's peek content
|
|
12
|
+
*/
|
|
13
|
+
@ReactModule(name = TrueSheetPeekViewManager.REACT_CLASS)
|
|
14
|
+
class TrueSheetPeekViewManager : ViewGroupManager<TrueSheetPeekView>() {
|
|
15
|
+
|
|
16
|
+
override fun getName(): String = REACT_CLASS
|
|
17
|
+
|
|
18
|
+
override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetPeekView = TrueSheetPeekView(reactContext)
|
|
19
|
+
|
|
20
|
+
override fun onDropViewInstance(view: TrueSheetPeekView) {
|
|
21
|
+
super.onDropViewInstance(view)
|
|
22
|
+
view.detachFromContainerView()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@ReactProp(name = "pointerEvents")
|
|
26
|
+
fun setPointerEvents(view: TrueSheetPeekView, pointerEventsStr: String?) {
|
|
27
|
+
view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
companion object {
|
|
31
|
+
const val REACT_CLASS = "TrueSheetPeekView"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
package com.lodev09.truesheet
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.WritableNativeMap
|
|
4
|
+
import com.facebook.react.uimanager.PixelUtil.pxToDp
|
|
5
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Synchronous Fabric state updates via JNI (see TrueSheetStateUpdater.cpp).
|
|
9
|
+
*
|
|
10
|
+
* StateWrapper.updateState commits asynchronously, so the container's Yoga
|
|
11
|
+
* layout lags the sheet by a frame or two during drags. The native bridge
|
|
12
|
+
* commits with `unstable_Immediate`, which mounts synchronously when called
|
|
13
|
+
* from the UI thread — same-frame layout, like iOS.
|
|
14
|
+
*/
|
|
15
|
+
object TrueSheetStateUpdater {
|
|
16
|
+
private val isAvailable: Boolean = try {
|
|
17
|
+
System.loadLibrary("react_codegen_TrueSheetSpec")
|
|
18
|
+
true
|
|
19
|
+
} catch (e: UnsatisfiedLinkError) {
|
|
20
|
+
false
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Returns false when unavailable — caller should fall back to async updateState. */
|
|
24
|
+
fun updateState(stateWrapper: StateWrapper, widthDp: Float, heightDp: Float): Boolean =
|
|
25
|
+
isAvailable && nativeUpdateState(stateWrapper, widthDp, heightDp)
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Pushes the container size (px) into the Fabric state — synchronously when
|
|
29
|
+
* the bridge is available, async otherwise.
|
|
30
|
+
*/
|
|
31
|
+
fun updateContainerSize(stateWrapper: StateWrapper, widthPx: Int, heightPx: Int) {
|
|
32
|
+
val widthDp = widthPx.toFloat().pxToDp()
|
|
33
|
+
val heightDp = heightPx.toFloat().pxToDp()
|
|
34
|
+
|
|
35
|
+
if (updateState(stateWrapper, widthDp, heightDp)) return
|
|
36
|
+
|
|
37
|
+
val newStateData = WritableNativeMap()
|
|
38
|
+
newStateData.putDouble("containerWidth", widthDp.toDouble())
|
|
39
|
+
newStateData.putDouble("containerHeight", heightDp.toDouble())
|
|
40
|
+
stateWrapper.updateState(newStateData)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Returns false when unavailable — caller should fall back to async updateState. */
|
|
44
|
+
fun updateFooterState(stateWrapper: StateWrapper, bottomInsetDp: Float): Boolean =
|
|
45
|
+
isAvailable && nativeUpdateFooterState(stateWrapper, bottomInsetDp)
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Publishes the precalculated bottom safe-area inset so a late-mounted
|
|
49
|
+
* footer's first layout is already padded (see TrueSheetFooterViewShadowNode).
|
|
50
|
+
*/
|
|
51
|
+
fun setBottomSafeArea(insetDp: Float) {
|
|
52
|
+
if (isAvailable) nativeSetBottomSafeArea(insetDp)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@JvmStatic
|
|
56
|
+
private external fun nativeUpdateState(stateWrapper: Any, width: Float, height: Float): Boolean
|
|
57
|
+
|
|
58
|
+
@JvmStatic
|
|
59
|
+
private external fun nativeUpdateFooterState(stateWrapper: Any, bottomInset: Float): Boolean
|
|
60
|
+
|
|
61
|
+
@JvmStatic
|
|
62
|
+
private external fun nativeSetBottomSafeArea(insetDp: Float)
|
|
63
|
+
}
|