@syntrologie/runtime-sdk 2.1.0-canary.8 → 2.1.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 (159) hide show
  1. package/CAPABILITIES.md +415 -115
  2. package/dist/SmartCanvasApp.d.ts +1 -3
  3. package/dist/SmartCanvasApp.js +16 -10
  4. package/dist/SmartCanvasApp.js.map +1 -1
  5. package/dist/SmartCanvasElement.d.ts +0 -2
  6. package/dist/SmartCanvasElement.js +3 -8
  7. package/dist/SmartCanvasElement.js.map +1 -1
  8. package/dist/actions/executors/index.js +4 -1
  9. package/dist/actions/executors/index.js.map +1 -1
  10. package/dist/actions/executors/tour.js +2 -2
  11. package/dist/actions/executors/tour.js.map +1 -1
  12. package/dist/actions/validation.js +5 -30
  13. package/dist/actions/validation.js.map +1 -1
  14. package/dist/adaptives/adaptive-chatbot/index.js +7 -5
  15. package/dist/adaptives/adaptive-chatbot/index.js.map +4 -4
  16. package/dist/adaptives/adaptive-content/index.js +22 -0
  17. package/dist/adaptives/adaptive-content/index.js.map +7 -0
  18. package/dist/adaptives/adaptive-faq/index.js +11 -0
  19. package/dist/adaptives/adaptive-faq/index.js.map +7 -0
  20. package/dist/adaptives/adaptive-gamification/index.js +2 -0
  21. package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
  22. package/dist/adaptives/adaptive-nav/index.js +12 -0
  23. package/dist/adaptives/adaptive-nav/index.js.map +7 -0
  24. package/dist/adaptives/adaptive-overlays/index.js +94 -0
  25. package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
  26. package/dist/api.d.ts +1 -9
  27. package/dist/api.js +5 -5
  28. package/dist/api.js.map +1 -1
  29. package/dist/apps/AppLoader.d.ts +5 -0
  30. package/dist/apps/AppLoader.js +28 -3
  31. package/dist/apps/AppLoader.js.map +1 -1
  32. package/dist/apps/index.d.ts +1 -1
  33. package/dist/apps/types.d.ts +26 -0
  34. package/dist/blocks/data/ComparisonBlock.js +12 -9
  35. package/dist/blocks/data/ComparisonBlock.js.map +1 -1
  36. package/dist/blocks/data/StatsBlock.js +11 -10
  37. package/dist/blocks/data/StatsBlock.js.map +1 -1
  38. package/dist/blocks/index.d.ts +9 -5
  39. package/dist/blocks/index.js +2 -2
  40. package/dist/blocks/index.js.map +1 -1
  41. package/dist/blocks/interactive/ChecklistBlock.js +13 -12
  42. package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
  43. package/dist/blocks/interactive/RatingBlock.js +18 -12
  44. package/dist/blocks/interactive/RatingBlock.js.map +1 -1
  45. package/dist/blocks/notification/NotificationBlock.js +24 -23
  46. package/dist/blocks/notification/NotificationBlock.js.map +1 -1
  47. package/dist/blocks/theme-tokens.d.ts +23 -0
  48. package/dist/blocks/theme-tokens.js +25 -0
  49. package/dist/blocks/theme-tokens.js.map +1 -0
  50. package/dist/bootstrap.js +21 -24
  51. package/dist/bootstrap.js.map +1 -1
  52. package/dist/components/ShadowCanvasOverlay.d.ts +6 -3
  53. package/dist/components/ShadowCanvasOverlay.js +191 -115
  54. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  55. package/dist/components/TileCard.d.ts +1 -5
  56. package/dist/components/TileCard.js +62 -286
  57. package/dist/components/TileCard.js.map +1 -1
  58. package/dist/components/TileWheel.js +24 -4
  59. package/dist/components/TileWheel.js.map +1 -1
  60. package/dist/configFetcher.d.ts +5 -1
  61. package/dist/configFetcher.js +33 -2
  62. package/dist/configFetcher.js.map +1 -1
  63. package/dist/context/ContextManager.js +3 -2
  64. package/dist/context/ContextManager.js.map +1 -1
  65. package/dist/decisions/engine.d.ts +4 -0
  66. package/dist/decisions/engine.js +6 -1
  67. package/dist/decisions/engine.js.map +1 -1
  68. package/dist/decisions/schema.d.ts +241 -0
  69. package/dist/decisions/schema.js +8 -0
  70. package/dist/decisions/schema.js.map +1 -1
  71. package/dist/decisions/strategies/rules.js +14 -0
  72. package/dist/decisions/strategies/rules.js.map +1 -1
  73. package/dist/decisions/types.d.ts +21 -1
  74. package/dist/editorLoader.d.ts +19 -9
  75. package/dist/editorLoader.js +112 -94
  76. package/dist/editorLoader.js.map +1 -1
  77. package/dist/events/EventAccumulator.d.ts +29 -0
  78. package/dist/events/EventAccumulator.js +101 -0
  79. package/dist/events/EventAccumulator.js.map +1 -0
  80. package/dist/events/index.d.ts +2 -0
  81. package/dist/events/index.js +1 -0
  82. package/dist/events/index.js.map +1 -1
  83. package/dist/events/normalizers/posthog.js +12 -4
  84. package/dist/events/normalizers/posthog.js.map +1 -1
  85. package/dist/events/types.d.ts +4 -0
  86. package/dist/events/types.js +5 -0
  87. package/dist/events/types.js.map +1 -1
  88. package/dist/experiments/adapters/growthbook.d.ts +2 -1
  89. package/dist/experiments/adapters/growthbook.js +11 -23
  90. package/dist/experiments/adapters/growthbook.js.map +1 -1
  91. package/dist/experiments/types.d.ts +5 -0
  92. package/dist/fetchers/experimentsFetcher.d.ts +23 -1
  93. package/dist/fetchers/experimentsFetcher.js +48 -1
  94. package/dist/fetchers/experimentsFetcher.js.map +1 -1
  95. package/dist/fetchers/mergeConfigs.d.ts +29 -0
  96. package/dist/fetchers/mergeConfigs.js +38 -0
  97. package/dist/fetchers/mergeConfigs.js.map +1 -0
  98. package/dist/hooks/useShadowCanvasConfig.js +1 -1
  99. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.js +28 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/notifications/NotificationToastStack.d.ts +8 -0
  104. package/dist/notifications/NotificationToastStack.js +118 -0
  105. package/dist/notifications/NotificationToastStack.js.map +1 -0
  106. package/dist/notifications/index.d.ts +9 -0
  107. package/dist/notifications/index.js +6 -0
  108. package/dist/notifications/index.js.map +1 -0
  109. package/dist/notifications/matcher.d.ts +25 -0
  110. package/dist/notifications/matcher.js +66 -0
  111. package/dist/notifications/matcher.js.map +1 -0
  112. package/dist/notifications/types.d.ts +64 -0
  113. package/dist/notifications/types.js +13 -0
  114. package/dist/notifications/types.js.map +1 -0
  115. package/dist/notifications/useNotifications.d.ts +19 -0
  116. package/dist/notifications/useNotifications.js +104 -0
  117. package/dist/notifications/useNotifications.js.map +1 -0
  118. package/dist/notifications/useNotifyWatcher.d.ts +15 -0
  119. package/dist/notifications/useNotifyWatcher.js +62 -0
  120. package/dist/notifications/useNotifyWatcher.js.map +1 -0
  121. package/dist/overlays/runtime/overlay/runner.js +2 -2
  122. package/dist/overlays/runtime/overlay/runner.js.map +1 -1
  123. package/dist/render/RenderContext.js +5 -3
  124. package/dist/render/RenderContext.js.map +1 -1
  125. package/dist/render/types.d.ts +2 -3
  126. package/dist/runtime.d.ts +3 -0
  127. package/dist/runtime.js +28 -12
  128. package/dist/runtime.js.map +1 -1
  129. package/dist/smart-canvas.esm.js +131 -102
  130. package/dist/smart-canvas.esm.js.map +4 -4
  131. package/dist/smart-canvas.js +40870 -43700
  132. package/dist/smart-canvas.js.map +4 -4
  133. package/dist/smart-canvas.min.js +131 -102
  134. package/dist/smart-canvas.min.js.map +4 -4
  135. package/dist/theme/defaultTheme.d.ts +7 -3
  136. package/dist/theme/defaultTheme.js +78 -51
  137. package/dist/theme/defaultTheme.js.map +1 -1
  138. package/dist/theme/index.d.ts +1 -1
  139. package/dist/theme/index.js +1 -1
  140. package/dist/theme/index.js.map +1 -1
  141. package/dist/theme/types.d.ts +7 -0
  142. package/dist/types.d.ts +13 -100
  143. package/dist/types.js.map +1 -1
  144. package/dist/version.d.ts +1 -1
  145. package/dist/version.js +1 -1
  146. package/dist/version.js.map +1 -1
  147. package/dist/widgets/WidgetRegistry.d.ts +6 -1
  148. package/dist/widgets/WidgetRegistry.js +12 -4
  149. package/dist/widgets/WidgetRegistry.js.map +1 -1
  150. package/package.json +18 -12
  151. package/schema/canvas-config.schema.json +34 -69
  152. package/schema/event-catalog.schema.json +157 -0
  153. package/scripts/validate-config.mjs +20 -13
  154. package/dist/adaptives/faq/index.js +0 -11
  155. package/dist/adaptives/faq/index.js.map +0 -7
  156. package/dist/adaptives/gamification/index.js +0 -2
  157. package/dist/adaptives/gamification/index.js.map +0 -7
  158. package/dist/adaptives/nav/index.js +0 -11
  159. package/dist/adaptives/nav/index.js.map +0 -7
@@ -70,6 +70,10 @@ export declare const StandardEvents: {
70
70
  readonly ACTION_REVERTED: "action.reverted";
71
71
  readonly ACTION_FAILED: "action.failed";
72
72
  readonly ACTION_CTA_CLICKED: "action.cta_clicked";
73
+ readonly NOTIFICATION_SHOWN: "notification.shown";
74
+ readonly NOTIFICATION_CLICKED: "notification.clicked";
75
+ readonly NOTIFICATION_DISMISSED: "notification.dismissed";
76
+ readonly NOTIFICATION_DEEP_LINK: "notification.deep_link";
73
77
  readonly SURFACE_MOUNTED: "surface.mounted";
74
78
  readonly SURFACE_UNMOUNTED: "surface.unmounted";
75
79
  };
@@ -38,6 +38,11 @@ export const StandardEvents = {
38
38
  ACTION_REVERTED: 'action.reverted',
39
39
  ACTION_FAILED: 'action.failed',
40
40
  ACTION_CTA_CLICKED: 'action.cta_clicked',
41
+ // Notification events
42
+ NOTIFICATION_SHOWN: 'notification.shown',
43
+ NOTIFICATION_CLICKED: 'notification.clicked',
44
+ NOTIFICATION_DISMISSED: 'notification.dismissed',
45
+ NOTIFICATION_DEEP_LINK: 'notification.deep_link',
41
46
  // Surface events
42
47
  SURFACE_MOUNTED: 'surface.mounted',
43
48
  SURFACE_UNMOUNTED: 'surface.unmounted',
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAEhC,gBAAgB;IAChB,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAE1C,uCAAuC;IACvC,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IAExC,gBAAgB;IAChB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,kBAAkB,EAAE,oBAAoB;IAExC,iBAAiB;IACjB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAEhC,gBAAgB;IAChB,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAE1C,uCAAuC;IACvC,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IAExC,gBAAgB;IAChB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,kBAAkB,EAAE,oBAAoB;IAExC,sBAAsB;IACtB,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,sBAAsB,EAAE,wBAAwB;IAChD,sBAAsB,EAAE,wBAAwB;IAEhD,iBAAiB;IACjB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC"}
@@ -53,7 +53,8 @@ export declare class GrowthBookAdapter implements ExperimentClient {
53
53
  setAttributes(attrs: Record<string, unknown>): void;
54
54
  setForcedVariations(variations: Record<string, number>): void;
55
55
  getFeatureValue<T>(key: string, fallback: T): T;
56
- shouldRenderRectangle(tile: TileConfig): boolean;
56
+ getAllFeatures(): Record<string, unknown>;
57
+ shouldRenderRectangle(_tile: TileConfig): boolean;
57
58
  }
58
59
  /**
59
60
  * Create an ExperimentClient backed by GrowthBook.
@@ -58,30 +58,18 @@ export class GrowthBookAdapter {
58
58
  getFeatureValue(key, fallback) {
59
59
  return this.gb.getFeatureValue(key, fallback);
60
60
  }
61
- shouldRenderRectangle(tile) {
62
- const { experiment } = tile;
63
- if (!experiment)
64
- return true;
65
- if (!experiment.featureKey)
66
- return true;
67
- const value = this.gb.getFeatureValue(experiment.featureKey, null);
68
- if (value === null || value === undefined)
69
- return false;
70
- if (typeof experiment.variationId === 'number') {
71
- return Number(value) === experiment.variationId;
61
+ getAllFeatures() {
62
+ const features = this.gb.getFeatures();
63
+ const result = {};
64
+ for (const key of Object.keys(features)) {
65
+ result[key] = this.gb.getFeatureValue(key, null);
72
66
  }
73
- if (typeof experiment.variationValue !== 'undefined') {
74
- return value === experiment.variationValue;
75
- }
76
- if (experiment.predicate) {
77
- try {
78
- return experiment.predicate(value);
79
- }
80
- catch {
81
- return false;
82
- }
83
- }
84
- return Boolean(value);
67
+ return result;
68
+ }
69
+ shouldRenderRectangle(_tile) {
70
+ // Legacy experiment-based filtering has been removed.
71
+ // Tile visibility is now managed via WidgetRegistry and runtime.filterTiles().
72
+ return true;
85
73
  }
86
74
  }
87
75
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAepD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AA4BhF;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAG5B,YAAY,UAAoC,EAAE;;QAChD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB;gBACjD,CAAC,CAAC,CAAC,UAA+B,EAAE,MAAuB,EAAE,EAAE;oBAC3D,OAAO,CAAC,kBAAmB,CACzB,UAAU,CAAC,GAAG,EACd,MAAM,CAAC,WAAW,EAClB,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,WAAW,EAAE,CACpF,CAAC;gBACJ,CAAC;gBACH,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC;gBACvB,GAAG,OAAO;gBACV,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,2BAA2B;gBACvD,yEAAyE;gBACzE,0EAA0E;gBAC1E,aAAa,EAAE,MAAA,OAAO,CAAC,aAAa,mCAAI,IAAI;gBAC5C,uCAAuC;gBACvC,gBAAgB;aACjB,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,KAA8B;QAC1C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,mBAAmB,CAAC,UAAkC;QACpD,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAI,GAAW,EAAE,QAAW;QACzC,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAM,CAAC;IACrD,CAAC;IAED,cAAc;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB,CAAC,KAAiB;QACrC,sDAAsD;QACtD,+EAA+E;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAoC,EAAE;IAC3E,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
@@ -27,6 +27,11 @@ export interface ExperimentClient {
27
27
  * Refresh/load feature flags from the server.
28
28
  */
29
29
  refreshFeatures?(): Promise<void>;
30
+ /**
31
+ * Get all loaded features (for prefix-based discovery).
32
+ * Returns a map of feature key -> feature value.
33
+ */
34
+ getAllFeatures?(): Record<string, unknown>;
30
35
  }
31
36
  /**
32
37
  * @deprecated Use ExperimentClient instead
@@ -6,10 +6,21 @@ export interface ExperimentsFetcherOptions {
6
6
  */
7
7
  client: ExperimentClient;
8
8
  /**
9
- * Feature key that contains the config object.
9
+ * Single feature key for the monolithic config (legacy mode).
10
10
  * @default "smart-canvas-config"
11
11
  */
12
12
  featureKey?: string;
13
+ /**
14
+ * Feature key for the variant manifest (lists active variant flag keys).
15
+ * When set, enables multi-flag mode.
16
+ */
17
+ manifestKey?: string;
18
+ /**
19
+ * Prefix for convention-based variant flag discovery.
20
+ * All GrowthBook features matching this prefix will be evaluated.
21
+ * Used as fallback when manifestKey is not set or returns empty.
22
+ */
23
+ variantFlagPrefix?: string;
13
24
  }
14
25
  /**
15
26
  * Fetches config from an experiment/feature flag system.
@@ -24,8 +35,19 @@ export declare class ExperimentsFetcher implements ConfigFetcher {
24
35
  readonly name = "experiments";
25
36
  private client;
26
37
  private featureKey;
38
+ private manifestKey?;
39
+ private variantFlagPrefix?;
27
40
  constructor(options: ExperimentsFetcherOptions);
28
41
  fetch(): Promise<FetchResult>;
42
+ /**
43
+ * Resolve config from multiple variant feature flags.
44
+ * Returns the first active variant config, or null if none match.
45
+ */
46
+ private fetchMultiFlag;
47
+ /**
48
+ * Get variant flag keys from manifest or prefix discovery.
49
+ */
50
+ private getVariantFlagKeys;
29
51
  }
30
52
  /**
31
53
  * Factory function for creating an experiments-based fetcher.
@@ -1,3 +1,4 @@
1
+ import { resolveVariantConfigs } from './mergeConfigs';
1
2
  /**
2
3
  * URL parameters for forcing experiment variations in preview mode.
3
4
  * Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1
@@ -19,6 +20,8 @@ export class ExperimentsFetcher {
19
20
  this.name = 'experiments';
20
21
  this.client = options.client;
21
22
  this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a : 'smart-canvas-config';
23
+ this.manifestKey = options.manifestKey;
24
+ this.variantFlagPrefix = options.variantFlagPrefix;
22
25
  }
23
26
  async fetch() {
24
27
  var _a, _b;
@@ -36,7 +39,18 @@ export class ExperimentsFetcher {
36
39
  }
37
40
  }
38
41
  }
39
- // Get config from experiment client (GrowthBook feature flag)
42
+ // Multi-flag mode: evaluate multiple feature flags and merge configs
43
+ if (this.manifestKey || this.variantFlagPrefix) {
44
+ const config = this.fetchMultiFlag();
45
+ if (config) {
46
+ const fetchTimeMs = performance.now() - start;
47
+ return {
48
+ config,
49
+ meta: { source: 'experiments', fetchTimeMs, cached: true },
50
+ };
51
+ }
52
+ }
53
+ // Legacy single-flag mode
40
54
  const config = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.featureKey, null);
41
55
  if (!config || typeof config !== 'object') {
42
56
  throw new Error(`[SmartCanvas] Feature "${this.featureKey}" not found or invalid. ` +
@@ -52,6 +66,39 @@ export class ExperimentsFetcher {
52
66
  },
53
67
  };
54
68
  }
69
+ /**
70
+ * Resolve config from multiple variant feature flags.
71
+ * Returns the first active variant config, or null if none match.
72
+ */
73
+ fetchMultiFlag() {
74
+ const variantKeys = this.getVariantFlagKeys();
75
+ if (!variantKeys || variantKeys.length === 0) {
76
+ return null;
77
+ }
78
+ return resolveVariantConfigs(this.client, variantKeys);
79
+ }
80
+ /**
81
+ * Get variant flag keys from manifest or prefix discovery.
82
+ */
83
+ getVariantFlagKeys() {
84
+ var _a, _b;
85
+ // Try manifest first
86
+ if (this.manifestKey) {
87
+ const manifest = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.manifestKey, null);
88
+ if (manifest && typeof manifest === 'object') {
89
+ const keys = manifest.variant_flags;
90
+ if (keys && keys.length > 0) {
91
+ return keys;
92
+ }
93
+ }
94
+ }
95
+ // Fall back to prefix-based discovery using getAllFeatures
96
+ if (this.variantFlagPrefix && this.client.getAllFeatures) {
97
+ const allFeatures = this.client.getAllFeatures();
98
+ return Object.keys(allFeatures).filter((key) => key.startsWith(this.variantFlagPrefix));
99
+ }
100
+ return [];
101
+ }
55
102
  }
56
103
  /**
57
104
  * Factory function for creating an experiments-based fetcher.
@@ -1 +1 @@
1
- {"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAevC;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAkB;IAM7B,YAAY,OAAkC;;QALrC,SAAI,GAAG,aAAa,CAAC;QAM5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,mCAAI,qBAAqB,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhC,6DAA6D;QAC7D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAE/C,IAAI,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,kBAAkB,KAAK,EAAE,CAAC,CAAC;oBACtF,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,eAAe,mDAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,UAAU,0BAA0B;gBACjE,+DAA+D,CAClE,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE9C,OAAO;YACL,MAAM,EAAE,MAA8B;YACtC,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa;gBACrB,WAAW;gBACX,MAAM,EAAE,IAAI;aACb;SACF,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ExperimentClient } from '../experiments/types';
2
+ import type { CanvasConfigResponse } from '../types';
3
+ /**
4
+ * Partial config as returned by a single variant feature flag.
5
+ * Variant flags may only contain a subset of CanvasConfigResponse fields.
6
+ */
7
+ export type VariantFlagValue = Partial<CanvasConfigResponse> & {
8
+ overlays?: unknown[];
9
+ };
10
+ /**
11
+ * Strategy for resolving multiple active variant configs into one.
12
+ *
13
+ * Currently: "first-match" — returns the first non-empty variant config.
14
+ * Future: "merge" — concatenate tiles/actions/overlays from all variants.
15
+ */
16
+ export type MergeStrategy = 'first-match';
17
+ /**
18
+ * Resolve multiple variant feature flags into a single CanvasConfigResponse.
19
+ *
20
+ * Evaluates each flag key against the experiment client and applies the
21
+ * configured strategy. Currently uses "first-match": the first flag that
22
+ * returns a non-empty config wins.
23
+ *
24
+ * @param client - Experiment client to evaluate feature flags
25
+ * @param keys - Ordered list of variant flag keys to evaluate
26
+ * @param _strategy - Resolution strategy (reserved for future use)
27
+ * @returns Resolved config, or null if no flags are active
28
+ */
29
+ export declare function resolveVariantConfigs(client: ExperimentClient, keys: string[], _strategy?: MergeStrategy): CanvasConfigResponse | null;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Resolve multiple variant feature flags into a single CanvasConfigResponse.
3
+ *
4
+ * Evaluates each flag key against the experiment client and applies the
5
+ * configured strategy. Currently uses "first-match": the first flag that
6
+ * returns a non-empty config wins.
7
+ *
8
+ * @param client - Experiment client to evaluate feature flags
9
+ * @param keys - Ordered list of variant flag keys to evaluate
10
+ * @param _strategy - Resolution strategy (reserved for future use)
11
+ * @returns Resolved config, or null if no flags are active
12
+ */
13
+ export function resolveVariantConfigs(client, keys, _strategy = 'first-match') {
14
+ var _a, _b, _c, _d;
15
+ for (const key of keys) {
16
+ const value = (_a = client.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(client, key, null);
17
+ if (!value || typeof value !== 'object')
18
+ continue;
19
+ const variant = value;
20
+ const hasTiles = variant.tiles && variant.tiles.length > 0;
21
+ const hasActions = variant.actions && variant.actions.length > 0;
22
+ if (hasTiles || hasActions) {
23
+ return {
24
+ tiles: (_b = variant.tiles) !== null && _b !== void 0 ? _b : [],
25
+ actions: (_c = variant.actions) !== null && _c !== void 0 ? _c : [],
26
+ fetchedAt: (_d = variant.fetchedAt) !== null && _d !== void 0 ? _d : new Date().toISOString(),
27
+ ...(variant.schemaVersion && { schemaVersion: variant.schemaVersion }),
28
+ ...(variant.configVersion && { configVersion: variant.configVersion }),
29
+ ...(variant.canvasTitle && { canvasTitle: variant.canvasTitle }),
30
+ ...(variant.theme && { theme: variant.theme }),
31
+ ...(variant.launcher && { launcher: variant.launcher }),
32
+ ...(variant.routes && { routes: variant.routes }),
33
+ };
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ //# sourceMappingURL=mergeConfigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeConfigs.js","sourceRoot":"","sources":["../../src/fetchers/mergeConfigs.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAwB,EACxB,IAAc,EACd,YAA2B,aAAa;;IAExC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,eAAe,uDAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAElD,MAAM,OAAO,GAAG,KAAyB,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEjE,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,KAAK,EAAE,MAAA,OAAO,CAAC,KAAK,mCAAI,EAAE;gBAC1B,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE;gBAC9B,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACxD,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { debug } from '../logger';
3
- const sortTiles = (tiles) => [...tiles].sort((a, b) => { var _a, _b; return ((_a = a.order) !== null && _a !== void 0 ? _a : 0) - ((_b = b.order) !== null && _b !== void 0 ? _b : 0); });
3
+ const sortTiles = (tiles) => [...tiles].sort((a, b) => { var _a, _b; return ((_a = b.priority) !== null && _a !== void 0 ? _a : 0) - ((_b = a.priority) !== null && _b !== void 0 ? _b : 0); });
4
4
  export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experiments, runtime, }) {
5
5
  const [state, setState] = useState({
6
6
  tiles: [],
@@ -1 +1 @@
1
- {"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ export * from './overlays/fetcher';
19
19
  export * from './metrics';
20
20
  export * from './context';
21
21
  export * from './events';
22
+ export * from './notifications';
22
23
  export * from './state';
23
24
  export * from './decisions';
24
25
  export * from './actions';
package/dist/index.js CHANGED
@@ -1,3 +1,20 @@
1
+ // ============================================================================
2
+ // Early SynOS exposure for adaptive self-registration + shared React
3
+ // ============================================================================
4
+ // Adaptive bundles loaded via <script> (IIFE) check window.SynOS.appRegistry
5
+ // to self-register. In the Chrome extension's dev mode, adaptives load BEFORE
6
+ // Syntro.init() runs. Expose the singleton appRegistry here (module scope) so
7
+ // it's available as soon as smart-canvas.min.js loads. Syntro.init() later
8
+ // enriches the SynOS object with runtime/version but reuses the same registry.
9
+ //
10
+ // React and ReactDOM are also exposed here so that adaptive bundles built with
11
+ // syntroReactPlugin can resolve their lazy shims via SynOS.React / SynOS.ReactDOM.
12
+ // This makes the runtime SDK the single React owner — adaptives and the editor
13
+ // SDK consume React from SynOS, never from their own bundles.
14
+ import { appRegistry as _earlyAppRegistry } from './apps';
15
+ import React from 'react';
16
+ import * as ReactDOMClient from 'react-dom/client';
17
+ import { createPortal, flushSync } from 'react-dom';
1
18
  export * from './version';
2
19
  export * from './types';
3
20
  export * from './config-validator';
@@ -25,6 +42,8 @@ export * from './metrics';
25
42
  export * from './context';
26
43
  // Events - Normalized event stream
27
44
  export * from './events';
45
+ // Notifications - Toast notification system
46
+ export * from './notifications';
28
47
  // State - Persistent state storage with helpers
29
48
  export * from './state';
30
49
  // Decisions - Strategy-based conditional rendering
@@ -46,4 +65,13 @@ export { RuntimeProvider, useRuntime, useRuntimeContext, usePageContext, useSess
46
65
  // ============================================================================
47
66
  export { Syntro } from './bootstrap';
48
67
  export { encodeToken, decodeToken } from './token';
68
+ if (typeof window !== 'undefined') {
69
+ const existing = window.SynOS;
70
+ window.SynOS = {
71
+ ...existing,
72
+ appRegistry: (existing === null || existing === void 0 ? void 0 : existing.appRegistry) || _earlyAppRegistry,
73
+ React,
74
+ ReactDOM: { ...ReactDOMClient, createPortal, flushSync },
75
+ };
76
+ }
49
77
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,sCAAsC;AACtC,cAAc,WAAW,CAAC;AAE1B,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,mDAAmD;AACnD,cAAc,WAAW,CAAC;AAE1B,mCAAmC;AACnC,cAAc,UAAU,CAAC;AAEzB,gDAAgD;AAChD,cAAc,SAAS,CAAC;AAExB,mDAAmD;AACnD,cAAc,aAAa,CAAC;AAE5B,sDAAsD;AACtD,cAAc,WAAW,CAAC;AAE1B,qDAAqD;AACrD,cAAc,YAAY,CAAC;AAE3B,yCAAyC;AACzC,cAAc,WAAW,CAAC;AAE1B,0BAA0B;AAC1B,cAAc,QAAQ,CAAC;AAEvB,kBAAkB;AAClB,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGtE,mCAAmC;AACnC,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qEAAqE;AACrE,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,mFAAmF;AACnF,+EAA+E;AAC/E,8DAA8D;AAC9D,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEpD,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,sCAAsC;AACtC,cAAc,WAAW,CAAC;AAE1B,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,mDAAmD;AACnD,cAAc,WAAW,CAAC;AAE1B,mCAAmC;AACnC,cAAc,UAAU,CAAC;AAEzB,4CAA4C;AAC5C,cAAc,iBAAiB,CAAC;AAEhC,gDAAgD;AAChD,cAAc,SAAS,CAAC;AAExB,mDAAmD;AACnD,cAAc,aAAa,CAAC;AAE5B,sDAAsD;AACtD,cAAc,WAAW,CAAC;AAE1B,qDAAqD;AACrD,cAAc,YAAY,CAAC;AAE3B,yCAAyC;AACzC,cAAc,WAAW,CAAC;AAE1B,0BAA0B;AAC1B,cAAc,QAAQ,CAAC;AAEvB,kBAAkB;AAClB,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGtE,mCAAmC;AACnC,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAI,MAAc,CAAC,KAAK,CAAC;IACtC,MAAc,CAAC,KAAK,GAAG;QACtB,GAAG,QAAQ;QACX,WAAW,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,KAAI,iBAAiB;QACvD,KAAK;QACL,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ActiveNotification } from './types';
2
+ export interface NotificationToastStackProps {
3
+ notifications: ActiveNotification[];
4
+ onDismiss: (id: string) => void;
5
+ onClickNotification: (notification: ActiveNotification) => void;
6
+ position: 'left' | 'right';
7
+ }
8
+ export declare function NotificationToastStack({ notifications, onDismiss, onClickNotification, position, }: NotificationToastStackProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,118 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { base, brand, slateGrey, text } from '@syntro/design-system/tokens';
3
+ import { withAlpha } from '../theme';
4
+ const TOAST_STYLES_ID = 'syntro-toast-styles';
5
+ function ensureToastStyles() {
6
+ if (typeof document === 'undefined')
7
+ return;
8
+ if (document.getElementById(TOAST_STYLES_ID))
9
+ return;
10
+ const style = document.createElement('style');
11
+ style.id = TOAST_STYLES_ID;
12
+ style.textContent = `
13
+ @keyframes syntro-toast-slide-in {
14
+ from { opacity: 0; transform: translateY(12px); }
15
+ to { opacity: 1; transform: translateY(0); }
16
+ }
17
+ @keyframes syntro-toast-progress {
18
+ from { width: 100%; }
19
+ to { width: 0%; }
20
+ }
21
+ .syntro-toast-enter {
22
+ animation: syntro-toast-slide-in 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
23
+ }
24
+ .syntro-toast-progress {
25
+ animation: syntro-toast-progress linear forwards;
26
+ }
27
+ .syntro-toast-progress.paused {
28
+ animation-play-state: paused;
29
+ }
30
+ `;
31
+ document.head.appendChild(style);
32
+ }
33
+ export function NotificationToastStack({ notifications, onDismiss, onClickNotification, position, }) {
34
+ ensureToastStyles();
35
+ if (notifications.length === 0)
36
+ return null;
37
+ return (_jsx("div", { "data-testid": "notification-toast-stack", style: {
38
+ position: 'fixed',
39
+ bottom: '6rem',
40
+ [position === 'right' ? 'right' : 'left']: '2.5rem',
41
+ display: 'flex',
42
+ flexDirection: 'column',
43
+ gap: '8px',
44
+ zIndex: 2147483648,
45
+ pointerEvents: 'auto',
46
+ width: '280px',
47
+ }, children: notifications.map((notif) => {
48
+ var _a;
49
+ return (_jsxs("div", { className: "syntro-toast-enter", style: {
50
+ background: withAlpha(slateGrey[0], 0.95),
51
+ backdropFilter: 'blur(12px)',
52
+ WebkitBackdropFilter: 'blur(12px)',
53
+ border: `1px solid ${slateGrey[5]}`,
54
+ borderRadius: '12px',
55
+ overflow: 'hidden',
56
+ cursor: 'pointer',
57
+ transition: 'transform 0.15s ease',
58
+ }, onMouseEnter: (e) => {
59
+ e.currentTarget.style.transform = 'translateY(-1px)';
60
+ const bar = e.currentTarget.querySelector('.syntro-toast-progress');
61
+ if (bar)
62
+ bar.classList.add('paused');
63
+ }, onMouseLeave: (e) => {
64
+ e.currentTarget.style.transform = 'translateY(0)';
65
+ const bar = e.currentTarget.querySelector('.syntro-toast-progress');
66
+ if (bar)
67
+ bar.classList.remove('paused');
68
+ }, children: [_jsxs("div", { onClick: () => onClickNotification(notif), style: {
69
+ display: 'flex',
70
+ alignItems: 'flex-start',
71
+ gap: '10px',
72
+ padding: '10px 12px',
73
+ }, children: [_jsx("div", { style: {
74
+ width: '28px',
75
+ height: '28px',
76
+ borderRadius: '8px',
77
+ background: withAlpha(brand[3], 0.15),
78
+ display: 'flex',
79
+ alignItems: 'center',
80
+ justifyContent: 'center',
81
+ flexShrink: 0,
82
+ fontSize: '14px',
83
+ }, children: (_a = notif.icon) !== null && _a !== void 0 ? _a : '🔔' }), _jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: {
84
+ fontSize: '13px',
85
+ fontWeight: 600,
86
+ color: text.primary,
87
+ lineHeight: '1.3',
88
+ whiteSpace: 'nowrap',
89
+ overflow: 'hidden',
90
+ textOverflow: 'ellipsis',
91
+ }, children: notif.title }), notif.body && (_jsx("div", { style: {
92
+ fontSize: '12px',
93
+ color: text.secondary,
94
+ lineHeight: '1.3',
95
+ marginTop: '2px',
96
+ whiteSpace: 'nowrap',
97
+ overflow: 'hidden',
98
+ textOverflow: 'ellipsis',
99
+ }, children: notif.body }))] }), _jsx("button", { onClick: (e) => {
100
+ e.stopPropagation();
101
+ onDismiss(notif.id);
102
+ }, "aria-label": "Dismiss notification", style: {
103
+ background: 'none',
104
+ border: 'none',
105
+ color: text.tertiary,
106
+ cursor: 'pointer',
107
+ padding: '2px',
108
+ fontSize: '14px',
109
+ lineHeight: 1,
110
+ flexShrink: 0,
111
+ }, children: "\u00D7" })] }), _jsx("div", { style: { height: '2px', background: withAlpha(base.white, 0.06) }, children: _jsx("div", { className: "syntro-toast-progress", style: {
112
+ height: '100%',
113
+ background: `linear-gradient(90deg, ${brand[3]}, ${brand[4]})`,
114
+ animationDuration: `${notif.ttl}ms`,
115
+ } }) })] }, notif.id));
116
+ }) }));
117
+ }
118
+ //# sourceMappingURL=NotificationToastStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationToastStack.js","sourceRoot":"","sources":["../../src/notifications/NotificationToastStack.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type { TileNotificationRule, NotificationDeepLink, ActiveNotification } from './types';
2
+ export { MAX_VISIBLE_TOASTS, DEFAULT_TTL, DEFAULT_COOLDOWN } from './types';
3
+ export { interpolateTemplate, matchEvent } from './matcher';
4
+ export type { MatchResult } from './matcher';
5
+ export { useNotifications } from './useNotifications';
6
+ export type { UseNotificationsReturn } from './useNotifications';
7
+ export { useNotifyWatcher } from './useNotifyWatcher';
8
+ export { NotificationToastStack } from './NotificationToastStack';
9
+ export type { NotificationToastStackProps } from './NotificationToastStack';
@@ -0,0 +1,6 @@
1
+ export { MAX_VISIBLE_TOASTS, DEFAULT_TTL, DEFAULT_COOLDOWN } from './types';
2
+ export { interpolateTemplate, matchEvent } from './matcher';
3
+ export { useNotifications } from './useNotifications';
4
+ export { useNotifyWatcher } from './useNotifyWatcher';
5
+ export { NotificationToastStack } from './NotificationToastStack';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { NormalizedEvent } from '../events/types';
2
+ import type { TileConfig } from '../types';
3
+ import type { ActiveNotification, TileNotificationRule } from './types';
4
+ /**
5
+ * Result of matching an event against tile notification rules.
6
+ * Includes both the resolved notification and the original rule
7
+ * so callers can access rule-level settings (e.g., cooldown).
8
+ */
9
+ export interface MatchResult {
10
+ notification: ActiveNotification;
11
+ rule: TileNotificationRule;
12
+ }
13
+ /**
14
+ * Replace {{props.x}} placeholders in a template string with values
15
+ * from the event props. Leaves placeholders intact when the referenced
16
+ * prop is missing or props is undefined.
17
+ */
18
+ export declare function interpolateTemplate(template: string, props: Record<string, unknown> | undefined): string;
19
+ /**
20
+ * Given a NormalizedEvent and a list of tile configs, find the first
21
+ * matching notification rule and return a MatchResult containing
22
+ * both the resolved ActiveNotification and the original rule.
23
+ * Returns null when no rules match.
24
+ */
25
+ export declare function matchEvent(event: NormalizedEvent, tiles: TileConfig[]): MatchResult | null;