@visual-platform/contracts 0.2.0 → 0.4.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/app-sources.d.ts +206 -0
- package/dist/app-sources.d.ts.map +1 -0
- package/dist/app-sources.js +287 -0
- package/dist/app-sources.js.map +1 -0
- package/dist/component.d.ts +97 -1
- package/dist/component.d.ts.map +1 -1
- package/dist/component.js +27 -3
- package/dist/component.js.map +1 -1
- package/dist/data.d.ts +55 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +17 -2
- package/dist/data.js.map +1 -1
- package/dist/design.d.ts +201 -2
- package/dist/design.d.ts.map +1 -1
- package/dist/design.js +131 -6
- package/dist/design.js.map +1 -1
- package/dist/events.d.ts +40 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +17 -0
- package/dist/events.js.map +1 -1
- package/dist/flow-sim.d.ts +36 -0
- package/dist/flow-sim.d.ts.map +1 -0
- package/dist/flow-sim.js +128 -0
- package/dist/flow-sim.js.map +1 -0
- package/dist/flows.d.ts +267 -0
- package/dist/flows.d.ts.map +1 -0
- package/dist/flows.js +387 -0
- package/dist/flows.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/motion.d.ts +161 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +228 -0
- package/dist/motion.js.map +1 -0
- package/dist/page-document.d.ts +130 -0
- package/dist/page-document.d.ts.map +1 -1
- package/dist/page-document.js +14 -1
- package/dist/page-document.js.map +1 -1
- package/dist/published.d.ts +411 -0
- package/dist/published.d.ts.map +1 -1
- package/dist/published.js +5 -0
- package/dist/published.js.map +1 -1
- package/dist/sources.d.ts +170 -0
- package/dist/sources.d.ts.map +1 -0
- package/dist/sources.js +236 -0
- package/dist/sources.js.map +1 -0
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +2 -1
- package/dist/tables.js.map +1 -1
- package/package.json +1 -1
package/dist/events.js
CHANGED
|
@@ -8,6 +8,17 @@ export const EVENT_KINDS = ["click", "change", "blur", "enter", "submit", "reset
|
|
|
8
8
|
/** onSubscribe, onBuyNow… — a valid JS identifier starting with "on" + capital letter. */
|
|
9
9
|
export const EventNameSchema = z.string().regex(/^on[A-Z][A-Za-z0-9]{0,47}$/, "event names look like onSubscribe");
|
|
10
10
|
export const EventBindingsSchema = z.partialRecord(z.enum(EVENT_KINDS), EventNameSchema);
|
|
11
|
+
/**
|
|
12
|
+
* One step after a Server-Action event (ADR-048 actions), chosen in Studio: show a toast, go to a
|
|
13
|
+
* page, or refresh the page's data. Closed set — never code.
|
|
14
|
+
*/
|
|
15
|
+
const SAFE_HREF = /^(\/(?!\/)|https?:\/\/)[^\s"'<>]*$/;
|
|
16
|
+
export const EventStepSchema = z.discriminatedUnion("kind", [
|
|
17
|
+
z.object({ kind: z.literal("toast"), text: z.string().trim().min(1).max(200) }).strict(),
|
|
18
|
+
z.object({ kind: z.literal("navigate"), href: z.string().max(500).regex(SAFE_HREF, "links start with / or http(s)://") }).strict(),
|
|
19
|
+
z.object({ kind: z.literal("refresh") }).strict(),
|
|
20
|
+
]);
|
|
21
|
+
export const EventStepsSchema = z.partialRecord(z.enum(EVENT_KINDS), z.object({ success: EventStepSchema.optional(), error: EventStepSchema.optional() }).strict());
|
|
11
22
|
/** Every event binding used in these documents (for Studio lists and `vp types pull`). */
|
|
12
23
|
export function collectEvents(documents) {
|
|
13
24
|
const out = [];
|
|
@@ -16,6 +27,12 @@ export function collectEvents(documents) {
|
|
|
16
27
|
for (const [kind, name] of Object.entries(n.events ?? {}))
|
|
17
28
|
if (name)
|
|
18
29
|
out.push({ name, kind: kind, nodeId: n.id, type: n.type });
|
|
30
|
+
// Block lifecycle (ADR-051): handlers the app may implement (onMount-style names).
|
|
31
|
+
const l = n.lifecycle;
|
|
32
|
+
if (l)
|
|
33
|
+
for (const [kind, name] of [["mount", l.mount], ["unmount", l.unmount], ["visible", l.visible], ["leave", l.leave], ["every", l.every?.run]])
|
|
34
|
+
if (name)
|
|
35
|
+
out.push({ name, kind, nodeId: n.id, type: n.type });
|
|
19
36
|
}
|
|
20
37
|
return out;
|
|
21
38
|
}
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,oBAAoB,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGtG,0FAA0F;AAC1F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,4BAA4B,EAAE,mCAAmC,CAAC,CAAC;AACnH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Flow, type FlowStepKind } from "./flows.js";
|
|
2
|
+
/**
|
|
3
|
+
* Dry-run of a flow (ADR-051): the same decisions as the browser runtime, without side effects —
|
|
4
|
+
* actions return the mocked result (default { ok: true }), modals/links/messages are only recorded,
|
|
5
|
+
* waits are skipped. Used by "Test run" in Studio and the editor, and by AI tools.
|
|
6
|
+
*/
|
|
7
|
+
export type SimInput = {
|
|
8
|
+
/** event.* (value, itemIndex…) */
|
|
9
|
+
event?: Record<string, unknown> | undefined;
|
|
10
|
+
/** The block's data: item, page inputs… (what the server would read). */
|
|
11
|
+
data?: Record<string, unknown> | undefined;
|
|
12
|
+
state?: Record<string, unknown> | undefined;
|
|
13
|
+
args?: Record<string, unknown> | undefined;
|
|
14
|
+
/** Mocked app action results by name; missing → { ok: true, data: null }. */
|
|
15
|
+
actions?: Record<string, {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
data?: unknown;
|
|
18
|
+
error?: string | undefined;
|
|
19
|
+
}> | undefined;
|
|
20
|
+
};
|
|
21
|
+
export type SimEntry = {
|
|
22
|
+
path: string;
|
|
23
|
+
depth: number;
|
|
24
|
+
kind: FlowStepKind | "error";
|
|
25
|
+
text: string;
|
|
26
|
+
detail?: string | undefined;
|
|
27
|
+
tone?: "ok" | "warn" | "error" | undefined;
|
|
28
|
+
};
|
|
29
|
+
export type SimResult = {
|
|
30
|
+
trace: SimEntry[];
|
|
31
|
+
state: Record<string, unknown>;
|
|
32
|
+
steps: Record<string, unknown>;
|
|
33
|
+
outcome: "completed" | "stopped" | "failed" | "navigated";
|
|
34
|
+
};
|
|
35
|
+
export declare function simulateFlow(name: string, flows: readonly Flow[], input?: SimInput): SimResult;
|
|
36
|
+
//# sourceMappingURL=flow-sim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-sim.d.ts","sourceRoot":"","sources":["../src/flow-sim.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,IAAI,EAAiB,KAAK,YAAY,EAAiB,MAAM,YAAY,CAAC;AAGtH;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3C,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;CACnG,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAC5K,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CAAE,CAAC;AA4EzK,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,KAAK,GAAE,QAAa,GAAG,SAAS,CASlG"}
|
package/dist/flow-sim.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readPath } from "./data.js";
|
|
2
|
+
import { describeStep, MAX_FLOW_DEPTH } from "./flows.js";
|
|
3
|
+
import { matchFilter, parseFilter } from "./tables.js";
|
|
4
|
+
const STOP = Symbol("stop");
|
|
5
|
+
function ref(r, run) {
|
|
6
|
+
if (!r)
|
|
7
|
+
return undefined;
|
|
8
|
+
if ("value" in r)
|
|
9
|
+
return r.value;
|
|
10
|
+
const root = r.path.split(".")[0];
|
|
11
|
+
if (root === "event" || root === "state" || root === "steps" || root === "args")
|
|
12
|
+
return readPath({ event: run.event, state: run.state, steps: run.steps, args: run.args }, r.path);
|
|
13
|
+
return readPath(run.data, r.path);
|
|
14
|
+
}
|
|
15
|
+
const refs = (m, run) => Object.fromEntries(Object.entries(m ?? {}).map(([k, v]) => [k, ref(v, run)]));
|
|
16
|
+
const show = (v) => { const s = JSON.stringify(v); return s === undefined ? "undefined" : s.length > 120 ? `${s.slice(0, 117)}…` : s; };
|
|
17
|
+
function steps(list, run, depth, flowName, path) {
|
|
18
|
+
for (const [i, s] of list.entries()) {
|
|
19
|
+
if (run.trace.length > 500) {
|
|
20
|
+
run.trace.push({ path, depth, kind: "error", text: "Stopped: more than 500 steps (loop?)", tone: "error" });
|
|
21
|
+
run.outcome = "stopped";
|
|
22
|
+
return STOP;
|
|
23
|
+
}
|
|
24
|
+
const here = `${path}.${i + 1}`;
|
|
25
|
+
const log = (detail, tone) => run.trace.push({ path: here, depth, kind: s.kind, text: describeStep(s), ...(detail ? { detail } : {}), ...(tone ? { tone } : {}) });
|
|
26
|
+
switch (s.kind) {
|
|
27
|
+
case "action": {
|
|
28
|
+
const input = refs(s.input, run);
|
|
29
|
+
const result = run.actions[s.action] ?? { ok: true, data: null };
|
|
30
|
+
if (s.as)
|
|
31
|
+
run.steps[s.as] = result;
|
|
32
|
+
log(`input ${show(input)} → ${result.ok ? `ok${result.data !== undefined ? ` ${show(result.data)}` : ""}` : `failed${result.error ? `: ${result.error}` : ""}`}`, result.ok ? "ok" : "error");
|
|
33
|
+
if (!result.ok) {
|
|
34
|
+
const f = run.flows.get(flowName);
|
|
35
|
+
if (f?.onError?.length) {
|
|
36
|
+
run.trace.push({ path: `${here}!`, depth, kind: "error", text: "Running “If an action fails”", tone: "warn" });
|
|
37
|
+
steps(f.onError, run, depth + 1, flowName, `${here}!`);
|
|
38
|
+
}
|
|
39
|
+
run.outcome = "failed";
|
|
40
|
+
return STOP;
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case "flow": {
|
|
45
|
+
const sub = run.flows.get(s.flow);
|
|
46
|
+
if (!sub) {
|
|
47
|
+
log(`flow "${s.flow}" not found`, "error");
|
|
48
|
+
run.outcome = "failed";
|
|
49
|
+
return STOP;
|
|
50
|
+
}
|
|
51
|
+
if (depth + 1 > MAX_FLOW_DEPTH) {
|
|
52
|
+
log(`deeper than ${MAX_FLOW_DEPTH} flows`, "error");
|
|
53
|
+
run.outcome = "failed";
|
|
54
|
+
return STOP;
|
|
55
|
+
}
|
|
56
|
+
const args = refs(s.args, run);
|
|
57
|
+
const missing = (sub.params ?? []).filter((p) => p.required && (args[p.name] === undefined || args[p.name] === null || args[p.name] === "")).map((p) => p.name);
|
|
58
|
+
log(`args ${show(args)}${missing.length ? ` — missing required ${missing.join(", ")}` : ""}`, missing.length ? "warn" : undefined);
|
|
59
|
+
if (steps(sub.steps, { ...run, args }, depth + 1, sub.name, `${here}>${sub.name}`) === STOP)
|
|
60
|
+
return STOP;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "navigate": {
|
|
64
|
+
const href = s.href ?? String(ref(s.hrefFrom, run) ?? "");
|
|
65
|
+
const safe = /^(\/(?!\/)|https?:\/\/|mailto:|tel:)[^\s"'<>]*$/.test(href);
|
|
66
|
+
log(safe ? href : `blocked link "${href}"`, safe ? undefined : "error");
|
|
67
|
+
if (!safe) {
|
|
68
|
+
run.outcome = "failed";
|
|
69
|
+
return STOP;
|
|
70
|
+
}
|
|
71
|
+
if (!s.newTab) {
|
|
72
|
+
run.outcome = "navigated";
|
|
73
|
+
return STOP;
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case "set": {
|
|
78
|
+
const cur = run.state[s.key];
|
|
79
|
+
const v = ref(s.value, run);
|
|
80
|
+
const op = s.op ?? "set";
|
|
81
|
+
run.state[s.key] = op === "toggle" ? !cur : op === "increment" ? (Number(cur) || 0) + (v === undefined ? 1 : Number(v) || 0) : op === "decrement" ? (Number(cur) || 0) - (v === undefined ? 1 : Number(v) || 0) : v;
|
|
82
|
+
log(`state.${s.key}: ${show(cur)} → ${show(run.state[s.key])}`);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "if": {
|
|
86
|
+
let yes = false;
|
|
87
|
+
let bad = false;
|
|
88
|
+
try {
|
|
89
|
+
const f = parseFilter(s.when);
|
|
90
|
+
yes = f ? matchFilter({ ...run.data, event: run.event, state: run.state, steps: run.steps, args: run.args }, f) : false;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
bad = true;
|
|
94
|
+
}
|
|
95
|
+
log(bad ? "condition does not parse" : yes ? "→ then" : "→ else", bad ? "error" : undefined);
|
|
96
|
+
if (steps(yes ? s.then : s.else ?? [], run, depth + 1, flowName, `${here}${yes ? "?" : ":"}`) === STOP)
|
|
97
|
+
return STOP;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case "copy":
|
|
101
|
+
log(`copies ${show(ref(s.value, run))}`);
|
|
102
|
+
break;
|
|
103
|
+
case "track":
|
|
104
|
+
log(`props ${show(refs(s.props, run))}`);
|
|
105
|
+
break;
|
|
106
|
+
case "wait":
|
|
107
|
+
log("skipped in a test run");
|
|
108
|
+
break;
|
|
109
|
+
case "stop":
|
|
110
|
+
log();
|
|
111
|
+
run.outcome = "stopped";
|
|
112
|
+
return STOP;
|
|
113
|
+
default: log();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export function simulateFlow(name, flows, input = {}) {
|
|
118
|
+
const run = {
|
|
119
|
+
flows: new Map(flows.map((f) => [f.name, f])), trace: [], state: { ...(input.state ?? {}) }, steps: {}, args: { ...(input.args ?? {}) },
|
|
120
|
+
event: input.event ?? {}, data: input.data ?? {}, actions: input.actions ?? {}, outcome: "completed",
|
|
121
|
+
};
|
|
122
|
+
const f = run.flows.get(name);
|
|
123
|
+
if (!f)
|
|
124
|
+
return { trace: [{ path: "", depth: 0, kind: "error", text: `flow "${name}" not found`, tone: "error" }], state: run.state, steps: run.steps, outcome: "failed" };
|
|
125
|
+
steps(f.steps, run, 0, f.name, f.name);
|
|
126
|
+
return { trace: run.trace, state: run.state, steps: run.steps, outcome: run.outcome };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=flow-sim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-sim.js","sourceRoot":"","sources":["../src/flow-sim.ts"],"names":[],"mappings":"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"}
|
package/dist/flows.d.ts
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type ComponentNode } from "./page-document.js";
|
|
3
|
+
/**
|
|
4
|
+
* Flows (ADR-049, ADR-050): a named sequence of steps an event runs — call an app action, open or close
|
|
5
|
+
* a modal, go to a link (same or new tab), remember a value, branch, wait, scroll/focus a block, copy
|
|
6
|
+
* text, send an analytics event, refresh data, or run another flow with arguments. Steps are a closed
|
|
7
|
+
* set: never code.
|
|
8
|
+
*
|
|
9
|
+
* Where flows live (name lookup in this order): the page (root.props.flows) → components on it (flows)
|
|
10
|
+
* → the project's flow library (artifact type "flow", versioned, pinned by each release).
|
|
11
|
+
* A block's event binds a flow by name, like a handler: node.events.click = "onCheckout".
|
|
12
|
+
*/
|
|
13
|
+
export declare const FLOW_NAME: RegExp;
|
|
14
|
+
/** Roots the browser knows while a flow runs; other paths are read on the server at render. */
|
|
15
|
+
export declare const FLOW_CLIENT_ROOTS: readonly ["event", "state", "steps", "args"];
|
|
16
|
+
export declare const MAX_FLOW_DEPTH = 5;
|
|
17
|
+
export declare const MAX_WAIT_MS = 30000;
|
|
18
|
+
export declare const ValueRefSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
19
|
+
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
|
|
20
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
21
|
+
path: z.ZodString;
|
|
22
|
+
}, z.core.$strict>]>;
|
|
23
|
+
export type ValueRef = z.infer<typeof ValueRefSchema>;
|
|
24
|
+
export type FlowStep = {
|
|
25
|
+
kind: "action";
|
|
26
|
+
action: string;
|
|
27
|
+
input?: Record<string, ValueRef> | undefined;
|
|
28
|
+
as?: string | undefined;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "flow";
|
|
31
|
+
flow: string;
|
|
32
|
+
args?: Record<string, ValueRef> | undefined;
|
|
33
|
+
} | {
|
|
34
|
+
kind: "open";
|
|
35
|
+
modal: string;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "close";
|
|
38
|
+
modal?: string | undefined;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "navigate";
|
|
41
|
+
href?: string | undefined;
|
|
42
|
+
hrefFrom?: ValueRef | undefined;
|
|
43
|
+
newTab?: boolean | undefined;
|
|
44
|
+
} | {
|
|
45
|
+
kind: "toast";
|
|
46
|
+
text: string;
|
|
47
|
+
tone?: "info" | "success" | "error" | undefined;
|
|
48
|
+
} | {
|
|
49
|
+
kind: "set";
|
|
50
|
+
key: string;
|
|
51
|
+
value?: ValueRef | undefined;
|
|
52
|
+
op?: "set" | "increment" | "decrement" | "toggle" | undefined;
|
|
53
|
+
} | {
|
|
54
|
+
kind: "if";
|
|
55
|
+
when: string;
|
|
56
|
+
then: FlowStep[];
|
|
57
|
+
else?: FlowStep[] | undefined;
|
|
58
|
+
} | {
|
|
59
|
+
kind: "wait";
|
|
60
|
+
ms: number;
|
|
61
|
+
} | {
|
|
62
|
+
kind: "scroll";
|
|
63
|
+
target: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: "focus";
|
|
66
|
+
target: string;
|
|
67
|
+
} | {
|
|
68
|
+
kind: "copy";
|
|
69
|
+
value: ValueRef;
|
|
70
|
+
} | {
|
|
71
|
+
kind: "track";
|
|
72
|
+
event: string;
|
|
73
|
+
props?: Record<string, ValueRef> | undefined;
|
|
74
|
+
} | {
|
|
75
|
+
kind: "animate";
|
|
76
|
+
target: string;
|
|
77
|
+
preset: string;
|
|
78
|
+
} | {
|
|
79
|
+
kind: "refresh";
|
|
80
|
+
} | {
|
|
81
|
+
kind: "stop";
|
|
82
|
+
};
|
|
83
|
+
export type FlowStepKind = FlowStep["kind"];
|
|
84
|
+
export declare const FlowStepSchema: z.ZodType<FlowStep>;
|
|
85
|
+
export declare const FLOW_PARAM_TYPES: readonly ["text", "number", "boolean"];
|
|
86
|
+
export declare const FlowParamSchema: z.ZodObject<{
|
|
87
|
+
name: z.ZodString;
|
|
88
|
+
label: z.ZodOptional<z.ZodString>;
|
|
89
|
+
type: z.ZodEnum<{
|
|
90
|
+
boolean: "boolean";
|
|
91
|
+
number: "number";
|
|
92
|
+
text: "text";
|
|
93
|
+
}>;
|
|
94
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
95
|
+
}, z.core.$strict>;
|
|
96
|
+
export type FlowParam = z.infer<typeof FlowParamSchema>;
|
|
97
|
+
export type Flow = {
|
|
98
|
+
name: string;
|
|
99
|
+
label?: string | undefined;
|
|
100
|
+
description?: string | undefined;
|
|
101
|
+
params?: FlowParam[] | undefined;
|
|
102
|
+
steps: FlowStep[];
|
|
103
|
+
onError?: FlowStep[] | undefined;
|
|
104
|
+
};
|
|
105
|
+
export declare const FlowSchema: z.ZodObject<{
|
|
106
|
+
name: z.ZodString;
|
|
107
|
+
label: z.ZodOptional<z.ZodString>;
|
|
108
|
+
description: z.ZodOptional<z.ZodString>;
|
|
109
|
+
params: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
110
|
+
name: z.ZodString;
|
|
111
|
+
label: z.ZodOptional<z.ZodString>;
|
|
112
|
+
type: z.ZodEnum<{
|
|
113
|
+
boolean: "boolean";
|
|
114
|
+
number: "number";
|
|
115
|
+
text: "text";
|
|
116
|
+
}>;
|
|
117
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
118
|
+
}, z.core.$strict>>>;
|
|
119
|
+
steps: z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>;
|
|
120
|
+
onError: z.ZodOptional<z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>>;
|
|
121
|
+
}, z.core.$strict>;
|
|
122
|
+
/** Every step, nested ones included. */
|
|
123
|
+
export declare function walkSteps(steps: readonly FlowStep[] | undefined, fn: (s: FlowStep, depth: number) => void, depth?: number): void;
|
|
124
|
+
/** Names of the flows a flow calls (sub-flows). */
|
|
125
|
+
export declare function flowCalls(f: Flow): string[];
|
|
126
|
+
/** Sub-flow cycle (a → b → a) as a path, or null. */
|
|
127
|
+
export declare function findFlowCycle(flows: readonly Flow[]): string[] | null;
|
|
128
|
+
/** Sub-flows called but not defined in this set (they must come from the project's flow library). */
|
|
129
|
+
export declare function externalFlowCalls(flows: readonly Flow[]): string[];
|
|
130
|
+
/** Flows of a page/component. Sub-flows not defined here are looked up in the flow library at publish. */
|
|
131
|
+
export declare const FlowsSchema: z.ZodArray<z.ZodObject<{
|
|
132
|
+
name: z.ZodString;
|
|
133
|
+
label: z.ZodOptional<z.ZodString>;
|
|
134
|
+
description: z.ZodOptional<z.ZodString>;
|
|
135
|
+
params: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
136
|
+
name: z.ZodString;
|
|
137
|
+
label: z.ZodOptional<z.ZodString>;
|
|
138
|
+
type: z.ZodEnum<{
|
|
139
|
+
boolean: "boolean";
|
|
140
|
+
number: "number";
|
|
141
|
+
text: "text";
|
|
142
|
+
}>;
|
|
143
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
144
|
+
}, z.core.$strict>>>;
|
|
145
|
+
steps: z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>;
|
|
146
|
+
onError: z.ZodOptional<z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>>;
|
|
147
|
+
}, z.core.$strict>>;
|
|
148
|
+
/**
|
|
149
|
+
* Page triggers (ADR-050/051): run a flow (or handler) when the page loads (optionally later), when the
|
|
150
|
+
* visitor is about to leave (mouse exits at the top), scrolls past a percentage, stays idle, every N
|
|
151
|
+
* seconds, when the tab is hidden/shown again, or on leaving the page (send analytics only there).
|
|
152
|
+
*/
|
|
153
|
+
export declare const PAGE_TRIGGERS: readonly ["load", "exitIntent", "scroll", "idle", "interval", "tabHidden", "tabVisible", "leave"];
|
|
154
|
+
export type PageTriggerKind = (typeof PAGE_TRIGGERS)[number];
|
|
155
|
+
export declare const FlowTriggerSchema: z.ZodObject<{
|
|
156
|
+
on: z.ZodEnum<{
|
|
157
|
+
exitIntent: "exitIntent";
|
|
158
|
+
idle: "idle";
|
|
159
|
+
interval: "interval";
|
|
160
|
+
leave: "leave";
|
|
161
|
+
load: "load";
|
|
162
|
+
scroll: "scroll";
|
|
163
|
+
tabHidden: "tabHidden";
|
|
164
|
+
tabVisible: "tabVisible";
|
|
165
|
+
}>;
|
|
166
|
+
flow: z.ZodString;
|
|
167
|
+
delayMs: z.ZodOptional<z.ZodNumber>;
|
|
168
|
+
percent: z.ZodOptional<z.ZodNumber>;
|
|
169
|
+
ms: z.ZodOptional<z.ZodNumber>;
|
|
170
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
171
|
+
once: z.ZodOptional<z.ZodBoolean>;
|
|
172
|
+
}, z.core.$strict>;
|
|
173
|
+
export type FlowTrigger = z.infer<typeof FlowTriggerSchema>;
|
|
174
|
+
export declare const FlowTriggersSchema: z.ZodArray<z.ZodObject<{
|
|
175
|
+
on: z.ZodEnum<{
|
|
176
|
+
exitIntent: "exitIntent";
|
|
177
|
+
idle: "idle";
|
|
178
|
+
interval: "interval";
|
|
179
|
+
leave: "leave";
|
|
180
|
+
load: "load";
|
|
181
|
+
scroll: "scroll";
|
|
182
|
+
tabHidden: "tabHidden";
|
|
183
|
+
tabVisible: "tabVisible";
|
|
184
|
+
}>;
|
|
185
|
+
flow: z.ZodString;
|
|
186
|
+
delayMs: z.ZodOptional<z.ZodNumber>;
|
|
187
|
+
percent: z.ZodOptional<z.ZodNumber>;
|
|
188
|
+
ms: z.ZodOptional<z.ZodNumber>;
|
|
189
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
190
|
+
once: z.ZodOptional<z.ZodBoolean>;
|
|
191
|
+
}, z.core.$strict>>;
|
|
192
|
+
/**
|
|
193
|
+
* Block lifecycle (ADR-051): every block can run a flow (or handler) when it appears in the browser
|
|
194
|
+
* (mount), disappears (unmount — a state gate hides it, the page changes), scrolls into view (visible,
|
|
195
|
+
* once per view unless visibleOnce = false), scrolls out (leave), or every N seconds while shown (every).
|
|
196
|
+
*/
|
|
197
|
+
export declare const LIFECYCLE_KINDS: readonly ["mount", "unmount", "visible", "leave"];
|
|
198
|
+
export type LifecycleKind = (typeof LIFECYCLE_KINDS)[number] | "every";
|
|
199
|
+
export declare const NodeLifecycleSchema: z.ZodObject<{
|
|
200
|
+
mount: z.ZodOptional<z.ZodString>;
|
|
201
|
+
unmount: z.ZodOptional<z.ZodString>;
|
|
202
|
+
visible: z.ZodOptional<z.ZodString>;
|
|
203
|
+
leave: z.ZodOptional<z.ZodString>;
|
|
204
|
+
visibleOnce: z.ZodOptional<z.ZodBoolean>;
|
|
205
|
+
every: z.ZodOptional<z.ZodObject<{
|
|
206
|
+
run: z.ZodString;
|
|
207
|
+
ms: z.ZodNumber;
|
|
208
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
209
|
+
}, z.core.$strict>>;
|
|
210
|
+
}, z.core.$strict>;
|
|
211
|
+
export type NodeLifecycle = z.infer<typeof NodeLifecycleSchema>;
|
|
212
|
+
/** Names a block's lifecycle runs. */
|
|
213
|
+
export declare const lifecycleNames: (l: NodeLifecycle | undefined) => string[];
|
|
214
|
+
/** Starting values of the page state (state.*): wizard step, quantity… */
|
|
215
|
+
export declare const FlowStateSchema: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
|
|
216
|
+
/** A flow in the project library (artifact type "flow"): one flow + schema version. */
|
|
217
|
+
export declare const FlowDocumentSchema: z.ZodObject<{
|
|
218
|
+
name: z.ZodString;
|
|
219
|
+
label: z.ZodOptional<z.ZodString>;
|
|
220
|
+
description: z.ZodOptional<z.ZodString>;
|
|
221
|
+
params: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
222
|
+
name: z.ZodString;
|
|
223
|
+
label: z.ZodOptional<z.ZodString>;
|
|
224
|
+
type: z.ZodEnum<{
|
|
225
|
+
boolean: "boolean";
|
|
226
|
+
number: "number";
|
|
227
|
+
text: "text";
|
|
228
|
+
}>;
|
|
229
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
230
|
+
}, z.core.$strict>>>;
|
|
231
|
+
steps: z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>;
|
|
232
|
+
onError: z.ZodOptional<z.ZodArray<z.ZodType<FlowStep, unknown, z.core.$ZodTypeInternals<FlowStep, unknown>>>>;
|
|
233
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
234
|
+
}, z.core.$strict>;
|
|
235
|
+
export type FlowDocument = z.infer<typeof FlowDocumentSchema>;
|
|
236
|
+
export declare const flowFromDocument: ({ schemaVersion: _v, ...f }: FlowDocument) => Flow;
|
|
237
|
+
export declare function filterFields(expr: string): string[];
|
|
238
|
+
/**
|
|
239
|
+
* Paths a flow (and its sub-flows) reads that the browser does not know — item.*, page data… The server
|
|
240
|
+
* reads them from the block's data at render and hands them to the event boundary.
|
|
241
|
+
*/
|
|
242
|
+
export declare function flowServerPaths(name: string, flows: readonly Flow[]): string[];
|
|
243
|
+
/** Does a showIf read the page state? Such blocks are shown/hidden in the browser (ADR-050). */
|
|
244
|
+
export declare const showIfUsesState: (expr: string | undefined) => boolean;
|
|
245
|
+
/** Non-state paths of a state showIf (read on the server, passed to the browser gate). */
|
|
246
|
+
export declare const showIfServerPaths: (expr: string) => string[];
|
|
247
|
+
/** Modal names opened/closed by flows (editor checks that a Modal with that name exists). */
|
|
248
|
+
export declare function flowModals(flows: readonly Flow[]): string[];
|
|
249
|
+
/** App action names flows call (publish/editor can check them against the app registry). */
|
|
250
|
+
export declare function flowActions(flows: readonly Flow[]): string[];
|
|
251
|
+
/**
|
|
252
|
+
* Flow names a document needs: event names of its blocks, triggers, and sub-flows they call, followed
|
|
253
|
+
* through the given flows (local + library). Used by delivery to ship only the flows a page uses.
|
|
254
|
+
*/
|
|
255
|
+
export declare function neededFlowNames(nodes: readonly ComponentNode[], available: readonly Flow[], extra?: readonly string[]): string[];
|
|
256
|
+
/** A readable sentence for one step (not translated; the editor shows it as the collapsed summary). */
|
|
257
|
+
export declare function describeStep(s: FlowStep): string;
|
|
258
|
+
/** The whole flow as indented lines (then/else nested), used to compare versions. */
|
|
259
|
+
export declare function describeFlow(f: Pick<Flow, "steps" | "onError" | "params" | "label">): string[];
|
|
260
|
+
/** Line diff (LCS) between two describeFlow outputs: unchanged / added / removed lines in order. */
|
|
261
|
+
export declare function diffLines(a: readonly string[], b: readonly string[]): {
|
|
262
|
+
kind: "same" | "add" | "del";
|
|
263
|
+
text: string;
|
|
264
|
+
}[];
|
|
265
|
+
/** Animation presets used by "animate" steps (the runtime needs their keyframes in the browser). */
|
|
266
|
+
export declare function flowPresets(flows: readonly Flow[]): string[];
|
|
267
|
+
//# sourceMappingURL=flows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows.d.ts","sourceRoot":"","sources":["../src/flows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnE;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,QAA+B,CAAC;AAMtD,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,YAAI,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAC9E,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,WAAW,QAAS,CAAC;AAGlC,eAAO,MAAM,cAAc;;;;oBAGzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC9G;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,EAAE,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;CAAE,GACzH;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACrB,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AAK5C,eAAO,MAAM,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAmBV,CAAC;AAEtC,eAAO,MAAM,gBAAgB,YAAI,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACvE,eAAO,MAAM,eAAe;;;;;;;;;kBAKjB,CAAC;AACZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC;AAWzL,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;kBAA+B,CAAC;AAEvD,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,KAAK,SAAI,QAKpH;AAGD,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,CAI3C;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAcrE;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAGlE;AAeD,0GAA0G;AAC1G,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;mBAAoF,CAAC;AAE7G;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAI,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAU,CAAC;AAC/H,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;kBAgB5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;mBAAqC,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,eAAe,YAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AACjF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;AACvE,eAAO,MAAM,mBAAmB;;;;;;;;;;;kBAOwE,CAAC;AACzG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,sCAAsC;AACtC,eAAO,MAAM,cAAc,MAAO,aAAa,GAAG,SAAS,KAAG,MAAM,EAAuG,CAAC;AAE5K,0EAA0E;AAC1E,eAAO,MAAM,eAAe,oGAAiH,CAAC;AAE9I,uFAAuF;AACvF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;kBAAmE,CAAC;AACnG,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,eAAO,MAAM,gBAAgB,gCAAiC,YAAY,KAAG,IAAS,CAAC;AAKvF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnD;AAGD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAoB9E;AAED,gGAAgG;AAChG,eAAO,MAAM,eAAe,SAAU,MAAM,GAAG,SAAS,YAA0E,CAAC;AACnI,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,SAAU,MAAM,aAAuD,CAAC;AAEtG,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAI3D;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAI5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,EAAE,CAUpI;AAOD,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAmBhD;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,EAAE,CAW9F;AAED,oGAAoG;AACpG,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CActH;AAED,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAI5D"}
|