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 +105 -99
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
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
|
|
29
|
+
import { TourProvider, Tour, useTour } from "react-product-tour-guide";
|
|
30
30
|
|
|
31
31
|
const steps = [
|
|
32
32
|
{
|
|
33
|
-
selector:
|
|
34
|
-
content:
|
|
35
|
-
placement:
|
|
33
|
+
selector: "#welcome",
|
|
34
|
+
content: "Welcome to our app!",
|
|
35
|
+
placement: "bottom",
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
|
-
selector:
|
|
39
|
-
content:
|
|
40
|
-
placement:
|
|
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(
|
|
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
|
|
67
|
-
|
|
68
|
-
| `steps`
|
|
69
|
-
| `children`
|
|
70
|
-
| `defaultActive` | `boolean`
|
|
71
|
-
| `onComplete`
|
|
72
|
-
| `onSkip`
|
|
73
|
-
| `onStepChange`
|
|
74
|
-
| `onStepEnter`
|
|
75
|
-
| `onStepExit`
|
|
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
|
|
80
|
-
|
|
81
|
-
| `skip`
|
|
82
|
-
| `showProgress`
|
|
83
|
-
| `animation`
|
|
84
|
-
| `overlayClassName`
|
|
85
|
-
| `tooltipClassName`
|
|
86
|
-
| `buttonClassName`
|
|
87
|
-
| `buttonContainerClassName` | `string`
|
|
88
|
-
| `highlightTarget`
|
|
89
|
-
| `tooltipOffset`
|
|
90
|
-
| `dismissOnOverlayClick`
|
|
91
|
-
| `accessibility`
|
|
92
|
-
| `buttonConfig`
|
|
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,
|
|
101
|
-
currentStep,
|
|
102
|
-
isActive,
|
|
103
|
-
start,
|
|
104
|
-
stop,
|
|
105
|
-
next,
|
|
106
|
-
back,
|
|
107
|
-
skip,
|
|
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
|
|
116
|
-
|
|
117
|
-
| `selector`
|
|
118
|
-
| `title`
|
|
119
|
-
| `content`
|
|
120
|
-
| `placement` | `'top' \| 'bottom' \| 'left' \| 'right'` | Tooltip placement
|
|
121
|
-
| `waitFor`
|
|
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
|
|
126
|
-
|
|
127
|
-
| `type`
|
|
128
|
-
| `value`
|
|
129
|
-
| `alt`
|
|
130
|
-
| `props`
|
|
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
|
|
135
|
-
|
|
136
|
-
| `type`
|
|
137
|
-
| `src`
|
|
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
|
|
142
|
-
|
|
143
|
-
| `enableScreenReader` | `boolean`
|
|
144
|
-
| `announcements`
|
|
145
|
-
| `focusManagement`
|
|
146
|
-
| `focusTrap`
|
|
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 {
|
|
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:
|
|
304
|
-
className:
|
|
307
|
+
content: "Continue →",
|
|
308
|
+
className: "bg-indigo-500 text-white px-6 py-2 rounded-lg",
|
|
305
309
|
},
|
|
306
310
|
secondary: {
|
|
307
|
-
content:
|
|
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 ?
|
|
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 ?
|
|
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(
|
|
342
|
-
onStepEnter={(index, step) => console.log(
|
|
343
|
-
onStepExit={(index, step) => console.log(
|
|
344
|
-
onComplete={() => localStorage.setItem(
|
|
345
|
-
onSkip={() => console.log(
|
|
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
|
|
358
|
-
|
|
359
|
-
| `Escape`
|
|
360
|
-
| `→` / `↓`
|
|
361
|
-
| `←` / `↑`
|
|
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:
|
|
378
|
-
end:
|
|
379
|
-
step:
|
|
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,
|
|
382
|
-
focusManagement:
|
|
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
|
|
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,
|
|
417
|
-
TourProviderProps,
|
|
418
|
-
TourProps,
|
|
419
|
-
Placement,
|
|
420
|
-
ContentType,
|
|
421
|
-
MediaSource,
|
|
422
|
-
HighlightConfig,
|
|
423
|
-
AccessibilityConfig
|
|
424
|
-
ButtonConfig,
|
|
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,
|
|
427
|
-
} from
|
|
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"]}
|
package/dist/index.mjs.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":["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;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AA6XvB,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,EAAA,MAAM,EAAA,GAAK,+BAAA;AACX,EAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,EAAA,GAAK,EAAA;AACX,IAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,EAC5D;AACF;;;AC5XA,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAKR,WAAA,GAAc;AAHtB,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAGN,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,OAAO,EAAC;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,SAAA,uBAAgB,GAAA,EAAI;AAAA,EAC3B;AAAA,EAEA,OAAO,WAAA,GAA2B;AAChC,IAAA,IAAI,CAAC,aAAY,QAAA,EAAU;AACzB,MAAA,YAAA,CAAY,QAAA,GAAW,IAAI,YAAA,EAAY;AAAA,IACzC;AACA,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAAA,EAEA,QAAA,GAAsB;AACpB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EACvD;AAAA,EAEA,WAAW,KAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAA;AACnB,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,CAAA;AACzB,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA;AACtB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AACtB,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,CAAA;AACzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA;AACtB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjF,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAM,WAAA,IAAe,CAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,YAAY,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG;AAEzD,IAAA,IAAA,CAAK,MAAM,WAAA,IAAe,CAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY,QAAA,CAAS,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EAChE;AACF,CAAA;AAxEE,aAAA,CADI,YAAA,EACW,UAAA,CAAA;AADjB,IAAM,WAAA,GAAN,YAAA;AA2EO,IAAM,WAAA,GAAc,YAAY,WAAA;ACjFhC,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAE/D,IAAM,eAA4C,CAAC;AAAA,EACxD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,aAAa,CAAA;AAGtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,WAAW,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,cAAA,CAAe,CAAC,CAAA;AAChB,IAAA,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAEvB,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,GAAa,WAAA,EAAa,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,GAAG,CAAC,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,UAAU,CAAC,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAO,YAAY,YAAY;AACnC,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AAEzC,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,MAAM,gBAAgB,OAAA,EAAQ;AAAA,IAChC;AAEA,IAAA,IAAI,WAAA,GAAc,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,UAAA,GAAa,aAAa,eAAe,CAAA;AACzC,MAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA;AACpC,MAAA,cAAA,CAAe,aAAa,CAAA;AAC5B,MAAA,YAAA,GAAe,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,MAAA,WAAA,GAAc,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AACL,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,KAAA,EAAO,MAAM,UAAA,EAAY,UAAA,EAAY,YAAA,EAAc,WAAW,CAAC,CAAA;AAEhF,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,MAAA,UAAA,GAAa,aAAa,eAAe,CAAA;AACzC,MAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA;AACpC,MAAA,cAAA,CAAe,aAAa,CAAA;AAC5B,MAAA,YAAA,GAAe,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,MAAA,WAAA,GAAc,aAAA,EAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,OAAO,UAAA,EAAY,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9D,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAA,EAAK;AACL,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,QAA0B,OAAO;AAAA,IAC7C,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,OAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAEjE,EAAA,uBACE,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OACnB,QAAA,EACH,CAAA;AAEJ;AAEO,IAAM,UAAU,MAAM;AAC3B,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AC3FO,IAAMA,WAAU,MAAwB;AAC7C,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIC,QAAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AAErE,EAAAC,UAAU,MAAM;AAEd,IAAA,OAAO,WAAA,CAAY,UAAU,cAAc,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,OAAO;AAAA,IACL,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,aAAa,WAAA,CAAY,WAAA;AAAA,IACzB,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,KAAA,EAAO,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IACzC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,IACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAW;AAAA,GACzC;AACF;ACtBO,IAAM,cAA0C,CAAC;AAAA,EACtD,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAA,CAAa,WAAA,GAAc,CAAA,IAAK,UAAA,GAAc,GAAA;AAEpD,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,mCAAA,EAAoC,EAC/G,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,6DAAA;AAAA,MACV,OAAO,EAAE,KAAA,EAAO,GAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,YAAY,6BAAA,EAA8B;AAAA,MAC1E,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ,CAAA;ACpBO,IAAM,gBAA8C,CAAC,EAAE,IAAA,EAAM,SAAA,GAAY,IAAG,KAAM;AACvF,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,4DAAA,EAA+D,SAAS,CAAA,CAAA,EACtF,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACZ,QAAA,EAAA,IAAA,KAAS,OAAA,GAAU,oBAAQ,WAAA,EAC9B,CAAA;AAAA,oBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBACV,QAAA,EAAA,IAAA,KAAS,OAAA,GAAU,yBAAyB,sBAAA,EAC/C;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAA;ACUO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAwB;AAAA,EACzD,YAAY,KAAA,EAAc;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,QAAA,EAAU,KAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CAAkB,OAAc,SAAA,EAAsB;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,MAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,QAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MACpB;AAEA,MAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBACvDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,8BAAA,EAChC;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;ACdA,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA2C;AACjE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,MAAA,IAAU,KAAA,IAAS,SAAS,KAAA,EAAO;AACpF,IAAA,MAAM,WAAA,GAAc,KAAA;AACpB,IAAA,OAAO,WAAA,CAAY,GAAA;AAAA,EACrB;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB,CAAA;AAEA,IAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,OAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,eAAe,gBAAA,EAAkB,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,OAAO,CAAC,CAAA;AAC1J,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,SAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,eAAe,SAAA,EAAW,QAAA,EAAU,aAAA,EAAe,WAAA,EAAa,OAAO,CAAC,CAAA;AAE1J,IAAM,WAAA,GAAc,CAAC,KAAA,EAA4C,SAAA,KAAoD;AACnH,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AACnF,CAAA;AAEA,IAAM,eAAyF,CAAC,EAAE,KAAK,GAAA,GAAM,cAAA,EAAgB,OAAM,KAAM;AACvI,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC9C,EAAA,IAAI,QAAA,yBAAiBE,GAAAA,CAAC,iBAAc,IAAA,EAAK,OAAA,EAAQ,WAAU,eAAA,EAAgB,CAAA;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA,EAAU,0BAAA;AAAA,MACV,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9B,GAAG,WAAA,CAAY,KAAA,EAAO,cAAc;AAAA;AAAA,GACvC;AAEJ,CAAA;AAEA,IAAM,YAAA,GAA2E,CAAC,EAAE,GAAA,EAAK,OAAM,KAAM;AACnG,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC9C,EAAA,IAAI,QAAA,yBAAiBE,GAAAA,CAAC,iBAAc,IAAA,EAAK,OAAA,EAAQ,WAAU,eAAA,EAAgB,CAAA;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,0BAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAW,oBAAA;AAAA,MACX,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9B,GAAG,WAAA,CAAY,KAAA,EAAO,gBAAgB;AAAA;AAAA,GACzC;AAEJ,CAAA;AAOA,IAAM,aAAA,GAAgB,CAAC,OAAA,KAA0D;AAC/E,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAYE,MAAAA,CAAM,cAAA,CAAe,OAAO,CAAA,EAAG;AAChE,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,IACE,OAAO,eAAe,QAAA,IACtB,UAAA,KAAe,QACf,MAAA,IAAU,UAAA,IACV,WAAW,UAAA,EACX;AACA,IAAA,MAAM,YAAA,GAAe,UAAA;AACrB,IAAA,QAAQ,aAAa,IAAA;AAAM,MACzB,KAAK,OAAA;AACH,QAAA,uBAAOF,GAAAA,CAAC,YAAA,EAAA,EAAa,GAAA,EAAK,cAAA,CAAe,YAAA,CAAa,KAAK,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA;AAAA,MAClH,KAAK,OAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,GAAA,EAAK,cAAA,CAAe,aAAa,KAAK,CAAA,EAAG,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,CAAA;AAAA,MAC3F,KAAK,QAAA;AACH,QAAA,OAAO,YAAA,CAAa,KAAA;AAAA,MACtB,KAAK,MAAA;AAAA,MACL;AACE,QAAA,OAAO,YAAA,CAAa,KAAA;AAAA;AACxB,EACF;AAEA,EAAA,OAAO,OAAA;AACT,CAAA;AAQA,IAAM,aAAA,GAAgB,CACpB,KAAA,EACA,MAAA,KAKoB;AACpB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,IAAI,MAAA,EAAQ,WAAW,MAAA,EAAQ;AAC7B,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC;AAGA,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA;AAAA,QACT,yCAAA;AAAA,QACA,QAAQ,SAAA,EAAW;AAAA,OACrB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,MAAA,EAAQ,SAAA,EAAW,SAAA,IAAa,KAAA;AAAA,QAC/C,UAAA,EAAY,MAAA,EAAQ,SAAA,EAAW,KAAA,IAAS,QAAA;AAAA,QACxC,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,GAAA,IAAO,QAAA;AAAA,QAC/B,GAAG,QAAQ,SAAA,EAAW;AAAA,OACxB;AAAA,MACA,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,WAAA,KACA,QAAQ,SAAA,EAAW,MAAA,GACjB,OAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,mBAE7BD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,mCAAA,EAAqC,MAAA,EAAQ,WAAW,SAAS,CAAA;AAAA,cACjF,KAAA,EAAO,QAAQ,SAAA,EAAW,KAAA;AAAA,cAC1B,YAAA,EAAW,qBAAA;AAAA,cAEV,QAAA,EAAA,MAAA,EAAQ,WAAW,OAAA,IAAW;AAAA;AAAA,WACjC,CAAA;AAAA,UAGH,IAAA,KACC,QAAQ,SAAA,EAAW,MAAA,GACjB,OAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,mBAE7BA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,mCAAA,EAAqC,MAAA,EAAQ,WAAW,SAAS,CAAA;AAAA,cACjF,KAAA,EAAO,QAAQ,SAAA,EAAW,KAAA;AAAA,cAC1B,YAAA,EAAW,WAAA;AAAA,cAEV,QAAA,EAAA,MAAA,EAAQ,WAAW,OAAA,IAAW;AAAA;AAAA,WACjC;AAAA,SAAA,EAGN,CAAA;AAAA,QACC,MAAA,EAAQ,SAAS,MAAA,GAChB,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAK,oBAE3BA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,aAAa,UAAA,GAAa,MAAA;AAAA,YACnC,SAAA,EAAW,IAAA,CAAK,iCAAA,EAAmC,MAAA,EAAQ,SAAS,SAAS,CAAA;AAAA,YAC7E,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA;AAAA,YACxB,YAAA,EAAY,aAAa,eAAA,GAAkB,iBAAA;AAAA,YAE1C,QAAA,EAAA,MAAA,EAAQ,OAAA,EAAS,OAAA,KAAY,UAAA,GAAa,MAAA,GAAS,MAAA;AAAA;AAAA;AACtD;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAOO,IAAM,cAA0C,CAAC;AAAA,EACtD,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,OAAA;AAAA,EACZ,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,SAAS,KAAK,CAAA;AAEhD,EAAAC,UAAU,MAAM;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,cAAA;AAAA,MACP,WAAW,IAAA,CAAK,mBAAA,EAAqB,kBAAkB,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,MAC7E,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,iBAAA,EAAgB,iBAAA;AAAA,MAChB,kBAAA,EAAiB,mBAAA;AAAA,MACjB,gBAAA,EAAgB,SAAA;AAAA,MAChB,gBAAA,EAAgB,SAAA;AAAA,MAEf,QAAA,EAAA;AAAA,QAAA,KAAA,mBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,IAAG,iBAAA,EAAkB,SAAA,EAAU,sBAChC,QAAA,EAAA,KAAA,EACH,CAAA,mBAEAA,GAAAA,CAAC,SAAI,EAAA,EAAG,iBAAA,EAAkB,WAAU,SAAA,EACjC,QAAA,EAAA,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA,EAC5B,CAAA;AAAA,QAED,YAAA,IAAgB,gBAAgB,MAAA,IAAa,UAAA,KAAe,0BAC3DC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,wCAAA,EACb,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,KAAA,EAAO,EAAE,SAAS,GAAA,EAAI,EAAG,eAAY,MAAA,EAC5D,QAAA,EAAA,CAAA,KAAA,EAAQ,cAAc,CAAC,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAC3C,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAA0B,UAAA,EAAwB;AAAA,SAAA,EACjE,CAAA;AAAA,wBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAG,mBAAA,EAAoB,SAAA,EAAU,QACpC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,QAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kDAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,8BACjDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAwB,QAAA,EAAA,+BAAA,EAEvC;AAAA,aAAA,EACF,CAAA;AAAA,YAGD,wBAAc,OAAO;AAAA;AAAA,SACxB,EACF,CAAA;AAAA,QACC,aAAA;AAAA,UACC;AAAA,YACE,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,YAAA,IAAgB;AAAA,YACd,OAAA,EAAS,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA,YACtC,SAAA,EAAW,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA,YACxC,SAAA,EAAW,EAAE,SAAA,EAAW,wBAAA;AAAyB;AACnD;AACF;AAAA;AAAA,GACF;AAEJ,CAAA;AC7UO,IAAM,cAA0C,CAAC;AAAA,EACtD,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEC,KAAA,QAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACCD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,IAMD,CAAC,gCACAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,IAAAA,CAAK,iCAAA,EAAmC,gBAAgB,CAAA;AAAA,QACnE,OAAA,EAAS,SAAA;AAAA,QACT,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY;AAAA;AAAA;AACd,GAAA,EAEJ,CAAA;AAEJ,CAAA;ACpCO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,UAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,iBAAiB,QAAA,CAAS,eAAe,CAAA,CAAE,gBAAA,CAAiB,4BAA4B,CAAA,IAAK;AAAA,GAC/F;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIL,SAAS,KAAK,CAAA;AAEhD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,GAAA,EAAK,WAAW,GAAA,GAAM,OAAA;AAAA,QACtB,IAAA,EAAM,WAAW,IAAA,GAAO,OAAA;AAAA,QACxB,KAAA,EAAO,UAAA,CAAW,KAAA,GAAQ,OAAA,GAAU,CAAA;AAAA,QACpC,MAAA,EAAQ,UAAA,CAAW,MAAA,GAAS,OAAA,GAAU,CAAA;AAAA,QACtC,GAAG,eAAA,CAAgB;AAAA,OACrB;AAAA,MACA,SAAA,EAAWG,IAAAA;AAAA,QACT,qBAAA;AAAA,QACA,eAAA,CAAgB,SAAA;AAAA,QAChB,EAAE,SAAS,SAAA;AAAU,OACvB;AAAA,MACA,gBAAA,EAAgB,SAAA;AAAA,MAChB,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY;AAAA;AAAA,GACd;AAEJ,CAAA;ACxBA,IAAM,aAAwC,CAAC;AAAA,EAC7C,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,GAAA,CAAI,OAAA,EAAS;AAE/B,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,EAAA;AAC5D,IAAA,MAAM,uBAAA,GAA0B,CAAA,KAAA,EAAQ,WAAA,GAAc,CAAC,CAAA,IAAA,EAAO,UAAU,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,EAAI,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAChI,IAAA,MAAM,gBAAA,GAAmB,eAAe,IAAA,GACpC,aAAA,CAAc,KACX,OAAA,CAAQ,QAAA,EAAU,OAAO,WAAA,GAAc,CAAC,CAAC,CAAA,CACzC,OAAA,CAAQ,WAAW,MAAA,CAAO,UAAU,CAAC,CAAA,CACrC,OAAA,CAAQ,WAAA,EAAa,WAAW,CAAA,GACnC,uBAAA;AAEJ,IAAA,GAAA,CAAI,QAAQ,WAAA,GAAc,gBAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,aAAa,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC,CAAA;AAE3E,EAAA,OAAOG,MAAAA,CAAM,cAAc,KAAA,EAAO;AAAA,IAChC,GAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,QAAA;AAAA,IACb,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACZ,CAAA;AACH,CAAA;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA,GAAqB,KAAA;AAAA,EACrB,aAAA;AAAA,EACA,eAAA,GAAkB,MAAA;AAAA,EAClB,SAAA,GAAY;AACd,CAAA,KAAmC;AACjC,EAAA,MAAM,gBAAA,GAAmB,OAA2B,IAAI,CAAA;AAExD,EAAAH,UAAU,MAAM;AACd,IAAA,IAAiB,eAAA,KAAoB,QAAA,EAAU;AAG/C,IAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAGpC,IAAA,MAAM,oBAAoB,QAAA,CAAS,gBAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAC,iBAAA,CAAkB,CAAC,CAAA,CAAkB,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,OAAO,MAAM;AAEX,MAAA,IAAI,iBAAiB,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC3E,QAAA,gBAAA,CAAiB,QAAQ,KAAA,EAAM;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,eAAe,CAAC,CAAA;AAG9B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAiB,CAAC,SAAA,EAAW;AAE7B,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,MAAM,oBAAoB,QAAA,CAAS,gBAAA;AAAA,QACjC;AAAA,OACF;AACA,MAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAEpC,MAAA,MAAM,qBAAA,GAAwB,kBAAkB,CAAC,CAAA;AACjD,MAAA,MAAM,oBAAA,GAAuB,iBAAA,CAAkB,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAA;AAE3E,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,QAAA,IAAI,EAAE,QAAA,EAAU;AACd,UAAA,IAAI,QAAA,CAAS,kBAAkB,qBAAA,EAAuB;AACpD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,oBAAA,CAAqB,KAAA,EAAM;AAAA,UAC7B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,QAAA,CAAS,kBAAkB,oBAAA,EAAsB;AACnD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,qBAAA,CAAsB,KAAA,EAAM;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACjD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAExB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAMG,MAAAA,CAAM,aAAA,CAAc,UAAA,EAAY;AAAA,MAChD,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD;AAAA,GACF;AACF,CAAA;AC1IO,SAAS,WAAA,CACd,UACA,KAAA,EACG;AACH,EAAA,MAAM,aAAaE,MAAAA,EAAuB;AAE1C,EAAA,OAAOC,WAAAA;AAAA,IACJ,IAAI,IAAA,KAAwB;AAC3B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,MACjC;AAEA,MAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,QAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,MAClB,GAAG,KAAK,CAAA;AAAA,IACV,CAAA;AAAA,IACA,CAAC,UAAU,KAAK;AAAA,GAClB;AACF;ACoDO,IAAM,SAAA,GAA+C,KAAK,CAAC;AAAA,EAChE,aAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,WAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,gBAAgB,EAAC;AAAA,EACjB,SAAA,GAAY,OAAA;AAAA,EACZ,aAAA,GAAgB,EAAA;AAAA,EAChB,YAAA;AAAA,EACA,qBAAA,GAAwB,IAAA;AAAA,EACxB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,UAAA,GAAaC,OAAAA;AAAA,IACjB,MAAM,CAAC,MAAA,CAAO,aAAa,GAAG,IAAA,EAAK,EAAG,OAAO,CAAA;AAAA,IAC7C,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,cAAA,EAAgB,MAAA,KAAW,WAAA,CAAY;AAAA,IAChE,SAAA;AAAA,IACA,UAAA;AAAA,IACA,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,EAAE,UAAA,EAAAC,WAAAA,EAAY,WAAA,KAAgB,oBAAA,CAAqB;AAAA,IACvD,aAAa,WAAA,IAAe,CAAA;AAAA,IAC5B,YAAY,UAAA,IAAc,CAAA;AAAA,IAC1B,WAAA,EAAa,aAAA,EAAe,YAAA,CAAa,YAAY,CAAA,IAAK,gBAAA;AAAA,IAC1D,OAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,oBAAoB,aAAA,CAAc,kBAAA;AAAA,IAClC,eAAe,aAAA,CAAc,aAAA;AAAA,IAC7B,iBAAiB,aAAA,CAAc,eAAA;AAAA,IAC/B,WAAW,aAAA,CAAc;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,kBAAkB,OAAO,eAAA,KAAoB,WAAW,eAAA,GAAkB,EAAE,WAAW,gBAAA,EAAiB;AAC9G,EAAA,MAAM,aAAA,GAAgB,gBAAA,EAAkB,QAAA,CAAS,2BAA2B,CAAA;AAI5E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIT,QAAAA;AAAA,IAAyB,MAC/C,aAAA,GAAgB,aAAA,CAAc,qBAAA,EAAsB,GAAI;AAAA,GAC1D;AAGA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA;AAC/C,EAAA,MAAM,kBAAA,GAAqBM,OAAO,eAAe,CAAA;AACjD,EAAAL,UAAU,MAAM;AAAE,IAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAAA,EAAiB,CAAC,CAAA;AAGjE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,WAAA,CAAY,aAAa,aAAa,CAAA;AACtC,IAAA,aAAA,CAAc,cAAA,CAAe,EAAE,QAAA,EAAU,QAAA,EAAU,OAAO,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA;AACvF,IAAA,OAAA,CAAQ,aAAA,CAAc,uBAAuB,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,aAAA,EAAe,WAAW,CAAC,CAAA;AAG/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,OAAA,CAAQ,aAAA,CAAc,uBAAuB,CAAA;AAC7C,MAAA,kBAAA,CAAmB,OAAA,EAAQ;AAAA,IAC7B,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAAA,IACjD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,IAAA,EAAM,OAAO,IAAA;AAEpC,EAAA,uBACEE,IAAAA,CAAAO,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA,CAAc,kBAAA,KAAuB,KAAA,oBAASR,GAAAA,CAACO,aAAA,EAAW,CAAA;AAAA,oBAE3DP,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAC,eAAA;AAAA,QAChB,SAAA,EAAW,wBAAwB,MAAA,GAAS;AAAA;AAAA,KAC9C;AAAA,IAEC,mCACCA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,IAAA;AAAA,QACZ,eAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IAID,aAAA,IAAiB,aAAA,CAAc,EAAA,oBAC9BA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,aAAA,EACI,GAAA,CAAI,MAAA,CAAO,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,EAQnC,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,wBAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAa,WAAA,CAAY,WAAA;AAAA,QACzB,YAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EAEF,CAAA;AAEJ,CAAC,CAAA;ACtNM,IAAM,OAA4B,CAAC;AAAA,EACxC,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,KAAA;AAAA,EACf,gBAAgB,EAAC;AAAA,EACjB,SAAA,GAAY,OAAA;AAAA,EACZ,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA,GAAwB;AAC1B,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,OAAO,WAAA,EAAa,QAAA,EAAU,MAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS,GAAI,OAAA,EAAQ;AAC7E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIF,SAAyB,IAAI,CAAA;AAGvE,EAAA,MAAM,qBAAqB,aAAA,CAAc,kBAAA;AACzC,EAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,aAAA,EAAe,KAAA,IAAS,yDAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,aAAA,EAAe,GAAA,IAAO,aAAA;AAG5D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,QAAA,QAAA,EAAS;AAAG,QAAA;AAAA,MAAQ;AAG9C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,OAAA,IAAW,MAAA,CAAO,OAAA,KAAY,cAAc,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,iBAAA,EAAmB;AAE5H,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,CAAE,QAAQ,WAAA,EAAa;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAA,MAAG,WAC1E,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAA,MAAG;AAAA,IACvF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,GAAG,CAAC,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AAEnC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,kBAAA,KAAuB,KAAA,EAAO;AAG/C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,YAAA,CAAa,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAC1C,IAAA,YAAA,CAAa,YAAA,CAAa,aAAa,QAAQ,CAAA;AAC/C,IAAA,YAAA,CAAa,YAAA,CAAa,eAAe,MAAM,CAAA;AAC/C,IAAA,YAAA,CAAa,SAAA,GAAY,SAAA;AACzB,IAAA,YAAA,CAAa,WAAA,GAAc,iBAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAGtC,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,IAAI,YAAA,CAAa,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACtE,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,IAAI,YAAA,CAAa,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAGpE,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,MAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACnC,MAAA,KAAA,CAAM,YAAA,CAAa,aAAa,QAAQ,CAAA;AACxC,MAAA,KAAA,CAAM,YAAA,CAAa,eAAe,MAAM,CAAA;AACxC,MAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAClB,MAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAE/B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxD,GAAG,GAAI,CAAA;AAAA,IACT,CAAA;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,kBAAA,EAAoB,iBAAA,EAAmB,eAAe,CAAC,CAAA;AAErE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,MAAMU,gBAAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,IAAA,IAAI,CAACA,gBAAAA,EAAiB;AAGtB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,IAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,QAAA,CAAS,aAAA,CAAcA,gBAAAA,CAAgB,QAAQ,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAWA,iBAAgB,OAAA,EAAS;AAClC,MAAAA,gBAAAA,CAAgB,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AACnC,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAcA,gBAAAA,CAAgB,QAAQ,CAAA;AAC1D,UAAA,gBAAA,CAAiB,EAAE,CAAA;AAAA,QACrB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAEf,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAM;AAAE,MAAA,OAAA,GAAU,KAAA;AAAA,IAAO,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,EAAa,KAAK,CAAC,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,MAAM,WAAW,CAAA;AACzC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,EAAiB,OAAO,IAAA;AAI1C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,KAAA,CAAM,MAAA,GAAS,CAAA;AAClD,IAAA,OAAO,YAAA;AAAA,sBACLR,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAR,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iCAAA;AAAA,YACV,OAAA,EAAS,wBAAwB,QAAA,GAAW,MAAA;AAAA,YAC5C,IAAA,EAAK,cAAA;AAAA,YACL,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACb,QAAA,kBAAAC,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kCAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,MAAA;AAAA,YACX,YAAA,EAAW,uBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,OAAE,SAAA,EAAU,cAAA,EAAe,OAAO,EAAE,OAAA,EAAS,GAAA,EAAI,EAAG,QAAA,EAAA,qCAAA,EAErD,CAAA;AAAA,8BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,YAAO,OAAA,EAAS,QAAA,EAAU,WAAU,mCAAA,EAAoC,YAAA,EAAW,aAAY,QAAA,EAAA,MAAA,EAEhG,CAAA;AAAA,gBACC,CAAC,UAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU,iCAAA,EAAkC,YAAA,EAAW,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAEhG;AAAA,eAAA,EAEJ;AAAA;AAAA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AAAA,oBACLA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,SAAA,EAAW,gBAAgB,SAAA,IAAa,QAAA;AAAA,QACxC,OAAO,eAAA,CAAgB,KAAA;AAAA,QACvB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,QAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,aAAa,WAAA,KAAgB,CAAA;AAAA,QAC7B,UAAA,EAAY,WAAA,KAAgB,KAAA,CAAM,MAAA,GAAS,CAAA;AAAA,QAC3C,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,wBAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAY,KAAA,CAAM,MAAA;AAAA,QAClB,aAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF","file":"index.mjs","sourcesContent":["// AUTO-GENERATED — do not edit. Run `npm run build` to regenerate.\nconst __tourStyles__ = `@layer react-product-tour {\n\n:root {\n /* Tour Component Colors */\n --tour--overlay--background: rgba(0, 0, 0, 0.5);\n --tour--tooltip--background: white;\n --tour--tooltip--border: #e5e7eb;\n --tour--tooltip--text: black;\n --tour--tooltip--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n\n /* Tour Component Spacing */\n --tour--tooltip--padding: 1rem;\n --tour--tooltip--gap: 0.5rem;\n\n /* Tour Component Border */\n --tour--tooltip--radius: 0.5rem;\n --tour--tooltip--border-width: 1px;\n\n /* Tour Component Animation */\n --tour--tooltip--transition: all 0.2s ease-in-out;\n\n /* Tour Highlight */\n --tour--highlight--padding: 8px;\n --tour--highlight--radius: 10px;\n\n /* Tour Button Colors */\n --tour--button--primary--background: #646cff;\n --tour--button--primary--text: white;\n --tour--button--secondary--background: #e5e7eb;\n --tour--button--secondary--text: #374151;\n\n /* Tour Tooltip Size */\n --tour--tooltip--max-width: 300px;\n\n /* Tour Progress Bar */\n --tour--progress--background: #e5e7eb;\n --tour--progress--fill: #f43f5e;\n}\n\n/* Dark mode variables */\n.dark {\n --tour--tooltip--background: #1f2937;\n --tour--tooltip--border: #374151;\n --tour--tooltip--text: #f9fafb;\n}\n\n/* Screen reader utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus styles */\n.tour-button:focus-visible {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.tour-button:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .tour-button {\n border: 2px solid currentColor;\n }\n\n .tour-tooltip {\n border: 2px solid currentColor;\n }\n\n .tour-highlight {\n border: 2px solid currentColor;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .tour-tooltip,\n .tour-highlight,\n .tour-overlay,\n .tour-button {\n animation: none !important;\n transition: none !important;\n }\n}\n\n/* Base tooltip styles */\n.tour-tooltip {\n position: absolute;\n background-color: var(--tour--tooltip--background);\n color: var(--tour--tooltip--text);\n padding: var(--tour--tooltip--padding);\n border-radius: var(--tour--tooltip--radius);\n box-shadow: var(--tour--tooltip--shadow);\n max-width: var(--tour--tooltip--max-width);\n z-index: 1001;\n opacity: 0;\n border: var(--tour--tooltip--border-width) solid var(--tour--tooltip--border);\n}\n\n/* Allow Tailwind classes to override base styles */\n.tour-tooltip[class*=\"bg-\"] {\n background-color: inherit;\n}\n\n.tour-tooltip[class*=\"text-\"] {\n color: inherit;\n}\n\n.tour-tooltip[class*=\"border-\"] {\n border-color: inherit;\n}\n\n.tour-tooltip[class*=\"rounded-\"] {\n border-radius: inherit;\n}\n\n.tour-tooltip[class*=\"shadow-\"] {\n box-shadow: inherit;\n}\n\n.tour-tooltip[class*=\"p-\"] {\n padding: inherit;\n}\n\n/* Animation variants */\n.tour-tooltip[data-animation=\"slide\"] {\n transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"top\"] {\n transform: translateY(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"bottom\"] {\n transform: translateY(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"left\"] {\n transform: translateX(10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"][data-placement=\"right\"] {\n transform: translateX(-10px) scale(0.95);\n}\n\n.tour-tooltip[data-animation=\"slide\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"bounce\"] {\n transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55), opacity 0.3s ease-in-out;\n transform-origin: center;\n transform: scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"top\"] {\n transform: translateY(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"bottom\"] {\n transform: translateY(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"left\"] {\n transform: translateX(20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"][data-placement=\"right\"] {\n transform: translateX(-20px) scale(0.3);\n}\n\n.tour-tooltip[data-animation=\"bounce\"].visible {\n opacity: 1;\n transform: scale(1) translate(0, 0);\n}\n\n.tour-tooltip[data-animation=\"fade\"] {\n transition: all 0.4s ease-out;\n transform: translateY(10px);\n opacity: 0;\n}\n\n.tour-tooltip[data-animation=\"fade\"].visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.tour-tooltip-title {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--tour--tooltip--text);\n line-height: 1.3;\n}\n\n.tour-tooltip-content {\n margin-bottom: 1rem;\n}\n\n.tour-buttons {\n display: flex;\n gap: var(--tour--tooltip--gap);\n justify-content: flex-end;\n}\n\n/* 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.
|
|
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
|
|
96
|
+
"url": "https://github.com/guestDI/react-tour.git"
|
|
97
97
|
},
|
|
98
98
|
"bugs": {
|
|
99
|
-
"url": "https://github.com/guestDI/react-tour
|
|
99
|
+
"url": "https://github.com/guestDI/react-tour/issues"
|
|
100
100
|
},
|
|
101
|
-
"homepage": "https://github.com/guestDI/react-tour
|
|
101
|
+
"homepage": "https://github.com/guestDI/react-tour#readme",
|
|
102
102
|
"engines": {
|
|
103
103
|
"node": ">=18.0.0"
|
|
104
104
|
},
|