@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 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Example usage of mini-effector
3
+ */
4
+ import { createEvent, createStore, createEffect, sample } from "./mini-effector";
5
+ // Events
6
+ const tooltipDismissed = createEvent();
7
+ const tourStepCompleted = createEvent();
8
+ const pageViewed = createEvent();
9
+ // Stores
10
+ const $dismissedTooltips = createStore([]);
11
+ const $tourProgress = createStore({});
12
+ // Connect events → stores
13
+ $dismissedTooltips.on(tooltipDismissed, (list, { anchorId }) => [...list, anchorId]);
14
+ $tourProgress.on(tourStepCompleted, (progress, { tourId, step }) => ({
15
+ ...progress,
16
+ [tourId]: step,
17
+ }));
18
+ // Effect (async side effect)
19
+ const saveProgressFx = createEffect(async (data) => {
20
+ console.log("Saving progress:", data);
21
+ // await api.saveProgress(data);
22
+ return { saved: true };
23
+ });
24
+ // Wire event → effect with filter
25
+ sample({
26
+ clock: tourStepCompleted,
27
+ filter: ({ step }) => step > 0, // Only save after first step
28
+ fn: ({ tourId, step }) => ({ tourId, step }),
29
+ target: saveProgressFx,
30
+ });
31
+ // Watch for debugging
32
+ $dismissedTooltips.watch(list => console.log("Dismissed:", list));
33
+ $tourProgress.watch(progress => console.log("Progress:", progress));
34
+ saveProgressFx.done.watch(({ result }) => console.log("Saved:", result));
35
+ // Test it
36
+ console.log("--- Testing mini-effector ---");
37
+ tooltipDismissed({ anchorId: "#hero" });
38
+ tooltipDismissed({ anchorId: "#cta" });
39
+ tourStepCompleted({ tourId: "onboarding", step: 1 });
40
+ tourStepCompleted({ tourId: "onboarding", step: 2 });
41
+ console.log("Final dismissed:", $dismissedTooltips.getState());
42
+ console.log("Final progress:", $tourProgress.getState());
43
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../../src/store/example.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEjF,SAAS;AACT,MAAM,gBAAgB,GAAG,WAAW,EAAwB,CAAC;AAC7D,MAAM,iBAAiB,GAAG,WAAW,EAAoC,CAAC;AAC1E,MAAM,UAAU,GAAG,WAAW,EAAmB,CAAC;AAElD,SAAS;AACT,MAAM,kBAAkB,GAAG,WAAW,CAAW,EAAE,CAAC,CAAC;AACrD,MAAM,aAAa,GAAG,WAAW,CAAyB,EAAE,CAAC,CAAC;AAE9D,0BAA0B;AAC1B,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErF,aAAa,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,QAAQ;IACX,CAAC,MAAM,CAAC,EAAE,IAAI;CACf,CAAC,CAAC,CAAC;AAEJ,6BAA6B;AAC7B,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;IACnF,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACtC,gCAAgC;IAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,kCAAkC;AAClC,MAAM,CAAC;IACL,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,6BAA6B;IAC7D,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC;AAEH,sBAAsB;AACtB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;AAClE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzE,UAAU;AACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC7C,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AACxC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACvC,iBAAiB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACrD,iBAAiB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAErD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Mini Effector - Minimal event→state implementation
3
+ *
4
+ * Core concepts from Effector in ~100 lines:
5
+ * - createEvent: callable + subscribable
6
+ * - createStore: reactive state with .on() for event connections
7
+ * - sample: connect clock → source → filter → target
8
+ */
9
+ type Subscriber<T> = (payload: T) => void;
10
+ export interface Event<T> {
11
+ (payload: T): void;
12
+ watch(fn: Subscriber<T>): () => void;
13
+ /** Internal: get subscribers for sample() */
14
+ _subscribers: Set<Subscriber<T>>;
15
+ }
16
+ export declare function createEvent<T = void>(): Event<T>;
17
+ export interface Store<T> {
18
+ getState(): T;
19
+ watch(fn: Subscriber<T>): () => void;
20
+ on<E>(event: Event<E>, reducer: (state: T, payload: E) => T): Store<T>;
21
+ /** Internal: update state */
22
+ _setState(value: T): void;
23
+ }
24
+ export declare function createStore<T>(initialState: T): Store<T>;
25
+ export interface Effect<T, R> {
26
+ (payload: T): Promise<R>;
27
+ done: Event<{
28
+ params: T;
29
+ result: R;
30
+ }>;
31
+ fail: Event<{
32
+ params: T;
33
+ error: Error;
34
+ }>;
35
+ pending: Store<boolean>;
36
+ }
37
+ export declare function createEffect<T, R>(handler: (payload: T) => Promise<R>): Effect<T, R>;
38
+ interface SampleConfig<Clock, Source, Target, EffectResult = unknown> {
39
+ clock: Event<Clock>;
40
+ source?: Store<Source>;
41
+ filter?: (clockPayload: Clock, sourceState?: Source) => boolean;
42
+ fn?: (clockPayload: Clock, sourceState?: Source) => Target;
43
+ target?: Event<Target> | Effect<Target, EffectResult>;
44
+ }
45
+ export declare function sample<Clock, Source, Target, EffectResult = unknown>(config: SampleConfig<Clock, Source, Target, EffectResult>): void;
46
+ export {};
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Mini Effector - Minimal event→state implementation
3
+ *
4
+ * Core concepts from Effector in ~100 lines:
5
+ * - createEvent: callable + subscribable
6
+ * - createStore: reactive state with .on() for event connections
7
+ * - sample: connect clock → source → filter → target
8
+ */
9
+ export function createEvent() {
10
+ const subscribers = new Set();
11
+ const event = ((payload) => {
12
+ subscribers.forEach(fn => fn(payload));
13
+ });
14
+ event.watch = (fn) => {
15
+ subscribers.add(fn);
16
+ return () => subscribers.delete(fn);
17
+ };
18
+ event._subscribers = subscribers;
19
+ return event;
20
+ }
21
+ export function createStore(initialState) {
22
+ let state = initialState;
23
+ const subscribers = new Set();
24
+ const store = {
25
+ getState: () => state,
26
+ watch: (fn) => {
27
+ subscribers.add(fn);
28
+ return () => subscribers.delete(fn);
29
+ },
30
+ on: (event, reducer) => {
31
+ event.watch(payload => {
32
+ const nextState = reducer(state, payload);
33
+ if (nextState !== state) {
34
+ state = nextState;
35
+ subscribers.forEach(fn => fn(state));
36
+ }
37
+ });
38
+ return store;
39
+ },
40
+ _setState: (value) => {
41
+ if (value !== state) {
42
+ state = value;
43
+ subscribers.forEach(fn => fn(state));
44
+ }
45
+ },
46
+ };
47
+ return store;
48
+ }
49
+ export function createEffect(handler) {
50
+ const done = createEvent();
51
+ const fail = createEvent();
52
+ const pending = createStore(false);
53
+ pending.on(done, () => false);
54
+ pending.on(fail, () => false);
55
+ const effect = (async (payload) => {
56
+ pending._setState(true);
57
+ try {
58
+ const result = await handler(payload);
59
+ done({ params: payload, result });
60
+ return result;
61
+ }
62
+ catch (err) {
63
+ fail({ params: payload, error: err });
64
+ throw err;
65
+ }
66
+ });
67
+ effect.done = done;
68
+ effect.fail = fail;
69
+ effect.pending = pending;
70
+ return effect;
71
+ }
72
+ export function sample(config) {
73
+ const { clock, source, filter, fn, target } = config;
74
+ clock.watch(clockPayload => {
75
+ const sourceState = source === null || source === void 0 ? void 0 : source.getState();
76
+ // Check filter
77
+ if (filter && !filter(clockPayload, sourceState)) {
78
+ return;
79
+ }
80
+ // Transform
81
+ const result = fn
82
+ ? fn(clockPayload, sourceState)
83
+ : clockPayload;
84
+ // Send to target
85
+ if (target) {
86
+ target(result);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=mini-effector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mini-effector.js","sourceRoot":"","sources":["../../src/store/mini-effector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Surfaces
3
+ *
4
+ * Managed surface system for rendering UI into named slots.
5
+ * Handles layout, stacking, animations, and priority-based arbitration.
6
+ */
7
+ import type { Surfaces, SurfacesOptions } from "./types";
8
+ /**
9
+ * Create a Surfaces instance.
10
+ */
11
+ export declare function createSurfaces(options: SurfacesOptions): Surfaces;
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Surfaces
3
+ *
4
+ * Managed surface system for rendering UI into named slots.
5
+ * Handles layout, stacking, animations, and priority-based arbitration.
6
+ */
7
+ import { getSlotType, getSlotAnchorId } from "./types";
8
+ import { sanitizeWithFallback } from "../hostPatcher/core/sanitizer";
9
+ import { applyStaticSlotStyles, setupAdjacentPositioning, setupInlinePositioning, playEnterAnimation, playExitAnimation, createSurfaceContainer, getSlotZIndex, } from "./positioning";
10
+ /** Counter for generating unique mount IDs */
11
+ let mountIdCounter = 0;
12
+ /**
13
+ * Create a Surfaces instance.
14
+ */
15
+ export function createSurfaces(options) {
16
+ const { overlayRoot, eventBus, anchorResolver, defaultAnimation = "fade", widgetRegistry, } = options;
17
+ /** Map of current mounts by slot */
18
+ const mounts = new Map();
19
+ /** Map of mount counts by slot (for stats) */
20
+ const mountCounts = new Map();
21
+ /** Map of state change callbacks by slot */
22
+ const stateCallbacks = new Map();
23
+ /**
24
+ * Generate a unique mount ID.
25
+ */
26
+ function generateMountId() {
27
+ return `mount-${++mountIdCounter}`;
28
+ }
29
+ /**
30
+ * Publish an event to the EventBus if available.
31
+ */
32
+ function publishEvent(name, props) {
33
+ if (eventBus) {
34
+ eventBus.publish(name, props);
35
+ }
36
+ }
37
+ /**
38
+ * Notify state change callbacks for a slot.
39
+ */
40
+ function notifyStateChange(slot) {
41
+ const callbacks = stateCallbacks.get(slot);
42
+ if (callbacks) {
43
+ const state = getState(slot);
44
+ for (const callback of callbacks) {
45
+ try {
46
+ callback(state);
47
+ }
48
+ catch (error) {
49
+ console.error("[Surfaces] State callback error:", error);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ /** Track mounted widget handles for cleanup */
55
+ const widgetHandles = new Map();
56
+ /**
57
+ * Render content into a container.
58
+ */
59
+ function renderContent(container, content, mountId) {
60
+ switch (content.type) {
61
+ case "html":
62
+ container.innerHTML = sanitizeWithFallback(content.content);
63
+ return undefined;
64
+ case "widget": {
65
+ // Use widget registry if available
66
+ if (widgetRegistry && widgetRegistry.has(content.widgetId)) {
67
+ const handle = widgetRegistry.mount(content.widgetId, container, content.config);
68
+ if (mountId) {
69
+ widgetHandles.set(mountId, handle);
70
+ }
71
+ return () => {
72
+ handle.unmount();
73
+ if (mountId) {
74
+ widgetHandles.delete(mountId);
75
+ }
76
+ };
77
+ }
78
+ // Fallback: create a placeholder if widget not found
79
+ console.warn(`[Surfaces] Widget not found: ${content.widgetId}`);
80
+ container.innerHTML = `<div data-widget-id="${content.widgetId}" data-widget-missing="true">Widget: ${content.widgetId}</div>`;
81
+ return undefined;
82
+ }
83
+ case "custom":
84
+ return content.mount(container);
85
+ case "react":
86
+ // React rendering would require ReactDOM
87
+ // For now, create a placeholder
88
+ container.innerHTML = `<div data-react-component>React Component</div>`;
89
+ return undefined;
90
+ default:
91
+ console.warn("[Surfaces] Unknown content type");
92
+ return undefined;
93
+ }
94
+ }
95
+ /**
96
+ * Mount content to a surface slot.
97
+ */
98
+ function mount(slot, content, opts) {
99
+ var _a, _b, _c, _d, _e, _f, _g, _h;
100
+ const id = generateMountId();
101
+ const slotType = getSlotType(slot);
102
+ const priority = (_a = opts === null || opts === void 0 ? void 0 : opts.priority) !== null && _a !== void 0 ? _a : 0;
103
+ const animation = (_b = opts === null || opts === void 0 ? void 0 : opts.animation) !== null && _b !== void 0 ? _b : defaultAnimation;
104
+ const exclusive = (_c = opts === null || opts === void 0 ? void 0 : opts.exclusive) !== null && _c !== void 0 ? _c : true;
105
+ // Check for existing mount
106
+ const existingMount = mounts.get(slot);
107
+ if (existingMount) {
108
+ if (exclusive) {
109
+ // Priority-based arbitration
110
+ if (existingMount.options.priority > priority) {
111
+ throw new Error(`Slot ${slot} is occupied by higher priority content (${existingMount.options.priority} > ${priority})`);
112
+ }
113
+ // Unmount existing content
114
+ unmountEntry(existingMount);
115
+ }
116
+ }
117
+ // Create container
118
+ const container = createSurfaceContainer(slot, id);
119
+ container.style.zIndex = String(getSlotZIndex(slot));
120
+ // Set up positioning based on slot type
121
+ let positionCleanup;
122
+ if (slotType === "static") {
123
+ applyStaticSlotStyles(container, slot, opts === null || opts === void 0 ? void 0 : opts.constraints);
124
+ overlayRoot.appendChild(container);
125
+ }
126
+ else if (slotType === "inline") {
127
+ const anchorId = getSlotAnchorId(slot);
128
+ if (!anchorId) {
129
+ throw new Error(`Invalid inline slot: ${slot}`);
130
+ }
131
+ if (!anchorResolver) {
132
+ throw new Error("Anchor resolver required for inline slots");
133
+ }
134
+ const anchorEl = anchorResolver(anchorId);
135
+ if (!anchorEl) {
136
+ throw new Error(`Anchor not found for inline slot: ${anchorId}`);
137
+ }
138
+ positionCleanup = setupInlinePositioning(container, anchorEl);
139
+ }
140
+ else if (slotType === "adjacent") {
141
+ const anchorId = getSlotAnchorId(slot);
142
+ if (!anchorId) {
143
+ throw new Error(`Invalid adjacent slot: ${slot}`);
144
+ }
145
+ if (!anchorResolver) {
146
+ throw new Error("Anchor resolver required for adjacent slots");
147
+ }
148
+ const anchorEl = anchorResolver(anchorId);
149
+ if (!anchorEl) {
150
+ throw new Error(`Anchor not found for adjacent slot: ${anchorId}`);
151
+ }
152
+ overlayRoot.appendChild(container);
153
+ positionCleanup = setupAdjacentPositioning(container, anchorEl, (_d = opts === null || opts === void 0 ? void 0 : opts.position) !== null && _d !== void 0 ? _d : { placement: "bottom" });
154
+ }
155
+ // Render content
156
+ const contentCleanup = renderContent(container, content, id);
157
+ // Play enter animation
158
+ playEnterAnimation(container, animation);
159
+ // Create internal entry
160
+ const entry = {
161
+ id,
162
+ slot,
163
+ content,
164
+ options: {
165
+ priority,
166
+ exclusive,
167
+ animation,
168
+ position: (_e = opts === null || opts === void 0 ? void 0 : opts.position) !== null && _e !== void 0 ? _e : { placement: "auto" },
169
+ constraints: (_f = opts === null || opts === void 0 ? void 0 : opts.constraints) !== null && _f !== void 0 ? _f : {},
170
+ adaptiveId: opts === null || opts === void 0 ? void 0 : opts.adaptiveId,
171
+ autoUnmountOnRouteChange: (_g = opts === null || opts === void 0 ? void 0 : opts.autoUnmountOnRouteChange) !== null && _g !== void 0 ? _g : true,
172
+ },
173
+ container,
174
+ cleanup: () => {
175
+ positionCleanup === null || positionCleanup === void 0 ? void 0 : positionCleanup();
176
+ contentCleanup === null || contentCleanup === void 0 ? void 0 : contentCleanup();
177
+ },
178
+ mountedAt: Date.now(),
179
+ };
180
+ // Store mount
181
+ mounts.set(slot, entry);
182
+ // Update mount count
183
+ mountCounts.set(slot, ((_h = mountCounts.get(slot)) !== null && _h !== void 0 ? _h : 0) + 1);
184
+ // Publish event
185
+ publishEvent("surface.mounted", {
186
+ slot,
187
+ id,
188
+ adaptiveId: opts === null || opts === void 0 ? void 0 : opts.adaptiveId,
189
+ });
190
+ // Notify state change
191
+ notifyStateChange(slot);
192
+ // Create and return handle
193
+ const handle = {
194
+ id,
195
+ update(newContent) {
196
+ const entry = mounts.get(slot);
197
+ if (!entry || entry.id !== id) {
198
+ throw new Error("Mount no longer active");
199
+ }
200
+ // Clean up existing widget handle if present
201
+ const existingWidgetHandle = widgetHandles.get(id);
202
+ if (existingWidgetHandle) {
203
+ // If content is a widget and we have an update method, use it
204
+ if (newContent.type === "widget") {
205
+ existingWidgetHandle.update(newContent.config);
206
+ entry.content = newContent;
207
+ return;
208
+ }
209
+ // Otherwise, unmount the old widget
210
+ existingWidgetHandle.unmount();
211
+ widgetHandles.delete(id);
212
+ }
213
+ // Clear existing content
214
+ entry.container.innerHTML = "";
215
+ // Render new content
216
+ const newCleanup = renderContent(entry.container, newContent, id);
217
+ entry.content = newContent;
218
+ // Update cleanup if needed
219
+ if (newCleanup) {
220
+ const oldCleanup = entry.cleanup;
221
+ entry.cleanup = () => {
222
+ oldCleanup === null || oldCleanup === void 0 ? void 0 : oldCleanup();
223
+ newCleanup();
224
+ };
225
+ }
226
+ },
227
+ setOptions(newOpts) {
228
+ const entry = mounts.get(slot);
229
+ if (!entry || entry.id !== id) {
230
+ throw new Error("Mount no longer active");
231
+ }
232
+ // Update options
233
+ if (newOpts.priority !== undefined) {
234
+ entry.options.priority = newOpts.priority;
235
+ }
236
+ if (newOpts.animation !== undefined) {
237
+ entry.options.animation = newOpts.animation;
238
+ }
239
+ // Re-apply constraints if changed
240
+ if (newOpts.constraints && slotType === "static") {
241
+ if (newOpts.constraints.maxWidth)
242
+ entry.container.style.maxWidth = newOpts.constraints.maxWidth;
243
+ if (newOpts.constraints.maxHeight)
244
+ entry.container.style.maxHeight = newOpts.constraints.maxHeight;
245
+ if (newOpts.constraints.minWidth)
246
+ entry.container.style.minWidth = newOpts.constraints.minWidth;
247
+ if (newOpts.constraints.minHeight)
248
+ entry.container.style.minHeight = newOpts.constraints.minHeight;
249
+ }
250
+ notifyStateChange(slot);
251
+ },
252
+ async unmount() {
253
+ const entry = mounts.get(slot);
254
+ if (!entry || entry.id !== id)
255
+ return;
256
+ await unmountEntry(entry);
257
+ },
258
+ isMounted() {
259
+ const entry = mounts.get(slot);
260
+ return (entry === null || entry === void 0 ? void 0 : entry.id) === id;
261
+ },
262
+ getContainer() {
263
+ const entry = mounts.get(slot);
264
+ return (entry === null || entry === void 0 ? void 0 : entry.id) === id ? entry.container : null;
265
+ },
266
+ };
267
+ return handle;
268
+ }
269
+ /**
270
+ * Unmount an entry with animation.
271
+ */
272
+ async function unmountEntry(entry) {
273
+ var _a;
274
+ // Play exit animation
275
+ await playExitAnimation(entry.container, entry.options.animation);
276
+ // Run cleanup
277
+ (_a = entry.cleanup) === null || _a === void 0 ? void 0 : _a.call(entry);
278
+ // Remove container
279
+ entry.container.remove();
280
+ // Remove from mounts
281
+ mounts.delete(entry.slot);
282
+ // Publish event
283
+ publishEvent("surface.unmounted", {
284
+ slot: entry.slot,
285
+ id: entry.id,
286
+ });
287
+ // Notify state change
288
+ notifyStateChange(entry.slot);
289
+ }
290
+ /**
291
+ * Get the current state of a slot.
292
+ */
293
+ function getState(slot) {
294
+ var _a;
295
+ const entry = mounts.get(slot);
296
+ return {
297
+ slot,
298
+ occupied: !!entry,
299
+ currentPriority: entry === null || entry === void 0 ? void 0 : entry.options.priority,
300
+ currentAdaptiveId: entry === null || entry === void 0 ? void 0 : entry.options.adaptiveId,
301
+ mountCount: (_a = mountCounts.get(slot)) !== null && _a !== void 0 ? _a : 0,
302
+ currentMountId: entry === null || entry === void 0 ? void 0 : entry.id,
303
+ };
304
+ }
305
+ /**
306
+ * Subscribe to state changes for a slot.
307
+ */
308
+ function onStateChange(slot, fn) {
309
+ let callbacks = stateCallbacks.get(slot);
310
+ if (!callbacks) {
311
+ callbacks = new Set();
312
+ stateCallbacks.set(slot, callbacks);
313
+ }
314
+ callbacks.add(fn);
315
+ return () => {
316
+ callbacks === null || callbacks === void 0 ? void 0 : callbacks.delete(fn);
317
+ if ((callbacks === null || callbacks === void 0 ? void 0 : callbacks.size) === 0) {
318
+ stateCallbacks.delete(slot);
319
+ }
320
+ };
321
+ }
322
+ /**
323
+ * Check if content can be mounted to a slot.
324
+ */
325
+ function canMount(slot, priority) {
326
+ const existingMount = mounts.get(slot);
327
+ if (!existingMount)
328
+ return true;
329
+ // Check priority if provided
330
+ if (priority !== undefined) {
331
+ return priority >= existingMount.options.priority;
332
+ }
333
+ return false;
334
+ }
335
+ /**
336
+ * Clean up all mounted surfaces.
337
+ */
338
+ function destroy() {
339
+ var _a;
340
+ // Unmount all surfaces
341
+ for (const entry of mounts.values()) {
342
+ try {
343
+ (_a = entry.cleanup) === null || _a === void 0 ? void 0 : _a.call(entry);
344
+ entry.container.remove();
345
+ }
346
+ catch (error) {
347
+ console.error("[Surfaces] Error during cleanup:", error);
348
+ }
349
+ }
350
+ mounts.clear();
351
+ stateCallbacks.clear();
352
+ }
353
+ return {
354
+ mount,
355
+ getState,
356
+ onStateChange,
357
+ canMount,
358
+ destroy,
359
+ };
360
+ }
361
+ //# sourceMappingURL=Surfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Surfaces.js","sourceRoot":"","sources":["../../src/surfaces/Surfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Surfaces Module
3
+ *
4
+ * Managed surface system for rendering UI into named slots.
5
+ */
6
+ export { createSurfaces } from "./Surfaces";
7
+ export type { Surfaces, SurfacesOptions, SurfacesWidgetRegistry, MountHandle, SurfaceState, SurfaceChangeCallback, SurfaceSlot, StaticSurfaceSlot, InlineSurfaceSlot, AdjacentSurfaceSlot, RenderableContent, ReactContent, HtmlContent, WidgetContent, CustomContent, MountOptions, PositionConfig, MountConstraints, AnimationType, } from "./types";
8
+ export { getSlotType, getSlotAnchorId } from "./types";
9
+ export { STATIC_SLOT_STYLES, ANIMATION_KEYFRAMES, applyStaticSlotStyles, setupAdjacentPositioning, setupInlinePositioning, playEnterAnimation, playExitAnimation, createSurfaceContainer, getSlotZIndex, } from "./positioning";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Surfaces Module
3
+ *
4
+ * Managed surface system for rendering UI into named slots.
5
+ */
6
+ // Main factory
7
+ export { createSurfaces } from "./Surfaces";
8
+ // Utilities
9
+ export { getSlotType, getSlotAnchorId } from "./types";
10
+ // Positioning (for advanced usage)
11
+ export { STATIC_SLOT_STYLES, ANIMATION_KEYFRAMES, applyStaticSlotStyles, setupAdjacentPositioning, setupInlinePositioning, playEnterAnimation, playExitAnimation, createSurfaceContainer, getSlotZIndex, } from "./positioning";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgC5C,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEvD,mCAAmC;AACnC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,GACd,MAAM,eAAe,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Surfaces Positioning
3
+ *
4
+ * Handles positioning for different slot types using CSS for static slots
5
+ * and Floating UI for adjacent slots.
6
+ */
7
+ import type { SurfaceSlot, StaticSurfaceSlot, PositionConfig, MountConstraints, AnimationType } from "./types";
8
+ /**
9
+ * CSS styles for static surface slots.
10
+ */
11
+ export declare const STATIC_SLOT_STYLES: Record<StaticSurfaceSlot, Record<string, string>>;
12
+ /**
13
+ * Animation keyframes for different animation types.
14
+ */
15
+ export declare const ANIMATION_KEYFRAMES: Record<AnimationType, Keyframe[]>;
16
+ /**
17
+ * Animation options.
18
+ */
19
+ export declare const ANIMATION_OPTIONS: KeyframeAnimationOptions;
20
+ /**
21
+ * Apply static slot positioning to an element.
22
+ */
23
+ export declare function applyStaticSlotStyles(element: HTMLElement, slot: StaticSurfaceSlot, constraints?: MountConstraints): void;
24
+ /**
25
+ * Set up adjacent slot positioning using Floating UI.
26
+ * Returns a cleanup function.
27
+ */
28
+ export declare function setupAdjacentPositioning(container: HTMLElement, anchorEl: HTMLElement, config: PositionConfig): () => void;
29
+ /**
30
+ * Set up inline slot positioning.
31
+ * Inline slots render content inside the anchor element.
32
+ */
33
+ export declare function setupInlinePositioning(container: HTMLElement, anchorEl: HTMLElement, position?: "prepend" | "append"): () => void;
34
+ /**
35
+ * Play enter animation on an element.
36
+ */
37
+ export declare function playEnterAnimation(element: HTMLElement, animationType: AnimationType): Animation | null;
38
+ /**
39
+ * Play exit animation on an element.
40
+ * Returns a promise that resolves when the animation completes.
41
+ */
42
+ export declare function playExitAnimation(element: HTMLElement, animationType: AnimationType): Promise<void>;
43
+ /**
44
+ * Create and style a surface container element.
45
+ */
46
+ export declare function createSurfaceContainer(slot: SurfaceSlot, id: string): HTMLElement;
47
+ /**
48
+ * Get the z-index for a slot type.
49
+ */
50
+ export declare function getSlotZIndex(slot: SurfaceSlot): number;