@thelol3882/sapar 0.0.0-stage → 0.3.0

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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +380 -2
  3. package/dist/adapter-Y9yB3-q3.d.ts +14 -0
  4. package/dist/adapter-fFZPsINL.d.ts +14 -0
  5. package/dist/chunk-7B66QEMY.js +536 -0
  6. package/dist/chunk-7B66QEMY.js.map +1 -0
  7. package/dist/chunk-FM64UDKJ.js +893 -0
  8. package/dist/chunk-FM64UDKJ.js.map +1 -0
  9. package/dist/chunk-VC6XLWM3.js +176 -0
  10. package/dist/chunk-VC6XLWM3.js.map +1 -0
  11. package/dist/chunk-ZBVQGMR4.js +583 -0
  12. package/dist/chunk-ZBVQGMR4.js.map +1 -0
  13. package/dist/cli/index.js +1335 -0
  14. package/dist/core/index.d.ts +273 -0
  15. package/dist/core/index.js +71 -0
  16. package/dist/core/index.js.map +1 -0
  17. package/dist/expo/index.d.ts +189 -0
  18. package/dist/expo/index.js +39 -0
  19. package/dist/expo/index.js.map +1 -0
  20. package/dist/expo-router/index.d.ts +18 -0
  21. package/dist/expo-router/index.js +46 -0
  22. package/dist/expo-router/index.js.map +1 -0
  23. package/dist/next/index.d.ts +18 -0
  24. package/dist/next/index.js +49 -0
  25. package/dist/next/index.js.map +1 -0
  26. package/dist/presentation-CClsPRT6.d.ts +12 -0
  27. package/dist/react/index.d.ts +35 -0
  28. package/dist/react/index.js +29 -0
  29. package/dist/react/index.js.map +1 -0
  30. package/dist/rtk/index.d.ts +751 -0
  31. package/dist/rtk/index.js +114 -0
  32. package/dist/rtk/index.js.map +1 -0
  33. package/dist/stepCount-CTYYFWiV.d.ts +57 -0
  34. package/dist/types-CHD2pB5X.d.ts +192 -0
  35. package/dist/web/index.d.ts +112 -0
  36. package/dist/web/index.js +34 -0
  37. package/dist/web/index.js.map +1 -0
  38. package/package.json +147 -3
  39. package/templates/expo/AnnouncementModal.tsx +102 -0
  40. package/templates/expo/TourCard.tsx +112 -0
  41. package/templates/expo/WhatsNewButton.tsx +87 -0
  42. package/templates/expo/WhatsNewPanel.tsx +167 -0
  43. package/templates/mantine/AnnouncementModal.tsx +66 -0
  44. package/templates/mantine/TourCard.tsx +84 -0
  45. package/templates/mantine/WhatsNewButton.tsx +62 -0
  46. package/templates/mantine/WhatsNewPanel.tsx +129 -0
  47. package/templates/tailwind/AnnouncementModal.tsx +100 -0
  48. package/templates/tailwind/TourCard.tsx +69 -0
  49. package/templates/tailwind/WhatsNewButton.tsx +56 -0
  50. package/templates/tailwind/WhatsNewPanel.tsx +174 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/expo/adapter.ts","../src/expo/measure.ts","../src/expo/registry.ts","../src/expo/scrollIntoView.ts","../src/expo/stores.ts","../src/expo/useTourAnchor.ts","../src/expo/assignRef.ts","../src/expo/scrollContainer.tsx","../src/expo/cardPosition.ts","../src/expo/useAnchorRect.ts","../src/expo/TourPopover.tsx","../src/expo/useIsCompact.ts","../src/expo/useKeyboardHeight.ts","../src/expo/TourSpotlight.tsx","../src/expo/useHardwareBackSkip.ts","../src/expo/TourOverlay.tsx","../src/expo/TourStep.tsx"],"sourcesContent":["import { AccessibilityInfo, Dimensions } from 'react-native';\nimport type { AnchorHandle, PlatformAdapter, SessionStore } from '../core';\nimport { measureInWindow } from './measure';\nimport { getAnchor, subscribeToPress, waitForAnchor } from './registry';\nimport { scrollAnchorIntoView } from './scrollIntoView';\nimport { appSessionStore } from './stores';\n\nexport interface ExpoAdapterOptions {\n /** Push navigation, e.g. `router.push`. */\n navigate: (route: string) => void | Promise<void>;\n /** The route the host router currently reports. */\n currentRoute: () => string;\n /** With `presentation=\"auto\"`, windows narrower than this always get the bottom sheet. Default 0: never. */\n compactBreakpointPx?: number;\n session?: SessionStore;\n}\n\nconst nextFrame = (): Promise<void> => new Promise((resolve) => requestAnimationFrame(() => resolve()));\n\n// The adapter method is synchronous, so the platform's async answer is cached and kept fresh by its event.\nfunction trackReducedMotion(): () => boolean {\n let enabled = false;\n void AccessibilityInfo.isReduceMotionEnabled().then((value) => {\n enabled = value;\n });\n AccessibilityInfo.addEventListener('reduceMotionChanged', (value) => {\n enabled = value;\n });\n return () => enabled;\n}\n\n// The view is looked up on every call because it can remount under the same key.\nfunction createHandle(key: string): AnchorHandle {\n return {\n key,\n measure: async () => {\n const anchor = getAnchor(key);\n return anchor ? measureInWindow(anchor.instance) : null;\n },\n onPress: (listener) => subscribeToPress(key, listener),\n };\n}\n\nexport function createExpoAdapter(options: ExpoAdapterOptions): PlatformAdapter {\n const { compactBreakpointPx = 0 } = options;\n\n return {\n platform: 'native',\n async resolveAnchor(key, { timeoutMs }) {\n const anchor = await waitForAnchor(key, timeoutMs);\n return anchor ? createHandle(key) : null;\n },\n async scrollIntoView(handle, { reducedMotion }) {\n const anchor = getAnchor(handle.key);\n if (anchor) await scrollAnchorIntoView(anchor, reducedMotion);\n },\n currentRoute: options.currentRoute,\n async navigate(route) {\n await options.navigate(route);\n await nextFrame();\n },\n prefersReducedMotion: trackReducedMotion(),\n isCompact: () => Dimensions.get('window').width < compactBreakpointPx,\n session: options.session ?? appSessionStore(),\n now: Date.now,\n };\n}\n","import type { AnchorRect } from '../core';\nimport type { AnchorInstance } from './registry';\n\ntype MeasureCallback = (x: number, y: number, width: number, height: number) => void;\n\n// A detached view reports a zero (or missing) size, which would read as a real anchor at the origin.\nfunction toRect(x: number, y: number, width: number, height: number): AnchorRect | null {\n return width > 0 && height > 0 ? { x, y, width, height } : null;\n}\n\nexport function measureInWindow(instance: Pick<AnchorInstance, 'measureInWindow'>): Promise<AnchorRect | null> {\n return new Promise((resolve) => {\n const onMeasured: MeasureCallback = (...measurement) => resolve(toRect(...measurement));\n instance.measureInWindow(onMeasured);\n });\n}\n\n/** Position of `instance` relative to `ancestor`, which must be one of its native ancestors. */\nexport function measureLayout(\n instance: Pick<AnchorInstance, 'measureLayout'>,\n ancestor: AnchorInstance,\n): Promise<AnchorRect | null> {\n return new Promise((resolve) => {\n const onMeasured: MeasureCallback = (...measurement) => resolve(toRect(...measurement));\n instance.measureLayout(ancestor, onMeasured, () => resolve(null));\n });\n}\n","import type { ComponentRef } from 'react';\nimport type { View } from 'react-native';\nimport type { ScrollContainer } from './scrollContainer';\n\nexport type AnchorInstance = ComponentRef<typeof View>;\n\nexport interface RegisteredAnchor {\n instance: AnchorInstance;\n /** The scroll container the anchor lived in when it registered. */\n container: ScrollContainer | null;\n}\n\nconst anchors = new Map<string, RegisteredAnchor>();\nconst waiters = new Map<string, Set<(anchor: RegisteredAnchor) => void>>();\nconst pressListeners = new Map<string, Set<() => void>>();\n\nfunction addToSet<T>(sets: Map<string, Set<T>>, key: string, item: T): () => void {\n const set = sets.get(key) ?? new Set<T>();\n sets.set(key, set);\n set.add(item);\n return () => {\n set.delete(item);\n if (set.size === 0 && sets.get(key) === set) sets.delete(key);\n };\n}\n\nexport function registerAnchor(key: string, anchor: RegisteredAnchor): () => void {\n anchors.set(key, anchor);\n [...(waiters.get(key) ?? [])].forEach((resolve) => resolve(anchor));\n\n return () => {\n if (anchors.get(key) === anchor) anchors.delete(key);\n };\n}\n\nexport function getAnchor(key: string): RegisteredAnchor | null {\n return anchors.get(key) ?? null;\n}\n\n/** Resolves `null` on timeout. Woken by registration. */\nexport function waitForAnchor(key: string, timeoutMs: number): Promise<RegisteredAnchor | null> {\n const present = getAnchor(key);\n if (present) return Promise.resolve(present);\n\n return new Promise((resolve) => {\n const stopWaiting = addToSet(waiters, key, settle);\n const timer = setTimeout(() => settle(null), timeoutMs);\n\n function settle(anchor: RegisteredAnchor | null): void {\n clearTimeout(timer);\n stopWaiting();\n resolve(anchor);\n }\n });\n}\n\nexport function subscribeToPress(key: string, listener: () => void): () => void {\n return addToSet(pressListeners, key, listener);\n}\n\nexport function notifyPress(key: string): void {\n [...(pressListeners.get(key) ?? [])].forEach((listener) => listener());\n}\n","import type { ContainerMeasurement } from './scrollContainer';\nimport type { RegisteredAnchor } from './registry';\n\nconst SCROLL_SETTLE_MS = 350;\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function centeredOffset({ offsetY, height, viewportHeight }: ContainerMeasurement): number {\n return Math.max(0, offsetY - (viewportHeight - height) / 2);\n}\n\n/** Centres the anchor in its scroll container. A native animated scroll reports no end, so wait a fixed moment. */\nexport async function scrollAnchorIntoView({ instance, container }: RegisteredAnchor, reducedMotion: boolean): Promise<void> {\n const measurement = await container?.measure(instance);\n if (!container || !measurement) return;\n\n const animated = !reducedMotion;\n container.scrollToOffset(centeredOffset(measurement), animated);\n if (animated) await delay(SCROLL_SETTLE_MS);\n}\n","import type { KeyValueStore, SessionStore } from '../core';\n\n/** The part of `@react-native-async-storage/async-storage` the tours use. */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/** The part of a `react-native-mmkv` instance the tours use: `remove` since v4, `delete` before. */\nexport type MmkvLike = {\n getString(key: string): string | undefined;\n set(key: string, value: string): void;\n} & ({ remove(key: string): void } | { delete(key: string): void });\n\nexport const asyncStorageStore = (storage: AsyncStorageLike): KeyValueStore => ({\n get: (key) => storage.getItem(key),\n set: (key, value) => storage.setItem(key, value),\n remove: (key) => storage.removeItem(key),\n});\n\nexport const mmkvStore = (mmkv: MmkvLike): KeyValueStore => ({\n get: (key) => mmkv.getString(key) ?? null,\n set: (key, value) => mmkv.set(key, value),\n remove: (key) => ('remove' in mmkv ? mmkv.remove(key) : mmkv.delete(key)),\n});\n\n/** Lives as long as the JS runtime, which is what an app session is. */\nexport function appSessionStore(): SessionStore {\n const values = new Map<string, string>();\n return {\n get: (key) => values.get(key) ?? null,\n set: (key, value) => void values.set(key, value),\n };\n}\n","import { useCallback, type Ref, type RefCallback } from 'react';\nimport type { GestureResponderEvent } from 'react-native';\nimport { assignRef } from './assignRef';\nimport { notifyPress, registerAnchor, type AnchorInstance } from './registry';\nimport { useTourScrollContainer } from './scrollContainer';\n\nexport interface TourAnchorProps {\n ref: RefCallback<AnchorInstance>;\n /** Keeps the native node alive on Android so it stays measurable. */\n collapsable: false;\n /** Reports presses without taking the responder from the host's own `Pressable`. */\n onTouchEnd: (event: GestureResponderEvent) => void;\n}\n\n/** What the anchored view already has: spreading the result would overwrite it, so it is passed in and composed. */\nexport interface TourAnchorHost {\n ref?: Ref<AnchorInstance>;\n onTouchEnd?: (event: GestureResponderEvent) => void;\n}\n\n/**\n * Spread the result onto the view a tour step points at: `<Pressable {...useTourAnchor('billing.upgrade')} />`.\n * A view that has its own `ref` or `onTouchEnd` passes them as `host`; its `onPress` needs no help.\n */\nexport function useTourAnchor<K extends string = string>(\n key: K,\n { ref: hostRef, onTouchEnd: hostOnTouchEnd }: TourAnchorHost = {},\n): TourAnchorProps {\n const container = useTourScrollContainer();\n const ref = useCallback<RefCallback<AnchorInstance>>(\n (instance) => {\n assignRef(hostRef, instance);\n if (!instance) return undefined;\n\n const unregister = registerAnchor(key, { instance, container });\n return () => {\n unregister();\n assignRef(hostRef, null);\n };\n },\n [key, container, hostRef],\n );\n const onTouchEnd = useCallback(\n (event: GestureResponderEvent) => {\n hostOnTouchEnd?.(event);\n notifyPress(key);\n },\n [key, hostOnTouchEnd],\n );\n return { ref, collapsable: false, onTouchEnd };\n}\n","import type { Ref } from 'react';\n\nexport function assignRef<T>(ref: Ref<T> | undefined, value: T | null): void {\n if (typeof ref === 'function') ref(value);\n else if (ref) ref.current = value;\n}\n","import { createContext, forwardRef, useCallback, useContext, useMemo, useRef, type ComponentRef } from 'react';\nimport { ScrollView, type NativeScrollEvent, type NativeSyntheticEvent, type ScrollViewProps } from 'react-native';\nimport { assignRef } from './assignRef';\nimport { measureInWindow, measureLayout } from './measure';\nimport type { AnchorInstance } from './registry';\n\nexport interface ContainerMeasurement {\n /** Top edge of the anchor within the scrollable content. */\n offsetY: number;\n height: number;\n viewportHeight: number;\n}\n\n/** A vertically scrolling parent that tour anchors can be scrolled into view within. */\nexport interface ScrollContainer {\n measure(instance: AnchorInstance): Promise<ContainerMeasurement | null>;\n scrollToOffset(offsetY: number, animated: boolean): void;\n /** Calls `listener` at most once per frame while the user or the tour scrolls. */\n subscribeToScroll(listener: () => void): () => void;\n}\n\ninterface ScrollEmitter {\n subscribe: ScrollContainer['subscribeToScroll'];\n emit(): void;\n}\n\nconst SCROLL_EVENT_THROTTLE_MS = 16;\n\ntype ScrollViewInstance = ComponentRef<typeof ScrollView>;\n\nconst ScrollContainerContext = createContext<ScrollContainer | null>(null);\n\n/** The nearest `TourScrollView` above the caller, if any. */\nexport function useTourScrollContainer(): ScrollContainer | null {\n return useContext(ScrollContainerContext);\n}\n\nfunction createScrollEmitter(): ScrollEmitter {\n const listeners = new Set<() => void>();\n let pendingFrame: number | null = null;\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => void listeners.delete(listener);\n },\n emit() {\n if (pendingFrame !== null) return;\n pendingFrame = requestAnimationFrame(() => {\n pendingFrame = null;\n [...listeners].forEach((listener) => listener());\n });\n },\n };\n}\n\nfunction createScrollContainer(getScrollView: () => ScrollViewInstance | null, emitter: ScrollEmitter): ScrollContainer {\n return {\n async measure(instance) {\n const scrollView = getScrollView();\n const content = scrollView?.getInnerViewRef();\n if (!scrollView || !content) return null;\n\n const [layout, viewport] = await Promise.all([measureLayout(instance, content), measureInWindow(scrollView)]);\n return layout && viewport ? { offsetY: layout.y, height: layout.height, viewportHeight: viewport.height } : null;\n },\n scrollToOffset: (offsetY, animated) => getScrollView()?.scrollTo({ y: offsetY, animated }),\n subscribeToScroll: emitter.subscribe,\n };\n}\n\n/** A drop-in `ScrollView` whose children's anchors can be scrolled into view by the tour. Vertical only. */\nexport const TourScrollView = forwardRef<ScrollViewInstance, ScrollViewProps>(function TourScrollView(props, forwardedRef) {\n const { onScroll } = props;\n const scrollViewRef = useRef<ScrollViewInstance | null>(null);\n const emitter = useMemo(createScrollEmitter, []);\n const container = useMemo(() => createScrollContainer(() => scrollViewRef.current, emitter), [emitter]);\n const handleScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n emitter.emit();\n onScroll?.(event);\n },\n [emitter, onScroll],\n );\n const setScrollView = useCallback(\n (node: ScrollViewInstance | null) => {\n scrollViewRef.current = node;\n assignRef(forwardedRef, node);\n },\n [forwardedRef],\n );\n\n return (\n <ScrollContainerContext.Provider value={container}>\n <ScrollView scrollEventThrottle={SCROLL_EVENT_THROTTLE_MS} {...props} onScroll={handleScroll} ref={setScrollView} />\n </ScrollContainerContext.Provider>\n );\n});\n","import type { AnchorRect, Placement } from '../core';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Insets {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\ntype Side = Exclude<Placement, 'auto'>;\n\nexport interface CardPositionInput {\n /** Null centers the card in the window. */\n anchor: AnchorRect | null;\n card: Size;\n window: Size;\n placement: Placement;\n /** Gap between the anchor and the card. */\n offset: number;\n /** Space the card must keep clear at each window edge. */\n insets: Insets;\n}\n\ntype Point = Pick<CardPosition, 'x' | 'y'>;\n\nexport interface CardPosition {\n x: number;\n y: number;\n /** False when neither the preferred side of the anchor nor the opposite one has room for the card. */\n fits: boolean;\n}\n\nconst OPPOSITE_SIDE: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\nconst clamp = (value: number, min: number, max: number): number => Math.max(min, Math.min(value, max));\n\nfunction spaceOnSide(side: Side, { anchor, window, insets, offset }: CardPositionInput & { anchor: AnchorRect }): number {\n switch (side) {\n case 'bottom':\n return window.height - insets.bottom - (anchor.y + anchor.height) - offset;\n case 'top':\n return anchor.y - insets.top - offset;\n case 'right':\n return window.width - insets.right - (anchor.x + anchor.width) - offset;\n case 'left':\n return anchor.x - insets.left - offset;\n }\n}\n\nconst preferredSide = (placement: Placement): Side => (placement === 'auto' ? 'bottom' : placement);\n\nfunction findSideWithRoom(input: CardPositionInput & { anchor: AnchorRect }): Side | null {\n const preferred = preferredSide(input.placement);\n const needed = preferred === 'top' || preferred === 'bottom' ? input.card.height : input.card.width;\n const hasRoom = (side: Side): boolean => spaceOnSide(side, input) >= needed;\n return [preferred, OPPOSITE_SIDE[preferred]].find(hasRoom) ?? null;\n}\n\nfunction positionBesideAnchor(side: Side, { anchor, card, offset }: CardPositionInput & { anchor: AnchorRect }): Point {\n const centeredX = anchor.x + (anchor.width - card.width) / 2;\n const centeredY = anchor.y + (anchor.height - card.height) / 2;\n switch (side) {\n case 'bottom':\n return { x: centeredX, y: anchor.y + anchor.height + offset };\n case 'top':\n return { x: centeredX, y: anchor.y - offset - card.height };\n case 'right':\n return { x: anchor.x + anchor.width + offset, y: centeredY };\n case 'left':\n return { x: anchor.x - offset - card.width, y: centeredY };\n }\n}\n\nfunction placeCard(input: CardPositionInput): Point & Pick<CardPosition, 'fits'> {\n const { anchor, card, window } = input;\n if (!anchor) return { x: (window.width - card.width) / 2, y: (window.height - card.height) / 2, fits: true };\n\n const anchored = { ...input, anchor };\n const side = findSideWithRoom(anchored);\n return { ...positionBesideAnchor(side ?? preferredSide(input.placement), anchored), fits: side !== null };\n}\n\n/** Top-left corner for the card: on the preferred side, flipped when it does not fit, and kept inside the insets. */\nexport function computeCardPosition(input: CardPositionInput): CardPosition {\n const { card, window, insets } = input;\n const { x, y, fits } = placeCard(input);\n\n return {\n x: clamp(x, insets.left, window.width - insets.right - card.width),\n y: clamp(y, insets.top, window.height - insets.bottom - card.height),\n fits,\n };\n}\n","import { useEffect, useState } from 'react';\nimport { useWindowDimensions } from 'react-native';\nimport type { AnchorHandle, AnchorRect } from '../core';\nimport { getAnchor } from './registry';\n\n// Native layout settles after the step is shown (scroll ends, screens finish transitioning), so measure a few more times.\nconst SETTLE_POLL_COUNT = 5;\nconst SETTLE_POLL_INTERVAL_MS = 120;\n\nconst sameRect = (a: AnchorRect | null, b: AnchorRect | null): boolean =>\n a === b || (!!a && !!b && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height);\n\ninterface Measured {\n handle: AnchorHandle;\n rect: AnchorRect | null;\n}\n\n/** Window rect of the anchor; null without a handle or while it cannot be measured. Re-measures when the window resizes or its scroll container scrolls. */\nexport function useAnchorRect(handle: AnchorHandle | null): AnchorRect | null {\n const { width, height } = useWindowDimensions();\n const [measured, setMeasured] = useState<Measured | null>(null);\n\n useEffect(() => {\n if (!handle) {\n setMeasured(null);\n return;\n }\n let cancelled = false;\n\n async function measure(current: AnchorHandle): Promise<void> {\n const rect = await current.measure();\n if (cancelled) return;\n setMeasured((previous) =>\n previous?.handle === current && sameRect(previous.rect, rect) ? previous : { handle: current, rect },\n );\n }\n\n void measure(handle);\n const stopFollowingScroll = getAnchor(handle.key)?.container?.subscribeToScroll(() => void measure(handle));\n let polls = 0;\n const timer = setInterval(() => {\n void measure(handle);\n if (++polls >= SETTLE_POLL_COUNT) clearInterval(timer);\n }, SETTLE_POLL_INTERVAL_MS);\n\n return () => {\n cancelled = true;\n clearInterval(timer);\n stopFollowingScroll?.();\n };\n }, [handle, width, height]);\n\n return handle && measured?.handle === handle ? measured.rect : null;\n}\n","import { useCallback, useState, type ReactNode } from 'react';\nimport { StyleSheet, useWindowDimensions, View, type LayoutChangeEvent, type StyleProp, type ViewStyle } from 'react-native';\nimport { resolvePresentation, type Presentation, type AnchorRect, type Placement } from '../core';\nimport { useTourStep } from '../react';\nimport { computeCardPosition, type CardPosition, type Insets, type Size } from './cardPosition';\nimport { useAnchorRect } from './useAnchorRect';\nimport { useIsCompact } from './useIsCompact';\nimport { useKeyboardHeight } from './useKeyboardHeight';\n\nconst DEFAULT_OFFSET_PX = 12;\nconst KEYBOARD_GAP_PX = 8;\nconst DEFAULT_INSETS: Insets = { top: 8, right: 8, bottom: 8, left: 8 };\n\nconst styles = StyleSheet.create({\n centered: { ...StyleSheet.absoluteFill, justifyContent: 'center', alignItems: 'center' },\n sheet: { position: 'absolute', left: 0, right: 0, bottom: 0 },\n // Positioned by transform so the card is measured at its natural width wherever it ends up.\n anchored: { position: 'absolute', top: 0, left: 0 },\n hidden: { opacity: 0 },\n});\n\nexport interface TourPopoverProps {\n style?: StyleProp<ViewStyle>;\n /** Gap between the anchor and the card. */\n offset?: number;\n /** Space kept clear at the window edges; pass the safe-area insets and any tab bar height. Default 8 each. */\n insets?: Partial<Insets>;\n /**\n * `'anchored'` puts the card next to the anchor (centred without one), `'sheet'` is a bottom sheet, and\n * `'auto'` is anchored unless the card does not fit beside the anchor or the window is narrower than the\n * adapter's `compactBreakpointPx`. Default `'auto'`.\n */\n presentation?: Presentation;\n children?: ReactNode;\n}\n\ntype SurfaceProps = Pick<TourPopoverProps, 'style' | 'children'> & { insets: Insets };\n\nconst paddingFor = ({ top, right, bottom, left }: Insets): ViewStyle => ({\n paddingTop: top,\n paddingRight: right,\n paddingBottom: bottom,\n paddingLeft: left,\n});\n\nfunction Sheet({ insets, style, children }: SurfaceProps) {\n return (\n <View pointerEvents=\"box-none\" style={[styles.sheet, paddingFor({ ...insets, top: 0 }), style]}>\n {children}\n </View>\n );\n}\n\nfunction CenteredCard({ insets, style, children }: SurfaceProps) {\n return (\n <View pointerEvents=\"box-none\" style={[styles.centered, paddingFor(insets), style]}>\n {children}\n </View>\n );\n}\n\ninterface AnchoredCardProps extends Pick<SurfaceProps, 'style' | 'children'> {\n position: CardPosition | null;\n onLayout: (event: LayoutChangeEvent) => void;\n}\n\nfunction AnchoredCard({ position, onLayout, style, children }: AnchoredCardProps) {\n const transform = position ? [{ translateX: position.x }, { translateY: position.y }] : undefined;\n\n return (\n <View onLayout={onLayout} style={[styles.anchored, { transform }, !position && styles.hidden, style]}>\n {children}\n </View>\n );\n}\n\ninterface PopoverProps extends Required<Pick<TourPopoverProps, 'offset' | 'presentation'>>, Pick<SurfaceProps, 'style' | 'children'> {\n rect: AnchorRect | null;\n placement: Placement;\n insets: Insets;\n}\n\n// The card is measured only while anchored, so a sheet keeps the size it had there and can return once it fits again.\nfunction Popover({ rect, placement, offset, presentation, insets, ...appearance }: PopoverProps) {\n const compact = useIsCompact();\n const window = useWindowDimensions();\n const keyboardHeight = useKeyboardHeight();\n const [card, setCard] = useState<Size | null>(null);\n const handleLayout = useCallback(({ nativeEvent: { layout } }: LayoutChangeEvent) => {\n setCard((previous) =>\n previous?.width === layout.width && previous.height === layout.height\n ? previous\n : { width: layout.width, height: layout.height },\n );\n }, []);\n\n // The keyboard covers the tab bar and home indicator, so clear whichever reaches higher.\n const bottom = keyboardHeight > 0 ? Math.max(insets.bottom, keyboardHeight + KEYBOARD_GAP_PX) : insets.bottom;\n const clearedInsets = { ...insets, bottom };\n const position = card && computeCardPosition({ anchor: rect, card, window, placement, offset, insets: clearedInsets });\n\n switch (resolvePresentation({ presentation, compact, fits: position?.fits })) {\n case 'sheet':\n return <Sheet {...appearance} insets={clearedInsets} />;\n case 'anchored':\n return rect ? (\n <AnchoredCard {...appearance} position={position} onLayout={handleLayout} />\n ) : (\n <CenteredCard {...appearance} insets={clearedInsets} />\n );\n }\n}\n\n/** Render at the root after `TourSpotlight`. Sits next to the anchor, centred without one, and is a bottom sheet when it does not fit. */\nexport function TourPopover({ offset = DEFAULT_OFFSET_PX, insets, presentation = 'auto', ...rest }: TourPopoverProps) {\n const tourStep = useTourStep();\n const rect = useAnchorRect(tourStep?.handle ?? null);\n if (!tourStep) return null;\n\n return (\n <Popover\n {...rest}\n key={`${tourStep.tour.key}:${tourStep.step.key}`}\n placement={tourStep.step.placement}\n offset={offset}\n presentation={presentation}\n insets={{ ...DEFAULT_INSETS, ...insets }}\n rect={rect}\n />\n );\n}\n","import { useWindowDimensions } from 'react-native';\nimport { useSaparAdapter } from '../react';\n\nexport function useIsCompact(): boolean {\n // Subscribing to the window size re-renders on rotation, when the adapter's answer can change.\n useWindowDimensions();\n return useSaparAdapter()?.isCompact() ?? false;\n}\n","import { useEffect, useState } from 'react';\nimport { Keyboard, type KeyboardEvent } from 'react-native';\n\n/** Height of the on-screen keyboard, 0 while hidden. iOS fires the `Will` events, Android only the `Did` ones. */\nexport function useKeyboardHeight(): number {\n const [height, setHeight] = useState(0);\n\n useEffect(() => {\n const show = ({ endCoordinates }: KeyboardEvent) => setHeight(endCoordinates.height);\n const hide = () => setHeight(0);\n const subscriptions = [\n Keyboard.addListener('keyboardWillShow', show),\n Keyboard.addListener('keyboardDidShow', show),\n Keyboard.addListener('keyboardWillHide', hide),\n Keyboard.addListener('keyboardDidHide', hide),\n ];\n return () => subscriptions.forEach((subscription) => subscription.remove());\n }, []);\n\n return height;\n}\n","import { StyleSheet, useWindowDimensions, type StyleProp, type ViewStyle } from 'react-native';\nimport Svg, { Path } from 'react-native-svg';\nimport { spotlightPath, type AnchorHandle } from '../core';\nimport { useTourStep } from '../react';\nimport { useAnchorRect } from './useAnchorRect';\n\nconst DEFAULT_COLOR = 'rgba(0, 0, 0, 0.5)';\nconst DEFAULT_RADIUS = 8;\n\nexport interface TourSpotlightProps {\n /** Colour of the dim layer. */\n color?: string;\n style?: StyleProp<ViewStyle>;\n /** Corner radius of the cutout. */\n radius?: number;\n /** Called when the dim layer is pressed. Defaults to skipping the tour. */\n onClickOutside?: () => void;\n}\n\ninterface SpotlightProps extends TourSpotlightProps {\n handle: AnchorHandle | null;\n padding: number;\n onClickOutside: () => void;\n}\n\nfunction Spotlight({ handle, padding, onClickOutside, color = DEFAULT_COLOR, radius = DEFAULT_RADIUS, style }: SpotlightProps) {\n const rect = useAnchorRect(handle);\n const window = useWindowDimensions();\n\n return (\n <Svg\n width={window.width}\n height={window.height}\n style={[StyleSheet.absoluteFill, style]}\n pointerEvents=\"box-none\"\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n >\n {/* The hole is unpainted, so presses inside it reach the real element underneath. */}\n <Path d={spotlightPath({ rect, padding, radius, bounds: window })} fill={color} fillRule=\"evenodd\" onPress={onClickOutside} />\n </Svg>\n );\n}\n\n/** Render at the root, inside the provider and after the app content, so it covers the screen. */\nexport function TourSpotlight({ onClickOutside, ...rest }: TourSpotlightProps) {\n const tourStep = useTourStep();\n if (!tourStep) return null;\n\n return (\n <Spotlight\n {...rest}\n handle={tourStep.handle}\n padding={tourStep.step.padding}\n onClickOutside={onClickOutside ?? tourStep.skip}\n />\n );\n}\n","import { useEffect } from 'react';\nimport { BackHandler } from 'react-native';\n\n/** While `skip` is given, the Android back button calls it instead of leaving the screen. */\nexport function useHardwareBackSkip(skip: (() => void) | undefined): void {\n useEffect(() => {\n if (!skip) return;\n const subscription = BackHandler.addEventListener('hardwareBackPress', () => {\n skip();\n return true;\n });\n return () => subscription.remove();\n }, [skip]);\n}\n","import type { ReactNode } from 'react';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { useTourStep, type TourStepState } from '../react';\nimport { TourPopover, type TourPopoverProps } from './TourPopover';\nimport { TourSpotlight } from './TourSpotlight';\nimport { useHardwareBackSkip } from './useHardwareBackSkip';\n\nexport interface TourOverlayProps extends Pick<TourPopoverProps, 'insets' | 'presentation'> {\n spotlightColor?: string;\n spotlightStyle?: StyleProp<ViewStyle>;\n popoverStyle?: StyleProp<ViewStyle>;\n onClickOutside?: () => void;\n /** The step card, either directly or built from the running step. */\n children: ReactNode | ((tourStep: TourStepState) => ReactNode);\n}\n\n/** Render at the root, inside the provider and after the app content. The Android back button skips the tour. */\nexport function TourOverlay({ spotlightColor, spotlightStyle, popoverStyle, onClickOutside, insets, presentation, children }: TourOverlayProps) {\n const tourStep = useTourStep();\n useHardwareBackSkip(tourStep?.skip);\n if (!tourStep) return null;\n\n return (\n <>\n <TourSpotlight color={spotlightColor} style={spotlightStyle} onClickOutside={onClickOutside} />\n <TourPopover style={popoverStyle} insets={insets} presentation={presentation}>\n {typeof children === 'function' ? children(tourStep) : children}\n </TourPopover>\n </>\n );\n}\n","import { createContext, useContext, useEffect, type ReactNode } from 'react';\nimport {\n AccessibilityInfo,\n Pressable,\n Text,\n View,\n type GestureResponderEvent,\n type PressableProps,\n type StyleProp,\n type TextProps,\n type TextStyle,\n type ViewProps,\n} from 'react-native';\nimport {\n defaultAnnounceStep,\n defaultProgress,\n useTourStep,\n type StepAnnouncement,\n type StepCount,\n type TourStepState,\n} from '../react';\n\nconst TourStepContext = createContext<TourStepState | null>(null);\n\nfunction useStepState(): TourStepState {\n const tourStep = useContext(TourStepContext);\n if (!tourStep) throw new Error('TourStep parts must be rendered inside <TourStep.Root>.');\n return tourStep;\n}\n\nexport interface TourStepRootProps extends ViewProps {\n /** Text read by screen readers on each step change. */\n announceStep?: (step: StepAnnouncement) => string;\n}\n\nfunction Dialog({ tourStep, announceStep = defaultAnnounceStep, children, ...rest }: TourStepRootProps & { tourStep: TourStepState }) {\n const { step, position, total } = tourStep;\n\n // Keyed on the step alone: an inline `announceStep` has a new identity every render and would repeat itself.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => AccessibilityInfo.announceForAccessibility(announceStep({ position, total, title: step.title })), [step.key]);\n\n return (\n <TourStepContext.Provider value={tourStep}>\n <View {...rest} role=\"dialog\" accessibilityViewIsModal={false}>\n {children}\n </View>\n </TourStepContext.Provider>\n );\n}\n\nfunction Root(props: TourStepRootProps) {\n const tourStep = useTourStep();\n return tourStep ? <Dialog {...props} tourStep={tourStep} /> : null;\n}\n\nfunction Title({ children, ...rest }: TextProps) {\n const { step } = useStepState();\n return (\n <Text role=\"heading\" {...rest}>\n {children ?? step.title}\n </Text>\n );\n}\n\nfunction Body({ children, ...rest }: TextProps) {\n const { step } = useStepState();\n return <Text {...rest}>{children ?? step.body}</Text>;\n}\n\nexport interface TourStepProgressProps extends Omit<TextProps, 'children'> {\n /** Defaults to `\"{position} / {total}\"`. */\n children?: ReactNode | ((count: StepCount) => ReactNode);\n}\n\nfunction Progress({ children, ...rest }: TourStepProgressProps) {\n const { position, total } = useStepState();\n const count = { position, total };\n const content = typeof children === 'function' ? children(count) : (children ?? defaultProgress(count));\n return <Text {...rest}>{content}</Text>;\n}\n\nexport interface TourStepButtonProps extends Omit<PressableProps, 'children'> {\n children?: ReactNode;\n /** Styles the label; the button itself takes `style`, which may be a function of the pressed state. */\n textStyle?: StyleProp<TextStyle>;\n}\n\nfunction Button({ children, textStyle, ...rest }: TourStepButtonProps) {\n return (\n <Pressable role=\"button\" {...rest}>\n <Text style={textStyle}>{children}</Text>\n </Pressable>\n );\n}\n\nfunction runThen(handler: PressableProps['onPress'], action: () => unknown) {\n return (event: GestureResponderEvent): void => {\n handler?.(event);\n void action();\n };\n}\n\nexport interface TourStepNextProps extends TourStepButtonProps {\n /** Labels for the last step and the others. Ignored when `children` is given. */\n doneLabel?: ReactNode;\n nextLabel?: ReactNode;\n /** Steps that advance when the anchor is pressed hide this button unless set. */\n showOnPress?: boolean;\n}\n\nfunction Next({ doneLabel = 'Done', nextLabel = 'Next', showOnPress = false, children, onPress, ...rest }: TourStepNextProps) {\n const tourStep = useStepState();\n if (tourStep.step.advanceOn === 'press' && !showOnPress) return null;\n\n return (\n <Button {...rest} onPress={runThen(onPress, tourStep.next)}>\n {children ?? (tourStep.isLast ? doneLabel : nextLabel)}\n </Button>\n );\n}\n\nfunction Back({ children = 'Back', onPress, ...rest }: TourStepButtonProps) {\n const tourStep = useStepState();\n if (tourStep.isFirst) return null;\n\n return (\n <Button {...rest} onPress={runThen(onPress, tourStep.previous)}>\n {children}\n </Button>\n );\n}\n\nfunction Skip({ children = 'Skip', onPress, ...rest }: TourStepButtonProps) {\n const { skip } = useStepState();\n return (\n <Button {...rest} onPress={runThen(onPress, skip)}>\n {children}\n </Button>\n );\n}\n\nfunction Close({ children = '×', ...rest }: TourStepButtonProps) {\n return (\n <Skip accessibilityLabel=\"Close tour\" {...rest}>\n {children}\n </Skip>\n );\n}\n\nexport const TourStep = { Root, Title, Body, Progress, Next, Back, Skip, Close };\n"],"mappings":"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","names":["useCallback","TourScrollView","useCallback","useCallback","useState","useWindowDimensions","useWindowDimensions","useWindowDimensions","useEffect","useState","jsx","useWindowDimensions","useState","useCallback","StyleSheet","useWindowDimensions","jsx","useWindowDimensions","StyleSheet","useEffect","jsx","createContext","useContext","useEffect","AccessibilityInfo","View","jsx","createContext","useContext","useEffect","AccessibilityInfo","View"]}