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