@snowcone-app/canvas 0.11.1 → 0.12.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 (29) hide show
  1. package/dist/{CanvasStateV1-D3THl2Zc.js → CanvasStateV1-CKsfggNP.js} +3 -3
  2. package/dist/{CanvasStateV1-D3THl2Zc.js.map → CanvasStateV1-CKsfggNP.js.map} +1 -1
  3. package/dist/{HybridHistoryManager-DANuzx7G.js → HybridHistoryManager-NL3zyEl4.js} +21 -21
  4. package/dist/{HybridHistoryManager-DANuzx7G.js.map → HybridHistoryManager-NL3zyEl4.js.map} +1 -1
  5. package/dist/{ImportManager-NCtkY5Z0.js → ImportManager-eotl7r5d.js} +2 -2
  6. package/dist/{ImportManager-NCtkY5Z0.js.map → ImportManager-eotl7r5d.js.map} +1 -1
  7. package/dist/{ThemeContext-U-VDtIiS.js → ThemeContext-Cl1JPVLZ.js} +2 -2
  8. package/dist/{ThemeContext-U-VDtIiS.js.map → ThemeContext-Cl1JPVLZ.js.map} +1 -1
  9. package/dist/advanced.mjs +8 -8
  10. package/dist/api/embed.d.ts +3 -1
  11. package/dist/api/stable.d.ts +3 -1
  12. package/dist/components/embed-realtime/context.d.ts +9 -0
  13. package/dist/components/embed-realtime/usePieceGuideBundle.d.ts +48 -0
  14. package/dist/design/template-fields.d.ts +39 -1
  15. package/dist/embed.mjs +215 -155
  16. package/dist/embed.mjs.map +1 -1
  17. package/dist/hooks/useDeadBindingWarning.d.ts +2 -2
  18. package/dist/hooks/useFontBinding.d.ts +23 -0
  19. package/dist/index.mjs +24 -23
  20. package/dist/internals.mjs +4 -4
  21. package/dist/template-fields-IgDV7PRY.js +1627 -0
  22. package/dist/template-fields-IgDV7PRY.js.map +1 -0
  23. package/dist/testing.mjs +2 -2
  24. package/dist/utils/UnifiedFontService.d.ts +7 -0
  25. package/dist/{validation-C857Ptxn.js → validation-BpmNOvuY.js} +14 -4
  26. package/dist/{validation-C857Ptxn.js.map → validation-BpmNOvuY.js.map} +1 -1
  27. package/package.json +3 -3
  28. package/dist/template-fields-C8Tj67ek.js +0 -1585
  29. package/dist/template-fields-C8Tj67ek.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { E as J } from "./ImportManager-NCtkY5Z0.js";
2
- import { A as N } from "./HybridHistoryManager-DANuzx7G.js";
1
+ import { E as J } from "./ImportManager-eotl7r5d.js";
2
+ import { A as N } from "./HybridHistoryManager-NL3zyEl4.js";
3
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
4
  const S = a({
5
5
  x: o(),
@@ -453,4 +453,4 @@ export {
453
453
  So as s,
454
454
  mo as v
455
455
  };
456
- //# sourceMappingURL=CanvasStateV1-D3THl2Zc.js.map
456
+ //# sourceMappingURL=CanvasStateV1-CKsfggNP.js.map
@@ -1 +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":"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"}
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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"}
@@ -7913,38 +7913,38 @@ class $s {
7913
7913
  }
7914
7914
  }
7915
7915
  export {
7916
- go as $,
7916
+ Ps as $,
7917
7917
  yt as A,
7918
7918
  it as B,
7919
- Xt as C,
7920
- Ht as D,
7921
- oe as E,
7919
+ Jt as C,
7920
+ Xt as D,
7921
+ Ht as E,
7922
7922
  Zo as F,
7923
7923
  It as G,
7924
7924
  _ as H,
7925
7925
  Et as I,
7926
- zo as J,
7927
- ee as K,
7928
- Xo as L,
7929
- Yo as M,
7930
- W as N,
7931
- L as O,
7926
+ oe as J,
7927
+ zo as K,
7928
+ ee as L,
7929
+ Xo as M,
7930
+ Yo as N,
7931
+ W as O,
7932
7932
  Nt as P,
7933
- qo as Q,
7933
+ L as Q,
7934
7934
  N as R,
7935
7935
  _t as S,
7936
7936
  et as T,
7937
- Ds as U,
7938
- Ie as V,
7939
- Oo as W,
7940
- Lo as X,
7941
- Bs as Y,
7942
- Ee as Z,
7943
- Ps as _,
7937
+ qo as U,
7938
+ Ds as V,
7939
+ Ie as W,
7940
+ Oo as X,
7941
+ Lo as Y,
7942
+ Bs as Z,
7943
+ Ee as _,
7944
7944
  ps as a,
7945
7945
  Po as a$,
7946
- co as a0,
7947
- Jt as a1,
7946
+ go as a0,
7947
+ co as a1,
7948
7948
  Me as a2,
7949
7949
  Io as a3,
7950
7950
  pe as a4,
@@ -8045,4 +8045,4 @@ export {
8045
8045
  Ut as y,
8046
8046
  Ko as z
8047
8047
  };
8048
- //# sourceMappingURL=HybridHistoryManager-DANuzx7G.js.map
8048
+ //# sourceMappingURL=HybridHistoryManager-NL3zyEl4.js.map