@snowcone-app/canvas 0.13.1 → 0.15.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 (53) hide show
  1. package/dist/CanvasStateV1-BQD8fCBU.js +3699 -0
  2. package/dist/CanvasStateV1-BQD8fCBU.js.map +1 -0
  3. package/dist/advanced.mjs +323 -327
  4. package/dist/advanced.mjs.map +1 -1
  5. package/dist/api/embed.d.ts +14 -0
  6. package/dist/components/VisualGuideOverlay.d.ts +1 -1
  7. package/dist/components/embed-realtime/RealtimeCanvas.d.ts +24 -1
  8. package/dist/components/ui/index.d.ts +34 -34
  9. package/dist/embed.mjs +171 -156
  10. package/dist/embed.mjs.map +1 -1
  11. package/dist/index.mjs +47 -51
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/internals.mjs +1 -1
  14. package/dist/style.css +1 -1
  15. package/dist/{template-fields-IgDV7PRY.js → template-fields-coO73lV3.js} +245 -240
  16. package/dist/template-fields-coO73lV3.js.map +1 -0
  17. package/dist/validation-BahKiJWj.js +22973 -0
  18. package/dist/validation-BahKiJWj.js.map +1 -0
  19. package/dist/vendor/ui/index.d.ts +35 -0
  20. package/dist/vendor/ui/lib/utils.d.ts +2 -0
  21. package/dist/vendor/ui/primitives/Button.d.ts +14 -0
  22. package/dist/vendor/ui/primitives/accordion.d.ts +37 -0
  23. package/dist/vendor/ui/primitives/badge.d.ts +20 -0
  24. package/dist/vendor/ui/primitives/card.d.ts +12 -0
  25. package/dist/vendor/ui/primitives/checkbox.d.ts +8 -0
  26. package/dist/vendor/ui/primitives/collapsible.d.ts +10 -0
  27. package/dist/vendor/ui/primitives/drawer.d.ts +66 -0
  28. package/dist/vendor/ui/primitives/dropdown-menu.d.ts +27 -0
  29. package/dist/vendor/ui/primitives/fieldset.d.ts +35 -0
  30. package/dist/vendor/ui/primitives/input.d.ts +18 -0
  31. package/dist/vendor/ui/primitives/kbd.d.ts +37 -0
  32. package/dist/vendor/ui/primitives/label.d.ts +5 -0
  33. package/dist/vendor/ui/primitives/link.d.ts +52 -0
  34. package/dist/vendor/ui/primitives/popover.d.ts +26 -0
  35. package/dist/vendor/ui/primitives/radio-group.d.ts +15 -0
  36. package/dist/vendor/ui/primitives/select.d.ts +17 -0
  37. package/dist/vendor/ui/primitives/separator.d.ts +4 -0
  38. package/dist/vendor/ui/primitives/slider.d.ts +26 -0
  39. package/dist/vendor/ui/primitives/spinner.d.ts +12 -0
  40. package/dist/vendor/ui/primitives/surface.d.ts +52 -0
  41. package/dist/vendor/ui/primitives/switch.d.ts +4 -0
  42. package/dist/vendor/ui/primitives/tabs.d.ts +28 -0
  43. package/dist/vendor/ui/primitives/text-field.d.ts +36 -0
  44. package/dist/vendor/ui/primitives/textarea.d.ts +10 -0
  45. package/dist/vendor/ui/primitives/tooltip.d.ts +19 -0
  46. package/package.json +7 -5
  47. package/dist/CanvasStateV1-CKsfggNP.js +0 -456
  48. package/dist/CanvasStateV1-CKsfggNP.js.map +0 -1
  49. package/dist/schemas-B4UXytQB.js +0 -3250
  50. package/dist/schemas-B4UXytQB.js.map +0 -1
  51. package/dist/template-fields-IgDV7PRY.js.map +0 -1
  52. package/dist/validation-BpmNOvuY.js +0 -21177
  53. package/dist/validation-BpmNOvuY.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+ export interface TextFieldProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /**
4
+ * Accessible label for the input.
5
+ * If not provided via children, use aria-label on the div.
6
+ */
7
+ 'aria-label'?: string;
8
+ /**
9
+ * Error state - applies error styling to children inputs
10
+ */
11
+ isInvalid?: boolean;
12
+ /**
13
+ * Disabled state - disables all children inputs
14
+ */
15
+ disabled?: boolean;
16
+ /**
17
+ * Required state - marks all children inputs as required
18
+ */
19
+ required?: boolean;
20
+ }
21
+ /**
22
+ * TextField - A wrapper component that groups Label and Input together.
23
+ *
24
+ * Groups Label and Input with a convenient wrapper that can propagate
25
+ * disabled, required, and invalid states to child inputs.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * <TextField>
30
+ * <Label>Email</Label>
31
+ * <Input type="email" placeholder="Enter email..." />
32
+ * </TextField>
33
+ * ```
34
+ */
35
+ declare const TextField: React.ForwardRefExoticComponent<TextFieldProps & React.RefAttributes<HTMLDivElement>>;
36
+ export { TextField };
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ /** Whether the textarea is in an invalid state */
4
+ isInvalid?: boolean;
5
+ /** Visual variant - auto-detected from Surface context, or can be set explicitly */
6
+ variant?: 'default' | 'filled';
7
+ }
8
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
9
+ declare const TextArea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
10
+ export { Textarea, TextArea };
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
+ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
4
+ declare const TooltipRoot: React.FC<TooltipPrimitive.TooltipProps>;
5
+ declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ interface TooltipProps {
8
+ children: React.ReactNode;
9
+ delayDuration?: number;
10
+ skipDelayDuration?: number;
11
+ disableHoverableContent?: boolean;
12
+ delay?: number;
13
+ closeDelay?: number;
14
+ }
15
+ declare const Tooltip: (({ children, delayDuration, delay, ...props }: TooltipProps) => import("react/jsx-runtime").JSX.Element) & {
16
+ Trigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
17
+ Content: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
+ };
19
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipRoot };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowcone-app/canvas",
3
- "version": "0.13.1",
3
+ "version": "0.15.0",
4
4
  "description": "Self-contained canvas editor component for e-commerce product customization",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -101,8 +101,7 @@
101
101
  "react-colorful": "^5.6.1",
102
102
  "tailwind-merge": "^3.0.0",
103
103
  "tailwind-variants": "^3.1.1",
104
- "@snowcone-app/ui": "0.1.42",
105
- "@snowcone-app/sdk": "0.10.0"
104
+ "@snowcone-app/sdk": "0.12.0"
106
105
  },
107
106
  "devDependencies": {
108
107
  "@axe-core/playwright": "^4.11.0",
@@ -163,7 +162,8 @@
163
162
  "vite-plugin-dts": "^4.5.0",
164
163
  "vite-plugin-node-polyfills": "^0.24.0",
165
164
  "vitest": "^3.2.4",
166
- "zod": "^4.1.12"
165
+ "zod": "^4.1.12",
166
+ "@snowcone-app/ui": "0.2.0"
167
167
  },
168
168
  "scripts": {
169
169
  "dev": "vite",
@@ -171,7 +171,9 @@
171
171
  "build": "vite build",
172
172
  "bundle:worker": "node scripts/bundle-worker.js",
173
173
  "generate:icons": "npx tsx scripts/generate-icons.ts",
174
- "build:lib": "pnpm run generate:icons && pnpm run bundle:worker && vite build --config vite.lib.config.ts",
174
+ "build:lib": "pnpm run generate:icons && pnpm run bundle:worker && vite build --config vite.lib.config.ts && pnpm run check:css",
175
+ "check:css": "node scripts/check-css-namespace.mjs",
176
+ "check:classes": "node scripts/prefix-classes.mjs --check",
175
177
  "dev:lib": "pnpm run bundle:worker && vite build --config vite.lib.config.ts --watch",
176
178
  "preview": "vite preview",
177
179
  "typecheck": "tsc --noEmit -p tsconfig.json",
@@ -1,456 +0,0 @@
1
- import { E as J } from "./ImportManager-eotl7r5d.js";
2
- import { A as N } from "./HybridHistoryManager-NL3zyEl4.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-CKsfggNP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CanvasStateV1-CKsfggNP.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":"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"}