@snowcone-app/canvas 0.29.0 → 0.31.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 (92) hide show
  1. package/ERROR_CONTRACT.md +13 -0
  2. package/STYLING_CONTRACT.md +2 -2
  3. package/dist/{CanvasRenderer-_lFoIoz5.js → CanvasRenderer-hpJ05JGO.js} +4 -4
  4. package/dist/{CanvasRenderer-_lFoIoz5.js.map → CanvasRenderer-hpJ05JGO.js.map} +1 -1
  5. package/dist/{CanvasStateV1-BMxr6xb8.js → CanvasStateV1-jLOibojY.js} +876 -844
  6. package/dist/{CanvasStateV1-BMxr6xb8.js.map → CanvasStateV1-jLOibojY.js.map} +1 -1
  7. package/dist/ContextualToolbars-DRbuUE7W.js +6061 -0
  8. package/dist/ContextualToolbars-DRbuUE7W.js.map +1 -0
  9. package/dist/{EditorCanvasImpl-BNz8TPFs.js → EditorCanvasImpl-P2GHPNA3.js} +19 -20
  10. package/dist/{EditorCanvasImpl-BNz8TPFs.js.map → EditorCanvasImpl-P2GHPNA3.js.map} +1 -1
  11. package/dist/{ExportManager-B8Td7uR5.js → ExportManager-Bkzzyxgw.js} +973 -576
  12. package/dist/ExportManager-Bkzzyxgw.js.map +1 -0
  13. package/dist/{FontAnalyzer-D4Sg-P6_.js → FontAnalyzer-BYhwxDhe.js} +542 -477
  14. package/dist/FontAnalyzer-BYhwxDhe.js.map +1 -0
  15. package/dist/{ImagePanel-CN2Bu3hf.js → ImagePanel-CEr0_FYy.js} +38 -38
  16. package/dist/{ImagePanel-CN2Bu3hf.js.map → ImagePanel-CEr0_FYy.js.map} +1 -1
  17. package/dist/SnowconeCanvas-Fa0isFpO.js +1192 -0
  18. package/dist/SnowconeCanvas-Fa0isFpO.js.map +1 -0
  19. package/dist/advanced.mjs +14 -14
  20. package/dist/api/embed.d.ts +2 -0
  21. package/dist/api/stable.d.ts +2 -0
  22. package/dist/components/CanvasContextMenu.d.ts +15 -0
  23. package/dist/components/CanvasEditor/hooks/useCanvasInteraction.d.ts +27 -0
  24. package/dist/components/CanvasEditor.d.ts +8 -0
  25. package/dist/components/ImageToolbar.d.ts +4 -0
  26. package/dist/components/embed/SnowconeCanvas.d.ts +13 -0
  27. package/dist/components/embed/kernel.d.ts +8 -0
  28. package/dist/components/toolbars/EmbeddedToolbarLayout.d.ts +2 -0
  29. package/dist/components/toolbars/SecondaryPanels.d.ts +17 -1
  30. package/dist/components/toolbars/index.d.ts +2 -2
  31. package/dist/components/ui/SliderRow.d.ts +6 -0
  32. package/dist/components/ui/icons.d.ts +2 -0
  33. package/dist/components/ui/toolbar-button.d.ts +2 -2
  34. package/dist/contexts/CanvasServicesContext.d.ts +17 -0
  35. package/dist/contexts/EditorContext.d.ts +7 -0
  36. package/dist/core/image-adjustments.d.ts +32 -0
  37. package/dist/{custom-icons-B5TRC1Ed.js → custom-icons-Co4rcW0S.js} +7 -7
  38. package/dist/{custom-icons-B5TRC1Ed.js.map → custom-icons-Co4rcW0S.js.map} +1 -1
  39. package/dist/design-builder-CBG2hKc8.js +1672 -0
  40. package/dist/design-builder-CBG2hKc8.js.map +1 -0
  41. package/dist/{embed-BTRtoktw.js → embed-D4TIzO7g.js} +20 -20
  42. package/dist/{embed-BTRtoktw.js.map → embed-D4TIzO7g.js.map} +1 -1
  43. package/dist/embed.mjs +51 -46
  44. package/dist/embed.mjs.map +1 -1
  45. package/dist/errors/editorError.d.ts +8 -0
  46. package/dist/{guards-uQtEQJbs.js → guards-DgZuwVgu.js} +2 -2
  47. package/dist/{guards-uQtEQJbs.js.map → guards-DgZuwVgu.js.map} +1 -1
  48. package/dist/hooks/elementPatch.d.ts +7 -2
  49. package/dist/hooks/useKeyboardShortcuts.d.ts +15 -2
  50. package/dist/hooks/useLayers.d.ts +2 -0
  51. package/dist/index.mjs +57 -52
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/internals.mjs +201 -132
  54. package/dist/internals.mjs.map +1 -1
  55. package/dist/rendering/element-painters.d.ts +0 -13
  56. package/dist/rendering/element-serializer.d.ts +3 -1
  57. package/dist/rendering/image-adjustments.d.ts +24 -0
  58. package/dist/rendering/renderer-types.d.ts +8 -1
  59. package/dist/state/CanvasStateV1.d.ts +36 -3
  60. package/dist/state/index.d.ts +2 -2
  61. package/dist/template-fields-CvFcr5zy.js +505 -0
  62. package/dist/template-fields-CvFcr5zy.js.map +1 -0
  63. package/dist/testing.mjs +46 -47
  64. package/dist/testing.mjs.map +1 -1
  65. package/dist/types/index.d.ts +21 -0
  66. package/dist/{UnifiedFontService-CgYnYTj7.js → useCommands-bPXY9rCh.js} +2429 -2145
  67. package/dist/useCommands-bPXY9rCh.js.map +1 -0
  68. package/dist/{usePieceGuideBundle-CTQszfKA.js → usePieceGuideBundle-Bj98nPk0.js} +2 -2
  69. package/dist/{usePieceGuideBundle-CTQszfKA.js.map → usePieceGuideBundle-Bj98nPk0.js.map} +1 -1
  70. package/dist/utils/custom-fonts.d.ts +99 -0
  71. package/dist/utils/featureApplied.d.ts +2 -0
  72. package/dist/validation-CsTlSvJJ.js +8686 -0
  73. package/dist/validation-CsTlSvJJ.js.map +1 -0
  74. package/dist/workers/export-protocol.d.ts +13 -0
  75. package/dist/workers/export-worker.bundle.string.d.ts +1 -1
  76. package/example/package.json +1 -1
  77. package/package.json +1 -1
  78. package/dist/ContextualToolbars-0jWvnQgp.js +0 -5833
  79. package/dist/ContextualToolbars-0jWvnQgp.js.map +0 -1
  80. package/dist/ExportManager-B8Td7uR5.js.map +0 -1
  81. package/dist/FontAnalyzer-D4Sg-P6_.js.map +0 -1
  82. package/dist/SnowconeCanvas-CR_LdRFP.js +0 -1173
  83. package/dist/SnowconeCanvas-CR_LdRFP.js.map +0 -1
  84. package/dist/UnifiedFontService-CgYnYTj7.js.map +0 -1
  85. package/dist/design-builder-COj0zkxu.js +0 -470
  86. package/dist/design-builder-COj0zkxu.js.map +0 -1
  87. package/dist/editorErrors-CCvoKj_P.js +0 -1219
  88. package/dist/editorErrors-CCvoKj_P.js.map +0 -1
  89. package/dist/template-fields-BLRp84Ny.js +0 -716
  90. package/dist/template-fields-BLRp84Ny.js.map +0 -1
  91. package/dist/validation-eCebhplp.js +0 -8402
  92. package/dist/validation-eCebhplp.js.map +0 -1
@@ -1,1219 +0,0 @@
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, af as lt, G as We, ag as ut, ah as mt, ai as ft, aj as At, ak as pt, c as Ze, z as ht, al as xt, am as yt, an as Et, E as bt, L as Le, I as St, g as wt, S as It, ao as gt, ap as _e } from "./FontAnalyzer-D4Sg-P6_.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-CCvoKj_P.js.map