@widgentic/designer 0.7.0 → 0.11.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.
Files changed (61) hide show
  1. package/README.md +2 -1
  2. package/dist/browser/widgentic-designer.js +101 -98
  3. package/dist/browser/widgentic-designer.js.map +4 -4
  4. package/dist/browser.d.ts.map +1 -1
  5. package/dist/browser.js +2 -1
  6. package/dist/browser.js.map +1 -1
  7. package/dist/dom.d.ts +5 -0
  8. package/dist/dom.d.ts.map +1 -1
  9. package/dist/dom.js +19 -1
  10. package/dist/dom.js.map +1 -1
  11. package/dist/element.d.ts +9 -0
  12. package/dist/element.d.ts.map +1 -1
  13. package/dist/element.js +55 -0
  14. package/dist/element.js.map +1 -1
  15. package/dist/index.d.ts +7 -5
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/io.d.ts +8 -3
  20. package/dist/io.d.ts.map +1 -1
  21. package/dist/io.js +38 -8
  22. package/dist/io.js.map +1 -1
  23. package/dist/panels.d.ts.map +1 -1
  24. package/dist/panels.js +17 -54
  25. package/dist/panels.js.map +1 -1
  26. package/dist/preview.d.ts.map +1 -1
  27. package/dist/preview.js +23 -6
  28. package/dist/preview.js.map +1 -1
  29. package/dist/schema-designer.d.ts.map +1 -1
  30. package/dist/schema-designer.js +15 -7
  31. package/dist/schema-designer.js.map +1 -1
  32. package/dist/settings-designer.d.ts +37 -0
  33. package/dist/settings-designer.d.ts.map +1 -0
  34. package/dist/settings-designer.js +224 -0
  35. package/dist/settings-designer.js.map +1 -0
  36. package/dist/shell.d.ts +24 -0
  37. package/dist/shell.d.ts.map +1 -1
  38. package/dist/shell.js +39 -7
  39. package/dist/shell.js.map +1 -1
  40. package/dist/store.d.ts +9 -1
  41. package/dist/store.d.ts.map +1 -1
  42. package/dist/store.js.map +1 -1
  43. package/dist/styles-panel.d.ts +10 -0
  44. package/dist/styles-panel.d.ts.map +1 -0
  45. package/dist/styles-panel.js +79 -0
  46. package/dist/styles-panel.js.map +1 -0
  47. package/dist/template-panel.d.ts.map +1 -1
  48. package/dist/template-panel.js +43 -1
  49. package/dist/template-panel.js.map +1 -1
  50. package/dist/theme-designer.d.ts +7 -2
  51. package/dist/theme-designer.d.ts.map +1 -1
  52. package/dist/theme-designer.js +79 -15
  53. package/dist/theme-designer.js.map +1 -1
  54. package/dist/theme-panel.d.ts.map +1 -1
  55. package/dist/theme-panel.js +19 -12
  56. package/dist/theme-panel.js.map +1 -1
  57. package/dist/validate.d.ts +16 -0
  58. package/dist/validate.d.ts.map +1 -1
  59. package/dist/validate.js +38 -7
  60. package/dist/validate.js.map +1 -1
  61. 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;
@@ -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;AAExE,MAAM,WAAW,cAAc;IAC7B,QAAQ,IAAI,WAAW,CAAC;IACxB,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5C,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,CAsGhB"}
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 initial = options.initialTheme !== undefined ? { ...base, theme: options.initialTheme } : base;
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 = deriveDiagnostics(draft, {
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
- store.update((draft) => ({ ...draft, theme: validated.theme }));
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;AA8DlD,MAAM,UAAU,cAAc,CAC5B,SAAkB,EAClB,OAAO,GAAoB,EAAE;IAE7B,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAgB,OAAO,CAAC,aAAa;QAC7C,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1C,CAAC,CAAC,YAAY,EAAE,CAAC;IACnB,MAAM,OAAO,GACX,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,GAAG,EAEtB,CAAC;IAEJ,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IACD,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC;IACF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EACL,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,EAC1C,OAAO,CAAC,MAAM,IAAI,EAAE,EACpB,OAAO,CAAC,OAAO,IAAI,EAAE,EACrB,aAAa,CACd,CAAC;IAEF,SAAS,OAAO,CAAC,KAAkB;QACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,EAAE;YAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;SAC/B,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;YAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAErB;;;;;;OAMG;IACH,SAAS,WAAW,CAAC,QAAiB;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChD,oEAAoE;QACpE,qEAAqE;QACrE,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,gBAAgB,CACtB,mEAAmE,CACpE;SACF,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,QAAQ;gBAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;;gBACxC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAEjD,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACvC,WAAW;QACX,UAAU,CAAC,UAAU;YACnB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpD,eAAe,CAAC,KAAK,EAAE,UAAyC,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,SAAS,CAAC,KAAK;YACb,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,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;QACD,OAAO;YACL,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
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;AAgFlD,MAAM,UAAU,cAAc,CAC5B,SAAkB,EAClB,OAAO,GAAoB,EAAE;IAE7B,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAgB,OAAO,CAAC,aAAa;QAC7C,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1C,CAAC,CAAC,YAAY,EAAE,CAAC;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACzF,MAAM,OAAO,GACX,WAAW,KAAK,SAAS;QACvB,CAAC,CAAC;YACE,GAAG,IAAI;YACP,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,YAAY,EAAE,WAAW,CAAC,IAAI;YAC9B,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;SACjF;QACH,CAAC,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE;YAC1C,CAAC,CAAC,IAAI,CAAC;IACb,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,GAAG,EAEtB,CAAC;IAEJ,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IACD,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC;IACF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EACL,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,EAC1C,OAAO,CAAC,MAAM,IAAI,EAAE,EACpB,OAAO,CAAC,OAAO,IAAI,EAAE,EACrB,aAAa,CACd,CAAC;IAEF,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,QAAQ,GAAG,CAAC,KAAkB,EAAuB,EAAE,CAC3D,iBAAiB,CAAC,KAAK,EAAE;QACvB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC,CAAC;IAEL,SAAS,OAAO,CAAC,KAAkB;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;YAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAErB;;;;;;OAMG;IACH,SAAS,WAAW,CAAC,QAAiB;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChD,oEAAoE;QACpE,qEAAqE;QACrE,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,gBAAgB,CACtB,mEAAmE,CACpE;SACF,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,QAAQ;gBAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;;gBACxC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAEjD,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACvC,cAAc,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3C,WAAW;QACX,UAAU,CAAC,UAAU;YACnB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpD,eAAe,CAAC,KAAK,EAAE,UAAyC,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,WAAW,CAAC,UAAU;YACpB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,UAAyC,CAAC;YACvF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACtH,CAAC;QACD,SAAS,CAAC,KAAK;YACb,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,CAAC;YACD,mEAAmE;YACnE,qEAAqE;YACrE,mDAAmD;YACnD,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;gBAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;gBAClF,OAAO;oBACL,GAAG,IAAI;oBACP,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE;oBACxD,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;iBACxE,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,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;QACD,OAAO;YACL,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
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 {
@@ -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;AACnD,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;CACrB;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"}
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":"AA+BA,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"}
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":"AAsBA,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;AA+GzD,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,CAkxBA"}
1
+ {"version":3,"file":"template-panel.d.ts","sourceRoot":"","sources":["../src/template-panel.ts"],"names":[],"mappings":"AAsBA,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;AA+GzD,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,CAq0BA"}
@@ -347,6 +347,44 @@ export function mountTemplatePanel(store, refreshers, options = {}) {
347
347
  const marker = className.includes("wgd-attr-value") ? " wgd-attr-value" : "";
348
348
  return h("span", { class: `wgd-pathwrap${marker}` }, [select, custom]);
349
349
  }
350
+ /**
351
+ * An `each` node's optional key: the item path that identifies a row, so
352
+ * a reordered list patches by identity. Completions are the item scope's
353
+ * bind paths; the empty choice (or an emptied input) removes the key.
354
+ */
355
+ function keyControl(value, scope, onCommit) {
356
+ const current = value ?? "";
357
+ const commit = (next) => onCommit(next === "" ? undefined : next);
358
+ const title = "Optional item key (e.g. id): a reordered list keeps each item's state";
359
+ const options = isPlainObject(scope) ? pathOptions(scope, "bind") : [];
360
+ if (options.length === 0) {
361
+ const input = changeInput(current, commit, "wgd-input wgd-each-key");
362
+ input.placeholder = "key path";
363
+ input.title = title;
364
+ return input;
365
+ }
366
+ const select = h("select", { class: "wgd-select wgd-each-key", title });
367
+ const known = current === "" || options.includes(current);
368
+ select.append(h("option", { value: "" }, ["no key"]));
369
+ for (const option of known ? options : [current, ...options]) {
370
+ select.append(h("option", { value: option }, [option === current && !known ? `${option} (off-schema)` : option]));
371
+ }
372
+ select.append(h("option", { value: "__custom__" }, ["custom…"]));
373
+ select.value = current;
374
+ fitSelect(select);
375
+ const custom = changeInput(current, commit, "wgd-input wgd-each-key");
376
+ custom.hidden = true;
377
+ select.addEventListener("change", () => {
378
+ if (select.value === "__custom__") {
379
+ custom.hidden = false;
380
+ custom.focus();
381
+ return;
382
+ }
383
+ custom.hidden = true;
384
+ commit(select.value);
385
+ });
386
+ return h("span", { class: "wgd-pathwrap" }, [select, custom]);
387
+ }
350
388
  function tagControl(tag, onCommit) {
351
389
  const select = h("select", { class: "wgd-select wgd-tag" });
352
390
  const options = TAG_OPTIONS.includes(tag) ? TAG_OPTIONS : [tag, ...TAG_OPTIONS];
@@ -439,8 +477,12 @@ export function mountTemplatePanel(store, refreshers, options = {}) {
439
477
  return nodeShell("bind", path, inline, body, errorHere, removable, moves, icons.length > 0 ? { icons } : undefined);
440
478
  }
441
479
  if (typeof node.each === "string") {
480
+ const each = node.each;
481
+ const { each: _each, key: _key, ...rest } = node;
442
482
  return nodeShell("each", path, [
443
- pathControl(node.each, scope, "each", (value) => commitAt(path, { ...node, each: value }))
483
+ pathControl(each, scope, "each", (value) => commitAt(path, { ...node, each: value })),
484
+ h("span", { class: "wgd-st-colon" }, ["key"]),
485
+ keyControl(typeof node.key === "string" ? node.key : undefined, itemScope(scope, each), (key) => commitAt(path, { each, ...(key === undefined ? {} : { key }), ...rest }))
444
486
  ], [
445
487
  // Inside an each, the scope becomes the array's item schema.
446
488
  slotEditor("template", path, "template", node.template, true, errorPath, itemScope(scope, node.each)),