react-product-tour-guide 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.1] - 2026-04-04
9
+
10
+ ### Fixed
11
+
12
+ - **Progress bar Tailwind dependency removed.** `ProgressBar` was using Tailwind utility classes (`w-full h-1 rounded-full`, `h-full rounded-full transition-all duration-300`) that required the consumer app to have Tailwind configured. Replaced with inline styles.
13
+ - **`placement` prop typed as `string` in `TourTooltip`** — now correctly typed as the strict `Placement` union (`'top' | 'bottom' | 'left' | 'right'`).
14
+ - **Step counter hidden from screen readers.** The "Step N of N" text had `aria-hidden="true"`, making it invisible to assistive technology. Removed the attribute so screen readers announce the current step.
15
+ - **Emoji icons in `MediaFallback` announced by screen readers.** The decorative `🖼️` / `🎥` icons were being read aloud (e.g. "frame with picture") because they had no `aria-hidden`. Added `aria-hidden="true"`; the descriptive text below remains accessible.
16
+ - **`aria-label` added to progress bar.** `role="progressbar"` without an `aria-label` caused screen readers to announce it as "progressbar" with no context. Added `aria-label="Tour progress"`.
17
+
8
18
  ## [0.3.0] - 2026-03-27
9
19
 
10
20
  ### Added
@@ -45,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
45
55
  ## [0.1.0] - 2024-03-19
46
56
 
47
57
  ### Added
58
+
48
59
  - Initial release of React Product Tour
49
60
  - Core tour functionality with step navigation
50
61
  - Multiple content types support (text, image, video, custom)
@@ -60,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
60
71
  - Storybook documentation
61
72
 
62
73
  ### Features
74
+
63
75
  - Spotlight focus on target elements
64
76
  - Customizable styling and theming
65
77
  - Multiple content types support
@@ -73,9 +85,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
73
85
  - Debounced event handlers
74
86
 
75
87
  ### Technical
88
+
76
89
  - Built with TypeScript
77
90
  - React 18+ support
78
91
  - Floating UI for positioning
79
92
  - Tailwind CSS for styling
80
93
  - Vitest for testing
81
- - Storybook for documentation
94
+ - Storybook for documentation
package/dist/index.js CHANGED
@@ -603,12 +603,12 @@ var ProgressBar = ({
603
603
  className = ""
604
604
  }) => {
605
605
  const progress = (currentStep + 1) / totalSteps * 100;
606
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full h-1 rounded-full ${className}`, style: { background: "var(--tour--progress--background)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
606
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style: { width: "100%", height: "0.25rem", borderRadius: "9999px", background: "var(--tour--progress--background)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
607
607
  "div",
608
608
  {
609
- className: "h-full rounded-full transition-all duration-300 ease-in-out",
610
- style: { width: `${progress}%`, background: "var(--tour--progress--fill)" },
609
+ style: { width: `${progress}%`, height: "100%", borderRadius: "9999px", background: "var(--tour--progress--fill)", transition: "width 300ms ease-in-out" },
611
610
  role: "progressbar",
611
+ "aria-label": "Tour progress",
612
612
  "aria-valuenow": progress,
613
613
  "aria-valuemin": 0,
614
614
  "aria-valuemax": 100
@@ -617,7 +617,7 @@ var ProgressBar = ({
617
617
  };
618
618
  var MediaFallback = ({ type, className = "" }) => {
619
619
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style: { display: "flex", alignItems: "center", justifyContent: "center", padding: "1rem", background: "#f3f4f6", borderRadius: "0.5rem" }, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "center" }, children: [
620
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "#9ca3af", marginBottom: "0.5rem" }, children: type === "image" ? "\u{1F5BC}\uFE0F" : "\u{1F3A5}" }),
620
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "#9ca3af", marginBottom: "0.5rem" }, "aria-hidden": "true", children: type === "image" ? "\u{1F5BC}\uFE0F" : "\u{1F3A5}" }),
621
621
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.875rem", color: "#6b7280" }, children: type === "image" ? "Image failed to load" : "Video failed to load" })
622
622
  ] }) });
623
623
  };
@@ -839,7 +839,7 @@ var TourTooltip = ({
839
839
  children: [
840
840
  title ? /* @__PURE__ */ jsxRuntime.jsx("h3", { id: "tour-step-title", className: "tour-tooltip-title", children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { id: "tour-step-title", className: "sr-only", children: `Tour Step: ${targetLabel}` }),
841
841
  showProgress && currentStep !== void 0 && totalSteps !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tour-progress-section", children: [
842
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tour-progress-header", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tour-step-counter", "aria-hidden": "true", children: `Step ${currentStep + 1} of ${totalSteps}` }) }),
842
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tour-progress-header", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tour-step-counter", children: `Step ${currentStep + 1} of ${totalSteps}` }) }),
843
843
  /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { currentStep, totalSteps })
844
844
  ] }),
845
845
  /* @__PURE__ */ jsxRuntime.jsx("div", { id: "tour-step-content", className: "tour-tooltip-content", children: /* @__PURE__ */ jsxRuntime.jsx(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles/inject.ts","../src/manager/TourManager.ts","../src/context/TourContext.tsx","../src/hooks/useTour.ts","../src/components/ProgressBar.tsx","../src/components/MediaFallback.tsx","../src/components/ErrorBoundary.tsx","../src/components/TourTooltip.tsx","../src/components/TourOverlay.tsx","../src/components/TourHighlight.tsx","../src/hooks/useTourAccessibility.ts","../src/hooks/useDebounce.ts","../src/components/Spotlight.tsx","../src/components/Tour.tsx"],"names":["createContext","useState","useEffect","useCallback","useMemo","jsx","useContext","useTour","jsxs","Component","React","clsx","Fragment","useRef","memo","offset","flip","shift","useFloating","autoUpdate","LiveRegion","currentStepData","createPortal"],"mappings":";;;;;;;;;;;;;;;;;AACA,IAAM,cAAA,GAAiB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["// AUTO-GENERATED — do not edit. Run `npm run build` to regenerate.\nconst __tourStyles__ = `@layer react-product-tour {\n\n:root {\n /* Tour Component Colors */\n --tour--overlay--background: rgba(0, 0, 0, 0.5);\n --tour--tooltip--background: white;\n --tour--tooltip--border: #e5e7eb;\n --tour--tooltip--text: black;\n --tour--tooltip--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n /* Tour Component Spacing */\n --tour--tooltip--padding: 1rem;\n --tour--tooltip--gap: 0.5rem;\n\n /* Tour Component Border */\n --tour--tooltip--radius: 0.5rem;\n --tour--tooltip--border-width: 1px;\n\n /* Tour Component Animation */\n --tour--tooltip--transition: all 0.2s ease-in-out;\n\n /* Tour Highlight */\n --tour--highlight--padding: 8px;\n --tour--highlight--radius: 10px;\n\n /* Tour Button Colors */\n --tour--button--primary--background: #646cff;\n --tour--button--primary--text: white;\n --tour--button--secondary--background: #e5e7eb;\n --tour--button--secondary--text: #374151;\n\n /* Tour Tooltip Size */\n --tour--tooltip--max-width: 300px;\n\n /* Tour Progress Bar */\n --tour--progress--background: #e5e7eb;\n --tour--progress--fill: #f43f5e;\n}\n\n/* Dark mode variables */\n.dark {\n --tour--tooltip--background: #1f2937;\n --tour--tooltip--border: #374151;\n --tour--tooltip--text: #f9fafb;\n}\n\n/* Screen reader utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus styles */\n.tour-button:focus-visible {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.tour-button:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .tour-button {\n border: 2px solid currentColor;\n }\n\n .tour-tooltip {\n border: 2px solid currentColor;\n }\n\n .tour-highlight {\n border: 2px solid currentColor;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .tour-tooltip,\n .tour-highlight,\n .tour-overlay,\n .tour-button {\n animation: none !important;\n transition: none !important;\n }\n}\n\n/* Base tooltip styles */\n.tour-tooltip {\n position: absolute;\n background-color: var(--tour--tooltip--background);\n color: var(--tour--tooltip--text);\n padding: var(--tour--tooltip--padding);\n border-radius: var(--tour--tooltip--radius);\n box-shadow: var(--tour--tooltip--shadow);\n max-width: var(--tour--tooltip--max-width);\n z-index: 1001;\n opacity: 0;\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n}\n\n/* Allow Tailwind classes to override base styles */\n.tour-tooltip[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-tooltip[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-tooltip[class*=\"border-\"] {\n border-color: inherit;\n}\n\n.tour-tooltip[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-tooltip[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-tooltip[class*=\"p-\"] {\n padding: inherit;\n}\n\n/* Animation variants */\n.tour-tooltip[data-animation=\"slide\"] {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"top\"] {\n transform: translateY(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"bottom\"] {\n transform: translateY(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"left\"] {\n transform: translateX(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"right\"] {\n transform: translateX(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"bounce\"] {\n transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55), opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"top\"] {\n transform: translateY(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"bottom\"] {\n transform: translateY(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"left\"] {\n transform: translateX(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"right\"] {\n transform: translateX(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-tooltip[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.tour-tooltip-title {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--tour--tooltip--text);\n line-height: 1.3;\n}\n\n.tour-tooltip-content {\n margin-bottom: 1rem;\n}\n\n.tour-buttons {\n display: flex;\n gap: var(--tour--tooltip--gap);\n justify-content: flex-end;\n}\n\n/* Button navigation bar */\n.tour-button-nav {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Back/Skip group */\n.tour-button-group {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Progress section */\n.tour-progress-section {\n margin-bottom: 1rem;\n}\n\n.tour-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.25rem;\n}\n\n.tour-step-counter {\n font-size: 0.75rem;\n line-height: 1rem;\n opacity: 0.6;\n}\n\n/* Tooltip arrow */\n.tour-tooltip::before {\n content: '';\n position: absolute;\n width: 0.75rem;\n height: 0.75rem;\n background-color: var(--tour--tooltip--background);\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n transform: rotate(45deg);\n}\n\n/* Tooltip arrow positions */\n.tour-tooltip[data-placement=\"top\"]::before {\n bottom: -0.375rem;\n border-right: none;\n border-bottom: none;\n}\n\n.tour-tooltip[data-placement=\"bottom\"]::before {\n top: -0.375rem;\n border-left: none;\n border-top: none;\n}\n\n.tour-tooltip[data-placement=\"left\"]::before {\n right: -0.375rem;\n border-top: none;\n border-right: none;\n}\n\n.tour-tooltip[data-placement=\"right\"]::before {\n left: -0.375rem;\n border-bottom: none;\n border-left: none;\n}\n\n/* Button styles */\n.tour-button {\n border-radius: var(--tour--tooltip--radius);\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n padding: 0.5rem 1rem;\n border: none;\n transition: var(--tour--tooltip--transition);\n}\n\n.tour-button-primary {\n background-color: var(--tour--button--primary--background);\n color: var(--tour--button--primary--text);\n}\n\n.tour-button-secondary {\n background-color: var(--tour--button--secondary--background);\n color: var(--tour--button--secondary--text);\n}\n\n/* Allow Tailwind classes to override button styles */\n.tour-button[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-button[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-button[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-button[class*=\"p-\"] {\n padding: inherit;\n}\n\n.tour-button[class*=\"font-\"] {\n font-weight: inherit;\n}\n\n.tour-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dark .tour-button-secondary {\n background-color: #4b5563;\n}\n\n/* Overlay styles */\n.tour-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--tour--overlay--background);\n z-index: 1000;\n}\n\n.tour-overlay[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-overlay-blur {\n backdrop-filter: blur(2px);\n}\n\n/* Highlight styles */\n.tour-highlight {\n position: absolute;\n border-radius: var(--tour--highlight--radius);\n box-shadow: 0 0 0 9999px var(--tour--overlay--background);\n z-index: 1001;\n opacity: 0;\n}\n\n.tour-highlight[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-highlight[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-highlight[data-animation=\"slide\"] {\n transition: all 0.3s ease-in-out;\n transform: scale(0.98);\n}\n\n.tour-highlight[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1);\n}\n\n.tour-highlight[data-animation=\"bounce\"] {\n transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n transform: translateY(20px) scale(0.95);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.tour-highlight[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.dark .tour-highlight {\n background-color: rgba(255, 255, 255, 0.05);\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n} /* end @layer react-product-tour */\n`;\n\nif (typeof document !== 'undefined') {\n const id = '__react_product_tour_styles__';\n if (!document.getElementById(id)) {\n const style = document.createElement('style');\n style.id = id;\n style.textContent = __tourStyles__;\n document.head.insertBefore(style, document.head.firstChild);\n }\n}\n","import type { TourStep } from '../types';\n\ninterface TourState {\n steps: TourStep[];\n currentStep: number;\n isActive: boolean;\n}\n\ntype TourListener = (state: TourState) => void;\n\nclass TourManager {\n private static instance: TourManager;\n private state: TourState;\n private listeners: Set<TourListener>;\n\n private constructor() {\n this.state = {\n steps: [],\n currentStep: 0,\n isActive: false\n };\n this.listeners = new Set();\n }\n\n static getInstance(): TourManager {\n if (!TourManager.instance) {\n TourManager.instance = new TourManager();\n }\n return TourManager.instance;\n }\n\n getState(): TourState {\n return { ...this.state, steps: [...this.state.steps] };\n }\n\n initialize(steps: TourStep[]) {\n this.state.steps = steps;\n this.state.currentStep = 0;\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n start() {\n if (this.state.steps.length === 0) return;\n this.state.isActive = true;\n this.state.currentStep = 0;\n this.notifyListeners();\n }\n\n stop() {\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n next() {\n if (!this.state.isActive || this.state.currentStep >= this.state.steps.length - 1) {\n this.stop();\n return;\n }\n\n this.state.currentStep += 1;\n this.notifyListeners();\n }\n\n back() {\n if (!this.state.isActive || this.state.currentStep <= 0) return;\n\n this.state.currentStep -= 1;\n this.notifyListeners();\n }\n\n skip() {\n this.stop();\n }\n\n subscribe(listener: TourListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener({ ...this.state }));\n }\n}\n\nexport const tourManager = TourManager.getInstance(); ","import React, { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react';\nimport type { TourContextValue, TourProviderProps } from '../types';\nimport { tourManager } from '../manager/TourManager';\n\nconst TourContext = createContext<TourContextValue | null>(null);\n\nconst TourProvider: React.FC<TourProviderProps> = ({\n steps,\n children,\n defaultActive = false,\n onComplete,\n onSkip,\n onStepChange,\n onStepEnter,\n onStepExit,\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const [isActive, setIsActive] = useState(defaultActive);\n\n // Initialize the global manager with these steps\n useEffect(() => {\n tourManager.initialize(steps);\n }, [steps]);\n\n const start = useCallback(() => {\n setIsActive(true);\n setCurrentStep(0);\n onStepEnter?.(0, steps[0]);\n }, [steps, onStepEnter]);\n\n const stop = useCallback(() => {\n if (isActive) {\n onStepExit?.(currentStep, steps[currentStep]);\n }\n setIsActive(false);\n }, [isActive, currentStep, steps, onStepExit]);\n\n const next = useCallback(async () => {\n const currentStepData = steps[currentStep];\n \n if (currentStepData?.waitFor) {\n await currentStepData.waitFor();\n }\n\n if (currentStep < steps.length - 1) {\n onStepExit?.(currentStep, currentStepData);\n const nextStepIndex = currentStep + 1;\n setCurrentStep(nextStepIndex);\n onStepChange?.(nextStepIndex, steps[nextStepIndex]);\n onStepEnter?.(nextStepIndex, steps[nextStepIndex]);\n } else {\n stop();\n onComplete?.();\n }\n }, [currentStep, steps, stop, onComplete, onStepExit, onStepChange, onStepEnter]);\n\n const back = useCallback(() => {\n if (currentStep > 0) {\n const currentStepData = steps[currentStep];\n onStepExit?.(currentStep, currentStepData);\n const prevStepIndex = currentStep - 1;\n setCurrentStep(prevStepIndex);\n onStepChange?.(prevStepIndex, steps[prevStepIndex]);\n onStepEnter?.(prevStepIndex, steps[prevStepIndex]);\n }\n }, [currentStep, steps, onStepExit, onStepChange, onStepEnter]);\n\n const skip = useCallback(() => {\n stop();\n onSkip?.();\n }, [stop, onSkip]);\n\n const value = useMemo<TourContextValue>(() => ({\n steps,\n currentStep,\n isActive,\n start,\n stop,\n next,\n back,\n skip,\n }), [steps, currentStep, isActive, start, stop, next, back, skip]);\n\n return (\n <TourContext.Provider value={value}>\n {children}\n </TourContext.Provider>\n );\n};\n\nconst useTour = () => {\n const context = useContext(TourContext);\n if (!context) {\n throw new Error('useTour must be used within a TourProvider');\n }\n return context;\n}; \n\nexport {\n TourContext,\n TourProvider, \n useTour\n}","import { useContext, useEffect, useState } from 'react';\nimport { TourContext } from '../context/TourContext';\nimport { tourManager } from '../manager/TourManager';\nimport type { TourContextValue } from '../types';\n\nexport const useTour = (): TourContextValue => {\n const context = useContext(TourContext);\n const [globalState, setGlobalState] = useState(tourManager.getState());\n\n useEffect(() => {\n // Subscribe to global state changes\n return tourManager.subscribe(setGlobalState);\n }, []);\n\n // If we're inside a TourProvider, use the context\n if (context) {\n return context;\n }\n\n // Otherwise, use the global manager\n return {\n steps: globalState.steps,\n currentStep: globalState.currentStep,\n isActive: globalState.isActive,\n start: tourManager.start.bind(tourManager),\n stop: tourManager.stop.bind(tourManager),\n next: tourManager.next.bind(tourManager),\n back: tourManager.back.bind(tourManager),\n skip: tourManager.skip.bind(tourManager),\n };\n}; ","import React from 'react';\n\ninterface ProgressBarProps {\n currentStep: number;\n totalSteps: number;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n currentStep,\n totalSteps,\n className = '',\n}) => {\n const progress = ((currentStep + 1) / totalSteps) * 100;\n\n return (\n <div className={`w-full h-1 rounded-full ${className}`} style={{ background: 'var(--tour--progress--background)' }}>\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-in-out\"\n style={{ width: `${progress}%`, background: 'var(--tour--progress--fill)' }}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n );\n}; ","import React from 'react';\n\ninterface MediaFallbackProps {\n type: 'image' | 'video';\n className?: string;\n}\n\nexport const MediaFallback: React.FC<MediaFallbackProps> = ({ type, className = '' }) => {\n return (\n <div className={className} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', background: '#f3f4f6', borderRadius: '0.5rem' }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ color: '#9ca3af', marginBottom: '0.5rem' }}>\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {type === 'image' ? 'Image failed to load' : 'Video failed to load'}\n </p>\n </div>\n </div>\n );\n}; ","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\n/**\n * Props for the ErrorBoundary component\n */\ninterface Props {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback function when an error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\n/**\n * State for the ErrorBoundary component\n */\ninterface State {\n /** Whether an error has occurred */\n hasError: boolean;\n /** The error that occurred */\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches JavaScript errors in its child component tree\n * and displays a fallback UI instead of crashing the whole app\n * @param props - Props for the ErrorBoundary component\n * @returns React component\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n /**\n * Updates state when an error occurs\n * @param error - The error that occurred\n * @returns New state\n */\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n /**\n * Called when an error occurs\n * @param error - The error that occurred\n * @param errorInfo - Additional error information\n */\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.props.onError?.(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-red-600 mb-2\">Something went wrong</div>\n <div className=\"text-sm text-red-500\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n} ","import React, { type ReactNode, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport type { ContentType, MediaSource, ButtonConfig, ButtonLayoutConfig, ButtonRenderProps } from '../types';\nimport { ProgressBar } from './ProgressBar';\nimport { MediaFallback } from './MediaFallback';\nimport { ErrorBoundary } from './ErrorBoundary';\n\n/**\n * Props for the TourTooltip component\n */\ninterface TourTooltipProps {\n /** Content to display in the tooltip */\n content: React.ReactNode | ContentType;\n /** Placement of the tooltip relative to the target */\n placement: string;\n /** Animation type for the tooltip */\n animation?: 'slide' | 'bounce' | 'fade';\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Custom class for the tooltip */\n tooltipClassName?: string;\n /** Custom class for the buttons */\n buttonClassName?: string;\n /** Custom class for the button container */\n buttonContainerClassName?: string;\n /** Label for the target element */\n targetLabel: string;\n /** Optional step title shown as a visible heading */\n title?: string;\n /** Styles for floating positioning */\n floatingStyles: React.CSSProperties;\n /** Function to set the floating element reference */\n setFloating: (node: HTMLElement | null) => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n /** @deprecated Use `back` and `skip` instead. Applies to both back and skip buttons when the specific key is absent. */\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n}\n\n/**\n * Gets the media source URL from a value\n * @param value - The media source value\n * @returns The media source URL\n */\nconst getMediaSource = (value: ReactNode | MediaSource): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'type' in value && 'src' in value) {\n const mediaSource = value as MediaSource;\n return mediaSource.src;\n }\n return String(value);\n};\n\nconst SAFE_IMG_ATTRS = new Set(['alt', 'width', 'height', 'loading', 'decoding', 'crossOrigin', 'referrerPolicy', 'sizes', 'srcSet', 'className', 'style']);\nconst SAFE_VIDEO_ATTRS = new Set(['width', 'height', 'loop', 'muted', 'autoPlay', 'playsInline', 'preload', 'poster', 'crossOrigin', 'className', 'style']);\n\nconst filterProps = (props: Record<string, unknown> | undefined, allowList: Set<string>): Record<string, unknown> => {\n if (!props) return {};\n return Object.fromEntries(Object.entries(props).filter(([k]) => allowList.has(k)));\n};\n\nconst ImageContent: React.FC<{ src: string; alt?: string; props?: Record<string, unknown> }> = ({ src, alt = 'Tour content', props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"image\" />;\n return (\n <img\n src={src}\n alt={alt}\n style={{ width: '100%', height: 'auto', borderRadius: '0.5rem' }}\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_IMG_ATTRS)}\n />\n );\n};\n\nconst VideoContent: React.FC<{ src: string; props?: Record<string, unknown> }> = ({ src, props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"video\" />;\n return (\n <video\n src={src}\n controls\n className=\"w-full h-auto rounded-lg\"\n role=\"presentation\"\n aria-label=\"Tour video content\"\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_VIDEO_ATTRS)}\n />\n );\n};\n\n/**\n * Renders the content based on its type\n * @param content - The content to render\n * @returns The rendered content\n */\nconst renderContent = (content: TourTooltipProps['content']): React.ReactNode => {\n if (!content) return null;\n\n if (typeof content === 'string' || React.isValidElement(content)) {\n return content;\n }\n\n const contentObj = content as unknown;\n if (\n typeof contentObj === 'object' &&\n contentObj !== null &&\n 'type' in contentObj &&\n 'value' in contentObj\n ) {\n const typedContent = contentObj as ContentType;\n switch (typedContent.type) {\n case 'image':\n return <ImageContent src={getMediaSource(typedContent.value)} alt={typedContent.alt} props={typedContent.props} />;\n case 'video':\n return <VideoContent src={getMediaSource(typedContent.value)} props={typedContent.props} />;\n case 'custom':\n return typedContent.value as React.ReactNode;\n case 'text':\n default:\n return typedContent.value as React.ReactNode;\n }\n }\n\n return content as React.ReactNode;\n};\n\n/**\n * Renders the buttons based on the provided configuration\n * @param props - ButtonRenderProps\n * @param config - Button configuration\n * @returns The rendered buttons\n */\nconst renderButtons = (\n props: ButtonRenderProps & { skip?: boolean },\n config?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n }\n): React.ReactNode => {\n const {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip,\n } = props;\n\n const backCfg = config?.back ?? config?.secondary;\n const skipCfg = config?.skip ?? config?.secondary;\n\n // If container has a custom render function, use it\n if (config?.container?.render) {\n return config.container.render(props);\n }\n\n // Default button container\n return (\n <div\n className={clsx('tour-button-nav', config?.container?.className)}\n style={{\n flexDirection: config?.container?.direction || 'row',\n alignItems: config?.container?.align || 'center',\n gap: config?.container?.gap || '0.5rem',\n ...config?.container?.style,\n }}\n role=\"toolbar\"\n aria-label=\"Tour navigation\"\n >\n <div className=\"tour-button-group\">\n {!isFirstStep && (\n backCfg?.render ? (\n backCfg.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', backCfg?.className)}\n style={backCfg?.style}\n aria-label=\"Go to previous step\"\n >\n {backCfg?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n skipCfg?.render ? (\n skipCfg.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', skipCfg?.className)}\n style={skipCfg?.style}\n aria-label=\"Skip tour\"\n >\n {skipCfg?.content || 'Skip'}\n </button>\n )\n )}\n </div>\n {config?.primary?.render ? (\n config.primary.render(props)\n ) : (\n <button\n onClick={isLastStep ? onComplete : onNext}\n className={clsx('tour-button tour-button-primary', config?.primary?.className)}\n style={config?.primary?.style}\n aria-label={isLastStep ? \"Complete tour\" : \"Go to next step\"}\n >\n {config?.primary?.content || (isLastStep ? 'Done' : 'Next')}\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Tooltip component that displays tour content and navigation controls\n * @param props - TourTooltipProps\n * @returns React component\n */\nexport const TourTooltip: React.FC<TourTooltipProps> = ({\n content,\n placement,\n animation = 'slide',\n isFirstStep,\n isLastStep,\n skip,\n onNext,\n onBack,\n onSkip,\n onComplete,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n targetLabel,\n title,\n floatingStyles,\n setFloating,\n showProgress = false,\n currentStep,\n totalSteps,\n buttonConfig,\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Add a small delay to ensure the initial position is set\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [placement]);\n\n return (\n <div\n ref={setFloating}\n style={floatingStyles}\n className={clsx('tour-tooltip', tooltipClassName, { visible: isVisible })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tour-step-title\"\n aria-describedby=\"tour-step-content\"\n data-placement={placement}\n data-animation={animation}\n >\n {title ? (\n <h3 id=\"tour-step-title\" className=\"tour-tooltip-title\">\n {title}\n </h3>\n ) : (\n <div id=\"tour-step-title\" className=\"sr-only\">\n {`Tour Step: ${targetLabel}`}\n </div>\n )}\n {showProgress && currentStep !== undefined && totalSteps !== undefined && (\n <div className=\"tour-progress-section\">\n <div className=\"tour-progress-header\">\n <span className=\"tour-step-counter\" aria-hidden=\"true\">\n {`Step ${currentStep + 1} of ${totalSteps}`}\n </span>\n </div>\n <ProgressBar currentStep={currentStep} totalSteps={totalSteps} />\n </div>\n )}\n <div id=\"tour-step-content\" className=\"tour-tooltip-content\">\n <ErrorBoundary\n fallback={\n <div style={{ padding: '1rem', background: '#f9fafb', border: '1px solid #e5e7eb', borderRadius: '0.5rem' }}>\n <div style={{ color: '#4b5563', marginBottom: '0.5rem' }}>Content Error</div>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Failed to render tour content\n </div>\n </div>\n }\n >\n {renderContent(content)}\n </ErrorBoundary>\n </div>\n {renderButtons(\n {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n currentStep,\n totalSteps,\n skip,\n },\n buttonConfig || {\n primary: { className: buttonClassName },\n secondary: { className: buttonClassName },\n container: { className: buttonContainerClassName },\n }\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface TourOverlayProps {\n overlayClassName?: string;\n isPartialBlur?: boolean;\n /** When true a highlight element provides the spotlight via box-shadow — skip the solid overlay */\n hasHighlight?: boolean;\n /** Called when the overlay is clicked */\n onDismiss?: () => void;\n}\n\nexport const TourOverlay: React.FC<TourOverlayProps> = ({\n overlayClassName,\n isPartialBlur,\n hasHighlight,\n onDismiss,\n}) => {\n return (\n <>\n {/* Blur overlay */}\n {isPartialBlur && (\n <div\n className=\"fixed inset-0 z-40 backdrop-blur-sm bg-black/40\"\n style={{\n mixBlendMode: 'multiply',\n }}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Plain full-screen overlay — only shown when there is no highlight element.\n When a highlight is present its box-shadow creates the dark surround instead,\n which naturally follows border-radius for a rounded spotlight. */}\n {!hasHighlight && (\n <div\n className={clsx('tour-overlay fixed inset-0 z-40', overlayClassName)}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport type { HighlightConfig } from '../types';\n\ninterface TourHighlightProps {\n targetRect: DOMRect;\n highlightConfig: HighlightConfig;\n animation?: 'slide' | 'bounce' | 'fade';\n}\n\nexport const TourHighlight: React.FC<TourHighlightProps> = ({\n targetRect,\n highlightConfig,\n animation = 'slide',\n}) => {\n const padding = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--tour--highlight--padding') || '8'\n );\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [targetRect]);\n\n return (\n <div\n style={{\n position: 'fixed',\n top: targetRect.top - padding,\n left: targetRect.left - padding,\n width: targetRect.width + padding * 2,\n height: targetRect.height + padding * 2,\n ...highlightConfig.style,\n }}\n className={clsx(\n 'tour-highlight z-50',\n highlightConfig.className,\n { visible: isVisible }\n )}\n data-animation={animation}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n}; ","import React, { useEffect, useRef } from 'react';\nimport { ContentType } from '../types';\n\ninterface UseTourAccessibilityOptions {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode | ContentType;\n isActive: boolean;\n enableScreenReader?: boolean;\n announcements?: {\n start?: string;\n end?: string;\n step?: string;\n };\n focusManagement?: 'auto' | 'manual';\n focusTrap?: boolean;\n}\n\ninterface LiveRegionProps {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode;\n isActive: boolean;\n announcements?: UseTourAccessibilityOptions['announcements'];\n}\n\nconst LiveRegion: React.FC<LiveRegionProps> = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n announcements,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isActive || !ref.current) return;\n\n const contentText = typeof content === 'string' ? content : '';\n const defaultStepAnnouncement = `Step ${currentStep + 1} of ${totalSteps}: ${targetLabel}.${contentText ? ` ${contentText}` : ''}`;\n const stepAnnouncement = announcements?.step\n ? announcements.step\n .replace('{step}', String(currentStep + 1))\n .replace('{total}', String(totalSteps))\n .replace('{content}', contentText)\n : defaultStepAnnouncement;\n\n ref.current.textContent = stepAnnouncement;\n }, [currentStep, totalSteps, targetLabel, content, isActive, announcements]);\n\n return React.createElement('div', {\n ref,\n role: 'status',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n className: 'sr-only'\n });\n};\n\nexport const useTourAccessibility = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n enableScreenReader = false,\n announcements,\n focusManagement = 'auto',\n focusTrap = true,\n}: UseTourAccessibilityOptions) => {\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isActive || focusManagement === 'manual') return;\n\n // Store the previously focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Auto-focus the first focusable element in the tour dialog\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n return () => {\n // Restore focus when tour ends — validate element is still in the DOM\n if (previousFocusRef.current && document.contains(previousFocusRef.current)) {\n previousFocusRef.current.focus();\n }\n };\n }, [isActive, focusManagement]);\n\n // Create focus trap — active whenever focusTrap is true, independent of screen reader mode\n useEffect(() => {\n if (!isActive || !focusTrap) return;\n\n const handleTabKey = (e: KeyboardEvent) => {\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n e.preventDefault();\n lastFocusableElement.focus();\n }\n } else {\n if (document.activeElement === lastFocusableElement) {\n e.preventDefault();\n firstFocusableElement.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n return () => document.removeEventListener('keydown', handleTabKey);\n }, [isActive, focusTrap]);\n\n return {\n LiveRegion: () => React.createElement(LiveRegion, {\n currentStep,\n totalSteps,\n targetLabel,\n content: content as React.ReactNode,\n isActive,\n announcements\n }),\n targetLabel,\n };\n}; ","import { useCallback, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: unknown[]) => void>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n ((...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n }) as T,\n [callback, delay]\n );\n} ","import React, { useEffect, useState, memo, useRef, useMemo } from 'react';\nimport { useFloating, offset, flip, shift, autoUpdate } from '@floating-ui/react';\nimport type { SpotlightProps, ButtonConfig, ButtonLayoutConfig } from '../types';\nimport { TourTooltip } from './TourTooltip';\nimport { TourOverlay } from './TourOverlay';\nimport { TourHighlight } from './TourHighlight';\nimport { useTourAccessibility } from '../hooks/useTourAccessibility';\nimport { useDebounce } from '../hooks/useDebounce';\nimport '../styles/theme.css';\n\n/**\n * Props for the Spotlight component\n */\ninterface SpotlightComponentProps extends SpotlightProps {\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Accessibility configuration */\n accessibility?: {\n /** Whether to enable screen reader announcements */\n enableScreenReader?: boolean;\n /** Custom screen reader announcements */\n announcements?: {\n /** Announcement when tour starts */\n start?: string;\n /** Announcement when tour ends */\n end?: string;\n /** Announcement for each step */\n step?: string;\n };\n /** Focus management strategy */\n focusManagement?: 'auto' | 'manual';\n /** Whether to trap focus within the tour */\n focusTrap?: boolean;\n };\n animation?: 'slide' | 'bounce' | 'fade';\n /** Distance in pixels between the tooltip and its target element */\n tooltipOffset?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n /** Close the tour when the overlay is clicked */\n dismissOnOverlayClick?: boolean;\n /** Optional step title shown as a visible heading in the tooltip */\n title?: string;\n}\n\n/**\n * Spotlight component that highlights a target element and displays a tooltip\n * @param props - SpotlightComponentProps\n * @returns React component\n */\nexport const Spotlight: React.FC<SpotlightComponentProps> = memo(({\n targetElement,\n placement,\n content,\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip = true,\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget = true,\n currentStep,\n totalSteps,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset = 10,\n buttonConfig,\n dismissOnOverlayClick = true,\n title,\n}) => {\n const middleware = useMemo(\n () => [offset(tooltipOffset), flip(), shift()],\n [tooltipOffset]\n );\n\n const { refs: tooltipRefs, floatingStyles, update } = useFloating({\n placement,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const { LiveRegion, targetLabel } = useTourAccessibility({\n currentStep: currentStep ?? 0,\n totalSteps: totalSteps ?? 0,\n targetLabel: targetElement?.getAttribute('aria-label') || 'target element',\n content,\n isActive: true,\n enableScreenReader: accessibility.enableScreenReader,\n announcements: accessibility.announcements,\n focusManagement: accessibility.focusManagement,\n focusTrap: accessibility.focusTrap,\n });\n\n const highlightConfig = typeof highlightTarget === 'object' ? highlightTarget : { className: 'tour-highlight' };\n const isPartialBlur = overlayClassName?.includes('tour-overlay-partial-blur');\n\n // Reactive rect — kept in sync with scroll and resize.\n // Initialized eagerly so the first render is not null (avoids a flash of nothing in tests and on mount).\n const [rect, setRect] = useState<DOMRect | null>(() =>\n targetElement ? targetElement.getBoundingClientRect() : null\n );\n\n // Debounce the update function; store in ref so listeners don't need it as a dep\n const debouncedUpdate = useDebounce(update, 100);\n const debouncedUpdateRef = useRef(debouncedUpdate);\n useEffect(() => { debouncedUpdateRef.current = debouncedUpdate; });\n\n // When step changes: scroll into view, register Floating UI reference, snapshot rect\n useEffect(() => {\n if (!targetElement) return;\n tooltipRefs.setReference(targetElement);\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n setRect(targetElement.getBoundingClientRect());\n }, [targetElement, tooltipRefs]);\n\n // Keep rect in sync while the page scrolls (incl. during smooth-scroll animation)\n useEffect(() => {\n if (!targetElement) return;\n const updateRect = () => {\n setRect(targetElement.getBoundingClientRect());\n debouncedUpdateRef.current();\n };\n window.addEventListener('scroll', updateRect, { passive: true });\n window.addEventListener('resize', updateRect, { passive: true });\n return () => {\n window.removeEventListener('scroll', updateRect);\n window.removeEventListener('resize', updateRect);\n };\n }, [targetElement]); // debouncedUpdate excluded — accessed via ref\n\n if (!targetElement || !rect) return null;\n\n return (\n <>\n {accessibility.enableScreenReader !== false && <LiveRegion />}\n\n <TourOverlay\n overlayClassName={overlayClassName}\n isPartialBlur={isPartialBlur}\n hasHighlight={!!highlightTarget}\n onDismiss={dismissOnOverlayClick ? onSkip : undefined}\n />\n\n {highlightTarget && (\n <TourHighlight\n targetRect={rect}\n highlightConfig={highlightConfig}\n animation={animation}\n />\n )}\n\n {/* Add isolation to the target element */}\n {isPartialBlur && targetElement.id && (\n <style>\n {`\n #${CSS.escape(targetElement.id)} {\n isolation: isolate;\n position: relative;\n z-index: 50;\n transform: translateZ(0);\n will-change: transform;\n }\n `}\n </style>\n )}\n\n <TourTooltip\n content={content}\n placement={placement}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n skip={skip}\n onNext={onNext}\n onBack={onBack}\n onSkip={onSkip}\n onComplete={onComplete}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n targetLabel={targetLabel}\n floatingStyles={floatingStyles}\n setFloating={tooltipRefs.setFloating}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={totalSteps}\n animation={animation}\n buttonConfig={buttonConfig}\n title={title}\n />\n\n </>\n );\n}); ","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTour } from '../context/TourContext';\nimport { Spotlight } from './Spotlight';\nimport type { TourProps } from '../types';\n\nexport const Tour: React.FC<TourProps> = ({\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget,\n skip = true,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset,\n buttonConfig,\n dismissOnOverlayClick = true,\n}) => {\n const { steps, currentStep, isActive, next, back, skip: skipTour } = useTour();\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n\n // Extract stable primitive deps to avoid object reference churn\n const enableScreenReader = accessibility.enableScreenReader;\n const startAnnouncement = accessibility.announcements?.start ?? 'Tour started. Use arrow keys to navigate between steps.';\n const endAnnouncement = accessibility.announcements?.end ?? 'Tour ended.';\n\n // Keyboard navigation: Escape closes, Arrow keys move between steps\n useEffect(() => {\n if (!isActive) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { skipTour(); return; }\n\n // Don't intercept arrow keys when focus is inside an editable element\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT' || target.isContentEditable) return;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); next(); }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); back(); }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, skipTour, next, back]);\n\n useEffect(() => {\n if (!isActive || enableScreenReader === false) return;\n\n // Announce tour start to screen readers\n const announcement = document.createElement('div');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only';\n announcement.textContent = startAnnouncement;\n document.body.appendChild(announcement);\n\n // Clear announcement after a delay; store ID so we can cancel on unmount\n const startTimerId = setTimeout(() => {\n if (announcement.isConnected) document.body.removeChild(announcement);\n }, 3000);\n\n return () => {\n clearTimeout(startTimerId);\n if (announcement.isConnected) document.body.removeChild(announcement);\n\n // Announce tour end to screen readers\n const endEl = document.createElement('div');\n endEl.setAttribute('role', 'status');\n endEl.setAttribute('aria-live', 'polite');\n endEl.setAttribute('aria-atomic', 'true');\n endEl.className = 'sr-only';\n endEl.textContent = endAnnouncement;\n document.body.appendChild(endEl);\n\n setTimeout(() => {\n if (endEl.isConnected) document.body.removeChild(endEl);\n }, 3000);\n };\n }, [isActive, enableScreenReader, startAnnouncement, endAnnouncement]);\n\n useEffect(() => {\n if (!isActive) return;\n\n let mounted = true;\n\n const currentStepData = steps[currentStep];\n if (!currentStepData) return;\n\n // Reset target when step changes so the fallback isn't shown briefly\n setTargetElement(null);\n\n let element: Element | null = null;\n try {\n element = document.querySelector(currentStepData.selector);\n } catch {\n return;\n }\n\n if (element) {\n setTargetElement(element);\n } else if (currentStepData.waitFor) {\n currentStepData.waitFor().then(() => {\n if (!mounted) return;\n try {\n const el = document.querySelector(currentStepData.selector);\n setTargetElement(el);\n } catch {\n // invalid selector — leave targetElement null\n }\n }).catch(() => {\n // waitFor rejected — leave targetElement null for this step\n });\n }\n\n return () => { mounted = false; };\n }, [isActive, currentStep, steps]);\n\n const currentStepData = steps[currentStep];\n if (!isActive || !currentStepData) return null;\n\n // Fallback when target element is not found — render a centered dialog\n // instead of silently freezing the tour\n if (!targetElement) {\n const isLastStep = currentStep === steps.length - 1;\n return createPortal(\n <>\n <div\n className=\"tour-overlay fixed inset-0 z-40\"\n onClick={dismissOnOverlayClick ? skipTour : undefined}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center pointer-events-none\">\n <div\n className=\"tour-tooltip pointer-events-auto\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Tour step unavailable\"\n >\n <p className=\"mb-4 text-sm\" style={{ opacity: 0.7 }}>\n This step is currently unavailable.\n </p>\n <div className=\"flex justify-end gap-2\">\n <button onClick={skipTour} className=\"tour-button tour-button-secondary\" aria-label=\"Skip tour\">\n Skip\n </button>\n {!isLastStep && (\n <button onClick={next} className=\"tour-button tour-button-primary\" aria-label=\"Go to next step\">\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </>,\n document.body\n );\n }\n\n return createPortal(\n <Spotlight\n targetElement={targetElement}\n placement={currentStepData.placement || 'bottom'}\n title={currentStepData.title}\n content={currentStepData.content}\n onNext={next}\n onBack={back}\n onSkip={skipTour}\n onComplete={next}\n isFirstStep={currentStep === 0}\n isLastStep={currentStep === steps.length - 1}\n overlayClassName={overlayClassName}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n highlightTarget={highlightTarget}\n skip={skip}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={steps.length}\n accessibility={accessibility}\n animation={animation}\n tooltipOffset={tooltipOffset}\n buttonConfig={buttonConfig}\n dismissOnOverlayClick={dismissOnOverlayClick}\n />,\n document.body\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/styles/inject.ts","../src/manager/TourManager.ts","../src/context/TourContext.tsx","../src/hooks/useTour.ts","../src/components/ProgressBar.tsx","../src/components/MediaFallback.tsx","../src/components/ErrorBoundary.tsx","../src/components/TourTooltip.tsx","../src/components/TourOverlay.tsx","../src/components/TourHighlight.tsx","../src/hooks/useTourAccessibility.ts","../src/hooks/useDebounce.ts","../src/components/Spotlight.tsx","../src/components/Tour.tsx"],"names":["createContext","useState","useEffect","useCallback","useMemo","jsx","useContext","useTour","jsxs","Component","React","clsx","Fragment","useRef","memo","offset","flip","shift","useFloating","autoUpdate","LiveRegion","currentStepData","createPortal"],"mappings":";;;;;;;;;;;;;;;;;AACA,IAAM,cAAA,GAAiB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["// AUTO-GENERATED — do not edit. Run `npm run build` to regenerate.\nconst __tourStyles__ = `@layer react-product-tour {\n\n:root {\n /* Tour Component Colors */\n --tour--overlay--background: rgba(0, 0, 0, 0.5);\n --tour--tooltip--background: white;\n --tour--tooltip--border: #e5e7eb;\n --tour--tooltip--text: black;\n --tour--tooltip--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n /* Tour Component Spacing */\n --tour--tooltip--padding: 1rem;\n --tour--tooltip--gap: 0.5rem;\n\n /* Tour Component Border */\n --tour--tooltip--radius: 0.5rem;\n --tour--tooltip--border-width: 1px;\n\n /* Tour Component Animation */\n --tour--tooltip--transition: all 0.2s ease-in-out;\n\n /* Tour Highlight */\n --tour--highlight--padding: 8px;\n --tour--highlight--radius: 10px;\n\n /* Tour Button Colors */\n --tour--button--primary--background: #646cff;\n --tour--button--primary--text: white;\n --tour--button--secondary--background: #e5e7eb;\n --tour--button--secondary--text: #374151;\n\n /* Tour Tooltip Size */\n --tour--tooltip--max-width: 300px;\n\n /* Tour Progress Bar */\n --tour--progress--background: #e5e7eb;\n --tour--progress--fill: #f43f5e;\n}\n\n/* Dark mode variables */\n.dark {\n --tour--tooltip--background: #1f2937;\n --tour--tooltip--border: #374151;\n --tour--tooltip--text: #f9fafb;\n}\n\n/* Screen reader utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus styles */\n.tour-button:focus-visible {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.tour-button:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .tour-button {\n border: 2px solid currentColor;\n }\n\n .tour-tooltip {\n border: 2px solid currentColor;\n }\n\n .tour-highlight {\n border: 2px solid currentColor;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .tour-tooltip,\n .tour-highlight,\n .tour-overlay,\n .tour-button {\n animation: none !important;\n transition: none !important;\n }\n}\n\n/* Base tooltip styles */\n.tour-tooltip {\n position: absolute;\n background-color: var(--tour--tooltip--background);\n color: var(--tour--tooltip--text);\n padding: var(--tour--tooltip--padding);\n border-radius: var(--tour--tooltip--radius);\n box-shadow: var(--tour--tooltip--shadow);\n max-width: var(--tour--tooltip--max-width);\n z-index: 1001;\n opacity: 0;\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n}\n\n/* Allow Tailwind classes to override base styles */\n.tour-tooltip[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-tooltip[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-tooltip[class*=\"border-\"] {\n border-color: inherit;\n}\n\n.tour-tooltip[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-tooltip[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-tooltip[class*=\"p-\"] {\n padding: inherit;\n}\n\n/* Animation variants */\n.tour-tooltip[data-animation=\"slide\"] {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"top\"] {\n transform: translateY(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"bottom\"] {\n transform: translateY(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"left\"] {\n transform: translateX(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"right\"] {\n transform: translateX(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"bounce\"] {\n transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55), opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"top\"] {\n transform: translateY(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"bottom\"] {\n transform: translateY(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"left\"] {\n transform: translateX(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"right\"] {\n transform: translateX(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-tooltip[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.tour-tooltip-title {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--tour--tooltip--text);\n line-height: 1.3;\n}\n\n.tour-tooltip-content {\n margin-bottom: 1rem;\n}\n\n.tour-buttons {\n display: flex;\n gap: var(--tour--tooltip--gap);\n justify-content: flex-end;\n}\n\n/* Button navigation bar */\n.tour-button-nav {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Back/Skip group */\n.tour-button-group {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Progress section */\n.tour-progress-section {\n margin-bottom: 1rem;\n}\n\n.tour-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.25rem;\n}\n\n.tour-step-counter {\n font-size: 0.75rem;\n line-height: 1rem;\n opacity: 0.6;\n}\n\n/* Tooltip arrow */\n.tour-tooltip::before {\n content: '';\n position: absolute;\n width: 0.75rem;\n height: 0.75rem;\n background-color: var(--tour--tooltip--background);\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n transform: rotate(45deg);\n}\n\n/* Tooltip arrow positions */\n.tour-tooltip[data-placement=\"top\"]::before {\n bottom: -0.375rem;\n border-right: none;\n border-bottom: none;\n}\n\n.tour-tooltip[data-placement=\"bottom\"]::before {\n top: -0.375rem;\n border-left: none;\n border-top: none;\n}\n\n.tour-tooltip[data-placement=\"left\"]::before {\n right: -0.375rem;\n border-top: none;\n border-right: none;\n}\n\n.tour-tooltip[data-placement=\"right\"]::before {\n left: -0.375rem;\n border-bottom: none;\n border-left: none;\n}\n\n/* Button styles */\n.tour-button {\n border-radius: var(--tour--tooltip--radius);\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n padding: 0.5rem 1rem;\n border: none;\n transition: var(--tour--tooltip--transition);\n}\n\n.tour-button-primary {\n background-color: var(--tour--button--primary--background);\n color: var(--tour--button--primary--text);\n}\n\n.tour-button-secondary {\n background-color: var(--tour--button--secondary--background);\n color: var(--tour--button--secondary--text);\n}\n\n/* Allow Tailwind classes to override button styles */\n.tour-button[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-button[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-button[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-button[class*=\"p-\"] {\n padding: inherit;\n}\n\n.tour-button[class*=\"font-\"] {\n font-weight: inherit;\n}\n\n.tour-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dark .tour-button-secondary {\n background-color: #4b5563;\n}\n\n/* Overlay styles */\n.tour-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--tour--overlay--background);\n z-index: 1000;\n}\n\n.tour-overlay[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-overlay-blur {\n backdrop-filter: blur(2px);\n}\n\n/* Highlight styles */\n.tour-highlight {\n position: absolute;\n border-radius: var(--tour--highlight--radius);\n box-shadow: 0 0 0 9999px var(--tour--overlay--background);\n z-index: 1001;\n opacity: 0;\n}\n\n.tour-highlight[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-highlight[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-highlight[data-animation=\"slide\"] {\n transition: all 0.3s ease-in-out;\n transform: scale(0.98);\n}\n\n.tour-highlight[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1);\n}\n\n.tour-highlight[data-animation=\"bounce\"] {\n transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n transform: translateY(20px) scale(0.95);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.tour-highlight[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.dark .tour-highlight {\n background-color: rgba(255, 255, 255, 0.05);\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n} /* end @layer react-product-tour */\n`;\n\nif (typeof document !== 'undefined') {\n const id = '__react_product_tour_styles__';\n if (!document.getElementById(id)) {\n const style = document.createElement('style');\n style.id = id;\n style.textContent = __tourStyles__;\n document.head.insertBefore(style, document.head.firstChild);\n }\n}\n","import type { TourStep } from '../types';\n\ninterface TourState {\n steps: TourStep[];\n currentStep: number;\n isActive: boolean;\n}\n\ntype TourListener = (state: TourState) => void;\n\nclass TourManager {\n private static instance: TourManager;\n private state: TourState;\n private listeners: Set<TourListener>;\n\n private constructor() {\n this.state = {\n steps: [],\n currentStep: 0,\n isActive: false\n };\n this.listeners = new Set();\n }\n\n static getInstance(): TourManager {\n if (!TourManager.instance) {\n TourManager.instance = new TourManager();\n }\n return TourManager.instance;\n }\n\n getState(): TourState {\n return { ...this.state, steps: [...this.state.steps] };\n }\n\n initialize(steps: TourStep[]) {\n this.state.steps = steps;\n this.state.currentStep = 0;\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n start() {\n if (this.state.steps.length === 0) return;\n this.state.isActive = true;\n this.state.currentStep = 0;\n this.notifyListeners();\n }\n\n stop() {\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n next() {\n if (!this.state.isActive || this.state.currentStep >= this.state.steps.length - 1) {\n this.stop();\n return;\n }\n\n this.state.currentStep += 1;\n this.notifyListeners();\n }\n\n back() {\n if (!this.state.isActive || this.state.currentStep <= 0) return;\n\n this.state.currentStep -= 1;\n this.notifyListeners();\n }\n\n skip() {\n this.stop();\n }\n\n subscribe(listener: TourListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener({ ...this.state }));\n }\n}\n\nexport const tourManager = TourManager.getInstance(); ","import React, { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react';\nimport type { TourContextValue, TourProviderProps } from '../types';\nimport { tourManager } from '../manager/TourManager';\n\nconst TourContext = createContext<TourContextValue | null>(null);\n\nconst TourProvider: React.FC<TourProviderProps> = ({\n steps,\n children,\n defaultActive = false,\n onComplete,\n onSkip,\n onStepChange,\n onStepEnter,\n onStepExit,\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const [isActive, setIsActive] = useState(defaultActive);\n\n // Initialize the global manager with these steps\n useEffect(() => {\n tourManager.initialize(steps);\n }, [steps]);\n\n const start = useCallback(() => {\n setIsActive(true);\n setCurrentStep(0);\n onStepEnter?.(0, steps[0]);\n }, [steps, onStepEnter]);\n\n const stop = useCallback(() => {\n if (isActive) {\n onStepExit?.(currentStep, steps[currentStep]);\n }\n setIsActive(false);\n }, [isActive, currentStep, steps, onStepExit]);\n\n const next = useCallback(async () => {\n const currentStepData = steps[currentStep];\n \n if (currentStepData?.waitFor) {\n await currentStepData.waitFor();\n }\n\n if (currentStep < steps.length - 1) {\n onStepExit?.(currentStep, currentStepData);\n const nextStepIndex = currentStep + 1;\n setCurrentStep(nextStepIndex);\n onStepChange?.(nextStepIndex, steps[nextStepIndex]);\n onStepEnter?.(nextStepIndex, steps[nextStepIndex]);\n } else {\n stop();\n onComplete?.();\n }\n }, [currentStep, steps, stop, onComplete, onStepExit, onStepChange, onStepEnter]);\n\n const back = useCallback(() => {\n if (currentStep > 0) {\n const currentStepData = steps[currentStep];\n onStepExit?.(currentStep, currentStepData);\n const prevStepIndex = currentStep - 1;\n setCurrentStep(prevStepIndex);\n onStepChange?.(prevStepIndex, steps[prevStepIndex]);\n onStepEnter?.(prevStepIndex, steps[prevStepIndex]);\n }\n }, [currentStep, steps, onStepExit, onStepChange, onStepEnter]);\n\n const skip = useCallback(() => {\n stop();\n onSkip?.();\n }, [stop, onSkip]);\n\n const value = useMemo<TourContextValue>(() => ({\n steps,\n currentStep,\n isActive,\n start,\n stop,\n next,\n back,\n skip,\n }), [steps, currentStep, isActive, start, stop, next, back, skip]);\n\n return (\n <TourContext.Provider value={value}>\n {children}\n </TourContext.Provider>\n );\n};\n\nconst useTour = () => {\n const context = useContext(TourContext);\n if (!context) {\n throw new Error('useTour must be used within a TourProvider');\n }\n return context;\n}; \n\nexport {\n TourContext,\n TourProvider, \n useTour\n}","import { useContext, useEffect, useState } from 'react';\nimport { TourContext } from '../context/TourContext';\nimport { tourManager } from '../manager/TourManager';\nimport type { TourContextValue } from '../types';\n\nexport const useTour = (): TourContextValue => {\n const context = useContext(TourContext);\n const [globalState, setGlobalState] = useState(tourManager.getState());\n\n useEffect(() => {\n // Subscribe to global state changes\n return tourManager.subscribe(setGlobalState);\n }, []);\n\n // If we're inside a TourProvider, use the context\n if (context) {\n return context;\n }\n\n // Otherwise, use the global manager\n return {\n steps: globalState.steps,\n currentStep: globalState.currentStep,\n isActive: globalState.isActive,\n start: tourManager.start.bind(tourManager),\n stop: tourManager.stop.bind(tourManager),\n next: tourManager.next.bind(tourManager),\n back: tourManager.back.bind(tourManager),\n skip: tourManager.skip.bind(tourManager),\n };\n}; ","import React from 'react';\n\ninterface ProgressBarProps {\n currentStep: number;\n totalSteps: number;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n currentStep,\n totalSteps,\n className = '',\n}) => {\n const progress = ((currentStep + 1) / totalSteps) * 100;\n\n return (\n <div className={className} style={{ width: '100%', height: '0.25rem', borderRadius: '9999px', background: 'var(--tour--progress--background)' }}>\n <div\n style={{ width: `${progress}%`, height: '100%', borderRadius: '9999px', background: 'var(--tour--progress--fill)', transition: 'width 300ms ease-in-out' }}\n role=\"progressbar\"\n aria-label=\"Tour progress\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n );\n}; ","import React from 'react';\n\ninterface MediaFallbackProps {\n type: 'image' | 'video';\n className?: string;\n}\n\nexport const MediaFallback: React.FC<MediaFallbackProps> = ({ type, className = '' }) => {\n return (\n <div className={className} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', background: '#f3f4f6', borderRadius: '0.5rem' }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ color: '#9ca3af', marginBottom: '0.5rem' }} aria-hidden=\"true\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {type === 'image' ? 'Image failed to load' : 'Video failed to load'}\n </p>\n </div>\n </div>\n );\n}; ","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\n/**\n * Props for the ErrorBoundary component\n */\ninterface Props {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback function when an error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\n/**\n * State for the ErrorBoundary component\n */\ninterface State {\n /** Whether an error has occurred */\n hasError: boolean;\n /** The error that occurred */\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches JavaScript errors in its child component tree\n * and displays a fallback UI instead of crashing the whole app\n * @param props - Props for the ErrorBoundary component\n * @returns React component\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n /**\n * Updates state when an error occurs\n * @param error - The error that occurred\n * @returns New state\n */\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n /**\n * Called when an error occurs\n * @param error - The error that occurred\n * @param errorInfo - Additional error information\n */\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.props.onError?.(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-red-600 mb-2\">Something went wrong</div>\n <div className=\"text-sm text-red-500\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n} ","import React, { type ReactNode, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport type { ContentType, MediaSource, ButtonConfig, ButtonLayoutConfig, ButtonRenderProps, Placement } from '../types';\nimport { ProgressBar } from './ProgressBar';\nimport { MediaFallback } from './MediaFallback';\nimport { ErrorBoundary } from './ErrorBoundary';\n\n/**\n * Props for the TourTooltip component\n */\ninterface TourTooltipProps {\n /** Content to display in the tooltip */\n content: React.ReactNode | ContentType;\n /** Placement of the tooltip relative to the target */\n placement: Placement;\n /** Animation type for the tooltip */\n animation?: 'slide' | 'bounce' | 'fade';\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Custom class for the tooltip */\n tooltipClassName?: string;\n /** Custom class for the buttons */\n buttonClassName?: string;\n /** Custom class for the button container */\n buttonContainerClassName?: string;\n /** Label for the target element */\n targetLabel: string;\n /** Optional step title shown as a visible heading */\n title?: string;\n /** Styles for floating positioning */\n floatingStyles: React.CSSProperties;\n /** Function to set the floating element reference */\n setFloating: (node: HTMLElement | null) => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n /** @deprecated Use `back` and `skip` instead. Applies to both back and skip buttons when the specific key is absent. */\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n}\n\n/**\n * Gets the media source URL from a value\n * @param value - The media source value\n * @returns The media source URL\n */\nconst getMediaSource = (value: ReactNode | MediaSource): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'type' in value && 'src' in value) {\n const mediaSource = value as MediaSource;\n return mediaSource.src;\n }\n return String(value);\n};\n\nconst SAFE_IMG_ATTRS = new Set(['alt', 'width', 'height', 'loading', 'decoding', 'crossOrigin', 'referrerPolicy', 'sizes', 'srcSet', 'className', 'style']);\nconst SAFE_VIDEO_ATTRS = new Set(['width', 'height', 'loop', 'muted', 'autoPlay', 'playsInline', 'preload', 'poster', 'crossOrigin', 'className', 'style']);\n\nconst filterProps = (props: Record<string, unknown> | undefined, allowList: Set<string>): Record<string, unknown> => {\n if (!props) return {};\n return Object.fromEntries(Object.entries(props).filter(([k]) => allowList.has(k)));\n};\n\nconst ImageContent: React.FC<{ src: string; alt?: string; props?: Record<string, unknown> }> = ({ src, alt = 'Tour content', props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"image\" />;\n return (\n <img\n src={src}\n alt={alt}\n style={{ width: '100%', height: 'auto', borderRadius: '0.5rem' }}\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_IMG_ATTRS)}\n />\n );\n};\n\nconst VideoContent: React.FC<{ src: string; props?: Record<string, unknown> }> = ({ src, props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"video\" />;\n return (\n <video\n src={src}\n controls\n className=\"w-full h-auto rounded-lg\"\n role=\"presentation\"\n aria-label=\"Tour video content\"\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_VIDEO_ATTRS)}\n />\n );\n};\n\n/**\n * Renders the content based on its type\n * @param content - The content to render\n * @returns The rendered content\n */\nconst renderContent = (content: TourTooltipProps['content']): React.ReactNode => {\n if (!content) return null;\n\n if (typeof content === 'string' || React.isValidElement(content)) {\n return content;\n }\n\n const contentObj = content as unknown;\n if (\n typeof contentObj === 'object' &&\n contentObj !== null &&\n 'type' in contentObj &&\n 'value' in contentObj\n ) {\n const typedContent = contentObj as ContentType;\n switch (typedContent.type) {\n case 'image':\n return <ImageContent src={getMediaSource(typedContent.value)} alt={typedContent.alt} props={typedContent.props} />;\n case 'video':\n return <VideoContent src={getMediaSource(typedContent.value)} props={typedContent.props} />;\n case 'custom':\n return typedContent.value as React.ReactNode;\n case 'text':\n default:\n return typedContent.value as React.ReactNode;\n }\n }\n\n return content as React.ReactNode;\n};\n\n/**\n * Renders the buttons based on the provided configuration\n * @param props - ButtonRenderProps\n * @param config - Button configuration\n * @returns The rendered buttons\n */\nconst renderButtons = (\n props: ButtonRenderProps & { skip?: boolean },\n config?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n }\n): React.ReactNode => {\n const {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip,\n } = props;\n\n const backCfg = config?.back ?? config?.secondary;\n const skipCfg = config?.skip ?? config?.secondary;\n\n // If container has a custom render function, use it\n if (config?.container?.render) {\n return config.container.render(props);\n }\n\n // Default button container\n return (\n <div\n className={clsx('tour-button-nav', config?.container?.className)}\n style={{\n flexDirection: config?.container?.direction || 'row',\n alignItems: config?.container?.align || 'center',\n gap: config?.container?.gap || '0.5rem',\n ...config?.container?.style,\n }}\n role=\"toolbar\"\n aria-label=\"Tour navigation\"\n >\n <div className=\"tour-button-group\">\n {!isFirstStep && (\n backCfg?.render ? (\n backCfg.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', backCfg?.className)}\n style={backCfg?.style}\n aria-label=\"Go to previous step\"\n >\n {backCfg?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n skipCfg?.render ? (\n skipCfg.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', skipCfg?.className)}\n style={skipCfg?.style}\n aria-label=\"Skip tour\"\n >\n {skipCfg?.content || 'Skip'}\n </button>\n )\n )}\n </div>\n {config?.primary?.render ? (\n config.primary.render(props)\n ) : (\n <button\n onClick={isLastStep ? onComplete : onNext}\n className={clsx('tour-button tour-button-primary', config?.primary?.className)}\n style={config?.primary?.style}\n aria-label={isLastStep ? \"Complete tour\" : \"Go to next step\"}\n >\n {config?.primary?.content || (isLastStep ? 'Done' : 'Next')}\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Tooltip component that displays tour content and navigation controls\n * @param props - TourTooltipProps\n * @returns React component\n */\nexport const TourTooltip: React.FC<TourTooltipProps> = ({\n content,\n placement,\n animation = 'slide',\n isFirstStep,\n isLastStep,\n skip,\n onNext,\n onBack,\n onSkip,\n onComplete,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n targetLabel,\n title,\n floatingStyles,\n setFloating,\n showProgress = false,\n currentStep,\n totalSteps,\n buttonConfig,\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Add a small delay to ensure the initial position is set\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [placement]);\n\n return (\n <div\n ref={setFloating}\n style={floatingStyles}\n className={clsx('tour-tooltip', tooltipClassName, { visible: isVisible })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tour-step-title\"\n aria-describedby=\"tour-step-content\"\n data-placement={placement}\n data-animation={animation}\n >\n {title ? (\n <h3 id=\"tour-step-title\" className=\"tour-tooltip-title\">\n {title}\n </h3>\n ) : (\n <div id=\"tour-step-title\" className=\"sr-only\">\n {`Tour Step: ${targetLabel}`}\n </div>\n )}\n {showProgress && currentStep !== undefined && totalSteps !== undefined && (\n <div className=\"tour-progress-section\">\n <div className=\"tour-progress-header\">\n <span className=\"tour-step-counter\">\n {`Step ${currentStep + 1} of ${totalSteps}`}\n </span>\n </div>\n <ProgressBar currentStep={currentStep} totalSteps={totalSteps} />\n </div>\n )}\n <div id=\"tour-step-content\" className=\"tour-tooltip-content\">\n <ErrorBoundary\n fallback={\n <div style={{ padding: '1rem', background: '#f9fafb', border: '1px solid #e5e7eb', borderRadius: '0.5rem' }}>\n <div style={{ color: '#4b5563', marginBottom: '0.5rem' }}>Content Error</div>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Failed to render tour content\n </div>\n </div>\n }\n >\n {renderContent(content)}\n </ErrorBoundary>\n </div>\n {renderButtons(\n {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n currentStep,\n totalSteps,\n skip,\n },\n buttonConfig || {\n primary: { className: buttonClassName },\n secondary: { className: buttonClassName },\n container: { className: buttonContainerClassName },\n }\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface TourOverlayProps {\n overlayClassName?: string;\n isPartialBlur?: boolean;\n /** When true a highlight element provides the spotlight via box-shadow — skip the solid overlay */\n hasHighlight?: boolean;\n /** Called when the overlay is clicked */\n onDismiss?: () => void;\n}\n\nexport const TourOverlay: React.FC<TourOverlayProps> = ({\n overlayClassName,\n isPartialBlur,\n hasHighlight,\n onDismiss,\n}) => {\n return (\n <>\n {/* Blur overlay */}\n {isPartialBlur && (\n <div\n className=\"fixed inset-0 z-40 backdrop-blur-sm bg-black/40\"\n style={{\n mixBlendMode: 'multiply',\n }}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Plain full-screen overlay — only shown when there is no highlight element.\n When a highlight is present its box-shadow creates the dark surround instead,\n which naturally follows border-radius for a rounded spotlight. */}\n {!hasHighlight && (\n <div\n className={clsx('tour-overlay fixed inset-0 z-40', overlayClassName)}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport type { HighlightConfig } from '../types';\n\ninterface TourHighlightProps {\n targetRect: DOMRect;\n highlightConfig: HighlightConfig;\n animation?: 'slide' | 'bounce' | 'fade';\n}\n\nexport const TourHighlight: React.FC<TourHighlightProps> = ({\n targetRect,\n highlightConfig,\n animation = 'slide',\n}) => {\n const padding = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--tour--highlight--padding') || '8'\n );\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [targetRect]);\n\n return (\n <div\n style={{\n position: 'fixed',\n top: targetRect.top - padding,\n left: targetRect.left - padding,\n width: targetRect.width + padding * 2,\n height: targetRect.height + padding * 2,\n ...highlightConfig.style,\n }}\n className={clsx(\n 'tour-highlight z-50',\n highlightConfig.className,\n { visible: isVisible }\n )}\n data-animation={animation}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n}; ","import React, { useEffect, useRef } from 'react';\nimport { ContentType } from '../types';\n\ninterface UseTourAccessibilityOptions {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode | ContentType;\n isActive: boolean;\n enableScreenReader?: boolean;\n announcements?: {\n start?: string;\n end?: string;\n step?: string;\n };\n focusManagement?: 'auto' | 'manual';\n focusTrap?: boolean;\n}\n\ninterface LiveRegionProps {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode;\n isActive: boolean;\n announcements?: UseTourAccessibilityOptions['announcements'];\n}\n\nconst LiveRegion: React.FC<LiveRegionProps> = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n announcements,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isActive || !ref.current) return;\n\n const contentText = typeof content === 'string' ? content : '';\n const defaultStepAnnouncement = `Step ${currentStep + 1} of ${totalSteps}: ${targetLabel}.${contentText ? ` ${contentText}` : ''}`;\n const stepAnnouncement = announcements?.step\n ? announcements.step\n .replace('{step}', String(currentStep + 1))\n .replace('{total}', String(totalSteps))\n .replace('{content}', contentText)\n : defaultStepAnnouncement;\n\n ref.current.textContent = stepAnnouncement;\n }, [currentStep, totalSteps, targetLabel, content, isActive, announcements]);\n\n return React.createElement('div', {\n ref,\n role: 'status',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n className: 'sr-only'\n });\n};\n\nexport const useTourAccessibility = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n enableScreenReader = false,\n announcements,\n focusManagement = 'auto',\n focusTrap = true,\n}: UseTourAccessibilityOptions) => {\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isActive || focusManagement === 'manual') return;\n\n // Store the previously focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Auto-focus the first focusable element in the tour dialog\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n return () => {\n // Restore focus when tour ends — validate element is still in the DOM\n if (previousFocusRef.current && document.contains(previousFocusRef.current)) {\n previousFocusRef.current.focus();\n }\n };\n }, [isActive, focusManagement]);\n\n // Create focus trap — active whenever focusTrap is true, independent of screen reader mode\n useEffect(() => {\n if (!isActive || !focusTrap) return;\n\n const handleTabKey = (e: KeyboardEvent) => {\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n e.preventDefault();\n lastFocusableElement.focus();\n }\n } else {\n if (document.activeElement === lastFocusableElement) {\n e.preventDefault();\n firstFocusableElement.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n return () => document.removeEventListener('keydown', handleTabKey);\n }, [isActive, focusTrap]);\n\n return {\n LiveRegion: () => React.createElement(LiveRegion, {\n currentStep,\n totalSteps,\n targetLabel,\n content: content as React.ReactNode,\n isActive,\n announcements\n }),\n targetLabel,\n };\n}; ","import { useCallback, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: unknown[]) => void>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n ((...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n }) as T,\n [callback, delay]\n );\n} ","import React, { useEffect, useState, memo, useRef, useMemo } from 'react';\nimport { useFloating, offset, flip, shift, autoUpdate } from '@floating-ui/react';\nimport type { SpotlightProps, ButtonConfig, ButtonLayoutConfig } from '../types';\nimport { TourTooltip } from './TourTooltip';\nimport { TourOverlay } from './TourOverlay';\nimport { TourHighlight } from './TourHighlight';\nimport { useTourAccessibility } from '../hooks/useTourAccessibility';\nimport { useDebounce } from '../hooks/useDebounce';\nimport '../styles/theme.css';\n\n/**\n * Props for the Spotlight component\n */\ninterface SpotlightComponentProps extends SpotlightProps {\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Accessibility configuration */\n accessibility?: {\n /** Whether to enable screen reader announcements */\n enableScreenReader?: boolean;\n /** Custom screen reader announcements */\n announcements?: {\n /** Announcement when tour starts */\n start?: string;\n /** Announcement when tour ends */\n end?: string;\n /** Announcement for each step */\n step?: string;\n };\n /** Focus management strategy */\n focusManagement?: 'auto' | 'manual';\n /** Whether to trap focus within the tour */\n focusTrap?: boolean;\n };\n animation?: 'slide' | 'bounce' | 'fade';\n /** Distance in pixels between the tooltip and its target element */\n tooltipOffset?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n /** Close the tour when the overlay is clicked */\n dismissOnOverlayClick?: boolean;\n /** Optional step title shown as a visible heading in the tooltip */\n title?: string;\n}\n\n/**\n * Spotlight component that highlights a target element and displays a tooltip\n * @param props - SpotlightComponentProps\n * @returns React component\n */\nexport const Spotlight: React.FC<SpotlightComponentProps> = memo(({\n targetElement,\n placement,\n content,\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip = true,\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget = true,\n currentStep,\n totalSteps,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset = 10,\n buttonConfig,\n dismissOnOverlayClick = true,\n title,\n}) => {\n const middleware = useMemo(\n () => [offset(tooltipOffset), flip(), shift()],\n [tooltipOffset]\n );\n\n const { refs: tooltipRefs, floatingStyles, update } = useFloating({\n placement,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const { LiveRegion, targetLabel } = useTourAccessibility({\n currentStep: currentStep ?? 0,\n totalSteps: totalSteps ?? 0,\n targetLabel: targetElement?.getAttribute('aria-label') || 'target element',\n content,\n isActive: true,\n enableScreenReader: accessibility.enableScreenReader,\n announcements: accessibility.announcements,\n focusManagement: accessibility.focusManagement,\n focusTrap: accessibility.focusTrap,\n });\n\n const highlightConfig = typeof highlightTarget === 'object' ? highlightTarget : { className: 'tour-highlight' };\n const isPartialBlur = overlayClassName?.includes('tour-overlay-partial-blur');\n\n // Reactive rect — kept in sync with scroll and resize.\n // Initialized eagerly so the first render is not null (avoids a flash of nothing in tests and on mount).\n const [rect, setRect] = useState<DOMRect | null>(() =>\n targetElement ? targetElement.getBoundingClientRect() : null\n );\n\n // Debounce the update function; store in ref so listeners don't need it as a dep\n const debouncedUpdate = useDebounce(update, 100);\n const debouncedUpdateRef = useRef(debouncedUpdate);\n useEffect(() => { debouncedUpdateRef.current = debouncedUpdate; });\n\n // When step changes: scroll into view, register Floating UI reference, snapshot rect\n useEffect(() => {\n if (!targetElement) return;\n tooltipRefs.setReference(targetElement);\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n setRect(targetElement.getBoundingClientRect());\n }, [targetElement, tooltipRefs]);\n\n // Keep rect in sync while the page scrolls (incl. during smooth-scroll animation)\n useEffect(() => {\n if (!targetElement) return;\n const updateRect = () => {\n setRect(targetElement.getBoundingClientRect());\n debouncedUpdateRef.current();\n };\n window.addEventListener('scroll', updateRect, { passive: true });\n window.addEventListener('resize', updateRect, { passive: true });\n return () => {\n window.removeEventListener('scroll', updateRect);\n window.removeEventListener('resize', updateRect);\n };\n }, [targetElement]); // debouncedUpdate excluded — accessed via ref\n\n if (!targetElement || !rect) return null;\n\n return (\n <>\n {accessibility.enableScreenReader !== false && <LiveRegion />}\n\n <TourOverlay\n overlayClassName={overlayClassName}\n isPartialBlur={isPartialBlur}\n hasHighlight={!!highlightTarget}\n onDismiss={dismissOnOverlayClick ? onSkip : undefined}\n />\n\n {highlightTarget && (\n <TourHighlight\n targetRect={rect}\n highlightConfig={highlightConfig}\n animation={animation}\n />\n )}\n\n {/* Add isolation to the target element */}\n {isPartialBlur && targetElement.id && (\n <style>\n {`\n #${CSS.escape(targetElement.id)} {\n isolation: isolate;\n position: relative;\n z-index: 50;\n transform: translateZ(0);\n will-change: transform;\n }\n `}\n </style>\n )}\n\n <TourTooltip\n content={content}\n placement={placement}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n skip={skip}\n onNext={onNext}\n onBack={onBack}\n onSkip={onSkip}\n onComplete={onComplete}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n targetLabel={targetLabel}\n floatingStyles={floatingStyles}\n setFloating={tooltipRefs.setFloating}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={totalSteps}\n animation={animation}\n buttonConfig={buttonConfig}\n title={title}\n />\n\n </>\n );\n}); ","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTour } from '../context/TourContext';\nimport { Spotlight } from './Spotlight';\nimport type { TourProps } from '../types';\n\nexport const Tour: React.FC<TourProps> = ({\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget,\n skip = true,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset,\n buttonConfig,\n dismissOnOverlayClick = true,\n}) => {\n const { steps, currentStep, isActive, next, back, skip: skipTour } = useTour();\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n\n // Extract stable primitive deps to avoid object reference churn\n const enableScreenReader = accessibility.enableScreenReader;\n const startAnnouncement = accessibility.announcements?.start ?? 'Tour started. Use arrow keys to navigate between steps.';\n const endAnnouncement = accessibility.announcements?.end ?? 'Tour ended.';\n\n // Keyboard navigation: Escape closes, Arrow keys move between steps\n useEffect(() => {\n if (!isActive) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { skipTour(); return; }\n\n // Don't intercept arrow keys when focus is inside an editable element\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT' || target.isContentEditable) return;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); next(); }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); back(); }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, skipTour, next, back]);\n\n useEffect(() => {\n if (!isActive || enableScreenReader === false) return;\n\n // Announce tour start to screen readers\n const announcement = document.createElement('div');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only';\n announcement.textContent = startAnnouncement;\n document.body.appendChild(announcement);\n\n // Clear announcement after a delay; store ID so we can cancel on unmount\n const startTimerId = setTimeout(() => {\n if (announcement.isConnected) document.body.removeChild(announcement);\n }, 3000);\n\n return () => {\n clearTimeout(startTimerId);\n if (announcement.isConnected) document.body.removeChild(announcement);\n\n // Announce tour end to screen readers\n const endEl = document.createElement('div');\n endEl.setAttribute('role', 'status');\n endEl.setAttribute('aria-live', 'polite');\n endEl.setAttribute('aria-atomic', 'true');\n endEl.className = 'sr-only';\n endEl.textContent = endAnnouncement;\n document.body.appendChild(endEl);\n\n setTimeout(() => {\n if (endEl.isConnected) document.body.removeChild(endEl);\n }, 3000);\n };\n }, [isActive, enableScreenReader, startAnnouncement, endAnnouncement]);\n\n useEffect(() => {\n if (!isActive) return;\n\n let mounted = true;\n\n const currentStepData = steps[currentStep];\n if (!currentStepData) return;\n\n // Reset target when step changes so the fallback isn't shown briefly\n setTargetElement(null);\n\n let element: Element | null = null;\n try {\n element = document.querySelector(currentStepData.selector);\n } catch {\n return;\n }\n\n if (element) {\n setTargetElement(element);\n } else if (currentStepData.waitFor) {\n currentStepData.waitFor().then(() => {\n if (!mounted) return;\n try {\n const el = document.querySelector(currentStepData.selector);\n setTargetElement(el);\n } catch {\n // invalid selector — leave targetElement null\n }\n }).catch(() => {\n // waitFor rejected — leave targetElement null for this step\n });\n }\n\n return () => { mounted = false; };\n }, [isActive, currentStep, steps]);\n\n const currentStepData = steps[currentStep];\n if (!isActive || !currentStepData) return null;\n\n // Fallback when target element is not found — render a centered dialog\n // instead of silently freezing the tour\n if (!targetElement) {\n const isLastStep = currentStep === steps.length - 1;\n return createPortal(\n <>\n <div\n className=\"tour-overlay fixed inset-0 z-40\"\n onClick={dismissOnOverlayClick ? skipTour : undefined}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center pointer-events-none\">\n <div\n className=\"tour-tooltip pointer-events-auto\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Tour step unavailable\"\n >\n <p className=\"mb-4 text-sm\" style={{ opacity: 0.7 }}>\n This step is currently unavailable.\n </p>\n <div className=\"flex justify-end gap-2\">\n <button onClick={skipTour} className=\"tour-button tour-button-secondary\" aria-label=\"Skip tour\">\n Skip\n </button>\n {!isLastStep && (\n <button onClick={next} className=\"tour-button tour-button-primary\" aria-label=\"Go to next step\">\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </>,\n document.body\n );\n }\n\n return createPortal(\n <Spotlight\n targetElement={targetElement}\n placement={currentStepData.placement || 'bottom'}\n title={currentStepData.title}\n content={currentStepData.content}\n onNext={next}\n onBack={back}\n onSkip={skipTour}\n onComplete={next}\n isFirstStep={currentStep === 0}\n isLastStep={currentStep === steps.length - 1}\n overlayClassName={overlayClassName}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n highlightTarget={highlightTarget}\n skip={skip}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={steps.length}\n accessibility={accessibility}\n animation={animation}\n tooltipOffset={tooltipOffset}\n buttonConfig={buttonConfig}\n dismissOnOverlayClick={dismissOnOverlayClick}\n />,\n document.body\n );\n};\n"]}
package/dist/index.mjs CHANGED
@@ -597,12 +597,12 @@ var ProgressBar = ({
597
597
  className = ""
598
598
  }) => {
599
599
  const progress = (currentStep + 1) / totalSteps * 100;
600
- return /* @__PURE__ */ jsx("div", { className: `w-full h-1 rounded-full ${className}`, style: { background: "var(--tour--progress--background)" }, children: /* @__PURE__ */ jsx(
600
+ return /* @__PURE__ */ jsx("div", { className, style: { width: "100%", height: "0.25rem", borderRadius: "9999px", background: "var(--tour--progress--background)" }, children: /* @__PURE__ */ jsx(
601
601
  "div",
602
602
  {
603
- className: "h-full rounded-full transition-all duration-300 ease-in-out",
604
- style: { width: `${progress}%`, background: "var(--tour--progress--fill)" },
603
+ style: { width: `${progress}%`, height: "100%", borderRadius: "9999px", background: "var(--tour--progress--fill)", transition: "width 300ms ease-in-out" },
605
604
  role: "progressbar",
605
+ "aria-label": "Tour progress",
606
606
  "aria-valuenow": progress,
607
607
  "aria-valuemin": 0,
608
608
  "aria-valuemax": 100
@@ -611,7 +611,7 @@ var ProgressBar = ({
611
611
  };
612
612
  var MediaFallback = ({ type, className = "" }) => {
613
613
  return /* @__PURE__ */ jsx("div", { className, style: { display: "flex", alignItems: "center", justifyContent: "center", padding: "1rem", background: "#f3f4f6", borderRadius: "0.5rem" }, children: /* @__PURE__ */ jsxs("div", { style: { textAlign: "center" }, children: [
614
- /* @__PURE__ */ jsx("div", { style: { color: "#9ca3af", marginBottom: "0.5rem" }, children: type === "image" ? "\u{1F5BC}\uFE0F" : "\u{1F3A5}" }),
614
+ /* @__PURE__ */ jsx("div", { style: { color: "#9ca3af", marginBottom: "0.5rem" }, "aria-hidden": "true", children: type === "image" ? "\u{1F5BC}\uFE0F" : "\u{1F3A5}" }),
615
615
  /* @__PURE__ */ jsx("p", { style: { fontSize: "0.875rem", color: "#6b7280" }, children: type === "image" ? "Image failed to load" : "Video failed to load" })
616
616
  ] }) });
617
617
  };
@@ -833,7 +833,7 @@ var TourTooltip = ({
833
833
  children: [
834
834
  title ? /* @__PURE__ */ jsx("h3", { id: "tour-step-title", className: "tour-tooltip-title", children: title }) : /* @__PURE__ */ jsx("div", { id: "tour-step-title", className: "sr-only", children: `Tour Step: ${targetLabel}` }),
835
835
  showProgress && currentStep !== void 0 && totalSteps !== void 0 && /* @__PURE__ */ jsxs("div", { className: "tour-progress-section", children: [
836
- /* @__PURE__ */ jsx("div", { className: "tour-progress-header", children: /* @__PURE__ */ jsx("span", { className: "tour-step-counter", "aria-hidden": "true", children: `Step ${currentStep + 1} of ${totalSteps}` }) }),
836
+ /* @__PURE__ */ jsx("div", { className: "tour-progress-header", children: /* @__PURE__ */ jsx("span", { className: "tour-step-counter", children: `Step ${currentStep + 1} of ${totalSteps}` }) }),
837
837
  /* @__PURE__ */ jsx(ProgressBar, { currentStep, totalSteps })
838
838
  ] }),
839
839
  /* @__PURE__ */ jsx("div", { id: "tour-step-content", className: "tour-tooltip-content", children: /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles/inject.ts","../src/manager/TourManager.ts","../src/context/TourContext.tsx","../src/hooks/useTour.ts","../src/components/ProgressBar.tsx","../src/components/MediaFallback.tsx","../src/components/ErrorBoundary.tsx","../src/components/TourTooltip.tsx","../src/components/TourOverlay.tsx","../src/components/TourHighlight.tsx","../src/hooks/useTourAccessibility.ts","../src/hooks/useDebounce.ts","../src/components/Spotlight.tsx","../src/components/Tour.tsx"],"names":["useTour","useContext","useState","useEffect","jsx","jsxs","React","clsx","useRef","useCallback","useMemo","LiveRegion","Fragment","currentStepData"],"mappings":";;;;;;;;;;;AACA,IAAM,cAAA,GAAiB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;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","file":"index.mjs","sourcesContent":["// AUTO-GENERATED — do not edit. Run `npm run build` to regenerate.\nconst __tourStyles__ = `@layer react-product-tour {\n\n:root {\n /* Tour Component Colors */\n --tour--overlay--background: rgba(0, 0, 0, 0.5);\n --tour--tooltip--background: white;\n --tour--tooltip--border: #e5e7eb;\n --tour--tooltip--text: black;\n --tour--tooltip--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n /* Tour Component Spacing */\n --tour--tooltip--padding: 1rem;\n --tour--tooltip--gap: 0.5rem;\n\n /* Tour Component Border */\n --tour--tooltip--radius: 0.5rem;\n --tour--tooltip--border-width: 1px;\n\n /* Tour Component Animation */\n --tour--tooltip--transition: all 0.2s ease-in-out;\n\n /* Tour Highlight */\n --tour--highlight--padding: 8px;\n --tour--highlight--radius: 10px;\n\n /* Tour Button Colors */\n --tour--button--primary--background: #646cff;\n --tour--button--primary--text: white;\n --tour--button--secondary--background: #e5e7eb;\n --tour--button--secondary--text: #374151;\n\n /* Tour Tooltip Size */\n --tour--tooltip--max-width: 300px;\n\n /* Tour Progress Bar */\n --tour--progress--background: #e5e7eb;\n --tour--progress--fill: #f43f5e;\n}\n\n/* Dark mode variables */\n.dark {\n --tour--tooltip--background: #1f2937;\n --tour--tooltip--border: #374151;\n --tour--tooltip--text: #f9fafb;\n}\n\n/* Screen reader utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus styles */\n.tour-button:focus-visible {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.tour-button:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .tour-button {\n border: 2px solid currentColor;\n }\n\n .tour-tooltip {\n border: 2px solid currentColor;\n }\n\n .tour-highlight {\n border: 2px solid currentColor;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .tour-tooltip,\n .tour-highlight,\n .tour-overlay,\n .tour-button {\n animation: none !important;\n transition: none !important;\n }\n}\n\n/* Base tooltip styles */\n.tour-tooltip {\n position: absolute;\n background-color: var(--tour--tooltip--background);\n color: var(--tour--tooltip--text);\n padding: var(--tour--tooltip--padding);\n border-radius: var(--tour--tooltip--radius);\n box-shadow: var(--tour--tooltip--shadow);\n max-width: var(--tour--tooltip--max-width);\n z-index: 1001;\n opacity: 0;\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n}\n\n/* Allow Tailwind classes to override base styles */\n.tour-tooltip[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-tooltip[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-tooltip[class*=\"border-\"] {\n border-color: inherit;\n}\n\n.tour-tooltip[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-tooltip[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-tooltip[class*=\"p-\"] {\n padding: inherit;\n}\n\n/* Animation variants */\n.tour-tooltip[data-animation=\"slide\"] {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"top\"] {\n transform: translateY(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"bottom\"] {\n transform: translateY(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"left\"] {\n transform: translateX(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"right\"] {\n transform: translateX(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"bounce\"] {\n transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55), opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"top\"] {\n transform: translateY(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"bottom\"] {\n transform: translateY(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"left\"] {\n transform: translateX(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"right\"] {\n transform: translateX(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-tooltip[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.tour-tooltip-title {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--tour--tooltip--text);\n line-height: 1.3;\n}\n\n.tour-tooltip-content {\n margin-bottom: 1rem;\n}\n\n.tour-buttons {\n display: flex;\n gap: var(--tour--tooltip--gap);\n justify-content: flex-end;\n}\n\n/* Button navigation bar */\n.tour-button-nav {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Back/Skip group */\n.tour-button-group {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Progress section */\n.tour-progress-section {\n margin-bottom: 1rem;\n}\n\n.tour-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.25rem;\n}\n\n.tour-step-counter {\n font-size: 0.75rem;\n line-height: 1rem;\n opacity: 0.6;\n}\n\n/* Tooltip arrow */\n.tour-tooltip::before {\n content: '';\n position: absolute;\n width: 0.75rem;\n height: 0.75rem;\n background-color: var(--tour--tooltip--background);\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n transform: rotate(45deg);\n}\n\n/* Tooltip arrow positions */\n.tour-tooltip[data-placement=\"top\"]::before {\n bottom: -0.375rem;\n border-right: none;\n border-bottom: none;\n}\n\n.tour-tooltip[data-placement=\"bottom\"]::before {\n top: -0.375rem;\n border-left: none;\n border-top: none;\n}\n\n.tour-tooltip[data-placement=\"left\"]::before {\n right: -0.375rem;\n border-top: none;\n border-right: none;\n}\n\n.tour-tooltip[data-placement=\"right\"]::before {\n left: -0.375rem;\n border-bottom: none;\n border-left: none;\n}\n\n/* Button styles */\n.tour-button {\n border-radius: var(--tour--tooltip--radius);\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n padding: 0.5rem 1rem;\n border: none;\n transition: var(--tour--tooltip--transition);\n}\n\n.tour-button-primary {\n background-color: var(--tour--button--primary--background);\n color: var(--tour--button--primary--text);\n}\n\n.tour-button-secondary {\n background-color: var(--tour--button--secondary--background);\n color: var(--tour--button--secondary--text);\n}\n\n/* Allow Tailwind classes to override button styles */\n.tour-button[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-button[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-button[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-button[class*=\"p-\"] {\n padding: inherit;\n}\n\n.tour-button[class*=\"font-\"] {\n font-weight: inherit;\n}\n\n.tour-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dark .tour-button-secondary {\n background-color: #4b5563;\n}\n\n/* Overlay styles */\n.tour-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--tour--overlay--background);\n z-index: 1000;\n}\n\n.tour-overlay[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-overlay-blur {\n backdrop-filter: blur(2px);\n}\n\n/* Highlight styles */\n.tour-highlight {\n position: absolute;\n border-radius: var(--tour--highlight--radius);\n box-shadow: 0 0 0 9999px var(--tour--overlay--background);\n z-index: 1001;\n opacity: 0;\n}\n\n.tour-highlight[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-highlight[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-highlight[data-animation=\"slide\"] {\n transition: all 0.3s ease-in-out;\n transform: scale(0.98);\n}\n\n.tour-highlight[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1);\n}\n\n.tour-highlight[data-animation=\"bounce\"] {\n transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n transform: translateY(20px) scale(0.95);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.tour-highlight[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.dark .tour-highlight {\n background-color: rgba(255, 255, 255, 0.05);\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n} /* end @layer react-product-tour */\n`;\n\nif (typeof document !== 'undefined') {\n const id = '__react_product_tour_styles__';\n if (!document.getElementById(id)) {\n const style = document.createElement('style');\n style.id = id;\n style.textContent = __tourStyles__;\n document.head.insertBefore(style, document.head.firstChild);\n }\n}\n","import type { TourStep } from '../types';\n\ninterface TourState {\n steps: TourStep[];\n currentStep: number;\n isActive: boolean;\n}\n\ntype TourListener = (state: TourState) => void;\n\nclass TourManager {\n private static instance: TourManager;\n private state: TourState;\n private listeners: Set<TourListener>;\n\n private constructor() {\n this.state = {\n steps: [],\n currentStep: 0,\n isActive: false\n };\n this.listeners = new Set();\n }\n\n static getInstance(): TourManager {\n if (!TourManager.instance) {\n TourManager.instance = new TourManager();\n }\n return TourManager.instance;\n }\n\n getState(): TourState {\n return { ...this.state, steps: [...this.state.steps] };\n }\n\n initialize(steps: TourStep[]) {\n this.state.steps = steps;\n this.state.currentStep = 0;\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n start() {\n if (this.state.steps.length === 0) return;\n this.state.isActive = true;\n this.state.currentStep = 0;\n this.notifyListeners();\n }\n\n stop() {\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n next() {\n if (!this.state.isActive || this.state.currentStep >= this.state.steps.length - 1) {\n this.stop();\n return;\n }\n\n this.state.currentStep += 1;\n this.notifyListeners();\n }\n\n back() {\n if (!this.state.isActive || this.state.currentStep <= 0) return;\n\n this.state.currentStep -= 1;\n this.notifyListeners();\n }\n\n skip() {\n this.stop();\n }\n\n subscribe(listener: TourListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener({ ...this.state }));\n }\n}\n\nexport const tourManager = TourManager.getInstance(); ","import React, { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react';\nimport type { TourContextValue, TourProviderProps } from '../types';\nimport { tourManager } from '../manager/TourManager';\n\nconst TourContext = createContext<TourContextValue | null>(null);\n\nconst TourProvider: React.FC<TourProviderProps> = ({\n steps,\n children,\n defaultActive = false,\n onComplete,\n onSkip,\n onStepChange,\n onStepEnter,\n onStepExit,\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const [isActive, setIsActive] = useState(defaultActive);\n\n // Initialize the global manager with these steps\n useEffect(() => {\n tourManager.initialize(steps);\n }, [steps]);\n\n const start = useCallback(() => {\n setIsActive(true);\n setCurrentStep(0);\n onStepEnter?.(0, steps[0]);\n }, [steps, onStepEnter]);\n\n const stop = useCallback(() => {\n if (isActive) {\n onStepExit?.(currentStep, steps[currentStep]);\n }\n setIsActive(false);\n }, [isActive, currentStep, steps, onStepExit]);\n\n const next = useCallback(async () => {\n const currentStepData = steps[currentStep];\n \n if (currentStepData?.waitFor) {\n await currentStepData.waitFor();\n }\n\n if (currentStep < steps.length - 1) {\n onStepExit?.(currentStep, currentStepData);\n const nextStepIndex = currentStep + 1;\n setCurrentStep(nextStepIndex);\n onStepChange?.(nextStepIndex, steps[nextStepIndex]);\n onStepEnter?.(nextStepIndex, steps[nextStepIndex]);\n } else {\n stop();\n onComplete?.();\n }\n }, [currentStep, steps, stop, onComplete, onStepExit, onStepChange, onStepEnter]);\n\n const back = useCallback(() => {\n if (currentStep > 0) {\n const currentStepData = steps[currentStep];\n onStepExit?.(currentStep, currentStepData);\n const prevStepIndex = currentStep - 1;\n setCurrentStep(prevStepIndex);\n onStepChange?.(prevStepIndex, steps[prevStepIndex]);\n onStepEnter?.(prevStepIndex, steps[prevStepIndex]);\n }\n }, [currentStep, steps, onStepExit, onStepChange, onStepEnter]);\n\n const skip = useCallback(() => {\n stop();\n onSkip?.();\n }, [stop, onSkip]);\n\n const value = useMemo<TourContextValue>(() => ({\n steps,\n currentStep,\n isActive,\n start,\n stop,\n next,\n back,\n skip,\n }), [steps, currentStep, isActive, start, stop, next, back, skip]);\n\n return (\n <TourContext.Provider value={value}>\n {children}\n </TourContext.Provider>\n );\n};\n\nconst useTour = () => {\n const context = useContext(TourContext);\n if (!context) {\n throw new Error('useTour must be used within a TourProvider');\n }\n return context;\n}; \n\nexport {\n TourContext,\n TourProvider, \n useTour\n}","import { useContext, useEffect, useState } from 'react';\nimport { TourContext } from '../context/TourContext';\nimport { tourManager } from '../manager/TourManager';\nimport type { TourContextValue } from '../types';\n\nexport const useTour = (): TourContextValue => {\n const context = useContext(TourContext);\n const [globalState, setGlobalState] = useState(tourManager.getState());\n\n useEffect(() => {\n // Subscribe to global state changes\n return tourManager.subscribe(setGlobalState);\n }, []);\n\n // If we're inside a TourProvider, use the context\n if (context) {\n return context;\n }\n\n // Otherwise, use the global manager\n return {\n steps: globalState.steps,\n currentStep: globalState.currentStep,\n isActive: globalState.isActive,\n start: tourManager.start.bind(tourManager),\n stop: tourManager.stop.bind(tourManager),\n next: tourManager.next.bind(tourManager),\n back: tourManager.back.bind(tourManager),\n skip: tourManager.skip.bind(tourManager),\n };\n}; ","import React from 'react';\n\ninterface ProgressBarProps {\n currentStep: number;\n totalSteps: number;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n currentStep,\n totalSteps,\n className = '',\n}) => {\n const progress = ((currentStep + 1) / totalSteps) * 100;\n\n return (\n <div className={`w-full h-1 rounded-full ${className}`} style={{ background: 'var(--tour--progress--background)' }}>\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-in-out\"\n style={{ width: `${progress}%`, background: 'var(--tour--progress--fill)' }}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n );\n}; ","import React from 'react';\n\ninterface MediaFallbackProps {\n type: 'image' | 'video';\n className?: string;\n}\n\nexport const MediaFallback: React.FC<MediaFallbackProps> = ({ type, className = '' }) => {\n return (\n <div className={className} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', background: '#f3f4f6', borderRadius: '0.5rem' }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ color: '#9ca3af', marginBottom: '0.5rem' }}>\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {type === 'image' ? 'Image failed to load' : 'Video failed to load'}\n </p>\n </div>\n </div>\n );\n}; ","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\n/**\n * Props for the ErrorBoundary component\n */\ninterface Props {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback function when an error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\n/**\n * State for the ErrorBoundary component\n */\ninterface State {\n /** Whether an error has occurred */\n hasError: boolean;\n /** The error that occurred */\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches JavaScript errors in its child component tree\n * and displays a fallback UI instead of crashing the whole app\n * @param props - Props for the ErrorBoundary component\n * @returns React component\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n /**\n * Updates state when an error occurs\n * @param error - The error that occurred\n * @returns New state\n */\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n /**\n * Called when an error occurs\n * @param error - The error that occurred\n * @param errorInfo - Additional error information\n */\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.props.onError?.(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-red-600 mb-2\">Something went wrong</div>\n <div className=\"text-sm text-red-500\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n} ","import React, { type ReactNode, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport type { ContentType, MediaSource, ButtonConfig, ButtonLayoutConfig, ButtonRenderProps } from '../types';\nimport { ProgressBar } from './ProgressBar';\nimport { MediaFallback } from './MediaFallback';\nimport { ErrorBoundary } from './ErrorBoundary';\n\n/**\n * Props for the TourTooltip component\n */\ninterface TourTooltipProps {\n /** Content to display in the tooltip */\n content: React.ReactNode | ContentType;\n /** Placement of the tooltip relative to the target */\n placement: string;\n /** Animation type for the tooltip */\n animation?: 'slide' | 'bounce' | 'fade';\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Custom class for the tooltip */\n tooltipClassName?: string;\n /** Custom class for the buttons */\n buttonClassName?: string;\n /** Custom class for the button container */\n buttonContainerClassName?: string;\n /** Label for the target element */\n targetLabel: string;\n /** Optional step title shown as a visible heading */\n title?: string;\n /** Styles for floating positioning */\n floatingStyles: React.CSSProperties;\n /** Function to set the floating element reference */\n setFloating: (node: HTMLElement | null) => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n /** @deprecated Use `back` and `skip` instead. Applies to both back and skip buttons when the specific key is absent. */\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n}\n\n/**\n * Gets the media source URL from a value\n * @param value - The media source value\n * @returns The media source URL\n */\nconst getMediaSource = (value: ReactNode | MediaSource): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'type' in value && 'src' in value) {\n const mediaSource = value as MediaSource;\n return mediaSource.src;\n }\n return String(value);\n};\n\nconst SAFE_IMG_ATTRS = new Set(['alt', 'width', 'height', 'loading', 'decoding', 'crossOrigin', 'referrerPolicy', 'sizes', 'srcSet', 'className', 'style']);\nconst SAFE_VIDEO_ATTRS = new Set(['width', 'height', 'loop', 'muted', 'autoPlay', 'playsInline', 'preload', 'poster', 'crossOrigin', 'className', 'style']);\n\nconst filterProps = (props: Record<string, unknown> | undefined, allowList: Set<string>): Record<string, unknown> => {\n if (!props) return {};\n return Object.fromEntries(Object.entries(props).filter(([k]) => allowList.has(k)));\n};\n\nconst ImageContent: React.FC<{ src: string; alt?: string; props?: Record<string, unknown> }> = ({ src, alt = 'Tour content', props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"image\" />;\n return (\n <img\n src={src}\n alt={alt}\n style={{ width: '100%', height: 'auto', borderRadius: '0.5rem' }}\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_IMG_ATTRS)}\n />\n );\n};\n\nconst VideoContent: React.FC<{ src: string; props?: Record<string, unknown> }> = ({ src, props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"video\" />;\n return (\n <video\n src={src}\n controls\n className=\"w-full h-auto rounded-lg\"\n role=\"presentation\"\n aria-label=\"Tour video content\"\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_VIDEO_ATTRS)}\n />\n );\n};\n\n/**\n * Renders the content based on its type\n * @param content - The content to render\n * @returns The rendered content\n */\nconst renderContent = (content: TourTooltipProps['content']): React.ReactNode => {\n if (!content) return null;\n\n if (typeof content === 'string' || React.isValidElement(content)) {\n return content;\n }\n\n const contentObj = content as unknown;\n if (\n typeof contentObj === 'object' &&\n contentObj !== null &&\n 'type' in contentObj &&\n 'value' in contentObj\n ) {\n const typedContent = contentObj as ContentType;\n switch (typedContent.type) {\n case 'image':\n return <ImageContent src={getMediaSource(typedContent.value)} alt={typedContent.alt} props={typedContent.props} />;\n case 'video':\n return <VideoContent src={getMediaSource(typedContent.value)} props={typedContent.props} />;\n case 'custom':\n return typedContent.value as React.ReactNode;\n case 'text':\n default:\n return typedContent.value as React.ReactNode;\n }\n }\n\n return content as React.ReactNode;\n};\n\n/**\n * Renders the buttons based on the provided configuration\n * @param props - ButtonRenderProps\n * @param config - Button configuration\n * @returns The rendered buttons\n */\nconst renderButtons = (\n props: ButtonRenderProps & { skip?: boolean },\n config?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n }\n): React.ReactNode => {\n const {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip,\n } = props;\n\n const backCfg = config?.back ?? config?.secondary;\n const skipCfg = config?.skip ?? config?.secondary;\n\n // If container has a custom render function, use it\n if (config?.container?.render) {\n return config.container.render(props);\n }\n\n // Default button container\n return (\n <div\n className={clsx('tour-button-nav', config?.container?.className)}\n style={{\n flexDirection: config?.container?.direction || 'row',\n alignItems: config?.container?.align || 'center',\n gap: config?.container?.gap || '0.5rem',\n ...config?.container?.style,\n }}\n role=\"toolbar\"\n aria-label=\"Tour navigation\"\n >\n <div className=\"tour-button-group\">\n {!isFirstStep && (\n backCfg?.render ? (\n backCfg.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', backCfg?.className)}\n style={backCfg?.style}\n aria-label=\"Go to previous step\"\n >\n {backCfg?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n skipCfg?.render ? (\n skipCfg.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', skipCfg?.className)}\n style={skipCfg?.style}\n aria-label=\"Skip tour\"\n >\n {skipCfg?.content || 'Skip'}\n </button>\n )\n )}\n </div>\n {config?.primary?.render ? (\n config.primary.render(props)\n ) : (\n <button\n onClick={isLastStep ? onComplete : onNext}\n className={clsx('tour-button tour-button-primary', config?.primary?.className)}\n style={config?.primary?.style}\n aria-label={isLastStep ? \"Complete tour\" : \"Go to next step\"}\n >\n {config?.primary?.content || (isLastStep ? 'Done' : 'Next')}\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Tooltip component that displays tour content and navigation controls\n * @param props - TourTooltipProps\n * @returns React component\n */\nexport const TourTooltip: React.FC<TourTooltipProps> = ({\n content,\n placement,\n animation = 'slide',\n isFirstStep,\n isLastStep,\n skip,\n onNext,\n onBack,\n onSkip,\n onComplete,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n targetLabel,\n title,\n floatingStyles,\n setFloating,\n showProgress = false,\n currentStep,\n totalSteps,\n buttonConfig,\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Add a small delay to ensure the initial position is set\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [placement]);\n\n return (\n <div\n ref={setFloating}\n style={floatingStyles}\n className={clsx('tour-tooltip', tooltipClassName, { visible: isVisible })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tour-step-title\"\n aria-describedby=\"tour-step-content\"\n data-placement={placement}\n data-animation={animation}\n >\n {title ? (\n <h3 id=\"tour-step-title\" className=\"tour-tooltip-title\">\n {title}\n </h3>\n ) : (\n <div id=\"tour-step-title\" className=\"sr-only\">\n {`Tour Step: ${targetLabel}`}\n </div>\n )}\n {showProgress && currentStep !== undefined && totalSteps !== undefined && (\n <div className=\"tour-progress-section\">\n <div className=\"tour-progress-header\">\n <span className=\"tour-step-counter\" aria-hidden=\"true\">\n {`Step ${currentStep + 1} of ${totalSteps}`}\n </span>\n </div>\n <ProgressBar currentStep={currentStep} totalSteps={totalSteps} />\n </div>\n )}\n <div id=\"tour-step-content\" className=\"tour-tooltip-content\">\n <ErrorBoundary\n fallback={\n <div style={{ padding: '1rem', background: '#f9fafb', border: '1px solid #e5e7eb', borderRadius: '0.5rem' }}>\n <div style={{ color: '#4b5563', marginBottom: '0.5rem' }}>Content Error</div>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Failed to render tour content\n </div>\n </div>\n }\n >\n {renderContent(content)}\n </ErrorBoundary>\n </div>\n {renderButtons(\n {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n currentStep,\n totalSteps,\n skip,\n },\n buttonConfig || {\n primary: { className: buttonClassName },\n secondary: { className: buttonClassName },\n container: { className: buttonContainerClassName },\n }\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface TourOverlayProps {\n overlayClassName?: string;\n isPartialBlur?: boolean;\n /** When true a highlight element provides the spotlight via box-shadow — skip the solid overlay */\n hasHighlight?: boolean;\n /** Called when the overlay is clicked */\n onDismiss?: () => void;\n}\n\nexport const TourOverlay: React.FC<TourOverlayProps> = ({\n overlayClassName,\n isPartialBlur,\n hasHighlight,\n onDismiss,\n}) => {\n return (\n <>\n {/* Blur overlay */}\n {isPartialBlur && (\n <div\n className=\"fixed inset-0 z-40 backdrop-blur-sm bg-black/40\"\n style={{\n mixBlendMode: 'multiply',\n }}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Plain full-screen overlay — only shown when there is no highlight element.\n When a highlight is present its box-shadow creates the dark surround instead,\n which naturally follows border-radius for a rounded spotlight. */}\n {!hasHighlight && (\n <div\n className={clsx('tour-overlay fixed inset-0 z-40', overlayClassName)}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport type { HighlightConfig } from '../types';\n\ninterface TourHighlightProps {\n targetRect: DOMRect;\n highlightConfig: HighlightConfig;\n animation?: 'slide' | 'bounce' | 'fade';\n}\n\nexport const TourHighlight: React.FC<TourHighlightProps> = ({\n targetRect,\n highlightConfig,\n animation = 'slide',\n}) => {\n const padding = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--tour--highlight--padding') || '8'\n );\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [targetRect]);\n\n return (\n <div\n style={{\n position: 'fixed',\n top: targetRect.top - padding,\n left: targetRect.left - padding,\n width: targetRect.width + padding * 2,\n height: targetRect.height + padding * 2,\n ...highlightConfig.style,\n }}\n className={clsx(\n 'tour-highlight z-50',\n highlightConfig.className,\n { visible: isVisible }\n )}\n data-animation={animation}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n}; ","import React, { useEffect, useRef } from 'react';\nimport { ContentType } from '../types';\n\ninterface UseTourAccessibilityOptions {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode | ContentType;\n isActive: boolean;\n enableScreenReader?: boolean;\n announcements?: {\n start?: string;\n end?: string;\n step?: string;\n };\n focusManagement?: 'auto' | 'manual';\n focusTrap?: boolean;\n}\n\ninterface LiveRegionProps {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode;\n isActive: boolean;\n announcements?: UseTourAccessibilityOptions['announcements'];\n}\n\nconst LiveRegion: React.FC<LiveRegionProps> = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n announcements,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isActive || !ref.current) return;\n\n const contentText = typeof content === 'string' ? content : '';\n const defaultStepAnnouncement = `Step ${currentStep + 1} of ${totalSteps}: ${targetLabel}.${contentText ? ` ${contentText}` : ''}`;\n const stepAnnouncement = announcements?.step\n ? announcements.step\n .replace('{step}', String(currentStep + 1))\n .replace('{total}', String(totalSteps))\n .replace('{content}', contentText)\n : defaultStepAnnouncement;\n\n ref.current.textContent = stepAnnouncement;\n }, [currentStep, totalSteps, targetLabel, content, isActive, announcements]);\n\n return React.createElement('div', {\n ref,\n role: 'status',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n className: 'sr-only'\n });\n};\n\nexport const useTourAccessibility = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n enableScreenReader = false,\n announcements,\n focusManagement = 'auto',\n focusTrap = true,\n}: UseTourAccessibilityOptions) => {\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isActive || focusManagement === 'manual') return;\n\n // Store the previously focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Auto-focus the first focusable element in the tour dialog\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n return () => {\n // Restore focus when tour ends — validate element is still in the DOM\n if (previousFocusRef.current && document.contains(previousFocusRef.current)) {\n previousFocusRef.current.focus();\n }\n };\n }, [isActive, focusManagement]);\n\n // Create focus trap — active whenever focusTrap is true, independent of screen reader mode\n useEffect(() => {\n if (!isActive || !focusTrap) return;\n\n const handleTabKey = (e: KeyboardEvent) => {\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n e.preventDefault();\n lastFocusableElement.focus();\n }\n } else {\n if (document.activeElement === lastFocusableElement) {\n e.preventDefault();\n firstFocusableElement.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n return () => document.removeEventListener('keydown', handleTabKey);\n }, [isActive, focusTrap]);\n\n return {\n LiveRegion: () => React.createElement(LiveRegion, {\n currentStep,\n totalSteps,\n targetLabel,\n content: content as React.ReactNode,\n isActive,\n announcements\n }),\n targetLabel,\n };\n}; ","import { useCallback, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: unknown[]) => void>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n ((...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n }) as T,\n [callback, delay]\n );\n} ","import React, { useEffect, useState, memo, useRef, useMemo } from 'react';\nimport { useFloating, offset, flip, shift, autoUpdate } from '@floating-ui/react';\nimport type { SpotlightProps, ButtonConfig, ButtonLayoutConfig } from '../types';\nimport { TourTooltip } from './TourTooltip';\nimport { TourOverlay } from './TourOverlay';\nimport { TourHighlight } from './TourHighlight';\nimport { useTourAccessibility } from '../hooks/useTourAccessibility';\nimport { useDebounce } from '../hooks/useDebounce';\nimport '../styles/theme.css';\n\n/**\n * Props for the Spotlight component\n */\ninterface SpotlightComponentProps extends SpotlightProps {\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Accessibility configuration */\n accessibility?: {\n /** Whether to enable screen reader announcements */\n enableScreenReader?: boolean;\n /** Custom screen reader announcements */\n announcements?: {\n /** Announcement when tour starts */\n start?: string;\n /** Announcement when tour ends */\n end?: string;\n /** Announcement for each step */\n step?: string;\n };\n /** Focus management strategy */\n focusManagement?: 'auto' | 'manual';\n /** Whether to trap focus within the tour */\n focusTrap?: boolean;\n };\n animation?: 'slide' | 'bounce' | 'fade';\n /** Distance in pixels between the tooltip and its target element */\n tooltipOffset?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n /** Close the tour when the overlay is clicked */\n dismissOnOverlayClick?: boolean;\n /** Optional step title shown as a visible heading in the tooltip */\n title?: string;\n}\n\n/**\n * Spotlight component that highlights a target element and displays a tooltip\n * @param props - SpotlightComponentProps\n * @returns React component\n */\nexport const Spotlight: React.FC<SpotlightComponentProps> = memo(({\n targetElement,\n placement,\n content,\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip = true,\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget = true,\n currentStep,\n totalSteps,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset = 10,\n buttonConfig,\n dismissOnOverlayClick = true,\n title,\n}) => {\n const middleware = useMemo(\n () => [offset(tooltipOffset), flip(), shift()],\n [tooltipOffset]\n );\n\n const { refs: tooltipRefs, floatingStyles, update } = useFloating({\n placement,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const { LiveRegion, targetLabel } = useTourAccessibility({\n currentStep: currentStep ?? 0,\n totalSteps: totalSteps ?? 0,\n targetLabel: targetElement?.getAttribute('aria-label') || 'target element',\n content,\n isActive: true,\n enableScreenReader: accessibility.enableScreenReader,\n announcements: accessibility.announcements,\n focusManagement: accessibility.focusManagement,\n focusTrap: accessibility.focusTrap,\n });\n\n const highlightConfig = typeof highlightTarget === 'object' ? highlightTarget : { className: 'tour-highlight' };\n const isPartialBlur = overlayClassName?.includes('tour-overlay-partial-blur');\n\n // Reactive rect — kept in sync with scroll and resize.\n // Initialized eagerly so the first render is not null (avoids a flash of nothing in tests and on mount).\n const [rect, setRect] = useState<DOMRect | null>(() =>\n targetElement ? targetElement.getBoundingClientRect() : null\n );\n\n // Debounce the update function; store in ref so listeners don't need it as a dep\n const debouncedUpdate = useDebounce(update, 100);\n const debouncedUpdateRef = useRef(debouncedUpdate);\n useEffect(() => { debouncedUpdateRef.current = debouncedUpdate; });\n\n // When step changes: scroll into view, register Floating UI reference, snapshot rect\n useEffect(() => {\n if (!targetElement) return;\n tooltipRefs.setReference(targetElement);\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n setRect(targetElement.getBoundingClientRect());\n }, [targetElement, tooltipRefs]);\n\n // Keep rect in sync while the page scrolls (incl. during smooth-scroll animation)\n useEffect(() => {\n if (!targetElement) return;\n const updateRect = () => {\n setRect(targetElement.getBoundingClientRect());\n debouncedUpdateRef.current();\n };\n window.addEventListener('scroll', updateRect, { passive: true });\n window.addEventListener('resize', updateRect, { passive: true });\n return () => {\n window.removeEventListener('scroll', updateRect);\n window.removeEventListener('resize', updateRect);\n };\n }, [targetElement]); // debouncedUpdate excluded — accessed via ref\n\n if (!targetElement || !rect) return null;\n\n return (\n <>\n {accessibility.enableScreenReader !== false && <LiveRegion />}\n\n <TourOverlay\n overlayClassName={overlayClassName}\n isPartialBlur={isPartialBlur}\n hasHighlight={!!highlightTarget}\n onDismiss={dismissOnOverlayClick ? onSkip : undefined}\n />\n\n {highlightTarget && (\n <TourHighlight\n targetRect={rect}\n highlightConfig={highlightConfig}\n animation={animation}\n />\n )}\n\n {/* Add isolation to the target element */}\n {isPartialBlur && targetElement.id && (\n <style>\n {`\n #${CSS.escape(targetElement.id)} {\n isolation: isolate;\n position: relative;\n z-index: 50;\n transform: translateZ(0);\n will-change: transform;\n }\n `}\n </style>\n )}\n\n <TourTooltip\n content={content}\n placement={placement}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n skip={skip}\n onNext={onNext}\n onBack={onBack}\n onSkip={onSkip}\n onComplete={onComplete}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n targetLabel={targetLabel}\n floatingStyles={floatingStyles}\n setFloating={tooltipRefs.setFloating}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={totalSteps}\n animation={animation}\n buttonConfig={buttonConfig}\n title={title}\n />\n\n </>\n );\n}); ","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTour } from '../context/TourContext';\nimport { Spotlight } from './Spotlight';\nimport type { TourProps } from '../types';\n\nexport const Tour: React.FC<TourProps> = ({\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget,\n skip = true,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset,\n buttonConfig,\n dismissOnOverlayClick = true,\n}) => {\n const { steps, currentStep, isActive, next, back, skip: skipTour } = useTour();\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n\n // Extract stable primitive deps to avoid object reference churn\n const enableScreenReader = accessibility.enableScreenReader;\n const startAnnouncement = accessibility.announcements?.start ?? 'Tour started. Use arrow keys to navigate between steps.';\n const endAnnouncement = accessibility.announcements?.end ?? 'Tour ended.';\n\n // Keyboard navigation: Escape closes, Arrow keys move between steps\n useEffect(() => {\n if (!isActive) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { skipTour(); return; }\n\n // Don't intercept arrow keys when focus is inside an editable element\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT' || target.isContentEditable) return;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); next(); }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); back(); }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, skipTour, next, back]);\n\n useEffect(() => {\n if (!isActive || enableScreenReader === false) return;\n\n // Announce tour start to screen readers\n const announcement = document.createElement('div');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only';\n announcement.textContent = startAnnouncement;\n document.body.appendChild(announcement);\n\n // Clear announcement after a delay; store ID so we can cancel on unmount\n const startTimerId = setTimeout(() => {\n if (announcement.isConnected) document.body.removeChild(announcement);\n }, 3000);\n\n return () => {\n clearTimeout(startTimerId);\n if (announcement.isConnected) document.body.removeChild(announcement);\n\n // Announce tour end to screen readers\n const endEl = document.createElement('div');\n endEl.setAttribute('role', 'status');\n endEl.setAttribute('aria-live', 'polite');\n endEl.setAttribute('aria-atomic', 'true');\n endEl.className = 'sr-only';\n endEl.textContent = endAnnouncement;\n document.body.appendChild(endEl);\n\n setTimeout(() => {\n if (endEl.isConnected) document.body.removeChild(endEl);\n }, 3000);\n };\n }, [isActive, enableScreenReader, startAnnouncement, endAnnouncement]);\n\n useEffect(() => {\n if (!isActive) return;\n\n let mounted = true;\n\n const currentStepData = steps[currentStep];\n if (!currentStepData) return;\n\n // Reset target when step changes so the fallback isn't shown briefly\n setTargetElement(null);\n\n let element: Element | null = null;\n try {\n element = document.querySelector(currentStepData.selector);\n } catch {\n return;\n }\n\n if (element) {\n setTargetElement(element);\n } else if (currentStepData.waitFor) {\n currentStepData.waitFor().then(() => {\n if (!mounted) return;\n try {\n const el = document.querySelector(currentStepData.selector);\n setTargetElement(el);\n } catch {\n // invalid selector — leave targetElement null\n }\n }).catch(() => {\n // waitFor rejected — leave targetElement null for this step\n });\n }\n\n return () => { mounted = false; };\n }, [isActive, currentStep, steps]);\n\n const currentStepData = steps[currentStep];\n if (!isActive || !currentStepData) return null;\n\n // Fallback when target element is not found — render a centered dialog\n // instead of silently freezing the tour\n if (!targetElement) {\n const isLastStep = currentStep === steps.length - 1;\n return createPortal(\n <>\n <div\n className=\"tour-overlay fixed inset-0 z-40\"\n onClick={dismissOnOverlayClick ? skipTour : undefined}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center pointer-events-none\">\n <div\n className=\"tour-tooltip pointer-events-auto\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Tour step unavailable\"\n >\n <p className=\"mb-4 text-sm\" style={{ opacity: 0.7 }}>\n This step is currently unavailable.\n </p>\n <div className=\"flex justify-end gap-2\">\n <button onClick={skipTour} className=\"tour-button tour-button-secondary\" aria-label=\"Skip tour\">\n Skip\n </button>\n {!isLastStep && (\n <button onClick={next} className=\"tour-button tour-button-primary\" aria-label=\"Go to next step\">\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </>,\n document.body\n );\n }\n\n return createPortal(\n <Spotlight\n targetElement={targetElement}\n placement={currentStepData.placement || 'bottom'}\n title={currentStepData.title}\n content={currentStepData.content}\n onNext={next}\n onBack={back}\n onSkip={skipTour}\n onComplete={next}\n isFirstStep={currentStep === 0}\n isLastStep={currentStep === steps.length - 1}\n overlayClassName={overlayClassName}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n highlightTarget={highlightTarget}\n skip={skip}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={steps.length}\n accessibility={accessibility}\n animation={animation}\n tooltipOffset={tooltipOffset}\n buttonConfig={buttonConfig}\n dismissOnOverlayClick={dismissOnOverlayClick}\n />,\n document.body\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/styles/inject.ts","../src/manager/TourManager.ts","../src/context/TourContext.tsx","../src/hooks/useTour.ts","../src/components/ProgressBar.tsx","../src/components/MediaFallback.tsx","../src/components/ErrorBoundary.tsx","../src/components/TourTooltip.tsx","../src/components/TourOverlay.tsx","../src/components/TourHighlight.tsx","../src/hooks/useTourAccessibility.ts","../src/hooks/useDebounce.ts","../src/components/Spotlight.tsx","../src/components/Tour.tsx"],"names":["useTour","useContext","useState","useEffect","jsx","jsxs","React","clsx","useRef","useCallback","useMemo","LiveRegion","Fragment","currentStepData"],"mappings":";;;;;;;;;;;AACA,IAAM,cAAA,GAAiB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AA6ZvB,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,EAAA,MAAM,EAAA,GAAK,+BAAA;AACX,EAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,EAAA,GAAK,EAAA;AACX,IAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,EAC5D;AACF;;;AC5ZA,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAKR,WAAA,GAAc;AAHtB,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAGN,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,OAAO,EAAC;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,SAAA,uBAAgB,GAAA,EAAI;AAAA,EAC3B;AAAA,EAEA,OAAO,WAAA,GAA2B;AAChC,IAAA,IAAI,CAAC,aAAY,QAAA,EAAU;AACzB,MAAA,YAAA,CAAY,QAAA,GAAW,IAAI,YAAA,EAAY;AAAA,IACzC;AACA,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAAA,EAEA,QAAA,GAAsB;AACpB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EACvD;AAAA,EAEA,WAAW,KAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAA;AACnB,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,CAAA;AACzB,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA;AACtB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AACtB,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,CAAA;AACzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA;AACtB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjF,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAM,WAAA,IAAe,CAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,YAAY,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG;AAEzD,IAAA,IAAA,CAAK,MAAM,WAAA,IAAe,CAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY,QAAA,CAAS,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EAChE;AACF,CAAA;AAxEE,aAAA,CADI,YAAA,EACW,UAAA,CAAA;AADjB,IAAM,WAAA,GAAN,YAAA;AA2EO,IAAM,WAAA,GAAc,YAAY,WAAA;ACjFvC,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAE/D,IAAM,eAA4C,CAAC;AAAA,EACjD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,aAAa,CAAA;AAGtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,WAAW,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,cAAA,CAAe,CAAC,CAAA;AAChB,IAAA,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAEvB,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,GAAa,WAAA,EAAa,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,GAAG,CAAC,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,UAAU,CAAC,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAO,YAAY,YAAY;AACnC,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AAEzC,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,MAAM,gBAAgB,OAAA,EAAQ;AAAA,IAChC;AAEA,IAAA,IAAI,WAAA,GAAc,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,UAAA,GAAa,aAAa,eAAe,CAAA;AACzC,MAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA;AACpC,MAAA,cAAA,CAAe,aAAa,CAAA;AAC5B,MAAA,YAAA,GAAe,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,MAAA,WAAA,GAAc,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AACL,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,KAAA,EAAO,MAAM,UAAA,EAAY,UAAA,EAAY,YAAA,EAAc,WAAW,CAAC,CAAA;AAEhF,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,MAAA,UAAA,GAAa,aAAa,eAAe,CAAA;AACzC,MAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA;AACpC,MAAA,cAAA,CAAe,aAAa,CAAA;AAC5B,MAAA,YAAA,GAAe,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,MAAA,WAAA,GAAc,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,OAAO,UAAA,EAAY,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9D,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAA,EAAK;AACL,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,QAA0B,OAAO;AAAA,IAC7C,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,OAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAEjE,EAAA,uBACE,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OACnB,QAAA,EACH,CAAA;AAEJ;AAEA,IAAM,UAAU,MAAM;AACpB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AC3FO,IAAMA,WAAU,MAAwB;AAC7C,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIC,QAAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AAErE,EAAAC,UAAU,MAAM;AAEd,IAAA,OAAO,WAAA,CAAY,UAAU,cAAc,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,OAAO;AAAA,IACL,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,aAAa,WAAA,CAAY,WAAA;AAAA,IACzB,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,KAAA,EAAO,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IACzC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW;AAAA,GACzC;AACF;ACtBO,IAAM,cAA0C,CAAC;AAAA,EACtD,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAA,CAAa,WAAA,GAAc,CAAA,IAAK,UAAA,GAAc,GAAA;AAEpD,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAW,YAAA,EAAc,QAAA,EAAU,UAAA,EAAY,mCAAA,IACxG,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,UAAA,EAAY,6BAAA,EAA+B,YAAY,yBAAA,EAA0B;AAAA,MACzJ,IAAA,EAAK,aAAA;AAAA,MACL,YAAA,EAAW,eAAA;AAAA,MACX,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ,CAAA;ACpBO,IAAM,gBAA8C,CAAC,EAAE,IAAA,EAAM,SAAA,GAAY,IAAG,KAAM;AACvF,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,SAAS,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,QAAA,EAAS,EAClK,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAS,EAChC,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,YAAA,EAAc,QAAA,EAAS,EAAG,aAAA,EAAY,MAAA,EACnE,QAAA,EAAA,IAAA,KAAS,OAAA,GAAU,oBAAQ,WAAA,EAC9B,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,SAAA,EAAU,EAChD,QAAA,EAAA,IAAA,KAAS,OAAA,GAAU,yBAAyB,sBAAA,EAC/C;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAA;ACUO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAwB;AAAA,EACzD,YAAY,KAAA,EAAc;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,QAAA,EAAU,KAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CAAkB,OAAc,SAAA,EAAsB;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,MAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,QAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MACpB;AAEA,MAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBACvDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,8BAAA,EAChC;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;ACXA,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA2C;AACjE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,MAAA,IAAU,KAAA,IAAS,SAAS,KAAA,EAAO;AACpF,IAAA,MAAM,WAAA,GAAc,KAAA;AACpB,IAAA,OAAO,WAAA,CAAY,GAAA;AAAA,EACrB;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB,CAAA;AAEA,IAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,OAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,eAAe,gBAAA,EAAkB,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,OAAO,CAAC,CAAA;AAC1J,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,SAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,eAAe,SAAA,EAAW,QAAA,EAAU,aAAA,EAAe,WAAA,EAAa,OAAO,CAAC,CAAA;AAE1J,IAAM,WAAA,GAAc,CAAC,KAAA,EAA4C,SAAA,KAAoD;AACnH,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AACnF,CAAA;AAEA,IAAM,eAAyF,CAAC,EAAE,KAAK,GAAA,GAAM,cAAA,EAAgB,OAAM,KAAM;AACvI,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC9C,EAAA,IAAI,UAAU,uBAAOE,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAK,OAAA,EAAQ,CAAA;AACjD,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAO,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAc,QAAA,EAAS;AAAA,MAC/D,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9B,GAAG,WAAA,CAAY,KAAA,EAAO,cAAc;AAAA;AAAA,GACvC;AAEJ,CAAA;AAEA,IAAM,YAAA,GAA2E,CAAC,EAAE,GAAA,EAAK,OAAM,KAAM;AACnG,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC9C,EAAA,IAAI,UAAU,uBAAOE,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAK,OAAA,EAAQ,CAAA;AACjD,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,0BAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAW,oBAAA;AAAA,MACX,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9B,GAAG,WAAA,CAAY,KAAA,EAAO,gBAAgB;AAAA;AAAA,GACzC;AAEJ,CAAA;AAOA,IAAM,aAAA,GAAgB,CAAC,OAAA,KAA0D;AAC/E,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAYE,MAAAA,CAAM,cAAA,CAAe,OAAO,CAAA,EAAG;AAChE,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,IACE,OAAO,eAAe,QAAA,IACtB,UAAA,KAAe,QACf,MAAA,IAAU,UAAA,IACV,WAAW,UAAA,EACX;AACA,IAAA,MAAM,YAAA,GAAe,UAAA;AACrB,IAAA,QAAQ,aAAa,IAAA;AAAM,MACzB,KAAK,OAAA;AACH,QAAA,uBAAOF,GAAAA,CAAC,YAAA,EAAA,EAAa,GAAA,EAAK,cAAA,CAAe,YAAA,CAAa,KAAK,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA;AAAA,MAClH,KAAK,OAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,GAAA,EAAK,cAAA,CAAe,aAAa,KAAK,CAAA,EAAG,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,CAAA;AAAA,MAC3F,KAAK,QAAA;AACH,QAAA,OAAO,YAAA,CAAa,KAAA;AAAA,MACtB,KAAK,MAAA;AAAA,MACL;AACE,QAAA,OAAO,YAAA,CAAa,KAAA;AAAA;AACxB,EACF;AAEA,EAAA,OAAO,OAAA;AACT,CAAA;AAQA,IAAM,aAAA,GAAgB,CACpB,KAAA,EACA,MAAA,KAOoB;AACpB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,IAAA,IAAQ,MAAA,EAAQ,SAAA;AACxC,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,IAAA,IAAQ,MAAA,EAAQ,SAAA;AAGxC,EAAA,IAAI,MAAA,EAAQ,WAAW,MAAA,EAAQ;AAC7B,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC;AAGA,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA,CAAK,iBAAA,EAAmB,MAAA,EAAQ,WAAW,SAAS,CAAA;AAAA,MAC/D,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,MAAA,EAAQ,SAAA,EAAW,SAAA,IAAa,KAAA;AAAA,QAC/C,UAAA,EAAY,MAAA,EAAQ,SAAA,EAAW,KAAA,IAAS,QAAA;AAAA,QACxC,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,GAAA,IAAO,QAAA;AAAA,QAC/B,GAAG,QAAQ,SAAA,EAAW;AAAA,OACxB;AAAA,MACA,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,gBACA,OAAA,EAAS,MAAA,GACP,QAAQ,MAAA,CAAO,KAAK,oBAEpBD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,mCAAA,EAAqC,OAAA,EAAS,SAAS,CAAA;AAAA,cACvE,OAAO,OAAA,EAAS,KAAA;AAAA,cAChB,YAAA,EAAW,qBAAA;AAAA,cAEV,mBAAS,OAAA,IAAW;AAAA;AAAA,WACvB,CAAA;AAAA,UAGH,SACC,OAAA,EAAS,MAAA,GACP,QAAQ,MAAA,CAAO,KAAK,oBAEpBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,mCAAA,EAAqC,OAAA,EAAS,SAAS,CAAA;AAAA,cACvE,OAAO,OAAA,EAAS,KAAA;AAAA,cAChB,YAAA,EAAW,WAAA;AAAA,cAEV,mBAAS,OAAA,IAAW;AAAA;AAAA,WACvB;AAAA,SAAA,EAGN,CAAA;AAAA,QACC,MAAA,EAAQ,SAAS,MAAA,GAChB,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAK,oBAE3BA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,aAAa,UAAA,GAAa,MAAA;AAAA,YACnC,SAAA,EAAW,IAAA,CAAK,iCAAA,EAAmC,MAAA,EAAQ,SAAS,SAAS,CAAA;AAAA,YAC7E,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA;AAAA,YACxB,YAAA,EAAY,aAAa,eAAA,GAAkB,iBAAA;AAAA,YAE1C,QAAA,EAAA,MAAA,EAAQ,OAAA,EAAS,OAAA,KAAY,UAAA,GAAa,MAAA,GAAS,MAAA;AAAA;AAAA;AACtD;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAOO,IAAM,cAA0C,CAAC;AAAA,EACtD,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,OAAA;AAAA,EACZ,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,SAAS,KAAK,CAAA;AAEhD,EAAAC,UAAU,MAAM;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,cAAA;AAAA,MACP,WAAW,IAAA,CAAK,cAAA,EAAgB,kBAAkB,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,MACxE,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,iBAAA,EAAgB,iBAAA;AAAA,MAChB,kBAAA,EAAiB,mBAAA;AAAA,MACjB,gBAAA,EAAgB,SAAA;AAAA,MAChB,gBAAA,EAAgB,SAAA;AAAA,MAEf,QAAA,EAAA;AAAA,QAAA,KAAA,mBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,IAAG,iBAAA,EAAkB,SAAA,EAAU,sBAChC,QAAA,EAAA,KAAA,EACH,CAAA,mBAEAA,GAAAA,CAAC,SAAI,EAAA,EAAG,iBAAA,EAAkB,WAAU,SAAA,EACjC,QAAA,EAAA,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA,EAC5B,CAAA;AAAA,QAED,YAAA,IAAgB,gBAAgB,MAAA,IAAa,UAAA,KAAe,0BAC3DC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACb,kBAAQ,WAAA,GAAc,CAAC,CAAA,IAAA,EAAO,UAAU,IAC3C,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAA0B,UAAA,EAAwB;AAAA,SAAA,EACjE,CAAA;AAAA,wBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAG,mBAAA,EAAoB,SAAA,EAAU,wBACpC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,QAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,UAAS,EACxG,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,YAAA,EAAc,QAAA,EAAS,EAAG,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,8BACvEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,+BAAA,EAExD;AAAA,aAAA,EACF,CAAA;AAAA,YAGD,wBAAc,OAAO;AAAA;AAAA,SACxB,EACF,CAAA;AAAA,QACC,aAAA;AAAA,UACC;AAAA,YACE,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,YAAA,IAAgB;AAAA,YACd,OAAA,EAAS,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA,YACtC,SAAA,EAAW,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA,YACxC,SAAA,EAAW,EAAE,SAAA,EAAW,wBAAA;AAAyB;AACnD;AACF;AAAA;AAAA,GACF;AAEJ,CAAA;AClVO,IAAM,cAA0C,CAAC;AAAA,EACtD,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEC,KAAA,QAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACCD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,IAMD,CAAC,gCACAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,IAAAA,CAAK,iCAAA,EAAmC,gBAAgB,CAAA;AAAA,QACnE,OAAA,EAAS,SAAA;AAAA,QACT,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY;AAAA;AAAA;AACd,GAAA,EAEJ,CAAA;AAEJ,CAAA;ACpCO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,UAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,iBAAiB,QAAA,CAAS,eAAe,CAAA,CAAE,gBAAA,CAAiB,4BAA4B,CAAA,IAAK;AAAA,GAC/F;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIL,SAAS,KAAK,CAAA;AAEhD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,GAAA,EAAK,WAAW,GAAA,GAAM,OAAA;AAAA,QACtB,IAAA,EAAM,WAAW,IAAA,GAAO,OAAA;AAAA,QACxB,KAAA,EAAO,UAAA,CAAW,KAAA,GAAQ,OAAA,GAAU,CAAA;AAAA,QACpC,MAAA,EAAQ,UAAA,CAAW,MAAA,GAAS,OAAA,GAAU,CAAA;AAAA,QACtC,GAAG,eAAA,CAAgB;AAAA,OACrB;AAAA,MACA,SAAA,EAAWG,IAAAA;AAAA,QACT,qBAAA;AAAA,QACA,eAAA,CAAgB,SAAA;AAAA,QAChB,EAAE,SAAS,SAAA;AAAU,OACvB;AAAA,MACA,gBAAA,EAAgB,SAAA;AAAA,MAChB,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY;AAAA;AAAA,GACd;AAEJ,CAAA;ACxBA,IAAM,aAAwC,CAAC;AAAA,EAC7C,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,GAAA,CAAI,OAAA,EAAS;AAE/B,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,EAAA;AAC5D,IAAA,MAAM,uBAAA,GAA0B,CAAA,KAAA,EAAQ,WAAA,GAAc,CAAC,CAAA,IAAA,EAAO,UAAU,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,EAAI,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAChI,IAAA,MAAM,gBAAA,GAAmB,eAAe,IAAA,GACpC,aAAA,CAAc,KACX,OAAA,CAAQ,QAAA,EAAU,OAAO,WAAA,GAAc,CAAC,CAAC,CAAA,CACzC,OAAA,CAAQ,WAAW,MAAA,CAAO,UAAU,CAAC,CAAA,CACrC,OAAA,CAAQ,WAAA,EAAa,WAAW,CAAA,GACnC,uBAAA;AAEJ,IAAA,GAAA,CAAI,QAAQ,WAAA,GAAc,gBAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,aAAa,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC,CAAA;AAE3E,EAAA,OAAOG,MAAAA,CAAM,cAAc,KAAA,EAAO;AAAA,IAChC,GAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,QAAA;AAAA,IACb,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACZ,CAAA;AACH,CAAA;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA,GAAqB,KAAA;AAAA,EACrB,aAAA;AAAA,EACA,eAAA,GAAkB,MAAA;AAAA,EAClB,SAAA,GAAY;AACd,CAAA,KAAmC;AACjC,EAAA,MAAM,gBAAA,GAAmB,OAA2B,IAAI,CAAA;AAExD,EAAAH,UAAU,MAAM;AACd,IAAA,IAAiB,eAAA,KAAoB,QAAA,EAAU;AAG/C,IAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAGpC,IAAA,MAAM,oBAAoB,QAAA,CAAS,gBAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAC,iBAAA,CAAkB,CAAC,CAAA,CAAkB,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,OAAO,MAAM;AAEX,MAAA,IAAI,iBAAiB,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC3E,QAAA,gBAAA,CAAiB,QAAQ,KAAA,EAAM;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,eAAe,CAAC,CAAA;AAG9B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAiB,CAAC,SAAA,EAAW;AAE7B,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,MAAM,oBAAoB,QAAA,CAAS,gBAAA;AAAA,QACjC;AAAA,OACF;AACA,MAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAEpC,MAAA,MAAM,qBAAA,GAAwB,kBAAkB,CAAC,CAAA;AACjD,MAAA,MAAM,oBAAA,GAAuB,iBAAA,CAAkB,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAA;AAE3E,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,QAAA,IAAI,EAAE,QAAA,EAAU;AACd,UAAA,IAAI,QAAA,CAAS,kBAAkB,qBAAA,EAAuB;AACpD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,oBAAA,CAAqB,KAAA,EAAM;AAAA,UAC7B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,QAAA,CAAS,kBAAkB,oBAAA,EAAsB;AACnD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,qBAAA,CAAsB,KAAA,EAAM;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACjD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAExB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAMG,MAAAA,CAAM,aAAA,CAAc,UAAA,EAAY;AAAA,MAChD,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD;AAAA,GACF;AACF,CAAA;AC1IO,SAAS,WAAA,CACd,UACA,KAAA,EACG;AACH,EAAA,MAAM,aAAaE,MAAAA,EAAuB;AAE1C,EAAA,OAAOC,WAAAA;AAAA,IACJ,IAAI,IAAA,KAAwB;AAC3B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,MACjC;AAEA,MAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,QAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,MAClB,GAAG,KAAK,CAAA;AAAA,IACV,CAAA;AAAA,IACA,CAAC,UAAU,KAAK;AAAA,GAClB;AACF;ACoDO,IAAM,SAAA,GAA+C,KAAK,CAAC;AAAA,EAChE,aAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,WAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,gBAAgB,EAAC;AAAA,EACjB,SAAA,GAAY,OAAA;AAAA,EACZ,aAAA,GAAgB,EAAA;AAAA,EAChB,YAAA;AAAA,EACA,qBAAA,GAAwB,IAAA;AAAA,EACxB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,UAAA,GAAaC,OAAAA;AAAA,IACjB,MAAM,CAAC,MAAA,CAAO,aAAa,GAAG,IAAA,EAAK,EAAG,OAAO,CAAA;AAAA,IAC7C,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,cAAA,EAAgB,MAAA,KAAW,WAAA,CAAY;AAAA,IAChE,SAAA;AAAA,IACA,UAAA;AAAA,IACA,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,EAAE,UAAA,EAAAC,WAAAA,EAAY,WAAA,KAAgB,oBAAA,CAAqB;AAAA,IACvD,aAAa,WAAA,IAAe,CAAA;AAAA,IAC5B,YAAY,UAAA,IAAc,CAAA;AAAA,IAC1B,WAAA,EAAa,aAAA,EAAe,YAAA,CAAa,YAAY,CAAA,IAAK,gBAAA;AAAA,IAC1D,OAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,oBAAoB,aAAA,CAAc,kBAAA;AAAA,IAClC,eAAe,aAAA,CAAc,aAAA;AAAA,IAC7B,iBAAiB,aAAA,CAAc,eAAA;AAAA,IAC/B,WAAW,aAAA,CAAc;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,kBAAkB,OAAO,eAAA,KAAoB,WAAW,eAAA,GAAkB,EAAE,WAAW,gBAAA,EAAiB;AAC9G,EAAA,MAAM,aAAA,GAAgB,gBAAA,EAAkB,QAAA,CAAS,2BAA2B,CAAA;AAI5E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIT,QAAAA;AAAA,IAAyB,MAC/C,aAAA,GAAgB,aAAA,CAAc,qBAAA,EAAsB,GAAI;AAAA,GAC1D;AAGA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA;AAC/C,EAAA,MAAM,kBAAA,GAAqBM,OAAO,eAAe,CAAA;AACjD,EAAAL,UAAU,MAAM;AAAE,IAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAAA,EAAiB,CAAC,CAAA;AAGjE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,WAAA,CAAY,aAAa,aAAa,CAAA;AACtC,IAAA,aAAA,CAAc,cAAA,CAAe,EAAE,QAAA,EAAU,QAAA,EAAU,OAAO,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA;AACvF,IAAA,OAAA,CAAQ,aAAA,CAAc,uBAAuB,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,aAAA,EAAe,WAAW,CAAC,CAAA;AAG/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,OAAA,CAAQ,aAAA,CAAc,uBAAuB,CAAA;AAC7C,MAAA,kBAAA,CAAmB,OAAA,EAAQ;AAAA,IAC7B,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAAA,IACjD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,IAAA,EAAM,OAAO,IAAA;AAEpC,EAAA,uBACEE,IAAAA,CAAAO,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA,CAAc,kBAAA,KAAuB,KAAA,oBAASR,GAAAA,CAACO,aAAA,EAAW,CAAA;AAAA,oBAE3DP,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAC,eAAA;AAAA,QAChB,SAAA,EAAW,wBAAwB,MAAA,GAAS;AAAA;AAAA,KAC9C;AAAA,IAEC,mCACCA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,IAAA;AAAA,QACZ,eAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IAID,aAAA,IAAiB,aAAA,CAAc,EAAA,oBAC9BA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,aAAA,EACI,GAAA,CAAI,MAAA,CAAO,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,EAQnC,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,wBAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAa,WAAA,CAAY,WAAA;AAAA,QACzB,YAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EAEF,CAAA;AAEJ,CAAC,CAAA;ACtNM,IAAM,OAA4B,CAAC;AAAA,EACxC,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,KAAA;AAAA,EACf,gBAAgB,EAAC;AAAA,EACjB,SAAA,GAAY,OAAA;AAAA,EACZ,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA,GAAwB;AAC1B,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,OAAO,WAAA,EAAa,QAAA,EAAU,MAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS,GAAI,OAAA,EAAQ;AAC7E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIF,SAAyB,IAAI,CAAA;AAGvE,EAAA,MAAM,qBAAqB,aAAA,CAAc,kBAAA;AACzC,EAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,aAAA,EAAe,KAAA,IAAS,yDAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,aAAA,EAAe,GAAA,IAAO,aAAA;AAG5D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,QAAA,QAAA,EAAS;AAAG,QAAA;AAAA,MAAQ;AAG9C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,OAAA,IAAW,MAAA,CAAO,OAAA,KAAY,cAAc,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,iBAAA,EAAmB;AAE5H,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,CAAE,QAAQ,WAAA,EAAa;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAA,MAAG,WAC1E,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAA,MAAG;AAAA,IACvF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,GAAG,CAAC,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AAEnC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,kBAAA,KAAuB,KAAA,EAAO;AAG/C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,YAAA,CAAa,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAC1C,IAAA,YAAA,CAAa,YAAA,CAAa,aAAa,QAAQ,CAAA;AAC/C,IAAA,YAAA,CAAa,YAAA,CAAa,eAAe,MAAM,CAAA;AAC/C,IAAA,YAAA,CAAa,SAAA,GAAY,SAAA;AACzB,IAAA,YAAA,CAAa,WAAA,GAAc,iBAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAGtC,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,IAAI,YAAA,CAAa,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACtE,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,IAAI,YAAA,CAAa,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAGpE,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,MAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACnC,MAAA,KAAA,CAAM,YAAA,CAAa,aAAa,QAAQ,CAAA;AACxC,MAAA,KAAA,CAAM,YAAA,CAAa,eAAe,MAAM,CAAA;AACxC,MAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAClB,MAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAE/B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxD,GAAG,GAAI,CAAA;AAAA,IACT,CAAA;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,kBAAA,EAAoB,iBAAA,EAAmB,eAAe,CAAC,CAAA;AAErE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,MAAMU,gBAAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,IAAA,IAAI,CAACA,gBAAAA,EAAiB;AAGtB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,IAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,QAAA,CAAS,aAAA,CAAcA,gBAAAA,CAAgB,QAAQ,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAWA,iBAAgB,OAAA,EAAS;AAClC,MAAAA,gBAAAA,CAAgB,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AACnC,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAcA,gBAAAA,CAAgB,QAAQ,CAAA;AAC1D,UAAA,gBAAA,CAAiB,EAAE,CAAA;AAAA,QACrB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAEf,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAM;AAAE,MAAA,OAAA,GAAU,KAAA;AAAA,IAAO,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,EAAa,KAAK,CAAC,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,EAAiB,OAAO,IAAA;AAI1C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,KAAA,CAAM,MAAA,GAAS,CAAA;AAClD,IAAA,OAAO,YAAA;AAAA,sBACLR,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAR,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iCAAA;AAAA,YACV,OAAA,EAAS,wBAAwB,QAAA,GAAW,MAAA;AAAA,YAC5C,IAAA,EAAK,cAAA;AAAA,YACL,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACb,QAAA,kBAAAC,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kCAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,MAAA;AAAA,YACX,YAAA,EAAW,uBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,OAAE,SAAA,EAAU,cAAA,EAAe,OAAO,EAAE,OAAA,EAAS,GAAA,EAAI,EAAG,QAAA,EAAA,qCAAA,EAErD,CAAA;AAAA,8BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,YAAO,OAAA,EAAS,QAAA,EAAU,WAAU,mCAAA,EAAoC,YAAA,EAAW,aAAY,QAAA,EAAA,MAAA,EAEhG,CAAA;AAAA,gBACC,CAAC,UAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU,iCAAA,EAAkC,YAAA,EAAW,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAEhG;AAAA,eAAA,EAEJ;AAAA;AAAA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AAAA,oBACLA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,SAAA,EAAW,gBAAgB,SAAA,IAAa,QAAA;AAAA,QACxC,OAAO,eAAA,CAAgB,KAAA;AAAA,QACvB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,QAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,aAAa,WAAA,KAAgB,CAAA;AAAA,QAC7B,UAAA,EAAY,WAAA,KAAgB,KAAA,CAAM,MAAA,GAAS,CAAA;AAAA,QAC3C,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,wBAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAY,KAAA,CAAM,MAAA;AAAA,QAClB,aAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF","file":"index.mjs","sourcesContent":["// AUTO-GENERATED — do not edit. Run `npm run build` to regenerate.\nconst __tourStyles__ = `@layer react-product-tour {\n\n:root {\n /* Tour Component Colors */\n --tour--overlay--background: rgba(0, 0, 0, 0.5);\n --tour--tooltip--background: white;\n --tour--tooltip--border: #e5e7eb;\n --tour--tooltip--text: black;\n --tour--tooltip--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n /* Tour Component Spacing */\n --tour--tooltip--padding: 1rem;\n --tour--tooltip--gap: 0.5rem;\n\n /* Tour Component Border */\n --tour--tooltip--radius: 0.5rem;\n --tour--tooltip--border-width: 1px;\n\n /* Tour Component Animation */\n --tour--tooltip--transition: all 0.2s ease-in-out;\n\n /* Tour Highlight */\n --tour--highlight--padding: 8px;\n --tour--highlight--radius: 10px;\n\n /* Tour Button Colors */\n --tour--button--primary--background: #646cff;\n --tour--button--primary--text: white;\n --tour--button--secondary--background: #e5e7eb;\n --tour--button--secondary--text: #374151;\n\n /* Tour Tooltip Size */\n --tour--tooltip--max-width: 300px;\n\n /* Tour Progress Bar */\n --tour--progress--background: #e5e7eb;\n --tour--progress--fill: #f43f5e;\n}\n\n/* Dark mode variables */\n.dark {\n --tour--tooltip--background: #1f2937;\n --tour--tooltip--border: #374151;\n --tour--tooltip--text: #f9fafb;\n}\n\n/* Screen reader utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus styles */\n.tour-button:focus-visible {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.tour-button:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .tour-button {\n border: 2px solid currentColor;\n }\n\n .tour-tooltip {\n border: 2px solid currentColor;\n }\n\n .tour-highlight {\n border: 2px solid currentColor;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .tour-tooltip,\n .tour-highlight,\n .tour-overlay,\n .tour-button {\n animation: none !important;\n transition: none !important;\n }\n}\n\n/* Base tooltip styles */\n.tour-tooltip {\n position: absolute;\n background-color: var(--tour--tooltip--background);\n color: var(--tour--tooltip--text);\n padding: var(--tour--tooltip--padding);\n border-radius: var(--tour--tooltip--radius);\n box-shadow: var(--tour--tooltip--shadow);\n max-width: var(--tour--tooltip--max-width);\n z-index: 1001;\n opacity: 0;\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n}\n\n/* Allow Tailwind classes to override base styles */\n.tour-tooltip[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-tooltip[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-tooltip[class*=\"border-\"] {\n border-color: inherit;\n}\n\n.tour-tooltip[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-tooltip[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-tooltip[class*=\"p-\"] {\n padding: inherit;\n}\n\n/* Animation variants */\n.tour-tooltip[data-animation=\"slide\"] {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"top\"] {\n transform: translateY(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"bottom\"] {\n transform: translateY(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"left\"] {\n transform: translateX(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"right\"] {\n transform: translateX(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"bounce\"] {\n transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55), opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"top\"] {\n transform: translateY(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"bottom\"] {\n transform: translateY(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"left\"] {\n transform: translateX(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"right\"] {\n transform: translateX(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-tooltip[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.tour-tooltip-title {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--tour--tooltip--text);\n line-height: 1.3;\n}\n\n.tour-tooltip-content {\n margin-bottom: 1rem;\n}\n\n.tour-buttons {\n display: flex;\n gap: var(--tour--tooltip--gap);\n justify-content: flex-end;\n}\n\n/* Button navigation bar */\n.tour-button-nav {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Back/Skip group */\n.tour-button-group {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Progress section */\n.tour-progress-section {\n margin-bottom: 1rem;\n}\n\n.tour-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.25rem;\n}\n\n.tour-step-counter {\n font-size: 0.75rem;\n line-height: 1rem;\n opacity: 0.6;\n}\n\n/* Tooltip arrow */\n.tour-tooltip::before {\n content: '';\n position: absolute;\n width: 0.75rem;\n height: 0.75rem;\n background-color: var(--tour--tooltip--background);\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n transform: rotate(45deg);\n}\n\n/* Tooltip arrow positions */\n.tour-tooltip[data-placement=\"top\"]::before {\n bottom: -0.375rem;\n border-right: none;\n border-bottom: none;\n}\n\n.tour-tooltip[data-placement=\"bottom\"]::before {\n top: -0.375rem;\n border-left: none;\n border-top: none;\n}\n\n.tour-tooltip[data-placement=\"left\"]::before {\n right: -0.375rem;\n border-top: none;\n border-right: none;\n}\n\n.tour-tooltip[data-placement=\"right\"]::before {\n left: -0.375rem;\n border-bottom: none;\n border-left: none;\n}\n\n/* Button styles */\n.tour-button {\n border-radius: var(--tour--tooltip--radius);\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n padding: 0.5rem 1rem;\n border: none;\n transition: var(--tour--tooltip--transition);\n}\n\n.tour-button-primary {\n background-color: var(--tour--button--primary--background);\n color: var(--tour--button--primary--text);\n}\n\n.tour-button-secondary {\n background-color: var(--tour--button--secondary--background);\n color: var(--tour--button--secondary--text);\n}\n\n/* Allow Tailwind classes to override button styles */\n.tour-button[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-button[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-button[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-button[class*=\"p-\"] {\n padding: inherit;\n}\n\n.tour-button[class*=\"font-\"] {\n font-weight: inherit;\n}\n\n.tour-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dark .tour-button-secondary {\n background-color: #4b5563;\n}\n\n/* Overlay styles */\n.tour-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--tour--overlay--background);\n z-index: 1000;\n}\n\n.tour-overlay[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-overlay-blur {\n backdrop-filter: blur(2px);\n}\n\n/* Highlight styles */\n.tour-highlight {\n position: absolute;\n border-radius: var(--tour--highlight--radius);\n box-shadow: 0 0 0 9999px var(--tour--overlay--background);\n z-index: 1001;\n opacity: 0;\n}\n\n.tour-highlight[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-highlight[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-highlight[data-animation=\"slide\"] {\n transition: all 0.3s ease-in-out;\n transform: scale(0.98);\n}\n\n.tour-highlight[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1);\n}\n\n.tour-highlight[data-animation=\"bounce\"] {\n transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n transform: translateY(20px) scale(0.95);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.tour-highlight[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-highlight[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.dark .tour-highlight {\n background-color: rgba(255, 255, 255, 0.05);\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n} /* end @layer react-product-tour */\n`;\n\nif (typeof document !== 'undefined') {\n const id = '__react_product_tour_styles__';\n if (!document.getElementById(id)) {\n const style = document.createElement('style');\n style.id = id;\n style.textContent = __tourStyles__;\n document.head.insertBefore(style, document.head.firstChild);\n }\n}\n","import type { TourStep } from '../types';\n\ninterface TourState {\n steps: TourStep[];\n currentStep: number;\n isActive: boolean;\n}\n\ntype TourListener = (state: TourState) => void;\n\nclass TourManager {\n private static instance: TourManager;\n private state: TourState;\n private listeners: Set<TourListener>;\n\n private constructor() {\n this.state = {\n steps: [],\n currentStep: 0,\n isActive: false\n };\n this.listeners = new Set();\n }\n\n static getInstance(): TourManager {\n if (!TourManager.instance) {\n TourManager.instance = new TourManager();\n }\n return TourManager.instance;\n }\n\n getState(): TourState {\n return { ...this.state, steps: [...this.state.steps] };\n }\n\n initialize(steps: TourStep[]) {\n this.state.steps = steps;\n this.state.currentStep = 0;\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n start() {\n if (this.state.steps.length === 0) return;\n this.state.isActive = true;\n this.state.currentStep = 0;\n this.notifyListeners();\n }\n\n stop() {\n this.state.isActive = false;\n this.notifyListeners();\n }\n\n next() {\n if (!this.state.isActive || this.state.currentStep >= this.state.steps.length - 1) {\n this.stop();\n return;\n }\n\n this.state.currentStep += 1;\n this.notifyListeners();\n }\n\n back() {\n if (!this.state.isActive || this.state.currentStep <= 0) return;\n\n this.state.currentStep -= 1;\n this.notifyListeners();\n }\n\n skip() {\n this.stop();\n }\n\n subscribe(listener: TourListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener({ ...this.state }));\n }\n}\n\nexport const tourManager = TourManager.getInstance(); ","import React, { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react';\nimport type { TourContextValue, TourProviderProps } from '../types';\nimport { tourManager } from '../manager/TourManager';\n\nconst TourContext = createContext<TourContextValue | null>(null);\n\nconst TourProvider: React.FC<TourProviderProps> = ({\n steps,\n children,\n defaultActive = false,\n onComplete,\n onSkip,\n onStepChange,\n onStepEnter,\n onStepExit,\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const [isActive, setIsActive] = useState(defaultActive);\n\n // Initialize the global manager with these steps\n useEffect(() => {\n tourManager.initialize(steps);\n }, [steps]);\n\n const start = useCallback(() => {\n setIsActive(true);\n setCurrentStep(0);\n onStepEnter?.(0, steps[0]);\n }, [steps, onStepEnter]);\n\n const stop = useCallback(() => {\n if (isActive) {\n onStepExit?.(currentStep, steps[currentStep]);\n }\n setIsActive(false);\n }, [isActive, currentStep, steps, onStepExit]);\n\n const next = useCallback(async () => {\n const currentStepData = steps[currentStep];\n \n if (currentStepData?.waitFor) {\n await currentStepData.waitFor();\n }\n\n if (currentStep < steps.length - 1) {\n onStepExit?.(currentStep, currentStepData);\n const nextStepIndex = currentStep + 1;\n setCurrentStep(nextStepIndex);\n onStepChange?.(nextStepIndex, steps[nextStepIndex]);\n onStepEnter?.(nextStepIndex, steps[nextStepIndex]);\n } else {\n stop();\n onComplete?.();\n }\n }, [currentStep, steps, stop, onComplete, onStepExit, onStepChange, onStepEnter]);\n\n const back = useCallback(() => {\n if (currentStep > 0) {\n const currentStepData = steps[currentStep];\n onStepExit?.(currentStep, currentStepData);\n const prevStepIndex = currentStep - 1;\n setCurrentStep(prevStepIndex);\n onStepChange?.(prevStepIndex, steps[prevStepIndex]);\n onStepEnter?.(prevStepIndex, steps[prevStepIndex]);\n }\n }, [currentStep, steps, onStepExit, onStepChange, onStepEnter]);\n\n const skip = useCallback(() => {\n stop();\n onSkip?.();\n }, [stop, onSkip]);\n\n const value = useMemo<TourContextValue>(() => ({\n steps,\n currentStep,\n isActive,\n start,\n stop,\n next,\n back,\n skip,\n }), [steps, currentStep, isActive, start, stop, next, back, skip]);\n\n return (\n <TourContext.Provider value={value}>\n {children}\n </TourContext.Provider>\n );\n};\n\nconst useTour = () => {\n const context = useContext(TourContext);\n if (!context) {\n throw new Error('useTour must be used within a TourProvider');\n }\n return context;\n}; \n\nexport {\n TourContext,\n TourProvider, \n useTour\n}","import { useContext, useEffect, useState } from 'react';\nimport { TourContext } from '../context/TourContext';\nimport { tourManager } from '../manager/TourManager';\nimport type { TourContextValue } from '../types';\n\nexport const useTour = (): TourContextValue => {\n const context = useContext(TourContext);\n const [globalState, setGlobalState] = useState(tourManager.getState());\n\n useEffect(() => {\n // Subscribe to global state changes\n return tourManager.subscribe(setGlobalState);\n }, []);\n\n // If we're inside a TourProvider, use the context\n if (context) {\n return context;\n }\n\n // Otherwise, use the global manager\n return {\n steps: globalState.steps,\n currentStep: globalState.currentStep,\n isActive: globalState.isActive,\n start: tourManager.start.bind(tourManager),\n stop: tourManager.stop.bind(tourManager),\n next: tourManager.next.bind(tourManager),\n back: tourManager.back.bind(tourManager),\n skip: tourManager.skip.bind(tourManager),\n };\n}; ","import React from 'react';\n\ninterface ProgressBarProps {\n currentStep: number;\n totalSteps: number;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n currentStep,\n totalSteps,\n className = '',\n}) => {\n const progress = ((currentStep + 1) / totalSteps) * 100;\n\n return (\n <div className={className} style={{ width: '100%', height: '0.25rem', borderRadius: '9999px', background: 'var(--tour--progress--background)' }}>\n <div\n style={{ width: `${progress}%`, height: '100%', borderRadius: '9999px', background: 'var(--tour--progress--fill)', transition: 'width 300ms ease-in-out' }}\n role=\"progressbar\"\n aria-label=\"Tour progress\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n );\n}; ","import React from 'react';\n\ninterface MediaFallbackProps {\n type: 'image' | 'video';\n className?: string;\n}\n\nexport const MediaFallback: React.FC<MediaFallbackProps> = ({ type, className = '' }) => {\n return (\n <div className={className} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', background: '#f3f4f6', borderRadius: '0.5rem' }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ color: '#9ca3af', marginBottom: '0.5rem' }} aria-hidden=\"true\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {type === 'image' ? 'Image failed to load' : 'Video failed to load'}\n </p>\n </div>\n </div>\n );\n}; ","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\n/**\n * Props for the ErrorBoundary component\n */\ninterface Props {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback function when an error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\n/**\n * State for the ErrorBoundary component\n */\ninterface State {\n /** Whether an error has occurred */\n hasError: boolean;\n /** The error that occurred */\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches JavaScript errors in its child component tree\n * and displays a fallback UI instead of crashing the whole app\n * @param props - Props for the ErrorBoundary component\n * @returns React component\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n /**\n * Updates state when an error occurs\n * @param error - The error that occurred\n * @returns New state\n */\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n /**\n * Called when an error occurs\n * @param error - The error that occurred\n * @param errorInfo - Additional error information\n */\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.props.onError?.(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-red-600 mb-2\">Something went wrong</div>\n <div className=\"text-sm text-red-500\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n} ","import React, { type ReactNode, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport type { ContentType, MediaSource, ButtonConfig, ButtonLayoutConfig, ButtonRenderProps, Placement } from '../types';\nimport { ProgressBar } from './ProgressBar';\nimport { MediaFallback } from './MediaFallback';\nimport { ErrorBoundary } from './ErrorBoundary';\n\n/**\n * Props for the TourTooltip component\n */\ninterface TourTooltipProps {\n /** Content to display in the tooltip */\n content: React.ReactNode | ContentType;\n /** Placement of the tooltip relative to the target */\n placement: Placement;\n /** Animation type for the tooltip */\n animation?: 'slide' | 'bounce' | 'fade';\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Custom class for the tooltip */\n tooltipClassName?: string;\n /** Custom class for the buttons */\n buttonClassName?: string;\n /** Custom class for the button container */\n buttonContainerClassName?: string;\n /** Label for the target element */\n targetLabel: string;\n /** Optional step title shown as a visible heading */\n title?: string;\n /** Styles for floating positioning */\n floatingStyles: React.CSSProperties;\n /** Function to set the floating element reference */\n setFloating: (node: HTMLElement | null) => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n /** @deprecated Use `back` and `skip` instead. Applies to both back and skip buttons when the specific key is absent. */\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n}\n\n/**\n * Gets the media source URL from a value\n * @param value - The media source value\n * @returns The media source URL\n */\nconst getMediaSource = (value: ReactNode | MediaSource): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'type' in value && 'src' in value) {\n const mediaSource = value as MediaSource;\n return mediaSource.src;\n }\n return String(value);\n};\n\nconst SAFE_IMG_ATTRS = new Set(['alt', 'width', 'height', 'loading', 'decoding', 'crossOrigin', 'referrerPolicy', 'sizes', 'srcSet', 'className', 'style']);\nconst SAFE_VIDEO_ATTRS = new Set(['width', 'height', 'loop', 'muted', 'autoPlay', 'playsInline', 'preload', 'poster', 'crossOrigin', 'className', 'style']);\n\nconst filterProps = (props: Record<string, unknown> | undefined, allowList: Set<string>): Record<string, unknown> => {\n if (!props) return {};\n return Object.fromEntries(Object.entries(props).filter(([k]) => allowList.has(k)));\n};\n\nconst ImageContent: React.FC<{ src: string; alt?: string; props?: Record<string, unknown> }> = ({ src, alt = 'Tour content', props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"image\" />;\n return (\n <img\n src={src}\n alt={alt}\n style={{ width: '100%', height: 'auto', borderRadius: '0.5rem' }}\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_IMG_ATTRS)}\n />\n );\n};\n\nconst VideoContent: React.FC<{ src: string; props?: Record<string, unknown> }> = ({ src, props }) => {\n const [hasError, setHasError] = useState(false);\n if (hasError) return <MediaFallback type=\"video\" />;\n return (\n <video\n src={src}\n controls\n className=\"w-full h-auto rounded-lg\"\n role=\"presentation\"\n aria-label=\"Tour video content\"\n onError={() => setHasError(true)}\n {...filterProps(props, SAFE_VIDEO_ATTRS)}\n />\n );\n};\n\n/**\n * Renders the content based on its type\n * @param content - The content to render\n * @returns The rendered content\n */\nconst renderContent = (content: TourTooltipProps['content']): React.ReactNode => {\n if (!content) return null;\n\n if (typeof content === 'string' || React.isValidElement(content)) {\n return content;\n }\n\n const contentObj = content as unknown;\n if (\n typeof contentObj === 'object' &&\n contentObj !== null &&\n 'type' in contentObj &&\n 'value' in contentObj\n ) {\n const typedContent = contentObj as ContentType;\n switch (typedContent.type) {\n case 'image':\n return <ImageContent src={getMediaSource(typedContent.value)} alt={typedContent.alt} props={typedContent.props} />;\n case 'video':\n return <VideoContent src={getMediaSource(typedContent.value)} props={typedContent.props} />;\n case 'custom':\n return typedContent.value as React.ReactNode;\n case 'text':\n default:\n return typedContent.value as React.ReactNode;\n }\n }\n\n return content as React.ReactNode;\n};\n\n/**\n * Renders the buttons based on the provided configuration\n * @param props - ButtonRenderProps\n * @param config - Button configuration\n * @returns The rendered buttons\n */\nconst renderButtons = (\n props: ButtonRenderProps & { skip?: boolean },\n config?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n back?: ButtonConfig;\n skip?: ButtonConfig;\n container?: ButtonLayoutConfig;\n }\n): React.ReactNode => {\n const {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip,\n } = props;\n\n const backCfg = config?.back ?? config?.secondary;\n const skipCfg = config?.skip ?? config?.secondary;\n\n // If container has a custom render function, use it\n if (config?.container?.render) {\n return config.container.render(props);\n }\n\n // Default button container\n return (\n <div\n className={clsx('tour-button-nav', config?.container?.className)}\n style={{\n flexDirection: config?.container?.direction || 'row',\n alignItems: config?.container?.align || 'center',\n gap: config?.container?.gap || '0.5rem',\n ...config?.container?.style,\n }}\n role=\"toolbar\"\n aria-label=\"Tour navigation\"\n >\n <div className=\"tour-button-group\">\n {!isFirstStep && (\n backCfg?.render ? (\n backCfg.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', backCfg?.className)}\n style={backCfg?.style}\n aria-label=\"Go to previous step\"\n >\n {backCfg?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n skipCfg?.render ? (\n skipCfg.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', skipCfg?.className)}\n style={skipCfg?.style}\n aria-label=\"Skip tour\"\n >\n {skipCfg?.content || 'Skip'}\n </button>\n )\n )}\n </div>\n {config?.primary?.render ? (\n config.primary.render(props)\n ) : (\n <button\n onClick={isLastStep ? onComplete : onNext}\n className={clsx('tour-button tour-button-primary', config?.primary?.className)}\n style={config?.primary?.style}\n aria-label={isLastStep ? \"Complete tour\" : \"Go to next step\"}\n >\n {config?.primary?.content || (isLastStep ? 'Done' : 'Next')}\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Tooltip component that displays tour content and navigation controls\n * @param props - TourTooltipProps\n * @returns React component\n */\nexport const TourTooltip: React.FC<TourTooltipProps> = ({\n content,\n placement,\n animation = 'slide',\n isFirstStep,\n isLastStep,\n skip,\n onNext,\n onBack,\n onSkip,\n onComplete,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n targetLabel,\n title,\n floatingStyles,\n setFloating,\n showProgress = false,\n currentStep,\n totalSteps,\n buttonConfig,\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Add a small delay to ensure the initial position is set\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [placement]);\n\n return (\n <div\n ref={setFloating}\n style={floatingStyles}\n className={clsx('tour-tooltip', tooltipClassName, { visible: isVisible })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tour-step-title\"\n aria-describedby=\"tour-step-content\"\n data-placement={placement}\n data-animation={animation}\n >\n {title ? (\n <h3 id=\"tour-step-title\" className=\"tour-tooltip-title\">\n {title}\n </h3>\n ) : (\n <div id=\"tour-step-title\" className=\"sr-only\">\n {`Tour Step: ${targetLabel}`}\n </div>\n )}\n {showProgress && currentStep !== undefined && totalSteps !== undefined && (\n <div className=\"tour-progress-section\">\n <div className=\"tour-progress-header\">\n <span className=\"tour-step-counter\">\n {`Step ${currentStep + 1} of ${totalSteps}`}\n </span>\n </div>\n <ProgressBar currentStep={currentStep} totalSteps={totalSteps} />\n </div>\n )}\n <div id=\"tour-step-content\" className=\"tour-tooltip-content\">\n <ErrorBoundary\n fallback={\n <div style={{ padding: '1rem', background: '#f9fafb', border: '1px solid #e5e7eb', borderRadius: '0.5rem' }}>\n <div style={{ color: '#4b5563', marginBottom: '0.5rem' }}>Content Error</div>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Failed to render tour content\n </div>\n </div>\n }\n >\n {renderContent(content)}\n </ErrorBoundary>\n </div>\n {renderButtons(\n {\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n currentStep,\n totalSteps,\n skip,\n },\n buttonConfig || {\n primary: { className: buttonClassName },\n secondary: { className: buttonClassName },\n container: { className: buttonContainerClassName },\n }\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface TourOverlayProps {\n overlayClassName?: string;\n isPartialBlur?: boolean;\n /** When true a highlight element provides the spotlight via box-shadow — skip the solid overlay */\n hasHighlight?: boolean;\n /** Called when the overlay is clicked */\n onDismiss?: () => void;\n}\n\nexport const TourOverlay: React.FC<TourOverlayProps> = ({\n overlayClassName,\n isPartialBlur,\n hasHighlight,\n onDismiss,\n}) => {\n return (\n <>\n {/* Blur overlay */}\n {isPartialBlur && (\n <div\n className=\"fixed inset-0 z-40 backdrop-blur-sm bg-black/40\"\n style={{\n mixBlendMode: 'multiply',\n }}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Plain full-screen overlay — only shown when there is no highlight element.\n When a highlight is present its box-shadow creates the dark surround instead,\n which naturally follows border-radius for a rounded spotlight. */}\n {!hasHighlight && (\n <div\n className={clsx('tour-overlay fixed inset-0 z-40', overlayClassName)}\n onClick={onDismiss}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport type { HighlightConfig } from '../types';\n\ninterface TourHighlightProps {\n targetRect: DOMRect;\n highlightConfig: HighlightConfig;\n animation?: 'slide' | 'bounce' | 'fade';\n}\n\nexport const TourHighlight: React.FC<TourHighlightProps> = ({\n targetRect,\n highlightConfig,\n animation = 'slide',\n}) => {\n const padding = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--tour--highlight--padding') || '8'\n );\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 50);\n\n return () => {\n clearTimeout(timer);\n setIsVisible(false);\n };\n }, [targetRect]);\n\n return (\n <div\n style={{\n position: 'fixed',\n top: targetRect.top - padding,\n left: targetRect.left - padding,\n width: targetRect.width + padding * 2,\n height: targetRect.height + padding * 2,\n ...highlightConfig.style,\n }}\n className={clsx(\n 'tour-highlight z-50',\n highlightConfig.className,\n { visible: isVisible }\n )}\n data-animation={animation}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n );\n}; ","import React, { useEffect, useRef } from 'react';\nimport { ContentType } from '../types';\n\ninterface UseTourAccessibilityOptions {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode | ContentType;\n isActive: boolean;\n enableScreenReader?: boolean;\n announcements?: {\n start?: string;\n end?: string;\n step?: string;\n };\n focusManagement?: 'auto' | 'manual';\n focusTrap?: boolean;\n}\n\ninterface LiveRegionProps {\n currentStep: number;\n totalSteps: number;\n targetLabel: string;\n content: React.ReactNode;\n isActive: boolean;\n announcements?: UseTourAccessibilityOptions['announcements'];\n}\n\nconst LiveRegion: React.FC<LiveRegionProps> = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n announcements,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isActive || !ref.current) return;\n\n const contentText = typeof content === 'string' ? content : '';\n const defaultStepAnnouncement = `Step ${currentStep + 1} of ${totalSteps}: ${targetLabel}.${contentText ? ` ${contentText}` : ''}`;\n const stepAnnouncement = announcements?.step\n ? announcements.step\n .replace('{step}', String(currentStep + 1))\n .replace('{total}', String(totalSteps))\n .replace('{content}', contentText)\n : defaultStepAnnouncement;\n\n ref.current.textContent = stepAnnouncement;\n }, [currentStep, totalSteps, targetLabel, content, isActive, announcements]);\n\n return React.createElement('div', {\n ref,\n role: 'status',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n className: 'sr-only'\n });\n};\n\nexport const useTourAccessibility = ({\n currentStep,\n totalSteps,\n targetLabel,\n content,\n isActive,\n enableScreenReader = false,\n announcements,\n focusManagement = 'auto',\n focusTrap = true,\n}: UseTourAccessibilityOptions) => {\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isActive || focusManagement === 'manual') return;\n\n // Store the previously focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Auto-focus the first focusable element in the tour dialog\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n return () => {\n // Restore focus when tour ends — validate element is still in the DOM\n if (previousFocusRef.current && document.contains(previousFocusRef.current)) {\n previousFocusRef.current.focus();\n }\n };\n }, [isActive, focusManagement]);\n\n // Create focus trap — active whenever focusTrap is true, independent of screen reader mode\n useEffect(() => {\n if (!isActive || !focusTrap) return;\n\n const handleTabKey = (e: KeyboardEvent) => {\n const focusableElements = document.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n e.preventDefault();\n lastFocusableElement.focus();\n }\n } else {\n if (document.activeElement === lastFocusableElement) {\n e.preventDefault();\n firstFocusableElement.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n return () => document.removeEventListener('keydown', handleTabKey);\n }, [isActive, focusTrap]);\n\n return {\n LiveRegion: () => React.createElement(LiveRegion, {\n currentStep,\n totalSteps,\n targetLabel,\n content: content as React.ReactNode,\n isActive,\n announcements\n }),\n targetLabel,\n };\n}; ","import { useCallback, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: unknown[]) => void>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n ((...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n }) as T,\n [callback, delay]\n );\n} ","import React, { useEffect, useState, memo, useRef, useMemo } from 'react';\nimport { useFloating, offset, flip, shift, autoUpdate } from '@floating-ui/react';\nimport type { SpotlightProps, ButtonConfig, ButtonLayoutConfig } from '../types';\nimport { TourTooltip } from './TourTooltip';\nimport { TourOverlay } from './TourOverlay';\nimport { TourHighlight } from './TourHighlight';\nimport { useTourAccessibility } from '../hooks/useTourAccessibility';\nimport { useDebounce } from '../hooks/useDebounce';\nimport '../styles/theme.css';\n\n/**\n * Props for the Spotlight component\n */\ninterface SpotlightComponentProps extends SpotlightProps {\n /** Whether this is the first step */\n isFirstStep: boolean;\n /** Whether this is the last step */\n isLastStep: boolean;\n /** Whether to show skip button */\n skip: boolean;\n /** Callback for next step */\n onNext: () => void;\n /** Callback for previous step */\n onBack: () => void;\n /** Callback for skipping tour */\n onSkip: () => void;\n /** Callback for completing tour */\n onComplete: () => void;\n /** Whether to show progress indicator */\n showProgress?: boolean;\n /** Current step number */\n currentStep?: number;\n /** Total number of steps */\n totalSteps?: number;\n /** Accessibility configuration */\n accessibility?: {\n /** Whether to enable screen reader announcements */\n enableScreenReader?: boolean;\n /** Custom screen reader announcements */\n announcements?: {\n /** Announcement when tour starts */\n start?: string;\n /** Announcement when tour ends */\n end?: string;\n /** Announcement for each step */\n step?: string;\n };\n /** Focus management strategy */\n focusManagement?: 'auto' | 'manual';\n /** Whether to trap focus within the tour */\n focusTrap?: boolean;\n };\n animation?: 'slide' | 'bounce' | 'fade';\n /** Distance in pixels between the tooltip and its target element */\n tooltipOffset?: number;\n /** Button configuration */\n buttonConfig?: {\n primary?: ButtonConfig;\n secondary?: ButtonConfig;\n container?: ButtonLayoutConfig;\n };\n /** Close the tour when the overlay is clicked */\n dismissOnOverlayClick?: boolean;\n /** Optional step title shown as a visible heading in the tooltip */\n title?: string;\n}\n\n/**\n * Spotlight component that highlights a target element and displays a tooltip\n * @param props - SpotlightComponentProps\n * @returns React component\n */\nexport const Spotlight: React.FC<SpotlightComponentProps> = memo(({\n targetElement,\n placement,\n content,\n onNext,\n onBack,\n onSkip,\n onComplete,\n isFirstStep,\n isLastStep,\n skip = true,\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget = true,\n currentStep,\n totalSteps,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset = 10,\n buttonConfig,\n dismissOnOverlayClick = true,\n title,\n}) => {\n const middleware = useMemo(\n () => [offset(tooltipOffset), flip(), shift()],\n [tooltipOffset]\n );\n\n const { refs: tooltipRefs, floatingStyles, update } = useFloating({\n placement,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const { LiveRegion, targetLabel } = useTourAccessibility({\n currentStep: currentStep ?? 0,\n totalSteps: totalSteps ?? 0,\n targetLabel: targetElement?.getAttribute('aria-label') || 'target element',\n content,\n isActive: true,\n enableScreenReader: accessibility.enableScreenReader,\n announcements: accessibility.announcements,\n focusManagement: accessibility.focusManagement,\n focusTrap: accessibility.focusTrap,\n });\n\n const highlightConfig = typeof highlightTarget === 'object' ? highlightTarget : { className: 'tour-highlight' };\n const isPartialBlur = overlayClassName?.includes('tour-overlay-partial-blur');\n\n // Reactive rect — kept in sync with scroll and resize.\n // Initialized eagerly so the first render is not null (avoids a flash of nothing in tests and on mount).\n const [rect, setRect] = useState<DOMRect | null>(() =>\n targetElement ? targetElement.getBoundingClientRect() : null\n );\n\n // Debounce the update function; store in ref so listeners don't need it as a dep\n const debouncedUpdate = useDebounce(update, 100);\n const debouncedUpdateRef = useRef(debouncedUpdate);\n useEffect(() => { debouncedUpdateRef.current = debouncedUpdate; });\n\n // When step changes: scroll into view, register Floating UI reference, snapshot rect\n useEffect(() => {\n if (!targetElement) return;\n tooltipRefs.setReference(targetElement);\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n setRect(targetElement.getBoundingClientRect());\n }, [targetElement, tooltipRefs]);\n\n // Keep rect in sync while the page scrolls (incl. during smooth-scroll animation)\n useEffect(() => {\n if (!targetElement) return;\n const updateRect = () => {\n setRect(targetElement.getBoundingClientRect());\n debouncedUpdateRef.current();\n };\n window.addEventListener('scroll', updateRect, { passive: true });\n window.addEventListener('resize', updateRect, { passive: true });\n return () => {\n window.removeEventListener('scroll', updateRect);\n window.removeEventListener('resize', updateRect);\n };\n }, [targetElement]); // debouncedUpdate excluded — accessed via ref\n\n if (!targetElement || !rect) return null;\n\n return (\n <>\n {accessibility.enableScreenReader !== false && <LiveRegion />}\n\n <TourOverlay\n overlayClassName={overlayClassName}\n isPartialBlur={isPartialBlur}\n hasHighlight={!!highlightTarget}\n onDismiss={dismissOnOverlayClick ? onSkip : undefined}\n />\n\n {highlightTarget && (\n <TourHighlight\n targetRect={rect}\n highlightConfig={highlightConfig}\n animation={animation}\n />\n )}\n\n {/* Add isolation to the target element */}\n {isPartialBlur && targetElement.id && (\n <style>\n {`\n #${CSS.escape(targetElement.id)} {\n isolation: isolate;\n position: relative;\n z-index: 50;\n transform: translateZ(0);\n will-change: transform;\n }\n `}\n </style>\n )}\n\n <TourTooltip\n content={content}\n placement={placement}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n skip={skip}\n onNext={onNext}\n onBack={onBack}\n onSkip={onSkip}\n onComplete={onComplete}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n targetLabel={targetLabel}\n floatingStyles={floatingStyles}\n setFloating={tooltipRefs.setFloating}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={totalSteps}\n animation={animation}\n buttonConfig={buttonConfig}\n title={title}\n />\n\n </>\n );\n}); ","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTour } from '../context/TourContext';\nimport { Spotlight } from './Spotlight';\nimport type { TourProps } from '../types';\n\nexport const Tour: React.FC<TourProps> = ({\n overlayClassName,\n tooltipClassName,\n buttonClassName,\n buttonContainerClassName,\n highlightTarget,\n skip = true,\n showProgress = false,\n accessibility = {},\n animation = 'slide',\n tooltipOffset,\n buttonConfig,\n dismissOnOverlayClick = true,\n}) => {\n const { steps, currentStep, isActive, next, back, skip: skipTour } = useTour();\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n\n // Extract stable primitive deps to avoid object reference churn\n const enableScreenReader = accessibility.enableScreenReader;\n const startAnnouncement = accessibility.announcements?.start ?? 'Tour started. Use arrow keys to navigate between steps.';\n const endAnnouncement = accessibility.announcements?.end ?? 'Tour ended.';\n\n // Keyboard navigation: Escape closes, Arrow keys move between steps\n useEffect(() => {\n if (!isActive) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { skipTour(); return; }\n\n // Don't intercept arrow keys when focus is inside an editable element\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT' || target.isContentEditable) return;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); next(); }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); back(); }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, skipTour, next, back]);\n\n useEffect(() => {\n if (!isActive || enableScreenReader === false) return;\n\n // Announce tour start to screen readers\n const announcement = document.createElement('div');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only';\n announcement.textContent = startAnnouncement;\n document.body.appendChild(announcement);\n\n // Clear announcement after a delay; store ID so we can cancel on unmount\n const startTimerId = setTimeout(() => {\n if (announcement.isConnected) document.body.removeChild(announcement);\n }, 3000);\n\n return () => {\n clearTimeout(startTimerId);\n if (announcement.isConnected) document.body.removeChild(announcement);\n\n // Announce tour end to screen readers\n const endEl = document.createElement('div');\n endEl.setAttribute('role', 'status');\n endEl.setAttribute('aria-live', 'polite');\n endEl.setAttribute('aria-atomic', 'true');\n endEl.className = 'sr-only';\n endEl.textContent = endAnnouncement;\n document.body.appendChild(endEl);\n\n setTimeout(() => {\n if (endEl.isConnected) document.body.removeChild(endEl);\n }, 3000);\n };\n }, [isActive, enableScreenReader, startAnnouncement, endAnnouncement]);\n\n useEffect(() => {\n if (!isActive) return;\n\n let mounted = true;\n\n const currentStepData = steps[currentStep];\n if (!currentStepData) return;\n\n // Reset target when step changes so the fallback isn't shown briefly\n setTargetElement(null);\n\n let element: Element | null = null;\n try {\n element = document.querySelector(currentStepData.selector);\n } catch {\n return;\n }\n\n if (element) {\n setTargetElement(element);\n } else if (currentStepData.waitFor) {\n currentStepData.waitFor().then(() => {\n if (!mounted) return;\n try {\n const el = document.querySelector(currentStepData.selector);\n setTargetElement(el);\n } catch {\n // invalid selector — leave targetElement null\n }\n }).catch(() => {\n // waitFor rejected — leave targetElement null for this step\n });\n }\n\n return () => { mounted = false; };\n }, [isActive, currentStep, steps]);\n\n const currentStepData = steps[currentStep];\n if (!isActive || !currentStepData) return null;\n\n // Fallback when target element is not found — render a centered dialog\n // instead of silently freezing the tour\n if (!targetElement) {\n const isLastStep = currentStep === steps.length - 1;\n return createPortal(\n <>\n <div\n className=\"tour-overlay fixed inset-0 z-40\"\n onClick={dismissOnOverlayClick ? skipTour : undefined}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center pointer-events-none\">\n <div\n className=\"tour-tooltip pointer-events-auto\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Tour step unavailable\"\n >\n <p className=\"mb-4 text-sm\" style={{ opacity: 0.7 }}>\n This step is currently unavailable.\n </p>\n <div className=\"flex justify-end gap-2\">\n <button onClick={skipTour} className=\"tour-button tour-button-secondary\" aria-label=\"Skip tour\">\n Skip\n </button>\n {!isLastStep && (\n <button onClick={next} className=\"tour-button tour-button-primary\" aria-label=\"Go to next step\">\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </>,\n document.body\n );\n }\n\n return createPortal(\n <Spotlight\n targetElement={targetElement}\n placement={currentStepData.placement || 'bottom'}\n title={currentStepData.title}\n content={currentStepData.content}\n onNext={next}\n onBack={back}\n onSkip={skipTour}\n onComplete={next}\n isFirstStep={currentStep === 0}\n isLastStep={currentStep === steps.length - 1}\n overlayClassName={overlayClassName}\n tooltipClassName={tooltipClassName}\n buttonClassName={buttonClassName}\n buttonContainerClassName={buttonContainerClassName}\n highlightTarget={highlightTarget}\n skip={skip}\n showProgress={showProgress}\n currentStep={currentStep}\n totalSteps={steps.length}\n accessibility={accessibility}\n animation={animation}\n tooltipOffset={tooltipOffset}\n buttonConfig={buttonConfig}\n dismissOnOverlayClick={dismissOnOverlayClick}\n />,\n document.body\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-product-tour-guide",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "A flexible and accessible product tour component for React applications",
6
6
  "main": "dist/index.js",
@@ -45,7 +45,7 @@
45
45
  "@storybook/react-vite": "^8.6.14",
46
46
  "@storybook/test": "^8.6.14",
47
47
  "@storybook/testing-library": "^0.2.1",
48
- "@testing-library/jest-dom": "^6.4.2",
48
+ "@testing-library/jest-dom": "^6.9.1",
49
49
  "@testing-library/react": "^16.0.0",
50
50
  "@testing-library/user-event": "^14.5.2",
51
51
  "@types/jest": "^30.0.0",