@lodev09/react-native-true-sheet 4.0.0-beta.0 → 4.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +150 -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 +1217 -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/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 +1136 -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 +224 -64
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/TrueSheet.web.js +1201 -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 +85 -0
- package/lib/module/mocks/navigation.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/TrueSheetRouter.js +170 -0
- package/lib/module/navigation/TrueSheetRouter.js.map +1 -0
- package/lib/module/navigation/TrueSheetView.js +71 -0
- package/lib/module/navigation/TrueSheetView.js.map +1 -0
- package/lib/module/navigation/createTrueSheetNavigator.js +63 -0
- package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -0
- package/lib/module/navigation/index.js +6 -0
- package/lib/module/navigation/index.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/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 +93 -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 +66 -0
- package/lib/typescript/src/mocks/navigation.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/TrueSheetRouter.d.ts +57 -0
- package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -0
- package/lib/typescript/src/navigation/TrueSheetView.d.ts +10 -0
- package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -0
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +35 -0
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -0
- package/lib/typescript/src/navigation/index.d.ts +6 -0
- package/lib/typescript/src/navigation/index.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 +15 -0
- package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +153 -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/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 +78 -34
- package/react-native.config.js +9 -2
- package/src/TrueSheet.tsx +276 -60
- package/src/TrueSheet.types.ts +525 -71
- package/src/TrueSheet.web.tsx +1366 -0
- package/src/TrueSheetPeek.tsx +11 -0
- package/src/TrueSheetPeek.web.tsx +63 -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 +72 -0
- package/src/mocks/reanimated.ts +101 -0
- package/src/navigation/TrueSheetRouter.ts +234 -0
- package/src/navigation/TrueSheetView.tsx +99 -0
- package/src/navigation/createTrueSheetNavigator.tsx +93 -0
- package/src/navigation/index.ts +14 -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 +21 -0
- package/src/navigation/screen/useSheetScreenState.ts +107 -0
- package/src/navigation/types.ts +219 -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/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 +124 -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
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ViewProps } from 'react-native';
|
|
2
|
+
|
|
3
|
+
import TrueSheetPeekViewNativeComponent from './fabric/TrueSheetPeekViewNativeComponent';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper component that marks its children as the sheet's peek content.
|
|
7
|
+
* When rendered within a `TrueSheet`, the `"peek"` detent reveals everything
|
|
8
|
+
* from the top of the sheet through the bottom of this component — content
|
|
9
|
+
* below it stays hidden until the sheet is expanded.
|
|
10
|
+
*/
|
|
11
|
+
export const TrueSheetPeek = (props: ViewProps) => <TrueSheetPeekViewNativeComponent {...props} />;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createContext, type RefObject, useContext, useEffect, useRef } from 'react';
|
|
2
|
+
import { type LayoutChangeEvent, View, type ViewProps } from 'react-native';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Reports the measured peek content height to the owning TrueSheet.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export interface TrueSheetPeekContextValue {
|
|
9
|
+
contentRef: RefObject<View | null>;
|
|
10
|
+
peekRef: RefObject<View | null>;
|
|
11
|
+
setPeekContentHeight: (height: number) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const TrueSheetPeekContext = createContext<TrueSheetPeekContextValue | null>(null);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Distance from the top of the content view to the bottom of the peek view,
|
|
18
|
+
* so the peek view's offset within the content (padding, views above it)
|
|
19
|
+
* counts toward the peek detent. Both rects live in the drawer's transformed
|
|
20
|
+
* subtree, so an in-flight translate cancels out of the delta.
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export const measurePeekContentHeight = (
|
|
24
|
+
peekElement: HTMLElement,
|
|
25
|
+
contentElement: HTMLElement
|
|
26
|
+
): number =>
|
|
27
|
+
peekElement.getBoundingClientRect().bottom - contentElement.getBoundingClientRect().top;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Wrapper component that marks its children as the sheet's peek content.
|
|
31
|
+
* When rendered within a `TrueSheet`, the `"peek"` detent reveals everything
|
|
32
|
+
* from the top of the sheet through the bottom of this component — content
|
|
33
|
+
* below it stays hidden until the sheet is expanded.
|
|
34
|
+
*/
|
|
35
|
+
export const TrueSheetPeek = ({ onLayout, ...rest }: ViewProps) => {
|
|
36
|
+
const context = useContext(TrueSheetPeekContext);
|
|
37
|
+
const localRef = useRef<View>(null);
|
|
38
|
+
|
|
39
|
+
// Register into the sheet's peek ref so it can measure the peek live
|
|
40
|
+
// during detent geometry computation (state lags the first willPresent).
|
|
41
|
+
const viewRef = context?.peekRef ?? localRef;
|
|
42
|
+
|
|
43
|
+
useEffect(() => () => context?.setPeekContentHeight(0), [context]);
|
|
44
|
+
|
|
45
|
+
const handleLayout = (event: LayoutChangeEvent) => {
|
|
46
|
+
if (context) {
|
|
47
|
+
// On web, View refs resolve to the underlying DOM elements.
|
|
48
|
+
const peekElement = viewRef.current as unknown as HTMLElement | null;
|
|
49
|
+
const contentElement = context.contentRef.current as unknown as HTMLElement | null;
|
|
50
|
+
|
|
51
|
+
const bottom =
|
|
52
|
+
peekElement && contentElement
|
|
53
|
+
? measurePeekContentHeight(peekElement, contentElement)
|
|
54
|
+
: event.nativeEvent.layout.height;
|
|
55
|
+
|
|
56
|
+
context.setPeekContentHeight(bottom);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
onLayout?.(event);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return <View {...rest} ref={viewRef} onLayout={handleLayout} />;
|
|
63
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import { TrueSheet } from './TrueSheet';
|
|
4
|
+
import type { TrueSheetStaticMethods } from './TrueSheet.types';
|
|
5
|
+
|
|
6
|
+
export type { TrueSheetStaticMethods };
|
|
7
|
+
|
|
8
|
+
export interface TrueSheetProviderProps {
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Provider for TrueSheet on native platforms.
|
|
14
|
+
* This is a pass-through component - no context is needed on native
|
|
15
|
+
* since TrueSheet uses static instance methods internally.
|
|
16
|
+
*/
|
|
17
|
+
export function TrueSheetProvider({ children }: TrueSheetProviderProps) {
|
|
18
|
+
return children;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hook to control TrueSheet instances by name.
|
|
23
|
+
* On native, this maps directly to TrueSheet static methods.
|
|
24
|
+
*/
|
|
25
|
+
export function useTrueSheet(): TrueSheetStaticMethods {
|
|
26
|
+
return {
|
|
27
|
+
present: TrueSheet.present,
|
|
28
|
+
dismiss: TrueSheet.dismiss,
|
|
29
|
+
dismissStack: TrueSheet.dismissStack,
|
|
30
|
+
resize: TrueSheet.resize,
|
|
31
|
+
dismissAll: TrueSheet.dismissAll,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
useCallback,
|
|
4
|
+
useContext,
|
|
5
|
+
useEffect,
|
|
6
|
+
useLayoutEffect,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useSyncExternalStore,
|
|
10
|
+
type ReactNode,
|
|
11
|
+
type RefObject,
|
|
12
|
+
} from 'react';
|
|
13
|
+
|
|
14
|
+
import type { TrueSheetMethods, TrueSheetStaticMethods } from './TrueSheet.types';
|
|
15
|
+
|
|
16
|
+
type SheetRef = RefObject<TrueSheetMethods | null>;
|
|
17
|
+
type NodeRef = RefObject<HTMLDivElement | null>;
|
|
18
|
+
|
|
19
|
+
interface StackEntry {
|
|
20
|
+
ref: SheetRef;
|
|
21
|
+
nodeRef: NodeRef;
|
|
22
|
+
isFormSheetRef: RefObject<boolean>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface SheetContextValue {
|
|
26
|
+
registerByName: (name: string, ref: SheetRef) => () => void;
|
|
27
|
+
resolveByName: (name: string) => TrueSheetMethods;
|
|
28
|
+
pushOpen: (entry: StackEntry) => void;
|
|
29
|
+
popOpen: (entry: StackEntry) => void;
|
|
30
|
+
subscribeStack: (listener: () => void) => () => void;
|
|
31
|
+
getStackSnapshot: () => readonly StackEntry[];
|
|
32
|
+
portalContainer: HTMLElement | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const SheetContext = createContext<SheetContextValue | null>(null);
|
|
36
|
+
|
|
37
|
+
const NO_PROVIDER_ERROR =
|
|
38
|
+
'TrueSheet: useTrueSheet() requires a <TrueSheetProvider> ancestor on web.';
|
|
39
|
+
|
|
40
|
+
const EMPTY_STACK: readonly StackEntry[] = Object.freeze([]);
|
|
41
|
+
|
|
42
|
+
export interface TrueSheetProviderProps {
|
|
43
|
+
children: ReactNode;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function TrueSheetProvider({ children }: TrueSheetProviderProps) {
|
|
47
|
+
const namedSheetsRef = useRef<Map<string, SheetRef>>(new Map());
|
|
48
|
+
const stackRef = useRef<readonly StackEntry[]>(EMPTY_STACK);
|
|
49
|
+
const listenersRef = useRef<Set<() => void>>(new Set());
|
|
50
|
+
|
|
51
|
+
// Stable portal container created once. Attached to an anchor div rendered
|
|
52
|
+
// in this provider's tree so the sheets unmount cleanly with the provider
|
|
53
|
+
// (e.g., when a screen-scoped provider unmounts on navigation).
|
|
54
|
+
const portalContainer = useMemo<HTMLDivElement | null>(
|
|
55
|
+
() => (typeof document !== 'undefined' ? document.createElement('div') : null),
|
|
56
|
+
[]
|
|
57
|
+
);
|
|
58
|
+
const anchorRef = useRef<HTMLDivElement | null>(null);
|
|
59
|
+
|
|
60
|
+
useLayoutEffect(() => {
|
|
61
|
+
const anchor = anchorRef.current;
|
|
62
|
+
if (!anchor || !portalContainer) return;
|
|
63
|
+
anchor.appendChild(portalContainer);
|
|
64
|
+
return () => {
|
|
65
|
+
if (portalContainer.parentNode) {
|
|
66
|
+
portalContainer.parentNode.removeChild(portalContainer);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}, [portalContainer]);
|
|
70
|
+
|
|
71
|
+
const value = useMemo<SheetContextValue>(() => {
|
|
72
|
+
const notify = () => listenersRef.current.forEach((listener) => listener());
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
registerByName: (name, ref) => {
|
|
76
|
+
namedSheetsRef.current.set(name, ref);
|
|
77
|
+
return () => {
|
|
78
|
+
if (namedSheetsRef.current.get(name) === ref) {
|
|
79
|
+
namedSheetsRef.current.delete(name);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
resolveByName: (name) => {
|
|
84
|
+
const ref = namedSheetsRef.current.get(name);
|
|
85
|
+
const methods = ref?.current;
|
|
86
|
+
if (!methods) {
|
|
87
|
+
throw new Error(`TrueSheet: no sheet registered with name "${name}"`);
|
|
88
|
+
}
|
|
89
|
+
return methods;
|
|
90
|
+
},
|
|
91
|
+
pushOpen: (entry) => {
|
|
92
|
+
if (stackRef.current.some((e) => e.ref === entry.ref)) return;
|
|
93
|
+
stackRef.current = [...stackRef.current, entry];
|
|
94
|
+
notify();
|
|
95
|
+
},
|
|
96
|
+
popOpen: (entry) => {
|
|
97
|
+
const idx = stackRef.current.findIndex((e) => e.ref === entry.ref);
|
|
98
|
+
if (idx < 0) return;
|
|
99
|
+
stackRef.current = [...stackRef.current.slice(0, idx), ...stackRef.current.slice(idx + 1)];
|
|
100
|
+
notify();
|
|
101
|
+
},
|
|
102
|
+
subscribeStack: (listener) => {
|
|
103
|
+
listenersRef.current.add(listener);
|
|
104
|
+
return () => {
|
|
105
|
+
listenersRef.current.delete(listener);
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
getStackSnapshot: () => stackRef.current,
|
|
109
|
+
portalContainer,
|
|
110
|
+
};
|
|
111
|
+
}, [portalContainer]);
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<SheetContext.Provider value={value}>
|
|
115
|
+
{children}
|
|
116
|
+
<div ref={anchorRef} />
|
|
117
|
+
</SheetContext.Provider>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function usePortalContainer(): HTMLElement | null {
|
|
122
|
+
const ctx = useContext(SheetContext);
|
|
123
|
+
return ctx?.portalContainer ?? null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function useTrueSheet(): TrueSheetStaticMethods {
|
|
127
|
+
const ctx = useContext(SheetContext);
|
|
128
|
+
|
|
129
|
+
return useMemo<TrueSheetStaticMethods>(() => {
|
|
130
|
+
if (!ctx) {
|
|
131
|
+
const reject = async (): Promise<never> => {
|
|
132
|
+
throw new Error(NO_PROVIDER_ERROR);
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
present: reject,
|
|
136
|
+
resize: reject,
|
|
137
|
+
dismiss: reject,
|
|
138
|
+
dismissStack: reject,
|
|
139
|
+
dismissAll: reject,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
present: (name, index, animated) => ctx.resolveByName(name).present(index, animated),
|
|
145
|
+
resize: (name, index) => ctx.resolveByName(name).resize(index),
|
|
146
|
+
dismiss: (name, animated) => ctx.resolveByName(name).dismiss(animated),
|
|
147
|
+
dismissStack: (name, animated) => ctx.resolveByName(name).dismissStack(animated),
|
|
148
|
+
dismissAll: async (animated) => {
|
|
149
|
+
const stack = ctx.getStackSnapshot();
|
|
150
|
+
await Promise.all(
|
|
151
|
+
[...stack].reverse().map((entry) => entry.ref.current?.dismiss(animated))
|
|
152
|
+
);
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}, [ctx]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function useRegisterSheet(name: string | undefined, ref: SheetRef): void {
|
|
159
|
+
const ctx = useContext(SheetContext);
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
if (!ctx || !name) return;
|
|
162
|
+
return ctx.registerByName(name, ref);
|
|
163
|
+
}, [ctx, name, ref]);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Registers the sheet in the open stack while `isOpen` is true and returns
|
|
168
|
+
* live data used by each sheet to render stacked visuals and dismiss children.
|
|
169
|
+
*/
|
|
170
|
+
export function useSheetStack(
|
|
171
|
+
ref: SheetRef,
|
|
172
|
+
nodeRef: NodeRef,
|
|
173
|
+
isOpen: boolean,
|
|
174
|
+
isFormSheet: boolean
|
|
175
|
+
) {
|
|
176
|
+
const ctx = useContext(SheetContext);
|
|
177
|
+
|
|
178
|
+
const isFormSheetRef = useRef(isFormSheet);
|
|
179
|
+
isFormSheetRef.current = isFormSheet;
|
|
180
|
+
|
|
181
|
+
const entry = useMemo<StackEntry>(() => ({ ref, nodeRef, isFormSheetRef }), [ref, nodeRef]);
|
|
182
|
+
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
if (!ctx || !isOpen) return;
|
|
185
|
+
ctx.pushOpen(entry);
|
|
186
|
+
return () => ctx.popOpen(entry);
|
|
187
|
+
}, [ctx, entry, isOpen]);
|
|
188
|
+
|
|
189
|
+
const subscribe = useCallback(
|
|
190
|
+
(listener: () => void) => {
|
|
191
|
+
if (!ctx) return () => {};
|
|
192
|
+
return ctx.subscribeStack(listener);
|
|
193
|
+
},
|
|
194
|
+
[ctx]
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
const getSnapshot = useCallback(() => (ctx ? ctx.getStackSnapshot() : EMPTY_STACK), [ctx]);
|
|
198
|
+
|
|
199
|
+
const stack = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
200
|
+
const stackIndex = stack.findIndex((e) => e.ref === ref);
|
|
201
|
+
const isNested = stackIndex > 0;
|
|
202
|
+
const descendants = useMemo<readonly StackEntry[]>(
|
|
203
|
+
() => (stackIndex < 0 ? EMPTY_STACK : stack.slice(stackIndex + 1)),
|
|
204
|
+
[stack, stackIndex]
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const dismissAbove = useCallback(
|
|
208
|
+
async (animated?: boolean) => {
|
|
209
|
+
if (!ctx) return;
|
|
210
|
+
const snapshot = ctx.getStackSnapshot();
|
|
211
|
+
const idx = snapshot.findIndex((e) => e.ref === ref);
|
|
212
|
+
if (idx < 0) return;
|
|
213
|
+
const above = snapshot.slice(idx + 1);
|
|
214
|
+
await Promise.all([...above].reverse().map((e) => e.ref.current?.dismiss(animated)));
|
|
215
|
+
},
|
|
216
|
+
[ctx, ref]
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
return { descendants, isNested, dismissAbove };
|
|
220
|
+
}
|
|
@@ -5,4 +5,4 @@ export interface NativeProps extends ViewProps {
|
|
|
5
5
|
// No props needed - container accesses props from parent TrueSheetView
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export default codegenNativeComponent<NativeProps>('TrueSheetContainerView'
|
|
8
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetContainerView');
|
|
@@ -5,4 +5,8 @@ export interface NativeProps extends ViewProps {
|
|
|
5
5
|
// No props needed - size will be controlled by parent
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// interfaceOnly: shadow node/state/descriptor are custom (common/cpp) so the
|
|
9
|
+
// content can be bounded to the container when a ScrollView is pinned
|
|
10
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetContentView', {
|
|
11
|
+
interfaceOnly: true,
|
|
12
|
+
});
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import type { ViewProps } from 'react-native';
|
|
2
|
+
import type { WithDefault } from 'react-native/Libraries/Types/CodegenTypes';
|
|
2
3
|
import { codegenNativeComponent } from 'react-native';
|
|
3
4
|
|
|
4
5
|
export interface NativeProps extends ViewProps {
|
|
5
|
-
//
|
|
6
|
+
// Seeds the footer's first layout with the sheet's bottom safe-area inset
|
|
7
|
+
// (insetAdjustment: 'automatic') so a late-set footer doesn't need a second
|
|
8
|
+
// layout pass — and a visible sheet resize — once native pushes the inset
|
|
9
|
+
autoBottomInset?: WithDefault<boolean, false>;
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
|
|
12
|
+
// interfaceOnly: shadow node/state/descriptor are custom (common/cpp) so the
|
|
13
|
+
// footer can absorb the sheet's bottom safe-area inset as padding
|
|
14
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetFooterView', {
|
|
15
|
+
interfaceOnly: true,
|
|
16
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ViewProps } from 'react-native';
|
|
2
|
+
import { codegenNativeComponent } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface NativeProps extends ViewProps {
|
|
5
|
+
// Header-specific props can be added here if needed
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetHeaderView', {});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ViewProps } from 'react-native';
|
|
2
|
+
import { codegenNativeComponent } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface NativeProps extends ViewProps {
|
|
5
|
+
// Peek-specific props can be added here if needed
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetPeekView', {});
|
|
@@ -1,50 +1,131 @@
|
|
|
1
|
-
import type { ViewProps } from 'react-native';
|
|
1
|
+
import type { ColorValue, ProcessedColorValue, ViewProps } from 'react-native';
|
|
2
2
|
import type {
|
|
3
3
|
DirectEventHandler,
|
|
4
4
|
Double,
|
|
5
5
|
Int32,
|
|
6
6
|
WithDefault,
|
|
7
|
-
Float,
|
|
8
7
|
} from 'react-native/Libraries/Types/CodegenTypes';
|
|
9
8
|
import { codegenNativeComponent } from 'react-native';
|
|
10
9
|
|
|
10
|
+
type GrabberOptionsType = Readonly<{
|
|
11
|
+
width?: Double;
|
|
12
|
+
height?: Double;
|
|
13
|
+
topMargin?: Double;
|
|
14
|
+
cornerRadius?: WithDefault<Double, -1>;
|
|
15
|
+
color?: ProcessedColorValue | null;
|
|
16
|
+
adaptive?: WithDefault<boolean, true>;
|
|
17
|
+
}>;
|
|
18
|
+
|
|
19
|
+
type AccessibilityOptionsType = Readonly<{
|
|
20
|
+
grabberLabel?: WithDefault<string, 'Sheet Grabber'>;
|
|
21
|
+
grabberHint?: WithDefault<string, 'Double-tap to expand. Swipe up or down to resize the sheet'>;
|
|
22
|
+
expandedValue?: WithDefault<string, 'Expanded'>;
|
|
23
|
+
collapsedValue?: WithDefault<string, 'Collapsed'>;
|
|
24
|
+
detentValue?: WithDefault<string, 'Detent {index} of {count}'>;
|
|
25
|
+
expandActionLabel?: WithDefault<string, 'Expand'>;
|
|
26
|
+
collapseActionLabel?: WithDefault<string, 'Collapse'>;
|
|
27
|
+
paneTitle?: WithDefault<string, 'Bottom sheet'>;
|
|
28
|
+
}>;
|
|
29
|
+
|
|
30
|
+
type BlurOptionsType = Readonly<{
|
|
31
|
+
intensity?: WithDefault<Double, -1>;
|
|
32
|
+
interaction?: WithDefault<boolean, true>;
|
|
33
|
+
}>;
|
|
34
|
+
|
|
35
|
+
type ScrollEdgeEffect = 'automatic' | 'hard' | 'soft' | 'hidden';
|
|
36
|
+
|
|
37
|
+
type ScrollableOptionsType = Readonly<{
|
|
38
|
+
keyboardScrollOffset?: WithDefault<Double, 0>;
|
|
39
|
+
scrollingExpandsSheet?: WithDefault<boolean, true>;
|
|
40
|
+
topScrollEdgeEffect?: WithDefault<ScrollEdgeEffect, 'hidden'>;
|
|
41
|
+
bottomScrollEdgeEffect?: WithDefault<ScrollEdgeEffect, 'hidden'>;
|
|
42
|
+
}>;
|
|
43
|
+
|
|
44
|
+
type FooterOptionsType = Readonly<{
|
|
45
|
+
// Named uniquely across option structs — codegen derives the enum name from
|
|
46
|
+
// the field name, so a second `position` would redefine TrueSheetViewPosition
|
|
47
|
+
footerPosition?: WithDefault<'relative' | 'absolute', 'relative'>;
|
|
48
|
+
keyboardOffset?: WithDefault<Double, 0>;
|
|
49
|
+
}>;
|
|
50
|
+
|
|
51
|
+
type HeaderOptionsType = Readonly<{
|
|
52
|
+
position?: WithDefault<'relative' | 'absolute', 'relative'>;
|
|
53
|
+
}>;
|
|
54
|
+
|
|
11
55
|
export interface DetentInfoEventPayload {
|
|
12
56
|
index: Int32;
|
|
13
57
|
position: Double;
|
|
58
|
+
detent: Double;
|
|
14
59
|
}
|
|
15
60
|
|
|
16
61
|
export interface PositionChangeEventPayload {
|
|
17
|
-
index:
|
|
62
|
+
index: Double;
|
|
18
63
|
position: Double;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export interface SizeChangeEventPayload {
|
|
23
|
-
width: Double;
|
|
24
|
-
height: Double;
|
|
64
|
+
detent: Double;
|
|
65
|
+
realtime: boolean;
|
|
25
66
|
}
|
|
26
67
|
|
|
27
68
|
export interface NativeProps extends ViewProps {
|
|
28
69
|
// Array properties
|
|
29
|
-
detents?: ReadonlyArray<
|
|
70
|
+
detents?: ReadonlyArray<Double>;
|
|
30
71
|
|
|
31
72
|
// Number properties - use 0 as default to avoid nil insertion
|
|
32
|
-
|
|
33
|
-
|
|
73
|
+
maxContentHeight?: WithDefault<Double, 0>;
|
|
74
|
+
maxContentWidth?: WithDefault<Double, 0>;
|
|
34
75
|
cornerRadius?: WithDefault<Double, -1>;
|
|
76
|
+
elevation?: WithDefault<Double, -1>;
|
|
77
|
+
|
|
78
|
+
// Color properties
|
|
79
|
+
backgroundColor?: ColorValue;
|
|
35
80
|
initialDetentIndex?: WithDefault<Int32, -1>;
|
|
36
|
-
|
|
81
|
+
dimmedDetentIndex?: WithDefault<Int32, 0>;
|
|
37
82
|
|
|
38
83
|
// String properties - use empty string as default to avoid nil insertion
|
|
39
|
-
|
|
40
|
-
|
|
84
|
+
backgroundBlur?: WithDefault<
|
|
85
|
+
| 'none'
|
|
86
|
+
| 'light'
|
|
87
|
+
| 'dark'
|
|
88
|
+
| 'default'
|
|
89
|
+
| 'extra-light'
|
|
90
|
+
| 'regular'
|
|
91
|
+
| 'prominent'
|
|
92
|
+
| 'system-ultra-thin-material'
|
|
93
|
+
| 'system-thin-material'
|
|
94
|
+
| 'system-material'
|
|
95
|
+
| 'system-thick-material'
|
|
96
|
+
| 'system-chrome-material'
|
|
97
|
+
| 'system-ultra-thin-material-light'
|
|
98
|
+
| 'system-thin-material-light'
|
|
99
|
+
| 'system-material-light'
|
|
100
|
+
| 'system-thick-material-light'
|
|
101
|
+
| 'system-chrome-material-light'
|
|
102
|
+
| 'system-ultra-thin-material-dark'
|
|
103
|
+
| 'system-thin-material-dark'
|
|
104
|
+
| 'system-material-dark'
|
|
105
|
+
| 'system-thick-material-dark'
|
|
106
|
+
| 'system-chrome-material-dark',
|
|
107
|
+
'none'
|
|
108
|
+
>;
|
|
109
|
+
|
|
110
|
+
anchor?: WithDefault<'left' | 'center' | 'right', 'center'>;
|
|
111
|
+
anchorOffset?: WithDefault<Double, 16>;
|
|
112
|
+
insetAdjustment?: WithDefault<'automatic' | 'never', 'automatic'>;
|
|
113
|
+
|
|
114
|
+
// Blur options
|
|
115
|
+
blurOptions?: BlurOptionsType;
|
|
41
116
|
|
|
42
117
|
// Boolean properties - match defaults from TrueSheet.types.ts
|
|
43
118
|
grabber?: WithDefault<boolean, true>;
|
|
119
|
+
grabberOptions?: GrabberOptionsType;
|
|
120
|
+
accessibilityOptions?: AccessibilityOptionsType;
|
|
44
121
|
dismissible?: WithDefault<boolean, true>;
|
|
122
|
+
draggable?: WithDefault<boolean, true>;
|
|
45
123
|
dimmed?: WithDefault<boolean, true>;
|
|
46
124
|
initialDetentAnimated?: WithDefault<boolean, true>;
|
|
47
|
-
|
|
125
|
+
scrollableOptions?: ScrollableOptionsType;
|
|
126
|
+
headerOptions?: HeaderOptionsType;
|
|
127
|
+
footerOptions?: FooterOptionsType;
|
|
128
|
+
presentation?: WithDefault<'page' | 'form', 'page'>;
|
|
48
129
|
|
|
49
130
|
// Event handlers
|
|
50
131
|
onMount?: DirectEventHandler<null>;
|
|
@@ -57,7 +138,13 @@ export interface NativeProps extends ViewProps {
|
|
|
57
138
|
onDragChange?: DirectEventHandler<DetentInfoEventPayload>;
|
|
58
139
|
onDragEnd?: DirectEventHandler<DetentInfoEventPayload>;
|
|
59
140
|
onPositionChange?: DirectEventHandler<PositionChangeEventPayload>;
|
|
60
|
-
|
|
141
|
+
onWillFocus?: DirectEventHandler<null>;
|
|
142
|
+
onDidFocus?: DirectEventHandler<null>;
|
|
143
|
+
onWillBlur?: DirectEventHandler<null>;
|
|
144
|
+
onDidBlur?: DirectEventHandler<null>;
|
|
145
|
+
onVisibilityChange?: DirectEventHandler<Readonly<{ visible: boolean }>>;
|
|
61
146
|
}
|
|
62
147
|
|
|
63
|
-
export default codegenNativeComponent<NativeProps>('TrueSheetView'
|
|
148
|
+
export default codegenNativeComponent<NativeProps>('TrueSheetView', {
|
|
149
|
+
interfaceOnly: true,
|
|
150
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import React, { createElement, isValidElement, type ReactNode } from 'react';
|
|
2
|
+
import { View, type ViewProps } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import type { TrueSheetProps, TrueSheetStaticMethods } from '../TrueSheet.types';
|
|
5
|
+
|
|
6
|
+
interface TrueSheetState {
|
|
7
|
+
shouldRenderNativeView: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Mock TrueSheet component for testing.
|
|
12
|
+
* Import from '@lodev09/react-native-true-sheet/mock' in your test setup.
|
|
13
|
+
*/
|
|
14
|
+
export class TrueSheet extends React.Component<TrueSheetProps, TrueSheetState> {
|
|
15
|
+
static instances: Record<string, TrueSheet> = {};
|
|
16
|
+
|
|
17
|
+
static dismiss = jest.fn((_name: string, _animated?: boolean) => Promise.resolve());
|
|
18
|
+
static dismissStack = jest.fn((_name: string, _animated?: boolean) => Promise.resolve());
|
|
19
|
+
static present = jest.fn((_name: string, _index?: number, _animated?: boolean) =>
|
|
20
|
+
Promise.resolve()
|
|
21
|
+
);
|
|
22
|
+
static resize = jest.fn((_name: string, _index: number) => Promise.resolve());
|
|
23
|
+
static dismissAll = jest.fn((_animated?: boolean) => Promise.resolve());
|
|
24
|
+
|
|
25
|
+
dismiss = jest.fn((_animated?: boolean) => Promise.resolve());
|
|
26
|
+
dismissStack = jest.fn((_animated?: boolean) => Promise.resolve());
|
|
27
|
+
present = jest.fn((_index?: number, _animated?: boolean) => Promise.resolve());
|
|
28
|
+
resize = jest.fn((_index: number) => Promise.resolve());
|
|
29
|
+
|
|
30
|
+
componentDidMount() {
|
|
31
|
+
const { name } = this.props;
|
|
32
|
+
if (name) {
|
|
33
|
+
TrueSheet.instances[name] = this;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
componentWillUnmount() {
|
|
38
|
+
const { name } = this.props;
|
|
39
|
+
if (name) {
|
|
40
|
+
delete TrueSheet.instances[name];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private renderHeader(): ReactNode {
|
|
45
|
+
const { header } = this.props;
|
|
46
|
+
if (!header) return null;
|
|
47
|
+
return isValidElement(header) ? header : createElement(header);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private renderFooter(): ReactNode {
|
|
51
|
+
const { footer } = this.props;
|
|
52
|
+
if (!footer) return null;
|
|
53
|
+
return isValidElement(footer) ? footer : createElement(footer);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
render() {
|
|
57
|
+
const { children, style } = this.props;
|
|
58
|
+
return React.createElement(View, { style }, this.renderHeader(), children, this.renderFooter());
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Mock TrueSheetPeek component for testing.
|
|
64
|
+
*/
|
|
65
|
+
export function TrueSheetPeek({ children, ...rest }: ViewProps) {
|
|
66
|
+
return React.createElement(View, rest, children);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Mock TrueSheetProvider for testing.
|
|
71
|
+
*/
|
|
72
|
+
export function TrueSheetProvider({ children }: { children: React.ReactNode }) {
|
|
73
|
+
return children;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Mock useTrueSheet hook for testing.
|
|
78
|
+
*/
|
|
79
|
+
export function useTrueSheet(): TrueSheetStaticMethods {
|
|
80
|
+
return {
|
|
81
|
+
present: TrueSheet.present,
|
|
82
|
+
dismiss: TrueSheet.dismiss,
|
|
83
|
+
dismissStack: TrueSheet.dismissStack,
|
|
84
|
+
resize: TrueSheet.resize,
|
|
85
|
+
dismissAll: TrueSheet.dismissAll,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export * from '../TrueSheet.types';
|