@snowcone-app/canvas 0.8.1 → 0.11.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.
- package/dist/CanvasStateV1-D3THl2Zc.js +456 -0
- package/dist/CanvasStateV1-D3THl2Zc.js.map +1 -0
- package/dist/HybridHistoryManager-DANuzx7G.js.map +1 -1
- package/dist/advanced.mjs +2 -2
- package/dist/api/embed.d.ts +4 -0
- package/dist/api/stable.d.ts +6 -2
- package/dist/components/embed/SnowconeCanvas.d.ts +8 -0
- package/dist/contexts/CanvasServicesContext.d.ts +9 -2
- package/dist/design/design-builder.d.ts +23 -1
- package/dist/design/template-fields.d.ts +59 -0
- package/dist/embed.mjs +67 -63
- package/dist/embed.mjs.map +1 -1
- package/dist/fonts/google-fonts.d.ts +1 -6
- package/dist/hooks/useArtboards.d.ts +1 -0
- package/dist/hooks/useColorBinding.d.ts +21 -0
- package/dist/index.mjs +45 -40
- package/dist/internals.mjs +1 -1
- package/dist/rendering/serialize-for-server.d.ts +1 -0
- package/dist/schemas-B4UXytQB.js +3250 -0
- package/dist/schemas-B4UXytQB.js.map +1 -0
- package/dist/services/imageSearch.d.ts +30 -0
- package/dist/style.css +1 -1
- package/dist/template-fields-C8Tj67ek.js +1585 -0
- package/dist/template-fields-C8Tj67ek.js.map +1 -0
- package/dist/utils/UnifiedFontService.d.ts +9 -30
- package/dist/{validation-CZ4CZV5B.js → validation-C857Ptxn.js} +5804 -6344
- package/dist/validation-C857Ptxn.js.map +1 -0
- package/package.json +3 -3
- package/dist/CanvasStateV1-D7mGz8FR.js +0 -3692
- package/dist/CanvasStateV1-D7mGz8FR.js.map +0 -1
- package/dist/components/MonotypeDemoPage.d.ts +0 -2
- package/dist/design-builder-CM5wSK5w.js +0 -1467
- package/dist/design-builder-CM5wSK5w.js.map +0 -1
- package/dist/utils/MonotypeCategoryMapping.d.ts +0 -36
- package/dist/utils/MonotypeService.d.ts +0 -148
- package/dist/validation-CZ4CZV5B.js.map +0 -1
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { E as J } from "./ImportManager-NCtkY5Z0.js";
|
|
2
|
+
import { A as N } from "./HybridHistoryManager-DANuzx7G.js";
|
|
3
|
+
import { o as a, n as o, _ as d, a as h, b as t, s as n, c as v, l as e, d as b, u as x } from "./schemas-B4UXytQB.js";
|
|
4
|
+
const S = a({
|
|
5
|
+
x: o(),
|
|
6
|
+
y: o()
|
|
7
|
+
}), R = a({
|
|
8
|
+
enabled: t(),
|
|
9
|
+
color: n(),
|
|
10
|
+
width: o(),
|
|
11
|
+
dashArray: h(o()).optional(),
|
|
12
|
+
lineCap: d(["butt", "round", "square"]).optional(),
|
|
13
|
+
lineJoin: d(["miter", "round", "bevel"]).optional(),
|
|
14
|
+
miterLimit: o().optional(),
|
|
15
|
+
opacity: o().optional(),
|
|
16
|
+
feather: o().optional()
|
|
17
|
+
}), $ = a({
|
|
18
|
+
fill: t().optional(),
|
|
19
|
+
stroke: t().optional(),
|
|
20
|
+
scope: d(["group", "artboard"]).optional()
|
|
21
|
+
}), H = a({
|
|
22
|
+
enabled: t(),
|
|
23
|
+
style: d(["worn", "cracked", "grunge", "retro", "custom"]),
|
|
24
|
+
intensity: o(),
|
|
25
|
+
fadeAmount: o().optional(),
|
|
26
|
+
grainAmount: o().optional(),
|
|
27
|
+
scratchAmount: o().optional(),
|
|
28
|
+
edgeWear: o().optional(),
|
|
29
|
+
textureUrl: n().optional(),
|
|
30
|
+
textureOpacity: o().optional(),
|
|
31
|
+
textureBlendMode: d(["multiply", "screen", "overlay"]).optional(),
|
|
32
|
+
seed: o().optional()
|
|
33
|
+
}), U = a({
|
|
34
|
+
id: n(),
|
|
35
|
+
type: d(["clip", "alpha", "luma", "distress"]),
|
|
36
|
+
// maskElement is a nested element config -- use lazy to break the cycle
|
|
37
|
+
maskElement: v(() => k),
|
|
38
|
+
inverted: t().optional(),
|
|
39
|
+
feather: o().optional(),
|
|
40
|
+
opacity: o().optional(),
|
|
41
|
+
blendMode: n().optional()
|
|
42
|
+
}), q = a({
|
|
43
|
+
color: n().optional(),
|
|
44
|
+
fontFamily: n().optional(),
|
|
45
|
+
fontSize: o().optional(),
|
|
46
|
+
bold: t().optional(),
|
|
47
|
+
italic: t().optional(),
|
|
48
|
+
underline: t().optional(),
|
|
49
|
+
strikethrough: t().optional()
|
|
50
|
+
}), G = a({
|
|
51
|
+
text: n(),
|
|
52
|
+
style: q
|
|
53
|
+
}), L = a({
|
|
54
|
+
spans: h(G)
|
|
55
|
+
}), M = a({
|
|
56
|
+
charIndex: o(),
|
|
57
|
+
glyphIndex: o(),
|
|
58
|
+
unicode: n(),
|
|
59
|
+
alternateName: n().optional()
|
|
60
|
+
}), V = a({
|
|
61
|
+
liga: t().optional(),
|
|
62
|
+
dlig: t().optional(),
|
|
63
|
+
calt: t().optional(),
|
|
64
|
+
swsh: t().optional(),
|
|
65
|
+
smcp: t().optional(),
|
|
66
|
+
c2sc: t().optional(),
|
|
67
|
+
onum: t().optional(),
|
|
68
|
+
lnum: t().optional(),
|
|
69
|
+
tnum: t().optional(),
|
|
70
|
+
pnum: t().optional(),
|
|
71
|
+
ss01: t().optional(),
|
|
72
|
+
ss02: t().optional(),
|
|
73
|
+
ss03: t().optional(),
|
|
74
|
+
ss04: t().optional(),
|
|
75
|
+
ss05: t().optional(),
|
|
76
|
+
ss06: t().optional(),
|
|
77
|
+
ss07: t().optional(),
|
|
78
|
+
ss08: t().optional(),
|
|
79
|
+
ss09: t().optional(),
|
|
80
|
+
ss10: t().optional(),
|
|
81
|
+
ss11: t().optional(),
|
|
82
|
+
ss12: t().optional(),
|
|
83
|
+
ss13: t().optional(),
|
|
84
|
+
ss14: t().optional(),
|
|
85
|
+
ss15: t().optional(),
|
|
86
|
+
ss16: t().optional(),
|
|
87
|
+
ss17: t().optional(),
|
|
88
|
+
ss18: t().optional(),
|
|
89
|
+
ss19: t().optional(),
|
|
90
|
+
ss20: t().optional(),
|
|
91
|
+
cv01: t().optional(),
|
|
92
|
+
cv02: t().optional(),
|
|
93
|
+
cv03: t().optional(),
|
|
94
|
+
cv04: t().optional(),
|
|
95
|
+
cv05: t().optional(),
|
|
96
|
+
ccmp: t().optional(),
|
|
97
|
+
locl: t().optional(),
|
|
98
|
+
kern: t().optional(),
|
|
99
|
+
mark: t().optional(),
|
|
100
|
+
mkmk: t().optional()
|
|
101
|
+
}), C = a({
|
|
102
|
+
type: e("custom"),
|
|
103
|
+
controlPoints: h(S)
|
|
104
|
+
}).passthrough(), T = a({
|
|
105
|
+
type: e("distort")
|
|
106
|
+
}).passthrough(), w = a({
|
|
107
|
+
type: e("circle"),
|
|
108
|
+
radius: o(),
|
|
109
|
+
scale: o(),
|
|
110
|
+
reverse: t()
|
|
111
|
+
}), A = a({
|
|
112
|
+
type: e("lean"),
|
|
113
|
+
leanAmount: o()
|
|
114
|
+
}).passthrough(), E = a({
|
|
115
|
+
type: e("arch"),
|
|
116
|
+
archHeight: o()
|
|
117
|
+
}).passthrough(), I = a({
|
|
118
|
+
type: e("ascend"),
|
|
119
|
+
ascendAngle: o()
|
|
120
|
+
}).passthrough(), D = a({
|
|
121
|
+
type: e("wave"),
|
|
122
|
+
amplitude: o(),
|
|
123
|
+
frequency: o()
|
|
124
|
+
}).passthrough(), B = a({
|
|
125
|
+
type: e("flag"),
|
|
126
|
+
amplitude: o(),
|
|
127
|
+
frequency: o()
|
|
128
|
+
}).passthrough(), z = a({
|
|
129
|
+
type: e("image"),
|
|
130
|
+
width: o(),
|
|
131
|
+
height: o(),
|
|
132
|
+
cropX: o(),
|
|
133
|
+
cropY: o(),
|
|
134
|
+
cropWidth: o(),
|
|
135
|
+
cropHeight: o(),
|
|
136
|
+
flipHorizontal: t(),
|
|
137
|
+
flipVertical: t(),
|
|
138
|
+
borderRadius: o()
|
|
139
|
+
}), O = a({
|
|
140
|
+
type: e("group")
|
|
141
|
+
}), F = a({
|
|
142
|
+
type: e("shape"),
|
|
143
|
+
shapeType: d(["rectangle", "circle", "ellipse", "triangle", "polygon", "star", "line"]),
|
|
144
|
+
width: o(),
|
|
145
|
+
height: o(),
|
|
146
|
+
borderRadius: o().optional(),
|
|
147
|
+
radiusX: o().optional(),
|
|
148
|
+
radiusY: o().optional(),
|
|
149
|
+
sides: o().optional(),
|
|
150
|
+
points: o().optional(),
|
|
151
|
+
innerRadius: o().optional(),
|
|
152
|
+
fillColor: n().optional(),
|
|
153
|
+
fillOpacity: o().optional()
|
|
154
|
+
}), X = a({
|
|
155
|
+
id: n(),
|
|
156
|
+
x: o(),
|
|
157
|
+
y: o(),
|
|
158
|
+
type: d(["corner", "smooth", "bezier"]),
|
|
159
|
+
handleIn: S.optional(),
|
|
160
|
+
handleOut: S.optional()
|
|
161
|
+
}), P = a({
|
|
162
|
+
type: e("path"),
|
|
163
|
+
points: h(X),
|
|
164
|
+
closed: t(),
|
|
165
|
+
width: o(),
|
|
166
|
+
height: o(),
|
|
167
|
+
fillEnabled: t().optional(),
|
|
168
|
+
fillColor: n().optional(),
|
|
169
|
+
fillOpacity: o().optional(),
|
|
170
|
+
strokeEnabled: t().optional(),
|
|
171
|
+
strokeColor: n().optional(),
|
|
172
|
+
strokeWidth: o().optional()
|
|
173
|
+
}), yo = b("type", [
|
|
174
|
+
C,
|
|
175
|
+
T,
|
|
176
|
+
w,
|
|
177
|
+
A,
|
|
178
|
+
E,
|
|
179
|
+
I,
|
|
180
|
+
D,
|
|
181
|
+
B,
|
|
182
|
+
z,
|
|
183
|
+
O,
|
|
184
|
+
F,
|
|
185
|
+
P
|
|
186
|
+
]), y = a({
|
|
187
|
+
id: n(),
|
|
188
|
+
x: o(),
|
|
189
|
+
y: o(),
|
|
190
|
+
rotation: o(),
|
|
191
|
+
opacity: o(),
|
|
192
|
+
// Layer properties
|
|
193
|
+
name: n().optional(),
|
|
194
|
+
visible: t().optional(),
|
|
195
|
+
locked: t().optional(),
|
|
196
|
+
isClipping: t().optional(),
|
|
197
|
+
// Effects
|
|
198
|
+
blendMode: d(["normal", "knockout", "clip"]).optional(),
|
|
199
|
+
knockoutParts: $.optional(),
|
|
200
|
+
stroke: R.optional(),
|
|
201
|
+
masks: h(U).optional(),
|
|
202
|
+
distressEffect: H.optional()
|
|
203
|
+
}), g = y.extend({
|
|
204
|
+
// Rich text
|
|
205
|
+
richText: L.optional(),
|
|
206
|
+
// Legacy plain text
|
|
207
|
+
text: n().optional(),
|
|
208
|
+
// Element-level style defaults
|
|
209
|
+
fontSize: o().optional(),
|
|
210
|
+
fontFamily: n().optional(),
|
|
211
|
+
color: n().optional(),
|
|
212
|
+
textAlign: d(["left", "center", "right"]).optional(),
|
|
213
|
+
bold: t().optional(),
|
|
214
|
+
italic: t().optional(),
|
|
215
|
+
underline: t().optional(),
|
|
216
|
+
strikethrough: t().optional(),
|
|
217
|
+
// Typography
|
|
218
|
+
glyphOverrides: h(M).optional(),
|
|
219
|
+
openTypeFeatures: V.optional()
|
|
220
|
+
}), Y = g.extend({
|
|
221
|
+
transformType: e("custom"),
|
|
222
|
+
transformData: C.optional()
|
|
223
|
+
}), _ = g.extend({
|
|
224
|
+
transformType: e("distort"),
|
|
225
|
+
transformData: T.optional()
|
|
226
|
+
}), K = g.extend({
|
|
227
|
+
transformType: e("circle"),
|
|
228
|
+
transformData: w.optional()
|
|
229
|
+
}), Q = g.extend({
|
|
230
|
+
transformType: e("lean"),
|
|
231
|
+
transformData: A.optional()
|
|
232
|
+
}), Z = g.extend({
|
|
233
|
+
transformType: e("arch"),
|
|
234
|
+
transformData: E.optional()
|
|
235
|
+
}), oo = g.extend({
|
|
236
|
+
transformType: e("ascend"),
|
|
237
|
+
transformData: I.optional()
|
|
238
|
+
}), to = g.extend({
|
|
239
|
+
transformType: e("wave"),
|
|
240
|
+
transformData: D.optional()
|
|
241
|
+
}), eo = g.extend({
|
|
242
|
+
transformType: e("flag"),
|
|
243
|
+
transformData: B.optional()
|
|
244
|
+
}), ao = y.extend({
|
|
245
|
+
transformType: e("image"),
|
|
246
|
+
transformData: z.optional(),
|
|
247
|
+
imageUrl: n().optional(),
|
|
248
|
+
imageAspectRatio: o().optional()
|
|
249
|
+
}), no = y.extend({
|
|
250
|
+
transformType: e("group"),
|
|
251
|
+
transformData: O.optional(),
|
|
252
|
+
children: v(() => h(k)).optional()
|
|
253
|
+
}), ro = y.extend({
|
|
254
|
+
transformType: e("shape"),
|
|
255
|
+
transformData: F.optional()
|
|
256
|
+
}), io = y.extend({
|
|
257
|
+
transformType: e("path"),
|
|
258
|
+
transformData: P.optional()
|
|
259
|
+
}), k = b("transformType", [
|
|
260
|
+
Y,
|
|
261
|
+
_,
|
|
262
|
+
K,
|
|
263
|
+
Q,
|
|
264
|
+
Z,
|
|
265
|
+
oo,
|
|
266
|
+
to,
|
|
267
|
+
eo,
|
|
268
|
+
ao,
|
|
269
|
+
no,
|
|
270
|
+
ro,
|
|
271
|
+
io
|
|
272
|
+
]), so = x([
|
|
273
|
+
e("rectangle"),
|
|
274
|
+
e("circle"),
|
|
275
|
+
a({ type: e("rounded"), radius: o() }),
|
|
276
|
+
a({ type: e("path"), d: n() }),
|
|
277
|
+
a({
|
|
278
|
+
type: e("composite-path"),
|
|
279
|
+
pieces: h(
|
|
280
|
+
a({
|
|
281
|
+
d: n(),
|
|
282
|
+
x: o(),
|
|
283
|
+
y: o(),
|
|
284
|
+
rotation: x([e(0), e(90), e(180), e(270)]).optional(),
|
|
285
|
+
baseWidth: o().optional(),
|
|
286
|
+
baseHeight: o().optional()
|
|
287
|
+
})
|
|
288
|
+
)
|
|
289
|
+
})
|
|
290
|
+
]), lo = a({
|
|
291
|
+
enabled: t(),
|
|
292
|
+
textureUrl: n(),
|
|
293
|
+
intensity: o()
|
|
294
|
+
}), po = a({
|
|
295
|
+
id: n(),
|
|
296
|
+
name: n(),
|
|
297
|
+
x: o(),
|
|
298
|
+
y: o(),
|
|
299
|
+
width: o(),
|
|
300
|
+
height: o(),
|
|
301
|
+
backgroundColor: n(),
|
|
302
|
+
backgroundType: d(["color", "transparent", "texture"]).optional(),
|
|
303
|
+
backgroundTexture: n().optional(),
|
|
304
|
+
exportBackground: t().optional(),
|
|
305
|
+
clipShape: so.optional(),
|
|
306
|
+
previewBackgroundColor: n().optional(),
|
|
307
|
+
distressTexture: lo.optional(),
|
|
308
|
+
elementIds: h(n())
|
|
309
|
+
}), co = a({
|
|
310
|
+
version: e(1),
|
|
311
|
+
artboards: h(po),
|
|
312
|
+
elements: h(k),
|
|
313
|
+
activeArtboardId: n()
|
|
314
|
+
});
|
|
315
|
+
function So(l, p) {
|
|
316
|
+
var u;
|
|
317
|
+
const c = l.getAllArtboards(), r = l.getActiveArtboardId(), m = c.map(
|
|
318
|
+
(i) => {
|
|
319
|
+
const s = i.toJSON();
|
|
320
|
+
return {
|
|
321
|
+
id: s.id ?? i.id,
|
|
322
|
+
name: s.name ?? i.name,
|
|
323
|
+
x: s.x ?? i.x,
|
|
324
|
+
y: s.y ?? i.y,
|
|
325
|
+
width: s.width ?? i.width,
|
|
326
|
+
height: s.height ?? i.height,
|
|
327
|
+
backgroundColor: s.backgroundColor ?? i.backgroundColor,
|
|
328
|
+
...s.backgroundType && { backgroundType: s.backgroundType },
|
|
329
|
+
...s.backgroundTexture && { backgroundTexture: s.backgroundTexture },
|
|
330
|
+
...s.exportBackground !== void 0 && { exportBackground: s.exportBackground },
|
|
331
|
+
...s.clipShape && { clipShape: s.clipShape },
|
|
332
|
+
...s.previewBackgroundColor && { previewBackgroundColor: s.previewBackgroundColor },
|
|
333
|
+
elementIds: s.elementIds ?? i.getElementIds()
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
), f = p.map(
|
|
337
|
+
(i) => i.toJSON()
|
|
338
|
+
);
|
|
339
|
+
return {
|
|
340
|
+
version: 1,
|
|
341
|
+
artboards: m,
|
|
342
|
+
elements: f,
|
|
343
|
+
activeArtboardId: r ?? ((u = m[0]) == null ? void 0 : u.id) ?? ""
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function ko(l) {
|
|
347
|
+
const p = l.artboards.map(
|
|
348
|
+
(r) => N.fromJSON({
|
|
349
|
+
id: r.id,
|
|
350
|
+
name: r.name,
|
|
351
|
+
x: r.x,
|
|
352
|
+
y: r.y,
|
|
353
|
+
width: r.width,
|
|
354
|
+
height: r.height,
|
|
355
|
+
backgroundColor: r.backgroundColor,
|
|
356
|
+
backgroundType: r.backgroundType,
|
|
357
|
+
backgroundTexture: r.backgroundTexture,
|
|
358
|
+
exportBackground: r.exportBackground,
|
|
359
|
+
clipShape: r.clipShape,
|
|
360
|
+
previewBackgroundColor: r.previewBackgroundColor,
|
|
361
|
+
elementIds: r.elementIds
|
|
362
|
+
})
|
|
363
|
+
), c = l.elements.map(
|
|
364
|
+
(r) => J.createFromJSON(r)
|
|
365
|
+
);
|
|
366
|
+
return {
|
|
367
|
+
artboards: p,
|
|
368
|
+
elements: c,
|
|
369
|
+
activeArtboardId: l.activeArtboardId
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function mo(l) {
|
|
373
|
+
const p = co.safeParse(l);
|
|
374
|
+
return p.success ? { success: !0, data: p.data } : { success: !1, errors: p.error.issues.map((r) => ({
|
|
375
|
+
path: r.path.join("."),
|
|
376
|
+
message: r.message
|
|
377
|
+
})) };
|
|
378
|
+
}
|
|
379
|
+
function xo(l) {
|
|
380
|
+
if (typeof l != "object" || l === null)
|
|
381
|
+
throw new Error("migrateState: input must be a non-null object");
|
|
382
|
+
const p = l;
|
|
383
|
+
if (p.version === 1) {
|
|
384
|
+
const c = mo(l);
|
|
385
|
+
if (c.success)
|
|
386
|
+
return c.data;
|
|
387
|
+
const r = c.errors.map((m) => `${m.path}: ${m.message}`).join("; ");
|
|
388
|
+
throw new Error(`migrateState: invalid v1 state: ${r}`);
|
|
389
|
+
}
|
|
390
|
+
if (typeof p.metadata == "object" && p.metadata !== null && "version" in p.metadata)
|
|
391
|
+
return ho(p);
|
|
392
|
+
throw new Error(
|
|
393
|
+
`migrateState: unknown state format (version=${String(p.version ?? "undefined")})`
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
function ho(l) {
|
|
397
|
+
var r;
|
|
398
|
+
const c = l.metadata.version;
|
|
399
|
+
if (c === "1.0.0") {
|
|
400
|
+
const m = l.canvas ?? {}, f = l.elements ?? [], u = "artboard-migrated";
|
|
401
|
+
return {
|
|
402
|
+
version: 1,
|
|
403
|
+
artboards: [
|
|
404
|
+
{
|
|
405
|
+
id: u,
|
|
406
|
+
name: "Artboard 1",
|
|
407
|
+
x: 0,
|
|
408
|
+
y: 0,
|
|
409
|
+
width: m.width ?? 1920,
|
|
410
|
+
height: m.height ?? 1080,
|
|
411
|
+
backgroundColor: m.backgroundColor ?? "#ffffff",
|
|
412
|
+
elementIds: f.map((i) => i.id).filter(Boolean)
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
elements: f,
|
|
416
|
+
activeArtboardId: u
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
if (c === "2.0.0") {
|
|
420
|
+
const m = l.artboards ?? [], f = [], u = m.map(
|
|
421
|
+
(i) => {
|
|
422
|
+
const s = i.elements ?? [], j = s.map((W) => W.id).filter(Boolean);
|
|
423
|
+
return f.push(...s), {
|
|
424
|
+
id: i.id,
|
|
425
|
+
name: i.name,
|
|
426
|
+
x: i.x,
|
|
427
|
+
y: i.y,
|
|
428
|
+
width: i.width,
|
|
429
|
+
height: i.height,
|
|
430
|
+
backgroundColor: i.backgroundColor,
|
|
431
|
+
elementIds: j
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
);
|
|
435
|
+
return {
|
|
436
|
+
version: 1,
|
|
437
|
+
artboards: u,
|
|
438
|
+
elements: f,
|
|
439
|
+
activeArtboardId: l.activeArtboardId ?? ((r = u[0]) == null ? void 0 : r.id) ?? ""
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
throw new Error(
|
|
443
|
+
`migrateFromCanvasDocument: unsupported CanvasDocument version "${c}"`
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
export {
|
|
447
|
+
k as A,
|
|
448
|
+
co as C,
|
|
449
|
+
po as S,
|
|
450
|
+
yo as a,
|
|
451
|
+
ko as d,
|
|
452
|
+
xo as m,
|
|
453
|
+
So as s,
|
|
454
|
+
mo as v
|
|
455
|
+
};
|
|
456
|
+
//# sourceMappingURL=CanvasStateV1-D3THl2Zc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasStateV1-D3THl2Zc.js","sources":["../src/state/CanvasStateV1.ts"],"sourcesContent":["/**\n * CanvasStateV1 - Versioned, Zod-validated state serialization for the canvas editor.\n *\n * Supersedes the informal `CanvasDocument` format used by ExportManager/ImportManager.\n * Provides:\n * - Zod schemas for every element/artboard/effect type\n * - `serializeState()` to capture the full editor state\n * - `deserializeState()` to reconstruct artboards + elements\n * - `validateState()` for external validation\n * - `migrateState()` for forward-compatible version upgrades\n *\n * @module\n */\n\nimport { z } from 'zod';\nimport type { ArtboardManager } from '../core/ArtboardManager.js';\nimport type { ArtboardElement } from '../core/ArtboardElement.js';\nimport type { BaseElement } from '../core/BaseElement.js';\nimport { ElementFactory } from '../core/ElementFactory.js';\nimport { ArtboardElement as ArtboardElementClass } from '../core/ArtboardElement.js';\n\n// =============================================================================\n// Primitive Schemas\n// =============================================================================\n\nconst PointSchema = z.object({\n x: z.number(),\n y: z.number(),\n});\n\n// =============================================================================\n// Effect Schemas\n// =============================================================================\n\nconst StrokeConfigSchema = z.object({\n enabled: z.boolean(),\n color: z.string(),\n width: z.number(),\n dashArray: z.array(z.number()).optional(),\n lineCap: z.enum(['butt', 'round', 'square']).optional(),\n lineJoin: z.enum(['miter', 'round', 'bevel']).optional(),\n miterLimit: z.number().optional(),\n opacity: z.number().optional(),\n feather: z.number().optional(),\n});\n\nconst KnockoutConfigSchema = z.object({\n fill: z.boolean().optional(),\n stroke: z.boolean().optional(),\n scope: z.enum(['group', 'artboard']).optional(),\n});\n\nconst DistressEffectSchema = z.object({\n enabled: z.boolean(),\n style: z.enum(['worn', 'cracked', 'grunge', 'retro', 'custom']),\n intensity: z.number(),\n fadeAmount: z.number().optional(),\n grainAmount: z.number().optional(),\n scratchAmount: z.number().optional(),\n edgeWear: z.number().optional(),\n textureUrl: z.string().optional(),\n textureOpacity: z.number().optional(),\n textureBlendMode: z.enum(['multiply', 'screen', 'overlay']).optional(),\n seed: z.number().optional(),\n});\n\n// Forward-declare so MaskDefinitionSchema can reference AnyElementConfigSchema\n// (masks contain a nested maskElement). We use z.lazy() for the recursive part.\nconst MaskDefinitionSchema = z.object({\n id: z.string(),\n type: z.enum(['clip', 'alpha', 'luma', 'distress']),\n // maskElement is a nested element config -- use lazy to break the cycle\n maskElement: z.lazy((): z.ZodType => AnyElementConfigSchema),\n inverted: z.boolean().optional(),\n feather: z.number().optional(),\n opacity: z.number().optional(),\n blendMode: z.string().optional(),\n});\n\n// =============================================================================\n// Rich Text Schemas\n// =============================================================================\n\nconst CharacterStyleSchema = z.object({\n color: z.string().optional(),\n fontFamily: z.string().optional(),\n fontSize: z.number().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n strikethrough: z.boolean().optional(),\n});\n\nconst TextSpanSchema = z.object({\n text: z.string(),\n style: CharacterStyleSchema,\n});\n\nconst RichTextSchema = z.object({\n spans: z.array(TextSpanSchema),\n});\n\n// =============================================================================\n// Glyph & OpenType Schemas\n// =============================================================================\n\nconst GlyphOverrideSchema = z.object({\n charIndex: z.number(),\n glyphIndex: z.number(),\n unicode: z.string(),\n alternateName: z.string().optional(),\n});\n\nconst OpenTypeFeaturesSchema = z.object({\n liga: z.boolean().optional(),\n dlig: z.boolean().optional(),\n calt: z.boolean().optional(),\n swsh: z.boolean().optional(),\n smcp: z.boolean().optional(),\n c2sc: z.boolean().optional(),\n onum: z.boolean().optional(),\n lnum: z.boolean().optional(),\n tnum: z.boolean().optional(),\n pnum: z.boolean().optional(),\n ss01: z.boolean().optional(),\n ss02: z.boolean().optional(),\n ss03: z.boolean().optional(),\n ss04: z.boolean().optional(),\n ss05: z.boolean().optional(),\n ss06: z.boolean().optional(),\n ss07: z.boolean().optional(),\n ss08: z.boolean().optional(),\n ss09: z.boolean().optional(),\n ss10: z.boolean().optional(),\n ss11: z.boolean().optional(),\n ss12: z.boolean().optional(),\n ss13: z.boolean().optional(),\n ss14: z.boolean().optional(),\n ss15: z.boolean().optional(),\n ss16: z.boolean().optional(),\n ss17: z.boolean().optional(),\n ss18: z.boolean().optional(),\n ss19: z.boolean().optional(),\n ss20: z.boolean().optional(),\n cv01: z.boolean().optional(),\n cv02: z.boolean().optional(),\n cv03: z.boolean().optional(),\n cv04: z.boolean().optional(),\n cv05: z.boolean().optional(),\n ccmp: z.boolean().optional(),\n locl: z.boolean().optional(),\n kern: z.boolean().optional(),\n mark: z.boolean().optional(),\n mkmk: z.boolean().optional(),\n});\n\n// =============================================================================\n// Transform Data Schemas (discriminated on `type`)\n// =============================================================================\n\nconst CustomTransformDataSchema = z.object({\n type: z.literal('custom'),\n controlPoints: z.array(PointSchema),\n}).passthrough(); // extensible\n\nconst DistortTransformDataSchema = z.object({\n type: z.literal('distort'),\n}).passthrough();\n\nconst CircleTransformDataSchema = z.object({\n type: z.literal('circle'),\n radius: z.number(),\n scale: z.number(),\n reverse: z.boolean(),\n});\n\nconst LeanTransformDataSchema = z.object({\n type: z.literal('lean'),\n leanAmount: z.number(),\n}).passthrough();\n\nconst ArchTransformDataSchema = z.object({\n type: z.literal('arch'),\n archHeight: z.number(),\n}).passthrough();\n\nconst AscendTransformDataSchema = z.object({\n type: z.literal('ascend'),\n ascendAngle: z.number(),\n}).passthrough();\n\nconst WaveTransformDataSchema = z.object({\n type: z.literal('wave'),\n amplitude: z.number(),\n frequency: z.number(),\n}).passthrough();\n\nconst FlagTransformDataSchema = z.object({\n type: z.literal('flag'),\n amplitude: z.number(),\n frequency: z.number(),\n}).passthrough();\n\nconst ImageTransformDataSchema = z.object({\n type: z.literal('image'),\n width: z.number(),\n height: z.number(),\n cropX: z.number(),\n cropY: z.number(),\n cropWidth: z.number(),\n cropHeight: z.number(),\n flipHorizontal: z.boolean(),\n flipVertical: z.boolean(),\n borderRadius: z.number(),\n});\n\nconst GroupTransformDataSchema = z.object({\n type: z.literal('group'),\n});\n\nconst ShapeTransformDataSchema = z.object({\n type: z.literal('shape'),\n shapeType: z.enum(['rectangle', 'circle', 'ellipse', 'triangle', 'polygon', 'star', 'line']),\n width: z.number(),\n height: z.number(),\n borderRadius: z.number().optional(),\n radiusX: z.number().optional(),\n radiusY: z.number().optional(),\n sides: z.number().optional(),\n points: z.number().optional(),\n innerRadius: z.number().optional(),\n fillColor: z.string().optional(),\n fillOpacity: z.number().optional(),\n});\n\nconst PathPointSchema = z.object({\n id: z.string(),\n x: z.number(),\n y: z.number(),\n type: z.enum(['corner', 'smooth', 'bezier']),\n handleIn: PointSchema.optional(),\n handleOut: PointSchema.optional(),\n});\n\nconst PathTransformDataSchema = z.object({\n type: z.literal('path'),\n points: z.array(PathPointSchema),\n closed: z.boolean(),\n width: z.number(),\n height: z.number(),\n fillEnabled: z.boolean().optional(),\n fillColor: z.string().optional(),\n fillOpacity: z.number().optional(),\n strokeEnabled: z.boolean().optional(),\n strokeColor: z.string().optional(),\n strokeWidth: z.number().optional(),\n});\n\n// Union of all transform data schemas\nconst AnyTransformDataSchema = z.discriminatedUnion('type', [\n CustomTransformDataSchema,\n DistortTransformDataSchema,\n CircleTransformDataSchema,\n LeanTransformDataSchema,\n ArchTransformDataSchema,\n AscendTransformDataSchema,\n WaveTransformDataSchema,\n FlagTransformDataSchema,\n ImageTransformDataSchema,\n GroupTransformDataSchema,\n ShapeTransformDataSchema,\n PathTransformDataSchema,\n]);\n\n// =============================================================================\n// Base Element Properties (shared across all element types)\n// =============================================================================\n\nconst BaseElementPropsSchema = z.object({\n id: z.string(),\n x: z.number(),\n y: z.number(),\n rotation: z.number(),\n opacity: z.number(),\n // Layer properties\n name: z.string().optional(),\n visible: z.boolean().optional(),\n locked: z.boolean().optional(),\n isClipping: z.boolean().optional(),\n // Effects\n blendMode: z.enum(['normal', 'knockout', 'clip']).optional(),\n knockoutParts: KnockoutConfigSchema.optional(),\n stroke: StrokeConfigSchema.optional(),\n masks: z.array(MaskDefinitionSchema).optional(),\n distressEffect: DistressEffectSchema.optional(),\n});\n\n// Text-specific properties (shared by all text-transform element types)\nconst TextElementPropsSchema = BaseElementPropsSchema.extend({\n // Rich text\n richText: RichTextSchema.optional(),\n // Legacy plain text\n text: z.string().optional(),\n // Element-level style defaults\n fontSize: z.number().optional(),\n fontFamily: z.string().optional(),\n color: z.string().optional(),\n textAlign: z.enum(['left', 'center', 'right']).optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n strikethrough: z.boolean().optional(),\n // Typography\n glyphOverrides: z.array(GlyphOverrideSchema).optional(),\n openTypeFeatures: OpenTypeFeaturesSchema.optional(),\n});\n\n// =============================================================================\n// Element Config Schemas (discriminated on `transformType`)\n// =============================================================================\n\nconst CustomElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('custom'),\n transformData: CustomTransformDataSchema.optional(),\n});\n\nconst DistortElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('distort'),\n transformData: DistortTransformDataSchema.optional(),\n});\n\nconst CircleElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('circle'),\n transformData: CircleTransformDataSchema.optional(),\n});\n\nconst LeanElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('lean'),\n transformData: LeanTransformDataSchema.optional(),\n});\n\nconst ArchElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('arch'),\n transformData: ArchTransformDataSchema.optional(),\n});\n\nconst AscendElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('ascend'),\n transformData: AscendTransformDataSchema.optional(),\n});\n\nconst WaveElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('wave'),\n transformData: WaveTransformDataSchema.optional(),\n});\n\nconst FlagElementConfigSchema = TextElementPropsSchema.extend({\n transformType: z.literal('flag'),\n transformData: FlagTransformDataSchema.optional(),\n});\n\nconst ImageElementConfigSchema = BaseElementPropsSchema.extend({\n transformType: z.literal('image'),\n transformData: ImageTransformDataSchema.optional(),\n imageUrl: z.string().optional(),\n imageAspectRatio: z.number().optional(),\n});\n\nconst GroupElementConfigSchema = BaseElementPropsSchema.extend({\n transformType: z.literal('group'),\n transformData: GroupTransformDataSchema.optional(),\n children: z.lazy((): z.ZodType => z.array(AnyElementConfigSchema)).optional(),\n});\n\nconst ShapeElementConfigSchema = BaseElementPropsSchema.extend({\n transformType: z.literal('shape'),\n transformData: ShapeTransformDataSchema.optional(),\n});\n\nconst PathElementConfigSchema = BaseElementPropsSchema.extend({\n transformType: z.literal('path'),\n transformData: PathTransformDataSchema.optional(),\n});\n\n/**\n * Discriminated union of all element config schemas.\n * Discriminant field: `transformType`.\n */\nconst AnyElementConfigSchema: z.ZodType = z.discriminatedUnion('transformType', [\n CustomElementConfigSchema,\n DistortElementConfigSchema,\n CircleElementConfigSchema,\n LeanElementConfigSchema,\n ArchElementConfigSchema,\n AscendElementConfigSchema,\n WaveElementConfigSchema,\n FlagElementConfigSchema,\n ImageElementConfigSchema,\n GroupElementConfigSchema,\n ShapeElementConfigSchema,\n PathElementConfigSchema,\n]);\n\n// =============================================================================\n// Clip Shape Schema\n// =============================================================================\n\nconst ClipShapeSchema = z.union([\n z.literal('rectangle'),\n z.literal('circle'),\n z.object({ type: z.literal('rounded'), radius: z.number() }),\n z.object({ type: z.literal('path'), d: z.string() }),\n z.object({\n type: z.literal('composite-path'),\n pieces: z.array(\n z.object({\n d: z.string(),\n x: z.number(),\n y: z.number(),\n rotation: z\n .union([z.literal(0), z.literal(90), z.literal(180), z.literal(270)])\n .optional(),\n baseWidth: z.number().optional(),\n baseHeight: z.number().optional(),\n }),\n ),\n }),\n]);\n\n// =============================================================================\n// Artboard Schema\n// =============================================================================\n\nconst ArtboardDistressTextureSchema = z.object({\n enabled: z.boolean(),\n textureUrl: z.string(),\n intensity: z.number(),\n});\n\nconst SerializedArtboardSchema = z.object({\n id: z.string(),\n name: z.string(),\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n backgroundColor: z.string(),\n backgroundType: z.enum(['color', 'transparent', 'texture']).optional(),\n backgroundTexture: z.string().optional(),\n exportBackground: z.boolean().optional(),\n clipShape: ClipShapeSchema.optional(),\n previewBackgroundColor: z.string().optional(),\n distressTexture: ArtboardDistressTextureSchema.optional(),\n elementIds: z.array(z.string()),\n});\n\n// =============================================================================\n// CanvasStateV1 Schema\n// =============================================================================\n\n/**\n * Top-level CanvasStateV1 schema.\n *\n * - `version` is always `1` (literal).\n * - `artboards` contains serialized artboard configs with `elementIds`.\n * - `elements` is a flat array of all elements across all artboards.\n * - `activeArtboardId` identifies which artboard is currently active.\n */\nconst CanvasStateV1Schema = z.object({\n version: z.literal(1),\n artboards: z.array(SerializedArtboardSchema),\n elements: z.array(AnyElementConfigSchema),\n activeArtboardId: z.string(),\n});\n\n// =============================================================================\n// TypeScript types inferred from Zod schemas\n// =============================================================================\n\n/** A serialized artboard (artboard config + elementIds, no nested elements). */\ntype SerializedArtboard = z.infer<typeof SerializedArtboardSchema>;\n\n/** A serialized element (discriminated union on `transformType`). */\ntype SerializedElement = z.infer<typeof AnyElementConfigSchema>;\n\n/** The full versioned state document. */\ntype CanvasStateV1 = z.infer<typeof CanvasStateV1Schema>;\n\n// =============================================================================\n// Serialization\n// =============================================================================\n\n/**\n * Serialize the current editor state into a `CanvasStateV1` document.\n *\n * @param artboardManager - The ArtboardManager instance (provides artboard list + active ID).\n * @param elements - All elements currently in the editor (across all artboards).\n * @returns A validated CanvasStateV1 object ready for JSON.stringify().\n */\nfunction serializeState(\n artboardManager: ArtboardManager,\n elements: BaseElement[],\n): CanvasStateV1 {\n const artboards = artboardManager.getAllArtboards();\n const activeId = artboardManager.getActiveArtboardId();\n\n const serializedArtboards: SerializedArtboard[] = artboards.map(\n (artboard: ArtboardElement) => {\n const json = artboard.toJSON();\n return {\n id: json.id ?? artboard.id,\n name: json.name ?? artboard.name,\n x: json.x ?? artboard.x,\n y: json.y ?? artboard.y,\n width: json.width ?? artboard.width,\n height: json.height ?? artboard.height,\n backgroundColor: json.backgroundColor ?? artboard.backgroundColor,\n ...(json.backgroundType && { backgroundType: json.backgroundType }),\n ...(json.backgroundTexture && { backgroundTexture: json.backgroundTexture }),\n ...(json.exportBackground !== undefined && { exportBackground: json.exportBackground }),\n ...(json.clipShape && { clipShape: json.clipShape }),\n ...(json.previewBackgroundColor && { previewBackgroundColor: json.previewBackgroundColor }),\n elementIds: json.elementIds ?? artboard.getElementIds(),\n } satisfies SerializedArtboard;\n },\n );\n\n const serializedElements: SerializedElement[] = elements.map(\n (element) => element.toJSON() as SerializedElement,\n );\n\n return {\n version: 1 as const,\n artboards: serializedArtboards,\n elements: serializedElements,\n activeArtboardId: activeId ?? serializedArtboards[0]?.id ?? '',\n };\n}\n\n// =============================================================================\n// Deserialization\n// =============================================================================\n\n/** Result of deserializing a CanvasStateV1 document. */\ninterface DeserializeResult {\n artboards: ArtboardElement[];\n elements: BaseElement[];\n activeArtboardId: string;\n}\n\n/**\n * Deserialize a validated `CanvasStateV1` document back into runtime objects.\n *\n * Uses `ArtboardElement.fromJSON()` for artboards and `ElementFactory.createFromJSON()`\n * for elements (preserving the existing factory pattern).\n *\n * @param state - A CanvasStateV1 object (should have been validated already).\n * @returns Deserialized artboards, elements, and active artboard ID.\n */\nfunction deserializeState(state: CanvasStateV1): DeserializeResult {\n const artboards = state.artboards.map((artboardData) =>\n ArtboardElementClass.fromJSON({\n id: artboardData.id,\n name: artboardData.name,\n x: artboardData.x,\n y: artboardData.y,\n width: artboardData.width,\n height: artboardData.height,\n backgroundColor: artboardData.backgroundColor,\n backgroundType: artboardData.backgroundType,\n backgroundTexture: artboardData.backgroundTexture,\n exportBackground: artboardData.exportBackground,\n clipShape: artboardData.clipShape,\n previewBackgroundColor: artboardData.previewBackgroundColor,\n elementIds: artboardData.elementIds,\n }),\n );\n\n const elements = state.elements.map((elementData) =>\n ElementFactory.createFromJSON(elementData as import('../types/index.js').AnyElementConfig),\n );\n\n return {\n artboards,\n elements,\n activeArtboardId: state.activeArtboardId,\n };\n}\n\n// =============================================================================\n// Validation\n// =============================================================================\n\n/** Validation result with typed error details. */\ntype ValidationResult =\n | { success: true; data: CanvasStateV1 }\n | { success: false; errors: Array<{ path: string; message: string }> };\n\n/**\n * Validate an unknown value against the CanvasStateV1 schema.\n *\n * @param data - Unknown data to validate (e.g. parsed JSON).\n * @returns A discriminated result: `{ success: true, data }` or `{ success: false, errors }`.\n */\nfunction validateState(data: unknown): ValidationResult {\n const result = CanvasStateV1Schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n const errors = result.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n return { success: false, errors };\n}\n\n// =============================================================================\n// Migration\n// =============================================================================\n\n/**\n * Migrate an unknown state payload to the latest version.\n *\n * Currently only version 1 exists. Future versions will add migration logic\n * (e.g. v1 -> v2) here so that older documents can be loaded transparently.\n *\n * @param data - Unknown data (parsed JSON).\n * @returns A validated CanvasStateV1 (or the latest version in the future).\n * @throws Error if the data cannot be migrated.\n */\nfunction migrateState(data: unknown): CanvasStateV1 {\n if (typeof data !== 'object' || data === null) {\n throw new Error('migrateState: input must be a non-null object');\n }\n\n const record = data as Record<string, unknown>;\n\n // Already v1 -- validate and return\n if (record.version === 1) {\n const validation = validateState(data);\n if (validation.success) {\n return validation.data;\n }\n const msgs = validation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new Error(`migrateState: invalid v1 state: ${msgs}`);\n }\n\n // Attempt to migrate from legacy CanvasDocument format (version \"2.0.0\" or \"1.0.0\")\n if (\n typeof record.metadata === 'object' &&\n record.metadata !== null &&\n 'version' in (record.metadata as Record<string, unknown>)\n ) {\n return migrateFromCanvasDocument(record);\n }\n\n // Future: handle version 2, 3, etc. here\n // if (record.version === 2) { return migrateV2ToLatest(record); }\n\n throw new Error(\n `migrateState: unknown state format (version=${String(record.version ?? 'undefined')})`,\n );\n}\n\n/**\n * Migrate from the legacy CanvasDocument format to CanvasStateV1.\n * This handles both \"1.0.0\" and \"2.0.0\" CanvasDocument versions.\n */\nfunction migrateFromCanvasDocument(\n doc: Record<string, unknown>,\n): CanvasStateV1 {\n const metadata = doc.metadata as Record<string, unknown>;\n const version = metadata.version as string;\n\n if (version === '1.0.0') {\n // V1 CanvasDocument: { metadata, canvas, elements }\n const canvas = (doc.canvas as Record<string, unknown>) ?? {};\n const rawElements = (doc.elements as Array<Record<string, unknown>>) ?? [];\n\n const artboardId = 'artboard-migrated';\n return {\n version: 1,\n artboards: [\n {\n id: artboardId,\n name: 'Artboard 1',\n x: 0,\n y: 0,\n width: (canvas.width as number) ?? 1920,\n height: (canvas.height as number) ?? 1080,\n backgroundColor: (canvas.backgroundColor as string) ?? '#ffffff',\n elementIds: rawElements\n .map((el) => el.id as string)\n .filter(Boolean),\n },\n ],\n elements: rawElements as SerializedElement[],\n activeArtboardId: artboardId,\n };\n }\n\n if (version === '2.0.0') {\n // V2 CanvasDocument: { metadata, artboards[{ id, name, ..., elements[] }], activeArtboardId }\n const rawArtboards =\n (doc.artboards as Array<Record<string, unknown>>) ?? [];\n\n const allElements: SerializedElement[] = [];\n const serializedArtboards: SerializedArtboard[] = rawArtboards.map(\n (ab) => {\n const abElements =\n (ab.elements as Array<Record<string, unknown>>) ?? [];\n const elementIds = abElements\n .map((el) => el.id as string)\n .filter(Boolean);\n\n allElements.push(...(abElements as SerializedElement[]));\n\n return {\n id: ab.id as string,\n name: ab.name as string,\n x: ab.x as number,\n y: ab.y as number,\n width: ab.width as number,\n height: ab.height as number,\n backgroundColor: ab.backgroundColor as string,\n elementIds,\n };\n },\n );\n\n return {\n version: 1,\n artboards: serializedArtboards,\n elements: allElements,\n activeArtboardId:\n (doc.activeArtboardId as string) ??\n serializedArtboards[0]?.id ??\n '',\n };\n }\n\n throw new Error(\n `migrateFromCanvasDocument: unsupported CanvasDocument version \"${version}\"`,\n );\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport {\n // Schemas (for consumers who want to extend or compose)\n CanvasStateV1Schema,\n SerializedArtboardSchema,\n AnyElementConfigSchema,\n AnyTransformDataSchema,\n StrokeConfigSchema,\n KnockoutConfigSchema,\n DistressEffectSchema,\n MaskDefinitionSchema,\n CharacterStyleSchema,\n TextSpanSchema,\n RichTextSchema,\n ClipShapeSchema,\n\n // Functions\n serializeState,\n deserializeState,\n validateState,\n migrateState,\n};\n\nexport type {\n CanvasStateV1,\n SerializedArtboard,\n SerializedElement,\n DeserializeResult,\n ValidationResult,\n};\n"],"names":["PointSchema","z.object","z.number","StrokeConfigSchema","z.boolean","z.string","z.array","z.enum","KnockoutConfigSchema","DistressEffectSchema","MaskDefinitionSchema","z.lazy","AnyElementConfigSchema","CharacterStyleSchema","TextSpanSchema","RichTextSchema","GlyphOverrideSchema","OpenTypeFeaturesSchema","CustomTransformDataSchema","z.literal","DistortTransformDataSchema","CircleTransformDataSchema","LeanTransformDataSchema","ArchTransformDataSchema","AscendTransformDataSchema","WaveTransformDataSchema","FlagTransformDataSchema","ImageTransformDataSchema","GroupTransformDataSchema","ShapeTransformDataSchema","PathPointSchema","PathTransformDataSchema","AnyTransformDataSchema","z.discriminatedUnion","BaseElementPropsSchema","TextElementPropsSchema","CustomElementConfigSchema","DistortElementConfigSchema","CircleElementConfigSchema","LeanElementConfigSchema","ArchElementConfigSchema","AscendElementConfigSchema","WaveElementConfigSchema","FlagElementConfigSchema","ImageElementConfigSchema","GroupElementConfigSchema","ShapeElementConfigSchema","PathElementConfigSchema","ClipShapeSchema","z.union","ArtboardDistressTextureSchema","SerializedArtboardSchema","CanvasStateV1Schema","serializeState","artboardManager","elements","artboards","activeId","serializedArtboards","artboard","json","serializedElements","element","_a","deserializeState","state","artboardData","ArtboardElementClass","elementData","ElementFactory","validateState","data","result","issue","migrateState","record","validation","msgs","e","migrateFromCanvasDocument","doc","version","canvas","rawElements","artboardId","el","rawArtboards","allElements","ab","abElements","elementIds"],"mappings":";;;AAyBA,MAAMA,IAAcC,EAAS;AAAA,EAC3B,GAAGC,EAAE;AAAA,EACL,GAAGA,EAAE;AACP,CAAC,GAMKC,IAAqBF,EAAS;AAAA,EAClC,SAASG,EAAE;AAAA,EACX,OAAOC,EAAE;AAAA,EACT,OAAOH,EAAE;AAAA,EACT,WAAWI,EAAQJ,EAAE,CAAQ,EAAE,SAAA;AAAA,EAC/B,SAASK,EAAO,CAAC,QAAQ,SAAS,QAAQ,CAAC,EAAE,SAAA;AAAA,EAC7C,UAAUA,EAAO,CAAC,SAAS,SAAS,OAAO,CAAC,EAAE,SAAA;AAAA,EAC9C,YAAYL,EAAE,EAAS,SAAA;AAAA,EACvB,SAASA,EAAE,EAAS,SAAA;AAAA,EACpB,SAASA,EAAE,EAAS,SAAA;AACtB,CAAC,GAEKM,IAAuBP,EAAS;AAAA,EACpC,MAAMG,EAAE,EAAU,SAAA;AAAA,EAClB,QAAQA,EAAE,EAAU,SAAA;AAAA,EACpB,OAAOG,EAAO,CAAC,SAAS,UAAU,CAAC,EAAE,SAAA;AACvC,CAAC,GAEKE,IAAuBR,EAAS;AAAA,EACpC,SAASG,EAAE;AAAA,EACX,OAAOG,EAAO,CAAC,QAAQ,WAAW,UAAU,SAAS,QAAQ,CAAC;AAAA,EAC9D,WAAWL,EAAE;AAAA,EACb,YAAYA,EAAE,EAAS,SAAA;AAAA,EACvB,aAAaA,EAAE,EAAS,SAAA;AAAA,EACxB,eAAeA,EAAE,EAAS,SAAA;AAAA,EAC1B,UAAUA,EAAE,EAAS,SAAA;AAAA,EACrB,YAAYG,EAAE,EAAS,SAAA;AAAA,EACvB,gBAAgBH,EAAE,EAAS,SAAA;AAAA,EAC3B,kBAAkBK,EAAO,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,SAAA;AAAA,EAC5D,MAAML,EAAE,EAAS,SAAA;AACnB,CAAC,GAIKQ,IAAuBT,EAAS;AAAA,EACpC,IAAII,EAAE;AAAA,EACN,MAAME,EAAO,CAAC,QAAQ,SAAS,QAAQ,UAAU,CAAC;AAAA;AAAA,EAElD,aAAaI,EAAO,MAAiBC,CAAsB;AAAA,EAC3D,UAAUR,EAAE,EAAU,SAAA;AAAA,EACtB,SAASF,EAAE,EAAS,SAAA;AAAA,EACpB,SAASA,EAAE,EAAS,SAAA;AAAA,EACpB,WAAWG,EAAE,EAAS,SAAA;AACxB,CAAC,GAMKQ,IAAuBZ,EAAS;AAAA,EACpC,OAAOI,EAAE,EAAS,SAAA;AAAA,EAClB,YAAYA,EAAE,EAAS,SAAA;AAAA,EACvB,UAAUH,EAAE,EAAS,SAAA;AAAA,EACrB,MAAME,EAAE,EAAU,SAAA;AAAA,EAClB,QAAQA,EAAE,EAAU,SAAA;AAAA,EACpB,WAAWA,EAAE,EAAU,SAAA;AAAA,EACvB,eAAeA,EAAE,EAAU,SAAA;AAC7B,CAAC,GAEKU,IAAiBb,EAAS;AAAA,EAC9B,MAAMI,EAAE;AAAA,EACR,OAAOQ;AACT,CAAC,GAEKE,IAAiBd,EAAS;AAAA,EAC9B,OAAOK,EAAQQ,CAAc;AAC/B,CAAC,GAMKE,IAAsBf,EAAS;AAAA,EACnC,WAAWC,EAAE;AAAA,EACb,YAAYA,EAAE;AAAA,EACd,SAASG,EAAE;AAAA,EACX,eAAeA,EAAE,EAAS,SAAA;AAC5B,CAAC,GAEKY,IAAyBhB,EAAS;AAAA,EACtC,MAAMG,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AAAA,EAClB,MAAMA,EAAE,EAAU,SAAA;AACpB,CAAC,GAMKc,IAA4BjB,EAAS;AAAA,EACzC,MAAMkB,EAAU,QAAQ;AAAA,EACxB,eAAeb,EAAQN,CAAW;AACpC,CAAC,EAAE,YAAA,GAEGoB,IAA6BnB,EAAS;AAAA,EAC1C,MAAMkB,EAAU,SAAS;AAC3B,CAAC,EAAE,YAAA,GAEGE,IAA4BpB,EAAS;AAAA,EACzC,MAAMkB,EAAU,QAAQ;AAAA,EACxB,QAAQjB,EAAE;AAAA,EACV,OAAOA,EAAE;AAAA,EACT,SAASE,EAAE;AACb,CAAC,GAEKkB,IAA0BrB,EAAS;AAAA,EACvC,MAAMkB,EAAU,MAAM;AAAA,EACtB,YAAYjB,EAAE;AAChB,CAAC,EAAE,YAAA,GAEGqB,IAA0BtB,EAAS;AAAA,EACvC,MAAMkB,EAAU,MAAM;AAAA,EACtB,YAAYjB,EAAE;AAChB,CAAC,EAAE,YAAA,GAEGsB,IAA4BvB,EAAS;AAAA,EACzC,MAAMkB,EAAU,QAAQ;AAAA,EACxB,aAAajB,EAAE;AACjB,CAAC,EAAE,YAAA,GAEGuB,IAA0BxB,EAAS;AAAA,EACvC,MAAMkB,EAAU,MAAM;AAAA,EACtB,WAAWjB,EAAE;AAAA,EACb,WAAWA,EAAE;AACf,CAAC,EAAE,YAAA,GAEGwB,IAA0BzB,EAAS;AAAA,EACvC,MAAMkB,EAAU,MAAM;AAAA,EACtB,WAAWjB,EAAE;AAAA,EACb,WAAWA,EAAE;AACf,CAAC,EAAE,YAAA,GAEGyB,IAA2B1B,EAAS;AAAA,EACxC,MAAMkB,EAAU,OAAO;AAAA,EACvB,OAAOjB,EAAE;AAAA,EACT,QAAQA,EAAE;AAAA,EACV,OAAOA,EAAE;AAAA,EACT,OAAOA,EAAE;AAAA,EACT,WAAWA,EAAE;AAAA,EACb,YAAYA,EAAE;AAAA,EACd,gBAAgBE,EAAE;AAAA,EAClB,cAAcA,EAAE;AAAA,EAChB,cAAcF,EAAE;AAClB,CAAC,GAEK0B,IAA2B3B,EAAS;AAAA,EACxC,MAAMkB,EAAU,OAAO;AACzB,CAAC,GAEKU,IAA2B5B,EAAS;AAAA,EACxC,MAAMkB,EAAU,OAAO;AAAA,EACvB,WAAWZ,EAAO,CAAC,aAAa,UAAU,WAAW,YAAY,WAAW,QAAQ,MAAM,CAAC;AAAA,EAC3F,OAAOL,EAAE;AAAA,EACT,QAAQA,EAAE;AAAA,EACV,cAAcA,EAAE,EAAS,SAAA;AAAA,EACzB,SAASA,EAAE,EAAS,SAAA;AAAA,EACpB,SAASA,EAAE,EAAS,SAAA;AAAA,EACpB,OAAOA,EAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,EAAE,EAAS,SAAA;AAAA,EACnB,aAAaA,EAAE,EAAS,SAAA;AAAA,EACxB,WAAWG,EAAE,EAAS,SAAA;AAAA,EACtB,aAAaH,EAAE,EAAS,SAAA;AAC1B,CAAC,GAEK4B,IAAkB7B,EAAS;AAAA,EAC/B,IAAII,EAAE;AAAA,EACN,GAAGH,EAAE;AAAA,EACL,GAAGA,EAAE;AAAA,EACL,MAAMK,EAAO,CAAC,UAAU,UAAU,QAAQ,CAAC;AAAA,EAC3C,UAAUP,EAAY,SAAA;AAAA,EACtB,WAAWA,EAAY,SAAA;AACzB,CAAC,GAEK+B,IAA0B9B,EAAS;AAAA,EACvC,MAAMkB,EAAU,MAAM;AAAA,EACtB,QAAQb,EAAQwB,CAAe;AAAA,EAC/B,QAAQ1B,EAAE;AAAA,EACV,OAAOF,EAAE;AAAA,EACT,QAAQA,EAAE;AAAA,EACV,aAAaE,EAAE,EAAU,SAAA;AAAA,EACzB,WAAWC,EAAE,EAAS,SAAA;AAAA,EACtB,aAAaH,EAAE,EAAS,SAAA;AAAA,EACxB,eAAeE,EAAE,EAAU,SAAA;AAAA,EAC3B,aAAaC,EAAE,EAAS,SAAA;AAAA,EACxB,aAAaH,EAAE,EAAS,SAAA;AAC1B,CAAC,GAGK8B,KAAyBC,EAAqB,QAAQ;AAAA,EAC1Df;AAAA,EACAE;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAE;AACF,CAAC,GAMKG,IAAyBjC,EAAS;AAAA,EACtC,IAAII,EAAE;AAAA,EACN,GAAGH,EAAE;AAAA,EACL,GAAGA,EAAE;AAAA,EACL,UAAUA,EAAE;AAAA,EACZ,SAASA,EAAE;AAAA;AAAA,EAEX,MAAMG,EAAE,EAAS,SAAA;AAAA,EACjB,SAASD,EAAE,EAAU,SAAA;AAAA,EACrB,QAAQA,EAAE,EAAU,SAAA;AAAA,EACpB,YAAYA,EAAE,EAAU,SAAA;AAAA;AAAA,EAExB,WAAWG,EAAO,CAAC,UAAU,YAAY,MAAM,CAAC,EAAE,SAAA;AAAA,EAClD,eAAeC,EAAqB,SAAA;AAAA,EACpC,QAAQL,EAAmB,SAAA;AAAA,EAC3B,OAAOG,EAAQI,CAAoB,EAAE,SAAA;AAAA,EACrC,gBAAgBD,EAAqB,SAAA;AACvC,CAAC,GAGK0B,IAAyBD,EAAuB,OAAO;AAAA;AAAA,EAE3D,UAAUnB,EAAe,SAAA;AAAA;AAAA,EAEzB,MAAMV,EAAE,EAAS,SAAA;AAAA;AAAA,EAEjB,UAAUH,EAAE,EAAS,SAAA;AAAA,EACrB,YAAYG,EAAE,EAAS,SAAA;AAAA,EACvB,OAAOA,EAAE,EAAS,SAAA;AAAA,EAClB,WAAWE,EAAO,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,SAAA;AAAA,EAC/C,MAAMH,EAAE,EAAU,SAAA;AAAA,EAClB,QAAQA,EAAE,EAAU,SAAA;AAAA,EACpB,WAAWA,EAAE,EAAU,SAAA;AAAA,EACvB,eAAeA,EAAE,EAAU,SAAA;AAAA;AAAA,EAE3B,gBAAgBE,EAAQU,CAAmB,EAAE,SAAA;AAAA,EAC7C,kBAAkBC,EAAuB,SAAA;AAC3C,CAAC,GAMKmB,IAA4BD,EAAuB,OAAO;AAAA,EAC9D,eAAehB,EAAU,QAAQ;AAAA,EACjC,eAAeD,EAA0B,SAAA;AAC3C,CAAC,GAEKmB,IAA6BF,EAAuB,OAAO;AAAA,EAC/D,eAAehB,EAAU,SAAS;AAAA,EAClC,eAAeC,EAA2B,SAAA;AAC5C,CAAC,GAEKkB,IAA4BH,EAAuB,OAAO;AAAA,EAC9D,eAAehB,EAAU,QAAQ;AAAA,EACjC,eAAeE,EAA0B,SAAA;AAC3C,CAAC,GAEKkB,IAA0BJ,EAAuB,OAAO;AAAA,EAC5D,eAAehB,EAAU,MAAM;AAAA,EAC/B,eAAeG,EAAwB,SAAA;AACzC,CAAC,GAEKkB,IAA0BL,EAAuB,OAAO;AAAA,EAC5D,eAAehB,EAAU,MAAM;AAAA,EAC/B,eAAeI,EAAwB,SAAA;AACzC,CAAC,GAEKkB,KAA4BN,EAAuB,OAAO;AAAA,EAC9D,eAAehB,EAAU,QAAQ;AAAA,EACjC,eAAeK,EAA0B,SAAA;AAC3C,CAAC,GAEKkB,KAA0BP,EAAuB,OAAO;AAAA,EAC5D,eAAehB,EAAU,MAAM;AAAA,EAC/B,eAAeM,EAAwB,SAAA;AACzC,CAAC,GAEKkB,KAA0BR,EAAuB,OAAO;AAAA,EAC5D,eAAehB,EAAU,MAAM;AAAA,EAC/B,eAAeO,EAAwB,SAAA;AACzC,CAAC,GAEKkB,KAA2BV,EAAuB,OAAO;AAAA,EAC7D,eAAef,EAAU,OAAO;AAAA,EAChC,eAAeQ,EAAyB,SAAA;AAAA,EACxC,UAAUtB,EAAE,EAAS,SAAA;AAAA,EACrB,kBAAkBH,EAAE,EAAS,SAAA;AAC/B,CAAC,GAEK2C,KAA2BX,EAAuB,OAAO;AAAA,EAC7D,eAAef,EAAU,OAAO;AAAA,EAChC,eAAeS,EAAyB,SAAA;AAAA,EACxC,UAAUjB,EAAO,MAAiBL,EAAQM,CAAsB,CAAC,EAAE,SAAA;AACrE,CAAC,GAEKkC,KAA2BZ,EAAuB,OAAO;AAAA,EAC7D,eAAef,EAAU,OAAO;AAAA,EAChC,eAAeU,EAAyB,SAAA;AAC1C,CAAC,GAEKkB,KAA0Bb,EAAuB,OAAO;AAAA,EAC5D,eAAef,EAAU,MAAM;AAAA,EAC/B,eAAeY,EAAwB,SAAA;AACzC,CAAC,GAMKnB,IAAoCqB,EAAqB,iBAAiB;AAAA,EAC9EG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,CAAC,GAMKC,KAAkBC,EAAQ;AAAA,EAC9B9B,EAAU,WAAW;AAAA,EACrBA,EAAU,QAAQ;AAAA,EAClBlB,EAAS,EAAE,MAAMkB,EAAU,SAAS,GAAG,QAAQjB,EAAE,GAAU;AAAA,EAC3DD,EAAS,EAAE,MAAMkB,EAAU,MAAM,GAAG,GAAGd,EAAE,GAAU;AAAA,EACnDJ,EAAS;AAAA,IACP,MAAMkB,EAAU,gBAAgB;AAAA,IAChC,QAAQb;AAAAA,MACNL,EAAS;AAAA,QACP,GAAGI,EAAE;AAAA,QACL,GAAGH,EAAE;AAAA,QACL,GAAGA,EAAE;AAAA,QACL,UAAU+C,EACD,CAAC9B,EAAU,CAAC,GAAGA,EAAU,EAAE,GAAGA,EAAU,GAAG,GAAGA,EAAU,GAAG,CAAC,CAAC,EACnE,SAAA;AAAA,QACH,WAAWjB,EAAE,EAAS,SAAA;AAAA,QACtB,YAAYA,EAAE,EAAS,SAAA;AAAA,MAAS,CACjC;AAAA,IAAA;AAAA,EACH,CACD;AACH,CAAC,GAMKgD,KAAgCjD,EAAS;AAAA,EAC7C,SAASG,EAAE;AAAA,EACX,YAAYC,EAAE;AAAA,EACd,WAAWH,EAAE;AACf,CAAC,GAEKiD,KAA2BlD,EAAS;AAAA,EACxC,IAAII,EAAE;AAAA,EACN,MAAMA,EAAE;AAAA,EACR,GAAGH,EAAE;AAAA,EACL,GAAGA,EAAE;AAAA,EACL,OAAOA,EAAE;AAAA,EACT,QAAQA,EAAE;AAAA,EACV,iBAAiBG,EAAE;AAAA,EACnB,gBAAgBE,EAAO,CAAC,SAAS,eAAe,SAAS,CAAC,EAAE,SAAA;AAAA,EAC5D,mBAAmBF,EAAE,EAAS,SAAA;AAAA,EAC9B,kBAAkBD,EAAE,EAAU,SAAA;AAAA,EAC9B,WAAW4C,GAAgB,SAAA;AAAA,EAC3B,wBAAwB3C,EAAE,EAAS,SAAA;AAAA,EACnC,iBAAiB6C,GAA8B,SAAA;AAAA,EAC/C,YAAY5C,EAAQD,GAAU;AAChC,CAAC,GAcK+C,KAAsBnD,EAAS;AAAA,EACnC,SAASkB,EAAU,CAAC;AAAA,EACpB,WAAWb,EAAQ6C,EAAwB;AAAA,EAC3C,UAAU7C,EAAQM,CAAsB;AAAA,EACxC,kBAAkBP,EAAE;AACtB,CAAC;AA0BD,SAASgD,GACPC,GACAC,GACe;;AACf,QAAMC,IAAYF,EAAgB,gBAAA,GAC5BG,IAAWH,EAAgB,oBAAA,GAE3BI,IAA4CF,EAAU;AAAA,IAC1D,CAACG,MAA8B;AAC7B,YAAMC,IAAOD,EAAS,OAAA;AACtB,aAAO;AAAA,QACL,IAAIC,EAAK,MAAMD,EAAS;AAAA,QACxB,MAAMC,EAAK,QAAQD,EAAS;AAAA,QAC5B,GAAGC,EAAK,KAAKD,EAAS;AAAA,QACtB,GAAGC,EAAK,KAAKD,EAAS;AAAA,QACtB,OAAOC,EAAK,SAASD,EAAS;AAAA,QAC9B,QAAQC,EAAK,UAAUD,EAAS;AAAA,QAChC,iBAAiBC,EAAK,mBAAmBD,EAAS;AAAA,QAClD,GAAIC,EAAK,kBAAkB,EAAE,gBAAgBA,EAAK,eAAA;AAAA,QAClD,GAAIA,EAAK,qBAAqB,EAAE,mBAAmBA,EAAK,kBAAA;AAAA,QACxD,GAAIA,EAAK,qBAAqB,UAAa,EAAE,kBAAkBA,EAAK,iBAAA;AAAA,QACpE,GAAIA,EAAK,aAAa,EAAE,WAAWA,EAAK,UAAA;AAAA,QACxC,GAAIA,EAAK,0BAA0B,EAAE,wBAAwBA,EAAK,uBAAA;AAAA,QAClE,YAAYA,EAAK,cAAcD,EAAS,cAAA;AAAA,MAAc;AAAA,IAE1D;AAAA,EAAA,GAGIE,IAA0CN,EAAS;AAAA,IACvD,CAACO,MAAYA,EAAQ,OAAA;AAAA,EAAO;AAG9B,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAWJ;AAAA,IACX,UAAUG;AAAA,IACV,kBAAkBJ,OAAYM,IAAAL,EAAoB,CAAC,MAArB,gBAAAK,EAAwB,OAAM;AAAA,EAAA;AAEhE;AAsBA,SAASC,GAAiBC,GAAyC;AACjE,QAAMT,IAAYS,EAAM,UAAU;AAAA,IAAI,CAACC,MACrCC,EAAqB,SAAS;AAAA,MAC5B,IAAID,EAAa;AAAA,MACjB,MAAMA,EAAa;AAAA,MACnB,GAAGA,EAAa;AAAA,MAChB,GAAGA,EAAa;AAAA,MAChB,OAAOA,EAAa;AAAA,MACpB,QAAQA,EAAa;AAAA,MACrB,iBAAiBA,EAAa;AAAA,MAC9B,gBAAgBA,EAAa;AAAA,MAC7B,mBAAmBA,EAAa;AAAA,MAChC,kBAAkBA,EAAa;AAAA,MAC/B,WAAWA,EAAa;AAAA,MACxB,wBAAwBA,EAAa;AAAA,MACrC,YAAYA,EAAa;AAAA,IAAA,CAC1B;AAAA,EAAA,GAGGX,IAAWU,EAAM,SAAS;AAAA,IAAI,CAACG,MACnCC,EAAe,eAAeD,CAA2D;AAAA,EAAA;AAG3F,SAAO;AAAA,IACL,WAAAZ;AAAA,IACA,UAAAD;AAAA,IACA,kBAAkBU,EAAM;AAAA,EAAA;AAE5B;AAiBA,SAASK,GAAcC,GAAiC;AACtD,QAAMC,IAASpB,GAAoB,UAAUmB,CAAI;AACjD,SAAIC,EAAO,UACF,EAAE,SAAS,IAAM,MAAMA,EAAO,KAAA,IAMhC,EAAE,SAAS,IAAO,QAJVA,EAAO,MAAM,OAAO,IAAI,CAACC,OAAW;AAAA,IACjD,MAAMA,EAAM,KAAK,KAAK,GAAG;AAAA,IACzB,SAASA,EAAM;AAAA,EAAA,EACf,EACuB;AAC3B;AAgBA,SAASC,GAAaH,GAA8B;AAClD,MAAI,OAAOA,KAAS,YAAYA,MAAS;AACvC,UAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAMI,IAASJ;AAGf,MAAII,EAAO,YAAY,GAAG;AACxB,UAAMC,IAAaN,GAAcC,CAAI;AACrC,QAAIK,EAAW;AACb,aAAOA,EAAW;AAEpB,UAAMC,IAAOD,EAAW,OAAO,IAAI,CAACE,MAAM,GAAGA,EAAE,IAAI,KAAKA,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAC9E,UAAM,IAAI,MAAM,mCAAmCD,CAAI,EAAE;AAAA,EAC3D;AAGA,MACE,OAAOF,EAAO,YAAa,YAC3BA,EAAO,aAAa,QACpB,aAAcA,EAAO;AAErB,WAAOI,GAA0BJ,CAAM;AAMzC,QAAM,IAAI;AAAA,IACR,+CAA+C,OAAOA,EAAO,WAAW,WAAW,CAAC;AAAA,EAAA;AAExF;AAMA,SAASI,GACPC,GACe;;AAEf,QAAMC,IADWD,EAAI,SACI;AAEzB,MAAIC,MAAY,SAAS;AAEvB,UAAMC,IAAUF,EAAI,UAAsC,CAAA,GACpDG,IAAeH,EAAI,YAA+C,CAAA,GAElEI,IAAa;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,UACE,IAAIA;AAAA,UACJ,MAAM;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAQF,EAAO,SAAoB;AAAA,UACnC,QAASA,EAAO,UAAqB;AAAA,UACrC,iBAAkBA,EAAO,mBAA8B;AAAA,UACvD,YAAYC,EACT,IAAI,CAACE,MAAOA,EAAG,EAAY,EAC3B,OAAO,OAAO;AAAA,QAAA;AAAA,MACnB;AAAA,MAEF,UAAUF;AAAA,MACV,kBAAkBC;AAAA,IAAA;AAAA,EAEtB;AAEA,MAAIH,MAAY,SAAS;AAEvB,UAAMK,IACHN,EAAI,aAAgD,CAAA,GAEjDO,IAAmC,CAAA,GACnC7B,IAA4C4B,EAAa;AAAA,MAC7D,CAACE,MAAO;AACN,cAAMC,IACHD,EAAG,YAA+C,CAAA,GAC/CE,IAAaD,EAChB,IAAI,CAACJ,MAAOA,EAAG,EAAY,EAC3B,OAAO,OAAO;AAEjB,eAAAE,EAAY,KAAK,GAAIE,CAAkC,GAEhD;AAAA,UACL,IAAID,EAAG;AAAA,UACP,MAAMA,EAAG;AAAA,UACT,GAAGA,EAAG;AAAA,UACN,GAAGA,EAAG;AAAA,UACN,OAAOA,EAAG;AAAA,UACV,QAAQA,EAAG;AAAA,UACX,iBAAiBA,EAAG;AAAA,UACpB,YAAAE;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAWhC;AAAA,MACX,UAAU6B;AAAA,MACV,kBACGP,EAAI,sBACLjB,IAAAL,EAAoB,CAAC,MAArB,gBAAAK,EAAwB,OACxB;AAAA,IAAA;AAAA,EAEN;AAEA,QAAM,IAAI;AAAA,IACR,kEAAkEkB,CAAO;AAAA,EAAA;AAE7E;"}
|