@syntrologie/runtime-sdk 1.0.1 → 2.0.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.
Files changed (128) hide show
  1. package/CAPABILITIES.md +630 -463
  2. package/README.md +285 -62
  3. package/dist/RuntimeProvider.d.ts +51 -0
  4. package/dist/RuntimeProvider.js +114 -0
  5. package/dist/RuntimeProvider.js.map +1 -0
  6. package/dist/SmartCanvasApp.d.ts +9 -3
  7. package/dist/SmartCanvasApp.js +36 -38
  8. package/dist/SmartCanvasApp.js.map +1 -1
  9. package/dist/actions/ActionEngine.d.ts +11 -0
  10. package/dist/actions/ActionEngine.js +274 -0
  11. package/dist/actions/ActionEngine.js.map +1 -0
  12. package/dist/actions/executors/index.d.ts +117 -0
  13. package/dist/actions/executors/index.js +242 -0
  14. package/dist/actions/executors/index.js.map +1 -0
  15. package/dist/actions/executors/tour.d.ts +18 -0
  16. package/dist/actions/executors/tour.js +332 -0
  17. package/dist/actions/executors/tour.js.map +1 -0
  18. package/dist/actions/index.d.ts +10 -0
  19. package/dist/actions/index.js +12 -0
  20. package/dist/actions/index.js.map +1 -0
  21. package/dist/actions/types.d.ts +399 -0
  22. package/dist/actions/types.js +8 -0
  23. package/dist/actions/types.js.map +1 -0
  24. package/dist/actions/validation.d.ts +14 -0
  25. package/dist/actions/validation.js +603 -0
  26. package/dist/actions/validation.js.map +1 -0
  27. package/dist/api.d.ts +32 -18
  28. package/dist/api.js +56 -39
  29. package/dist/api.js.map +1 -1
  30. package/dist/apps/AppContext.d.ts +31 -0
  31. package/dist/apps/AppContext.js +93 -0
  32. package/dist/apps/AppContext.js.map +1 -0
  33. package/dist/apps/AppLoader.d.ts +84 -0
  34. package/dist/apps/AppLoader.js +256 -0
  35. package/dist/apps/AppLoader.js.map +1 -0
  36. package/dist/apps/AppRegistry.d.ts +102 -0
  37. package/dist/apps/AppRegistry.js +317 -0
  38. package/dist/apps/AppRegistry.js.map +1 -0
  39. package/dist/apps/examples/gamification-app.example.d.ts +305 -0
  40. package/dist/apps/examples/gamification-app.example.js +329 -0
  41. package/dist/apps/examples/gamification-app.example.js.map +1 -0
  42. package/dist/apps/faq/index.js +11 -0
  43. package/dist/apps/faq/index.js.map +7 -0
  44. package/dist/apps/gamification/index.js +2 -0
  45. package/dist/apps/gamification/index.js.map +7 -0
  46. package/dist/apps/index.d.ts +15 -0
  47. package/dist/apps/index.js +17 -0
  48. package/dist/apps/index.js.map +1 -0
  49. package/dist/apps/nav/index.js +11 -0
  50. package/dist/apps/nav/index.js.map +7 -0
  51. package/dist/apps/types.d.ts +231 -0
  52. package/dist/apps/types.js +8 -0
  53. package/dist/apps/types.js.map +1 -0
  54. package/dist/bootstrap.d.ts +24 -0
  55. package/dist/bootstrap.js +133 -33
  56. package/dist/bootstrap.js.map +1 -1
  57. package/dist/components/ShadowCanvasOverlay.js +36 -9
  58. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  59. package/dist/components/TileCard.js +37 -18
  60. package/dist/components/TileCard.js.map +1 -1
  61. package/dist/context/schema.d.ts +16 -16
  62. package/dist/decisions/schema.d.ts +96 -96
  63. package/dist/earlyPatcher.d.ts +8 -20
  64. package/dist/earlyPatcher.js +13 -62
  65. package/dist/earlyPatcher.js.map +1 -1
  66. package/dist/editorLoader.d.ts +2 -0
  67. package/dist/editorLoader.js +52 -7
  68. package/dist/editorLoader.js.map +1 -1
  69. package/dist/events/normalizers/posthog.d.ts +24 -0
  70. package/dist/events/normalizers/posthog.js.map +1 -1
  71. package/dist/events/schema.d.ts +8 -8
  72. package/dist/events/types.d.ts +6 -0
  73. package/dist/events/types.js +8 -0
  74. package/dist/events/types.js.map +1 -1
  75. package/dist/hooks/useCanvasOverlays.d.ts +4 -1
  76. package/dist/hooks/useCanvasOverlays.js +53 -6
  77. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  78. package/dist/hooks/useShadowCanvasConfig.d.ts +3 -7
  79. package/dist/hooks/useShadowCanvasConfig.js +2 -3
  80. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  81. package/dist/index.d.ts +5 -0
  82. package/dist/index.js +10 -0
  83. package/dist/index.js.map +1 -1
  84. package/dist/overlays/schema.d.ts +153 -153
  85. package/dist/runtime.d.ts +24 -0
  86. package/dist/runtime.js +75 -1
  87. package/dist/runtime.js.map +1 -1
  88. package/dist/smart-canvas.esm.js +155 -78
  89. package/dist/smart-canvas.esm.js.map +4 -4
  90. package/dist/smart-canvas.js +41155 -35362
  91. package/dist/smart-canvas.js.map +4 -4
  92. package/dist/smart-canvas.min.js +155 -78
  93. package/dist/smart-canvas.min.js.map +4 -4
  94. package/dist/store/example.d.ts +1 -0
  95. package/dist/store/example.js +43 -0
  96. package/dist/store/example.js.map +1 -0
  97. package/dist/store/mini-effector.d.ts +46 -0
  98. package/dist/store/mini-effector.js +90 -0
  99. package/dist/store/mini-effector.js.map +1 -0
  100. package/dist/surfaces/Surfaces.d.ts +11 -0
  101. package/dist/surfaces/Surfaces.js +361 -0
  102. package/dist/surfaces/Surfaces.js.map +1 -0
  103. package/dist/surfaces/index.d.ts +9 -0
  104. package/dist/surfaces/index.js +12 -0
  105. package/dist/surfaces/index.js.map +1 -0
  106. package/dist/surfaces/positioning.d.ts +50 -0
  107. package/dist/surfaces/positioning.js +231 -0
  108. package/dist/surfaces/positioning.js.map +1 -0
  109. package/dist/surfaces/types.d.ts +167 -0
  110. package/dist/surfaces/types.js +23 -0
  111. package/dist/surfaces/types.js.map +1 -0
  112. package/dist/telemetry/adapters/posthog.d.ts +6 -0
  113. package/dist/telemetry/adapters/posthog.js +9 -0
  114. package/dist/telemetry/adapters/posthog.js.map +1 -1
  115. package/dist/types-only.d.ts +32 -0
  116. package/dist/types-only.js +11 -0
  117. package/dist/types-only.js.map +1 -0
  118. package/dist/types.d.ts +26 -14
  119. package/dist/types.js +1 -1
  120. package/dist/types.js.map +1 -1
  121. package/dist/widgets/WidgetRegistry.d.ts +139 -0
  122. package/dist/widgets/WidgetRegistry.js +182 -0
  123. package/dist/widgets/WidgetRegistry.js.map +1 -0
  124. package/dist/widgets/index.d.ts +7 -0
  125. package/dist/widgets/index.js +7 -0
  126. package/dist/widgets/index.js.map +1 -0
  127. package/package.json +14 -7
  128. package/schema/canvas-config.schema.json +444 -254
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Action Executor Registry
3
+ *
4
+ * Extensible registry that maps action kinds to their executor functions.
5
+ * Apps can register custom executors at runtime.
6
+ *
7
+ * Core app executors are imported from their respective app packages.
8
+ */
9
+ // Import executors from CORE app packages only (bundled with runtime)
10
+ // Lazy apps (gamification, faq, nav) are loaded dynamically from CDN
11
+ import { executors as contentExecutors } from "@syntrologie/app-content/runtime";
12
+ import { executors as overlayExecutors } from "@syntrologie/app-overlays/runtime";
13
+ import { executors as navigationExecutors } from "@syntrologie/app-navigation/runtime";
14
+ import { executeTour } from "./tour";
15
+ /**
16
+ * Extensible registry for action executors.
17
+ *
18
+ * Core executors (setText, highlight, etc.) are registered synchronously
19
+ * at construction time for immediate availability - no async loading.
20
+ *
21
+ * External app executors are registered when apps activate.
22
+ */
23
+ export class ExecutorRegistry {
24
+ /**
25
+ * Constructor - registers core executors synchronously.
26
+ * These are available IMMEDIATELY when the module loads,
27
+ * enabling instant action execution without waiting for app activation.
28
+ */
29
+ constructor() {
30
+ this.executors = new Map();
31
+ // Register all executors from core app packages
32
+ for (const { kind, executor } of contentExecutors) {
33
+ this.registerCore(kind, executor);
34
+ }
35
+ for (const { kind, executor } of overlayExecutors) {
36
+ this.registerCore(kind, executor);
37
+ }
38
+ for (const { kind, executor } of navigationExecutors) {
39
+ this.registerCore(kind, executor);
40
+ }
41
+ // NOTE: Lazy apps (gamification, faq, nav) are NOT registered here.
42
+ // They are loaded dynamically from CDN via AppLoader when config requires them.
43
+ // core:mountWidget is handled specially in ActionEngine since it delegates to Surfaces
44
+ this.registerCore("core:mountWidget", async () => {
45
+ throw new Error("core:mountWidget must be handled by ActionEngine");
46
+ });
47
+ // Register core:tour executor
48
+ this.registerCore("core:tour", executeTour);
49
+ }
50
+ /**
51
+ * Register a core executor (synchronous, built-in, cannot be overridden).
52
+ */
53
+ registerCore(kind, executor, schema) {
54
+ this.executors.set(kind, {
55
+ kind,
56
+ executor,
57
+ schema,
58
+ source: "core",
59
+ isBuiltIn: true,
60
+ });
61
+ }
62
+ /**
63
+ * Register an executor for an action kind.
64
+ *
65
+ * @param kind - The action kind (e.g., "gamification:awardBadge")
66
+ * @param executor - The executor function
67
+ * @param schema - Optional Zod schema for validation
68
+ * @param source - The source app ID (for tracking)
69
+ * @param isBuiltIn - Whether this is from a built-in app (prevents override)
70
+ */
71
+ register(kind, executor, schema, source = "custom", isBuiltIn = false) {
72
+ if (this.executors.has(kind)) {
73
+ const existing = this.executors.get(kind);
74
+ if (existing.isBuiltIn) {
75
+ throw new Error(`Cannot override built-in executor: ${kind}`);
76
+ }
77
+ console.warn(`[ExecutorRegistry] Overriding executor for kind: ${kind}`);
78
+ }
79
+ this.executors.set(kind, {
80
+ kind,
81
+ executor,
82
+ schema,
83
+ source,
84
+ isBuiltIn,
85
+ });
86
+ }
87
+ /**
88
+ * Unregister an executor.
89
+ *
90
+ * @param kind - The action kind to unregister
91
+ * @returns true if the executor was unregistered, false if not found or built-in
92
+ */
93
+ unregister(kind) {
94
+ const existing = this.executors.get(kind);
95
+ if (!existing) {
96
+ return false;
97
+ }
98
+ if (existing.isBuiltIn) {
99
+ console.warn(`[ExecutorRegistry] Cannot unregister built-in executor: ${kind}`);
100
+ return false;
101
+ }
102
+ this.executors.delete(kind);
103
+ return true;
104
+ }
105
+ /**
106
+ * Unregister all executors from a specific source.
107
+ *
108
+ * @param source - The source app ID
109
+ */
110
+ unregisterBySource(source) {
111
+ for (const [kind, registration] of this.executors.entries()) {
112
+ if (registration.source === source) {
113
+ this.executors.delete(kind);
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Get the executor for an action kind.
119
+ */
120
+ get(kind) {
121
+ var _a;
122
+ return (_a = this.executors.get(kind)) === null || _a === void 0 ? void 0 : _a.executor;
123
+ }
124
+ /**
125
+ * Get the full registration for an action kind.
126
+ */
127
+ getRegistration(kind) {
128
+ return this.executors.get(kind);
129
+ }
130
+ /**
131
+ * Check if an executor exists for a given action kind.
132
+ */
133
+ has(kind) {
134
+ return this.executors.has(kind);
135
+ }
136
+ /**
137
+ * Validate an action using its registered schema.
138
+ *
139
+ * @param action - The action to validate
140
+ * @returns Validation result
141
+ */
142
+ validate(action) {
143
+ const errors = [];
144
+ if (!action || typeof action !== "object") {
145
+ errors.push({
146
+ code: "INVALID_ACTION",
147
+ message: "Action must be an object",
148
+ });
149
+ return { valid: false, errors, warnings: [] };
150
+ }
151
+ const kind = action.kind;
152
+ if (!kind || typeof kind !== "string") {
153
+ errors.push({
154
+ code: "MISSING_KIND",
155
+ message: "Action must have a 'kind' property",
156
+ });
157
+ return { valid: false, errors, warnings: [] };
158
+ }
159
+ const registration = this.executors.get(kind);
160
+ if (!registration) {
161
+ errors.push({
162
+ code: "UNKNOWN_KIND",
163
+ message: `Unknown action kind: ${kind}`,
164
+ field: "kind",
165
+ });
166
+ return { valid: false, errors, warnings: [] };
167
+ }
168
+ // If schema is provided, validate against it
169
+ if (registration.schema) {
170
+ const result = registration.schema.safeParse(action);
171
+ if (!result.success) {
172
+ for (const issue of result.error.issues) {
173
+ errors.push({
174
+ code: "SCHEMA_VALIDATION_ERROR",
175
+ message: issue.message,
176
+ field: issue.path.join("."),
177
+ });
178
+ }
179
+ return { valid: false, errors, warnings: [] };
180
+ }
181
+ }
182
+ return { valid: true, errors: [], warnings: [] };
183
+ }
184
+ /**
185
+ * List all registered action kinds.
186
+ */
187
+ list() {
188
+ return Array.from(this.executors.keys());
189
+ }
190
+ /**
191
+ * List all registrations.
192
+ */
193
+ listRegistrations() {
194
+ return Array.from(this.executors.values());
195
+ }
196
+ /**
197
+ * Get all built-in action kinds.
198
+ */
199
+ getBuiltInKinds() {
200
+ return Array.from(this.executors.entries())
201
+ .filter(([, reg]) => reg.isBuiltIn)
202
+ .map(([kind]) => kind);
203
+ }
204
+ /**
205
+ * Get all custom action kinds.
206
+ */
207
+ getCustomKinds() {
208
+ return Array.from(this.executors.entries())
209
+ .filter(([, reg]) => !reg.isBuiltIn)
210
+ .map(([kind]) => kind);
211
+ }
212
+ }
213
+ // ============================================================================
214
+ // Singleton and backwards-compatible exports
215
+ // ============================================================================
216
+ /**
217
+ * Default singleton instance of ExecutorRegistry.
218
+ */
219
+ export const executorRegistry = new ExecutorRegistry();
220
+ /**
221
+ * Get the executor for an action kind.
222
+ * @deprecated Use executorRegistry.get() instead
223
+ */
224
+ export function getExecutor(kind) {
225
+ return executorRegistry.get(kind);
226
+ }
227
+ /**
228
+ * Check if an executor exists for a given action kind.
229
+ * @deprecated Use executorRegistry.has() instead
230
+ */
231
+ export function hasExecutor(kind) {
232
+ return executorRegistry.has(kind);
233
+ }
234
+ // Re-export individual executors from app packages for backwards compatibility
235
+ export { executeInsertHtml, executeSetText, executeSetAttr, executeAddClass, executeRemoveClass, executeSetStyle, } from "@syntrologie/app-content/runtime";
236
+ export { executeHighlight, executePulse, executeBadge, executeTooltip, executeModal, } from "@syntrologie/app-overlays/runtime";
237
+ export { executeScrollTo, executeNavigate, } from "@syntrologie/app-navigation/runtime";
238
+ // NOTE: Lazy app executors (gamification, faq, nav) are NOT re-exported here.
239
+ // They are loaded dynamically from CDN via AppLoader when config requires them.
240
+ // Core executors
241
+ export { executeTour } from "./tour";
242
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/executors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tour Executor
3
+ *
4
+ * Orchestrates sequential tour steps with cross-page state persistence.
5
+ * Tours can span multiple pages and resume after navigation.
6
+ *
7
+ * Each step contains an inner action (modal, tooltip) that gets executed.
8
+ * The tour listens for CTA click events to advance to the next step.
9
+ */
10
+ import type { TourAction, ActionExecutor } from "../types";
11
+ /**
12
+ * Execute a tour action
13
+ *
14
+ * Tours orchestrate a sequence of steps, persisting state to localStorage
15
+ * to support cross-page navigation. Each step contains an action to execute
16
+ * and optionally defines transitions based on action events.
17
+ */
18
+ export declare const executeTour: ActionExecutor<TourAction>;
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Tour Executor
3
+ *
4
+ * Orchestrates sequential tour steps with cross-page state persistence.
5
+ * Tours can span multiple pages and resume after navigation.
6
+ *
7
+ * Each step contains an inner action (modal, tooltip) that gets executed.
8
+ * The tour listens for CTA click events to advance to the next step.
9
+ */
10
+ /** Storage key for active tour state */
11
+ const ACTIVE_TOUR_KEY = "syntro_active_tour";
12
+ /** Track active tour executors to prevent duplicates */
13
+ const activeTours = new Map();
14
+ /**
15
+ * Get active tour state from localStorage
16
+ */
17
+ function getTourState(tourId) {
18
+ try {
19
+ const data = localStorage.getItem(ACTIVE_TOUR_KEY);
20
+ if (!data)
21
+ return null;
22
+ const state = JSON.parse(data);
23
+ // Only return if it matches the requested tour
24
+ if (state.tourId !== tourId)
25
+ return null;
26
+ return state;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Save tour state to localStorage
34
+ */
35
+ function saveTourState(state) {
36
+ try {
37
+ localStorage.setItem(ACTIVE_TOUR_KEY, JSON.stringify(state));
38
+ }
39
+ catch {
40
+ // Storage may be full or unavailable
41
+ }
42
+ }
43
+ /**
44
+ * Clear tour state from localStorage
45
+ */
46
+ function clearTourState() {
47
+ try {
48
+ localStorage.removeItem(ACTIVE_TOUR_KEY);
49
+ }
50
+ catch {
51
+ // Ignore errors
52
+ }
53
+ }
54
+ /**
55
+ * Get current route/path
56
+ */
57
+ function getCurrentRoute() {
58
+ return window.location.pathname;
59
+ }
60
+ /**
61
+ * Check if a step matches the current route
62
+ */
63
+ function stepMatchesRoute(step) {
64
+ if (!step.route)
65
+ return true;
66
+ const currentRoute = getCurrentRoute();
67
+ // Simple pattern matching - step.route can be exact path or glob pattern
68
+ if (step.route.includes("*")) {
69
+ const pattern = new RegExp("^" + step.route.replace(/\*/g, ".*") + "$");
70
+ return pattern.test(currentRoute);
71
+ }
72
+ return currentRoute === step.route;
73
+ }
74
+ /**
75
+ * Execute a tour action
76
+ *
77
+ * Tours orchestrate a sequence of steps, persisting state to localStorage
78
+ * to support cross-page navigation. Each step contains an action to execute
79
+ * and optionally defines transitions based on action events.
80
+ */
81
+ export const executeTour = async (action, context) => {
82
+ const { tourId, steps, startStep, autoStart = true } = action;
83
+ if (steps.length === 0) {
84
+ throw new Error(`Tour "${tourId}" has no steps`);
85
+ }
86
+ // Self-guard: if this tour is already running, return no-op
87
+ // This prevents duplicate modals when applyBatch is called multiple times
88
+ if (activeTours.has(tourId)) {
89
+ return {
90
+ cleanup: async () => {
91
+ // Delegate to the original tour's cleanup
92
+ const existing = activeTours.get(tourId);
93
+ if (existing) {
94
+ await existing.cleanup();
95
+ }
96
+ },
97
+ };
98
+ }
99
+ // Check if we can execute inner actions
100
+ if (!context.applyAction) {
101
+ throw new Error("Tour executor requires applyAction in context");
102
+ }
103
+ // Get or initialize tour state
104
+ let state = getTourState(tourId);
105
+ const isResumingTour = !!state;
106
+ // If not resuming and autoStart is false, don't start the tour
107
+ if (!isResumingTour && !autoStart) {
108
+ return {
109
+ cleanup: () => { },
110
+ };
111
+ }
112
+ if (!state) {
113
+ state = {
114
+ tourId,
115
+ currentStepId: startStep || steps[0].id,
116
+ startedAt: Date.now(),
117
+ };
118
+ saveTourState(state);
119
+ }
120
+ // Find the current step
121
+ let currentStepIndex = steps.findIndex((s) => s.id === state.currentStepId);
122
+ if (currentStepIndex === -1) {
123
+ // Step not found, use startStep or first step
124
+ const initialStepId = startStep || steps[0].id;
125
+ currentStepIndex = steps.findIndex((s) => s.id === initialStepId);
126
+ if (currentStepIndex === -1)
127
+ currentStepIndex = 0;
128
+ state.currentStepId = steps[currentStepIndex].id;
129
+ saveTourState(state);
130
+ }
131
+ const currentStep = steps[currentStepIndex];
132
+ // Check if current step matches the route
133
+ if (!stepMatchesRoute(currentStep)) {
134
+ // Current page doesn't match this step's route
135
+ // Tour is "waiting" for navigation to the correct page
136
+ context.publishEvent("tour.waiting_for_route", {
137
+ tourId,
138
+ stepId: currentStep.id,
139
+ expectedRoute: currentStep.route,
140
+ currentRoute: getCurrentRoute(),
141
+ });
142
+ // Return a no-op that cleans up when tour ends
143
+ return {
144
+ cleanup: () => { },
145
+ };
146
+ }
147
+ // Track state
148
+ let isDestroyed = false;
149
+ let currentActionHandle = null;
150
+ let eventUnsubscribe = null;
151
+ let routeWatcher = null;
152
+ /**
153
+ * Clean up current step
154
+ */
155
+ const cleanupCurrentStep = async () => {
156
+ if (eventUnsubscribe) {
157
+ eventUnsubscribe();
158
+ eventUnsubscribe = null;
159
+ }
160
+ if (currentActionHandle && currentActionHandle.isApplied()) {
161
+ await currentActionHandle.revert();
162
+ currentActionHandle = null;
163
+ }
164
+ };
165
+ /**
166
+ * Advance to the next step
167
+ */
168
+ const advanceToStep = async (nextStepId) => {
169
+ if (isDestroyed)
170
+ return;
171
+ // Clean up current step
172
+ await cleanupCurrentStep();
173
+ if (nextStepId === "end") {
174
+ // Tour complete
175
+ clearTourState();
176
+ context.publishEvent("tour.completed", {
177
+ tourId,
178
+ totalSteps: steps.length,
179
+ });
180
+ isDestroyed = true;
181
+ return;
182
+ }
183
+ // Find next step
184
+ const nextStep = steps.find((s) => s.id === nextStepId);
185
+ if (!nextStep) {
186
+ console.error(`[Tour] Step "${nextStepId}" not found`);
187
+ return;
188
+ }
189
+ // Update state
190
+ state.currentStepId = nextStepId;
191
+ saveTourState(state);
192
+ context.publishEvent("tour.step_changed", {
193
+ tourId,
194
+ previousStepId: currentStep.id,
195
+ nextStepId,
196
+ });
197
+ // If the next step has a different route, let navigation happen
198
+ if (nextStep.route && nextStep.route !== getCurrentRoute()) {
199
+ context.publishEvent("tour.awaiting_navigation", {
200
+ tourId,
201
+ stepId: nextStepId,
202
+ targetRoute: nextStep.route,
203
+ });
204
+ // Tour will resume when page reloads and this executor runs again
205
+ return;
206
+ }
207
+ // Execute the next step's action
208
+ await executeStep(nextStep);
209
+ };
210
+ /**
211
+ * Execute a step's inner action and set up event listeners
212
+ */
213
+ const executeStep = async (step) => {
214
+ if (isDestroyed)
215
+ return;
216
+ context.publishEvent("tour.step_started", {
217
+ tourId,
218
+ stepId: step.id,
219
+ stepIndex: steps.findIndex((s) => s.id === step.id),
220
+ totalSteps: steps.length,
221
+ });
222
+ // Execute the inner action
223
+ try {
224
+ currentActionHandle = await context.applyAction(step.action);
225
+ }
226
+ catch (error) {
227
+ console.error(`[Tour] Failed to execute step "${step.id}":`, error);
228
+ context.publishEvent("tour.step_failed", {
229
+ tourId,
230
+ stepId: step.id,
231
+ error: String(error),
232
+ });
233
+ return;
234
+ }
235
+ // Subscribe to CTA click events if there are transitions defined
236
+ if (step.onAction && context.subscribeEvent) {
237
+ eventUnsubscribe = context.subscribeEvent("action.modal_cta_clicked", (props) => {
238
+ const actionId = props === null || props === void 0 ? void 0 : props.actionId;
239
+ if (actionId && step.onAction) {
240
+ const nextStepId = step.onAction[actionId];
241
+ if (nextStepId) {
242
+ advanceToStep(nextStepId);
243
+ }
244
+ }
245
+ });
246
+ // Also listen for tooltip CTA clicks
247
+ const tooltipUnsubscribe = context.subscribeEvent("action.tooltip_cta_clicked", (props) => {
248
+ const actionId = props === null || props === void 0 ? void 0 : props.actionId;
249
+ if (actionId && step.onAction) {
250
+ const nextStepId = step.onAction[actionId];
251
+ if (nextStepId) {
252
+ advanceToStep(nextStepId);
253
+ }
254
+ }
255
+ });
256
+ // Combine unsubscribes
257
+ const originalUnsubscribe = eventUnsubscribe;
258
+ eventUnsubscribe = () => {
259
+ originalUnsubscribe();
260
+ tooltipUnsubscribe();
261
+ };
262
+ }
263
+ };
264
+ // Set up route change watcher for SPAs
265
+ const setupRouteWatcher = () => {
266
+ let lastPath = getCurrentRoute();
267
+ const checkRoute = () => {
268
+ const currentPath = getCurrentRoute();
269
+ if (currentPath !== lastPath) {
270
+ lastPath = currentPath;
271
+ context.publishEvent("tour.route_changed", {
272
+ tourId,
273
+ newRoute: currentPath,
274
+ });
275
+ }
276
+ };
277
+ // Watch for popstate (back/forward navigation)
278
+ window.addEventListener("popstate", checkRoute);
279
+ // Watch for pushState/replaceState
280
+ const origPushState = history.pushState.bind(history);
281
+ const origReplaceState = history.replaceState.bind(history);
282
+ history.pushState = (...args) => {
283
+ origPushState(...args);
284
+ checkRoute();
285
+ };
286
+ history.replaceState = (...args) => {
287
+ origReplaceState(...args);
288
+ checkRoute();
289
+ };
290
+ return () => {
291
+ window.removeEventListener("popstate", checkRoute);
292
+ history.pushState = origPushState;
293
+ history.replaceState = origReplaceState;
294
+ };
295
+ };
296
+ routeWatcher = setupRouteWatcher();
297
+ // Publish tour started/resumed event
298
+ if (!isResumingTour) {
299
+ context.publishEvent("tour.started", {
300
+ tourId,
301
+ totalSteps: steps.length,
302
+ startStepId: state.currentStepId,
303
+ });
304
+ }
305
+ else {
306
+ context.publishEvent("tour.resumed", {
307
+ tourId,
308
+ stepId: state.currentStepId,
309
+ });
310
+ }
311
+ // Execute the current step
312
+ await executeStep(currentStep);
313
+ // Create cleanup function
314
+ const cleanup = async () => {
315
+ isDestroyed = true;
316
+ // Remove from active tours
317
+ activeTours.delete(tourId);
318
+ await cleanupCurrentStep();
319
+ if (routeWatcher) {
320
+ routeWatcher();
321
+ }
322
+ // Don't clear tour state on cleanup - allow resume
323
+ context.publishEvent("tour.paused", {
324
+ tourId,
325
+ stepId: state.currentStepId,
326
+ });
327
+ };
328
+ // Register this tour as active
329
+ activeTours.set(tourId, { cleanup });
330
+ return { cleanup };
331
+ };
332
+ //# sourceMappingURL=tour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tour.js","sourceRoot":"","sources":["../../../src/actions/executors/tour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Actions Module
3
+ *
4
+ * Unified execution layer for interventions (highlight, tooltip, badge, DOM modifications).
5
+ */
6
+ export { createActionEngine } from "./ActionEngine";
7
+ export type { ActionEngine, ActionEngineOptions, ActionEngineExecutorRegistry, ActionHandle, BatchActionHandle, ActiveAction, ActionStep, ActionKind, HighlightAction, PulseAction, BadgeAction, TooltipAction, InsertHtmlAction, SetTextAction, SetAttrAction, AddClassAction, RemoveClassAction, SetStyleAction, MountWidgetAction, ScrollToAction, NavigateAction, HighlightStyle, BadgePosition, TooltipContent, TooltipTrigger, InsertPosition, WidgetConfig, ActionState, ValidationResult, ValidationError, ValidationWarning, ExecutorResult, ExecutorContext, ExecutorCleanup, ExecutorUpdate, ActionExecutor, } from "./types";
8
+ export { validateAction, validateActions } from "./validation";
9
+ export { ExecutorRegistry, executorRegistry, getExecutor, hasExecutor, } from "./executors";
10
+ export type { ExecutorRegistration } from "./executors";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Actions Module
3
+ *
4
+ * Unified execution layer for interventions (highlight, tooltip, badge, DOM modifications).
5
+ */
6
+ // Main factory
7
+ export { createActionEngine } from "./ActionEngine";
8
+ // Validation
9
+ export { validateAction, validateActions } from "./validation";
10
+ // Executors (for advanced usage)
11
+ export { ExecutorRegistry, executorRegistry, getExecutor, hasExecutor, } from "./executors";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAqDpD,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D,iCAAiC;AACjC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC"}