@syntrologie/adapt-overlays 2.15.0 → 2.17.0
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/dist/chunk-VHAA22YE.js +14 -0
- package/dist/chunk-VHAA22YE.js.map +7 -0
- package/dist/runtime.d.ts +2 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2596 -354
- package/dist/runtime.js.map +7 -0
- package/dist/schema.d.ts +90 -21
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +440 -151
- package/dist/schema.js.map +7 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -22
- package/dist/WorkflowTracker.d.ts +0 -10
- package/dist/WorkflowTracker.d.ts.map +0 -1
- package/dist/WorkflowTracker.js +0 -19
- package/dist/WorkflowWidget.d.ts +0 -70
- package/dist/WorkflowWidget.d.ts.map +0 -1
- package/dist/WorkflowWidget.js +0 -330
- package/dist/WorkflowWidgetLit.js +0 -617
- package/dist/cdn.d.ts +0 -35
- package/dist/cdn.d.ts.map +0 -1
- package/dist/cdn.js +0 -39
- package/dist/celebrations/__tests__/engine.test.js +0 -130
- package/dist/celebrations/__tests__/executor.test.js +0 -102
- package/dist/celebrations/__tests__/reduced-motion.test.js +0 -97
- package/dist/celebrations/effects/__tests__/confetti.test.js +0 -89
- package/dist/celebrations/effects/__tests__/emoji-rain.test.js +0 -88
- package/dist/celebrations/effects/__tests__/fireworks.test.js +0 -87
- package/dist/celebrations/effects/__tests__/sparkles.test.js +0 -79
- package/dist/celebrations/effects/confetti.js +0 -80
- package/dist/celebrations/effects/emoji-rain.js +0 -73
- package/dist/celebrations/effects/fireworks.js +0 -69
- package/dist/celebrations/effects/sparkles.js +0 -83
- package/dist/celebrations/engine.js +0 -93
- package/dist/celebrations/index.js +0 -73
- package/dist/celebrations/types.js +0 -1
- package/dist/editor.d.ts +0 -27
- package/dist/editor.d.ts.map +0 -1
- package/dist/editor.js +0 -22
- package/dist/executors/tour.js +0 -335
- package/dist/highlight.js +0 -180
- package/dist/modal.js +0 -218
- package/dist/overlay-editor-state.d.ts +0 -41
- package/dist/overlay-editor-state.d.ts.map +0 -1
- package/dist/overlay-editor-state.js +0 -131
- package/dist/overlay-editor-ui.d.ts +0 -9
- package/dist/overlay-editor-ui.d.ts.map +0 -1
- package/dist/overlay-editor-ui.js +0 -306
- package/dist/runtime-lit.d.ts +0 -94
- package/dist/runtime-lit.d.ts.map +0 -1
- package/dist/runtime-lit.js +0 -402
- package/dist/sanitizer.js +0 -84
- package/dist/summarize.js +0 -86
- package/dist/tooltip.js +0 -279
- package/dist/tour-types.js +0 -7
- package/dist/types.js +0 -7
- package/dist/workflow-types.js +0 -1
- package/node_modules/@syntro/design-system/README.md +0 -335
- package/node_modules/@syntro/design-system/dist/assets/syntrologie-logo.svg +0 -21
- package/node_modules/@syntro/design-system/dist/assets/syntrologie-logomark.svg +0 -10
- package/node_modules/@syntro/design-system/dist/index.d.ts +0 -8
- package/node_modules/@syntro/design-system/dist/index.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/index.js +0 -7
- package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts +0 -19
- package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/tailwind-preset.js +0 -455
- package/node_modules/@syntro/design-system/dist/tokens/colors.css +0 -464
- package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts +0 -874
- package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/tokens/colors.js +0 -564
- package/node_modules/@syntro/design-system/dist/tokens/effects.css +0 -43
- package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts +0 -139
- package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/tokens/effects.js +0 -121
- package/node_modules/@syntro/design-system/dist/tokens/index.d.ts +0 -12
- package/node_modules/@syntro/design-system/dist/tokens/index.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/tokens/index.js +0 -11
- package/node_modules/@syntro/design-system/dist/tokens/panel-shell.d.ts +0 -93
- package/node_modules/@syntro/design-system/dist/tokens/panel-shell.d.ts.map +0 -1
- package/node_modules/@syntro/design-system/dist/tokens/panel-shell.js +0 -72
- package/node_modules/@syntro/design-system/package.json +0 -55
- package/node_modules/@syntro/design-system/src/assets/syntrologie-logo.svg +0 -21
- package/node_modules/@syntro/design-system/src/assets/syntrologie-logomark.svg +0 -10
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts +0 -2
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.js +0 -3
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts +0 -34
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.js +0 -161
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts +0 -84
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.js +0 -323
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.js +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.js +0 -55
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts +0 -23
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.js +0 -40
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.js +0 -118
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.js +0 -22
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts +0 -32
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.js +0 -68
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.js +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts +0 -34
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.js +0 -57
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts +0 -13
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.js +0 -31
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts +0 -13
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts +0 -36
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.js +0 -102
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts +0 -20
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.js +0 -48
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts +0 -16
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.js +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.js +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts +0 -66
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.js +0 -87
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.js +0 -390
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts +0 -66
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.js +0 -528
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.js +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts +0 -41
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.js +0 -63
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.js +0 -17
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts +0 -55
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.js +0 -92
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts +0 -32
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.js +0 -85
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts +0 -90
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.js +0 -242
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts +0 -6
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts +0 -12
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.js +0 -21
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.js +0 -5
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts +0 -21
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.js +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts +0 -12
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.js +0 -40
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts +0 -28
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.js +0 -121
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts +0 -110
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.js +0 -476
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts +0 -26
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.js +0 -202
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.js +0 -46
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts +0 -24
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.js +0 -86
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts +0 -36
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.js +0 -26
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.js +0 -14
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.js +0 -68
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts +0 -22
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.js +0 -143
- package/node_modules/@syntrologie/shared-editor-ui/package.json +0 -55
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/celebrations/effects/confetti.ts", "../src/celebrations/effects/emoji-rain.ts", "../src/celebrations/effects/fireworks.ts", "../src/celebrations/effects/sparkles.ts", "../src/celebrations/engine.ts", "../src/celebrations/index.ts", "../src/executors/tour.ts", "../../../design-system/dist/tokens/colors.js", "../../../design-system/dist/tokens/panel-shell.js", "../src/highlight.ts", "../src/sanitizer.ts", "../src/modal.ts", "../src/tooltip.ts", "../src/WorkflowWidgetLit.ts", "../src/runtime.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CelebrationConfig, CelebrationEffect, Particle } from '../types';\n\nconst INTENSITY_COUNTS = { light: 50, medium: 100, heavy: 200 } as const;\n\nconst DEFAULT_COLORS = [\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ffff00',\n '#ff00ff',\n '#00ffff',\n '#ff8800',\n '#8800ff',\n];\n\nexport const confettiEffect: CelebrationEffect = {\n init(width: number, height: number, config: CelebrationConfig): Particle[] {\n const count = INTENSITY_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : DEFAULT_COLORS;\n const particles: Particle[] = [];\n\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * -height * 0.3,\n vx: (Math.random() - 0.5) * 4,\n vy: Math.random() * 2 + 1,\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.2,\n size: Math.random() * 6 + 4,\n color: colors[Math.floor(Math.random() * colors.length)],\n opacity: 1,\n shape: Math.random() > 0.5 ? 'rect' : 'circle',\n });\n }\n\n return particles;\n },\n\n update(particles: Particle[], _dt: number, _elapsed: number): boolean {\n let anyVisible = false;\n\n for (const p of particles) {\n // Gravity\n p.vy += 0.15;\n // Air resistance\n p.vx *= 0.99;\n // Movement\n p.x += p.vx;\n p.y += p.vy;\n // Rotation\n p.rotation += p.rotationSpeed;\n // Fade when past 80% of a typical viewport height (use a reasonable default)\n if (p.y > 0 && p.opacity > 0) {\n // Gradually fade based on how far the particle has traveled\n if (p.y > 500) {\n p.opacity -= 0.02;\n if (p.opacity < 0) p.opacity = 0;\n }\n }\n\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n\n return anyVisible;\n },\n\n render(ctx: CanvasRenderingContext2D, particles: Particle[]): void {\n for (const p of particles) {\n if (p.opacity < 0.01) continue;\n\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.translate(p.x, p.y);\n ctx.rotate(p.rotation);\n\n if (p.shape === 'circle') {\n ctx.beginPath();\n ctx.arc(0, 0, p.size / 2, 0, Math.PI * 2);\n ctx.fill();\n } else {\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6);\n }\n\n ctx.restore();\n }\n },\n};\n", "import type { CelebrationConfig, CelebrationEffect, Particle } from '../types';\n\nconst INTENSITY_COUNTS = { light: 20, medium: 40, heavy: 80 } as const;\nconst DEFAULT_EMOJI = '\uD83C\uDF89';\n\nexport const emojiRainEffect: CelebrationEffect = {\n init(width: number, _height: number, config: CelebrationConfig): Particle[] {\n const count = INTENSITY_COUNTS[config.intensity];\n const emoji = typeof config.props?.emoji === 'string' ? config.props.emoji : DEFAULT_EMOJI;\n const particles: Particle[] = [];\n\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * -200,\n vx: 0,\n vy: Math.random() * 1.5 + 1,\n rotation: 0,\n rotationSpeed: 0,\n size: Math.random() * 12 + 16,\n color: '#000000',\n opacity: 1,\n shape: 'emoji',\n emoji,\n data: {\n /** Phase offset for horizontal wobble */\n wobblePhase: Math.random() * Math.PI * 2,\n /** Amplitude of horizontal wobble */\n wobbleAmp: Math.random() * 1.5 + 0.5,\n /** Original x for wobble base */\n originX: 0,\n },\n });\n }\n\n // Store originX after x is set\n for (const p of particles) {\n if (p.data) p.data.originX = p.x;\n }\n\n return particles;\n },\n\n update(particles: Particle[], _dt: number, elapsed: number): boolean {\n let anyVisible = false;\n\n for (const p of particles) {\n // Fall downward\n p.y += p.vy;\n\n // Horizontal wobble via sine wave\n const phase = p.data?.wobblePhase ?? 0;\n const amp = p.data?.wobbleAmp ?? 1;\n const originX = p.data?.originX ?? p.x;\n p.x = originX + Math.sin(elapsed * 0.003 + phase) * amp * 20;\n\n // Fade when past bottom of viewport\n if (p.y > 600) {\n p.opacity -= 0.02;\n if (p.opacity < 0) p.opacity = 0;\n }\n\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n\n return anyVisible;\n },\n\n render(ctx: CanvasRenderingContext2D, particles: Particle[]): void {\n for (const p of particles) {\n if (p.opacity < 0.01 || !p.emoji) continue;\n\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.font = `${p.size}px serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(p.emoji, p.x, p.y);\n ctx.restore();\n }\n },\n};\n", "import type { CelebrationConfig, CelebrationEffect, Particle } from '../types';\n\nconst PARTICLES_PER_BURST = { light: 20, medium: 40, heavy: 80 } as const;\nconst BURST_COUNTS = { light: 3, medium: 4, heavy: 5 } as const;\n\nexport const fireworksEffect: CelebrationEffect = {\n init(width: number, height: number, config: CelebrationConfig): Particle[] {\n const perBurst = PARTICLES_PER_BURST[config.intensity];\n const burstCount = BURST_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : ['#ff4444', '#44ff44', '#4444ff'];\n const particles: Particle[] = [];\n\n for (let b = 0; b < burstCount; b++) {\n const cx = Math.random() * width * 0.8 + width * 0.1;\n const cy = Math.random() * height * 0.6;\n const burstColor = colors[Math.floor(Math.random() * colors.length)];\n\n for (let i = 0; i < perBurst; i++) {\n const angle = (Math.PI * 2 * i) / perBurst + (Math.random() - 0.5) * 0.3;\n const speed = Math.random() * 3 + 2;\n\n particles.push({\n x: cx,\n y: cy,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n rotation: 0,\n rotationSpeed: 0,\n size: Math.random() * 3 + 2,\n color: burstColor,\n opacity: 1,\n shape: 'circle',\n data: { centerX: cx, centerY: cy },\n });\n }\n }\n\n return particles;\n },\n\n update(particles: Particle[], _dt: number, _elapsed: number): boolean {\n let anyVisible = false;\n\n for (const p of particles) {\n // Deceleration\n p.vx *= 0.97;\n p.vy *= 0.97;\n // Slight gravity\n p.vy += 0.03;\n // Movement\n p.x += p.vx;\n p.y += p.vy;\n // Fade over time\n p.opacity -= 0.008;\n if (p.opacity < 0) p.opacity = 0;\n\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n\n return anyVisible;\n },\n\n render(ctx: CanvasRenderingContext2D, particles: Particle[]): void {\n for (const p of particles) {\n if (p.opacity < 0.01) continue;\n\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.shadowBlur = 12;\n ctx.shadowColor = p.color;\n\n ctx.beginPath();\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n },\n};\n", "import type { CelebrationConfig, CelebrationEffect, Particle } from '../types';\n\nconst INTENSITY_COUNTS = { light: 30, medium: 60, heavy: 120 } as const;\n\nexport const sparklesEffect: CelebrationEffect = {\n init(width: number, height: number, config: CelebrationConfig): Particle[] {\n const count = INTENSITY_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : ['#ffd700', '#ffffff', '#fffacd'];\n const particles: Particle[] = [];\n\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * height,\n vx: (Math.random() - 0.5) * 0.3,\n vy: -(Math.random() * 0.5 + 0.2),\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.1,\n size: Math.random() * 4 + 2,\n color: colors[Math.floor(Math.random() * colors.length)],\n opacity: Math.random() * 0.5 + 0.5,\n shape: 'circle',\n data: {\n /** Phase offset for sine-wave twinkle */\n phase: Math.random() * Math.PI * 2,\n /** Base opacity before twinkle modulation */\n baseOpacity: Math.random() * 0.5 + 0.5,\n },\n });\n }\n\n return particles;\n },\n\n update(particles: Particle[], _dt: number, elapsed: number): boolean {\n let anyVisible = false;\n\n for (const p of particles) {\n // Gentle upward float\n p.x += p.vx;\n p.y += p.vy;\n p.rotation += p.rotationSpeed;\n\n // Gradually fade out over lifetime\n if (p.data) {\n p.data.baseOpacity = (p.data.baseOpacity ?? 1) - 0.001;\n if (p.data.baseOpacity < 0) p.data.baseOpacity = 0;\n }\n\n // Twinkle \u2014 oscillate opacity with sine wave\n const phase = p.data?.phase ?? 0;\n const baseOpacity = p.data?.baseOpacity ?? 1;\n if (baseOpacity <= 0.01) {\n p.opacity = 0;\n } else {\n const twinkle = Math.sin(elapsed * 0.005 + phase) * 0.4 + 0.6;\n p.opacity = baseOpacity * twinkle;\n }\n\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n\n return anyVisible;\n },\n\n render(ctx: CanvasRenderingContext2D, particles: Particle[]): void {\n for (const p of particles) {\n if (p.opacity < 0.01) continue;\n\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.translate(p.x, p.y);\n ctx.rotate(p.rotation);\n\n // Draw a 4-point diamond/star shape\n const s = p.size;\n ctx.beginPath();\n ctx.moveTo(0, -s);\n ctx.lineTo(s * 0.3, -s * 0.3);\n ctx.lineTo(s, 0);\n ctx.lineTo(s * 0.3, s * 0.3);\n ctx.lineTo(0, s);\n ctx.lineTo(-s * 0.3, s * 0.3);\n ctx.lineTo(-s, 0);\n ctx.lineTo(-s * 0.3, -s * 0.3);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n }\n },\n};\n", "import type { CelebrationConfig, CelebrationEffect, Particle } from './types';\n\nexport class CelebrationEngine {\n private canvas: HTMLCanvasElement | null = null;\n private ctx: CanvasRenderingContext2D | null = null;\n private rafId: number | null = null;\n private particles: Particle[] = [];\n private startTime = 0;\n private lastFrame = 0;\n private duration = 0;\n private effect: CelebrationEffect | null = null;\n private container: HTMLElement | null = null;\n\n start(container: HTMLElement, effect: CelebrationEffect, config: CelebrationConfig): void {\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n return;\n }\n\n this.container = container;\n this.effect = effect;\n this.duration = config.duration;\n\n // Create fullscreen canvas\n const canvas = document.createElement('canvas');\n canvas.setAttribute('data-syntro-celebrate', '');\n Object.assign(canvas.style, {\n position: 'fixed',\n inset: '0',\n pointerEvents: 'none',\n zIndex: '2147483646',\n });\n\n const dpr = window.devicePixelRatio || 1;\n const width = window.innerWidth;\n const height = window.innerHeight;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.scale(dpr, dpr);\n\n this.canvas = canvas;\n this.ctx = ctx;\n container.appendChild(canvas);\n\n // Initialize particles\n this.particles = effect.init(width, height, config);\n this.startTime = performance.now();\n this.lastFrame = this.startTime;\n\n // Start animation loop\n this.tick = this.tick.bind(this);\n this.rafId = requestAnimationFrame(this.tick);\n }\n\n stop(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.canvas && this.container) {\n this.canvas.remove();\n this.canvas = null;\n }\n this.ctx = null;\n this.effect = null;\n this.container = null;\n this.particles = [];\n }\n\n private tick(now: number): void {\n if (!this.ctx || !this.canvas || !this.effect) return;\n\n const elapsed = now - this.startTime;\n const dt = now - this.lastFrame;\n this.lastFrame = now;\n\n // Auto-stop after duration\n if (elapsed >= this.duration) {\n this.stop();\n return;\n }\n\n // Clear canvas\n const width = this.canvas.width / (window.devicePixelRatio || 1);\n const height = this.canvas.height / (window.devicePixelRatio || 1);\n this.ctx.clearRect(0, 0, width, height);\n\n // Update physics \u2014 stop if all particles are done\n const alive = this.effect.update(this.particles, dt, elapsed);\n if (!alive) {\n this.stop();\n return;\n }\n\n // Render\n this.effect.render(this.ctx, this.particles);\n\n // Next frame\n this.rafId = requestAnimationFrame(this.tick);\n }\n}\n", "import type { ActionExecutor, CelebrateAction, ExecutorResult } from '../types';\nimport { confettiEffect } from './effects/confetti';\nimport { emojiRainEffect } from './effects/emoji-rain';\nimport { fireworksEffect } from './effects/fireworks';\nimport { sparklesEffect } from './effects/sparkles';\nimport { CelebrationEngine } from './engine';\nimport type { CelebrationConfig, CelebrationEffect } from './types';\n\nconst FALLBACK_COLORS = [\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ffff00',\n '#ff00ff',\n '#00ffff',\n '#ff8800',\n '#8800ff',\n];\n\n/**\n * Build a celebration palette from the theme's primary/hover colors.\n * Returns 6 color variants (solid, transparent, white accent) for visual variety.\n */\nfunction buildThemePalette(primary: string, hover: string): string[] {\n return [primary, hover, `${primary}cc`, `${hover}cc`, '#ffffff', `${primary}80`];\n}\n\n/**\n * Read --sc-color-primary and --sc-color-primary-hover from the overlay root.\n * Returns a theme palette if both are available, otherwise null.\n */\nfunction readThemeColors(overlayRoot: HTMLElement): string[] | null {\n try {\n const styles = getComputedStyle(overlayRoot);\n const primary = styles.getPropertyValue('--sc-color-primary')?.trim();\n const hover = styles.getPropertyValue('--sc-color-primary-hover')?.trim();\n if (primary?.startsWith('#') && primary.length >= 7) {\n return buildThemePalette(primary, hover || primary);\n }\n } catch {\n /* fallback */\n }\n return null;\n}\n\nconst effectRegistry = new Map<string, CelebrationEffect>([\n ['confetti', confettiEffect],\n ['fireworks', fireworksEffect],\n ['sparkles', sparklesEffect],\n ['emoji-rain', emojiRainEffect],\n]);\n\nexport const executeCelebrate: ActionExecutor<CelebrateAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const effect = effectRegistry.get(action.effect);\n if (!effect) {\n console.warn(\n `[adaptive-overlays] Unknown celebration effect: \"${action.effect}\". Available: ${[...effectRegistry.keys()].join(', ')}`\n );\n return { cleanup: () => {} };\n }\n\n // Colors priority: action.colors > theme palette > hardcoded fallback\n const colors = action.colors ?? readThemeColors(context.overlayRoot) ?? FALLBACK_COLORS;\n\n const config: CelebrationConfig = {\n duration: action.duration ?? 3000,\n intensity: action.intensity ?? 'medium',\n colors,\n props: action.props,\n };\n\n const engine = new CelebrationEngine();\n engine.start(context.overlayRoot, effect, config);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:celebrate',\n effect: action.effect,\n });\n\n return {\n cleanup: () => {\n engine.stop();\n },\n };\n};\n", "/**\n * Tour Executor\n *\n * Orchestrates sequential tour steps with cross-page state persistence.\n * Tours can span multiple pages and resume after navigation.\n *\n * Each step contains an inner action (modal, tooltip) that gets executed.\n * The tour listens for CTA click events to advance to the next step.\n */\n\nimport type { ActionExecutor, ExecutorContext, ExecutorResult } from '@syntrologie/sdk-contracts';\nimport type { TourAction, TourStep } from '../tour-types';\n\n/**\n * Minimal ActionHandle interface for the tour executor.\n * The tour only needs to check if an action is applied and revert it.\n */\ninterface ActionHandle {\n revert: () => Promise<void>;\n isApplied: () => boolean;\n}\n\n/**\n * Extended executor context for composite executors like tours.\n * These optional fields are provided by the runtime's ActionEngine\n * when executing composite actions that need to orchestrate sub-actions.\n */\ninterface TourExecutorContext extends ExecutorContext {\n applyAction?: (action: Record<string, unknown>) => Promise<ActionHandle>;\n subscribeEvent?: (\n name: string,\n callback: (props?: Record<string, unknown>) => void\n ) => () => void;\n subscribeNavigation?: (callback: (url: string, method: string) => void) => () => void;\n}\n\n/** Storage key for active tour state */\nconst ACTIVE_TOUR_KEY = 'syntro_active_tour';\n\n/** Track active tour executors to prevent duplicates */\nconst activeTours = new Map<string, { cleanup: () => Promise<void> }>();\n\n/** Tour state persisted to localStorage */\ninterface TourState {\n tourId: string;\n currentStepId: string;\n startedAt: number;\n}\n\n/**\n * Get active tour state from localStorage\n */\nfunction getTourState(tourId: string): TourState | null {\n try {\n const data = localStorage.getItem(ACTIVE_TOUR_KEY);\n if (!data) return null;\n const state = JSON.parse(data) as TourState;\n // Only return if it matches the requested tour\n if (state.tourId !== tourId) return null;\n return state;\n } catch {\n return null;\n }\n}\n\n/**\n * Save tour state to localStorage\n */\nfunction saveTourState(state: TourState): void {\n try {\n localStorage.setItem(ACTIVE_TOUR_KEY, JSON.stringify(state));\n } catch {\n // Storage may be full or unavailable\n }\n}\n\n/**\n * Clear tour state from localStorage\n */\nfunction clearTourState(): void {\n try {\n localStorage.removeItem(ACTIVE_TOUR_KEY);\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Get current route/path\n */\nfunction getCurrentRoute(): string {\n return window.location.pathname;\n}\n\n/**\n * Check if a step matches the current route\n */\nfunction stepMatchesRoute(step: TourStep): boolean {\n if (!step.route) return true;\n const currentRoute = getCurrentRoute();\n // Simple pattern matching - step.route can be exact path or glob pattern\n if (step.route.includes('*')) {\n const pattern = new RegExp(`^${step.route.replace(/\\*/g, '.*')}$`);\n return pattern.test(currentRoute);\n }\n return currentRoute === step.route;\n}\n\n/**\n * Execute a tour action\n *\n * Tours orchestrate a sequence of steps, persisting state to localStorage\n * to support cross-page navigation. Each step contains an action to execute\n * and optionally defines transitions based on action events.\n */\nexport const executeTour: ActionExecutor<TourAction> = async (\n action,\n context: TourExecutorContext\n): Promise<ExecutorResult> => {\n const { tourId, steps, startStep, autoStart = true } = action;\n\n if (steps.length === 0) {\n throw new Error(`Tour \"${tourId}\" has no steps`);\n }\n\n // Self-guard: if this tour is already running, return no-op\n // This prevents duplicate modals when applyBatch is called multiple times\n if (activeTours.has(tourId)) {\n return {\n cleanup: async () => {\n // Delegate to the original tour's cleanup\n const existing = activeTours.get(tourId);\n if (existing) {\n await existing.cleanup();\n }\n },\n };\n }\n\n // Check if we can execute inner actions\n if (!context.applyAction) {\n throw new Error('Tour executor requires applyAction in context');\n }\n\n // Get or initialize tour state\n let state = getTourState(tourId);\n const isResumingTour = !!state;\n\n // If not resuming and autoStart is false, don't start the tour\n if (!isResumingTour && !autoStart) {\n return {\n cleanup: () => {},\n };\n }\n\n if (!state) {\n state = {\n tourId,\n currentStepId: startStep || steps[0].id,\n startedAt: Date.now(),\n };\n saveTourState(state);\n }\n\n // Find the current step\n let currentStepIndex = steps.findIndex((s) => s.id === state!.currentStepId);\n if (currentStepIndex === -1) {\n // Step not found, use startStep or first step\n const initialStepId = startStep || steps[0].id;\n currentStepIndex = steps.findIndex((s) => s.id === initialStepId);\n if (currentStepIndex === -1) currentStepIndex = 0;\n state.currentStepId = steps[currentStepIndex].id;\n saveTourState(state);\n }\n\n const currentStep = steps[currentStepIndex];\n\n // Check if current step matches the route\n if (!stepMatchesRoute(currentStep)) {\n // Current page doesn't match this step's route\n // Tour is \"waiting\" for navigation to the correct page\n context.publishEvent('tour.waiting_for_route', {\n tourId,\n stepId: currentStep.id,\n expectedRoute: currentStep.route,\n currentRoute: getCurrentRoute(),\n });\n\n // Return a no-op that cleans up when tour ends\n return {\n cleanup: () => {},\n };\n }\n\n // Track state\n let isDestroyed = false;\n let currentActionHandle: ActionHandle | null = null;\n let eventUnsubscribe: (() => void) | null = null;\n let routeWatcher: (() => void) | null = null;\n\n /**\n * Clean up current step\n */\n const cleanupCurrentStep = async () => {\n if (eventUnsubscribe) {\n eventUnsubscribe();\n eventUnsubscribe = null;\n }\n if (currentActionHandle?.isApplied()) {\n await currentActionHandle.revert();\n currentActionHandle = null;\n }\n };\n\n /**\n * Advance to the next step\n */\n const advanceToStep = async (nextStepId: string | 'end') => {\n if (isDestroyed) return;\n\n // Clean up current step\n await cleanupCurrentStep();\n\n if (nextStepId === 'end') {\n // Tour complete\n clearTourState();\n context.publishEvent('tour.completed', {\n tourId,\n totalSteps: steps.length,\n });\n isDestroyed = true;\n return;\n }\n\n // Find next step\n const nextStep = steps.find((s) => s.id === nextStepId);\n if (!nextStep) {\n console.error(`[Tour] Step \"${nextStepId}\" not found`);\n return;\n }\n\n // Update state\n state!.currentStepId = nextStepId;\n saveTourState(state!);\n\n context.publishEvent('tour.step_changed', {\n tourId,\n previousStepId: currentStep.id,\n nextStepId,\n });\n\n // If the next step has a different route, let navigation happen\n if (nextStep.route && nextStep.route !== getCurrentRoute()) {\n context.publishEvent('tour.awaiting_navigation', {\n tourId,\n stepId: nextStepId,\n targetRoute: nextStep.route,\n });\n // Tour will resume when page reloads and this executor runs again\n return;\n }\n\n // Execute the next step's action\n await executeStep(nextStep);\n };\n\n /**\n * Execute a step's inner action and set up event listeners\n */\n const executeStep = async (step: TourStep) => {\n if (isDestroyed) return;\n\n context.publishEvent('tour.step_started', {\n tourId,\n stepId: step.id,\n stepIndex: steps.findIndex((s) => s.id === step.id),\n totalSteps: steps.length,\n });\n\n // Execute the inner action\n try {\n currentActionHandle = await context.applyAction!(step.action);\n } catch (error) {\n console.error(`[Tour] Failed to execute step \"${step.id}\":`, error);\n context.publishEvent('tour.step_failed', {\n tourId,\n stepId: step.id,\n error: String(error),\n });\n return;\n }\n\n // Subscribe to CTA click events if there are transitions defined\n if (step.onAction && context.subscribeEvent) {\n eventUnsubscribe = context.subscribeEvent('action.modal_cta_clicked', (props) => {\n const actionId = props?.actionId as string;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n\n // Also listen for tooltip CTA clicks\n const tooltipUnsubscribe = context.subscribeEvent('action.tooltip_cta_clicked', (props) => {\n const actionId = props?.actionId as string;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n\n // Combine unsubscribes\n const originalUnsubscribe = eventUnsubscribe;\n eventUnsubscribe = () => {\n originalUnsubscribe();\n tooltipUnsubscribe();\n };\n }\n };\n\n // Set up route change watcher for SPAs\n const setupRouteWatcher = () => {\n let lastPath = getCurrentRoute();\n\n const checkRoute = () => {\n const currentPath = getCurrentRoute();\n if (currentPath !== lastPath) {\n lastPath = currentPath;\n context.publishEvent('tour.route_changed', {\n tourId,\n newRoute: currentPath,\n });\n }\n };\n\n // Use NavigationMonitor if available (single patch point),\n // otherwise fall back to direct History API patching (legacy)\n if (context.subscribeNavigation) {\n return context.subscribeNavigation(() => checkRoute());\n }\n\n // Legacy: direct History API patching\n window.addEventListener('popstate', checkRoute);\n\n const origPushState = history.pushState.bind(history);\n const origReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args) => {\n origPushState(...args);\n queueMicrotask(checkRoute);\n };\n\n history.replaceState = (...args) => {\n origReplaceState(...args);\n queueMicrotask(checkRoute);\n };\n\n return () => {\n window.removeEventListener('popstate', checkRoute);\n history.pushState = origPushState;\n history.replaceState = origReplaceState;\n };\n };\n\n routeWatcher = setupRouteWatcher();\n\n // Publish tour started/resumed event\n if (!isResumingTour) {\n context.publishEvent('tour.started', {\n tourId,\n totalSteps: steps.length,\n startStepId: state.currentStepId,\n });\n } else {\n context.publishEvent('tour.resumed', {\n tourId,\n stepId: state.currentStepId,\n });\n }\n\n // Execute the current step\n await executeStep(currentStep);\n\n // Create cleanup function\n const cleanup = async () => {\n isDestroyed = true;\n\n // Remove from active tours\n activeTours.delete(tourId);\n\n await cleanupCurrentStep();\n\n if (routeWatcher) {\n routeWatcher();\n }\n\n // Don't clear tour state on cleanup - allow resume\n context.publishEvent('tour.paused', {\n tourId,\n stepId: state!.currentStepId,\n });\n };\n\n // Register this tour as active\n activeTours.set(tourId, { cleanup });\n\n return { cleanup };\n};\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n// ============================================================================\n// BASE COLORS\n// ============================================================================\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n};\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n};\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n};\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n};\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n};\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n};\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n};\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n};\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n};\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n};\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n};\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n};\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n};\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n};\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n};\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n};\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n};\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n};\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: slateGrey[3],\n};\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n};\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n};\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n};\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n};\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n};\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n};\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n};\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n};\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n};\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n};\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n};\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n};\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\nexport const scroll = slateGrey[9];\n// ============================================================================\n// EXPORTS\n// ============================================================================\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n};\nexport default colors;\n", "/**\n * Syntro Design System \u2014 Editor Panel Shell Tokens\n *\n * Single source of truth for the floating editor panel's visuals and behavior.\n * Consumed by:\n * - packages/shared-editor-ui/src/components/EditorPanelShell.tsx (React)\n * - packages/shared-editor-ui/src/controllers/PanelShellController.ts (Lit)\n *\n * Any change here updates both React and Lit panels in one step \u2014 no drift.\n */\nimport { base, brand } from './colors';\n// ============================================================================\n// Panel background & shadows\n// ============================================================================\n/** Dark gradient rendered behind the panel contents (backdrop-blur layered on). */\nexport const panelBackground = 'linear-gradient(160deg, rgba(7,8,10,0.84) 0%, rgba(14,17,20,0.88) 45%, rgba(15,19,24,0.84) 100%)';\n/** Outer shadows for the panel, indexed by dock state. */\nexport const panelShadows = {\n /** Free-floating panel \u2014 shadow all sides. */\n floating: '0 8px 60px rgba(0,0,0,0.5)',\n /** Docked to left \u2014 shadow cast rightward into page. */\n dockedLeft: '20px 0 60px rgba(0,0,0,0.5)',\n /** Docked to right \u2014 shadow cast leftward into page. */\n dockedRight: '-20px 0 60px rgba(0,0,0,0.5)',\n};\n/** Backdrop-filter blur radius applied to the panel surface. */\nexport const panelBackdropBlur = '12px';\n// ============================================================================\n// FAB (floating action button) visuals\n// ============================================================================\nexport const fab = {\n /** Diameter in pixels. */\n size: 56,\n /** Inset from the panel's top-left corner in pixels. */\n inset: 12,\n /** Background color (always the brand black). */\n background: base.black,\n /** Icon / logo color. */\n color: base.white,\n /** Border \u2014 2px brand red ring. */\n border: `2px solid ${brand[3]}`,\n /** Shadow when the panel is open (inner ring for \"active\" state). */\n shadowOpen: '0 4px 24px rgba(0,0,0,0.6), 0 0 0 2px rgba(255,255,255,0.08)',\n /** Shadow when the panel is closed. */\n shadowClosed: '0 4px 24px rgba(0,0,0,0.6)',\n};\n// ============================================================================\n// Behavior: resize, drag, snap\n// ============================================================================\nexport const panelBehavior = {\n /** Minimum panel width when resizing or undocked. */\n minWidth: 480,\n /** Minimum panel height when resizing or undocked. */\n minHeight: 400,\n /** Edge thickness of resize handles in pixels. */\n handleSize: 8,\n /** Pixels the FAB must move before a press becomes a drag (vs a click). */\n dragThreshold: 5,\n /** Distance from a viewport edge that triggers edge-dock snapping. */\n snapThreshold: 20,\n};\n// ============================================================================\n// Aggregate export\n// ============================================================================\nexport const panelShell = {\n background: panelBackground,\n shadows: panelShadows,\n backdropBlur: panelBackdropBlur,\n fab,\n behavior: panelBehavior,\n};\nexport default panelShell;\n", "/**\n * Highlight Overlay\n *\n * Creates a spotlight effect around an element with a scrim backdrop.\n */\n\nimport { blue } from '@syntro/design-system/tokens';\n\nconst supportsPathClip =\n typeof CSS !== 'undefined' && CSS.supports?.('clip-path', \"path('M0 0 H1 V1 Z')\");\n\nexport type HighlightHandle = { destroy(): void };\n\nexport interface HighlightOptions {\n paddingPx?: number;\n radiusPx?: number;\n scrimOpacity?: number;\n ringColor?: string;\n blocking?: boolean;\n onClickOutside?: boolean;\n onEsc?: boolean;\n /** Called when the user actively dismisses (click outside / Esc). NOT called on programmatic destroy(). */\n onDismiss?: () => void;\n}\n\nexport function showHighlight(\n anchorEl: HTMLElement,\n overlayRoot: HTMLElement,\n opts?: HighlightOptions\n): HighlightHandle {\n const padding = opts?.paddingPx ?? 12;\n const radius = opts?.radiusPx ?? 12;\n const opacity = Math.min(Math.max(opts?.scrimOpacity ?? 0.55, 0), 1);\n const ringColor = opts?.ringColor ?? `var(--syntro-ring, ${blue[5]})`;\n const blocking = opts?.blocking ?? false;\n const onClickOutside = opts?.onClickOutside ?? true;\n const onEsc = opts?.onEsc ?? true;\n\n const rootStyles = getComputedStyle(document.documentElement);\n const tokenScrim = rootStyles.getPropertyValue('--syntro-spotlight-backdrop').trim();\n const tokenRing = rootStyles.getPropertyValue('--syntro-ring').trim();\n\n const scrim = document.createElement('div');\n scrim.className = 'syntro-spotlight-scrim';\n const needsPointerEvents = blocking || onClickOutside;\n Object.assign(scrim.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: needsPointerEvents ? 'auto' : 'none',\n background: tokenScrim || `rgba(2, 6, 23, ${opacity})`,\n transition: 'opacity 220ms ease',\n opacity: '0',\n });\n overlayRoot.appendChild(scrim);\n requestAnimationFrame(() => (scrim.style.opacity = '1'));\n\n const ring = document.createElement('div');\n ring.className = 'syntro-spotlight-ring';\n Object.assign(ring.style, {\n position: 'fixed',\n pointerEvents: 'none',\n borderRadius: `${radius}px`,\n border: `2px solid ${ringColor || tokenRing || blue[5]}`,\n boxShadow: `0 0 0 4px rgba(255,255,255,0.35)`,\n zIndex: '2147483647',\n transition: 'all 220ms cubic-bezier(0.16,1,0.3,1)',\n });\n overlayRoot.appendChild(ring);\n\n const fallbackSlices: HTMLDivElement[] = [];\n if (!supportsPathClip) {\n for (let i = 0; i < 4; i++) {\n const slice = document.createElement('div');\n slice.style.position = 'fixed';\n slice.style.background = 'inherit';\n fallbackSlices.push(slice);\n scrim.appendChild(slice);\n }\n }\n\n const setClipPath = (path: string) => {\n scrim.style.clipPath = path;\n (scrim.style as any).webkitClipPath = path;\n };\n\n const update = () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at (0,0).\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const rect = anchorEl.getBoundingClientRect();\n\n // Use unclamped coordinates so the ring and clip-path track the anchor's\n // true position. When the anchor is partially off-screen the browser\n // naturally clips the fixed-position ring at the viewport edge.\n const x = rect.left - padding;\n const y = rect.top - padding;\n const w = rect.width + padding * 2;\n const h = rect.height + padding * 2;\n\n Object.assign(ring.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n });\n\n if (supportsPathClip) {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const r = Math.min(radius, w / 2, h / 2);\n\n const outer = `M 0 0 L ${vw} 0 L ${vw} ${vh} L 0 ${vh} Z`;\n const inner =\n `M ${x + r} ${y} ` +\n `A ${r} ${r} 0 0 0 ${x} ${y + r} ` +\n `L ${x} ${y + h - r} ` +\n `A ${r} ${r} 0 0 0 ${x + r} ${y + h} ` +\n `L ${x + w - r} ${y + h} ` +\n `A ${r} ${r} 0 0 0 ${x + w} ${y + h - r} ` +\n `L ${x + w} ${y + r} ` +\n `A ${r} ${r} 0 0 0 ${x + w - r} ${y} ` +\n `L ${x + r} ${y} ` +\n `Z`;\n\n setClipPath(`path('${outer} ${inner}')`);\n } else {\n const [top, right, bottom, left] = fallbackSlices;\n Object.assign(top.style, {\n left: '0px',\n top: '0px',\n width: '100vw',\n height: `${y}px`,\n });\n Object.assign(bottom.style, {\n left: '0px',\n top: `${y + h}px`,\n width: '100vw',\n height: `${Math.max(0, window.innerHeight - (y + h))}px`,\n });\n Object.assign(left.style, {\n left: '0px',\n top: `${y}px`,\n width: `${x}px`,\n height: `${h}px`,\n });\n Object.assign(right.style, {\n left: `${x + w}px`,\n top: `${y}px`,\n width: `${Math.max(0, window.innerWidth - (x + w))}px`,\n height: `${h}px`,\n });\n }\n };\n\n const ro = new ResizeObserver(() => requestAnimationFrame(update));\n ro.observe(anchorEl);\n const onScroll = () => requestAnimationFrame(update);\n const onResize = () => requestAnimationFrame(update);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onEsc) {\n opts?.onDismiss?.();\n handle.destroy();\n }\n };\n if (onEsc) {\n window.addEventListener('keydown', onKey);\n }\n\n const onClick = (event: MouseEvent) => {\n if (blocking) {\n event.preventDefault();\n event.stopPropagation();\n } else if (onClickOutside) {\n opts?.onDismiss?.();\n handle.destroy();\n }\n };\n scrim.addEventListener('click', onClick);\n\n const handle: HighlightHandle = {\n destroy() {\n ro.disconnect();\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n if (onEsc) {\n window.removeEventListener('keydown', onKey);\n }\n scrim.removeEventListener('click', onClick);\n scrim.style.pointerEvents = 'none';\n scrim.style.opacity = '0';\n setTimeout(() => {\n try {\n scrim.remove();\n } catch {\n /* already detached */\n }\n try {\n ring.remove();\n } catch {\n /* already detached */\n }\n }, 220);\n },\n };\n\n update();\n return handle;\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\n\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n // SVG elements (for inline Lucide icons in config HTML)\n 'svg',\n 'path',\n 'circle',\n 'line',\n 'polyline',\n 'polygon',\n 'rect',\n 'g',\n]);\n\nexport function sanitizeHtml(html: string): string {\n // Try native Sanitizer API first\n const hasNative = typeof (window as any).Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new (window as any).Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n } catch {\n // Fall through to manual sanitizer\n }\n }\n\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tag = el.tagName.toLowerCase();\n\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n\n return tpl.innerHTML;\n}\n", "/**\n * Modal Executor\n *\n * Displays a centered modal dialog with optional CTA buttons.\n * Uses CSS custom properties (var()) directly in inline styles so theming\n * is live \u2014 no timing dependency on when ThemeProvider injects vars.\n */\n\nimport { sanitizeHtml } from './sanitizer';\nimport type { ActionExecutor, ExecutorResult, ModalAction } from './types';\n\n// CSS var shorthands with fallbacks (mirrors tooltip/toast pattern)\nconst V = {\n bg: 'var(--sc-overlay-background, #ffffff)',\n title: 'var(--sc-overlay-title-color, var(--sc-overlay-text-color, #111827))',\n text: 'var(--sc-overlay-text-color, #4b5563)',\n accent: 'var(--sc-color-primary, #4f46e5)',\n radius: 'var(--sc-border-radius, 12px)',\n} as const;\n\n/**\n * Execute a modal action\n */\nexport const executeModal: ActionExecutor<ModalAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const { content, size = 'md', blocking = false, scrim, dismiss, ctaButtons } = action;\n\n // Create scrim backdrop\n const scrimEl = document.createElement('div');\n scrimEl.className = 'syntro-modal-scrim';\n scrimEl.style.cssText = `\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, ${scrim?.opacity ?? 0.6});\n z-index: 2147483645;\n opacity: 0;\n transition: opacity 200ms ease-out;\n `;\n context.overlayRoot.appendChild(scrimEl);\n\n // Create modal container\n const modal = document.createElement('div');\n modal.className = `syntro-modal syntro-modal-${size}`;\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n\n // Size-based max-widths\n const sizeMap = { sm: '360px', md: '480px', lg: '640px' };\n modal.style.cssText = `\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n max-width: ${sizeMap[size]};\n width: 90%;\n background: ${V.bg};\n border-radius: ${V.radius};\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 200ms ease-out, transform 200ms ease-out;\n padding: 24px;\n `;\n\n // Build modal HTML content\n let html = '';\n if (content.title) {\n html += `<h2 class=\"syntro-modal-title\" style=\"margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: ${V.title};\">${sanitizeHtml(content.title)}</h2>`;\n }\n html += `<div class=\"syntro-modal-body\" style=\"color: ${V.text}; line-height: 1.5;\">${sanitizeHtml(content.body)}</div>`;\n\n // Add close button if enabled\n if (dismiss?.closeButton !== false) {\n html += `\n <button class=\"syntro-modal-close\" data-syntro-action=\"dismiss\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${V.text};\n opacity: 0.6;\n \" aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"/>\n </svg>\n </button>\n `;\n }\n\n // Add CTA buttons\n if (ctaButtons && ctaButtons.length > 0) {\n html += `<div class=\"syntro-modal-actions\" style=\"display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end;\">`;\n for (const btn of ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-modal-btn ${isPrimary ? 'syntro-modal-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n style=\"\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n ${\n isPrimary\n ? `background: ${V.accent}; color: white; border: none;`\n : `background: transparent; color: ${V.accent}; border: 1px solid currentColor; opacity: 0.7;`\n }\n \"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n\n modal.innerHTML = html;\n context.overlayRoot.appendChild(modal);\n\n // Track state for waitFor\n let actionClicked: string | null = null;\n\n // Handle action button clicks\n const actionBtns = modal.querySelectorAll<HTMLElement>('[data-syntro-action]');\n const actionHandler = (e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId) {\n actionClicked = actionId;\n context.publishEvent('action.modal_cta_clicked', {\n actionId,\n });\n handle.destroy();\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n\n // Handle escape key\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && dismiss?.onEsc !== false) {\n handle.destroy();\n }\n };\n window.addEventListener('keydown', onKey);\n\n // Handle click outside (on scrim)\n const onScrimClick = () => {\n if (!blocking) {\n handle.destroy();\n }\n };\n scrimEl.addEventListener('click', onScrimClick);\n\n // Blocking mode - make siblings inert (except editor panel)\n const originalInert: Element[] = [];\n if (blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (\n el !== context.overlayRoot &&\n el.getAttribute('inert') === null &&\n !el.querySelector('[data-syntro-editor-panel]') &&\n !el.hasAttribute('data-syntro-editor-panel')\n ) {\n el.setAttribute('inert', '');\n originalInert.push(el);\n }\n });\n }\n\n // Set up timeout if specified\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (dismiss?.timeoutMs) {\n timeoutId = setTimeout(() => {\n handle.destroy();\n }, dismiss.timeoutMs);\n }\n\n // Focus first focusable element\n const focusableEls = modal.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableEls.length > 0) {\n requestAnimationFrame(() => focusableEls[0].focus());\n }\n\n // Fade in\n requestAnimationFrame(() => {\n scrimEl.style.opacity = '1';\n modal.style.opacity = '1';\n modal.style.transform = 'translate(-50%, -50%) scale(1)';\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:modal',\n size,\n blocking,\n });\n\n const handle = {\n destroy() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n window.removeEventListener('keydown', onKey);\n scrimEl.removeEventListener('click', onScrimClick);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n\n // Restore inert state\n originalInert.forEach((el) => el.removeAttribute('inert'));\n\n // Fade out then remove\n modal.style.pointerEvents = 'none';\n scrimEl.style.pointerEvents = 'none';\n modal.style.opacity = '0';\n modal.style.transform = 'translate(-50%, -50%) scale(0.95)';\n scrimEl.style.opacity = '0';\n setTimeout(() => {\n try {\n modal.remove();\n } catch {\n /* already detached */\n }\n try {\n scrimEl.remove();\n } catch {\n /* already detached */\n }\n }, 200);\n\n context.publishEvent('action.modal_dismissed', {\n actionClicked,\n });\n },\n };\n\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n", "/**\n * Tooltip Overlay\n *\n * Creates a positioned tooltip near an element using Floating UI.\n */\n\nimport {\n arrow as arrowMiddleware,\n autoUpdate,\n computePosition,\n flip,\n hide,\n type Middleware,\n offset,\n type Placement,\n shift,\n type VirtualElement,\n} from '@floating-ui/dom';\n\nimport { sanitizeHtml } from './sanitizer';\n\nexport type TooltipHandle = { destroy(): void; el: HTMLElement };\n\nexport interface TooltipOptions {\n html: string;\n placement?: Placement | 'auto';\n offsetPx?: number;\n blocking?: boolean;\n trigger?: 'immediate' | 'hover' | 'click';\n onAction?: (actionId: string) => void;\n}\n\n/**\n * For large elements (larger than viewport), create a virtual anchor\n * at the center of the visible portion.\n */\nfunction getAnchorReference(anchorEl: HTMLElement): HTMLElement | VirtualElement {\n const rect = anchorEl.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const isLargeElement = rect.width > viewportWidth * 0.8 || rect.height > viewportHeight * 0.8;\n\n if (!isLargeElement) {\n return anchorEl;\n }\n\n const visibleLeft = Math.max(rect.left, 0);\n const visibleTop = Math.max(rect.top, 0);\n const visibleRight = Math.min(rect.right, viewportWidth);\n const visibleBottom = Math.min(rect.bottom, viewportHeight);\n\n const centerX = (visibleLeft + visibleRight) / 2;\n const centerY = (visibleTop + visibleBottom) / 2;\n\n return {\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: centerX,\n y: centerY,\n top: centerY,\n left: centerX,\n right: centerX,\n bottom: centerY,\n };\n },\n };\n}\n\nexport function showTooltip(\n anchorEl: HTMLElement,\n overlayRoot: HTMLElement,\n opts: TooltipOptions\n): TooltipHandle {\n // Scroll anchor into view only for immediate tooltips \u2014 hover/click tooltips\n // are triggered by user interaction so the element is already in view.\n if (!opts.trigger || opts.trigger === 'immediate') {\n const rect = anchorEl.getBoundingClientRect();\n const isLargeElement =\n rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;\n if (!isLargeElement) {\n anchorEl.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });\n }\n }\n\n const div = document.createElement('div');\n div.className = 'syntro-tooltip';\n div.setAttribute('role', 'tooltip');\n div.innerHTML = sanitizeHtml(opts.html);\n\n // Add close button for immediate tooltips so users can dismiss them\n if (!opts.trigger || opts.trigger === 'immediate') {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'syntro-tooltip-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n Object.assign(closeBtn.style, {\n position: 'absolute',\n top: '4px',\n right: '4px',\n background: 'none',\n border: 'none',\n color: 'inherit',\n fontSize: '16px',\n lineHeight: '1',\n cursor: 'pointer',\n opacity: '0.6',\n padding: '2px 4px',\n });\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.opacity = '1';\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.opacity = '0.6';\n });\n closeBtn.addEventListener('click', () => handle.destroy());\n div.style.position = 'relative';\n div.appendChild(closeBtn);\n }\n\n // Handle action button clicks\n const actionBtns = div.querySelectorAll<HTMLElement>('[data-syntro-action]');\n const actionHandler = (e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId && opts.onAction) {\n opts.onAction(actionId);\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n\n // Create arrow element\n const arrowEl = document.createElement('div');\n arrowEl.className = 'syntro-tooltip-arrow';\n div.appendChild(arrowEl);\n\n overlayRoot.appendChild(div);\n\n const middleware: Middleware[] = [\n offset(opts.offsetPx ?? 8),\n flip(),\n shift({ padding: 8 }),\n hide(),\n arrowMiddleware({ element: arrowEl }),\n ];\n\n const placement: Placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';\n\n const cleanup = autoUpdate(anchorEl, div, async () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at stale coords.\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const currentAnchorRef = getAnchorReference(anchorEl);\n const result = await computePosition(currentAnchorRef, div, {\n placement,\n strategy: 'fixed',\n middleware,\n });\n\n const { x, y, strategy, middlewareData, placement: finalPlacement } = result;\n\n Object.assign(div.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: strategy,\n });\n\n // Position arrow\n if (middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = finalPlacement.split('-')[0];\n\n const staticSide: Record<string, string> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n\n Object.assign(arrowEl.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide[side]]: '-4px',\n });\n\n const rotation: Record<string, string> = {\n top: '0deg',\n right: '90deg',\n bottom: '180deg',\n left: '270deg',\n };\n arrowEl.style.transform = `rotate(${rotation[side] || '0deg'})`;\n }\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handle.destroy();\n };\n window.addEventListener('keydown', onKey);\n\n // Handle blocking mode\n const originalInert: string[] = [];\n\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot && el.getAttribute('inert') === null) {\n el.setAttribute('inert', '');\n originalInert.push(el.id || el.tagName);\n }\n });\n\n const focusableEls = Array.from(\n div.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n\n if (focusableEls.length > 0) {\n const firstFocusable = focusableEls[0];\n const lastFocusable = focusableEls[focusableEls.length - 1];\n\n const trapFocus = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n lastFocusable.focus();\n e.preventDefault();\n }\n } else if (document.activeElement === lastFocusable) {\n firstFocusable.focus();\n e.preventDefault();\n }\n };\n\n div.addEventListener('keydown', trapFocus);\n requestAnimationFrame(() => firstFocusable.focus());\n }\n }\n\n const attachTrigger = () => {\n if (opts.trigger === 'hover') {\n let hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const show = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n };\n const scheduleHide = () => {\n hideTimeout = setTimeout(() => {\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n hideTimeout = null;\n }, 100);\n };\n\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n\n anchorEl.addEventListener('mouseenter', show);\n anchorEl.addEventListener('mouseleave', scheduleHide);\n div.addEventListener('mouseenter', show);\n div.addEventListener('mouseleave', scheduleHide);\n anchorEl.addEventListener('focus', show);\n anchorEl.addEventListener('blur', scheduleHide);\n return () => {\n if (hideTimeout) clearTimeout(hideTimeout);\n anchorEl.removeEventListener('mouseenter', show);\n anchorEl.removeEventListener('mouseleave', scheduleHide);\n div.removeEventListener('mouseenter', show);\n div.removeEventListener('mouseleave', scheduleHide);\n anchorEl.removeEventListener('focus', show);\n anchorEl.removeEventListener('blur', scheduleHide);\n };\n }\n\n if (opts.trigger === 'click') {\n const toggle = () => {\n const isVisible = div.style.visibility === 'visible';\n if (isVisible) {\n handle.destroy();\n } else {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n }\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('click', toggle);\n return () => anchorEl.removeEventListener('click', toggle);\n }\n\n // Immediate - fade in on mount\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease';\n requestAnimationFrame(() => {\n div.style.opacity = '1';\n });\n return () => {};\n };\n\n const removeTrigger = attachTrigger();\n\n const handle: TooltipHandle = {\n el: div,\n destroy() {\n cleanup();\n removeTrigger();\n window.removeEventListener('keydown', onKey);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot) {\n el.removeAttribute('inert');\n }\n });\n }\n\n div.style.pointerEvents = 'none';\n div.style.opacity = '0';\n setTimeout(() => {\n try {\n div.remove();\n } catch {\n /* already detached */\n }\n }, 200);\n },\n };\n\n return handle;\n}\n", "/**\n * WorkflowWidgetLit \u2014 Lit web component for the WorkflowTracker.\n *\n * Lit equivalent of WorkflowWidget.tsx / WorkflowWidgetInner.\n * Tag name: <syntro-workflow-tracker>\n *\n * Responsibilities (mirrors the React version):\n * 1. Scan runtime.actions.getActive() for tours with `workflow` field\n * 2. Re-scan on tour.started / tour.resumed events\n * 3. Load persisted state from runtime.state.user namespace\n * 4. Subscribe to tour.* events and update workflow entries\n * 5. Render workflow cards with progress indicators and step lists\n * 6. Handle step clicks (publish workflow:jump_to_step)\n * 7. Handle dismiss (persist and re-render)\n * 8. Show toast notifications for newly discovered workflows\n *\n * Decorator-free: uses `static override properties` (tsconfig has no\n * experimentalDecorators).\n *\n * Uses createRenderRoot() { return this; } for light DOM so host-page CSS\n * variables (--se-color-*, --se-font-family, etc.) flow through without a\n * nested shadow boundary.\n */\n\nimport { html, LitElement, nothing } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { WorkflowEntry, WorkflowMeta } from './workflow-types';\n\n// Design-system fallback tokens \u2014 inlined because this adaptive ships to\n// customer pages and themes via `--se-color-*` CSS variables. The TOKEN_*\n// values are only used when a customer hasn't set their own theme.\n// Values match packages/design-system/src/tokens/colors.ts.\n// blue[4] #1969fe \u00B7 green[4] #24ad32\n// slateGrey[2] #0e1114 \u00B7 slateGrey[7] #677384 \u00B7 slateGrey[12] #f6f7f9\n// slateGrey[9] #a8afba \u00B7 base.white #ffffff\nconst TOKEN_BLUE_4 = '#1969fe';\nconst TOKEN_GREEN_4 = '#24ad32';\nconst TOKEN_SLATE_2 = '#0e1114';\nconst TOKEN_SLATE_7 = '#677384';\nconst TOKEN_SLATE_9 = '#a8afba';\nconst TOKEN_SLATE_12 = '#f6f7f9';\nconst TOKEN_WHITE = '#ffffff';\n\n// ============================================================================\n// Types (mirrored from WorkflowWidget.tsx)\n// ============================================================================\n\ninterface ActiveAction {\n id: string;\n action: Record<string, unknown>;\n adaptiveId?: string;\n appliedTs: number;\n state: string;\n}\n\ninterface WorkflowRuntime {\n events: {\n subscribe: (\n filter: { patterns?: string[]; names?: string[] },\n callback: (event: { name: string; props?: Record<string, unknown>; ts: number }) => void\n ) => () => void;\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n actions: {\n getActive: () => ActiveAction[];\n };\n state?: {\n user?: {\n ns?: (namespace: string) => {\n get: (key: string) => unknown;\n set: (key: string, value: unknown) => void;\n };\n };\n };\n}\n\n/**\n * MountableWidget contract \u2014 matches the interface from @syntrologie/runtime-sdk\n * Defined locally to avoid adding runtime-sdk as a dependency.\n */\nexport interface MountableWidget {\n mount(container: HTMLElement, config?: Record<string, unknown>): (() => void) | void;\n update?(container: HTMLElement, config?: Record<string, unknown>): void;\n}\n\n// ============================================================================\n// Helpers (mirrored from WorkflowWidget.tsx)\n// ============================================================================\n\n/**\n * Show a toast notification for a workflow tour.\n * Appends to document.body so position:fixed is scoped to the viewport,\n * not to a shadow DOM container.\n */\nfunction showWorkflowToast(notification: { title: string; body?: string }): () => void {\n const toast = document.createElement('div');\n toast.setAttribute('data-testid', 'workflow-toast');\n\n Object.assign(toast.style, {\n position: 'fixed',\n bottom: '16px',\n right: '16px',\n zIndex: '2147483646',\n padding: '12px 16px',\n borderRadius: '8px',\n backgroundColor: `var(--se-color-bg-surface, ${TOKEN_WHITE})`,\n color: `var(--se-color-text-primary, ${TOKEN_SLATE_2})`,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n maxWidth: '320px',\n fontFamily: 'var(--se-font-family, system-ui, sans-serif)',\n fontSize: '14px',\n lineHeight: '1.4',\n transition: 'opacity 0.3s ease',\n });\n\n const titleEl = document.createElement('div');\n titleEl.style.fontWeight = '600';\n titleEl.textContent = notification.title;\n toast.appendChild(titleEl);\n\n if (notification.body) {\n const bodyEl = document.createElement('div');\n bodyEl.style.marginTop = '4px';\n bodyEl.style.fontSize = '13px';\n bodyEl.style.color = 'var(--se-color-text-secondary, #666)';\n bodyEl.textContent = notification.body;\n toast.appendChild(bodyEl);\n }\n\n document.body.appendChild(toast);\n\n let removeTimer: ReturnType<typeof setTimeout>;\n const fadeTimer = setTimeout(() => {\n toast.style.opacity = '0';\n removeTimer = setTimeout(() => {\n toast.remove();\n }, 300);\n }, 4000);\n\n return () => {\n clearTimeout(fadeTimer);\n clearTimeout(removeTimer);\n toast.remove();\n };\n}\n\n/**\n * Extract workflow-enabled tours from active actions (runtime.actions.getActive()).\n * Only actions with kind 'overlays:tour', a tourId, and a workflow field are included.\n */\nfunction extractWorkflowsFromActive(\n activeActions: ActiveAction[]\n): Map<string, { meta: WorkflowMeta; steps: { id: string; title: string }[] }> {\n const workflows = new Map<\n string,\n { meta: WorkflowMeta; steps: { id: string; title: string }[] }\n >();\n\n for (const entry of activeActions) {\n const action = entry.action;\n if (action.kind === 'overlays:tour' && action.workflow && action.tourId) {\n const meta = action.workflow as WorkflowMeta;\n const rawSteps = (action.steps as Array<{ id: string }>) || [];\n const steps = rawSteps.map((s) => ({\n id: s.id,\n title: meta.stepTitles?.[s.id] || s.id,\n }));\n workflows.set(action.tourId as string, { meta, steps });\n }\n }\n\n return workflows;\n}\n\n// ============================================================================\n// WorkflowTrackerLit \u2014 Lit Element\n// ============================================================================\n\nconst TAG_NAME = 'syntro-workflow-tracker';\n\nexport class WorkflowTrackerLit extends LitElement {\n // \u2500\u2500 Static properties (no decorators) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n static override properties = {\n // Public input: runtime ref injected by MountableWidget\n runtimeRef: { attribute: false },\n\n // Internal reactive state\n _workflowEntries: { state: true },\n _actionVersion: { state: true },\n };\n\n // \u2500\u2500 Public properties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n runtimeRef: WorkflowRuntime | null = null;\n\n // \u2500\u2500 Internal reactive state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** @internal */ _workflowEntries: WorkflowEntry[] = [];\n /**\n * @internal\n * Bumped on tour.started / tour.resumed to trigger re-scan of active actions.\n */\n /** @internal */ _actionVersion = 0;\n\n // \u2500\u2500 Private (non-reactive) fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // Subscription cleanup functions\n #unsubTourStarted: (() => void) | null = null;\n #unsubTourEvents: (() => void) | null = null;\n\n // Toast cleanup tracking\n #toastCleanups: Array<() => void> = [];\n\n // Notifications already shown (mirrors notifiedRef)\n #notified: Set<string> = new Set();\n\n // Completed timestamps (mirrors completedMapRef)\n #completedMap: Record<string, number> = {};\n\n // Whether persisted state has been loaded\n #persistInitialized = false;\n\n // Cache of the last scanned tourWorkflows map (used by event handler)\n #tourWorkflows: Map<string, { meta: WorkflowMeta; steps: { id: string; title: string }[] }> =\n new Map();\n\n // \u2500\u2500 Light DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Render into the element itself (light DOM) so host-page CSS variables\n * flow through without a nested shadow boundary.\n */\n override createRenderRoot() {\n return this;\n }\n\n // \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private get _stateNs() {\n return this.runtimeRef?.state?.user?.ns?.('workflows') ?? null;\n }\n\n /**\n * Re-scan active actions and update _tourWorkflows + entries.\n * Called initially and whenever _actionVersion bumps.\n */\n private _rescanWorkflows(): void {\n const active = this.runtimeRef?.actions?.getActive?.() ?? [];\n const workflows = extractWorkflowsFromActive(active);\n this.#tourWorkflows = workflows;\n\n if (workflows.size === 0) return;\n\n const stateNs = this._stateNs;\n const dismissed: string[] = (stateNs?.get('dismissed') as string[]) ?? [];\n const completed = (stateNs?.get('completed') as Record<string, number>) ?? {};\n\n this._workflowEntries = (() => {\n const existingIds = new Set(this._workflowEntries.map((e) => e.tourId));\n const newEntries: WorkflowEntry[] = [];\n\n for (const [tourId, { meta, steps }] of workflows) {\n if (existingIds.has(tourId)) continue;\n\n let status: 'active' | 'completed' | 'dismissed' = 'active';\n if (dismissed.includes(tourId)) {\n status = 'dismissed';\n } else if (completed[tourId]) {\n status = 'completed';\n }\n\n newEntries.push({\n tourId,\n meta,\n steps,\n currentStepId: null,\n completedSteps: [],\n status,\n completedAt: completed[tourId] || undefined,\n });\n }\n\n return newEntries.length > 0\n ? [...this._workflowEntries, ...newEntries]\n : this._workflowEntries;\n })();\n\n // Fire toast notifications for newly discovered active tours\n for (const [tourId, { meta }] of workflows) {\n const dismissed2: string[] = (stateNs?.get('dismissed') as string[]) ?? [];\n const completed2 = (stateNs?.get('completed') as Record<string, number>) ?? {};\n if (\n !this.#notified.has(tourId) &&\n meta.notification &&\n !dismissed2.includes(tourId) &&\n !completed2[tourId]\n ) {\n this.#notified.add(tourId);\n stateNs?.set('notified', [...this.#notified]);\n const cleanup = showWorkflowToast(meta.notification);\n this.#toastCleanups.push(cleanup);\n }\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._initSubscriptions();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._teardownSubscriptions();\n for (const cleanup of this.#toastCleanups) {\n cleanup();\n }\n this.#toastCleanups = [];\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('runtimeRef')) {\n // Re-wire subscriptions when the runtime ref changes\n this._teardownSubscriptions();\n this._initSubscriptions();\n }\n\n if (changed.has('_actionVersion')) {\n this._rescanWorkflows();\n }\n }\n\n // \u2500\u2500 Subscription management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _initSubscriptions(): void {\n if (!this.runtimeRef?.events?.subscribe) return;\n\n // Initialize persisted state once\n if (!this.#persistInitialized && this._stateNs) {\n const notified: string[] = (this._stateNs.get('notified') as string[]) ?? [];\n for (const id of notified) {\n this.#notified.add(id);\n }\n const completed = (this._stateNs.get('completed') as Record<string, number>) ?? {};\n this.#completedMap = { ...completed };\n this.#persistInitialized = true;\n }\n\n // Subscribe to tour.started / tour.resumed to re-scan getActive()\n this.#unsubTourStarted = this.runtimeRef.events.subscribe(\n { names: ['tour.started', 'tour.resumed'] },\n () => {\n this._actionVersion += 1;\n }\n );\n\n // Subscribe to all tour.* events for state updates\n this.#unsubTourEvents = this.runtimeRef.events.subscribe(\n { patterns: ['^tour\\\\.'] },\n (event: { name: string; props?: Record<string, unknown> }) => {\n this._handleTourEvent(event);\n }\n );\n\n // Initial scan\n this._rescanWorkflows();\n }\n\n private _teardownSubscriptions(): void {\n this.#unsubTourStarted?.();\n this.#unsubTourStarted = null;\n this.#unsubTourEvents?.();\n this.#unsubTourEvents = null;\n }\n\n // \u2500\u2500 Event handler \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _handleTourEvent(event: { name: string; props?: Record<string, unknown> }): void {\n const tourId = event.props?.tourId as string | undefined;\n if (!tourId) return;\n\n // If the tour isn't tracked yet and this is a start event, bump actionVersion\n // so updated() triggers a re-scan.\n if (!this.#tourWorkflows.has(tourId) && event.name === 'tour.started') {\n this._actionVersion += 1;\n return;\n }\n\n if (!this.#tourWorkflows.has(tourId)) return;\n\n const stateNs = this._stateNs;\n\n this._workflowEntries = this._workflowEntries.map((entry) => {\n if (entry.tourId !== tourId) return entry;\n\n switch (event.name) {\n case 'tour.started': {\n const startStepId = (event.props?.startStepId as string) || entry.steps[0]?.id || null;\n\n // Show toast if not already notified\n if (!this.#notified.has(tourId)) {\n this.#notified.add(tourId);\n stateNs?.set('notified', [...this.#notified]);\n const workflow = this.#tourWorkflows.get(tourId);\n if (workflow?.meta.notification) {\n const cleanup = showWorkflowToast(workflow.meta.notification);\n this.#toastCleanups.push(cleanup);\n }\n }\n\n // Persist active state\n const activeIds = this._workflowEntries\n .filter((e) => e.status === 'active' || e.tourId === tourId)\n .map((e) => e.tourId);\n if (!activeIds.includes(tourId)) {\n activeIds.push(tourId);\n }\n stateNs?.set('active', [...new Set(activeIds)]);\n\n return {\n ...entry,\n status: 'active' as const,\n currentStepId: startStepId,\n completedSteps: entry.status === 'active' ? entry.completedSteps : [],\n };\n }\n\n case 'tour.step_started': {\n const stepId = event.props?.stepId as string;\n return {\n ...entry,\n currentStepId: stepId || entry.currentStepId,\n };\n }\n\n case 'tour.step_changed': {\n const previousStepId = event.props?.previousStepId as string;\n const nextStepId = event.props?.nextStepId as string;\n const completedSteps =\n previousStepId && !entry.completedSteps.includes(previousStepId)\n ? [...entry.completedSteps, previousStepId]\n : entry.completedSteps;\n return {\n ...entry,\n currentStepId: nextStepId || entry.currentStepId,\n completedSteps,\n };\n }\n\n case 'tour.completed': {\n const completedAt = Date.now();\n this.#completedMap[tourId] = completedAt;\n stateNs?.set('completed', { ...this.#completedMap });\n\n return {\n ...entry,\n status: 'completed' as const,\n currentStepId: null,\n completedSteps: entry.steps.map((s) => s.id),\n completedAt,\n };\n }\n\n case 'tour.paused':\n return entry;\n\n default:\n return entry;\n }\n });\n }\n\n // \u2500\u2500 User action handlers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _handleStepClick(tourId: string, stepId: string): void {\n this.runtimeRef?.events?.publish('workflow:jump_to_step', { tourId, stepId });\n\n this.dispatchEvent(\n new CustomEvent('workflow-step-click', {\n bubbles: true,\n detail: { tourId, stepId },\n })\n );\n }\n\n private _handleDismiss(tourId: string): void {\n this._workflowEntries = this._workflowEntries.map((entry) =>\n entry.tourId === tourId ? { ...entry, status: 'dismissed' as const } : entry\n );\n\n const dismissedIds = this._workflowEntries\n .filter((e) => e.status === 'dismissed')\n .map((e) => e.tourId);\n this._stateNs?.set('dismissed', dismissedIds);\n\n this.dispatchEvent(\n new CustomEvent('workflow-dismissed', {\n bubbles: true,\n detail: { tourId },\n })\n );\n }\n\n // \u2500\u2500 Render helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _renderProgressBar(completed: number, total: number) {\n const percent = total > 0 ? Math.round((completed / total) * 100) : 0;\n\n const trackStyles: Record<string, string> = {\n width: '100%',\n height: '6px',\n borderRadius: '9999px',\n background: 'rgba(255,255,255,0.08)',\n overflow: 'hidden',\n };\n\n const fillStyles: Record<string, string> = {\n height: '100%',\n borderRadius: '9999px',\n background: `var(--se-color-primary, ${TOKEN_BLUE_4})`,\n transition: 'width 0.3s ease',\n width: `${percent}%`,\n };\n\n return html`\n <div style=${styleMap(trackStyles)}>\n <div\n role=\"progressbar\"\n aria-valuenow=${percent}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n style=${styleMap(fillStyles)}\n ></div>\n </div>\n `;\n }\n\n private _renderStepItem(\n step: { id: string; title: string },\n isCompleted: boolean,\n isCurrent: boolean,\n tourId: string\n ) {\n const btnStyles: Record<string, string> = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n padding: '6px 8px',\n borderRadius: '4px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n textAlign: 'left',\n fontSize: '12px',\n lineHeight: '1.4',\n color: isCurrent\n ? `var(--se-color-text-primary, ${TOKEN_SLATE_12})`\n : `var(--se-color-text-secondary, ${TOKEN_SLATE_9})`,\n fontWeight: isCurrent ? '600' : '400',\n };\n\n const indicatorWrapStyles: Record<string, string> = {\n flexShrink: '0',\n width: '16px',\n textAlign: 'center',\n };\n\n const dotStyles: Record<string, string> = {\n display: 'inline-block',\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: isCurrent ? `var(--se-color-primary, ${TOKEN_BLUE_4})` : 'rgba(255,255,255,0.12)',\n };\n\n const checkStyles: Record<string, string> = {\n color: `var(--se-color-success, ${TOKEN_GREEN_4})`,\n };\n\n const labelStyles: Record<string, string> = {\n flex: '1',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n\n const indicator = isCompleted\n ? html`<span role=\"img\" aria-label=\"completed\" style=${styleMap(checkStyles)}>✓</span>`\n : isCurrent\n ? html`<span style=${styleMap(dotStyles)}></span>`\n : html`<span style=${styleMap(dotStyles)}></span>`;\n\n return html`\n <button\n type=\"button\"\n data-testid=${`step-${step.id}`}\n data-current=${isCurrent ? 'true' : nothing}\n data-completed=${isCompleted ? 'true' : nothing}\n aria-current=${isCurrent ? 'step' : nothing}\n style=${styleMap(btnStyles)}\n @click=${() => this._handleStepClick(tourId, step.id)}\n >\n <span style=${styleMap(indicatorWrapStyles)}>${indicator}</span>\n <span style=${styleMap(labelStyles)}>${step.title}</span>\n </button>\n `;\n }\n\n private _renderWorkflowCard(workflow: WorkflowEntry) {\n const completedCount = workflow.completedSteps.length;\n const totalSteps = workflow.steps.length;\n\n const cardStyles: Record<string, string> = {\n padding: '12px',\n borderRadius: '8px',\n border: '1px solid rgba(255,255,255,0.08)',\n background: 'rgba(255,255,255,0.02)',\n };\n\n const headerStyles: Record<string, string> = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px',\n };\n\n const titleStyles: Record<string, string> = {\n flex: '1',\n fontSize: '13px',\n fontWeight: '600',\n color: `var(--se-color-text-primary, ${TOKEN_SLATE_12})`,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n\n const dismissBtnStyles: Record<string, string> = {\n flexShrink: '0',\n padding: '2px 6px',\n border: 'none',\n borderRadius: '4px',\n background: 'transparent',\n color: `var(--se-color-text-tertiary, ${TOKEN_SLATE_7})`,\n fontSize: '12px',\n cursor: 'pointer',\n lineHeight: '1',\n };\n\n const progressWrapStyles: Record<string, string> = {\n marginBottom: '8px',\n };\n\n const progressLabelStyles: Record<string, string> = {\n fontSize: '10px',\n color: `var(--se-color-text-tertiary, ${TOKEN_SLATE_7})`,\n marginTop: '4px',\n };\n\n const stepsColStyles: Record<string, string> = {\n display: 'flex',\n flexDirection: 'column',\n };\n\n return html`\n <div style=${styleMap(cardStyles)}>\n <!-- Header: icon + title + dismiss -->\n <div style=${styleMap(headerStyles)}>\n ${\n workflow.meta.icon\n ? html`<span data-testid=\"workflow-icon\" style=\"flex-shrink:0;font-size:14px\">${workflow.meta.icon}</span>`\n : nothing\n }\n <span style=${styleMap(titleStyles)}>${workflow.meta.title}</span>\n <button\n type=\"button\"\n data-testid=${`dismiss-${workflow.tourId}`}\n style=${styleMap(dismissBtnStyles)}\n aria-label=${`Dismiss ${workflow.meta.title}`}\n @click=${() => this._handleDismiss(workflow.tourId)}\n >✕</button>\n </div>\n\n <!-- Progress bar + label -->\n <div style=${styleMap(progressWrapStyles)}>\n ${this._renderProgressBar(completedCount, totalSteps)}\n <div style=${styleMap(progressLabelStyles)}>\n ${completedCount} of ${totalSteps} steps\n </div>\n </div>\n\n <!-- Step list -->\n <div style=${styleMap(stepsColStyles)}>\n ${workflow.steps.map((step) =>\n this._renderStepItem(\n step,\n workflow.completedSteps.includes(step.id),\n workflow.currentStepId === step.id,\n workflow.tourId\n )\n )}\n </div>\n </div>\n `;\n }\n\n // \u2500\u2500 Render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n override render() {\n const activeWorkflows = this._workflowEntries.filter((w) => w.status === 'active');\n\n if (activeWorkflows.length === 0) {\n const emptyStyles: Record<string, string> = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px 0',\n fontSize: '12px',\n color: `var(--se-color-text-tertiary, ${TOKEN_SLATE_7})`,\n };\n return html`<div style=${styleMap(emptyStyles)}>No active workflows</div>`;\n }\n\n const containerStyles: Record<string, string> = {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n };\n\n return html`\n <div style=${styleMap(containerStyles)}>\n ${activeWorkflows.map((workflow) => this._renderWorkflowCard(workflow))}\n </div>\n `;\n }\n}\n\n// \u2500\u2500 Custom element registration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nif (typeof window !== 'undefined' && !customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, WorkflowTrackerLit);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'syntro-workflow-tracker': WorkflowTrackerLit;\n }\n}\n\n// ============================================================================\n// WorkflowWidgetLitMountable \u2014 MountableWidget interface\n// ============================================================================\n\n/**\n * MountableWidget that instantiates a <syntro-workflow-tracker> Lit element\n * and injects the runtime ref.\n *\n * Follows the same MountableWidget contract as WorkflowMountableWidget.\n * Config is enriched with `runtime` by WidgetRegistry.bindRuntime().\n */\nexport const WorkflowWidgetLitMountable: MountableWidget = {\n mount(container: HTMLElement, config?: Record<string, unknown>): (() => void) | void {\n const runtime = (config?.runtime as WorkflowRuntime) ?? null;\n\n // Ensure the custom element is registered\n if (typeof window !== 'undefined' && !customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, WorkflowTrackerLit);\n }\n\n const el = document.createElement(TAG_NAME) as WorkflowTrackerLit;\n el.runtimeRef = runtime;\n container.appendChild(el);\n\n return () => {\n el.remove();\n };\n },\n\n update(container: HTMLElement, config?: Record<string, unknown>): void {\n const el = container.querySelector<WorkflowTrackerLit>(TAG_NAME);\n if (!el) return;\n const runtime = (config?.runtime as WorkflowRuntime) ?? null;\n el.runtimeRef = runtime;\n },\n};\n", "/**\n * Adaptive Overlays - Runtime Module\n *\n * Visual overlay actions: highlight, pulse, badge, tooltip, celebrations.\n * Mounts the Lit web component WorkflowWidget.\n */\n\nimport { executeCelebrate } from './celebrations';\nimport { executeTour } from './executors/tour';\nimport { showHighlight } from './highlight';\nimport { executeModal } from './modal';\nimport { sanitizeHtml } from './sanitizer';\nimport { showTooltip } from './tooltip';\nimport type {\n ActionExecutor,\n BadgeAction,\n ExecutorResult,\n HighlightAction,\n PulseAction,\n TooltipAction,\n} from './types';\nimport { WorkflowWidgetLitMountable } from './WorkflowWidgetLit';\n\n// Re-export executeModal and executeTour for use by other packages\nexport { executeModal, executeTour };\n\n// Re-export tour & workflow types as the canonical source\nexport type { TourAction, TourStep, WorkflowMeta } from './tour-types';\n\n// ============================================================================\n// Executors\n// ============================================================================\n\n/**\n * Execute a highlight action\n */\nexport const executeHighlight: ActionExecutor<HighlightAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => {} };\n }\n\n // Skip re-application if the user previously dismissed this highlight.\n // The dismissed attribute is set by onDismiss (user click-outside / Esc)\n // and survives config-driven revert+reapply cycles.\n if (anchorEl.getAttribute('data-syntro-highlight-dismissed')) {\n return { cleanup: () => {} };\n }\n\n // Self-guard: destroy any existing highlight on this anchor to prevent duplicates\n // (batch re-apply on navigation can call this executor multiple times for the same anchor)\n const existing = anchorEl.getAttribute('data-syntro-highlight');\n if (existing) {\n const prev = context.overlayRoot.querySelectorAll(\n '.syntro-spotlight-scrim, .syntro-spotlight-ring'\n );\n prev.forEach((el) => el.remove());\n }\n anchorEl.setAttribute('data-syntro-highlight', 'true');\n\n // Resolve ring color: action override \u2192 theme primary \u2192 host page var \u2192 fallback\n let ringColor = action.style?.color;\n if (!ringColor) {\n try {\n const primary = getComputedStyle(context.overlayRoot)\n .getPropertyValue('--sc-color-primary')\n ?.trim();\n if (primary) ringColor = primary;\n } catch {\n /* fallback to showHighlight default */\n }\n }\n\n const handle = showHighlight(anchorEl, context.overlayRoot, {\n paddingPx: action.style?.paddingPx ?? 12,\n radiusPx: action.style?.radiusPx ?? 12,\n scrimOpacity: action.style?.scrimOpacity ?? 0.55,\n ringColor,\n blocking: action.blocking ?? false,\n onClickOutside: action.onClickOutside ?? true,\n onEsc: action.onEsc ?? true,\n onDismiss: () => {\n anchorEl.setAttribute('data-syntro-highlight-dismissed', 'true');\n },\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:highlight',\n anchorId: action.anchorId,\n });\n\n return {\n cleanup: () => {\n handle.destroy();\n anchorEl.removeAttribute('data-syntro-highlight');\n anchorEl.removeAttribute('data-syntro-highlight-dismissed');\n },\n };\n};\n\n/**\n * Execute a pulse action\n */\nexport const executePulse: ActionExecutor<PulseAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => {} };\n }\n\n const duration = action.duration ?? 4000;\n\n // Wait one frame so ThemeProvider's useEffect has injected CSS vars\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n // Read primary + secondary colors from theme (shadow DOM overlay root has --sc-* vars)\n const parseHex = (hex: string) => ({\n r: parseInt(hex.slice(1, 3), 16),\n g: parseInt(hex.slice(3, 5), 16),\n b: parseInt(hex.slice(5, 7), 16),\n });\n const fallback = { r: 79, g: 70, b: 229 }; // indigo-600\n let primary = fallback;\n let secondary: typeof fallback | null = null;\n try {\n const styles = getComputedStyle(context.overlayRoot);\n const pHex = styles.getPropertyValue('--sc-color-primary')?.trim();\n const sHex = styles.getPropertyValue('--sc-color-primary-hover')?.trim();\n if (pHex?.startsWith('#') && pHex.length >= 7) {\n primary = parseHex(pHex);\n }\n if (sHex?.startsWith('#') && sHex.length >= 7) {\n secondary = parseHex(sHex);\n }\n } catch {\n /* fallback to default */\n }\n\n // Inject/update pulse animation with theme colors\n // Two-tone pulse when both primary and secondary are available\n const existing = document.querySelector('[data-syntro-pulse-styles]');\n if (existing) existing.remove();\n const style = document.createElement('style');\n style.setAttribute('data-syntro-pulse-styles', '');\n const { r: pr, g: pg, b: pb } = primary;\n if (secondary) {\n const { r: sr, g: sg, b: sb } = secondary;\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);\n }\n 25% {\n box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);\n }\n 50% {\n box-shadow: 0 0 0 0 rgba(${sr}, ${sg}, ${sb}, 0.35);\n }\n 75% {\n box-shadow: 0 0 0 12px rgba(${sr}, ${sg}, ${sb}, 0);\n }\n }\n `;\n } else {\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);\n }\n 50% {\n box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);\n }\n }\n `;\n }\n document.head.appendChild(style);\n\n // Apply pulse animation via inline style (scoped to this element)\n const originalAnimation = anchorEl.style.animation;\n anchorEl.style.animation = 'syntro-pulse-anim 2.5s cubic-bezier(0.4, 0, 0.6, 1) infinite';\n anchorEl.setAttribute('data-syntro-pulse', 'true');\n\n // Set up auto-remove timeout\n const timeoutId = setTimeout(() => {\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n }, duration);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:pulse',\n anchorId: action.anchorId,\n duration,\n });\n\n return {\n cleanup: () => {\n clearTimeout(timeoutId);\n if (!anchorEl.isConnected) return;\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n },\n };\n};\n\n/**\n * Execute a badge action\n */\nexport const executeBadge: ActionExecutor<BadgeAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => {} };\n }\n\n // Read primary color from theme (overlay root has --sc-* vars from shadow DOM)\n let badgeColor = '#4f46e5';\n try {\n const primary = getComputedStyle(context.overlayRoot)\n .getPropertyValue('--sc-color-primary')\n ?.trim();\n if (primary?.startsWith('#') && primary.length >= 7) {\n badgeColor = primary;\n }\n } catch {\n /* fallback to default */\n }\n\n // Create badge element with inline styles (no global style injection)\n const badge = document.createElement('div');\n badge.textContent = action.content;\n badge.setAttribute('data-syntro-badge', action.anchorId.selector);\n\n // Apply styles directly to element\n Object.assign(badge.style, {\n position: 'absolute',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: '1',\n color: 'white',\n background: badgeColor,\n borderRadius: '9999px',\n pointerEvents: 'none',\n zIndex: '2147483646',\n whiteSpace: 'nowrap',\n });\n\n // Position badge relative to anchor\n const position = action.position ?? 'top-right';\n\n // Ensure anchor has relative positioning for badge\n const originalPosition = anchorEl.style.position;\n if (getComputedStyle(anchorEl).position === 'static') {\n anchorEl.style.position = 'relative';\n }\n\n // Append to anchor for relative positioning\n anchorEl.appendChild(badge);\n\n // Position based on config\n switch (position) {\n case 'top-left':\n Object.assign(badge.style, { top: '-8px', left: '-8px' });\n break;\n case 'top-right':\n Object.assign(badge.style, { top: '-8px', right: '-8px' });\n break;\n case 'bottom-left':\n Object.assign(badge.style, { bottom: '-8px', left: '-8px' });\n break;\n case 'bottom-right':\n Object.assign(badge.style, { bottom: '-8px', right: '-8px' });\n break;\n }\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:badge',\n anchorId: action.anchorId,\n content: action.content,\n position,\n });\n\n return {\n cleanup: () => {\n try {\n badge.remove();\n } catch {\n /* already detached */\n }\n if (!anchorEl.isConnected) return;\n if (originalPosition !== undefined) {\n anchorEl.style.position = originalPosition;\n }\n },\n updateFn: (changes) => {\n if ('content' in changes && typeof changes.content === 'string') {\n badge.textContent = changes.content;\n }\n },\n };\n};\n\n/**\n * Execute a tooltip action\n */\nexport const executeTooltip: ActionExecutor<TooltipAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => {} };\n }\n\n // Build tooltip HTML\n const { content } = action;\n let html = '';\n if (content.title) {\n html += `<div class=\"syntro-tt-title\">${sanitizeHtml(content.title)}</div>`;\n }\n html += `<div class=\"syntro-tt-body\">${sanitizeHtml(content.body)}</div>`;\n\n // Add CTA buttons if provided (new multi-button support)\n if (content.ctaButtons && content.ctaButtons.length > 0) {\n html += `<div class=\"syntro-tt-actions\">`;\n for (const btn of content.ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-tt-btn ${isPrimary ? 'syntro-tt-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n } else if (content.cta) {\n // Legacy single CTA support\n html += `<div class=\"syntro-tt-actions\">\n <button class=\"syntro-tt-btn syntro-tt-btn-primary\" data-syntro-action=\"cta\">\n ${sanitizeHtml(content.cta.label)}\n </button>\n </div>`;\n }\n\n const handle = showTooltip(anchorEl, context.overlayRoot, {\n html,\n placement: action.placement ?? 'top',\n trigger: action.trigger ?? 'immediate',\n onAction: (actionId) => {\n // Handle dismiss CTA \u2014 destroy the tooltip\n if (actionId === 'dismiss') {\n handle.destroy();\n return;\n }\n\n if (actionId === 'cta' && content.cta) {\n context.publishEvent('action.cta_clicked', {\n anchorId: action.anchorId,\n ctaLabel: content.cta.label,\n });\n } else if (content.ctaButtons) {\n const clickedBtn = content.ctaButtons.find((b) => b.actionId === actionId);\n if (clickedBtn) {\n context.publishEvent('action.tooltip_cta_clicked', {\n anchorId: action.anchorId,\n actionId,\n label: clickedBtn.label,\n });\n }\n }\n\n handle.destroy();\n },\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:tooltip',\n anchorId: action.anchorId,\n trigger: action.trigger ?? 'immediate',\n });\n\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'overlays:highlight', executor: executeHighlight },\n { kind: 'overlays:pulse', executor: executePulse },\n { kind: 'overlays:badge', executor: executeBadge },\n { kind: 'overlays:tooltip', executor: executeTooltip },\n { kind: 'overlays:modal', executor: executeModal },\n { kind: 'overlays:tour', executor: executeTour },\n { kind: 'overlays:celebrate', executor: executeCelebrate },\n] as const;\n\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-overlays',\n version: '1.0.0',\n name: 'Overlays',\n description:\n 'Tooltips, highlights, badges, modals, celebrations, visual overlays, and workflow tracking',\n executors,\n widgets: [\n {\n id: 'adaptive-overlays:workflow-tracker',\n component: WorkflowWidgetLitMountable,\n metadata: {\n name: 'Workflow Tracker',\n icon: '\uD83D\uDCCB',\n description: 'Tracks multi-step workflow progress across tours',\n },\n },\n ],\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["INTENSITY_COUNTS", "INTENSITY_COUNTS", "html", "tag", "modal", "html", "toggle", "runtime", "badge", "html"]
|
|
7
|
+
}
|