@lodev09/react-native-true-sheet 4.0.0-beta.0 → 4.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +42 -31
- package/RNTrueSheet.podspec +10 -2
- package/android/build.gradle +2 -1
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +156 -21
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +5 -4
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1224 -603
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
- package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
- package/android/src/main/java/com/lodev09/truesheet/utils/TouchEventDeduper.kt +31 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
- package/android/src/main/jni/CMakeLists.txt +63 -0
- package/android/src/main/jni/TrueSheetSpec.h +19 -0
- package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
- package/ios/TrueSheetContainerView.h +81 -6
- package/ios/TrueSheetContainerView.mm +275 -21
- package/ios/TrueSheetContentView.h +38 -1
- package/ios/TrueSheetContentView.mm +413 -43
- package/ios/TrueSheetFooterView.h +27 -2
- package/ios/TrueSheetFooterView.mm +141 -35
- package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
- package/ios/TrueSheetHeaderView.mm +64 -0
- package/ios/TrueSheetModule.mm +92 -5
- package/ios/TrueSheetPeekView.h +32 -0
- package/ios/TrueSheetPeekView.mm +99 -0
- package/ios/TrueSheetView.h +7 -15
- package/ios/TrueSheetView.mm +633 -215
- package/ios/TrueSheetViewController.h +84 -16
- package/ios/TrueSheetViewController.mm +1133 -333
- package/ios/core/RNScreensEventObserver.h +46 -0
- package/ios/core/RNScreensEventObserver.mm +280 -0
- package/ios/core/TrueSheetBlurView.h +27 -0
- package/ios/core/TrueSheetBlurView.mm +82 -0
- package/ios/core/TrueSheetDetentCalculator.h +107 -0
- package/ios/core/TrueSheetDetentCalculator.mm +197 -0
- package/ios/core/TrueSheetGrabberView.h +72 -0
- package/ios/core/TrueSheetGrabberView.mm +178 -0
- package/ios/core/TrueSheetKeyboardObserver.h +39 -0
- package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
- package/ios/events/TrueSheetDragEvents.h +39 -0
- package/ios/events/TrueSheetDragEvents.mm +62 -0
- package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
- package/ios/events/TrueSheetFocusEvents.mm +49 -0
- package/ios/events/TrueSheetLifecycleEvents.h +40 -0
- package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
- package/ios/events/TrueSheetStateEvents.h +35 -0
- package/ios/events/TrueSheetStateEvents.mm +49 -0
- package/ios/tvos/TrueSheetStubs.mm +154 -0
- package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
- package/ios/utils/BlurUtil.mm +69 -0
- package/ios/utils/GestureUtil.h +7 -0
- package/ios/utils/GestureUtil.mm +12 -0
- package/ios/utils/PlatformUtil.h +15 -0
- package/ios/utils/UIView+FirstResponder.h +15 -0
- package/ios/utils/UIView+FirstResponder.mm +26 -0
- package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
- package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
- package/ios/utils/WindowUtil.mm +17 -1
- package/lib/module/TrueSheet.js +230 -64
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/TrueSheet.web.js +1203 -0
- package/lib/module/TrueSheet.web.js.map +1 -0
- package/lib/module/TrueSheetPeek.js +15 -0
- package/lib/module/TrueSheetPeek.js.map +1 -0
- package/lib/module/TrueSheetPeek.web.js +55 -0
- package/lib/module/TrueSheetPeek.web.js.map +1 -0
- package/lib/module/TrueSheetProvider.js +28 -0
- package/lib/module/TrueSheetProvider.js.map +1 -0
- package/lib/module/TrueSheetProvider.web.js +157 -0
- package/lib/module/TrueSheetProvider.web.js.map +1 -0
- package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/lib/module/index.js +3 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/mocks/index.js +93 -0
- package/lib/module/mocks/index.js.map +1 -0
- package/lib/module/mocks/navigation.js +95 -0
- package/lib/module/mocks/navigation.js.map +1 -0
- package/lib/module/mocks/navigationExpoRouter.js +21 -0
- package/lib/module/mocks/navigationExpoRouter.js.map +1 -0
- package/lib/module/mocks/reanimated.js +91 -0
- package/lib/module/mocks/reanimated.js.map +1 -0
- package/lib/module/navigation/TrueSheetNavigatorContent.js +73 -0
- package/lib/module/navigation/TrueSheetNavigatorContent.js.map +1 -0
- package/lib/module/navigation/actions.js +50 -0
- package/lib/module/navigation/actions.js.map +1 -0
- package/lib/module/navigation/createTrueSheetRouter.js +166 -0
- package/lib/module/navigation/createTrueSheetRouter.js.map +1 -0
- package/lib/module/navigation/expo-router/index.js +48 -0
- package/lib/module/navigation/expo-router/index.js.map +1 -0
- package/lib/module/navigation/index.js +47 -0
- package/lib/module/navigation/index.js.map +1 -0
- package/lib/module/navigation/navigator.js +10 -0
- package/lib/module/navigation/navigator.js.map +1 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/index.js +5 -0
- package/lib/module/navigation/screen/index.js.map +1 -0
- package/lib/module/navigation/screen/types.js +4 -0
- package/lib/module/navigation/screen/types.js.map +1 -0
- package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
- package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
- package/lib/module/navigation/types.js +4 -0
- package/lib/module/navigation/types.js.map +1 -0
- package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
- package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
- package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
- package/lib/module/reanimated/index.js +2 -2
- package/lib/module/reanimated/index.js.map +1 -1
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
- package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
- package/lib/module/web/constants.js +16 -0
- package/lib/module/web/constants.js.map +1 -0
- package/lib/module/web/dom.js +10 -0
- package/lib/module/web/dom.js.map +1 -0
- package/lib/module/web/vaul/README.md +9 -0
- package/lib/module/web/vaul/browser.js +30 -0
- package/lib/module/web/vaul/browser.js.map +1 -0
- package/lib/module/web/vaul/constants.js +15 -0
- package/lib/module/web/vaul/constants.js.map +1 -0
- package/lib/module/web/vaul/context.js +59 -0
- package/lib/module/web/vaul/context.js.map +1 -0
- package/lib/module/web/vaul/helpers.js +99 -0
- package/lib/module/web/vaul/helpers.js.map +1 -0
- package/lib/module/web/vaul/index.js +1309 -0
- package/lib/module/web/vaul/index.js.map +1 -0
- package/lib/module/web/vaul/style.css +287 -0
- package/lib/module/web/vaul/style.css.d.js +2 -0
- package/lib/module/web/vaul/style.css.d.js.map +1 -0
- package/lib/module/web/vaul/types.js +2 -0
- package/lib/module/web/vaul/types.js.map +1 -0
- package/lib/module/web/vaul/use-composed-refs.js +34 -0
- package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
- package/lib/module/web/vaul/use-controllable-state.js +54 -0
- package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
- package/lib/module/web/vaul/use-position-fixed.js +123 -0
- package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
- package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
- package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
- package/lib/module/web/vaul/use-scale-background.js +57 -0
- package/lib/module/web/vaul/use-scale-background.js.map +1 -0
- package/lib/module/web/vaul/use-snap-points.js +305 -0
- package/lib/module/web/vaul/use-snap-points.js.map +1 -0
- package/lib/typescript/src/TrueSheet.d.ts +51 -14
- package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
- package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
- package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/mocks/index.d.ts +43 -0
- package/lib/typescript/src/mocks/index.d.ts.map +1 -0
- package/lib/typescript/src/mocks/navigation.d.ts +70 -0
- package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
- package/lib/typescript/src/mocks/navigationExpoRouter.d.ts +22 -0
- package/lib/typescript/src/mocks/navigationExpoRouter.d.ts.map +1 -0
- package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
- package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
- package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts +5 -0
- package/lib/typescript/src/navigation/TrueSheetNavigatorContent.d.ts.map +1 -0
- package/lib/typescript/src/navigation/actions.d.ts +71 -0
- package/lib/typescript/src/navigation/actions.d.ts.map +1 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts +14 -0
- package/lib/typescript/src/navigation/createTrueSheetRouter.d.ts.map +1 -0
- package/lib/typescript/src/navigation/expo-router/index.d.ts +37 -0
- package/lib/typescript/src/navigation/expo-router/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/index.d.ts +46 -0
- package/lib/typescript/src/navigation/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/navigator.d.ts +7 -0
- package/lib/typescript/src/navigation/navigator.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
- package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/types.d.ts +14 -0
- package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +33 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +177 -0
- package/lib/typescript/src/navigation/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
- package/lib/typescript/src/web/constants.d.ts +14 -0
- package/lib/typescript/src/web/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/dom.d.ts +7 -0
- package/lib/typescript/src/web/dom.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
- package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
- package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/context.d.ts +53 -0
- package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/index.d.ts +228 -0
- package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/types.d.ts +7 -0
- package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
- package/package.json +95 -36
- package/react-native.config.js +9 -2
- package/src/TrueSheet.tsx +281 -62
- package/src/TrueSheet.types.ts +525 -71
- package/src/TrueSheet.web.tsx +1362 -0
- package/src/TrueSheetPeek.tsx +11 -0
- package/src/TrueSheetPeek.web.tsx +64 -0
- package/src/TrueSheetProvider.tsx +33 -0
- package/src/TrueSheetProvider.web.tsx +220 -0
- package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/src/index.ts +2 -2
- package/src/mocks/index.ts +89 -0
- package/src/mocks/navigation.ts +79 -0
- package/src/mocks/navigationExpoRouter.ts +40 -0
- package/src/mocks/reanimated.ts +100 -0
- package/src/navigation/TrueSheetNavigatorContent.tsx +106 -0
- package/src/navigation/actions.ts +78 -0
- package/src/navigation/createTrueSheetRouter.ts +222 -0
- package/src/navigation/expo-router/index.ts +89 -0
- package/src/navigation/index.ts +81 -0
- package/src/navigation/navigator.ts +18 -0
- package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
- package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
- package/src/navigation/screen/index.ts +3 -0
- package/src/navigation/screen/types.ts +19 -0
- package/src/navigation/screen/useSheetScreenState.ts +100 -0
- package/src/navigation/types.ts +251 -0
- package/src/navigation/useTrueSheetNavigation.ts +26 -0
- package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
- package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
- package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
- package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
- package/src/specs/NativeTrueSheetModule.ts +28 -3
- package/src/web/constants.ts +13 -0
- package/src/web/dom.ts +9 -0
- package/src/web/vaul/README.md +9 -0
- package/src/web/vaul/browser.ts +38 -0
- package/src/web/vaul/constants.ts +20 -0
- package/src/web/vaul/context.ts +101 -0
- package/src/web/vaul/helpers.ts +131 -0
- package/src/web/vaul/index.tsx +1740 -0
- package/src/web/vaul/style.css +287 -0
- package/src/web/vaul/style.css.d.ts +1 -0
- package/src/web/vaul/types.ts +7 -0
- package/src/web/vaul/use-composed-refs.ts +35 -0
- package/src/web/vaul/use-controllable-state.ts +66 -0
- package/src/web/vaul/use-position-fixed.ts +147 -0
- package/src/web/vaul/use-prevent-scroll.ts +309 -0
- package/src/web/vaul/use-scale-background.ts +64 -0
- package/src/web/vaul/use-snap-points.ts +455 -0
- package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
- package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
- package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
- package/android/src/main/res/values/styles.xml +0 -8
- package/ios/events/OnDetentChangeEvent.h +0 -28
- package/ios/events/OnDetentChangeEvent.mm +0 -30
- package/ios/events/OnDidDismissEvent.mm +0 -25
- package/ios/events/OnDidPresentEvent.h +0 -28
- package/ios/events/OnDidPresentEvent.mm +0 -30
- package/ios/events/OnDragBeginEvent.h +0 -28
- package/ios/events/OnDragBeginEvent.mm +0 -30
- package/ios/events/OnDragChangeEvent.h +0 -28
- package/ios/events/OnDragChangeEvent.mm +0 -30
- package/ios/events/OnDragEndEvent.h +0 -28
- package/ios/events/OnDragEndEvent.mm +0 -30
- package/ios/events/OnMountEvent.mm +0 -25
- package/ios/events/OnPositionChangeEvent.mm +0 -32
- package/ios/events/OnSizeChangeEvent.h +0 -28
- package/ios/events/OnSizeChangeEvent.mm +0 -30
- package/ios/events/OnWillDismissEvent.mm +0 -25
- package/ios/events/OnWillPresentEvent.h +0 -28
- package/ios/events/OnWillPresentEvent.mm +0 -30
- package/ios/utils/LayoutUtil.h +0 -44
- package/ios/utils/LayoutUtil.mm +0 -50
- package/lib/module/TrueSheetGrabber.js +0 -51
- package/lib/module/TrueSheetGrabber.js.map +0 -1
- package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
- package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
- package/src/TrueSheetGrabber.tsx +0 -82
- package/src/__mocks__/index.js +0 -67
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useNavigation, type ParamListBase } from '@react-navigation/native';
|
|
2
|
+
|
|
3
|
+
import type { TrueSheetNavigationProp } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Hook to access TrueSheet navigation with the resize helper.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* function MySheet() {
|
|
11
|
+
* const navigation = useTrueSheetNavigation();
|
|
12
|
+
*
|
|
13
|
+
* // Resize to a specific detent
|
|
14
|
+
* const handleExpand = () => {
|
|
15
|
+
* navigation.resize(1); // Resize to second detent
|
|
16
|
+
* };
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <Button title="Expand" onPress={handleExpand} />
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export const useTrueSheetNavigation = <
|
|
25
|
+
T extends ParamListBase = ParamListBase,
|
|
26
|
+
>(): TrueSheetNavigationProp<T> => useNavigation<TrueSheetNavigationProp<T>>();
|
|
@@ -70,24 +70,29 @@ const AnimatedTrueSheet = Animated.createAnimatedComponent(TrueSheet);
|
|
|
70
70
|
export const ReanimatedTrueSheet = forwardRef<TrueSheet, ReanimatedTrueSheetProps>((props, ref) => {
|
|
71
71
|
const { onPositionChange, ...rest } = props;
|
|
72
72
|
|
|
73
|
-
const { animatedPosition, animatedIndex } = useReanimatedTrueSheet();
|
|
73
|
+
const { animatedPosition, animatedIndex, animatedDetent } = useReanimatedTrueSheet();
|
|
74
74
|
|
|
75
75
|
const positionChangeHandler = useReanimatedPositionChangeHandler((payload) => {
|
|
76
76
|
'worklet';
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
if (payload.realtime) {
|
|
79
|
+
// Update directly when we have real-time values (during drag or animation tracking)
|
|
80
|
+
animatedPosition.value = payload.position;
|
|
81
|
+
animatedIndex.value = payload.index;
|
|
82
|
+
animatedDetent.value = payload.detent;
|
|
83
|
+
} else {
|
|
84
|
+
// Animate position, index, and detent when not real-time
|
|
81
85
|
if (Platform.OS === 'android') {
|
|
82
86
|
animatedPosition.value = withTiming(payload.position, TIMING_CONFIG);
|
|
87
|
+
animatedIndex.value = withTiming(payload.index, TIMING_CONFIG);
|
|
88
|
+
animatedDetent.value = withTiming(payload.detent, TIMING_CONFIG);
|
|
83
89
|
} else {
|
|
84
90
|
animatedPosition.value = withSpring(payload.position, SPRING_CONFIG);
|
|
91
|
+
animatedIndex.value = withSpring(payload.index, SPRING_CONFIG);
|
|
92
|
+
animatedDetent.value = withSpring(payload.detent, SPRING_CONFIG);
|
|
85
93
|
}
|
|
86
|
-
} else {
|
|
87
|
-
animatedPosition.value = payload.position;
|
|
88
94
|
}
|
|
89
95
|
|
|
90
|
-
animatedIndex.value = payload.index;
|
|
91
96
|
onPositionChange?.({ nativeEvent: payload } as PositionChangeEvent);
|
|
92
97
|
});
|
|
93
98
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { forwardRef, useEffect } from 'react';
|
|
2
|
+
import { useWindowDimensions } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { TrueSheet } from '../TrueSheet';
|
|
5
|
+
import type { TrueSheetProps, PositionChangeEvent } from '../TrueSheet.types';
|
|
6
|
+
import { useReanimatedTrueSheet } from './ReanimatedTrueSheetProvider';
|
|
7
|
+
|
|
8
|
+
interface ReanimatedTrueSheetProps extends TrueSheetProps {
|
|
9
|
+
/**
|
|
10
|
+
* Callback for position changes.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link TrueSheetProps.onPositionChange}
|
|
13
|
+
*/
|
|
14
|
+
onPositionChange?: TrueSheetProps['onPositionChange'];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Reanimated-enabled version of TrueSheet for web that automatically syncs
|
|
19
|
+
* position with the provider's shared value.
|
|
20
|
+
* Must be used within a ReanimatedTrueSheetProvider.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* import { ReanimatedTrueSheet, ReanimatedTrueSheetProvider } from '@lodev09/react-native-true-sheet/reanimated'
|
|
25
|
+
*
|
|
26
|
+
* function MyScreen() {
|
|
27
|
+
* const sheetRef = useRef<TrueSheet>(null)
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <ReanimatedTrueSheetProvider>
|
|
31
|
+
* <View>
|
|
32
|
+
* <ReanimatedTrueSheet
|
|
33
|
+
* ref={sheetRef}
|
|
34
|
+
* detents={[0.25, 0.5, 1]}
|
|
35
|
+
* initialDetentIndex={1}
|
|
36
|
+
* >
|
|
37
|
+
* <Text>Sheet Content</Text>
|
|
38
|
+
* </ReanimatedTrueSheet>
|
|
39
|
+
* </View>
|
|
40
|
+
* </ReanimatedTrueSheetProvider>
|
|
41
|
+
* )
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const ReanimatedTrueSheet = forwardRef<TrueSheet, ReanimatedTrueSheetProps>((props, ref) => {
|
|
46
|
+
const { onPositionChange, detents = [0.5, 1], ...rest } = props;
|
|
47
|
+
const { height: windowHeight } = useWindowDimensions();
|
|
48
|
+
|
|
49
|
+
const { animatedPosition, animatedIndex, animatedDetent } = useReanimatedTrueSheet();
|
|
50
|
+
|
|
51
|
+
// Reset animated values when component unmounts
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
return () => {
|
|
54
|
+
animatedPosition.value = windowHeight;
|
|
55
|
+
animatedIndex.value = -1;
|
|
56
|
+
animatedDetent.value = 0;
|
|
57
|
+
};
|
|
58
|
+
}, [windowHeight]);
|
|
59
|
+
|
|
60
|
+
const handlePositionChange = (event: PositionChangeEvent) => {
|
|
61
|
+
const { position, index, detent } = event.nativeEvent;
|
|
62
|
+
|
|
63
|
+
// Sync with provider's shared values
|
|
64
|
+
animatedPosition.value = position;
|
|
65
|
+
animatedIndex.value = index;
|
|
66
|
+
animatedDetent.value = detent;
|
|
67
|
+
|
|
68
|
+
// Call user's callback
|
|
69
|
+
onPositionChange?.(event);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<TrueSheet ref={ref} detents={detents} onPositionChange={handlePositionChange} {...rest} />
|
|
74
|
+
);
|
|
75
|
+
});
|
|
@@ -4,13 +4,19 @@ import { useSharedValue, type SharedValue } from 'react-native-reanimated';
|
|
|
4
4
|
|
|
5
5
|
export interface ReanimatedTrueSheetContextValue {
|
|
6
6
|
/**
|
|
7
|
-
* Shared value representing the current sheet position (Y offset from
|
|
7
|
+
* Shared value representing the current sheet position (Y offset from top of screen)
|
|
8
8
|
*/
|
|
9
9
|
animatedPosition: SharedValue<number>;
|
|
10
10
|
/**
|
|
11
|
-
* Shared value representing the current detent index
|
|
11
|
+
* Shared value representing the current detent index as a continuous float.
|
|
12
|
+
* Interpolates smoothly between -1 (off-screen) and the target detent index.
|
|
12
13
|
*/
|
|
13
14
|
animatedIndex: SharedValue<number>;
|
|
15
|
+
/**
|
|
16
|
+
* Shared value representing the current detent value (0-1 fraction of screen height).
|
|
17
|
+
* Interpolates smoothly between detent values as the sheet is dragged.
|
|
18
|
+
*/
|
|
19
|
+
animatedDetent: SharedValue<number>;
|
|
14
20
|
}
|
|
15
21
|
|
|
16
22
|
const ReanimatedTrueSheetContext = createContext<ReanimatedTrueSheetContextValue | null>(null);
|
|
@@ -40,13 +46,11 @@ export const ReanimatedTrueSheetProvider = ({ children }: ReanimatedTrueSheetPro
|
|
|
40
46
|
const { height } = useWindowDimensions();
|
|
41
47
|
const animatedPosition = useSharedValue(height);
|
|
42
48
|
const animatedIndex = useSharedValue(-1);
|
|
49
|
+
const animatedDetent = useSharedValue(0);
|
|
43
50
|
|
|
44
|
-
const value = useMemo(
|
|
45
|
-
() => ({
|
|
46
|
-
|
|
47
|
-
animatedIndex,
|
|
48
|
-
}),
|
|
49
|
-
[animatedPosition, animatedIndex]
|
|
51
|
+
const value = useMemo<ReanimatedTrueSheetContextValue>(
|
|
52
|
+
() => ({ animatedPosition, animatedIndex, animatedDetent }),
|
|
53
|
+
[animatedPosition, animatedIndex, animatedDetent]
|
|
50
54
|
);
|
|
51
55
|
|
|
52
56
|
return (
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import type { PositionChangeEvent, PositionChangeEventPayload } from '../TrueSheet.types';
|
|
3
|
+
|
|
4
|
+
type PositionChangeHandler = (
|
|
5
|
+
payload: PositionChangeEventPayload,
|
|
6
|
+
context: Record<string, unknown>
|
|
7
|
+
) => void;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Web implementation of useReanimatedPositionChangeHandler.
|
|
11
|
+
*
|
|
12
|
+
* Returns a simple callback wrapper. The worklet directive is ignored on web
|
|
13
|
+
* since there's no native UI thread.
|
|
14
|
+
*
|
|
15
|
+
* @param handler - The position change handler function
|
|
16
|
+
* @param _dependencies - Unused on web, kept for API compatibility
|
|
17
|
+
* @returns An event handler compatible with onPositionChange prop
|
|
18
|
+
*/
|
|
19
|
+
export const useReanimatedPositionChangeHandler = (
|
|
20
|
+
handler: PositionChangeHandler,
|
|
21
|
+
_dependencies: unknown[] = []
|
|
22
|
+
) => {
|
|
23
|
+
const context: Record<string, unknown> = {};
|
|
24
|
+
|
|
25
|
+
return useCallback(
|
|
26
|
+
(event: PositionChangeEvent) => {
|
|
27
|
+
handler(event.nativeEvent, context);
|
|
28
|
+
},
|
|
29
|
+
[handler]
|
|
30
|
+
);
|
|
31
|
+
};
|
|
@@ -13,18 +13,29 @@ interface Spec extends TurboModule {
|
|
|
13
13
|
* Present a sheet by reference
|
|
14
14
|
* @param viewTag - Native view tag of the sheet component
|
|
15
15
|
* @param index - Detent index to present at
|
|
16
|
+
* @param animated - Whether to animate the presentation
|
|
16
17
|
* @returns Promise that resolves when sheet is fully presented
|
|
17
18
|
* @throws PRESENT_FAILED if presentation fails
|
|
18
19
|
*/
|
|
19
|
-
presentByRef(viewTag: number, index: number): Promise<void>;
|
|
20
|
+
presentByRef(viewTag: number, index: number, animated: boolean): Promise<void>;
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
|
-
* Dismiss a sheet
|
|
23
|
+
* Dismiss a sheet and all sheets presented on top of it
|
|
23
24
|
* @param viewTag - Native view tag of the sheet component
|
|
25
|
+
* @param animated - Whether to animate the dismissal
|
|
24
26
|
* @returns Promise that resolves when sheet is fully dismissed
|
|
25
27
|
* @throws DISMISS_FAILED if dismissal fails
|
|
26
28
|
*/
|
|
27
|
-
dismissByRef(viewTag: number): Promise<void>;
|
|
29
|
+
dismissByRef(viewTag: number, animated: boolean): Promise<void>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Dismiss only the sheets presented on top of this sheet, keeping this sheet presented
|
|
33
|
+
* @param viewTag - Native view tag of the sheet component
|
|
34
|
+
* @param animated - Whether to animate the dismissal
|
|
35
|
+
* @returns Promise that resolves when all child sheets are fully dismissed
|
|
36
|
+
* @throws DISMISS_FAILED if dismissal fails
|
|
37
|
+
*/
|
|
38
|
+
dismissStackByRef(viewTag: number, animated: boolean): Promise<void>;
|
|
28
39
|
|
|
29
40
|
/**
|
|
30
41
|
* Resize a sheet to a different index by reference
|
|
@@ -33,6 +44,20 @@ interface Spec extends TurboModule {
|
|
|
33
44
|
* @returns Promise that resolves when resize is complete
|
|
34
45
|
*/
|
|
35
46
|
resizeByRef(viewTag: number, index: number): Promise<void>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Dismiss all presented sheets
|
|
50
|
+
* @param animated - Whether to animate the dismissals
|
|
51
|
+
* @returns Promise that resolves when all sheets are dismissed
|
|
52
|
+
*/
|
|
53
|
+
dismissAll(animated: boolean): Promise<void>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Handle back press for a sheet (Android only)
|
|
57
|
+
* Dismisses or collapses to the lowest detent natively
|
|
58
|
+
* @param viewTag - Native view tag of the sheet component
|
|
59
|
+
*/
|
|
60
|
+
handleBackPress(viewTag: number): Promise<void>;
|
|
36
61
|
}
|
|
37
62
|
|
|
38
63
|
export default TurboModuleRegistry.get<Spec>('TrueSheetModule');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const DEFAULT_CORNER_RADIUS = 16;
|
|
2
|
+
export const DEFAULT_MAX_WIDTH = 640;
|
|
3
|
+
export const DEFAULT_FORM_SHEET_WIDTH = 580;
|
|
4
|
+
export const DEFAULT_FORM_SHEET_HEIGHT_RATIO = 0.5;
|
|
5
|
+
export const COLOR_SURFACE_CONTAINER_LOW_LIGHT = '#F7F2FA';
|
|
6
|
+
export const COLOR_SURFACE_CONTAINER_LOW_DARK = '#1D1B20';
|
|
7
|
+
export const DEFAULT_ANCHOR_OFFSET = 16;
|
|
8
|
+
export const DEFAULT_DETACHED_OFFSET = 16;
|
|
9
|
+
export const DEFAULT_GRABBER_COLOR_LIGHT = 'rgba(0, 0, 0, 0.3)';
|
|
10
|
+
export const DEFAULT_GRABBER_COLOR_DARK = 'rgba(255, 255, 255, 0.3)';
|
|
11
|
+
export const DEFAULT_GRABBER_WIDTH = 32;
|
|
12
|
+
export const DEFAULT_GRABBER_HEIGHT = 4;
|
|
13
|
+
export const DEFAULT_GRABBER_TOP_MARGIN = 8;
|
package/src/web/dom.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
import type { View } from 'react-native';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a React Native web `View` ref value to its underlying DOM element —
|
|
6
|
+
* RN-web refs expose the host DOM node directly.
|
|
7
|
+
*/
|
|
8
|
+
export const getDOMElement = (view: View | null): HTMLElement | null =>
|
|
9
|
+
view instanceof HTMLElement ? view : null;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# vaul
|
|
2
|
+
|
|
3
|
+
Originally forked from [vaul](https://github.com/emilkowalski/vaul) by Emil Kowalski at `v1.1.2`. Upstream is unmaintained; maintained here as part of truesheet's web renderer.
|
|
4
|
+
|
|
5
|
+
Only external runtime dep: `@radix-ui/react-dialog`.
|
|
6
|
+
|
|
7
|
+
## License
|
|
8
|
+
|
|
9
|
+
vaul is MIT-licensed. See the [upstream LICENSE](https://github.com/emilkowalski/vaul/blob/main/LICENSE.md). Original copyright remains with Emil Kowalski.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function isMobileFirefox(): boolean | undefined {
|
|
2
|
+
const userAgent = navigator.userAgent;
|
|
3
|
+
return (
|
|
4
|
+
typeof window !== 'undefined' &&
|
|
5
|
+
((/Firefox/.test(userAgent) && /Mobile/.test(userAgent)) || // Android Firefox
|
|
6
|
+
/FxiOS/.test(userAgent)) // iOS Firefox
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function isMac(): boolean | undefined {
|
|
11
|
+
return testPlatform(/^Mac/);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function isIPhone(): boolean | undefined {
|
|
15
|
+
return testPlatform(/^iPhone/);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function isSafari(): boolean | undefined {
|
|
19
|
+
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isIPad(): boolean | undefined {
|
|
23
|
+
return (
|
|
24
|
+
testPlatform(/^iPad/) ||
|
|
25
|
+
// iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.
|
|
26
|
+
(isMac() && navigator.maxTouchPoints > 1)
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function isIOS(): boolean | undefined {
|
|
31
|
+
return isIPhone() || isIPad();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function testPlatform(re: RegExp): boolean | undefined {
|
|
35
|
+
return typeof window !== 'undefined' && window.navigator != null
|
|
36
|
+
? re.test(window.navigator.platform)
|
|
37
|
+
: undefined;
|
|
38
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const TRANSITIONS = {
|
|
2
|
+
DURATION: 0.5,
|
|
3
|
+
EASE: [0.32, 0.72, 0, 1],
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
export const VELOCITY_THRESHOLD = 0.4;
|
|
7
|
+
|
|
8
|
+
export const DEFAULT_PEEK_HEIGHT = 150;
|
|
9
|
+
|
|
10
|
+
export const CLOSE_THRESHOLD = 0.25;
|
|
11
|
+
|
|
12
|
+
export const SCROLL_LOCK_TIMEOUT = 100;
|
|
13
|
+
|
|
14
|
+
export const BORDER_RADIUS = 8;
|
|
15
|
+
|
|
16
|
+
export const NESTED_DISPLACEMENT = 16;
|
|
17
|
+
|
|
18
|
+
export const WINDOW_TOP_OFFSET = 26;
|
|
19
|
+
|
|
20
|
+
export const DRAG_CLASS = 'vaul-dragging';
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { DrawerDirection } from './types';
|
|
3
|
+
|
|
4
|
+
export interface DragEvent {
|
|
5
|
+
target: EventTarget;
|
|
6
|
+
pageX: number;
|
|
7
|
+
pageY: number;
|
|
8
|
+
pointerType: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface DrawerContextValue {
|
|
12
|
+
drawerRef: React.RefObject<HTMLDivElement | null>;
|
|
13
|
+
overlayRef: React.RefObject<HTMLDivElement | null>;
|
|
14
|
+
onPress: (event: React.PointerEvent<HTMLDivElement>) => void;
|
|
15
|
+
onRelease: (event: React.PointerEvent<HTMLDivElement> | null) => void;
|
|
16
|
+
onDrag: (event: React.PointerEvent<HTMLDivElement>) => void;
|
|
17
|
+
onTouchDrag: (event: DragEvent, pointerEvent?: React.PointerEvent<HTMLDivElement>) => void;
|
|
18
|
+
onTouchRelease: (
|
|
19
|
+
event: DragEvent | null,
|
|
20
|
+
pointerEvent?: React.PointerEvent<HTMLDivElement>
|
|
21
|
+
) => void;
|
|
22
|
+
onNestedDrag: (event: React.PointerEvent<HTMLDivElement>, percentageDragged: number) => void;
|
|
23
|
+
onNestedOpenChange: (o: boolean) => void;
|
|
24
|
+
onNestedRelease: (event: React.PointerEvent<HTMLDivElement>, open: boolean) => void;
|
|
25
|
+
dismissible: boolean;
|
|
26
|
+
isOpen: boolean;
|
|
27
|
+
isDragging: boolean;
|
|
28
|
+
keyboardIsOpen: React.MutableRefObject<boolean>;
|
|
29
|
+
snapPointsOffset: number[] | null;
|
|
30
|
+
snapPoints?: (number | string)[] | null;
|
|
31
|
+
activeSnapPointIndex?: number | null;
|
|
32
|
+
fadeFromIndex?: number;
|
|
33
|
+
modal: boolean;
|
|
34
|
+
shouldFade: boolean;
|
|
35
|
+
activeSnapPoint?: number | string | null;
|
|
36
|
+
setActiveSnapPoint: (o: number | string | null) => void;
|
|
37
|
+
closeDrawer: () => void;
|
|
38
|
+
openProp?: boolean;
|
|
39
|
+
onOpenChange?: (o: boolean) => void;
|
|
40
|
+
direction: DrawerDirection;
|
|
41
|
+
shouldScaleBackground: boolean;
|
|
42
|
+
setBackgroundColorOnScale: boolean;
|
|
43
|
+
noBodyStyles: boolean;
|
|
44
|
+
handleOnly?: boolean;
|
|
45
|
+
container?: HTMLElement | null;
|
|
46
|
+
autoFocus?: boolean;
|
|
47
|
+
shouldAnimate?: React.RefObject<boolean>;
|
|
48
|
+
onPositionChangeRef: React.RefObject<((position: number) => void) | undefined>;
|
|
49
|
+
setContentHeight: (height: number) => void;
|
|
50
|
+
detached: boolean;
|
|
51
|
+
detachedOffset: number;
|
|
52
|
+
detachedRadius: number;
|
|
53
|
+
detachedWrapperStyle?: React.CSSProperties;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const DrawerContext = React.createContext<DrawerContextValue>({
|
|
57
|
+
drawerRef: { current: null },
|
|
58
|
+
overlayRef: { current: null },
|
|
59
|
+
onPress: () => {},
|
|
60
|
+
onRelease: () => {},
|
|
61
|
+
onDrag: () => {},
|
|
62
|
+
onTouchDrag: () => {},
|
|
63
|
+
onTouchRelease: () => {},
|
|
64
|
+
onNestedDrag: () => {},
|
|
65
|
+
onNestedOpenChange: () => {},
|
|
66
|
+
onNestedRelease: () => {},
|
|
67
|
+
openProp: undefined,
|
|
68
|
+
dismissible: false,
|
|
69
|
+
isOpen: false,
|
|
70
|
+
isDragging: false,
|
|
71
|
+
keyboardIsOpen: { current: false },
|
|
72
|
+
snapPointsOffset: null,
|
|
73
|
+
snapPoints: null,
|
|
74
|
+
handleOnly: false,
|
|
75
|
+
modal: false,
|
|
76
|
+
shouldFade: false,
|
|
77
|
+
activeSnapPoint: null,
|
|
78
|
+
onOpenChange: () => {},
|
|
79
|
+
setActiveSnapPoint: () => {},
|
|
80
|
+
closeDrawer: () => {},
|
|
81
|
+
direction: 'bottom',
|
|
82
|
+
shouldAnimate: { current: true },
|
|
83
|
+
shouldScaleBackground: false,
|
|
84
|
+
setBackgroundColorOnScale: true,
|
|
85
|
+
noBodyStyles: false,
|
|
86
|
+
container: null,
|
|
87
|
+
autoFocus: false,
|
|
88
|
+
onPositionChangeRef: { current: undefined },
|
|
89
|
+
setContentHeight: () => {},
|
|
90
|
+
detached: false,
|
|
91
|
+
detachedOffset: 0,
|
|
92
|
+
detachedRadius: 0,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export const useDrawerContext = () => {
|
|
96
|
+
const context = React.useContext(DrawerContext);
|
|
97
|
+
if (!context) {
|
|
98
|
+
throw new Error('useDrawerContext must be used within a Drawer.Root');
|
|
99
|
+
}
|
|
100
|
+
return context;
|
|
101
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { AnyFunction, DrawerDirection } from './types';
|
|
2
|
+
|
|
3
|
+
interface Style {
|
|
4
|
+
[key: string]: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// CSSStyleDeclaration has no string index signature, so dynamic camelCase
|
|
8
|
+
// keys are assigned through this writable-record view. Values include
|
|
9
|
+
// undefined: originals captured for unknown keys read back as undefined.
|
|
10
|
+
type IndexableStyle = CSSStyleDeclaration & Record<string, string | undefined>;
|
|
11
|
+
|
|
12
|
+
const cache = new WeakMap<HTMLElement, Record<string, string | undefined>>();
|
|
13
|
+
|
|
14
|
+
export function isInView(el: HTMLElement): boolean {
|
|
15
|
+
const rect = el.getBoundingClientRect();
|
|
16
|
+
|
|
17
|
+
if (!window.visualViewport) return false;
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
rect.top >= 0 &&
|
|
21
|
+
rect.left >= 0 &&
|
|
22
|
+
// Need + 40 for safari detection
|
|
23
|
+
rect.bottom <= window.visualViewport.height - 40 &&
|
|
24
|
+
rect.right <= window.visualViewport.width
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function set(
|
|
29
|
+
el: Element | HTMLElement | null | undefined,
|
|
30
|
+
styles: Style,
|
|
31
|
+
ignoreCache = false
|
|
32
|
+
) {
|
|
33
|
+
if (!el || !(el instanceof HTMLElement)) return;
|
|
34
|
+
let originalStyles: Record<string, string | undefined> = {};
|
|
35
|
+
const style = el.style as IndexableStyle;
|
|
36
|
+
|
|
37
|
+
Object.entries(styles).forEach(([key, value]: [string, string]) => {
|
|
38
|
+
if (key.startsWith('--')) {
|
|
39
|
+
el.style.setProperty(key, value);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
originalStyles[key] = style[key];
|
|
44
|
+
style[key] = value;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
if (ignoreCache) return;
|
|
48
|
+
|
|
49
|
+
cache.set(el, originalStyles);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function reset(el: Element | HTMLElement | null, prop?: string) {
|
|
53
|
+
if (!el || !(el instanceof HTMLElement)) return;
|
|
54
|
+
let originalStyles = cache.get(el);
|
|
55
|
+
|
|
56
|
+
if (!originalStyles) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const style = el.style as IndexableStyle;
|
|
61
|
+
if (prop) {
|
|
62
|
+
style[prop] = originalStyles[prop];
|
|
63
|
+
} else {
|
|
64
|
+
Object.entries(originalStyles).forEach(([key, value]) => {
|
|
65
|
+
style[key] = value;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const isVertical = (direction: DrawerDirection) => {
|
|
71
|
+
switch (direction) {
|
|
72
|
+
case 'top':
|
|
73
|
+
case 'bottom':
|
|
74
|
+
return true;
|
|
75
|
+
case 'left':
|
|
76
|
+
case 'right':
|
|
77
|
+
return false;
|
|
78
|
+
default:
|
|
79
|
+
return direction satisfies never;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export function getTranslate(element: HTMLElement, direction: DrawerDirection): number | null {
|
|
84
|
+
if (!element) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const style = window.getComputedStyle(element);
|
|
88
|
+
const transform =
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
style.transform || style.webkitTransform || style.mozTransform;
|
|
91
|
+
let mat = transform.match(/^matrix3d\((.+)\)$/);
|
|
92
|
+
if (mat) {
|
|
93
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d
|
|
94
|
+
return parseFloat(mat[1].split(', ')[isVertical(direction) ? 13 : 12]);
|
|
95
|
+
}
|
|
96
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix
|
|
97
|
+
mat = transform.match(/^matrix\((.+)\)$/);
|
|
98
|
+
return mat ? parseFloat(mat[1].split(', ')[isVertical(direction) ? 5 : 4]) : null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function dampenValue(v: number) {
|
|
102
|
+
return 8 * (Math.log(v + 1) - 2);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function assignStyle(
|
|
106
|
+
element: HTMLElement | null | undefined,
|
|
107
|
+
style: Partial<CSSStyleDeclaration>
|
|
108
|
+
) {
|
|
109
|
+
if (!element) return () => {};
|
|
110
|
+
|
|
111
|
+
const prevStyle = element.style.cssText;
|
|
112
|
+
Object.assign(element.style, style);
|
|
113
|
+
|
|
114
|
+
return () => {
|
|
115
|
+
element.style.cssText = prevStyle;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Receives functions as arguments and returns a new function that calls all.
|
|
121
|
+
*/
|
|
122
|
+
export function chain<T>(...fns: T[]) {
|
|
123
|
+
return (...args: T extends AnyFunction ? Parameters<T> : never) => {
|
|
124
|
+
for (const fn of fns) {
|
|
125
|
+
if (typeof fn === 'function') {
|
|
126
|
+
// @ts-ignore
|
|
127
|
+
fn(...args);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|