@syntrologie/runtime-sdk 2.19.0 → 2.20.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/dist/actions/schema.d.ts +64 -0
- package/dist/actions/schema.js +1 -1
- package/dist/{chunk-R7R2ZKZU.js → chunk-FMLX4END.js} +26 -4
- package/dist/chunk-FMLX4END.js.map +7 -0
- package/dist/index.js +36 -4
- package/dist/index.js.map +3 -3
- package/dist/smart-canvas.esm.js +52 -52
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +61 -7
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +52 -52
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/schema/canvas-config.schema.json +69 -31
- package/dist/chunk-R7R2ZKZU.js.map +0 -7
package/dist/version.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -2157,13 +2157,30 @@
|
|
|
2157
2157
|
"type": "object",
|
|
2158
2158
|
"properties": {
|
|
2159
2159
|
"label": {
|
|
2160
|
-
"type": "string"
|
|
2160
|
+
"type": "string",
|
|
2161
|
+
"description": "Visible button label."
|
|
2161
2162
|
},
|
|
2162
2163
|
"actionId": {
|
|
2163
|
-
"type": "string"
|
|
2164
|
+
"type": "string",
|
|
2165
|
+
"description": "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."
|
|
2164
2166
|
},
|
|
2165
2167
|
"primary": {
|
|
2166
|
-
"type": "boolean"
|
|
2168
|
+
"type": "boolean",
|
|
2169
|
+
"description": "When true, renders as the primary (filled) button. Defaults to false."
|
|
2170
|
+
},
|
|
2171
|
+
"href": {
|
|
2172
|
+
"type": "string",
|
|
2173
|
+
"minLength": 1,
|
|
2174
|
+
"pattern": "^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\\/\\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)",
|
|
2175
|
+
"description": "URL to navigate to when the button is clicked. Use this to drive users to a destination (product page, signup, etc.) — 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."
|
|
2176
|
+
},
|
|
2177
|
+
"target": {
|
|
2178
|
+
"type": "string",
|
|
2179
|
+
"enum": [
|
|
2180
|
+
"_self",
|
|
2181
|
+
"_blank"
|
|
2182
|
+
],
|
|
2183
|
+
"description": "Navigation target. \"_self\" (default) replaces the current tab; \"_blank\" opens a new tab with noopener,noreferrer."
|
|
2167
2184
|
}
|
|
2168
2185
|
},
|
|
2169
2186
|
"required": [
|
|
@@ -2314,13 +2331,30 @@
|
|
|
2314
2331
|
"type": "object",
|
|
2315
2332
|
"properties": {
|
|
2316
2333
|
"label": {
|
|
2317
|
-
"type": "string"
|
|
2334
|
+
"type": "string",
|
|
2335
|
+
"description": "Visible button label."
|
|
2318
2336
|
},
|
|
2319
2337
|
"actionId": {
|
|
2320
|
-
"type": "string"
|
|
2338
|
+
"type": "string",
|
|
2339
|
+
"description": "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."
|
|
2321
2340
|
},
|
|
2322
2341
|
"primary": {
|
|
2323
|
-
"type": "boolean"
|
|
2342
|
+
"type": "boolean",
|
|
2343
|
+
"description": "When true, renders as the primary (filled) button. Defaults to false."
|
|
2344
|
+
},
|
|
2345
|
+
"href": {
|
|
2346
|
+
"type": "string",
|
|
2347
|
+
"minLength": 1,
|
|
2348
|
+
"pattern": "^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\\/\\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)",
|
|
2349
|
+
"description": "URL to navigate to when the button is clicked. Use this to drive users to a destination (product page, signup, etc.) — 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."
|
|
2350
|
+
},
|
|
2351
|
+
"target": {
|
|
2352
|
+
"type": "string",
|
|
2353
|
+
"enum": [
|
|
2354
|
+
"_self",
|
|
2355
|
+
"_blank"
|
|
2356
|
+
],
|
|
2357
|
+
"description": "Navigation target. \"_self\" (default) replaces the current tab; \"_blank\" opens a new tab with noopener,noreferrer."
|
|
2324
2358
|
}
|
|
2325
2359
|
},
|
|
2326
2360
|
"required": [
|
|
@@ -2885,7 +2919,7 @@
|
|
|
2885
2919
|
"type": {
|
|
2886
2920
|
"type": "string",
|
|
2887
2921
|
"const": "rich",
|
|
2888
|
-
"description": "
|
|
2922
|
+
"description": "Last-resort variant. Only use when the answer needs HTML elements markdown cannot produce: a real <button>, an embedded <iframe>, a <form>, or a structural <table> with attributes. Otherwise use a plain string with markdown."
|
|
2889
2923
|
},
|
|
2890
2924
|
"html": {
|
|
2891
2925
|
"type": "string",
|
|
@@ -2897,7 +2931,7 @@
|
|
|
2897
2931
|
"html"
|
|
2898
2932
|
],
|
|
2899
2933
|
"additionalProperties": false,
|
|
2900
|
-
"description": "Rich HTML answer
|
|
2934
|
+
"description": "Rich HTML answer. Use only when the answer needs HTML markdown cannot produce — buttons, iframes, forms, structural tables. Plain text, bold/italic, links, and lists all belong in a plain string with markdown."
|
|
2901
2935
|
},
|
|
2902
2936
|
{
|
|
2903
2937
|
"type": "object",
|
|
@@ -2905,7 +2939,7 @@
|
|
|
2905
2939
|
"type": {
|
|
2906
2940
|
"type": "string",
|
|
2907
2941
|
"const": "markdown",
|
|
2908
|
-
"description": "
|
|
2942
|
+
"description": "Markdown answer with a sidecar `assets` array. Renders identically to a plain-string answer — the only reason to choose this shape is to attach named media (images, video) with metadata (alt, width, height) and reference them via `asset:<id>` URIs. For inline images with raw URLs, a plain string is simpler."
|
|
2909
2943
|
},
|
|
2910
2944
|
"content": {
|
|
2911
2945
|
"type": "string",
|
|
@@ -2961,10 +2995,10 @@
|
|
|
2961
2995
|
"content"
|
|
2962
2996
|
],
|
|
2963
2997
|
"additionalProperties": false,
|
|
2964
|
-
"description": "
|
|
2998
|
+
"description": "Markdown answer with a named-assets sidecar. Same renderer as a plain-string answer; the only difference is that media is referenced by id with metadata instead of inlined as raw URLs."
|
|
2965
2999
|
}
|
|
2966
3000
|
],
|
|
2967
|
-
"description": "Answer content.
|
|
3001
|
+
"description": "Answer content. DEFAULT: a plain string with markdown — paragraphs, **bold**, *italic*, `code`, [links](url), and bulleted/numbered lists all render via GFM. Use \"rich\" HTML ONLY when the answer needs HTML markdown cannot produce (buttons, iframes, forms, structural tables) — there must be a real reason. Use \"markdown\" (the object form) only when you need named media assets with metadata; otherwise a plain string is simpler."
|
|
2968
3002
|
},
|
|
2969
3003
|
"category": {
|
|
2970
3004
|
"type": "string",
|
|
@@ -3233,7 +3267,7 @@
|
|
|
3233
3267
|
"type": {
|
|
3234
3268
|
"type": "string",
|
|
3235
3269
|
"const": "rich",
|
|
3236
|
-
"description": "
|
|
3270
|
+
"description": "Last-resort variant. Only use when the answer needs HTML elements markdown cannot produce: a real <button>, an embedded <iframe>, a <form>, or a structural <table> with attributes. Otherwise use a plain string with markdown."
|
|
3237
3271
|
},
|
|
3238
3272
|
"html": {
|
|
3239
3273
|
"type": "string",
|
|
@@ -3245,7 +3279,7 @@
|
|
|
3245
3279
|
"html"
|
|
3246
3280
|
],
|
|
3247
3281
|
"additionalProperties": false,
|
|
3248
|
-
"description": "Rich HTML answer
|
|
3282
|
+
"description": "Rich HTML answer. Use only when the answer needs HTML markdown cannot produce — buttons, iframes, forms, structural tables. Plain text, bold/italic, links, and lists all belong in a plain string with markdown."
|
|
3249
3283
|
},
|
|
3250
3284
|
{
|
|
3251
3285
|
"type": "object",
|
|
@@ -3253,7 +3287,7 @@
|
|
|
3253
3287
|
"type": {
|
|
3254
3288
|
"type": "string",
|
|
3255
3289
|
"const": "markdown",
|
|
3256
|
-
"description": "
|
|
3290
|
+
"description": "Markdown answer with a sidecar `assets` array. Renders identically to a plain-string answer — the only reason to choose this shape is to attach named media (images, video) with metadata (alt, width, height) and reference them via `asset:<id>` URIs. For inline images with raw URLs, a plain string is simpler."
|
|
3257
3291
|
},
|
|
3258
3292
|
"content": {
|
|
3259
3293
|
"type": "string",
|
|
@@ -3309,10 +3343,10 @@
|
|
|
3309
3343
|
"content"
|
|
3310
3344
|
],
|
|
3311
3345
|
"additionalProperties": false,
|
|
3312
|
-
"description": "
|
|
3346
|
+
"description": "Markdown answer with a named-assets sidecar. Same renderer as a plain-string answer; the only difference is that media is referenced by id with metadata instead of inlined as raw URLs."
|
|
3313
3347
|
}
|
|
3314
3348
|
],
|
|
3315
|
-
"description": "Answer content.
|
|
3349
|
+
"description": "Answer content. DEFAULT: a plain string with markdown — paragraphs, **bold**, *italic*, `code`, [links](url), and bulleted/numbered lists all render via GFM. Use \"rich\" HTML ONLY when the answer needs HTML markdown cannot produce (buttons, iframes, forms, structural tables) — there must be a real reason. Use \"markdown\" (the object form) only when you need named media assets with metadata; otherwise a plain string is simpler."
|
|
3316
3350
|
},
|
|
3317
3351
|
"category": {
|
|
3318
3352
|
"type": "string",
|
|
@@ -4334,7 +4368,7 @@
|
|
|
4334
4368
|
"type": {
|
|
4335
4369
|
"type": "string",
|
|
4336
4370
|
"const": "rich",
|
|
4337
|
-
"description": "
|
|
4371
|
+
"description": "Last-resort variant. Only use when the answer needs HTML elements markdown cannot produce: a real <button>, an embedded <iframe>, a <form>, or a structural <table> with attributes. Otherwise use a plain string with markdown."
|
|
4338
4372
|
},
|
|
4339
4373
|
"html": {
|
|
4340
4374
|
"type": "string",
|
|
@@ -4346,7 +4380,7 @@
|
|
|
4346
4380
|
"html"
|
|
4347
4381
|
],
|
|
4348
4382
|
"additionalProperties": false,
|
|
4349
|
-
"description": "Rich HTML answer
|
|
4383
|
+
"description": "Rich HTML answer. Use only when the answer needs HTML markdown cannot produce — buttons, iframes, forms, structural tables. Plain text, bold/italic, links, and lists all belong in a plain string with markdown."
|
|
4350
4384
|
},
|
|
4351
4385
|
{
|
|
4352
4386
|
"type": "object",
|
|
@@ -4354,7 +4388,7 @@
|
|
|
4354
4388
|
"type": {
|
|
4355
4389
|
"type": "string",
|
|
4356
4390
|
"const": "markdown",
|
|
4357
|
-
"description": "
|
|
4391
|
+
"description": "Markdown answer with a sidecar `assets` array. Renders identically to a plain-string answer — the only reason to choose this shape is to attach named media (images, video) with metadata (alt, width, height) and reference them via `asset:<id>` URIs. For inline images with raw URLs, a plain string is simpler."
|
|
4358
4392
|
},
|
|
4359
4393
|
"content": {
|
|
4360
4394
|
"type": "string",
|
|
@@ -4410,10 +4444,10 @@
|
|
|
4410
4444
|
"content"
|
|
4411
4445
|
],
|
|
4412
4446
|
"additionalProperties": false,
|
|
4413
|
-
"description": "
|
|
4447
|
+
"description": "Markdown answer with a named-assets sidecar. Same renderer as a plain-string answer; the only difference is that media is referenced by id with metadata instead of inlined as raw URLs."
|
|
4414
4448
|
}
|
|
4415
4449
|
],
|
|
4416
|
-
"description": "Answer content.
|
|
4450
|
+
"description": "Answer content. DEFAULT: a plain string with markdown — paragraphs, **bold**, *italic*, `code`, [links](url), and bulleted/numbered lists all render via GFM. Use \"rich\" HTML ONLY when the answer needs HTML markdown cannot produce (buttons, iframes, forms, structural tables) — there must be a real reason. Use \"markdown\" (the object form) only when you need named media assets with metadata; otherwise a plain string is simpler."
|
|
4417
4451
|
},
|
|
4418
4452
|
"category": {
|
|
4419
4453
|
"type": "string",
|
|
@@ -5601,7 +5635,7 @@
|
|
|
5601
5635
|
"type": {
|
|
5602
5636
|
"type": "string",
|
|
5603
5637
|
"const": "rich",
|
|
5604
|
-
"description": "
|
|
5638
|
+
"description": "Last-resort variant. Only use when the answer needs HTML elements markdown cannot produce: a real <button>, an embedded <iframe>, a <form>, or a structural <table> with attributes. Otherwise use a plain string with markdown."
|
|
5605
5639
|
},
|
|
5606
5640
|
"html": {
|
|
5607
5641
|
"type": "string",
|
|
@@ -5613,7 +5647,7 @@
|
|
|
5613
5647
|
"html"
|
|
5614
5648
|
],
|
|
5615
5649
|
"additionalProperties": false,
|
|
5616
|
-
"description": "Rich HTML answer
|
|
5650
|
+
"description": "Rich HTML answer. Use only when the answer needs HTML markdown cannot produce — buttons, iframes, forms, structural tables. Plain text, bold/italic, links, and lists all belong in a plain string with markdown."
|
|
5617
5651
|
},
|
|
5618
5652
|
{
|
|
5619
5653
|
"type": "object",
|
|
@@ -5621,7 +5655,7 @@
|
|
|
5621
5655
|
"type": {
|
|
5622
5656
|
"type": "string",
|
|
5623
5657
|
"const": "markdown",
|
|
5624
|
-
"description": "
|
|
5658
|
+
"description": "Markdown answer with a sidecar `assets` array. Renders identically to a plain-string answer — the only reason to choose this shape is to attach named media (images, video) with metadata (alt, width, height) and reference them via `asset:<id>` URIs. For inline images with raw URLs, a plain string is simpler."
|
|
5625
5659
|
},
|
|
5626
5660
|
"content": {
|
|
5627
5661
|
"type": "string",
|
|
@@ -5677,10 +5711,10 @@
|
|
|
5677
5711
|
"content"
|
|
5678
5712
|
],
|
|
5679
5713
|
"additionalProperties": false,
|
|
5680
|
-
"description": "
|
|
5714
|
+
"description": "Markdown answer with a named-assets sidecar. Same renderer as a plain-string answer; the only difference is that media is referenced by id with metadata instead of inlined as raw URLs."
|
|
5681
5715
|
}
|
|
5682
5716
|
],
|
|
5683
|
-
"description": "Answer content.
|
|
5717
|
+
"description": "Answer content. DEFAULT: a plain string with markdown — paragraphs, **bold**, *italic*, `code`, [links](url), and bulleted/numbered lists all render via GFM. Use \"rich\" HTML ONLY when the answer needs HTML markdown cannot produce (buttons, iframes, forms, structural tables) — there must be a real reason. Use \"markdown\" (the object form) only when you need named media assets with metadata; otherwise a plain string is simpler."
|
|
5684
5718
|
},
|
|
5685
5719
|
"category": {
|
|
5686
5720
|
"type": "string",
|
|
@@ -7499,8 +7533,8 @@
|
|
|
7499
7533
|
"description": "faq:question actions are configuration data rendered by the accordion widget, not actions executed by the runtime. This allows per-item conditional visibility via triggerWhen, category grouping under collapsible section headers, and dynamic injection of contextual items."
|
|
7500
7534
|
},
|
|
7501
7535
|
{
|
|
7502
|
-
"name": "
|
|
7503
|
-
"description": "
|
|
7536
|
+
"name": "Answer format — always prefer markdown",
|
|
7537
|
+
"description": "Always use a plain string with markdown for FAQ answers. The only real reason to reach for the \"rich\" HTML variant is when the answer needs an HTML element markdown cannot produce — a real <button>, an <iframe>, a <form>, or a structural <table>. Bold/italic, links, lists, code blocks, and inline images all render fine from a plain string. The \"markdown\" object variant exists only for named-asset references with metadata; otherwise a plain string is simpler."
|
|
7504
7538
|
},
|
|
7505
7539
|
{
|
|
7506
7540
|
"name": "Companion overlay tooltips",
|
|
@@ -7603,7 +7637,11 @@
|
|
|
7603
7637
|
"conventions": [
|
|
7604
7638
|
{
|
|
7605
7639
|
"name": "Tooltip actionId: \"dismiss\"",
|
|
7606
|
-
"description": "The special actionId \"dismiss\" closes the tooltip immediately without publishing an event. Use for \"close\" or \"not now\" buttons."
|
|
7640
|
+
"description": "The special actionId \"dismiss\" closes the tooltip immediately without publishing an event or navigating (even if href is set). Use for \"close\" or \"not now\" buttons."
|
|
7641
|
+
},
|
|
7642
|
+
{
|
|
7643
|
+
"name": "CTA navigation via href",
|
|
7644
|
+
"description": "To send users to a specific URL when they click a tooltip or modal CTA button, set the button's `href` field (and optionally `target: \"_blank\"` to open a new tab). The runtime publishes the click event first, then navigates via window.location.assign / window.open. Do NOT try to drive navigation by setting data-href via content:setAttr — that does nothing on non-anchor elements. Example: { label: \"Shop GLP-3 (R)\", actionId: \"shop\", href: \"/product/glpiii\", primary: true }."
|
|
7607
7645
|
},
|
|
7608
7646
|
{
|
|
7609
7647
|
"name": "Companion FAQ tooltips (faq:open:<questionId>)",
|
|
@@ -7618,12 +7656,12 @@
|
|
|
7618
7656
|
{
|
|
7619
7657
|
"name": "action.tooltip_cta_clicked",
|
|
7620
7658
|
"when": "User clicks a tooltip CTA button",
|
|
7621
|
-
"props": "{ actionId }"
|
|
7659
|
+
"props": "{ anchorId, actionId, label, href? }"
|
|
7622
7660
|
},
|
|
7623
7661
|
{
|
|
7624
7662
|
"name": "action.modal_cta_clicked",
|
|
7625
7663
|
"when": "User clicks a modal CTA button",
|
|
7626
|
-
"props": "{ actionId }"
|
|
7664
|
+
"props": "{ actionId, href? }"
|
|
7627
7665
|
}
|
|
7628
7666
|
]
|
|
7629
7667
|
},
|
|
@@ -1,7 +0,0 @@
|
|
|
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/** CTA button configuration for tooltips/modals */\nconst CtaButtonZ = z\n .object({\n label: z.string(),\n actionId: z.string(),\n primary: z.boolean().optional(),\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
|
-
}
|