@syntrologie/runtime-sdk 2.4.0-canary.23 → 2.4.0-canary.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/version.d.ts CHANGED
@@ -10,4 +10,4 @@
10
10
  *
11
11
  * @since 2.0.0
12
12
  */
13
- export declare const SDK_VERSION = "2.4.0-canary.23";
13
+ export declare const SDK_VERSION = "2.4.0-canary.25";
@@ -47,6 +47,7 @@ export interface WidgetRegistration {
47
47
  name?: string;
48
48
  description?: string;
49
49
  icon?: string;
50
+ subtitle?: string;
50
51
  };
51
52
  }
52
53
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntrologie/runtime-sdk",
3
- "version": "2.4.0-canary.23",
3
+ "version": "2.4.0-canary.25",
4
4
  "description": "Syntrologie Runtime SDK for web experimentation and analytics",
5
5
  "license": "Proprietary",
6
6
  "private": false,
@@ -67,12 +67,12 @@
67
67
  "@floating-ui/dom": "^1.7.5",
68
68
  "@growthbook/growthbook": "~1.6.2",
69
69
  "@growthbook/growthbook-react": "^1.6.4",
70
- "@syntrologie/adapt-chatbot": "2.4.0-canary.23",
71
- "@syntrologie/adapt-content": "2.4.0-canary.23",
72
- "@syntrologie/adapt-faq": "2.4.0-canary.23",
73
- "@syntrologie/adapt-gamification": "2.4.0-canary.23",
74
- "@syntrologie/adapt-nav": "2.4.0-canary.23",
75
- "@syntrologie/adapt-overlays": "2.4.0-canary.23",
70
+ "@syntrologie/adapt-chatbot": "2.4.0-canary.25",
71
+ "@syntrologie/adapt-content": "2.4.0-canary.25",
72
+ "@syntrologie/adapt-faq": "2.4.0-canary.25",
73
+ "@syntrologie/adapt-gamification": "2.4.0-canary.25",
74
+ "@syntrologie/adapt-nav": "2.4.0-canary.25",
75
+ "@syntrologie/adapt-overlays": "2.4.0-canary.25",
76
76
  "lucide-react": "^0.576.0",
77
77
  "posthog-js": "~1.302.2",
78
78
  "zod": "^3.25.76"
@@ -77,7 +77,8 @@
77
77
  "enum": [
78
78
  "adaptive-chatbot:assistant",
79
79
  "adaptive-faq:accordion",
80
- "adaptive-nav:tips"
80
+ "adaptive-nav:tips",
81
+ "adaptive-overlays:workflow-tracker"
81
82
  ],
82
83
  "description": "Registered widget ID. Must match an adaptive widget registration."
83
84
  },
@@ -198,6 +199,25 @@
198
199
  }
199
200
  }
200
201
  }
202
+ },
203
+ {
204
+ "if": {
205
+ "properties": {
206
+ "widget": {
207
+ "const": "adaptive-overlays:workflow-tracker"
208
+ }
209
+ },
210
+ "required": [
211
+ "widget"
212
+ ]
213
+ },
214
+ "then": {
215
+ "properties": {
216
+ "props": {
217
+ "$ref": "#/$defs/workflowTrackerProps"
218
+ }
219
+ }
220
+ }
201
221
  }
202
222
  ]
203
223
  },
@@ -251,6 +271,15 @@
251
271
  },
252
272
  "width": {
253
273
  "type": "string"
274
+ },
275
+ "transitionDuration": {
276
+ "type": "string"
277
+ },
278
+ "transitionEasing": {
279
+ "type": "string"
280
+ },
281
+ "transitionFade": {
282
+ "type": "string"
254
283
  }
255
284
  },
256
285
  "additionalProperties": false
@@ -541,8 +570,9 @@
541
570
  "routes": {
542
571
  "$ref": "#/$defs/routeFilter"
543
572
  },
544
- "strategy": {
545
- "$ref": "#/$defs/decisionStrategy"
573
+ "onlyIfPopulated": {
574
+ "type": "boolean",
575
+ "description": "When true, tile is hidden if none of its props.actions[] have an active triggerWhen. Useful for tiles with all-deferred FAQ questions or nav tips. Default: false."
546
576
  }
547
577
  },
548
578
  "required": [
@@ -557,13 +587,15 @@
557
587
  "type": "array",
558
588
  "items": {
559
589
  "type": "string"
560
- }
590
+ },
591
+ "description": "URL patterns where this tile appears. Supports *, **, :param wildcards. Use sparingly — mostly to isolate to specific webapp functionality. Omit to appear on all routes."
561
592
  },
562
593
  "exclude": {
563
594
  "type": "array",
564
595
  "items": {
565
596
  "type": "string"
566
- }
597
+ },
598
+ "description": "URL patterns where this tile should NOT appear. Evaluated before include."
567
599
  }
568
600
  },
569
601
  "additionalProperties": false
@@ -7206,7 +7238,8 @@
7206
7238
  "enum": [
7207
7239
  "adaptive-chatbot:assistant",
7208
7240
  "adaptive-faq:accordion",
7209
- "adaptive-nav:tips"
7241
+ "adaptive-nav:tips",
7242
+ "adaptive-overlays:workflow-tracker"
7210
7243
  ],
7211
7244
  "description": "Registered widget ID. Must match an adaptive widget registration."
7212
7245
  },
@@ -14838,6 +14871,11 @@
14838
14871
  },
14839
14872
  "additionalProperties": false
14840
14873
  },
14874
+ "workflowTrackerProps": {
14875
+ "type": "object",
14876
+ "properties": {},
14877
+ "additionalProperties": true
14878
+ },
14841
14879
  "actionStep": {
14842
14880
  "oneOf": [
14843
14881
  {
@@ -159,3 +159,74 @@ if (routeErrors.length > 0) {
159
159
  for (const e of routeErrors) console.error(` - ${e}`);
160
160
  process.exit(1);
161
161
  }
162
+
163
+ // --- Semantic warnings (non-blocking, design-quality hints) ---
164
+ const warnings = [];
165
+
166
+ // Tile-level route restrictions should be rare. They hide the entire tile
167
+ // (and all its actions) on non-matching pages. The preferred pattern is:
168
+ // - Tile: routes ["/**"] (or omitted) + onlyIfPopulated: true
169
+ // - Actions: triggerWhen with route conditions to self-target specific pages
170
+ // This way the tile is always available and actions decide when to appear.
171
+ for (const tile of config.tiles ?? []) {
172
+ const routes = tile.activation?.routes;
173
+ if (!routes) continue;
174
+
175
+ const includePatterns = routes.include ?? [];
176
+ const hasCatchAll = includePatterns.some((r) => WILDCARD_PATTERNS.includes(r) || r === '/**');
177
+ if (hasCatchAll) continue;
178
+
179
+ const routeList = includePatterns.join('", "');
180
+ const actions = tile.props?.actions ?? [];
181
+ const actionsWithoutTrigger = actions.filter((a) => !a.triggerWhen).length;
182
+
183
+ let detail = '';
184
+ if (actionsWithoutTrigger > 0) {
185
+ detail =
186
+ `\n ${actionsWithoutTrigger} of ${actions.length} action(s) have no triggerWhen — ` +
187
+ `they'll never appear outside ["${routeList}"].`;
188
+ }
189
+
190
+ warnings.push(
191
+ `Tile "${tile.id}": activation.routes restricts to ["${routeList}"].${detail}\n` +
192
+ ` Prefer: set routes to ["/**"], add onlyIfPopulated: true, and use ` +
193
+ `triggerWhen with a "route" condition on each action to target specific pages.`
194
+ );
195
+ }
196
+
197
+ // page_url conditions should use ** prefix to match any host, not absolute paths.
198
+ // "/dashboard/state" won't match "http://localhost:8088/dashboard/state" because
199
+ // page_url evaluates against the full URL. Use "**/dashboard/state" instead.
200
+ function collectPageUrlConditions(obj, path, results) {
201
+ if (!obj || typeof obj !== 'object') return;
202
+ if (Array.isArray(obj)) {
203
+ for (const [i, item] of obj.entries()) {
204
+ collectPageUrlConditions(item, `${path}[${i}]`, results);
205
+ }
206
+ return;
207
+ }
208
+ if (obj.type === 'page_url' && typeof obj.url === 'string') {
209
+ results.push({ path, url: obj.url });
210
+ return;
211
+ }
212
+ for (const [key, val] of Object.entries(obj)) {
213
+ collectPageUrlConditions(val, `${path}.${key}`, results);
214
+ }
215
+ }
216
+
217
+ const pageUrlHits = [];
218
+ collectPageUrlConditions(config, 'config', pageUrlHits);
219
+ for (const { path, url } of pageUrlHits) {
220
+ if (url.startsWith('/')) {
221
+ warnings.push(
222
+ `${path}: page_url "${url}" uses an absolute path.\n` +
223
+ ` page_url matches against the full URL (e.g., "http://localhost:8088${url}"),\n` +
224
+ ` so "${url}" will never match. Use "**${url}" instead.`
225
+ );
226
+ }
227
+ }
228
+
229
+ if (warnings.length > 0) {
230
+ console.warn(`\n\u26A0\uFE0F ${warnings.length} design warning(s):`);
231
+ for (const w of warnings) console.warn(` - ${w}`);
232
+ }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/config/schema.ts"],
4
- "sourcesContent": ["/**\n * Zod schemas for canvas configuration types.\n *\n * Single source of truth for tile, theme, launcher, and top-level\n * CanvasConfigResponse shapes. These schemas are converted to JSON Schema\n * during build and merged into the unified canvas-config.schema.json.\n *\n * Design decisions:\n * - `.strict()` on top-level objects \u2192 `additionalProperties: false` in JSON Schema\n * - Element sub-schemas (canvas, tile, etc.) are NOT strict to allow future expansion\n */\n\nimport { z } from 'zod';\nimport { ActivationConfigZ } from '../decisions/schema';\n\n// ============================================================================\n// Tile Notification Sub-Types\n// ============================================================================\n\nconst NotificationDeepLinkZ = z\n .object({\n tileId: z.string(),\n itemId: z.string().optional(),\n })\n .strict();\n\nconst TileNotificationRuleZ = z\n .object({\n on: z.string(),\n title: z.string(),\n body: z.string().optional(),\n icon: z.string().optional(),\n ttl: z.number().optional(),\n cooldown: z.number().optional(),\n deepLink: NotificationDeepLinkZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Tile\n// ============================================================================\n\nexport const TileZ = z\n .object({\n id: z.string(),\n title: z.string().optional(),\n subtitle: z.string().optional(),\n icon: z.string().optional(),\n priority: z.number().optional(),\n widget: z.string(),\n props: z.record(z.unknown()).optional(),\n activation: ActivationConfigZ.optional(),\n notifications: z.array(TileNotificationRuleZ).optional(),\n })\n .strict();\n\n// ============================================================================\n// Theme Config \u2014 Element Sub-Schemas\n// ============================================================================\n\nexport const CanvasElementConfigZ = z.object({\n position: z.enum(['left', 'right']).optional(),\n layout: z.enum(['overlay', 'push']).optional(),\n background: z.string().optional(),\n blur: z.string().optional(),\n border: z.string().optional(),\n width: z.string().optional(),\n});\n\nexport const LauncherElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n color: z.string().optional(),\n size: z.string().optional(),\n shadow: z.string().optional(),\n borderRadius: z.string().optional(),\n});\n\nexport const TileElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n shadow: z.string().optional(),\n titleColor: z.string().optional(),\n textColor: z.string().optional(),\n iconBackground: z.string().optional(),\n iconShadow: z.string().optional(),\n headerPadding: z.string().optional(),\n bodyPadding: z.string().optional(),\n gap: z.string().optional(),\n});\n\nexport const OverlayElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n titleColor: z.string().optional(),\n arrowColor: z.string().optional(),\n arrowSize: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n scrimOpacity: z.string().optional(),\n highlightRing: z.string().optional(),\n});\n\nexport const NotificationElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n successColor: z.string().optional(),\n warningColor: z.string().optional(),\n errorColor: z.string().optional(),\n iconBackground: z.string().optional(),\n progressGradient: z.string().optional(),\n});\n\nexport const ContentElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n // Accordion layout\n itemDivider: z.string().optional(),\n itemGap: z.string().optional(),\n itemPadding: z.string().optional(),\n itemFontSize: z.string().optional(),\n // Expanded content\n bodyPadding: z.string().optional(),\n bodyFontSize: z.string().optional(),\n // Category headers\n categoryPadding: z.string().optional(),\n categoryGap: z.string().optional(),\n categoryFontSize: z.string().optional(),\n // Search\n searchBackground: z.string().optional(),\n searchColor: z.string().optional(),\n // Chevron\n chevronColor: z.string().optional(),\n});\n\n// ============================================================================\n// Theme Config \u2014 Top-Level\n// ============================================================================\n\nexport const CanvasThemeConfigZ = z\n .object({\n mode: z.enum(['dark', 'light']).optional(),\n fontFamily: z.string().optional(),\n colorPrimary: z.string().optional(),\n colorPrimaryHover: z.string().optional(),\n borderRadius: z.string().optional(),\n canvas: CanvasElementConfigZ.optional(),\n launcher: LauncherElementConfigZ.optional(),\n tile: TileElementConfigZ.optional(),\n overlay: OverlayElementConfigZ.optional(),\n notification: NotificationElementConfigZ.optional(),\n content: ContentElementConfigZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Launcher Config\n// ============================================================================\n\nexport const LauncherConfigZ = z\n .object({\n enabled: z.boolean().optional(),\n label: z.string().optional(),\n icon: z.string().optional(),\n position: z.string().optional(),\n animate: z.boolean().optional(),\n animationStyle: z.enum(['pulse', 'bounce', 'glow']).optional(),\n notificationCount: z.number().optional(),\n })\n .strict();\n\n// ============================================================================\n// Canvas Config Response (top-level)\n// ============================================================================\n\nexport const CanvasConfigResponseZ = z\n .object({\n schemaVersion: z.string().optional(),\n fetchedAt: z.string().datetime(),\n configVersion: z.string().optional(),\n canvasTitle: z.string().optional(),\n tiles: z.array(TileZ),\n actions: z.array(z.any()),\n theme: CanvasThemeConfigZ.optional(),\n launcher: LauncherConfigZ.optional(),\n verificationSteps: z.array(z.string()).optional(),\n })\n .strict();\n\n// ============================================================================\n// Export: Array for unified schema generation\n// ============================================================================\n\n/**\n * Config schemas for unified JSON Schema generation.\n * The generator imports this array and converts each to a JSON Schema $def.\n */\nexport const configSchemas = [\n { defName: 'tile', schema: TileZ },\n { defName: 'themeConfig', schema: CanvasThemeConfigZ },\n { defName: 'launcherConfig', schema: LauncherConfigZ },\n { defName: 'canvasConfigResponse', schema: CanvasConfigResponseZ },\n];\n\n// ============================================================================\n// Named Exports\n// ============================================================================\n\nexport { NotificationDeepLinkZ, TileNotificationRuleZ };\n"],
5
- "mappings": "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",
6
- "names": []
7
- }