react-product-tour-guide 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,18 +26,18 @@ Styles are loaded automatically — no separate CSS import needed.
26
26
  ## Quick Start
27
27
 
28
28
  ```tsx
29
- import { TourProvider, Tour, useTour } from 'react-product-tour-guide';
29
+ import { TourProvider, Tour, useTour } from "react-product-tour-guide";
30
30
 
31
31
  const steps = [
32
32
  {
33
- selector: '#welcome',
34
- content: 'Welcome to our app!',
35
- placement: 'bottom',
33
+ selector: "#welcome",
34
+ content: "Welcome to our app!",
35
+ placement: "bottom",
36
36
  },
37
37
  {
38
- selector: '#features',
39
- content: 'Check out our amazing features!',
40
- placement: 'right',
38
+ selector: "#features",
39
+ content: "Check out our amazing features!",
40
+ placement: "right",
41
41
  },
42
42
  ];
43
43
 
@@ -48,7 +48,7 @@ function TourButton() {
48
48
 
49
49
  function App() {
50
50
  return (
51
- <TourProvider steps={steps} onComplete={() => console.log('Tour done!')}>
51
+ <TourProvider steps={steps} onComplete={() => console.log("Tour done!")}>
52
52
  <TourButton />
53
53
  <Tour />
54
54
  {/* rest of your app */}
@@ -63,33 +63,33 @@ function App() {
63
63
 
64
64
  ### `TourProvider` Props
65
65
 
66
- | Prop | Type | Default | Description |
67
- |------|------|---------|-------------|
68
- | `steps` | `TourStep[]` | required | Array of tour steps |
69
- | `children` | `ReactNode` | required | Child components |
70
- | `defaultActive` | `boolean` | `false` | Start tour automatically on mount |
71
- | `onComplete` | `() => void` | — | Called when the last step is completed |
72
- | `onSkip` | `() => void` | — | Called when the tour is skipped |
73
- | `onStepChange` | `(index, step) => void` | — | Called after navigating to a new step |
74
- | `onStepEnter` | `(index, step) => void` | — | Called when entering a step |
75
- | `onStepExit` | `(index, step) => void` | — | Called when leaving a step |
66
+ | Prop | Type | Default | Description |
67
+ | --------------- | ----------------------- | -------- | -------------------------------------- |
68
+ | `steps` | `TourStep[]` | required | Array of tour steps |
69
+ | `children` | `ReactNode` | required | Child components |
70
+ | `defaultActive` | `boolean` | `false` | Start tour automatically on mount |
71
+ | `onComplete` | `() => void` | — | Called when the last step is completed |
72
+ | `onSkip` | `() => void` | — | Called when the tour is skipped |
73
+ | `onStepChange` | `(index, step) => void` | — | Called after navigating to a new step |
74
+ | `onStepEnter` | `(index, step) => void` | — | Called when entering a step |
75
+ | `onStepExit` | `(index, step) => void` | — | Called when leaving a step |
76
76
 
77
77
  ### `Tour` Props
78
78
 
79
- | Prop | Type | Default | Description |
80
- |------|------|---------|-------------|
81
- | `skip` | `boolean` | `true` | Show the Skip button |
82
- | `showProgress` | `boolean` | `false` | Show a progress bar and "Step X of Y" counter |
83
- | `animation` | `'slide' \| 'bounce' \| 'fade'` | `'slide'` | Tooltip entrance animation |
84
- | `overlayClassName` | `string` | — | Class applied to the overlay |
85
- | `tooltipClassName` | `string` | — | Class applied to the tooltip |
86
- | `buttonClassName` | `string` | — | Class applied to all buttons |
87
- | `buttonContainerClassName` | `string` | — | Class applied to the button container |
88
- | `highlightTarget` | `boolean \| HighlightConfig` | `true` | Highlight the target element |
89
- | `tooltipOffset` | `number` | `10` | Distance in pixels between the tooltip and its target |
90
- | `dismissOnOverlayClick` | `boolean` | `true` | Close the tour when the dark overlay is clicked |
91
- | `accessibility` | `AccessibilityConfig` | — | Screen reader and focus options |
92
- | `buttonConfig` | `ButtonConfigObj` | — | Custom button content or render functions |
79
+ | Prop | Type | Default | Description |
80
+ | -------------------------- | ------------------------------- | --------- | ----------------------------------------------------- |
81
+ | `skip` | `boolean` | `true` | Show the Skip button |
82
+ | `showProgress` | `boolean` | `false` | Show a progress bar and "Step X of Y" counter |
83
+ | `animation` | `'slide' \| 'bounce' \| 'fade'` | `'slide'` | Tooltip entrance animation |
84
+ | `overlayClassName` | `string` | — | Class applied to the overlay |
85
+ | `tooltipClassName` | `string` | — | Class applied to the tooltip |
86
+ | `buttonClassName` | `string` | — | Class applied to all buttons |
87
+ | `buttonContainerClassName` | `string` | — | Class applied to the button container |
88
+ | `highlightTarget` | `boolean \| HighlightConfig` | `true` | Highlight the target element |
89
+ | `tooltipOffset` | `number` | `10` | Distance in pixels between the tooltip and its target |
90
+ | `dismissOnOverlayClick` | `boolean` | `true` | Close the tour when the dark overlay is clicked |
91
+ | `accessibility` | `AccessibilityConfig` | — | Screen reader and focus options |
92
+ | `buttonConfig` | `ButtonConfigObj` | — | Custom button content or render functions |
93
93
 
94
94
  ### `useTour`
95
95
 
@@ -97,14 +97,14 @@ Returns the tour context:
97
97
 
98
98
  ```ts
99
99
  const {
100
- steps, // TourStep[]
101
- currentStep, // number
102
- isActive, // boolean
103
- start, // () => void
104
- stop, // () => void
105
- next, // () => Promise<void> — awaits step.waitFor if present
106
- back, // () => void
107
- skip, // () => void
100
+ steps, // TourStep[]
101
+ currentStep, // number
102
+ isActive, // boolean
103
+ start, // () => void
104
+ stop, // () => void
105
+ next, // () => Promise<void> — awaits step.waitFor if present
106
+ back, // () => void
107
+ skip, // () => void
108
108
  } = useTour();
109
109
  ```
110
110
 
@@ -112,38 +112,38 @@ const {
112
112
 
113
113
  ### `TourStep`
114
114
 
115
- | Property | Type | Description |
116
- |----------|------|-------------|
117
- | `selector` | `string` | CSS selector for the target element |
118
- | `title` | `string` | Optional heading shown at the top of the tooltip |
119
- | `content` | `ReactNode \| ContentType` | Content to display in the tooltip |
120
- | `placement` | `'top' \| 'bottom' \| 'left' \| 'right'` | Tooltip placement |
121
- | `waitFor` | `() => Promise<void>` | Async gate before advancing to this step |
115
+ | Property | Type | Description |
116
+ | ----------- | ---------------------------------------- | ------------------------------------------------ |
117
+ | `selector` | `string` | CSS selector for the target element |
118
+ | `title` | `string` | Optional heading shown at the top of the tooltip |
119
+ | `content` | `ReactNode \| ContentType` | Content to display in the tooltip |
120
+ | `placement` | `'top' \| 'bottom' \| 'left' \| 'right'` | Tooltip placement |
121
+ | `waitFor` | `() => Promise<void>` | Async gate before advancing to this step |
122
122
 
123
123
  ### `ContentType`
124
124
 
125
- | Property | Type | Description |
126
- |----------|------|-------------|
127
- | `type` | `'text' \| 'image' \| 'video' \| 'custom'` | Content type |
128
- | `value` | `ReactNode \| string \| MediaSource` | Content value |
129
- | `alt` | `string` | Alt text for image content (default: `'Tour content'`) |
130
- | `props` | `Record<string, unknown>` | Extra props forwarded to the element |
125
+ | Property | Type | Description |
126
+ | -------- | ------------------------------------------ | ------------------------------------------------------ |
127
+ | `type` | `'text' \| 'image' \| 'video' \| 'custom'` | Content type |
128
+ | `value` | `ReactNode \| string \| MediaSource` | Content value |
129
+ | `alt` | `string` | Alt text for image content (default: `'Tour content'`) |
130
+ | `props` | `Record<string, unknown>` | Extra props forwarded to the element |
131
131
 
132
132
  ### `MediaSource`
133
133
 
134
- | Property | Type | Description |
135
- |----------|------|-------------|
136
- | `type` | `'remote' \| 'local'` | Media source type |
137
- | `src` | `string` | URL or asset path |
134
+ | Property | Type | Description |
135
+ | -------- | --------------------- | ----------------- |
136
+ | `type` | `'remote' \| 'local'` | Media source type |
137
+ | `src` | `string` | URL or asset path |
138
138
 
139
139
  ### `AccessibilityConfig`
140
140
 
141
- | Property | Type | Description |
142
- |----------|------|-------------|
143
- | `enableScreenReader` | `boolean` | Enable aria-live announcements |
144
- | `announcements` | `{ start, end, step }` | Custom announcement strings |
145
- | `focusManagement` | `'auto' \| 'manual'` | Focus strategy |
146
- | `focusTrap` | `boolean` | Trap Tab key within the tour dialog |
141
+ | Property | Type | Description |
142
+ | -------------------- | ---------------------- | ----------------------------------- |
143
+ | `enableScreenReader` | `boolean` | Enable aria-live announcements |
144
+ | `announcements` | `{ start, end, step }` | Custom announcement strings |
145
+ | `focusManagement` | `'auto' \| 'manual'` | Focus strategy |
146
+ | `focusTrap` | `boolean` | Trap Tab key within the tour dialog |
147
147
 
148
148
  ---
149
149
 
@@ -287,7 +287,11 @@ Pass any CSS class names via the className props. When using **Tailwind**, prefi
287
287
  Without Tailwind, plain CSS classes work when your rules are unlayered (unlayered styles always win over the library's `@layer react-product-tour` styles):
288
288
 
289
289
  ```css
290
- .my-tooltip { background: #1e293b; color: #f1f5f9; border-radius: 1rem; }
290
+ .my-tooltip {
291
+ background: #1e293b;
292
+ color: #f1f5f9;
293
+ border-radius: 1rem;
294
+ }
291
295
  ```
292
296
 
293
297
  ```tsx
@@ -300,17 +304,17 @@ Without Tailwind, plain CSS classes work when your rules are unlayered (unlayere
300
304
  <Tour
301
305
  buttonConfig={{
302
306
  primary: {
303
- content: 'Continue →',
304
- className: 'bg-indigo-500 text-white px-6 py-2 rounded-lg',
307
+ content: "Continue →",
308
+ className: "bg-indigo-500 text-white px-6 py-2 rounded-lg",
305
309
  },
306
310
  secondary: {
307
- content: '← Back',
311
+ content: "← Back",
308
312
  },
309
313
  // Or full custom render:
310
314
  primary: {
311
315
  render: ({ onNext, onComplete, isLastStep, currentStep, totalSteps }) => (
312
316
  <button onClick={isLastStep ? onComplete : onNext}>
313
- {isLastStep ? 'Finish' : `Next (${currentStep + 1}/${totalSteps})`}
317
+ {isLastStep ? "Finish" : `Next (${currentStep + 1}/${totalSteps})`}
314
318
  </button>
315
319
  ),
316
320
  },
@@ -319,11 +323,9 @@ Without Tailwind, plain CSS classes work when your rules are unlayered (unlayere
319
323
  render: (props) => (
320
324
  <div className="flex flex-col gap-3 mt-4 pt-4 border-t">
321
325
  <button onClick={props.isLastStep ? props.onComplete : props.onNext}>
322
- {props.isLastStep ? 'Done' : 'Next'}
326
+ {props.isLastStep ? "Done" : "Next"}
323
327
  </button>
324
- {!props.isFirstStep && (
325
- <button onClick={props.onBack}>Back</button>
326
- )}
328
+ {!props.isFirstStep && <button onClick={props.onBack}>Back</button>}
327
329
  </div>
328
330
  ),
329
331
  },
@@ -338,11 +340,11 @@ Without Tailwind, plain CSS classes work when your rules are unlayered (unlayere
338
340
  ```tsx
339
341
  <TourProvider
340
342
  steps={steps}
341
- onStepChange={(index, step) => analytics.track('tour_step', { index })}
342
- onStepEnter={(index, step) => console.log('entered', step.selector)}
343
- onStepExit={(index, step) => console.log('exited', step.selector)}
344
- onComplete={() => localStorage.setItem('tour_done', '1')}
345
- onSkip={() => console.log('skipped')}
343
+ onStepChange={(index, step) => analytics.track("tour_step", { index })}
344
+ onStepEnter={(index, step) => console.log("entered", step.selector)}
345
+ onStepExit={(index, step) => console.log("exited", step.selector)}
346
+ onComplete={() => localStorage.setItem("tour_done", "1")}
347
+ onSkip={() => console.log("skipped")}
346
348
  >
347
349
  <Tour />
348
350
  </TourProvider>
@@ -354,11 +356,11 @@ Without Tailwind, plain CSS classes work when your rules are unlayered (unlayere
354
356
 
355
357
  The tour responds to keyboard events out of the box — no configuration required:
356
358
 
357
- | Key | Action |
358
- |-----|--------|
359
- | `Escape` | Close / skip the tour |
360
- | `→` / `↓` | Advance to the next step |
361
- | `←` / `↑` | Go back to the previous step |
359
+ | Key | Action |
360
+ | ------------------- | -------------------------------------------------------------- |
361
+ | `Escape` | Close / skip the tour |
362
+ | `→` / `↓` | Advance to the next step |
363
+ | `←` / `↑` | Go back to the previous step |
362
364
  | `Tab` / `Shift+Tab` | Move focus between buttons (focus trap when `focusTrap: true`) |
363
365
 
364
366
  Arrow keys are ignored when focus is inside an input, textarea, or select.
@@ -374,12 +376,12 @@ Focus management and the Tab focus trap are active by default — they do **not*
374
376
  accessibility={{
375
377
  enableScreenReader: true,
376
378
  announcements: {
377
- start: 'Product tour started. Press Tab to navigate.',
378
- end: 'Tour complete.',
379
- step: 'Step {step} of {total}: {content}',
379
+ start: "Product tour started. Press Tab to navigate.",
380
+ end: "Tour complete.",
381
+ step: "Step {step} of {total}: {content}",
380
382
  },
381
- focusTrap: true, // default — trap Tab within the dialog
382
- focusManagement: 'auto', // default — auto-focus first button; restore on close
383
+ focusTrap: true, // default — trap Tab within the dialog
384
+ focusManagement: "auto", // default — auto-focus first button; restore on close
383
385
  }}
384
386
  />
385
387
  ```
@@ -391,7 +393,7 @@ Focus management and the Tab focus trap are active by default — they do **not*
391
393
  For use cases where `TourProvider` can't wrap your component tree:
392
394
 
393
395
  ```tsx
394
- import { tourManager } from 'react-product-tour-guide';
396
+ import { tourManager } from "react-product-tour-guide";
395
397
 
396
398
  tourManager.initialize(steps);
397
399
  tourManager.start();
@@ -413,18 +415,18 @@ All public types are exported for TypeScript consumers:
413
415
 
414
416
  ```ts
415
417
  import type {
416
- TourStep, // A single step definition
417
- TourProviderProps, // Props for <TourProvider>
418
- TourProps, // Props for <Tour>
419
- Placement, // 'top' | 'bottom' | 'left' | 'right'
420
- ContentType, // Structured content (image/video/custom)
421
- MediaSource, // { type: 'remote'|'local', src: string }
422
- HighlightConfig, // { className?, style? } for the spotlight ring
423
- AccessibilityConfig,// Screen reader and focus trap options
424
- ButtonConfig, // Per-button content/className/style/render
418
+ TourStep, // A single step definition
419
+ TourProviderProps, // Props for <TourProvider>
420
+ TourProps, // Props for <Tour>
421
+ Placement, // 'top' | 'bottom' | 'left' | 'right'
422
+ ContentType, // Structured content (image/video/custom)
423
+ MediaSource, // { type: 'remote'|'local', src: string }
424
+ HighlightConfig, // { className?, style? } for the spotlight ring
425
+ AccessibilityConfig, // Screen reader and focus trap options
426
+ ButtonConfig, // Per-button content/className/style/render
425
427
  ButtonLayoutConfig, // Button container direction/align/gap/render
426
- ButtonRenderProps, // Props passed to custom button render functions
427
- } from 'react-product-tour-guide';
428
+ ButtonRenderProps, // Props passed to custom button render functions
429
+ } from "react-product-tour-guide";
428
430
  ```
429
431
 
430
432
  ---
@@ -452,3 +454,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, coding standards,
452
454
  ## License
453
455
 
454
456
  MIT — see [LICENSE](LICENSE) for details.
457
+
458
+ ## Support
459
+
460
+ Buy me a coffee: buymeacoffee.com/guestdm
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,cAAiB,GAAA,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/* 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\nexport const TourContext = createContext<TourContextValue | null>(null);\n\nexport const 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\nexport const 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}; ","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={`flex items-center justify-center p-4 bg-gray-100 rounded-lg ${className}`}>\n <div className=\"text-center\">\n <div className=\"text-gray-400 mb-2\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p className=\"text-sm text-gray-500\">\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 secondary?: 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\" className=\"w-full h-auto\" />;\n return (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto rounded-lg\"\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\" className=\"w-full h-auto\" />;\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 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 // 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(\n 'flex justify-between items-center gap-2',\n config?.container?.className\n )}\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=\"flex gap-2\">\n {!isFirstStep && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Go to previous step\"\n >\n {config?.secondary?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Skip tour\"\n >\n {config?.secondary?.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 z-50', 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=\"mb-4\">\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-xs\" style={{ opacity: 0.6 }} 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=\"mb-4\">\n <ErrorBoundary\n fallback={\n <div className=\"p-4 bg-gray-50 border border-gray-200 rounded-lg\">\n <div className=\"text-gray-600 mb-2\">Content Error</div>\n <div className=\"text-sm text-gray-500\">\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: any[]) => 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/* 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\nexport const TourContext = createContext<TourContextValue | null>(null);\n\nexport const 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\nexport const 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}; ","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={`flex items-center justify-center p-4 bg-gray-100 rounded-lg ${className}`}>\n <div className=\"text-center\">\n <div className=\"text-gray-400 mb-2\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p className=\"text-sm text-gray-500\">\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 secondary?: 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\" className=\"w-full h-auto\" />;\n return (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto rounded-lg\"\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\" className=\"w-full h-auto\" />;\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 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 // 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(\n 'flex justify-between items-center gap-2',\n config?.container?.className\n )}\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=\"flex gap-2\">\n {!isFirstStep && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Go to previous step\"\n >\n {config?.secondary?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Skip tour\"\n >\n {config?.secondary?.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 z-50', 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=\"mb-4\">\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-xs\" style={{ opacity: 0.6 }} 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=\"mb-4\">\n <ErrorBoundary\n fallback={\n <div className=\"p-4 bg-gray-50 border border-gray-200 rounded-lg\">\n <div className=\"text-gray-600 mb-2\">Content Error</div>\n <div className=\"text-sm text-gray-500\">\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: any[]) => 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 +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,cAAiB,GAAA,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/* 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\nexport const TourContext = createContext<TourContextValue | null>(null);\n\nexport const 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\nexport const 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}; ","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={`flex items-center justify-center p-4 bg-gray-100 rounded-lg ${className}`}>\n <div className=\"text-center\">\n <div className=\"text-gray-400 mb-2\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p className=\"text-sm text-gray-500\">\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 secondary?: 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\" className=\"w-full h-auto\" />;\n return (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto rounded-lg\"\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\" className=\"w-full h-auto\" />;\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 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 // 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(\n 'flex justify-between items-center gap-2',\n config?.container?.className\n )}\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=\"flex gap-2\">\n {!isFirstStep && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Go to previous step\"\n >\n {config?.secondary?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Skip tour\"\n >\n {config?.secondary?.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 z-50', 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=\"mb-4\">\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-xs\" style={{ opacity: 0.6 }} 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=\"mb-4\">\n <ErrorBoundary\n fallback={\n <div className=\"p-4 bg-gray-50 border border-gray-200 rounded-lg\">\n <div className=\"text-gray-600 mb-2\">Content Error</div>\n <div className=\"text-sm text-gray-500\">\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: any[]) => 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;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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/* 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\nexport const TourContext = createContext<TourContextValue | null>(null);\n\nexport const 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\nexport const 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}; ","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={`flex items-center justify-center p-4 bg-gray-100 rounded-lg ${className}`}>\n <div className=\"text-center\">\n <div className=\"text-gray-400 mb-2\">\n {type === 'image' ? '🖼️' : '🎥'}\n </div>\n <p className=\"text-sm text-gray-500\">\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 secondary?: 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\" className=\"w-full h-auto\" />;\n return (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto rounded-lg\"\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\" className=\"w-full h-auto\" />;\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 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 // 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(\n 'flex justify-between items-center gap-2',\n config?.container?.className\n )}\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=\"flex gap-2\">\n {!isFirstStep && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onBack}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Go to previous step\"\n >\n {config?.secondary?.content || 'Back'}\n </button>\n )\n )}\n {skip && (\n config?.secondary?.render ? (\n config.secondary.render(props)\n ) : (\n <button\n onClick={onSkip}\n className={clsx('tour-button tour-button-secondary', config?.secondary?.className)}\n style={config?.secondary?.style}\n aria-label=\"Skip tour\"\n >\n {config?.secondary?.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 z-50', 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=\"mb-4\">\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-xs\" style={{ opacity: 0.6 }} 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=\"mb-4\">\n <ErrorBoundary\n fallback={\n <div className=\"p-4 bg-gray-50 border border-gray-200 rounded-lg\">\n <div className=\"text-gray-600 mb-2\">Content Error</div>\n <div className=\"text-sm text-gray-500\">\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: any[]) => 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.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "A flexible and accessible product tour component for React applications",
6
6
  "main": "dist/index.js",
@@ -93,12 +93,12 @@
93
93
  "license": "MIT",
94
94
  "repository": {
95
95
  "type": "git",
96
- "url": "https://github.com/guestDI/react-tour-guide.git"
96
+ "url": "https://github.com/guestDI/react-tour.git"
97
97
  },
98
98
  "bugs": {
99
- "url": "https://github.com/guestDI/react-tour-guide/issues"
99
+ "url": "https://github.com/guestDI/react-tour/issues"
100
100
  },
101
- "homepage": "https://github.com/guestDI/react-tour-guide#readme",
101
+ "homepage": "https://github.com/guestDI/react-tour#readme",
102
102
  "engines": {
103
103
  "node": ">=18.0.0"
104
104
  },