@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.
- package/CAPABILITIES.md +415 -115
- package/dist/SmartCanvasApp.d.ts +1 -3
- package/dist/SmartCanvasApp.js +16 -10
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/SmartCanvasElement.d.ts +0 -2
- package/dist/SmartCanvasElement.js +3 -8
- package/dist/SmartCanvasElement.js.map +1 -1
- package/dist/actions/executors/index.js +4 -1
- package/dist/actions/executors/index.js.map +1 -1
- package/dist/actions/executors/tour.js +2 -2
- package/dist/actions/executors/tour.js.map +1 -1
- package/dist/actions/validation.js +5 -30
- package/dist/actions/validation.js.map +1 -1
- package/dist/adaptives/adaptive-chatbot/index.js +7 -5
- package/dist/adaptives/adaptive-chatbot/index.js.map +4 -4
- package/dist/adaptives/adaptive-content/index.js +22 -0
- package/dist/adaptives/adaptive-content/index.js.map +7 -0
- package/dist/adaptives/adaptive-faq/index.js +11 -0
- package/dist/adaptives/adaptive-faq/index.js.map +7 -0
- package/dist/adaptives/adaptive-gamification/index.js +2 -0
- package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
- package/dist/adaptives/adaptive-nav/index.js +12 -0
- package/dist/adaptives/adaptive-nav/index.js.map +7 -0
- package/dist/adaptives/adaptive-overlays/index.js +94 -0
- package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
- package/dist/api.d.ts +1 -9
- package/dist/api.js +5 -5
- package/dist/api.js.map +1 -1
- package/dist/apps/AppLoader.d.ts +5 -0
- package/dist/apps/AppLoader.js +28 -3
- package/dist/apps/AppLoader.js.map +1 -1
- package/dist/apps/index.d.ts +1 -1
- package/dist/apps/types.d.ts +26 -0
- package/dist/blocks/data/ComparisonBlock.js +12 -9
- package/dist/blocks/data/ComparisonBlock.js.map +1 -1
- package/dist/blocks/data/StatsBlock.js +11 -10
- package/dist/blocks/data/StatsBlock.js.map +1 -1
- package/dist/blocks/index.d.ts +9 -5
- package/dist/blocks/index.js +2 -2
- package/dist/blocks/index.js.map +1 -1
- package/dist/blocks/interactive/ChecklistBlock.js +13 -12
- package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
- package/dist/blocks/interactive/RatingBlock.js +18 -12
- package/dist/blocks/interactive/RatingBlock.js.map +1 -1
- package/dist/blocks/notification/NotificationBlock.js +24 -23
- package/dist/blocks/notification/NotificationBlock.js.map +1 -1
- package/dist/blocks/theme-tokens.d.ts +23 -0
- package/dist/blocks/theme-tokens.js +25 -0
- package/dist/blocks/theme-tokens.js.map +1 -0
- package/dist/bootstrap.js +21 -24
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.d.ts +6 -3
- package/dist/components/ShadowCanvasOverlay.js +191 -115
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.d.ts +1 -5
- package/dist/components/TileCard.js +62 -286
- package/dist/components/TileCard.js.map +1 -1
- package/dist/components/TileWheel.js +24 -4
- package/dist/components/TileWheel.js.map +1 -1
- package/dist/configFetcher.d.ts +5 -1
- package/dist/configFetcher.js +33 -2
- package/dist/configFetcher.js.map +1 -1
- package/dist/context/ContextManager.js +3 -2
- package/dist/context/ContextManager.js.map +1 -1
- package/dist/decisions/engine.d.ts +4 -0
- package/dist/decisions/engine.js +6 -1
- package/dist/decisions/engine.js.map +1 -1
- package/dist/decisions/schema.d.ts +241 -0
- package/dist/decisions/schema.js +8 -0
- package/dist/decisions/schema.js.map +1 -1
- package/dist/decisions/strategies/rules.js +14 -0
- package/dist/decisions/strategies/rules.js.map +1 -1
- package/dist/decisions/types.d.ts +21 -1
- package/dist/editorLoader.d.ts +19 -9
- package/dist/editorLoader.js +112 -94
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/EventAccumulator.d.ts +29 -0
- package/dist/events/EventAccumulator.js +101 -0
- package/dist/events/EventAccumulator.js.map +1 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +1 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/normalizers/posthog.js +12 -4
- package/dist/events/normalizers/posthog.js.map +1 -1
- package/dist/events/types.d.ts +4 -0
- package/dist/events/types.js +5 -0
- package/dist/events/types.js.map +1 -1
- package/dist/experiments/adapters/growthbook.d.ts +2 -1
- package/dist/experiments/adapters/growthbook.js +11 -23
- package/dist/experiments/adapters/growthbook.js.map +1 -1
- package/dist/experiments/types.d.ts +5 -0
- package/dist/fetchers/experimentsFetcher.d.ts +23 -1
- package/dist/fetchers/experimentsFetcher.js +48 -1
- package/dist/fetchers/experimentsFetcher.js.map +1 -1
- package/dist/fetchers/mergeConfigs.d.ts +29 -0
- package/dist/fetchers/mergeConfigs.js +38 -0
- package/dist/fetchers/mergeConfigs.js.map +1 -0
- package/dist/hooks/useShadowCanvasConfig.js +1 -1
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/notifications/NotificationToastStack.d.ts +8 -0
- package/dist/notifications/NotificationToastStack.js +118 -0
- package/dist/notifications/NotificationToastStack.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.js +6 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/matcher.d.ts +25 -0
- package/dist/notifications/matcher.js +66 -0
- package/dist/notifications/matcher.js.map +1 -0
- package/dist/notifications/types.d.ts +64 -0
- package/dist/notifications/types.js +13 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/useNotifications.d.ts +19 -0
- package/dist/notifications/useNotifications.js +104 -0
- package/dist/notifications/useNotifications.js.map +1 -0
- package/dist/notifications/useNotifyWatcher.d.ts +15 -0
- package/dist/notifications/useNotifyWatcher.js +62 -0
- package/dist/notifications/useNotifyWatcher.js.map +1 -0
- package/dist/overlays/runtime/overlay/runner.js +2 -2
- package/dist/overlays/runtime/overlay/runner.js.map +1 -1
- package/dist/render/RenderContext.js +5 -3
- package/dist/render/RenderContext.js.map +1 -1
- package/dist/render/types.d.ts +2 -3
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.js +28 -12
- package/dist/runtime.js.map +1 -1
- package/dist/smart-canvas.esm.js +131 -102
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +40870 -43700
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +131 -102
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/theme/defaultTheme.d.ts +7 -3
- package/dist/theme/defaultTheme.js +78 -51
- package/dist/theme/defaultTheme.js.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/types.d.ts +7 -0
- package/dist/types.d.ts +13 -100
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +6 -1
- package/dist/widgets/WidgetRegistry.js +12 -4
- package/dist/widgets/WidgetRegistry.js.map +1 -1
- package/package.json +18 -12
- package/schema/canvas-config.schema.json +34 -69
- package/schema/event-catalog.schema.json +157 -0
- package/scripts/validate-config.mjs +20 -13
- package/dist/adaptives/faq/index.js +0 -11
- package/dist/adaptives/faq/index.js.map +0 -7
- package/dist/adaptives/gamification/index.js +0 -2
- package/dist/adaptives/gamification/index.js.map +0 -7
- package/dist/adaptives/nav/index.js +0 -11
- package/dist/adaptives/nav/index.js.map +0 -7
package/dist/events/types.d.ts
CHANGED
|
@@ -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
|
};
|
package/dist/events/types.js
CHANGED
|
@@ -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',
|
package/dist/events/types.js.map
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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":"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,
|
|
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
|
-
*
|
|
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
|
-
//
|
|
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":"
|
|
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 =
|
|
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":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAsClC,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE,CACxC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
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":";AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,SAAS,iBAAiB;IACxB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;QAAE,OAAO;IAErD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC;IAC3B,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;GAkBnB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AASD,MAAM,UAAU,sBAAsB,CAAC,EACrC,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,QAAQ,GACoB;IAC5B,iBAAiB,EAAE,CAAC;IAEpB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO,CACL,6BACc,0BAA0B,EACtC,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,MAAM;YACd,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ;YACnD,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,GAAG,EAAE,KAAK;YACV,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,OAAO;SACf,YAEA,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;;YAAC,OAAA,CAC5B,eAEE,SAAS,EAAC,oBAAoB,EAC9B,KAAK,EAAE;oBACL,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;oBACzC,cAAc,EAAE,YAAY;oBAC5B,oBAAoB,EAAE,YAAY;oBAClC,MAAM,EAAE,aAAa,SAAS,CAAC,CAAC,CAAC,EAAE;oBACnC,YAAY,EAAE,MAAM;oBACpB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,sBAAsB;iBACnC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC;oBACrD,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;oBACpE,IAAI,GAAG;wBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvC,CAAC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC;oBAClD,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;oBACpE,IAAI,GAAG;wBAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC,aAED,eACE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EACzC,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,YAAY;4BACxB,GAAG,EAAE,MAAM;4BACX,OAAO,EAAE,WAAW;yBACrB,aAED,cACE,KAAK,EAAE;oCACL,KAAK,EAAE,MAAM;oCACb,MAAM,EAAE,MAAM;oCACd,YAAY,EAAE,KAAK;oCACnB,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;oCACrC,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,QAAQ;oCACpB,cAAc,EAAE,QAAQ;oCACxB,UAAU,EAAE,CAAC;oCACb,QAAQ,EAAE,MAAM;iCACjB,YAEA,MAAA,KAAK,CAAC,IAAI,mCAAI,IAAI,GACf,EAEN,eAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,aAClC,cACE,KAAK,EAAE;4CACL,QAAQ,EAAE,MAAM;4CAChB,UAAU,EAAE,GAAG;4CACf,KAAK,EAAE,IAAI,CAAC,OAAO;4CACnB,UAAU,EAAE,KAAK;4CACjB,UAAU,EAAE,QAAQ;4CACpB,QAAQ,EAAE,QAAQ;4CAClB,YAAY,EAAE,UAAU;yCACzB,YAEA,KAAK,CAAC,KAAK,GACR,EACL,KAAK,CAAC,IAAI,IAAI,CACb,cACE,KAAK,EAAE;4CACL,QAAQ,EAAE,MAAM;4CAChB,KAAK,EAAE,IAAI,CAAC,SAAS;4CACrB,UAAU,EAAE,KAAK;4CACjB,SAAS,EAAE,KAAK;4CAChB,UAAU,EAAE,QAAQ;4CACpB,QAAQ,EAAE,QAAQ;4CAClB,YAAY,EAAE,UAAU;yCACzB,YAEA,KAAK,CAAC,IAAI,GACP,CACP,IACG,EAEN,iBACE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oCACb,CAAC,CAAC,eAAe,EAAE,CAAC;oCACpB,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gCACtB,CAAC,gBACU,sBAAsB,EACjC,KAAK,EAAE;oCACL,UAAU,EAAE,MAAM;oCAClB,MAAM,EAAE,MAAM;oCACd,KAAK,EAAE,IAAI,CAAC,QAAQ;oCACpB,MAAM,EAAE,SAAS;oCACjB,OAAO,EAAE,KAAK;oCACd,QAAQ,EAAE,MAAM;oCAChB,UAAU,EAAE,CAAC;oCACb,UAAU,EAAE,CAAC;iCACd,uBAGM,IACL,EAEN,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,YACpE,cACE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE;gCACL,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,0BAA0B,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG;gCAC9D,iBAAiB,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI;6BACpC,GACD,GACE,KA7GD,KAAK,CAAC,EAAE,CA8GT,CACP,CAAA;SAAA,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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;
|