@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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/action-designer.d.ts +35 -0
  4. package/dist/action-designer.d.ts.map +1 -0
  5. package/dist/action-designer.js +294 -0
  6. package/dist/action-designer.js.map +1 -0
  7. package/dist/action-editor.d.ts +49 -0
  8. package/dist/action-editor.d.ts.map +1 -0
  9. package/dist/action-editor.js +515 -0
  10. package/dist/action-editor.js.map +1 -0
  11. package/dist/browser/widgentic-designer.js +433 -0
  12. package/dist/browser/widgentic-designer.js.map +7 -0
  13. package/dist/browser.d.ts +2 -0
  14. package/dist/browser.d.ts.map +1 -0
  15. package/dist/browser.js +12 -0
  16. package/dist/browser.js.map +1 -0
  17. package/dist/dom.d.ts +37 -0
  18. package/dist/dom.d.ts.map +1 -0
  19. package/dist/dom.js +387 -0
  20. package/dist/dom.js.map +1 -0
  21. package/dist/element.d.ts +12 -0
  22. package/dist/element.d.ts.map +1 -0
  23. package/dist/element.js +131 -0
  24. package/dist/element.js.map +1 -0
  25. package/dist/highlight.d.ts +30 -0
  26. package/dist/highlight.d.ts.map +1 -0
  27. package/dist/highlight.js +123 -0
  28. package/dist/highlight.js.map +1 -0
  29. package/dist/index.d.ts +30 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +21 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/internal.d.ts +6 -0
  34. package/dist/internal.d.ts.map +1 -0
  35. package/dist/internal.js +10 -0
  36. package/dist/internal.js.map +1 -0
  37. package/dist/io.d.ts +32 -0
  38. package/dist/io.d.ts.map +1 -0
  39. package/dist/io.js +155 -0
  40. package/dist/io.js.map +1 -0
  41. package/dist/json-tree-editor.d.ts +8 -0
  42. package/dist/json-tree-editor.d.ts.map +1 -0
  43. package/dist/json-tree-editor.js +186 -0
  44. package/dist/json-tree-editor.js.map +1 -0
  45. package/dist/panels.d.ts +13 -0
  46. package/dist/panels.d.ts.map +1 -0
  47. package/dist/panels.js +414 -0
  48. package/dist/panels.js.map +1 -0
  49. package/dist/preview.d.ts +40 -0
  50. package/dist/preview.d.ts.map +1 -0
  51. package/dist/preview.js +138 -0
  52. package/dist/preview.js.map +1 -0
  53. package/dist/record-editor.d.ts +11 -0
  54. package/dist/record-editor.d.ts.map +1 -0
  55. package/dist/record-editor.js +70 -0
  56. package/dist/record-editor.js.map +1 -0
  57. package/dist/schema-builder.d.ts +8 -0
  58. package/dist/schema-builder.d.ts.map +1 -0
  59. package/dist/schema-builder.js +235 -0
  60. package/dist/schema-builder.js.map +1 -0
  61. package/dist/schema-designer.d.ts +33 -0
  62. package/dist/schema-designer.d.ts.map +1 -0
  63. package/dist/schema-designer.js +251 -0
  64. package/dist/schema-designer.js.map +1 -0
  65. package/dist/schema-form.d.ts +8 -0
  66. package/dist/schema-form.d.ts.map +1 -0
  67. package/dist/schema-form.js +181 -0
  68. package/dist/schema-form.js.map +1 -0
  69. package/dist/schema-paths.d.ts +18 -0
  70. package/dist/schema-paths.d.ts.map +1 -0
  71. package/dist/schema-paths.js +75 -0
  72. package/dist/schema-paths.js.map +1 -0
  73. package/dist/seed.d.ts +18 -0
  74. package/dist/seed.d.ts.map +1 -0
  75. package/dist/seed.js +299 -0
  76. package/dist/seed.js.map +1 -0
  77. package/dist/shell.d.ts +59 -0
  78. package/dist/shell.d.ts.map +1 -0
  79. package/dist/shell.js +102 -0
  80. package/dist/shell.js.map +1 -0
  81. package/dist/store.d.ts +44 -0
  82. package/dist/store.d.ts.map +1 -0
  83. package/dist/store.js +71 -0
  84. package/dist/store.js.map +1 -0
  85. package/dist/styles-editor.d.ts +8 -0
  86. package/dist/styles-editor.d.ts.map +1 -0
  87. package/dist/styles-editor.js +100 -0
  88. package/dist/styles-editor.js.map +1 -0
  89. package/dist/template-panel.d.ts +19 -0
  90. package/dist/template-panel.d.ts.map +1 -0
  91. package/dist/template-panel.js +585 -0
  92. package/dist/template-panel.js.map +1 -0
  93. package/dist/theme-designer.d.ts +35 -0
  94. package/dist/theme-designer.d.ts.map +1 -0
  95. package/dist/theme-designer.js +336 -0
  96. package/dist/theme-designer.js.map +1 -0
  97. package/dist/theme-panel.d.ts +20 -0
  98. package/dist/theme-panel.d.ts.map +1 -0
  99. package/dist/theme-panel.js +96 -0
  100. package/dist/theme-panel.js.map +1 -0
  101. package/dist/validate.d.ts +57 -0
  102. package/dist/validate.d.ts.map +1 -0
  103. package/dist/validate.js +131 -0
  104. package/dist/validate.js.map +1 -0
  105. package/package.json +49 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Browser bundle entry (`@widgentic/designer/browser`): loading this module
3
+ * from a <script type="module"> registers the designer custom elements, so a
4
+ * page without a bundler can host the designers. Bundler users import the
5
+ * package root instead.
6
+ */
7
+ import { defineActionDesignerElement, defineDesignerElement, defineSchemaDesignerElement, defineThemeDesignerElement } from "./index.js";
8
+ defineActionDesignerElement();
9
+ defineDesignerElement();
10
+ defineSchemaDesignerElement();
11
+ defineThemeDesignerElement();
12
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEzI,2BAA2B,EAAE,CAAC;AAC9B,qBAAqB,EAAE,CAAC;AACxB,2BAA2B,EAAE,CAAC;AAC9B,0BAA0B,EAAE,CAAC"}
package/dist/dom.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Tiny DOM helpers for the designer chrome — the same hand-rolled
3
+ * discipline as the rest of the project, sized for form-heavy panels.
4
+ * Designer chrome classes are prefixed `wgd-` (widget content inside the
5
+ * preview keeps the normal `wg-` classes).
6
+ */
7
+ export type Child = Node | string;
8
+ /** The first `<selector>` under `parent`, which the caller's own markup guarantees exists. */
9
+ export declare function requireChild<K extends keyof HTMLElementTagNameMap>(parent: ParentNode, selector: K): HTMLElementTagNameMap[K];
10
+ export declare function h<K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string>, children?: Child[]): HTMLElementTagNameMap[K];
11
+ export declare function h(tag: string, attrs?: Record<string, string>, children?: Child[]): HTMLElement;
12
+ /** Labeled single-line input bound through a callback. */
13
+ export declare function textField(label: string, value: string, onInput: (value: string) => void): HTMLElement;
14
+ /** Labeled multi-line textarea bound through a callback. */
15
+ export declare function textArea(label: string, value: string, onInput: (value: string) => void, rows?: number): HTMLElement;
16
+ /** Collapsible titled section (open by default). */
17
+ export declare function section(title: string, children: Child[], open?: boolean): HTMLElement;
18
+ /**
19
+ * Size a select to its SELECTED label (a bare <select> sizes to its
20
+ * widest option, or to whatever flex hands it), so the caret sits beside
21
+ * the text instead of drifting with leftover row width. ch tracks
22
+ * monospace text exactly; the em term scales with padding, and the px
23
+ * term covers the UA's caret region, which does NOT scale with font size
24
+ * (11px selects clip under a pure em term). Re-fits on change.
25
+ */
26
+ export declare function fitSelect(select: HTMLSelectElement): void;
27
+ /**
28
+ * Compact add-menu: one toggle button revealing the options on demand —
29
+ * the tree stays calm instead of carrying a button per option at every
30
+ * level. Closes on pick, outside pointer-down, or Escape.
31
+ */
32
+ export declare function menuButton(label: string, title: string, options: string[], onPick: (option: string) => void): HTMLElement;
33
+ /** Inline diagnostic line (empty text removes it from the flow). */
34
+ export declare function diagnosticLine(text: string | undefined): HTMLElement;
35
+ /** Designer chrome stylesheet — injected once per document. */
36
+ export declare function injectDesignerStyles(doc: Document): void;
37
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAElC,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,qBAAqB,EAChE,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,CAAC,GACV,qBAAqB,CAAC,CAAC,CAAC,CAI1B;AAED,wBAAgB,CAAC,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACrD,GAAG,EAAE,CAAC,EACN,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,QAAQ,CAAC,EAAE,KAAK,EAAE,GACjB,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAC5B,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;AAgBhG,0DAA0D;AAC1D,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,WAAW,CAQb;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,IAAI,SAAI,GACP,WAAW,CAcb;AAED,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,UAAO,GAAG,WAAW,CAOlF;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAC/B,WAAW,CA6Cb;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAIpE;AAID,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CA6PxD"}
package/dist/dom.js ADDED
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Tiny DOM helpers for the designer chrome — the same hand-rolled
3
+ * discipline as the rest of the project, sized for form-heavy panels.
4
+ * Designer chrome classes are prefixed `wgd-` (widget content inside the
5
+ * preview keeps the normal `wg-` classes).
6
+ */
7
+ /** The first `<selector>` under `parent`, which the caller's own markup guarantees exists. */
8
+ export function requireChild(parent, selector) {
9
+ const found = parent.querySelector(selector);
10
+ if (found === null)
11
+ throw new Error(`Designer chrome is missing a <${selector}> element.`);
12
+ return found;
13
+ }
14
+ export function h(tag, attrs, children) {
15
+ const element = document.createElement(tag);
16
+ if (attrs) {
17
+ for (const [name, value] of Object.entries(attrs)) {
18
+ element.setAttribute(name, value);
19
+ }
20
+ }
21
+ if (children) {
22
+ for (const child of children) {
23
+ element.append(child);
24
+ }
25
+ }
26
+ return element;
27
+ }
28
+ /** Labeled single-line input bound through a callback. */
29
+ export function textField(label, value, onInput) {
30
+ const input = h("input", { type: "text", class: "wgd-input" });
31
+ input.value = value;
32
+ input.addEventListener("input", () => onInput(input.value));
33
+ return h("label", { class: "wgd-field" }, [
34
+ h("span", { class: "wgd-field-label" }, [label]),
35
+ input
36
+ ]);
37
+ }
38
+ /** Labeled multi-line textarea bound through a callback. */
39
+ export function textArea(label, value, onInput, rows = 6) {
40
+ const area = h("textarea", {
41
+ class: "wgd-textarea",
42
+ rows: String(rows),
43
+ spellcheck: "false"
44
+ });
45
+ area.value = value;
46
+ area.addEventListener("input", () => onInput(area.value));
47
+ // An empty label means the surrounding chrome already names the field —
48
+ // no legend row.
49
+ return h("label", { class: "wgd-field" }, [
50
+ ...(label === "" ? [] : [h("span", { class: "wgd-field-label" }, [label])]),
51
+ area
52
+ ]);
53
+ }
54
+ /** Collapsible titled section (open by default). */
55
+ export function section(title, children, open = true) {
56
+ const attrs = { class: "wgd-section" };
57
+ if (open)
58
+ attrs.open = "";
59
+ return h("details", attrs, [
60
+ h("summary", { class: "wgd-section-title" }, [title]),
61
+ h("div", { class: "wgd-section-body" }, children)
62
+ ]);
63
+ }
64
+ /**
65
+ * Size a select to its SELECTED label (a bare <select> sizes to its
66
+ * widest option, or to whatever flex hands it), so the caret sits beside
67
+ * the text instead of drifting with leftover row width. ch tracks
68
+ * monospace text exactly; the em term scales with padding, and the px
69
+ * term covers the UA's caret region, which does NOT scale with font size
70
+ * (11px selects clip under a pure em term). Re-fits on change.
71
+ */
72
+ export function fitSelect(select) {
73
+ const fit = () => {
74
+ const label = select.options[select.selectedIndex]?.text ?? select.value;
75
+ select.style.width = `calc(${Math.max(label.length, 1)}ch + 1.2em + 18px)`;
76
+ };
77
+ fit();
78
+ select.addEventListener("change", fit);
79
+ }
80
+ /**
81
+ * Compact add-menu: one toggle button revealing the options on demand —
82
+ * the tree stays calm instead of carrying a button per option at every
83
+ * level. Closes on pick, outside pointer-down, or Escape.
84
+ */
85
+ export function menuButton(label, title, options, onPick) {
86
+ const wrap = h("span", { class: "wgd-menuwrap" });
87
+ const toggle = h("button", { class: "wgd-icon wgd-menu-toggle", type: "button", title }, [label]);
88
+ const menu = h("div", { class: "wgd-menu" });
89
+ menu.hidden = true;
90
+ const close = () => {
91
+ menu.hidden = true;
92
+ document.removeEventListener("pointerdown", onOutside, true);
93
+ document.removeEventListener("keydown", onKey, true);
94
+ };
95
+ const onOutside = (event) => {
96
+ if (!wrap.contains(event.target))
97
+ close();
98
+ };
99
+ const onKey = (event) => {
100
+ if (event.key === "Escape")
101
+ close();
102
+ };
103
+ toggle.addEventListener("click", () => {
104
+ if (!menu.hidden) {
105
+ close();
106
+ return;
107
+ }
108
+ menu.hidden = false;
109
+ document.addEventListener("pointerdown", onOutside, true);
110
+ document.addEventListener("keydown", onKey, true);
111
+ });
112
+ for (const option of options) {
113
+ const item = h("button", { class: "wgd-menu-item", type: "button" }, [option]);
114
+ item.addEventListener("click", () => {
115
+ close();
116
+ onPick(option);
117
+ });
118
+ menu.append(item);
119
+ }
120
+ wrap.append(toggle, menu);
121
+ return wrap;
122
+ }
123
+ /** Inline diagnostic line (empty text removes it from the flow). */
124
+ export function diagnosticLine(text) {
125
+ const el = h("div", { class: "wgd-diagnostic" }, text === undefined ? [] : [text]);
126
+ if (text === undefined)
127
+ el.setAttribute("hidden", "");
128
+ return el;
129
+ }
130
+ const STYLE_MARKER = "data-widgentic-designer";
131
+ /** Designer chrome stylesheet — injected once per document. */
132
+ export function injectDesignerStyles(doc) {
133
+ if (doc.head.querySelector(`style[${STYLE_MARKER}]`))
134
+ return;
135
+ const style = doc.createElement("style");
136
+ style.setAttribute(STYLE_MARKER, "chrome");
137
+ style.textContent = `
138
+ /* Chrome palette — light values, overridden for dark below. Widget
139
+ content inside the preview keeps its own --wg-* theme tokens. */
140
+ .wgd-root {
141
+ --wgd-bg: #ffffff; --wgd-panel: #fbfcfe; --wgd-border: #d5dbe3;
142
+ --wgd-line: #e2e8f0; --wgd-text: #1f2430; --wgd-muted: #5b6472;
143
+ --wgd-accent: #2563eb; --wgd-accent-bg: #e8eef9; --wgd-accent-line: #b9c9e8;
144
+ --wgd-danger: #b91c1c; --wgd-danger-bg: #fdf2f2; --wgd-danger-line: #f0b4b4;
145
+ --wgd-hover: #eef2f7;
146
+ --wgd-hl-key: #0b5fa5; --wgd-hl-str: #0a7a3d; --wgd-hl-num: #b45309;
147
+ --wgd-hl-bool: #7c3aed; --wgd-hl-punct: #7a8494;
148
+ }
149
+ @media (prefers-color-scheme: dark) {
150
+ .wgd-root:not([data-wgd-theme="light"]) {
151
+ --wgd-bg: #0f131c; --wgd-panel: #161b26; --wgd-border: #2a3140;
152
+ --wgd-line: #232a37; --wgd-text: #e5e9f0; --wgd-muted: #96a0b5;
153
+ --wgd-accent: #7aa2f7; --wgd-accent-bg: #1c2740; --wgd-accent-line: #35507f;
154
+ --wgd-danger: #f0a3a3; --wgd-danger-bg: #2a1a1c; --wgd-danger-line: #5c2b2b;
155
+ --wgd-hover: #1e2532;
156
+ --wgd-hl-key: #7aa2f7; --wgd-hl-str: #9ece6a; --wgd-hl-num: #ff9e64;
157
+ --wgd-hl-bool: #bb9af7; --wgd-hl-punct: #8b94a7;
158
+ }
159
+ }
160
+ .wgd-root[data-wgd-theme="dark"] {
161
+ --wgd-bg: #0f131c; --wgd-panel: #161b26; --wgd-border: #2a3140;
162
+ --wgd-line: #232a37; --wgd-text: #e5e9f0; --wgd-muted: #96a0b5;
163
+ --wgd-accent: #7aa2f7; --wgd-accent-bg: #1c2740; --wgd-accent-line: #35507f;
164
+ --wgd-danger: #f0a3a3; --wgd-danger-bg: #2a1a1c; --wgd-danger-line: #5c2b2b;
165
+ --wgd-hover: #1e2532;
166
+ --wgd-hl-key: #7aa2f7; --wgd-hl-str: #9ece6a; --wgd-hl-num: #ff9e64;
167
+ --wgd-hl-bool: #bb9af7; --wgd-hl-punct: #8b94a7;
168
+ }
169
+ .wgd-root { display: flex; gap: 16px; font-family: system-ui, sans-serif; font-size: 13px; align-items: flex-start; color: var(--wgd-text); background: var(--wgd-bg); }
170
+ /* Any chrome class that sets display would silently defeat the hidden
171
+ attribute (learned live twice: the add menu, then the styles tree as a
172
+ tab pane). hidden always wins — scoped to the designer's own tree. */
173
+ .wgd-root [hidden] { display: none !important; }
174
+ /* Read-only: editing surfaces are inert (visible, inoperable) and read
175
+ de-emphasized; the preview and its selectors stay full-strength. The
176
+ controls flatten into plain values — a form that cannot be typed in
177
+ should not look like a form (opacity alone was invisible on dark). */
178
+ .wgd-readonly .wgd-section-body[inert] { opacity: 0.75; }
179
+ /* Empty preview state — shown only when there has never been a valid
180
+ render to freeze on; a blank pane is the one state the contract bans. */
181
+ .wgd-preview-empty { color: var(--wgd-muted); font-style: italic; font-size: 12px; }
182
+ .wgd-readonly [inert] .wgd-input,
183
+ .wgd-readonly [inert] .wgd-select,
184
+ .wgd-readonly [inert] .wgd-textarea,
185
+ .wgd-readonly [inert] textarea.wgd-hl-input {
186
+ border-color: transparent; background: transparent; box-shadow: none;
187
+ }
188
+ .wgd-readonly [inert] .wgd-hl { background: transparent; }
189
+ /* Controls that only exist to mutate carry no meaning here. */
190
+ .wgd-readonly [inert] .wgd-button,
191
+ .wgd-readonly [inert] .wgd-icon,
192
+ .wgd-readonly [inert] .wgd-add,
193
+ .wgd-readonly [inert] input[type="checkbox"] { opacity: 0.4; }
194
+ .wgd-panels { flex: 1 1 460px; min-width: 340px; display: flex; flex-direction: column; gap: 8px; }
195
+ .wgd-side { flex: 1 1 420px; min-width: 320px; display: flex; flex-direction: column; gap: 8px; position: sticky; top: 8px; }
196
+ .wgd-preview-pane { display: flex; flex-direction: column; gap: 8px; }
197
+ .wgd-section { border: 1px solid var(--wgd-border); border-radius: 6px; padding: 6px 10px; background: var(--wgd-panel); }
198
+ .wgd-section-title { cursor: pointer; font-weight: 600; }
199
+ .wgd-section-body { display: flex; flex-direction: column; gap: 8px; padding-top: 8px; }
200
+ .wgd-field { display: flex; flex-direction: column; gap: 2px; }
201
+ .wgd-field-label { color: var(--wgd-muted); font-size: 12px; }
202
+ .wgd-input, .wgd-textarea, .wgd-select { font: inherit; padding: 4px 6px; border: 1px solid var(--wgd-border); border-radius: 4px; background: var(--wgd-bg); color: var(--wgd-text); }
203
+ /* Textareas fill their panel regardless of the intrinsic cols width. */
204
+ .wgd-textarea { font-family: ui-monospace, monospace; white-space: pre; width: 100%; box-sizing: border-box; min-width: 0; resize: vertical; }
205
+ .wgd-preview .wg-designer-action { position: relative; outline: 1px dashed var(--wgd-muted, #6b7280); outline-offset: 2px; }
206
+ .wgd-preview .wg-designer-action::after { content: "⚡ action"; position: absolute; top: -0.9em; right: 0; font: 10px system-ui, sans-serif; color: var(--wgd-muted, #6b7280); background: var(--wgd-panel, #fbfcfe); padding: 0 4px; border-radius: 3px; pointer-events: none; }
207
+ .wgd-binding { display: flex; flex-direction: column; gap: 6px; padding: 6px 8px; border: 1px dashed var(--wgd-border, #d5dbe3); border-radius: 4px; margin: 4px 0; }
208
+ .wgd-binding-field { min-width: 8ch; font-family: ui-monospace, monospace; font-size: 12px; }
209
+ .wgd-action-definition { display: flex; flex-direction: column; gap: 6px; }
210
+ .wgd-action-schema { display: flex; flex-direction: column; gap: 4px; padding: 4px 0; }
211
+ .wgd-test-output { font: 12px ui-monospace, monospace; white-space: pre-wrap; word-break: break-all; max-height: 240px; overflow: auto; margin: 6px 0 0; }
212
+ .wgd-diagnostic { color: var(--wgd-danger); font-size: 12px; white-space: pre-wrap; }
213
+ .wgd-banner { border: 1px solid var(--wgd-danger-line); background: var(--wgd-danger-bg); color: var(--wgd-danger); border-radius: 6px; padding: 8px 10px; margin-bottom: 8px; }
214
+ /* The preview is the WIDGET's surface, not chrome: it establishes the
215
+ --wg-* context (like composePage does for page output) so widget content
216
+ — including custom kinds the base stylesheet doesn't color — never
217
+ inherits the designer's own text/background. */
218
+ .wgd-preview { border: 1px dashed var(--wgd-border); border-radius: 6px; padding: 16px; background: var(--wg-bg, #ffffff); color: var(--wg-fg, #1f2430); }
219
+ .wgd-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
220
+ .wgd-button { font: inherit; padding: 4px 10px; border: 1px solid var(--wgd-border); border-radius: 4px; background: var(--wgd-bg); color: var(--wgd-text); cursor: pointer; }
221
+ .wgd-button:hover { background: var(--wgd-hover); }
222
+ .wgd-tab-active { background: var(--wgd-accent-bg); border-color: var(--wgd-accent); }
223
+ /* Shared tree/editor chrome (JSON tree, schema builder/form, template tree) */
224
+ .wgd-jt-children, .wgd-children { margin-left: 10px; padding-left: 10px; border-left: 2px solid var(--wgd-line); display: flex; flex-direction: column; gap: 4px; }
225
+ .wgd-jt-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
226
+ .wgd-jt-entry { padding: 2px 0; }
227
+ .wgd-jt-key { font-family: ui-monospace, monospace; color: var(--wgd-muted); min-width: 2ch; }
228
+ .wgd-jt-keyinput, .wgd-jt-type { max-width: 12ch; }
229
+ .wgd-jt-summary { cursor: pointer; color: var(--wgd-muted); font-size: 12px; }
230
+ .wgd-sf-object { border: 1px solid var(--wgd-line); border-radius: 6px; padding: 6px 10px; margin: 4px 0; }
231
+ /* Schema builder: property name + type + required on one row. */
232
+ .wgd-sb-node { margin-left: 8px; padding: 1px 0 1px 8px; border-left: 2px solid var(--wgd-line); }
233
+ .wgd-sb-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 1px 0; }
234
+ .wgd-sb-constraints { padding-left: 12px; }
235
+ .wgd-sb-label { color: var(--wgd-muted); font-size: 11px; flex: 0 0 auto; }
236
+ .wgd-sb-prop { flex: 1 1 auto; min-width: 6ch; font-family: ui-monospace, monospace; }
237
+ .wgd-sb-type { flex: 0 0 auto; max-width: 11ch; font-size: 12px; }
238
+ .wgd-sb-req { display: flex; gap: 2px; align-items: center; color: var(--wgd-muted); font-size: 11px; flex: 0 0 auto; }
239
+ .wgd-sb-constraint { flex: 1 1 auto; min-width: 6ch; font-size: 12px; }
240
+ .wgd-sb-root { padding: 2px 0 2px 8px; border-left: 2px solid transparent; }
241
+ /* Schema builder: the template tree's flat discipline — chrome on
242
+ hover/focus only, removal revealed by the row, fitted type selects. */
243
+ .wgd-schemabuilder .wgd-input, .wgd-schemabuilder .wgd-select { padding: 1px 4px; font-size: 12px; border-color: transparent; background: transparent; }
244
+ .wgd-schemabuilder .wgd-input:hover, .wgd-schemabuilder .wgd-select:hover,
245
+ .wgd-schemabuilder .wgd-input:focus, .wgd-schemabuilder .wgd-select:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
246
+ .wgd-schemabuilder .wgd-sb-type { flex: 0 0 auto; box-sizing: border-box; max-width: none; color: var(--wgd-accent); }
247
+ .wgd-schemabuilder .wgd-sb-prop { font-size: 12px; color: var(--wgd-hl-key); }
248
+ .wgd-sb-row { border-radius: 3px; }
249
+ .wgd-sb-row:hover { background: var(--wgd-hover); }
250
+ .wgd-sb-row > .wgd-icon { visibility: hidden; }
251
+ .wgd-sb-row:hover > .wgd-icon, .wgd-sb-row:focus-within > .wgd-icon { visibility: visible; }
252
+ .wgd-schemabuilder .wgd-button { font-size: 11px; padding: 0 6px; border-color: transparent; color: var(--wgd-accent); background: none; }
253
+ .wgd-schemabuilder .wgd-button:hover { border-color: var(--wgd-border); background: var(--wgd-hover); }
254
+ .wgd-remove { color: var(--wgd-danger); }
255
+ /* Breathing room between a tab strip and its active pane. */
256
+ .wgd-tabs > .wgd-row { margin-bottom: 6px; }
257
+ /* Template tree: one node = one slim row; sub-structure indents below.
258
+ Controls stay flat (chrome appears on hover/focus) so a deep template
259
+ reads like the JSON it projects, not like a form. */
260
+ .wgd-node { padding: 0 0 0 4px; }
261
+ .wgd-node-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 1px 0; border-radius: 3px; }
262
+ .wgd-node-row:hover { background: var(--wgd-hover); }
263
+ .wgd-node-badge { font-family: ui-monospace, monospace; font-size: 11px; color: var(--wgd-accent); background: var(--wgd-accent-bg); border-radius: 3px; padding: 0 5px; flex: 0 0 auto; }
264
+ .wgd-node-icons { display: flex; gap: 2px; margin-left: auto; flex: 0 0 auto; visibility: hidden; }
265
+ .wgd-node-row:hover > .wgd-node-icons, .wgd-node-row:focus-within > .wgd-node-icons { visibility: visible; }
266
+ .wgd-node-value { flex: 1 1 auto; min-width: 4ch; }
267
+ .wgd-icon { font: inherit; font-size: 11px; line-height: 1.4; padding: 0 5px; border: 1px solid var(--wgd-border); border-radius: 3px; background: var(--wgd-bg); cursor: pointer; color: var(--wgd-muted); }
268
+ .wgd-icon:hover { background: var(--wgd-hover); }
269
+ /* Compact controls: inside tree nodes, and wherever a section opts in with
270
+ .wgd-compact (the Load action editor mirrors an element's binding editor). */
271
+ .wgd-node .wgd-input, .wgd-node .wgd-select,
272
+ .wgd-compact .wgd-input, .wgd-compact .wgd-select { padding: 1px 4px; font-size: 12px; border-color: transparent; background: transparent; }
273
+ .wgd-node .wgd-input:hover, .wgd-node .wgd-select:hover, .wgd-compact .wgd-input:hover, .wgd-compact .wgd-select:hover,
274
+ .wgd-node .wgd-input:focus, .wgd-node .wgd-select:focus, .wgd-compact .wgd-input:focus, .wgd-compact .wgd-select:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
275
+ .wgd-compact .wgd-binding { border: none; padding: 0; }
276
+ /* Busy controls (the host-supplied Test call): disabled, with a spinner. */
277
+ .wgd-button.wgd-busy { opacity: 0.7; cursor: progress; }
278
+ .wgd-button.wgd-busy::after { content: ""; display: inline-block; width: 10px; height: 10px; margin-left: 6px; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; vertical-align: -1px; animation: wgd-spin 0.8s linear infinite; }
279
+ @keyframes wgd-spin { to { transform: rotate(360deg); } }
280
+ .wgd-tagwrap, .wgd-pathwrap { display: contents; }
281
+ /* Collapse chevron: every tree row reserves the column so values align. */
282
+ .wgd-chevron { flex: 0 0 auto; width: 16px; padding: 0; border: none; background: none; color: var(--wgd-muted); font-size: 10px; cursor: pointer; }
283
+ .wgd-chevron-none { visibility: hidden; }
284
+ .wgd-node-summary { color: var(--wgd-muted); font-size: 11px; flex: 0 0 auto; }
285
+ /* Attrs vs children: attributes group under a dotted muted rail with
286
+ key-colored names; children keep the solid accent rail. */
287
+ .wgd-attrs { margin-left: 14px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
288
+ .wgd-attr-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 0; }
289
+ .wgd-attr-row > .wgd-icon { visibility: hidden; }
290
+ .wgd-attr-row:hover > .wgd-icon, .wgd-attr-row:focus-within > .wgd-icon { visibility: visible; }
291
+ .wgd-attr-name { font-family: ui-monospace, monospace; color: var(--wgd-hl-key); flex: 0 1 auto; min-width: 5ch; }
292
+ .wgd-attr-prefix { flex: 0 1 auto; min-width: 6ch; max-width: 10ch; font-family: ui-monospace, monospace; color: var(--wgd-hl-str); }
293
+ .wgd-attr { display: flex; flex-direction: column; gap: 1px; }
294
+ /* Transform block under a bind attr: one more dotted level in. */
295
+ .wgd-attr-map { margin-left: 24px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
296
+ .wgd-attr-map-default { flex: 1 1 auto; min-width: 8ch; }
297
+ .wgd-attr-mode { flex: 0 0 auto; color: var(--wgd-muted); font-size: 11px; }
298
+ .wgd-children { margin-left: 14px; padding-left: 8px; border-left: 2px solid var(--wgd-accent-line); gap: 1px; }
299
+ .wgd-slot { display: flex; flex-direction: column; gap: 1px; }
300
+ .wgd-slot-label { color: var(--wgd-muted); font-size: 11px; font-style: italic; padding-left: 4px; }
301
+ /* Add menu: one toggle, options in a popover. */
302
+ .wgd-menuwrap { position: relative; display: inline-flex; }
303
+ .wgd-menu-toggle { color: var(--wgd-accent); }
304
+ .wgd-menu { position: absolute; top: 100%; left: 0; z-index: 10; min-width: 9ch; display: flex; flex-direction: column; background: var(--wgd-panel); border: 1px solid var(--wgd-border); border-radius: 4px; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25); padding: 2px; }
305
+ /* An OPEN menu must not inherit the icons' hover-gated visibility:
306
+ visibility (unlike display) lets a child re-assert visible. */
307
+ .wgd-menu:not([hidden]) { visibility: visible; }
308
+ .wgd-menuwrap:has(> .wgd-menu:not([hidden])) { visibility: visible; }
309
+ /* Menus in the right-aligned icons area hang leftward, not off-panel. */
310
+ .wgd-node-icons .wgd-menu { left: auto; right: 0; }
311
+ .wgd-menu-item { font: inherit; font-size: 12px; text-align: left; padding: 3px 8px; border: none; border-radius: 3px; background: none; color: var(--wgd-text); cursor: pointer; white-space: nowrap; }
312
+ .wgd-menu-item:hover { background: var(--wgd-accent-bg); color: var(--wgd-accent); }
313
+ /* Styles tree: selector rows with declaration rows — the same flat
314
+ template-tree discipline (flat inputs, hover-revealed icons). */
315
+ .wgd-styles { display: flex; flex-direction: column; gap: 2px; }
316
+ .wgd-st-row { display: flex; gap: 4px; align-items: center; border-radius: 3px; }
317
+ .wgd-st-row:hover { background: var(--wgd-hover); }
318
+ .wgd-st-row:hover > .wgd-node-icons, .wgd-st-row:focus-within > .wgd-node-icons { visibility: visible; }
319
+ .wgd-styles .wgd-input { padding: 1px 4px; font-size: 12px; font-family: ui-monospace, monospace; border-color: transparent; background: transparent; }
320
+ .wgd-styles .wgd-input:hover, .wgd-styles .wgd-input:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
321
+ .wgd-st-selector { flex: 1 1 auto; min-width: 8ch; color: var(--wgd-accent); }
322
+ .wgd-st-decls { margin-left: 14px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
323
+ .wgd-st-decl { display: flex; gap: 2px; align-items: center; border-radius: 3px; }
324
+ .wgd-st-decl:hover { background: var(--wgd-hover); }
325
+ .wgd-st-decl > .wgd-icon { visibility: hidden; }
326
+ .wgd-st-decl:hover > .wgd-icon, .wgd-st-decl:focus-within > .wgd-icon { visibility: visible; }
327
+ .wgd-st-prop { flex: 0 1 auto; min-width: 8ch; color: var(--wgd-hl-key); }
328
+ .wgd-st-value { flex: 1 1 auto; min-width: 8ch; }
329
+ .wgd-st-colon { color: var(--wgd-muted); flex: 0 0 auto; }
330
+ .wgd-st-add { font-size: 11px; padding: 0 6px; border-color: transparent; color: var(--wgd-accent); background: none; }
331
+ .wgd-st-add:hover { border-color: var(--wgd-border); background: var(--wgd-hover); }
332
+ /* Import and export stack as sibling sections with the column's rhythm. */
333
+ .wgd-io { display: flex; flex-direction: column; gap: 8px; }
334
+ /* Flat string→string record rows (hints): mono keys, prose values. */
335
+ .wgd-record { display: flex; flex-direction: column; gap: 1px; }
336
+ .wgd-rec-row { display: flex; gap: 2px; align-items: center; border-radius: 3px; }
337
+ .wgd-rec-row:hover { background: var(--wgd-hover); }
338
+ .wgd-rec-row > .wgd-icon { visibility: hidden; }
339
+ .wgd-rec-row:hover > .wgd-icon, .wgd-rec-row:focus-within > .wgd-icon { visibility: visible; }
340
+ .wgd-record .wgd-input { padding: 1px 4px; font-size: 12px; border-color: transparent; background: transparent; }
341
+ .wgd-record .wgd-input:hover, .wgd-record .wgd-input:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
342
+ .wgd-rec-key { flex: 0 1 auto; min-width: 8ch; font-family: ui-monospace, monospace; color: var(--wgd-hl-key); }
343
+ .wgd-rec-value { flex: 1 1 auto; min-width: 8ch; }
344
+ /* The tag select IS the element node's label: flat, accent, monospace.
345
+ Tag and path selects are width-fitted to their SELECTED value by the
346
+ panel (fitSelect), so carets hug the text — no flex stretching here. */
347
+ .wgd-node .wgd-tag { flex: 0 0 auto; font-family: ui-monospace, monospace; font-size: 11px; color: var(--wgd-accent); background: var(--wgd-accent-bg); border: 1px solid transparent; border-radius: 3px; padding: 0 4px; }
348
+ .wgd-node .wgd-tag:hover, .wgd-node .wgd-tag:focus { border-color: var(--wgd-accent-line); }
349
+ .wgd-node .wgd-path { flex: 0 1 auto; min-width: 6ch; max-width: 100%; font-family: ui-monospace, monospace; }
350
+ .wgd-node .wgd-select { box-sizing: border-box; }
351
+ /* Theme panel: swatch beside each color token. */
352
+ /* Syntax coloring: <pre> layer behind a transparent-text textarea. Every
353
+ metric here must mirror .wgd-textarea or the glyphs drift apart. */
354
+ .wgd-hlwrap { position: relative; }
355
+ .wgd-hl, .wgd-hl-input {
356
+ font-family: ui-monospace, monospace; font-size: 13px; line-height: 1.45;
357
+ padding: 4px 6px; border: 1px solid transparent; border-radius: 4px;
358
+ box-sizing: border-box; white-space: pre; tab-size: 2; letter-spacing: normal;
359
+ }
360
+ .wgd-hl {
361
+ position: absolute; inset: 0; margin: 0; overflow: hidden;
362
+ pointer-events: none; z-index: 0; background: var(--wgd-bg);
363
+ color: var(--wgd-text);
364
+ }
365
+ textarea.wgd-hl-input {
366
+ position: relative; z-index: 1; background: transparent; color: transparent;
367
+ caret-color: var(--wgd-text); border-color: var(--wgd-border);
368
+ }
369
+ .wgd-hl-k { color: var(--wgd-hl-key); }
370
+ .wgd-hl-s { color: var(--wgd-hl-str); }
371
+ .wgd-hl-n { color: var(--wgd-hl-num); }
372
+ .wgd-hl-b { color: var(--wgd-hl-bool); }
373
+ .wgd-hl-p { color: var(--wgd-hl-punct); }
374
+ .wgd-swatch { flex: 0 0 auto; width: 26px; height: 22px; padding: 0; border: 1px solid var(--wgd-border); border-radius: 4px; background: none; cursor: pointer; }
375
+ .wgd-token-row { display: flex; gap: 6px; align-items: center; }
376
+ .wgd-token-row .wgd-input { flex: 1 1 auto; min-width: 6ch; font-family: ui-monospace, monospace; font-size: 12px; }
377
+ .wgd-token-ref { display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; margin-top: 4px; }
378
+ .wgd-token-ref-row { display: flex; gap: 6px; align-items: center; font-size: 11px; }
379
+ .wgd-token-ref-swatch { flex: 0 0 auto; width: 14px; height: 14px; border: 1px solid var(--wgd-border); border-radius: 3px; }
380
+ .wgd-token-ref-noswatch { border-style: dashed; opacity: 0.35; }
381
+ .wgd-token-ref-name { font-family: ui-monospace, monospace; color: var(--wgd-accent, #2563eb); }
382
+ .wgd-token-ref-value { color: var(--wgd-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
383
+ .wgd-token-ref-details summary { cursor: pointer; }
384
+ `;
385
+ doc.head.appendChild(style);
386
+ }
387
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const DEFAULT_TAG = "widgentic-designer";
2
+ export declare const DEFAULT_THEME_TAG = "widgentic-theme-designer";
3
+ export declare const DEFAULT_SCHEMA_TAG = "widgentic-schema-designer";
4
+ export declare const DEFAULT_ACTION_TAG = "widgentic-action-designer";
5
+ export declare function defineDesignerElement(tagName?: string): void;
6
+ /** Sibling registrar for the standalone theme designer. */
7
+ export declare function defineThemeDesignerElement(tagName?: string): void;
8
+ /** Sibling registrar for the standalone schema designer. */
9
+ export declare function defineSchemaDesignerElement(tagName?: string): void;
10
+ /** Sibling registrar for the standalone action designer. */
11
+ export declare function defineActionDesignerElement(tagName?: string): void;
12
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAC5D,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,MAAoB,GAAG,IAAI,CAwCzE;AAED,2DAA2D;AAC3D,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,MAA0B,GAAG,IAAI,CAkCpF;AAED,4DAA4D;AAC5D,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,MAA2B,GAAG,IAAI,CAkCtF;AAED,4DAA4D;AAC5D,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,MAA2B,GAAG,IAAI,CAkCtF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Opt-in custom element wrapping the factory. Registration only ever
3
+ * happens through the explicit call — importing this module has no
4
+ * custom-element registry side effects, so hosts stay in control.
5
+ */
6
+ import { createDesigner } from "./shell.js";
7
+ import { createSchemaDesigner } from "./schema-designer.js";
8
+ import { createThemeDesigner } from "./theme-designer.js";
9
+ import { createActionDesigner } from "./action-designer.js";
10
+ export const DEFAULT_TAG = "widgentic-designer";
11
+ export const DEFAULT_THEME_TAG = "widgentic-theme-designer";
12
+ export const DEFAULT_SCHEMA_TAG = "widgentic-schema-designer";
13
+ export const DEFAULT_ACTION_TAG = "widgentic-action-designer";
14
+ export function defineDesignerElement(tagName = DEFAULT_TAG) {
15
+ if (customElements.get(tagName) !== undefined)
16
+ return;
17
+ class WidgenticDesignerElement extends HTMLElement {
18
+ #handle;
19
+ #unsubscribe;
20
+ connectedCallback() {
21
+ if (this.#handle !== undefined)
22
+ return;
23
+ // <widgentic-designer appearance="dark"> pins the chrome; omitted
24
+ // follows the host's prefers-color-scheme.
25
+ const appearance = this.getAttribute("appearance");
26
+ this.#handle = createDesigner(this, appearance === "light" || appearance === "dark" ? { appearance } : {});
27
+ this.#unsubscribe = this.#handle.subscribe((draft, diagnostics) => {
28
+ this.dispatchEvent(new CustomEvent("widgentic-change", {
29
+ detail: { draft, diagnostics },
30
+ bubbles: true
31
+ }));
32
+ });
33
+ }
34
+ disconnectedCallback() {
35
+ this.#unsubscribe?.();
36
+ this.#handle?.dispose();
37
+ this.#handle = undefined;
38
+ this.#unsubscribe = undefined;
39
+ }
40
+ /** The embedding host's programmatic access to the wrapped handle. */
41
+ get designer() {
42
+ return this.#handle;
43
+ }
44
+ }
45
+ customElements.define(tagName, WidgenticDesignerElement);
46
+ }
47
+ /** Sibling registrar for the standalone theme designer. */
48
+ export function defineThemeDesignerElement(tagName = DEFAULT_THEME_TAG) {
49
+ if (customElements.get(tagName) !== undefined)
50
+ return;
51
+ class WidgenticThemeDesignerElement extends HTMLElement {
52
+ #handle;
53
+ #unsubscribe;
54
+ connectedCallback() {
55
+ if (this.#handle !== undefined)
56
+ return;
57
+ const appearance = this.getAttribute("appearance");
58
+ this.#handle = createThemeDesigner(this, appearance === "light" || appearance === "dark" ? { appearance } : {});
59
+ this.#unsubscribe = this.#handle.subscribe((entry) => {
60
+ this.dispatchEvent(new CustomEvent("widgentic-change", { detail: { theme: entry }, bubbles: true }));
61
+ });
62
+ }
63
+ disconnectedCallback() {
64
+ this.#unsubscribe?.();
65
+ this.#handle?.dispose();
66
+ this.#handle = undefined;
67
+ this.#unsubscribe = undefined;
68
+ }
69
+ get designer() {
70
+ return this.#handle;
71
+ }
72
+ }
73
+ customElements.define(tagName, WidgenticThemeDesignerElement);
74
+ }
75
+ /** Sibling registrar for the standalone schema designer. */
76
+ export function defineSchemaDesignerElement(tagName = DEFAULT_SCHEMA_TAG) {
77
+ if (customElements.get(tagName) !== undefined)
78
+ return;
79
+ class WidgenticSchemaDesignerElement extends HTMLElement {
80
+ #handle;
81
+ #unsubscribe;
82
+ connectedCallback() {
83
+ if (this.#handle !== undefined)
84
+ return;
85
+ const appearance = this.getAttribute("appearance");
86
+ this.#handle = createSchemaDesigner(this, appearance === "light" || appearance === "dark" ? { appearance } : {});
87
+ this.#unsubscribe = this.#handle.subscribe((entry) => {
88
+ this.dispatchEvent(new CustomEvent("widgentic-change", { detail: { schema: entry }, bubbles: true }));
89
+ });
90
+ }
91
+ disconnectedCallback() {
92
+ this.#unsubscribe?.();
93
+ this.#handle?.dispose();
94
+ this.#handle = undefined;
95
+ this.#unsubscribe = undefined;
96
+ }
97
+ get designer() {
98
+ return this.#handle;
99
+ }
100
+ }
101
+ customElements.define(tagName, WidgenticSchemaDesignerElement);
102
+ }
103
+ /** Sibling registrar for the standalone action designer. */
104
+ export function defineActionDesignerElement(tagName = DEFAULT_ACTION_TAG) {
105
+ if (customElements.get(tagName) !== undefined)
106
+ return;
107
+ class WidgenticActionDesignerElement extends HTMLElement {
108
+ #handle;
109
+ #unsubscribe;
110
+ connectedCallback() {
111
+ if (this.#handle !== undefined)
112
+ return;
113
+ const appearance = this.getAttribute("appearance");
114
+ this.#handle = createActionDesigner(this, appearance === "light" || appearance === "dark" ? { appearance } : {});
115
+ this.#unsubscribe = this.#handle.subscribe((entry) => {
116
+ this.dispatchEvent(new CustomEvent("widgentic-change", { detail: { action: entry }, bubbles: true }));
117
+ });
118
+ }
119
+ disconnectedCallback() {
120
+ this.#unsubscribe?.();
121
+ this.#handle?.dispose();
122
+ this.#handle = undefined;
123
+ this.#unsubscribe = undefined;
124
+ }
125
+ get designer() {
126
+ return this.#handle;
127
+ }
128
+ }
129
+ customElements.define(tagName, WidgenticActionDesignerElement);
130
+ }
131
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"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"}