{"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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"}