@korsolutions/guidon 1.0.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.
- package/README.md +334 -0
- package/dist/index-D_JFvCIg.d.mts +314 -0
- package/dist/index-D_JFvCIg.d.ts +314 -0
- package/dist/index.d.mts +128 -0
- package/dist/index.d.ts +128 -0
- package/dist/index.js +1098 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1073 -0
- package/dist/index.mjs.map +1 -0
- package/dist/persistence/index.d.mts +2 -0
- package/dist/persistence/index.d.ts +2 -0
- package/dist/persistence/index.js +300 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/index.mjs +291 -0
- package/dist/persistence/index.mjs.map +1 -0
- package/package.json +76 -0
- package/src/components/GuidonOverlay.tsx +159 -0
- package/src/components/GuidonProvider.tsx +158 -0
- package/src/components/GuidonTarget.tsx +108 -0
- package/src/components/GuidonTooltip.tsx +365 -0
- package/src/components/index.ts +4 -0
- package/src/index.ts +51 -0
- package/src/persistence/adapters.ts +224 -0
- package/src/persistence/hooks.ts +179 -0
- package/src/persistence/index.ts +2 -0
- package/src/store.ts +268 -0
- package/src/types.ts +242 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store.ts","../src/components/GuidonTarget.tsx","../src/components/GuidonOverlay.tsx","../src/components/GuidonTooltip.tsx","../src/persistence/hooks.ts","../src/components/GuidonProvider.tsx","../src/persistence/adapters.ts"],"names":["create","useRef","useCallback","Platform","useEffect","jsx","View","Animated","Svg","Dimensions","useMemo","useAnimatedStyle","withTiming","Easing","TouchableWithoutFeedback","jsxs","Defs","Mask","Rect","G","StyleSheet","DEFAULT_THEME","useSafeAreaInsets","withSpring","styles","Text","TouchableOpacity","useState","createContext","useContext","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { create } from \"zustand\";\nimport type {\n GuidonConfig,\n GuidonStore,\n TargetMeasurements,\n} from \"./types\";\n\nconst initialState = {\n config: null,\n isActive: false,\n currentStepIndex: 0,\n isCompleted: false,\n targetMeasurements: {},\n isLoading: false,\n error: null,\n};\n\nexport const useGuidonStore = create<GuidonStore>((set, get) => ({\n ...initialState,\n\n configure: (config: GuidonConfig) => {\n set({ config, currentStepIndex: 0, isCompleted: false });\n },\n\n start: () => {\n const { config } = get();\n if (!config || config.steps.length === 0) return;\n\n set({ isActive: true, currentStepIndex: 0, isCompleted: false });\n\n // Call onStepEnter for the first step\n const firstStep = config.steps[0];\n firstStep.onStepEnter?.();\n config.onStepChange?.(0, firstStep);\n },\n\n next: () => {\n const { config, currentStepIndex, isActive } = get();\n if (!config || !isActive) return;\n\n const currentStep = config.steps[currentStepIndex];\n currentStep?.onStepExit?.();\n\n if (currentStepIndex < config.steps.length - 1) {\n const nextIndex = currentStepIndex + 1;\n const nextStep = config.steps[nextIndex];\n\n set({ currentStepIndex: nextIndex });\n\n nextStep.onStepEnter?.();\n config.onStepChange?.(nextIndex, nextStep);\n } else {\n // Last step completed\n get().complete();\n }\n },\n\n previous: () => {\n const { config, currentStepIndex, isActive } = get();\n if (!config || !isActive || currentStepIndex === 0) return;\n\n const currentStep = config.steps[currentStepIndex];\n currentStep?.onStepExit?.();\n\n const prevIndex = currentStepIndex - 1;\n const prevStep = config.steps[prevIndex];\n\n set({ currentStepIndex: prevIndex });\n\n prevStep.onStepEnter?.();\n config.onStepChange?.(prevIndex, prevStep);\n },\n\n goToStep: (index: number) => {\n const { config, currentStepIndex, isActive } = get();\n if (!config || !isActive) return;\n if (index < 0 || index >= config.steps.length) return;\n\n const currentStep = config.steps[currentStepIndex];\n currentStep?.onStepExit?.();\n\n const targetStep = config.steps[index];\n\n set({ currentStepIndex: index });\n\n targetStep.onStepEnter?.();\n config.onStepChange?.(index, targetStep);\n },\n\n skip: () => {\n const { config, currentStepIndex } = get();\n if (!config) return;\n\n const currentStep = config.steps[currentStepIndex];\n currentStep?.onStepExit?.();\n\n set({ isActive: false, isCompleted: false });\n config.onSkip?.();\n },\n\n complete: () => {\n const { config, currentStepIndex } = get();\n if (!config) return;\n\n const currentStep = config.steps[currentStepIndex];\n currentStep?.onStepExit?.();\n\n set({ isActive: false, isCompleted: true });\n config.onComplete?.();\n },\n\n reset: () => {\n set(initialState);\n },\n\n registerTarget: (targetId: string, measurements: TargetMeasurements) => {\n set((state: GuidonStore) => ({\n targetMeasurements: {\n ...state.targetMeasurements,\n [targetId]: measurements,\n },\n }));\n },\n\n unregisterTarget: (targetId: string) => {\n set((state: GuidonStore) => {\n const { [targetId]: _, ...rest } = state.targetMeasurements;\n return { targetMeasurements: rest };\n });\n },\n\n setLoading: (isLoading: boolean) => {\n set({ isLoading });\n },\n\n setError: (error: string | null) => {\n set({ error });\n },\n}));\n\n/**\n * Guidon API for external control\n * Can be used outside of React components\n */\nexport const Guidon = {\n /**\n * Configure the walkthrough with steps and options\n */\n configure: (config: GuidonConfig) => {\n useGuidonStore.getState().configure(config);\n },\n\n /**\n * Start the walkthrough\n */\n start: () => {\n useGuidonStore.getState().start();\n },\n\n /**\n * Go to the next step\n */\n next: () => {\n useGuidonStore.getState().next();\n },\n\n /**\n * Go to the previous step\n */\n previous: () => {\n useGuidonStore.getState().previous();\n },\n\n /**\n * Go to a specific step by index\n */\n goToStep: (index: number) => {\n useGuidonStore.getState().goToStep(index);\n },\n\n /**\n * Skip the walkthrough\n */\n skip: () => {\n useGuidonStore.getState().skip();\n },\n\n /**\n * Complete the walkthrough\n */\n complete: () => {\n useGuidonStore.getState().complete();\n },\n\n /**\n * Reset the walkthrough to initial state\n */\n reset: () => {\n useGuidonStore.getState().reset();\n },\n\n /**\n * Check if the walkthrough is currently active\n */\n isActive: () => {\n return useGuidonStore.getState().isActive;\n },\n\n /**\n * Check if the walkthrough has been completed\n */\n isCompleted: () => {\n return useGuidonStore.getState().isCompleted;\n },\n\n /**\n * Get the current step index\n */\n getCurrentStepIndex: () => {\n return useGuidonStore.getState().currentStepIndex;\n },\n\n /**\n * Get the current step\n */\n getCurrentStep: () => {\n const state = useGuidonStore.getState();\n return state.config?.steps[state.currentStepIndex] ?? null;\n },\n\n /**\n * Get all steps\n */\n getSteps: () => {\n return useGuidonStore.getState().config?.steps ?? [];\n },\n\n /**\n * Subscribe to store changes\n */\n subscribe: useGuidonStore.subscribe,\n};\n\n/**\n * Hook selectors for common use cases\n */\nexport const useGuidonActive = () =>\n useGuidonStore((state: GuidonStore) => state.isActive);\n\nexport const useGuidonStep = () =>\n useGuidonStore((state: GuidonStore) => {\n if (!state.config || !state.isActive) return null;\n return state.config.steps[state.currentStepIndex];\n });\n\nexport const useGuidonProgress = () =>\n useGuidonStore((state: GuidonStore) => ({\n currentStep: state.currentStepIndex + 1,\n totalSteps: state.config?.steps.length ?? 0,\n percentage: state.config\n ? ((state.currentStepIndex + 1) / state.config.steps.length) * 100\n : 0,\n }));\n\nexport const useTargetMeasurements = (targetId: string) =>\n useGuidonStore(\n (state: GuidonStore) => state.targetMeasurements[targetId],\n );\n","import { useCallback, useEffect, useRef } from 'react';\nimport { View, Platform, type LayoutChangeEvent } from 'react-native';\nimport { useGuidonStore } from '../store';\nimport type { GuidonTargetProps, TargetMeasurements, GuidonStore, GuidonStep } from '../types';\n\n/**\n * Wrapper component that marks an element as a walkthrough target\n * Automatically measures and reports its position to the walkthrough store\n */\nexport function GuidonTarget({\n children,\n targetId,\n active = true,\n}: GuidonTargetProps) {\n const viewRef = useRef<View>(null);\n const registerTarget = useGuidonStore((state: GuidonStore) => state.registerTarget);\n const unregisterTarget = useGuidonStore((state: GuidonStore) => state.unregisterTarget);\n const isActive = useGuidonStore((state: GuidonStore) => state.isActive);\n const config = useGuidonStore((state: GuidonStore) => state.config);\n\n // Check if this target is needed for the current walkthrough\n const isTargetNeeded =\n isActive && config?.steps.some((step: GuidonStep) => step.targetId === targetId);\n\n const measureElement = useCallback(() => {\n if (!viewRef.current || !active || !isTargetNeeded) return;\n\n if (Platform.OS === 'web') {\n // Web measurement using getBoundingClientRect\n const element = viewRef.current as unknown as HTMLElement;\n if (element && typeof element.getBoundingClientRect === 'function') {\n const rect = element.getBoundingClientRect();\n const measurements: TargetMeasurements = {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n };\n registerTarget(targetId, measurements);\n }\n } else {\n // Native measurement using measureInWindow\n viewRef.current.measureInWindow((x, y, width, height) => {\n if (width > 0 && height > 0) {\n const measurements: TargetMeasurements = { x, y, width, height };\n registerTarget(targetId, measurements);\n }\n });\n }\n }, [targetId, active, isTargetNeeded, registerTarget]);\n\n // Measure on layout change\n const handleLayout = useCallback(\n (_event: LayoutChangeEvent) => {\n // Small delay to ensure layout is complete\n requestAnimationFrame(() => {\n measureElement();\n });\n },\n [measureElement]\n );\n\n // Re-measure when walkthrough becomes active or when this target becomes relevant\n useEffect(() => {\n if (isTargetNeeded) {\n // Delay to ensure the element is rendered\n const timer = setTimeout(() => {\n measureElement();\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [isTargetNeeded, measureElement]);\n\n // Re-measure on scroll (web only)\n useEffect(() => {\n if (Platform.OS !== 'web' || !isTargetNeeded) return;\n\n const handleScroll = () => {\n measureElement();\n };\n\n window.addEventListener('scroll', handleScroll, true);\n window.addEventListener('resize', handleScroll);\n\n return () => {\n window.removeEventListener('scroll', handleScroll, true);\n window.removeEventListener('resize', handleScroll);\n };\n }, [isTargetNeeded, measureElement]);\n\n // Unregister on unmount\n useEffect(() => {\n return () => {\n unregisterTarget(targetId);\n };\n }, [targetId, unregisterTarget]);\n\n return (\n <View\n ref={viewRef}\n onLayout={handleLayout}\n collapsable={false}\n style={{ alignSelf: 'flex-start' }}\n >\n {children}\n </View>\n );\n}\n","import { useMemo } from 'react';\nimport {\n StyleSheet,\n Dimensions,\n TouchableWithoutFeedback,\n Platform,\n} from 'react-native';\nimport Animated, {\n useAnimatedStyle,\n withTiming,\n Easing,\n} from 'react-native-reanimated';\nimport Svg, { Defs, Mask, Rect, G } from 'react-native-svg';\nimport { useGuidonStore } from '../store';\nimport type { TargetMeasurements, GuidonTheme, GuidonStore } from '../types';\n\nconst AnimatedSvg = Animated.createAnimatedComponent(Svg);\n\nconst DEFAULT_THEME: Required<\n Pick<\n GuidonTheme,\n 'backdropColor' | 'backdropOpacity' | 'spotlightBorderRadius' | 'spotlightPadding'\n >\n> = {\n backdropColor: '#000000',\n backdropOpacity: 0.75,\n spotlightBorderRadius: 8,\n spotlightPadding: 8,\n};\n\ninterface GuidonOverlayProps {\n theme?: GuidonTheme;\n animationDuration?: number;\n onBackdropPress?: () => void;\n}\n\nexport function GuidonOverlay({\n theme = {},\n animationDuration = 300,\n onBackdropPress,\n}: GuidonOverlayProps) {\n const isActive = useGuidonStore((state: GuidonStore) => state.isActive);\n const config = useGuidonStore((state: GuidonStore) => state.config);\n const currentStepIndex = useGuidonStore((state: GuidonStore) => state.currentStepIndex);\n const targetMeasurements = useGuidonStore((state: GuidonStore) => state.targetMeasurements);\n\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n const { width: screenWidth, height: screenHeight } = Dimensions.get('window');\n\n // Get current step's target measurements\n const currentStep = config?.steps[currentStepIndex];\n const currentTargetId = currentStep?.targetId;\n const measurements: TargetMeasurements | undefined = currentTargetId\n ? targetMeasurements[currentTargetId]\n : undefined;\n\n // Calculate spotlight dimensions with padding\n const spotlight = useMemo(() => {\n if (!measurements) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return {\n x: measurements.x - mergedTheme.spotlightPadding,\n y: measurements.y - mergedTheme.spotlightPadding,\n width: measurements.width + mergedTheme.spotlightPadding * 2,\n height: measurements.height + mergedTheme.spotlightPadding * 2,\n };\n }, [measurements, mergedTheme.spotlightPadding]);\n\n // Animated styles for fade in/out\n const animatedStyle = useAnimatedStyle(() => {\n return {\n opacity: withTiming(isActive && measurements ? 1 : 0, {\n duration: animationDuration,\n easing: Easing.inOut(Easing.ease),\n }),\n };\n }, [isActive, measurements, animationDuration]);\n\n if (!isActive || !measurements) {\n return null;\n }\n\n // For web, use a different approach with CSS\n if (Platform.OS === 'web') {\n return (\n <TouchableWithoutFeedback onPress={onBackdropPress}>\n <Animated.View style={[styles.container, animatedStyle]}>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: mergedTheme.backdropColor,\n opacity: mergedTheme.backdropOpacity,\n clipPath: `polygon(\n 0% 0%,\n 0% 100%,\n ${spotlight.x}px 100%,\n ${spotlight.x}px ${spotlight.y}px,\n ${spotlight.x + spotlight.width}px ${spotlight.y}px,\n ${spotlight.x + spotlight.width}px ${spotlight.y + spotlight.height}px,\n ${spotlight.x}px ${spotlight.y + spotlight.height}px,\n ${spotlight.x}px 100%,\n 100% 100%,\n 100% 0%\n )`,\n }}\n />\n </Animated.View>\n </TouchableWithoutFeedback>\n );\n }\n\n // Native implementation using SVG mask\n return (\n <TouchableWithoutFeedback onPress={onBackdropPress}>\n <AnimatedSvg\n style={[styles.container, animatedStyle]}\n width={screenWidth}\n height={screenHeight}\n viewBox={`0 0 ${screenWidth} ${screenHeight}`}\n >\n <Defs>\n <Mask id=\"spotlight-mask\">\n {/* White background (visible) */}\n <Rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {/* Black cutout (transparent) */}\n <Rect\n x={spotlight.x}\n y={spotlight.y}\n width={spotlight.width}\n height={spotlight.height}\n rx={mergedTheme.spotlightBorderRadius}\n ry={mergedTheme.spotlightBorderRadius}\n fill=\"black\"\n />\n </Mask>\n </Defs>\n <G mask=\"url(#spotlight-mask)\">\n <Rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill={mergedTheme.backdropColor}\n fillOpacity={mergedTheme.backdropOpacity}\n />\n </G>\n </AnimatedSvg>\n </TouchableWithoutFeedback>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 999,\n },\n});\n","import { useMemo } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n Dimensions,\n TouchableOpacity,\n Platform,\n} from 'react-native';\nimport Animated, {\n useAnimatedStyle,\n withTiming,\n withSpring,\n Easing,\n} from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useGuidonStore } from '../store';\nimport type { GuidonTheme, TooltipPosition, TargetMeasurements, GuidonStore, GuidonStep } from '../types';\n\nconst DEFAULT_THEME: Required<\n Pick<\n GuidonTheme,\n | 'tooltipBackgroundColor'\n | 'tooltipBorderColor'\n | 'tooltipBorderRadius'\n | 'titleColor'\n | 'descriptionColor'\n | 'primaryColor'\n | 'mutedColor'\n | 'spotlightPadding'\n >\n> = {\n tooltipBackgroundColor: '#ffffff',\n tooltipBorderColor: '#e5e5e5',\n tooltipBorderRadius: 12,\n titleColor: '#1a1a1a',\n descriptionColor: '#666666',\n primaryColor: '#007AFF',\n mutedColor: '#999999',\n spotlightPadding: 8,\n};\n\nconst TOOLTIP_MARGIN = 16;\nconst TOOLTIP_WIDTH = 300;\n\ninterface GuidonTooltipProps {\n theme?: GuidonTheme;\n animationDuration?: number;\n renderCustomTooltip?: (props: {\n step: GuidonStep;\n currentIndex: number;\n totalSteps: number;\n onNext: () => void;\n onPrevious: () => void;\n onSkip: () => void;\n }) => React.ReactNode;\n labels?: {\n next?: string;\n previous?: string;\n skip?: string;\n finish?: string;\n stepOf?: (current: number, total: number) => string;\n };\n}\n\nexport function GuidonTooltip({\n theme = {},\n animationDuration = 300,\n renderCustomTooltip,\n labels = {},\n}: GuidonTooltipProps) {\n const insets = useSafeAreaInsets();\n const { width: screenWidth, height: screenHeight } = Dimensions.get('window');\n\n const isActive = useGuidonStore((state: GuidonStore) => state.isActive);\n const config = useGuidonStore((state: GuidonStore) => state.config);\n const currentStepIndex = useGuidonStore((state: GuidonStore) => state.currentStepIndex);\n const targetMeasurements = useGuidonStore((state: GuidonStore) => state.targetMeasurements);\n const next = useGuidonStore((state: GuidonStore) => state.next);\n const previous = useGuidonStore((state: GuidonStore) => state.previous);\n const skip = useGuidonStore((state: GuidonStore) => state.skip);\n\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n const mergedLabels = {\n next: labels.next ?? 'Next',\n previous: labels.previous ?? 'Back',\n skip: labels.skip ?? 'Skip',\n finish: labels.finish ?? 'Finish',\n stepOf: labels.stepOf ?? ((c: number, t: number) => `${c} of ${t}`),\n };\n\n const currentStep = config?.steps[currentStepIndex];\n const totalSteps = config?.steps.length ?? 0;\n const isFirstStep = currentStepIndex === 0;\n const isLastStep = currentStepIndex === totalSteps - 1;\n\n const measurements: TargetMeasurements | undefined = currentStep?.targetId\n ? targetMeasurements[currentStep.targetId]\n : undefined;\n\n // Calculate tooltip position\n const tooltipPosition = useMemo(() => {\n if (!measurements) {\n return { top: screenHeight / 2, left: screenWidth / 2 - TOOLTIP_WIDTH / 2 };\n }\n\n const targetCenterY = measurements.y + measurements.height / 2;\n const targetBottom = measurements.y + measurements.height + mergedTheme.spotlightPadding;\n const targetTop = measurements.y - mergedTheme.spotlightPadding;\n\n // Determine preferred position\n let position: TooltipPosition = currentStep?.tooltipPosition ?? 'auto';\n\n if (position === 'auto') {\n // Auto-detect best position\n const spaceAbove = targetTop - insets.top;\n const spaceBelow = screenHeight - targetBottom - insets.bottom;\n\n position = spaceBelow >= 200 ? 'bottom' : spaceAbove >= 200 ? 'top' : 'bottom';\n }\n\n let top: number;\n let left: number = Math.max(\n TOOLTIP_MARGIN,\n Math.min(\n measurements.x + measurements.width / 2 - TOOLTIP_WIDTH / 2,\n screenWidth - TOOLTIP_WIDTH - TOOLTIP_MARGIN\n )\n );\n\n if (position === 'top') {\n top = targetTop - TOOLTIP_MARGIN - 150; // Approximate tooltip height\n } else {\n top = targetBottom + TOOLTIP_MARGIN;\n }\n\n // Ensure tooltip is within screen bounds\n top = Math.max(insets.top + TOOLTIP_MARGIN, Math.min(top, screenHeight - 200 - insets.bottom));\n\n return { top, left, position };\n }, [measurements, screenWidth, screenHeight, insets, currentStep?.tooltipPosition, mergedTheme.spotlightPadding]);\n\n // Animated styles\n const animatedStyle = useAnimatedStyle(() => {\n return {\n opacity: withTiming(isActive && measurements ? 1 : 0, {\n duration: animationDuration,\n easing: Easing.inOut(Easing.ease),\n }),\n transform: [\n {\n translateY: withSpring(isActive && measurements ? 0 : 20, {\n damping: 15,\n stiffness: 150,\n }),\n },\n ],\n };\n }, [isActive, measurements, animationDuration]);\n\n if (!isActive || !currentStep || !measurements) {\n return null;\n }\n\n // Render custom tooltip if provided\n if (renderCustomTooltip) {\n return (\n <Animated.View\n style={[\n styles.tooltipContainer,\n {\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n width: TOOLTIP_WIDTH,\n },\n animatedStyle,\n ]}\n >\n {renderCustomTooltip({\n step: currentStep,\n currentIndex: currentStepIndex,\n totalSteps,\n onNext: next,\n onPrevious: previous,\n onSkip: skip,\n })}\n </Animated.View>\n );\n }\n\n // Default tooltip UI\n return (\n <Animated.View\n style={[\n styles.tooltipContainer,\n {\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n width: TOOLTIP_WIDTH,\n backgroundColor: mergedTheme.tooltipBackgroundColor,\n borderColor: mergedTheme.tooltipBorderColor,\n borderRadius: mergedTheme.tooltipBorderRadius,\n },\n animatedStyle,\n ]}\n >\n {/* Progress indicator */}\n <View style={styles.progressContainer}>\n <Text style={[styles.progressText, { color: mergedTheme.mutedColor }]}>\n {mergedLabels.stepOf(currentStepIndex + 1, totalSteps)}\n </Text>\n <View style={styles.progressDots}>\n {Array.from({ length: totalSteps }).map((_, i) => (\n <View\n key={i}\n style={[\n styles.progressDot,\n {\n backgroundColor:\n i === currentStepIndex\n ? mergedTheme.primaryColor\n : mergedTheme.mutedColor,\n opacity: i === currentStepIndex ? 1 : 0.3,\n },\n ]}\n />\n ))}\n </View>\n </View>\n\n {/* Content */}\n <View style={styles.content}>\n <Text style={[styles.title, { color: mergedTheme.titleColor }]}>\n {currentStep.title}\n </Text>\n <Text style={[styles.description, { color: mergedTheme.descriptionColor }]}>\n {currentStep.description}\n </Text>\n {currentStep.customContent}\n </View>\n\n {/* Navigation buttons */}\n <View style={styles.buttonContainer}>\n <TouchableOpacity onPress={skip} style={styles.skipButton}>\n <Text style={[styles.skipText, { color: mergedTheme.mutedColor }]}>\n {mergedLabels.skip}\n </Text>\n </TouchableOpacity>\n\n <View style={styles.navButtons}>\n {!isFirstStep && (\n <TouchableOpacity\n onPress={previous}\n style={[styles.navButton, styles.backButton]}\n >\n <Text style={[styles.backButtonText, { color: mergedTheme.primaryColor }]}>\n {mergedLabels.previous}\n </Text>\n </TouchableOpacity>\n )}\n <TouchableOpacity\n onPress={next}\n style={[\n styles.navButton,\n styles.nextButton,\n { backgroundColor: mergedTheme.primaryColor },\n ]}\n >\n <Text style={styles.nextButtonText}>\n {isLastStep ? mergedLabels.finish : mergedLabels.next}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n tooltipContainer: {\n position: 'absolute',\n zIndex: 1000,\n borderWidth: 1,\n padding: 16,\n ...Platform.select({\n ios: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.15,\n shadowRadius: 12,\n },\n android: {\n elevation: 8,\n },\n web: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n } as any,\n }),\n },\n progressContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n },\n progressText: {\n fontSize: 12,\n fontWeight: '500',\n },\n progressDots: {\n flexDirection: 'row',\n gap: 4,\n },\n progressDot: {\n width: 6,\n height: 6,\n borderRadius: 3,\n },\n content: {\n marginBottom: 16,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 8,\n },\n description: {\n fontSize: 14,\n lineHeight: 20,\n },\n buttonContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n skipButton: {\n paddingVertical: 8,\n paddingHorizontal: 4,\n },\n skipText: {\n fontSize: 14,\n },\n navButtons: {\n flexDirection: 'row',\n gap: 8,\n },\n navButton: {\n paddingVertical: 10,\n paddingHorizontal: 16,\n borderRadius: 8,\n },\n backButton: {\n backgroundColor: 'transparent',\n },\n backButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n nextButton: {},\n nextButtonText: {\n color: '#ffffff',\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","import { useCallback, useEffect, useState } from 'react';\nimport type { GuidonPersistenceAdapter, GuidonProgress } from '../types';\n\n/**\n * Hook to manage guidon's walkthrough progress with a persistence adapter\n */\nexport function useGuidonPersistence(\n adapter: GuidonPersistenceAdapter | undefined,\n guidonId: string\n) {\n const [progress, setProgress] = useState<GuidonProgress | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Load progress on mount\n useEffect(() => {\n if (!adapter) {\n setIsLoading(false);\n return;\n }\n\n let mounted = true;\n\n const loadProgress = async () => {\n try {\n setIsLoading(true);\n setError(null);\n const data = await adapter.loadProgress(guidonId);\n if (mounted) {\n setProgress(data);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err.message : 'Failed to load progress');\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n }\n }\n };\n\n loadProgress();\n\n return () => {\n mounted = false;\n };\n }, [adapter, guidonId]);\n\n const saveProgress = useCallback(\n async (newProgress: Omit<GuidonProgress, 'guidonId'>) => {\n if (!adapter) return;\n\n const fullProgress: GuidonProgress = {\n ...newProgress,\n guidonId,\n };\n\n try {\n setError(null);\n await adapter.saveProgress(fullProgress);\n setProgress(fullProgress);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save progress');\n throw err;\n }\n },\n [adapter, guidonId]\n );\n\n const clearProgress = useCallback(async () => {\n if (!adapter?.clearProgress) return;\n\n try {\n setError(null);\n await adapter.clearProgress(guidonId);\n setProgress(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to clear progress');\n throw err;\n }\n }, [adapter, guidonId]);\n\n const markCompleted = useCallback(async () => {\n const currentCount = progress?.completionCount ?? 0;\n await saveProgress({\n completed: true,\n completedAt: new Date().toISOString(),\n completionCount: currentCount + 1,\n });\n }, [saveProgress, progress?.completionCount]);\n\n const markStepViewed = useCallback(\n async (stepIndex: number) => {\n await saveProgress({\n completed: progress?.completed ?? false,\n lastStepIndex: stepIndex,\n completedAt: progress?.completedAt,\n completionCount: progress?.completionCount,\n });\n },\n [saveProgress, progress]\n );\n\n return {\n progress,\n isLoading,\n error,\n isCompleted: progress?.completed ?? false,\n hasStarted: progress !== null,\n saveProgress,\n clearProgress,\n markCompleted,\n markStepViewed,\n };\n}\n\n/**\n * Hook to check if a guidon should be shown\n */\nexport function useShouldShowGuidon(\n adapter: GuidonPersistenceAdapter | undefined,\n guidonId: string,\n options?: {\n /** Show even if completed (for replay) */\n forceShow?: boolean;\n /** Additional condition to check */\n additionalCondition?: () => boolean | Promise<boolean>;\n }\n) {\n const { progress, isLoading } = useGuidonPersistence(adapter, guidonId);\n const [shouldShow, setShouldShow] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n\n useEffect(() => {\n if (isLoading) return;\n\n const checkCondition = async () => {\n setIsChecking(true);\n\n // If forceShow is true, always show\n if (options?.forceShow) {\n setShouldShow(true);\n setIsChecking(false);\n return;\n }\n\n // If already completed, don't show\n if (progress?.completed) {\n setShouldShow(false);\n setIsChecking(false);\n return;\n }\n\n // Check additional condition if provided\n if (options?.additionalCondition) {\n try {\n const result = await options.additionalCondition();\n setShouldShow(result);\n } catch {\n setShouldShow(true); // Default to showing on error\n }\n } else {\n // Default: show if not completed\n setShouldShow(true);\n }\n\n setIsChecking(false);\n };\n\n checkCondition();\n }, [isLoading, progress?.completed, options?.forceShow, options?.additionalCondition]);\n\n return {\n shouldShow,\n isChecking: isLoading || isChecking,\n isCompleted: progress?.completed ?? false,\n };\n}\n","import { useEffect, useCallback, useRef, createContext, useContext } from 'react';\nimport { useGuidonStore } from '../store';\nimport { useGuidonPersistence } from '../persistence/hooks';\nimport { GuidonOverlay } from './GuidonOverlay';\nimport { GuidonTooltip } from './GuidonTooltip';\nimport type {\n GuidonProviderProps,\n GuidonConfig,\n GuidonStore,\n} from '../types';\n\ninterface GuidonContextValue {\n start: () => void;\n skip: () => void;\n reset: () => void;\n replay: () => Promise<void>;\n isActive: boolean;\n isCompleted: boolean;\n isLoading: boolean;\n}\n\nconst GuidonContext = createContext<GuidonContextValue | null>(null);\n\nexport function useGuidonContext() {\n const context = useContext(GuidonContext);\n if (!context) {\n throw new Error('useGuidonContext must be used within a GuidonProvider');\n }\n return context;\n}\n\nexport function GuidonProvider({\n children,\n config,\n autoStart = true,\n shouldStart,\n persistenceAdapter,\n portalComponent: Portal,\n renderTooltip,\n tooltipLabels,\n onBackdropPress,\n}: GuidonProviderProps) {\n const hasInitialized = useRef(false);\n const isActive = useGuidonStore((state: GuidonStore) => state.isActive);\n const storeIsCompleted = useGuidonStore((state: GuidonStore) => state.isCompleted);\n const currentStepIndex = useGuidonStore((state: GuidonStore) => state.currentStepIndex);\n const configure = useGuidonStore((state: GuidonStore) => state.configure);\n const start = useGuidonStore((state: GuidonStore) => state.start);\n const skip = useGuidonStore((state: GuidonStore) => state.skip);\n const reset = useGuidonStore((state: GuidonStore) => state.reset);\n\n const {\n isLoading,\n isCompleted: persistedCompleted,\n markCompleted,\n markStepViewed,\n clearProgress,\n } = useGuidonPersistence(persistenceAdapter, config.id);\n\n const isCompleted = storeIsCompleted || persistedCompleted;\n\n useEffect(() => {\n const enhancedConfig: GuidonConfig = {\n ...config,\n onComplete: async () => {\n config.onComplete?.();\n if (persistenceAdapter) {\n await markCompleted();\n }\n },\n onSkip: async () => {\n config.onSkip?.();\n if (persistenceAdapter) {\n await markStepViewed(currentStepIndex);\n }\n },\n onStepChange: async (stepIndex, step) => {\n config.onStepChange?.(stepIndex, step);\n if (persistenceAdapter) {\n await markStepViewed(stepIndex);\n }\n },\n };\n\n configure(enhancedConfig);\n }, [config, configure, persistenceAdapter, markCompleted, markStepViewed, currentStepIndex]);\n\n useEffect(() => {\n if (!autoStart || hasInitialized.current || isLoading) return;\n\n const checkAndStart = async () => {\n hasInitialized.current = true;\n\n if (persistedCompleted) return;\n\n if (shouldStart) {\n const should = await shouldStart();\n if (!should) return;\n }\n\n setTimeout(() => {\n start();\n }, 500);\n };\n\n checkAndStart();\n }, [autoStart, isLoading, persistedCompleted, shouldStart, start]);\n\n const replay = useCallback(async () => {\n if (persistenceAdapter) {\n await clearProgress();\n }\n reset();\n hasInitialized.current = false;\n setTimeout(() => {\n start();\n }, 100);\n }, [persistenceAdapter, clearProgress, reset, start]);\n\n const manualStart = useCallback(() => {\n if (!isActive && !isLoading) {\n start();\n }\n }, [isActive, isLoading, start]);\n\n const contextValue: GuidonContextValue = {\n start: manualStart,\n skip,\n reset,\n replay,\n isActive,\n isCompleted,\n isLoading,\n };\n\n const overlayContent = (\n <>\n <GuidonOverlay\n theme={config.theme}\n animationDuration={config.animationDuration}\n onBackdropPress={onBackdropPress}\n />\n <GuidonTooltip\n theme={config.theme}\n animationDuration={config.animationDuration}\n renderCustomTooltip={renderTooltip}\n labels={tooltipLabels}\n />\n </>\n );\n\n return (\n <GuidonContext.Provider value={contextValue}>\n {children}\n {Portal ? <Portal>{overlayContent}</Portal> : overlayContent}\n </GuidonContext.Provider>\n );\n}\n","import type { GuidonPersistenceAdapter, GuidonProgress } from '../types';\n\nconst STORAGE_KEY_PREFIX = '@guidon:';\n\n/**\n * No-op adapter that doesn't persist anything\n * Useful for testing or when persistence is not needed\n */\nexport const createNoopAdapter = (): GuidonPersistenceAdapter => ({\n loadProgress: async () => null,\n saveProgress: async () => {},\n loadAllProgress: async () => ({}),\n clearProgress: async () => {},\n});\n\n/**\n * Memory adapter that stores progress in memory\n * Data is lost when the app is closed\n */\nexport const createMemoryAdapter = (): GuidonPersistenceAdapter => {\n const store: Record<string, GuidonProgress> = {};\n\n return {\n loadProgress: async (guidonId) => store[guidonId] ?? null,\n saveProgress: async (progress) => {\n store[progress.guidonId] = progress;\n },\n loadAllProgress: async () => ({ ...store }),\n clearProgress: async (guidonId) => {\n delete store[guidonId];\n },\n };\n};\n\n/**\n * localStorage adapter for web\n * Only works in browser environments\n */\nexport const createLocalStorageAdapter = (\n keyPrefix: string = STORAGE_KEY_PREFIX\n): GuidonPersistenceAdapter => ({\n loadProgress: async (guidonId) => {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n try {\n const data = localStorage.getItem(`${keyPrefix}${guidonId}`);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n },\n saveProgress: async (progress) => {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n try {\n localStorage.setItem(\n `${keyPrefix}${progress.guidonId}`,\n JSON.stringify(progress)\n );\n } catch {\n // Silently fail if storage is full\n }\n },\n loadAllProgress: async () => {\n if (typeof window === 'undefined' || !window.localStorage) {\n return {};\n }\n const result: Record<string, GuidonProgress> = {};\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(keyPrefix)) {\n const data = localStorage.getItem(key);\n if (data) {\n const progress = JSON.parse(data) as GuidonProgress;\n result[progress.guidonId] = progress;\n }\n }\n }\n } catch {\n // Silently fail\n }\n return result;\n },\n clearProgress: async (guidonId) => {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n try {\n localStorage.removeItem(`${keyPrefix}${guidonId}`);\n } catch {\n // Silently fail\n }\n },\n});\n\n/**\n * AsyncStorage adapter for React Native\n * Requires @react-native-async-storage/async-storage to be installed\n *\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * const adapter = createAsyncStorageAdapter(AsyncStorage);\n */\nexport const createAsyncStorageAdapter = (\n asyncStorage: {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n getAllKeys: () => Promise<readonly string[]>;\n multiGet: (keys: readonly string[]) => Promise<readonly [string, string | null][]>;\n },\n keyPrefix: string = STORAGE_KEY_PREFIX\n): GuidonPersistenceAdapter => ({\n loadProgress: async (guidonId) => {\n try {\n const data = await asyncStorage.getItem(`${keyPrefix}${guidonId}`);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n },\n saveProgress: async (progress) => {\n try {\n await asyncStorage.setItem(\n `${keyPrefix}${progress.guidonId}`,\n JSON.stringify(progress)\n );\n } catch {\n // Silently fail\n }\n },\n loadAllProgress: async () => {\n const result: Record<string, GuidonProgress> = {};\n try {\n const allKeys = await asyncStorage.getAllKeys();\n const relevantKeys = allKeys.filter((key) => key.startsWith(keyPrefix));\n const pairs = await asyncStorage.multiGet(relevantKeys);\n for (const [, value] of pairs) {\n if (value) {\n const progress = JSON.parse(value) as GuidonProgress;\n result[progress.guidonId] = progress;\n }\n }\n } catch {\n // Silently fail\n }\n return result;\n },\n clearProgress: async (guidonId) => {\n try {\n await asyncStorage.removeItem(`${keyPrefix}${guidonId}`);\n } catch {\n // Silently fail\n }\n },\n});\n\n/**\n * Create a custom API adapter for backend persistence\n * This is a factory function that creates an adapter based on your API endpoints\n *\n * @example\n * const adapter = createApiAdapter({\n * loadProgress: async (guidonId) => {\n * const response = await fetch(`/api/guidon/${guidonId}`);\n * return response.json();\n * },\n * saveProgress: async (progress) => {\n * await fetch(`/api/guidon/${progress.guidonId}`, {\n * method: 'POST',\n * body: JSON.stringify(progress),\n * });\n * },\n * });\n */\nexport const createApiAdapter = (\n handlers: Partial<GuidonPersistenceAdapter>\n): GuidonPersistenceAdapter => {\n const noopAdapter = createNoopAdapter();\n return {\n loadProgress: handlers.loadProgress ?? noopAdapter.loadProgress,\n saveProgress: handlers.saveProgress ?? noopAdapter.saveProgress,\n loadAllProgress: handlers.loadAllProgress ?? noopAdapter.loadAllProgress,\n clearProgress: handlers.clearProgress ?? noopAdapter.clearProgress,\n };\n};\n\n/**\n * Combine multiple adapters (e.g., save to both local and API)\n * Loads from the first adapter that returns data\n * Saves to all adapters\n */\nexport const createCompositeAdapter = (\n adapters: GuidonPersistenceAdapter[]\n): GuidonPersistenceAdapter => ({\n loadProgress: async (guidonId) => {\n for (const adapter of adapters) {\n const progress = await adapter.loadProgress(guidonId);\n if (progress) return progress;\n }\n return null;\n },\n saveProgress: async (progress) => {\n await Promise.all(adapters.map((adapter) => adapter.saveProgress(progress)));\n },\n loadAllProgress: async () => {\n const result: Record<string, GuidonProgress> = {};\n for (const adapter of adapters) {\n if (adapter.loadAllProgress) {\n const data = await adapter.loadAllProgress();\n Object.assign(result, data);\n }\n }\n return result;\n },\n clearProgress: async (guidonId) => {\n await Promise.all(\n adapters.map((adapter) => adapter.clearProgress?.(guidonId))\n );\n },\n});\n"]}
|