react-native-quick-preview 2.0.0 → 2.0.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/README.md CHANGED
@@ -8,7 +8,11 @@ Long-press an item to peek at its content, swipe down to dismiss. The kind of pr
8
8
 
9
9
  I wanted this pattern in my own apps and couldn't find a maintained library for it, so I built one. The API follows the approach popularized by [Gorhom's bottom sheet](https://github.com/gorhom/react-native-bottom-sheet): mount a provider once, then present from anywhere.
10
10
 
11
- ![Demo](https://raw.githubusercontent.com/Hashtagsmile/react-native-quick-preview/main/demogif.gif)
11
+ <p align="center">
12
+ <img src="https://raw.githubusercontent.com/Hashtagsmile/react-native-quick-preview/main/demo-feed.gif?v=2" width="46%" alt="Social feed — long-press a photo to peek the post, tap to open" />
13
+ &nbsp;
14
+ <img src="https://raw.githubusercontent.com/Hashtagsmile/react-native-quick-preview/main/demo-shop.gif?v=2" width="46%" alt="Shop — long-press a product for a bottom-sheet quick-view" />
15
+ </p>
12
16
 
13
17
  What you get:
14
18
 
@@ -79,15 +83,22 @@ If Reanimated and Gesture Handler are already installed, adding this library is
79
83
 
80
84
  ```tsx
81
85
  import { GestureHandlerRootView } from 'react-native-gesture-handler'
86
+ import { SafeAreaProvider } from 'react-native-safe-area-context'
82
87
  import { PreviewProvider } from 'react-native-quick-preview'
83
88
 
84
89
  export default function App() {
85
90
  return (
86
- <GestureHandlerRootView style={{ flex: 1 }}>
87
- <PreviewProvider>
88
- <YourApp />
89
- </PreviewProvider>
90
- </GestureHandlerRootView>
91
+ // SafeAreaProvider is recommended so the peek clears the notch / home
92
+ // indicator. It's optional — without it the peek falls back to zero insets
93
+ // rather than crashing. Most apps already have one (React Navigation /
94
+ // Expo Router mount it for you).
95
+ <SafeAreaProvider>
96
+ <GestureHandlerRootView style={{ flex: 1 }}>
97
+ <PreviewProvider>
98
+ <YourApp />
99
+ </PreviewProvider>
100
+ </GestureHandlerRootView>
101
+ </SafeAreaProvider>
91
102
  )
92
103
  }
93
104
  ```
@@ -127,6 +138,7 @@ That's the whole integration — three files touched, reusing your existing deta
127
138
  - **Peer dependencies** (must be installed in your app): `react-native-reanimated` (≥ 3; both Reanimated 3 and 4 are supported), `react-native-gesture-handler` (≥ 2), `react-native-safe-area-context` (≥ 4), `react-native-portalize`.
128
139
  - **Reanimated's Babel plugin** must be configured — this is required, not optional. React Native consumes this library's TypeScript source (the standard distribution model for Reanimated libraries), so the plugin transforms its worklets as part of your app's build. Expo configures it for you via `babel-preset-expo`; bare RN apps add it manually (`react-native-worklets/plugin` on Reanimated 4, `react-native-reanimated/plugin` on Reanimated 3). On Expo SDK 54, do **not** also add the plugin by hand — `babel-preset-expo` already includes it, and a duplicate breaks worklets.
129
140
  - Your app must render `<PreviewProvider>` once, inside a `<GestureHandlerRootView>` (step 2 above).
141
+ - `<SafeAreaProvider>` (from `react-native-safe-area-context`) is **recommended** so the peek clears the notch and home indicator, but **not required** — without one the peek falls back to zero insets instead of crashing. React Navigation and Expo Router already mount it, so most apps have it.
130
142
  - `expo-haptics` is **optional** — only needed if you want haptics; pass it to `QuickPreviewPressable` via `onLongPressStart`.
131
143
 
132
144
  ## Presenting from outside components
package/dist/index.js CHANGED
@@ -190,10 +190,12 @@ function QuickPreviewRoot({
190
190
  onRequestClose,
191
191
  children
192
192
  }) {
193
- var _a2, _b;
194
- const { top, bottom } = reactNativeSafeAreaContext.useSafeAreaInsets();
195
- const variant = (_a2 = options == null ? void 0 : options.variant) != null ? _a2 : "popover";
196
- const dismissOnBackdropPress = (_b = options == null ? void 0 : options.dismissOnBackdropPress) != null ? _b : true;
193
+ var _a2, _b, _c, _d;
194
+ const insets = React5__default.default.useContext(reactNativeSafeAreaContext.SafeAreaInsetsContext);
195
+ const top = (_a2 = insets == null ? void 0 : insets.top) != null ? _a2 : 0;
196
+ const bottom = (_b = insets == null ? void 0 : insets.bottom) != null ? _b : 0;
197
+ const variant = (_c = options == null ? void 0 : options.variant) != null ? _c : "popover";
198
+ const dismissOnBackdropPress = (_d = options == null ? void 0 : options.dismissOnBackdropPress) != null ? _d : true;
197
199
  const opacity = Animated.useSharedValue(0);
198
200
  const cbs = React5__default.default.useRef({
199
201
  onOpenStart: options == null ? void 0 : options.onOpenStart,
@@ -217,9 +219,9 @@ function QuickPreviewRoot({
217
219
  if (finished) (_b3 = (_a4 = cbs.current).onOpenEnd) == null ? void 0 : _b3.call(_a4);
218
220
  });
219
221
  return () => {
220
- var _a4, _b3, _c, _d;
222
+ var _a4, _b3, _c2, _d2;
221
223
  (_b3 = (_a4 = cbs.current).onCloseStart) == null ? void 0 : _b3.call(_a4);
222
- (_d = (_c = cbs.current).onCloseEnd) == null ? void 0 : _d.call(_c);
224
+ (_d2 = (_c2 = cbs.current).onCloseEnd) == null ? void 0 : _d2.call(_c2);
223
225
  };
224
226
  }, []);
225
227
  const containerStyle = Animated.useAnimatedStyle(() => ({ opacity: opacity.value }));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/components/Backdrop.tsx","../src/internal/resolveSize.ts","../src/internal/components/SheetContainer.tsx","../src/internal/components/PopoverContainer.tsx","../src/internal/QuickPreviewRoot.tsx","../src/QuickPreviewAPI.ts","../src/context.tsx","../src/useQuickPreview.ts","../src/headless/QuickPreview.tsx","../src/internal/components/QuickPreviewScrollView.tsx","../src/addons/QuickPreviewPressable.tsx"],"names":["useSharedValue","React","withTiming","useAnimatedStyle","StyleSheet","jsx","Animated","Pressable","_a","Easing","Gesture","runOnJS","GestureDetector","jsxs","View","styles","useSafeAreaInsets","_b","AccessibilityInfo","BackHandler","Host","Portal","QuickPreview","ScrollView"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport { Pressable, StyleSheet } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\n\nexport function Backdrop({\n onPress,\n dismissOnBackdropPress = true,\n}: {\n onPress?: () => void\n dismissOnBackdropPress?: boolean\n}) {\n const opacity = useSharedValue(0)\n React.useEffect(() => {\n opacity.value = withTiming(1, { duration: 160 })\n return () => { opacity.value = 0 }\n }, [opacity])\n\n const style = useAnimatedStyle(() => ({\n backgroundColor: 'rgba(0,0,0,0.5)',\n ...StyleSheet.absoluteFillObject,\n opacity: opacity.value,\n }))\n\n return (\n <Animated.View style={style} pointerEvents={dismissOnBackdropPress && onPress ? 'auto' : 'none'}>\n {dismissOnBackdropPress && onPress ? (\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close preview\"\n />\n ) : null}\n </Animated.View>\n )\n}\n","import type { QuickPreviewSize } from '../types'\n\n/**\n * Turn the public `size` option into container style constraints.\n * 'auto' (or undefined) applies nothing; a number caps the height;\n * an object caps height and/or width.\n */\nexport function resolveSizeStyle(\n size?: QuickPreviewSize\n): { maxHeight?: number; maxWidth?: number } {\n if (size == null || size === 'auto') return {}\n if (typeof size === 'number') return { maxHeight: size }\n const out: { maxHeight?: number; maxWidth?: number } = {}\n if (typeof size.maxHeight === 'number') out.maxHeight = size.maxHeight\n if (typeof size.maxWidth === 'number') out.maxWidth = size.maxWidth\n return out\n}\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming, runOnJS } from 'react-native-reanimated'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function SheetContainer({\n children,\n options,\n insets,\n onRequestClose,\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const translateY = useSharedValue(1000)\n const dismissOnPanDown = options?.dismissOnPanDown ?? true\n\n React.useEffect(() => {\n // Smooth slide up, no spring bounce.\n translateY.value = withTiming(0, { duration: 300, easing: Easing.out(Easing.cubic) })\n }, [translateY])\n\n const pan = Gesture.Pan()\n .onUpdate((e) => {\n if (!dismissOnPanDown) return\n translateY.value = Math.max(0, e.translationY)\n })\n .onEnd((e) => {\n const shouldClose = e.velocityY > 1000 || translateY.value > 140\n if (shouldClose) {\n translateY.value = withTiming(800, { duration: 200 }, (finished) => {\n if (finished) runOnJS(onRequestClose)()\n })\n } else {\n translateY.value = withTiming(0, { duration: 240, easing: Easing.out(Easing.cubic) })\n }\n })\n\n const style = useAnimatedStyle(() => ({\n transform: [{ translateY: translateY.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <GestureDetector gesture={pan}>\n <Animated.View\n style={[styles.sheet, sizeStyle, style, { paddingBottom: Math.max(insets.bottom, 12) }]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n <View style={styles.grabber} />\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingTop: 8,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n grabber: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: 2,\n backgroundColor: 'rgba(0,0,0,0.2)',\n marginBottom: 8,\n },\n})\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function PopoverContainer({\n children,\n options,\n insets: _insets,\n onRequestClose: _onRequestClose, // kept for API parity with SheetContainer\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const scale = useSharedValue(0.96)\n const opacity = useSharedValue(0)\n\n React.useEffect(() => {\n // Smooth ease-out, no spring overshoot — a clean, quick \"pop\" in.\n scale.value = withTiming(1, { duration: 200, easing: Easing.out(Easing.cubic) })\n opacity.value = withTiming(1, { duration: 160, easing: Easing.out(Easing.quad) })\n }, [scale, opacity])\n\n const container = useAnimatedStyle(() => ({\n opacity: opacity.value,\n transform: [{ scale: scale.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.center]} pointerEvents=\"box-none\">\n <Animated.View\n style={[styles.card, sizeStyle, container]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n {children}\n </Animated.View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n center: { justifyContent: 'center', alignItems: 'center' },\n card: {\n maxWidth: 520,\n width: '92%',\n maxHeight: '86%',\n borderRadius: 16,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n})\n","import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { QuickPreviewOptions } from '../types'\nimport { Backdrop } from './components/Backdrop'\nimport { SheetContainer } from './components/SheetContainer'\nimport { PopoverContainer } from './components/PopoverContainer'\n\nexport function QuickPreviewRoot({\n options,\n onRequestClose,\n children,\n}: {\n options?: QuickPreviewOptions\n onRequestClose: () => void\n children: React.ReactNode\n}) {\n const { top, bottom } = useSafeAreaInsets()\n const variant = options?.variant ?? 'popover'\n const dismissOnBackdropPress = options?.dismissOnBackdropPress ?? true\n\n const opacity = useSharedValue(0)\n\n const cbs = React.useRef({\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n })\n React.useEffect(() => {\n cbs.current = {\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n }\n }, [options?.onOpenStart, options?.onOpenEnd, options?.onCloseStart, options?.onCloseEnd])\n\n React.useEffect(() => {\n cbs.current.onOpenStart?.()\n opacity.value = withTiming(1, { duration: 180 }, finished => {\n if (finished) cbs.current.onOpenEnd?.()\n })\n return () => {\n cbs.current.onCloseStart?.()\n cbs.current.onCloseEnd?.()\n }\n // run once (mount-only effect)\n }, [])\n\n const containerStyle = useAnimatedStyle(() => ({ opacity: opacity.value }))\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\" accessibilityViewIsModal>\n <Animated.View style={[StyleSheet.absoluteFill, containerStyle]} pointerEvents=\"box-none\">\n <Backdrop\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n dismissOnBackdropPress={dismissOnBackdropPress}\n />\n {variant === 'sheet' ? (\n <SheetContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </SheetContainer>\n ) : (\n <PopoverContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </PopoverContainer>\n )}\n </Animated.View>\n </View>\n )\n}\n","// src/QuickPreviewAPI.ts\nimport type { QuickPreviewController, QuickPreviewOptions } from './types'\nimport type React from 'react'\n\n// Persist across Fast Refresh / HMR\nconst STORE = Symbol.for('rnqp.controller')\ntype Store = { controller: QuickPreviewController | null }\nconst g = globalThis as Record<symbol, Store | undefined>\nconst store: Store = g[STORE] ?? (g[STORE] = { controller: null })\n\nfunction warn() {\n // __DEV__ is provided by RN/Metro; if TS complains, declare it in a globals.d.ts\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[react-native-quick-preview] PreviewProvider not mounted yet.')\n }\n}\n\n/**\n * A static handle to the same controller as {@link useQuickPreview} — callable\n * from anywhere, including outside React (services, store actions, event handlers).\n * Before `<PreviewProvider>` mounts it is a safe no-op (with a dev warning).\n *\n * @example\n * ```ts\n * import { QuickPreview } from 'react-native-quick-preview'\n *\n * QuickPreview.present(<Card />, { variant: 'sheet' })\n * QuickPreview.update({ size: { maxHeight: 480 } })\n * QuickPreview.close()\n * ```\n */\nexport const QuickPreview = {\n /** @internal Registered by `<PreviewProvider />`. Not part of the public API. */\n _set(c: QuickPreviewController | null) {\n store.controller = c\n },\n\n /**\n * Present `node` as the preview. Replaces the content if one is already open.\n * @param node - the React element to show inside the preview.\n * @param opts - presentation options ({@link QuickPreviewOptions}).\n */\n present(node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.present(node, opts) : warn()\n },\n\n /** Dismiss the current preview. No-op if nothing is open. */\n close() {\n const c = store.controller\n c ? c.close() : warn()\n },\n\n /** Merge new options into the currently open preview. */\n update(opts: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.update(opts) : warn()\n },\n\n /** Whether a preview is currently open. */\n isOpen() {\n return !!store.controller?.isOpen()\n },\n\n /** @internal Dev/test convenience — don't use in app code. */\n __unsafe_getController(): QuickPreviewController | null {\n return store.controller\n },\n} as const\n","import React from 'react'\nimport { BackHandler, AccessibilityInfo } from 'react-native'\nimport { Host, Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions, QuickPreviewController } from './types'\nimport { QuickPreviewRoot } from './internal/QuickPreviewRoot'\nimport { QuickPreview as QuickPreviewStatic } from './QuickPreviewAPI'\n\nexport const QuickPreviewContext = React.createContext<QuickPreviewController | null>(null)\n\n/**\n * Hosts the preview layer and registers the controller. Mount this once, near the\n * root of your app, inside a `<GestureHandlerRootView>`. After it's mounted you can\n * present previews via {@link useQuickPreview} or the static `QuickPreview` handle.\n *\n * @example\n * ```tsx\n * <GestureHandlerRootView style={{ flex: 1 }}>\n * <PreviewProvider>\n * <YourApp />\n * </PreviewProvider>\n * </GestureHandlerRootView>\n * ```\n */\nexport function PreviewProvider({ children }: { children: React.ReactNode }) {\n const [content, setContent] = React.useState<React.ReactNode | null>(null)\n const [options, setOptions] = React.useState<QuickPreviewOptions | undefined>(undefined)\n const openRef = React.useRef(false)\n\n const announce = React.useCallback((msg: string) => {\n // eslint-disable-next-line no-empty\n try { AccessibilityInfo.announceForAccessibility?.(msg) } catch {}\n }, [])\n\n const close = React.useCallback(() => {\n if (!openRef.current) return\n openRef.current = false\n setContent(null)\n setOptions(undefined)\n announce('Quick preview closed')\n }, [announce])\n\n const present = React.useCallback(\n (node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) => {\n // Replace, don't merge: options from a previous presentation must not\n // leak into the next one. Merging is what update() is for.\n setOptions(opts)\n openRef.current = true\n setContent(() => node)\n announce('Quick preview opened')\n },\n [announce]\n )\n\n const update = React.useCallback((opts: Partial<QuickPreviewOptions>) => {\n setOptions(prev => ({ ...prev, ...opts }))\n }, [])\n\n React.useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (openRef.current) { close(); return true }\n return false\n })\n return () => sub.remove()\n }, [close])\n\n const value = React.useMemo<QuickPreviewController>(\n () => ({ present, close, update, isOpen: () => openRef.current }),\n [present, close, update]\n )\n\n // Register the static API (layout effect = available ASAP)\n React.useLayoutEffect(() => {\n QuickPreviewStatic._set(value)\n return () => QuickPreviewStatic._set(null)\n }, [value])\n\n return (\n <QuickPreviewContext.Provider value={value}>\n <Host>\n {children}\n {content ? (\n <Portal>\n <QuickPreviewRoot options={options} onRequestClose={close}>\n {content}\n </QuickPreviewRoot>\n </Portal>\n ) : null}\n </Host>\n </QuickPreviewContext.Provider>\n )\n}\n","import React from 'react'\nimport { QuickPreviewContext } from './context'\nimport type { QuickPreviewController } from './types'\n\n/**\n * Access the {@link QuickPreviewController} to open, update, and close previews\n * from inside a React component. Must be called under a mounted `<PreviewProvider>`.\n *\n * @throws if used outside of a `<PreviewProvider>`.\n * @returns the controller: `{ present, close, update, isOpen }`.\n *\n * @example\n * ```tsx\n * function ProductCard({ product }) {\n * const { present } = useQuickPreview()\n * return (\n * <Pressable onLongPress={() => present(<ProductPreview product={product} />, { variant: 'sheet' })}>\n * <Thumbnail source={product.image} />\n * </Pressable>\n * )\n * }\n * ```\n */\nexport function useQuickPreview(): QuickPreviewController {\n const ctx = React.useContext(QuickPreviewContext)\n if (!ctx) throw new Error('useQuickPreview must be used within <PreviewProvider>')\n return ctx\n}\n","import React from 'react'\nimport { Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions } from '../types'\nimport { QuickPreviewRoot } from '../internal/QuickPreviewRoot'\n\n/**\n * Props for the controlled, headless `QuickPreviewComponent`. Extends\n * {@link QuickPreviewOptions} (so `variant`, `size`, `dismissOn*`, and the\n * lifecycle callbacks are all accepted).\n */\nexport type HeadlessQuickPreviewProps = {\n /** Whether the preview is shown. You own this state. */\n visible: boolean\n /** Called when the preview requests to close (backdrop press, swipe, back button). */\n onClose: () => void\n /**\n * Render into a portal above the app. Disable only if you're providing your\n * own host/overlay.\n * @defaultValue `true`\n */\n portal?: boolean\n} & Partial<QuickPreviewOptions> & {\n /** The preview content. */\n children: React.ReactNode\n}\n\n/**\n * A controlled, headless preview component — you own the `visible` state. Useful\n * when you prefer a declarative component over the imperative\n * {@link useQuickPreview} hook or the static `QuickPreview` handle.\n *\n * Exported as `QuickPreviewComponent`.\n *\n * @example\n * ```tsx\n * const [visible, setVisible] = useState(false)\n * <QuickPreviewComponent visible={visible} onClose={() => setVisible(false)} variant=\"sheet\">\n * <Card />\n * </QuickPreviewComponent>\n * ```\n */\nexport function QuickPreview({\n visible,\n onClose,\n portal = true,\n children,\n ...opts\n}: HeadlessQuickPreviewProps) {\n if (!visible) return null\n const node = (\n <QuickPreviewRoot options={opts} onRequestClose={onClose}>\n {children}\n </QuickPreviewRoot>\n )\n return portal ? <Portal>{node}</Portal> : node\n}\n","import React from 'react'\nimport { ScrollView, ScrollViewProps } from 'react-native'\n\n/**\n * A gesture-aware `ScrollView` for use inside preview content. Use it instead of\n * a plain `ScrollView` so that scrolling the content and the swipe-to-dismiss\n * gesture don't fight each other. Accepts all `ScrollViewProps`.\n *\n * @example\n * ```tsx\n * present(\n * <QuickPreviewScrollView>\n * <LongArticle />\n * </QuickPreviewScrollView>,\n * { variant: 'sheet', size: { maxHeight: 520 } }\n * )\n * ```\n */\nexport function QuickPreviewScrollView(props: ScrollViewProps) {\n return <ScrollView nestedScrollEnabled {...props} />\n}\n","import React from 'react'\nimport type { StyleProp, ViewStyle } from 'react-native'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport Animated, {\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { QuickPreview } from '../QuickPreviewAPI'\nimport type { QuickPreviewOptions } from '../types'\n\nexport type QuickPreviewPressableProps = {\n children: React.ReactNode\n /** Called for a normal tap (e.g., navigate) */\n onPress?: () => void\n /** Return the preview node to present */\n renderPreview: () => React.ReactNode\n /** Options forwarded to QuickPreview.present */\n previewOptions?: Partial<QuickPreviewOptions>\n /** Long-press delay (ms). Default 350 */\n delay?: number\n /** Press-down scale. Default 0.98 */\n scale?: number\n /**\n * Called on the JS thread when the long press activates, right before the\n * preview opens. Wire up haptics here, e.g.:\n * onLongPressStart={() => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)}\n * The library deliberately does not import expo-haptics itself: an optional\n * require would break Metro bundling for apps that don't have it installed.\n */\n onLongPressStart?: () => void\n /** Disable all interactions */\n disabled?: boolean\n /** Style applied to the animated wrapper (the thing that scales) */\n style?: StyleProp<ViewStyle>\n /** Accessibility */\n accessible?: boolean\n accessibilityLabel?: string\n testID?: string\n}\n\nexport function QuickPreviewPressable({\n children,\n onPress,\n renderPreview,\n previewOptions,\n delay = 350,\n scale = 0.98,\n onLongPressStart,\n disabled = false,\n style,\n accessible,\n accessibilityLabel,\n testID,\n}: QuickPreviewPressableProps) {\n const s = useSharedValue(1)\n\n // Runs on the JS thread: renderPreview() creates React elements, which must\n // never happen on the UI thread inside a worklet.\n const openPreview = () => {\n onLongPressStart?.()\n QuickPreview.present(renderPreview(), {\n variant: 'popover',\n dismissOnBackdropPress: true,\n ...previewOptions,\n })\n }\n\n const longPress = Gesture.LongPress()\n .enabled(!disabled)\n .minDuration(delay)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onStart(() => {\n runOnJS(openPreview)()\n })\n\n const tap = Gesture.Tap()\n .enabled(!disabled)\n .maxDuration(220)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onEnd(() => {\n if (onPress) runOnJS(onPress)()\n })\n\n const gesture = Gesture.Exclusive(longPress, tap)\n\n const animated = useAnimatedStyle(() => ({\n transform: [{ scale: s.value }],\n }))\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n style={[animated, style]}\n accessible={accessible}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n testID={testID}\n >\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/components/Backdrop.tsx","../src/internal/resolveSize.ts","../src/internal/components/SheetContainer.tsx","../src/internal/components/PopoverContainer.tsx","../src/internal/QuickPreviewRoot.tsx","../src/QuickPreviewAPI.ts","../src/context.tsx","../src/useQuickPreview.ts","../src/headless/QuickPreview.tsx","../src/internal/components/QuickPreviewScrollView.tsx","../src/addons/QuickPreviewPressable.tsx"],"names":["useSharedValue","React","withTiming","useAnimatedStyle","StyleSheet","jsx","Animated","Pressable","_a","Easing","Gesture","runOnJS","GestureDetector","jsxs","View","styles","SafeAreaInsetsContext","_b","_c","_d","AccessibilityInfo","BackHandler","Host","Portal","QuickPreview","ScrollView"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport { Pressable, StyleSheet } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\n\nexport function Backdrop({\n onPress,\n dismissOnBackdropPress = true,\n}: {\n onPress?: () => void\n dismissOnBackdropPress?: boolean\n}) {\n const opacity = useSharedValue(0)\n React.useEffect(() => {\n opacity.value = withTiming(1, { duration: 160 })\n return () => { opacity.value = 0 }\n }, [opacity])\n\n const style = useAnimatedStyle(() => ({\n backgroundColor: 'rgba(0,0,0,0.5)',\n ...StyleSheet.absoluteFillObject,\n opacity: opacity.value,\n }))\n\n return (\n <Animated.View style={style} pointerEvents={dismissOnBackdropPress && onPress ? 'auto' : 'none'}>\n {dismissOnBackdropPress && onPress ? (\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close preview\"\n />\n ) : null}\n </Animated.View>\n )\n}\n","import type { QuickPreviewSize } from '../types'\n\n/**\n * Turn the public `size` option into container style constraints.\n * 'auto' (or undefined) applies nothing; a number caps the height;\n * an object caps height and/or width.\n */\nexport function resolveSizeStyle(\n size?: QuickPreviewSize\n): { maxHeight?: number; maxWidth?: number } {\n if (size == null || size === 'auto') return {}\n if (typeof size === 'number') return { maxHeight: size }\n const out: { maxHeight?: number; maxWidth?: number } = {}\n if (typeof size.maxHeight === 'number') out.maxHeight = size.maxHeight\n if (typeof size.maxWidth === 'number') out.maxWidth = size.maxWidth\n return out\n}\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming, runOnJS } from 'react-native-reanimated'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function SheetContainer({\n children,\n options,\n insets,\n onRequestClose,\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const translateY = useSharedValue(1000)\n const dismissOnPanDown = options?.dismissOnPanDown ?? true\n\n React.useEffect(() => {\n // Smooth slide up, no spring bounce.\n translateY.value = withTiming(0, { duration: 300, easing: Easing.out(Easing.cubic) })\n }, [translateY])\n\n const pan = Gesture.Pan()\n .onUpdate((e) => {\n if (!dismissOnPanDown) return\n translateY.value = Math.max(0, e.translationY)\n })\n .onEnd((e) => {\n const shouldClose = e.velocityY > 1000 || translateY.value > 140\n if (shouldClose) {\n translateY.value = withTiming(800, { duration: 200 }, (finished) => {\n if (finished) runOnJS(onRequestClose)()\n })\n } else {\n translateY.value = withTiming(0, { duration: 240, easing: Easing.out(Easing.cubic) })\n }\n })\n\n const style = useAnimatedStyle(() => ({\n transform: [{ translateY: translateY.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <GestureDetector gesture={pan}>\n <Animated.View\n style={[styles.sheet, sizeStyle, style, { paddingBottom: Math.max(insets.bottom, 12) }]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n <View style={styles.grabber} />\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingTop: 8,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n grabber: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: 2,\n backgroundColor: 'rgba(0,0,0,0.2)',\n marginBottom: 8,\n },\n})\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function PopoverContainer({\n children,\n options,\n insets: _insets,\n onRequestClose: _onRequestClose, // kept for API parity with SheetContainer\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const scale = useSharedValue(0.96)\n const opacity = useSharedValue(0)\n\n React.useEffect(() => {\n // Smooth ease-out, no spring overshoot — a clean, quick \"pop\" in.\n scale.value = withTiming(1, { duration: 200, easing: Easing.out(Easing.cubic) })\n opacity.value = withTiming(1, { duration: 160, easing: Easing.out(Easing.quad) })\n }, [scale, opacity])\n\n const container = useAnimatedStyle(() => ({\n opacity: opacity.value,\n transform: [{ scale: scale.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.center]} pointerEvents=\"box-none\">\n <Animated.View\n style={[styles.card, sizeStyle, container]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n {children}\n </Animated.View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n center: { justifyContent: 'center', alignItems: 'center' },\n card: {\n maxWidth: 520,\n width: '92%',\n maxHeight: '86%',\n borderRadius: 16,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n})\n","import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context'\nimport { QuickPreviewOptions } from '../types'\nimport { Backdrop } from './components/Backdrop'\nimport { SheetContainer } from './components/SheetContainer'\nimport { PopoverContainer } from './components/PopoverContainer'\n\nexport function QuickPreviewRoot({\n options,\n onRequestClose,\n children,\n}: {\n options?: QuickPreviewOptions\n onRequestClose: () => void\n children: React.ReactNode\n}) {\n // Read insets from context directly so a missing <SafeAreaProvider> degrades\n // to zero insets instead of throwing. useSafeAreaInsets() would crash the host\n // app when no provider is mounted; the peek only needs insets to clear the\n // notch / home indicator, so zero is a safe fallback (provider still recommended).\n const insets = React.useContext(SafeAreaInsetsContext)\n const top = insets?.top ?? 0\n const bottom = insets?.bottom ?? 0\n const variant = options?.variant ?? 'popover'\n const dismissOnBackdropPress = options?.dismissOnBackdropPress ?? true\n\n const opacity = useSharedValue(0)\n\n const cbs = React.useRef({\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n })\n React.useEffect(() => {\n cbs.current = {\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n }\n }, [options?.onOpenStart, options?.onOpenEnd, options?.onCloseStart, options?.onCloseEnd])\n\n React.useEffect(() => {\n cbs.current.onOpenStart?.()\n opacity.value = withTiming(1, { duration: 180 }, finished => {\n if (finished) cbs.current.onOpenEnd?.()\n })\n return () => {\n cbs.current.onCloseStart?.()\n cbs.current.onCloseEnd?.()\n }\n // run once (mount-only effect)\n }, [])\n\n const containerStyle = useAnimatedStyle(() => ({ opacity: opacity.value }))\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\" accessibilityViewIsModal>\n <Animated.View style={[StyleSheet.absoluteFill, containerStyle]} pointerEvents=\"box-none\">\n <Backdrop\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n dismissOnBackdropPress={dismissOnBackdropPress}\n />\n {variant === 'sheet' ? (\n <SheetContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </SheetContainer>\n ) : (\n <PopoverContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </PopoverContainer>\n )}\n </Animated.View>\n </View>\n )\n}\n","// src/QuickPreviewAPI.ts\nimport type { QuickPreviewController, QuickPreviewOptions } from './types'\nimport type React from 'react'\n\n// Persist across Fast Refresh / HMR\nconst STORE = Symbol.for('rnqp.controller')\ntype Store = { controller: QuickPreviewController | null }\nconst g = globalThis as Record<symbol, Store | undefined>\nconst store: Store = g[STORE] ?? (g[STORE] = { controller: null })\n\nfunction warn() {\n // __DEV__ is provided by RN/Metro; if TS complains, declare it in a globals.d.ts\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[react-native-quick-preview] PreviewProvider not mounted yet.')\n }\n}\n\n/**\n * A static handle to the same controller as {@link useQuickPreview} — callable\n * from anywhere, including outside React (services, store actions, event handlers).\n * Before `<PreviewProvider>` mounts it is a safe no-op (with a dev warning).\n *\n * @example\n * ```ts\n * import { QuickPreview } from 'react-native-quick-preview'\n *\n * QuickPreview.present(<Card />, { variant: 'sheet' })\n * QuickPreview.update({ size: { maxHeight: 480 } })\n * QuickPreview.close()\n * ```\n */\nexport const QuickPreview = {\n /** @internal Registered by `<PreviewProvider />`. Not part of the public API. */\n _set(c: QuickPreviewController | null) {\n store.controller = c\n },\n\n /**\n * Present `node` as the preview. Replaces the content if one is already open.\n * @param node - the React element to show inside the preview.\n * @param opts - presentation options ({@link QuickPreviewOptions}).\n */\n present(node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.present(node, opts) : warn()\n },\n\n /** Dismiss the current preview. No-op if nothing is open. */\n close() {\n const c = store.controller\n c ? c.close() : warn()\n },\n\n /** Merge new options into the currently open preview. */\n update(opts: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.update(opts) : warn()\n },\n\n /** Whether a preview is currently open. */\n isOpen() {\n return !!store.controller?.isOpen()\n },\n\n /** @internal Dev/test convenience — don't use in app code. */\n __unsafe_getController(): QuickPreviewController | null {\n return store.controller\n },\n} as const\n","import React from 'react'\nimport { BackHandler, AccessibilityInfo } from 'react-native'\nimport { Host, Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions, QuickPreviewController } from './types'\nimport { QuickPreviewRoot } from './internal/QuickPreviewRoot'\nimport { QuickPreview as QuickPreviewStatic } from './QuickPreviewAPI'\n\nexport const QuickPreviewContext = React.createContext<QuickPreviewController | null>(null)\n\n/**\n * Hosts the preview layer and registers the controller. Mount this once, near the\n * root of your app, inside a `<GestureHandlerRootView>`. After it's mounted you can\n * present previews via {@link useQuickPreview} or the static `QuickPreview` handle.\n *\n * @example\n * ```tsx\n * <GestureHandlerRootView style={{ flex: 1 }}>\n * <PreviewProvider>\n * <YourApp />\n * </PreviewProvider>\n * </GestureHandlerRootView>\n * ```\n */\nexport function PreviewProvider({ children }: { children: React.ReactNode }) {\n const [content, setContent] = React.useState<React.ReactNode | null>(null)\n const [options, setOptions] = React.useState<QuickPreviewOptions | undefined>(undefined)\n const openRef = React.useRef(false)\n\n const announce = React.useCallback((msg: string) => {\n // eslint-disable-next-line no-empty\n try { AccessibilityInfo.announceForAccessibility?.(msg) } catch {}\n }, [])\n\n const close = React.useCallback(() => {\n if (!openRef.current) return\n openRef.current = false\n setContent(null)\n setOptions(undefined)\n announce('Quick preview closed')\n }, [announce])\n\n const present = React.useCallback(\n (node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) => {\n // Replace, don't merge: options from a previous presentation must not\n // leak into the next one. Merging is what update() is for.\n setOptions(opts)\n openRef.current = true\n setContent(() => node)\n announce('Quick preview opened')\n },\n [announce]\n )\n\n const update = React.useCallback((opts: Partial<QuickPreviewOptions>) => {\n setOptions(prev => ({ ...prev, ...opts }))\n }, [])\n\n React.useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (openRef.current) { close(); return true }\n return false\n })\n return () => sub.remove()\n }, [close])\n\n const value = React.useMemo<QuickPreviewController>(\n () => ({ present, close, update, isOpen: () => openRef.current }),\n [present, close, update]\n )\n\n // Register the static API (layout effect = available ASAP)\n React.useLayoutEffect(() => {\n QuickPreviewStatic._set(value)\n return () => QuickPreviewStatic._set(null)\n }, [value])\n\n return (\n <QuickPreviewContext.Provider value={value}>\n <Host>\n {children}\n {content ? (\n <Portal>\n <QuickPreviewRoot options={options} onRequestClose={close}>\n {content}\n </QuickPreviewRoot>\n </Portal>\n ) : null}\n </Host>\n </QuickPreviewContext.Provider>\n )\n}\n","import React from 'react'\nimport { QuickPreviewContext } from './context'\nimport type { QuickPreviewController } from './types'\n\n/**\n * Access the {@link QuickPreviewController} to open, update, and close previews\n * from inside a React component. Must be called under a mounted `<PreviewProvider>`.\n *\n * @throws if used outside of a `<PreviewProvider>`.\n * @returns the controller: `{ present, close, update, isOpen }`.\n *\n * @example\n * ```tsx\n * function ProductCard({ product }) {\n * const { present } = useQuickPreview()\n * return (\n * <Pressable onLongPress={() => present(<ProductPreview product={product} />, { variant: 'sheet' })}>\n * <Thumbnail source={product.image} />\n * </Pressable>\n * )\n * }\n * ```\n */\nexport function useQuickPreview(): QuickPreviewController {\n const ctx = React.useContext(QuickPreviewContext)\n if (!ctx) throw new Error('useQuickPreview must be used within <PreviewProvider>')\n return ctx\n}\n","import React from 'react'\nimport { Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions } from '../types'\nimport { QuickPreviewRoot } from '../internal/QuickPreviewRoot'\n\n/**\n * Props for the controlled, headless `QuickPreviewComponent`. Extends\n * {@link QuickPreviewOptions} (so `variant`, `size`, `dismissOn*`, and the\n * lifecycle callbacks are all accepted).\n */\nexport type HeadlessQuickPreviewProps = {\n /** Whether the preview is shown. You own this state. */\n visible: boolean\n /** Called when the preview requests to close (backdrop press, swipe, back button). */\n onClose: () => void\n /**\n * Render into a portal above the app. Disable only if you're providing your\n * own host/overlay.\n * @defaultValue `true`\n */\n portal?: boolean\n} & Partial<QuickPreviewOptions> & {\n /** The preview content. */\n children: React.ReactNode\n}\n\n/**\n * A controlled, headless preview component — you own the `visible` state. Useful\n * when you prefer a declarative component over the imperative\n * {@link useQuickPreview} hook or the static `QuickPreview` handle.\n *\n * Exported as `QuickPreviewComponent`.\n *\n * @example\n * ```tsx\n * const [visible, setVisible] = useState(false)\n * <QuickPreviewComponent visible={visible} onClose={() => setVisible(false)} variant=\"sheet\">\n * <Card />\n * </QuickPreviewComponent>\n * ```\n */\nexport function QuickPreview({\n visible,\n onClose,\n portal = true,\n children,\n ...opts\n}: HeadlessQuickPreviewProps) {\n if (!visible) return null\n const node = (\n <QuickPreviewRoot options={opts} onRequestClose={onClose}>\n {children}\n </QuickPreviewRoot>\n )\n return portal ? <Portal>{node}</Portal> : node\n}\n","import React from 'react'\nimport { ScrollView, ScrollViewProps } from 'react-native'\n\n/**\n * A gesture-aware `ScrollView` for use inside preview content. Use it instead of\n * a plain `ScrollView` so that scrolling the content and the swipe-to-dismiss\n * gesture don't fight each other. Accepts all `ScrollViewProps`.\n *\n * @example\n * ```tsx\n * present(\n * <QuickPreviewScrollView>\n * <LongArticle />\n * </QuickPreviewScrollView>,\n * { variant: 'sheet', size: { maxHeight: 520 } }\n * )\n * ```\n */\nexport function QuickPreviewScrollView(props: ScrollViewProps) {\n return <ScrollView nestedScrollEnabled {...props} />\n}\n","import React from 'react'\nimport type { StyleProp, ViewStyle } from 'react-native'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport Animated, {\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { QuickPreview } from '../QuickPreviewAPI'\nimport type { QuickPreviewOptions } from '../types'\n\nexport type QuickPreviewPressableProps = {\n children: React.ReactNode\n /** Called for a normal tap (e.g., navigate) */\n onPress?: () => void\n /** Return the preview node to present */\n renderPreview: () => React.ReactNode\n /** Options forwarded to QuickPreview.present */\n previewOptions?: Partial<QuickPreviewOptions>\n /** Long-press delay (ms). Default 350 */\n delay?: number\n /** Press-down scale. Default 0.98 */\n scale?: number\n /**\n * Called on the JS thread when the long press activates, right before the\n * preview opens. Wire up haptics here, e.g.:\n * onLongPressStart={() => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)}\n * The library deliberately does not import expo-haptics itself: an optional\n * require would break Metro bundling for apps that don't have it installed.\n */\n onLongPressStart?: () => void\n /** Disable all interactions */\n disabled?: boolean\n /** Style applied to the animated wrapper (the thing that scales) */\n style?: StyleProp<ViewStyle>\n /** Accessibility */\n accessible?: boolean\n accessibilityLabel?: string\n testID?: string\n}\n\nexport function QuickPreviewPressable({\n children,\n onPress,\n renderPreview,\n previewOptions,\n delay = 350,\n scale = 0.98,\n onLongPressStart,\n disabled = false,\n style,\n accessible,\n accessibilityLabel,\n testID,\n}: QuickPreviewPressableProps) {\n const s = useSharedValue(1)\n\n // Runs on the JS thread: renderPreview() creates React elements, which must\n // never happen on the UI thread inside a worklet.\n const openPreview = () => {\n onLongPressStart?.()\n QuickPreview.present(renderPreview(), {\n variant: 'popover',\n dismissOnBackdropPress: true,\n ...previewOptions,\n })\n }\n\n const longPress = Gesture.LongPress()\n .enabled(!disabled)\n .minDuration(delay)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onStart(() => {\n runOnJS(openPreview)()\n })\n\n const tap = Gesture.Tap()\n .enabled(!disabled)\n .maxDuration(220)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onEnd(() => {\n if (onPress) runOnJS(onPress)()\n })\n\n const gesture = Gesture.Exclusive(longPress, tap)\n\n const animated = useAnimatedStyle(() => ({\n transform: [{ scale: s.value }],\n }))\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n style={[animated, style]}\n accessible={accessible}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n testID={testID}\n >\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n"]}
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import React5 from 'react';
2
2
  import { StyleSheet, AccessibilityInfo, BackHandler, ScrollView, View, Pressable } from 'react-native';
3
3
  import { Host, Portal } from 'react-native-portalize';
4
4
  import Animated, { useSharedValue, withTiming, runOnJS, useAnimatedStyle, Easing } from 'react-native-reanimated';
5
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
+ import { SafeAreaInsetsContext } from 'react-native-safe-area-context';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
7
7
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
8
8
 
@@ -183,10 +183,12 @@ function QuickPreviewRoot({
183
183
  onRequestClose,
184
184
  children
185
185
  }) {
186
- var _a2, _b;
187
- const { top, bottom } = useSafeAreaInsets();
188
- const variant = (_a2 = options == null ? void 0 : options.variant) != null ? _a2 : "popover";
189
- const dismissOnBackdropPress = (_b = options == null ? void 0 : options.dismissOnBackdropPress) != null ? _b : true;
186
+ var _a2, _b, _c, _d;
187
+ const insets = React5.useContext(SafeAreaInsetsContext);
188
+ const top = (_a2 = insets == null ? void 0 : insets.top) != null ? _a2 : 0;
189
+ const bottom = (_b = insets == null ? void 0 : insets.bottom) != null ? _b : 0;
190
+ const variant = (_c = options == null ? void 0 : options.variant) != null ? _c : "popover";
191
+ const dismissOnBackdropPress = (_d = options == null ? void 0 : options.dismissOnBackdropPress) != null ? _d : true;
190
192
  const opacity = useSharedValue(0);
191
193
  const cbs = React5.useRef({
192
194
  onOpenStart: options == null ? void 0 : options.onOpenStart,
@@ -210,9 +212,9 @@ function QuickPreviewRoot({
210
212
  if (finished) (_b3 = (_a4 = cbs.current).onOpenEnd) == null ? void 0 : _b3.call(_a4);
211
213
  });
212
214
  return () => {
213
- var _a4, _b3, _c, _d;
215
+ var _a4, _b3, _c2, _d2;
214
216
  (_b3 = (_a4 = cbs.current).onCloseStart) == null ? void 0 : _b3.call(_a4);
215
- (_d = (_c = cbs.current).onCloseEnd) == null ? void 0 : _d.call(_c);
217
+ (_d2 = (_c2 = cbs.current).onCloseEnd) == null ? void 0 : _d2.call(_c2);
216
218
  };
217
219
  }, []);
218
220
  const containerStyle = useAnimatedStyle(() => ({ opacity: opacity.value }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/components/Backdrop.tsx","../src/internal/resolveSize.ts","../src/internal/components/SheetContainer.tsx","../src/internal/components/PopoverContainer.tsx","../src/internal/QuickPreviewRoot.tsx","../src/QuickPreviewAPI.ts","../src/context.tsx","../src/useQuickPreview.ts","../src/headless/QuickPreview.tsx","../src/internal/components/QuickPreviewScrollView.tsx","../src/addons/QuickPreviewPressable.tsx"],"names":["React","_a","useSharedValue","withTiming","useAnimatedStyle","jsx","Animated","StyleSheet","Easing","View","styles","_b","jsxs","QuickPreview","Portal","Gesture","runOnJS","GestureDetector"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react'\nimport { Pressable, StyleSheet } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\n\nexport function Backdrop({\n onPress,\n dismissOnBackdropPress = true,\n}: {\n onPress?: () => void\n dismissOnBackdropPress?: boolean\n}) {\n const opacity = useSharedValue(0)\n React.useEffect(() => {\n opacity.value = withTiming(1, { duration: 160 })\n return () => { opacity.value = 0 }\n }, [opacity])\n\n const style = useAnimatedStyle(() => ({\n backgroundColor: 'rgba(0,0,0,0.5)',\n ...StyleSheet.absoluteFillObject,\n opacity: opacity.value,\n }))\n\n return (\n <Animated.View style={style} pointerEvents={dismissOnBackdropPress && onPress ? 'auto' : 'none'}>\n {dismissOnBackdropPress && onPress ? (\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close preview\"\n />\n ) : null}\n </Animated.View>\n )\n}\n","import type { QuickPreviewSize } from '../types'\n\n/**\n * Turn the public `size` option into container style constraints.\n * 'auto' (or undefined) applies nothing; a number caps the height;\n * an object caps height and/or width.\n */\nexport function resolveSizeStyle(\n size?: QuickPreviewSize\n): { maxHeight?: number; maxWidth?: number } {\n if (size == null || size === 'auto') return {}\n if (typeof size === 'number') return { maxHeight: size }\n const out: { maxHeight?: number; maxWidth?: number } = {}\n if (typeof size.maxHeight === 'number') out.maxHeight = size.maxHeight\n if (typeof size.maxWidth === 'number') out.maxWidth = size.maxWidth\n return out\n}\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming, runOnJS } from 'react-native-reanimated'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function SheetContainer({\n children,\n options,\n insets,\n onRequestClose,\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const translateY = useSharedValue(1000)\n const dismissOnPanDown = options?.dismissOnPanDown ?? true\n\n React.useEffect(() => {\n // Smooth slide up, no spring bounce.\n translateY.value = withTiming(0, { duration: 300, easing: Easing.out(Easing.cubic) })\n }, [translateY])\n\n const pan = Gesture.Pan()\n .onUpdate((e) => {\n if (!dismissOnPanDown) return\n translateY.value = Math.max(0, e.translationY)\n })\n .onEnd((e) => {\n const shouldClose = e.velocityY > 1000 || translateY.value > 140\n if (shouldClose) {\n translateY.value = withTiming(800, { duration: 200 }, (finished) => {\n if (finished) runOnJS(onRequestClose)()\n })\n } else {\n translateY.value = withTiming(0, { duration: 240, easing: Easing.out(Easing.cubic) })\n }\n })\n\n const style = useAnimatedStyle(() => ({\n transform: [{ translateY: translateY.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <GestureDetector gesture={pan}>\n <Animated.View\n style={[styles.sheet, sizeStyle, style, { paddingBottom: Math.max(insets.bottom, 12) }]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n <View style={styles.grabber} />\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingTop: 8,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n grabber: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: 2,\n backgroundColor: 'rgba(0,0,0,0.2)',\n marginBottom: 8,\n },\n})\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function PopoverContainer({\n children,\n options,\n insets: _insets,\n onRequestClose: _onRequestClose, // kept for API parity with SheetContainer\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const scale = useSharedValue(0.96)\n const opacity = useSharedValue(0)\n\n React.useEffect(() => {\n // Smooth ease-out, no spring overshoot — a clean, quick \"pop\" in.\n scale.value = withTiming(1, { duration: 200, easing: Easing.out(Easing.cubic) })\n opacity.value = withTiming(1, { duration: 160, easing: Easing.out(Easing.quad) })\n }, [scale, opacity])\n\n const container = useAnimatedStyle(() => ({\n opacity: opacity.value,\n transform: [{ scale: scale.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.center]} pointerEvents=\"box-none\">\n <Animated.View\n style={[styles.card, sizeStyle, container]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n {children}\n </Animated.View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n center: { justifyContent: 'center', alignItems: 'center' },\n card: {\n maxWidth: 520,\n width: '92%',\n maxHeight: '86%',\n borderRadius: 16,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n})\n","import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { QuickPreviewOptions } from '../types'\nimport { Backdrop } from './components/Backdrop'\nimport { SheetContainer } from './components/SheetContainer'\nimport { PopoverContainer } from './components/PopoverContainer'\n\nexport function QuickPreviewRoot({\n options,\n onRequestClose,\n children,\n}: {\n options?: QuickPreviewOptions\n onRequestClose: () => void\n children: React.ReactNode\n}) {\n const { top, bottom } = useSafeAreaInsets()\n const variant = options?.variant ?? 'popover'\n const dismissOnBackdropPress = options?.dismissOnBackdropPress ?? true\n\n const opacity = useSharedValue(0)\n\n const cbs = React.useRef({\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n })\n React.useEffect(() => {\n cbs.current = {\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n }\n }, [options?.onOpenStart, options?.onOpenEnd, options?.onCloseStart, options?.onCloseEnd])\n\n React.useEffect(() => {\n cbs.current.onOpenStart?.()\n opacity.value = withTiming(1, { duration: 180 }, finished => {\n if (finished) cbs.current.onOpenEnd?.()\n })\n return () => {\n cbs.current.onCloseStart?.()\n cbs.current.onCloseEnd?.()\n }\n // run once (mount-only effect)\n }, [])\n\n const containerStyle = useAnimatedStyle(() => ({ opacity: opacity.value }))\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\" accessibilityViewIsModal>\n <Animated.View style={[StyleSheet.absoluteFill, containerStyle]} pointerEvents=\"box-none\">\n <Backdrop\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n dismissOnBackdropPress={dismissOnBackdropPress}\n />\n {variant === 'sheet' ? (\n <SheetContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </SheetContainer>\n ) : (\n <PopoverContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </PopoverContainer>\n )}\n </Animated.View>\n </View>\n )\n}\n","// src/QuickPreviewAPI.ts\nimport type { QuickPreviewController, QuickPreviewOptions } from './types'\nimport type React from 'react'\n\n// Persist across Fast Refresh / HMR\nconst STORE = Symbol.for('rnqp.controller')\ntype Store = { controller: QuickPreviewController | null }\nconst g = globalThis as Record<symbol, Store | undefined>\nconst store: Store = g[STORE] ?? (g[STORE] = { controller: null })\n\nfunction warn() {\n // __DEV__ is provided by RN/Metro; if TS complains, declare it in a globals.d.ts\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[react-native-quick-preview] PreviewProvider not mounted yet.')\n }\n}\n\n/**\n * A static handle to the same controller as {@link useQuickPreview} — callable\n * from anywhere, including outside React (services, store actions, event handlers).\n * Before `<PreviewProvider>` mounts it is a safe no-op (with a dev warning).\n *\n * @example\n * ```ts\n * import { QuickPreview } from 'react-native-quick-preview'\n *\n * QuickPreview.present(<Card />, { variant: 'sheet' })\n * QuickPreview.update({ size: { maxHeight: 480 } })\n * QuickPreview.close()\n * ```\n */\nexport const QuickPreview = {\n /** @internal Registered by `<PreviewProvider />`. Not part of the public API. */\n _set(c: QuickPreviewController | null) {\n store.controller = c\n },\n\n /**\n * Present `node` as the preview. Replaces the content if one is already open.\n * @param node - the React element to show inside the preview.\n * @param opts - presentation options ({@link QuickPreviewOptions}).\n */\n present(node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.present(node, opts) : warn()\n },\n\n /** Dismiss the current preview. No-op if nothing is open. */\n close() {\n const c = store.controller\n c ? c.close() : warn()\n },\n\n /** Merge new options into the currently open preview. */\n update(opts: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.update(opts) : warn()\n },\n\n /** Whether a preview is currently open. */\n isOpen() {\n return !!store.controller?.isOpen()\n },\n\n /** @internal Dev/test convenience — don't use in app code. */\n __unsafe_getController(): QuickPreviewController | null {\n return store.controller\n },\n} as const\n","import React from 'react'\nimport { BackHandler, AccessibilityInfo } from 'react-native'\nimport { Host, Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions, QuickPreviewController } from './types'\nimport { QuickPreviewRoot } from './internal/QuickPreviewRoot'\nimport { QuickPreview as QuickPreviewStatic } from './QuickPreviewAPI'\n\nexport const QuickPreviewContext = React.createContext<QuickPreviewController | null>(null)\n\n/**\n * Hosts the preview layer and registers the controller. Mount this once, near the\n * root of your app, inside a `<GestureHandlerRootView>`. After it's mounted you can\n * present previews via {@link useQuickPreview} or the static `QuickPreview` handle.\n *\n * @example\n * ```tsx\n * <GestureHandlerRootView style={{ flex: 1 }}>\n * <PreviewProvider>\n * <YourApp />\n * </PreviewProvider>\n * </GestureHandlerRootView>\n * ```\n */\nexport function PreviewProvider({ children }: { children: React.ReactNode }) {\n const [content, setContent] = React.useState<React.ReactNode | null>(null)\n const [options, setOptions] = React.useState<QuickPreviewOptions | undefined>(undefined)\n const openRef = React.useRef(false)\n\n const announce = React.useCallback((msg: string) => {\n // eslint-disable-next-line no-empty\n try { AccessibilityInfo.announceForAccessibility?.(msg) } catch {}\n }, [])\n\n const close = React.useCallback(() => {\n if (!openRef.current) return\n openRef.current = false\n setContent(null)\n setOptions(undefined)\n announce('Quick preview closed')\n }, [announce])\n\n const present = React.useCallback(\n (node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) => {\n // Replace, don't merge: options from a previous presentation must not\n // leak into the next one. Merging is what update() is for.\n setOptions(opts)\n openRef.current = true\n setContent(() => node)\n announce('Quick preview opened')\n },\n [announce]\n )\n\n const update = React.useCallback((opts: Partial<QuickPreviewOptions>) => {\n setOptions(prev => ({ ...prev, ...opts }))\n }, [])\n\n React.useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (openRef.current) { close(); return true }\n return false\n })\n return () => sub.remove()\n }, [close])\n\n const value = React.useMemo<QuickPreviewController>(\n () => ({ present, close, update, isOpen: () => openRef.current }),\n [present, close, update]\n )\n\n // Register the static API (layout effect = available ASAP)\n React.useLayoutEffect(() => {\n QuickPreviewStatic._set(value)\n return () => QuickPreviewStatic._set(null)\n }, [value])\n\n return (\n <QuickPreviewContext.Provider value={value}>\n <Host>\n {children}\n {content ? (\n <Portal>\n <QuickPreviewRoot options={options} onRequestClose={close}>\n {content}\n </QuickPreviewRoot>\n </Portal>\n ) : null}\n </Host>\n </QuickPreviewContext.Provider>\n )\n}\n","import React from 'react'\nimport { QuickPreviewContext } from './context'\nimport type { QuickPreviewController } from './types'\n\n/**\n * Access the {@link QuickPreviewController} to open, update, and close previews\n * from inside a React component. Must be called under a mounted `<PreviewProvider>`.\n *\n * @throws if used outside of a `<PreviewProvider>`.\n * @returns the controller: `{ present, close, update, isOpen }`.\n *\n * @example\n * ```tsx\n * function ProductCard({ product }) {\n * const { present } = useQuickPreview()\n * return (\n * <Pressable onLongPress={() => present(<ProductPreview product={product} />, { variant: 'sheet' })}>\n * <Thumbnail source={product.image} />\n * </Pressable>\n * )\n * }\n * ```\n */\nexport function useQuickPreview(): QuickPreviewController {\n const ctx = React.useContext(QuickPreviewContext)\n if (!ctx) throw new Error('useQuickPreview must be used within <PreviewProvider>')\n return ctx\n}\n","import React from 'react'\nimport { Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions } from '../types'\nimport { QuickPreviewRoot } from '../internal/QuickPreviewRoot'\n\n/**\n * Props for the controlled, headless `QuickPreviewComponent`. Extends\n * {@link QuickPreviewOptions} (so `variant`, `size`, `dismissOn*`, and the\n * lifecycle callbacks are all accepted).\n */\nexport type HeadlessQuickPreviewProps = {\n /** Whether the preview is shown. You own this state. */\n visible: boolean\n /** Called when the preview requests to close (backdrop press, swipe, back button). */\n onClose: () => void\n /**\n * Render into a portal above the app. Disable only if you're providing your\n * own host/overlay.\n * @defaultValue `true`\n */\n portal?: boolean\n} & Partial<QuickPreviewOptions> & {\n /** The preview content. */\n children: React.ReactNode\n}\n\n/**\n * A controlled, headless preview component — you own the `visible` state. Useful\n * when you prefer a declarative component over the imperative\n * {@link useQuickPreview} hook or the static `QuickPreview` handle.\n *\n * Exported as `QuickPreviewComponent`.\n *\n * @example\n * ```tsx\n * const [visible, setVisible] = useState(false)\n * <QuickPreviewComponent visible={visible} onClose={() => setVisible(false)} variant=\"sheet\">\n * <Card />\n * </QuickPreviewComponent>\n * ```\n */\nexport function QuickPreview({\n visible,\n onClose,\n portal = true,\n children,\n ...opts\n}: HeadlessQuickPreviewProps) {\n if (!visible) return null\n const node = (\n <QuickPreviewRoot options={opts} onRequestClose={onClose}>\n {children}\n </QuickPreviewRoot>\n )\n return portal ? <Portal>{node}</Portal> : node\n}\n","import React from 'react'\nimport { ScrollView, ScrollViewProps } from 'react-native'\n\n/**\n * A gesture-aware `ScrollView` for use inside preview content. Use it instead of\n * a plain `ScrollView` so that scrolling the content and the swipe-to-dismiss\n * gesture don't fight each other. Accepts all `ScrollViewProps`.\n *\n * @example\n * ```tsx\n * present(\n * <QuickPreviewScrollView>\n * <LongArticle />\n * </QuickPreviewScrollView>,\n * { variant: 'sheet', size: { maxHeight: 520 } }\n * )\n * ```\n */\nexport function QuickPreviewScrollView(props: ScrollViewProps) {\n return <ScrollView nestedScrollEnabled {...props} />\n}\n","import React from 'react'\nimport type { StyleProp, ViewStyle } from 'react-native'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport Animated, {\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { QuickPreview } from '../QuickPreviewAPI'\nimport type { QuickPreviewOptions } from '../types'\n\nexport type QuickPreviewPressableProps = {\n children: React.ReactNode\n /** Called for a normal tap (e.g., navigate) */\n onPress?: () => void\n /** Return the preview node to present */\n renderPreview: () => React.ReactNode\n /** Options forwarded to QuickPreview.present */\n previewOptions?: Partial<QuickPreviewOptions>\n /** Long-press delay (ms). Default 350 */\n delay?: number\n /** Press-down scale. Default 0.98 */\n scale?: number\n /**\n * Called on the JS thread when the long press activates, right before the\n * preview opens. Wire up haptics here, e.g.:\n * onLongPressStart={() => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)}\n * The library deliberately does not import expo-haptics itself: an optional\n * require would break Metro bundling for apps that don't have it installed.\n */\n onLongPressStart?: () => void\n /** Disable all interactions */\n disabled?: boolean\n /** Style applied to the animated wrapper (the thing that scales) */\n style?: StyleProp<ViewStyle>\n /** Accessibility */\n accessible?: boolean\n accessibilityLabel?: string\n testID?: string\n}\n\nexport function QuickPreviewPressable({\n children,\n onPress,\n renderPreview,\n previewOptions,\n delay = 350,\n scale = 0.98,\n onLongPressStart,\n disabled = false,\n style,\n accessible,\n accessibilityLabel,\n testID,\n}: QuickPreviewPressableProps) {\n const s = useSharedValue(1)\n\n // Runs on the JS thread: renderPreview() creates React elements, which must\n // never happen on the UI thread inside a worklet.\n const openPreview = () => {\n onLongPressStart?.()\n QuickPreview.present(renderPreview(), {\n variant: 'popover',\n dismissOnBackdropPress: true,\n ...previewOptions,\n })\n }\n\n const longPress = Gesture.LongPress()\n .enabled(!disabled)\n .minDuration(delay)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onStart(() => {\n runOnJS(openPreview)()\n })\n\n const tap = Gesture.Tap()\n .enabled(!disabled)\n .maxDuration(220)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onEnd(() => {\n if (onPress) runOnJS(onPress)()\n })\n\n const gesture = Gesture.Exclusive(longPress, tap)\n\n const animated = useAnimatedStyle(() => ({\n transform: [{ scale: s.value }],\n }))\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n style={[animated, style]}\n accessible={accessible}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n testID={testID}\n >\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/components/Backdrop.tsx","../src/internal/resolveSize.ts","../src/internal/components/SheetContainer.tsx","../src/internal/components/PopoverContainer.tsx","../src/internal/QuickPreviewRoot.tsx","../src/QuickPreviewAPI.ts","../src/context.tsx","../src/useQuickPreview.ts","../src/headless/QuickPreview.tsx","../src/internal/components/QuickPreviewScrollView.tsx","../src/addons/QuickPreviewPressable.tsx"],"names":["React","_a","useSharedValue","withTiming","useAnimatedStyle","jsx","Animated","StyleSheet","Easing","View","styles","_b","_c","_d","jsxs","QuickPreview","Portal","Gesture","runOnJS","GestureDetector"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react'\nimport { Pressable, StyleSheet } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\n\nexport function Backdrop({\n onPress,\n dismissOnBackdropPress = true,\n}: {\n onPress?: () => void\n dismissOnBackdropPress?: boolean\n}) {\n const opacity = useSharedValue(0)\n React.useEffect(() => {\n opacity.value = withTiming(1, { duration: 160 })\n return () => { opacity.value = 0 }\n }, [opacity])\n\n const style = useAnimatedStyle(() => ({\n backgroundColor: 'rgba(0,0,0,0.5)',\n ...StyleSheet.absoluteFillObject,\n opacity: opacity.value,\n }))\n\n return (\n <Animated.View style={style} pointerEvents={dismissOnBackdropPress && onPress ? 'auto' : 'none'}>\n {dismissOnBackdropPress && onPress ? (\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close preview\"\n />\n ) : null}\n </Animated.View>\n )\n}\n","import type { QuickPreviewSize } from '../types'\n\n/**\n * Turn the public `size` option into container style constraints.\n * 'auto' (or undefined) applies nothing; a number caps the height;\n * an object caps height and/or width.\n */\nexport function resolveSizeStyle(\n size?: QuickPreviewSize\n): { maxHeight?: number; maxWidth?: number } {\n if (size == null || size === 'auto') return {}\n if (typeof size === 'number') return { maxHeight: size }\n const out: { maxHeight?: number; maxWidth?: number } = {}\n if (typeof size.maxHeight === 'number') out.maxHeight = size.maxHeight\n if (typeof size.maxWidth === 'number') out.maxWidth = size.maxWidth\n return out\n}\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming, runOnJS } from 'react-native-reanimated'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function SheetContainer({\n children,\n options,\n insets,\n onRequestClose,\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const translateY = useSharedValue(1000)\n const dismissOnPanDown = options?.dismissOnPanDown ?? true\n\n React.useEffect(() => {\n // Smooth slide up, no spring bounce.\n translateY.value = withTiming(0, { duration: 300, easing: Easing.out(Easing.cubic) })\n }, [translateY])\n\n const pan = Gesture.Pan()\n .onUpdate((e) => {\n if (!dismissOnPanDown) return\n translateY.value = Math.max(0, e.translationY)\n })\n .onEnd((e) => {\n const shouldClose = e.velocityY > 1000 || translateY.value > 140\n if (shouldClose) {\n translateY.value = withTiming(800, { duration: 200 }, (finished) => {\n if (finished) runOnJS(onRequestClose)()\n })\n } else {\n translateY.value = withTiming(0, { duration: 240, easing: Easing.out(Easing.cubic) })\n }\n })\n\n const style = useAnimatedStyle(() => ({\n transform: [{ translateY: translateY.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <GestureDetector gesture={pan}>\n <Animated.View\n style={[styles.sheet, sizeStyle, style, { paddingBottom: Math.max(insets.bottom, 12) }]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n <View style={styles.grabber} />\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingTop: 8,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n grabber: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: 2,\n backgroundColor: 'rgba(0,0,0,0.2)',\n marginBottom: 8,\n },\n})\n","import React from 'react'\nimport { View, StyleSheet } from 'react-native'\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport type { QuickPreviewOptions } from '../../types'\nimport { resolveSizeStyle } from '../resolveSize'\n\nexport function PopoverContainer({\n children,\n options,\n insets: _insets,\n onRequestClose: _onRequestClose, // kept for API parity with SheetContainer\n}: {\n children: React.ReactNode\n options?: QuickPreviewOptions\n insets: { top: number; bottom: number }\n onRequestClose: () => void\n}) {\n const scale = useSharedValue(0.96)\n const opacity = useSharedValue(0)\n\n React.useEffect(() => {\n // Smooth ease-out, no spring overshoot — a clean, quick \"pop\" in.\n scale.value = withTiming(1, { duration: 200, easing: Easing.out(Easing.cubic) })\n opacity.value = withTiming(1, { duration: 160, easing: Easing.out(Easing.quad) })\n }, [scale, opacity])\n\n const container = useAnimatedStyle(() => ({\n opacity: opacity.value,\n transform: [{ scale: scale.value }],\n }))\n\n const sizeStyle = resolveSizeStyle(options?.size)\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.center]} pointerEvents=\"box-none\">\n <Animated.View\n style={[styles.card, sizeStyle, container]}\n accessibilityRole={options?.accessibilityRole}\n accessibilityLabel={options?.accessibilityLabel ?? 'Quick preview'}\n >\n {children}\n </Animated.View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n center: { justifyContent: 'center', alignItems: 'center' },\n card: {\n maxWidth: 520,\n width: '92%',\n maxHeight: '86%',\n borderRadius: 16,\n backgroundColor: 'white',\n overflow: 'hidden',\n elevation: 3,\n },\n})\n","import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context'\nimport { QuickPreviewOptions } from '../types'\nimport { Backdrop } from './components/Backdrop'\nimport { SheetContainer } from './components/SheetContainer'\nimport { PopoverContainer } from './components/PopoverContainer'\n\nexport function QuickPreviewRoot({\n options,\n onRequestClose,\n children,\n}: {\n options?: QuickPreviewOptions\n onRequestClose: () => void\n children: React.ReactNode\n}) {\n // Read insets from context directly so a missing <SafeAreaProvider> degrades\n // to zero insets instead of throwing. useSafeAreaInsets() would crash the host\n // app when no provider is mounted; the peek only needs insets to clear the\n // notch / home indicator, so zero is a safe fallback (provider still recommended).\n const insets = React.useContext(SafeAreaInsetsContext)\n const top = insets?.top ?? 0\n const bottom = insets?.bottom ?? 0\n const variant = options?.variant ?? 'popover'\n const dismissOnBackdropPress = options?.dismissOnBackdropPress ?? true\n\n const opacity = useSharedValue(0)\n\n const cbs = React.useRef({\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n })\n React.useEffect(() => {\n cbs.current = {\n onOpenStart: options?.onOpenStart,\n onOpenEnd: options?.onOpenEnd,\n onCloseStart: options?.onCloseStart,\n onCloseEnd: options?.onCloseEnd,\n }\n }, [options?.onOpenStart, options?.onOpenEnd, options?.onCloseStart, options?.onCloseEnd])\n\n React.useEffect(() => {\n cbs.current.onOpenStart?.()\n opacity.value = withTiming(1, { duration: 180 }, finished => {\n if (finished) cbs.current.onOpenEnd?.()\n })\n return () => {\n cbs.current.onCloseStart?.()\n cbs.current.onCloseEnd?.()\n }\n // run once (mount-only effect)\n }, [])\n\n const containerStyle = useAnimatedStyle(() => ({ opacity: opacity.value }))\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\" accessibilityViewIsModal>\n <Animated.View style={[StyleSheet.absoluteFill, containerStyle]} pointerEvents=\"box-none\">\n <Backdrop\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n dismissOnBackdropPress={dismissOnBackdropPress}\n />\n {variant === 'sheet' ? (\n <SheetContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </SheetContainer>\n ) : (\n <PopoverContainer insets={{ top, bottom }} options={options} onRequestClose={onRequestClose}>\n {children}\n </PopoverContainer>\n )}\n </Animated.View>\n </View>\n )\n}\n","// src/QuickPreviewAPI.ts\nimport type { QuickPreviewController, QuickPreviewOptions } from './types'\nimport type React from 'react'\n\n// Persist across Fast Refresh / HMR\nconst STORE = Symbol.for('rnqp.controller')\ntype Store = { controller: QuickPreviewController | null }\nconst g = globalThis as Record<symbol, Store | undefined>\nconst store: Store = g[STORE] ?? (g[STORE] = { controller: null })\n\nfunction warn() {\n // __DEV__ is provided by RN/Metro; if TS complains, declare it in a globals.d.ts\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[react-native-quick-preview] PreviewProvider not mounted yet.')\n }\n}\n\n/**\n * A static handle to the same controller as {@link useQuickPreview} — callable\n * from anywhere, including outside React (services, store actions, event handlers).\n * Before `<PreviewProvider>` mounts it is a safe no-op (with a dev warning).\n *\n * @example\n * ```ts\n * import { QuickPreview } from 'react-native-quick-preview'\n *\n * QuickPreview.present(<Card />, { variant: 'sheet' })\n * QuickPreview.update({ size: { maxHeight: 480 } })\n * QuickPreview.close()\n * ```\n */\nexport const QuickPreview = {\n /** @internal Registered by `<PreviewProvider />`. Not part of the public API. */\n _set(c: QuickPreviewController | null) {\n store.controller = c\n },\n\n /**\n * Present `node` as the preview. Replaces the content if one is already open.\n * @param node - the React element to show inside the preview.\n * @param opts - presentation options ({@link QuickPreviewOptions}).\n */\n present(node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.present(node, opts) : warn()\n },\n\n /** Dismiss the current preview. No-op if nothing is open. */\n close() {\n const c = store.controller\n c ? c.close() : warn()\n },\n\n /** Merge new options into the currently open preview. */\n update(opts: Partial<QuickPreviewOptions>) {\n const c = store.controller\n c ? c.update(opts) : warn()\n },\n\n /** Whether a preview is currently open. */\n isOpen() {\n return !!store.controller?.isOpen()\n },\n\n /** @internal Dev/test convenience — don't use in app code. */\n __unsafe_getController(): QuickPreviewController | null {\n return store.controller\n },\n} as const\n","import React from 'react'\nimport { BackHandler, AccessibilityInfo } from 'react-native'\nimport { Host, Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions, QuickPreviewController } from './types'\nimport { QuickPreviewRoot } from './internal/QuickPreviewRoot'\nimport { QuickPreview as QuickPreviewStatic } from './QuickPreviewAPI'\n\nexport const QuickPreviewContext = React.createContext<QuickPreviewController | null>(null)\n\n/**\n * Hosts the preview layer and registers the controller. Mount this once, near the\n * root of your app, inside a `<GestureHandlerRootView>`. After it's mounted you can\n * present previews via {@link useQuickPreview} or the static `QuickPreview` handle.\n *\n * @example\n * ```tsx\n * <GestureHandlerRootView style={{ flex: 1 }}>\n * <PreviewProvider>\n * <YourApp />\n * </PreviewProvider>\n * </GestureHandlerRootView>\n * ```\n */\nexport function PreviewProvider({ children }: { children: React.ReactNode }) {\n const [content, setContent] = React.useState<React.ReactNode | null>(null)\n const [options, setOptions] = React.useState<QuickPreviewOptions | undefined>(undefined)\n const openRef = React.useRef(false)\n\n const announce = React.useCallback((msg: string) => {\n // eslint-disable-next-line no-empty\n try { AccessibilityInfo.announceForAccessibility?.(msg) } catch {}\n }, [])\n\n const close = React.useCallback(() => {\n if (!openRef.current) return\n openRef.current = false\n setContent(null)\n setOptions(undefined)\n announce('Quick preview closed')\n }, [announce])\n\n const present = React.useCallback(\n (node: React.ReactNode, opts?: Partial<QuickPreviewOptions>) => {\n // Replace, don't merge: options from a previous presentation must not\n // leak into the next one. Merging is what update() is for.\n setOptions(opts)\n openRef.current = true\n setContent(() => node)\n announce('Quick preview opened')\n },\n [announce]\n )\n\n const update = React.useCallback((opts: Partial<QuickPreviewOptions>) => {\n setOptions(prev => ({ ...prev, ...opts }))\n }, [])\n\n React.useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (openRef.current) { close(); return true }\n return false\n })\n return () => sub.remove()\n }, [close])\n\n const value = React.useMemo<QuickPreviewController>(\n () => ({ present, close, update, isOpen: () => openRef.current }),\n [present, close, update]\n )\n\n // Register the static API (layout effect = available ASAP)\n React.useLayoutEffect(() => {\n QuickPreviewStatic._set(value)\n return () => QuickPreviewStatic._set(null)\n }, [value])\n\n return (\n <QuickPreviewContext.Provider value={value}>\n <Host>\n {children}\n {content ? (\n <Portal>\n <QuickPreviewRoot options={options} onRequestClose={close}>\n {content}\n </QuickPreviewRoot>\n </Portal>\n ) : null}\n </Host>\n </QuickPreviewContext.Provider>\n )\n}\n","import React from 'react'\nimport { QuickPreviewContext } from './context'\nimport type { QuickPreviewController } from './types'\n\n/**\n * Access the {@link QuickPreviewController} to open, update, and close previews\n * from inside a React component. Must be called under a mounted `<PreviewProvider>`.\n *\n * @throws if used outside of a `<PreviewProvider>`.\n * @returns the controller: `{ present, close, update, isOpen }`.\n *\n * @example\n * ```tsx\n * function ProductCard({ product }) {\n * const { present } = useQuickPreview()\n * return (\n * <Pressable onLongPress={() => present(<ProductPreview product={product} />, { variant: 'sheet' })}>\n * <Thumbnail source={product.image} />\n * </Pressable>\n * )\n * }\n * ```\n */\nexport function useQuickPreview(): QuickPreviewController {\n const ctx = React.useContext(QuickPreviewContext)\n if (!ctx) throw new Error('useQuickPreview must be used within <PreviewProvider>')\n return ctx\n}\n","import React from 'react'\nimport { Portal } from 'react-native-portalize'\nimport { QuickPreviewOptions } from '../types'\nimport { QuickPreviewRoot } from '../internal/QuickPreviewRoot'\n\n/**\n * Props for the controlled, headless `QuickPreviewComponent`. Extends\n * {@link QuickPreviewOptions} (so `variant`, `size`, `dismissOn*`, and the\n * lifecycle callbacks are all accepted).\n */\nexport type HeadlessQuickPreviewProps = {\n /** Whether the preview is shown. You own this state. */\n visible: boolean\n /** Called when the preview requests to close (backdrop press, swipe, back button). */\n onClose: () => void\n /**\n * Render into a portal above the app. Disable only if you're providing your\n * own host/overlay.\n * @defaultValue `true`\n */\n portal?: boolean\n} & Partial<QuickPreviewOptions> & {\n /** The preview content. */\n children: React.ReactNode\n}\n\n/**\n * A controlled, headless preview component — you own the `visible` state. Useful\n * when you prefer a declarative component over the imperative\n * {@link useQuickPreview} hook or the static `QuickPreview` handle.\n *\n * Exported as `QuickPreviewComponent`.\n *\n * @example\n * ```tsx\n * const [visible, setVisible] = useState(false)\n * <QuickPreviewComponent visible={visible} onClose={() => setVisible(false)} variant=\"sheet\">\n * <Card />\n * </QuickPreviewComponent>\n * ```\n */\nexport function QuickPreview({\n visible,\n onClose,\n portal = true,\n children,\n ...opts\n}: HeadlessQuickPreviewProps) {\n if (!visible) return null\n const node = (\n <QuickPreviewRoot options={opts} onRequestClose={onClose}>\n {children}\n </QuickPreviewRoot>\n )\n return portal ? <Portal>{node}</Portal> : node\n}\n","import React from 'react'\nimport { ScrollView, ScrollViewProps } from 'react-native'\n\n/**\n * A gesture-aware `ScrollView` for use inside preview content. Use it instead of\n * a plain `ScrollView` so that scrolling the content and the swipe-to-dismiss\n * gesture don't fight each other. Accepts all `ScrollViewProps`.\n *\n * @example\n * ```tsx\n * present(\n * <QuickPreviewScrollView>\n * <LongArticle />\n * </QuickPreviewScrollView>,\n * { variant: 'sheet', size: { maxHeight: 520 } }\n * )\n * ```\n */\nexport function QuickPreviewScrollView(props: ScrollViewProps) {\n return <ScrollView nestedScrollEnabled {...props} />\n}\n","import React from 'react'\nimport type { StyleProp, ViewStyle } from 'react-native'\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler'\nimport Animated, {\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { QuickPreview } from '../QuickPreviewAPI'\nimport type { QuickPreviewOptions } from '../types'\n\nexport type QuickPreviewPressableProps = {\n children: React.ReactNode\n /** Called for a normal tap (e.g., navigate) */\n onPress?: () => void\n /** Return the preview node to present */\n renderPreview: () => React.ReactNode\n /** Options forwarded to QuickPreview.present */\n previewOptions?: Partial<QuickPreviewOptions>\n /** Long-press delay (ms). Default 350 */\n delay?: number\n /** Press-down scale. Default 0.98 */\n scale?: number\n /**\n * Called on the JS thread when the long press activates, right before the\n * preview opens. Wire up haptics here, e.g.:\n * onLongPressStart={() => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)}\n * The library deliberately does not import expo-haptics itself: an optional\n * require would break Metro bundling for apps that don't have it installed.\n */\n onLongPressStart?: () => void\n /** Disable all interactions */\n disabled?: boolean\n /** Style applied to the animated wrapper (the thing that scales) */\n style?: StyleProp<ViewStyle>\n /** Accessibility */\n accessible?: boolean\n accessibilityLabel?: string\n testID?: string\n}\n\nexport function QuickPreviewPressable({\n children,\n onPress,\n renderPreview,\n previewOptions,\n delay = 350,\n scale = 0.98,\n onLongPressStart,\n disabled = false,\n style,\n accessible,\n accessibilityLabel,\n testID,\n}: QuickPreviewPressableProps) {\n const s = useSharedValue(1)\n\n // Runs on the JS thread: renderPreview() creates React elements, which must\n // never happen on the UI thread inside a worklet.\n const openPreview = () => {\n onLongPressStart?.()\n QuickPreview.present(renderPreview(), {\n variant: 'popover',\n dismissOnBackdropPress: true,\n ...previewOptions,\n })\n }\n\n const longPress = Gesture.LongPress()\n .enabled(!disabled)\n .minDuration(delay)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onStart(() => {\n runOnJS(openPreview)()\n })\n\n const tap = Gesture.Tap()\n .enabled(!disabled)\n .maxDuration(220)\n .onTouchesDown(() => {\n s.value = withTiming(scale, { duration: 90 })\n })\n .onFinalize(() => {\n s.value = withTiming(1, { duration: 120 })\n })\n .onEnd(() => {\n if (onPress) runOnJS(onPress)()\n })\n\n const gesture = Gesture.Exclusive(longPress, tap)\n\n const animated = useAnimatedStyle(() => ({\n transform: [{ scale: s.value }],\n }))\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n style={[animated, style]}\n accessible={accessible}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n testID={testID}\n >\n {children}\n </Animated.View>\n </GestureDetector>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-quick-preview",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Headless long-press quick preview for React Native. Peek at any content in a popover or sheet, swipe down to dismiss.",
5
5
  "author": "Oliver Lindblad",
6
6
  "license": "MIT",
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
2
  import { StyleSheet, View } from 'react-native'
3
3
  import Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'
4
- import { useSafeAreaInsets } from 'react-native-safe-area-context'
4
+ import { SafeAreaInsetsContext } from 'react-native-safe-area-context'
5
5
  import { QuickPreviewOptions } from '../types'
6
6
  import { Backdrop } from './components/Backdrop'
7
7
  import { SheetContainer } from './components/SheetContainer'
@@ -16,7 +16,13 @@ export function QuickPreviewRoot({
16
16
  onRequestClose: () => void
17
17
  children: React.ReactNode
18
18
  }) {
19
- const { top, bottom } = useSafeAreaInsets()
19
+ // Read insets from context directly so a missing <SafeAreaProvider> degrades
20
+ // to zero insets instead of throwing. useSafeAreaInsets() would crash the host
21
+ // app when no provider is mounted; the peek only needs insets to clear the
22
+ // notch / home indicator, so zero is a safe fallback (provider still recommended).
23
+ const insets = React.useContext(SafeAreaInsetsContext)
24
+ const top = insets?.top ?? 0
25
+ const bottom = insets?.bottom ?? 0
20
26
  const variant = options?.variant ?? 'popover'
21
27
  const dismissOnBackdropPress = options?.dismissOnBackdropPress ?? true
22
28