@grafloria/element 0.3.4 → 0.3.6

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 (57) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/index.d.ts +4 -0
  4. package/src/index.js +74 -54
  5. package/src/index.js.map +1 -1
  6. package/src/lib/stencil-kit/index.d.ts +5 -0
  7. package/src/lib/stencil-kit/index.js +10 -0
  8. package/src/lib/stencil-kit/index.js.map +1 -0
  9. package/src/lib/stencil-kit/palette.d.ts +78 -0
  10. package/src/lib/stencil-kit/palette.js +291 -0
  11. package/src/lib/stencil-kit/palette.js.map +1 -0
  12. package/src/lib/stencil-kit/shape-data.d.ts +27 -0
  13. package/src/lib/stencil-kit/shape-data.js +153 -0
  14. package/src/lib/stencil-kit/shape-data.js.map +1 -0
  15. package/src/lib/stencil-kit/styles.d.ts +2 -0
  16. package/src/lib/stencil-kit/styles.js +100 -0
  17. package/src/lib/stencil-kit/styles.js.map +1 -0
  18. package/esm/src/index.js +0 -284
  19. package/esm/src/index.js.map +0 -1
  20. package/esm/src/lib/dashboard-kit/dashboard.js +0 -590
  21. package/esm/src/lib/dashboard-kit/dashboard.js.map +0 -1
  22. package/esm/src/lib/dashboard-kit/grid-binder.js +0 -1632
  23. package/esm/src/lib/dashboard-kit/grid-binder.js.map +0 -1
  24. package/esm/src/lib/dashboard-kit/grid-mapping.js +0 -164
  25. package/esm/src/lib/dashboard-kit/grid-mapping.js.map +0 -1
  26. package/esm/src/lib/dashboard-kit/index.js +0 -8
  27. package/esm/src/lib/dashboard-kit/index.js.map +0 -1
  28. package/esm/src/lib/dashboard-kit/styles.js +0 -199
  29. package/esm/src/lib/dashboard-kit/styles.js.map +0 -1
  30. package/esm/src/lib/dashboard-kit/widgets.js +0 -379
  31. package/esm/src/lib/dashboard-kit/widgets.js.map +0 -1
  32. package/esm/src/lib/diagram-kit/card.js +0 -199
  33. package/esm/src/lib/diagram-kit/card.js.map +0 -1
  34. package/esm/src/lib/diagram-kit/editing.js +0 -286
  35. package/esm/src/lib/diagram-kit/editing.js.map +0 -1
  36. package/esm/src/lib/diagram-kit/er.js +0 -160
  37. package/esm/src/lib/diagram-kit/er.js.map +0 -1
  38. package/esm/src/lib/diagram-kit/handles.js +0 -312
  39. package/esm/src/lib/diagram-kit/handles.js.map +0 -1
  40. package/esm/src/lib/diagram-kit/index.js +0 -9
  41. package/esm/src/lib/diagram-kit/index.js.map +0 -1
  42. package/esm/src/lib/diagram-kit/rows.js +0 -144
  43. package/esm/src/lib/diagram-kit/rows.js.map +0 -1
  44. package/esm/src/lib/diagram-kit/styles.js +0 -110
  45. package/esm/src/lib/diagram-kit/styles.js.map +0 -1
  46. package/esm/src/lib/diagram-kit/uml.js +0 -135
  47. package/esm/src/lib/diagram-kit/uml.js.map +0 -1
  48. package/esm/src/lib/diagram-kit/update.js +0 -244
  49. package/esm/src/lib/diagram-kit/update.js.map +0 -1
  50. package/esm/src/lib/grafloria-flow-element.js +0 -266
  51. package/esm/src/lib/grafloria-flow-element.js.map +0 -1
  52. package/esm/src/lib/grafloria.js +0 -69
  53. package/esm/src/lib/grafloria.js.map +0 -1
  54. package/esm/src/lib/load.js +0 -252
  55. package/esm/src/lib/load.js.map +0 -1
  56. package/esm/src/lib/node-type-registry.js +0 -42
  57. package/esm/src/lib/node-type-registry.js.map +0 -1
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindStencilPalette = bindStencilPalette;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * The stencil palette — the signature Visio surface: a categorized, searchable
7
+ * list of shape masters you DRAG ONTO THE CANVAS.
8
+ *
9
+ * Two halves, deliberately in one module because they share the drag contract:
10
+ * T6 the palette UI — sections from `listStencils()`, live search, and a
11
+ * thumbnail drawn from the master's OWN outline
12
+ * geometry (`getShape(type).outline(w,h)`), so what
13
+ * you see in the palette is the shape you get.
14
+ * T7 drag-to-place — HTML5 drag-and-drop (not pointer events: the canvas
15
+ * binder consumes pointerdown, and DnD is the gesture
16
+ * browsers already route across two elements). The
17
+ * drop lands the master at the cursor as ONE undoable
18
+ * BatchCommand.
19
+ */
20
+ const engine_1 = require("@grafloria/engine");
21
+ const renderer_1 = require("@grafloria/renderer");
22
+ const styles_1 = require("./styles");
23
+ const SVG_NS = 'http://www.w3.org/2000/svg';
24
+ /** The MIME the palette drags with — namespaced so a page's other DnD is untouched. */
25
+ const DND_TYPE = 'application/x-grafloria-master';
26
+ /** A thumbnail SVG for a master, drawn from its real outline + declared paint. */
27
+ function thumbnail(master, box = 34) {
28
+ var _a, _b, _c, _d, _e, _f;
29
+ const svg = document.createElementNS(SVG_NS, 'svg');
30
+ svg.setAttribute('width', String(box));
31
+ svg.setAttribute('height', String(box));
32
+ svg.setAttribute('viewBox', `0 0 ${box} ${box}`);
33
+ svg.setAttribute('aria-hidden', 'true');
34
+ const struct = (_a = master.structure) !== null && _a !== void 0 ? _a : {};
35
+ const paint = (_b = struct.shape) !== null && _b !== void 0 ? _b : {};
36
+ // Preserve the master's aspect ratio inside the square, with a hairline inset
37
+ // so a 2px stroke isn't clipped at the edges.
38
+ const w0 = Number((_c = struct.size) === null || _c === void 0 ? void 0 : _c.width) || 100;
39
+ const h0 = Number((_d = struct.size) === null || _d === void 0 ? void 0 : _d.height) || 60;
40
+ const pad = 3;
41
+ const s = Math.min((box - pad * 2) / w0, (box - pad * 2) / h0);
42
+ const w = Math.max(6, w0 * s);
43
+ const h = Math.max(6, h0 * s);
44
+ let el;
45
+ try {
46
+ const spec = (0, renderer_1.getShape)(paint.type).outline(w, h);
47
+ el = document.createElementNS(SVG_NS, spec.el);
48
+ for (const [k, v] of Object.entries(spec.geom))
49
+ el.setAttribute(k, String(v));
50
+ }
51
+ catch (_g) {
52
+ el = document.createElementNS(SVG_NS, 'rect');
53
+ el.setAttribute('width', String(w));
54
+ el.setAttribute('height', String(h));
55
+ el.setAttribute('rx', '3');
56
+ }
57
+ el.setAttribute('fill', (_e = paint.fill) !== null && _e !== void 0 ? _e : '#eef1fb');
58
+ el.setAttribute('stroke', (_f = paint.stroke) !== null && _f !== void 0 ? _f : '#3B52D9');
59
+ el.setAttribute('stroke-width', String(Math.min(Number(paint.strokeWidth) || 1.5, 2)));
60
+ const g = document.createElementNS(SVG_NS, 'g');
61
+ g.setAttribute('transform', `translate(${(box - w) / 2} ${(box - h) / 2})`);
62
+ g.appendChild(el);
63
+ svg.appendChild(g);
64
+ return svg;
65
+ }
66
+ /** Root + descendants, so a multi-node master commits (and undoes) as a unit. */
67
+ function subtree(diagram, root) {
68
+ var _a;
69
+ const out = [root];
70
+ const stack = [root];
71
+ while (stack.length) {
72
+ const n = stack.pop();
73
+ const ids = Array.from((_a = n === null || n === void 0 ? void 0 : n.children) !== null && _a !== void 0 ? _a : []);
74
+ for (const id of ids) {
75
+ const c = diagram.getNode(id);
76
+ if (c) {
77
+ out.push(c);
78
+ stack.push(c);
79
+ }
80
+ }
81
+ }
82
+ return out;
83
+ }
84
+ /**
85
+ * Build a stencil palette in `palette` that drops masters onto `canvas`.
86
+ *
87
+ * @param api the diagram instance (engine + model + viewport)
88
+ * @param hosts `palette`: where the list renders · `canvas`: the drop target
89
+ * (the element the diagram is mounted in)
90
+ */
91
+ function bindStencilPalette(api, hosts, options = {}) {
92
+ var _a, _b, _c;
93
+ (0, styles_1.ensureStencilKitStyles)((_a = hosts.palette.ownerDocument) !== null && _a !== void 0 ? _a : document);
94
+ const stencils = (_b = options.stencils) !== null && _b !== void 0 ? _b : (0, engine_1.listStencils)();
95
+ const collapsed = new Set((_c = options.collapsed) !== null && _c !== void 0 ? _c : stencils.slice(1).map((s) => s.id));
96
+ const { palette, canvas } = hosts;
97
+ let query = '';
98
+ palette.classList.add('gf-stencil');
99
+ palette.innerHTML = '';
100
+ // ── search ───────────────────────────────────────────────────────────────
101
+ let input = null;
102
+ if (options.search !== false) {
103
+ const wrap = document.createElement('div');
104
+ wrap.className = 'gf-stencil-search';
105
+ input = document.createElement('input');
106
+ input.type = 'search';
107
+ input.placeholder = 'Search shapes…';
108
+ input.setAttribute('aria-label', 'Search shapes');
109
+ input.addEventListener('input', () => { query = input.value.trim().toLowerCase(); renderList(); });
110
+ wrap.appendChild(input);
111
+ palette.appendChild(wrap);
112
+ }
113
+ const body = document.createElement('div');
114
+ body.className = 'gf-stencil-body';
115
+ palette.appendChild(body);
116
+ /** A master matches on its display name, its id, or any of its tags. */
117
+ const matches = (m) => {
118
+ var _a, _b;
119
+ if (!query)
120
+ return true;
121
+ const meta = (_a = m.meta) !== null && _a !== void 0 ? _a : {};
122
+ const hay = [meta.name, m.id, ...((_b = meta.tags) !== null && _b !== void 0 ? _b : [])].join(' ').toLowerCase();
123
+ return hay.includes(query);
124
+ };
125
+ function renderList() {
126
+ body.innerHTML = '';
127
+ let shown = 0;
128
+ for (const stencil of stencils) {
129
+ const hits = stencil.masters.filter(matches);
130
+ if (hits.length === 0)
131
+ continue;
132
+ shown += hits.length;
133
+ const group = document.createElement('details');
134
+ group.className = 'gf-stencil-group';
135
+ // A search always opens the sections that matched; otherwise honour the
136
+ // caller's collapsed set.
137
+ group.open = query ? true : !collapsed.has(stencil.id);
138
+ group.addEventListener('toggle', () => {
139
+ if (query)
140
+ return;
141
+ if (group.open)
142
+ collapsed.delete(stencil.id);
143
+ else
144
+ collapsed.add(stencil.id);
145
+ });
146
+ const summary = document.createElement('summary');
147
+ summary.append(stencil.name);
148
+ const count = document.createElement('span');
149
+ count.className = 'gf-stencil-count';
150
+ count.textContent = String(hits.length);
151
+ summary.appendChild(count);
152
+ summary.title = stencil.description;
153
+ group.appendChild(summary);
154
+ const items = document.createElement('div');
155
+ items.className = 'gf-stencil-items';
156
+ for (const master of hits)
157
+ items.appendChild(itemEl(master));
158
+ group.appendChild(items);
159
+ body.appendChild(group);
160
+ }
161
+ if (shown === 0) {
162
+ const empty = document.createElement('div');
163
+ empty.className = 'gf-stencil-empty';
164
+ empty.textContent = query ? `No shapes match “${query}”.` : 'No stencils.';
165
+ body.appendChild(empty);
166
+ }
167
+ }
168
+ function itemEl(master) {
169
+ var _a, _b, _c;
170
+ const meta = (_a = master.meta) !== null && _a !== void 0 ? _a : {};
171
+ const el = document.createElement('div');
172
+ el.className = 'gf-stencil-item';
173
+ el.draggable = true;
174
+ el.dataset['masterId'] = master.id;
175
+ el.title = meta.description ? `${meta.name} — ${meta.description}` : (_b = meta.name) !== null && _b !== void 0 ? _b : master.id;
176
+ el.appendChild(thumbnail(master));
177
+ const label = document.createElement('span');
178
+ label.className = 'gf-stencil-label';
179
+ label.textContent = (_c = meta.name) !== null && _c !== void 0 ? _c : master.id;
180
+ el.appendChild(label);
181
+ el.addEventListener('dragstart', (e) => {
182
+ var _a;
183
+ const dt = e.dataTransfer;
184
+ if (!dt)
185
+ return;
186
+ dt.setData(DND_TYPE, master.id);
187
+ dt.setData('text/plain', (_a = meta.name) !== null && _a !== void 0 ? _a : master.id); // so a stray drop is harmless text
188
+ dt.effectAllowed = 'copy';
189
+ });
190
+ return el;
191
+ }
192
+ // ── drop-to-place on the canvas ──────────────────────────────────────────
193
+ const heldMaster = (e) => {
194
+ const dt = e.dataTransfer;
195
+ if (!dt)
196
+ return null;
197
+ // `getData` is empty during dragover in most browsers — the TYPE is the
198
+ // reliable signal there, and the id itself is read on drop.
199
+ return dt.types.includes(DND_TYPE) ? (dt.getData(DND_TYPE) || '') : null;
200
+ };
201
+ const onDragOver = (e) => {
202
+ if (heldMaster(e) === null)
203
+ return;
204
+ e.preventDefault(); // required, or the drop never fires
205
+ if (e.dataTransfer)
206
+ e.dataTransfer.dropEffect = 'copy';
207
+ canvas.classList.add('gf-stencil-target');
208
+ };
209
+ const onDragLeave = (e) => {
210
+ if (e.relatedTarget && canvas.contains(e.relatedTarget))
211
+ return;
212
+ canvas.classList.remove('gf-stencil-target');
213
+ };
214
+ const onDrop = (e) => {
215
+ const id = heldMaster(e);
216
+ canvas.classList.remove('gf-stencil-target');
217
+ if (!id)
218
+ return;
219
+ e.preventDefault();
220
+ const rect = canvas.getBoundingClientRect();
221
+ void place(id, api.viewport.clientToWorld(e.clientX, e.clientY, rect));
222
+ };
223
+ canvas.addEventListener('dragover', onDragOver);
224
+ canvas.addEventListener('dragleave', onDragLeave);
225
+ canvas.addEventListener('drop', onDrop);
226
+ /**
227
+ * Stamp `masterId` centred on a world point, as ONE undo entry.
228
+ *
229
+ * `NodeFactory.createFromTemplate` adds straight to the model (no command), so
230
+ * the created subtree is captured, taken back out, and re-applied through the
231
+ * CommandManager — one Ctrl+Z removes the whole shape, and collab sees a
232
+ * normal add.
233
+ */
234
+ function place(masterId, world) {
235
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
236
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
237
+ const engine = api.getEngine();
238
+ const diagram = api.getModel();
239
+ const registry = engine === null || engine === void 0 ? void 0 : engine.templateRegistry;
240
+ const master = registry === null || registry === void 0 ? void 0 : registry.get(masterId);
241
+ if (!master || !diagram)
242
+ return null;
243
+ const struct = (_a = master.structure) !== null && _a !== void 0 ? _a : {};
244
+ const w = Number((_b = struct.size) === null || _b === void 0 ? void 0 : _b.width) || 100;
245
+ const h = Number((_c = struct.size) === null || _c === void 0 ? void 0 : _c.height) || 60;
246
+ const at = { x: world.x - w / 2, y: world.y - h / 2 }; // drop centres on the cursor
247
+ const factory = new engine_1.NodeFactory(registry, diagram);
248
+ const root = factory.createFromTemplate(masterId, (_e = (_d = options.data) === null || _d === void 0 ? void 0 : _d.call(options, master)) !== null && _e !== void 0 ? _e : {}, at);
249
+ const created = subtree(diagram, root);
250
+ // `NodeFactory` flags any master carrying `structure.html` as `useHTMLLayer`
251
+ // — and the SVG renderer answers that flag with an EMPTY <g> (it expects an
252
+ // HTML layer to paint the body from `metadata.html`, while the factory
253
+ // stashes its config on `node.data._html` instead). All 80 generated masters
254
+ // declare html, so every dropped shape rendered as nothing at all.
255
+ //
256
+ // The geometry the palette already drew as a thumbnail is right there in
257
+ // `metadata.shape`, so drop the flag and let the SVG path paint the real
258
+ // silhouette + label. Hosts that DO run an HTML layer can opt back in with
259
+ // `htmlLayer: true`.
260
+ if (options.htmlLayer !== true) {
261
+ for (const n of created) {
262
+ if (((_f = n.getMetadata) === null || _f === void 0 ? void 0 : _f.call(n, 'useHTMLLayer')) === true)
263
+ n.setMetadata('useHTMLLayer', false);
264
+ }
265
+ }
266
+ // Serialize into commands BEFORE detaching (AddNodeCommand snapshots in its
267
+ // constructor), then detach and replay through the command manager.
268
+ const cmds = created.map((n) => new engine_1.AddNodeCommand(n));
269
+ for (const n of [...created].reverse())
270
+ diagram.removeNode(n.id);
271
+ yield engine.commandManager.execute(new engine_1.BatchCommand(`Place ${(_h = (_g = master.meta) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : masterId}`, cmds));
272
+ (_j = options.onPlace) === null || _j === void 0 ? void 0 : _j.call(options, { master, nodeId: root.id, x: at.x, y: at.y });
273
+ return root.id;
274
+ });
275
+ }
276
+ renderList();
277
+ return {
278
+ setSearch(q) { query = (q !== null && q !== void 0 ? q : '').trim().toLowerCase(); if (input)
279
+ input.value = q !== null && q !== void 0 ? q : ''; renderList(); },
280
+ place,
281
+ destroy() {
282
+ canvas.removeEventListener('dragover', onDragOver);
283
+ canvas.removeEventListener('dragleave', onDragLeave);
284
+ canvas.removeEventListener('drop', onDrop);
285
+ canvas.classList.remove('gf-stencil-target');
286
+ palette.classList.remove('gf-stencil');
287
+ palette.innerHTML = '';
288
+ },
289
+ };
290
+ }
291
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/palette.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface ShapeDataPanelApi {
2
+ getEngine(): any;
3
+ getModel(): any;
4
+ on(event: string, handler: (payload: any) => void): () => void;
5
+ }
6
+ export interface ShapeDataPanelOptions {
7
+ /** Heading above the fields (default "Shape data"). */
8
+ title?: string;
9
+ /** Shown when nothing (or more than one thing) is selected. */
10
+ emptyText?: string;
11
+ /** Called after an edit commits. */
12
+ onEdit?: (info: {
13
+ nodeId: string;
14
+ key: string;
15
+ value: unknown;
16
+ }) => void;
17
+ }
18
+ export interface ShapeDataPanelHandle {
19
+ /** Re-read the selection and rebuild the fields. */
20
+ refresh(): void;
21
+ destroy(): void;
22
+ }
23
+ /**
24
+ * Bind a shape-data panel into `host`. It follows the diagram's selection: one
25
+ * node selected → its schema's fields; anything else → the empty message.
26
+ */
27
+ export declare function bindShapeDataPanel(api: ShapeDataPanelApi, host: HTMLElement, options?: ShapeDataPanelOptions): ShapeDataPanelHandle;
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindShapeDataPanel = bindShapeDataPanel;
4
+ /**
5
+ * The shape-data panel — Visio's "Shape Data" window.
6
+ *
7
+ * T9. Every master ships a `dataSchema` (all 80 generated ones do) and the values
8
+ * live on `node.data`. The renderer already had a full `property-schema/` type
9
+ * contract, but it was TYPES ONLY — zero runtime — and the one working property
10
+ * sheet was inside the Angular wrapper, unreachable from a vanilla / React / Vue
11
+ * embed. This is the framework-free runtime: read the selected node's schema,
12
+ * render its fields, and write them back through `SetNodeDataCommand` so every
13
+ * edit is undoable and collab-safe (per-key, matching node.data's LWW registers).
14
+ */
15
+ const engine_1 = require("@grafloria/engine");
16
+ const styles_1 = require("./styles");
17
+ /** The schema a node's shape data follows, via the master it was stamped from. */
18
+ function schemaFor(engine, node) {
19
+ var _a, _b, _c, _d;
20
+ const templateId = (_a = node === null || node === void 0 ? void 0 : node.getMetadata) === null || _a === void 0 ? void 0 : _a.call(node, 'templateId');
21
+ if (!templateId)
22
+ return null;
23
+ const master = (_c = (_b = engine === null || engine === void 0 ? void 0 : engine.templateRegistry) === null || _b === void 0 ? void 0 : _b.get) === null || _c === void 0 ? void 0 : _c.call(_b, templateId);
24
+ const props = (_d = master === null || master === void 0 ? void 0 : master.dataSchema) === null || _d === void 0 ? void 0 : _d.properties;
25
+ return props && typeof props === 'object' ? props : null;
26
+ }
27
+ /** Turn `unitCost` / `unit_cost` into "Unit cost" for the field label. */
28
+ function humanize(key) {
29
+ const spaced = key.replace(/[_-]+/g, ' ').replace(/([a-z0-9])([A-Z])/g, '$1 $2');
30
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
31
+ }
32
+ /**
33
+ * Bind a shape-data panel into `host`. It follows the diagram's selection: one
34
+ * node selected → its schema's fields; anything else → the empty message.
35
+ */
36
+ function bindShapeDataPanel(api, host, options = {}) {
37
+ var _a, _b, _c;
38
+ (0, styles_1.ensureStencilKitStyles)((_a = host.ownerDocument) !== null && _a !== void 0 ? _a : document);
39
+ host.classList.add('gf-shapedata');
40
+ const title = (_b = options.title) !== null && _b !== void 0 ? _b : 'Shape data';
41
+ const emptyText = (_c = options.emptyText) !== null && _c !== void 0 ? _c : 'Select a shape to edit its data.';
42
+ function render() {
43
+ var _a, _b, _c, _d, _e, _f;
44
+ host.innerHTML = '';
45
+ const head = document.createElement('div');
46
+ head.className = 'gf-sd-title';
47
+ head.textContent = title;
48
+ host.appendChild(head);
49
+ const diagram = api.getModel();
50
+ const engine = api.getEngine();
51
+ const selected = ((_b = (_a = diagram === null || diagram === void 0 ? void 0 : diagram.getSelectedNodes) === null || _a === void 0 ? void 0 : _a.call(diagram)) !== null && _b !== void 0 ? _b : []);
52
+ if (selected.length !== 1) {
53
+ const empty = document.createElement('div');
54
+ empty.className = 'gf-sd-empty';
55
+ empty.textContent = selected.length > 1 ? 'Select a single shape.' : emptyText;
56
+ host.appendChild(empty);
57
+ return;
58
+ }
59
+ const node = selected[0];
60
+ const props = schemaFor(engine, node);
61
+ if (!props || Object.keys(props).length === 0) {
62
+ const empty = document.createElement('div');
63
+ empty.className = 'gf-sd-empty';
64
+ empty.textContent = 'This shape has no data fields.';
65
+ host.appendChild(empty);
66
+ return;
67
+ }
68
+ const form = document.createElement('div');
69
+ form.className = 'gf-sd-fields';
70
+ for (const [key, prop] of Object.entries(props)) {
71
+ const row = document.createElement('label');
72
+ row.className = 'gf-sd-row';
73
+ const label = document.createElement('span');
74
+ label.className = 'gf-sd-label';
75
+ label.textContent = (_c = prop.title) !== null && _c !== void 0 ? _c : humanize(key);
76
+ if (prop.description)
77
+ row.title = prop.description;
78
+ row.appendChild(label);
79
+ const current = (_f = (_e = (_d = node.getData) === null || _d === void 0 ? void 0 : _d.call(node, key)) !== null && _e !== void 0 ? _e : prop.default) !== null && _f !== void 0 ? _f : '';
80
+ // Commit through the command so the edit is undoable and collab-safe.
81
+ const commit = (value) => {
82
+ var _a;
83
+ void engine.commandManager.execute(new engine_1.SetNodeDataCommand(node.id, { [key]: value }));
84
+ (_a = options.onEdit) === null || _a === void 0 ? void 0 : _a.call(options, { nodeId: node.id, key, value });
85
+ };
86
+ let field;
87
+ if (Array.isArray(prop.enum) && prop.enum.length > 0) {
88
+ const sel = document.createElement('select');
89
+ sel.className = 'gf-sd-input';
90
+ for (const opt of prop.enum) {
91
+ const o = document.createElement('option');
92
+ o.value = String(opt);
93
+ o.textContent = String(opt);
94
+ if (String(opt) === String(current))
95
+ o.selected = true;
96
+ sel.appendChild(o);
97
+ }
98
+ sel.addEventListener('change', () => commit(sel.value));
99
+ field = sel;
100
+ }
101
+ else if (prop.type === 'boolean') {
102
+ const box = document.createElement('input');
103
+ box.type = 'checkbox';
104
+ box.className = 'gf-sd-check';
105
+ box.checked = current === true || current === 'true';
106
+ box.addEventListener('change', () => commit(box.checked));
107
+ field = box;
108
+ }
109
+ else {
110
+ const input = document.createElement('input');
111
+ const numeric = prop.type === 'number' || prop.type === 'integer';
112
+ input.type = numeric ? 'number' : 'text';
113
+ input.className = 'gf-sd-input';
114
+ input.value = current === undefined || current === null ? '' : String(current);
115
+ // Commit on change (blur / Enter), not per keystroke: one undo entry per edit.
116
+ input.addEventListener('change', () => {
117
+ var _a, _b;
118
+ if (numeric) {
119
+ const n = input.value === '' ? null : Number(input.value);
120
+ if (n !== null && Number.isNaN(n)) {
121
+ input.value = String((_b = (_a = node.getData) === null || _a === void 0 ? void 0 : _a.call(node, key)) !== null && _b !== void 0 ? _b : '');
122
+ return;
123
+ }
124
+ commit(n);
125
+ }
126
+ else {
127
+ commit(input.value);
128
+ }
129
+ });
130
+ input.addEventListener('keydown', (e) => {
131
+ e.stopPropagation(); // keep canvas keys out of the field
132
+ if (e.key === 'Enter')
133
+ input.blur();
134
+ });
135
+ field = input;
136
+ }
137
+ row.appendChild(field);
138
+ form.appendChild(row);
139
+ }
140
+ host.appendChild(form);
141
+ }
142
+ const off = api.on('selection:change', () => render());
143
+ render();
144
+ return {
145
+ refresh: render,
146
+ destroy() {
147
+ off === null || off === void 0 ? void 0 : off();
148
+ host.classList.remove('gf-shapedata');
149
+ host.innerHTML = '';
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=shape-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-data.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/shape-data.ts"],"names":[],"mappings":";;AA+DA,gDAuHC;AAtLD;;;;;;;;;;GAUG;AACH,8CAAuD;AACvD,qCAAkD;AAgClD,kFAAkF;AAClF,SAAS,SAAS,CAAC,MAAW,EAAE,IAAS;;IACvC,MAAM,UAAU,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,qDAAG,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,0CAAE,GAAG,mDAAG,UAAU,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,UAAU,CAAC;IAC7C,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAoC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,GAAsB,EACtB,IAAiB,EACjB,UAAiC,EAAE;;IAEnC,IAAA,+BAAsB,EAAC,MAAA,IAAI,CAAC,aAAa,mCAAI,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,KAAK,mCAAI,YAAY,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,kCAAkC,CAAC;IAE1E,SAAS,MAAM;;QACb,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,uDAAI,mCAAI,EAAE,CAAU,CAAC;QAEhE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;YAChC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;YAChC,KAAK,CAAC,WAAW,GAAG,gCAAgC,CAAC;YACrD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5C,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;YAE5B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;YAChC,KAAK,CAAC,WAAW,GAAG,MAAA,IAAI,CAAC,KAAK,mCAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,WAAW;gBAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;YACnD,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEvB,MAAM,OAAO,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,qDAAG,GAAG,CAAC,mCAAI,IAAI,CAAC,OAAO,mCAAI,EAAE,CAAC;YAC1D,sEAAsE;YACtE,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE;;gBAChC,KAAK,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,2BAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACtF,MAAA,OAAO,CAAC,MAAM,wDAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC;YAEF,IAAI,KAAkB,CAAC;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC7C,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC;gBAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC3C,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;oBACtB,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC;wBAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACvD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC;gBACD,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC5C,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC;gBACtB,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC;gBAC9B,GAAG,CAAC,OAAO,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;gBACrD,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1D,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;gBAClE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;gBAChC,KAAK,CAAC,KAAK,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/E,+EAA+E;gBAC/E,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;;oBACpC,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAC1D,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAA,MAAA,IAAI,CAAC,OAAO,qDAAG,GAAG,CAAC,mCAAI,EAAE,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBAC/F,MAAM,CAAC,CAAC,CAAC,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACtC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAuB,oCAAoC;oBAC/E,IAAK,CAAmB,CAAC,GAAG,KAAK,OAAO;wBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC;IAET,OAAO;QACL,OAAO,EAAE,MAAM;QACf,OAAO;YACL,GAAG,aAAH,GAAG,uBAAH,GAAG,EAAI,CAAC;YACR,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** Inject the palette stylesheet once per document. */
2
+ export declare function ensureStencilKitStyles(doc?: Document): void;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureStencilKitStyles = ensureStencilKitStyles;
4
+ /**
5
+ * Stencil-palette styles, injected once per document (same discipline as the
6
+ * dashboard kit: the kit owns its chrome so a host gets a working palette
7
+ * without copying CSS, and every colour is a themable custom property).
8
+ */
9
+ const STENCIL_KIT_STYLE_ID = 'grafloria-stencil-kit-styles';
10
+ const CSS = `
11
+ .gf-stencil {
12
+ --gf-st-bg: #fff; --gf-st-ink: #1e2436; --gf-st-mut: #6b7280;
13
+ --gf-st-line: #e5e7eb; --gf-st-accent: #3B52D9; --gf-st-hover: #f5f7ff;
14
+ display: flex; flex-direction: column; min-height: 0; height: 100%;
15
+ background: var(--gf-st-bg); color: var(--gf-st-ink);
16
+ font: 13px/1.4 ui-sans-serif, system-ui, -apple-system, sans-serif;
17
+ border-right: 1px solid var(--gf-st-line); box-sizing: border-box;
18
+ }
19
+ @media (prefers-color-scheme: dark) {
20
+ .gf-stencil {
21
+ --gf-st-bg: #161a24; --gf-st-ink: #e8ecfb; --gf-st-mut: #9aa4bf;
22
+ --gf-st-line: #2a3040; --gf-st-accent: #8fa2ff; --gf-st-hover: #1e2536;
23
+ }
24
+ }
25
+ .gf-stencil-search { padding: 10px; border-bottom: 1px solid var(--gf-st-line); }
26
+ .gf-stencil-search input {
27
+ width: 100%; box-sizing: border-box; padding: 7px 10px; border-radius: 8px;
28
+ border: 1px solid var(--gf-st-line); background: var(--gf-st-bg);
29
+ color: var(--gf-st-ink); font: inherit; outline: none;
30
+ }
31
+ .gf-stencil-search input:focus { border-color: var(--gf-st-accent); }
32
+ .gf-stencil-body { overflow: auto; flex: 1; min-height: 0; padding-bottom: 8px; }
33
+ .gf-stencil-group > summary {
34
+ cursor: pointer; padding: 8px 10px; font-weight: 600; font-size: 12px;
35
+ letter-spacing: .02em; text-transform: uppercase; color: var(--gf-st-mut);
36
+ list-style: none; user-select: none; display: flex; align-items: center; gap: 6px;
37
+ }
38
+ .gf-stencil-group > summary::-webkit-details-marker { display: none; }
39
+ .gf-stencil-group > summary::before { content: '▸'; font-size: 10px; transition: transform .15s; }
40
+ .gf-stencil-group[open] > summary::before { transform: rotate(90deg); }
41
+ .gf-stencil-group > summary:hover { color: var(--gf-st-ink); }
42
+ .gf-stencil-count { margin-left: auto; font-weight: 500; opacity: .7; text-transform: none; }
43
+ .gf-stencil-items {
44
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(74px, 1fr));
45
+ gap: 4px; padding: 2px 8px 10px;
46
+ }
47
+ .gf-stencil-item {
48
+ display: flex; flex-direction: column; align-items: center; gap: 4px;
49
+ padding: 8px 4px; border-radius: 8px; cursor: grab; border: 1px solid transparent;
50
+ text-align: center; background: none;
51
+ }
52
+ .gf-stencil-item:hover { background: var(--gf-st-hover); border-color: var(--gf-st-line); }
53
+ .gf-stencil-item:active { cursor: grabbing; }
54
+ .gf-stencil-item svg { display: block; overflow: visible; }
55
+ .gf-stencil-label {
56
+ font-size: 10.5px; color: var(--gf-st-mut); line-height: 1.25;
57
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
58
+ overflow: hidden; word-break: break-word;
59
+ }
60
+ .gf-stencil-item:hover .gf-stencil-label { color: var(--gf-st-ink); }
61
+ .gf-stencil-empty { padding: 18px 12px; color: var(--gf-st-mut); font-size: 12px; text-align: center; }
62
+ .gf-shapedata {
63
+ --gf-st-bg: #fff; --gf-st-ink: #1e2436; --gf-st-mut: #6b7280;
64
+ --gf-st-line: #e5e7eb; --gf-st-accent: #3B52D9;
65
+ display: flex; flex-direction: column; height: 100%; box-sizing: border-box;
66
+ background: var(--gf-st-bg); color: var(--gf-st-ink); overflow: auto;
67
+ font: 13px/1.4 ui-sans-serif, system-ui, -apple-system, sans-serif;
68
+ border-left: 1px solid var(--gf-st-line);
69
+ }
70
+ @media (prefers-color-scheme: dark) {
71
+ .gf-shapedata { --gf-st-bg: #161a24; --gf-st-ink: #e8ecfb; --gf-st-mut: #9aa4bf; --gf-st-line: #2a3040; --gf-st-accent: #8fa2ff; }
72
+ }
73
+ .gf-sd-title {
74
+ padding: 10px 12px; font-weight: 600; font-size: 12px; text-transform: uppercase;
75
+ letter-spacing: .02em; color: var(--gf-st-mut); border-bottom: 1px solid var(--gf-st-line);
76
+ }
77
+ .gf-sd-empty { padding: 16px 12px; color: var(--gf-st-mut); font-size: 12px; }
78
+ .gf-sd-fields { display: flex; flex-direction: column; gap: 8px; padding: 12px; }
79
+ .gf-sd-row { display: flex; flex-direction: column; gap: 3px; }
80
+ .gf-sd-label { font-size: 11px; color: var(--gf-st-mut); }
81
+ .gf-sd-input {
82
+ padding: 6px 8px; border: 1px solid var(--gf-st-line); border-radius: 7px;
83
+ background: var(--gf-st-bg); color: var(--gf-st-ink); font: inherit; outline: none; width: 100%; box-sizing: border-box;
84
+ }
85
+ .gf-sd-input:focus { border-color: var(--gf-st-accent); }
86
+ .gf-sd-check { width: 16px; height: 16px; accent-color: var(--gf-st-accent); }
87
+
88
+ /* The canvas while a stencil is held over it. */
89
+ .gf-stencil-target { outline: 2px dashed var(--gf-st-accent); outline-offset: -3px; }
90
+ `;
91
+ /** Inject the palette stylesheet once per document. */
92
+ function ensureStencilKitStyles(doc = document) {
93
+ if (doc.getElementById(STENCIL_KIT_STYLE_ID))
94
+ return;
95
+ const style = doc.createElement('style');
96
+ style.id = STENCIL_KIT_STYLE_ID;
97
+ style.textContent = CSS;
98
+ doc.head.appendChild(style);
99
+ }
100
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../libs/element/src/lib/stencil-kit/styles.ts"],"names":[],"mappings":";;AA0FA,wDAMC;AAhGD;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFX,CAAC;AAEF,uDAAuD;AACvD,SAAgB,sBAAsB,CAAC,MAAgB,QAAQ;IAC7D,IAAI,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAAE,OAAO;IACrD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}