@syntrologie/runtime-sdk 2.8.0-canary.202 → 2.8.0-canary.204

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.
@@ -53,14 +53,20 @@ declare const CtaButtonZ: z.ZodObject<{
53
53
  label: z.ZodString;
54
54
  actionId: z.ZodString;
55
55
  primary: z.ZodOptional<z.ZodBoolean>;
56
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
57
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
56
58
  }, "strict", z.ZodTypeAny, {
57
59
  label: string;
58
60
  actionId: string;
61
+ target?: "_self" | "_blank" | undefined;
59
62
  primary?: boolean | undefined;
63
+ href?: string | undefined;
60
64
  }, {
61
65
  label: string;
62
66
  actionId: string;
67
+ target?: "_self" | "_blank" | undefined;
63
68
  primary?: boolean | undefined;
69
+ href?: string | undefined;
64
70
  }>;
65
71
  /**
66
72
  * Tooltip content (schema-safe version).
@@ -73,21 +79,29 @@ declare const TooltipContentZ: z.ZodObject<{
73
79
  label: z.ZodString;
74
80
  actionId: z.ZodString;
75
81
  primary: z.ZodOptional<z.ZodBoolean>;
82
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
83
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
76
84
  }, "strict", z.ZodTypeAny, {
77
85
  label: string;
78
86
  actionId: string;
87
+ target?: "_self" | "_blank" | undefined;
79
88
  primary?: boolean | undefined;
89
+ href?: string | undefined;
80
90
  }, {
81
91
  label: string;
82
92
  actionId: string;
93
+ target?: "_self" | "_blank" | undefined;
83
94
  primary?: boolean | undefined;
95
+ href?: string | undefined;
84
96
  }>, "many">>;
85
97
  }, "strict", z.ZodTypeAny, {
86
98
  body: string;
87
99
  ctaButtons?: {
88
100
  label: string;
89
101
  actionId: string;
102
+ target?: "_self" | "_blank" | undefined;
90
103
  primary?: boolean | undefined;
104
+ href?: string | undefined;
91
105
  }[] | undefined;
92
106
  title?: string | undefined;
93
107
  }, {
@@ -95,7 +109,9 @@ declare const TooltipContentZ: z.ZodObject<{
95
109
  ctaButtons?: {
96
110
  label: string;
97
111
  actionId: string;
112
+ target?: "_self" | "_blank" | undefined;
98
113
  primary?: boolean | undefined;
114
+ href?: string | undefined;
99
115
  }[] | undefined;
100
116
  title?: string | undefined;
101
117
  }>;
@@ -6425,21 +6441,29 @@ declare const TooltipZ: z.ZodObject<{
6425
6441
  label: z.ZodString;
6426
6442
  actionId: z.ZodString;
6427
6443
  primary: z.ZodOptional<z.ZodBoolean>;
6444
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
6445
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
6428
6446
  }, "strict", z.ZodTypeAny, {
6429
6447
  label: string;
6430
6448
  actionId: string;
6449
+ target?: "_self" | "_blank" | undefined;
6431
6450
  primary?: boolean | undefined;
6451
+ href?: string | undefined;
6432
6452
  }, {
6433
6453
  label: string;
6434
6454
  actionId: string;
6455
+ target?: "_self" | "_blank" | undefined;
6435
6456
  primary?: boolean | undefined;
6457
+ href?: string | undefined;
6436
6458
  }>, "many">>;
6437
6459
  }, "strict", z.ZodTypeAny, {
6438
6460
  body: string;
6439
6461
  ctaButtons?: {
6440
6462
  label: string;
6441
6463
  actionId: string;
6464
+ target?: "_self" | "_blank" | undefined;
6442
6465
  primary?: boolean | undefined;
6466
+ href?: string | undefined;
6443
6467
  }[] | undefined;
6444
6468
  title?: string | undefined;
6445
6469
  }, {
@@ -6447,7 +6471,9 @@ declare const TooltipZ: z.ZodObject<{
6447
6471
  ctaButtons?: {
6448
6472
  label: string;
6449
6473
  actionId: string;
6474
+ target?: "_self" | "_blank" | undefined;
6450
6475
  primary?: boolean | undefined;
6476
+ href?: string | undefined;
6451
6477
  }[] | undefined;
6452
6478
  title?: string | undefined;
6453
6479
  }>;
@@ -6956,7 +6982,9 @@ declare const TooltipZ: z.ZodObject<{
6956
6982
  ctaButtons?: {
6957
6983
  label: string;
6958
6984
  actionId: string;
6985
+ target?: "_self" | "_blank" | undefined;
6959
6986
  primary?: boolean | undefined;
6987
+ href?: string | undefined;
6960
6988
  }[] | undefined;
6961
6989
  title?: string | undefined;
6962
6990
  };
@@ -7059,7 +7087,9 @@ declare const TooltipZ: z.ZodObject<{
7059
7087
  ctaButtons?: {
7060
7088
  label: string;
7061
7089
  actionId: string;
7090
+ target?: "_self" | "_blank" | undefined;
7062
7091
  primary?: boolean | undefined;
7092
+ href?: string | undefined;
7063
7093
  }[] | undefined;
7064
7094
  title?: string | undefined;
7065
7095
  };
@@ -7190,14 +7220,20 @@ declare const ModalZ: z.ZodObject<{
7190
7220
  label: z.ZodString;
7191
7221
  actionId: z.ZodString;
7192
7222
  primary: z.ZodOptional<z.ZodBoolean>;
7223
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
7224
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
7193
7225
  }, "strict", z.ZodTypeAny, {
7194
7226
  label: string;
7195
7227
  actionId: string;
7228
+ target?: "_self" | "_blank" | undefined;
7196
7229
  primary?: boolean | undefined;
7230
+ href?: string | undefined;
7197
7231
  }, {
7198
7232
  label: string;
7199
7233
  actionId: string;
7234
+ target?: "_self" | "_blank" | undefined;
7200
7235
  primary?: boolean | undefined;
7236
+ href?: string | undefined;
7201
7237
  }>, "many">>;
7202
7238
  waitFor: z.ZodOptional<z.ZodString>;
7203
7239
  label: z.ZodOptional<z.ZodString>;
@@ -7711,7 +7747,9 @@ declare const ModalZ: z.ZodObject<{
7711
7747
  ctaButtons?: {
7712
7748
  label: string;
7713
7749
  actionId: string;
7750
+ target?: "_self" | "_blank" | undefined;
7714
7751
  primary?: boolean | undefined;
7752
+ href?: string | undefined;
7715
7753
  }[] | undefined;
7716
7754
  label?: string | undefined;
7717
7755
  triggerWhen?: {
@@ -7818,7 +7856,9 @@ declare const ModalZ: z.ZodObject<{
7818
7856
  ctaButtons?: {
7819
7857
  label: string;
7820
7858
  actionId: string;
7859
+ target?: "_self" | "_blank" | undefined;
7821
7860
  primary?: boolean | undefined;
7861
+ href?: string | undefined;
7822
7862
  }[] | undefined;
7823
7863
  label?: string | undefined;
7824
7864
  triggerWhen?: {
@@ -19839,21 +19879,29 @@ export declare const coreActionStepSchemas: ({
19839
19879
  label: z.ZodString;
19840
19880
  actionId: z.ZodString;
19841
19881
  primary: z.ZodOptional<z.ZodBoolean>;
19882
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
19883
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
19842
19884
  }, "strict", z.ZodTypeAny, {
19843
19885
  label: string;
19844
19886
  actionId: string;
19887
+ target?: "_self" | "_blank" | undefined;
19845
19888
  primary?: boolean | undefined;
19889
+ href?: string | undefined;
19846
19890
  }, {
19847
19891
  label: string;
19848
19892
  actionId: string;
19893
+ target?: "_self" | "_blank" | undefined;
19849
19894
  primary?: boolean | undefined;
19895
+ href?: string | undefined;
19850
19896
  }>, "many">>;
19851
19897
  }, "strict", z.ZodTypeAny, {
19852
19898
  body: string;
19853
19899
  ctaButtons?: {
19854
19900
  label: string;
19855
19901
  actionId: string;
19902
+ target?: "_self" | "_blank" | undefined;
19856
19903
  primary?: boolean | undefined;
19904
+ href?: string | undefined;
19857
19905
  }[] | undefined;
19858
19906
  title?: string | undefined;
19859
19907
  }, {
@@ -19861,7 +19909,9 @@ export declare const coreActionStepSchemas: ({
19861
19909
  ctaButtons?: {
19862
19910
  label: string;
19863
19911
  actionId: string;
19912
+ target?: "_self" | "_blank" | undefined;
19864
19913
  primary?: boolean | undefined;
19914
+ href?: string | undefined;
19865
19915
  }[] | undefined;
19866
19916
  title?: string | undefined;
19867
19917
  }>;
@@ -20370,7 +20420,9 @@ export declare const coreActionStepSchemas: ({
20370
20420
  ctaButtons?: {
20371
20421
  label: string;
20372
20422
  actionId: string;
20423
+ target?: "_self" | "_blank" | undefined;
20373
20424
  primary?: boolean | undefined;
20425
+ href?: string | undefined;
20374
20426
  }[] | undefined;
20375
20427
  title?: string | undefined;
20376
20428
  };
@@ -20473,7 +20525,9 @@ export declare const coreActionStepSchemas: ({
20473
20525
  ctaButtons?: {
20474
20526
  label: string;
20475
20527
  actionId: string;
20528
+ target?: "_self" | "_blank" | undefined;
20476
20529
  primary?: boolean | undefined;
20530
+ href?: string | undefined;
20477
20531
  }[] | undefined;
20478
20532
  title?: string | undefined;
20479
20533
  };
@@ -20606,14 +20660,20 @@ export declare const coreActionStepSchemas: ({
20606
20660
  label: z.ZodString;
20607
20661
  actionId: z.ZodString;
20608
20662
  primary: z.ZodOptional<z.ZodBoolean>;
20663
+ href: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
20664
+ target: z.ZodOptional<z.ZodEnum<["_self", "_blank"]>>;
20609
20665
  }, "strict", z.ZodTypeAny, {
20610
20666
  label: string;
20611
20667
  actionId: string;
20668
+ target?: "_self" | "_blank" | undefined;
20612
20669
  primary?: boolean | undefined;
20670
+ href?: string | undefined;
20613
20671
  }, {
20614
20672
  label: string;
20615
20673
  actionId: string;
20674
+ target?: "_self" | "_blank" | undefined;
20616
20675
  primary?: boolean | undefined;
20676
+ href?: string | undefined;
20617
20677
  }>, "many">>;
20618
20678
  waitFor: z.ZodOptional<z.ZodString>;
20619
20679
  label: z.ZodOptional<z.ZodString>;
@@ -21127,7 +21187,9 @@ export declare const coreActionStepSchemas: ({
21127
21187
  ctaButtons?: {
21128
21188
  label: string;
21129
21189
  actionId: string;
21190
+ target?: "_self" | "_blank" | undefined;
21130
21191
  primary?: boolean | undefined;
21192
+ href?: string | undefined;
21131
21193
  }[] | undefined;
21132
21194
  label?: string | undefined;
21133
21195
  triggerWhen?: {
@@ -21234,7 +21296,9 @@ export declare const coreActionStepSchemas: ({
21234
21296
  ctaButtons?: {
21235
21297
  label: string;
21236
21298
  actionId: string;
21299
+ target?: "_self" | "_blank" | undefined;
21237
21300
  primary?: boolean | undefined;
21301
+ href?: string | undefined;
21238
21302
  }[] | undefined;
21239
21303
  label?: string | undefined;
21240
21304
  triggerWhen?: {
@@ -31,7 +31,7 @@ import {
31
31
  WaitZ,
32
32
  WidgetConfigZ,
33
33
  coreActionStepSchemas
34
- } from "../chunk-R7R2ZKZU.js";
34
+ } from "../chunk-FMLX4END.js";
35
35
  import "../chunk-44V2AOO4.js";
36
36
  import "../chunk-LSU6P3XW.js";
37
37
  import "../chunk-5Z66FT5C.js";
@@ -36,10 +36,32 @@ var PlacementZ = z.enum([
36
36
  "right-start",
37
37
  "right-end"
38
38
  ]);
39
+ var SAFE_HREF_PATTERN = /^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\/\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)/;
40
+ var HrefZ = z.string().min(1).regex(SAFE_HREF_PATTERN, {
41
+ message: "href must start with /, ./, ../, #, ?, http(s)://, mailto:, or tel: \u2014 javascript:, data:, and vbscript: are not allowed"
42
+ }).refine(
43
+ (s) => {
44
+ try {
45
+ const parsed = new URL(s, "https://syntro.local/");
46
+ return ["http:", "https:", "mailto:", "tel:"].includes(parsed.protocol);
47
+ } catch {
48
+ return false;
49
+ }
50
+ },
51
+ { message: "href resolves to an unsupported protocol" }
52
+ );
39
53
  var CtaButtonZ = z.object({
40
- label: z.string(),
41
- actionId: z.string(),
42
- primary: z.boolean().optional()
54
+ label: z.string().describe("Visible button label."),
55
+ actionId: z.string().describe(
56
+ 'Identifier emitted on action.modal_cta_clicked / action.tooltip_cta_clicked. Use "dismiss" to close the overlay without publishing an event or navigating, even if href is set.'
57
+ ),
58
+ primary: z.boolean().optional().describe("When true, renders as the primary (filled) button. Defaults to false."),
59
+ href: HrefZ.optional().describe(
60
+ 'URL to navigate to when the button is clicked. Use this to drive users to a destination (product page, signup, etc.) \u2014 set href on a non-dismiss button rather than relying on actionId conventions or content:setAttr tricks. Accepts relative paths ("/product/x"), fragments ("#section"), query strings, and absolute http(s) URLs. javascript:/data:/vbscript: are rejected.'
61
+ ),
62
+ target: z.enum(["_self", "_blank"]).optional().describe(
63
+ 'Navigation target. "_self" (default) replaces the current tab; "_blank" opens a new tab with noopener,noreferrer.'
64
+ )
43
65
  }).strict();
44
66
  var TooltipContentZ = z.object({
45
67
  title: z.string().optional(),
@@ -250,4 +272,4 @@ export {
250
272
  TourZ,
251
273
  coreActionStepSchemas
252
274
  };
253
- //# sourceMappingURL=chunk-R7R2ZKZU.js.map
275
+ //# sourceMappingURL=chunk-FMLX4END.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/actions/schema.ts"],
4
+ "sourcesContent": ["/**\n * Core Action Zod Schemas\n *\n * Single source of truth for the shape of all 18 core action types.\n * These schemas are converted to JSON Schema during build and merged\n * into the unified canvas-config.schema.json.\n *\n * Design decisions:\n * - `.strict()` on most objects \u2192 `additionalProperties: false` in JSON Schema\n * - Tour/TourStep use `.passthrough()` to allow adaptive-specific extensions (e.g. `workflow`)\n * - Matches `types.ts` exactly (fixes all drift from the old manual JSON defs)\n * - Recursive ActionStep references use `z.any()` as placeholder; the generator\n * replaces `{}` with `{ \"$ref\": \"#/$defs/actionStep\" }` post-conversion\n */\n\nimport { AuthoringFieldsZ } from '@syntrologie/sdk-contracts';\nimport { z } from 'zod';\nimport { NotificationDeepLinkZ } from '../config/schema';\nimport { TriggerWhenZ } from '../decisions/schema';\n\n// ============================================================================\n// Shared Sub-Types\n// ============================================================================\n\n/**\n * Conditional execution for actions.\n *\n * Actions use `triggerWhen` (DecisionStrategy) exclusively.\n * NOTE: `activation` (with routes/strategy) is for TILES only \u2014 it is evaluated\n * by `runtime.filterTiles()` in useShadowCanvasConfig but is NEVER checked by\n * ActionEngine. Do not add `activation` here; use `triggerWhen` with a\n * `page_url` condition instead.\n */\nconst ActionTriggerZ = {\n triggerWhen: TriggerWhenZ,\n};\n\n/** Route-scoped anchor identifier */\nconst AnchorIdZ = z\n .object({\n selector: z.string(),\n route: z.union([z.string(), z.array(z.string())]),\n })\n .strict();\n\n/** Highlight style configuration */\nconst HighlightStyleZ = z\n .object({\n color: z.string().optional(),\n scrimOpacity: z.number().min(0).max(1).optional(),\n paddingPx: z.number().optional(),\n radiusPx: z.number().optional(),\n })\n .strict();\n\n/** Badge position relative to anchor */\nconst BadgePositionZ = z.enum(['top-left', 'top-right', 'bottom-left', 'bottom-right']);\n\n/**\n * Floating-ui Placement \u2014 all 12 values.\n * Matches `@floating-ui/dom` `Placement` type.\n */\nconst PlacementZ = z.enum([\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n]);\n\n/**\n * Validates a CTA button href. Allows relative paths (\"/x\", \"./x\", \"../x\"),\n * fragments (\"#x\"), query strings (\"?x\"), absolute http(s) URLs, and\n * mailto:/tel: links. Rejects everything else \u2014 including javascript:, data:,\n * vbscript:, and bypass attempts that embed control characters in the scheme\n * (e.g. \"java\\\\tscript:alert(1)\" \u2014 browsers strip the tab before resolving).\n *\n * Two layers of validation:\n *\n * 1. `.regex()` \u2014 a positive-allowlist pattern. This serializes to JSON\n * Schema's `pattern` keyword and is enforced at the server-side jsonschema\n * validation layer (where the Zod `.refine()` doesn't reach). Uses\n * character classes for case-insensitivity since JSON Schema regex is\n * ECMA 262 without inline flags.\n *\n * 2. `.refine()` \u2014 runs the input through `new URL()` to canonicalize the\n * scheme using the same algorithm browsers use, then checks the resolved\n * protocol against an allowlist. Catches anything the regex misses.\n */\nconst SAFE_HREF_PATTERN =\n /^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\\/\\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)/;\n\nconst HrefZ = z\n .string()\n .min(1)\n .regex(SAFE_HREF_PATTERN, {\n message:\n 'href must start with /, ./, ../, #, ?, http(s)://, mailto:, or tel: \u2014 javascript:, data:, and vbscript: are not allowed',\n })\n .refine(\n (s) => {\n try {\n const parsed = new URL(s, 'https://syntro.local/');\n return ['http:', 'https:', 'mailto:', 'tel:'].includes(parsed.protocol);\n } catch {\n return false;\n }\n },\n { message: 'href resolves to an unsupported protocol' }\n );\n\n/** CTA button configuration for tooltips/modals */\nconst CtaButtonZ = z\n .object({\n label: z.string().describe('Visible button label.'),\n actionId: z\n .string()\n .describe(\n 'Identifier emitted on action.modal_cta_clicked / action.tooltip_cta_clicked. Use \"dismiss\" to close the overlay without publishing an event or navigating, even if href is set.'\n ),\n primary: z\n .boolean()\n .optional()\n .describe('When true, renders as the primary (filled) button. Defaults to false.'),\n href: HrefZ.optional().describe(\n 'URL to navigate to when the button is clicked. Use this to drive users to a destination (product page, signup, etc.) \u2014 set href on a non-dismiss button rather than relying on actionId conventions or content:setAttr tricks. Accepts relative paths (\"/product/x\"), fragments (\"#section\"), query strings, and absolute http(s) URLs. javascript:/data:/vbscript: are rejected.'\n ),\n target: z\n .enum(['_self', '_blank'])\n .optional()\n .describe(\n 'Navigation target. \"_self\" (default) replaces the current tab; \"_blank\" opens a new tab with noopener,noreferrer.'\n ),\n })\n .strict();\n\n/**\n * Tooltip content (schema-safe version).\n * Omits `cta` (legacy field with recursive ActionStep; never in JSON schema).\n */\nconst TooltipContentZ = z\n .object({\n title: z.string().optional(),\n body: z.string(),\n ctaButtons: z.array(CtaButtonZ).optional(),\n })\n .strict();\n\n/** Modal content configuration */\nconst ModalContentZ = z\n .object({\n title: z.string().optional(),\n body: z.string(),\n })\n .strict();\n\n/** Position where HTML/content should be inserted */\nconst InsertPositionZ = z.enum(['before', 'after', 'prepend', 'append', 'replace']);\n\n/** Tooltip trigger mode */\nconst TooltipTriggerZ = z.enum(['immediate', 'hover', 'click']);\n\n/** Widget configuration for surface mounting */\nconst WidgetConfigZ = z\n .object({\n widgetId: z.string(),\n props: z.record(z.unknown()).optional(),\n priority: z.number().optional(),\n })\n .strict();\n\n/**\n * Tour step (schema-safe version).\n * Uses `z.any()` for the `action` field \u2014 the generator replaces it with a $ref.\n */\nconst TourStepForSchemaZ = z\n .object({\n id: z.string(),\n action: z.any(),\n route: z.string().optional(),\n onAction: z.record(z.string()).optional(),\n })\n .passthrough();\n\n// ============================================================================\n// ScrollBehavior / ScrollLogicalPosition (DOM built-in types as Zod enums)\n// ============================================================================\n\nconst ScrollBehaviorZ = z.enum(['auto', 'smooth', 'instant']);\nconst ScrollLogicalPositionZ = z.enum(['start', 'center', 'end', 'nearest']);\n\n// ============================================================================\n// Core Action Schemas (18 total)\n// ============================================================================\n\n// --- Content Actions ---\n\nconst SetTextZ = z\n .object({\n kind: z.literal('content:setText'),\n anchorId: AnchorIdZ,\n text: z.string(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst SetAttrZ = z\n .object({\n kind: z.literal('content:setAttr'),\n anchorId: AnchorIdZ,\n attr: z.string(),\n value: z.string(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst AddClassZ = z\n .object({\n kind: z.literal('content:addClass'),\n anchorId: AnchorIdZ,\n className: z.string(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst RemoveClassZ = z\n .object({\n kind: z.literal('content:removeClass'),\n anchorId: AnchorIdZ,\n className: z.string(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst SetStyleZ = z\n .object({\n kind: z.literal('content:setStyle'),\n anchorId: AnchorIdZ,\n styles: z.record(z.string()),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst InsertHtmlZ = z\n .object({\n kind: z.literal('content:insertHtml'),\n anchorId: AnchorIdZ,\n html: z.string(),\n position: InsertPositionZ,\n deepLink: NotificationDeepLinkZ.optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n// --- Overlay Actions ---\n\nconst HighlightZ = z\n .object({\n kind: z.literal('overlays:highlight'),\n anchorId: AnchorIdZ,\n style: HighlightStyleZ.optional(),\n duration: z.number().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst PulseZ = z\n .object({\n kind: z.literal('overlays:pulse'),\n anchorId: AnchorIdZ,\n duration: z.number().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst BadgeZ = z\n .object({\n kind: z.literal('overlays:badge'),\n anchorId: AnchorIdZ,\n content: z.string(),\n position: BadgePositionZ.optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst TooltipZ = z\n .object({\n kind: z.literal('overlays:tooltip'),\n anchorId: AnchorIdZ,\n content: TooltipContentZ,\n trigger: TooltipTriggerZ.optional(),\n placement: PlacementZ.optional(),\n waitFor: z.string().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst ModalZ = z\n .object({\n kind: z.literal('overlays:modal'),\n content: ModalContentZ,\n size: z.enum(['sm', 'md', 'lg']).optional(),\n blocking: z.boolean().optional(),\n scrim: z\n .object({\n opacity: z.number().min(0).max(1).optional(),\n })\n .strict()\n .optional(),\n dismiss: z\n .object({\n onEsc: z.boolean().optional(),\n closeButton: z.boolean().optional(),\n timeoutMs: z.number().min(0).optional(),\n })\n .strict()\n .optional(),\n ctaButtons: z.array(CtaButtonZ).optional(),\n waitFor: z.string().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n// --- Navigation Actions ---\n\nconst ScrollToZ = z\n .object({\n kind: z.literal('navigation:scrollTo'),\n anchorId: AnchorIdZ,\n behavior: ScrollBehaviorZ.optional(),\n block: ScrollLogicalPositionZ.optional(),\n inline: ScrollLogicalPositionZ.optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst NavigateZ = z\n .object({\n kind: z.literal('navigation:navigate'),\n url: z.string(),\n target: z.enum(['_self', '_blank']).optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n// --- Core Primitives ---\n\nconst MountWidgetZ = z\n .object({\n kind: z.literal('core:mountWidget'),\n slot: z.string(),\n widget: WidgetConfigZ,\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\nconst WaitZ = z\n .object({\n kind: z.literal('core:wait'),\n durationMs: z.number().min(0).optional(),\n event: z.string().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n/**\n * Sequence \u2014 executes actions serially.\n * `actions` uses `z.any()` as placeholder for recursive ActionStep refs.\n */\nconst SequenceZ = z\n .object({\n kind: z.literal('core:sequence'),\n actions: z.array(z.any()),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n/**\n * Parallel \u2014 executes actions concurrently.\n * `actions` uses `z.any()` as placeholder for recursive ActionStep refs.\n */\nconst ParallelZ = z\n .object({\n kind: z.literal('core:parallel'),\n actions: z.array(z.any()),\n waitFor: z.enum(['all', 'any']).optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .strict();\n\n/**\n * Tour \u2014 orchestrate sequential steps with cross-page state.\n * `steps` contains TourStepForSchemaZ which uses z.any() for step.action.\n */\nconst TourZ = z\n .object({\n kind: z.literal('overlays:tour'),\n tourId: z.string(),\n steps: z.array(TourStepForSchemaZ).min(1),\n startStep: z.string().optional(),\n autoStart: z.boolean().optional(),\n label: z.string().optional(),\n })\n .extend(ActionTriggerZ)\n .extend(AuthoringFieldsZ)\n .passthrough();\n\n// ============================================================================\n// Export: Array for unified schema generation\n// ============================================================================\n\n/**\n * All 18 core action step schemas for unified JSON Schema generation.\n * The generator imports this array and converts each to JSON Schema,\n * then merges them into `$defs` and `actionStep.oneOf`.\n *\n * `defName` values match the existing `$defs` keys for backward compat.\n */\nexport const coreActionStepSchemas = [\n { defName: 'setText', schema: SetTextZ },\n { defName: 'setAttr', schema: SetAttrZ },\n { defName: 'addClass', schema: AddClassZ },\n { defName: 'removeClass', schema: RemoveClassZ },\n { defName: 'setStyle', schema: SetStyleZ },\n { defName: 'insertHtml', schema: InsertHtmlZ },\n { defName: 'highlight', schema: HighlightZ },\n { defName: 'pulse', schema: PulseZ },\n { defName: 'badge', schema: BadgeZ },\n { defName: 'tooltip', schema: TooltipZ },\n { defName: 'modal', schema: ModalZ },\n { defName: 'scrollTo', schema: ScrollToZ },\n { defName: 'navigate', schema: NavigateZ },\n { defName: 'mountWidget', schema: MountWidgetZ },\n { defName: 'wait', schema: WaitZ },\n { defName: 'sequence', schema: SequenceZ },\n { defName: 'parallel', schema: ParallelZ },\n { defName: 'tour', schema: TourZ },\n];\n\n// ============================================================================\n// Named Exports (for unit tests and direct usage)\n// ============================================================================\n\nexport {\n AddClassZ,\n // Sub-types\n AnchorIdZ,\n BadgePositionZ,\n BadgeZ,\n CtaButtonZ,\n HighlightStyleZ,\n HighlightZ,\n InsertHtmlZ,\n InsertPositionZ,\n ModalContentZ,\n ModalZ,\n MountWidgetZ,\n NavigateZ,\n ParallelZ,\n PlacementZ,\n PulseZ,\n RemoveClassZ,\n ScrollBehaviorZ,\n ScrollLogicalPositionZ,\n ScrollToZ,\n SequenceZ,\n SetAttrZ,\n SetStyleZ,\n // Actions\n SetTextZ,\n TooltipContentZ,\n TooltipTriggerZ,\n TooltipZ,\n TourStepForSchemaZ,\n TourZ,\n WaitZ,\n WidgetConfigZ,\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.js CHANGED
@@ -36,7 +36,7 @@ import {
36
36
  WaitZ,
37
37
  WidgetConfigZ,
38
38
  coreActionStepSchemas
39
- } from "./chunk-R7R2ZKZU.js";
39
+ } from "./chunk-FMLX4END.js";
40
40
  import "./chunk-44V2AOO4.js";
41
41
  import {
42
42
  ActivationConfigZ,
@@ -967,6 +967,28 @@ var executeCelebrate = async (action, context) => {
967
967
  }
968
968
  };
969
969
  };
970
+ var ALLOWED_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:", "mailto:", "tel:"]);
971
+ function isSafeNavigationHref(href) {
972
+ if (typeof href !== "string" || href.trim().length === 0) return false;
973
+ let parsed;
974
+ try {
975
+ parsed = new URL(href, "https://syntro.local/");
976
+ } catch {
977
+ return false;
978
+ }
979
+ return ALLOWED_PROTOCOLS.has(parsed.protocol);
980
+ }
981
+ function navigateForCta(input) {
982
+ if (input.actionId === "dismiss") return false;
983
+ if (!input.href || !isSafeNavigationHref(input.href)) return false;
984
+ const href = input.href;
985
+ if (input.target === "_blank") {
986
+ window.open(href, "_blank", "noopener,noreferrer");
987
+ } else {
988
+ window.location.assign(href);
989
+ }
990
+ return true;
991
+ }
970
992
  var ACTIVE_TOUR_KEY = "syntro_active_tour";
971
993
  var activeTours = /* @__PURE__ */ new Map();
972
994
  function getTourState(tourId) {
@@ -1942,10 +1964,16 @@ var executeModal = async (action, context) => {
1942
1964
  const actionId = btn.getAttribute("data-syntro-action");
1943
1965
  if (actionId) {
1944
1966
  actionClicked = actionId;
1967
+ const matchingBtn = ctaButtons == null ? void 0 : ctaButtons.find((b2) => b2.actionId === actionId);
1968
+ const href = matchingBtn == null ? void 0 : matchingBtn.href;
1945
1969
  context.publishEvent("action.modal_cta_clicked", {
1946
- actionId
1970
+ actionId,
1971
+ ...href ? { href } : {}
1947
1972
  });
1948
1973
  handle.destroy();
1974
+ if (matchingBtn) {
1975
+ navigateForCta(matchingBtn);
1976
+ }
1949
1977
  }
1950
1978
  };
1951
1979
  actionBtns.forEach((btn) => btn.addEventListener("click", actionHandler));
@@ -3110,8 +3138,12 @@ var executeTooltip = async (action, context) => {
3110
3138
  context.publishEvent("action.tooltip_cta_clicked", {
3111
3139
  anchorId: action.anchorId,
3112
3140
  actionId,
3113
- label: clickedBtn.label
3141
+ label: clickedBtn.label,
3142
+ ...clickedBtn.href ? { href: clickedBtn.href } : {}
3114
3143
  });
3144
+ handle.destroy();
3145
+ navigateForCta(clickedBtn);
3146
+ return;
3115
3147
  }
3116
3148
  }
3117
3149
  handle.destroy();
@@ -9903,7 +9935,7 @@ function bindWebVitals(reporter, options) {
9903
9935
  }
9904
9936
 
9905
9937
  // src/version.ts
9906
- var SDK_VERSION = "2.8.0-canary.202";
9938
+ var SDK_VERSION = "2.8.0-canary.204";
9907
9939
 
9908
9940
  // src/types.ts
9909
9941
  var SDK_SCHEMA_VERSION = "2.0";