@widgentic/designer 0.8.0 → 0.12.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/README.md +2 -1
- package/dist/browser/widgentic-designer.js +127 -97
- package/dist/browser/widgentic-designer.js.map +4 -4
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -1
- package/dist/browser.js.map +1 -1
- package/dist/dom.d.ts +5 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +23 -0
- package/dist/dom.js.map +1 -1
- package/dist/element.d.ts +9 -0
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +55 -0
- package/dist/element.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +8 -3
- package/dist/io.d.ts.map +1 -1
- package/dist/io.js +38 -8
- package/dist/io.js.map +1 -1
- package/dist/panels.d.ts.map +1 -1
- package/dist/panels.js +17 -54
- package/dist/panels.js.map +1 -1
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +23 -6
- package/dist/preview.js.map +1 -1
- package/dist/schema-designer.d.ts.map +1 -1
- package/dist/schema-designer.js +15 -7
- package/dist/schema-designer.js.map +1 -1
- package/dist/settings-designer.d.ts +37 -0
- package/dist/settings-designer.d.ts.map +1 -0
- package/dist/settings-designer.js +224 -0
- package/dist/settings-designer.js.map +1 -0
- package/dist/shell.d.ts +24 -0
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +39 -7
- package/dist/shell.js.map +1 -1
- package/dist/store.d.ts +9 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/styles-panel.d.ts +10 -0
- package/dist/styles-panel.d.ts.map +1 -0
- package/dist/styles-panel.js +79 -0
- package/dist/styles-panel.js.map +1 -0
- package/dist/template-panel.d.ts.map +1 -1
- package/dist/template-panel.js +82 -5
- package/dist/template-panel.js.map +1 -1
- package/dist/theme-designer.d.ts +7 -2
- package/dist/theme-designer.d.ts.map +1 -1
- package/dist/theme-designer.js +79 -15
- package/dist/theme-designer.js.map +1 -1
- package/dist/theme-panel.d.ts.map +1 -1
- package/dist/theme-panel.js +19 -12
- package/dist/theme-panel.js.map +1 -1
- package/dist/validate.d.ts +16 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +38 -7
- package/dist/validate.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings designer: edits a principal's settings record — account-wide
|
|
3
|
+
* preferences, one titled subsection per section. This version edits
|
|
4
|
+
* `defaultThemes` (the theme light hosts and dark hosts get when a render
|
|
5
|
+
* names none; one choice per mode, so choosing a theme replaces the mode's
|
|
6
|
+
* previous one) and `resourceDomains` (the domains MCP Apps frames may load
|
|
7
|
+
* images from directly), each entry checked live by the core rule the store
|
|
8
|
+
* applies: a valid one is recorded canonical, an invalid one as typed, so
|
|
9
|
+
* the save's refusal names what the person sees. Sections it does not edit
|
|
10
|
+
* pass through untouched, and the host saves (the designer writes nothing).
|
|
11
|
+
*/
|
|
12
|
+
import { RESOURCE_DOMAIN_LIMIT, isPlainObject, parseResourceDomain } from "@widgentic/core";
|
|
13
|
+
import { applyChrome, diagnosticLine, h, injectDesignerStyles, section } from "./dom.js";
|
|
14
|
+
import { clone } from "./internal.js";
|
|
15
|
+
const MODES = [
|
|
16
|
+
{ mode: "light", label: "Light hosts", builtIn: "Built-in light" },
|
|
17
|
+
{ mode: "dark", label: "Dark hosts", builtIn: "Built-in dark" }
|
|
18
|
+
];
|
|
19
|
+
/** Shape check for an untrusted record; errors instead of throwing. */
|
|
20
|
+
function checkSettings(settings) {
|
|
21
|
+
if (!isPlainObject(settings))
|
|
22
|
+
return ["Settings must be an object of named sections."];
|
|
23
|
+
const errors = [];
|
|
24
|
+
const domains = settings.resourceDomains;
|
|
25
|
+
if (domains !== undefined && (!Array.isArray(domains) || !domains.every((entry) => typeof entry === "string"))) {
|
|
26
|
+
errors.push("resourceDomains: must be a list of domain strings.");
|
|
27
|
+
}
|
|
28
|
+
const themes = settings.defaultThemes;
|
|
29
|
+
if (themes === undefined)
|
|
30
|
+
return errors;
|
|
31
|
+
if (!isPlainObject(themes))
|
|
32
|
+
return [...errors, "defaultThemes: must be an object of { light?, dark? }."];
|
|
33
|
+
for (const [mode, name] of Object.entries(themes)) {
|
|
34
|
+
if (!MODES.some((known) => known.mode === mode))
|
|
35
|
+
errors.push(`defaultThemes: '${mode}' is not a theme mode.`);
|
|
36
|
+
else if (typeof name !== "string")
|
|
37
|
+
errors.push(`defaultThemes: the ${mode} default must be a theme name.`);
|
|
38
|
+
}
|
|
39
|
+
return errors;
|
|
40
|
+
}
|
|
41
|
+
export function createSettingsDesigner(container, options = {}) {
|
|
42
|
+
injectDesignerStyles(document);
|
|
43
|
+
let themes = options.themes ?? [];
|
|
44
|
+
let record = options.initialSettings ? clone(options.initialSettings) : {};
|
|
45
|
+
const listeners = new Set();
|
|
46
|
+
const panels = h("div", { class: "wgd-panels" });
|
|
47
|
+
const root = h("div", { class: "wgd-root wgd-settings-designer" }, [panels]);
|
|
48
|
+
if (options.appearance === "light" || options.appearance === "dark") {
|
|
49
|
+
root.setAttribute("data-wgd-theme", options.appearance);
|
|
50
|
+
}
|
|
51
|
+
applyChrome(root, options.chrome);
|
|
52
|
+
container.appendChild(root);
|
|
53
|
+
function getSettings() {
|
|
54
|
+
// The edited section is always present (possibly empty), so a host
|
|
55
|
+
// saving it clears a mode the person set back to the built-in.
|
|
56
|
+
return { ...clone(record), defaultThemes: clone(record.defaultThemes ?? {}) };
|
|
57
|
+
}
|
|
58
|
+
function notify() {
|
|
59
|
+
for (const listener of [...listeners])
|
|
60
|
+
listener(getSettings());
|
|
61
|
+
}
|
|
62
|
+
// --- Default themes ----------------------------------------------------
|
|
63
|
+
const selects = new Map();
|
|
64
|
+
function fillSelect(select, mode, builtIn) {
|
|
65
|
+
const current = record.defaultThemes?.[mode];
|
|
66
|
+
select.replaceChildren(h("option", { value: "" }, [builtIn]));
|
|
67
|
+
for (const theme of themes) {
|
|
68
|
+
select.append(h("option", { value: theme.name }, [theme.label ?? theme.name]));
|
|
69
|
+
}
|
|
70
|
+
// A default whose theme the host did not supply stays visible and
|
|
71
|
+
// selected until the person picks another — never dropped silently.
|
|
72
|
+
if (current !== undefined && !themes.some((theme) => theme.name === current)) {
|
|
73
|
+
select.append(h("option", { value: current, class: "wgd-unavailable" }, [`${current} (unavailable)`]));
|
|
74
|
+
}
|
|
75
|
+
select.value = current ?? "";
|
|
76
|
+
}
|
|
77
|
+
const rows = MODES.map(({ mode, label, builtIn }) => {
|
|
78
|
+
const select = h("select", { class: "wgd-select wgd-default-theme", "data-mode": mode });
|
|
79
|
+
fillSelect(select, mode, builtIn);
|
|
80
|
+
select.addEventListener("change", () => {
|
|
81
|
+
const next = { ...(record.defaultThemes ?? {}) };
|
|
82
|
+
if (select.value === "")
|
|
83
|
+
delete next[mode];
|
|
84
|
+
else
|
|
85
|
+
next[mode] = select.value;
|
|
86
|
+
record = { ...record, defaultThemes: next };
|
|
87
|
+
notify();
|
|
88
|
+
});
|
|
89
|
+
selects.set(mode, select);
|
|
90
|
+
return h("label", { class: "wgd-row" }, [h("span", { class: "wgd-field-label" }, [label]), select]);
|
|
91
|
+
});
|
|
92
|
+
const defaultsPanel = section("Default themes", [
|
|
93
|
+
h("span", { class: "wgd-field-label" }, [
|
|
94
|
+
"The theme a render uses when it names none: light hosts get the light default, dark hosts the dark one."
|
|
95
|
+
]),
|
|
96
|
+
...rows
|
|
97
|
+
]);
|
|
98
|
+
panels.append(defaultsPanel);
|
|
99
|
+
// --- Resource domains --------------------------------------------------
|
|
100
|
+
// The section is in the record once supplied or edited (possibly empty),
|
|
101
|
+
// so a save clears a list the person emptied and never adds one unasked.
|
|
102
|
+
const domainRows = h("div", { class: "wgd-domains" });
|
|
103
|
+
const addInput = h("input", {
|
|
104
|
+
type: "text",
|
|
105
|
+
class: "wgd-input wgd-domain-add",
|
|
106
|
+
placeholder: "cdn.example.com",
|
|
107
|
+
spellcheck: "false",
|
|
108
|
+
"aria-label": "Add a resource domain"
|
|
109
|
+
});
|
|
110
|
+
const addButton = h("button", { class: "wgd-icon", type: "button", title: "Add domain" }, ["+"]);
|
|
111
|
+
/** A typed entry as the record keeps it: canonical when the rule accepts it, else as typed. */
|
|
112
|
+
function recorded(typed) {
|
|
113
|
+
const parsed = parseResourceDomain(typed);
|
|
114
|
+
return "error" in parsed
|
|
115
|
+
? { value: typed.trim(), mark: `Not a resource domain: ${parsed.error}.`, error: true }
|
|
116
|
+
: { value: parsed.origin, mark: parsed.origin, error: false };
|
|
117
|
+
}
|
|
118
|
+
function setDomains(next) {
|
|
119
|
+
record = { ...record, resourceDomains: next };
|
|
120
|
+
renderDomains();
|
|
121
|
+
notify();
|
|
122
|
+
}
|
|
123
|
+
function renderDomains() {
|
|
124
|
+
const domains = record.resourceDomains ?? [];
|
|
125
|
+
domainRows.replaceChildren(...domains.map((entry, index) => {
|
|
126
|
+
const input = h("input", { type: "text", class: "wgd-input wgd-domain", spellcheck: "false", "aria-label": `Resource domain ${index + 1}` });
|
|
127
|
+
input.value = entry;
|
|
128
|
+
input.addEventListener("change", () => {
|
|
129
|
+
const next = [...domains];
|
|
130
|
+
next[index] = recorded(input.value).value;
|
|
131
|
+
setDomains(next);
|
|
132
|
+
});
|
|
133
|
+
const remove = h("button", { class: "wgd-icon", type: "button", title: "Remove domain" }, ["✕"]);
|
|
134
|
+
remove.addEventListener("click", () => setDomains(domains.filter((_entry, at) => at !== index)));
|
|
135
|
+
const { mark, error } = recorded(entry);
|
|
136
|
+
return h("div", { class: "wgd-domain-entry" }, [
|
|
137
|
+
h("div", { class: "wgd-row" }, [input, remove]),
|
|
138
|
+
error ? diagnosticLine(mark) : h("span", { class: "wgd-field-label wgd-domain-origin" }, [mark])
|
|
139
|
+
]);
|
|
140
|
+
}));
|
|
141
|
+
const full = domains.length >= RESOURCE_DOMAIN_LIMIT;
|
|
142
|
+
addInput.disabled = full;
|
|
143
|
+
addButton.disabled = full;
|
|
144
|
+
}
|
|
145
|
+
function addDomain() {
|
|
146
|
+
if (addInput.value.trim() === "" || (record.resourceDomains ?? []).length >= RESOURCE_DOMAIN_LIMIT)
|
|
147
|
+
return;
|
|
148
|
+
const entry = recorded(addInput.value).value;
|
|
149
|
+
addInput.value = "";
|
|
150
|
+
setDomains([...(record.resourceDomains ?? []), entry]);
|
|
151
|
+
}
|
|
152
|
+
addButton.addEventListener("click", addDomain);
|
|
153
|
+
addInput.addEventListener("keydown", (event) => {
|
|
154
|
+
if (event.key === "Enter") {
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
addDomain();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
const domainsPanel = section("Resource domains", [
|
|
160
|
+
h("span", { class: "wgd-field-label" }, [
|
|
161
|
+
"Domains your widgets' images may load from directly in chat hosts that honor them, " +
|
|
162
|
+
"when the server does not copy an image inline. Enter cdn.example.com or *.example.com, " +
|
|
163
|
+
`optionally with https:// (no ports, paths or IP addresses), at most ${RESOURCE_DOMAIN_LIMIT}.`
|
|
164
|
+
]),
|
|
165
|
+
h("span", { class: "wgd-field-label" }, [
|
|
166
|
+
"Any render, including image addresses an agent supplies, may load from these domains in the " +
|
|
167
|
+
"viewer's browser, so list only domains you control. A domain that redirects needs its target " +
|
|
168
|
+
"listed too, and a chat client keeps the list it read until it reloads."
|
|
169
|
+
]),
|
|
170
|
+
domainRows,
|
|
171
|
+
h("div", { class: "wgd-row" }, [addInput, addButton])
|
|
172
|
+
]);
|
|
173
|
+
panels.append(domainsPanel);
|
|
174
|
+
renderDomains();
|
|
175
|
+
function loadSettings(settings) {
|
|
176
|
+
const errors = checkSettings(settings);
|
|
177
|
+
if (errors.length > 0)
|
|
178
|
+
return { ok: false, errors };
|
|
179
|
+
record = clone(settings);
|
|
180
|
+
for (const { mode, builtIn } of MODES) {
|
|
181
|
+
const select = selects.get(mode);
|
|
182
|
+
if (select !== undefined)
|
|
183
|
+
fillSelect(select, mode, builtIn);
|
|
184
|
+
}
|
|
185
|
+
renderDomains();
|
|
186
|
+
notify();
|
|
187
|
+
return { ok: true };
|
|
188
|
+
}
|
|
189
|
+
/** Same mechanism as the other designers: inert the section bodies. */
|
|
190
|
+
function setReadOnly(readOnly) {
|
|
191
|
+
root.classList.toggle("wgd-readonly", readOnly);
|
|
192
|
+
for (const body of panels.querySelectorAll(".wgd-section-body")) {
|
|
193
|
+
if (readOnly)
|
|
194
|
+
body.setAttribute("inert", "");
|
|
195
|
+
else
|
|
196
|
+
body.removeAttribute("inert");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (options.readOnly === true)
|
|
200
|
+
setReadOnly(true);
|
|
201
|
+
function setThemes(next) {
|
|
202
|
+
themes = [...next];
|
|
203
|
+
for (const { mode, builtIn } of MODES) {
|
|
204
|
+
const select = selects.get(mode);
|
|
205
|
+
if (select !== undefined)
|
|
206
|
+
fillSelect(select, mode, builtIn);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
getSettings,
|
|
211
|
+
loadSettings,
|
|
212
|
+
setThemes,
|
|
213
|
+
setReadOnly,
|
|
214
|
+
subscribe(listener) {
|
|
215
|
+
listeners.add(listener);
|
|
216
|
+
return () => listeners.delete(listener);
|
|
217
|
+
},
|
|
218
|
+
dispose() {
|
|
219
|
+
listeners.clear();
|
|
220
|
+
root.remove();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=settings-designer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-designer.js","sourceRoot":"","sources":["../src/settings-designer.ts"],"names":[],"mappings":"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"}
|
package/dist/shell.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export interface DesignerOptions {
|
|
|
14
14
|
* the standalone theme designer; the widget designer only selects.
|
|
15
15
|
*/
|
|
16
16
|
themes?: ThemeEntry[];
|
|
17
|
+
/**
|
|
18
|
+
* The name of one of `themes` to open with as the preview theme — its
|
|
19
|
+
* tokens and styles applied — e.g. the person's light default. A name
|
|
20
|
+
* that matches no supplied entry is ignored. Wins over `initialTheme`.
|
|
21
|
+
*/
|
|
22
|
+
previewTheme?: string;
|
|
17
23
|
/**
|
|
18
24
|
* Shared data schemas the draft may reference by name (the Data schema
|
|
19
25
|
* section's "use shared" mode). Schema authoring belongs to the
|
|
@@ -54,9 +60,27 @@ export type LoadResult = {
|
|
|
54
60
|
ok: false;
|
|
55
61
|
errors: string[];
|
|
56
62
|
};
|
|
63
|
+
export type WidgetCheckResult = {
|
|
64
|
+
ok: true;
|
|
65
|
+
diagnostics: DesignerDiagnostics;
|
|
66
|
+
} | {
|
|
67
|
+
ok: false;
|
|
68
|
+
errors: string[];
|
|
69
|
+
};
|
|
57
70
|
export interface DesignerHandle {
|
|
58
71
|
getDraft(): WidgetDraft;
|
|
72
|
+
/**
|
|
73
|
+
* The current draft's diagnostics, resolved against the shared schemas and
|
|
74
|
+
* actions the host supplied — what subscribers receive on every change.
|
|
75
|
+
*/
|
|
76
|
+
getDiagnostics(): DesignerDiagnostics;
|
|
59
77
|
loadWidget(definition: unknown): LoadResult;
|
|
78
|
+
/**
|
|
79
|
+
* Check a definition exactly as `loadWidget` would — the same refusals —
|
|
80
|
+
* and return its diagnostics against the host's shared entries, without
|
|
81
|
+
* touching the draft.
|
|
82
|
+
*/
|
|
83
|
+
checkWidget(definition: unknown): WidgetCheckResult;
|
|
60
84
|
loadTheme(theme: unknown): LoadResult;
|
|
61
85
|
/** Disable/enable editing; the preview and theme selector stay live. */
|
|
62
86
|
setReadOnly(readOnly: boolean): void;
|
package/dist/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACxE,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjH,MAAM,WAAW,cAAc;IAC7B,QAAQ,IAAI,WAAW,CAAC;IACxB;;;OAGG;IACH,cAAc,IAAI,mBAAmB,CAAC;IACtC,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5C;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACpD,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IACtC,wEAAwE;IACxE,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,SAAS,CACP,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,KAAK,IAAI,GACvE,MAAM,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAuIhB"}
|
package/dist/shell.js
CHANGED
|
@@ -16,7 +16,17 @@ export function createDesigner(container, options = {}) {
|
|
|
16
16
|
const base = options.initialWidget
|
|
17
17
|
? cloneDraft({ ...options.initialWidget })
|
|
18
18
|
: starterDraft();
|
|
19
|
-
const
|
|
19
|
+
const preselected = options.themes?.find((entry) => entry.name === options.previewTheme);
|
|
20
|
+
const initial = preselected !== undefined
|
|
21
|
+
? {
|
|
22
|
+
...base,
|
|
23
|
+
theme: preselected.tokens,
|
|
24
|
+
previewTheme: preselected.name,
|
|
25
|
+
...(preselected.styles === undefined ? {} : { themeStyles: preselected.styles })
|
|
26
|
+
}
|
|
27
|
+
: options.initialTheme !== undefined
|
|
28
|
+
? { ...base, theme: options.initialTheme }
|
|
29
|
+
: base;
|
|
20
30
|
const store = createDraftStore(initial);
|
|
21
31
|
const listeners = new Set();
|
|
22
32
|
const preview = createPreview({ actions: options.actions ?? [] });
|
|
@@ -35,11 +45,14 @@ export function createDesigner(container, options = {}) {
|
|
|
35
45
|
schemas: options.schemas ?? []
|
|
36
46
|
};
|
|
37
47
|
const panels = mountPanels(store, { left: leftColumn, right: rightSections }, options.themes ?? [], options.schemas ?? [], actionContext);
|
|
48
|
+
// Every diagnostic resolves against the shared entries the host supplied;
|
|
49
|
+
// with no schemas supplied a reference is unverifiable, never "unknown".
|
|
50
|
+
const diagnose = (draft) => deriveDiagnostics(draft, {
|
|
51
|
+
...(options.schemas === undefined ? {} : { schemas: options.schemas }),
|
|
52
|
+
actions: options.actions ?? []
|
|
53
|
+
});
|
|
38
54
|
function refresh(draft) {
|
|
39
|
-
const diagnostics =
|
|
40
|
-
schemas: options.schemas ?? [],
|
|
41
|
-
actions: options.actions ?? []
|
|
42
|
-
});
|
|
55
|
+
const diagnostics = diagnose(draft);
|
|
43
56
|
preview.update(draft, diagnostics);
|
|
44
57
|
for (const listener of [...listeners])
|
|
45
58
|
listener(draft, diagnostics);
|
|
@@ -71,20 +84,39 @@ export function createDesigner(container, options = {}) {
|
|
|
71
84
|
setReadOnly(true);
|
|
72
85
|
return {
|
|
73
86
|
getDraft: () => cloneDraft(store.get()),
|
|
87
|
+
getDiagnostics: () => diagnose(store.get()),
|
|
74
88
|
setReadOnly,
|
|
75
89
|
loadWidget(definition) {
|
|
76
|
-
const errors = checkDefinition(definition);
|
|
90
|
+
const errors = checkDefinition(definition, store.get().kind);
|
|
77
91
|
if (errors.length > 0)
|
|
78
92
|
return { ok: false, errors };
|
|
79
93
|
applyDefinition(store, definition);
|
|
80
94
|
return { ok: true };
|
|
81
95
|
},
|
|
96
|
+
checkWidget(definition) {
|
|
97
|
+
const errors = checkDefinition(definition, store.get().kind);
|
|
98
|
+
if (errors.length > 0)
|
|
99
|
+
return { ok: false, errors };
|
|
100
|
+
const { kind, template, descriptor, load } = definition;
|
|
101
|
+
return { ok: true, diagnostics: diagnose({ kind, template, descriptor, ...(load === undefined ? {} : { load }) }) };
|
|
102
|
+
},
|
|
82
103
|
loadTheme(theme) {
|
|
83
104
|
const validated = validateTheme(theme);
|
|
84
105
|
if (!validated.ok) {
|
|
85
106
|
return { ok: false, errors: [validated.error.message] };
|
|
86
107
|
}
|
|
87
|
-
|
|
108
|
+
// Tokens layer over the person's chosen preview theme, which stays
|
|
109
|
+
// chosen with its shared styles, so `{}` returns to it exactly. With
|
|
110
|
+
// nothing chosen they are the whole preview theme.
|
|
111
|
+
store.update((draft) => {
|
|
112
|
+
const { themeStyles: _previous, ...rest } = draft;
|
|
113
|
+
const chosen = options.themes?.find((entry) => entry.name === draft.previewTheme);
|
|
114
|
+
return {
|
|
115
|
+
...rest,
|
|
116
|
+
theme: { ...(chosen?.tokens ?? {}), ...validated.theme },
|
|
117
|
+
...(chosen?.styles === undefined ? {} : { themeStyles: chosen.styles })
|
|
118
|
+
};
|
|
119
|
+
});
|
|
88
120
|
return { ok: true };
|
|
89
121
|
},
|
|
90
122
|
subscribe(listener) {
|
package/dist/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { WidgetDescriptorInput } from "@widgentic/core";
|
|
8
8
|
import type { WidgetTemplate } from "@widgentic/core";
|
|
9
|
-
import type { WidgetTheme } from "@widgentic/core";
|
|
9
|
+
import type { WidgetStyles, WidgetTheme } from "@widgentic/core";
|
|
10
10
|
import type { ActionBinding } from "@widgentic/core";
|
|
11
11
|
/** The draft being designed — the server's `CustomWidget` shape plus session extras. */
|
|
12
12
|
export interface WidgetDraft {
|
|
@@ -26,6 +26,14 @@ export interface WidgetDraft {
|
|
|
26
26
|
sampleData?: unknown;
|
|
27
27
|
/** Preview theme (also the theme-designer working copy). */
|
|
28
28
|
theme?: WidgetTheme;
|
|
29
|
+
/** The preview theme's shared styles; preview-only, never exported. */
|
|
30
|
+
themeStyles?: WidgetStyles;
|
|
31
|
+
/**
|
|
32
|
+
* The supplied theme the person chose for the preview, by name; `theme`
|
|
33
|
+
* is its tokens with any programmatic tokens layered over them.
|
|
34
|
+
* Preview-only, never exported.
|
|
35
|
+
*/
|
|
36
|
+
previewTheme?: string;
|
|
29
37
|
}
|
|
30
38
|
export type DraftListener = (draft: WidgetDraft) => void;
|
|
31
39
|
export interface DraftStore {
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,UAAU,EAAE,qBAAqB,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,uEAAuE;IACvE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAIzD,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,WAAW,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC;IAC3D,yDAAyD;IACzD,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC;IAChB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAAC;CAChD;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAE1D;AAED,wBAAgB,YAAY,IAAI,WAAW,CA4B1C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAkClE"}
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAuCA,MAAM,UAAU,GAAG,EAAE,CAAC;AAYtB,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAgB,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,mEAAmE;IACnE,oEAAoE;IACpE,2DAA2D;IAC3D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE;YACR,GAAG,EAAE,KAAK;YACV,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;YAC/B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC9E;QACD,UAAU,EAAE;YACV,WAAW,EAAE,mCAAmC;YAChD,SAAS,EAAE,qBAAqB;YAChC,WAAW,EAAE;gBACX,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,mCAAmC;aAC7C;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,SAAS,CAAC;gBACrB,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE3C,SAAS,MAAM;QACb,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,MAAM,CAAC,OAAO;YACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU;gBAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YACjD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC;QACX,CAAC;QACD,OAAO,CAAC,KAAK;YACX,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC;QACX,CAAC;QACD,IAAI;YACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACzC,OAAO,GAAG,QAAQ,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WidgetStyles } from "@widgentic/core";
|
|
2
|
+
import type { StyleIssue } from "./validate.js";
|
|
3
|
+
export interface StylesPanel {
|
|
4
|
+
element: HTMLElement;
|
|
5
|
+
/** Reflect a value set elsewhere; the JSON view keeps a focused edit. */
|
|
6
|
+
setValue(styles: WidgetStyles | undefined): void;
|
|
7
|
+
setIssues(issues: StyleIssue[]): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createStylesPanel(initial: WidgetStyles | undefined, onChange: (styles: WidgetStyles | undefined) => void): StylesPanel;
|
|
10
|
+
//# sourceMappingURL=styles-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles-panel.d.ts","sourceRoot":"","sources":["../src/styles-panel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;CACvC;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,GACnD,WAAW,CAsEb"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The styles panel both designers mount — a widget's descriptor styles and
|
|
3
|
+
* a theme's shared styles are one shape under one rule set, so they get one
|
|
4
|
+
* editor: the structured Tree and a parse-gated JSON view over the same
|
|
5
|
+
* value, plus the audit's list of entries the renderer would drop.
|
|
6
|
+
*/
|
|
7
|
+
import { isStyleMap } from "@widgentic/core";
|
|
8
|
+
import { diagnosticLine, h, requireChild, section, tabs, textArea } from "./dom.js";
|
|
9
|
+
import { attachJsonHighlight, repaintHighlight } from "./highlight.js";
|
|
10
|
+
import { errorMessage } from "./internal.js";
|
|
11
|
+
import { createStylesEditor } from "./styles-editor.js";
|
|
12
|
+
export function createStylesPanel(initial, onChange) {
|
|
13
|
+
// The two views keep each other in step: an edit in one reaches the
|
|
14
|
+
// other before the host hears of it, whatever the host refreshes.
|
|
15
|
+
const tree = createStylesEditor(initial, (styles) => {
|
|
16
|
+
showJson(styles);
|
|
17
|
+
onChange(styles);
|
|
18
|
+
});
|
|
19
|
+
const parseError = diagnosticLine(undefined);
|
|
20
|
+
// No legend — the section title already names the shape.
|
|
21
|
+
const field = textArea("", initial === undefined ? "" : JSON.stringify(initial, null, 2), (text) => {
|
|
22
|
+
if (text.trim() === "") {
|
|
23
|
+
parseError.hidden = true;
|
|
24
|
+
tree.setValue(undefined);
|
|
25
|
+
onChange(undefined);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const value = JSON.parse(text);
|
|
30
|
+
parseError.hidden = true;
|
|
31
|
+
parseError.textContent = "";
|
|
32
|
+
// Last valid wins: only the styles shape reaches the value, and an
|
|
33
|
+
// empty map is no styles, as the Tree view has it.
|
|
34
|
+
if (!isStyleMap(value)) {
|
|
35
|
+
parseError.hidden = false;
|
|
36
|
+
parseError.textContent =
|
|
37
|
+
"Styles must map selectors to objects of property/value strings (the last valid value is kept).";
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const next = Object.keys(value).length > 0 ? value : undefined;
|
|
41
|
+
tree.setValue(next);
|
|
42
|
+
onChange(next);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
parseError.hidden = false;
|
|
46
|
+
parseError.textContent = `Invalid JSON (the last valid value is kept): ${errorMessage(error)}`;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const area = requireChild(field, "textarea");
|
|
50
|
+
attachJsonHighlight(area);
|
|
51
|
+
function showJson(styles) {
|
|
52
|
+
if (document.activeElement === area)
|
|
53
|
+
return;
|
|
54
|
+
area.value = styles === undefined ? "" : JSON.stringify(styles, null, 2);
|
|
55
|
+
repaintHighlight(area); // programmatic writes fire no input event
|
|
56
|
+
// The text now shown is valid: an earlier parse error no longer applies.
|
|
57
|
+
parseError.hidden = true;
|
|
58
|
+
parseError.textContent = "";
|
|
59
|
+
}
|
|
60
|
+
const issues = h("div");
|
|
61
|
+
const element = section("Styles (.wg- selectors only)", [
|
|
62
|
+
tabs([
|
|
63
|
+
{ label: "Tree", element: tree.element },
|
|
64
|
+
{ label: "JSON", element: h("div", undefined, [field, parseError]) }
|
|
65
|
+
]),
|
|
66
|
+
issues
|
|
67
|
+
]);
|
|
68
|
+
return {
|
|
69
|
+
element,
|
|
70
|
+
setValue(styles) {
|
|
71
|
+
tree.setValue(styles);
|
|
72
|
+
showJson(styles);
|
|
73
|
+
},
|
|
74
|
+
setIssues(list) {
|
|
75
|
+
issues.replaceChildren(...list.map((issue) => diagnosticLine(`${issue.selector}${issue.property ? ` → ${issue.property}` : ""}: ${issue.message}`)));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=styles-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles-panel.js","sourceRoot":"","sources":["../src/styles-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-panel.d.ts","sourceRoot":"","sources":["../src/template-panel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template-panel.d.ts","sourceRoot":"","sources":["../src/template-panel.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAqHzD,yEAAyE;AACzE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACvC;AAWD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE,EAC5C,OAAO,GAAE,oBAAyB,GACjC;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpE,OAAO,IAAI,IAAI,CAAC;CACjB,CAo6BA"}
|