@widgentic/designer 0.1.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/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/action-designer.d.ts +35 -0
- package/dist/action-designer.d.ts.map +1 -0
- package/dist/action-designer.js +294 -0
- package/dist/action-designer.js.map +1 -0
- package/dist/action-editor.d.ts +49 -0
- package/dist/action-editor.d.ts.map +1 -0
- package/dist/action-editor.js +515 -0
- package/dist/action-editor.js.map +1 -0
- package/dist/browser/widgentic-designer.js +433 -0
- package/dist/browser/widgentic-designer.js.map +7 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +12 -0
- package/dist/browser.js.map +1 -0
- package/dist/dom.d.ts +37 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +387 -0
- package/dist/dom.js.map +1 -0
- package/dist/element.d.ts +12 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +131 -0
- package/dist/element.js.map +1 -0
- package/dist/highlight.d.ts +30 -0
- package/dist/highlight.d.ts.map +1 -0
- package/dist/highlight.js +123 -0
- package/dist/highlight.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +10 -0
- package/dist/internal.js.map +1 -0
- package/dist/io.d.ts +32 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +155 -0
- package/dist/io.js.map +1 -0
- package/dist/json-tree-editor.d.ts +8 -0
- package/dist/json-tree-editor.d.ts.map +1 -0
- package/dist/json-tree-editor.js +186 -0
- package/dist/json-tree-editor.js.map +1 -0
- package/dist/panels.d.ts +13 -0
- package/dist/panels.d.ts.map +1 -0
- package/dist/panels.js +414 -0
- package/dist/panels.js.map +1 -0
- package/dist/preview.d.ts +40 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +138 -0
- package/dist/preview.js.map +1 -0
- package/dist/record-editor.d.ts +11 -0
- package/dist/record-editor.d.ts.map +1 -0
- package/dist/record-editor.js +70 -0
- package/dist/record-editor.js.map +1 -0
- package/dist/schema-builder.d.ts +8 -0
- package/dist/schema-builder.d.ts.map +1 -0
- package/dist/schema-builder.js +235 -0
- package/dist/schema-builder.js.map +1 -0
- package/dist/schema-designer.d.ts +33 -0
- package/dist/schema-designer.d.ts.map +1 -0
- package/dist/schema-designer.js +251 -0
- package/dist/schema-designer.js.map +1 -0
- package/dist/schema-form.d.ts +8 -0
- package/dist/schema-form.d.ts.map +1 -0
- package/dist/schema-form.js +181 -0
- package/dist/schema-form.js.map +1 -0
- package/dist/schema-paths.d.ts +18 -0
- package/dist/schema-paths.d.ts.map +1 -0
- package/dist/schema-paths.js +75 -0
- package/dist/schema-paths.js.map +1 -0
- package/dist/seed.d.ts +18 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +299 -0
- package/dist/seed.js.map +1 -0
- package/dist/shell.d.ts +59 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +102 -0
- package/dist/shell.js.map +1 -0
- package/dist/store.d.ts +44 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +71 -0
- package/dist/store.js.map +1 -0
- package/dist/styles-editor.d.ts +8 -0
- package/dist/styles-editor.d.ts.map +1 -0
- package/dist/styles-editor.js +100 -0
- package/dist/styles-editor.js.map +1 -0
- package/dist/template-panel.d.ts +19 -0
- package/dist/template-panel.d.ts.map +1 -0
- package/dist/template-panel.js +585 -0
- package/dist/template-panel.js.map +1 -0
- package/dist/theme-designer.d.ts +35 -0
- package/dist/theme-designer.d.ts.map +1 -0
- package/dist/theme-designer.js +336 -0
- package/dist/theme-designer.js.map +1 -0
- package/dist/theme-panel.d.ts +20 -0
- package/dist/theme-panel.d.ts.map +1 -0
- package/dist/theme-panel.js +96 -0
- package/dist/theme-panel.js.map +1 -0
- package/dist/validate.d.ts +57 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +131 -0
- package/dist/validate.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ThemeEntry } from "@widgentic/core";
|
|
2
|
+
import type { PreviewWidget } from "./preview.js";
|
|
3
|
+
export interface ThemeDesignerOptions {
|
|
4
|
+
initialTheme?: ThemeEntry;
|
|
5
|
+
appearance?: "auto" | "light" | "dark";
|
|
6
|
+
/**
|
|
7
|
+
* Custom widget definitions to offer in the preview-kind selector
|
|
8
|
+
* beside the built-ins — a theme is judged against the widgets it will
|
|
9
|
+
* actually dress. Invalid definitions are skipped.
|
|
10
|
+
*/
|
|
11
|
+
widgets?: PreviewWidget[];
|
|
12
|
+
/**
|
|
13
|
+
* Mount with editing disabled: panels stay visible but inert, only the
|
|
14
|
+
* preview and its kind selector operate. Toggle later via `setReadOnly`.
|
|
15
|
+
*/
|
|
16
|
+
readOnly?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type ThemeLoadResult = {
|
|
19
|
+
ok: true;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
errors: string[];
|
|
23
|
+
};
|
|
24
|
+
export interface ThemeDesignerHandle {
|
|
25
|
+
getTheme(): ThemeEntry;
|
|
26
|
+
loadTheme(entry: unknown): ThemeLoadResult;
|
|
27
|
+
/** Disable/enable editing; the preview and kind selector stay live. */
|
|
28
|
+
setReadOnly(readOnly: boolean): void;
|
|
29
|
+
subscribe(listener: (entry: ThemeEntry) => void): () => void;
|
|
30
|
+
dispose(): void;
|
|
31
|
+
}
|
|
32
|
+
/** Validate an untrusted entry; errors instead of throwing. */
|
|
33
|
+
export declare function checkThemeEntry(entry: unknown): string[];
|
|
34
|
+
export declare function createThemeDesigner(container: Element, options?: ThemeDesignerOptions): ThemeDesignerHandle;
|
|
35
|
+
//# sourceMappingURL=theme-designer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-designer.d.ts","sourceRoot":"","sources":["../src/theme-designer.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiBlD,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,UAAU,CAAC;IACvB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAAC;IAC3C,uEAAuE;IACvE,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7D,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAcxD;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAmUrB"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone theme designer: edits a NAMED theme entry
|
|
3
|
+
* (`{ name, label?, description?, tokens }` — the theme registry's shape,
|
|
4
|
+
* which is also what a host persists) with live preview against any
|
|
5
|
+
* catalog kind.
|
|
6
|
+
*
|
|
7
|
+
* Split from the widget designer on purpose: an app routes to "design a
|
|
8
|
+
* theme" and "design a widget" as separate destinations, and a host
|
|
9
|
+
* embedding one should not ship the other. Both share the preview
|
|
10
|
+
* controller, chrome, and store discipline.
|
|
11
|
+
*/
|
|
12
|
+
import { errorMessage } from "./internal.js";
|
|
13
|
+
import { createCatalog } from "@widgentic/core";
|
|
14
|
+
import { THEME_TOKENS, TOKEN_DEFAULTS, TOKEN_SPECS, isSafeTokenValue, validateTheme } from "@widgentic/core";
|
|
15
|
+
import { diagnosticLine, h, injectDesignerStyles, section, textField, requireChild } from "./dom.js";
|
|
16
|
+
import { createPreview } from "./preview.js";
|
|
17
|
+
import { starterDraft } from "./store.js";
|
|
18
|
+
const BASE_KINDS = createCatalog().kinds();
|
|
19
|
+
/** Hex form the native color input accepts. */
|
|
20
|
+
const HEX = /^#[0-9a-f]{3}([0-9a-f]{3})?$/i;
|
|
21
|
+
const CUSTOM_NAME = /^x-[a-z0-9][a-z0-9-]*$/;
|
|
22
|
+
function toHexInput(value) {
|
|
23
|
+
if (!HEX.test(value))
|
|
24
|
+
return undefined;
|
|
25
|
+
if (value.length === 7)
|
|
26
|
+
return value.toLowerCase();
|
|
27
|
+
const [, r, g, b] = value.toLowerCase();
|
|
28
|
+
return `#${r}${r}${g}${g}${b}${b}`;
|
|
29
|
+
}
|
|
30
|
+
function starterEntry() {
|
|
31
|
+
return { name: "my-theme", label: "My theme", tokens: {} };
|
|
32
|
+
}
|
|
33
|
+
/** Validate an untrusted entry; errors instead of throwing. */
|
|
34
|
+
export function checkThemeEntry(entry) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
|
|
37
|
+
return ["Theme entry must be an object."];
|
|
38
|
+
}
|
|
39
|
+
const candidate = entry;
|
|
40
|
+
if (typeof candidate.name !== "string" || candidate.name.trim() === "") {
|
|
41
|
+
errors.push("'name' must be a non-empty string.");
|
|
42
|
+
}
|
|
43
|
+
const validated = validateTheme(candidate.tokens ?? {});
|
|
44
|
+
if (!validated.ok) {
|
|
45
|
+
errors.push(`tokens: ${validated.error.code} — ${validated.error.message}`);
|
|
46
|
+
}
|
|
47
|
+
return errors;
|
|
48
|
+
}
|
|
49
|
+
export function createThemeDesigner(container, options = {}) {
|
|
50
|
+
injectDesignerStyles(document);
|
|
51
|
+
let entry = options.initialTheme
|
|
52
|
+
? JSON.parse(JSON.stringify(options.initialTheme))
|
|
53
|
+
: starterEntry();
|
|
54
|
+
const listeners = new Set();
|
|
55
|
+
const preview = createPreview(options.widgets ? { widgets: options.widgets } : {});
|
|
56
|
+
// Built-ins plus whatever custom definitions the host supplied.
|
|
57
|
+
const previewKinds = preview.kinds.length > 0 ? preview.kinds : BASE_KINDS;
|
|
58
|
+
let previewKind = previewKinds[0] ?? "card";
|
|
59
|
+
const panels = h("div", { class: "wgd-panels" });
|
|
60
|
+
const side = h("div", { class: "wgd-side" }, [preview.pane]);
|
|
61
|
+
const root = h("div", { class: "wgd-root wgd-theme-designer" }, [panels, side]);
|
|
62
|
+
if (options.appearance === "light" || options.appearance === "dark") {
|
|
63
|
+
root.setAttribute("data-wgd-theme", options.appearance);
|
|
64
|
+
}
|
|
65
|
+
container.appendChild(root);
|
|
66
|
+
/** A draft carrying only what the preview needs: kind + this theme. */
|
|
67
|
+
function previewDraft() {
|
|
68
|
+
return { ...starterDraft(), theme: entry.tokens };
|
|
69
|
+
}
|
|
70
|
+
function refresh() {
|
|
71
|
+
preview.update(previewDraft(), { styles: [], previewable: true }, previewKind);
|
|
72
|
+
for (const listener of [...listeners])
|
|
73
|
+
listener(getEntry());
|
|
74
|
+
}
|
|
75
|
+
function getEntry() {
|
|
76
|
+
return JSON.parse(JSON.stringify(entry));
|
|
77
|
+
}
|
|
78
|
+
function setToken(key, value) {
|
|
79
|
+
const tokens = { ...entry.tokens };
|
|
80
|
+
if (value === "")
|
|
81
|
+
delete tokens[key];
|
|
82
|
+
else
|
|
83
|
+
tokens[key] = value;
|
|
84
|
+
entry = { ...entry, tokens: tokens };
|
|
85
|
+
refresh();
|
|
86
|
+
}
|
|
87
|
+
// --- Identity panel ----------------------------------------------------
|
|
88
|
+
/** Bind a text field and register its refresher (import must update it). */
|
|
89
|
+
const identityRefreshers = [];
|
|
90
|
+
function identityField(label, read, write) {
|
|
91
|
+
const field = textField(label, read(), write);
|
|
92
|
+
const input = requireChild(field, "input");
|
|
93
|
+
identityRefreshers.push(() => {
|
|
94
|
+
if (document.activeElement !== input)
|
|
95
|
+
input.value = read();
|
|
96
|
+
});
|
|
97
|
+
return field;
|
|
98
|
+
}
|
|
99
|
+
const identity = section("Theme", [
|
|
100
|
+
identityField("Name (id)", () => entry.name, (value) => {
|
|
101
|
+
entry = { ...entry, name: value };
|
|
102
|
+
refresh();
|
|
103
|
+
}),
|
|
104
|
+
identityField("Label", () => entry.label ?? "", (value) => {
|
|
105
|
+
entry = { ...entry, label: value };
|
|
106
|
+
refresh();
|
|
107
|
+
}),
|
|
108
|
+
identityField("Description", () => entry.description ?? "", (value) => {
|
|
109
|
+
entry = { ...entry, description: value };
|
|
110
|
+
refresh();
|
|
111
|
+
})
|
|
112
|
+
]);
|
|
113
|
+
// The kind selector is a PREVIEW control, so it lives beside the
|
|
114
|
+
// preview, outside the editing panels — read-only mode keeps it live.
|
|
115
|
+
const kindSelect = h("select", {
|
|
116
|
+
class: "wgd-select wgd-preview-kind"
|
|
117
|
+
});
|
|
118
|
+
for (const kind of previewKinds) {
|
|
119
|
+
kindSelect.append(h("option", { value: kind }, [kind]));
|
|
120
|
+
}
|
|
121
|
+
kindSelect.value = previewKind;
|
|
122
|
+
kindSelect.addEventListener("change", () => {
|
|
123
|
+
previewKind = kindSelect.value;
|
|
124
|
+
refresh();
|
|
125
|
+
});
|
|
126
|
+
side.prepend(h("div", { class: "wgd-row" }, [
|
|
127
|
+
h("span", { class: "wgd-field-label" }, ["Preview kind"]),
|
|
128
|
+
kindSelect
|
|
129
|
+
]));
|
|
130
|
+
// --- Token panel -------------------------------------------------------
|
|
131
|
+
const tokenRefreshers = [];
|
|
132
|
+
const tokenRows = [];
|
|
133
|
+
for (const token of THEME_TOKENS) {
|
|
134
|
+
const input = h("input", {
|
|
135
|
+
type: "text",
|
|
136
|
+
class: "wgd-input",
|
|
137
|
+
placeholder: TOKEN_DEFAULTS[token]
|
|
138
|
+
});
|
|
139
|
+
input.value = entry.tokens[token] ?? "";
|
|
140
|
+
const issue = diagnosticLine(undefined);
|
|
141
|
+
// Control choice comes from the token's declared type — no guessing.
|
|
142
|
+
const swatch = TOKEN_SPECS[token].type === "color"
|
|
143
|
+
? (h("input", {
|
|
144
|
+
type: "color",
|
|
145
|
+
class: "wgd-swatch",
|
|
146
|
+
title: `Pick --wg-${token}`
|
|
147
|
+
}))
|
|
148
|
+
: undefined;
|
|
149
|
+
const paint = (value) => {
|
|
150
|
+
const effective = value === "" ? TOKEN_DEFAULTS[token] : value;
|
|
151
|
+
if (swatch !== undefined) {
|
|
152
|
+
const hex = toHexInput(effective);
|
|
153
|
+
if (hex !== undefined)
|
|
154
|
+
swatch.value = hex;
|
|
155
|
+
swatch.style.background = isSafeTokenValue(effective) ? effective : "transparent";
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
paint(input.value);
|
|
159
|
+
swatch?.addEventListener("input", () => {
|
|
160
|
+
input.value = swatch.value;
|
|
161
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
162
|
+
});
|
|
163
|
+
input.addEventListener("input", () => {
|
|
164
|
+
const unsafe = input.value !== "" && !isSafeTokenValue(input.value);
|
|
165
|
+
issue.hidden = !unsafe;
|
|
166
|
+
issue.textContent = unsafe
|
|
167
|
+
? "INVALID_TOKEN_VALUE: unsafe value withheld from the preview (no ;{}<> url() expression())."
|
|
168
|
+
: "";
|
|
169
|
+
paint(input.value);
|
|
170
|
+
setToken(token, input.value);
|
|
171
|
+
});
|
|
172
|
+
tokenRefreshers.push(() => {
|
|
173
|
+
if (document.activeElement !== input) {
|
|
174
|
+
input.value = entry.tokens[token] ?? "";
|
|
175
|
+
paint(input.value);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
tokenRows.push(h("div", undefined, [
|
|
179
|
+
h("label", { class: "wgd-field", title: TOKEN_SPECS[token].use }, [
|
|
180
|
+
h("span", { class: "wgd-field-label" }, [`--wg-${token}`]),
|
|
181
|
+
h("div", { class: "wgd-token-row" }, swatch === undefined ? [input] : [input, swatch])
|
|
182
|
+
]),
|
|
183
|
+
issue
|
|
184
|
+
]));
|
|
185
|
+
}
|
|
186
|
+
const tokenPanel = section("Tokens", tokenRows);
|
|
187
|
+
// --- Custom variables --------------------------------------------------
|
|
188
|
+
const customHost = h("div", { class: "wgd-jt-children" });
|
|
189
|
+
const customError = diagnosticLine(undefined);
|
|
190
|
+
function customEntries() {
|
|
191
|
+
return Object.entries(entry.tokens).filter(([key]) => CUSTOM_NAME.test(key));
|
|
192
|
+
}
|
|
193
|
+
function renderCustom() {
|
|
194
|
+
const rows = customEntries().map(([key, value]) => {
|
|
195
|
+
const nameInput = h("input", {
|
|
196
|
+
type: "text",
|
|
197
|
+
class: "wgd-input wgd-jt-keyinput"
|
|
198
|
+
});
|
|
199
|
+
nameInput.value = key;
|
|
200
|
+
nameInput.addEventListener("change", () => {
|
|
201
|
+
const next = nameInput.value;
|
|
202
|
+
if (!CUSTOM_NAME.test(next)) {
|
|
203
|
+
customError.hidden = false;
|
|
204
|
+
customError.textContent = `'${next}' is not a valid custom name — use x-<lowercase-kebab>.`;
|
|
205
|
+
nameInput.value = key;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
customError.hidden = true;
|
|
209
|
+
const tokens = { ...entry.tokens };
|
|
210
|
+
delete tokens[key];
|
|
211
|
+
tokens[next] = value;
|
|
212
|
+
entry = { ...entry, tokens: tokens };
|
|
213
|
+
renderCustom();
|
|
214
|
+
refresh();
|
|
215
|
+
});
|
|
216
|
+
const valueInput = h("input", {
|
|
217
|
+
type: "text",
|
|
218
|
+
class: "wgd-input"
|
|
219
|
+
});
|
|
220
|
+
valueInput.value = value;
|
|
221
|
+
valueInput.addEventListener("input", () => setToken(key, valueInput.value));
|
|
222
|
+
const remove = h("button", { class: "wgd-icon", type: "button", title: "Remove" }, ["✕"]);
|
|
223
|
+
remove.addEventListener("click", () => {
|
|
224
|
+
setToken(key, "");
|
|
225
|
+
renderCustom();
|
|
226
|
+
});
|
|
227
|
+
return h("div", { class: "wgd-attr-row" }, [nameInput, valueInput, remove]);
|
|
228
|
+
});
|
|
229
|
+
const add = h("button", { class: "wgd-button wgd-add", type: "button" }, [
|
|
230
|
+
"+ variable"
|
|
231
|
+
]);
|
|
232
|
+
add.addEventListener("click", () => {
|
|
233
|
+
let name = "x-custom";
|
|
234
|
+
for (let i = 1; name in entry.tokens; i++)
|
|
235
|
+
name = `x-custom${i}`;
|
|
236
|
+
setToken(name, "0");
|
|
237
|
+
renderCustom();
|
|
238
|
+
});
|
|
239
|
+
customHost.replaceChildren(...rows, h("div", { class: "wgd-toolbar" }, [add]));
|
|
240
|
+
}
|
|
241
|
+
renderCustom();
|
|
242
|
+
const customPanel = section("Custom variables (--wg-x-*)", [
|
|
243
|
+
customHost,
|
|
244
|
+
customError
|
|
245
|
+
]);
|
|
246
|
+
// --- Import / export ---------------------------------------------------
|
|
247
|
+
const output = h("textarea", {
|
|
248
|
+
class: "wgd-textarea",
|
|
249
|
+
rows: "8",
|
|
250
|
+
readonly: "",
|
|
251
|
+
spellcheck: "false"
|
|
252
|
+
});
|
|
253
|
+
const exportButton = h("button", { class: "wgd-button wgd-add", type: "button" }, [
|
|
254
|
+
"Export theme entry"
|
|
255
|
+
]);
|
|
256
|
+
exportButton.addEventListener("click", () => {
|
|
257
|
+
output.value = JSON.stringify(getEntry(), null, 2);
|
|
258
|
+
});
|
|
259
|
+
const importArea = h("textarea", {
|
|
260
|
+
class: "wgd-textarea",
|
|
261
|
+
rows: "5",
|
|
262
|
+
spellcheck: "false"
|
|
263
|
+
});
|
|
264
|
+
const importError = diagnosticLine(undefined);
|
|
265
|
+
const importButton = h("button", { class: "wgd-button", type: "button" }, ["Import"]);
|
|
266
|
+
importButton.addEventListener("click", () => {
|
|
267
|
+
let parsed;
|
|
268
|
+
try {
|
|
269
|
+
parsed = JSON.parse(importArea.value);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
importError.hidden = false;
|
|
273
|
+
importError.textContent = `Invalid JSON: ${errorMessage(error)}`;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const result = loadTheme(parsed);
|
|
277
|
+
importError.hidden = result.ok;
|
|
278
|
+
importError.textContent = result.ok ? "" : result.errors.join("\n");
|
|
279
|
+
});
|
|
280
|
+
// Two independent sections, import first — the same shape the widget
|
|
281
|
+
// designer uses, so both designers read alike.
|
|
282
|
+
const importPanel = section("Import", [
|
|
283
|
+
h("span", { class: "wgd-field-label" }, ["Import theme entry JSON"]),
|
|
284
|
+
importArea,
|
|
285
|
+
importError,
|
|
286
|
+
h("div", { class: "wgd-row" }, [importButton])
|
|
287
|
+
]);
|
|
288
|
+
const exportPanel = section("Export", [
|
|
289
|
+
h("div", { class: "wgd-toolbar" }, [exportButton]),
|
|
290
|
+
output
|
|
291
|
+
]);
|
|
292
|
+
exportPanel.classList.add("wgd-view-only");
|
|
293
|
+
panels.append(identity, tokenPanel, customPanel, importPanel, exportPanel);
|
|
294
|
+
function loadTheme(input) {
|
|
295
|
+
const errors = checkThemeEntry(input);
|
|
296
|
+
if (errors.length > 0)
|
|
297
|
+
return { ok: false, errors };
|
|
298
|
+
entry = JSON.parse(JSON.stringify(input));
|
|
299
|
+
for (const refreshIdentity of identityRefreshers)
|
|
300
|
+
refreshIdentity();
|
|
301
|
+
for (const refreshToken of tokenRefreshers)
|
|
302
|
+
refreshToken();
|
|
303
|
+
renderCustom();
|
|
304
|
+
refresh();
|
|
305
|
+
return { ok: true };
|
|
306
|
+
}
|
|
307
|
+
refresh();
|
|
308
|
+
/** Same mechanism as the widget designer: inert the section bodies. */
|
|
309
|
+
function setReadOnly(readOnly) {
|
|
310
|
+
root.classList.toggle("wgd-readonly", readOnly);
|
|
311
|
+
const bodies = [...panels.querySelectorAll(".wgd-section-body")].filter((body) => !body.parentElement?.classList.contains("wgd-view-only"));
|
|
312
|
+
for (const body of bodies) {
|
|
313
|
+
if (readOnly)
|
|
314
|
+
body.setAttribute("inert", "");
|
|
315
|
+
else
|
|
316
|
+
body.removeAttribute("inert");
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (options.readOnly === true)
|
|
320
|
+
setReadOnly(true);
|
|
321
|
+
return {
|
|
322
|
+
getTheme: getEntry,
|
|
323
|
+
loadTheme,
|
|
324
|
+
setReadOnly,
|
|
325
|
+
subscribe(listener) {
|
|
326
|
+
listeners.add(listener);
|
|
327
|
+
return () => listeners.delete(listener);
|
|
328
|
+
},
|
|
329
|
+
dispose() {
|
|
330
|
+
listeners.clear();
|
|
331
|
+
preview.dispose();
|
|
332
|
+
root.remove();
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=theme-designer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-designer.js","sourceRoot":"","sources":["../src/theme-designer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview controls in the widget designer: which of the host-supplied
|
|
3
|
+
* named themes the DRAFT renders under — plus a read-only reference of
|
|
4
|
+
* the effective tokens, so style authoring can reach for
|
|
5
|
+
* `var(--wg-…)` by sight instead of memory.
|
|
6
|
+
*
|
|
7
|
+
* Theme *authoring* lives in the standalone theme designer — this panel
|
|
8
|
+
* only selects and displays. There is deliberately no preview-kind
|
|
9
|
+
* selector: the widget designer previews the draft, and previewing
|
|
10
|
+
* arbitrary kinds under a theme is the theme designer's job.
|
|
11
|
+
*/
|
|
12
|
+
import type { ThemeEntry } from "@widgentic/core";
|
|
13
|
+
import type { DraftStore, WidgetDraft } from "./store.js";
|
|
14
|
+
export declare function mountThemePanel(store: DraftStore, refreshers: ((draft: WidgetDraft) => void)[], themes?: ThemeEntry[]): {
|
|
15
|
+
element: HTMLElement;
|
|
16
|
+
/** Show the theme validator's error — this panel owns the value. */
|
|
17
|
+
setDiagnostic(message: string | undefined): void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=theme-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-panel.d.ts","sourceRoot":"","sources":["../src/theme-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE,EAC5C,MAAM,GAAE,UAAU,EAAO,GACxB;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,oEAAoE;IACpE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB,CAmGA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { TOKEN_SPECS } from "@widgentic/core";
|
|
2
|
+
import { diagnosticLine, h, section } from "./dom.js";
|
|
3
|
+
export function mountThemePanel(store, refreshers, themes = []) {
|
|
4
|
+
// Theme validation errors were computed and dropped before this: the
|
|
5
|
+
// panel that owns the offending value showed nothing at all.
|
|
6
|
+
const themeDiag = diagnosticLine(undefined);
|
|
7
|
+
// Theme selector: "none" plus whatever the host supplied.
|
|
8
|
+
const themeSelect = h("select", {
|
|
9
|
+
class: "wgd-select wgd-theme-select"
|
|
10
|
+
});
|
|
11
|
+
themeSelect.append(h("option", { value: "" }, ["(none — defaults)"]));
|
|
12
|
+
for (const entry of themes) {
|
|
13
|
+
themeSelect.append(h("option", { value: entry.name }, [entry.label ?? entry.name]));
|
|
14
|
+
}
|
|
15
|
+
themeSelect.addEventListener("change", () => {
|
|
16
|
+
const entry = themes.find((candidate) => candidate.name === themeSelect.value);
|
|
17
|
+
store.update((draft) => {
|
|
18
|
+
if (entry === undefined) {
|
|
19
|
+
const { theme: _gone, ...rest } = draft;
|
|
20
|
+
return rest;
|
|
21
|
+
}
|
|
22
|
+
return { ...draft, theme: entry.tokens };
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
// Token reference: the EFFECTIVE preview tokens — the selected entry
|
|
26
|
+
// merged over the registry defaults — plus the entry's x-* customs.
|
|
27
|
+
// Types come from TOKEN_SPECS metadata (color → swatch), never inferred.
|
|
28
|
+
const tokenList = h("div", { class: "wgd-token-ref" });
|
|
29
|
+
function renderTokenReference(theme) {
|
|
30
|
+
tokenList.replaceChildren();
|
|
31
|
+
for (const [name, spec] of Object.entries(TOKEN_SPECS)) {
|
|
32
|
+
const value = theme?.[name] ?? spec.default;
|
|
33
|
+
const row = h("div", { class: "wgd-token-ref-row", title: spec.use }, [
|
|
34
|
+
spec.type === "color"
|
|
35
|
+
? h("span", {
|
|
36
|
+
class: "wgd-token-ref-swatch",
|
|
37
|
+
style: `background: ${value}`
|
|
38
|
+
})
|
|
39
|
+
: h("span", { class: "wgd-token-ref-swatch wgd-token-ref-noswatch" }),
|
|
40
|
+
h("code", { class: "wgd-token-ref-name" }, [`--wg-${name}`]),
|
|
41
|
+
h("span", { class: "wgd-token-ref-value" }, [value])
|
|
42
|
+
]);
|
|
43
|
+
tokenList.append(row);
|
|
44
|
+
}
|
|
45
|
+
for (const [name, value] of Object.entries(theme ?? {})) {
|
|
46
|
+
if (!name.startsWith("x-"))
|
|
47
|
+
continue;
|
|
48
|
+
const row = h("div", { class: "wgd-token-ref-row", title: "Custom variable" }, [
|
|
49
|
+
h("span", { class: "wgd-token-ref-swatch wgd-token-ref-noswatch" }),
|
|
50
|
+
h("code", { class: "wgd-token-ref-name" }, [`--wg-${name}`]),
|
|
51
|
+
h("span", { class: "wgd-token-ref-value" }, [value])
|
|
52
|
+
]);
|
|
53
|
+
tokenList.append(row);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
renderTokenReference(store.get().theme);
|
|
57
|
+
refreshers.push((draft) => {
|
|
58
|
+
// Reflect programmatic theme loads; an unrecognized map shows as none.
|
|
59
|
+
if (draft.theme === undefined) {
|
|
60
|
+
themeSelect.value = "";
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const match = themes.find((entry) => JSON.stringify(entry.tokens) === JSON.stringify(draft.theme));
|
|
64
|
+
themeSelect.value = match?.name ?? "";
|
|
65
|
+
}
|
|
66
|
+
renderTokenReference(draft.theme);
|
|
67
|
+
});
|
|
68
|
+
const rows = [
|
|
69
|
+
h("div", { class: "wgd-row" }, [
|
|
70
|
+
h("span", { class: "wgd-field-label" }, ["Preview theme"]),
|
|
71
|
+
themeSelect
|
|
72
|
+
]),
|
|
73
|
+
h("span", { class: "wgd-field-label" }, [
|
|
74
|
+
themes.length === 0
|
|
75
|
+
? "No themes supplied by the host — design themes in the theme designer."
|
|
76
|
+
: "Themes come from the host; edit them in the theme designer."
|
|
77
|
+
]),
|
|
78
|
+
themeDiag,
|
|
79
|
+
h("details", { class: "wgd-token-ref-details" }, [
|
|
80
|
+
h("summary", { class: "wgd-field-label" }, [
|
|
81
|
+
"Theme tokens (reference for styles)"
|
|
82
|
+
]),
|
|
83
|
+
tokenList
|
|
84
|
+
])
|
|
85
|
+
];
|
|
86
|
+
const element = section("Preview", rows);
|
|
87
|
+
return {
|
|
88
|
+
element,
|
|
89
|
+
setDiagnostic(message) {
|
|
90
|
+
themeDiag.hidden = message === undefined;
|
|
91
|
+
themeDiag.textContent = message ?? "";
|
|
92
|
+
},
|
|
93
|
+
dispose: () => element.remove()
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=theme-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-panel.js","sourceRoot":"","sources":["../src/theme-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { WidgetContractError } from "@widgentic/core";
|
|
2
|
+
import type { ThemeError } from "@widgentic/core";
|
|
3
|
+
import type { WidgetDraft } from "./store.js";
|
|
4
|
+
export interface TemplateIssue {
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
/** Node path when the validator reports one. */
|
|
8
|
+
path?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface StyleIssue {
|
|
11
|
+
selector: string;
|
|
12
|
+
property?: string;
|
|
13
|
+
message: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DesignerDiagnostics {
|
|
16
|
+
/** Problem with the kind id itself (empty, or colliding with a base kind). */
|
|
17
|
+
kind?: string;
|
|
18
|
+
template?: TemplateIssue;
|
|
19
|
+
/** `descriptor.dataExample` vs `descriptor.dataSchema`. */
|
|
20
|
+
example?: WidgetContractError;
|
|
21
|
+
/** `sampleData` vs `descriptor.dataSchema`. */
|
|
22
|
+
sample?: WidgetContractError;
|
|
23
|
+
/** Entries the renderer's safety filters would skip. */
|
|
24
|
+
styles: StyleIssue[];
|
|
25
|
+
theme?: ThemeError;
|
|
26
|
+
/** Shared-schema reference problems (unknown ref, or ref + inline). */
|
|
27
|
+
schemaRef?: string;
|
|
28
|
+
/** The widget-level `load` binding failed validation. */
|
|
29
|
+
load?: string;
|
|
30
|
+
/** Shared actions referenced by the template or `load` that are not among the supplied ones. */
|
|
31
|
+
actionRefs?: string;
|
|
32
|
+
/** True when the draft can be registered and previewed. */
|
|
33
|
+
previewable: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Host-supplied shared schemas the draft may reference by name. */
|
|
36
|
+
export interface DeriveOptions {
|
|
37
|
+
schemas?: {
|
|
38
|
+
name: string;
|
|
39
|
+
schema: Record<string, unknown>;
|
|
40
|
+
}[];
|
|
41
|
+
/** Host-supplied shared actions the draft may bind by name. */
|
|
42
|
+
actions?: {
|
|
43
|
+
name: string;
|
|
44
|
+
}[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The schema validation actually runs against: the inline one, or the
|
|
48
|
+
* referenced shared one resolved from the supplied list — the same join
|
|
49
|
+
* the server's composition performs.
|
|
50
|
+
*/
|
|
51
|
+
export declare function effectiveDataSchema(draft: WidgetDraft, schemas?: {
|
|
52
|
+
name: string;
|
|
53
|
+
schema: Record<string, unknown>;
|
|
54
|
+
}[]): Record<string, unknown> | undefined;
|
|
55
|
+
/** Run every validator; total — never throws on any draft shape. */
|
|
56
|
+
export declare function deriveDiagnostics(draft: WidgetDraft, options?: DeriveOptions): DesignerDiagnostics;
|
|
57
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAI3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,wDAAwD;IACxD,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;IAC9D,+DAA+D;IAC/D,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAO,GAChE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAOrC;AA0CD,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,mBAAmB,CAuErB"}
|