@snowcone-app/canvas 0.23.0 → 0.27.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 (73) hide show
  1. package/ERROR_CONTRACT.md +638 -0
  2. package/README.md +2 -1
  3. package/STYLING_CONTRACT.md +59 -8
  4. package/dist/{CanvasRenderer-6_HhR4-q.js → CanvasRenderer-yszzrDfo.js} +4 -4
  5. package/dist/{CanvasRenderer-6_HhR4-q.js.map → CanvasRenderer-yszzrDfo.js.map} +1 -1
  6. package/dist/{CanvasStateV1-DmZ1Qvvn.js → CanvasStateV1-BTbCD_xC.js} +3 -3
  7. package/dist/{CanvasStateV1-DmZ1Qvvn.js.map → CanvasStateV1-BTbCD_xC.js.map} +1 -1
  8. package/dist/{ContextualToolbars-BDEt9ND0.js → ContextualToolbars-BHjYsril.js} +6 -6
  9. package/dist/{ContextualToolbars-BDEt9ND0.js.map → ContextualToolbars-BHjYsril.js.map} +1 -1
  10. package/dist/{EditorCanvasImpl-Ckg7WO2j.js → EditorCanvasImpl-Ui8Ceb-h.js} +8 -8
  11. package/dist/{EditorCanvasImpl-Ckg7WO2j.js.map → EditorCanvasImpl-Ui8Ceb-h.js.map} +1 -1
  12. package/dist/{ExportManager-DoU4VK6h.js → ExportManager-BTcyj4cf.js} +2 -2
  13. package/dist/{ExportManager-DoU4VK6h.js.map → ExportManager-BTcyj4cf.js.map} +1 -1
  14. package/dist/{FontAnalyzer-CwIpgTGd.js → FontAnalyzer-EF3gLPr8.js} +30 -20
  15. package/dist/{FontAnalyzer-CwIpgTGd.js.map → FontAnalyzer-EF3gLPr8.js.map} +1 -1
  16. package/dist/{ImagePanel-BwqFDKvW.js → ImagePanel-CIk6z41z.js} +6 -6
  17. package/dist/{ImagePanel-BwqFDKvW.js.map → ImagePanel-CIk6z41z.js.map} +1 -1
  18. package/dist/{SnowconeCanvas-D1sLcIja.js → SnowconeCanvas-DuWALOAt.js} +10 -10
  19. package/dist/{SnowconeCanvas-D1sLcIja.js.map → SnowconeCanvas-DuWALOAt.js.map} +1 -1
  20. package/dist/{UnifiedFontService-CC3CSmH5.js → UnifiedFontService-CHVYDBDW.js} +869 -836
  21. package/dist/{UnifiedFontService-CC3CSmH5.js.map → UnifiedFontService-CHVYDBDW.js.map} +1 -1
  22. package/dist/advanced.mjs +14 -14
  23. package/dist/api/embed.d.ts +6 -2
  24. package/dist/components/editor/EditorLoadingOverlay.d.ts +12 -0
  25. package/dist/components/editor/EditorPlacements.d.ts +14 -0
  26. package/dist/components/editor/EditorPreview.d.ts +32 -8
  27. package/dist/components/editor/EditorRoot.d.ts +12 -0
  28. package/dist/components/editor/PreviewPrismOverlay.d.ts +23 -0
  29. package/dist/components/editor/RootInternals.d.ts +31 -0
  30. package/dist/components/editor/editorAudit.d.ts +66 -0
  31. package/dist/components/editor/index.d.ts +14 -0
  32. package/dist/components/editor/usePlacements.d.ts +14 -0
  33. package/dist/components/embed-realtime/context.d.ts +11 -2
  34. package/dist/components/embed-realtime/validateEmbed.d.ts +20 -1
  35. package/dist/contexts/EditorContext.d.ts +34 -0
  36. package/dist/core/HybridHistoryManager.d.ts +7 -0
  37. package/dist/core/elementGuards.d.ts +19 -0
  38. package/dist/{custom-icons-BW6hqmkL.js → custom-icons-CcLMyybv.js} +7 -7
  39. package/dist/{custom-icons-BW6hqmkL.js.map → custom-icons-CcLMyybv.js.map} +1 -1
  40. package/dist/design/design-builder.d.ts +41 -3
  41. package/dist/design/product-config.d.ts +10 -0
  42. package/dist/{design-builder-2VUjfmdt.js → design-builder-cZY958Rw.js} +109 -61
  43. package/dist/design-builder-cZY958Rw.js.map +1 -0
  44. package/dist/editorErrors-BhrZ_nwj.js +1219 -0
  45. package/dist/editorErrors-BhrZ_nwj.js.map +1 -0
  46. package/dist/embed-CJswRZte.js +1586 -0
  47. package/dist/embed-CJswRZte.js.map +1 -0
  48. package/dist/embed.mjs +42 -34
  49. package/dist/errors/editorError.d.ts +29 -1
  50. package/dist/{guards-8rkFAMBs.js → guards-DIX8aXWM.js} +2 -2
  51. package/dist/{guards-8rkFAMBs.js.map → guards-DIX8aXWM.js.map} +1 -1
  52. package/dist/hooks/elementPatch.d.ts +96 -0
  53. package/dist/hooks/useCommands.d.ts +20 -0
  54. package/dist/index.mjs +8 -8
  55. package/dist/internals.mjs +9 -9
  56. package/dist/style.css +1 -1
  57. package/dist/template-fields-BXl29sgh.js +716 -0
  58. package/dist/template-fields-BXl29sgh.js.map +1 -0
  59. package/dist/testing.mjs +4 -4
  60. package/dist/{usePieceGuideBundle-CbJJg66S.js → usePieceGuideBundle-DE21DQGZ.js} +2 -2
  61. package/dist/{usePieceGuideBundle-CbJJg66S.js.map → usePieceGuideBundle-DE21DQGZ.js.map} +1 -1
  62. package/dist/{validation-C9Fe9ahK.js → validation-DGXAQmUC.js} +11 -11
  63. package/dist/{validation-C9Fe9ahK.js.map → validation-DGXAQmUC.js.map} +1 -1
  64. package/example/package.json +1 -1
  65. package/llms.txt +3 -0
  66. package/package.json +7 -4
  67. package/dist/design-builder-2VUjfmdt.js.map +0 -1
  68. package/dist/editorErrors-B2mb1sVN.js +0 -1208
  69. package/dist/editorErrors-B2mb1sVN.js.map +0 -1
  70. package/dist/embed-DxsaqZJF.js +0 -1226
  71. package/dist/embed-DxsaqZJF.js.map +0 -1
  72. package/dist/template-fields-CQ6n2P4V.js +0 -548
  73. package/dist/template-fields-CQ6n2P4V.js.map +0 -1
@@ -0,0 +1,1219 @@
1
+ import { jsx as H } from "react/jsx-runtime";
2
+ import { useContext as G, useSyncExternalStore as ct, useCallback as l, createContext as Q, useRef as me, useState as b, useEffect as Oe, useMemo as q } from "react";
3
+ import { y as De, N as dt, U as at, ac as lt, G as We, ad as ut, ae as mt, af as ft, ag as At, ah as pt, c as Ze, z as ht, ai as xt, aj as yt, ak as Et, E as bt, L as Le, I as St, g as wt, S as It, al as gt, am as _e } from "./FontAnalyzer-EF3gLPr8.js";
4
+ const Ge = Q(null), Tt = () => () => {
5
+ }, Be = () => 0;
6
+ function Kt() {
7
+ const t = G(Ge), e = ct(
8
+ t ? t.subscribe : Tt,
9
+ t ? t.getVersion : Be,
10
+ t ? t.getVersion : Be
11
+ );
12
+ return l(
13
+ (o) => !!(t && o && t.getBoundLayer(o)),
14
+ // `version` is the reactivity key: a registry change must mint a new
15
+ // callback so memoized consumers re-evaluate.
16
+ [t, e]
17
+ );
18
+ }
19
+ class Xe extends Error {
20
+ constructor(e, o, n = {}) {
21
+ super(`[Editor] ${e}: ${o}`), this.name = "EditorError", this.code = e, this.data = { code: e, ...n };
22
+ }
23
+ }
24
+ function Ct(t) {
25
+ return t instanceof Error && t.name === "EditorError" && "code" in t;
26
+ }
27
+ function Rt() {
28
+ var t;
29
+ return typeof De < "u" && ((t = De.env) == null ? void 0 : t.NODE_ENV) !== "production";
30
+ }
31
+ const pe = Ze("useCommandHistory");
32
+ function Pt(t, e, o, n) {
33
+ const a = me(new dt(o)), u = G(Ge), i = l(
34
+ (s, A) => {
35
+ const y = s == null ? void 0 : s.name;
36
+ if (!u || !y) return;
37
+ const x = u.getBoundLayer(y);
38
+ if (x)
39
+ throw new Xe(
40
+ "E_BOUND_LAYER_MUTATION",
41
+ `cannot ${A} layer "${y}" — a mounted <${x.part} layer={design.layer("${y}")}> is bound to it. Unmount that field first, or keep the layer and set its text through the field / its binding instead.`,
42
+ { layer: y, part: x.part, operation: A, docSlug: "embed-mode" }
43
+ );
44
+ },
45
+ [u]
46
+ ), [r, m] = b({
47
+ canUndo: !1,
48
+ canRedo: !1,
49
+ // Per-artboard state for the active artboard
50
+ canUndoActiveArtboard: !1,
51
+ canRedoActiveArtboard: !1
52
+ }), c = l(() => {
53
+ const s = a.current, A = o.getActiveArtboardId();
54
+ m({
55
+ canUndo: s.canUndo(),
56
+ canRedo: s.canRedo(),
57
+ // Per-artboard state - only check active artboard's history
58
+ canUndoActiveArtboard: A ? s.canUndoArtboard(A) : !1,
59
+ canRedoActiveArtboard: A ? s.canRedoArtboard(A) : !1
60
+ });
61
+ }, [o]), V = l(
62
+ (s, A) => {
63
+ s && s.name !== A.name && i(s, "rename");
64
+ const y = new at(
65
+ A.id,
66
+ s || null,
67
+ A,
68
+ (T) => {
69
+ e(($) => $.map((F) => F.id === T.id ? T : F));
70
+ }
71
+ ), x = o.getArtboardIdForElement(A.id);
72
+ if (x)
73
+ a.current.executeOnArtboard(x, y);
74
+ else {
75
+ const T = o.getActiveArtboardId();
76
+ T && a.current.executeOnArtboard(T, y);
77
+ }
78
+ c();
79
+ },
80
+ [e, o, c, i]
81
+ ), O = l(
82
+ (s, A, y, x) => {
83
+ const T = A || o.getActiveArtboardId();
84
+ if (!T) {
85
+ pe.warn("No active artboard to add element to");
86
+ return;
87
+ }
88
+ const $ = new lt(
89
+ s,
90
+ (F) => {
91
+ const N = F;
92
+ e((v) => {
93
+ if (x) {
94
+ const U = v.findIndex((P) => P.id === x);
95
+ if (U !== -1) {
96
+ const P = [...v];
97
+ return P.splice(U, 0, N), P;
98
+ }
99
+ }
100
+ if (y) {
101
+ const U = v.findIndex((P) => P.id === y);
102
+ if (U !== -1) {
103
+ const P = [...v];
104
+ return P.splice(U + 1, 0, N), P;
105
+ }
106
+ for (let P = 0; P < v.length; P++) {
107
+ const X = v[P];
108
+ if (X instanceof We && X.children) {
109
+ const oe = X.children.findIndex((j) => j.id === y);
110
+ if (oe !== -1) {
111
+ const j = X.clone();
112
+ j.children.splice(oe + 1, 0, N);
113
+ const Y = [...v];
114
+ return Y[P] = j, Y;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return [...v, N];
120
+ }), o.addElementToArtboard(F.id, T);
121
+ },
122
+ (F) => {
123
+ e((N) => N.filter((v) => v.id !== F)), o.removeElementFromArtboard(F);
124
+ }
125
+ );
126
+ a.current.executeOnArtboard(T, $), c();
127
+ },
128
+ [e, o, c]
129
+ ), D = l(
130
+ (s) => {
131
+ i(s, "delete");
132
+ const A = o.getArtboardIdForElement(s.id);
133
+ if (!A) {
134
+ pe.warn("Element not found in any artboard");
135
+ return;
136
+ }
137
+ const y = new ut(
138
+ s,
139
+ (x) => {
140
+ e((T) => [...T, x]), o.addElementToArtboard(x.id, A);
141
+ },
142
+ (x) => {
143
+ e((T) => T.filter(($) => $.id !== x)), o.removeElementFromArtboard(x);
144
+ }
145
+ );
146
+ a.current.executeOnArtboard(A, y), c();
147
+ },
148
+ [e, o, c, i]
149
+ ), w = l(
150
+ (s) => {
151
+ const A = new mt(s, o);
152
+ a.current.executeGlobal(A), c(), n == null || n();
153
+ },
154
+ [o, c, n]
155
+ ), L = l(
156
+ (s) => {
157
+ const A = new ft(s, o);
158
+ a.current.executeGlobal(A), c(), n == null || n();
159
+ },
160
+ [o, c, n]
161
+ ), p = l(
162
+ (s, A, y) => {
163
+ const x = new At(s, A, y, o);
164
+ a.current.executeGlobal(x), c(), n == null || n();
165
+ },
166
+ [o, c, n]
167
+ ), f = l(
168
+ (s) => {
169
+ if (s.length === 0)
170
+ return;
171
+ const A = o.getActiveArtboardId();
172
+ if (!A) {
173
+ pe.warn("No active artboard for batch execution");
174
+ return;
175
+ }
176
+ const y = s.map((x) => new class extends Object {
177
+ execute() {
178
+ x.execute();
179
+ }
180
+ undo() {
181
+ x.undo();
182
+ }
183
+ }());
184
+ a.current.executeBatchOnArtboard(A, y), c();
185
+ },
186
+ [o, c]
187
+ ), I = l(() => {
188
+ a.current.undo() && (c(), n == null || n());
189
+ }, [c, n]), z = l(() => {
190
+ a.current.redo() && (c(), n == null || n());
191
+ }, [c, n]), g = l(() => {
192
+ const s = o.getActiveArtboardId();
193
+ s && a.current.undoArtboard(s) && (c(), n == null || n());
194
+ }, [o, c, n]), S = l(() => {
195
+ const s = o.getActiveArtboardId();
196
+ s && a.current.redoArtboard(s) && (c(), n == null || n());
197
+ }, [o, c, n]), B = l(() => {
198
+ a.current.clear(), c();
199
+ }, [c]), ne = l(
200
+ (s) => {
201
+ a.current.clearArtboardHistory(s), c();
202
+ },
203
+ [c]
204
+ ), _ = me(null);
205
+ Oe(() => {
206
+ const s = o.getActiveArtboardId();
207
+ s !== _.current && (_.current = s, c());
208
+ });
209
+ const Z = l(
210
+ (s, A, y) => {
211
+ const x = t.map((F) => F.id), T = o.getArtboardIdForElement(s);
212
+ if (!T) {
213
+ pe.warn("Element not found in any artboard");
214
+ return;
215
+ }
216
+ const $ = new pt(s, A, y, x, (F) => {
217
+ e((N) => {
218
+ const v = new Map(N.map((U) => [U.id, U]));
219
+ return F.map((U) => v.get(U)).filter(Boolean);
220
+ });
221
+ });
222
+ a.current.executeOnArtboard(T, $), c();
223
+ },
224
+ [t, e, o, c]
225
+ );
226
+ return {
227
+ // Element operations
228
+ executeElementUpdate: V,
229
+ executeAddElement: O,
230
+ executeRemoveElement: D,
231
+ executeReorderElement: Z,
232
+ // Batch operations
233
+ executeCommandBatch: f,
234
+ // Artboard operations
235
+ executeCreateArtboard: w,
236
+ executeDeleteArtboard: L,
237
+ executeUpdateArtboard: p,
238
+ // Undo/redo (smart - considers last operation and active artboard)
239
+ undo: I,
240
+ redo: z,
241
+ // Undo/redo for active artboard only (element operations)
242
+ undoActiveArtboard: g,
243
+ redoActiveArtboard: S,
244
+ clearHistory: B,
245
+ clearArtboardHistory: ne,
246
+ // State (smart - considers last operation)
247
+ canUndo: r.canUndo,
248
+ canRedo: r.canRedo,
249
+ // State for active artboard only
250
+ canUndoActiveArtboard: r.canUndoActiveArtboard,
251
+ canRedoActiveArtboard: r.canRedoActiveArtboard,
252
+ historyManager: a.current
253
+ };
254
+ }
255
+ function ce(t) {
256
+ return t && "fontSize" in t && "color" in t && "fontFamily" in t;
257
+ }
258
+ function Ft(t, e) {
259
+ const [o, n] = b(32), [a, u] = b("#333333"), [i, r] = b("Arial"), [m, c] = b("center");
260
+ Oe(() => {
261
+ if (t && ce(t)) {
262
+ const p = t.transformType === "circle" && "getEffectiveFontSize" in t ? Math.round(t.getEffectiveFontSize()) : Math.round(t.fontSize), f = t.color, I = t.fontFamily, z = t.textAlign;
263
+ n((g) => g !== p ? p : g), u((g) => g !== f ? f : g), r((g) => g !== I ? I : g), c((g) => g !== z ? z : g);
264
+ }
265
+ }, [t]);
266
+ const V = l(
267
+ (p) => {
268
+ if (!t || !ce(t)) return;
269
+ const f = Math.max(xt, Math.min(yt, o + p));
270
+ n(f);
271
+ const I = t.clone();
272
+ I.transformType === "circle" && "setEffectiveFontSize" in I ? I.setEffectiveFontSize(f) : I.setFontSize(f), e(I);
273
+ },
274
+ [t, o, e]
275
+ ), O = l(
276
+ (p) => {
277
+ if (!t || !ce(t)) return;
278
+ n(p);
279
+ const f = t.clone();
280
+ f.transformType === "circle" && "setEffectiveFontSize" in f ? f.setEffectiveFontSize(p) : f.setFontSize(p), e(f);
281
+ },
282
+ [t, e]
283
+ ), D = l(
284
+ (p) => {
285
+ if (!t || !ce(t)) return;
286
+ u(p);
287
+ const f = t.clone();
288
+ if (f.color = p, f.richText)
289
+ for (const I of f.richText.spans)
290
+ I.style.color = void 0;
291
+ e(f);
292
+ },
293
+ [t, e]
294
+ ), w = l(
295
+ (p) => {
296
+ if (!t || !ce(t)) return;
297
+ const f = t.fontFamily;
298
+ f !== p && ht.clearCache(f), r(p);
299
+ const I = t.clone();
300
+ I.fontFamily = p, e(I);
301
+ },
302
+ [t, e]
303
+ ), L = l(
304
+ (p) => {
305
+ if (!t || !ce(t)) return;
306
+ c(p);
307
+ const f = t.clone();
308
+ f.textAlign = p, e(f);
309
+ },
310
+ [t, e]
311
+ );
312
+ return {
313
+ // State
314
+ fontSize: o,
315
+ fontColor: a,
316
+ fontFamily: i,
317
+ textAlign: m,
318
+ // State setters (for UI only)
319
+ setFontSize: n,
320
+ setFontColor: u,
321
+ setFontFamily: r,
322
+ setTextAlign: c,
323
+ // Update functions (update element + UI)
324
+ updateFontSize: V,
325
+ setFontSizeValue: O,
326
+ updateFontColor: D,
327
+ updateFontFamily: w,
328
+ updateTextAlign: L
329
+ };
330
+ }
331
+ const je = "data-preserve-selection";
332
+ function vt(t) {
333
+ if (!(t instanceof Element))
334
+ return !1;
335
+ let e = t;
336
+ const o = [];
337
+ for (; e; ) {
338
+ const n = e.id ? `#${e.id}` : "", a = e.className ? `.${String(e.className).split(" ").slice(0, 2).join(".")}` : "";
339
+ if (o.push(`${e.tagName.toLowerCase()}${n}${a}`), e.hasAttribute(je))
340
+ return !0;
341
+ const u = e.getAttribute("role");
342
+ if (u === "dialog" || u === "alertdialog" || u === "menu" || u === "listbox")
343
+ return !0;
344
+ const i = e.getAttribute("data-slot");
345
+ if (i && (i.includes("popover") || i.includes("dialog")) || e.hasAttribute("data-radix-popper-content-wrapper"))
346
+ return !0;
347
+ e = e.parentElement;
348
+ }
349
+ return !1;
350
+ }
351
+ const qt = {
352
+ [je]: ""
353
+ };
354
+ function zt(t) {
355
+ const e = Ye(t);
356
+ return e !== null && e < 0.5;
357
+ }
358
+ function Qt(t) {
359
+ const e = Ye(t);
360
+ return e !== null && e >= 0.5;
361
+ }
362
+ function Ye(t) {
363
+ const e = t.trim();
364
+ if (e.startsWith("#")) {
365
+ const n = e.slice(1);
366
+ let a, u, i;
367
+ if (n.length === 3)
368
+ a = parseInt(n[0] + n[0], 16), u = parseInt(n[1] + n[1], 16), i = parseInt(n[2] + n[2], 16);
369
+ else if (n.length === 6)
370
+ a = parseInt(n.slice(0, 2), 16), u = parseInt(n.slice(2, 4), 16), i = parseInt(n.slice(4, 6), 16);
371
+ else return null;
372
+ return Number.isNaN(a) || Number.isNaN(u) || Number.isNaN(i) ? null : $e(a, u, i);
373
+ }
374
+ const o = e.match(/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);
375
+ return o ? $e(Number(o[1]), Number(o[2]), Number(o[3])) : null;
376
+ }
377
+ function $e(t, e, o) {
378
+ const n = (a) => {
379
+ const u = a / 255;
380
+ return u <= 0.03928 ? u / 12.92 : Math.pow((u + 0.055) / 1.055, 2.4);
381
+ };
382
+ return 0.2126 * n(t) + 0.7152 * n(e) + 0.0722 * n(o);
383
+ }
384
+ const Ot = "#333333", Ut = "#f4f4f5";
385
+ function Ht(t) {
386
+ return t && zt(t) ? Ut : Ot;
387
+ }
388
+ const Je = Q(null), Vt = 0.1, Nt = 4, ke = 0.25, Dt = ({
389
+ children: t,
390
+ artboardManager: e,
391
+ canvasRef: o,
392
+ viewPadding: n = 0.9
393
+ }) => {
394
+ const [a, u] = b(1), [i, r] = b({ x: 0, y: 0 }), [m, c] = b(!1), [V, O] = b(1), D = l(() => {
395
+ O(1), r({ x: 0, y: 0 });
396
+ }, []), w = l(() => {
397
+ u((z) => Math.min(z + ke, Nt));
398
+ }, []), L = l(() => {
399
+ u((z) => Math.max(z - ke, Vt));
400
+ }, []), p = l(() => {
401
+ const z = e.getActiveArtboard();
402
+ if (!z || !o.current) return;
403
+ let g = o.current.parentElement, S = 0, B = 0;
404
+ for (; g && (S = g.clientWidth, B = g.clientHeight, !(S > 0 && B > 0)); )
405
+ g = g.parentElement;
406
+ if (!S || !B) return;
407
+ const ne = Math.min(
408
+ S * n / z.width,
409
+ B * n / z.height,
410
+ 1
411
+ // Never zoom in beyond 100%
412
+ );
413
+ u(ne), r({ x: 0, y: 0 });
414
+ }, [e, o, n]), f = l(() => {
415
+ u(1), r({ x: 0, y: 0 });
416
+ }, []), I = q(
417
+ () => ({
418
+ zoom: a,
419
+ panOffset: i,
420
+ isPanning: m,
421
+ zoomIn: w,
422
+ zoomOut: L,
423
+ zoomToFit: p,
424
+ resetView: f,
425
+ setZoom: u,
426
+ setPanOffset: r,
427
+ setIsPanning: c,
428
+ userZoom: V,
429
+ setUserZoom: O,
430
+ resetUserView: D
431
+ }),
432
+ [a, i, m, w, L, p, f, V, D]
433
+ );
434
+ return /* @__PURE__ */ H(Je.Provider, { value: I, children: t });
435
+ };
436
+ function Lt() {
437
+ const t = G(Je);
438
+ if (!t)
439
+ throw new Error("useViewportContext must be used within a ViewportProvider (or EditorProvider)");
440
+ return t;
441
+ }
442
+ const Me = Q(null), _t = ({ children: t }) => {
443
+ const [e, o] = b(null), [n, a] = b([]), [u, i] = b(null), [r, m] = b(null), [c, V] = b(!1), O = l((L) => {
444
+ o(L);
445
+ }, []), D = l((L) => {
446
+ i(L);
447
+ }, []), w = q(
448
+ () => ({
449
+ selectedId: e,
450
+ multiSelection: n,
451
+ activeChildElement: u,
452
+ hoveredElementId: r,
453
+ hideHandles: c,
454
+ setSelectedId: o,
455
+ setMultiSelection: a,
456
+ setHoveredElementId: m,
457
+ setHideHandles: V,
458
+ handleSelectionChange: O,
459
+ handleActiveChildChange: D
460
+ }),
461
+ [
462
+ e,
463
+ n,
464
+ u,
465
+ r,
466
+ c,
467
+ O,
468
+ D
469
+ ]
470
+ );
471
+ return /* @__PURE__ */ H(Me.Provider, { value: w, children: t });
472
+ };
473
+ function Bt() {
474
+ const t = G(Me);
475
+ if (!t)
476
+ throw new Error("useSelectionContext must be used within a SelectionProvider (or EditorProvider)");
477
+ return t;
478
+ }
479
+ const Ke = Q(null), $t = ({ children: t, value: e }) => {
480
+ const o = q(
481
+ () => ({
482
+ undo: e.undo,
483
+ redo: e.redo,
484
+ canUndo: e.canUndo,
485
+ canRedo: e.canRedo,
486
+ undoActiveArtboard: e.undoActiveArtboard,
487
+ redoActiveArtboard: e.redoActiveArtboard,
488
+ canUndoActiveArtboard: e.canUndoActiveArtboard,
489
+ canRedoActiveArtboard: e.canRedoActiveArtboard
490
+ }),
491
+ [
492
+ e.undo,
493
+ e.redo,
494
+ e.canUndo,
495
+ e.canRedo,
496
+ e.undoActiveArtboard,
497
+ e.redoActiveArtboard,
498
+ e.canUndoActiveArtboard,
499
+ e.canRedoActiveArtboard
500
+ ]
501
+ );
502
+ return /* @__PURE__ */ H(Ke.Provider, { value: o, children: t });
503
+ };
504
+ function en() {
505
+ const t = G(Ke);
506
+ if (!t)
507
+ throw new Error("useHistoryContext must be used within a HistoryProvider (or EditorProvider)");
508
+ return t;
509
+ }
510
+ const qe = Q(null), kt = ({ children: t }) => {
511
+ const [e, o] = b(null), [n, a] = b(!1), [u, i] = b(0), [r, m] = b(!1), [c, V] = b(!1), O = q(
512
+ () => ({
513
+ expandedPanelType: e,
514
+ setExpandedPanelType: o,
515
+ isToolbarMenuOpen: n,
516
+ setIsToolbarMenuOpen: a,
517
+ textSelectionVersion: u,
518
+ setTextSelectionVersion: i,
519
+ isCanvasReady: r,
520
+ setCanvasReady: m,
521
+ isRotating: c,
522
+ setIsRotating: V
523
+ }),
524
+ [e, n, u, r, c]
525
+ );
526
+ return /* @__PURE__ */ H(qe.Provider, { value: O, children: t });
527
+ };
528
+ function Wt() {
529
+ const t = G(qe);
530
+ if (!t)
531
+ throw new Error("useToolStateContext must be used within a ToolStateProvider (or EditorProvider)");
532
+ return t;
533
+ }
534
+ const Qe = Q(null), Zt = ({ children: t, value: e }) => {
535
+ const o = q(
536
+ () => ({
537
+ elements: e.elements,
538
+ elementStore: e.elementStore,
539
+ artboards: e.artboards,
540
+ artboardManager: e.artboardManager,
541
+ artboardVersion: e.artboardVersion,
542
+ setElements: e.setElements,
543
+ refreshArtboards: e.refreshArtboards,
544
+ getElementById: e.getElementById,
545
+ handleAddElement: e.handleAddElement,
546
+ handleElementUpdate: e.handleElementUpdate,
547
+ handleLoadWorkspace: e.handleLoadWorkspace,
548
+ handleCopyElements: e.handleCopyElements,
549
+ handlePasteElements: e.handlePasteElements,
550
+ fontSize: e.fontSize,
551
+ fontColor: e.fontColor,
552
+ fontFamily: e.fontFamily,
553
+ textAlign: e.textAlign,
554
+ updateFontSize: e.updateFontSize,
555
+ setFontSizeValue: e.setFontSizeValue,
556
+ updateFontColor: e.updateFontColor,
557
+ updateFontFamily: e.updateFontFamily,
558
+ updateTextAlign: e.updateTextAlign,
559
+ canvasRef: e.canvasRef,
560
+ canvasEditorRef: e.canvasEditorRef
561
+ }),
562
+ [
563
+ e.elements,
564
+ e.elementStore,
565
+ e.artboards,
566
+ e.artboardManager,
567
+ e.artboardVersion,
568
+ e.setElements,
569
+ e.refreshArtboards,
570
+ e.getElementById,
571
+ e.handleAddElement,
572
+ e.handleElementUpdate,
573
+ e.handleLoadWorkspace,
574
+ e.handleCopyElements,
575
+ e.handlePasteElements,
576
+ e.fontSize,
577
+ e.fontColor,
578
+ e.fontFamily,
579
+ e.textAlign,
580
+ e.updateFontSize,
581
+ e.setFontSizeValue,
582
+ e.updateFontColor,
583
+ e.updateFontFamily,
584
+ e.updateTextAlign,
585
+ e.canvasRef,
586
+ e.canvasEditorRef
587
+ ]
588
+ );
589
+ return /* @__PURE__ */ H(Qe.Provider, { value: o, children: t });
590
+ };
591
+ function tn() {
592
+ const t = G(Qe);
593
+ if (!t)
594
+ throw new Error("useElementsContext must be used within an ElementsProvider (or EditorProvider)");
595
+ return t;
596
+ }
597
+ const et = Q(null), Gt = ({ children: t, value: e }) => {
598
+ const o = q(
599
+ () => ({
600
+ executeElementUpdate: e.executeElementUpdate,
601
+ executeAddElement: e.executeAddElement,
602
+ executeRemoveElement: e.executeRemoveElement,
603
+ executeReorderElement: e.executeReorderElement,
604
+ executeCreateArtboard: e.executeCreateArtboard,
605
+ executeDeleteArtboard: e.executeDeleteArtboard,
606
+ executeUpdateArtboard: e.executeUpdateArtboard,
607
+ executeCommandBatch: e.executeCommandBatch,
608
+ undo: e.undo,
609
+ redo: e.redo,
610
+ canUndo: e.canUndo,
611
+ canRedo: e.canRedo,
612
+ undoActiveArtboard: e.undoActiveArtboard,
613
+ redoActiveArtboard: e.redoActiveArtboard,
614
+ canUndoActiveArtboard: e.canUndoActiveArtboard,
615
+ canRedoActiveArtboard: e.canRedoActiveArtboard,
616
+ historyManager: e.historyManager
617
+ }),
618
+ [
619
+ e.executeElementUpdate,
620
+ e.executeAddElement,
621
+ e.executeRemoveElement,
622
+ e.executeReorderElement,
623
+ e.executeCreateArtboard,
624
+ e.executeDeleteArtboard,
625
+ e.executeUpdateArtboard,
626
+ e.executeCommandBatch,
627
+ e.undo,
628
+ e.redo,
629
+ e.canUndo,
630
+ e.canRedo,
631
+ e.undoActiveArtboard,
632
+ e.redoActiveArtboard,
633
+ e.canUndoActiveArtboard,
634
+ e.canRedoActiveArtboard,
635
+ e.historyManager
636
+ ]
637
+ );
638
+ return /* @__PURE__ */ H(et.Provider, { value: o, children: t });
639
+ };
640
+ function nn() {
641
+ const t = G(et);
642
+ if (!t)
643
+ throw new Error("useCommandContext must be used within a CommandProvider (or EditorProvider)");
644
+ return t;
645
+ }
646
+ const Xt = Ze("EditorContext"), tt = Q(null), nt = Q(null), on = () => {
647
+ const t = G(nt);
648
+ if (!t)
649
+ throw new Error("useEditorHandles must be used within EditorProvider");
650
+ return t;
651
+ }, jt = ({ children: t, artboardManager: e, canvasRef: o, canvasEditorRef: n }) => {
652
+ const a = me(null), u = q(() => ({ get: () => a.current }), []), i = Lt(), r = Bt(), m = Wt(), [c, V] = b(
653
+ () => e.getAllArtboards()
654
+ ), [O, D] = b(0), [w, L] = b(
655
+ () => new Le()
656
+ ), p = q(() => w.toArray(), [w]), f = l((d) => {
657
+ L((h) => {
658
+ const E = h.toArray(), C = typeof d == "function" ? d(E) : d;
659
+ return C === E ? h : Le.fromArray(C);
660
+ });
661
+ }, []), I = l(
662
+ (d) => w.get(d),
663
+ [w]
664
+ ), [z, g] = b([]), S = r.selectedId ? w.get(r.selectedId) : void 0, B = l(() => {
665
+ V([...e.getAllArtboards()]), D((d) => d + 1);
666
+ }, [e]), {
667
+ historyManager: ne,
668
+ executeElementUpdate: _,
669
+ executeAddElement: Z,
670
+ executeRemoveElement: s,
671
+ executeReorderElement: A,
672
+ executeCommandBatch: y,
673
+ executeCreateArtboard: x,
674
+ executeDeleteArtboard: T,
675
+ executeUpdateArtboard: $,
676
+ undo: F,
677
+ redo: N,
678
+ canUndo: v,
679
+ canRedo: U,
680
+ undoActiveArtboard: P,
681
+ redoActiveArtboard: X,
682
+ canUndoActiveArtboard: oe,
683
+ canRedoActiveArtboard: j
684
+ } = Pt(
685
+ p,
686
+ f,
687
+ e,
688
+ B
689
+ ), Y = l(
690
+ (d) => {
691
+ const h = w.get(d.id);
692
+ _(h, d);
693
+ },
694
+ [w, _]
695
+ ), ot = l(
696
+ (d) => {
697
+ if (!S || !(S instanceof We))
698
+ return;
699
+ const h = S.clone(), E = h.children.findIndex(
700
+ (C) => C.id === d.id
701
+ );
702
+ E >= 0 && (h.children[E] = d, Y(h));
703
+ },
704
+ [S, Y]
705
+ ), rt = r.activeChildElement || S, it = r.activeChildElement ? ot : Y, {
706
+ fontSize: he,
707
+ fontColor: xe,
708
+ fontFamily: ye,
709
+ textAlign: Ee,
710
+ updateFontSize: be,
711
+ setFontSizeValue: Se,
712
+ updateFontColor: we,
713
+ updateFontFamily: Ie,
714
+ updateTextAlign: ge
715
+ } = Ft(rt, it), fe = l(
716
+ async (d) => {
717
+ var He;
718
+ const h = d.type, E = d, C = e.getActiveArtboardId();
719
+ if (!C)
720
+ throw new Xe(
721
+ "E_NO_ACTIVE_ARTBOARD",
722
+ `addElement({ type: "${h}" }) needs an active artboard and none exists. <Editor.Root> seeds one automatically; with a raw EditorProvider create one first (executeCreateArtboard) or select one (artboardManager.setActiveArtboard).`,
723
+ { type: h, docSlug: "embed-mode" }
724
+ );
725
+ const R = `element-${Date.now()}`, k = e.getActiveArtboard(), ae = k ? k.x + k.width / 2 : window.innerWidth / 2, re = k ? k.y + k.height / 2 : window.innerHeight / 2, J = ((He = n.current) == null ? void 0 : He.getZoom()) || i.zoom || 1;
726
+ if (h === "image") {
727
+ const ue = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==", te = 200 / J, M = E == null ? void 0 : E.src, W = new St({
728
+ id: R,
729
+ name: d.name,
730
+ x: ae,
731
+ y: re,
732
+ // Defer loading `src` until after the element is in the store so a
733
+ // synchronously-cached image can't fire onLoadCallback too early.
734
+ imageUrl: M ? "" : ue,
735
+ transformData: {
736
+ type: "image",
737
+ width: te,
738
+ height: te,
739
+ cropX: 0,
740
+ cropY: 0,
741
+ cropWidth: 1,
742
+ cropHeight: 1,
743
+ flipHorizontal: !1,
744
+ flipVertical: !1,
745
+ borderRadius: 0
746
+ }
747
+ });
748
+ return M && (W.imageLoaded = !1, W.imageElement = null, W.isCropping = !1, W.imageUrl = M, W.preserveDimensions = !1, W.onLoadCallback = (K) => {
749
+ const Ve = K.transformData.width, Ne = K.transformData.height, ze = Math.min(te / Ve, te / Ne, 1);
750
+ ze < 1 && (K.transformData.width = Ve * ze, K.transformData.height = Ne * ze), K.transformData.cropX = 0, K.transformData.cropY = 0, K.transformData.cropWidth = 1, K.transformData.cropHeight = 1, _(W, K);
751
+ }), Z(W, C), r.setSelectedId(W.id), M && W.loadImage(M), { id: W.id, name: d.name ?? "" };
752
+ }
753
+ let ee;
754
+ const se = {
755
+ text: "custom",
756
+ circle: "circle",
757
+ wave: "wave",
758
+ arch: "arch",
759
+ shape: "shape"
760
+ }[h] || "custom", Fe = wt(se);
761
+ if (!Fe || !Fe.Component)
762
+ throw new Error(`[EditorContext] no transform registered for element type "${h}"`);
763
+ const le = e.getActiveArtboard(), st = le ? Math.min(le.width, le.height) * 0.1 : 80, ve = le ? le.width * 0.5 : 300;
764
+ if (h === "shape") {
765
+ const ue = (E == null ? void 0 : E.shapeType) ?? "rectangle";
766
+ let te = 200 / J, M = 200 / J;
767
+ ue === "ellipse" ? (te = 150 / J, M = 250 / J) : ue === "line" && (te = 300 / J, M = 8 / J), ee = new It({
768
+ id: R,
769
+ name: d.name,
770
+ x: ae,
771
+ y: re,
772
+ transformData: {
773
+ type: "shape",
774
+ shapeType: ue,
775
+ width: te,
776
+ height: M,
777
+ fillColor: "#3b82f6",
778
+ fillOpacity: 1
779
+ }
780
+ });
781
+ } else
782
+ ee = new Fe.Component({
783
+ id: R,
784
+ name: d.name,
785
+ text: "New Text",
786
+ x: ae,
787
+ y: re,
788
+ fontSize: st,
789
+ fontFamily: "Poppins",
790
+ color: Ht(k == null ? void 0 : k.backgroundColor),
791
+ transformData: se === "arch" ? {
792
+ type: "arch",
793
+ width: ve,
794
+ archHeight: gt.archHeight
795
+ } : se === "wave" ? {
796
+ type: "wave",
797
+ width: ve,
798
+ amplitude: _e.amplitude,
799
+ frequency: _e.frequency
800
+ } : se === "circle" ? {
801
+ type: "circle",
802
+ radius: ve / 2
803
+ } : void 0
804
+ });
805
+ return e.addElementToArtboard(R, C), Z(
806
+ ee,
807
+ C,
808
+ r.selectedId || void 0
809
+ ), r.setSelectedId(R), { id: R, name: d.name ?? "" };
810
+ },
811
+ [e, Z, _, r, i.zoom, n]
812
+ ), Te = l(
813
+ async (d, h) => {
814
+ await fe({ ...h, type: d });
815
+ },
816
+ [fe]
817
+ ), Ce = l(() => {
818
+ const d = [];
819
+ if (r.multiSelection.length > 0) {
820
+ const h = p.filter(
821
+ (E) => r.multiSelection.includes(E.id)
822
+ );
823
+ d.push(...h);
824
+ } else S && d.push(S);
825
+ if (d.length > 0) {
826
+ const h = d.map((E) => E.clone());
827
+ g(h);
828
+ }
829
+ }, [S, r.multiSelection, p]), Re = l(() => {
830
+ if (z.length === 0) return;
831
+ const d = [], h = 30, E = 30;
832
+ z.forEach((C) => {
833
+ const R = w.get(C.id), k = R ? R.x : C.x, ae = R ? R.y : C.y, re = C.toJSON();
834
+ delete re.id;
835
+ const J = C.constructor, ee = new J(re);
836
+ ee.x = k + h, ee.y = ae + E;
837
+ let ie = null;
838
+ if (R && (ie = e.getArtboardIdForElement(
839
+ R.id
840
+ )), ie || (ie = e.getActiveArtboardId()), !ie) {
841
+ Xt.warn("[handlePasteElements] No artboard found for pasting");
842
+ return;
843
+ }
844
+ const se = R ? R.id : void 0;
845
+ Z(ee, ie, se), d.push(ee.id);
846
+ }), d.length === 1 ? r.handleSelectionChange(d[0]) : d.length > 1 && r.setMultiSelection(d);
847
+ }, [
848
+ z,
849
+ w,
850
+ e,
851
+ Z,
852
+ r
853
+ ]), Ae = l(() => {
854
+ if (m.expandedPanelType === "crop" && (S == null ? void 0 : S.transformType) === "image") {
855
+ const d = S;
856
+ if (d.isCropping) {
857
+ const h = d.clone();
858
+ h.exitCropMode(), _(d, h);
859
+ }
860
+ }
861
+ m.setExpandedPanelType(null);
862
+ }, [
863
+ m.expandedPanelType,
864
+ m.setExpandedPanelType,
865
+ S,
866
+ _
867
+ ]);
868
+ Oe(() => {
869
+ const d = (h) => {
870
+ const E = h.target;
871
+ if (E.tagName === "CANVAS" || vt(E))
872
+ return;
873
+ const R = document.activeElement;
874
+ if (R != null && R.hasAttribute("data-preserve-selection")) {
875
+ R.blur();
876
+ return;
877
+ }
878
+ if (m.expandedPanelType !== null) {
879
+ Ae();
880
+ return;
881
+ }
882
+ r.selectedId !== null && r.setSelectedId(null), r.multiSelection.length > 0 && r.setMultiSelection([]);
883
+ };
884
+ return document.addEventListener("pointerdown", d), () => document.removeEventListener("pointerdown", d);
885
+ }, [m.expandedPanelType, Ae, r]);
886
+ const Pe = l(
887
+ (d, h, E) => {
888
+ e.clear(), d.forEach((C) => {
889
+ e.createArtboard(C.toJSON());
890
+ }), E && e.setActiveArtboard(E), V([...e.getAllArtboards()]), D((C) => C + 1), f(h), r.setSelectedId(null);
891
+ },
892
+ [e, r, f]
893
+ ), Ue = q(() => ({
894
+ // From ViewportContext
895
+ zoom: i.zoom,
896
+ panOffset: i.panOffset,
897
+ isPanning: i.isPanning,
898
+ zoomIn: i.zoomIn,
899
+ zoomOut: i.zoomOut,
900
+ zoomToFit: i.zoomToFit,
901
+ resetView: i.resetView,
902
+ setZoom: i.setZoom,
903
+ setPanOffset: i.setPanOffset,
904
+ setIsPanning: i.setIsPanning,
905
+ // From SelectionContext
906
+ selectedId: r.selectedId,
907
+ multiSelection: r.multiSelection,
908
+ activeChildElement: r.activeChildElement,
909
+ hoveredElementId: r.hoveredElementId,
910
+ hideHandles: r.hideHandles,
911
+ setSelectedId: r.setSelectedId,
912
+ setMultiSelection: r.setMultiSelection,
913
+ setHoveredElementId: r.setHoveredElementId,
914
+ setHideHandles: r.setHideHandles,
915
+ handleSelectionChange: r.handleSelectionChange,
916
+ handleActiveChildChange: r.handleActiveChildChange,
917
+ // From ToolStateContext
918
+ expandedPanelType: m.expandedPanelType,
919
+ setExpandedPanelType: m.setExpandedPanelType,
920
+ isToolbarMenuOpen: m.isToolbarMenuOpen,
921
+ setIsToolbarMenuOpen: m.setIsToolbarMenuOpen,
922
+ textSelectionVersion: m.textSelectionVersion,
923
+ setTextSelectionVersion: m.setTextSelectionVersion,
924
+ isCanvasReady: m.isCanvasReady,
925
+ setCanvasReady: m.setCanvasReady,
926
+ isRotating: m.isRotating,
927
+ setIsRotating: m.setIsRotating,
928
+ // Cross-context handler
929
+ clearExpandedPanel: Ae,
930
+ // Core state (element/artboard domain)
931
+ artboardManager: e,
932
+ artboards: c,
933
+ elements: p,
934
+ elementStore: w,
935
+ getElementById: I,
936
+ // Derived state (cross-context)
937
+ selectedElement: S,
938
+ // Refs
939
+ canvasRef: o,
940
+ canvasEditorRef: n,
941
+ // Element setters
942
+ setElements: f,
943
+ // Artboard version counter
944
+ artboardVersion: O,
945
+ // Handlers
946
+ refreshArtboards: B,
947
+ handleElementUpdate: Y,
948
+ addElement: fe,
949
+ handleAddElement: Te,
950
+ handleLoadWorkspace: Pe,
951
+ handleCopyElements: Ce,
952
+ handlePasteElements: Re,
953
+ // Command history (undo/redo actions + execute functions)
954
+ historyManager: ne,
955
+ executeElementUpdate: _,
956
+ executeAddElement: Z,
957
+ executeRemoveElement: s,
958
+ executeReorderElement: A,
959
+ executeCommandBatch: y,
960
+ executeCreateArtboard: x,
961
+ executeDeleteArtboard: T,
962
+ executeUpdateArtboard: $,
963
+ undo: F,
964
+ redo: N,
965
+ canUndo: v,
966
+ canRedo: U,
967
+ undoActiveArtboard: P,
968
+ redoActiveArtboard: X,
969
+ canUndoActiveArtboard: oe,
970
+ canRedoActiveArtboard: j,
971
+ // Element properties
972
+ fontSize: he,
973
+ fontColor: xe,
974
+ fontFamily: ye,
975
+ textAlign: Ee,
976
+ updateFontSize: be,
977
+ setFontSizeValue: Se,
978
+ updateFontColor: we,
979
+ updateFontFamily: Ie,
980
+ updateTextAlign: ge
981
+ }), [
982
+ // Viewport
983
+ i.zoom,
984
+ i.panOffset,
985
+ i.isPanning,
986
+ i.zoomIn,
987
+ i.zoomOut,
988
+ i.zoomToFit,
989
+ i.resetView,
990
+ i.setZoom,
991
+ i.setPanOffset,
992
+ i.setIsPanning,
993
+ // Selection
994
+ r.selectedId,
995
+ r.multiSelection,
996
+ r.activeChildElement,
997
+ r.hoveredElementId,
998
+ r.hideHandles,
999
+ r.setSelectedId,
1000
+ r.setMultiSelection,
1001
+ r.setHoveredElementId,
1002
+ r.setHideHandles,
1003
+ r.handleSelectionChange,
1004
+ r.handleActiveChildChange,
1005
+ // Tool state
1006
+ m.expandedPanelType,
1007
+ m.setExpandedPanelType,
1008
+ m.isToolbarMenuOpen,
1009
+ m.setIsToolbarMenuOpen,
1010
+ m.textSelectionVersion,
1011
+ m.setTextSelectionVersion,
1012
+ m.isCanvasReady,
1013
+ m.setCanvasReady,
1014
+ m.isRotating,
1015
+ m.setIsRotating,
1016
+ Ae,
1017
+ // Element/artboard domain
1018
+ e,
1019
+ c,
1020
+ p,
1021
+ w,
1022
+ I,
1023
+ S,
1024
+ o,
1025
+ n,
1026
+ f,
1027
+ O,
1028
+ B,
1029
+ Y,
1030
+ fe,
1031
+ Te,
1032
+ Pe,
1033
+ Ce,
1034
+ Re,
1035
+ // Command history
1036
+ ne,
1037
+ _,
1038
+ Z,
1039
+ s,
1040
+ A,
1041
+ y,
1042
+ x,
1043
+ T,
1044
+ $,
1045
+ F,
1046
+ N,
1047
+ v,
1048
+ U,
1049
+ P,
1050
+ X,
1051
+ oe,
1052
+ j,
1053
+ // Element properties
1054
+ he,
1055
+ xe,
1056
+ ye,
1057
+ Ee,
1058
+ be,
1059
+ Se,
1060
+ we,
1061
+ Ie,
1062
+ ge
1063
+ ]);
1064
+ return a.current = Ue, /* @__PURE__ */ H(nt.Provider, { value: u, children: /* @__PURE__ */ H(
1065
+ $t,
1066
+ {
1067
+ value: {
1068
+ undo: F,
1069
+ redo: N,
1070
+ canUndo: v,
1071
+ canRedo: U,
1072
+ undoActiveArtboard: P,
1073
+ redoActiveArtboard: X,
1074
+ canUndoActiveArtboard: oe,
1075
+ canRedoActiveArtboard: j
1076
+ },
1077
+ children: /* @__PURE__ */ H(
1078
+ Zt,
1079
+ {
1080
+ value: {
1081
+ elements: p,
1082
+ elementStore: w,
1083
+ artboards: c,
1084
+ artboardManager: e,
1085
+ artboardVersion: O,
1086
+ setElements: f,
1087
+ refreshArtboards: B,
1088
+ getElementById: I,
1089
+ handleAddElement: Te,
1090
+ handleElementUpdate: Y,
1091
+ handleLoadWorkspace: Pe,
1092
+ handleCopyElements: Ce,
1093
+ handlePasteElements: Re,
1094
+ fontSize: he,
1095
+ fontColor: xe,
1096
+ fontFamily: ye,
1097
+ textAlign: Ee,
1098
+ updateFontSize: be,
1099
+ setFontSizeValue: Se,
1100
+ updateFontColor: we,
1101
+ updateFontFamily: Ie,
1102
+ updateTextAlign: ge,
1103
+ canvasRef: o,
1104
+ canvasEditorRef: n
1105
+ },
1106
+ children: /* @__PURE__ */ H(
1107
+ Gt,
1108
+ {
1109
+ value: {
1110
+ executeElementUpdate: _,
1111
+ executeAddElement: Z,
1112
+ executeRemoveElement: s,
1113
+ executeReorderElement: A,
1114
+ executeCommandBatch: y,
1115
+ executeCreateArtboard: x,
1116
+ executeDeleteArtboard: T,
1117
+ executeUpdateArtboard: $,
1118
+ undo: F,
1119
+ redo: N,
1120
+ canUndo: v,
1121
+ canRedo: U,
1122
+ undoActiveArtboard: P,
1123
+ redoActiveArtboard: X,
1124
+ canUndoActiveArtboard: oe,
1125
+ canRedoActiveArtboard: j,
1126
+ historyManager: ne
1127
+ },
1128
+ children: /* @__PURE__ */ H(tt.Provider, { value: Ue, children: t })
1129
+ }
1130
+ )
1131
+ }
1132
+ )
1133
+ }
1134
+ ) });
1135
+ }, rn = ({
1136
+ children: t,
1137
+ initialArtboardConfig: e = {},
1138
+ viewPadding: o = 0.9
1139
+ }) => {
1140
+ const [n] = b(() => {
1141
+ const i = new bt(), r = {
1142
+ name: e.name || "Artboard 1",
1143
+ x: e.x ?? 0,
1144
+ y: e.y ?? 0,
1145
+ width: e.width ?? 1e3,
1146
+ height: e.height ?? 1e3,
1147
+ backgroundColor: e.backgroundColor || Et
1148
+ };
1149
+ return i.createArtboard(r), i;
1150
+ }), a = me(null), u = me(null);
1151
+ return /* @__PURE__ */ H(
1152
+ Dt,
1153
+ {
1154
+ artboardManager: n,
1155
+ canvasRef: a,
1156
+ viewPadding: o,
1157
+ children: /* @__PURE__ */ H(_t, { children: /* @__PURE__ */ H(kt, { children: /* @__PURE__ */ H(
1158
+ jt,
1159
+ {
1160
+ artboardManager: n,
1161
+ canvasRef: a,
1162
+ canvasEditorRef: u,
1163
+ children: t
1164
+ }
1165
+ ) }) })
1166
+ }
1167
+ );
1168
+ }, sn = () => {
1169
+ const t = G(tt);
1170
+ if (!t)
1171
+ throw new Error("useEditor must be used within EditorProvider");
1172
+ return t;
1173
+ }, de = [];
1174
+ function cn(t) {
1175
+ Rt() && de.push(t);
1176
+ }
1177
+ function dn() {
1178
+ return [...de];
1179
+ }
1180
+ function an() {
1181
+ de.length = 0;
1182
+ }
1183
+ function ln() {
1184
+ if (de.length === 0) return;
1185
+ const t = de.map((e) => Ct(e) ? `${e.code}: ${e.message}` : `${e.name}: ${e.message}`).join(`
1186
+ - `);
1187
+ throw de.length = 0, new Error(
1188
+ `expectNoEditorErrors: ${t.includes(`
1189
+ `) ? "errors were" : "an error was"} contained by <Editor.Root>'s boundary during this test:
1190
+ - ${t}
1191
+ A contained error renders an error card in prod — this composition is broken even if the test rendered "successfully".`
1192
+ );
1193
+ }
1194
+ export {
1195
+ Ge as B,
1196
+ rn as E,
1197
+ je as P,
1198
+ Lt as a,
1199
+ nn as b,
1200
+ tn as c,
1201
+ en as d,
1202
+ Bt as e,
1203
+ Wt as f,
1204
+ Xe as g,
1205
+ Kt as h,
1206
+ Ct as i,
1207
+ Rt as j,
1208
+ on as k,
1209
+ ln as l,
1210
+ dn as m,
1211
+ an as n,
1212
+ zt as o,
1213
+ qt as p,
1214
+ Qt as q,
1215
+ cn as r,
1216
+ vt as s,
1217
+ sn as u
1218
+ };
1219
+ //# sourceMappingURL=editorErrors-BhrZ_nwj.js.map