@syntrologie/adapt-content 2.16.0 → 2.17.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/runtime.js +425 -366
- package/dist/runtime.js.map +7 -0
- package/dist/schema.d.ts +55 -16
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +316 -62
- package/dist/schema.js.map +7 -0
- package/package.json +2 -20
- package/dist/cdn.d.ts +0 -35
- package/dist/cdn.d.ts.map +0 -1
- package/dist/cdn.js +0 -39
- package/dist/components/AnchorPicker.d.ts +0 -8
- package/dist/components/AnchorPicker.d.ts.map +0 -1
- package/dist/components/AnchorPicker.js +0 -6
- package/dist/content-editor-state.d.ts +0 -45
- package/dist/content-editor-state.d.ts.map +0 -1
- package/dist/content-editor-state.js +0 -123
- package/dist/content-editor-ui.d.ts +0 -26
- package/dist/content-editor-ui.d.ts.map +0 -1
- package/dist/content-editor-ui.js +0 -291
- package/dist/editor.d.ts +0 -9
- package/dist/editor.d.ts.map +0 -1
- package/dist/editor.js +0 -8
- package/dist/reconciliation-guard.js +0 -80
- package/dist/sanitizer.js +0 -95
- package/dist/summarize.js +0 -88
- package/dist/types.js +0 -7
- package/dist/utils/selectorGenerator.d.ts +0 -6
- package/dist/utils/selectorGenerator.d.ts.map +0 -1
- package/dist/utils/selectorGenerator.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts +0 -2
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/cn.js +0 -3
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts +0 -34
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.js +0 -161
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts +0 -84
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPickerLit.js +0 -323
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.js +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggleLit.js +0 -55
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts +0 -23
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.js +0 -40
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLineLit.js +0 -118
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.js +0 -22
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts +0 -32
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadgeLit.js +0 -68
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.js +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts +0 -34
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSectionLit.js +0 -57
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts +0 -13
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButtonLit.js +0 -31
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBodyLit.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts +0 -13
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts +0 -36
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCardLit.js +0 -102
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts +0 -20
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooterLit.js +0 -48
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts +0 -9
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts +0 -16
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeaderLit.js +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.js +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts +0 -66
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInputLit.js +0 -87
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts +0 -7
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayoutLit.js +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts +0 -25
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.js +0 -390
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts +0 -66
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShellLit.js +0 -528
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.js +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts +0 -41
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelectLit.js +0 -63
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.js +0 -17
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts +0 -55
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextareaLit.js +0 -92
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts +0 -32
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.js +0 -85
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts +0 -90
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlightLit.js +0 -242
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts +0 -6
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.js +0 -4
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts +0 -12
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyStateLit.js +0 -21
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.js +0 -5
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts +0 -21
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeaderLit.js +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts +0 -12
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.js +0 -40
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts +0 -28
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourneyLit.js +0 -121
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts +0 -110
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/controllers/PanelShellController.js +0 -481
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts +0 -26
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.js +0 -202
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts +0 -8
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.js +0 -46
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts +0 -24
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.js +0 -86
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts +0 -36
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/index.js +0 -26
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts +0 -15
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/lit-elements.js +0 -14
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts +0 -33
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.js +0 -68
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts +0 -22
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts.map +0 -1
- package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.js +0 -143
- package/node_modules/@syntrologie/shared-editor-ui/package.json +0 -55
package/dist/schema.js
CHANGED
|
@@ -1,63 +1,317 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
1
|
+
// ../../sdk-contracts/dist/schemas.js
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var AnchorIdZ = z.object({
|
|
4
|
+
selector: z.string(),
|
|
5
|
+
route: z.union([z.string(), z.array(z.string())])
|
|
6
|
+
}).strict();
|
|
7
|
+
var AuthoringFieldsZ = {
|
|
8
|
+
title: z.string().max(200).optional().describe("Authoring-only: short label shown on the action plan dashboard. Stripped before serving to the runtime SDK."),
|
|
9
|
+
description: z.string().max(1e3).optional().describe("Authoring-only: one-sentence explanation of what this action does and why. Stripped before serving to the runtime SDK."),
|
|
10
|
+
validation: z.array(z.string().max(500)).max(10).optional().describe("Authoring-only: ordered steps a reviewer can follow to trigger this action and visually confirm it works. Each entry is one step. Stripped before serving to the runtime SDK.")
|
|
11
|
+
};
|
|
12
|
+
var COUNTABLE_EVENTS = [
|
|
13
|
+
// User interactions (from PostHog autocapture normalization)
|
|
14
|
+
"ui.click",
|
|
15
|
+
"ui.scroll",
|
|
16
|
+
"ui.input",
|
|
17
|
+
"ui.change",
|
|
18
|
+
"ui.submit",
|
|
19
|
+
// Behavioral detectors (from event-processor)
|
|
20
|
+
"ui.hover",
|
|
21
|
+
"ui.idle",
|
|
22
|
+
"ui.scroll_thrash",
|
|
23
|
+
"ui.focus_bounce",
|
|
24
|
+
// Navigation
|
|
25
|
+
"nav.page_view",
|
|
26
|
+
"nav.page_leave",
|
|
27
|
+
// Derived behavioral signals
|
|
28
|
+
"behavior.rage_click",
|
|
29
|
+
"behavior.hesitation",
|
|
30
|
+
"behavior.confusion"
|
|
31
|
+
];
|
|
32
|
+
var CountableEventZ = z.enum(COUNTABLE_EVENTS).describe("Event name to count. ui.* = user interactions and behavioral detectors, nav.* = page navigation, behavior.* = derived behavioral signals.");
|
|
33
|
+
var SESSION_METRIC_KEYS = ["time_on_page", "page_views", "scroll_depth"];
|
|
34
|
+
var SessionMetricKeyZ = z.enum(SESSION_METRIC_KEYS).describe("Session metric key. time_on_page = seconds on current page, page_views = pages visited this session, scroll_depth = 0-100 percentage.");
|
|
35
|
+
var PageUrlConditionZ = z.object({
|
|
36
|
+
type: z.literal("page_url"),
|
|
37
|
+
url: z.string().describe('URL path to match (e.g. "/pricing", "/dashboard")')
|
|
38
|
+
}).describe('Fires when the current page URL matches. Use for page-specific actions. Example: {"type": "page_url", "url": "/pricing"}');
|
|
39
|
+
var RouteConditionZ = z.object({
|
|
40
|
+
type: z.literal("route"),
|
|
41
|
+
routeId: z.string().describe("Named route ID from the route filter")
|
|
42
|
+
}).describe("Fires when the current route matches a named route ID.");
|
|
43
|
+
var AnchorVisibleConditionZ = z.object({
|
|
44
|
+
type: z.literal("anchor_visible"),
|
|
45
|
+
anchorId: z.string().describe("CSS selector of the anchor element"),
|
|
46
|
+
state: z.enum(["visible", "present", "absent"]).describe('"visible" = in viewport, "present" = in DOM, "absent" = not in DOM')
|
|
47
|
+
}).describe(`Fires based on a DOM element's visibility state. Example: {"type": "anchor_visible", "anchorId": "#cta-button", "state": "visible"}`);
|
|
48
|
+
var EventOccurredConditionZ = z.object({
|
|
49
|
+
type: z.literal("event_occurred"),
|
|
50
|
+
eventName: z.string().describe('Event name (e.g. "ui.click", "$pageview")'),
|
|
51
|
+
withinMs: z.number().optional().describe("Time window in ms. Omit = any time this session.")
|
|
52
|
+
}).describe('Fires when a specific event has occurred during this session. Example: {"type": "event_occurred", "eventName": "ui.click", "withinMs": 5000}');
|
|
53
|
+
var StateEqualsConditionZ = z.object({
|
|
54
|
+
type: z.literal("state_equals"),
|
|
55
|
+
key: z.string().describe("Key in the SDK persistent state store (localStorage). Only valid for keys the host app explicitly sets via syntro.state.set()."),
|
|
56
|
+
value: z.unknown().describe("Expected value to match against")
|
|
57
|
+
}).describe("Checks the SDK persistent state store (localStorage). ONLY for host-app state set via syntro.state.set() \u2014 NOT for user attributes like region, device, or UTM params (those are handled by segment targeting). Do NOT use this for targeting. If you do not know the valid state keys, do not use this condition type.");
|
|
58
|
+
var ViewportConditionZ = z.object({
|
|
59
|
+
type: z.literal("viewport"),
|
|
60
|
+
minWidth: z.number().optional().describe("Minimum viewport width in pixels"),
|
|
61
|
+
maxWidth: z.number().optional().describe("Maximum viewport width in pixels"),
|
|
62
|
+
minHeight: z.number().optional().describe("Minimum viewport height in pixels"),
|
|
63
|
+
maxHeight: z.number().optional().describe("Maximum viewport height in pixels")
|
|
64
|
+
}).describe('Fires based on viewport (screen) size. Use for responsive behavior. Example: {"type": "viewport", "minWidth": 768} \u2014 fires on tablet and larger.');
|
|
65
|
+
var SessionMetricConditionZ = z.object({
|
|
66
|
+
type: z.literal("session_metric"),
|
|
67
|
+
key: SessionMetricKeyZ,
|
|
68
|
+
operator: z.enum(["gte", "lte", "eq", "gt", "lt"]),
|
|
69
|
+
threshold: z.number().describe("Numeric threshold to compare against")
|
|
70
|
+
}).describe('Fires when a session metric crosses a threshold. Valid keys: "time_on_page" (seconds), "page_views" (count), "scroll_depth" (0-100). Example: {"type": "session_metric", "key": "time_on_page", "operator": "gte", "threshold": 30}');
|
|
71
|
+
var DismissedConditionZ = z.object({
|
|
72
|
+
type: z.literal("dismissed"),
|
|
73
|
+
key: z.string().describe("Dismissal key (usually a tile or action ID)"),
|
|
74
|
+
inverted: z.boolean().optional().describe("When true, fires if NOT dismissed (default behavior)")
|
|
75
|
+
}).describe("Checks if an item has been dismissed by the user. Use with inverted: true to show only if not dismissed.");
|
|
76
|
+
var CooldownActiveConditionZ = z.object({
|
|
77
|
+
type: z.literal("cooldown_active"),
|
|
78
|
+
key: z.string().describe("Cooldown key"),
|
|
79
|
+
inverted: z.boolean().optional().describe("When true, fires if cooldown is NOT active")
|
|
80
|
+
}).describe("Checks if a cooldown timer is currently active. Use to prevent showing the same intervention too frequently.");
|
|
81
|
+
var FrequencyLimitConditionZ = z.object({
|
|
82
|
+
type: z.literal("frequency_limit"),
|
|
83
|
+
key: z.string().describe("Frequency counter key"),
|
|
84
|
+
limit: z.number().describe("Maximum allowed count"),
|
|
85
|
+
inverted: z.boolean().optional().describe("When true, fires if limit NOT reached")
|
|
86
|
+
}).describe("Checks if a frequency limit has been reached. Use to cap how many times an action fires per session.");
|
|
87
|
+
var MatchOpZ = z.object({
|
|
88
|
+
equals: z.union([z.string(), z.number(), z.boolean()]).optional(),
|
|
89
|
+
contains: z.string().optional()
|
|
90
|
+
}).describe("Match operator for counter filters. Exactly one of equals or contains must be specified.");
|
|
91
|
+
var CounterDefZ = z.object({
|
|
92
|
+
events: z.array(CountableEventZ).min(1).describe("Event names to count. Use values from the countable events enum."),
|
|
93
|
+
match: z.record(z.string(), MatchOpZ).optional().describe("Property filters. Keys are event prop names or element-chain fields (tag_name, $el_text, attr__*). All entries AND together.")
|
|
94
|
+
}).describe("Defines what events to count. Registered as an accumulator predicate at config-load time.");
|
|
95
|
+
var EventCountConditionZ = z.object({
|
|
96
|
+
type: z.literal("event_count"),
|
|
97
|
+
key: z.string().describe("Unique key for this counter (used for accumulator registration)"),
|
|
98
|
+
operator: z.enum(["gte", "lte", "eq", "gt", "lt"]),
|
|
99
|
+
count: z.number().int().min(0).describe("Target count threshold"),
|
|
100
|
+
withinMs: z.number().positive().optional().describe("Time window in ms. Omit = count across entire session."),
|
|
101
|
+
counter: CounterDefZ.optional().describe("Inline counter definition. Defines what events to count.")
|
|
102
|
+
}).describe('Fires when accumulated event count crosses a threshold. Most powerful trigger type. Example: {"type": "event_count", "key": "pricing-clicks", "operator": "gte", "count": 3, "counter": {"events": ["ui.click"], "match": {"attr__data-cta": {"contains": "pricing"}}}}');
|
|
103
|
+
var ConditionZ = z.discriminatedUnion("type", [
|
|
104
|
+
PageUrlConditionZ,
|
|
105
|
+
RouteConditionZ,
|
|
106
|
+
AnchorVisibleConditionZ,
|
|
107
|
+
EventOccurredConditionZ,
|
|
108
|
+
StateEqualsConditionZ,
|
|
109
|
+
ViewportConditionZ,
|
|
110
|
+
SessionMetricConditionZ,
|
|
111
|
+
DismissedConditionZ,
|
|
112
|
+
CooldownActiveConditionZ,
|
|
113
|
+
FrequencyLimitConditionZ,
|
|
114
|
+
EventCountConditionZ
|
|
115
|
+
]);
|
|
116
|
+
var RuleZ = z.object({
|
|
117
|
+
conditions: z.array(ConditionZ).describe("Array of conditions \u2014 ALL must match (AND logic) for this rule to fire."),
|
|
118
|
+
value: z.unknown().describe("Value returned when all conditions match. For triggerWhen: true = fire the action.")
|
|
119
|
+
}).describe("A single rule. ALL conditions must match (AND logic). Rules in a strategy are evaluated top-to-bottom \u2014 first rule where all conditions match wins and returns its value.");
|
|
120
|
+
var RuleStrategyZ = z.object({
|
|
121
|
+
type: z.literal("rules"),
|
|
122
|
+
rules: z.array(RuleZ).describe("Ordered list of rules. Evaluated top-to-bottom \u2014 first match wins."),
|
|
123
|
+
default: z.unknown().describe("Fallback value when no rule matches. For triggerWhen: false = do not fire by default.")
|
|
124
|
+
}).describe("Rule-based strategy. Evaluates rules top-to-bottom. First rule where ALL conditions match returns its value. If no rule matches, returns default. For triggerWhen: set value=true on matching rules, default=false.");
|
|
125
|
+
var ScoreStrategyZ = z.object({
|
|
126
|
+
type: z.literal("score"),
|
|
127
|
+
field: z.string(),
|
|
128
|
+
threshold: z.number(),
|
|
129
|
+
above: z.unknown(),
|
|
130
|
+
below: z.unknown()
|
|
131
|
+
}).describe("Score-based strategy. Compares a field value against a threshold.");
|
|
132
|
+
var ModelStrategyZ = z.object({
|
|
133
|
+
type: z.literal("model"),
|
|
134
|
+
modelId: z.string(),
|
|
135
|
+
inputs: z.array(z.string()),
|
|
136
|
+
outputMapping: z.record(z.string(), z.unknown()),
|
|
137
|
+
default: z.unknown()
|
|
138
|
+
}).describe("ML model strategy. Sends inputs to a model and maps outputs.");
|
|
139
|
+
var ExternalStrategyZ = z.object({
|
|
140
|
+
type: z.literal("external"),
|
|
141
|
+
endpoint: z.string(),
|
|
142
|
+
method: z.enum(["GET", "POST"]).optional(),
|
|
143
|
+
default: z.unknown(),
|
|
144
|
+
timeoutMs: z.number().optional()
|
|
145
|
+
}).describe("External API strategy. Calls an endpoint to determine the value.");
|
|
146
|
+
var DecisionStrategyZ = z.discriminatedUnion("type", [
|
|
147
|
+
RuleStrategyZ,
|
|
148
|
+
ScoreStrategyZ,
|
|
149
|
+
ModelStrategyZ,
|
|
150
|
+
ExternalStrategyZ
|
|
151
|
+
]);
|
|
152
|
+
var TriggerWhenZ = DecisionStrategyZ.nullable().optional();
|
|
153
|
+
var EventScopeZ = z.object({
|
|
154
|
+
events: z.array(z.string()),
|
|
155
|
+
urlContains: z.string().optional(),
|
|
156
|
+
props: z.record(z.union([z.string(), z.number(), z.boolean()])).optional()
|
|
63
157
|
});
|
|
158
|
+
var NotifyZ = z.object({
|
|
159
|
+
title: z.string().optional(),
|
|
160
|
+
body: z.string().optional(),
|
|
161
|
+
icon: z.string().optional()
|
|
162
|
+
}).nullable().optional();
|
|
163
|
+
|
|
164
|
+
// src/schema.ts
|
|
165
|
+
import { z as z2 } from "zod";
|
|
166
|
+
var configSchema = z2.object({
|
|
167
|
+
/** Text replacements */
|
|
168
|
+
textReplacements: z2.array(
|
|
169
|
+
z2.object({
|
|
170
|
+
anchorId: AnchorIdZ.describe(
|
|
171
|
+
"Route and CSS selector identifying the element whose text content to replace."
|
|
172
|
+
),
|
|
173
|
+
summary: z2.string().describe(
|
|
174
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
175
|
+
),
|
|
176
|
+
text: z2.string().describe("New text content to set on the element (replaces existing text).")
|
|
177
|
+
}).describe("A single text replacement: replaces the text content of a matched element.")
|
|
178
|
+
).optional().describe(
|
|
179
|
+
"Replaces the visible text of DOM elements. Use for copy changes, headline personalization, or CTA label swaps."
|
|
180
|
+
),
|
|
181
|
+
/** Attribute modifications */
|
|
182
|
+
attributeChanges: z2.array(
|
|
183
|
+
z2.object({
|
|
184
|
+
anchorId: AnchorIdZ.describe(
|
|
185
|
+
"Route and CSS selector identifying the element whose attribute to set."
|
|
186
|
+
),
|
|
187
|
+
summary: z2.string().describe(
|
|
188
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
189
|
+
),
|
|
190
|
+
attr: z2.string().min(
|
|
191
|
+
1,
|
|
192
|
+
'Attribute name must not be empty \u2014 setAttribute("", ...) throws InvalidCharacterError in all browsers.'
|
|
193
|
+
).describe(
|
|
194
|
+
'HTML attribute name to set (e.g. "href", "src", "data-experiment"). Event handler attributes are blocked.'
|
|
195
|
+
),
|
|
196
|
+
value: z2.string().describe("New attribute value to apply.")
|
|
197
|
+
}).describe("A single attribute change: sets one HTML attribute on a matched element.")
|
|
198
|
+
).optional().describe(
|
|
199
|
+
"Sets HTML attributes on DOM elements. Use for href swaps, src changes, or adding data-* experiment markers. Event handlers (onclick, onerror, etc.) are blocked."
|
|
200
|
+
),
|
|
201
|
+
/** Style modifications */
|
|
202
|
+
styleChanges: z2.array(
|
|
203
|
+
z2.object({
|
|
204
|
+
anchorId: AnchorIdZ.describe(
|
|
205
|
+
"Route and CSS selector identifying the element to restyle."
|
|
206
|
+
),
|
|
207
|
+
summary: z2.string().describe(
|
|
208
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
209
|
+
),
|
|
210
|
+
styles: z2.record(z2.string()).describe(
|
|
211
|
+
'Map of CSS property \u2192 value pairs applied as inline styles (e.g. {"background-color": "#1e40af", "padding": "2rem"}).'
|
|
212
|
+
)
|
|
213
|
+
}).describe("A single style change: sets inline CSS properties on a matched element.")
|
|
214
|
+
).optional().describe(
|
|
215
|
+
"Sets inline CSS styles on DOM elements. Use for color, spacing, or visibility changes without modifying the stylesheet."
|
|
216
|
+
),
|
|
217
|
+
/** HTML insertions */
|
|
218
|
+
htmlInsertions: z2.array(
|
|
219
|
+
z2.object({
|
|
220
|
+
anchorId: AnchorIdZ.describe(
|
|
221
|
+
"Route and CSS selector identifying the reference element for the insertion."
|
|
222
|
+
),
|
|
223
|
+
summary: z2.string().describe(
|
|
224
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
225
|
+
),
|
|
226
|
+
html: z2.string().min(
|
|
227
|
+
1,
|
|
228
|
+
'HTML string must not be empty \u2014 an empty html with position "replace" silently swaps the anchor element for an empty div.'
|
|
229
|
+
).describe(
|
|
230
|
+
"HTML string to insert. The SDK sanitizes it before injection \u2014 no script tags or event handlers (onclick, onerror, etc.). NEVER embed JavaScript \u2014 use deepLink for canvas navigation instead."
|
|
231
|
+
),
|
|
232
|
+
position: z2.enum(["before", "after", "prepend", "append", "replace"]).describe(
|
|
233
|
+
'"before"/"after" inserts adjacent to the element; "prepend"/"append" inserts inside at the start/end; "replace" swaps the entire element.'
|
|
234
|
+
),
|
|
235
|
+
deepLink: z2.object({
|
|
236
|
+
tileId: z2.string().describe("ID of the canvas tile to open when the inserted element is clicked."),
|
|
237
|
+
itemId: z2.string().optional().describe(
|
|
238
|
+
"Optional specific item within the tile (e.g. a FAQ question ID) to scroll to after opening."
|
|
239
|
+
)
|
|
240
|
+
}).optional().describe(
|
|
241
|
+
"Makes the entire inserted element clickable to open the canvas panel and navigate to a specific tile. The SDK wires up click handlers, sets cursor to pointer, and publishes a notification.deep_link event. This is the ONLY correct way to connect inserted HTML to canvas tiles \u2014 NEVER use onclick handlers or window.SynOS in HTML strings."
|
|
242
|
+
)
|
|
243
|
+
}).describe(
|
|
244
|
+
"A single HTML insertion: injects a sanitized HTML fragment relative to a matched element. Use deepLink to connect inserted buttons/links to canvas tiles."
|
|
245
|
+
)
|
|
246
|
+
).optional().describe(
|
|
247
|
+
"Inserts sanitized HTML fragments relative to DOM elements. Use for adding badges, banners, or supplementary content. Do NOT embed JavaScript \u2014 use deepLink for canvas navigation."
|
|
248
|
+
),
|
|
249
|
+
/** Class additions */
|
|
250
|
+
classAdditions: z2.array(
|
|
251
|
+
z2.object({
|
|
252
|
+
anchorId: AnchorIdZ.describe(
|
|
253
|
+
"Route and CSS selector identifying the element to add the class to."
|
|
254
|
+
),
|
|
255
|
+
summary: z2.string().describe(
|
|
256
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
257
|
+
),
|
|
258
|
+
className: z2.string().min(
|
|
259
|
+
1,
|
|
260
|
+
'Class name must not be empty \u2014 classList.add("") throws DOMException in all browsers.'
|
|
261
|
+
).describe(
|
|
262
|
+
`CSS class name to add to the element's class list (e.g. "highlighted", "is-active").`
|
|
263
|
+
)
|
|
264
|
+
}).describe("A single class addition: appends one CSS class to a matched element.")
|
|
265
|
+
).optional().describe(
|
|
266
|
+
"Adds CSS classes to DOM elements. Use to toggle visibility, apply highlight styles, or trigger CSS animations already defined in the host stylesheet."
|
|
267
|
+
),
|
|
268
|
+
/** Class removals */
|
|
269
|
+
classRemovals: z2.array(
|
|
270
|
+
z2.object({
|
|
271
|
+
anchorId: AnchorIdZ.describe(
|
|
272
|
+
"Route and CSS selector identifying the element to remove the class from."
|
|
273
|
+
),
|
|
274
|
+
summary: z2.string().describe(
|
|
275
|
+
"Human-readable description of this change, used for logging and debugging."
|
|
276
|
+
),
|
|
277
|
+
className: z2.string().min(
|
|
278
|
+
1,
|
|
279
|
+
'Class name must not be empty \u2014 classList.remove("") throws DOMException in all browsers.'
|
|
280
|
+
).describe(
|
|
281
|
+
`CSS class name to remove from the element's class list (e.g. "hidden", "disabled").`
|
|
282
|
+
)
|
|
283
|
+
}).describe("A single class removal: removes one CSS class from a matched element.")
|
|
284
|
+
).optional().describe(
|
|
285
|
+
"Removes CSS classes from DOM elements. Use to reveal hidden elements, remove disabled states, or undo class-based styling."
|
|
286
|
+
)
|
|
287
|
+
}).describe(
|
|
288
|
+
"Props for adaptive-content DOM mutation operations. Each field targets a list of elements by anchorId and applies a specific type of change (text, attribute, style, HTML, or class)."
|
|
289
|
+
);
|
|
290
|
+
var CAPABILITIES_DOCUMENTATION = {
|
|
291
|
+
packageId: "adaptive-content",
|
|
292
|
+
description: "DOM content modification capabilities for text, attributes, styles, HTML, and classes.",
|
|
293
|
+
whenToUse: [
|
|
294
|
+
{ goal: "Replace an element's text", action: "content:setText" },
|
|
295
|
+
{ goal: "Change an HTML attribute (href, src, data-*)", action: "content:setAttr" },
|
|
296
|
+
{ goal: "Modify inline styles (color, size, spacing)", action: "content:setStyle" },
|
|
297
|
+
{ goal: "Inject new HTML before/after/inside an element", action: "content:insertHtml" },
|
|
298
|
+
{ goal: "Add a CSS class (show/hide, animate)", action: "content:addClass" },
|
|
299
|
+
{ goal: "Remove a CSS class", action: "content:removeClass" }
|
|
300
|
+
],
|
|
301
|
+
conventions: [
|
|
302
|
+
{
|
|
303
|
+
name: "Deep-linking inserted content to canvas tiles",
|
|
304
|
+
description: "Use the deepLink property on content:insertHtml to make inserted elements open the canvas panel and navigate to a specific tile when clicked. NEVER use onclick handlers or window.SynOS in HTML strings \u2014 they are sanitized and stripped. deepLink is the only supported mechanism."
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: "Blocked attributes",
|
|
308
|
+
description: "Event handler attributes (onclick, onerror, onload, etc.) are blocked by content:setAttr. Use data-* attributes for experiment markers instead."
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
events: []
|
|
312
|
+
};
|
|
313
|
+
export {
|
|
314
|
+
CAPABILITIES_DOCUMENTATION,
|
|
315
|
+
configSchema
|
|
316
|
+
};
|
|
317
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../sdk-contracts/dist/schemas.js", "../src/schema.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Shared Zod schemas for decision strategies, conditions, and event scoping.\n *\n * These are the canonical definitions \u2014 runtime-sdk and all adaptive packages\n * should import from here instead of duplicating.\n */\nimport { z } from 'zod';\n// =============================================================================\n// ANCHOR ID SCHEMA\n// =============================================================================\nexport const AnchorIdZ = z\n .object({\n selector: z.string(),\n route: z.union([z.string(), z.array(z.string())]),\n})\n .strict();\n// =============================================================================\n// AUTHORING FIELDS \u2014 title / description / validation\n//\n// These live on every action *during authoring* (LLM produces them; dashboard\n// displays them; reviewers QA-verify with them) but are stripped before the\n// runtime SDK receives the config. Stripping happens server-side in\n// `to_runtime_config` (platform/backend/app/domains/experiments/helpers.py).\n// They appear in the JSON Schema (and therefore in the tactician's prompt)\n// because the LLM needs to know they are valid action properties \u2014 otherwise\n// schema validation would reject what the prompt commands.\n//\n// Each action variant should `.extend(AuthoringFieldsZ)` alongside any\n// triggerWhen/condition extensions. Validation is an ordered list of\n// human-readable step strings \u2014 reviewers scan it as a checklist.\n// =============================================================================\nexport const AuthoringFieldsZ = {\n title: z\n .string()\n .max(200)\n .optional()\n .describe('Authoring-only: short label shown on the action plan dashboard. Stripped before serving to the runtime SDK.'),\n description: z\n .string()\n .max(1000)\n .optional()\n .describe('Authoring-only: one-sentence explanation of what this action does and why. Stripped before serving to the runtime SDK.'),\n validation: z\n .array(z.string().max(500))\n .max(10)\n .optional()\n .describe('Authoring-only: ordered steps a reviewer can follow to trigger this action and visually confirm it works. Each entry is one step. Stripped before serving to the runtime SDK.'),\n};\n// =============================================================================\n// TRIGGER VOCABULARY \u2014 canonical lists of valid event names, metric keys, etc.\n// These flow through to the JSON schema as enums and are used by the LLM prompt.\n// =============================================================================\n/** Events that can be counted in event_count conditions. */\nexport const COUNTABLE_EVENTS = [\n // User interactions (from PostHog autocapture normalization)\n 'ui.click',\n 'ui.scroll',\n 'ui.input',\n 'ui.change',\n 'ui.submit',\n // Behavioral detectors (from event-processor)\n 'ui.hover',\n 'ui.idle',\n 'ui.scroll_thrash',\n 'ui.focus_bounce',\n // Navigation\n 'nav.page_view',\n 'nav.page_leave',\n // Derived behavioral signals\n 'behavior.rage_click',\n 'behavior.hesitation',\n 'behavior.confusion',\n];\nexport const CountableEventZ = z\n .enum(COUNTABLE_EVENTS)\n .describe('Event name to count. ui.* = user interactions and behavioral detectors, nav.* = page navigation, behavior.* = derived behavioral signals.');\n/** Valid session metric keys. */\nexport const SESSION_METRIC_KEYS = ['time_on_page', 'page_views', 'scroll_depth'];\nexport const SessionMetricKeyZ = z\n .enum(SESSION_METRIC_KEYS)\n .describe('Session metric key. time_on_page = seconds on current page, page_views = pages visited this session, scroll_depth = 0-100 percentage.');\n/** Element chain match field prefixes for counter filters. */\nexport const ELEMENT_MATCH_FIELDS = ['tag_name', '$el_text'];\n// Note: attr__* is a dynamic prefix (attr__data-id, attr__class, attr__href, etc.)\n// and cannot be enumerated. The match key is either one of ELEMENT_MATCH_FIELDS\n// or starts with \"attr__\".\n// =============================================================================\n// CONDITION SCHEMAS\n// =============================================================================\nexport const PageUrlConditionZ = z\n .object({\n type: z.literal('page_url'),\n url: z.string().describe('URL path to match (e.g. \"/pricing\", \"/dashboard\")'),\n})\n .describe('Fires when the current page URL matches. Use for page-specific actions. ' +\n 'Example: {\"type\": \"page_url\", \"url\": \"/pricing\"}');\nexport const RouteConditionZ = z\n .object({\n type: z.literal('route'),\n routeId: z.string().describe('Named route ID from the route filter'),\n})\n .describe('Fires when the current route matches a named route ID.');\nexport const AnchorVisibleConditionZ = z\n .object({\n type: z.literal('anchor_visible'),\n anchorId: z.string().describe('CSS selector of the anchor element'),\n state: z\n .enum(['visible', 'present', 'absent'])\n .describe('\"visible\" = in viewport, \"present\" = in DOM, \"absent\" = not in DOM'),\n})\n .describe(\"Fires based on a DOM element's visibility state. \" +\n 'Example: {\"type\": \"anchor_visible\", \"anchorId\": \"#cta-button\", \"state\": \"visible\"}');\nexport const EventOccurredConditionZ = z\n .object({\n type: z.literal('event_occurred'),\n eventName: z.string().describe('Event name (e.g. \"ui.click\", \"$pageview\")'),\n withinMs: z.number().optional().describe('Time window in ms. Omit = any time this session.'),\n})\n .describe('Fires when a specific event has occurred during this session. ' +\n 'Example: {\"type\": \"event_occurred\", \"eventName\": \"ui.click\", \"withinMs\": 5000}');\nexport const StateEqualsConditionZ = z\n .object({\n type: z.literal('state_equals'),\n key: z\n .string()\n .describe('Key in the SDK persistent state store (localStorage). Only valid for keys the host app explicitly sets via syntro.state.set().'),\n value: z.unknown().describe('Expected value to match against'),\n})\n .describe('Checks the SDK persistent state store (localStorage). ONLY for host-app state set via syntro.state.set() \u2014 ' +\n 'NOT for user attributes like region, device, or UTM params (those are handled by segment targeting). ' +\n 'Do NOT use this for targeting. If you do not know the valid state keys, do not use this condition type.');\nexport const ViewportConditionZ = z\n .object({\n type: z.literal('viewport'),\n minWidth: z.number().optional().describe('Minimum viewport width in pixels'),\n maxWidth: z.number().optional().describe('Maximum viewport width in pixels'),\n minHeight: z.number().optional().describe('Minimum viewport height in pixels'),\n maxHeight: z.number().optional().describe('Maximum viewport height in pixels'),\n})\n .describe('Fires based on viewport (screen) size. Use for responsive behavior. ' +\n 'Example: {\"type\": \"viewport\", \"minWidth\": 768} \u2014 fires on tablet and larger.');\nexport const SessionMetricConditionZ = z\n .object({\n type: z.literal('session_metric'),\n key: SessionMetricKeyZ,\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n threshold: z.number().describe('Numeric threshold to compare against'),\n})\n .describe('Fires when a session metric crosses a threshold. Valid keys: \"time_on_page\" (seconds), ' +\n '\"page_views\" (count), \"scroll_depth\" (0-100). ' +\n 'Example: {\"type\": \"session_metric\", \"key\": \"time_on_page\", \"operator\": \"gte\", \"threshold\": 30}');\nexport const DismissedConditionZ = z\n .object({\n type: z.literal('dismissed'),\n key: z.string().describe('Dismissal key (usually a tile or action ID)'),\n inverted: z\n .boolean()\n .optional()\n .describe('When true, fires if NOT dismissed (default behavior)'),\n})\n .describe('Checks if an item has been dismissed by the user. Use with inverted: true to show only if not dismissed.');\nexport const CooldownActiveConditionZ = z\n .object({\n type: z.literal('cooldown_active'),\n key: z.string().describe('Cooldown key'),\n inverted: z.boolean().optional().describe('When true, fires if cooldown is NOT active'),\n})\n .describe('Checks if a cooldown timer is currently active. Use to prevent showing the same intervention too frequently.');\nexport const FrequencyLimitConditionZ = z\n .object({\n type: z.literal('frequency_limit'),\n key: z.string().describe('Frequency counter key'),\n limit: z.number().describe('Maximum allowed count'),\n inverted: z.boolean().optional().describe('When true, fires if limit NOT reached'),\n})\n .describe('Checks if a frequency limit has been reached. Use to cap how many times an action fires per session.');\nexport const MatchOpZ = z\n .object({\n equals: z.union([z.string(), z.number(), z.boolean()]).optional(),\n contains: z.string().optional(),\n})\n .describe('Match operator for counter filters. Exactly one of equals or contains must be specified.');\nexport const CounterDefZ = z\n .object({\n events: z\n .array(CountableEventZ)\n .min(1)\n .describe('Event names to count. Use values from the countable events enum.'),\n match: z\n .record(z.string(), MatchOpZ)\n .optional()\n .describe('Property filters. Keys are event prop names or element-chain fields ' +\n '(tag_name, $el_text, attr__*). All entries AND together.'),\n})\n .describe('Defines what events to count. Registered as an accumulator predicate at config-load time.');\nexport const EventCountConditionZ = z\n .object({\n type: z.literal('event_count'),\n key: z.string().describe('Unique key for this counter (used for accumulator registration)'),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n count: z.number().int().min(0).describe('Target count threshold'),\n withinMs: z\n .number()\n .positive()\n .optional()\n .describe('Time window in ms. Omit = count across entire session.'),\n counter: CounterDefZ.optional().describe('Inline counter definition. Defines what events to count.'),\n})\n .describe('Fires when accumulated event count crosses a threshold. Most powerful trigger type. ' +\n 'Example: {\"type\": \"event_count\", \"key\": \"pricing-clicks\", \"operator\": \"gte\", \"count\": 3, ' +\n '\"counter\": {\"events\": [\"ui.click\"], \"match\": {\"attr__data-cta\": {\"contains\": \"pricing\"}}}}');\nexport const ConditionZ = z.discriminatedUnion('type', [\n PageUrlConditionZ,\n RouteConditionZ,\n AnchorVisibleConditionZ,\n EventOccurredConditionZ,\n StateEqualsConditionZ,\n ViewportConditionZ,\n SessionMetricConditionZ,\n DismissedConditionZ,\n CooldownActiveConditionZ,\n FrequencyLimitConditionZ,\n EventCountConditionZ,\n]);\n// =============================================================================\n// STRATEGY SCHEMAS\n// =============================================================================\nexport const RuleZ = z\n .object({\n conditions: z\n .array(ConditionZ)\n .describe('Array of conditions \u2014 ALL must match (AND logic) for this rule to fire.'),\n value: z\n .unknown()\n .describe('Value returned when all conditions match. For triggerWhen: true = fire the action.'),\n})\n .describe('A single rule. ALL conditions must match (AND logic). Rules in a strategy are evaluated ' +\n 'top-to-bottom \u2014 first rule where all conditions match wins and returns its value.');\nexport const RuleStrategyZ = z\n .object({\n type: z.literal('rules'),\n rules: z\n .array(RuleZ)\n .describe('Ordered list of rules. Evaluated top-to-bottom \u2014 first match wins.'),\n default: z\n .unknown()\n .describe('Fallback value when no rule matches. For triggerWhen: false = do not fire by default.'),\n})\n .describe('Rule-based strategy. Evaluates rules top-to-bottom. First rule where ALL conditions match ' +\n 'returns its value. If no rule matches, returns default. ' +\n 'For triggerWhen: set value=true on matching rules, default=false.');\nexport const ScoreStrategyZ = z\n .object({\n type: z.literal('score'),\n field: z.string(),\n threshold: z.number(),\n above: z.unknown(),\n below: z.unknown(),\n})\n .describe('Score-based strategy. Compares a field value against a threshold.');\nexport const ModelStrategyZ = z\n .object({\n type: z.literal('model'),\n modelId: z.string(),\n inputs: z.array(z.string()),\n outputMapping: z.record(z.string(), z.unknown()),\n default: z.unknown(),\n})\n .describe('ML model strategy. Sends inputs to a model and maps outputs.');\nexport const ExternalStrategyZ = z\n .object({\n type: z.literal('external'),\n endpoint: z.string(),\n method: z.enum(['GET', 'POST']).optional(),\n default: z.unknown(),\n timeoutMs: z.number().optional(),\n})\n .describe('External API strategy. Calls an endpoint to determine the value.');\nexport const DecisionStrategyZ = z.discriminatedUnion('type', [\n RuleStrategyZ,\n ScoreStrategyZ,\n ModelStrategyZ,\n ExternalStrategyZ,\n]);\n/** Canonical Zod schema for the optional triggerWhen field on actions and adaptive items. */\nexport const TriggerWhenZ = DecisionStrategyZ.nullable().optional();\n// =============================================================================\n// TRIGGER DOCUMENTATION \u2014 examples and match field docs\n// Exported as constants so the schema generator can inject them into the\n// JSON schema. The Python prompt builder reads them from the schema.\n// =============================================================================\n/** Complete triggerWhen examples showing the full rules wrapper structure. */\nexport const TRIGGER_EXAMPLES = [\n {\n name: 'Click count on a specific element',\n description: 'Fire when user clicks an element with data-id=\"hero-cta\" 2+ times',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'event_count',\n key: 'cta-clicks',\n operator: 'gte',\n count: 2,\n counter: {\n events: ['ui.click'],\n match: { 'attr__data-id': { equals: 'hero-cta' } },\n },\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'Time on page threshold',\n description: 'Fire after user spends 30+ seconds on the page',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'session_metric',\n key: 'time_on_page',\n operator: 'gte',\n threshold: 30,\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'Element visible in viewport',\n description: 'Fire when a DOM element becomes visible',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'anchor_visible',\n anchorId: '#pricing-section',\n state: 'visible',\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'No trigger (fire immediately)',\n description: 'Action fires as soon as the segment matches \u2014 no in-session condition needed',\n triggerWhen: null,\n },\n];\n/** Documentation for counter.match field keys. */\nexport const MATCH_FIELD_DOCS = {\n tag_name: 'HTML tag name (e.g. \"button\", \"a\", \"input\")',\n $el_text: 'Visible text content of the element',\n 'attr__*': 'HTML attribute prefixed with attr__. Example: attr__data-id matches the data-id attribute, ' +\n 'attr__class matches the class attribute, attr__href matches the href attribute.',\n};\n// =============================================================================\n// EVENT SCOPE SCHEMA\n// =============================================================================\n/** Scopes a widget to specific events/URLs. */\nexport const EventScopeZ = z.object({\n events: z.array(z.string()),\n urlContains: z.string().optional(),\n props: z.record(z.union([z.string(), z.number(), z.boolean()])).optional(),\n});\n// =============================================================================\n// NOTIFY SCHEMA\n// =============================================================================\n/** Toast notification config for triggerWhen transitions. */\nexport const NotifyZ = z\n .object({\n title: z.string().optional(),\n body: z.string().optional(),\n icon: z.string().optional(),\n})\n .nullable()\n .optional();\n", "/**\n * Adaptive Content - Config Schema\n *\n * Zod schema for validating content app configuration.\n */\n\nimport { AnchorIdZ } from '@syntrologie/sdk-contracts';\nimport { z } from 'zod';\n\n/**\n * Content app config schema.\n * Defines the structure for content modifications in a canvas config.\n */\nexport const configSchema = z\n .object({\n /** Text replacements */\n textReplacements: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the element whose text content to replace.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n text: z\n .string()\n .describe('New text content to set on the element (replaces existing text).'),\n })\n .describe('A single text replacement: replaces the text content of a matched element.')\n )\n .optional()\n .describe(\n 'Replaces the visible text of DOM elements. Use for copy changes, headline personalization, or CTA label swaps.'\n ),\n\n /** Attribute modifications */\n attributeChanges: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the element whose attribute to set.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n attr: z\n .string()\n .min(\n 1,\n 'Attribute name must not be empty \u2014 setAttribute(\"\", ...) throws InvalidCharacterError in all browsers.'\n )\n .describe(\n 'HTML attribute name to set (e.g. \"href\", \"src\", \"data-experiment\"). Event handler attributes are blocked.'\n ),\n value: z.string().describe('New attribute value to apply.'),\n })\n .describe('A single attribute change: sets one HTML attribute on a matched element.')\n )\n .optional()\n .describe(\n 'Sets HTML attributes on DOM elements. Use for href swaps, src changes, or adding data-* experiment markers. Event handlers (onclick, onerror, etc.) are blocked.'\n ),\n\n /** Style modifications */\n styleChanges: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the element to restyle.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n styles: z\n .record(z.string())\n .describe(\n 'Map of CSS property \u2192 value pairs applied as inline styles (e.g. {\"background-color\": \"#1e40af\", \"padding\": \"2rem\"}).'\n ),\n })\n .describe('A single style change: sets inline CSS properties on a matched element.')\n )\n .optional()\n .describe(\n 'Sets inline CSS styles on DOM elements. Use for color, spacing, or visibility changes without modifying the stylesheet.'\n ),\n\n /** HTML insertions */\n htmlInsertions: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the reference element for the insertion.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n html: z\n .string()\n .min(\n 1,\n 'HTML string must not be empty \u2014 an empty html with position \"replace\" silently swaps the anchor element for an empty div.'\n )\n .describe(\n 'HTML string to insert. The SDK sanitizes it before injection \u2014 no script tags or event handlers (onclick, onerror, etc.). NEVER embed JavaScript \u2014 use deepLink for canvas navigation instead.'\n ),\n position: z\n .enum(['before', 'after', 'prepend', 'append', 'replace'])\n .describe(\n '\"before\"/\"after\" inserts adjacent to the element; \"prepend\"/\"append\" inserts inside at the start/end; \"replace\" swaps the entire element.'\n ),\n deepLink: z\n .object({\n tileId: z\n .string()\n .describe('ID of the canvas tile to open when the inserted element is clicked.'),\n itemId: z\n .string()\n .optional()\n .describe(\n 'Optional specific item within the tile (e.g. a FAQ question ID) to scroll to after opening.'\n ),\n })\n .optional()\n .describe(\n 'Makes the entire inserted element clickable to open the canvas panel and navigate to a specific tile. The SDK wires up click handlers, sets cursor to pointer, and publishes a notification.deep_link event. This is the ONLY correct way to connect inserted HTML to canvas tiles \u2014 NEVER use onclick handlers or window.SynOS in HTML strings.'\n ),\n })\n .describe(\n 'A single HTML insertion: injects a sanitized HTML fragment relative to a matched element. Use deepLink to connect inserted buttons/links to canvas tiles.'\n )\n )\n .optional()\n .describe(\n 'Inserts sanitized HTML fragments relative to DOM elements. Use for adding badges, banners, or supplementary content. Do NOT embed JavaScript \u2014 use deepLink for canvas navigation.'\n ),\n\n /** Class additions */\n classAdditions: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the element to add the class to.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n className: z\n .string()\n .min(\n 1,\n 'Class name must not be empty \u2014 classList.add(\"\") throws DOMException in all browsers.'\n )\n .describe(\n 'CSS class name to add to the element\\'s class list (e.g. \"highlighted\", \"is-active\").'\n ),\n })\n .describe('A single class addition: appends one CSS class to a matched element.')\n )\n .optional()\n .describe(\n 'Adds CSS classes to DOM elements. Use to toggle visibility, apply highlight styles, or trigger CSS animations already defined in the host stylesheet.'\n ),\n\n /** Class removals */\n classRemovals: z\n .array(\n z\n .object({\n anchorId: AnchorIdZ.describe(\n 'Route and CSS selector identifying the element to remove the class from.'\n ),\n summary: z\n .string()\n .describe(\n 'Human-readable description of this change, used for logging and debugging.'\n ),\n className: z\n .string()\n .min(\n 1,\n 'Class name must not be empty \u2014 classList.remove(\"\") throws DOMException in all browsers.'\n )\n .describe(\n 'CSS class name to remove from the element\\'s class list (e.g. \"hidden\", \"disabled\").'\n ),\n })\n .describe('A single class removal: removes one CSS class from a matched element.')\n )\n .optional()\n .describe(\n 'Removes CSS classes from DOM elements. Use to reveal hidden elements, remove disabled states, or undo class-based styling.'\n ),\n })\n .describe(\n 'Props for adaptive-content DOM mutation operations. Each field targets a list of elements by anchorId and applies a specific type of change (text, attribute, style, HTML, or class).'\n );\n\nexport type ContentConfig = z.infer<typeof configSchema>;\n\n// ============================================================================\n// Capabilities Documentation (injected into JSON Schema for LLM prompts)\n// ============================================================================\n\nexport const CAPABILITIES_DOCUMENTATION = {\n packageId: 'adaptive-content',\n description:\n 'DOM content modification capabilities for text, attributes, styles, HTML, and classes.',\n whenToUse: [\n { goal: \"Replace an element's text\", action: 'content:setText' },\n { goal: 'Change an HTML attribute (href, src, data-*)', action: 'content:setAttr' },\n { goal: 'Modify inline styles (color, size, spacing)', action: 'content:setStyle' },\n { goal: 'Inject new HTML before/after/inside an element', action: 'content:insertHtml' },\n { goal: 'Add a CSS class (show/hide, animate)', action: 'content:addClass' },\n { goal: 'Remove a CSS class', action: 'content:removeClass' },\n ],\n conventions: [\n {\n name: 'Deep-linking inserted content to canvas tiles',\n description:\n 'Use the deepLink property on content:insertHtml to make inserted elements open the canvas panel and navigate to a specific tile when clicked. NEVER use onclick handlers or window.SynOS in HTML strings \u2014 they are sanitized and stripped. deepLink is the only supported mechanism.',\n },\n {\n name: 'Blocked attributes',\n description:\n 'Event handler attributes (onclick, onerror, onload, etc.) are blocked by content:setAttr. Use data-* attributes for experiment markers instead.',\n },\n ],\n events: [],\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["z"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syntrologie/adapt-content",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.17.0",
|
|
4
4
|
"description": "Adaptive Content app - DOM manipulation actions for text, attributes, and styles",
|
|
5
5
|
"license": "Proprietary",
|
|
6
6
|
"private": false,
|
|
@@ -22,47 +22,29 @@
|
|
|
22
22
|
"./schema": {
|
|
23
23
|
"types": "./dist/schema.d.ts",
|
|
24
24
|
"import": "./dist/schema.js"
|
|
25
|
-
},
|
|
26
|
-
"./editor": {
|
|
27
|
-
"types": "./dist/editor.d.ts",
|
|
28
|
-
"import": "./dist/editor.js"
|
|
29
25
|
}
|
|
30
26
|
},
|
|
31
27
|
"files": [
|
|
32
28
|
"dist"
|
|
33
29
|
],
|
|
34
|
-
"bundledDependencies": [
|
|
35
|
-
"@syntrologie/shared-editor-ui"
|
|
36
|
-
],
|
|
37
30
|
"scripts": {
|
|
38
31
|
"prepack": "node ../../../scripts/prepare-bundled-deps.mjs",
|
|
39
|
-
"build": "tsc",
|
|
32
|
+
"build": "tsc --emitDeclarationOnly && node ../scripts/build-lib.mjs",
|
|
40
33
|
"typecheck": "tsc --noEmit",
|
|
41
34
|
"clean": "rm -rf dist",
|
|
42
35
|
"test": "vitest run",
|
|
43
36
|
"test:watch": "vitest"
|
|
44
37
|
},
|
|
45
38
|
"peerDependencies": {
|
|
46
|
-
"lucide-react": ">=0.400.0",
|
|
47
|
-
"react": ">=18.0.0",
|
|
48
|
-
"react-dom": ">=18.0.0",
|
|
49
39
|
"zod": "^3.0.0"
|
|
50
40
|
},
|
|
51
41
|
"dependencies": {
|
|
52
|
-
"@syntrologie/shared-editor-ui": "*",
|
|
53
42
|
"css-selector-generator": "3.8.0",
|
|
54
43
|
"data-urls": "5.0.0"
|
|
55
44
|
},
|
|
56
45
|
"devDependencies": {
|
|
57
|
-
"@floating-ui/dom": "1.7.5",
|
|
58
46
|
"@syntrologie/sdk-contracts": "*",
|
|
59
|
-
"@testing-library/react": "16.3.2",
|
|
60
|
-
"@types/react": "19.2.14",
|
|
61
|
-
"@types/react-dom": "19.2.3",
|
|
62
47
|
"jsdom": "26.1.0",
|
|
63
|
-
"lucide-react": "0.576.0",
|
|
64
|
-
"react": "19.2.1",
|
|
65
|
-
"react-dom": "19.2.1",
|
|
66
48
|
"typescript": "5.9.3",
|
|
67
49
|
"vitest": "4.0.18",
|
|
68
50
|
"zod": "3.25.76"
|
package/dist/cdn.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Entry Point for Adaptive Content
|
|
3
|
-
*
|
|
4
|
-
* This module is bundled for CDN delivery and self-registers with the global
|
|
5
|
-
* SynOS app registry when loaded dynamically via the AppLoader.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* App manifest for registry registration.
|
|
9
|
-
* Follows the AppManifest interface expected by AppLoader/AppRegistry.
|
|
10
|
-
*/
|
|
11
|
-
export declare const manifest: {
|
|
12
|
-
id: string;
|
|
13
|
-
version: string;
|
|
14
|
-
name: string;
|
|
15
|
-
description: string;
|
|
16
|
-
runtime: {
|
|
17
|
-
actions: {
|
|
18
|
-
kind: "content:insertHtml" | "content:setText" | "content:setAttr" | "content:addClass" | "content:removeClass" | "content:setStyle";
|
|
19
|
-
executor: import("packages/sdk-contracts/dist").ActionExecutor<import("./types").InsertHtmlAction> | import("packages/sdk-contracts/dist").ActionExecutor<import("./types").SetTextAction> | import("packages/sdk-contracts/dist").ActionExecutor<import("./types").SetAttrAction> | import("packages/sdk-contracts/dist").ActionExecutor<import("./types").AddClassAction> | import("packages/sdk-contracts/dist").ActionExecutor<import("./types").RemoveClassAction> | import("packages/sdk-contracts/dist").ActionExecutor<import("./types").SetStyleAction>;
|
|
20
|
-
}[];
|
|
21
|
-
};
|
|
22
|
-
editor: {
|
|
23
|
-
panel: {
|
|
24
|
-
title: string;
|
|
25
|
-
icon: string;
|
|
26
|
-
description: string;
|
|
27
|
-
};
|
|
28
|
-
component: typeof import("./content-editor-ui").ContentEditor;
|
|
29
|
-
};
|
|
30
|
-
metadata: {
|
|
31
|
-
isBuiltIn: boolean;
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
export default manifest;
|
|
35
|
-
//# sourceMappingURL=cdn.d.ts.map
|
package/dist/cdn.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;CAepB,CAAC;AAaF,eAAe,QAAQ,CAAC"}
|
package/dist/cdn.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Entry Point for Adaptive Content
|
|
3
|
-
*
|
|
4
|
-
* This module is bundled for CDN delivery and self-registers with the global
|
|
5
|
-
* SynOS app registry when loaded dynamically via the AppLoader.
|
|
6
|
-
*/
|
|
7
|
-
import { editor } from './editor';
|
|
8
|
-
import { executors, runtime } from './runtime';
|
|
9
|
-
/**
|
|
10
|
-
* App manifest for registry registration.
|
|
11
|
-
* Follows the AppManifest interface expected by AppLoader/AppRegistry.
|
|
12
|
-
*/
|
|
13
|
-
export const manifest = {
|
|
14
|
-
id: runtime.id,
|
|
15
|
-
version: runtime.version,
|
|
16
|
-
name: runtime.name,
|
|
17
|
-
description: runtime.description,
|
|
18
|
-
runtime: {
|
|
19
|
-
actions: executors.map(({ kind, executor }) => ({
|
|
20
|
-
kind,
|
|
21
|
-
executor,
|
|
22
|
-
})),
|
|
23
|
-
},
|
|
24
|
-
editor,
|
|
25
|
-
metadata: {
|
|
26
|
-
isBuiltIn: true,
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Self-register with global registry if available.
|
|
31
|
-
* This happens when loaded via script tag (UMD).
|
|
32
|
-
*/
|
|
33
|
-
if (typeof window !== 'undefined') {
|
|
34
|
-
const registry = window.SynOS?.appRegistry;
|
|
35
|
-
if (registry && typeof registry.register === 'function') {
|
|
36
|
-
registry.register(manifest);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export default manifest;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Re-export AnchorPicker from shared-editor-ui.
|
|
3
|
-
* This file exists for backwards compatibility — all consumers should
|
|
4
|
-
* migrate to importing directly from @syntrologie/shared-editor-ui.
|
|
5
|
-
*/
|
|
6
|
-
export type { AnchorPickerProps, PickedElement } from '@syntrologie/shared-editor-ui';
|
|
7
|
-
export { AnchorPicker } from '@syntrologie/shared-editor-ui';
|
|
8
|
-
//# sourceMappingURL=AnchorPicker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AnchorPicker.d.ts","sourceRoot":"","sources":["../../src/components/AnchorPicker.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC"}
|