@numidev/react-joyride 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +93 -0
- package/dist/index.cjs +2677 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +753 -0
- package/dist/index.d.mts +753 -0
- package/dist/index.mjs +2638 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +158 -0
- package/src/components/Arrow.tsx +138 -0
- package/src/components/Beacon.tsx +141 -0
- package/src/components/Floater.tsx +381 -0
- package/src/components/Loader.tsx +80 -0
- package/src/components/Overlay.tsx +167 -0
- package/src/components/Portal.tsx +17 -0
- package/src/components/Step.tsx +72 -0
- package/src/components/Tooltip/CloseButton.tsx +29 -0
- package/src/components/Tooltip/DefaultTooltip.tsx +82 -0
- package/src/components/Tooltip/index.tsx +163 -0
- package/src/components/TourRenderer.tsx +157 -0
- package/src/defaults.ts +64 -0
- package/src/global.d.ts +8 -0
- package/src/hooks/useControls.ts +219 -0
- package/src/hooks/useDebugLogger.ts +58 -0
- package/src/hooks/useEventEmitter.ts +55 -0
- package/src/hooks/useFocusTrap.ts +72 -0
- package/src/hooks/useJoyride.tsx +32 -0
- package/src/hooks/useLifecycleEffect.ts +512 -0
- package/src/hooks/usePortalElement.ts +49 -0
- package/src/hooks/usePropSync.ts +84 -0
- package/src/hooks/useScrollEffect.ts +217 -0
- package/src/hooks/useTargetPosition.ts +154 -0
- package/src/hooks/useTourEngine.ts +106 -0
- package/src/index.tsx +23 -0
- package/src/literals/index.ts +61 -0
- package/src/modules/changes.ts +20 -0
- package/src/modules/dom.ts +359 -0
- package/src/modules/helpers.tsx +230 -0
- package/src/modules/step.ts +156 -0
- package/src/modules/store.ts +215 -0
- package/src/modules/svg.ts +40 -0
- package/src/styles.ts +183 -0
- package/src/types/common.ts +315 -0
- package/src/types/components.ts +84 -0
- package/src/types/events.ts +89 -0
- package/src/types/floating.ts +60 -0
- package/src/types/index.ts +8 -0
- package/src/types/props.ts +124 -0
- package/src/types/state.ts +49 -0
- package/src/types/step.ts +108 -0
- package/src/types/utilities.ts +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["is","is","is","is","is","is","is","CloseButton","DefaultTooltip","autoUpdate","Beacon","Portal","is","Floater","Step","Portal","Loader","Overlay"],"sources":["../src/defaults.ts","../src/literals/index.ts","../src/modules/helpers.tsx","../src/modules/dom.ts","../src/styles.ts","../src/modules/step.ts","../src/modules/store.ts","../src/hooks/useControls.ts","../src/hooks/useDebugLogger.ts","../src/hooks/useEventEmitter.ts","../src/modules/changes.ts","../src/hooks/useLifecycleEffect.ts","../src/hooks/usePropSync.ts","../src/hooks/useScrollEffect.ts","../src/hooks/useTourEngine.ts","../src/hooks/usePortalElement.ts","../src/components/Loader.tsx","../src/hooks/useTargetPosition.ts","../src/modules/svg.ts","../src/components/Overlay.tsx","../src/components/Portal.tsx","../src/hooks/useFocusTrap.ts","../src/components/Arrow.tsx","../src/components/Beacon.tsx","../src/components/Tooltip/CloseButton.tsx","../src/components/Tooltip/DefaultTooltip.tsx","../src/components/Tooltip/index.tsx","../src/components/Floater.tsx","../src/components/Step.tsx","../src/components/TourRenderer.tsx","../src/hooks/useJoyride.tsx","../src/index.tsx"],"sourcesContent":["import type { FloatingOptions, Locale, Options, Props, Step } from '~/types';\n\nexport const defaultOptions: Required<Omit<Options, 'after' | 'before'>> = {\n arrowBase: 32,\n arrowColor: '#ffffff',\n arrowSize: 16,\n arrowSpacing: 12,\n backgroundColor: '#ffffff',\n beaconSize: 36,\n beaconTrigger: 'click',\n beforeTimeout: 5000,\n blockTargetInteraction: false,\n buttons: ['back', 'close', 'primary'],\n closeButtonAction: 'close',\n disableFocusTrap: false,\n dismissKeyAction: 'close',\n hideOverlay: false,\n loaderDelay: 300,\n offset: 10,\n overlayClickAction: 'close',\n overlayColor: '#00000080',\n primaryColor: '#000000',\n scrollDuration: 300,\n scrollOffset: 20,\n showProgress: false,\n skipBeacon: false,\n skipScroll: false,\n spotlightPadding: 10,\n spotlightRadius: 4,\n targetWaitTimeout: 1000,\n textColor: '#000000',\n width: 380,\n zIndex: 100,\n};\n\nexport const defaultFloatingOptions: FloatingOptions = {\n beaconOptions: {\n offset: -18,\n },\n};\n\nexport const defaultLocale: Locale = {\n back: 'Back',\n close: 'Close',\n last: 'Last',\n next: 'Next',\n nextWithProgress: 'Next ({current} of {total})',\n open: 'Open the dialog',\n skip: 'Skip',\n};\n\nexport const defaultStep = {\n isFixed: false,\n locale: defaultLocale,\n placement: 'bottom',\n} satisfies Omit<Step, 'content' | 'target'>;\n\nexport const defaultProps = {\n continuous: false,\n debug: false,\n run: false,\n scrollToFirstStep: false,\n steps: [],\n} satisfies Props;\n","export const ACTIONS = {\n INIT: 'init',\n START: 'start',\n STOP: 'stop',\n RESET: 'reset',\n PREV: 'prev',\n NEXT: 'next',\n GO: 'go',\n CLOSE: 'close',\n SKIP: 'skip',\n REPLAY: 'replay',\n UPDATE: 'update',\n COMPLETE: 'complete',\n} as const;\n\nexport const EVENTS = {\n TOUR_START: 'tour:start',\n STEP_BEFORE_HOOK: 'step:before_hook',\n STEP_BEFORE: 'step:before',\n SCROLL_START: 'scroll:start',\n SCROLL_END: 'scroll:end',\n BEACON: 'beacon',\n TOOLTIP: 'tooltip',\n STEP_AFTER: 'step:after',\n STEP_AFTER_HOOK: 'step:after_hook',\n TOUR_END: 'tour:end',\n TOUR_STATUS: 'tour:status',\n TARGET_NOT_FOUND: 'error:target_not_found',\n ERROR: 'error',\n} as const;\n\nexport const LIFECYCLE = {\n INIT: 'init',\n READY: 'ready',\n BEACON_BEFORE: 'beacon_before',\n BEACON: 'beacon',\n TOOLTIP_BEFORE: 'tooltip_before',\n TOOLTIP: 'tooltip',\n COMPLETE: 'complete',\n} as const;\n\nexport const ORIGIN = {\n BUTTON_BACK: 'button_back',\n BUTTON_CLOSE: 'button_close',\n BUTTON_PRIMARY: 'button_primary',\n BUTTON_SKIP: 'button_skip',\n KEYBOARD: 'keyboard',\n OVERLAY: 'overlay',\n} as const;\n\nexport const STATUS = {\n IDLE: 'idle',\n READY: 'ready',\n WAITING: 'waiting',\n RUNNING: 'running',\n PAUSED: 'paused',\n SKIPPED: 'skipped',\n FINISHED: 'finished',\n} as const;\n\nexport const PORTAL_ELEMENT_ID = 'react-joyride-portal';\n","import { cloneElement, type FC, isValidElement, type ReactElement, type ReactNode } from 'react';\nimport innerText from 'react-innertext';\nimport deepmergeFactory from '@fastify/deepmerge';\nimport is from 'is-lite';\n\nimport type { AnyObject, NarrowPlainObject, PlainObject, Simplify } from '~/types';\n\ntype RemoveType<TObject, TExclude = undefined> = {\n [Key in keyof TObject as TObject[Key] extends TExclude ? never : Key]: TObject[Key];\n};\n\ninterface GetReactNodeTextOptions {\n defaultValue?: any;\n step?: number;\n steps?: number;\n}\n\n/**\n * Remove properties with undefined value from an object\n */\nexport function cleanUpObject<T extends PlainObject>(input: T) {\n const output: Record<string, unknown> = {};\n\n for (const key in input) {\n if (input[key] !== undefined) {\n output[key] = input[key];\n }\n }\n\n return output as RemoveType<T>;\n}\n\nexport function deepMerge<T extends object>(...objects: object[]): T {\n return deepmergeFactory({\n all: true,\n isMergeableObject: (value): value is object =>\n !(!is.plainObject(value) || isValidElement(value)),\n })(...objects) as T;\n}\n\n/**\n * Get Object type\n */\nexport function getObjectType(value: unknown): string {\n return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();\n}\n\nexport function getReactNodeText(input: ReactNode, options: GetReactNodeTextOptions = {}): string {\n const { defaultValue, step, steps } = options;\n let text = innerText(input);\n\n if (!text) {\n if (\n isValidElement(input) &&\n !Object.values(input.props as Record<string, unknown>).length &&\n getObjectType(input.type) === 'function'\n ) {\n try {\n const component = (input.type as FC)({}) as ReactNode;\n\n text = getReactNodeText(component, options);\n } catch {\n text = innerText(defaultValue);\n }\n } else {\n text = innerText(defaultValue);\n }\n } else if ((text.includes('{current}') || text.includes('{total}')) && step && steps) {\n text = text.replace('{current}', step.toString()).replace('{total}', steps.toString());\n }\n\n return text;\n}\n\n/**\n * Log method calls if debug is enabled\n */\nexport function log(debug: boolean, scope: string, title: string, ...data: unknown[]): void {\n if (!debug) {\n return;\n }\n\n const now = new Date();\n const time = `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}.${String(now.getMilliseconds()).padStart(3, '0')}`;\n\n // eslint-disable-next-line no-console\n console.log(\n `${scope} %c${title}%c ${time}`,\n 'font-weight: bold',\n 'color: gray; font-weight: normal',\n ...data,\n );\n}\n\n/**\n * Merges the defaultProps with literal values with the incoming props, removing undefined values from it that would override the defaultProps.\n * The result is a type-safe object with the defaultProps as required properties.\n */\nexport function mergeProps<TDefaultProps extends PlainObject<any>, TProps extends PlainObject<any>>(\n defaultProps: TDefaultProps,\n props: TProps,\n) {\n const cleanProps = cleanUpObject(props);\n\n return { ...defaultProps, ...cleanProps } as unknown as Simplify<\n TProps & Required<Pick<TProps, keyof TDefaultProps & string>>\n >;\n}\n\n/**\n * A function that does nothing.\n */\nexport function noop() {\n return undefined;\n}\n\n/**\n * Type-safe Object.keys()\n */\nexport function objectKeys<T extends AnyObject>(input: T) {\n return Object.keys(input) as Array<keyof T>;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends Record<string, any>, K extends keyof T>(\n input: NarrowPlainObject<T>,\n ...filter: K[]\n) {\n if (!is.plainObject(input)) {\n throw new TypeError('Expected an object');\n }\n\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key) && !filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n\n return output as Omit<T, K>;\n}\n\n/**\n * Select properties from an object\n */\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n input: NarrowPlainObject<T>,\n ...filter: K[]\n) {\n if (!is.plainObject(input)) {\n throw new TypeError('Expected an object');\n }\n\n if (!filter.length) {\n return input;\n }\n\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key) && filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n\n return output as Pick<T, K>;\n}\n\nexport function replaceLocaleContent(input: ReactNode, step: number, steps: number): ReactNode {\n const replacer = (text: string) =>\n text.replace('{current}', String(step)).replace('{total}', String(steps));\n\n if (getObjectType(input) === 'string') {\n return replacer(input as string);\n }\n\n if (!isValidElement(input)) {\n return input;\n }\n\n const { children } = input.props as { children?: ReactNode };\n\n if (is.string(children) && children.includes('{current}')) {\n return cloneElement(input as ReactElement<{ children?: ReactNode }>, {\n children: replacer(children),\n });\n }\n\n if (Array.isArray(children)) {\n return cloneElement(input as ReactElement<{ children?: ReactNode }>, {\n children: children.map((child: ReactNode) => {\n if (typeof child === 'string') {\n return replacer(child);\n }\n\n return replaceLocaleContent(child, step, steps);\n }),\n });\n }\n\n if (is.function(input.type) && !Object.values(input.props as Record<string, unknown>).length) {\n try {\n const component = (input.type as FC)({}) as ReactNode;\n\n return replaceLocaleContent(component, step, steps);\n } catch {\n return input;\n }\n }\n\n return input;\n}\n\n/**\n * Sort object keys\n */\nexport function sortObjectKeys<T extends PlainObject>(input: T) {\n return objectKeys(input)\n .sort()\n .reduce((acc, key) => {\n acc[key] = input[key];\n\n return acc;\n }, {} as T);\n}\n","import scroll from 'scroll';\nimport scrollParent from 'scrollparent';\n\nimport { LIFECYCLE } from '~/literals';\n\nimport type { Lifecycle, StepMerged, StepTarget } from '~/types';\n\ninterface NeedsScrollingOptions {\n isFirstStep: boolean;\n scrollToFirstStep: boolean;\n step: StepMerged;\n target: HTMLElement | null;\n targetLifecycle?: Lifecycle;\n}\n\nexport function canUseDOM() {\n return !!(typeof window !== 'undefined' && window.document?.createElement);\n}\n\n/**\n * Get the absolute document-relative offset of an element by walking up the offsetParent chain.\n */\nexport function getAbsoluteOffset(element: HTMLElement): { left: number; top: number } {\n let top = 0;\n let left = 0;\n let current: HTMLElement | null = element;\n\n while (current) {\n top += current.offsetTop;\n left += current.offsetLeft;\n current = current.offsetParent as HTMLElement | null;\n }\n\n return { left, top };\n}\n\n/**\n * Find the bounding client rect\n */\nexport function getClientRect(element: HTMLElement | null) {\n if (!element) {\n return null;\n }\n\n return element.getBoundingClientRect();\n}\n\n/**\n * Helper function to get the browser-normalized \"document height\"\n */\nexport function getDocumentHeight(median = false): number {\n const { body, documentElement } = document;\n\n if (!body || !documentElement) {\n return 0;\n }\n\n if (median) {\n const heights = [\n body.scrollHeight,\n body.offsetHeight,\n documentElement.clientHeight,\n documentElement.scrollHeight,\n documentElement.offsetHeight,\n ].sort((a, b) => a - b);\n const middle = Math.floor(heights.length / 2);\n\n if (heights.length % 2 === 0) {\n return (heights[middle - 1] + heights[middle]) / 2;\n }\n\n return heights[middle];\n }\n\n return Math.max(\n body.scrollHeight,\n body.offsetHeight,\n documentElement.clientHeight,\n documentElement.scrollHeight,\n documentElement.offsetHeight,\n );\n}\n\n/**\n * Find and return the target DOM element based on a step's 'target'.\n */\nexport function getElement(element?: StepTarget): HTMLElement | null {\n if (!element) {\n return null;\n }\n\n if (typeof element === 'function') {\n try {\n return element();\n } catch (error: any) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n return null;\n }\n }\n\n if (typeof element === 'object' && 'current' in element) {\n return element.current;\n }\n\n if (typeof element === 'string') {\n try {\n return document.querySelector(element);\n } catch (error: any) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n return null;\n }\n }\n\n return element;\n}\n\n/**\n * Find and return the target DOM element based on a step's 'target'.\n */\nexport function getElementPosition(\n element: HTMLElement | null,\n offset: number,\n isFixed?: boolean,\n): number {\n const elementRect = getClientRect(element);\n const parent = getScrollParent(element);\n const hasScrollParent = parent ? !parent.isSameNode(scrollDocument()) : false;\n const isFixedTarget = isFixed ?? hasPosition(element);\n let parentTop = 0;\n let top = elementRect?.top ?? 0;\n\n if (hasScrollParent && isFixedTarget) {\n top = elementRect?.top ?? 0;\n } else if (parent instanceof HTMLElement) {\n parentTop = parent.scrollTop;\n\n if (!hasScrollParent && !isFixedTarget) {\n top += parentTop;\n }\n\n if (!parent.isSameNode(scrollDocument())) {\n top += scrollDocument().scrollTop;\n }\n }\n\n return Math.floor(top - offset);\n}\n\n/**\n * Get the scroll parent of an element.\n * If the detected parent doesn't actually scroll, fall back to the document.\n */\nexport function getScrollParent(element: HTMLElement | null, forListener?: boolean) {\n if (!element) {\n return scrollDocument();\n }\n\n const parent = scrollParent(element) as HTMLElement;\n\n if (parent) {\n if (parent.isSameNode(scrollDocument())) {\n if (forListener) {\n return document;\n }\n\n return scrollDocument();\n }\n\n const hasScrolling = parent.scrollHeight > parent.offsetHeight;\n\n if (!hasScrolling) {\n return scrollDocument();\n }\n }\n\n return parent;\n}\n\nexport function getScrollTargetToCenter(element: Element): number {\n const rect = element.getBoundingClientRect();\n const documentElement = scrollDocument();\n const containerCenter = rect.top + rect.height / 2;\n const viewportCenter = window.innerHeight / 2;\n\n return Math.max(0, documentElement.scrollTop + containerCenter - viewportCenter);\n}\n\n/**\n * Get the scrollTop position\n */\nexport function getScrollTo(element: HTMLElement | null, offset: number): number {\n if (!element) {\n return 0;\n }\n\n const parentElement = scrollParent(element) ?? (scrollDocument() as HTMLElement);\n const scrollMarginTop = parseFloat(getComputedStyle(element).scrollMarginTop) || 0;\n\n const parentRect = getClientRect(parentElement);\n const parentScrollTop = parentElement.scrollTop ?? 0;\n\n const { offsetTop = 0, scrollTop = 0 } = parentElement;\n let top = element.getBoundingClientRect().top + scrollTop;\n\n if (!!offsetTop && (hasCustomScrollParent(element) || hasCustomOffsetParent(element))) {\n const elementRect = element.getBoundingClientRect();\n const elementTopInContainer = elementRect.top - (parentRect?.top ?? 0);\n const elementBottomInContainer = elementTopInContainer + elementRect.height;\n const containerHeight = parentElement.clientHeight;\n const margin = containerHeight * 0.2;\n\n // eslint-disable-next-line unicorn/prefer-ternary\n if (elementTopInContainer >= margin && elementBottomInContainer <= containerHeight - margin) {\n top = parentScrollTop;\n } else {\n top = elementTopInContainer + parentScrollTop;\n }\n }\n\n const output = Math.floor(top - offset - scrollMarginTop);\n\n return output < 0 ? 0 : output;\n}\n\n/**\n * Check if the element has custom offset parent\n */\nexport function hasCustomOffsetParent(element: HTMLElement): boolean {\n return element.offsetParent !== document.body;\n}\n\n/**\n * Check if the element has custom scroll parent\n */\nexport function hasCustomScrollParent(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n\n const parent = getScrollParent(element);\n\n return parent ? !parent.isSameNode(scrollDocument()) : false;\n}\n\n/**\n * Check if an element has fixed/sticky position\n */\nexport function hasPosition(el: Element | Node | null, type: string = 'fixed'): boolean {\n if (!el || !(el instanceof Element)) {\n return false;\n }\n\n const { nodeName } = el;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n\n if (getComputedStyle(el).position === type) {\n return true;\n }\n\n if (!el.parentNode) {\n return false;\n }\n\n return hasPosition(el.parentNode, type);\n}\n\n/**\n * Check if the element is visible\n */\nexport function isElementVisible(element: HTMLElement): boolean {\n if (!element) {\n return false;\n }\n\n let parentElement: HTMLElement | null = element;\n\n while (parentElement) {\n if (parentElement === document.body) {\n break;\n }\n\n if (parentElement instanceof HTMLElement) {\n const { display, visibility } = getComputedStyle(parentElement);\n\n if (display === 'none' || visibility === 'hidden') {\n return false;\n }\n }\n\n parentElement = parentElement.parentElement ?? null;\n }\n\n return true;\n}\n\nexport function needsScrolling(options: NeedsScrollingOptions): boolean {\n const { isFirstStep, scrollToFirstStep, step, target, targetLifecycle } = options;\n\n if (\n step.skipScroll ||\n (isFirstStep && !scrollToFirstStep && targetLifecycle !== LIFECYCLE.TOOLTIP) ||\n step.placement === 'center'\n ) {\n return false;\n }\n\n const parent = (target?.isConnected ? getScrollParent(target) : scrollDocument()) as Element;\n const isCustomScrollParent = parent ? !parent.isSameNode(scrollDocument()) : false;\n\n if ((step.isFixed || hasPosition(target)) && !isCustomScrollParent) {\n return false;\n }\n\n return parent.scrollHeight > parent.clientHeight;\n}\n\nexport function scrollDocument(): Element | HTMLElement {\n return document.scrollingElement ?? document.documentElement;\n}\n\n/**\n * Scroll to position\n */\nexport function scrollTo(\n value: number,\n options: { duration?: number; element: Element | HTMLElement },\n): { cancel: () => void; promise: Promise<void> } {\n const { duration, element } = options;\n\n let cancel: () => void = () => {};\n\n const promise = new Promise<void>(resolve => {\n const { scrollTop } = element;\n\n const limit = value > scrollTop ? value - scrollTop : scrollTop - value;\n\n cancel = scroll.top(\n element as HTMLElement,\n value,\n { duration: limit < 100 ? 50 : duration },\n () => {\n resolve();\n },\n );\n });\n\n return { cancel, promise };\n}\n","import { canUseDOM } from '~/modules/dom';\nimport { deepMerge } from '~/modules/helpers';\n\nimport type { Props, StepMerged, Styles } from '~/types';\n\n/**\n * Convert hex to RGB\n */\nexport function hexToRGB(hex: string): Array<number> {\n const shorthandRegex = /^#?([\\da-f])([\\da-f])([\\da-f])$/i;\n const properHex = hex.replace(shorthandRegex, (_m, r, g, b) => r + r + g + g + b + b);\n\n const result = /^#?([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})/i.exec(properHex);\n\n return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [];\n}\n\nconst buttonReset = {\n backgroundColor: 'transparent',\n border: 0,\n borderRadius: 0,\n color: '#555555',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n padding: 0,\n WebkitAppearance: 'none',\n};\n\nconst buttonBase = {\n ...buttonReset,\n borderRadius: 4,\n padding: 8,\n};\n\nexport default function getStyles(props: Props, step: StepMerged) {\n const { styles } = props;\n const mergedStyles = deepMerge<Styles>(styles ?? {}, step.styles ?? {});\n let { width } = step;\n\n if (canUseDOM()) {\n width = typeof width === 'number' && window.innerWidth < width ? window.innerWidth - 30 : width;\n }\n\n const overlay = {\n bottom: 0,\n left: 0,\n overflow: 'hidden',\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: step.zIndex,\n };\n\n const defaultStyles = {\n arrow: {\n alignItems: 'center',\n color: step.arrowColor,\n display: 'inline-flex',\n justifyContent: 'center',\n position: 'absolute',\n },\n beaconWrapper: {\n ...buttonReset,\n display: 'inline-flex',\n borderRadius: '50%',\n position: 'relative',\n },\n beacon: {\n height: step.beaconSize,\n width: step.beaconSize,\n },\n beaconInner: {\n animation: 'joyride-beacon-inner 1.2s infinite ease-in-out',\n backgroundColor: step.primaryColor,\n borderRadius: '50%',\n display: 'block',\n height: '50%',\n left: '50%',\n opacity: 0.7,\n position: 'absolute',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: '50%',\n },\n beaconOuter: {\n animation: 'joyride-beacon-outer 1.2s infinite ease-in-out',\n backgroundColor: `rgba(${hexToRGB(step.primaryColor).join(',')}, 0.2)`,\n border: `2px solid ${step.primaryColor}`,\n borderRadius: '50%',\n boxSizing: 'border-box',\n display: 'block',\n height: '100%',\n left: 0,\n opacity: 0.9,\n position: 'absolute',\n top: 0,\n transformOrigin: 'center',\n width: '100%',\n },\n buttonBack: {\n ...buttonBase,\n color: step.primaryColor,\n marginLeft: 'auto',\n marginRight: 5,\n },\n buttonClose: {\n ...buttonBase,\n color: step.textColor,\n height: 12,\n padding: 8,\n position: 'absolute',\n right: 0,\n top: 0,\n width: 12,\n },\n buttonPrimary: {\n ...buttonBase,\n backgroundColor: step.primaryColor,\n color: step.backgroundColor,\n },\n buttonSkip: {\n ...buttonBase,\n color: step.textColor,\n fontSize: 14,\n },\n floater: {\n display: 'inline-block',\n filter: 'drop-shadow(0 0 3px rgba(0, 0, 0, 0.3))',\n maxWidth: '100%',\n transition: 'opacity 0.3s',\n },\n loader: {\n alignItems: 'center',\n display: 'flex',\n height: 48,\n inset: 0,\n justifyContent: 'center',\n pointerEvents: 'none',\n position: 'fixed',\n width: 48,\n zIndex: step.zIndex + 1,\n },\n overlay: {\n ...overlay,\n backgroundColor: step.overlayColor,\n },\n spotlight: {},\n tooltip: {\n backgroundColor: step.backgroundColor,\n borderRadius: 5,\n boxSizing: 'border-box',\n color: step.textColor,\n fontSize: 16,\n maxWidth: '100%',\n padding: 12,\n position: 'relative',\n width,\n },\n tooltipContainer: {\n lineHeight: 1.4,\n textAlign: 'center',\n },\n tooltipTitle: {\n fontSize: 18,\n margin: 0,\n },\n tooltipContent: {\n paddingBottom: 12,\n paddingTop: 12,\n },\n tooltipFooter: {\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'flex-end',\n },\n tooltipFooterSpacer: {\n flex: 1,\n },\n };\n\n return deepMerge<Styles>(defaultStyles, mergedStyles);\n}\n","import is from 'is-lite';\n\nimport { defaultFloatingOptions, defaultLocale, defaultOptions, defaultStep } from '~/defaults';\nimport { ACTIONS } from '~/literals';\nimport getStyles from '~/styles';\n\nimport type {\n Actions,\n FloatingOptions,\n Locale,\n Options,\n Props,\n SpotlightPadding,\n State,\n Step,\n StepMerged,\n} from '~/types';\n\nimport { deepMerge, log, pick } from './helpers';\n\nconst optionFieldNames = [\n 'after',\n 'arrowBase',\n 'arrowColor',\n 'arrowSize',\n 'arrowSpacing',\n 'backgroundColor',\n 'beaconSize',\n 'beaconTrigger',\n 'before',\n 'beforeTimeout',\n 'buttons',\n 'closeButtonAction',\n 'skipBeacon',\n 'dismissKeyAction',\n 'disableFocusTrap',\n 'hideOverlay',\n 'skipScroll',\n 'blockTargetInteraction',\n 'loaderDelay',\n 'offset',\n 'overlayClickAction',\n 'overlayColor',\n 'primaryColor',\n 'scrollDuration',\n 'scrollOffset',\n 'showProgress',\n 'spotlightPadding',\n 'spotlightRadius',\n 'targetWaitTimeout',\n 'textColor',\n 'width',\n 'zIndex',\n] as const satisfies ReadonlyArray<keyof Options>;\n\nexport function getMergedStep(props: Props, currentStep?: Step): StepMerged | null {\n if (!currentStep) {\n return null;\n }\n\n const mergedStep = deepMerge<StepMerged>(\n defaultStep,\n pick(\n props,\n 'arrowComponent',\n 'beaconComponent',\n 'floatingOptions',\n 'loaderComponent',\n 'locale',\n 'styles',\n 'tooltipComponent',\n ),\n currentStep,\n );\n\n const mergedOptions = deepMerge<Options>(\n defaultOptions,\n props.options ?? {},\n pick(currentStep, ...optionFieldNames),\n );\n\n const mergedStyles = getStyles(props, { ...mergedStep, ...mergedOptions } as StepMerged);\n\n const floatingOptions = deepMerge<FloatingOptions>(\n defaultFloatingOptions,\n props.floatingOptions ?? {},\n mergedStep.floatingOptions ?? {},\n );\n\n return {\n ...mergedStep,\n ...mergedOptions,\n locale: deepMerge<Locale>(defaultLocale, props.locale ?? {}, mergedStep.locale || {}),\n floatingOptions,\n spotlightPadding: normalizeSpotlightPadding(mergedOptions.spotlightPadding),\n styles: mergedStyles,\n };\n}\n\nexport function normalizeSpotlightPadding(\n value: number | SpotlightPadding | undefined,\n): Required<SpotlightPadding> {\n if (typeof value === 'number') {\n return { top: value, right: value, bottom: value, left: value };\n }\n\n return {\n top: value?.top ?? 0,\n right: value?.right ?? 0,\n bottom: value?.bottom ?? 0,\n left: value?.left ?? 0,\n };\n}\n\n/**\n * Decide if the step shouldn't skip the beacon\n */\nexport function shouldHideBeacon(step: Step, state: State, continuous: boolean): boolean {\n const { action } = state;\n\n const withContinuous = continuous && ([ACTIONS.PREV, ACTIONS.NEXT] as Actions[]).includes(action);\n\n return step.skipBeacon || step.placement === 'center' || withContinuous;\n}\n\n/**\n * Validate if a step is valid\n */\nexport function validateStep(step: Step, debug: boolean = false): boolean {\n if (!is.plainObject(step)) {\n log(debug, 'tour', 'step must be an object');\n\n return false;\n }\n\n if (!step.target) {\n log(debug, 'tour', 'target is missing from the step');\n\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate if steps are valid\n */\nexport function validateSteps(steps: Array<Step>, debug: boolean = false): boolean {\n if (!is.array(steps)) {\n log(debug, 'tour', 'steps must be an array');\n\n return false;\n }\n\n return steps.every(d => validateStep(d, debug));\n}\n","import deepEqual from '@gilbarbara/deep-equal';\nimport is from 'is-lite';\n\nimport { ACTIONS, LIFECYCLE, STATUS } from '~/literals';\nimport { log, omit } from '~/modules/helpers';\nimport { getMergedStep } from '~/modules/step';\n\nimport type {\n Controls,\n EventData,\n EventHandler,\n Events,\n PositionData,\n Props,\n State,\n Step,\n StepMerged,\n} from '~/types';\n\ntype Listener = (state: StoreState) => void;\n\n/** Internal store state. Extends `State` with positioning tracking. */\nexport type StoreState = State & { positioned: boolean };\n\nclass Store {\n private beaconPosition: PositionData | null = null;\n private readonly debug: boolean;\n private readonly eventListeners: Map<string, Set<EventHandler>> = new Map();\n private readonly listeners: Set<Listener> = new Set();\n private readonly props: Props;\n private snapshot: StoreState;\n private state: StoreState;\n private steps: Array<Step>;\n private tooltipPosition: PositionData | null = null;\n\n constructor(options?: Props) {\n const { initialStepIndex, stepIndex, steps = [] } = options ?? {};\n const isControlled = is.number(stepIndex);\n\n let startIndex = 0;\n\n this.debug = options?.debug ?? false;\n\n if (isControlled) {\n startIndex = stepIndex;\n\n if (is.number(initialStepIndex)) {\n log(this.debug, 'tour', 'initialStepIndex is ignored in controlled mode');\n }\n } else if (is.number(initialStepIndex)) {\n if (initialStepIndex >= 0 && initialStepIndex < steps.length) {\n startIndex = initialStepIndex;\n } else if (steps.length > 0) {\n log(this.debug, 'tour', 'initialStepIndex is out of bounds');\n }\n }\n\n this.props = options ?? { steps: [] };\n this.steps = steps;\n this.state = {\n action: ACTIONS.INIT,\n controlled: isControlled,\n index: startIndex,\n lifecycle: LIFECYCLE.INIT,\n origin: null,\n positioned: false,\n scrolling: false,\n size: steps.length,\n status: steps.length ? STATUS.READY : STATUS.IDLE,\n waiting: false,\n };\n this.snapshot = Object.freeze({ ...this.state });\n }\n\n private applyTransitions(draft: StoreState): StoreState {\n if (draft.status === STATUS.WAITING && draft.size > 0) {\n return { ...draft, status: STATUS.RUNNING };\n }\n\n return draft;\n }\n\n private getStep(nextIndex?: number): StepMerged | null {\n return getMergedStep(this.props, this.steps[nextIndex ?? this.state.index]);\n }\n\n public cleanupPositionData = () => {\n this.beaconPosition = null;\n this.tooltipPosition = null;\n };\n\n public getPositionData = (name: 'beacon' | 'tooltip'): PositionData | null => {\n if (name === 'beacon') {\n return this.beaconPosition;\n }\n\n return this.tooltipPosition;\n };\n\n public getServerSnapshot = (): StoreState => this.snapshot;\n\n public getSnapshot = (): StoreState => this.snapshot;\n\n public getEventState = (): Omit<StoreState, 'positioned'> => omit(this.snapshot, 'positioned');\n\n public getState = (): State => omit(this.snapshot, 'positioned');\n\n public setPositionData = (name: 'beacon' | 'tooltip', data: PositionData) => {\n const previous = name === 'beacon' ? this.beaconPosition : this.tooltipPosition;\n\n if (previous?.placement !== data.placement) {\n log(this.debug, `step:${this.state.index}`, 'positioned', `${name} ${data.placement}`);\n }\n\n if (name === 'beacon') {\n this.beaconPosition = data;\n } else {\n this.tooltipPosition = data;\n }\n\n const isBeforePhase =\n this.state.lifecycle === LIFECYCLE.BEACON_BEFORE ||\n this.state.lifecycle === LIFECYCLE.TOOLTIP_BEFORE;\n\n if (isBeforePhase && !this.state.positioned) {\n this.updateState({ positioned: true });\n }\n\n const onPosition = this.getStep()?.floatingOptions?.onPosition;\n\n if (onPosition) {\n onPosition(data);\n }\n };\n\n public setSteps = (steps: Array<Step>) => {\n this.steps = steps;\n\n this.updateState({ size: steps.length });\n };\n\n public dispatch = (data: EventData, controls: Controls): void => {\n const handlers = this.eventListeners.get(data.type);\n\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data, controls);\n } catch {\n // fire-and-forget: don't let subscriber errors break the tour or other subscribers\n }\n }\n }\n };\n\n public on = (eventType: Events, handler: EventHandler): (() => void) => {\n let handlers = this.eventListeners.get(eventType);\n\n if (!handlers) {\n handlers = new Set();\n this.eventListeners.set(eventType, handlers);\n }\n\n handlers.add(handler);\n\n return () => {\n handlers.delete(handler);\n };\n };\n\n public subscribe = (listener: Listener): (() => void) => {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n public updateState = (patch: Partial<StoreState>, forceIndex = false) => {\n const { controlled, index } = this.state;\n const previousSnapshot = this.snapshot;\n\n const resolvedIndex =\n controlled && !forceIndex && patch.index !== undefined ? index : (patch.index ?? index);\n\n const merged: StoreState = {\n action: patch.action ?? this.state.action,\n controlled,\n index: resolvedIndex,\n lifecycle: patch.lifecycle ?? this.state.lifecycle,\n origin: patch.origin ?? null,\n positioned: patch.positioned ?? this.state.positioned,\n scrolling: patch.scrolling ?? this.state.scrolling,\n size: patch.size ?? this.state.size,\n status: patch.status ?? this.state.status,\n waiting: patch.waiting ?? this.state.waiting,\n };\n\n const final = this.applyTransitions(merged);\n\n this.state = final;\n\n if (!deepEqual(previousSnapshot, final)) {\n this.snapshot = Object.freeze({ ...final });\n\n for (const listener of this.listeners) {\n listener(this.snapshot);\n }\n }\n };\n}\n\nexport default function createStore(options?: Props) {\n return new Store(options);\n}\n","import { type RefObject, useMemo, useRef } from 'react';\nimport is from 'is-lite';\n\nimport { ACTIONS, LIFECYCLE, STATUS } from '~/literals';\nimport { log, omit } from '~/modules/helpers';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Controls, Origin, Status } from '~/types';\n\nfunction getUpdatedIndex(nextIndex: number, size: number): number {\n return Math.min(Math.max(nextIndex, 0), size);\n}\n\nexport default function useControls(\n store: RefObject<ReturnType<typeof createStore>>,\n debug: boolean,\n clearFailures: () => void,\n): Controls {\n const debugRef = useRef(debug);\n const clearFailuresRef = useRef(clearFailures);\n\n debugRef.current = debug;\n clearFailuresRef.current = clearFailures;\n\n return useMemo(() => {\n const getState = (): StoreState => store.current.getSnapshot();\n\n const close = (origin: Origin | null = null) => {\n const { index, status } = getState();\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.CLOSE,\n index: index + 1,\n origin,\n lifecycle: LIFECYCLE.COMPLETE,\n positioned: false,\n scrolling: false,\n waiting: false,\n });\n };\n\n const go = (nextIndex: number) => {\n const { controlled, size, status } = getState();\n\n if (controlled) {\n log(debugRef.current, 'tour', 'go() is not supported in controlled mode');\n\n return;\n }\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.GO,\n index: nextIndex,\n lifecycle: LIFECYCLE.COMPLETE,\n positioned: false,\n scrolling: false,\n status: nextIndex < size ? status : STATUS.FINISHED,\n waiting: false,\n });\n };\n\n const info = () => omit(store.current.getSnapshot(), 'positioned');\n\n const next = (origin?: Origin | null) => {\n const { index, size, status } = getState();\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.NEXT,\n index: getUpdatedIndex(index + 1, size),\n lifecycle: LIFECYCLE.COMPLETE,\n origin,\n positioned: false,\n scrolling: false,\n waiting: false,\n });\n };\n\n const open = () => {\n const { status } = getState();\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.TOOLTIP_BEFORE,\n positioned: false,\n scrolling: false,\n waiting: false,\n });\n };\n\n const previous = (origin?: Origin | null) => {\n const { index, size, status } = getState();\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.PREV,\n index: getUpdatedIndex(index - 1, size),\n lifecycle: LIFECYCLE.COMPLETE,\n origin,\n positioned: false,\n scrolling: false,\n waiting: false,\n });\n };\n\n const replay = (origin?: Origin | null) => {\n const { lifecycle, status } = getState();\n\n if (status !== STATUS.RUNNING || lifecycle !== LIFECYCLE.TOOLTIP) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.REPLAY,\n lifecycle: LIFECYCLE.COMPLETE,\n origin,\n positioned: false,\n scrolling: false,\n waiting: false,\n });\n };\n\n const reset = (restart = false) => {\n const { controlled } = getState();\n\n if (controlled) {\n log(debugRef.current, 'tour', 'reset() is not supported in controlled mode');\n\n return;\n }\n\n clearFailuresRef.current();\n store.current.updateState({\n action: ACTIONS.RESET,\n index: 0,\n lifecycle: LIFECYCLE.INIT,\n positioned: false,\n scrolling: false,\n status: restart ? STATUS.RUNNING : STATUS.READY,\n waiting: false,\n });\n };\n\n const skip = (origin?: Extract<Origin, 'button_close' | 'button_skip'> | null) => {\n const { status } = getState();\n\n if (status !== STATUS.RUNNING) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.SKIP,\n lifecycle: LIFECYCLE.COMPLETE,\n origin,\n positioned: false,\n scrolling: false,\n status: STATUS.SKIPPED,\n waiting: false,\n });\n };\n\n const start = (nextIndex?: number) => {\n const { index, size } = getState();\n\n clearFailuresRef.current();\n store.current.updateState(\n {\n action: ACTIONS.START,\n index: is.number(nextIndex) ? nextIndex : index,\n lifecycle: LIFECYCLE.INIT,\n positioned: false,\n scrolling: false,\n status: size ? STATUS.RUNNING : STATUS.WAITING,\n waiting: false,\n },\n true,\n );\n };\n\n const stop = (advance = false) => {\n const { index, status } = getState();\n\n if (([STATUS.FINISHED, STATUS.SKIPPED] as Array<Status>).includes(status)) {\n return;\n }\n\n store.current.updateState({\n action: ACTIONS.STOP,\n index: index + (advance ? 1 : 0),\n lifecycle: LIFECYCLE.COMPLETE,\n positioned: false,\n scrolling: false,\n status: STATUS.PAUSED,\n waiting: false,\n });\n };\n\n return { close, go, info, next, open, prev: previous, replay, reset, skip, start, stop };\n }, [store]);\n}\n","import { type RefObject, useEffect, useRef } from 'react';\n\nimport { log } from '~/modules/helpers';\nimport type createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nconst skipFields = new Set(['origin', 'positioned']);\n\nexport default function useDebugLogger(\n store: RefObject<ReturnType<typeof createStore>>,\n debug: boolean,\n): void {\n const previousRef = useRef<StoreState | null>(null);\n\n useEffect(() => {\n if (!debug) {\n return undefined;\n }\n\n const current = store.current.getSnapshot();\n\n log(true, 'tour', 'init', current);\n previousRef.current = current;\n\n return store.current.subscribe(state => {\n const previous = previousRef.current;\n\n previousRef.current = state;\n\n if (!previous) {\n return;\n }\n\n const changes: Record<string, { from: unknown; to: unknown }> = {};\n let isTourLevel = false;\n\n for (const key of Object.keys(state) as Array<keyof StoreState>) {\n if (state[key] !== previous[key] && !skipFields.has(key)) {\n changes[key] = { from: previous[key], to: state[key] };\n\n if (key === 'status' || key === 'size') {\n isTourLevel = true;\n }\n }\n }\n\n if (Object.keys(changes).length) {\n const outOfBounds = !isTourLevel && state.index >= state.size;\n\n if (!outOfBounds) {\n const scope = isTourLevel ? 'tour' : `step:${state.index}`;\n\n log(true, scope, 'state', changes);\n }\n }\n });\n }, [debug, store]);\n}\n","import { type RefObject, useCallback, useRef } from 'react';\n\nimport createStore from '~/modules/store';\n\nimport type {\n Actions,\n Controls,\n EventData,\n EventHandler,\n Events,\n Lifecycle,\n ScrollData,\n StepMerged,\n} from '~/types';\n\nexport type EmitEvent = (\n type: Events,\n step: StepMerged,\n overrides?: {\n action?: Actions;\n error?: Error | null;\n index?: number;\n lifecycle?: Lifecycle;\n scroll?: ScrollData | null;\n },\n) => void;\n\nexport default function useEventEmitter(\n onEvent: EventHandler | undefined,\n controls: Controls,\n store: RefObject<ReturnType<typeof createStore>>,\n): EmitEvent {\n const onEventRef = useRef(onEvent);\n const controlsRef = useRef(controls);\n\n onEventRef.current = onEvent;\n controlsRef.current = controls;\n\n return useCallback(\n (type, step, overrides) => {\n const data: EventData = {\n ...store.current.getEventState(),\n error: null,\n scroll: null,\n step,\n type,\n ...overrides,\n };\n\n onEventRef.current?.(data, controlsRef.current);\n store.current.dispatch(data, controlsRef.current);\n },\n [store],\n );\n}\n","import type { StoreState } from '~/modules/store';\n\nexport function treeChanges<T extends Record<string, any> = StoreState>(state: T, previous: T) {\n return {\n hasChanged<K extends keyof T>(key: K): boolean {\n return state[key] !== previous[key];\n },\n hasChangedTo<K extends keyof T>(key: K, value: T[K] | T[K][]): boolean {\n const current = state[key];\n const previousValue = previous[key];\n\n if (Array.isArray(value)) {\n return value.includes(current) && !value.includes(previousValue);\n }\n\n return current === value && previousValue !== value;\n },\n previous,\n };\n}\n","import { type RefObject, useEffect, useRef } from 'react';\nimport { usePrevious } from '@gilbarbara/hooks';\n\nimport type { EmitEvent } from '~/hooks/useEventEmitter';\nimport type { AddFailure, MergedProps } from '~/hooks/useTourEngine';\nimport { ACTIONS, EVENTS, LIFECYCLE, STATUS } from '~/literals';\nimport { treeChanges } from '~/modules/changes';\nimport { getElement, isElementVisible, needsScrolling } from '~/modules/dom';\nimport { log } from '~/modules/helpers';\nimport { getMergedStep, shouldHideBeacon } from '~/modules/step';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Actions, Controls, StepMerged, StepTarget } from '~/types';\n\ninterface UseLifecycleEffectOptions {\n addFailure: AddFailure;\n controls: Controls;\n emitEvent: EmitEvent;\n previousState: StoreState | undefined;\n props: MergedProps;\n state: StoreState;\n step: StepMerged | null;\n store: RefObject<ReturnType<typeof createStore>>;\n}\n\nexport default function useLifecycleEffect(options: UseLifecycleEffectOptions): void {\n const { addFailure, controls, emitEvent, previousState, props, state, step, store } = options;\n const { action, index, lifecycle, positioned, scrolling, size, status } = state;\n\n const previousStep = usePrevious(step) ?? null;\n\n const lastAction = useRef<Actions | null>(null);\n const propsRef = useRef(props);\n const stateRef = useRef(state);\n const previousStateRef = useRef(previousState);\n const stepRef = useRef(step);\n const previousStepRef = useRef(previousStep);\n const controlsRef = useRef(controls);\n const pollingRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const pollingTargetRef = useRef<StepTarget | null>(null);\n const beforeRef = useRef<{ cancel: () => void } | null>(null);\n\n propsRef.current = props;\n stateRef.current = state;\n previousStateRef.current = previousState;\n stepRef.current = step;\n previousStepRef.current = previousStep;\n controlsRef.current = controls;\n\n const cleanup = () => {\n if (pollingRef.current) {\n clearInterval(pollingRef.current);\n pollingRef.current = null;\n }\n\n pollingTargetRef.current = null;\n\n if (beforeRef.current) {\n beforeRef.current.cancel();\n beforeRef.current = null;\n }\n };\n\n // Effect 1: Action tracking\n useEffect(() => {\n if (!previousStateRef.current) {\n return;\n }\n\n const { hasChangedTo } = treeChanges(stateRef.current, previousStateRef.current);\n\n const isAfterAction = hasChangedTo('action', [\n ACTIONS.NEXT,\n ACTIONS.PREV,\n ACTIONS.SKIP,\n ACTIONS.CLOSE,\n ACTIONS.REPLAY,\n ]);\n\n const isStaleAfterStart =\n action === ACTIONS.START &&\n (lastAction.current === ACTIONS.CLOSE || lastAction.current === ACTIONS.REPLAY);\n\n if (isAfterAction || isStaleAfterStart) {\n lastAction.current = action;\n }\n }, [action]);\n\n // Effect 2: Target resolution (INIT → READY)\n useEffect(() => {\n if (!previousStateRef.current) {\n return () => {\n cleanup();\n };\n }\n\n const { hasChanged } = treeChanges(stateRef.current, previousStateRef.current);\n const currentStep = stepRef.current;\n\n if (hasChanged('index')) {\n cleanup();\n }\n\n if (status !== STATUS.RUNNING || !currentStep || lifecycle !== LIFECYCLE.INIT) {\n return () => {\n cleanup();\n };\n }\n\n // Fire tour:start before any step processing when status just changed to RUNNING\n const { hasChangedTo: hasStatusChangedTo } = treeChanges(\n stateRef.current,\n previousStateRef.current,\n );\n\n if (\n hasStatusChangedTo('status', STATUS.RUNNING) &&\n ([STATUS.IDLE, STATUS.READY, STATUS.PAUSED] as string[]).includes(\n previousStateRef.current.status,\n )\n ) {\n emitEvent(EVENTS.TOUR_START, currentStep);\n }\n\n store.current.cleanupPositionData();\n\n const { debug } = propsRef.current;\n\n if (currentStep.before && !beforeRef.current) {\n log(debug, `step:${index}`, 'before()', currentStep);\n beforeRef.current = { cancel: () => {} };\n\n store.current.updateState({ waiting: true });\n\n emitEvent(EVENTS.STEP_BEFORE_HOOK, currentStep, {\n action: lastAction.current ?? stateRef.current.action,\n });\n\n const proceed = () => {\n beforeRef.current = null;\n store.current.updateState({\n action: lastAction.current ?? stateRef.current.action,\n waiting: false,\n lifecycle: LIFECYCLE.READY,\n });\n };\n\n const abortController = new AbortController();\n const timeout = currentStep.beforeTimeout;\n\n beforeRef.current = { cancel: () => abortController.abort() };\n\n const timeoutId = timeout\n ? setTimeout(() => {\n if (!abortController.signal.aborted) {\n log(debug, `step:${index}`, 'before()', 'timed out', `${timeout}ms`);\n abortController.abort();\n addFailure(currentStep, 'before_hook');\n emitEvent(EVENTS.ERROR, currentStep, {\n error: new Error('Step before hook timed out'),\n });\n proceed();\n }\n }, timeout)\n : null;\n\n currentStep\n .before({\n ...store.current.getState(),\n action: lastAction.current ?? store.current.getState().action,\n step: currentStep,\n })\n .then(() => {\n if (!abortController.signal.aborted) {\n if (timeoutId) clearTimeout(timeoutId);\n proceed();\n }\n })\n .catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n if (timeoutId) clearTimeout(timeoutId);\n addFailure(currentStep, 'before_hook');\n emitEvent(EVENTS.ERROR, currentStep, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n proceed();\n }\n });\n } else if (!beforeRef.current) {\n if (pollingRef.current && pollingTargetRef.current !== currentStep.target) {\n cleanup();\n }\n\n const element = getElement(currentStep.target);\n const targetAvailable = element && isElementVisible(element);\n\n if (targetAvailable) {\n cleanup();\n store.current.updateState({\n action: lastAction.current ?? ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.READY,\n waiting: false,\n });\n } else if (currentStep.targetWaitTimeout === 0) {\n store.current.updateState({\n action: lastAction.current ?? ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.READY,\n waiting: false,\n });\n } else if (!pollingRef.current) {\n const { targetWaitTimeout } = currentStep;\n\n const startTime = Date.now();\n\n pollingTargetRef.current = currentStep.target;\n log(debug, `step:${index}`, 'polling', 'started', `${targetWaitTimeout}ms`);\n\n store.current.updateState({ waiting: true });\n\n pollingRef.current = setInterval(() => {\n const el = getElement(currentStep.target);\n const elapsed = Date.now() - startTime;\n const timedOut = elapsed >= targetWaitTimeout;\n\n if ((el && isElementVisible(el)) || timedOut) {\n log(\n debug,\n `step:${index}`,\n 'polling',\n el && isElementVisible(el) ? 'found' : 'timed out',\n `${elapsed}ms`,\n );\n cleanup();\n store.current.updateState({\n action: lastAction.current ?? ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.READY,\n waiting: false,\n });\n }\n }, 100);\n }\n }\n\n return () => {\n cleanup();\n };\n }, [addFailure, emitEvent, index, lifecycle, status, store]);\n\n // Effect 3: Step presentation (READY → *_BEFORE → BEACON/TOOLTIP) + target not found\n // eslint-disable-next-line sonarjs/cognitive-complexity\n useEffect(() => {\n if (!previousStateRef.current) {\n return;\n }\n\n const { hasChanged, hasChangedTo, previous } = treeChanges(\n stateRef.current,\n previousStateRef.current,\n );\n const currentStep = stepRef.current;\n\n if (!currentStep) {\n return;\n }\n\n const element = getElement(currentStep.target);\n const elementExists = !!element;\n\n if (elementExists && isElementVisible(element)) {\n if (hasChangedTo('lifecycle', LIFECYCLE.READY) && previous.lifecycle === LIFECYCLE.INIT) {\n emitEvent(EVENTS.STEP_BEFORE, currentStep, {\n action: lastAction.current ?? stateRef.current.action,\n });\n }\n\n if (hasChangedTo('lifecycle', LIFECYCLE.READY)) {\n const currentState = stateRef.current;\n const finalLifecycle = shouldHideBeacon(\n currentStep,\n currentState,\n propsRef.current.continuous,\n )\n ? LIFECYCLE.TOOLTIP\n : LIFECYCLE.BEACON;\n\n const target = getElement(\n currentStep.scrollTarget ?? currentStep.spotlightTarget ?? currentStep.target,\n );\n const willScroll = needsScrolling({\n isFirstStep: currentState.index === 0,\n scrollToFirstStep: propsRef.current.scrollToFirstStep,\n step: currentStep,\n target,\n targetLifecycle: finalLifecycle,\n });\n\n const beforeLifecycle =\n finalLifecycle === LIFECYCLE.TOOLTIP ? LIFECYCLE.TOOLTIP_BEFORE : LIFECYCLE.BEACON_BEFORE;\n\n log(propsRef.current.debug, `step:${index}`, 'scroll', willScroll ? 'needed' : 'skipped');\n\n store.current.updateState({\n action: ACTIONS.UPDATE,\n lifecycle: beforeLifecycle,\n scrolling: willScroll,\n });\n }\n } else if (\n stateRef.current.status === STATUS.RUNNING &&\n lifecycle !== LIFECYCLE.INIT &&\n lifecycle !== LIFECYCLE.COMPLETE &&\n hasChanged('lifecycle')\n ) {\n log(\n propsRef.current.debug,\n `step:${index}`,\n elementExists ? 'Target not visible' : 'Target not mounted',\n currentStep,\n );\n\n addFailure(currentStep, 'target_not_found');\n emitEvent(EVENTS.TARGET_NOT_FOUND, currentStep);\n\n const currentState = stateRef.current;\n\n if (!currentState.controlled) {\n store.current.updateState({\n action: ACTIONS.UPDATE,\n index: currentState.index + (currentState.action === ACTIONS.PREV ? -1 : 1),\n lifecycle: LIFECYCLE.INIT,\n });\n }\n }\n }, [addFailure, emitEvent, index, lifecycle, store]);\n\n // Effect 4: *_BEFORE → BEACON/TOOLTIP transition + lifecycle callbacks\n // eslint-disable-next-line sonarjs/cognitive-complexity\n useEffect(() => {\n if (!previousStateRef.current) {\n return;\n }\n\n const { hasChangedTo, previous } = treeChanges(stateRef.current, previousStateRef.current);\n const currentStep = stepRef.current;\n const previousStepValue = previousStepRef.current;\n\n // BEACON → TOOLTIP_BEFORE: check if scroll adjustment is needed\n if (\n currentStep &&\n hasChangedTo('lifecycle', LIFECYCLE.TOOLTIP_BEFORE) &&\n previous.lifecycle === LIFECYCLE.BEACON\n ) {\n const target = getElement(\n currentStep.scrollTarget ?? currentStep.spotlightTarget ?? currentStep.target,\n );\n const willScroll = needsScrolling({\n isFirstStep: stateRef.current.index === 0,\n scrollToFirstStep: propsRef.current.scrollToFirstStep,\n step: currentStep,\n target,\n targetLifecycle: LIFECYCLE.TOOLTIP,\n });\n\n if (willScroll) {\n store.current.updateState({ scrolling: true, positioned: false });\n\n return;\n }\n }\n\n // *_BEFORE → BEACON/TOOLTIP when scroll is done\n const isBeforePhase =\n lifecycle === LIFECYCLE.BEACON_BEFORE || lifecycle === LIFECYCLE.TOOLTIP_BEFORE;\n\n if (currentStep && isBeforePhase && !scrolling) {\n const finalLifecycle =\n lifecycle === LIFECYCLE.TOOLTIP_BEFORE ? LIFECYCLE.TOOLTIP : LIFECYCLE.BEACON;\n\n store.current.updateState({\n action: ACTIONS.UPDATE,\n lifecycle: finalLifecycle,\n });\n }\n\n if (currentStep && hasChangedTo('lifecycle', LIFECYCLE.BEACON)) {\n emitEvent(EVENTS.BEACON, currentStep);\n }\n\n if (currentStep && hasChangedTo('lifecycle', LIFECYCLE.TOOLTIP)) {\n emitEvent(EVENTS.TOOLTIP, currentStep);\n }\n\n const currentState = stateRef.current;\n const isRunningOrPausedWithStep =\n currentState.status === STATUS.RUNNING ||\n (currentState.controlled && currentState.status === STATUS.PAUSED && !!currentStep);\n const shouldFireStepAfter =\n isRunningOrPausedWithStep &&\n previousStepValue &&\n hasChangedTo('lifecycle', LIFECYCLE.COMPLETE) &&\n previous.lifecycle === LIFECYCLE.TOOLTIP;\n\n if (shouldFireStepAfter) {\n emitEvent(EVENTS.STEP_AFTER, previousStepValue, {\n action: lastAction.current ?? ACTIONS.UPDATE,\n index: previous.index ?? currentState.index,\n lifecycle: currentState.lifecycle,\n });\n\n if (previousStepValue.after) {\n emitEvent(EVENTS.STEP_AFTER_HOOK, previousStepValue, {\n action: lastAction.current ?? ACTIONS.UPDATE,\n index: previous.index ?? currentState.index,\n lifecycle: currentState.lifecycle,\n });\n\n try {\n previousStepValue.after({\n ...store.current.getState(),\n action: lastAction.current ?? ACTIONS.UPDATE,\n index: previous.index ?? currentState.index,\n lifecycle: currentState.lifecycle,\n step: previousStepValue,\n });\n } catch {\n // fire-and-forget: don't let user code break the tour\n }\n }\n }\n }, [emitEvent, lifecycle, positioned, scrolling, store]);\n\n // Effect 5: Tour flow + tour-level callbacks\n // eslint-disable-next-line sonarjs/cognitive-complexity\n useEffect(() => {\n if (!previousStateRef.current) {\n return;\n }\n\n const { hasChangedTo, previous } = treeChanges(stateRef.current, previousStateRef.current);\n const currentStep = stepRef.current;\n const previousStepValue = previousStepRef.current;\n\n if (hasChangedTo('action', ACTIONS.REPLAY) && hasChangedTo('lifecycle', LIFECYCLE.COMPLETE)) {\n store.current.updateState({ lifecycle: LIFECYCLE.INIT });\n\n return;\n }\n\n if (size && !currentStep && lifecycle === LIFECYCLE.INIT) {\n store.current.updateState({\n action: ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.COMPLETE,\n status: STATUS.FINISHED,\n });\n }\n\n if (\n !stateRef.current.controlled &&\n status === STATUS.RUNNING &&\n hasChangedTo('lifecycle', LIFECYCLE.COMPLETE) &&\n index < size\n ) {\n store.current.updateState({ action: ACTIONS.UPDATE, lifecycle: LIFECYCLE.INIT });\n }\n\n if (hasChangedTo('lifecycle', LIFECYCLE.COMPLETE) && index >= size) {\n store.current.updateState({\n action: ACTIONS.UPDATE,\n lifecycle: LIFECYCLE.COMPLETE,\n status: STATUS.FINISHED,\n });\n }\n\n const tourEndStep =\n currentStep ??\n previousStepValue ??\n getMergedStep(propsRef.current, propsRef.current.steps[index - 1]);\n\n if (tourEndStep && hasChangedTo('status', [STATUS.FINISHED, STATUS.SKIPPED])) {\n let tourEndIndex: number;\n\n if (currentStep) {\n tourEndIndex = index;\n } else if (previousStepValue) {\n tourEndIndex = previous.index ?? index;\n } else {\n tourEndIndex = index - 1;\n }\n\n emitEvent(EVENTS.TOUR_END, tourEndStep, { index: tourEndIndex });\n\n if (!stateRef.current.controlled) {\n controlsRef.current.reset();\n }\n\n lastAction.current = null;\n }\n\n // tour:start is emitted in Effect 2 (before step processing) to ensure correct event order\n\n if (currentStep && hasChangedTo('action', ACTIONS.STOP)) {\n lastAction.current = null;\n emitEvent(EVENTS.TOUR_STATUS, currentStep);\n }\n\n if (currentStep && hasChangedTo('action', ACTIONS.RESET)) {\n emitEvent(EVENTS.TOUR_STATUS, currentStep);\n lastAction.current = null;\n }\n }, [action, emitEvent, index, lifecycle, size, status, store]);\n}\n","import { type RefObject, useEffect, useRef } from 'react';\nimport isEqual from '@gilbarbara/deep-equal';\nimport is from 'is-lite';\n\nimport type { EmitEvent } from '~/hooks/useEventEmitter';\nimport type { MergedProps } from '~/hooks/useTourEngine';\nimport { ACTIONS, EVENTS, LIFECYCLE, STATUS } from '~/literals';\nimport { treeChanges } from '~/modules/changes';\nimport { log } from '~/modules/helpers';\nimport { validateSteps } from '~/modules/step';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Actions, Controls, Status, StepMerged } from '~/types';\n\ninterface UsePropSyncParams {\n controls: Controls;\n emitEvent: EmitEvent;\n props: MergedProps;\n state: StoreState;\n store: RefObject<ReturnType<typeof createStore>>;\n}\n\nexport default function usePropSync({\n controls,\n emitEvent,\n props,\n state,\n store,\n}: UsePropSyncParams): void {\n const { debug, initialStepIndex, run, stepIndex, steps } = props;\n\n const previousPropsRef = useRef<MergedProps | undefined>(undefined);\n const stateRef = useRef(state);\n const controlsRef = useRef(controls);\n\n stateRef.current = state;\n controlsRef.current = controls;\n\n useEffect(() => {\n const previousProps = previousPropsRef.current;\n\n previousPropsRef.current = props;\n\n if (!previousProps || props === previousProps) {\n return;\n }\n\n const { hasChanged } = treeChanges(props, previousProps);\n\n if (!isEqual(previousProps.steps, steps)) {\n if (validateSteps(steps, debug)) {\n store.current.setSteps(steps);\n } else {\n log(debug, 'tour', 'Steps are not valid', steps);\n emitEvent(EVENTS.ERROR, (steps[0] ?? { target: '', content: '' }) as StepMerged, {\n error: new Error('Steps are not valid'),\n });\n }\n }\n\n if (hasChanged('run')) {\n if (run) {\n if (store.current.getState().size) {\n controlsRef.current.start(stepIndex ?? initialStepIndex);\n }\n } else {\n controlsRef.current.stop();\n }\n } else if (is.number(stepIndex) && hasChanged('stepIndex')) {\n const nextAction: Actions =\n is.number(previousProps.stepIndex) && previousProps.stepIndex < stepIndex\n ? ACTIONS.NEXT\n : ACTIONS.PREV;\n\n if (!([STATUS.FINISHED, STATUS.SKIPPED] as Array<Status>).includes(stateRef.current.status)) {\n store.current.updateState(\n { action: nextAction, index: stepIndex, lifecycle: LIFECYCLE.INIT, positioned: false },\n true,\n );\n }\n }\n }, [debug, emitEvent, initialStepIndex, props, run, stepIndex, steps, store]);\n}\n","import { type RefObject, useEffect, useRef } from 'react';\n\nimport type { EmitEvent } from '~/hooks/useEventEmitter';\nimport type { MergedProps } from '~/hooks/useTourEngine';\nimport { EVENTS, LIFECYCLE, STATUS } from '~/literals';\nimport { treeChanges } from '~/modules/changes';\nimport {\n getElement,\n getScrollParent,\n getScrollTargetToCenter,\n getScrollTo,\n hasPosition,\n scrollDocument,\n scrollTo,\n} from '~/modules/dom';\nimport { log } from '~/modules/helpers';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Lifecycle, PositionData, StepMerged } from '~/types';\n\ninterface UseScrollEffectParams {\n emitEvent: EmitEvent;\n previousState: StoreState | undefined;\n props: MergedProps;\n state: StoreState;\n step: StepMerged | null;\n store: RefObject<ReturnType<typeof createStore>>;\n}\n\nfunction adjustForPlacement(\n scrollY: number,\n options: {\n beaconPosition: PositionData | null;\n lifecycle: Lifecycle;\n scrollOffset: number;\n step: StepMerged;\n },\n): number {\n const { beaconPosition, lifecycle, scrollOffset, step } = options;\n\n if (step.scrollTarget || step.spotlightTarget) {\n return Math.max(0, scrollY);\n }\n\n let adjustedY = scrollY - step.spotlightPadding.top;\n\n if (lifecycle === LIFECYCLE.BEACON_BEFORE && beaconPosition?.placement) {\n const y = getMainAxisOffset(beaconPosition);\n\n if (!['bottom'].includes(beaconPosition.placement)) {\n adjustedY += Math.floor(y - scrollOffset);\n }\n } else if (lifecycle === LIFECYCLE.TOOLTIP_BEFORE) {\n const { placement } = step;\n\n if (placement === 'top') {\n const floaterElement = document.querySelector('.react-joyride__floater');\n const floaterHeight = floaterElement?.getBoundingClientRect().height ?? 0;\n const arrowSize = step.floatingOptions?.hideArrow ? 0 : step.arrowSize;\n const gap = step.offset + step.spotlightPadding.top + arrowSize;\n\n adjustedY -= floaterHeight + gap;\n } else if (placement === 'left' || placement === 'right') {\n const floaterElement = document.querySelector('.react-joyride__floater');\n const floaterHeight = floaterElement?.getBoundingClientRect().height ?? 0;\n const targetEl = getElement(step.target);\n const targetHeight = targetEl?.getBoundingClientRect().height ?? 0;\n\n // After base scroll, the target center sits at this distance from viewport top\n const targetCenterY = scrollOffset + step.spotlightPadding.top + targetHeight / 2;\n // The floater is centered on the target, so its top edge would be here\n const floaterTopY = targetCenterY - floaterHeight / 2;\n\n if (floaterTopY < scrollOffset) {\n adjustedY -= scrollOffset - floaterTopY;\n }\n }\n }\n\n return Math.max(0, adjustedY);\n}\n\nfunction getMainAxisOffset(data: PositionData): number {\n const offsetData = data.middlewareData?.offset as { x: number; y: number } | undefined;\n\n if (!offsetData) {\n return 0;\n }\n\n return ['left', 'right'].some(p => data.placement.startsWith(p)) ? offsetData.x : offsetData.y;\n}\n\nexport default function useScrollEffect({\n emitEvent,\n previousState,\n props,\n state,\n step,\n store,\n}: UseScrollEffectParams): void {\n const { index, lifecycle, positioned, scrolling, status } = state;\n const cancelScrollRef = useRef<(() => void) | null>(null);\n const stateRef = useRef(state);\n const previousStateRef = useRef(previousState);\n const propsRef = useRef(props);\n const stepRef = useRef(step);\n\n stateRef.current = state;\n previousStateRef.current = previousState;\n propsRef.current = props;\n stepRef.current = step;\n\n useEffect(() => {\n return () => {\n cancelScrollRef.current?.();\n };\n }, []);\n\n useEffect(() => {\n if (!previousStateRef.current || !stepRef.current) {\n return;\n }\n\n const { hasChangedTo } = treeChanges(stateRef.current, previousStateRef.current);\n const currentStep = stepRef.current;\n const { debug } = propsRef.current;\n const { scrollDuration } = currentStep;\n\n const isBeforePhase =\n lifecycle === LIFECYCLE.BEACON_BEFORE || lifecycle === LIFECYCLE.TOOLTIP_BEFORE;\n\n if (\n status === STATUS.RUNNING &&\n isBeforePhase &&\n scrolling &&\n hasChangedTo('positioned', true)\n ) {\n const target = getElement(\n currentStep.scrollTarget ?? currentStep.spotlightTarget ?? currentStep.target,\n );\n const beaconPosition = store.current.getPositionData('beacon');\n const scrollParent = getScrollParent(target);\n const hasCustomScroll = scrollParent ? !scrollParent.isSameNode(scrollDocument()) : false;\n\n cancelScrollRef.current?.();\n\n const handleScroll = async () => {\n if (hasCustomScroll && !hasPosition(scrollParent as HTMLElement)) {\n const pageElement = scrollDocument();\n const pageScrollY = getScrollTargetToCenter(scrollParent as Element);\n const pageScrollData = {\n initial: pageElement.scrollTop,\n target: pageScrollY,\n element: pageElement,\n duration: scrollDuration,\n };\n\n emitEvent(EVENTS.SCROLL_START, currentStep, { scroll: pageScrollData });\n\n const { cancel: cancelPage, promise: pagePromise } = scrollTo(pageScrollY, {\n element: pageElement,\n duration: scrollDuration,\n });\n\n cancelScrollRef.current = cancelPage;\n await pagePromise;\n\n emitEvent(EVENTS.SCROLL_END, currentStep, { scroll: pageScrollData });\n }\n\n const baseScrollY = Math.floor(getScrollTo(target, currentStep.scrollOffset)) || 0;\n const scrollY = hasCustomScroll\n ? baseScrollY\n : adjustForPlacement(baseScrollY, {\n beaconPosition,\n lifecycle,\n scrollOffset: currentStep.scrollOffset,\n step: currentStep,\n });\n\n log(\n debug,\n `step:${index}`,\n 'scroll',\n hasCustomScroll ? 'custom' : 'document',\n `${baseScrollY} → ${scrollY}`,\n );\n\n const scrollElement = scrollParent as Element;\n const scrollData = {\n initial: scrollElement.scrollTop,\n target: scrollY,\n element: scrollElement,\n duration: scrollDuration,\n };\n\n emitEvent(EVENTS.SCROLL_START, currentStep, { scroll: scrollData });\n\n const { cancel, promise } = scrollTo(scrollY, {\n element: scrollElement,\n duration: scrollDuration,\n });\n\n cancelScrollRef.current = cancel;\n await promise;\n\n emitEvent(EVENTS.SCROLL_END, currentStep, { scroll: scrollData });\n store.current.updateState({ scrolling: false });\n };\n\n handleScroll().catch(() => {\n store.current.updateState({ scrolling: false });\n });\n }\n }, [emitEvent, index, lifecycle, positioned, scrolling, status, store]);\n}\n","import { type RefObject, useCallback, useMemo, useRef, useState } from 'react';\nimport { useMemoDeepCompare, useMount, usePrevious, useUpdateEffect } from '@gilbarbara/hooks';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\n\nimport { defaultProps } from '~/defaults';\nimport useControls from '~/hooks/useControls';\nimport useDebugLogger from '~/hooks/useDebugLogger';\nimport useEventEmitter from '~/hooks/useEventEmitter';\nimport useLifecycleEffect from '~/hooks/useLifecycleEffect';\nimport usePropSync from '~/hooks/usePropSync';\nimport useScrollEffect from '~/hooks/useScrollEffect';\nimport { STATUS } from '~/literals';\nimport { mergeProps } from '~/modules/helpers';\nimport { getMergedStep, validateSteps } from '~/modules/step';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Controls, FailureReason, Props, StepFailure, StepMerged } from '~/types';\n\nexport type AddFailure = (step: StepMerged, reason: FailureReason) => void;\n\nexport type MergedProps = ReturnType<typeof mergeProps<typeof defaultProps, Props>>;\n\nexport interface UseTourEngineReturn {\n controls: Controls;\n failures: StepFailure[];\n mergedProps: MergedProps;\n state: StoreState;\n step: StepMerged | null;\n store: RefObject<ReturnType<typeof createStore>>;\n}\n\nexport default function useTourEngine(props: Props): UseTourEngineReturn {\n const mergedProps = useMemoDeepCompare(() => mergeProps(defaultProps, props), [props]);\n const { debug, initialStepIndex, onEvent, run, stepIndex, steps } = mergedProps;\n\n const store = useRef(createStore(mergedProps));\n const state = useSyncExternalStore<StoreState>(\n store.current.subscribe,\n store.current.getSnapshot,\n store.current.getServerSnapshot,\n );\n\n const [failures, setFailures] = useState<StepFailure[]>([]);\n\n const addFailure: AddFailure = useCallback((failedStep, reason) => {\n setFailures(previous => [...previous, { reason, step: failedStep }]);\n }, []);\n\n const clearFailures = useCallback(() => {\n setFailures([]);\n }, []);\n\n useDebugLogger(store, debug);\n\n const controls = useControls(store, debug, clearFailures);\n const emitEvent = useEventEmitter(onEvent, controls, store);\n\n const { index, size, status } = state;\n\n const previousState = usePrevious(state);\n\n const step = useMemo(() => getMergedStep(mergedProps, steps[index]), [index, mergedProps, steps]);\n\n useMount(() => {\n if (run && size && validateSteps(steps, debug)) {\n controls.start(stepIndex ?? initialStepIndex);\n }\n });\n\n useUpdateEffect(() => {\n if (run && size && status === STATUS.IDLE) {\n store.current.updateState({ status: STATUS.READY });\n }\n }, [run, size, status]);\n\n usePropSync({\n controls,\n emitEvent,\n props: mergedProps,\n state,\n store,\n });\n\n useLifecycleEffect({\n addFailure,\n controls,\n emitEvent,\n previousState,\n props: mergedProps,\n state,\n step,\n store,\n });\n\n useScrollEffect({\n emitEvent,\n previousState,\n props: mergedProps,\n state,\n step,\n store,\n });\n\n return { controls, failures, mergedProps, state, step, store };\n}\n","import { useEffect, useState } from 'react';\nimport is from 'is-lite';\n\nimport { PORTAL_ELEMENT_ID } from '~/literals';\n\nimport type { SelectorOrElement } from '~/types';\n\nexport function usePortalElement(portalElement?: SelectorOrElement) {\n const [element, setElement] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n let createdElement: HTMLElement | null = null;\n let isExternal = false;\n\n if (portalElement) {\n if (is.domElement(portalElement)) {\n createdElement = portalElement;\n isExternal = true;\n } else {\n const portal = document.querySelector(portalElement);\n\n if (portal) {\n createdElement = portal as HTMLElement;\n }\n }\n } else {\n const portal = document.createElement('div');\n\n portal.id = PORTAL_ELEMENT_ID;\n\n document.body.appendChild(portal);\n createdElement = portal;\n }\n\n setElement(createdElement);\n\n return () => {\n if (!createdElement || isExternal) {\n return;\n }\n\n if (createdElement.parentNode === document.body) {\n document.body.removeChild(createdElement);\n }\n };\n }, [portalElement]);\n\n return element;\n}\n","import { type CSSProperties, useEffect } from 'react';\n\nimport { noop } from '~/modules/helpers';\n\nimport type { LoaderRenderProps, Props, Simplify } from '~/types';\n\ntype LoaderProps = Simplify<Pick<Props, 'nonce'> & LoaderRenderProps>;\n\nconst spinnerStyles: CSSProperties = {\n animation: 'joyride-loader-spin 1s linear infinite',\n border: '5px solid rgba(0, 0, 0, 0.1)',\n borderRadius: '50%',\n borderTopColor: '#555',\n};\n\nexport default function JoyrideLoader({ nonce, step }: LoaderProps) {\n const { loaderComponent } = step;\n\n const hasLoaderComponent = Boolean(loaderComponent);\n\n useEffect(() => {\n if (hasLoaderComponent) {\n return noop;\n }\n\n if (document.getElementById('joyride-loader-animation')) {\n return noop;\n }\n\n const style = document.createElement('style');\n\n style.id = 'joyride-loader-animation';\n\n if (nonce) {\n style.setAttribute('nonce', nonce);\n }\n\n style.appendChild(\n document.createTextNode(`\n @keyframes joyride-loader-spin {\n to { transform: rotate(360deg); }\n }\n `),\n );\n\n document.head.appendChild(style);\n\n return () => {\n const insertedStyle = document.getElementById('joyride-loader-animation');\n\n if (insertedStyle?.parentNode) {\n insertedStyle.parentNode.removeChild(insertedStyle);\n }\n };\n }, [hasLoaderComponent, nonce]);\n\n if (loaderComponent === null) {\n return null;\n }\n\n const { height, width, ...loaderStyle } = step.styles.loader;\n\n let content;\n\n if (loaderComponent) {\n const CustomLoader = loaderComponent;\n\n content = <CustomLoader step={step} />;\n } else {\n content = (\n <div style={{ ...spinnerStyles, height, width, borderTopColor: step.primaryColor }} />\n );\n }\n\n return (\n <div className=\"react-joyride__loader\" data-testid=\"loader\" style={loaderStyle}>\n {content}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n getClientRect,\n getElement,\n getElementPosition,\n getScrollParent,\n hasPosition,\n} from '~/modules/dom';\n\nimport type { SpotlightPadding, StepTarget } from '~/types';\n\nexport interface TargetRect {\n height: number;\n isFixed: boolean;\n left: number;\n top: number;\n width: number;\n}\n\nconst defaultRect: TargetRect = {\n height: 0,\n isFixed: false,\n left: 0,\n top: 0,\n width: 0,\n};\n\nfunction computeRect(target: StepTarget, spotlightPadding: Required<SpotlightPadding>): TargetRect {\n const element = getElement(target);\n\n if (!element) {\n return defaultRect;\n }\n\n const elementRect = getClientRect(element);\n const isFixed = hasPosition(element);\n const top = getElementPosition(element, spotlightPadding.top, isFixed);\n\n return {\n height: Math.round((elementRect?.height ?? 0) + spotlightPadding.top + spotlightPadding.bottom),\n isFixed,\n left: Math.round((elementRect?.left ?? 0) - spotlightPadding.left),\n top,\n width: Math.round((elementRect?.width ?? 0) + spotlightPadding.left + spotlightPadding.right),\n };\n}\n\nexport default function useTargetPosition(\n target: StepTarget,\n spotlightPadding: Required<SpotlightPadding>,\n force: boolean,\n): TargetRect {\n const [rect, setRect] = useState<TargetRect>(() => computeRect(target, spotlightPadding));\n const timeoutRef = useRef<number>(undefined);\n const scrollParentRef = useRef<Element | Document | null>(null);\n const previousForceRef = useRef(force);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const updateRect = useCallback(() => {\n clearTimeout(timeoutRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n setRect(previous => {\n const next = computeRect(target, spotlightPadding);\n\n if (\n previous.top === next.top &&\n previous.left === next.left &&\n previous.width === next.width &&\n previous.height === next.height &&\n previous.isFixed === next.isFixed\n ) {\n return previous;\n }\n\n return next;\n });\n }, 100);\n }, [target, spotlightPadding]);\n\n useEffect(() => {\n let mutationObserver: MutationObserver | null = null;\n\n const setup = (element: HTMLElement) => {\n scrollParentRef.current = getScrollParent(element, true);\n\n if (scrollParentRef.current) {\n scrollParentRef.current.addEventListener('scroll', updateRect, { passive: true });\n }\n\n window.addEventListener('scroll', updateRect, { passive: true });\n window.addEventListener('resize', updateRect);\n\n if (typeof ResizeObserver !== 'undefined') {\n observerRef.current = new ResizeObserver(updateRect);\n observerRef.current.observe(element);\n }\n\n setRect(computeRect(target, spotlightPadding));\n };\n\n const element = getElement(target);\n\n if (element) {\n setup(element);\n } else {\n // Target not in DOM yet — watch for it\n mutationObserver = new MutationObserver(() => {\n const el = getElement(target);\n\n if (el) {\n mutationObserver?.disconnect();\n mutationObserver = null;\n setup(el);\n }\n });\n\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n }\n\n return () => {\n mutationObserver?.disconnect();\n\n if (scrollParentRef.current) {\n scrollParentRef.current.removeEventListener('scroll', updateRect);\n }\n\n window.removeEventListener('scroll', updateRect);\n window.removeEventListener('resize', updateRect);\n\n observerRef.current?.disconnect();\n clearTimeout(timeoutRef.current);\n };\n }, [target, spotlightPadding, updateRect]);\n\n // Persist to state and track transitions after render\n useEffect(() => {\n if (previousForceRef.current && !force) {\n setRect(computeRect(target, spotlightPadding));\n }\n\n previousForceRef.current = force;\n }, [force, target, spotlightPadding]);\n\n // Synchronous override: when scrolling just ended, return fresh rect immediately\n let finalRect = rect;\n\n if (previousForceRef.current && !force) {\n finalRect = computeRect(target, spotlightPadding);\n }\n\n return finalRect;\n}\n","export function generateOverlayPath(\n overlayWidth: number,\n overlayHeight: number,\n cutout: string,\n): string {\n let path = `M0 0H${overlayWidth}V${overlayHeight}H0Z`;\n\n if (cutout) {\n path += ` ${cutout}`;\n }\n\n return path;\n}\n\nexport function generateSpotlightPath(\n x: number,\n y: number,\n width: number,\n height: number,\n borderRadius: number,\n): string {\n if (width <= 0 || height <= 0) {\n return '';\n }\n\n const r = Math.max(0, Math.min(borderRadius, width / 2, height / 2));\n\n let path = `M${x + r} ${y}`;\n\n path += `H${x + width - r}`;\n path += `A${r} ${r} 0 0 1 ${x + width} ${y + r}`;\n path += `V${y + height - r}`;\n path += `A${r} ${r} 0 0 1 ${x + width - r} ${y + height}`;\n path += `H${x + r}`;\n path += `A${r} ${r} 0 0 1 ${x} ${y + height - r}`;\n path += `V${y + r}`;\n path += `A${r} ${r} 0 0 1 ${x + r} ${y}Z`;\n\n return path;\n}\n","import { type CSSProperties, useEffect, useMemo, useRef, useState } from 'react';\nimport { useWindowSize } from '@gilbarbara/hooks';\n\nimport useTargetPosition from '~/hooks/useTargetPosition';\nimport { LIFECYCLE } from '~/literals';\nimport { getAbsoluteOffset, getDocumentHeight, getElement } from '~/modules/dom';\nimport { generateOverlayPath, generateSpotlightPath } from '~/modules/svg';\n\nimport type { Lifecycle, Simplify, StepMerged } from '~/types';\n\nexport type OverlayProps = Simplify<\n StepMerged & {\n continuous: boolean;\n lifecycle: Lifecycle;\n onClickOverlay: () => void;\n portalElement?: HTMLElement | null;\n scrolling: boolean;\n waiting: boolean;\n }\n>;\n\nconst hiddenLifecycles: Lifecycle[] = [LIFECYCLE.BEACON_BEFORE, LIFECYCLE.BEACON];\n\nexport default function JoyrideOverlay(props: OverlayProps) {\n const {\n blockTargetInteraction,\n continuous,\n hideOverlay,\n lifecycle,\n onClickOverlay,\n overlayClickAction,\n placement,\n portalElement,\n scrolling,\n spotlightPadding,\n spotlightRadius,\n spotlightTarget,\n styles,\n target,\n waiting,\n } = props;\n const windowSize = useWindowSize();\n const targetRect = useTargetPosition(\n spotlightTarget ?? target,\n spotlightPadding,\n scrolling || waiting,\n );\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const showSpotlight =\n (lifecycle === LIFECYCLE.TOOLTIP || lifecycle === LIFECYCLE.TOOLTIP_BEFORE) &&\n placement !== 'center';\n const [spotlightReady, setSpotlightReady] = useState(false);\n\n const container = portalElement ? (overlayRef.current?.offsetParent as HTMLElement | null) : null;\n const overlayWidth = container?.clientWidth ?? windowSize.width;\n const overlayHeight = container?.clientHeight ?? getDocumentHeight() ?? windowSize.height;\n\n const overlayColor = (styles.overlay?.backgroundColor ?? 'rgba(0, 0, 0, 0.5)') as string;\n\n const overlayStyles = useMemo(() => {\n const { backgroundColor: _bg, mixBlendMode: _mbm, ...rest } = styles.overlay;\n\n return {\n height: overlayHeight,\n pointerEvents: 'none',\n ...rest,\n } as CSSProperties;\n }, [overlayHeight, styles.overlay]);\n\n const showCutout = showSpotlight && !scrolling && !waiting;\n\n useEffect(() => {\n if (showCutout) {\n requestAnimationFrame(() => setSpotlightReady(true));\n } else {\n setSpotlightReady(false);\n }\n }, [showCutout]);\n\n const isHiddenInContinuous = continuous && hiddenLifecycles.includes(lifecycle);\n const isHiddenInNonContinuous = !continuous && lifecycle !== LIFECYCLE.TOOLTIP;\n\n if (hideOverlay || (!waiting && (isHiddenInContinuous || isHiddenInNonContinuous))) {\n return null;\n }\n\n // When using a custom portal, compute spotlight in layout space (offsetTop/offsetLeft/offsetWidth/offsetHeight)\n // because targetRect uses getBoundingClientRect() which is viewport-relative and doesn't match the SVG's layout space.\n let coverPath = '';\n\n if (showCutout) {\n if (portalElement && container) {\n const targetEl = getElement(spotlightTarget ?? target);\n\n if (targetEl) {\n const targetOffset = getAbsoluteOffset(targetEl);\n const containerOffset = getAbsoluteOffset(container);\n\n coverPath = generateSpotlightPath(\n targetOffset.left - containerOffset.left - spotlightPadding.left,\n targetOffset.top - containerOffset.top - spotlightPadding.top,\n targetEl.offsetWidth + spotlightPadding.left + spotlightPadding.right,\n targetEl.offsetHeight + spotlightPadding.top + spotlightPadding.bottom,\n spotlightRadius,\n );\n }\n } else {\n coverPath = generateSpotlightPath(\n targetRect.left,\n targetRect.top,\n targetRect.width,\n targetRect.height,\n spotlightRadius,\n );\n }\n }\n\n const path = generateOverlayPath(overlayWidth, overlayHeight, coverPath);\n\n return (\n <div\n ref={overlayRef}\n aria-hidden=\"true\"\n className=\"react-joyride__overlay\"\n data-testid=\"overlay\"\n style={overlayStyles}\n >\n <svg\n className=\"react-joyride__spotlight\"\n data-testid=\"spotlight\"\n style={{\n height: overlayHeight,\n left: 0,\n position: targetRect.isFixed ? 'fixed' : 'absolute',\n top: 0,\n width: overlayWidth,\n }}\n >\n <path\n d={path}\n fill={overlayColor}\n fillRule=\"evenodd\"\n onClick={onClickOverlay}\n style={{\n cursor: overlayClickAction ? 'pointer' : 'default',\n pointerEvents: 'auto',\n }}\n />\n {coverPath && (\n <path\n d={coverPath}\n fill={overlayColor}\n style={{\n opacity: spotlightReady ? 0 : 1,\n pointerEvents: blockTargetInteraction ? 'auto' : 'none',\n transition: 'opacity 0.2s',\n }}\n />\n )}\n {coverPath && Object.keys(styles.spotlight).length > 0 && (\n <path d={coverPath} fill=\"none\" style={{ pointerEvents: 'none' }} {...styles.spotlight} />\n )}\n </svg>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface Props {\n children: ReactNode;\n element: HTMLElement | null;\n}\n\nexport default function JoyridePortal(props: Props) {\n const { children, element } = props;\n\n if (!element) {\n return null;\n }\n\n return createPortal(children, element);\n}\n","import { useEffect, useRef } from 'react';\n\nimport { noop } from '~/modules/helpers';\n\nconst TABBABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), area[href], [tabindex]:not([tabindex=\"-1\"]), [contenteditable]';\n\nexport default function useFocusTrap(element: HTMLElement | null, selector?: string | null): void {\n const previousFocus = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!element) {\n return noop;\n }\n\n previousFocus.current = document.activeElement as HTMLElement | null;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') {\n return;\n }\n\n const elements = [...element.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR)];\n const { shiftKey } = event;\n\n if (!elements.length) {\n return;\n }\n\n event.preventDefault();\n\n let index = document.activeElement\n ? elements.indexOf(document.activeElement as HTMLElement)\n : 0;\n\n if (index === -1 || (!shiftKey && index + 1 === elements.length)) {\n index = 0;\n } else if (shiftKey && index === 0) {\n index = elements.length - 1;\n } else {\n index += shiftKey ? -1 : 1;\n }\n\n elements[index].focus();\n };\n\n element.addEventListener('keydown', handleKeyDown, false);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n\n if (selector) {\n const target = element.querySelector<HTMLElement>(selector);\n\n if (target) {\n // Delay focus to allow Floater's CSS transition to complete\n timerId = setTimeout(() => {\n target.focus({ preventScroll: true });\n }, 100);\n }\n }\n\n return () => {\n element.removeEventListener('keydown', handleKeyDown);\n\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n\n previousFocus.current?.focus({ preventScroll: true });\n };\n }, [element, selector]);\n}\n","import type { CSSProperties, ElementType, Ref } from 'react';\n\nimport type { ArrowRenderProps, Placement } from '~/types';\n\ninterface ArrowProps {\n arrowComponent?: ElementType<ArrowRenderProps>;\n arrowRef: Ref<HTMLElement>;\n base: number;\n placement: Placement;\n position: { x?: number; y?: number } | undefined;\n size: number;\n styles: CSSProperties;\n}\n\nfunction getDimensions(placement: Placement, base: number, size: number) {\n const [side] = placement.split('-');\n\n switch (side) {\n case 'top':\n case 'bottom':\n return { width: base, height: size };\n case 'left':\n case 'right':\n return { width: size, height: base };\n default:\n return null;\n }\n}\n\nfunction getPoints(placement: Placement, base: number, size: number) {\n const [side] = placement.split('-');\n\n switch (side) {\n case 'top':\n return {\n points: `0,0 ${base / 2},${size} ${base},0`,\n ...getDimensions(placement, base, size),\n };\n case 'bottom':\n return {\n points: `${base},${size} ${base / 2},0 0,${size}`,\n ...getDimensions(placement, base, size),\n };\n case 'left':\n return {\n points: `0,0 ${size},${base / 2} 0,${base}`,\n ...getDimensions(placement, base, size),\n };\n case 'right':\n return {\n points: `${size},${base} ${size},0 0,${base / 2}`,\n ...getDimensions(placement, base, size),\n };\n default:\n return null;\n }\n}\n\nfunction getPositionStyle(\n placement: Placement,\n position: { x?: number; y?: number } | undefined,\n size: number,\n base: number,\n): CSSProperties {\n if (!position) {\n return {};\n }\n\n const [side] = placement.split('-');\n\n switch (side) {\n case 'top':\n return { bottom: -size, left: position.x ?? 0, ...getDimensions(placement, base, size) };\n case 'bottom':\n return { top: -size, left: position.x ?? 0, ...getDimensions(placement, base, size) };\n case 'left':\n return { right: -size, top: position.y ?? 0, ...getDimensions(placement, base, size) };\n case 'right':\n return { left: -size, top: position.y ?? 0, ...getDimensions(placement, base, size) };\n default:\n return {};\n }\n}\n\nexport default function Arrow({\n arrowComponent,\n arrowRef,\n base,\n placement,\n position,\n size,\n styles,\n}: ArrowProps) {\n const ArrowComponent = arrowComponent;\n\n let content = null;\n\n if (ArrowComponent) {\n const dimensions = getDimensions(placement, base, size);\n\n if (!dimensions) {\n return null;\n }\n\n content = (\n <span style={{ flexShrink: 0 }}>\n <ArrowComponent base={base} placement={placement} size={size} />\n </span>\n );\n } else {\n const svg = getPoints(placement, base, size);\n\n if (!svg) {\n return null;\n }\n\n content = (\n <svg height={svg.height} width={svg.width} xmlns=\"http://www.w3.org/2000/svg\">\n <polygon fill=\"currentColor\" points={svg.points} />\n </svg>\n );\n }\n\n return (\n <span\n ref={arrowRef}\n className=\"react-joyride__arrow\"\n data-testid=\"arrow\"\n style={{\n ...styles,\n ...getPositionStyle(placement, position, size, base),\n ...(position ? {} : { visibility: 'hidden' }),\n }}\n >\n {content}\n </span>\n );\n}\n","import { type MouseEventHandler, useEffect, useRef } from 'react';\nimport is from 'is-lite';\n\nimport { getReactNodeText, noop } from '~/modules/helpers';\n\nimport type { BeaconRenderProps, Locale, Props, Simplify, Styles } from '~/types';\n\ntype BeaconProps = Simplify<\n Pick<Props, 'beaconComponent' | 'nonce'> &\n BeaconRenderProps & {\n locale: Locale;\n onInteract: MouseEventHandler<HTMLElement>;\n shouldFocus: boolean;\n styles: Styles;\n }\n>;\n\nexport default function JoyrideBeacon(props: BeaconProps) {\n const {\n beaconComponent,\n continuous,\n index,\n isLastStep,\n locale,\n nonce,\n onInteract,\n shouldFocus,\n size,\n step,\n styles,\n } = props;\n const beaconRef = useRef<HTMLButtonElement | null>(null);\n\n const hasBeaconComponent = Boolean(beaconComponent);\n\n useEffect(() => {\n if (hasBeaconComponent) {\n return noop;\n }\n\n if (document.getElementById('joyride-beacon-animation')) {\n return noop;\n }\n\n const style = document.createElement('style');\n\n style.id = 'joyride-beacon-animation';\n\n if (nonce) {\n style.setAttribute('nonce', nonce);\n }\n\n const css = `\n @keyframes joyride-beacon-inner {\n 20% {\n opacity: 0.9;\n }\n\n 90% {\n opacity: 0.7;\n }\n }\n\n @keyframes joyride-beacon-outer {\n 0% {\n transform: scale(1);\n }\n\n 45% {\n opacity: 0.7;\n transform: scale(0.75);\n }\n\n 100% {\n opacity: 0.9;\n transform: scale(1);\n }\n }\n `;\n\n style.appendChild(document.createTextNode(css));\n\n document.head.appendChild(style);\n\n const focusTimer = setTimeout(() => {\n if (is.domElement(beaconRef.current) && shouldFocus) {\n beaconRef.current.focus();\n }\n }, 0);\n\n return () => {\n clearTimeout(focusTimer);\n\n const insertedStyle = document.getElementById('joyride-beacon-animation');\n\n if (insertedStyle?.parentNode) {\n insertedStyle.parentNode.removeChild(insertedStyle);\n }\n };\n }, [hasBeaconComponent, nonce, shouldFocus]);\n\n const title = getReactNodeText(locale.open);\n let content;\n\n if (beaconComponent) {\n const BeaconComponent = beaconComponent;\n\n content = (\n <BeaconComponent\n continuous={continuous}\n index={index}\n isLastStep={isLastStep}\n size={size}\n step={step}\n />\n );\n } else {\n content = (\n <span style={styles.beacon}>\n <span style={styles.beaconOuter} />\n <span style={styles.beaconInner} />\n </span>\n );\n }\n\n return (\n <button\n ref={beaconRef}\n aria-label={title}\n className=\"react-joyride__beacon\"\n data-testid=\"button-beacon\"\n onClick={onInteract}\n onMouseEnter={onInteract}\n style={styles.beaconWrapper}\n title={title}\n type=\"button\"\n >\n {content}\n </button>\n );\n}\n","import type { CSSProperties } from 'react';\n\ninterface Props {\n styles: CSSProperties;\n}\n\nexport default function JoyrideTooltipCloseButton({ styles, ...props }: Props) {\n const { color, height, width, ...style } = styles;\n\n return (\n <button style={style} type=\"button\" {...props}>\n <svg\n height={typeof height === 'number' ? `${height}px` : height}\n preserveAspectRatio=\"xMidYMid\"\n version=\"1.1\"\n viewBox=\"0 0 18 18\"\n width={typeof width === 'number' ? `${width}px` : width}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g>\n <path\n d=\"M8.13911129,9.00268191 L0.171521827,17.0258467 C-0.0498027049,17.248715 -0.0498027049,17.6098394 0.171521827,17.8327545 C0.28204354,17.9443526 0.427188206,17.9998706 0.572051765,17.9998706 C0.71714958,17.9998706 0.862013139,17.9443526 0.972581703,17.8327545 L9.0000937,9.74924618 L17.0276057,17.8327545 C17.1384085,17.9443526 17.2832721,17.9998706 17.4281356,17.9998706 C17.5729992,17.9998706 17.718097,17.9443526 17.8286656,17.8327545 C18.0499901,17.6098862 18.0499901,17.2487618 17.8286656,17.0258467 L9.86135722,9.00268191 L17.8340066,0.973848225 C18.0553311,0.750979934 18.0553311,0.389855532 17.8340066,0.16694039 C17.6126821,-0.0556467968 17.254037,-0.0556467968 17.0329467,0.16694039 L9.00042166,8.25611765 L0.967006424,0.167268345 C0.745681892,-0.0553188426 0.387317931,-0.0553188426 0.165993399,0.167268345 C-0.0553311331,0.390136635 -0.0553311331,0.751261038 0.165993399,0.974176179 L8.13920499,9.00268191 L8.13911129,9.00268191 Z\"\n fill={color}\n />\n </g>\n </svg>\n </button>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { getReactNodeText } from '~/modules/helpers';\n\nimport type { TooltipRenderProps } from '~/types';\n\nimport CloseButton from './CloseButton';\n\nexport default function JoyrideDefaultTooltip(props: TooltipRenderProps) {\n const { backProps, closeProps, index, isLastStep, primaryProps, skipProps, step, tooltipProps } =\n props;\n const { buttons, content, styles, title } = step;\n const buttonElements: Record<string, ReactNode> = {};\n\n if (buttons.includes('primary')) {\n buttonElements.primary = (\n <button\n data-testid=\"button-primary\"\n style={styles.buttonPrimary}\n type=\"button\"\n {...primaryProps}\n />\n );\n }\n\n if (buttons.includes('skip') && !isLastStep) {\n buttonElements.skip = (\n <button\n aria-live=\"off\"\n data-testid=\"button-skip\"\n style={styles.buttonSkip}\n type=\"button\"\n {...skipProps}\n />\n );\n }\n\n if (buttons.includes('back') && index > 0) {\n buttonElements.back = (\n <button data-testid=\"button-back\" style={styles.buttonBack} type=\"button\" {...backProps} />\n );\n }\n\n buttonElements.close = buttons.includes('close') && (\n <CloseButton data-testid=\"button-close\" styles={styles.buttonClose} {...closeProps} />\n );\n\n const ariaProps = title\n ? { 'aria-labelledby': 'joyride-tooltip-title', 'aria-describedby': 'joyride-tooltip-content' }\n : { 'aria-label': getReactNodeText(content), 'aria-describedby': 'joyride-tooltip-content' };\n\n return (\n <div\n key=\"JoyrideTooltip\"\n className=\"react-joyride__tooltip\"\n data-joyride-step={index}\n {...(step.id && { 'data-joyride-id': step.id })}\n style={styles.tooltip}\n {...tooltipProps}\n {...ariaProps}\n >\n <div style={styles.tooltipContainer}>\n {title && (\n <h4 id=\"joyride-tooltip-title\" style={styles.tooltipTitle}>\n {title}\n </h4>\n )}\n <div id=\"joyride-tooltip-content\" style={styles.tooltipContent}>\n {content}\n </div>\n </div>\n {buttons.some(b => b === 'back' || b === 'primary' || b === 'skip') && (\n <div style={styles.tooltipFooter}>\n <div style={styles.tooltipFooterSpacer}>{buttonElements.skip}</div>\n {buttonElements.back}\n {buttonElements.primary}\n </div>\n )}\n {buttonElements.close}\n </div>\n );\n}\n","import type { MouseEvent } from 'react';\n\nimport { ORIGIN } from '~/literals';\nimport { getReactNodeText, replaceLocaleContent } from '~/modules/helpers';\n\nimport type { Controls, StepMerged } from '~/types';\n\nimport DefaultTooltip from './DefaultTooltip';\n\ninterface TooltipProps {\n continuous: boolean;\n controls: Controls;\n index: number;\n isLastStep: boolean;\n size: number;\n step: StepMerged;\n}\n\nexport default function Tooltip(props: TooltipProps) {\n const { continuous, controls, index, isLastStep, size, step } = props;\n\n const handleClickBack = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n\n controls.prev(ORIGIN.BUTTON_BACK);\n };\n\n const handleClickClose = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n\n if (step.closeButtonAction === 'skip') {\n controls.skip(ORIGIN.BUTTON_CLOSE);\n } else if (step.closeButtonAction === 'replay') {\n controls.replay(ORIGIN.BUTTON_CLOSE);\n } else {\n controls.close(ORIGIN.BUTTON_CLOSE);\n }\n };\n\n const handleClickPrimary = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n\n if (!continuous) {\n controls.close(ORIGIN.BUTTON_PRIMARY);\n\n return;\n }\n\n controls.next(ORIGIN.BUTTON_PRIMARY);\n };\n\n const handleClickSkip = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n\n controls.skip(ORIGIN.BUTTON_SKIP);\n };\n\n const getElementsProps = () => {\n const { back, close, last, next, nextWithProgress, skip } = step.locale;\n\n const backText = getReactNodeText(back);\n const closeText = getReactNodeText(close);\n const lastText = getReactNodeText(last);\n const nextText = getReactNodeText(next);\n const skipText = getReactNodeText(skip);\n\n let primary = close;\n let primaryText = closeText;\n\n if (continuous) {\n primary = next;\n primaryText = nextText;\n\n if (step.showProgress && !isLastStep) {\n const labelWithProgress = getReactNodeText(nextWithProgress, {\n step: index + 1,\n steps: size,\n });\n\n primary = replaceLocaleContent(nextWithProgress, index + 1, size);\n primaryText = labelWithProgress;\n }\n\n if (isLastStep) {\n primary = last;\n primaryText = lastText;\n }\n }\n\n return {\n backProps: {\n 'aria-label': backText,\n children: back,\n 'data-action': 'back',\n onClick: handleClickBack,\n role: 'button',\n title: backText,\n },\n closeProps: {\n 'aria-label': closeText,\n children: close,\n 'data-action': 'close',\n onClick: handleClickClose,\n role: 'button',\n title: closeText,\n },\n primaryProps: {\n 'aria-label': primaryText,\n children: primary,\n 'data-action': 'primary',\n onClick: handleClickPrimary,\n role: 'button',\n title: primaryText,\n },\n skipProps: {\n 'aria-label': skipText,\n children: skip,\n 'data-action': 'skip',\n onClick: handleClickSkip,\n role: 'button',\n title: skipText,\n },\n tooltipProps: {\n 'aria-modal': true,\n role: 'alertdialog',\n },\n };\n };\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const { arrowComponent, beaconComponent, tooltipComponent, ...stepProps } = step;\n let component;\n\n if (tooltipComponent) {\n const TooltipComponent = tooltipComponent;\n\n component = (\n <TooltipComponent\n {...getElementsProps()}\n continuous={continuous}\n controls={controls}\n index={index}\n isLastStep={isLastStep}\n size={size}\n step={stepProps}\n />\n );\n } else {\n component = (\n <DefaultTooltip\n {...getElementsProps()}\n continuous={continuous}\n controls={controls}\n index={index}\n isLastStep={isLastStep}\n size={size}\n step={stepProps}\n />\n );\n }\n\n return component;\n}\n","import {\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n type RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport {\n arrow,\n autoPlacement,\n autoUpdate,\n flip,\n type Placement as FloatingPlacement,\n type MiddlewareData,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react-dom';\n\nimport { LIFECYCLE } from '~/literals';\nimport { getScrollParent, hasCustomScrollParent, hasPosition } from '~/modules/dom';\nimport { sortObjectKeys } from '~/modules/helpers';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Controls, Lifecycle, PositionData, StepMerged } from '~/types';\n\nimport Arrow from './Arrow';\nimport Beacon from './Beacon';\nimport Portal from './Portal';\nimport Tooltip from './Tooltip';\n\ninterface FloaterProps {\n continuous: boolean;\n controls: Controls;\n index: number;\n lifecycle: Lifecycle;\n nonce?: string;\n open: boolean;\n portalElement: HTMLElement | null;\n setPositionData: (name: 'beacon' | 'tooltip', data: PositionData) => void;\n setTooltipRef: RefCallback<HTMLElement>;\n shouldScroll: boolean;\n size: number;\n step: StepMerged;\n target: Element;\n updateState: (state: Partial<StoreState>) => void;\n}\n\nfunction getFallbackPlacements(placement: FloatingPlacement): FloatingPlacement[] | undefined {\n if (placement.startsWith('left')) return ['top', 'bottom'];\n if (placement.startsWith('right')) return ['bottom', 'top'];\n\n return undefined;\n}\n\nfunction getFlipMiddleware(isAuto: boolean, step: StepMerged, tooltipPlacement: FloatingPlacement) {\n if (isAuto) {\n return [autoPlacement()];\n }\n\n if (step.floatingOptions?.flipOptions === false) {\n return [];\n }\n\n return [\n flip({\n crossAxis: false,\n fallbackPlacements: getFallbackPlacements(tooltipPlacement),\n padding: 20,\n ...step.floatingOptions?.flipOptions,\n }),\n ];\n}\n\nexport default function JoyrideFloater(props: FloaterProps) {\n const {\n continuous,\n controls,\n index,\n lifecycle,\n nonce,\n open,\n portalElement,\n setPositionData,\n setTooltipRef,\n shouldScroll,\n size,\n step,\n target,\n updateState,\n } = props;\n const arrowRef = useRef<HTMLElement>(null);\n const beaconMiddlewareRef = useRef<MiddlewareData>({});\n const tooltipMiddlewareRef = useRef<MiddlewareData>({});\n\n const isCenter = step.placement === 'center';\n const isAuto = step.placement === 'auto';\n\n const centerReference = useMemo(\n () => ({\n getBoundingClientRect: () => ({\n x: window.innerWidth / 2,\n y: window.innerHeight / 2,\n top: window.innerHeight / 2,\n left: window.innerWidth / 2,\n bottom: window.innerHeight / 2,\n right: window.innerWidth / 2,\n width: 0,\n height: 0,\n }),\n }),\n [],\n );\n\n const scrollParent = useMemo(\n () =>\n hasCustomScrollParent(target as HTMLElement)\n ? getScrollParent(target as HTMLElement)\n : undefined,\n [target],\n );\n\n const isFixedTarget = useMemo(() => hasPosition(target), [target]);\n\n const boundaryOptions = useMemo(\n () =>\n scrollParent ? { boundary: scrollParent as Element, rootBoundary: 'viewport' as const } : {},\n [scrollParent],\n );\n\n const tooltipPlacement = isCenter || isAuto ? 'bottom' : (step.placement as FloatingPlacement);\n\n const strategy = isCenter\n ? 'fixed'\n : (step.floatingOptions?.strategy ?? (step.isFixed || isFixedTarget ? 'fixed' : 'absolute'));\n\n const tooltipMiddleware = useMemo(\n () =>\n isCenter\n ? [\n {\n name: 'center',\n fn: ({ rects }: { rects: { floating: { height: number; width: number } } }) => ({\n x: (window.innerWidth - rects.floating.width) / 2,\n y: (window.innerHeight - rects.floating.height) / 2,\n }),\n },\n ]\n : [\n offset(\n ({ placement: currentPlacement }) => {\n let side: 'top' | 'bottom' | 'left' | 'right' = 'right';\n\n if (currentPlacement.startsWith('top')) side = 'top';\n else if (currentPlacement.startsWith('bottom')) side = 'bottom';\n else if (currentPlacement.startsWith('left')) side = 'left';\n\n const padding = step.spotlightTarget ? 0 : step.spotlightPadding[side];\n\n return (\n step.offset + padding + (step.floatingOptions?.hideArrow ? 0 : step.arrowSize)\n );\n },\n [\n step.offset,\n step.spotlightPadding,\n step.spotlightTarget,\n step.arrowSize,\n step.floatingOptions?.hideArrow,\n ],\n ),\n ...getFlipMiddleware(isAuto, step, tooltipPlacement),\n shift({\n padding: 10,\n ...boundaryOptions,\n ...step.floatingOptions?.shiftOptions,\n }),\n ...(step.floatingOptions?.hideArrow\n ? []\n : [\n arrow({ element: arrowRef, padding: step.arrowSpacing }, [\n step.arrowSpacing,\n step.arrowBase,\n ]),\n ]),\n ...(step.floatingOptions?.middleware ?? []),\n ],\n [isCenter, step, isAuto, tooltipPlacement, boundaryOptions],\n );\n\n const tooltipFloating = useFloating({\n ...(isCenter ? { elements: { reference: centerReference } } : {}),\n placement: tooltipPlacement,\n strategy,\n middleware: tooltipMiddleware,\n });\n\n const beaconPlacement =\n step.beaconPlacement ?? (isAuto || isCenter ? 'bottom' : (step.placement as FloatingPlacement));\n\n const beaconMiddleware = useMemo(\n () => [offset(step.floatingOptions?.beaconOptions?.offset ?? -18)],\n [step.floatingOptions?.beaconOptions?.offset],\n );\n\n const beaconFloating = useFloating({\n strategy,\n placement: beaconPlacement,\n middleware: beaconMiddleware,\n whileElementsMounted: autoUpdate,\n });\n\n tooltipMiddlewareRef.current = tooltipFloating.middlewareData;\n beaconMiddlewareRef.current = beaconFloating.middlewareData;\n\n useEffect(() => {\n const { floating, reference } = tooltipFloating.elements;\n\n if (!reference || !floating || lifecycle !== LIFECYCLE.TOOLTIP) {\n return undefined;\n }\n\n return autoUpdate(\n reference,\n floating,\n tooltipFloating.update,\n step.floatingOptions?.autoUpdate,\n );\n }, [\n lifecycle,\n tooltipFloating.update,\n step.floatingOptions?.autoUpdate,\n step.target,\n tooltipFloating.elements,\n ]);\n\n // Wire reference element to both floating instances\n useEffect(() => {\n if (!isCenter && target) {\n tooltipFloating.refs.setReference(target);\n }\n\n if (target) {\n beaconFloating.refs.setReference(target);\n }\n }, [beaconFloating.refs, isCenter, target, tooltipFloating.refs]);\n\n // Sync tooltip position data to store\n useEffect(() => {\n if (tooltipFloating.isPositioned) {\n setPositionData('tooltip', {\n placement: tooltipFloating.placement,\n x: tooltipFloating.x ?? 0,\n y: tooltipFloating.y ?? 0,\n middlewareData: tooltipMiddlewareRef.current,\n });\n }\n }, [\n setPositionData,\n tooltipFloating.isPositioned,\n tooltipFloating.placement,\n tooltipFloating.x,\n tooltipFloating.y,\n ]);\n\n // Sync beacon position data to store\n useEffect(() => {\n if (beaconFloating.isPositioned) {\n setPositionData('beacon', {\n placement: beaconFloating.placement,\n x: beaconFloating.x ?? 0,\n y: beaconFloating.y ?? 0,\n middlewareData: beaconMiddlewareRef.current,\n });\n }\n }, [\n setPositionData,\n beaconFloating.isPositioned,\n beaconFloating.placement,\n beaconFloating.x,\n beaconFloating.y,\n ]);\n\n const zIndex = step.zIndex + 1;\n\n const handleBeaconInteraction = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (event.type === 'mouseenter' && step.beaconTrigger !== 'hover') {\n return;\n }\n\n updateState({ lifecycle: LIFECYCLE.TOOLTIP_BEFORE, positioned: false });\n },\n [step.beaconTrigger, updateState],\n );\n\n const floaterRef = useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n tooltipFloating.refs.setFloating(node);\n setTooltipRef(node);\n }\n },\n [tooltipFloating.refs, setTooltipRef],\n );\n\n const { arrow: arrowStyles, floater: floaterStyles } = step.styles;\n let content: ReactNode = null;\n\n if (lifecycle === LIFECYCLE.TOOLTIP || lifecycle === LIFECYCLE.TOOLTIP_BEFORE) {\n const styles: CSSProperties = sortObjectKeys({\n ...floaterStyles,\n ...tooltipFloating.floatingStyles,\n zIndex,\n opacity: open && tooltipFloating.isPositioned ? 1 : 0,\n ...(!open && { transition: 'none' }),\n });\n\n content = (\n <div\n ref={floaterRef}\n className=\"react-joyride__floater\"\n data-testid=\"floater\"\n id={`react-joyride-step-${index}`}\n style={styles}\n >\n <Tooltip\n continuous={continuous}\n controls={controls}\n index={index}\n isLastStep={index + 1 === size}\n size={size}\n step={step}\n />\n {!isCenter && !step.floatingOptions?.hideArrow && (\n <Arrow\n arrowComponent={step.arrowComponent}\n arrowRef={arrowRef}\n base={step.arrowBase}\n placement={tooltipFloating.placement}\n position={tooltipFloating.middlewareData.arrow}\n size={step.arrowSize}\n styles={arrowStyles}\n />\n )}\n </div>\n );\n } else if (lifecycle === LIFECYCLE.BEACON || lifecycle === LIFECYCLE.BEACON_BEFORE) {\n content = (\n <div\n ref={beaconFloating.refs.setFloating}\n className=\"react-joyride__floater\"\n data-testid=\"floater-beacon\"\n id={`react-joyride-step-${index}-beacon`}\n style={sortObjectKeys({\n ...beaconFloating.floatingStyles,\n zIndex,\n })}\n >\n <Beacon\n beaconComponent={step.beaconComponent}\n continuous={continuous}\n index={index}\n isLastStep={index + 1 === size}\n locale={step.locale}\n nonce={nonce}\n onInteract={handleBeaconInteraction}\n shouldFocus={shouldScroll}\n size={size}\n step={step}\n styles={step.styles}\n />\n </div>\n );\n }\n\n return <Portal element={portalElement}>{content}</Portal>;\n}\n","import { useState } from 'react';\nimport is from 'is-lite';\n\nimport useFocusTrap from '~/hooks/useFocusTrap';\nimport { LIFECYCLE } from '~/literals';\nimport { getElement } from '~/modules/dom';\nimport { validateStep } from '~/modules/step';\nimport type { StoreState } from '~/modules/store';\n\nimport type { Controls, PositionData, Simplify, StepMerged } from '~/types';\n\nimport Floater from './Floater';\n\ntype StepProps = Simplify<\n StoreState & {\n continuous: boolean;\n controls: Controls;\n debug: boolean;\n nonce?: string;\n portalElement: HTMLElement | null;\n setPositionData: (name: 'beacon' | 'tooltip', data: PositionData) => void;\n shouldScroll: boolean;\n step: StepMerged;\n updateState: (state: Partial<StoreState>) => void;\n }\n>;\n\nexport default function JoyrideStep(props: StepProps) {\n const {\n continuous,\n controls,\n index,\n lifecycle,\n nonce,\n portalElement,\n setPositionData,\n shouldScroll,\n size,\n step,\n updateState,\n } = props;\n const [tooltipElement, setTooltipElement] = useState<HTMLElement | null>(null);\n\n useFocusTrap(step.disableFocusTrap ? null : tooltipElement, '[data-action=primary]');\n\n const target = getElement(step.target);\n const open = lifecycle === LIFECYCLE.TOOLTIP;\n\n if (!validateStep(step) || !is.domElement(target)) {\n return null;\n }\n\n return (\n <Floater\n key={`JoyrideStep-${index}`}\n continuous={continuous}\n controls={controls}\n index={index}\n lifecycle={lifecycle}\n nonce={nonce}\n open={open}\n portalElement={portalElement}\n setPositionData={setPositionData}\n setTooltipRef={setTooltipElement}\n shouldScroll={shouldScroll}\n size={size}\n step={step}\n target={target}\n updateState={updateState}\n />\n );\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { usePortalElement } from '~/hooks/usePortalElement';\nimport type { MergedProps } from '~/hooks/useTourEngine';\nimport { ACTIONS, LIFECYCLE, ORIGIN, STATUS } from '~/literals';\nimport createStore from '~/modules/store';\nimport type { StoreState } from '~/modules/store';\n\nimport Loader from '~/components/Loader';\nimport Overlay from '~/components/Overlay';\nimport Portal from '~/components/Portal';\nimport Step from '~/components/Step';\n\nimport type { Controls, StepMerged } from '~/types';\n\ninterface TourRendererProps {\n controls: Controls;\n mergedProps: MergedProps;\n state: StoreState;\n step: StepMerged | null;\n store: RefObject<ReturnType<typeof createStore>>;\n}\n\nexport default function TourRenderer({\n controls,\n mergedProps,\n state,\n step,\n store,\n}: TourRendererProps) {\n const { continuous, debug, nonce, portalElement, scrollToFirstStep } = mergedProps;\n\n const element = usePortalElement(portalElement);\n\n const { index, lifecycle, status } = state;\n const isRunning = status === STATUS.RUNNING;\n\n const [showLoader, setShowLoader] = useState(false);\n const loaderTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const loaderDelay = step?.loaderDelay ?? 0;\n\n useEffect(() => {\n if (state.waiting) {\n if (loaderDelay === 0) {\n setShowLoader(true);\n } else {\n loaderTimerRef.current = setTimeout(() => {\n setShowLoader(true);\n }, loaderDelay);\n }\n } else {\n setShowLoader(false);\n }\n\n return () => {\n if (loaderTimerRef.current) {\n clearTimeout(loaderTimerRef.current);\n loaderTimerRef.current = null;\n }\n };\n }, [loaderDelay, state.waiting]);\n\n useEffect(() => {\n if (!isRunning) {\n return undefined;\n }\n\n const handleKeyboard = (event: KeyboardEvent) => {\n if (!step || lifecycle !== LIFECYCLE.TOOLTIP) {\n return;\n }\n\n if (event.key === 'Escape' && step.dismissKeyAction) {\n if (step.dismissKeyAction === 'next') {\n controls.next(ORIGIN.KEYBOARD);\n } else if (step.dismissKeyAction === 'replay') {\n controls.replay(ORIGIN.KEYBOARD);\n } else {\n controls.close(ORIGIN.KEYBOARD);\n }\n }\n };\n\n document.body.addEventListener('keydown', handleKeyboard, { passive: true });\n\n return () => {\n document.body.removeEventListener('keydown', handleKeyboard);\n };\n }, [controls, isRunning, lifecycle, step]);\n\n const handleClickOverlay = useCallback(() => {\n switch (step?.overlayClickAction) {\n case 'close': {\n controls.close(ORIGIN.OVERLAY);\n\n break;\n }\n case 'next': {\n controls.next(ORIGIN.OVERLAY);\n\n break;\n }\n case 'replay': {\n controls.replay(ORIGIN.OVERLAY);\n\n break;\n }\n // No default\n }\n }, [controls, step?.overlayClickAction]);\n\n if (!step || !isRunning) {\n return null;\n }\n\n /*\n Hide the overlay when the tour starts, and a beacon will be shown.\n Prevent the overlay from flashing before the beacon is rendered.\n */\n const hideOverlay =\n state.action === ACTIONS.START && !step.skipBeacon && step.placement !== 'center';\n\n return (\n <>\n {lifecycle !== LIFECYCLE.INIT && (\n <Step\n {...state}\n continuous={continuous}\n controls={controls}\n debug={debug}\n nonce={nonce}\n portalElement={element}\n setPositionData={store.current.setPositionData}\n shouldScroll={!step.skipScroll && (index !== 0 || scrollToFirstStep)}\n step={step}\n updateState={store.current.updateState}\n />\n )}\n <Portal element={element}>\n <>\n {showLoader && <Loader nonce={nonce} step={step} />}\n {!hideOverlay && (\n <Overlay\n {...step}\n continuous={continuous}\n lifecycle={lifecycle}\n onClickOverlay={handleClickOverlay}\n portalElement={portalElement ? element : null}\n scrolling={state.scrolling}\n waiting={state.waiting}\n />\n )}\n </>\n </Portal>\n </>\n );\n}\n","import { useCallback, useMemo } from 'react';\n\nimport useTourEngine from '~/hooks/useTourEngine';\nimport { canUseDOM } from '~/modules/dom';\nimport { omit } from '~/modules/helpers';\n\nimport TourRenderer from '~/components/TourRenderer';\n\nimport type { EventHandler, Events, Props, UseJoyrideReturn } from '~/types';\n\nexport function useJoyride(props: Props): UseJoyrideReturn {\n const { controls, failures, mergedProps, state, step, store } = useTourEngine(props);\n\n const on = useCallback(\n (eventType: Events, handler: EventHandler) => store.current.on(eventType, handler),\n [store],\n );\n\n const publicState = useMemo(() => omit(state, 'positioned'), [state]);\n\n const Tour = canUseDOM() ? (\n <TourRenderer\n controls={controls}\n mergedProps={mergedProps}\n state={state}\n step={step}\n store={store}\n />\n ) : null;\n\n return { controls, failures, on, state: publicState, step, Tour };\n}\n","import { useJoyride } from '~/hooks/useJoyride';\nimport { canUseDOM } from '~/modules/dom';\n\nimport type { Props } from '~/types';\n\nfunction JoyrideTour(props: Props) {\n const { Tour } = useJoyride(props);\n\n return Tour;\n}\n\nexport function Joyride(props: Props) {\n if (!canUseDOM()) {\n return null;\n }\n\n return <JoyrideTour {...props} />;\n}\n\nexport { defaultLocale, defaultOptions } from './defaults';\nexport * from './literals';\nexport * from './types';\nexport { useJoyride } from '~/hooks/useJoyride';\n"],"mappings":"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"}
|