@korsolutions/guidon 1.0.1 → 1.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.
Files changed (143) hide show
  1. package/dist/commonjs/babel.config.js +15 -0
  2. package/dist/commonjs/babel.config.js.map +1 -0
  3. package/dist/commonjs/bob.config.js +11 -0
  4. package/dist/commonjs/bob.config.js.map +1 -0
  5. package/dist/commonjs/components/GuidonOverlay.js +206 -0
  6. package/dist/commonjs/components/GuidonOverlay.js.map +1 -0
  7. package/dist/commonjs/components/GuidonProvider.js +157 -0
  8. package/dist/commonjs/components/GuidonProvider.js.map +1 -0
  9. package/dist/commonjs/components/GuidonTarget.js +108 -0
  10. package/dist/commonjs/components/GuidonTarget.js.map +1 -0
  11. package/dist/commonjs/components/GuidonTooltip.js +422 -0
  12. package/dist/commonjs/components/GuidonTooltip.js.map +1 -0
  13. package/dist/commonjs/components/index.js +40 -0
  14. package/dist/commonjs/components/index.js.map +1 -0
  15. package/dist/commonjs/hooks/index.js +13 -0
  16. package/dist/commonjs/hooks/index.js.map +1 -0
  17. package/dist/commonjs/hooks/useGuidonRef.js +132 -0
  18. package/dist/commonjs/hooks/useGuidonRef.js.map +1 -0
  19. package/dist/commonjs/index.js +143 -0
  20. package/dist/commonjs/index.js.map +1 -0
  21. package/dist/commonjs/package.json +1 -0
  22. package/dist/commonjs/persistence/adapters.js +213 -0
  23. package/dist/commonjs/persistence/adapters.js.map +1 -0
  24. package/dist/commonjs/persistence/hooks.js +153 -0
  25. package/dist/commonjs/persistence/hooks.js.map +1 -0
  26. package/dist/commonjs/persistence/index.js +28 -0
  27. package/dist/commonjs/persistence/index.js.map +1 -0
  28. package/dist/commonjs/store.js +305 -0
  29. package/dist/commonjs/store.js.map +1 -0
  30. package/dist/commonjs/tsconfig.json +32 -0
  31. package/dist/commonjs/types.js +6 -0
  32. package/dist/commonjs/types.js.map +1 -0
  33. package/dist/module/babel.config.js +15 -0
  34. package/dist/module/babel.config.js.map +1 -0
  35. package/dist/module/bob.config.js +11 -0
  36. package/dist/module/bob.config.js.map +1 -0
  37. package/dist/module/components/GuidonOverlay.js +201 -0
  38. package/dist/module/components/GuidonOverlay.js.map +1 -0
  39. package/dist/module/components/GuidonProvider.js +152 -0
  40. package/dist/module/components/GuidonProvider.js.map +1 -0
  41. package/dist/module/components/GuidonTarget.js +104 -0
  42. package/dist/module/components/GuidonTarget.js.map +1 -0
  43. package/dist/module/components/GuidonTooltip.js +417 -0
  44. package/dist/module/components/GuidonTooltip.js.map +1 -0
  45. package/dist/module/components/index.js +7 -0
  46. package/dist/module/components/index.js.map +1 -0
  47. package/dist/module/hooks/index.js +4 -0
  48. package/dist/module/hooks/index.js.map +1 -0
  49. package/dist/module/hooks/useGuidonRef.js +129 -0
  50. package/dist/module/hooks/useGuidonRef.js.map +1 -0
  51. package/dist/module/index.js +17 -0
  52. package/dist/module/index.js.map +1 -0
  53. package/dist/module/package.json +1 -0
  54. package/dist/module/persistence/adapters.js +203 -0
  55. package/dist/module/persistence/adapters.js.map +1 -0
  56. package/dist/module/persistence/hooks.js +148 -0
  57. package/dist/module/persistence/hooks.js.map +1 -0
  58. package/dist/module/persistence/index.js +5 -0
  59. package/dist/module/persistence/index.js.map +1 -0
  60. package/dist/module/store.js +295 -0
  61. package/dist/module/store.js.map +1 -0
  62. package/dist/module/tsconfig.json +32 -0
  63. package/dist/module/types.js +4 -0
  64. package/dist/module/types.js.map +1 -0
  65. package/dist/typescript/commonjs/components/GuidonOverlay.d.ts +9 -0
  66. package/dist/typescript/commonjs/components/GuidonOverlay.d.ts.map +1 -0
  67. package/dist/typescript/commonjs/components/GuidonProvider.d.ts +14 -0
  68. package/dist/typescript/commonjs/components/GuidonProvider.d.ts.map +1 -0
  69. package/dist/typescript/commonjs/components/GuidonTarget.d.ts +7 -0
  70. package/dist/typescript/commonjs/components/GuidonTarget.d.ts.map +1 -0
  71. package/dist/typescript/commonjs/components/GuidonTooltip.d.ts +24 -0
  72. package/dist/typescript/commonjs/components/GuidonTooltip.d.ts.map +1 -0
  73. package/dist/typescript/commonjs/components/index.d.ts +5 -0
  74. package/dist/typescript/commonjs/components/index.d.ts.map +1 -0
  75. package/dist/typescript/commonjs/hooks/index.d.ts +2 -0
  76. package/dist/typescript/commonjs/hooks/index.d.ts.map +1 -0
  77. package/dist/typescript/commonjs/hooks/useGuidonRef.d.ts +35 -0
  78. package/dist/typescript/commonjs/hooks/useGuidonRef.d.ts.map +1 -0
  79. package/dist/typescript/commonjs/index.d.ts +7 -0
  80. package/dist/typescript/commonjs/index.d.ts.map +1 -0
  81. package/dist/typescript/commonjs/package.json +1 -0
  82. package/dist/typescript/commonjs/persistence/adapters.d.ts +57 -0
  83. package/dist/typescript/commonjs/persistence/adapters.d.ts.map +1 -0
  84. package/dist/typescript/commonjs/persistence/hooks.d.ts +29 -0
  85. package/dist/typescript/commonjs/persistence/hooks.d.ts.map +1 -0
  86. package/dist/typescript/commonjs/persistence/index.d.ts +3 -0
  87. package/dist/typescript/commonjs/persistence/index.d.ts.map +1 -0
  88. package/dist/typescript/commonjs/store.d.ts +89 -0
  89. package/dist/typescript/commonjs/store.d.ts.map +1 -0
  90. package/dist/{index-D_JFvCIg.d.mts → typescript/commonjs/types.d.ts} +40 -104
  91. package/dist/typescript/commonjs/types.d.ts.map +1 -0
  92. package/dist/typescript/module/components/GuidonOverlay.d.ts +9 -0
  93. package/dist/typescript/module/components/GuidonOverlay.d.ts.map +1 -0
  94. package/dist/typescript/module/components/GuidonProvider.d.ts +14 -0
  95. package/dist/typescript/module/components/GuidonProvider.d.ts.map +1 -0
  96. package/dist/typescript/module/components/GuidonTarget.d.ts +7 -0
  97. package/dist/typescript/module/components/GuidonTarget.d.ts.map +1 -0
  98. package/dist/typescript/module/components/GuidonTooltip.d.ts +24 -0
  99. package/dist/typescript/module/components/GuidonTooltip.d.ts.map +1 -0
  100. package/dist/typescript/module/components/index.d.ts +5 -0
  101. package/dist/typescript/module/components/index.d.ts.map +1 -0
  102. package/dist/typescript/module/hooks/index.d.ts +2 -0
  103. package/dist/typescript/module/hooks/index.d.ts.map +1 -0
  104. package/dist/typescript/module/hooks/useGuidonRef.d.ts +35 -0
  105. package/dist/typescript/module/hooks/useGuidonRef.d.ts.map +1 -0
  106. package/dist/typescript/module/index.d.ts +7 -0
  107. package/dist/typescript/module/index.d.ts.map +1 -0
  108. package/dist/typescript/module/package.json +1 -0
  109. package/dist/typescript/module/persistence/adapters.d.ts +57 -0
  110. package/dist/typescript/module/persistence/adapters.d.ts.map +1 -0
  111. package/dist/typescript/module/persistence/hooks.d.ts +29 -0
  112. package/dist/typescript/module/persistence/hooks.d.ts.map +1 -0
  113. package/dist/typescript/module/persistence/index.d.ts +3 -0
  114. package/dist/typescript/module/persistence/index.d.ts.map +1 -0
  115. package/dist/typescript/module/store.d.ts +89 -0
  116. package/dist/typescript/module/store.d.ts.map +1 -0
  117. package/dist/{index-D_JFvCIg.d.ts → typescript/module/types.d.ts} +40 -104
  118. package/dist/typescript/module/types.d.ts.map +1 -0
  119. package/package.json +25 -13
  120. package/src/babel.config.js +18 -0
  121. package/src/bob.config.js +14 -0
  122. package/src/components/GuidonOverlay.tsx +60 -4
  123. package/src/components/GuidonProvider.tsx +29 -1
  124. package/src/components/GuidonTarget.tsx +26 -16
  125. package/src/components/GuidonTooltip.tsx +143 -9
  126. package/src/hooks/index.ts +1 -0
  127. package/src/hooks/useGuidonRef.ts +154 -0
  128. package/src/index.ts +6 -0
  129. package/src/store.ts +40 -0
  130. package/src/tsconfig.json +32 -0
  131. package/src/types.ts +32 -2
  132. package/dist/index.d.mts +0 -128
  133. package/dist/index.d.ts +0 -128
  134. package/dist/index.js +0 -1097
  135. package/dist/index.js.map +0 -1
  136. package/dist/index.mjs +0 -1072
  137. package/dist/index.mjs.map +0 -1
  138. package/dist/persistence/index.d.mts +0 -2
  139. package/dist/persistence/index.d.ts +0 -2
  140. package/dist/persistence/index.js +0 -300
  141. package/dist/persistence/index.js.map +0 -1
  142. package/dist/persistence/index.mjs +0 -291
  143. package/dist/persistence/index.mjs.map +0 -1
@@ -1 +0,0 @@
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":["Platform","jsx","DEFAULT_THEME","Dimensions","useMemo","useAnimatedStyle","withTiming","Easing","Animated","styles","jsxs","View","StyleSheet","useEffect","useCallback","useRef"],"mappings":"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","file":"index.mjs","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"]}
@@ -1,2 +0,0 @@
1
- export { q as createApiAdapter, p as createAsyncStorageAdapter, r as createCompositeAdapter, o as createLocalStorageAdapter, n as createMemoryAdapter, m as createNoopAdapter, u as useGuidonPersistence, s as useShouldShowGuidon } from '../index-D_JFvCIg.mjs';
2
- import 'react';
@@ -1,2 +0,0 @@
1
- export { q as createApiAdapter, p as createAsyncStorageAdapter, r as createCompositeAdapter, o as createLocalStorageAdapter, n as createMemoryAdapter, m as createNoopAdapter, u as useGuidonPersistence, s as useShouldShowGuidon } from '../index-D_JFvCIg.js';
2
- import 'react';
@@ -1,300 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
-
5
- // src/persistence/adapters.ts
6
- var STORAGE_KEY_PREFIX = "@guidon:";
7
- var createNoopAdapter = () => ({
8
- loadProgress: async () => null,
9
- saveProgress: async () => {
10
- },
11
- loadAllProgress: async () => ({}),
12
- clearProgress: async () => {
13
- }
14
- });
15
- var createMemoryAdapter = () => {
16
- const store = {};
17
- return {
18
- loadProgress: async (guidonId) => store[guidonId] ?? null,
19
- saveProgress: async (progress) => {
20
- store[progress.guidonId] = progress;
21
- },
22
- loadAllProgress: async () => ({ ...store }),
23
- clearProgress: async (guidonId) => {
24
- delete store[guidonId];
25
- }
26
- };
27
- };
28
- var createLocalStorageAdapter = (keyPrefix = STORAGE_KEY_PREFIX) => ({
29
- loadProgress: async (guidonId) => {
30
- if (typeof window === "undefined" || !window.localStorage) {
31
- return null;
32
- }
33
- try {
34
- const data = localStorage.getItem(`${keyPrefix}${guidonId}`);
35
- return data ? JSON.parse(data) : null;
36
- } catch {
37
- return null;
38
- }
39
- },
40
- saveProgress: async (progress) => {
41
- if (typeof window === "undefined" || !window.localStorage) {
42
- return;
43
- }
44
- try {
45
- localStorage.setItem(
46
- `${keyPrefix}${progress.guidonId}`,
47
- JSON.stringify(progress)
48
- );
49
- } catch {
50
- }
51
- },
52
- loadAllProgress: async () => {
53
- if (typeof window === "undefined" || !window.localStorage) {
54
- return {};
55
- }
56
- const result = {};
57
- try {
58
- for (let i = 0; i < localStorage.length; i++) {
59
- const key = localStorage.key(i);
60
- if (key?.startsWith(keyPrefix)) {
61
- const data = localStorage.getItem(key);
62
- if (data) {
63
- const progress = JSON.parse(data);
64
- result[progress.guidonId] = progress;
65
- }
66
- }
67
- }
68
- } catch {
69
- }
70
- return result;
71
- },
72
- clearProgress: async (guidonId) => {
73
- if (typeof window === "undefined" || !window.localStorage) {
74
- return;
75
- }
76
- try {
77
- localStorage.removeItem(`${keyPrefix}${guidonId}`);
78
- } catch {
79
- }
80
- }
81
- });
82
- var createAsyncStorageAdapter = (asyncStorage, keyPrefix = STORAGE_KEY_PREFIX) => ({
83
- loadProgress: async (guidonId) => {
84
- try {
85
- const data = await asyncStorage.getItem(`${keyPrefix}${guidonId}`);
86
- return data ? JSON.parse(data) : null;
87
- } catch {
88
- return null;
89
- }
90
- },
91
- saveProgress: async (progress) => {
92
- try {
93
- await asyncStorage.setItem(
94
- `${keyPrefix}${progress.guidonId}`,
95
- JSON.stringify(progress)
96
- );
97
- } catch {
98
- }
99
- },
100
- loadAllProgress: async () => {
101
- const result = {};
102
- try {
103
- const allKeys = await asyncStorage.getAllKeys();
104
- const relevantKeys = allKeys.filter((key) => key.startsWith(keyPrefix));
105
- const pairs = await asyncStorage.multiGet(relevantKeys);
106
- for (const [, value] of pairs) {
107
- if (value) {
108
- const progress = JSON.parse(value);
109
- result[progress.guidonId] = progress;
110
- }
111
- }
112
- } catch {
113
- }
114
- return result;
115
- },
116
- clearProgress: async (guidonId) => {
117
- try {
118
- await asyncStorage.removeItem(`${keyPrefix}${guidonId}`);
119
- } catch {
120
- }
121
- }
122
- });
123
- var createApiAdapter = (handlers) => {
124
- const noopAdapter = createNoopAdapter();
125
- return {
126
- loadProgress: handlers.loadProgress ?? noopAdapter.loadProgress,
127
- saveProgress: handlers.saveProgress ?? noopAdapter.saveProgress,
128
- loadAllProgress: handlers.loadAllProgress ?? noopAdapter.loadAllProgress,
129
- clearProgress: handlers.clearProgress ?? noopAdapter.clearProgress
130
- };
131
- };
132
- var createCompositeAdapter = (adapters) => ({
133
- loadProgress: async (guidonId) => {
134
- for (const adapter of adapters) {
135
- const progress = await adapter.loadProgress(guidonId);
136
- if (progress) return progress;
137
- }
138
- return null;
139
- },
140
- saveProgress: async (progress) => {
141
- await Promise.all(adapters.map((adapter) => adapter.saveProgress(progress)));
142
- },
143
- loadAllProgress: async () => {
144
- const result = {};
145
- for (const adapter of adapters) {
146
- if (adapter.loadAllProgress) {
147
- const data = await adapter.loadAllProgress();
148
- Object.assign(result, data);
149
- }
150
- }
151
- return result;
152
- },
153
- clearProgress: async (guidonId) => {
154
- await Promise.all(
155
- adapters.map((adapter) => adapter.clearProgress?.(guidonId))
156
- );
157
- }
158
- });
159
- function useGuidonPersistence(adapter, guidonId) {
160
- const [progress, setProgress] = react.useState(null);
161
- const [isLoading, setIsLoading] = react.useState(true);
162
- const [error, setError] = react.useState(null);
163
- react.useEffect(() => {
164
- if (!adapter) {
165
- setIsLoading(false);
166
- return;
167
- }
168
- let mounted = true;
169
- const loadProgress = async () => {
170
- try {
171
- setIsLoading(true);
172
- setError(null);
173
- const data = await adapter.loadProgress(guidonId);
174
- if (mounted) {
175
- setProgress(data);
176
- }
177
- } catch (err) {
178
- if (mounted) {
179
- setError(err instanceof Error ? err.message : "Failed to load progress");
180
- }
181
- } finally {
182
- if (mounted) {
183
- setIsLoading(false);
184
- }
185
- }
186
- };
187
- loadProgress();
188
- return () => {
189
- mounted = false;
190
- };
191
- }, [adapter, guidonId]);
192
- const saveProgress = react.useCallback(
193
- async (newProgress) => {
194
- if (!adapter) return;
195
- const fullProgress = {
196
- ...newProgress,
197
- guidonId
198
- };
199
- try {
200
- setError(null);
201
- await adapter.saveProgress(fullProgress);
202
- setProgress(fullProgress);
203
- } catch (err) {
204
- setError(err instanceof Error ? err.message : "Failed to save progress");
205
- throw err;
206
- }
207
- },
208
- [adapter, guidonId]
209
- );
210
- const clearProgress = react.useCallback(async () => {
211
- if (!adapter?.clearProgress) return;
212
- try {
213
- setError(null);
214
- await adapter.clearProgress(guidonId);
215
- setProgress(null);
216
- } catch (err) {
217
- setError(err instanceof Error ? err.message : "Failed to clear progress");
218
- throw err;
219
- }
220
- }, [adapter, guidonId]);
221
- const markCompleted = react.useCallback(async () => {
222
- const currentCount = progress?.completionCount ?? 0;
223
- await saveProgress({
224
- completed: true,
225
- completedAt: (/* @__PURE__ */ new Date()).toISOString(),
226
- completionCount: currentCount + 1
227
- });
228
- }, [saveProgress, progress?.completionCount]);
229
- const markStepViewed = react.useCallback(
230
- async (stepIndex) => {
231
- await saveProgress({
232
- completed: progress?.completed ?? false,
233
- lastStepIndex: stepIndex,
234
- completedAt: progress?.completedAt,
235
- completionCount: progress?.completionCount
236
- });
237
- },
238
- [saveProgress, progress]
239
- );
240
- return {
241
- progress,
242
- isLoading,
243
- error,
244
- isCompleted: progress?.completed ?? false,
245
- hasStarted: progress !== null,
246
- saveProgress,
247
- clearProgress,
248
- markCompleted,
249
- markStepViewed
250
- };
251
- }
252
- function useShouldShowGuidon(adapter, guidonId, options) {
253
- const { progress, isLoading } = useGuidonPersistence(adapter, guidonId);
254
- const [shouldShow, setShouldShow] = react.useState(false);
255
- const [isChecking, setIsChecking] = react.useState(true);
256
- react.useEffect(() => {
257
- if (isLoading) return;
258
- const checkCondition = async () => {
259
- setIsChecking(true);
260
- if (options?.forceShow) {
261
- setShouldShow(true);
262
- setIsChecking(false);
263
- return;
264
- }
265
- if (progress?.completed) {
266
- setShouldShow(false);
267
- setIsChecking(false);
268
- return;
269
- }
270
- if (options?.additionalCondition) {
271
- try {
272
- const result = await options.additionalCondition();
273
- setShouldShow(result);
274
- } catch {
275
- setShouldShow(true);
276
- }
277
- } else {
278
- setShouldShow(true);
279
- }
280
- setIsChecking(false);
281
- };
282
- checkCondition();
283
- }, [isLoading, progress?.completed, options?.forceShow, options?.additionalCondition]);
284
- return {
285
- shouldShow,
286
- isChecking: isLoading || isChecking,
287
- isCompleted: progress?.completed ?? false
288
- };
289
- }
290
-
291
- exports.createApiAdapter = createApiAdapter;
292
- exports.createAsyncStorageAdapter = createAsyncStorageAdapter;
293
- exports.createCompositeAdapter = createCompositeAdapter;
294
- exports.createLocalStorageAdapter = createLocalStorageAdapter;
295
- exports.createMemoryAdapter = createMemoryAdapter;
296
- exports.createNoopAdapter = createNoopAdapter;
297
- exports.useGuidonPersistence = useGuidonPersistence;
298
- exports.useShouldShowGuidon = useShouldShowGuidon;
299
- //# sourceMappingURL=index.js.map
300
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/persistence/adapters.ts","../../src/persistence/hooks.ts"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["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","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"]}