@a-company/atelier 0.27.2 → 0.27.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../mcp/src/index.ts","../../mcp/src/store.ts","../../mcp/src/tools/document.ts","../../schema/src/units.ts","../../schema/src/coordinates.ts","../../schema/src/color.ts","../../schema/src/shape.ts","../../schema/src/easing.ts","../../schema/src/shadow.ts","../../schema/src/layer.ts","../../schema/src/interaction.ts","../../schema/src/delta.ts","../../schema/src/state.ts","../../schema/src/preset.ts","../../schema/src/variable.ts","../../schema/src/asset.ts","../../schema/src/document.ts","../../schema/src/validate.ts","../../schema/src/parse.ts","../../mcp/src/tools/layers.ts","../../mcp/src/tools/shapes.ts","../../mcp/src/tools/states.ts","../../mcp/src/tools/deltas.ts","../../math/src/easing.ts","../../math/src/spring.ts","../../math/src/lerp.ts","../../math/src/color.ts","../../math/src/path.ts","../../core/src/resolver/delta-resolver.ts","../../core/src/resolver/easing-resolver.ts","../../core/src/expressions/expression-evaluator.ts","../../core/src/resolver/frame-resolver.ts","../../core/src/validation/overlap-validator.ts","../../core/src/builder/document-builder.ts","../../core/src/units/resolve-units.ts","../../core/src/presets/preset-resolver.ts","../../core/src/state/state-machine.ts","../../core/src/templates/template-resolver.ts","../../core/src/audio/audio-timing.ts","../../mcp/src/tools/presets.ts","../../mcp/src/tools/preview.ts","../../mcp/src/tools/templates.ts","../../mcp/src/tools/layer-effects.ts","../../mcp/src/tools/state-config.ts","../../mcp/src/tools/export.ts","../../canvas/src/styles.ts","../../canvas/src/apply-properties.ts","../../canvas/src/renderers/shape-renderer.ts","../../canvas/src/renderers/text-renderer.ts","../../canvas/src/renderers/image-renderer.ts","../../canvas/src/renderers/ref-renderer.ts","../../canvas/src/render-frame.ts","../../canvas/src/image-cache.ts","../../svg/src/render-svg.ts","../../svg/src/svg-properties.ts","../../svg/src/svg-gradients.ts","../../svg/src/svg-shapes.ts","../../svg/src/svg-text.ts","../../svg/src/svg-filters.ts","../../svg/src/svg-clip.ts","../../lottie/src/map-colors.ts","../../lottie/src/map-shapes.ts","../../lottie/src/map-easing.ts","../../lottie/src/map-keyframes.ts","../../lottie/src/map-layers.ts","../../lottie/src/warnings.ts","../../lottie/src/export-lottie.ts","../../mcp/src/tools/assets.ts","../../mcp/src/tools/variables.ts","../../mcp/src/tools/interactions.ts","../../mcp/src/tools/refs.ts","../../mcp/src/tools/performance.ts"],"sourcesContent":["// @a-company/atelier-mcp — MCP server: AI authoring interface for animations\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { DocumentStore } from \"./store.js\";\nimport { register as registerDocumentTools } from \"./tools/document.js\";\nimport { register as registerLayerTools } from \"./tools/layers.js\";\nimport { register as registerShapeTools } from \"./tools/shapes.js\";\nimport { register as registerStateTools } from \"./tools/states.js\";\nimport { register as registerDeltaTools } from \"./tools/deltas.js\";\nimport { register as registerPresetTools } from \"./tools/presets.js\";\nimport { register as registerPreviewTools } from \"./tools/preview.js\";\nimport { register as registerTemplateTools } from \"./tools/templates.js\";\nimport { register as registerLayerEffectTools } from \"./tools/layer-effects.js\";\nimport { register as registerStateConfigTools } from \"./tools/state-config.js\";\nimport { register as registerExportTools } from \"./tools/export.js\";\nimport { register as registerAssetTools } from \"./tools/assets.js\";\nimport { register as registerVariableTools } from \"./tools/variables.js\";\nimport { register as registerInteractionTools } from \"./tools/interactions.js\";\nimport { register as registerRefTools } from \"./tools/refs.js\";\nimport { register as registerPerformanceTools } from \"./tools/performance.js\";\n\nexport { DocumentStore } from \"./store.js\";\nexport { register as registerDocumentTools } from \"./tools/document.js\";\nexport { register as registerLayerTools } from \"./tools/layers.js\";\nexport { register as registerShapeTools } from \"./tools/shapes.js\";\nexport { register as registerStateTools } from \"./tools/states.js\";\nexport { register as registerDeltaTools } from \"./tools/deltas.js\";\nexport { register as registerPresetTools } from \"./tools/presets.js\";\nexport { register as registerPreviewTools } from \"./tools/preview.js\";\nexport { register as registerTemplateTools } from \"./tools/templates.js\";\nexport { register as registerLayerEffectTools } from \"./tools/layer-effects.js\";\nexport { register as registerStateConfigTools } from \"./tools/state-config.js\";\nexport { register as registerExportTools } from \"./tools/export.js\";\nexport { register as registerAssetTools } from \"./tools/assets.js\";\nexport { register as registerVariableTools } from \"./tools/variables.js\";\nexport { register as registerInteractionTools } from \"./tools/interactions.js\";\nexport { register as registerRefTools } from \"./tools/refs.js\";\nexport { register as registerPerformanceTools } from \"./tools/performance.js\";\n\n/**\n * Create a fully configured MCP server with all Atelier tools registered.\n * Returns both the server and the backing store for testing.\n */\nexport function createServer(): { server: McpServer; store: DocumentStore } {\n const store = new DocumentStore();\n\n const server = new McpServer(\n { name: \"atelier\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n registerDocumentTools(server, store);\n registerLayerTools(server, store);\n registerShapeTools(server, store);\n registerStateTools(server, store);\n registerDeltaTools(server, store);\n registerPresetTools(server, store);\n registerPreviewTools(server, store);\n registerTemplateTools(server, store);\n registerLayerEffectTools(server, store);\n registerStateConfigTools(server, store);\n registerExportTools(server, store);\n registerAssetTools(server, store);\n registerVariableTools(server, store);\n registerInteractionTools(server, store);\n registerRefTools(server, store);\n registerPerformanceTools(server, store);\n\n return { server, store };\n}\n\n// ── Main entry point ─────────────────────────────────────────\n// When run directly, connect via stdio transport.\nconst isMain =\n typeof process !== \"undefined\" &&\n process.argv[1] &&\n (process.argv[1].endsWith(\"/index.js\") ||\n process.argv[1].endsWith(\"/index.cjs\") ||\n process.argv[1].includes(\"atelier-mcp\"));\n\nif (isMain) {\n const { server } = createServer();\n const transport = new StdioServerTransport();\n server.connect(transport).catch((error) => {\n console.error(\"Failed to start Atelier MCP server:\", error);\n process.exit(1);\n });\n}\n","// @a-company/atelier-mcp — In-memory document store\n\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\n\nlet counter = 0;\n\nfunction generateId(): string {\n counter++;\n return `doc_${Date.now()}_${counter}`;\n}\n\n/**\n * In-memory store for AtelierDocuments.\n * Each document is keyed by a string ID.\n */\nexport class DocumentStore {\n private docs = new Map<string, AtelierDocument>();\n\n /** Create a new document entry. Returns the assigned ID. */\n create(doc: AtelierDocument, id?: string): string {\n const docId = id ?? generateId();\n if (this.docs.has(docId)) {\n throw new Error(`Document \"${docId}\" already exists`);\n }\n this.docs.set(docId, doc);\n return docId;\n }\n\n /** Get a document by ID. */\n get(id: string): AtelierDocument | undefined {\n return this.docs.get(id);\n }\n\n /** Set (overwrite) a document by ID. */\n set(id: string, doc: AtelierDocument): void {\n this.docs.set(id, doc);\n }\n\n /** Delete a document by ID. Returns true if it existed. */\n delete(id: string): boolean {\n return this.docs.delete(id);\n }\n\n /** Check if a document exists. */\n has(id: string): boolean {\n return this.docs.has(id);\n }\n\n /** List all document IDs and their names. */\n list(): Array<{ id: string; name: string; canvas: AtelierDocument[\"canvas\"] }> {\n const result: Array<{ id: string; name: string; canvas: AtelierDocument[\"canvas\"] }> = [];\n for (const [id, doc] of this.docs) {\n result.push({ id, name: doc.name, canvas: doc.canvas });\n }\n return result;\n }\n\n /** Clear all documents (useful for testing). */\n clear(): void {\n this.docs.clear();\n }\n}\n","// @a-company/atelier-mcp — Document management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument, parseAtelier, serializeAtelier } from \"@a-company/atelier-schema\";\nimport type { DocumentStore } from \"../store.js\";\n\n/** Helper: get document or return error result */\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_create ──────────────────────────────────────────\n server.tool(\n \"atelier_create\",\n \"Create a new Atelier animation document with canvas settings\",\n {\n name: z.string().describe(\"Animation name\"),\n width: z.number().positive().describe(\"Canvas width in pixels\"),\n height: z.number().positive().describe(\"Canvas height in pixels\"),\n fps: z.number().positive().int().describe(\"Frames per second\"),\n background: z.string().optional().describe(\"Background color (hex string)\"),\n description: z.string().optional().describe(\"Animation description\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ name, width, height, fps, background, description, tags }) => {\n const doc: AtelierDocument = {\n version: \"1.0\",\n name,\n canvas: { width, height, fps, ...(background ? { background } : {}) },\n layers: [],\n states: {},\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n const validation = validateDocument(doc);\n if (!validation.success) {\n return err(`Validation failed: ${validation.errors.map(e => `${e.path}: ${e.message}`).join(\"; \")}`);\n }\n\n const id = store.create(doc);\n return ok({ id, name: doc.name, canvas: doc.canvas });\n },\n );\n\n // ── atelier_info ────────────────────────────────────────────\n server.tool(\n \"atelier_info\",\n \"Get summary information about an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const stateNames = Object.keys(doc.states);\n const totalDuration = stateNames.reduce(\n (sum, name) => sum + doc.states[name].duration,\n 0,\n );\n\n return ok({\n name: doc.name,\n description: doc.description,\n tags: doc.tags,\n canvas: doc.canvas,\n layerCount: doc.layers.length,\n stateNames,\n totalDuration,\n presetNames: doc.presets ? Object.keys(doc.presets) : [],\n });\n },\n );\n\n // ── atelier_load ────────────────────────────────────────────\n server.tool(\n \"atelier_load\",\n \"Load an Atelier document from a YAML string\",\n {\n id: z.string().optional().describe(\"Custom document ID (auto-generated if omitted)\"),\n yaml: z.string().describe(\"YAML string representing an Atelier document\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, yaml }) => {\n const parsed = parseAtelier(yaml);\n if (!parsed.success) {\n return err(`Parse/validation failed: ${parsed.errors.map(e => `${e.path}: ${e.message}`).join(\"; \")}`);\n }\n\n const docId = store.create(parsed.data, id);\n return ok({ id: docId, name: parsed.data.name });\n },\n );\n\n // ── atelier_export ──────────────────────────────────────────\n server.tool(\n \"atelier_export\",\n \"Export an Atelier document as a YAML string\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n\n const yaml = serializeAtelier(result.doc);\n return { content: [{ type: \"text\" as const, text: yaml }] };\n },\n );\n\n // ── atelier_list ────────────────────────────────────────────\n server.tool(\n \"atelier_list\",\n \"List all Atelier documents in the store\",\n {},\n { readOnlyHint: true, destructiveHint: false },\n async () => {\n const docs = store.list();\n return ok({ documents: docs, count: docs.length });\n },\n );\n}\n","import { z } from \"zod\";\n\n/** Pixel value — any number */\nexport const PixelSchema = z.number();\n\n/** Percentage string like \"50%\" */\nexport const PercentageSchema = z.string().regex(/^-?\\d+(\\.\\d+)?%$/, {\n message: \"Percentage must be a number followed by %, e.g. \\\"50%\\\"\",\n});\n\n/** Either pixel or percentage */\nexport const UnitValueSchema = z.union([PixelSchema, PercentageSchema]);\n","import { z } from \"zod\";\nimport { UnitValueSchema } from \"./units.js\";\n\nexport const FrameSchema = z.object({\n x: UnitValueSchema,\n y: UnitValueSchema,\n});\n\nexport const BoundsSchema = z.object({\n width: UnitValueSchema,\n height: UnitValueSchema,\n});\n\nexport const AnchorPointSchema = z.object({\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n});\n","import { z } from \"zod\";\n\nexport const RGBAColorSchema = z.object({\n r: z.number().min(0).max(255),\n g: z.number().min(0).max(255),\n b: z.number().min(0).max(255),\n a: z.number().min(0).max(1),\n});\n\nexport const HSLAColorSchema = z.object({\n h: z.number().min(0).max(360),\n s: z.number().min(0).max(100),\n l: z.number().min(0).max(100),\n a: z.number().min(0).max(1),\n});\n\nexport const HexColorSchema = z.string().regex(/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, {\n message: \"Color must be a hex string: #RGB, #RGBA, #RRGGBB, or #RRGGBBAA\",\n});\n\nexport const ColorSchema = z.union([RGBAColorSchema, HSLAColorSchema, HexColorSchema]);\n","import { z } from \"zod\";\nimport { ColorSchema } from \"./color.js\";\nimport { UnitValueSchema } from \"./units.js\";\n\nexport const PathPointSchema = z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n});\n\nexport const RectShapeSchema = z.object({\n type: z.literal(\"rect\"),\n cornerRadius: z.union([\n z.number().min(0),\n z.tuple([z.number().min(0), z.number().min(0), z.number().min(0), z.number().min(0)]),\n ]).optional(),\n});\n\nexport const EllipseShapeSchema = z.object({\n type: z.literal(\"ellipse\"),\n});\n\nexport const PathShapeSchema = z.object({\n type: z.literal(\"path\"),\n points: z.array(PathPointSchema).min(2, \"Path must have at least 2 points\"),\n closed: z.boolean().optional(),\n});\n\nexport const ShapeSchema = z.discriminatedUnion(\"type\", [\n RectShapeSchema,\n EllipseShapeSchema,\n PathShapeSchema,\n]);\n\nexport const GradientStopSchema = z.object({\n offset: z.number().min(0).max(1),\n color: ColorSchema,\n});\n\nexport const SolidFillSchema = z.object({\n type: z.literal(\"solid\"),\n color: ColorSchema,\n});\n\nexport const LinearGradientFillSchema = z.object({\n type: z.literal(\"linear-gradient\"),\n angle: z.number(),\n stops: z.array(GradientStopSchema).min(2, \"Gradient needs at least 2 stops\"),\n});\n\nexport const RadialGradientFillSchema = z.object({\n type: z.literal(\"radial-gradient\"),\n center: z.object({ x: UnitValueSchema, y: UnitValueSchema }),\n radius: UnitValueSchema,\n stops: z.array(GradientStopSchema).min(2, \"Gradient needs at least 2 stops\"),\n});\n\nexport const FillSchema = z.discriminatedUnion(\"type\", [\n SolidFillSchema,\n LinearGradientFillSchema,\n RadialGradientFillSchema,\n]);\n\nexport const StrokeSchema = z.object({\n color: ColorSchema,\n width: z.number().min(0),\n dash: z.array(z.number().min(0)).optional(),\n lineCap: z.enum([\"butt\", \"round\", \"square\"]).optional(),\n lineJoin: z.enum([\"miter\", \"round\", \"bevel\"]).optional(),\n strokeStart: z.number().min(0).max(1).optional(),\n strokeEnd: z.number().min(0).max(1).optional(),\n});\n\nexport const TextStyleSchema = z.object({\n fontFamily: z.string().min(1, \"fontFamily is required\"),\n fontSize: z.number().positive(\"fontSize must be positive\"),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n color: ColorSchema,\n});\n","import { z } from \"zod\";\n\nexport const LinearEasingSchema = z.object({ type: z.literal(\"linear\") });\n\nexport const CubicBezierEasingSchema = z.object({\n type: z.literal(\"cubic-bezier\"),\n x1: z.number().min(0).max(1),\n y1: z.number(),\n x2: z.number().min(0).max(1),\n y2: z.number(),\n});\n\nexport const SpringEasingSchema = z.object({\n type: z.literal(\"spring\"),\n mass: z.number().positive().optional(),\n stiffness: z.number().positive().optional(),\n damping: z.number().positive().optional(),\n velocity: z.number().optional(),\n});\n\nexport const StepEasingSchema = z.object({\n type: z.literal(\"step\"),\n steps: z.number().int().positive(),\n position: z.enum([\"start\", \"end\"]).optional(),\n});\n\nexport const EasingPresetSchema = z.enum([\"ease-in\", \"ease-out\", \"ease-in-out\"]);\n\nexport const EasingSchema = z.union([\n LinearEasingSchema,\n CubicBezierEasingSchema,\n SpringEasingSchema,\n StepEasingSchema,\n EasingPresetSchema,\n]);\n","import { z } from \"zod\";\nimport { ColorSchema } from \"./color.js\";\n\nexport const ShadowSchema = z.object({\n color: ColorSchema,\n blur: z.number().min(0),\n offsetX: z.number().optional(),\n offsetY: z.number().optional(),\n});\n","import { z } from \"zod\";\nimport { ShapeSchema, FillSchema, StrokeSchema, TextStyleSchema, PathPointSchema } from \"./shape.js\";\nimport { FrameSchema, BoundsSchema, AnchorPointSchema } from \"./coordinates.js\";\nimport { ShadowSchema } from \"./shadow.js\";\nimport { InteractionSchema } from \"./interaction.js\";\n\nexport const BlendModeSchema = z.enum([\n \"normal\", \"multiply\", \"screen\", \"overlay\",\n \"darken\", \"lighten\", \"color-dodge\", \"color-burn\",\n \"hard-light\", \"soft-light\", \"difference\", \"exclusion\",\n \"hue\", \"saturation\", \"color\", \"luminosity\",\n]);\n\nexport const MotionPathSchema = z.object({\n points: z.array(PathPointSchema).min(2, \"Motion path must have at least 2 points\"),\n closed: z.boolean().optional(),\n autoRotate: z.boolean().optional(),\n autoRotateOffset: z.number().optional(),\n});\n\nexport const ShapeVisualSchema = z.object({\n type: z.literal(\"shape\"),\n shape: ShapeSchema,\n fill: FillSchema.optional(),\n stroke: StrokeSchema.optional(),\n});\n\nexport const TextVisualSchema = z.object({\n type: z.literal(\"text\"),\n content: z.string(),\n style: TextStyleSchema,\n});\n\nexport const SpritesheetConfigSchema = z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n});\n\nexport const SourceRectSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n});\n\nexport const ImageVisualSchema = z.object({\n type: z.literal(\"image\"),\n assetId: z.string().min(1, \"assetId is required\"),\n src: z.string().optional(),\n sourceRect: SourceRectSchema.optional(),\n spritesheet: SpritesheetConfigSchema.optional(),\n frameIndex: z.number().int().min(0).optional(),\n});\n\nexport const GroupVisualSchema = z.object({\n type: z.literal(\"group\"),\n});\n\nexport const RefVisualSchema = z.object({\n type: z.literal(\"ref\"),\n src: z.string().min(1, \"src is required\"),\n state: z.string().optional(),\n frame: z.number().int().min(0).optional(),\n});\n\nexport const VisualSchema = z.discriminatedUnion(\"type\", [\n ShapeVisualSchema,\n TextVisualSchema,\n ImageVisualSchema,\n GroupVisualSchema,\n RefVisualSchema,\n]);\n\nexport const LayerSchema = z.object({\n id: z.string().min(1, \"Layer id is required\"),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n visual: VisualSchema,\n frame: FrameSchema,\n bounds: BoundsSchema,\n anchorPoint: AnchorPointSchema.optional(),\n parentId: z.string().optional(),\n opacity: z.number().min(0).max(1).optional(),\n rotation: z.number().optional(),\n scale: z.object({ x: z.number(), y: z.number() }).optional(),\n visible: z.boolean().optional(),\n shadow: ShadowSchema.optional(),\n blendMode: BlendModeSchema.optional(),\n motionPath: MotionPathSchema.optional(),\n clipPath: ShapeSchema.optional(),\n tint: z.object({\n color: z.string(),\n amount: z.number().min(0).max(1),\n }).optional(),\n interactions: z.array(InteractionSchema).optional(),\n});\n","import { z } from \"zod\";\n\nexport const TriggerTypeSchema = z.enum([\n \"click\", \"hover\", \"pointerdown\", \"pointerup\", \"timer\", \"signal\",\n]);\n\nexport const TriggerSchema = z.object({\n type: TriggerTypeSchema,\n delay: z.number().nonnegative(\"Timer delay must be non-negative\").optional(),\n signal: z.string().optional(),\n}).refine(\n (t) => t.type !== \"timer\" || t.delay !== undefined,\n { message: \"Timer trigger requires a delay\" },\n).refine(\n (t) => t.type !== \"signal\" || t.signal !== undefined,\n { message: \"Signal trigger requires a signal name\" },\n);\n\nexport const ActionTypeSchema = z.enum([\n \"go-to-state\", \"emit-signal\", \"set-variable\", \"toggle-visibility\",\n]);\n\nexport const ActionSchema = z.object({\n type: ActionTypeSchema,\n state: z.string().optional(),\n signal: z.string().optional(),\n variable: z.string().optional(),\n value: z.unknown().optional(),\n targetLayer: z.string().optional(),\n}).refine(\n (a) => a.type !== \"go-to-state\" || a.state !== undefined,\n { message: \"go-to-state action requires a state name\" },\n).refine(\n (a) => a.type !== \"emit-signal\" || a.signal !== undefined,\n { message: \"emit-signal action requires a signal name\" },\n).refine(\n (a) => a.type !== \"set-variable\" || (a.variable !== undefined && a.value !== undefined),\n { message: \"set-variable action requires variable and value\" },\n);\n\nexport const InteractionSchema = z.object({\n id: z.string().min(1, \"Interaction id is required\"),\n trigger: TriggerSchema,\n action: ActionSchema,\n description: z.string().optional(),\n});\n","import { z } from \"zod\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const AnimatablePropertySchema = z.enum([\n \"frame.x\",\n \"frame.y\",\n \"bounds.width\",\n \"bounds.height\",\n \"opacity\",\n \"rotation\",\n \"scale.x\",\n \"scale.y\",\n \"anchorPoint.x\",\n \"anchorPoint.y\",\n \"visual.shape.cornerRadius\",\n \"visual.fill.color\",\n \"visual.stroke.color\",\n \"visual.stroke.width\",\n \"visual.stroke.start\",\n \"visual.stroke.end\",\n \"visual.style.fontSize\",\n \"visual.style.color\",\n \"shadow.color\",\n \"shadow.blur\",\n \"shadow.offsetX\",\n \"shadow.offsetY\",\n \"motionPath.progress\",\n \"visual.fill.angle\",\n \"visual.fill.center.x\",\n \"visual.fill.center.y\",\n \"visual.fill.radius\",\n \"visual.image.sourceRect.x\",\n \"visual.image.sourceRect.y\",\n \"visual.image.sourceRect.width\",\n \"visual.image.sourceRect.height\",\n \"visual.image.frameIndex\",\n \"visible\",\n \"tint.color\",\n \"tint.amount\",\n]);\n\nexport const FrameRangeSchema = z.tuple([\n z.number().int().min(0, \"Frame start must be >= 0\"),\n z.number().int().min(0, \"Frame end must be >= 0\"),\n]).refine(([start, end]) => end >= start, {\n message: \"Frame range end must be >= start\",\n});\n\nexport const DeltaSchema = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n layer: z.string().min(1, \"Delta must reference a layer id\"),\n property: AnimatablePropertySchema,\n range: FrameRangeSchema,\n from: z.unknown(),\n to: z.unknown(),\n easing: EasingSchema.optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n","import { z } from \"zod\";\nimport { DeltaSchema } from \"./delta.js\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const AudioSchema = z.object({\n src: z.string().min(1, \"Audio src is required\"),\n offset: z.number().min(0, \"Audio offset must be non-negative\").optional(),\n volume: z.number().min(0).max(1, \"Audio volume must be 0–1\").optional(),\n loop: z.boolean().optional(),\n startFrame: z.number().int().min(0, \"Audio startFrame must be a non-negative integer\").optional(),\n});\n\nexport const StateTransitionConfigSchema = z.object({\n duration: z.number().int().positive(\"Transition duration must be a positive integer (frames)\"),\n easing: EasingSchema.optional(),\n});\n\nexport const StateSchema = z.object({\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n parent: z.string().optional(),\n duration: z.number().int().positive(\"State duration must be a positive integer (frames)\"),\n deltas: z.array(DeltaSchema),\n audio: AudioSchema.optional(),\n transitions: z.record(z.string(), StateTransitionConfigSchema).optional(),\n});\n","import { z } from \"zod\";\nimport { AnimatablePropertySchema } from \"./delta.js\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const PresetDeltaSchema = z.object({\n property: AnimatablePropertySchema,\n offset: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional(),\n from: z.unknown(),\n to: z.unknown(),\n easing: EasingSchema.optional(),\n});\n\nexport const PresetSchema = z.object({\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n deltas: z.array(PresetDeltaSchema).min(1, \"Preset must have at least one delta\"),\n});\n","import { z } from \"zod\";\n\nexport const VariableTypeSchema = z.enum([\"string\", \"number\", \"color\", \"asset\", \"boolean\"]);\n\nexport const VariableSchema = z.object({\n type: VariableTypeSchema,\n default: z.unknown().optional(),\n description: z.string().optional(),\n});\n","import { z } from \"zod\";\n\nexport const AssetTypeSchema = z.enum([\"image\", \"svg\", \"font\", \"animation\", \"audio\"]);\n\nexport const AssetSchema = z.object({\n type: AssetTypeSchema,\n src: z.string().min(1, \"Asset src is required\"),\n description: z.string().optional(),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).optional(),\n});\n","import { z } from \"zod\";\nimport { LayerSchema } from \"./layer.js\";\nimport { StateSchema } from \"./state.js\";\nimport { PresetSchema } from \"./preset.js\";\nimport { VariableSchema } from \"./variable.js\";\nimport { AssetSchema } from \"./asset.js\";\n\nexport const CanvasSchema = z.object({\n width: z.number().int().positive(\"Canvas width must be a positive integer\"),\n height: z.number().int().positive(\"Canvas height must be a positive integer\"),\n fps: z.number().int().positive(\"FPS must be a positive integer\"),\n background: z.string().optional(),\n});\n\nexport const AtelierDocumentSchema = z.object({\n version: z.string().min(1, \"Version is required\"),\n name: z.string().min(1, \"Animation name is required\"),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n canvas: CanvasSchema,\n variables: z.record(z.string(), VariableSchema).optional(),\n assets: z.record(z.string(), AssetSchema).optional(),\n presets: z.record(z.string(), PresetSchema).optional(),\n layers: z.array(LayerSchema),\n states: z.record(z.string(), StateSchema),\n});\n","import type { AtelierDocument, Layer, Delta } from \"@a-company/atelier-types\";\nimport { AtelierDocumentSchema } from \"./document.js\";\nimport { LayerSchema } from \"./layer.js\";\nimport { DeltaSchema } from \"./delta.js\";\nimport type { z } from \"zod\";\n\n/** Validation result — either success with typed data or failure with readable errors */\nexport type ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\n/** Format Zod errors into flat, AI-readable error messages */\nfunction formatErrors(error: z.ZodError): ValidationError[] {\n return error.issues.map((issue) => ({\n path: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n }));\n}\n\n/** Validate a complete AtelierDocument */\nexport function validateDocument(input: unknown): ValidationResult<AtelierDocument> {\n const result = AtelierDocumentSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as AtelierDocument };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n\n/** Validate a single Layer */\nexport function validateLayer(input: unknown): ValidationResult<Layer> {\n const result = LayerSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as Layer };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n\n/** Validate a single Delta */\nexport function validateDelta(input: unknown): ValidationResult<Delta> {\n const result = DeltaSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as Delta };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n","import { parse as yamlParse, stringify as yamlStringify } from \"yaml\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument } from \"./validate.js\";\nimport type { ValidationResult } from \"./validate.js\";\n\n/**\n * Parse a YAML string into a validated AtelierDocument.\n * Returns validation errors if the YAML is invalid or doesn't match the schema.\n */\nexport function parseAtelier(yamlString: string): ValidationResult<AtelierDocument> {\n let parsed: unknown;\n try {\n parsed = yamlParse(yamlString);\n } catch (err) {\n return {\n success: false,\n errors: [{ path: \"(yaml)\", message: `YAML parse error: ${(err as Error).message}` }],\n };\n }\n return validateDocument(parsed);\n}\n\n/**\n * Serialize an AtelierDocument to YAML string.\n */\nexport function serializeAtelier(doc: AtelierDocument): string {\n return yamlStringify(doc, { indent: 2 });\n}\n","// @a-company/atelier-mcp — Layer management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Layer, Visual, UnitValue } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n/** Zod schema for visual objects passed by the AI */\nconst VisualInputSchema = z.object({\n type: z.enum([\"shape\", \"text\", \"image\", \"group\", \"ref\"]).describe(\"Visual type\"),\n // shape visual fields\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]),\n cornerRadius: z.union([z.number(), z.tuple([z.number(), z.number(), z.number(), z.number()])]).optional(),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional(),\n closed: z.boolean().optional(),\n }).optional(),\n fill: z.record(z.unknown()).optional(),\n stroke: z.record(z.unknown()).optional(),\n // text visual fields\n content: z.string().optional(),\n style: z.record(z.unknown()).optional(),\n // image visual fields\n assetId: z.string().optional(),\n sourceRect: z.object({\n x: z.number(), y: z.number(), width: z.number().positive(), height: z.number().positive(),\n }).optional(),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).optional(),\n frameIndex: z.number().int().min(0).optional(),\n // ref visual fields\n src: z.string().optional(),\n state: z.string().optional(),\n frame: z.number().int().min(0).optional(),\n}).describe(\"Visual content definition\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_layer ───────────────────────────────────────\n server.tool(\n \"atelier_add_layer\",\n \"Add a new layer to an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Unique layer ID\"),\n visual: VisualInputSchema.describe(\"Visual content definition\"),\n x: z.union([z.number(), z.string()]).describe(\"X position (pixels or percentage)\"),\n y: z.union([z.number(), z.string()]).describe(\"Y position (pixels or percentage)\"),\n width: z.union([z.number(), z.string()]).describe(\"Width (pixels or percentage)\"),\n height: z.union([z.number(), z.string()]).describe(\"Height (pixels or percentage)\"),\n description: z.string().optional().describe(\"Layer description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n opacity: z.number().min(0).max(1).optional().describe(\"Opacity 0-1\"),\n rotation: z.number().optional().describe(\"Rotation in degrees\"),\n parentId: z.string().optional().describe(\"Parent layer ID for transform inheritance\"),\n anchorPoint: z.object({ x: z.number(), y: z.number() }).optional().describe(\"Anchor point (0-1 normalized)\"),\n scale: z.object({ x: z.number(), y: z.number() }).optional().describe(\"Scale factors\"),\n visible: z.boolean().optional().describe(\"Whether layer is visible\"),\n tint: z.object({\n color: z.string().describe(\"Tint color (hex string)\"),\n amount: z.number().min(0).max(1).describe(\"Tint amount (0 = none, 1 = full)\"),\n }).optional().describe(\"Color tint overlay\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, visual, x, y, width, height, description, tags, opacity, rotation, parentId, anchorPoint, scale, visible, tint }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Check for duplicate layer ID\n if (doc.layers.some(l => l.id === layerId)) {\n return err(`Layer \"${layerId}\" already exists in document \"${id}\"`);\n }\n\n // Validate parentId if provided\n if (parentId && !doc.layers.some(l => l.id === parentId)) {\n return err(`Parent layer \"${parentId}\" not found`);\n }\n\n const layer: Layer = {\n id: layerId,\n visual: visual as unknown as Visual,\n frame: { x: x as UnitValue, y: y as UnitValue },\n bounds: { width: width as UnitValue, height: height as UnitValue },\n ...(description != null ? { description } : {}),\n ...(tags ? { tags } : {}),\n ...(opacity != null ? { opacity } : {}),\n ...(rotation != null ? { rotation } : {}),\n ...(parentId ? { parentId } : {}),\n ...(anchorPoint ? { anchorPoint } : {}),\n ...(scale ? { scale } : {}),\n ...(visible != null ? { visible } : {}),\n ...(tint ? { tint } : {}),\n };\n\n doc.layers.push(layer);\n return ok({ layerId, index: doc.layers.length - 1 });\n },\n );\n\n // ── atelier_edit_layer ──────────────────────────────────────\n server.tool(\n \"atelier_edit_layer\",\n \"Edit properties of an existing layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to edit\"),\n x: z.union([z.number(), z.string()]).optional().describe(\"New X position\"),\n y: z.union([z.number(), z.string()]).optional().describe(\"New Y position\"),\n width: z.union([z.number(), z.string()]).optional().describe(\"New width\"),\n height: z.union([z.number(), z.string()]).optional().describe(\"New height\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n opacity: z.number().min(0).max(1).optional().describe(\"New opacity\"),\n rotation: z.number().optional().describe(\"New rotation\"),\n parentId: z.string().nullable().optional().describe(\"New parent layer ID (null to clear)\"),\n anchorPoint: z.object({ x: z.number(), y: z.number() }).optional().describe(\"New anchor point\"),\n scale: z.object({ x: z.number(), y: z.number() }).optional().describe(\"New scale\"),\n visible: z.boolean().optional().describe(\"New visibility\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, x, y, width, height, description, tags, opacity, rotation, parentId, anchorPoint, scale, visible }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (x != null) layer.frame.x = x as UnitValue;\n if (y != null) layer.frame.y = y as UnitValue;\n if (width != null) layer.bounds.width = width as UnitValue;\n if (height != null) layer.bounds.height = height as UnitValue;\n if (description != null) layer.description = description;\n if (tags) layer.tags = tags;\n if (opacity != null) layer.opacity = opacity;\n if (rotation != null) layer.rotation = rotation;\n if (parentId !== undefined) {\n if (parentId === null) {\n delete layer.parentId;\n } else {\n if (!doc.layers.some(l => l.id === parentId)) return err(`Parent layer \"${parentId}\" not found`);\n layer.parentId = parentId;\n }\n }\n if (anchorPoint) layer.anchorPoint = anchorPoint;\n if (scale) layer.scale = scale;\n if (visible != null) layer.visible = visible;\n\n return ok({ layerId, updated: true });\n },\n );\n\n // ── atelier_remove_layer ────────────────────────────────────\n server.tool(\n \"atelier_remove_layer\",\n \"Remove a layer from an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, layerId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const index = doc.layers.findIndex(l => l.id === layerId);\n if (index === -1) return err(`Layer \"${layerId}\" not found`);\n\n // Check for deltas that reference this layer\n const warnings: string[] = [];\n for (const [stateName, state] of Object.entries(doc.states)) {\n const deltaCount = state.deltas.filter(d => d.layer === layerId).length;\n if (deltaCount > 0) {\n warnings.push(`State \"${stateName}\" has ${deltaCount} delta(s) referencing this layer`);\n }\n }\n\n // Check for child layers\n const childCount = doc.layers.filter(l => l.parentId === layerId).length;\n if (childCount > 0) {\n warnings.push(`${childCount} child layer(s) reference this layer as parent`);\n }\n\n doc.layers.splice(index, 1);\n return ok({ layerId, removed: true, warnings });\n },\n );\n\n // ── atelier_list_layers ─────────────────────────────────────\n server.tool(\n \"atelier_list_layers\",\n \"List all layers in an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layers = doc.layers.map((l, index) => ({\n index,\n id: l.id,\n type: l.visual.type,\n frame: l.frame,\n bounds: l.bounds,\n description: l.description,\n tags: l.tags,\n opacity: l.opacity,\n rotation: l.rotation,\n parentId: l.parentId,\n visible: l.visible,\n }));\n\n return ok({ layers, count: layers.length });\n },\n );\n\n // ── atelier_reorder ─────────────────────────────────────────\n server.tool(\n \"atelier_reorder\",\n \"Move a layer to a new position in the layer stack\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to move\"),\n position: z.number().int().min(0).describe(\"Target position index (0-based)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, position }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const currentIndex = doc.layers.findIndex(l => l.id === layerId);\n if (currentIndex === -1) return err(`Layer \"${layerId}\" not found`);\n\n const targetPos = Math.min(position, doc.layers.length - 1);\n const [layer] = doc.layers.splice(currentIndex, 1);\n doc.layers.splice(targetPos, 0, layer);\n\n return ok({ layerId, from: currentIndex, to: targetPos });\n },\n );\n}\n","// @a-company/atelier-mcp — Shape, fill, and stroke tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, ShapeVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_shape ───────────────────────────────────────\n server.tool(\n \"atelier_set_shape\",\n \"Set the shape on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]).describe(\"Shape type\"),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional().describe(\"Corner radius (rect only)\"),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional().describe(\"Path points (path only)\"),\n closed: z.boolean().optional().describe(\"Whether path is closed (path only)\"),\n }).describe(\"Shape definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, shape }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).shape = shape as ShapeVisual[\"shape\"];\n return ok({ layerId, shape: shape.type });\n },\n );\n\n // ── atelier_set_fill ────────────────────────────────────────\n server.tool(\n \"atelier_set_fill\",\n \"Set the fill on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n fill: z.object({\n type: z.enum([\"solid\", \"linear-gradient\", \"radial-gradient\"]).describe(\"Fill type\"),\n color: z.unknown().optional().describe(\"Color for solid fill (hex string or RGBA/HSLA object)\"),\n angle: z.number().optional().describe(\"Angle in degrees (linear-gradient only)\"),\n center: z.object({\n x: z.union([z.number(), z.string()]),\n y: z.union([z.number(), z.string()]),\n }).optional().describe(\"Center point (radial-gradient only)\"),\n radius: z.union([z.number(), z.string()]).optional().describe(\"Radius (radial-gradient only)\"),\n stops: z.array(z.object({\n offset: z.number().min(0).max(1),\n color: z.unknown(),\n })).optional().describe(\"Gradient stops\"),\n }).describe(\"Fill definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, fill }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).fill = fill as unknown as ShapeVisual[\"fill\"];\n return ok({ layerId, fillType: fill.type });\n },\n );\n\n // ── atelier_set_stroke ──────────────────────────────────────\n server.tool(\n \"atelier_set_stroke\",\n \"Set the stroke on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n stroke: z.object({\n color: z.unknown().describe(\"Stroke color (hex string or RGBA/HSLA object)\"),\n width: z.number().positive().describe(\"Stroke width in pixels\"),\n dash: z.array(z.number()).optional().describe(\"Dash pattern\"),\n lineCap: z.enum([\"butt\", \"round\", \"square\"]).optional().describe(\"Line cap style\"),\n lineJoin: z.enum([\"miter\", \"round\", \"bevel\"]).optional().describe(\"Line join style\"),\n }).describe(\"Stroke definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, stroke }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).stroke = stroke as unknown as ShapeVisual[\"stroke\"];\n return ok({ layerId, strokeWidth: stroke.width });\n },\n );\n}\n","// @a-company/atelier-mcp — State management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_state ───────────────────────────────────────\n server.tool(\n \"atelier_add_state\",\n \"Add a named animation state to a document\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name (e.g. 'intro', 'hover', 'exit')\"),\n duration: z.number().positive().int().describe(\"Duration in frames\"),\n description: z.string().optional().describe(\"State description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, duration, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (doc.states[stateName]) {\n return err(`State \"${stateName}\" already exists`);\n }\n\n doc.states[stateName] = {\n duration,\n deltas: [],\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n return ok({ stateName, duration });\n },\n );\n\n // ── atelier_edit_state ──────────────────────────────────────\n server.tool(\n \"atelier_edit_state\",\n \"Edit metadata of an existing animation state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to edit\"),\n duration: z.number().positive().int().optional().describe(\"New duration in frames\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, duration, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (duration != null) state.duration = duration;\n if (description != null) state.description = description;\n if (tags) state.tags = tags;\n\n return ok({ stateName, updated: true });\n },\n );\n\n // ── atelier_remove_state ────────────────────────────────────\n server.tool(\n \"atelier_remove_state\",\n \"Remove an animation state and all its deltas\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, stateName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) return err(`State \"${stateName}\" not found`);\n\n const deltaCount = doc.states[stateName].deltas.length;\n delete doc.states[stateName];\n\n return ok({ stateName, removed: true, deltasRemoved: deltaCount });\n },\n );\n\n // ── atelier_list_states ─────────────────────────────────────\n server.tool(\n \"atelier_list_states\",\n \"List all animation states in a document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const states = Object.entries(doc.states).map(([name, state]) => ({\n name,\n duration: state.duration,\n description: state.description,\n tags: state.tags,\n deltaCount: state.deltas.length,\n }));\n\n return ok({ states, count: states.length });\n },\n );\n}\n","// @a-company/atelier-mcp — Delta (animation keyframe) tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Delta, AnimatableProperty, Easing } from \"@a-company/atelier-types\";\nimport { AnimatablePropertySchema, EasingSchema } from \"@a-company/atelier-schema\";\nimport { validateNoOverlap, expandPreset } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n// Canonical source: @a-company/atelier-schema — single source of truth for AnimatableProperty\nconst AnimatablePropertyEnum = AnimatablePropertySchema;\nconst EasingInputSchema = EasingSchema.describe(\"Easing function\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_delta ───────────────────────────────────────\n server.tool(\n \"atelier_add_delta\",\n \"Add an animation delta (keyframe transition) to a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n layer: z.string().describe(\"Target layer ID\"),\n property: AnimatablePropertyEnum.describe(\"Property to animate\"),\n range: z.tuple([z.number().int().min(0), z.number().int().min(0)]).describe(\"Frame range [start, end] inclusive\"),\n from: z.unknown().describe(\"Starting value\"),\n to: z.unknown().describe(\"Ending value\"),\n easing: EasingInputSchema.optional().describe(\"Easing function\"),\n description: z.string().optional().describe(\"Delta description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n deltaId: z.string().optional().describe(\"Custom delta ID\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, layer, property, range, from, to, easing, description, tags, deltaId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Validate state exists\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n // Validate layer exists\n if (!doc.layers.some(l => l.id === layer)) {\n return err(`Layer \"${layer}\" not found`);\n }\n\n // Validate range\n if (range[0] > range[1]) {\n return err(`Invalid range: start (${range[0]}) must be <= end (${range[1]})`);\n }\n\n const delta: Delta = {\n layer,\n property: property as AnimatableProperty,\n range: [range[0], range[1]],\n from,\n to,\n ...(easing ? { easing: easing as Easing } : {}),\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n ...(deltaId ? { id: deltaId } : {}),\n };\n\n // Check for overlaps\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n return err(overlap.message);\n }\n\n state.deltas.push(delta);\n return ok({ stateName, deltaIndex: state.deltas.length - 1, layer, property });\n },\n );\n\n // ── atelier_edit_delta ──────────────────────────────────────\n server.tool(\n \"atelier_edit_delta\",\n \"Edit an existing delta by index within a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n deltaIndex: z.number().int().min(0).describe(\"Delta index within the state\"),\n layer: z.string().optional().describe(\"New target layer ID\"),\n property: AnimatablePropertyEnum.optional().describe(\"New property to animate\"),\n range: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional().describe(\"New frame range [start, end]\"),\n from: z.unknown().optional().describe(\"New starting value\"),\n to: z.unknown().optional().describe(\"New ending value\"),\n easing: EasingInputSchema.optional().describe(\"New easing function\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, deltaIndex, layer, property, range, from, to, easing, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (deltaIndex >= state.deltas.length) {\n return err(`Delta index ${deltaIndex} out of range (${state.deltas.length} deltas)`);\n }\n\n const delta = state.deltas[deltaIndex];\n\n // Apply updates\n if (layer != null) {\n if (!doc.layers.some(l => l.id === layer)) return err(`Layer \"${layer}\" not found`);\n delta.layer = layer;\n }\n if (property != null) delta.property = property as AnimatableProperty;\n if (range != null) {\n if (range[0] > range[1]) return err(`Invalid range: start (${range[0]}) must be <= end (${range[1]})`);\n delta.range = [range[0], range[1]];\n }\n if (from !== undefined) delta.from = from;\n if (to !== undefined) delta.to = to;\n if (easing != null) delta.easing = easing as Easing;\n if (description != null) delta.description = description;\n if (tags) delta.tags = tags;\n\n // Re-validate overlaps with the updated delta against others\n const others = state.deltas.filter((_, i) => i !== deltaIndex);\n const overlap = validateNoOverlap(others, delta);\n if (overlap) {\n return err(`Edit would cause overlap: ${overlap.message}`);\n }\n\n return ok({ stateName, deltaIndex, updated: true });\n },\n );\n\n // ── atelier_remove_delta ────────────────────────────────────\n server.tool(\n \"atelier_remove_delta\",\n \"Remove a delta by index from a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n deltaIndex: z.number().int().min(0).describe(\"Delta index to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, stateName, deltaIndex }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (deltaIndex >= state.deltas.length) {\n return err(`Delta index ${deltaIndex} out of range (${state.deltas.length} deltas)`);\n }\n\n const removed = state.deltas.splice(deltaIndex, 1)[0];\n return ok({\n stateName,\n removed: {\n layer: removed.layer,\n property: removed.property,\n range: removed.range,\n },\n remainingDeltas: state.deltas.length,\n });\n },\n );\n\n // ── atelier_apply_preset ────────────────────────────────────\n server.tool(\n \"atelier_apply_preset\",\n \"Apply a preset to a layer, expanding it into concrete deltas\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to add deltas to\"),\n presetName: z.string().describe(\"Preset name defined in the document\"),\n layerId: z.string().describe(\"Target layer ID\"),\n startFrame: z.number().int().min(0).optional().describe(\"Start frame (default: 0)\"),\n duration: z.number().positive().int().optional().describe(\"Duration for preset (default: state duration)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, presetName, layerId, startFrame, duration }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (!doc.layers.some(l => l.id === layerId)) {\n return err(`Layer \"${layerId}\" not found`);\n }\n\n if (!doc.presets || !doc.presets[presetName]) {\n return err(`Preset \"${presetName}\" not found`);\n }\n\n const preset = doc.presets[presetName];\n const start = startFrame ?? 0;\n const dur = duration ?? state.duration;\n\n const deltas = expandPreset(preset, layerId, start, dur);\n\n // Validate no overlaps for each new delta\n const errors: string[] = [];\n for (const delta of deltas) {\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n errors.push(overlap.message);\n }\n }\n\n if (errors.length > 0) {\n return err(`Preset would cause overlaps:\\n${errors.join(\"\\n\")}`);\n }\n\n // Add all deltas\n state.deltas.push(...deltas);\n\n return ok({\n stateName,\n presetName,\n layerId,\n deltasAdded: deltas.length,\n totalDeltas: state.deltas.length,\n });\n },\n );\n}\n","/**\n * Linear easing — no acceleration.\n */\nexport function linear(t: number): number {\n return t;\n}\n\n/**\n * Cubic bezier easing — CSS-compatible.\n * Implements the same algorithm as CSS cubic-bezier().\n * @param x1 - first control point x\n * @param y1 - first control point y\n * @param x2 - second control point x\n * @param y2 - second control point y\n */\nexport function cubicBezier(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): (t: number) => number {\n // Use binary search to find the parametric t value that gives us our x,\n // then compute the corresponding y. This is the standard algorithm used\n // by browsers for CSS transitions.\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n\n // Binary search for the parametric t value that gives us our x\n let lo = 0;\n let hi = 1;\n let mid: number = 0;\n\n for (let i = 0; i < 20; i++) {\n mid = (lo + hi) / 2;\n const x = sampleBezier(x1, x2, mid);\n if (Math.abs(x - t) < 1e-6) break;\n if (x < t) lo = mid;\n else hi = mid;\n }\n\n mid = (lo + hi) / 2;\n return sampleBezier(y1, y2, mid);\n };\n}\n\n/** Sample a single axis of a cubic bezier at parametric t */\nfunction sampleBezier(p1: number, p2: number, t: number): number {\n // B(t) = 3(1-t)^2*t*p1 + 3(1-t)*t^2*p2 + t^3\n return 3 * (1 - t) * (1 - t) * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t;\n}\n\n/** Common CSS easing presets */\nexport const easeIn = cubicBezier(0.42, 0, 1, 1);\nexport const easeOut = cubicBezier(0, 0, 0.58, 1);\nexport const easeInOut = cubicBezier(0.42, 0, 0.58, 1);\n\n/**\n * Step easing — jumps between discrete values.\n * @param steps - number of steps\n * @param position - \"start\" or \"end\" (default \"end\")\n */\nexport function step(\n steps: number,\n position: \"start\" | \"end\" = \"end\",\n): (t: number) => number {\n return (t: number): number => {\n if (t <= 0) return position === \"start\" ? 1 / steps : 0;\n if (t >= 1) return 1;\n\n const s = Math.floor(t * steps);\n if (position === \"start\") {\n return Math.min((s + 1) / steps, 1);\n }\n return s / steps;\n };\n}\n","export interface SpringConfig {\n mass?: number; // default 1\n stiffness?: number; // default 100\n damping?: number; // default 10\n velocity?: number; // default 0\n}\n\n/**\n * Creates a spring easing function.\n * Uses damped harmonic oscillator physics.\n * Returns a function that takes t (0-1) and returns the spring value.\n *\n * The spring always goes from 0 to 1, but may overshoot.\n */\nexport function spring(config: SpringConfig = {}): (t: number) => number {\n const {\n mass = 1,\n stiffness = 100,\n damping = 10,\n velocity = 0,\n } = config;\n\n const w0 = Math.sqrt(stiffness / mass); // natural frequency\n const zeta = damping / (2 * Math.sqrt(stiffness * mass)); // damping ratio\n\n // Determine total duration to normalize t\n // We pre-calculate a reasonable duration where the spring settles\n const duration = estimateSettleTime(zeta, w0);\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n\n const time = t * duration;\n let value: number;\n\n if (zeta < 1) {\n // Underdamped\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n const A = 1;\n const B = (zeta * w0 + velocity) / wd;\n value =\n 1 -\n Math.exp(-zeta * w0 * time) *\n (A * Math.cos(wd * time) + B * Math.sin(wd * time));\n } else if (zeta === 1) {\n // Critically damped\n value = 1 - Math.exp(-w0 * time) * (1 + (w0 + velocity) * time);\n } else {\n // Overdamped\n const s1 = -w0 * (zeta - Math.sqrt(zeta * zeta - 1));\n const s2 = -w0 * (zeta + Math.sqrt(zeta * zeta - 1));\n const A = (velocity - s2) / (s1 - s2);\n const B = 1 - A;\n value = 1 - A * Math.exp(s1 * time) - B * Math.exp(s2 * time);\n }\n\n return value;\n };\n}\n\n/**\n * Estimates the time for a spring to settle within 0.1% of target.\n */\nfunction estimateSettleTime(zeta: number, w0: number): number {\n if (zeta >= 1) {\n return 10 / (zeta * w0);\n }\n // For underdamped: settling ~ -ln(0.001) / (zeta * w0)\n return Math.log(1000) / (zeta * w0);\n}\n","/**\n * Linear interpolation between two numbers.\n */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Clamp a value between min and max.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Interpolate between two multi-dimensional values.\n * Arrays must be the same length.\n */\nexport function lerpArray(a: number[], b: number[], t: number): number[] {\n return a.map((v, i) => lerp(v, b[i], t));\n}\n\n/**\n * Re-maps a value from one range to another.\n */\nexport function remap(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n const t = (value - inMin) / (inMax - inMin);\n return lerp(outMin, outMax, t);\n}\n","import { lerp, clamp } from \"./lerp.js\";\n\nexport interface RGBA {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n a: number; // 0-1\n}\n\nexport interface HSLA {\n h: number; // 0-360\n s: number; // 0-100\n l: number; // 0-100\n a: number; // 0-1\n}\n\n/**\n * Parse a hex color string to RGBA.\n * Supports: #RGB, #RGBA, #RRGGBB, #RRGGBBAA\n */\nexport function hexToRgba(hex: string): RGBA {\n let h = hex.replace(\"#\", \"\");\n\n if (h.length === 3)\n h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] + \"ff\";\n else if (h.length === 4)\n h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] + h[3] + h[3];\n else if (h.length === 6) h = h + \"ff\";\n\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n a: parseInt(h.slice(6, 8), 16) / 255,\n };\n}\n\n/**\n * Convert RGBA to hex string.\n */\nexport function rgbaToHex(color: RGBA): string {\n const r = clamp(Math.round(color.r), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const g = clamp(Math.round(color.g), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const b = clamp(Math.round(color.b), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const a = clamp(Math.round(color.a * 255), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}${a === \"ff\" ? \"\" : a}`;\n}\n\n/**\n * Interpolate between two RGBA colors.\n */\nexport function lerpRgba(a: RGBA, b: RGBA, t: number): RGBA {\n return {\n r: lerp(a.r, b.r, t),\n g: lerp(a.g, b.g, t),\n b: lerp(a.b, b.b, t),\n a: lerp(a.a, b.a, t),\n };\n}\n\n/**\n * Convert RGBA to HSLA.\n */\nexport function rgbaToHsla(color: RGBA): HSLA {\n const r = color.r / 255;\n const g = color.g / 255;\n const b = color.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100, a: color.a };\n}\n\n/**\n * Convert HSLA to RGBA.\n */\nexport function hslaToRgba(color: HSLA): RGBA {\n const h = color.h / 360;\n const s = color.s / 100;\n const l = color.l / 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hueToRgb(p, q, h + 1 / 3);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n a: color.a,\n };\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\n/**\n * Interpolate between two HSLA colors (shortest hue path).\n */\nexport function lerpHsla(a: HSLA, b: HSLA, t: number): HSLA {\n // Handle hue wrapping — take the shortest path\n let dh = b.h - a.h;\n if (dh > 180) dh -= 360;\n if (dh < -180) dh += 360;\n\n return {\n h: (((a.h + dh * t) % 360) + 360) % 360,\n s: lerp(a.s, b.s, t),\n l: lerp(a.l, b.l, t),\n a: lerp(a.a, b.a, t),\n };\n}\n","/**\n * Path interpolation utilities for motion paths.\n * Evaluates position and tangent along a path defined by points with bezier handles.\n */\n\nexport interface PathPoint2D {\n x: number;\n y: number;\n in?: { x: number; y: number };\n out?: { x: number; y: number };\n}\n\nexport interface PathPosition {\n x: number;\n y: number;\n /** Tangent angle in degrees */\n angle: number;\n}\n\n/**\n * Compute the length of a single cubic bezier segment using subdivision.\n */\nfunction bezierSegmentLength(\n p0x: number, p0y: number,\n c0x: number, c0y: number,\n c1x: number, c1y: number,\n p1x: number, p1y: number,\n steps = 32,\n): number {\n let length = 0;\n let prevX = p0x;\n let prevY = p0y;\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const mt = 1 - t;\n const x = mt * mt * mt * p0x + 3 * mt * mt * t * c0x + 3 * mt * t * t * c1x + t * t * t * p1x;\n const y = mt * mt * mt * p0y + 3 * mt * mt * t * c0y + 3 * mt * t * t * c1y + t * t * t * p1y;\n const dx = x - prevX;\n const dy = y - prevY;\n length += Math.sqrt(dx * dx + dy * dy);\n prevX = x;\n prevY = y;\n }\n return length;\n}\n\n/**\n * Evaluate a cubic bezier at parameter t, returning position and tangent.\n */\nfunction evalBezier(\n p0x: number, p0y: number,\n c0x: number, c0y: number,\n c1x: number, c1y: number,\n p1x: number, p1y: number,\n t: number,\n): PathPosition {\n const mt = 1 - t;\n const x = mt * mt * mt * p0x + 3 * mt * mt * t * c0x + 3 * mt * t * t * c1x + t * t * t * p1x;\n const y = mt * mt * mt * p0y + 3 * mt * mt * t * c0y + 3 * mt * t * t * c1y + t * t * t * p1y;\n\n // Tangent (first derivative)\n const tx = 3 * mt * mt * (c0x - p0x) + 6 * mt * t * (c1x - c0x) + 3 * t * t * (p1x - c1x);\n const ty = 3 * mt * mt * (c0y - p0y) + 6 * mt * t * (c1y - c0y) + 3 * t * t * (p1y - c1y);\n\n const angle = Math.atan2(ty, tx) * (180 / Math.PI);\n\n return { x, y, angle };\n}\n\n/**\n * Build a lookup table of cumulative segment lengths for a path.\n */\nfunction buildSegmentLengths(points: PathPoint2D[], closed: boolean): number[] {\n const segCount = closed ? points.length : points.length - 1;\n const lengths: number[] = [];\n\n for (let i = 0; i < segCount; i++) {\n const p0 = points[i];\n const p1 = points[(i + 1) % points.length];\n\n const c0x = p0.x + (p0.out?.x ?? 0);\n const c0y = p0.y + (p0.out?.y ?? 0);\n const c1x = p1.x + (p1.in?.x ?? 0);\n const c1y = p1.y + (p1.in?.y ?? 0);\n\n lengths.push(bezierSegmentLength(p0.x, p0.y, c0x, c0y, c1x, c1y, p1.x, p1.y));\n }\n\n return lengths;\n}\n\n/**\n * Evaluate a point along a path at a given progress (0–1).\n * Uses arc-length parameterization for uniform speed.\n */\nexport function evaluatePathAtProgress(\n points: PathPoint2D[],\n progress: number,\n closed = false,\n): PathPosition {\n if (points.length < 2) {\n return { x: points[0]?.x ?? 0, y: points[0]?.y ?? 0, angle: 0 };\n }\n\n // Clamp progress\n const t = Math.max(0, Math.min(1, progress));\n\n const segLengths = buildSegmentLengths(points, closed);\n const totalLength = segLengths.reduce((a, b) => a + b, 0);\n\n if (totalLength === 0) {\n return { x: points[0].x, y: points[0].y, angle: 0 };\n }\n\n const targetLength = t * totalLength;\n\n // Find which segment the target length falls in\n let accumulated = 0;\n for (let i = 0; i < segLengths.length; i++) {\n const segLen = segLengths[i];\n if (accumulated + segLen >= targetLength || i === segLengths.length - 1) {\n // Progress within this segment\n const segProgress = segLen === 0 ? 0 : (targetLength - accumulated) / segLen;\n\n const p0 = points[i];\n const p1 = points[(i + 1) % points.length];\n\n const c0x = p0.x + (p0.out?.x ?? 0);\n const c0y = p0.y + (p0.out?.y ?? 0);\n const c1x = p1.x + (p1.in?.x ?? 0);\n const c1y = p1.y + (p1.in?.y ?? 0);\n\n return evalBezier(p0.x, p0.y, c0x, c0y, c1x, c1y, p1.x, p1.y, segProgress);\n }\n accumulated += segLen;\n }\n\n // Fallback (shouldn't reach here)\n const last = points[points.length - 1];\n return { x: last.x, y: last.y, angle: 0 };\n}\n","import type { Delta, FrameRange } from \"@a-company/atelier-types\";\nimport { lerp, clamp, hexToRgba, lerpRgba, rgbaToHex } from \"@a-company/atelier-math\";\nimport { resolveEasing } from \"./easing-resolver.js\";\nimport { isExpression, evaluateExpression, type ExpressionContext } from \"../expressions/expression-evaluator.js\";\n\n/**\n * Check if a frame is within a delta's range (inclusive).\n */\nexport function isFrameInRange(frame: number, range: FrameRange): boolean {\n return frame >= range[0] && frame <= range[1];\n}\n\n/**\n * Compute the progress (0-1) of a frame within a delta's range.\n */\nexport function computeProgress(frame: number, range: FrameRange): number {\n const [start, end] = range;\n if (start === end) return 1; // instantaneous\n return clamp((frame - start) / (end - start), 0, 1);\n}\n\n/**\n * Resolve a single delta's value at a given frame.\n * Returns undefined if the frame is outside the delta's range.\n * Returns the interpolated value if within range.\n *\n * If `from` or `to` is an expression object `{ expr: \"...\" }`,\n * it is evaluated with the current animation context before interpolation.\n */\nexport function resolveDeltaValue(delta: Delta, frame: number): unknown | undefined {\n if (!isFrameInRange(frame, delta.range)) {\n return undefined;\n }\n\n const progress = computeProgress(frame, delta.range);\n const easingFn = resolveEasing(delta.easing);\n const easedProgress = easingFn(progress);\n\n const exprCtx: ExpressionContext = {\n t: easedProgress,\n progress,\n frame,\n duration: delta.range[1] - delta.range[0],\n };\n\n const from = isExpression(delta.from)\n ? evaluateExpression(delta.from.expr, exprCtx)\n : delta.from;\n\n const to = isExpression(delta.to)\n ? evaluateExpression(delta.to.expr, exprCtx)\n : delta.to;\n\n return interpolateValue(from, to, easedProgress);\n}\n\n/**\n * Interpolate between two values based on eased progress.\n * Handles numbers, strings (pass-through at threshold), and nested objects.\n */\nexport function interpolateValue(from: unknown, to: unknown, t: number): unknown {\n // Number interpolation\n if (typeof from === \"number\" && typeof to === \"number\") {\n return lerp(from, to, t);\n }\n\n // Hex color interpolation\n if (typeof from === \"string\" && typeof to === \"string\") {\n if (from.startsWith(\"#\") && to.startsWith(\"#\")) {\n return rgbaToHex(lerpRgba(hexToRgba(from), hexToRgba(to), t));\n }\n // Non-color strings — snap at end\n return t >= 1 ? to : from;\n }\n\n // Boolean interpolation — snap at midpoint for frame-precise control\n if (typeof from === \"boolean\" && typeof to === \"boolean\") {\n return t >= 0.5 ? to : from;\n }\n\n // For unknown types, snap at end\n return t >= 1 ? to : from;\n}\n\n/**\n * Given multiple deltas for the SAME layer+property, find the active one\n * at a given frame and return its resolved value.\n *\n * If no delta is active at this frame, holds the `to` value of the most\n * recent completed delta (the one whose range ended most recently before\n * this frame). This prevents properties from reverting after animation ends.\n *\n * Assumes no overlaps (validated elsewhere).\n */\nexport function resolvePropertyAtFrame(\n deltas: Delta[],\n frame: number,\n): unknown | undefined {\n // Check for an active delta first\n for (const delta of deltas) {\n if (isFrameInRange(frame, delta.range)) {\n return resolveDeltaValue(delta, frame);\n }\n }\n\n // No active delta — hold the `to` value of the most recently completed delta\n let lastCompleted: Delta | undefined;\n for (const delta of deltas) {\n if (frame > delta.range[1]) {\n if (!lastCompleted || delta.range[1] > lastCompleted.range[1]) {\n lastCompleted = delta;\n }\n }\n }\n\n if (!lastCompleted) return undefined;\n\n // If the held `to` value is an expression, evaluate at t=1\n if (isExpression(lastCompleted.to)) {\n return evaluateExpression(lastCompleted.to.expr, {\n t: 1,\n progress: 1,\n frame,\n duration: lastCompleted.range[1] - lastCompleted.range[0],\n });\n }\n\n return lastCompleted.to;\n}\n","import type { Easing } from \"@a-company/atelier-types\";\nimport { linear, cubicBezier, easeIn, easeOut, easeInOut, step, spring } from \"@a-company/atelier-math\";\n\n/**\n * Converts an Easing type definition into an executable easing function.\n * Returns a function (t: number) => number where t is 0-1.\n */\nexport function resolveEasing(easing: Easing | undefined): (t: number) => number {\n if (!easing) return linear;\n\n // String presets\n if (typeof easing === \"string\") {\n switch (easing) {\n case \"ease-in\": return easeIn;\n case \"ease-out\": return easeOut;\n case \"ease-in-out\": return easeInOut;\n default: return linear;\n }\n }\n\n // Object easing definitions\n switch (easing.type) {\n case \"linear\":\n return linear;\n case \"cubic-bezier\":\n return cubicBezier(easing.x1, easing.y1, easing.x2, easing.y2);\n case \"spring\":\n return spring({\n mass: easing.mass,\n stiffness: easing.stiffness,\n damping: easing.damping,\n velocity: easing.velocity,\n });\n case \"step\":\n return step(easing.steps, easing.position);\n default:\n return linear;\n }\n}\n","/**\n * Safe recursive descent expression evaluator.\n * No eval(), no Function(), no code generation.\n *\n * Supports:\n * - Numbers: 42, 3.14, -1\n * - Operators: + - * / % **\n * - Parentheses: (expr)\n * - Math functions: sin, cos, tan, abs, min, max, floor, ceil, round, sqrt, pow, clamp, sign, log\n * - Constants: pi, tau, e\n * - Context variables: t, frame, duration, progress\n * - Comparison: <, >, <=, >=, ==, !=\n * - Ternary: condition ? trueExpr : falseExpr\n */\n\n/** Context variables available during expression evaluation */\nexport interface ExpressionContext {\n /** Eased progress 0–1 */\n t: number;\n /** Raw progress 0–1 (before easing) */\n progress: number;\n /** Current frame number */\n frame: number;\n /** Delta duration in frames */\n duration: number;\n}\n\n// ── Tokenizer ───────────────────────────────────────────────\n\ntype TokenType =\n | \"number\"\n | \"ident\"\n | \"op\"\n | \"lparen\"\n | \"rparen\"\n | \"comma\"\n | \"question\"\n | \"colon\"\n | \"compare\"\n | \"eof\";\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Numbers\n if ((ch >= \"0\" && ch <= \"9\") || ch === \".\") {\n let num = \"\";\n while (i < expr.length && ((expr[i] >= \"0\" && expr[i] <= \"9\") || expr[i] === \".\")) {\n num += expr[i++];\n }\n tokens.push({ type: \"number\", value: num });\n continue;\n }\n\n // Identifiers (variables, functions, constants)\n if ((ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\") || ch === \"_\") {\n let id = \"\";\n while (i < expr.length && ((expr[i] >= \"a\" && expr[i] <= \"z\") || (expr[i] >= \"A\" && expr[i] <= \"Z\") || (expr[i] >= \"0\" && expr[i] <= \"9\") || expr[i] === \"_\")) {\n id += expr[i++];\n }\n tokens.push({ type: \"ident\", value: id });\n continue;\n }\n\n // Comparison operators (must check before single-char ops)\n if (ch === \"<\" || ch === \">\" || ch === \"!\" || ch === \"=\") {\n if (i + 1 < expr.length && expr[i + 1] === \"=\") {\n tokens.push({ type: \"compare\", value: ch + \"=\" });\n i += 2;\n continue;\n }\n if (ch === \"<\" || ch === \">\") {\n tokens.push({ type: \"compare\", value: ch });\n i++;\n continue;\n }\n }\n\n // Power operator\n if (ch === \"*\" && i + 1 < expr.length && expr[i + 1] === \"*\") {\n tokens.push({ type: \"op\", value: \"**\" });\n i += 2;\n continue;\n }\n\n // Operators\n if (ch === \"+\" || ch === \"-\" || ch === \"*\" || ch === \"/\" || ch === \"%\") {\n tokens.push({ type: \"op\", value: ch });\n i++;\n continue;\n }\n\n // Grouping and function calls\n if (ch === \"(\") { tokens.push({ type: \"lparen\", value: \"(\" }); i++; continue; }\n if (ch === \")\") { tokens.push({ type: \"rparen\", value: \")\" }); i++; continue; }\n if (ch === \",\") { tokens.push({ type: \"comma\", value: \",\" }); i++; continue; }\n\n // Ternary\n if (ch === \"?\") { tokens.push({ type: \"question\", value: \"?\" }); i++; continue; }\n if (ch === \":\") { tokens.push({ type: \"colon\", value: \":\" }); i++; continue; }\n\n throw new Error(`Expression: unexpected character '${ch}' at position ${i}`);\n }\n\n tokens.push({ type: \"eof\", value: \"\" });\n return tokens;\n}\n\n// ── Parser + Evaluator ──────────────────────────────────────\n\nconst CONSTANTS: Record<string, number> = {\n pi: Math.PI,\n PI: Math.PI,\n tau: Math.PI * 2,\n TAU: Math.PI * 2,\n e: Math.E,\n E: Math.E,\n};\n\nconst FUNCTIONS: Record<string, (...args: number[]) => number> = {\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n abs: Math.abs,\n floor: Math.floor,\n ceil: Math.ceil,\n round: Math.round,\n sqrt: Math.sqrt,\n sign: Math.sign,\n log: Math.log,\n min: (...args) => Math.min(...args),\n max: (...args) => Math.max(...args),\n pow: (a, b) => Math.pow(a, b),\n clamp: (v, lo, hi) => Math.min(Math.max(v, lo), hi),\n};\n\nclass Parser {\n private tokens: Token[];\n private pos = 0;\n private ctx: ExpressionContext;\n\n constructor(tokens: Token[], ctx: ExpressionContext) {\n this.tokens = tokens;\n this.ctx = ctx;\n }\n\n private peek(): Token {\n return this.tokens[this.pos];\n }\n\n private consume(expectedType?: TokenType): Token {\n const tok = this.tokens[this.pos++];\n if (expectedType && tok.type !== expectedType) {\n throw new Error(`Expression: expected ${expectedType} but got ${tok.type} '${tok.value}'`);\n }\n return tok;\n }\n\n /** Entry: ternary (lowest precedence) */\n parse(): number {\n const result = this.parseTernary();\n if (this.peek().type !== \"eof\") {\n throw new Error(`Expression: unexpected token '${this.peek().value}'`);\n }\n return result;\n }\n\n /** ternary: comparison ? expr : expr */\n private parseTernary(): number {\n const condition = this.parseComparison();\n if (this.peek().type === \"question\") {\n this.consume(); // ?\n const trueVal = this.parseTernary();\n this.consume(\"colon\"); // :\n const falseVal = this.parseTernary();\n return condition ? trueVal : falseVal;\n }\n return condition;\n }\n\n /** comparison: additive (< | > | <= | >= | == | !=) additive */\n private parseComparison(): number {\n let left = this.parseAdditive();\n while (this.peek().type === \"compare\") {\n const op = this.consume().value;\n const right = this.parseAdditive();\n switch (op) {\n case \"<\": left = left < right ? 1 : 0; break;\n case \">\": left = left > right ? 1 : 0; break;\n case \"<=\": left = left <= right ? 1 : 0; break;\n case \">=\": left = left >= right ? 1 : 0; break;\n case \"==\": left = left === right ? 1 : 0; break;\n case \"!=\": left = left !== right ? 1 : 0; break;\n }\n }\n return left;\n }\n\n /** additive: multiplicative (('+' | '-') multiplicative)* */\n private parseAdditive(): number {\n let left = this.parseMultiplicative();\n while (this.peek().type === \"op\" && (this.peek().value === \"+\" || this.peek().value === \"-\")) {\n const op = this.consume().value;\n const right = this.parseMultiplicative();\n left = op === \"+\" ? left + right : left - right;\n }\n return left;\n }\n\n /** multiplicative: power (('*' | '/' | '%') power)* */\n private parseMultiplicative(): number {\n let left = this.parsePower();\n while (this.peek().type === \"op\" && (this.peek().value === \"*\" || this.peek().value === \"/\" || this.peek().value === \"%\")) {\n const op = this.consume().value;\n const right = this.parsePower();\n if (op === \"*\") left = left * right;\n else if (op === \"/\") left = right !== 0 ? left / right : 0;\n else left = left % right;\n }\n return left;\n }\n\n /** power: unary ('**' unary)* (right-associative) */\n private parsePower(): number {\n const base = this.parseUnary();\n if (this.peek().type === \"op\" && this.peek().value === \"**\") {\n this.consume();\n const exp = this.parsePower(); // right-associative\n return Math.pow(base, exp);\n }\n return base;\n }\n\n /** unary: ('-' | '+') unary | primary */\n private parseUnary(): number {\n if (this.peek().type === \"op\" && (this.peek().value === \"-\" || this.peek().value === \"+\")) {\n const op = this.consume().value;\n const val = this.parseUnary();\n return op === \"-\" ? -val : val;\n }\n return this.parsePrimary();\n }\n\n /** primary: number | ident | function(args) | '(' expr ')' */\n private parsePrimary(): number {\n const tok = this.peek();\n\n // Number literal\n if (tok.type === \"number\") {\n this.consume();\n return parseFloat(tok.value);\n }\n\n // Identifier: constant, context variable, or function\n if (tok.type === \"ident\") {\n this.consume();\n const name = tok.value;\n\n // Function call\n if (this.peek().type === \"lparen\") {\n this.consume(); // (\n const args: number[] = [];\n if (this.peek().type !== \"rparen\") {\n args.push(this.parseTernary());\n while (this.peek().type === \"comma\") {\n this.consume(); // ,\n args.push(this.parseTernary());\n }\n }\n this.consume(\"rparen\"); // )\n\n const fn = FUNCTIONS[name];\n if (!fn) throw new Error(`Expression: unknown function '${name}'`);\n return fn(...args);\n }\n\n // Constant\n if (name in CONSTANTS) return CONSTANTS[name];\n\n // Context variable\n if (name in this.ctx) return (this.ctx as unknown as Record<string, number>)[name];\n\n throw new Error(`Expression: unknown variable '${name}'`);\n }\n\n // Parenthesized expression\n if (tok.type === \"lparen\") {\n this.consume(); // (\n const val = this.parseTernary();\n this.consume(\"rparen\"); // )\n return val;\n }\n\n throw new Error(`Expression: unexpected token '${tok.value}'`);\n }\n}\n\n// ── Public API ──────────────────────────────────────────────\n\n/**\n * Check if a value is an expression object { expr: string }.\n */\nexport function isExpression(value: unknown): value is { expr: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"expr\" in value &&\n typeof (value as Record<string, unknown>).expr === \"string\"\n );\n}\n\n/**\n * Evaluate an expression string with the given context.\n * Returns a number. Throws on syntax errors or unknown identifiers.\n */\nexport function evaluateExpression(expr: string, ctx: ExpressionContext): number {\n const tokens = tokenize(expr);\n const parser = new Parser(tokens, ctx);\n return parser.parse();\n}\n","import type { AtelierDocument, Layer, Delta, AnimatableProperty } from \"@a-company/atelier-types\";\nimport { resolvePropertyAtFrame } from \"./delta-resolver.js\";\n\n/** A resolved layer at a specific frame — all animated properties computed */\nexport interface ResolvedLayer {\n id: string;\n /** Original layer definition */\n layer: Layer;\n /** Computed property overrides from active deltas */\n computedProperties: Partial<Record<AnimatableProperty, unknown>>;\n}\n\n/** The resolved state of an entire document at a specific frame */\nexport interface ResolvedFrame {\n /** Frame number that was resolved */\n frame: number;\n /** State name that was resolved */\n stateName: string;\n /** All layers with their computed properties */\n layers: ResolvedLayer[];\n}\n\n/**\n * Resolve all layers at a given frame within a named state.\n * This is the main entry point for frame resolution.\n * @param overrideDeltas - Optional pre-merged deltas (used for hierarchical state resolution)\n */\nexport function resolveFrame(\n doc: AtelierDocument,\n stateName: string,\n frame: number,\n overrideDeltas?: Delta[],\n): ResolvedFrame {\n const state = doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found in document \"${doc.name}\"`);\n }\n\n // Group deltas by layer+property\n const deltasByLayerProperty = groupDeltas(overrideDeltas ?? state.deltas);\n\n // Resolve each layer\n const resolvedLayers: ResolvedLayer[] = doc.layers.map((layer) => {\n const computedProperties: Partial<Record<AnimatableProperty, unknown>> = {};\n\n // Find all animated properties for this layer\n const layerDeltas = deltasByLayerProperty.get(layer.id);\n if (layerDeltas) {\n for (const [property, deltas] of layerDeltas) {\n const value = resolvePropertyAtFrame(deltas, frame);\n if (value !== undefined) {\n computedProperties[property as AnimatableProperty] = value;\n }\n }\n }\n\n return { id: layer.id, layer, computedProperties };\n });\n\n return { frame, stateName, layers: resolvedLayers };\n}\n\n/**\n * Group deltas by layer ID, then by property name.\n */\nfunction groupDeltas(\n deltas: Delta[],\n): Map<string, Map<string, Delta[]>> {\n const map = new Map<string, Map<string, Delta[]>>();\n\n for (const delta of deltas) {\n let layerMap = map.get(delta.layer);\n if (!layerMap) {\n layerMap = new Map();\n map.set(delta.layer, layerMap);\n }\n\n let propDeltas = layerMap.get(delta.property);\n if (!propDeltas) {\n propDeltas = [];\n layerMap.set(delta.property, propDeltas);\n }\n\n propDeltas.push(delta);\n }\n\n return map;\n}\n","import type { Delta, FrameRange } from \"@a-company/atelier-types\";\n\nexport interface OverlapError {\n layerId: string;\n property: string;\n existingRange: FrameRange;\n newRange: FrameRange;\n message: string;\n}\n\n/**\n * Check if two frame ranges overlap.\n */\nexport function rangesOverlap(a: FrameRange, b: FrameRange): boolean {\n return a[0] <= b[1] && b[0] <= a[1];\n}\n\n/**\n * Validate that a new delta doesn't overlap with existing deltas\n * on the same layer+property.\n */\nexport function validateNoOverlap(\n existing: Delta[],\n newDelta: Delta,\n): OverlapError | null {\n for (const delta of existing) {\n if (\n delta.layer === newDelta.layer &&\n delta.property === newDelta.property &&\n rangesOverlap(delta.range, newDelta.range)\n ) {\n return {\n layerId: newDelta.layer,\n property: newDelta.property,\n existingRange: delta.range,\n newRange: newDelta.range,\n message: `Overlapping delta on layer \"${newDelta.layer}\" property \"${newDelta.property}\": ` +\n `existing [${delta.range[0]}-${delta.range[1]}] overlaps with new [${newDelta.range[0]}-${newDelta.range[1]}]`,\n };\n }\n }\n return null;\n}\n\n/**\n * Validate all deltas in a state have no overlaps.\n * Returns all overlap errors found.\n */\nexport function validateAllDeltas(deltas: Delta[]): OverlapError[] {\n const errors: OverlapError[] = [];\n\n for (let i = 0; i < deltas.length; i++) {\n for (let j = i + 1; j < deltas.length; j++) {\n const a = deltas[i];\n const b = deltas[j];\n\n if (\n a.layer === b.layer &&\n a.property === b.property &&\n rangesOverlap(a.range, b.range)\n ) {\n errors.push({\n layerId: a.layer,\n property: a.property,\n existingRange: a.range,\n newRange: b.range,\n message: `Overlapping deltas on layer \"${a.layer}\" property \"${a.property}\": ` +\n `[${a.range[0]}-${a.range[1]}] overlaps with [${b.range[0]}-${b.range[1]}]`,\n });\n }\n }\n }\n\n return errors;\n}\n","import type {\n AtelierDocument, Canvas, Layer, State, Delta, Preset,\n Variable, Asset,\n} from \"@a-company/atelier-types\";\nimport { validateNoOverlap } from \"../validation/overlap-validator.js\";\n\n/**\n * Fluent builder for constructing AtelierDocument objects.\n * Validates constraints (like no-overlap) as you build.\n */\nexport class DocumentBuilder {\n private doc: AtelierDocument;\n\n constructor(name: string, canvas: Canvas) {\n this.doc = {\n version: \"1.0\",\n name,\n canvas,\n layers: [],\n states: {},\n };\n }\n\n /** Set document description */\n description(desc: string): this {\n this.doc.description = desc;\n return this;\n }\n\n /** Add tags to the document */\n tags(...tags: string[]): this {\n this.doc.tags = [...(this.doc.tags ?? []), ...tags];\n return this;\n }\n\n /** Add a variable definition */\n variable(id: string, variable: Variable): this {\n if (!this.doc.variables) this.doc.variables = {};\n this.doc.variables[id] = variable;\n return this;\n }\n\n /** Add an asset reference */\n asset(id: string, asset: Asset): this {\n if (!this.doc.assets) this.doc.assets = {};\n this.doc.assets[id] = asset;\n return this;\n }\n\n /** Add a preset */\n preset(id: string, preset: Preset): this {\n if (!this.doc.presets) this.doc.presets = {};\n this.doc.presets[id] = preset;\n return this;\n }\n\n /** Add a layer */\n addLayer(layer: Layer): this {\n // Check for duplicate IDs\n if (this.doc.layers.some(l => l.id === layer.id)) {\n throw new Error(`Layer with id \"${layer.id}\" already exists`);\n }\n this.doc.layers.push(layer);\n return this;\n }\n\n /** Add a state */\n addState(name: string, state: Omit<State, \"deltas\"> & { deltas?: Delta[] }): this {\n if (this.doc.states[name]) {\n throw new Error(`State \"${name}\" already exists`);\n }\n this.doc.states[name] = { ...state, deltas: state.deltas ?? [] };\n return this;\n }\n\n /** Add a delta to an existing state, with overlap validation */\n addDelta(stateName: string, delta: Delta): this {\n const state = this.doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n // Verify the layer exists\n if (!this.doc.layers.some(l => l.id === delta.layer)) {\n throw new Error(`Layer \"${delta.layer}\" not found — add the layer before adding deltas`);\n }\n\n // Check for overlaps\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n throw new Error(overlap.message);\n }\n\n state.deltas.push(delta);\n return this;\n }\n\n /** Build and return the final document */\n build(): AtelierDocument {\n return JSON.parse(JSON.stringify(this.doc)) as AtelierDocument;\n }\n}\n\n/**\n * Create a new DocumentBuilder.\n * Convenience function for starting a builder chain.\n */\nexport function createDocument(name: string, canvas: Canvas): DocumentBuilder {\n return new DocumentBuilder(name, canvas);\n}\n","import type { UnitValue } from \"@a-company/atelier-types\";\n\n/**\n * Check if a UnitValue is a percentage string.\n */\nexport function isPercentage(value: UnitValue): value is `${number}%` {\n return typeof value === \"string\" && value.endsWith(\"%\");\n}\n\n/**\n * Parse a percentage string to its numeric value (0-100).\n */\nexport function parsePercentage(value: `${number}%`): number {\n return parseFloat(value);\n}\n\n/**\n * Resolve a UnitValue to pixels given a reference dimension.\n * Pixel values pass through unchanged.\n * Percentage values are computed relative to the reference.\n */\nexport function resolveUnit(value: UnitValue, reference: number): number {\n if (isPercentage(value)) {\n return (parsePercentage(value) / 100) * reference;\n }\n return value;\n}\n","import type { Preset, Delta, FrameRange } from \"@a-company/atelier-types\";\n\n/**\n * Expand a preset into concrete deltas for a specific layer and start frame.\n *\n * @param preset - The preset to expand\n * @param layerId - Target layer ID\n * @param startFrame - Frame to start the preset from\n * @param duration - Total duration to map preset offsets into\n */\nexport function expandPreset(\n preset: Preset,\n layerId: string,\n startFrame: number,\n duration: number,\n): Delta[] {\n return preset.deltas.map((pd, index) => {\n let range: FrameRange;\n if (pd.offset) {\n range = [startFrame + pd.offset[0], startFrame + pd.offset[1]];\n } else {\n range = [startFrame, startFrame + duration];\n }\n\n return {\n id: `preset-${layerId}-${index}`,\n layer: layerId,\n property: pd.property,\n range,\n from: pd.from,\n to: pd.to,\n easing: pd.easing,\n };\n });\n}\n","import type { AtelierDocument, Easing, State, Delta } from \"@a-company/atelier-types\";\nimport { resolveFrame, type ResolvedFrame } from \"../resolver/frame-resolver.js\";\nimport { resolveEasing } from \"../resolver/easing-resolver.js\";\n\nexport interface StateTransition {\n from: string;\n to: string;\n at: number; // frame at which transition occurs\n}\n\nexport interface PlaybackState {\n stateName: string;\n frame: number;\n resolved: ResolvedFrame;\n isComplete: boolean;\n}\n\nexport interface ActiveTransition {\n fromState: string;\n toState: string;\n duration: number;\n easingFn: (t: number) => number;\n transitionFrame: number; // how many frames into the transition\n}\n\nexport class StateMachine {\n private currentState: string;\n private currentFrame = 0;\n private transitions: StateTransition[] = [];\n private activeTransition: ActiveTransition | null = null;\n\n constructor(\n private doc: AtelierDocument,\n initialState?: string,\n ) {\n // Default to first state\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) throw new Error(\"Document has no states\");\n this.currentState = initialState ?? stateNames[0];\n if (!doc.states[this.currentState]) {\n throw new Error(`State \"${this.currentState}\" not found`);\n }\n }\n\n /** Get current state name */\n get state(): string {\n return this.currentState;\n }\n\n /** Get current frame */\n get frame(): number {\n return this.currentFrame;\n }\n\n /** Get all state names */\n get stateNames(): string[] {\n return Object.keys(this.doc.states);\n }\n\n /** Get current state duration */\n get duration(): number {\n return this.doc.states[this.currentState].duration;\n }\n\n /** Check if current state playback is complete */\n get isComplete(): boolean {\n return this.currentFrame >= this.duration - 1;\n }\n\n /** Check if currently in a transition blend */\n isTransitioning(): boolean {\n return this.activeTransition !== null;\n }\n\n /** Get transition progress (0–1) with easing applied, or null if not transitioning */\n getTransitionProgress(): number | null {\n if (!this.activeTransition) return null;\n const { transitionFrame, duration, easingFn } = this.activeTransition;\n const rawProgress = Math.min(transitionFrame / duration, 1);\n return easingFn(rawProgress);\n }\n\n // ── Hierarchical State Support ────────────────────────────\n\n /**\n * Resolve the ancestor chain for a state (root → … → parent → self).\n * Throws on circular parent references.\n */\n resolveAncestorChain(stateName: string): string[] {\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = stateName;\n\n while (current) {\n if (visited.has(current)) {\n throw new Error(`Circular parent reference detected: \"${current}\" already in chain [${chain.join(\" → \")}]`);\n }\n visited.add(current);\n chain.unshift(current); // prepend so root is first\n const stateObj: State | undefined = this.doc.states[current];\n if (!stateObj) {\n throw new Error(`Parent state \"${current}\" not found`);\n }\n current = stateObj.parent;\n }\n\n return chain;\n }\n\n /**\n * Collect merged deltas from ancestor chain.\n * Child overrides parent deltas for the same layer+property combination.\n * Deltas for different layer+property pairs are accumulated from all ancestors.\n */\n collectDeltas(stateName: string): Delta[] {\n const chain = this.resolveAncestorChain(stateName);\n // Walk root → child. Later entries override earlier for same layer+property.\n const deltaMap = new Map<string, Delta[]>();\n\n for (const ancestorName of chain) {\n const state = this.doc.states[ancestorName];\n // Group this state's deltas by layer+property\n const stateGroups = new Map<string, Delta[]>();\n for (const delta of state.deltas) {\n const key = `${delta.layer}:${delta.property}`;\n if (!stateGroups.has(key)) stateGroups.set(key, []);\n stateGroups.get(key)!.push(delta);\n }\n // Child replaces parent for same key\n for (const [key, deltas] of stateGroups) {\n deltaMap.set(key, deltas);\n }\n }\n\n // Flatten all deltas\n const result: Delta[] = [];\n for (const deltas of deltaMap.values()) {\n result.push(...deltas);\n }\n return result;\n }\n\n // ── Playback ──────────────────────────────────────────────\n\n /** Advance to next frame, returns resolved frame */\n tick(): PlaybackState {\n // Handle active transition\n if (this.activeTransition) {\n this.activeTransition.transitionFrame++;\n if (this.activeTransition.transitionFrame >= this.activeTransition.duration) {\n // Transition complete\n this.activeTransition = null;\n }\n }\n\n const resolved = this.resolveCurrentFrame();\n const result: PlaybackState = {\n stateName: this.currentState,\n frame: this.currentFrame,\n resolved,\n isComplete: this.isComplete,\n };\n if (this.currentFrame < this.duration - 1) {\n this.currentFrame++;\n }\n return result;\n }\n\n /** Resolve the current frame, blending if in transition */\n private resolveCurrentFrame(): ResolvedFrame {\n if (this.activeTransition) {\n const progress = this.getTransitionProgress()!;\n const fromResolved = resolveFrame(\n this.doc, this.activeTransition.fromState, this.currentFrame,\n this.collectDeltas(this.activeTransition.fromState),\n );\n const toResolved = resolveFrame(\n this.doc, this.activeTransition.toState, this.currentFrame,\n this.collectDeltas(this.activeTransition.toState),\n );\n return blendResolvedFrames(fromResolved, toResolved, progress);\n }\n\n // Check if current state has a parent — use merged deltas\n const state = this.doc.states[this.currentState];\n if (state.parent) {\n const mergedDeltas = this.collectDeltas(this.currentState);\n return resolveFrame(this.doc, this.currentState, this.currentFrame, mergedDeltas);\n }\n\n return resolveFrame(this.doc, this.currentState, this.currentFrame);\n }\n\n /** Transition to a different state (instant or blended) */\n transition(stateName: string, startFrame = 0): void {\n if (!this.doc.states[stateName]) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n const fromState = this.currentState;\n const currentStateObj = this.doc.states[fromState];\n const transConfig = currentStateObj.transitions?.[stateName];\n\n this.transitions.push({\n from: fromState,\n to: stateName,\n at: this.currentFrame,\n });\n\n if (transConfig && transConfig.duration > 0) {\n // Start a smooth transition\n this.activeTransition = {\n fromState,\n toState: stateName,\n duration: transConfig.duration,\n easingFn: resolveEasing(transConfig.easing),\n transitionFrame: 0,\n };\n }\n\n this.currentState = stateName;\n this.currentFrame = startFrame;\n }\n\n /**\n * Start a smooth transition to target state with explicit duration/easing.\n * This ignores any transitions config on the state.\n */\n transitionTo(targetState: string, duration: number, easing?: Easing): void {\n if (!this.doc.states[targetState]) {\n throw new Error(`State \"${targetState}\" not found`);\n }\n\n const fromState = this.currentState;\n this.transitions.push({\n from: fromState,\n to: targetState,\n at: this.currentFrame,\n });\n\n this.activeTransition = {\n fromState,\n toState: targetState,\n duration,\n easingFn: resolveEasing(easing),\n transitionFrame: 0,\n };\n\n this.currentState = targetState;\n this.currentFrame = 0;\n }\n\n /** Seek to a specific frame in current state */\n seek(frame: number): void {\n this.currentFrame = Math.max(0, Math.min(frame, this.duration - 1));\n }\n\n /** Reset to initial state */\n reset(stateName?: string): void {\n if (stateName) {\n if (!this.doc.states[stateName]) throw new Error(`State \"${stateName}\" not found`);\n this.currentState = stateName;\n }\n this.currentFrame = 0;\n this.activeTransition = null;\n }\n\n /** Get transition history */\n get history(): ReadonlyArray<StateTransition> {\n return this.transitions;\n }\n\n /** Resolve a specific frame without advancing */\n resolveAt(stateName: string, frame: number): ResolvedFrame {\n if (!this.doc.states[stateName]) throw new Error(`State \"${stateName}\" not found`);\n const state = this.doc.states[stateName];\n if (state.parent) {\n return resolveFrame(this.doc, stateName, frame, this.collectDeltas(stateName));\n }\n return resolveFrame(this.doc, stateName, frame);\n }\n\n /** Play through entire current state, calling callback on each frame */\n playThrough(onFrame: (state: PlaybackState) => void): void {\n this.currentFrame = 0;\n while (!this.isComplete) {\n onFrame(this.tick());\n }\n onFrame(this.tick()); // last frame\n }\n}\n\n// ── Frame Blending ────────────────────────────────────────────\n\nimport type { ResolvedLayer } from \"../resolver/frame-resolver.js\";\nimport type { AnimatableProperty } from \"@a-company/atelier-types\";\nimport { interpolateValue } from \"../resolver/delta-resolver.js\";\n\n/**\n * Blend two resolved frames together for smooth state transitions.\n * Numeric properties are lerped, colors are color-lerped, discrete values snap at t >= 0.5.\n */\nexport function blendResolvedFrames(\n frameA: ResolvedFrame,\n frameB: ResolvedFrame,\n t: number,\n): ResolvedFrame {\n // Build layer maps\n const mapA = new Map<string, ResolvedLayer>();\n const mapB = new Map<string, ResolvedLayer>();\n for (const l of frameA.layers) mapA.set(l.id, l);\n for (const l of frameB.layers) mapB.set(l.id, l);\n\n // Get all unique layer IDs\n const allIds = new Set([...mapA.keys(), ...mapB.keys()]);\n const blendedLayers: ResolvedLayer[] = [];\n\n for (const id of allIds) {\n const layerA = mapA.get(id);\n const layerB = mapB.get(id);\n\n if (layerA && layerB) {\n // Both exist — blend computed properties\n blendedLayers.push(blendLayers(layerA, layerB, t));\n } else if (layerA && !layerB) {\n // Only in A — fade out (set opacity toward 0)\n blendedLayers.push(fadeLayer(layerA, 1 - t));\n } else if (!layerA && layerB) {\n // Only in B — fade in (set opacity from 0)\n blendedLayers.push(fadeLayer(layerB, t));\n }\n }\n\n return {\n frame: frameB.frame,\n stateName: frameB.stateName,\n layers: blendedLayers,\n };\n}\n\nfunction blendLayers(a: ResolvedLayer, b: ResolvedLayer, t: number): ResolvedLayer {\n const allProps = new Set([\n ...Object.keys(a.computedProperties),\n ...Object.keys(b.computedProperties),\n ]);\n\n const blended: Partial<Record<AnimatableProperty, unknown>> = {};\n\n for (const prop of allProps) {\n const valA = a.computedProperties[prop as AnimatableProperty];\n const valB = b.computedProperties[prop as AnimatableProperty];\n\n if (valA !== undefined && valB !== undefined) {\n blended[prop as AnimatableProperty] = interpolateValue(valA, valB, t);\n } else if (valA !== undefined) {\n blended[prop as AnimatableProperty] = valA;\n } else {\n blended[prop as AnimatableProperty] = valB;\n }\n }\n\n return {\n id: a.id,\n layer: a.layer,\n computedProperties: blended,\n };\n}\n\nfunction fadeLayer(layer: ResolvedLayer, opacity: number): ResolvedLayer {\n const cp = { ...layer.computedProperties };\n const existingOpacity = (cp.opacity as number) ?? 1;\n cp.opacity = existingOpacity * opacity;\n return {\n id: layer.id,\n layer: layer.layer,\n computedProperties: cp,\n };\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\n\nexport interface TemplateBindings {\n [variableName: string]: unknown;\n}\n\nexport interface TemplateError {\n variable: string;\n message: string;\n}\n\nexport type TemplateResult =\n | {\n success: true;\n document: AtelierDocument;\n }\n | {\n success: false;\n errors: TemplateError[];\n };\n\n/**\n * Instantiate a template document by substituting variable values.\n * Walks the document tree, replacing {{variableName}} patterns with bound values.\n */\nexport function instantiateTemplate(\n template: AtelierDocument,\n bindings: TemplateBindings,\n): TemplateResult {\n // 1. Validate all required variables have bindings\n const errors: TemplateError[] = [];\n const variables = template.variables ?? {};\n\n for (const [name, variable] of Object.entries(variables)) {\n if (bindings[name] === undefined && variable.default === undefined) {\n errors.push({ variable: name, message: `Required variable \"${name}\" not provided` });\n }\n }\n\n // Check for unknown bindings\n for (const name of Object.keys(bindings)) {\n if (!variables[name]) {\n errors.push({ variable: name, message: `Unknown variable \"${name}\"` });\n }\n }\n\n if (errors.length > 0) return { success: false, errors };\n\n // 2. Merge bindings with defaults\n const resolved: Record<string, unknown> = {};\n for (const [name, variable] of Object.entries(variables)) {\n resolved[name] = bindings[name] ?? variable.default;\n }\n\n // 3. Deep clone and substitute\n const doc = JSON.parse(JSON.stringify(template)) as AtelierDocument;\n substituteInObject(doc as unknown as Record<string, unknown>, resolved);\n\n // 4. Remove variables section (no longer a template)\n delete doc.variables;\n\n return { success: true, document: doc };\n}\n\n/**\n * Recursively substitute {{variableName}} patterns in string values.\n */\nfunction substituteInObject(obj: Record<string, unknown>, bindings: Record<string, unknown>): void {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (typeof value === \"string\") {\n obj[key] = substituteString(value, bindings);\n } else if (Array.isArray(value)) {\n substituteInArray(value, bindings);\n } else if (value !== null && typeof value === \"object\") {\n substituteInObject(value as Record<string, unknown>, bindings);\n }\n }\n}\n\nfunction substituteInArray(arr: unknown[], bindings: Record<string, unknown>): void {\n for (let i = 0; i < arr.length; i++) {\n const value = arr[i];\n if (typeof value === \"string\") {\n arr[i] = substituteString(value, bindings);\n } else if (Array.isArray(value)) {\n substituteInArray(value, bindings);\n } else if (value !== null && typeof value === \"object\") {\n substituteInObject(value as Record<string, unknown>, bindings);\n }\n }\n}\n\n/**\n * Replace {{variableName}} in a string with the bound value.\n * If the entire string is a single {{var}}, return the raw value (preserving type).\n * Otherwise, interpolate into the string.\n */\nfunction substituteString(str: string, bindings: Record<string, unknown>): unknown {\n // Exact match: entire string is {{varName}} -> return raw value\n const exactMatch = str.match(/^\\{\\{(\\w+)\\}\\}$/);\n if (exactMatch) {\n const name = exactMatch[1];\n return name in bindings ? bindings[name] : str;\n }\n\n // Partial match: replace all {{varName}} occurrences with string values\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name: string) => {\n return name in bindings ? String(bindings[name]) : `{{${name}}}`;\n });\n}\n\n/**\n * List all variables used in a document (scan for {{variableName}} patterns).\n */\nexport function findTemplateVariables(doc: AtelierDocument): string[] {\n const vars = new Set<string>();\n scanForVariables(doc, vars);\n return Array.from(vars);\n}\n\nfunction scanForVariables(value: unknown, vars: Set<string>): void {\n if (typeof value === \"string\") {\n const matches = value.matchAll(/\\{\\{(\\w+)\\}\\}/g);\n for (const match of matches) {\n vars.add(match[1]);\n }\n } else if (Array.isArray(value)) {\n for (const item of value) scanForVariables(item, vars);\n } else if (value !== null && typeof value === \"object\") {\n for (const v of Object.values(value as Record<string, unknown>)) {\n scanForVariables(v, vars);\n }\n }\n}\n","import type { Audio } from \"@a-company/atelier-types\";\n\n/** Audio playback state at a given frame */\nexport interface AudioPlaybackState {\n /** Whether audio should be playing at this frame */\n shouldPlay: boolean;\n /** Current position in the audio track (seconds) */\n currentTime: number;\n /** Effective volume (0–1) */\n volume: number;\n}\n\n/**\n * Convert a frame number to time in seconds.\n */\nexport function frameToTime(frame: number, fps: number): number {\n return frame / fps;\n}\n\n/**\n * Convert time in seconds to a frame number (floored).\n */\nexport function timeToFrame(time: number, fps: number): number {\n return Math.floor(time * fps);\n}\n\n/**\n * Compute the audio playback state for a given frame.\n *\n * @param audio - Audio configuration from a state\n * @param frame - Current frame number within the state\n * @param fps - Frames per second from canvas config\n * @param stateDuration - Total state duration in frames\n * @returns AudioPlaybackState with shouldPlay, currentTime, and volume\n */\nexport function computeAudioState(\n audio: Audio,\n frame: number,\n fps: number,\n stateDuration: number,\n): AudioPlaybackState {\n const startFrame = audio.startFrame ?? 0;\n const offset = audio.offset ?? 0;\n const volume = audio.volume ?? 1;\n const loop = audio.loop ?? false;\n\n // Before audio starts\n if (frame < startFrame) {\n return { shouldPlay: false, currentTime: 0, volume };\n }\n\n // Time elapsed since audio started\n const elapsedFrames = frame - startFrame;\n const elapsedTime = frameToTime(elapsedFrames, fps);\n\n // Total available playback time (from startFrame to end of state)\n const availableFrames = stateDuration - startFrame;\n const availableTime = frameToTime(availableFrames, fps);\n\n if (!loop) {\n // Non-looping: audio plays from offset, stops at end of state\n const currentTime = offset + elapsedTime;\n return {\n shouldPlay: frame < stateDuration,\n currentTime,\n volume,\n };\n }\n\n // Looping: wrap elapsed time around available duration\n // The audio segment length is the available time\n const segmentDuration = availableTime;\n if (segmentDuration <= 0) {\n return { shouldPlay: false, currentTime: 0, volume };\n }\n\n const wrappedTime = elapsedTime % segmentDuration;\n const currentTime = offset + wrappedTime;\n\n return {\n shouldPlay: frame < stateDuration,\n currentTime,\n volume,\n };\n}\n\n/**\n * Compute audio cue points — frames where audio events occur.\n *\n * @param audio - Audio configuration\n * @param stateDuration - Total state duration in frames\n * @returns Array of { frame, event } describing audio events\n */\nexport function computeAudioCues(\n audio: Audio,\n stateDuration: number,\n): Array<{ frame: number; event: \"start\" | \"end\" | \"loop\" }> {\n const startFrame = audio.startFrame ?? 0;\n const loop = audio.loop ?? false;\n const cues: Array<{ frame: number; event: \"start\" | \"end\" | \"loop\" }> = [];\n\n if (startFrame < stateDuration) {\n cues.push({ frame: startFrame, event: \"start\" });\n }\n\n if (loop) {\n // In loop mode, audio restarts each full cycle\n const availableFrames = stateDuration - startFrame;\n if (availableFrames > 0) {\n // Loop points at each full cycle\n for (let i = 1; startFrame + i * availableFrames < stateDuration; i++) {\n cues.push({ frame: startFrame + i * availableFrames, event: \"loop\" });\n }\n }\n }\n\n // Audio ends when state ends\n if (stateDuration > startFrame) {\n cues.push({ frame: stateDuration - 1, event: \"end\" });\n }\n\n return cues;\n}\n","// @a-company/atelier-mcp — Preset management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Preset, PresetDelta } from \"@a-company/atelier-types\";\nimport { AnimatablePropertySchema, EasingSchema } from \"@a-company/atelier-schema\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n// Canonical source: @a-company/atelier-schema — single source of truth for AnimatableProperty\nconst AnimatablePropertyEnum = AnimatablePropertySchema;\nconst EasingInputSchema = EasingSchema;\n\nconst PresetDeltaSchema = z.object({\n property: AnimatablePropertyEnum.describe(\"Animatable property\"),\n offset: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional().describe(\"Relative frame offset [start, end]\"),\n from: z.unknown().describe(\"Starting value\"),\n to: z.unknown().describe(\"Ending value\"),\n easing: EasingInputSchema.optional().describe(\"Easing function\"),\n});\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_define_preset ───────────────────────────────────\n server.tool(\n \"atelier_define_preset\",\n \"Define a reusable animation preset on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n presetName: z.string().describe(\"Preset name\"),\n description: z.string().optional().describe(\"Preset description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n deltas: z.array(PresetDeltaSchema).min(1).describe(\"Array of preset delta definitions\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, presetName, description, tags, deltas }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.presets) doc.presets = {};\n\n const preset: Preset = {\n deltas: deltas as unknown as PresetDelta[],\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n doc.presets[presetName] = preset;\n\n return ok({ presetName, deltaCount: deltas.length });\n },\n );\n\n // ── atelier_list_presets ────────────────────────────────────\n server.tool(\n \"atelier_list_presets\",\n \"List all presets defined on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.presets || Object.keys(doc.presets).length === 0) {\n return ok({ presets: [], count: 0 });\n }\n\n const presets = Object.entries(doc.presets).map(([name, preset]) => ({\n name,\n description: preset.description,\n tags: preset.tags,\n deltaCount: preset.deltas.length,\n properties: preset.deltas.map(d => d.property),\n }));\n\n return ok({ presets, count: presets.length });\n },\n );\n}\n","// @a-company/atelier-mcp — Validation and preview tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument } from \"@a-company/atelier-schema\";\nimport { validateAllDeltas, resolveFrame } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_validate ────────────────────────────────────────\n server.tool(\n \"atelier_validate\",\n \"Validate an Atelier document for schema correctness and delta overlaps\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Schema validation\n const schemaResult = validateDocument(doc);\n const schemaErrors = schemaResult.success ? [] : schemaResult.errors;\n\n // Overlap validation per state\n const overlapErrors: Array<{ state: string; message: string }> = [];\n for (const [stateName, state] of Object.entries(doc.states)) {\n const overlaps = validateAllDeltas(state.deltas);\n for (const overlap of overlaps) {\n overlapErrors.push({ state: stateName, message: overlap.message });\n }\n }\n\n const valid = schemaErrors.length === 0 && overlapErrors.length === 0;\n\n return ok({\n valid,\n schemaErrors,\n overlapErrors,\n summary: valid\n ? \"Document is valid\"\n : `Found ${schemaErrors.length} schema error(s) and ${overlapErrors.length} overlap error(s)`,\n });\n },\n );\n\n // ── atelier_preview ─────────────────────────────────────────\n server.tool(\n \"atelier_preview\",\n \"Preview the resolved state of all layers at a specific frame\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to preview\"),\n frame: z.number().int().min(0).describe(\"Frame number to resolve\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n try {\n const resolved = resolveFrame(doc, stateName, frame);\n\n const layers = resolved.layers.map(rl => ({\n id: rl.id,\n visualType: rl.layer.visual.type,\n baseFrame: rl.layer.frame,\n baseBounds: rl.layer.bounds,\n baseOpacity: rl.layer.opacity,\n baseRotation: rl.layer.rotation,\n computedProperties: rl.computedProperties,\n }));\n\n return ok({\n stateName: resolved.stateName,\n frame: resolved.frame,\n duration: doc.states[stateName].duration,\n layers,\n });\n } catch (e) {\n return err(`Preview failed: ${(e as Error).message}`);\n }\n },\n );\n}\n","// @a-company/atelier-mcp — Template variable tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { instantiateTemplate, findTemplateVariables } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_instantiate_template ──────────────────────────────\n server.tool(\n \"atelier_instantiate_template\",\n \"Instantiate a template document with variable bindings. Creates a new document in the store.\",\n {\n id: z.string().describe(\"Template document ID\"),\n bindings: z.record(z.unknown()).describe(\"Variable bindings: { variableName: value }\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, bindings }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const templateResult = instantiateTemplate(doc, bindings);\n\n if (!templateResult.success) {\n return err(`Template errors: ${templateResult.errors.map(e => `${e.variable}: ${e.message}`).join(\"; \")}`);\n }\n\n const newId = store.create(templateResult.document);\n return ok({\n id: newId,\n name: templateResult.document.name,\n message: \"Template instantiated successfully\",\n });\n },\n );\n\n // ── atelier_find_variables ────────────────────────────────────\n server.tool(\n \"atelier_find_variables\",\n \"Scan a document for {{variableName}} patterns. Returns the list of variable references found.\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const variables = findTemplateVariables(doc);\n const declared = doc.variables ? Object.keys(doc.variables) : [];\n\n return ok({\n variables,\n declared,\n undeclared: variables.filter(v => !declared.includes(v)),\n unused: declared.filter(d => !variables.includes(d)),\n });\n },\n );\n}\n","// @a-company/atelier-mcp — Layer effect tools (blend mode, shadow, motion path, clip path, visual editing)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type {\n AtelierDocument,\n ShapeVisual,\n TextVisual,\n ImageVisual,\n} from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_blend_mode ────────────────────────────────\n server.tool(\n \"atelier_set_blend_mode\",\n \"Set or clear the blend mode on a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n blendMode: z.enum([\n \"normal\", \"multiply\", \"screen\", \"overlay\", \"darken\", \"lighten\",\n \"color-dodge\", \"color-burn\", \"hard-light\", \"soft-light\",\n \"difference\", \"exclusion\", \"hue\", \"saturation\", \"color\", \"luminosity\",\n ]).nullable().describe(\"Blend mode to set, or null to clear\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, blendMode }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (blendMode === null) {\n delete layer.blendMode;\n return ok({ layerId, blendMode: null, cleared: true });\n }\n\n layer.blendMode = blendMode;\n return ok({ layerId, blendMode });\n },\n );\n\n // ── atelier_set_shadow ────────────────────────────────────\n server.tool(\n \"atelier_set_shadow\",\n \"Set or remove a drop shadow on a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n shadow: z.object({\n color: z.unknown().describe(\"Shadow color (hex string or RGBA/HSLA object)\"),\n blur: z.number().min(0).describe(\"Blur radius in pixels\"),\n offsetX: z.number().optional().describe(\"Horizontal offset in pixels\"),\n offsetY: z.number().optional().describe(\"Vertical offset in pixels\"),\n }).nullable().describe(\"Shadow definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, shadow }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (shadow === null) {\n delete layer.shadow;\n return ok({ layerId, shadow: null, removed: true });\n }\n\n layer.shadow = shadow as unknown as NonNullable<typeof layer.shadow>;\n return ok({ layerId, hasShadow: true });\n },\n );\n\n // ── atelier_set_tint ─────────────────────────────────────\n server.tool(\n \"atelier_set_tint\",\n \"Set or remove a color tint on a layer (works on any visual type)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n tint: z.object({\n color: z.string().describe(\"Tint color (hex string)\"),\n amount: z.number().min(0).max(1).describe(\"Tint amount (0 = none, 1 = full)\"),\n }).nullable().describe(\"Tint definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, tint }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (tint === null) {\n delete layer.tint;\n return ok({ layerId, tint: null, removed: true });\n }\n\n layer.tint = tint;\n return ok({ layerId, hasTint: true });\n },\n );\n\n // ── atelier_set_motion_path ───────────────────────────────\n server.tool(\n \"atelier_set_motion_path\",\n \"Set or remove a motion path on a layer for path-based position animation\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n motionPath: z.object({\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).min(2).describe(\"Path points (minimum 2)\"),\n closed: z.boolean().optional().describe(\"Whether the path is closed\"),\n autoRotate: z.boolean().optional().describe(\"Auto-rotate layer to follow path tangent\"),\n autoRotateOffset: z.number().optional().describe(\"Rotation offset in degrees when autoRotate is enabled\"),\n }).nullable().describe(\"Motion path definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, motionPath }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (motionPath === null) {\n delete layer.motionPath;\n return ok({ layerId, motionPath: null, removed: true });\n }\n\n layer.motionPath = motionPath as unknown as NonNullable<typeof layer.motionPath>;\n return ok({ layerId, pointCount: motionPath.points.length, closed: motionPath.closed ?? false });\n },\n );\n\n // ── atelier_set_clip_path ─────────────────────────────────\n server.tool(\n \"atelier_set_clip_path\",\n \"Set or remove a clip path on a layer to restrict rendering to within a shape\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n clipPath: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]).describe(\"Clip shape type\"),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional().describe(\"Corner radius (rect only)\"),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional().describe(\"Path points (path only)\"),\n closed: z.boolean().optional().describe(\"Whether path is closed (path only)\"),\n }).nullable().describe(\"Clip path shape, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, clipPath }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (clipPath === null) {\n delete layer.clipPath;\n return ok({ layerId, clipPath: null, removed: true });\n }\n\n layer.clipPath = clipPath as unknown as NonNullable<typeof layer.clipPath>;\n return ok({ layerId, clipType: clipPath.type });\n },\n );\n\n // ── atelier_edit_visual ───────────────────────────────────\n server.tool(\n \"atelier_edit_visual\",\n \"Edit visual content of an existing layer (text content/style, image src/assetId, shape/fill/stroke)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n // Text fields\n content: z.string().optional().describe(\"New text content (text layers only)\"),\n style: z.record(z.unknown()).optional().describe(\"Partial style update — only provided keys are overwritten (text layers only)\"),\n // Image fields\n src: z.string().optional().describe(\"Image source URL (image layers only)\"),\n assetId: z.string().optional().describe(\"Asset ID reference (image layers only)\"),\n sourceRect: z.object({\n x: z.number(), y: z.number(), width: z.number().positive(), height: z.number().positive(),\n }).nullable().optional().describe(\"Source rectangle crop (image layers only). Null to remove.\"),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).nullable().optional().describe(\"Spritesheet config (image layers only). Null to remove.\"),\n frameIndex: z.number().int().min(0).optional().describe(\"Spritesheet frame index (image layers only)\"),\n // Shape fields\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional(),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional(),\n closed: z.boolean().optional(),\n }).optional().describe(\"New shape (shape layers only)\"),\n fill: z.record(z.unknown()).optional().describe(\"New fill definition (shape layers only)\"),\n stroke: z.record(z.unknown()).optional().describe(\"New stroke definition (shape layers only)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, content, style, src, assetId, sourceRect, spritesheet, frameIndex, shape, fill, stroke }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n const visualType = layer.visual.type;\n const updated: string[] = [];\n\n // Text fields\n if (content !== undefined) {\n if (visualType !== \"text\") return err(`Cannot set \"content\" on ${visualType} layer — text layers only`);\n (layer.visual as TextVisual).content = content;\n updated.push(\"content\");\n }\n if (style !== undefined) {\n if (visualType !== \"text\") return err(`Cannot set \"style\" on ${visualType} layer — text layers only`);\n const currentStyle = (layer.visual as TextVisual).style;\n Object.assign(currentStyle, style);\n updated.push(\"style\");\n }\n\n // Image fields\n if (src !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"src\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).src = src;\n updated.push(\"src\");\n }\n if (assetId !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"assetId\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).assetId = assetId;\n updated.push(\"assetId\");\n }\n if (sourceRect !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"sourceRect\" on ${visualType} layer — image layers only`);\n if (sourceRect === null) {\n delete (layer.visual as ImageVisual).sourceRect;\n updated.push(\"sourceRect (removed)\");\n } else {\n (layer.visual as ImageVisual).sourceRect = sourceRect;\n updated.push(\"sourceRect\");\n }\n }\n if (spritesheet !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"spritesheet\" on ${visualType} layer — image layers only`);\n if (spritesheet === null) {\n delete (layer.visual as ImageVisual).spritesheet;\n updated.push(\"spritesheet (removed)\");\n } else {\n (layer.visual as ImageVisual).spritesheet = spritesheet;\n updated.push(\"spritesheet\");\n }\n }\n if (frameIndex !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"frameIndex\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).frameIndex = frameIndex;\n updated.push(\"frameIndex\");\n }\n\n // Shape fields\n if (shape !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"shape\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).shape = shape as ShapeVisual[\"shape\"];\n updated.push(\"shape\");\n }\n if (fill !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"fill\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).fill = fill as unknown as ShapeVisual[\"fill\"];\n updated.push(\"fill\");\n }\n if (stroke !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"stroke\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).stroke = stroke as unknown as ShapeVisual[\"stroke\"];\n updated.push(\"stroke\");\n }\n\n if (updated.length === 0) {\n return err(\"No visual fields provided to update\");\n }\n\n return ok({ layerId, visualType, updated });\n },\n );\n}\n","// @a-company/atelier-mcp — State configuration tools (audio, transitions, parent states)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nconst EasingInputSchema = z.union([\n z.enum([\"ease-in\", \"ease-out\", \"ease-in-out\"]),\n z.object({ type: z.literal(\"linear\") }),\n z.object({\n type: z.literal(\"cubic-bezier\"),\n x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(),\n }),\n z.object({\n type: z.literal(\"spring\"),\n mass: z.number().optional(),\n stiffness: z.number().optional(),\n damping: z.number().optional(),\n velocity: z.number().optional(),\n }),\n z.object({\n type: z.literal(\"step\"),\n steps: z.number().int().positive(),\n position: z.enum([\"start\", \"end\"]).optional(),\n }),\n]).describe(\"Easing function\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_audio ─────────────────────────────────────\n server.tool(\n \"atelier_set_audio\",\n \"Set or remove an audio track on a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n audio: z.object({\n src: z.string().describe(\"Audio source — asset reference, file path, or URL\"),\n offset: z.number().min(0).optional().describe(\"Skip into audio in seconds (default: 0)\"),\n volume: z.number().min(0).max(1).optional().describe(\"Playback volume 0–1 (default: 1)\"),\n loop: z.boolean().optional().describe(\"Loop for state duration (default: false)\"),\n startFrame: z.number().int().min(0).optional().describe(\"Frame to start playing (default: 0)\"),\n }).nullable().describe(\"Audio configuration, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, audio }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (audio === null) {\n delete state.audio;\n return ok({ stateName, audio: null, removed: true });\n }\n\n state.audio = audio;\n return ok({ stateName, audioSrc: audio.src });\n },\n );\n\n // ── atelier_configure_transition ──────────────────────────\n server.tool(\n \"atelier_configure_transition\",\n \"Configure or remove a transition from one state to a target state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"Source state name\"),\n targetState: z.string().describe(\"Target state name\"),\n transition: z.object({\n duration: z.number().positive().int().describe(\"Transition duration in frames\"),\n easing: EasingInputSchema.optional(),\n }).nullable().describe(\"Transition config, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, targetState, transition }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (stateName === targetState) {\n return err(\"Cannot create a transition from a state to itself\");\n }\n\n if (!doc.states[targetState]) {\n return err(`Target state \"${targetState}\" not found`);\n }\n\n if (transition === null) {\n if (state.transitions) {\n delete state.transitions[targetState];\n if (Object.keys(state.transitions).length === 0) {\n delete state.transitions;\n }\n }\n return ok({ stateName, targetState, removed: true });\n }\n\n if (!state.transitions) {\n state.transitions = {};\n }\n state.transitions[targetState] = transition as unknown as NonNullable<typeof state.transitions>[string];\n return ok({ stateName, targetState, duration: transition.duration });\n },\n );\n\n // ── atelier_set_state_parent ──────────────────────────────\n server.tool(\n \"atelier_set_state_parent\",\n \"Set or clear the parent state for hierarchical delta inheritance\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n parent: z.string().nullable().describe(\"Parent state name, or null to clear\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, parent }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (parent === null) {\n delete state.parent;\n return ok({ stateName, parent: null, cleared: true });\n }\n\n if (parent === stateName) {\n return err(\"A state cannot be its own parent\");\n }\n\n if (!doc.states[parent]) {\n return err(`Parent state \"${parent}\" not found`);\n }\n\n // Walk parent chain to detect cycles\n let current = parent;\n const visited = new Set<string>([stateName]);\n while (current) {\n if (visited.has(current)) {\n return err(`Circular reference detected: setting parent \"${parent}\" would create a cycle`);\n }\n visited.add(current);\n current = doc.states[current]?.parent as string;\n }\n\n state.parent = parent;\n return ok({ stateName, parent });\n },\n );\n}\n","// @a-company/atelier-mcp — Export tools (SVG, Lottie)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { renderFrameSVG } from \"@a-company/atelier-svg\";\nimport { exportToLottie } from \"@a-company/atelier-lottie\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_export_svg ────────────────────────────────────\n server.tool(\n \"atelier_export_svg\",\n \"Export a frame as an SVG string\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().optional().describe(\"State name (defaults to first state)\"),\n frame: z.number().int().min(0).optional().describe(\"Frame number (defaults to 0)\"),\n xmlDeclaration: z.boolean().optional().describe(\"Include XML declaration (default: false)\"),\n viewBox: z.boolean().optional().describe(\"Include viewBox attribute (default: true)\"),\n indent: z.number().int().min(0).optional().describe(\"Indent size in spaces (default: 2)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame, xmlDeclaration, viewBox, indent }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) {\n return err(\"Document has no states\");\n }\n\n const resolvedStateName = stateName ?? stateNames[0];\n if (!doc.states[resolvedStateName]) {\n return err(`State \"${resolvedStateName}\" not found`);\n }\n\n try {\n const svg = renderFrameSVG(doc, resolvedStateName, frame ?? 0, {\n xmlDeclaration,\n viewBox,\n indent,\n });\n return ok({ svg, stateName: resolvedStateName, frame: frame ?? 0 });\n } catch (e) {\n return err((e as Error).message);\n }\n },\n );\n\n // ── atelier_export_lottie ─────────────────────────────────\n server.tool(\n \"atelier_export_lottie\",\n \"Export a document to Lottie JSON format (lossy, best-effort)\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().optional().describe(\"State to export (defaults to first state)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n try {\n const { json, warnings } = exportToLottie(doc, {\n state: stateName,\n });\n return ok({ lottie: json as unknown as Record<string, unknown>, warnings });\n } catch (e) {\n return err((e as Error).message);\n }\n },\n );\n}\n","import type { Fill, Stroke, Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"./canvas-types.js\";\n\n/**\n * Convert an Atelier Color to a CSS color string.\n */\nexport function colorToCSS(color: Color): string {\n if (typeof color === \"string\") return color; // hex string\n\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return `rgba(${Math.round(c.r)}, ${Math.round(c.g)}, ${Math.round(c.b)}, ${c.a})`;\n }\n\n if (\"h\" in color) {\n const c = color as HSLAColor;\n return `hsla(${c.h}, ${c.s}%, ${c.l}%, ${c.a})`;\n }\n\n return \"#000000\";\n}\n\n/**\n * Apply a Fill to the canvas context's fillStyle.\n */\nexport function applyFill(ctx: RenderContext, fill: Fill, width: number, height: number): void {\n switch (fill.type) {\n case \"solid\":\n ctx.fillStyle = colorToCSS(fill.color);\n break;\n\n case \"linear-gradient\": {\n const rad = (fill.angle * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const halfW = width / 2;\n const halfH = height / 2;\n const grad = ctx.createLinearGradient(\n halfW - cos * halfW, halfH - sin * halfH,\n halfW + cos * halfW, halfH + sin * halfH,\n );\n for (const stop of fill.stops) {\n grad.addColorStop(stop.offset, colorToCSS(stop.color));\n }\n ctx.fillStyle = grad as unknown as string;\n break;\n }\n\n case \"radial-gradient\": {\n const cx = typeof fill.center.x === \"number\" ? fill.center.x : (parseFloat(fill.center.x) / 100) * width;\n const cy = typeof fill.center.y === \"number\" ? fill.center.y : (parseFloat(fill.center.y) / 100) * height;\n const r = typeof fill.radius === \"number\" ? fill.radius : (parseFloat(fill.radius) / 100) * Math.max(width, height);\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, r);\n for (const stop of fill.stops) {\n grad.addColorStop(stop.offset, colorToCSS(stop.color));\n }\n ctx.fillStyle = grad as unknown as string;\n break;\n }\n }\n}\n\n/**\n * Apply a Stroke to the canvas context.\n * @param pathLength - total perimeter of the shape (needed for strokeStart/strokeEnd trim)\n */\nexport function applyStroke(ctx: RenderContext, stroke: Stroke, pathLength: number): void {\n ctx.strokeStyle = colorToCSS(stroke.color);\n ctx.lineWidth = stroke.width;\n if (stroke.lineCap) ctx.lineCap = stroke.lineCap;\n if (stroke.lineJoin) ctx.lineJoin = stroke.lineJoin;\n\n const start = stroke.strokeStart ?? 0;\n const end = stroke.strokeEnd ?? 1;\n\n if (start !== 0 || end !== 1) {\n const visible = (end - start) * pathLength;\n ctx.setLineDash([Math.max(visible, 0), pathLength + 1]);\n ctx.lineDashOffset = -start * pathLength;\n } else if (stroke.dash) {\n ctx.setLineDash(stroke.dash);\n }\n}\n","import type { Layer, Visual, ShapeVisual, TextVisual, ImageVisual, Color, BlendMode, LinearGradientFill, RadialGradientFill } from \"@a-company/atelier-types\";\nimport { colorToCSS } from \"./styles.js\";\nimport { evaluatePathAtProgress } from \"@a-company/atelier-math\";\nimport type { ResolvedLayer } from \"@a-company/atelier-core\";\n\n/**\n * Effective values for a layer at a given frame,\n * with computed properties merged over defaults.\n */\nexport interface EffectiveLayer {\n /** Original layer */\n layer: Layer;\n /** Visual with animated property overrides applied */\n visual: Visual;\n /** Effective frame position (may be animated) */\n x: number;\n y: number;\n /** Effective bounds */\n width: number;\n height: number;\n /** Effective transform values */\n opacity: number;\n rotation: number;\n scaleX: number;\n scaleY: number;\n anchorX: number;\n anchorY: number;\n /** Resolved shadow (if layer has shadow or shadow is animated) */\n shadow?: {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n };\n /** Blend mode for compositing */\n blendMode: string;\n /** Motion path auto-rotation in degrees (applied additively to rotation) */\n motionPathAngle: number;\n /** Whether this layer is visible (may be animated) */\n visible: boolean;\n /** Color tint overlay */\n tint?: {\n color: string;\n amount: number;\n };\n}\n\n/**\n * Resolve a UnitValue to pixels. Percentages resolve against a reference dimension.\n */\nfunction resolveUnit(value: number | string, reference: number): number {\n if (typeof value === \"string\" && value.endsWith(\"%\")) {\n return (parseFloat(value) / 100) * reference;\n }\n return value as number;\n}\n\n/**\n * Build the effective layer values by merging computed properties over layer defaults.\n * @param resolved - The resolved layer from frame resolution\n * @param parentWidth - Parent/canvas width for percentage resolution\n * @param parentHeight - Parent/canvas height for percentage resolution\n */\nexport function buildEffectiveLayer(\n resolved: ResolvedLayer,\n parentWidth: number,\n parentHeight: number,\n): EffectiveLayer {\n const { layer, computedProperties } = resolved;\n const cp = computedProperties as Record<string, unknown>;\n\n const hasShadow = layer.shadow || cp[\"shadow.blur\"] !== undefined || cp[\"shadow.color\"] !== undefined;\n const hasTint = layer.tint || cp[\"tint.amount\"] !== undefined || cp[\"tint.color\"] !== undefined;\n\n // Resolve base position\n let x = resolveUnit((cp[\"frame.x\"] ?? layer.frame.x) as number | string, parentWidth);\n let y = resolveUnit((cp[\"frame.y\"] ?? layer.frame.y) as number | string, parentHeight);\n let motionPathAngle = 0;\n\n // Motion path overrides position when progress is animated\n const motionProgress = cp[\"motionPath.progress\"] as number | undefined;\n if (motionProgress !== undefined && layer.motionPath && layer.motionPath.points.length >= 2) {\n const pos = evaluatePathAtProgress(layer.motionPath.points, motionProgress, layer.motionPath.closed);\n x = pos.x;\n y = pos.y;\n if (layer.motionPath.autoRotate) {\n motionPathAngle = pos.angle + (layer.motionPath.autoRotateOffset ?? 0);\n }\n }\n\n return {\n layer,\n visual: buildEffectiveVisual(layer.visual, cp),\n x,\n y,\n width: resolveUnit((cp[\"bounds.width\"] ?? layer.bounds.width) as number | string, parentWidth),\n height: resolveUnit((cp[\"bounds.height\"] ?? layer.bounds.height) as number | string, parentHeight),\n opacity: (cp[\"opacity\"] as number) ?? layer.opacity ?? 1,\n rotation: (cp[\"rotation\"] as number) ?? layer.rotation ?? 0,\n scaleX: (cp[\"scale.x\"] as number) ?? layer.scale?.x ?? 1,\n scaleY: (cp[\"scale.y\"] as number) ?? layer.scale?.y ?? 1,\n anchorX: (cp[\"anchorPoint.x\"] as number) ?? layer.anchorPoint?.x ?? 0,\n anchorY: (cp[\"anchorPoint.y\"] as number) ?? layer.anchorPoint?.y ?? 0,\n shadow: hasShadow ? {\n color: colorToCSS((cp[\"shadow.color\"] ?? layer.shadow?.color ?? \"#00000080\") as Color),\n blur: (cp[\"shadow.blur\"] as number) ?? layer.shadow?.blur ?? 0,\n offsetX: (cp[\"shadow.offsetX\"] as number) ?? layer.shadow?.offsetX ?? 0,\n offsetY: (cp[\"shadow.offsetY\"] as number) ?? layer.shadow?.offsetY ?? 0,\n } : undefined,\n blendMode: (layer.blendMode as BlendMode) ?? \"normal\",\n motionPathAngle,\n visible: (cp[\"visible\"] as boolean) ?? layer.visible ?? true,\n tint: hasTint ? {\n color: colorToCSS((cp[\"tint.color\"] ?? layer.tint?.color ?? \"#FF0000\") as Color),\n amount: (cp[\"tint.amount\"] as number) ?? layer.tint?.amount ?? 0,\n } : undefined,\n };\n}\n\n/**\n * Build an effective visual by applying computed property overrides.\n * Returns the original visual if no visual properties are animated.\n */\nfunction buildEffectiveVisual(visual: Visual, cp: Record<string, unknown>): Visual {\n const hasVisualOverride =\n cp[\"visual.fill.color\"] !== undefined ||\n cp[\"visual.fill.angle\"] !== undefined ||\n cp[\"visual.fill.center.x\"] !== undefined ||\n cp[\"visual.fill.center.y\"] !== undefined ||\n cp[\"visual.fill.radius\"] !== undefined ||\n cp[\"visual.stroke.color\"] !== undefined ||\n cp[\"visual.stroke.width\"] !== undefined ||\n cp[\"visual.stroke.start\"] !== undefined ||\n cp[\"visual.stroke.end\"] !== undefined ||\n cp[\"visual.shape.cornerRadius\"] !== undefined ||\n cp[\"visual.style.fontSize\"] !== undefined ||\n cp[\"visual.style.color\"] !== undefined;\n\n const hasImageOverride =\n cp[\"visual.image.sourceRect.x\"] !== undefined ||\n cp[\"visual.image.sourceRect.y\"] !== undefined ||\n cp[\"visual.image.sourceRect.width\"] !== undefined ||\n cp[\"visual.image.sourceRect.height\"] !== undefined ||\n cp[\"visual.image.frameIndex\"] !== undefined;\n\n if (!hasVisualOverride && !hasImageOverride) return visual;\n\n if (visual.type === \"shape\") {\n const v: ShapeVisual = { ...visual };\n\n if (cp[\"visual.shape.cornerRadius\"] !== undefined && v.shape.type === \"rect\") {\n v.shape = { ...v.shape, cornerRadius: cp[\"visual.shape.cornerRadius\"] as number };\n }\n\n if (v.fill) {\n if (cp[\"visual.fill.color\"] !== undefined && v.fill.type === \"solid\") {\n v.fill = { ...v.fill, color: cp[\"visual.fill.color\"] as string };\n }\n if (cp[\"visual.fill.angle\"] !== undefined && v.fill.type === \"linear-gradient\") {\n v.fill = { ...v.fill, angle: cp[\"visual.fill.angle\"] as number } as LinearGradientFill;\n }\n if (v.fill.type === \"radial-gradient\") {\n const cx = cp[\"visual.fill.center.x\"];\n const cy = cp[\"visual.fill.center.y\"];\n const r = cp[\"visual.fill.radius\"];\n if (cx !== undefined || cy !== undefined || r !== undefined) {\n const f = v.fill as RadialGradientFill;\n v.fill = {\n ...f,\n center: {\n x: cx !== undefined ? (cx as number) : f.center.x,\n y: cy !== undefined ? (cy as number) : f.center.y,\n },\n radius: r !== undefined ? (r as number) : f.radius,\n } as RadialGradientFill;\n }\n }\n }\n\n if (v.stroke) {\n const strokeColor = cp[\"visual.stroke.color\"] ?? v.stroke.color;\n const strokeWidth = (cp[\"visual.stroke.width\"] as number) ?? v.stroke.width;\n const strokeStart = (cp[\"visual.stroke.start\"] as number | undefined) ?? v.stroke.strokeStart;\n const strokeEnd = (cp[\"visual.stroke.end\"] as number | undefined) ?? v.stroke.strokeEnd;\n if (\n strokeColor !== v.stroke.color ||\n strokeWidth !== v.stroke.width ||\n strokeStart !== v.stroke.strokeStart ||\n strokeEnd !== v.stroke.strokeEnd\n ) {\n v.stroke = {\n ...v.stroke,\n color: strokeColor as string,\n width: strokeWidth,\n strokeStart,\n strokeEnd,\n };\n }\n }\n\n return v;\n }\n\n if (visual.type === \"text\") {\n const v: TextVisual = { ...visual };\n const fontSize = (cp[\"visual.style.fontSize\"] as number) ?? v.style.fontSize;\n const color = cp[\"visual.style.color\"] ?? v.style.color;\n if (fontSize !== v.style.fontSize || color !== v.style.color) {\n v.style = { ...v.style, fontSize, color: color as string };\n }\n return v;\n }\n\n if (visual.type === \"image\" && hasImageOverride) {\n const v: ImageVisual = { ...visual };\n\n // Merge animated sourceRect fields\n if (\n cp[\"visual.image.sourceRect.x\"] !== undefined ||\n cp[\"visual.image.sourceRect.y\"] !== undefined ||\n cp[\"visual.image.sourceRect.width\"] !== undefined ||\n cp[\"visual.image.sourceRect.height\"] !== undefined\n ) {\n const base = v.sourceRect ?? { x: 0, y: 0, width: 0, height: 0 };\n v.sourceRect = {\n x: (cp[\"visual.image.sourceRect.x\"] as number) ?? base.x,\n y: (cp[\"visual.image.sourceRect.y\"] as number) ?? base.y,\n width: (cp[\"visual.image.sourceRect.width\"] as number) ?? base.width,\n height: (cp[\"visual.image.sourceRect.height\"] as number) ?? base.height,\n };\n }\n\n // Merge animated frameIndex\n if (cp[\"visual.image.frameIndex\"] !== undefined) {\n v.frameIndex = Math.floor(cp[\"visual.image.frameIndex\"] as number);\n }\n\n return v;\n }\n\n return visual;\n}\n","import type { ShapeVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { applyFill, applyStroke } from \"../styles.js\";\n\nexport function renderShape(ctx: RenderContext, eff: EffectiveLayer): void {\n const visual = eff.visual as ShapeVisual;\n const { shape } = visual;\n const { width, height } = eff;\n\n switch (shape.type) {\n case \"rect\":\n renderRect(ctx, width, height, shape.cornerRadius, visual);\n break;\n case \"ellipse\":\n renderEllipse(ctx, width, height, visual);\n break;\n case \"path\":\n renderPath(ctx, shape.points, shape.closed, visual);\n break;\n }\n}\n\n// ── Perimeter helpers ───────────────────────────────────────\n\nfunction rectPerimeter(w: number, h: number): number {\n return 2 * (w + h);\n}\n\nfunction ellipsePerimeter(w: number, h: number): number {\n const a = w / 2;\n const b = h / 2;\n // Ramanujan approximation\n return Math.PI * (3 * (a + b) - Math.sqrt((3 * a + b) * (a + 3 * b)));\n}\n\nfunction dist(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction pathPerimeter(\n points: { x: number; y: number; in?: { x: number; y: number }; out?: { x: number; y: number } }[],\n closed: boolean | undefined,\n): number {\n let length = 0;\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n if (prev.out && curr.in) {\n // Approximate bezier with chord * 1.2\n length += dist(prev.x, prev.y, curr.x, curr.y) * 1.2;\n } else {\n length += dist(prev.x, prev.y, curr.x, curr.y);\n }\n }\n if (closed && points.length > 1) {\n const first = points[0];\n const last = points[points.length - 1];\n length += dist(last.x, last.y, first.x, first.y);\n }\n return length;\n}\n\n// ── Renderers ───────────────────────────────────────────────\n\nfunction renderRect(\n ctx: RenderContext,\n width: number,\n height: number,\n cornerRadius: number | [number, number, number, number] | undefined,\n visual: ShapeVisual,\n): void {\n if (visual.fill) {\n applyFill(ctx, visual.fill, width, height);\n if (cornerRadius && ctx.roundRect) {\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, cornerRadius);\n ctx.fill();\n } else {\n ctx.fillRect(0, 0, width, height);\n }\n }\n if (visual.stroke) {\n const perimeter = rectPerimeter(width, height);\n applyStroke(ctx, visual.stroke, perimeter);\n if (cornerRadius && ctx.roundRect) {\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, cornerRadius);\n ctx.stroke();\n } else {\n ctx.strokeRect(0, 0, width, height);\n }\n }\n}\n\nfunction renderEllipse(\n ctx: RenderContext,\n width: number,\n height: number,\n visual: ShapeVisual,\n): void {\n ctx.beginPath();\n ctx.ellipse(width / 2, height / 2, width / 2, height / 2, 0, 0, Math.PI * 2);\n\n if (visual.fill) {\n applyFill(ctx, visual.fill, width, height);\n ctx.fill();\n }\n if (visual.stroke) {\n const perimeter = ellipsePerimeter(width, height);\n applyStroke(ctx, visual.stroke, perimeter);\n ctx.stroke();\n }\n}\n\nfunction renderPath(\n ctx: RenderContext,\n points: { x: number; y: number; in?: { x: number; y: number }; out?: { x: number; y: number } }[],\n closed: boolean | undefined,\n visual: ShapeVisual,\n): void {\n if (points.length < 2) return;\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n\n if (prev.out && curr.in) {\n ctx.bezierCurveTo(\n prev.x + prev.out.x, prev.y + prev.out.y,\n curr.x + curr.in.x, curr.y + curr.in.y,\n curr.x, curr.y,\n );\n } else {\n ctx.lineTo(curr.x, curr.y);\n }\n }\n\n if (closed) ctx.closePath();\n\n if (visual.fill) {\n applyFill(ctx, visual.fill, 0, 0);\n ctx.fill();\n }\n if (visual.stroke) {\n const perimeter = pathPerimeter(points, closed);\n applyStroke(ctx, visual.stroke, perimeter);\n ctx.stroke();\n }\n}\n","import type { TextVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { colorToCSS } from \"../styles.js\";\n\nexport function renderText(ctx: RenderContext, eff: EffectiveLayer): void {\n const visual = eff.visual as TextVisual;\n const { style } = visual;\n\n // Build font string\n const fontStyle = style.fontStyle ?? \"normal\";\n const fontWeight = style.fontWeight ?? \"normal\";\n const fontSize = style.fontSize;\n const fontFamily = style.fontFamily;\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n\n // Set alignment — position text within its bounding box\n const align = style.textAlign ?? \"left\";\n ctx.textAlign = align;\n ctx.textBaseline = \"top\";\n\n // Set color\n ctx.fillStyle = colorToCSS(style.color);\n\n // Canvas 2D textAlign anchors at the draw point, so offset within bounds:\n // \"left\" → draw at x=0 (text flows right from left edge)\n // \"center\" → draw at x=width/2 (text centers within bounds)\n // \"right\" → draw at x=width (text flows left from right edge)\n let textX = 0;\n if (align === \"center\") {\n textX = eff.width / 2;\n } else if (align === \"right\") {\n textX = eff.width;\n }\n\n ctx.fillText(visual.content, textX, 0);\n}\n","import type { ImageVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport type { ImageCache } from \"../image-cache.js\";\n\n/**\n * Render an image layer to the canvas.\n * Supports sourceRect cropping and spritesheet grid animation.\n * If the image hasn't loaded yet, triggers a cache load and returns\n * (the image will appear on the next re-render).\n */\nexport function renderImage(ctx: RenderContext, eff: EffectiveLayer, imageCache: ImageCache): void {\n const visual = eff.visual as ImageVisual;\n const src = visual.src;\n if (!src) return;\n\n const img = imageCache.get(src);\n if (!img) {\n imageCache.load(src);\n return;\n }\n\n // Spritesheet grid computation takes precedence over manual sourceRect\n if (visual.spritesheet) {\n const { columns, rows, frameWidth, frameHeight, frameCount } = visual.spritesheet;\n const maxFrames = frameCount ?? (columns * rows);\n const idx = Math.max(0, Math.min(Math.floor(visual.frameIndex ?? 0), maxFrames - 1));\n const col = idx % columns;\n const row = Math.floor(idx / columns);\n const sx = col * frameWidth;\n const sy = row * frameHeight;\n (ctx.drawImage as Function)(img, sx, sy, frameWidth, frameHeight, 0, 0, eff.width, eff.height);\n return;\n }\n\n // Manual sourceRect crop\n if (visual.sourceRect) {\n const sr = visual.sourceRect;\n (ctx.drawImage as Function)(img, sr.x, sr.y, sr.width, sr.height, 0, 0, eff.width, eff.height);\n return;\n }\n\n // Default: draw full image to bounds\n ctx.drawImage(img, 0, 0, eff.width, eff.height);\n}\n","import type { AtelierDocument, RefVisual, ImageVisual } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport type { RenderContext, DocumentResolver } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { buildEffectiveLayer } from \"../apply-properties.js\";\nimport { renderShape } from \"./shape-renderer.js\";\nimport { renderText } from \"./text-renderer.js\";\nimport { renderImage } from \"./image-renderer.js\";\nimport type { ImageCache } from \"../image-cache.js\";\n\nexport interface RefRenderOpts {\n documentResolver?: DocumentResolver;\n maxRefDepth?: number;\n imageCache?: ImageCache;\n /** Internal: tracks visited refs for cycle detection */\n _visitedRefs?: Set<string>;\n /** Internal: current recursion depth */\n _depth?: number;\n}\n\n/**\n * Render a ref layer. If a documentResolver is provided, resolves and renders\n * the sub-document inline. Otherwise falls back to a placeholder rectangle.\n */\nexport function renderRef(\n ctx: RenderContext,\n eff: EffectiveLayer,\n opts?: RefRenderOpts,\n _parentDoc?: AtelierDocument,\n): void {\n const visual = eff.visual as RefVisual;\n const resolver = opts?.documentResolver;\n\n if (!resolver) {\n renderPlaceholder(ctx, eff, `REF: ${visual.src}`);\n return;\n }\n\n const depth = opts?._depth ?? 0;\n const maxDepth = opts?.maxRefDepth ?? 4;\n\n if (depth >= maxDepth) {\n renderPlaceholder(ctx, eff, \"MAX DEPTH\");\n return;\n }\n\n const visitedRefs = opts?._visitedRefs ?? new Set<string>();\n\n if (visitedRefs.has(visual.src)) {\n renderPlaceholder(ctx, eff, \"CYCLE\");\n return;\n }\n\n const subDoc = resolver(visual.src);\n if (!subDoc) {\n renderPlaceholder(ctx, eff, \"NOT FOUND\");\n return;\n }\n\n // Determine which state and frame to render\n const stateNames = Object.keys(subDoc.states);\n if (stateNames.length === 0) {\n renderPlaceholder(ctx, eff, \"NO STATES\");\n return;\n }\n\n const stateName = visual.state ?? stateNames[0];\n const stateObj = subDoc.states[stateName];\n if (!stateObj) {\n renderPlaceholder(ctx, eff, `STATE? ${stateName}`);\n return;\n }\n\n const maxFrame = Math.max(0, stateObj.duration - 1);\n const frame = Math.min(visual.frame ?? 0, maxFrame);\n\n // Resolve the sub-document frame\n const resolved = resolveFrame(subDoc, stateName, frame);\n\n // Mark as visited for cycle detection\n visitedRefs.add(visual.src);\n\n // Scale to fit eff bounds\n const scaleX = eff.width / subDoc.canvas.width;\n const scaleY = eff.height / subDoc.canvas.height;\n\n ctx.save();\n ctx.scale(scaleX, scaleY);\n\n // Build and render sub-doc layers\n const { width: subW, height: subH } = subDoc.canvas;\n\n for (const resolvedLayer of resolved.layers) {\n const subEff = buildEffectiveLayer(resolvedLayer, subW, subH);\n\n if (!subEff.visible) continue;\n if (subEff.opacity <= 0) continue;\n\n // Resolve asset for images\n if (resolvedLayer.layer.visual.type === \"image\") {\n const iv = subEff.visual as ImageVisual;\n if (!iv.src && iv.assetId && subDoc.assets?.[iv.assetId]) {\n iv.src = subDoc.assets[iv.assetId].src;\n }\n }\n\n ctx.save();\n ctx.globalAlpha = subEff.opacity;\n ctx.translate(subEff.x, subEff.y);\n\n switch (resolvedLayer.layer.visual.type) {\n case \"shape\":\n renderShape(ctx, subEff);\n break;\n case \"text\":\n renderText(ctx, subEff);\n break;\n case \"image\":\n if (opts?.imageCache) renderImage(ctx, subEff, opts.imageCache);\n break;\n case \"ref\":\n renderRef(ctx, subEff, {\n ...opts,\n _visitedRefs: visitedRefs,\n _depth: depth + 1,\n }, subDoc);\n break;\n case \"group\":\n break;\n }\n\n ctx.restore();\n }\n\n ctx.restore();\n\n // Remove from visited after rendering (allow same ref in different branches)\n visitedRefs.delete(visual.src);\n}\n\n/** Render a dashed placeholder rectangle with label */\nfunction renderPlaceholder(ctx: RenderContext, eff: EffectiveLayer, label: string): void {\n const { width, height } = eff;\n\n ctx.strokeStyle = \"#888888\";\n ctx.lineWidth = 2;\n ctx.setLineDash([6, 4]);\n ctx.strokeRect(0, 0, width, height);\n ctx.setLineDash([]);\n\n ctx.fillStyle = \"#888888\";\n ctx.font = `${Math.max(12, Math.min(16, height * 0.15))}px sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, width / 2, height / 2, width - 8);\n}\n","import type { AtelierDocument, ImageVisual, Shape } from \"@a-company/atelier-types\";\nimport type { ResolvedFrame } from \"@a-company/atelier-core\";\nimport type { RenderContext, DocumentResolver } from \"./canvas-types.js\";\nimport { buildEffectiveLayer, type EffectiveLayer } from \"./apply-properties.js\";\nimport { renderShape } from \"./renderers/shape-renderer.js\";\nimport { renderText } from \"./renderers/text-renderer.js\";\nimport { renderImage } from \"./renderers/image-renderer.js\";\nimport { renderRef } from \"./renderers/ref-renderer.js\";\nimport type { ImageCache } from \"./image-cache.js\";\n\n/** Options for renderFrame */\nexport interface RenderOptions {\n imageCache?: ImageCache;\n documentResolver?: DocumentResolver;\n maxRefDepth?: number;\n}\n\n/**\n * Render a resolved frame to a Canvas 2D context.\n * Clears the canvas and draws all visible layers in order.\n */\nexport function renderFrame(\n ctx: RenderContext,\n resolvedFrame: ResolvedFrame,\n doc: AtelierDocument,\n optsOrCache?: RenderOptions | ImageCache,\n): void {\n // Backward compatible: detect old ImageCache arg vs new RenderOptions\n let imageCache: ImageCache | undefined;\n let documentResolver: DocumentResolver | undefined;\n let maxRefDepth = 4;\n\n if (optsOrCache && typeof (optsOrCache as ImageCache).get === \"function\") {\n imageCache = optsOrCache as ImageCache;\n } else if (optsOrCache) {\n const opts = optsOrCache as RenderOptions;\n imageCache = opts.imageCache;\n documentResolver = opts.documentResolver;\n maxRefDepth = opts.maxRefDepth ?? 4;\n }\n const { width, height } = doc.canvas;\n\n // Clear canvas\n ctx.fillStyle = doc.canvas.background ?? \"transparent\";\n ctx.fillRect(0, 0, width, height);\n\n // Build effective layers into a map for ancestor transform lookups\n const effMap = new Map<string, EffectiveLayer>();\n const effList: EffectiveLayer[] = [];\n\n for (const resolvedLayer of resolvedFrame.layers) {\n const eff = buildEffectiveLayer(resolvedLayer, width, height);\n effMap.set(resolvedLayer.layer.id, eff);\n effList.push(eff);\n }\n\n // Render each layer in order (painters algorithm — first = back)\n for (const eff of effList) {\n const { layer } = eff;\n\n // Skip invisible layers\n if (!eff.visible) continue;\n\n // Skip fully transparent layers\n if (eff.opacity <= 0) continue;\n\n // Resolve assetId → src for image visuals\n if (layer.visual.type === \"image\") {\n const iv = eff.visual as ImageVisual;\n if (!iv.src && iv.assetId && doc.assets?.[iv.assetId]) {\n iv.src = doc.assets[iv.assetId].src;\n }\n }\n\n ctx.save();\n\n // Apply ancestor transforms (group/parent inheritance)\n applyAncestorTransforms(ctx, layer.id, effMap, doc);\n\n // Apply transforms\n ctx.globalAlpha = eff.opacity;\n\n // Apply blend mode\n if (eff.blendMode !== \"normal\") {\n ctx.globalCompositeOperation = blendModeToComposite(eff.blendMode);\n }\n\n ctx.translate(eff.x, eff.y);\n\n // Apply anchor-relative transforms\n const anchorPixelX = eff.anchorX * eff.width;\n const anchorPixelY = eff.anchorY * eff.height;\n\n // Combine explicit rotation with motion path auto-rotation\n const totalRotation = eff.rotation + eff.motionPathAngle;\n\n if (totalRotation !== 0 || eff.scaleX !== 1 || eff.scaleY !== 1) {\n ctx.translate(anchorPixelX, anchorPixelY);\n if (totalRotation !== 0) {\n ctx.rotate((totalRotation * Math.PI) / 180);\n }\n if (eff.scaleX !== 1 || eff.scaleY !== 1) {\n ctx.scale(eff.scaleX, eff.scaleY);\n }\n ctx.translate(-anchorPixelX, -anchorPixelY);\n }\n\n // Apply shadow if present\n if (eff.shadow) {\n ctx.shadowColor = eff.shadow.color;\n ctx.shadowBlur = eff.shadow.blur;\n ctx.shadowOffsetX = eff.shadow.offsetX;\n ctx.shadowOffsetY = eff.shadow.offsetY;\n }\n\n // Apply clip path if present\n if (layer.clipPath) {\n applyClipPath(ctx, layer.clipPath, eff.width, eff.height);\n }\n\n // Tint requires offscreen compositing — draw to offscreen if tint is active\n const hasTint = eff.tint && eff.tint.amount > 0 && ctx.createOffscreen;\n let renderCtx = ctx;\n let offscreen: { ctx: RenderContext; canvas: unknown } | null = null;\n\n if (hasTint) {\n offscreen = ctx.createOffscreen!(eff.width, eff.height);\n renderCtx = offscreen.ctx;\n }\n\n // Ref rendering options (passed through for sub-doc composition)\n const refOpts = { documentResolver, maxRefDepth, imageCache };\n\n // Dispatch to type-specific renderer\n switch (layer.visual.type) {\n case \"shape\":\n renderShape(renderCtx, eff);\n break;\n case \"text\":\n renderText(renderCtx, eff);\n break;\n case \"image\":\n if (imageCache) renderImage(renderCtx, eff, imageCache);\n break;\n case \"group\":\n // Groups are structural containers — no visual output\n break;\n case \"ref\":\n renderRef(renderCtx, eff, refOpts, doc);\n break;\n }\n\n // Apply tint via multiply composite on offscreen canvas\n if (hasTint && offscreen && eff.tint) {\n const offCtx = offscreen.ctx;\n // Draw tint color over the content using multiply\n offCtx.save();\n offCtx.globalCompositeOperation = \"multiply\";\n offCtx.fillStyle = eff.tint.color;\n offCtx.fillRect(0, 0, eff.width, eff.height);\n offCtx.restore();\n\n // Clip to original content shape using destination-in\n offCtx.save();\n offCtx.globalCompositeOperation = \"destination-in\";\n // Re-render the content to create the alpha mask\n switch (layer.visual.type) {\n case \"shape\": renderShape(offCtx, eff); break;\n case \"text\": renderText(offCtx, eff); break;\n case \"image\": if (imageCache) renderImage(offCtx, eff, imageCache); break;\n case \"ref\": renderRef(offCtx, eff, refOpts, doc); break;\n }\n offCtx.restore();\n\n // Blend tinted offscreen back with original at tint.amount alpha\n // First draw original content\n switch (layer.visual.type) {\n case \"shape\": renderShape(ctx, eff); break;\n case \"text\": renderText(ctx, eff); break;\n case \"image\": if (imageCache) renderImage(ctx, eff, imageCache); break;\n case \"ref\": renderRef(ctx, eff, refOpts, doc); break;\n }\n // Then overlay tinted version at tint amount\n const prevAlpha = ctx.globalAlpha;\n ctx.globalAlpha = eff.tint.amount;\n ctx.drawImage(offscreen.canvas, 0, 0, eff.width, eff.height);\n ctx.globalAlpha = prevAlpha;\n }\n\n ctx.restore();\n }\n}\n\n/** Apply a shape as a clipping region */\nfunction applyClipPath(ctx: RenderContext, shape: Shape, width: number, height: number): void {\n ctx.beginPath();\n switch (shape.type) {\n case \"rect\":\n if (shape.cornerRadius && ctx.roundRect) {\n ctx.roundRect(0, 0, width, height, shape.cornerRadius);\n } else {\n // Manual rect path for clipping (fillRect doesn't create a path)\n ctx.moveTo(0, 0);\n ctx.lineTo(width, 0);\n ctx.lineTo(width, height);\n ctx.lineTo(0, height);\n ctx.closePath();\n }\n break;\n case \"ellipse\":\n ctx.ellipse(width / 2, height / 2, width / 2, height / 2, 0, 0, Math.PI * 2);\n break;\n case \"path\":\n if (shape.points.length >= 2) {\n ctx.moveTo(shape.points[0].x, shape.points[0].y);\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n if (prev.out && curr.in) {\n ctx.bezierCurveTo(\n prev.x + prev.out.x, prev.y + prev.out.y,\n curr.x + curr.in.x, curr.y + curr.in.y,\n curr.x, curr.y,\n );\n } else {\n ctx.lineTo(curr.x, curr.y);\n }\n }\n if (shape.closed) ctx.closePath();\n }\n break;\n }\n ctx.clip();\n}\n\n/** Map Atelier blend mode names to Canvas 2D globalCompositeOperation values */\nfunction blendModeToComposite(mode: string): string {\n const map: Record<string, string> = {\n \"multiply\": \"multiply\",\n \"screen\": \"screen\",\n \"overlay\": \"overlay\",\n \"darken\": \"darken\",\n \"lighten\": \"lighten\",\n \"color-dodge\": \"color-dodge\",\n \"color-burn\": \"color-burn\",\n \"hard-light\": \"hard-light\",\n \"soft-light\": \"soft-light\",\n \"difference\": \"difference\",\n \"exclusion\": \"exclusion\",\n \"hue\": \"hue\",\n \"saturation\": \"saturation\",\n \"color\": \"color\",\n \"luminosity\": \"luminosity\",\n };\n return map[mode] ?? \"source-over\";\n}\n\n/**\n * Walk the parentId chain and apply each ancestor's transforms.\n * This makes child layers inherit parent position/rotation/scale.\n */\nfunction applyAncestorTransforms(\n ctx: RenderContext,\n layerId: string,\n effMap: Map<string, EffectiveLayer>,\n doc: AtelierDocument,\n): void {\n // Collect ancestor chain (excluding self)\n const chain: EffectiveLayer[] = [];\n const layer = doc.layers.find((l) => l.id === layerId);\n let parentId = layer?.parentId;\n const visited = new Set<string>();\n\n while (parentId && !visited.has(parentId)) {\n visited.add(parentId);\n const parentEff = effMap.get(parentId);\n if (!parentEff) break;\n chain.push(parentEff);\n parentId = parentEff.layer.parentId;\n }\n\n // Apply from root ancestor down to direct parent\n for (let i = chain.length - 1; i >= 0; i--) {\n const p = chain[i];\n ctx.translate(p.x, p.y);\n\n const ax = p.anchorX * p.width;\n const ay = p.anchorY * p.height;\n\n if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {\n ctx.translate(ax, ay);\n if (p.rotation !== 0) ctx.rotate((p.rotation * Math.PI) / 180);\n if (p.scaleX !== 1 || p.scaleY !== 1) ctx.scale(p.scaleX, p.scaleY);\n ctx.translate(-ax, -ay);\n }\n }\n}\n","/**\n * A loaded image entry that can be drawn via RenderContext.drawImage.\n */\nexport interface CachedImage {\n complete: boolean;\n image: unknown;\n}\n\n/**\n * Simple image cache for loading and caching images.\n * Browser-agnostic — the actual Image constructor is injected via createImage.\n * Triggers an onLoad callback when an image finishes loading so the\n * renderer can re-render the current frame.\n */\nexport class ImageCache {\n private cache = new Map<string, CachedImage>();\n private loading = new Set<string>();\n private onLoad?: () => void;\n private createImage?: (src: string, onLoad: () => void, onError: () => void) => unknown;\n\n constructor(opts?: {\n onLoad?: () => void;\n createImage?: (src: string, onLoad: () => void, onError: () => void) => unknown;\n }) {\n this.onLoad = opts?.onLoad;\n this.createImage = opts?.createImage;\n }\n\n get(src: string): unknown | null {\n const entry = this.cache.get(src);\n return entry?.complete ? entry.image : null;\n }\n\n load(src: string): void {\n if (this.cache.has(src) || this.loading.has(src)) return;\n if (!this.createImage) return;\n this.loading.add(src);\n const image = this.createImage(\n src,\n () => {\n this.cache.set(src, { complete: true, image });\n this.loading.delete(src);\n this.onLoad?.();\n },\n () => {\n this.loading.delete(src);\n },\n );\n }\n}\n","import type { AtelierDocument, ImageVisual, RefVisual } from \"@a-company/atelier-types\";\nimport { resolveFrame, type ResolvedFrame } from \"@a-company/atelier-core\";\nimport { buildEffectiveLayer, type EffectiveLayer, type DocumentResolver } from \"@a-company/atelier-canvas\";\nimport { buildTransform, buildStyleAttrs } from \"./svg-properties.js\";\nimport { renderShapeSVG } from \"./svg-shapes.js\";\nimport { renderTextSVG } from \"./svg-text.js\";\nimport { buildShadowFilter, buildTintFilter, resetFilterCounter } from \"./svg-filters.js\";\nimport { resetGradientCounter } from \"./svg-gradients.js\";\nimport { buildClipPathDef, resetClipCounter } from \"./svg-clip.js\";\nimport { escapeXml } from \"./svg-properties.js\";\n\nexport interface RenderSVGOptions {\n /** Include XML declaration (default: false) */\n xmlDeclaration?: boolean;\n /** Include viewBox attribute (default: true) */\n viewBox?: boolean;\n /** Indent size in spaces (default: 2) */\n indent?: number;\n /** Resolves ref layer src paths to loaded AtelierDocuments */\n documentResolver?: DocumentResolver;\n /** Maximum ref nesting depth (default: 4) */\n maxRefDepth?: number;\n}\n\n/**\n * Render a resolved frame as an SVG string.\n * If no resolved frame is provided, resolves the given state and frame.\n */\nexport function renderFrameSVG(\n doc: AtelierDocument,\n stateOrFrame: string | ResolvedFrame,\n frame?: number,\n opts?: RenderSVGOptions,\n): string {\n // Reset counters for deterministic IDs\n resetGradientCounter();\n resetFilterCounter();\n resetClipCounter();\n\n let resolved: ResolvedFrame;\n if (typeof stateOrFrame === \"string\") {\n resolved = resolveFrame(doc, stateOrFrame, frame ?? 0);\n } else {\n resolved = stateOrFrame;\n }\n\n const { width, height } = doc.canvas;\n const indent = opts?.indent ?? 2;\n const pad = \" \".repeat(indent);\n\n // Build effective layers\n const effLayers: EffectiveLayer[] = resolved.layers.map(rl =>\n buildEffectiveLayer(rl, width, height),\n );\n\n // Collect all defs and layer elements\n const allDefs: string[] = [];\n const layerElements: string[] = [];\n\n for (let i = 0; i < effLayers.length; i++) {\n const eff = effLayers[i];\n const layer = resolved.layers[i].layer;\n\n // Skip invisible or fully transparent\n if (!eff.visible) continue;\n if (eff.opacity <= 0) continue;\n\n // Resolve asset for images\n if (layer.visual.type === \"image\") {\n const iv = eff.visual as ImageVisual;\n if (!iv.src && iv.assetId && doc.assets?.[iv.assetId]) {\n (eff.visual as ImageVisual).src = doc.assets[iv.assetId].src;\n }\n }\n\n // Build transform\n const transform = buildTransform(eff);\n const styleAttrs = buildStyleAttrs(eff);\n\n // Build shadow filter\n const filterResult = buildShadowFilter(eff);\n if (filterResult) allDefs.push(filterResult.defs);\n\n // Build tint filter\n const tintResult = buildTintFilter(eff);\n if (tintResult) allDefs.push(tintResult.defs);\n\n // Build clip path\n let clipAttr = \"\";\n if (layer.clipPath) {\n const clipResult = buildClipPathDef(layer.clipPath, eff.width, eff.height);\n if (clipResult.defs) {\n allDefs.push(clipResult.defs);\n clipAttr = ` clip-path=\"${clipResult.clipRef}\"`;\n }\n }\n\n // Build group attributes\n const gAttrs: string[] = [];\n if (transform) gAttrs.push(`transform=\"${transform}\"`);\n if (styleAttrs) gAttrs.push(styleAttrs);\n // Apply combined or individual filters\n if (filterResult && tintResult) {\n // When both shadow and tint exist, we need a combined filter\n // For simplicity, apply shadow filter and tint separately via style\n gAttrs.push(`filter=\"${filterResult.filterRef}\"`);\n // Tint is a second filter — wrap content in nested group\n } else if (filterResult) {\n gAttrs.push(`filter=\"${filterResult.filterRef}\"`);\n } else if (tintResult) {\n gAttrs.push(`filter=\"${tintResult.filterRef}\"`);\n }\n if (clipAttr) gAttrs.push(clipAttr.trim());\n\n // Render visual content\n let content = \"\";\n let layerDefs = \"\";\n\n switch (layer.visual.type) {\n case \"shape\": {\n const result = renderShapeSVG(eff, eff.visual as import(\"@a-company/atelier-types\").ShapeVisual);\n content = result.elements;\n layerDefs = result.defs;\n break;\n }\n case \"text\":\n content = renderTextSVG(eff, eff.visual as import(\"@a-company/atelier-types\").TextVisual);\n break;\n case \"image\": {\n const iv = eff.visual as ImageVisual;\n if (iv.src) {\n if (iv.spritesheet) {\n // Spritesheet: compute source rect and use full sheet dimensions for inner image\n const { columns, rows, frameWidth, frameHeight, frameCount } = iv.spritesheet;\n const maxFrames = frameCount ?? (columns * rows);\n const idx = Math.max(0, Math.min(Math.floor(iv.frameIndex ?? 0), maxFrames - 1));\n const col = idx % columns;\n const row = Math.floor(idx / columns);\n const sx = col * frameWidth;\n const sy = row * frameHeight;\n const imgW = columns * frameWidth;\n const imgH = rows * frameHeight;\n content = `<svg viewBox=\"${sx} ${sy} ${frameWidth} ${frameHeight}\" width=\"${eff.width}\" height=\"${eff.height}\">` +\n `<image href=\"${escapeXml(iv.src)}\" width=\"${imgW}\" height=\"${imgH}\" />` +\n `</svg>`;\n } else if (iv.sourceRect) {\n // Manual sourceRect: viewBox crops from image coordinate space\n const sr = iv.sourceRect;\n content = `<svg viewBox=\"${sr.x} ${sr.y} ${sr.width} ${sr.height}\" width=\"${eff.width}\" height=\"${eff.height}\">` +\n `<image href=\"${escapeXml(iv.src)}\" width=\"${eff.width}\" height=\"${eff.height}\" />` +\n `</svg>`;\n } else {\n content = `<image href=\"${escapeXml(iv.src)}\" width=\"${eff.width}\" height=\"${eff.height}\" />`;\n }\n }\n break;\n }\n case \"group\":\n // Groups are structural — no visual content in SVG either\n break;\n case \"ref\": {\n const refVisual = eff.visual as RefVisual;\n const refContent = renderRefSVG(eff, refVisual, doc, opts);\n content = refContent;\n break;\n }\n }\n\n if (layerDefs) allDefs.push(layerDefs);\n\n if (content) {\n const gOpen = gAttrs.length > 0 ? `<g ${gAttrs.join(\" \")}>` : \"<g>\";\n layerElements.push(`${pad}${gOpen}${content}</g>`);\n }\n }\n\n // Build SVG\n const lines: string[] = [];\n\n if (opts?.xmlDeclaration) {\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n }\n\n const viewBox = opts?.viewBox !== false ? ` viewBox=\"0 0 ${width} ${height}\"` : \"\";\n const bg = doc.canvas.background;\n\n lines.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\"${viewBox}>`);\n\n // Defs section\n if (allDefs.length > 0) {\n lines.push(`${pad}<defs>`);\n for (const def of allDefs) {\n lines.push(`${pad}${pad}${def}`);\n }\n lines.push(`${pad}</defs>`);\n }\n\n // Background\n if (bg && bg !== \"transparent\") {\n lines.push(`${pad}<rect width=\"${width}\" height=\"${height}\" fill=\"${bg}\" />`);\n }\n\n // Layers\n lines.push(...layerElements);\n\n lines.push(\"</svg>\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a ref layer as SVG. Uses documentResolver to inline sub-doc content,\n * or falls back to a dashed placeholder rectangle.\n */\nfunction renderRefSVG(\n eff: EffectiveLayer,\n visual: RefVisual,\n _parentDoc: AtelierDocument,\n opts?: RenderSVGOptions,\n _depth?: number,\n _visitedRefs?: Set<string>,\n): string {\n const resolver = opts?.documentResolver;\n\n if (!resolver) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const depth = _depth ?? 0;\n const maxDepth = opts?.maxRefDepth ?? 4;\n if (depth >= maxDepth) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#c33\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#c33\" font-size=\"12\">MAX DEPTH</text>`;\n }\n\n const visitedRefs = _visitedRefs ?? new Set<string>();\n if (visitedRefs.has(visual.src)) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#c33\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#c33\" font-size=\"12\">CYCLE</text>`;\n }\n\n const subDoc = resolver(visual.src);\n if (!subDoc) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#999\" font-size=\"12\">NOT FOUND</text>`;\n }\n\n const stateNames = Object.keys(subDoc.states);\n if (stateNames.length === 0) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const stateName = visual.state ?? stateNames[0];\n const stateObj = subDoc.states[stateName];\n if (!stateObj) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const maxFrame = Math.max(0, stateObj.duration - 1);\n const frame = Math.min(visual.frame ?? 0, maxFrame);\n\n visitedRefs.add(visual.src);\n\n // Render sub-doc as nested <svg> with viewBox for scaling\n const subW = subDoc.canvas.width;\n const subH = subDoc.canvas.height;\n const resolved = resolveFrame(subDoc, stateName, frame);\n\n const subParts: string[] = [];\n for (const rl of resolved.layers) {\n const subEff = buildEffectiveLayer(rl, subW, subH);\n if (!subEff.visible || subEff.opacity <= 0) continue;\n\n // Resolve asset\n if (rl.layer.visual.type === \"image\") {\n const iv = subEff.visual as ImageVisual;\n if (!iv.src && iv.assetId && subDoc.assets?.[iv.assetId]) {\n iv.src = subDoc.assets[iv.assetId].src;\n }\n }\n\n const transform = buildTransform(subEff);\n const styleAttrs = buildStyleAttrs(subEff);\n const gAttrs: string[] = [];\n if (transform) gAttrs.push(`transform=\"${transform}\"`);\n if (styleAttrs) gAttrs.push(styleAttrs);\n\n let childContent = \"\";\n switch (rl.layer.visual.type) {\n case \"shape\": {\n const result = renderShapeSVG(subEff, subEff.visual as import(\"@a-company/atelier-types\").ShapeVisual);\n childContent = result.elements;\n break;\n }\n case \"text\":\n childContent = renderTextSVG(subEff, subEff.visual as import(\"@a-company/atelier-types\").TextVisual);\n break;\n case \"image\": {\n const iv = subEff.visual as ImageVisual;\n if (iv.src) {\n childContent = `<image href=\"${escapeXml(iv.src)}\" width=\"${subEff.width}\" height=\"${subEff.height}\" />`;\n }\n break;\n }\n case \"ref\": {\n const refV = subEff.visual as RefVisual;\n childContent = renderRefSVG(subEff, refV, subDoc, opts, depth + 1, visitedRefs);\n break;\n }\n }\n\n if (childContent) {\n const gOpen = gAttrs.length > 0 ? `<g ${gAttrs.join(\" \")}>` : \"<g>\";\n subParts.push(`${gOpen}${childContent}</g>`);\n }\n }\n\n visitedRefs.delete(visual.src);\n\n return `<svg x=\"0\" y=\"0\" width=\"${eff.width}\" height=\"${eff.height}\" viewBox=\"0 0 ${subW} ${subH}\">${subParts.join(\"\")}</svg>`;\n}\n","import type { EffectiveLayer } from \"@a-company/atelier-canvas\";\n\n/** Build SVG transform attribute from effective layer values */\nexport function buildTransform(eff: EffectiveLayer): string {\n const parts: string[] = [];\n\n // Translate to position\n if (eff.x !== 0 || eff.y !== 0) {\n parts.push(`translate(${eff.x}, ${eff.y})`);\n }\n\n const totalRotation = eff.rotation + eff.motionPathAngle;\n if (totalRotation !== 0 || eff.scaleX !== 1 || eff.scaleY !== 1) {\n const ax = eff.anchorX * eff.width;\n const ay = eff.anchorY * eff.height;\n\n // Move to anchor, apply rotation/scale, move back\n if (ax !== 0 || ay !== 0) {\n parts.push(`translate(${ax}, ${ay})`);\n }\n if (totalRotation !== 0) {\n parts.push(`rotate(${totalRotation})`);\n }\n if (eff.scaleX !== 1 || eff.scaleY !== 1) {\n parts.push(`scale(${eff.scaleX}, ${eff.scaleY})`);\n }\n if (ax !== 0 || ay !== 0) {\n parts.push(`translate(${-ax}, ${-ay})`);\n }\n }\n\n return parts.length > 0 ? parts.join(\" \") : \"\";\n}\n\n/** Build common SVG style attributes */\nexport function buildStyleAttrs(eff: EffectiveLayer): string {\n const attrs: string[] = [];\n\n if (eff.opacity < 1) {\n attrs.push(`opacity=\"${eff.opacity}\"`);\n }\n\n if (eff.blendMode !== \"normal\") {\n attrs.push(`style=\"mix-blend-mode: ${eff.blendMode}\"`);\n }\n\n return attrs.join(\" \");\n}\n\n/** Escape XML special characters */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { Fill, LinearGradientFill, RadialGradientFill, Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\n\nlet gradientIdCounter = 0;\n\nexport function resetGradientCounter(): void {\n gradientIdCounter = 0;\n}\n\n/** Convert an Atelier Color to a CSS color string */\nexport function colorToCSS(color: Color): string {\n if (typeof color === \"string\") return color;\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return `rgba(${Math.round(c.r)}, ${Math.round(c.g)}, ${Math.round(c.b)}, ${c.a})`;\n }\n if (\"h\" in color) {\n const c = color as HSLAColor;\n return `hsla(${c.h}, ${c.s}%, ${c.l}%, ${c.a})`;\n }\n return \"#000000\";\n}\n\n/** Generate SVG gradient defs and return the fill reference */\nexport function buildGradientDef(fill: Fill, width: number, height: number): { defs: string; fillRef: string } {\n if (fill.type === \"solid\") {\n return { defs: \"\", fillRef: colorToCSS(fill.color) };\n }\n\n if (fill.type === \"linear-gradient\") {\n return buildLinearGradient(fill, width, height);\n }\n\n if (fill.type === \"radial-gradient\") {\n return buildRadialGradient(fill, width, height);\n }\n\n return { defs: \"\", fillRef: \"none\" };\n}\n\nfunction buildLinearGradient(fill: LinearGradientFill, _width: number, _height: number): { defs: string; fillRef: string } {\n const id = `grad-${++gradientIdCounter}`;\n const rad = (fill.angle * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n // Map angle to x1,y1,x2,y2 (0-1 percentages)\n const x1 = 0.5 - cos * 0.5;\n const y1 = 0.5 - sin * 0.5;\n const x2 = 0.5 + cos * 0.5;\n const y2 = 0.5 + sin * 0.5;\n\n const stops = fill.stops.map(s =>\n `<stop offset=\"${s.offset}\" stop-color=\"${colorToCSS(s.color)}\" />`\n ).join(\"\");\n\n const def = `<linearGradient id=\"${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\">${stops}</linearGradient>`;\n return { defs: def, fillRef: `url(#${id})` };\n}\n\nfunction buildRadialGradient(fill: RadialGradientFill, width: number, height: number): { defs: string; fillRef: string } {\n const id = `grad-${++gradientIdCounter}`;\n\n const cx = typeof fill.center.x === \"number\" ? fill.center.x : (parseFloat(fill.center.x) / 100) * width;\n const cy = typeof fill.center.y === \"number\" ? fill.center.y : (parseFloat(fill.center.y) / 100) * height;\n const r = typeof fill.radius === \"number\" ? fill.radius : (parseFloat(fill.radius) / 100) * Math.max(width, height);\n\n const stops = fill.stops.map(s =>\n `<stop offset=\"${s.offset}\" stop-color=\"${colorToCSS(s.color)}\" />`\n ).join(\"\");\n\n const def = `<radialGradient id=\"${id}\" cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" gradientUnits=\"userSpaceOnUse\">${stops}</radialGradient>`;\n return { defs: def, fillRef: `url(#${id})` };\n}\n","import type { ShapeVisual, Shape, RectShape, PathShape, Stroke } from \"@a-company/atelier-types\";\nimport type { EffectiveLayer } from \"@a-company/atelier-canvas\";\nimport { buildGradientDef, colorToCSS } from \"./svg-gradients.js\";\n\n/** Render a shape visual as SVG elements */\nexport function renderShapeSVG(\n eff: EffectiveLayer,\n visual: ShapeVisual,\n): { elements: string; defs: string } {\n const { shape } = visual;\n const defs: string[] = [];\n\n let fillAttr = \"none\";\n if (visual.fill) {\n const gradResult = buildGradientDef(visual.fill, eff.width, eff.height);\n if (gradResult.defs) defs.push(gradResult.defs);\n fillAttr = gradResult.fillRef;\n }\n\n let strokeAttrs = \"\";\n if (visual.stroke) {\n strokeAttrs = buildStrokeAttrs(visual.stroke);\n }\n\n const element = buildShapeElement(shape, eff.width, eff.height, fillAttr, strokeAttrs);\n return { elements: element, defs: defs.join(\"\") };\n}\n\nfunction buildShapeElement(\n shape: Shape,\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n switch (shape.type) {\n case \"rect\":\n return buildRectElement(shape, width, height, fill, strokeAttrs);\n case \"ellipse\":\n return buildEllipseElement(width, height, fill, strokeAttrs);\n case \"path\":\n return buildPathElement(shape, fill, strokeAttrs);\n }\n}\n\nfunction buildRectElement(\n shape: RectShape,\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n let rx = \"\";\n if (shape.cornerRadius) {\n const r = typeof shape.cornerRadius === \"number\" ? shape.cornerRadius : shape.cornerRadius[0];\n rx = ` rx=\"${r}\" ry=\"${r}\"`;\n }\n return `<rect width=\"${width}\" height=\"${height}\" fill=\"${fill}\"${rx}${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildEllipseElement(\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n const cx = width / 2;\n const cy = height / 2;\n const rx = width / 2;\n const ry = height / 2;\n return `<ellipse cx=\"${cx}\" cy=\"${cy}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"${fill}\"${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildPathElement(\n shape: PathShape,\n fill: string,\n strokeAttrs: string,\n): string {\n if (shape.points.length < 2) return \"\";\n\n const d: string[] = [];\n d.push(`M ${shape.points[0].x} ${shape.points[0].y}`);\n\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n\n if (prev.out && curr.in) {\n d.push(`C ${prev.x + prev.out.x} ${prev.y + prev.out.y} ${curr.x + curr.in.x} ${curr.y + curr.in.y} ${curr.x} ${curr.y}`);\n } else {\n d.push(`L ${curr.x} ${curr.y}`);\n }\n }\n\n if (shape.closed) d.push(\"Z\");\n\n return `<path d=\"${d.join(\" \")}\" fill=\"${fill}\"${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildStrokeAttrs(stroke: Stroke): string {\n const parts: string[] = [];\n parts.push(`stroke=\"${colorToCSS(stroke.color)}\"`);\n parts.push(`stroke-width=\"${stroke.width}\"`);\n\n if (stroke.lineCap) parts.push(`stroke-linecap=\"${stroke.lineCap}\"`);\n if (stroke.lineJoin) parts.push(`stroke-linejoin=\"${stroke.lineJoin}\"`);\n if (stroke.dash) parts.push(`stroke-dasharray=\"${stroke.dash.join(\" \")}\"`);\n\n return parts.join(\" \");\n}\n","import type { TextVisual } from \"@a-company/atelier-types\";\nimport type { EffectiveLayer } from \"@a-company/atelier-canvas\";\nimport { colorToCSS } from \"./svg-gradients.js\";\nimport { escapeXml } from \"./svg-properties.js\";\n\n/** Render a text visual as SVG elements */\nexport function renderTextSVG(eff: EffectiveLayer, visual: TextVisual): string {\n const { style } = visual;\n\n const attrs: string[] = [];\n\n // Font attributes\n attrs.push(`font-family=\"${escapeXml(style.fontFamily)}\"`);\n attrs.push(`font-size=\"${style.fontSize}\"`);\n\n if (style.fontWeight && style.fontWeight !== \"normal\") {\n attrs.push(`font-weight=\"${style.fontWeight}\"`);\n }\n if (style.fontStyle && style.fontStyle !== \"normal\") {\n attrs.push(`font-style=\"${style.fontStyle}\"`);\n }\n\n // Color\n attrs.push(`fill=\"${colorToCSS(style.color)}\"`);\n\n // Text alignment\n const align = style.textAlign ?? \"left\";\n let textAnchor = \"start\";\n let x = 0;\n if (align === \"center\") {\n textAnchor = \"middle\";\n x = eff.width / 2;\n } else if (align === \"right\") {\n textAnchor = \"end\";\n x = eff.width;\n }\n attrs.push(`text-anchor=\"${textAnchor}\"`);\n\n // Letter spacing\n if (style.letterSpacing) {\n attrs.push(`letter-spacing=\"${style.letterSpacing}\"`);\n }\n\n // SVG text baseline: use dominant-baseline for top alignment\n attrs.push(`dominant-baseline=\"hanging\"`);\n\n return `<text x=\"${x}\" y=\"0\" ${attrs.join(\" \")}>${escapeXml(visual.content)}</text>`;\n}\n","import type { EffectiveLayer } from \"@a-company/atelier-canvas\";\n\nlet filterIdCounter = 0;\n\nexport function resetFilterCounter(): void {\n filterIdCounter = 0;\n}\n\n/** Build SVG filter definition for shadow effects */\nexport function buildShadowFilter(eff: EffectiveLayer): { defs: string; filterRef: string } | null {\n if (!eff.shadow) return null;\n\n const id = `filter-${++filterIdCounter}`;\n const { color, blur, offsetX, offsetY } = eff.shadow;\n\n const def = [\n `<filter id=\"${id}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">`,\n `<feDropShadow dx=\"${offsetX}\" dy=\"${offsetY}\" stdDeviation=\"${blur / 2}\" flood-color=\"${color}\" />`,\n `</filter>`,\n ].join(\"\");\n\n return { defs: def, filterRef: `url(#${id})` };\n}\n\n/** Build SVG filter definition for tint effect (feFlood + feBlend multiply) */\nexport function buildTintFilter(eff: EffectiveLayer): { defs: string; filterRef: string } | null {\n if (!eff.tint || eff.tint.amount <= 0) return null;\n\n const id = `filter-${++filterIdCounter}`;\n const { color, amount } = eff.tint;\n\n const def = [\n `<filter id=\"${id}\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">`,\n `<feFlood flood-color=\"${color}\" flood-opacity=\"${amount}\" result=\"tint\" />`,\n `<feBlend in=\"SourceGraphic\" in2=\"tint\" mode=\"multiply\" />`,\n `</filter>`,\n ].join(\"\");\n\n return { defs: def, filterRef: `url(#${id})` };\n}\n","import type { Shape } from \"@a-company/atelier-types\";\n\nlet clipIdCounter = 0;\n\nexport function resetClipCounter(): void {\n clipIdCounter = 0;\n}\n\n/** Build SVG clipPath definition */\nexport function buildClipPathDef(shape: Shape, width: number, height: number): { defs: string; clipRef: string } {\n const id = `clip-${++clipIdCounter}`;\n let pathContent = \"\";\n\n switch (shape.type) {\n case \"rect\":\n if (shape.cornerRadius) {\n const r = typeof shape.cornerRadius === \"number\" ? shape.cornerRadius : shape.cornerRadius[0];\n pathContent = `<rect width=\"${width}\" height=\"${height}\" rx=\"${r}\" ry=\"${r}\" />`;\n } else {\n pathContent = `<rect width=\"${width}\" height=\"${height}\" />`;\n }\n break;\n case \"ellipse\":\n pathContent = `<ellipse cx=\"${width / 2}\" cy=\"${height / 2}\" rx=\"${width / 2}\" ry=\"${height / 2}\" />`;\n break;\n case \"path\": {\n if (shape.points.length < 2) return { defs: \"\", clipRef: \"\" };\n const d: string[] = [];\n d.push(`M ${shape.points[0].x} ${shape.points[0].y}`);\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n if (prev.out && curr.in) {\n d.push(`C ${prev.x + prev.out.x} ${prev.y + prev.out.y} ${curr.x + curr.in.x} ${curr.y + curr.in.y} ${curr.x} ${curr.y}`);\n } else {\n d.push(`L ${curr.x} ${curr.y}`);\n }\n }\n if (shape.closed) d.push(\"Z\");\n pathContent = `<path d=\"${d.join(\" \")}\" />`;\n break;\n }\n }\n\n const def = `<clipPath id=\"${id}\">${pathContent}</clipPath>`;\n return { defs: def, clipRef: `url(#${id})` };\n}\n","import type { Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\n\n/** Convert an Atelier color to Lottie [r, g, b, a] format (0–1 range) */\nexport function colorToLottie(color: Color): number[] {\n if (typeof color === \"string\") {\n return hexToLottie(color);\n }\n\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return [c.r / 255, c.g / 255, c.b / 255, c.a];\n }\n\n if (\"h\" in color) {\n const c = color as HSLAColor;\n const rgb = hslToRgb(c.h, c.s, c.l);\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, c.a];\n }\n\n return [0, 0, 0, 1];\n}\n\nfunction hexToLottie(hex: string): number[] {\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3 || clean.length === 4) {\n const r = parseInt(clean[0] + clean[0], 16) / 255;\n const g = parseInt(clean[1] + clean[1], 16) / 255;\n const b = parseInt(clean[2] + clean[2], 16) / 255;\n const a = clean.length === 4 ? parseInt(clean[3] + clean[3], 16) / 255 : 1;\n return [r, g, b, a];\n }\n const r = parseInt(clean.slice(0, 2), 16) / 255;\n const g = parseInt(clean.slice(2, 4), 16) / 255;\n const b = parseInt(clean.slice(4, 6), 16) / 255;\n const a = clean.length === 8 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n s = s / 100;\n l = l / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n };\n return [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n}\n","import type { ShapeVisual, Fill, Stroke } from \"@a-company/atelier-types\";\nimport type { LottieShapeItem } from \"./lottie-types.js\";\nimport { colorToLottie } from \"./map-colors.js\";\n\n/** Map an Atelier shape visual to Lottie shape items */\nexport function mapShapeVisual(\n visual: ShapeVisual,\n width: number,\n height: number,\n): LottieShapeItem[] {\n const items: LottieShapeItem[] = [];\n\n // Shape geometry\n switch (visual.shape.type) {\n case \"rect\":\n items.push({\n ty: \"rc\",\n nm: \"Rectangle\",\n d: 1,\n s: { a: 0, k: [width, height] },\n p: { a: 0, k: [width / 2, height / 2] },\n r: { a: 0, k: typeof visual.shape.cornerRadius === \"number\" ? visual.shape.cornerRadius : 0 },\n });\n break;\n case \"ellipse\":\n items.push({\n ty: \"el\",\n nm: \"Ellipse\",\n d: 1,\n s: { a: 0, k: [width, height] },\n p: { a: 0, k: [width / 2, height / 2] },\n });\n break;\n case \"path\": {\n const vertices = visual.shape.points.map(p => [p.x, p.y]);\n const inTangents = visual.shape.points.map(p => p.in ? [p.in.x, p.in.y] : [0, 0]);\n const outTangents = visual.shape.points.map(p => p.out ? [p.out.x, p.out.y] : [0, 0]);\n items.push({\n ty: \"sh\",\n nm: \"Path\",\n ks: {\n a: 0,\n k: {\n c: visual.shape.closed ?? false,\n v: vertices,\n i: inTangents,\n o: outTangents,\n },\n },\n });\n break;\n }\n }\n\n // Fill\n if (visual.fill) {\n items.push(mapFill(visual.fill, width, height));\n }\n\n // Stroke\n if (visual.stroke) {\n items.push(mapStroke(visual.stroke));\n }\n\n return items;\n}\n\nfunction mapFill(fill: Fill, _width: number, _height: number): LottieShapeItem {\n if (fill.type === \"solid\") {\n const color = colorToLottie(fill.color);\n return {\n ty: \"fl\",\n nm: \"Fill\",\n c: { a: 0, k: color.slice(0, 3) },\n o: { a: 0, k: (color[3] ?? 1) * 100 },\n r: 1,\n };\n }\n\n if (fill.type === \"linear-gradient\") {\n const stops: number[] = [];\n for (const stop of fill.stops) {\n const c = colorToLottie(stop.color);\n stops.push(stop.offset, c[0], c[1], c[2]);\n }\n return {\n ty: \"gf\",\n nm: \"Gradient Fill\",\n t: 1, // linear\n s: { a: 0, k: [0, 0] },\n e: { a: 0, k: [100, 0] },\n g: { p: fill.stops.length, k: { a: 0, k: stops } },\n r: 1,\n o: { a: 0, k: 100 },\n };\n }\n\n if (fill.type === \"radial-gradient\") {\n const stops: number[] = [];\n for (const stop of fill.stops) {\n const c = colorToLottie(stop.color);\n stops.push(stop.offset, c[0], c[1], c[2]);\n }\n return {\n ty: \"gf\",\n nm: \"Gradient Fill\",\n t: 2, // radial\n s: { a: 0, k: [50, 50] },\n e: { a: 0, k: [100, 50] },\n g: { p: fill.stops.length, k: { a: 0, k: stops } },\n r: 1,\n o: { a: 0, k: 100 },\n };\n }\n\n return { ty: \"fl\", nm: \"Fill\", c: { a: 0, k: [0, 0, 0] }, o: { a: 0, k: 100 }, r: 1 };\n}\n\nfunction mapStroke(stroke: Stroke): LottieShapeItem {\n const color = colorToLottie(stroke.color);\n return {\n ty: \"st\",\n nm: \"Stroke\",\n c: { a: 0, k: color.slice(0, 3) },\n o: { a: 0, k: (color[3] ?? 1) * 100 },\n w: { a: 0, k: stroke.width },\n lc: stroke.lineCap === \"round\" ? 2 : stroke.lineCap === \"square\" ? 3 : 1,\n lj: stroke.lineJoin === \"round\" ? 2 : stroke.lineJoin === \"bevel\" ? 3 : 1,\n };\n}\n","import type { Easing } from \"@a-company/atelier-types\";\n\nexport interface LottieEasing {\n i: { x: number[]; y: number[] };\n o: { x: number[]; y: number[] };\n}\n\n/** Map an Atelier easing to Lottie bezier easing curves */\nexport function mapEasing(easing: Easing | undefined): LottieEasing | { h: 1 } {\n if (!easing) return linearEasing();\n\n if (typeof easing === \"string\") {\n switch (easing) {\n case \"ease-in\":\n return bezierEasing(0.42, 0, 1, 1);\n case \"ease-out\":\n return bezierEasing(0, 0, 0.58, 1);\n case \"ease-in-out\":\n return bezierEasing(0.42, 0, 0.58, 1);\n default:\n return linearEasing();\n }\n }\n\n switch (easing.type) {\n case \"linear\":\n return linearEasing();\n case \"cubic-bezier\":\n return bezierEasing(easing.x1, easing.y1, easing.x2, easing.y2);\n case \"spring\":\n // Approximate spring as a cubic-bezier (lossy)\n return bezierEasing(0.25, 0.1, 0.25, 1);\n case \"step\":\n // Steps map to hold keyframes\n return { h: 1 };\n default:\n return linearEasing();\n }\n}\n\nfunction linearEasing(): LottieEasing {\n return {\n i: { x: [0.833], y: [0.833] },\n o: { x: [0.167], y: [0.167] },\n };\n}\n\nfunction bezierEasing(x1: number, y1: number, x2: number, y2: number): LottieEasing {\n return {\n i: { x: [x2], y: [y2] },\n o: { x: [x1], y: [y1] },\n };\n}\n\n/** Check if an easing is lossy (spring/step → approximated) */\nexport function isLossyEasing(easing: Easing | undefined): string | null {\n if (!easing || typeof easing === \"string\") return null;\n if (easing.type === \"spring\") return \"Spring easing approximated as cubic-bezier\";\n if (easing.type === \"step\") return \"Step easing mapped to hold keyframes\";\n return null;\n}\n","import type { Delta, AnimatableProperty } from \"@a-company/atelier-types\";\nimport type { LottieAnimatedValue, LottieAnimatedMultiValue, LottieKeyframe, LottieMultiKeyframe } from \"./lottie-types.js\";\nimport { mapEasing, isLossyEasing } from \"./map-easing.js\";\n\n/** Map deltas for a single layer+property to Lottie animated value */\nexport function mapDeltasToAnimated(\n deltas: Delta[],\n property: AnimatableProperty,\n warnings: string[],\n): LottieAnimatedValue {\n if (deltas.length === 0) {\n return { a: 0, k: 0 };\n }\n\n // Check for lossy easings\n for (const d of deltas) {\n const lossyMsg = isLossyEasing(d.easing);\n if (lossyMsg) warnings.push(`${property}: ${lossyMsg}`);\n }\n\n // If expressions, warn and use static\n for (const d of deltas) {\n if (isExpression(d.from) || isExpression(d.to)) {\n warnings.push(`${property}: Expression values not supported in Lottie, using static values`);\n return { a: 0, k: typeof d.from === \"number\" ? d.from : 0 };\n }\n }\n\n // Single delta — simple animated value\n if (deltas.length === 1) {\n const d = deltas[0];\n const fromVal = resolveValue(d.from, property);\n const toVal = resolveValue(d.to, property);\n\n if (fromVal === toVal) {\n return { a: 0, k: fromVal };\n }\n\n const easing = mapEasing(d.easing);\n const kfs: LottieKeyframe[] = [];\n\n if (\"h\" in easing) {\n kfs.push({ t: d.range[0], s: [fromVal], h: 1 });\n kfs.push({ t: d.range[1], s: [toVal] });\n } else {\n kfs.push({ t: d.range[0], s: [fromVal], e: [toVal], i: easing.i, o: easing.o });\n kfs.push({ t: d.range[1], s: [toVal] });\n }\n\n return { a: 1, k: kfs };\n }\n\n // Multiple deltas — chain keyframes\n const sorted = [...deltas].sort((a, b) => a.range[0] - b.range[0]);\n const kfs: LottieKeyframe[] = [];\n\n for (const d of sorted) {\n const fromVal = resolveValue(d.from, property);\n const toVal = resolveValue(d.to, property);\n const easing = mapEasing(d.easing);\n\n if (\"h\" in easing) {\n kfs.push({ t: d.range[0], s: [fromVal], h: 1 });\n } else {\n kfs.push({ t: d.range[0], s: [fromVal], e: [toVal], i: easing.i, o: easing.o });\n }\n }\n\n // Final keyframe\n const last = sorted[sorted.length - 1];\n kfs.push({ t: last.range[1], s: [resolveValue(last.to, property)] });\n\n return { a: 1, k: kfs };\n}\n\n/** Map position deltas (frame.x, frame.y) to Lottie multi-dimensional animated value */\nexport function mapPositionDeltas(\n xDeltas: Delta[],\n yDeltas: Delta[],\n baseX: number,\n baseY: number,\n warnings: string[],\n): LottieAnimatedMultiValue {\n const hasXAnim = xDeltas.length > 0;\n const hasYAnim = yDeltas.length > 0;\n\n if (!hasXAnim && !hasYAnim) {\n return { a: 0, k: [baseX, baseY, 0] };\n }\n\n // Collect all unique frame points\n const frames = new Set<number>();\n for (const d of [...xDeltas, ...yDeltas]) {\n frames.add(d.range[0]);\n frames.add(d.range[1]);\n }\n const sortedFrames = [...frames].sort((a, b) => a - b);\n\n if (sortedFrames.length < 2) {\n return { a: 0, k: [baseX, baseY, 0] };\n }\n\n // Build multi-dimensional keyframes\n const kfs: LottieMultiKeyframe[] = [];\n for (let i = 0; i < sortedFrames.length; i++) {\n const f = sortedFrames[i];\n const x = resolveAtFrame(xDeltas, f, baseX);\n const y = resolveAtFrame(yDeltas, f, baseY);\n\n if (i < sortedFrames.length - 1) {\n const nextF = sortedFrames[i + 1];\n const nextX = resolveAtFrame(xDeltas, nextF, baseX);\n const nextY = resolveAtFrame(yDeltas, nextF, baseY);\n\n // Find the active delta's easing\n const activeX = xDeltas.find(d => d.range[0] <= f && d.range[1] >= f);\n const activeY = yDeltas.find(d => d.range[0] <= f && d.range[1] >= f);\n const easing = mapEasing(activeX?.easing ?? activeY?.easing);\n\n if (\"h\" in easing) {\n kfs.push({ t: f, s: [x, y, 0], h: 1 });\n } else {\n kfs.push({ t: f, s: [x, y, 0], e: [nextX, nextY, 0], i: easing.i, o: easing.o });\n }\n } else {\n kfs.push({ t: f, s: [x, y, 0] });\n }\n }\n\n // Check for lossy warnings\n for (const d of [...xDeltas, ...yDeltas]) {\n const msg = isLossyEasing(d.easing);\n if (msg) warnings.push(`position: ${msg}`);\n }\n\n return { a: 1, k: kfs };\n}\n\nfunction resolveAtFrame(deltas: Delta[], frame: number, base: number): number {\n for (const d of deltas) {\n if (frame >= d.range[0] && frame <= d.range[1]) {\n const from = typeof d.from === \"number\" ? d.from : base;\n const to = typeof d.to === \"number\" ? d.to : base;\n const progress = d.range[0] === d.range[1] ? 1 : (frame - d.range[0]) / (d.range[1] - d.range[0]);\n return from + (to - from) * progress;\n }\n }\n // Hold last completed value\n let lastCompleted: Delta | undefined;\n for (const d of deltas) {\n if (frame > d.range[1]) {\n if (!lastCompleted || d.range[1] > lastCompleted.range[1]) {\n lastCompleted = d;\n }\n }\n }\n if (lastCompleted) return typeof lastCompleted.to === \"number\" ? lastCompleted.to : base;\n return base;\n}\n\nfunction resolveValue(val: unknown, _property: AnimatableProperty): number {\n if (typeof val === \"number\") return val;\n if (typeof val === \"string\" && val.startsWith(\"#\")) {\n // Color — for Lottie, colors are handled separately\n return 0;\n }\n return 0;\n}\n\nfunction isExpression(val: unknown): boolean {\n return typeof val === \"object\" && val !== null && \"expr\" in val;\n}\n","import type { AtelierDocument, Layer, Delta, State, UnitValue } from \"@a-company/atelier-types\";\nimport type { LottieLayer, LottieTransform, LottieTextData } from \"./lottie-types.js\";\nimport { mapShapeVisual } from \"./map-shapes.js\";\nimport { mapDeltasToAnimated, mapPositionDeltas } from \"./map-keyframes.js\";\nimport { colorToLottie } from \"./map-colors.js\";\n\n/** Resolve a UnitValue to a plain number (percentages treated as 0 for Lottie) */\nfunction toNum(v: UnitValue): number {\n return typeof v === \"number\" ? v : 0;\n}\n\n/** Map all layers in a document+state to Lottie layers */\nexport function mapLayers(\n doc: AtelierDocument,\n state: State,\n warnings: string[],\n): LottieLayer[] {\n const layerIndexMap = new Map<string, number>();\n doc.layers.forEach((l, i) => layerIndexMap.set(l.id, i));\n\n return doc.layers.map((layer, index) => {\n const deltas = state.deltas.filter(d => d.layer === layer.id);\n return mapLayer(layer, index, deltas, layerIndexMap, doc, warnings);\n });\n}\n\nfunction mapLayer(\n layer: Layer,\n index: number,\n deltas: Delta[],\n layerIndexMap: Map<string, number>,\n doc: AtelierDocument,\n warnings: string[],\n): LottieLayer {\n const duration = getMaxFrame(deltas, doc);\n\n const base: LottieLayer = {\n ty: getLayerType(layer),\n nm: layer.id,\n ind: index,\n ip: 0,\n op: duration,\n st: 0,\n ks: buildTransform(layer, deltas, warnings),\n };\n\n // Parent\n if (layer.parentId) {\n const parentIdx = layerIndexMap.get(layer.parentId);\n if (parentIdx !== undefined) {\n base.parent = parentIdx;\n }\n }\n\n // Blend mode\n if (layer.blendMode) {\n base.bm = mapBlendMode(layer.blendMode);\n }\n\n // Shape layer\n if (layer.visual.type === \"shape\") {\n base.shapes = mapShapeVisual(layer.visual, toNum(layer.bounds.width), toNum(layer.bounds.height));\n }\n\n // Text layer\n if (layer.visual.type === \"text\") {\n const color = colorToLottie(layer.visual.style.color);\n base.t = {\n d: {\n k: [{\n s: {\n s: layer.visual.style.fontSize,\n f: layer.visual.style.fontFamily,\n t: layer.visual.content,\n fc: color.slice(0, 3),\n j: layer.visual.style.textAlign === \"center\" ? 1 :\n layer.visual.style.textAlign === \"right\" ? 2 : 0,\n },\n t: 0,\n }],\n },\n } as LottieTextData;\n }\n\n // Image layer\n if (layer.visual.type === \"image\") {\n base.refId = layer.visual.assetId;\n base.w = toNum(layer.bounds.width);\n base.h = toNum(layer.bounds.height);\n\n if (layer.visual.spritesheet) {\n warnings.push(`Layer \"${layer.id}\": Spritesheet animation not supported in Lottie export`);\n }\n if (layer.visual.sourceRect) {\n warnings.push(`Layer \"${layer.id}\": sourceRect cropping not supported in Lottie export`);\n }\n }\n\n // Tint warning\n if (layer.tint && layer.tint.amount > 0) {\n warnings.push(`Layer \"${layer.id}\": Tint effect not supported in Lottie export`);\n }\n\n return base;\n}\n\nfunction getLayerType(layer: Layer): number {\n switch (layer.visual.type) {\n case \"shape\": return 4;\n case \"text\": return 5;\n case \"image\": return 2;\n case \"group\": return 3; // null layer\n case \"ref\": return 0; // precomp\n default: return 4;\n }\n}\n\nfunction buildTransform(\n layer: Layer,\n deltas: Delta[],\n warnings: string[],\n): LottieTransform {\n // Group deltas by property\n const byProp = new Map<string, Delta[]>();\n for (const d of deltas) {\n if (!byProp.has(d.property)) byProp.set(d.property, []);\n byProp.get(d.property)!.push(d);\n }\n\n const xDeltas = byProp.get(\"frame.x\") ?? [];\n const yDeltas = byProp.get(\"frame.y\") ?? [];\n const opacityDeltas = byProp.get(\"opacity\") ?? [];\n const rotationDeltas = byProp.get(\"rotation\") ?? [];\n const scaleXDeltas = byProp.get(\"scale.x\") ?? [];\n const scaleYDeltas = byProp.get(\"scale.y\") ?? [];\n\n // Position\n const position = mapPositionDeltas(\n xDeltas, yDeltas,\n typeof layer.frame.x === \"number\" ? layer.frame.x : 0,\n typeof layer.frame.y === \"number\" ? layer.frame.y : 0,\n warnings,\n );\n\n // Opacity (Lottie uses 0–100)\n let opacity;\n if (opacityDeltas.length > 0) {\n const raw = mapDeltasToAnimated(opacityDeltas, \"opacity\", warnings);\n // Scale 0-1 to 0-100\n if (raw.a === 0) {\n opacity = { a: 0 as const, k: (raw.k as number) * 100 };\n } else {\n const kfs = (raw.k as Array<{ t: number; s: [number]; e?: [number]; [key: string]: unknown }>).map(kf => ({\n ...kf,\n s: [kf.s[0] * 100] as [number],\n e: kf.e ? [kf.e[0] * 100] as [number] : undefined,\n }));\n opacity = { a: 1 as const, k: kfs };\n }\n } else {\n opacity = { a: 0 as const, k: (layer.opacity ?? 1) * 100 };\n }\n\n // Rotation\n const rotation = rotationDeltas.length > 0\n ? mapDeltasToAnimated(rotationDeltas, \"rotation\", warnings)\n : { a: 0 as const, k: layer.rotation ?? 0 };\n\n // Scale (Lottie uses 0–100)\n const baseScaleX = (layer.scale?.x ?? 1) * 100;\n const baseScaleY = (layer.scale?.y ?? 1) * 100;\n let scale;\n if (scaleXDeltas.length > 0 || scaleYDeltas.length > 0) {\n // Simplified: use x deltas for now\n scale = { a: 0 as const, k: [baseScaleX, baseScaleY, 100] };\n if (scaleXDeltas.length > 0 || scaleYDeltas.length > 0) {\n warnings.push(\"Scale animation partially mapped to Lottie\");\n }\n } else {\n scale = { a: 0 as const, k: [baseScaleX, baseScaleY, 100] };\n }\n\n // Anchor point\n const ax = (layer.anchorPoint?.x ?? 0) * toNum(layer.bounds.width);\n const ay = (layer.anchorPoint?.y ?? 0) * toNum(layer.bounds.height);\n\n return {\n o: opacity,\n r: rotation,\n p: position,\n a: { a: 0, k: [ax, ay, 0] },\n s: scale,\n };\n}\n\nfunction getMaxFrame(deltas: Delta[], doc: AtelierDocument): number {\n let max = 0;\n for (const state of Object.values(doc.states)) {\n if (state.duration > max) max = state.duration;\n }\n for (const d of deltas) {\n if (d.range[1] > max) max = d.range[1];\n }\n return max || 60;\n}\n\nfunction mapBlendMode(mode: string): number {\n const map: Record<string, number> = {\n normal: 0, multiply: 1, screen: 2, overlay: 3,\n darken: 4, lighten: 5, \"color-dodge\": 6, \"color-burn\": 7,\n \"hard-light\": 8, \"soft-light\": 9, difference: 10, exclusion: 11,\n hue: 12, saturation: 13, color: 14, luminosity: 15,\n };\n return map[mode] ?? 0;\n}\n","import type { AtelierDocument, State } from \"@a-company/atelier-types\";\n\n/** Check for unsupported features and collect warnings */\nexport function collectUnsupportedWarnings(doc: AtelierDocument, state: State): string[] {\n const warnings: string[] = [];\n\n // Audio not supported\n if (state.audio) {\n warnings.push(\"Audio tracks are not supported in Lottie format and will be dropped\");\n }\n\n // Expressions not supported\n for (const delta of state.deltas) {\n if (isExpression(delta.from) || isExpression(delta.to)) {\n warnings.push(`Expression values on \"${delta.layer}.${delta.property}\" not supported in Lottie`);\n }\n }\n\n // Shadow not supported in base Lottie\n for (const layer of doc.layers) {\n if (layer.shadow) {\n warnings.push(`Shadow on layer \"${layer.id}\" is not supported in base Lottie format`);\n }\n }\n\n // Motion path not directly mapped\n for (const layer of doc.layers) {\n if (layer.motionPath) {\n warnings.push(`Motion path on layer \"${layer.id}\" is not directly mappable to Lottie`);\n }\n }\n\n // Clip paths have limited support\n for (const layer of doc.layers) {\n if (layer.clipPath) {\n warnings.push(`Clip path on layer \"${layer.id}\" mapped as Lottie mask (partial support)`);\n }\n }\n\n // States/transitions\n if (Object.keys(doc.states).length > 1) {\n warnings.push(\"Multiple states flattened to single timeline in Lottie export\");\n }\n\n return warnings;\n}\n\nfunction isExpression(val: unknown): boolean {\n return typeof val === \"object\" && val !== null && \"expr\" in val;\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { LottieAnimation, LottieAsset } from \"./lottie-types.js\";\nimport { mapLayers } from \"./map-layers.js\";\nimport { collectUnsupportedWarnings } from \"./warnings.js\";\n\nexport interface ExportLottieOptions {\n /** State to export (defaults to first state) */\n state?: string;\n}\n\nexport interface ExportLottieResult {\n /** The Lottie JSON animation */\n json: LottieAnimation;\n /** Warnings about unsupported features */\n warnings: string[];\n}\n\n/**\n * Export an Atelier document to Lottie JSON format.\n * This is a lossy conversion — not all features are supported.\n */\nexport function exportToLottie(\n doc: AtelierDocument,\n opts?: ExportLottieOptions,\n): ExportLottieResult {\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) {\n throw new Error(\"Document has no states to export\");\n }\n\n const stateName = opts?.state ?? stateNames[0];\n const state = doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n const warnings: string[] = [];\n\n // Collect unsupported feature warnings\n warnings.push(...collectUnsupportedWarnings(doc, state));\n\n // Map layers\n const layers = mapLayers(doc, state, warnings);\n\n // Map assets\n const assets: LottieAsset[] = [];\n if (doc.assets) {\n for (const [id, asset] of Object.entries(doc.assets)) {\n if (asset.type === \"image\") {\n assets.push({\n id,\n w: 100,\n h: 100,\n p: asset.src,\n e: 0,\n });\n }\n }\n }\n\n const json: LottieAnimation = {\n v: \"5.7.4\",\n fr: doc.canvas.fps,\n ip: 0,\n op: state.duration,\n w: doc.canvas.width,\n h: doc.canvas.height,\n nm: doc.name,\n layers,\n ...(assets.length > 0 ? { assets } : {}),\n };\n\n // Deduplicate warnings\n const uniqueWarnings = [...new Set(warnings)];\n\n return { json, warnings: uniqueWarnings };\n}\n","// @a-company/atelier-mcp — Asset management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, ImageVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_asset ─────────────────────────────────────────\n server.tool(\n \"atelier_add_asset\",\n \"Register an external asset (image, SVG, font, animation, audio) on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n assetId: z.string().describe(\"Unique asset identifier\"),\n type: z.enum([\"image\", \"svg\", \"font\", \"animation\", \"audio\"]).describe(\"Asset type\"),\n src: z.string().describe(\"File path or URL\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n spritesheet: z.object({\n columns: z.number().int().positive().describe(\"Number of columns in the spritesheet grid\"),\n rows: z.number().int().positive().describe(\"Number of rows in the spritesheet grid\"),\n frameCount: z.number().int().positive().optional().describe(\"Total frame count (defaults to columns × rows)\"),\n frameWidth: z.number().positive().describe(\"Width of each frame in pixels\"),\n frameHeight: z.number().positive().describe(\"Height of each frame in pixels\"),\n }).optional().describe(\"Spritesheet metadata (image assets only)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, assetId, type, src, description, spritesheet }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.assets) doc.assets = {};\n if (doc.assets[assetId]) return err(`Asset \"${assetId}\" already exists`);\n\n doc.assets[assetId] = {\n type,\n src,\n ...(description !== undefined ? { description } : {}),\n ...(spritesheet ? { spritesheet } : {}),\n };\n return ok({ assetId, type, src });\n },\n );\n\n // ── atelier_list_assets ───────────────────────────────────────\n server.tool(\n \"atelier_list_assets\",\n \"List all registered assets with usage info (which layers/states reference them)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const assets = doc.assets ?? {};\n const entries = Object.entries(assets).map(([assetId, asset]) => {\n // Find layers referencing this asset (ImageVisual.assetId)\n const referencingLayers = doc.layers\n .filter(l => l.visual.type === \"image\" && (l.visual as ImageVisual).assetId === assetId)\n .map(l => l.id);\n\n // Find states whose audio.src matches this assetId\n const referencingStates = Object.entries(doc.states)\n .filter(([, state]) => state.audio?.src === assetId)\n .map(([name]) => name);\n\n return {\n assetId,\n type: asset.type,\n src: asset.src,\n description: asset.description,\n usedByLayers: referencingLayers,\n usedByStates: referencingStates,\n };\n });\n\n return ok({ count: entries.length, assets: entries });\n },\n );\n\n // ── atelier_remove_asset ──────────────────────────────────────\n server.tool(\n \"atelier_remove_asset\",\n \"Remove a registered asset. Warns if layers or state audio still reference it.\",\n {\n id: z.string().describe(\"Document ID\"),\n assetId: z.string().describe(\"Asset ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, assetId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.assets?.[assetId]) return err(`Asset \"${assetId}\" not found`);\n\n const warnings: string[] = [];\n\n // Check layers referencing this asset\n const referencingLayers = doc.layers\n .filter(l => l.visual.type === \"image\" && (l.visual as ImageVisual).assetId === assetId)\n .map(l => l.id);\n if (referencingLayers.length > 0) {\n warnings.push(`Asset is referenced by layer(s): ${referencingLayers.join(\", \")}`);\n }\n\n // Check state audio referencing this asset\n const referencingStates = Object.entries(doc.states)\n .filter(([, state]) => state.audio?.src === assetId)\n .map(([name]) => name);\n if (referencingStates.length > 0) {\n warnings.push(`Asset is referenced by state audio: ${referencingStates.join(\", \")}`);\n }\n\n delete doc.assets[assetId];\n return ok({ assetId, warnings });\n },\n );\n}\n","// @a-company/atelier-mcp — Variable management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { findTemplateVariables } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_variable ──────────────────────────────────────\n server.tool(\n \"atelier_add_variable\",\n \"Define a template variable on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n variableName: z.string().describe(\"Variable name (used in {{variableName}} patterns)\"),\n type: z.enum([\"string\", \"number\", \"color\", \"asset\", \"boolean\"]).describe(\"Variable type\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n default: z.unknown().optional().describe(\"Default value\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async (args) => {\n const result = getDoc(store, args.id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.variables) doc.variables = {};\n if (doc.variables[args.variableName]) return err(`Variable \"${args.variableName}\" already exists`);\n\n doc.variables[args.variableName] = {\n type: args.type,\n ...(args.description !== undefined ? { description: args.description } : {}),\n ...(args.default !== undefined ? { default: args.default } : {}),\n };\n return ok({ variableName: args.variableName, type: args.type });\n },\n );\n\n // ── atelier_list_variables ────────────────────────────────────\n server.tool(\n \"atelier_list_variables\",\n \"List all declared variables with usage info (which {{references}} exist in the document)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const variables = doc.variables ?? {};\n const referenced = findTemplateVariables(doc);\n\n const entries = Object.entries(variables).map(([name, variable]) => ({\n name,\n type: variable.type,\n description: variable.description,\n default: variable.default,\n referenced: referenced.includes(name),\n }));\n\n const undeclared = referenced.filter(r => !variables[r]);\n\n return ok({ count: entries.length, variables: entries, undeclared });\n },\n );\n\n // ── atelier_remove_variable ───────────────────────────────────\n server.tool(\n \"atelier_remove_variable\",\n \"Remove a declared variable. Warns if {{references}} still exist in the document.\",\n {\n id: z.string().describe(\"Document ID\"),\n variableName: z.string().describe(\"Variable name to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, variableName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.variables?.[variableName]) return err(`Variable \"${variableName}\" not found`);\n\n const warnings: string[] = [];\n const referenced = findTemplateVariables(doc);\n if (referenced.includes(variableName)) {\n warnings.push(`Variable \"{{${variableName}}}\" is still referenced in the document`);\n }\n\n delete doc.variables[variableName];\n if (Object.keys(doc.variables).length === 0) {\n doc.variables = undefined;\n }\n return ok({ variableName, warnings });\n },\n );\n}\n","// @a-company/atelier-mcp — Interaction management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Interaction } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_interaction ───────────────────────────────────\n server.tool(\n \"atelier_add_interaction\",\n \"Add a trigger-action interaction to a layer (click, hover, timer, signal → go-to-state, emit-signal, set-variable, toggle-visibility)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer to attach the interaction to\"),\n interactionId: z.string().describe(\"Unique interaction ID\"),\n trigger: z.object({\n type: z.enum([\"click\", \"hover\", \"pointerdown\", \"pointerup\", \"timer\", \"signal\"]).describe(\"Trigger type\"),\n delay: z.number().optional().describe(\"Delay in ms (timer trigger only)\"),\n signal: z.string().optional().describe(\"Signal name (signal trigger only)\"),\n }).describe(\"What triggers the interaction\"),\n action: z.object({\n type: z.enum([\"go-to-state\", \"emit-signal\", \"set-variable\", \"toggle-visibility\"]).describe(\"Action type\"),\n state: z.string().optional().describe(\"Target state (go-to-state only)\"),\n signal: z.string().optional().describe(\"Signal to emit (emit-signal only)\"),\n variable: z.string().optional().describe(\"Variable name (set-variable only)\"),\n value: z.unknown().optional().describe(\"Value to set (set-variable only)\"),\n targetLayer: z.string().optional().describe(\"Target layer ID (toggle-visibility, defaults to self)\"),\n }).describe(\"What happens when triggered\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, interactionId, trigger, action, description }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (!layer.interactions) layer.interactions = [];\n if (layer.interactions.some(i => i.id === interactionId)) {\n return err(`Interaction \"${interactionId}\" already exists on layer \"${layerId}\"`);\n }\n\n // Validate trigger-specific fields\n if (trigger.type === \"timer\" && trigger.delay === undefined) {\n return err(\"Timer trigger requires a delay\");\n }\n if (trigger.type === \"signal\" && !trigger.signal) {\n return err(\"Signal trigger requires a signal name\");\n }\n\n // Validate action-specific fields\n if (action.type === \"go-to-state\") {\n if (!action.state) return err(\"go-to-state action requires a state name\");\n if (!doc.states[action.state]) return err(`Target state \"${action.state}\" not found`);\n }\n if (action.type === \"emit-signal\" && !action.signal) {\n return err(\"emit-signal action requires a signal name\");\n }\n if (action.type === \"set-variable\") {\n if (!action.variable) return err(\"set-variable action requires a variable name\");\n if (action.value === undefined) return err(\"set-variable action requires a value\");\n }\n if (action.type === \"toggle-visibility\" && action.targetLayer) {\n if (!doc.layers.find(l => l.id === action.targetLayer)) {\n return err(`Target layer \"${action.targetLayer}\" not found`);\n }\n }\n\n const interaction: Interaction = {\n id: interactionId,\n trigger: trigger as Interaction[\"trigger\"],\n action: action as Interaction[\"action\"],\n ...(description !== undefined ? { description } : {}),\n };\n\n layer.interactions.push(interaction);\n return ok({ layerId, interactionId, triggerType: trigger.type, actionType: action.type });\n },\n );\n\n // ── atelier_list_interactions ─────────────────────────────────\n server.tool(\n \"atelier_list_interactions\",\n \"List all interactions across all layers or for a specific layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().optional().describe(\"Optional: filter to a specific layer\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, layerId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layers = layerId\n ? doc.layers.filter(l => l.id === layerId)\n : doc.layers;\n\n if (layerId && layers.length === 0) return err(`Layer \"${layerId}\" not found`);\n\n const interactions = layers.flatMap(l =>\n (l.interactions ?? []).map(i => ({\n layerId: l.id,\n interactionId: i.id,\n triggerType: i.trigger.type,\n actionType: i.action.type,\n description: i.description,\n trigger: i.trigger,\n action: i.action,\n })),\n );\n\n return ok({ count: interactions.length, interactions });\n },\n );\n\n // ── atelier_remove_interaction ────────────────────────────────\n server.tool(\n \"atelier_remove_interaction\",\n \"Remove an interaction from a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n interactionId: z.string().describe(\"Interaction ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, layerId, interactionId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (!layer.interactions) return err(`Interaction \"${interactionId}\" not found on layer \"${layerId}\"`);\n\n const idx = layer.interactions.findIndex(i => i.id === interactionId);\n if (idx === -1) return err(`Interaction \"${interactionId}\" not found on layer \"${layerId}\"`);\n\n layer.interactions.splice(idx, 1);\n if (layer.interactions.length === 0) {\n layer.interactions = undefined;\n }\n return ok({ layerId, interactionId, remainingInteractions: layer.interactions?.length ?? 0 });\n },\n );\n}\n","// @a-company/atelier-mcp — Ref layer (composition/nesting) tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, RefVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_ref ───────────────────────────────────────────\n server.tool(\n \"atelier_set_ref\",\n \"Set the source reference on a ref-type layer. Can point to a file path or another in-memory document ID.\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a ref visual)\"),\n src: z.string().describe(\"File path, URL, or in-memory document ID\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, src }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"ref\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"ref\"`);\n\n // Prevent self-reference\n if (src === id) return err(\"Cannot reference self — would cause infinite recursion\");\n\n (layer.visual as RefVisual).src = src;\n\n // Check if src is an in-memory document\n const isInMemory = store.has(src);\n return ok({ layerId, src, resolvedInMemory: isInMemory });\n },\n );\n\n // ── atelier_resolve_refs ──────────────────────────────────────\n server.tool(\n \"atelier_resolve_refs\",\n \"Check which ref layers can be resolved (point to valid in-memory documents)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const refs = doc.layers\n .filter(l => l.visual.type === \"ref\")\n .map(l => {\n const src = (l.visual as RefVisual).src;\n const resolved = store.has(src);\n const targetDoc = resolved ? store.get(src) : undefined;\n return {\n layerId: l.id,\n src,\n resolved,\n targetName: targetDoc?.name,\n targetLayerCount: targetDoc?.layers.length,\n targetStateCount: targetDoc ? Object.keys(targetDoc.states).length : undefined,\n };\n });\n\n const resolvedCount = refs.filter(r => r.resolved).length;\n return ok({ count: refs.length, resolvedCount, refs });\n },\n );\n}\n","// @a-company/atelier-mcp — Performance tools (profiling, frame diff, batch preview)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_profile ─────────────────────────────────────────\n server.tool(\n \"atelier_profile\",\n \"Profile frame resolution performance — returns timing, layer count, property count, and delta count for a frame\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to profile\"),\n frame: z.number().int().min(0).describe(\"Frame number to resolve\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const state = doc.states[stateName];\n const deltaCount = state.deltas.length;\n const expressionCount = state.deltas.filter(\n d => (typeof d.from === \"object\" && d.from !== null && \"expr\" in d.from) ||\n (typeof d.to === \"object\" && d.to !== null && \"expr\" in d.to)\n ).length;\n\n const start = performance.now();\n const resolved = resolveFrame(doc, stateName, frame);\n const resolveTimeMs = performance.now() - start;\n\n let propertiesComputed = 0;\n const layerDetails = resolved.layers.map(rl => {\n const propCount = Object.keys(rl.computedProperties).length;\n propertiesComputed += propCount;\n return {\n id: rl.id,\n visualType: rl.layer.visual.type,\n propertiesComputed: propCount,\n properties: Object.keys(rl.computedProperties),\n };\n });\n\n return ok({\n stateName,\n frame,\n duration: state.duration,\n resolveTimeMs: Math.round(resolveTimeMs * 1000) / 1000,\n layerCount: doc.layers.length,\n deltaCount,\n expressionCount,\n propertiesComputed,\n layerDetails,\n });\n },\n );\n\n // ── atelier_diff_frames ────────────────────────────────────\n server.tool(\n \"atelier_diff_frames\",\n \"Compare two frames and return only the properties that changed between them\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n frameA: z.number().int().min(0).describe(\"First frame number\"),\n frameB: z.number().int().min(0).describe(\"Second frame number\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frameA, frameB }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const resolvedA = resolveFrame(doc, stateName, frameA);\n const resolvedB = resolveFrame(doc, stateName, frameB);\n\n const changes: Array<{\n layerId: string;\n property: string;\n from: unknown;\n to: unknown;\n }> = [];\n\n for (const layerB of resolvedB.layers) {\n const layerA = resolvedA.layers.find(l => l.id === layerB.id);\n const propsA = layerA?.computedProperties ?? {};\n const propsB = layerB.computedProperties;\n\n // All property keys from both frames\n const allKeys = new Set([...Object.keys(propsA), ...Object.keys(propsB)]);\n for (const key of allKeys) {\n const valA = (propsA as Record<string, unknown>)[key];\n const valB = (propsB as Record<string, unknown>)[key];\n if (valA !== valB) {\n changes.push({ layerId: layerB.id, property: key, from: valA, to: valB });\n }\n }\n }\n\n return ok({\n stateName,\n frameA,\n frameB,\n changeCount: changes.length,\n changes,\n });\n },\n );\n\n // ── atelier_batch_preview ──────────────────────────────────\n server.tool(\n \"atelier_batch_preview\",\n \"Preview multiple frames at once — reduces round-trips for scrubbing or timeline inspection\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to preview\"),\n frames: z.array(z.number().int().min(0)).min(1).max(60).describe(\"Array of frame numbers to resolve (max 60)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frames }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const start = performance.now();\n\n const results = frames.map(frame => {\n const resolved = resolveFrame(doc, stateName, frame);\n return {\n frame,\n layers: resolved.layers.map(rl => ({\n id: rl.id,\n computedProperties: rl.computedProperties,\n })),\n };\n });\n\n const totalTimeMs = performance.now() - start;\n\n return ok({\n stateName,\n duration: doc.states[stateName].duration,\n frameCount: frames.length,\n totalTimeMs: Math.round(totalTimeMs * 1000) / 1000,\n avgTimeMs: Math.round((totalTimeMs / frames.length) * 1000) / 1000,\n frames: results,\n });\n },\n );\n\n // ── atelier_complexity ─────────────────────────────────────\n server.tool(\n \"atelier_complexity\",\n \"Analyze document complexity — layer count, delta count, expression usage, state hierarchy depth\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layerCount = doc.layers.length;\n const stateCount = Object.keys(doc.states).length;\n const assetCount = doc.assets ? Object.keys(doc.assets).length : 0;\n const variableCount = doc.variables ? Object.keys(doc.variables).length : 0;\n\n let totalDeltas = 0;\n let totalExpressions = 0;\n let maxStateDuration = 0;\n let totalInteractions = 0;\n\n const stateDetails: Array<{\n name: string;\n duration: number;\n deltaCount: number;\n expressionCount: number;\n hasAudio: boolean;\n hasParent: boolean;\n transitionCount: number;\n }> = [];\n\n for (const [name, state] of Object.entries(doc.states)) {\n const deltaCount = state.deltas.length;\n totalDeltas += deltaCount;\n\n const expressionCount = state.deltas.filter(\n d => (typeof d.from === \"object\" && d.from !== null && \"expr\" in d.from) ||\n (typeof d.to === \"object\" && d.to !== null && \"expr\" in d.to)\n ).length;\n totalExpressions += expressionCount;\n\n if (state.duration > maxStateDuration) maxStateDuration = state.duration;\n\n stateDetails.push({\n name,\n duration: state.duration,\n deltaCount,\n expressionCount,\n hasAudio: !!state.audio,\n hasParent: !!state.parent,\n transitionCount: state.transitions ? Object.keys(state.transitions).length : 0,\n });\n }\n\n for (const layer of doc.layers) {\n if (layer.interactions) totalInteractions += layer.interactions.length;\n }\n\n // Compute hierarchy depth\n let maxHierarchyDepth = 0;\n for (const [name] of Object.entries(doc.states)) {\n let depth = 0;\n let current = name;\n const visited = new Set<string>();\n while (doc.states[current]?.parent && !visited.has(current)) {\n visited.add(current);\n current = doc.states[current].parent!;\n depth++;\n }\n if (depth > maxHierarchyDepth) maxHierarchyDepth = depth;\n }\n\n // Unique animated properties\n const animatedProperties = new Set<string>();\n for (const state of Object.values(doc.states)) {\n for (const delta of state.deltas) {\n animatedProperties.add(delta.property);\n }\n }\n\n return ok({\n layerCount,\n stateCount,\n totalDeltas,\n totalExpressions,\n totalInteractions,\n assetCount,\n variableCount,\n maxStateDuration,\n maxHierarchyDepth,\n uniqueAnimatedProperties: [...animatedProperties],\n stateDetails,\n });\n },\n );\n}\n"],"mappings":"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","names":["z","z","err","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","AnimatablePropertyEnum","EasingInputSchema","PresetDeltaSchema","z","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","EasingInputSchema","register","z","colorToCSS","r","g","b","a","isExpression","kfs","buildTransform","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","register"]}
1
+ {"version":3,"sources":["../../mcp/src/index.ts","../../mcp/src/store.ts","../../mcp/src/tools/document.ts","../../schema/src/units.ts","../../schema/src/coordinates.ts","../../schema/src/color.ts","../../schema/src/shape.ts","../../schema/src/easing.ts","../../schema/src/shadow.ts","../../schema/src/layer.ts","../../schema/src/interaction.ts","../../schema/src/delta.ts","../../schema/src/state.ts","../../schema/src/preset.ts","../../schema/src/variable.ts","../../schema/src/asset.ts","../../schema/src/document.ts","../../schema/src/validate.ts","../../schema/src/parse.ts","../../mcp/src/tools/layers.ts","../../mcp/src/tools/shapes.ts","../../mcp/src/tools/states.ts","../../mcp/src/tools/deltas.ts","../../math/src/easing.ts","../../math/src/spring.ts","../../math/src/lerp.ts","../../math/src/color.ts","../../math/src/path.ts","../../core/src/resolver/delta-resolver.ts","../../core/src/resolver/easing-resolver.ts","../../core/src/expressions/expression-evaluator.ts","../../core/src/resolver/frame-resolver.ts","../../core/src/validation/overlap-validator.ts","../../core/src/builder/document-builder.ts","../../core/src/units/resolve-units.ts","../../core/src/presets/preset-resolver.ts","../../core/src/state/state-machine.ts","../../core/src/templates/template-resolver.ts","../../core/src/audio/audio-timing.ts","../../mcp/src/tools/presets.ts","../../mcp/src/tools/preview.ts","../../mcp/src/tools/templates.ts","../../mcp/src/tools/layer-effects.ts","../../mcp/src/tools/state-config.ts","../../mcp/src/tools/export.ts","../../canvas/src/styles.ts","../../canvas/src/apply-properties.ts","../../canvas/src/renderers/shape-renderer.ts","../../canvas/src/renderers/text-renderer.ts","../../canvas/src/renderers/image-renderer.ts","../../canvas/src/renderers/ref-renderer.ts","../../canvas/src/render-frame.ts","../../canvas/src/image-cache.ts","../../svg/src/render-svg.ts","../../svg/src/svg-properties.ts","../../svg/src/svg-gradients.ts","../../svg/src/svg-shapes.ts","../../svg/src/svg-text.ts","../../svg/src/svg-filters.ts","../../svg/src/svg-clip.ts","../../lottie/src/map-colors.ts","../../lottie/src/map-shapes.ts","../../lottie/src/map-easing.ts","../../lottie/src/map-keyframes.ts","../../lottie/src/map-layers.ts","../../lottie/src/warnings.ts","../../lottie/src/export-lottie.ts","../../mcp/src/tools/assets.ts","../../mcp/src/tools/variables.ts","../../mcp/src/tools/interactions.ts","../../mcp/src/tools/refs.ts","../../mcp/src/tools/performance.ts"],"sourcesContent":["// @a-company/atelier-mcp — MCP server: AI authoring interface for animations\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { DocumentStore } from \"./store.js\";\nimport { register as registerDocumentTools } from \"./tools/document.js\";\nimport { register as registerLayerTools } from \"./tools/layers.js\";\nimport { register as registerShapeTools } from \"./tools/shapes.js\";\nimport { register as registerStateTools } from \"./tools/states.js\";\nimport { register as registerDeltaTools } from \"./tools/deltas.js\";\nimport { register as registerPresetTools } from \"./tools/presets.js\";\nimport { register as registerPreviewTools } from \"./tools/preview.js\";\nimport { register as registerTemplateTools } from \"./tools/templates.js\";\nimport { register as registerLayerEffectTools } from \"./tools/layer-effects.js\";\nimport { register as registerStateConfigTools } from \"./tools/state-config.js\";\nimport { register as registerExportTools } from \"./tools/export.js\";\nimport { register as registerAssetTools } from \"./tools/assets.js\";\nimport { register as registerVariableTools } from \"./tools/variables.js\";\nimport { register as registerInteractionTools } from \"./tools/interactions.js\";\nimport { register as registerRefTools } from \"./tools/refs.js\";\nimport { register as registerPerformanceTools } from \"./tools/performance.js\";\n\nexport { DocumentStore } from \"./store.js\";\nexport { register as registerDocumentTools } from \"./tools/document.js\";\nexport { register as registerLayerTools } from \"./tools/layers.js\";\nexport { register as registerShapeTools } from \"./tools/shapes.js\";\nexport { register as registerStateTools } from \"./tools/states.js\";\nexport { register as registerDeltaTools } from \"./tools/deltas.js\";\nexport { register as registerPresetTools } from \"./tools/presets.js\";\nexport { register as registerPreviewTools } from \"./tools/preview.js\";\nexport { register as registerTemplateTools } from \"./tools/templates.js\";\nexport { register as registerLayerEffectTools } from \"./tools/layer-effects.js\";\nexport { register as registerStateConfigTools } from \"./tools/state-config.js\";\nexport { register as registerExportTools } from \"./tools/export.js\";\nexport { register as registerAssetTools } from \"./tools/assets.js\";\nexport { register as registerVariableTools } from \"./tools/variables.js\";\nexport { register as registerInteractionTools } from \"./tools/interactions.js\";\nexport { register as registerRefTools } from \"./tools/refs.js\";\nexport { register as registerPerformanceTools } from \"./tools/performance.js\";\n\n/**\n * Create a fully configured MCP server with all Atelier tools registered.\n * Returns both the server and the backing store for testing.\n */\nexport function createServer(): { server: McpServer; store: DocumentStore } {\n const store = new DocumentStore();\n\n const server = new McpServer(\n { name: \"atelier\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n registerDocumentTools(server, store);\n registerLayerTools(server, store);\n registerShapeTools(server, store);\n registerStateTools(server, store);\n registerDeltaTools(server, store);\n registerPresetTools(server, store);\n registerPreviewTools(server, store);\n registerTemplateTools(server, store);\n registerLayerEffectTools(server, store);\n registerStateConfigTools(server, store);\n registerExportTools(server, store);\n registerAssetTools(server, store);\n registerVariableTools(server, store);\n registerInteractionTools(server, store);\n registerRefTools(server, store);\n registerPerformanceTools(server, store);\n\n return { server, store };\n}\n\n// ── Main entry point ─────────────────────────────────────────\n// When run directly, connect via stdio transport.\nconst isMain =\n typeof process !== \"undefined\" &&\n process.argv[1] &&\n (process.argv[1].endsWith(\"/index.js\") ||\n process.argv[1].endsWith(\"/index.cjs\") ||\n process.argv[1].includes(\"atelier-mcp\"));\n\nif (isMain) {\n const { server } = createServer();\n const transport = new StdioServerTransport();\n server.connect(transport).catch((error) => {\n console.error(\"Failed to start Atelier MCP server:\", error);\n process.exit(1);\n });\n}\n","// @a-company/atelier-mcp — In-memory document store\n\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\n\nlet counter = 0;\n\nfunction generateId(): string {\n counter++;\n return `doc_${Date.now()}_${counter}`;\n}\n\n/**\n * In-memory store for AtelierDocuments.\n * Each document is keyed by a string ID.\n */\nexport class DocumentStore {\n private docs = new Map<string, AtelierDocument>();\n\n /** Create a new document entry. Returns the assigned ID. */\n create(doc: AtelierDocument, id?: string): string {\n const docId = id ?? generateId();\n if (this.docs.has(docId)) {\n throw new Error(`Document \"${docId}\" already exists`);\n }\n this.docs.set(docId, doc);\n return docId;\n }\n\n /** Get a document by ID. */\n get(id: string): AtelierDocument | undefined {\n return this.docs.get(id);\n }\n\n /** Set (overwrite) a document by ID. */\n set(id: string, doc: AtelierDocument): void {\n this.docs.set(id, doc);\n }\n\n /** Delete a document by ID. Returns true if it existed. */\n delete(id: string): boolean {\n return this.docs.delete(id);\n }\n\n /** Check if a document exists. */\n has(id: string): boolean {\n return this.docs.has(id);\n }\n\n /** List all document IDs and their names. */\n list(): Array<{ id: string; name: string; canvas: AtelierDocument[\"canvas\"] }> {\n const result: Array<{ id: string; name: string; canvas: AtelierDocument[\"canvas\"] }> = [];\n for (const [id, doc] of this.docs) {\n result.push({ id, name: doc.name, canvas: doc.canvas });\n }\n return result;\n }\n\n /** Clear all documents (useful for testing). */\n clear(): void {\n this.docs.clear();\n }\n}\n","// @a-company/atelier-mcp — Document management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument, parseAtelier, serializeAtelier } from \"@a-company/atelier-schema\";\nimport type { DocumentStore } from \"../store.js\";\n\n/** Helper: get document or return error result */\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_create ──────────────────────────────────────────\n server.tool(\n \"atelier_create\",\n \"Create a new Atelier animation document with canvas settings\",\n {\n name: z.string().describe(\"Animation name\"),\n width: z.number().positive().describe(\"Canvas width in pixels\"),\n height: z.number().positive().describe(\"Canvas height in pixels\"),\n fps: z.number().positive().int().describe(\"Frames per second\"),\n background: z.string().optional().describe(\"Background color (hex string)\"),\n description: z.string().optional().describe(\"Animation description\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ name, width, height, fps, background, description, tags }) => {\n const doc: AtelierDocument = {\n version: \"1.0\",\n name,\n canvas: { width, height, fps, ...(background ? { background } : {}) },\n layers: [],\n states: {},\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n const validation = validateDocument(doc);\n if (!validation.success) {\n return err(`Validation failed: ${validation.errors.map(e => `${e.path}: ${e.message}`).join(\"; \")}`);\n }\n\n const id = store.create(doc);\n return ok({ id, name: doc.name, canvas: doc.canvas });\n },\n );\n\n // ── atelier_info ────────────────────────────────────────────\n server.tool(\n \"atelier_info\",\n \"Get summary information about an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const stateNames = Object.keys(doc.states);\n const totalDuration = stateNames.reduce(\n (sum, name) => sum + doc.states[name].duration,\n 0,\n );\n\n return ok({\n name: doc.name,\n description: doc.description,\n tags: doc.tags,\n canvas: doc.canvas,\n layerCount: doc.layers.length,\n stateNames,\n totalDuration,\n presetNames: doc.presets ? Object.keys(doc.presets) : [],\n });\n },\n );\n\n // ── atelier_load ────────────────────────────────────────────\n server.tool(\n \"atelier_load\",\n \"Load an Atelier document from a YAML string\",\n {\n id: z.string().optional().describe(\"Custom document ID (auto-generated if omitted)\"),\n yaml: z.string().describe(\"YAML string representing an Atelier document\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, yaml }) => {\n const parsed = parseAtelier(yaml);\n if (!parsed.success) {\n return err(`Parse/validation failed: ${parsed.errors.map(e => `${e.path}: ${e.message}`).join(\"; \")}`);\n }\n\n const docId = store.create(parsed.data, id);\n return ok({ id: docId, name: parsed.data.name });\n },\n );\n\n // ── atelier_export ──────────────────────────────────────────\n server.tool(\n \"atelier_export\",\n \"Export an Atelier document as a YAML string\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n\n const yaml = serializeAtelier(result.doc);\n return { content: [{ type: \"text\" as const, text: yaml }] };\n },\n );\n\n // ── atelier_list ────────────────────────────────────────────\n server.tool(\n \"atelier_list\",\n \"List all Atelier documents in the store\",\n {},\n { readOnlyHint: true, destructiveHint: false },\n async () => {\n const docs = store.list();\n return ok({ documents: docs, count: docs.length });\n },\n );\n}\n","import { z } from \"zod\";\n\n/** Pixel value — any number */\nexport const PixelSchema = z.number();\n\n/** Percentage string like \"50%\" */\nexport const PercentageSchema = z.string().regex(/^-?\\d+(\\.\\d+)?%$/, {\n message: \"Percentage must be a number followed by %, e.g. \\\"50%\\\"\",\n});\n\n/** Either pixel or percentage */\nexport const UnitValueSchema = z.union([PixelSchema, PercentageSchema]);\n","import { z } from \"zod\";\nimport { UnitValueSchema } from \"./units.js\";\n\nexport const FrameSchema = z.object({\n x: UnitValueSchema,\n y: UnitValueSchema,\n});\n\nexport const BoundsSchema = z.object({\n width: UnitValueSchema,\n height: UnitValueSchema,\n});\n\nexport const AnchorPointSchema = z.object({\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n});\n","import { z } from \"zod\";\n\nexport const RGBAColorSchema = z.object({\n r: z.number().min(0).max(255),\n g: z.number().min(0).max(255),\n b: z.number().min(0).max(255),\n a: z.number().min(0).max(1),\n});\n\nexport const HSLAColorSchema = z.object({\n h: z.number().min(0).max(360),\n s: z.number().min(0).max(100),\n l: z.number().min(0).max(100),\n a: z.number().min(0).max(1),\n});\n\nexport const HexColorSchema = z.string().regex(/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, {\n message: \"Color must be a hex string: #RGB, #RGBA, #RRGGBB, or #RRGGBBAA\",\n});\n\nexport const ColorSchema = z.union([RGBAColorSchema, HSLAColorSchema, HexColorSchema]);\n","import { z } from \"zod\";\nimport { ColorSchema } from \"./color.js\";\nimport { UnitValueSchema } from \"./units.js\";\n\nexport const PathPointSchema = z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n});\n\nexport const RectShapeSchema = z.object({\n type: z.literal(\"rect\"),\n cornerRadius: z.union([\n z.number().min(0),\n z.tuple([z.number().min(0), z.number().min(0), z.number().min(0), z.number().min(0)]),\n ]).optional(),\n});\n\nexport const EllipseShapeSchema = z.object({\n type: z.literal(\"ellipse\"),\n});\n\nexport const PathShapeSchema = z.object({\n type: z.literal(\"path\"),\n points: z.array(PathPointSchema).min(2, \"Path must have at least 2 points\"),\n closed: z.boolean().optional(),\n});\n\nexport const ShapeSchema = z.discriminatedUnion(\"type\", [\n RectShapeSchema,\n EllipseShapeSchema,\n PathShapeSchema,\n]);\n\nexport const GradientStopSchema = z.object({\n offset: z.number().min(0).max(1),\n color: ColorSchema,\n});\n\nexport const SolidFillSchema = z.object({\n type: z.literal(\"solid\"),\n color: ColorSchema,\n});\n\nexport const LinearGradientFillSchema = z.object({\n type: z.literal(\"linear-gradient\"),\n angle: z.number(),\n stops: z.array(GradientStopSchema).min(2, \"Gradient needs at least 2 stops\"),\n});\n\nexport const RadialGradientFillSchema = z.object({\n type: z.literal(\"radial-gradient\"),\n center: z.object({ x: UnitValueSchema, y: UnitValueSchema }),\n radius: UnitValueSchema,\n stops: z.array(GradientStopSchema).min(2, \"Gradient needs at least 2 stops\"),\n});\n\nexport const FillSchema = z.discriminatedUnion(\"type\", [\n SolidFillSchema,\n LinearGradientFillSchema,\n RadialGradientFillSchema,\n]);\n\nexport const StrokeSchema = z.object({\n color: ColorSchema,\n width: z.number().min(0),\n dash: z.array(z.number().min(0)).optional(),\n lineCap: z.enum([\"butt\", \"round\", \"square\"]).optional(),\n lineJoin: z.enum([\"miter\", \"round\", \"bevel\"]).optional(),\n strokeStart: z.number().min(0).max(1).optional(),\n strokeEnd: z.number().min(0).max(1).optional(),\n});\n\nexport const TextStyleSchema = z.object({\n fontFamily: z.string().min(1, \"fontFamily is required\"),\n fontSize: z.number().positive(\"fontSize must be positive\"),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n color: ColorSchema,\n});\n","import { z } from \"zod\";\n\nexport const LinearEasingSchema = z.object({ type: z.literal(\"linear\") });\n\nexport const CubicBezierEasingSchema = z.object({\n type: z.literal(\"cubic-bezier\"),\n x1: z.number().min(0).max(1),\n y1: z.number(),\n x2: z.number().min(0).max(1),\n y2: z.number(),\n});\n\nexport const SpringEasingSchema = z.object({\n type: z.literal(\"spring\"),\n mass: z.number().positive().optional(),\n stiffness: z.number().positive().optional(),\n damping: z.number().positive().optional(),\n velocity: z.number().optional(),\n});\n\nexport const StepEasingSchema = z.object({\n type: z.literal(\"step\"),\n steps: z.number().int().positive(),\n position: z.enum([\"start\", \"end\"]).optional(),\n});\n\nexport const EasingPresetSchema = z.enum([\"linear\", \"ease-in\", \"ease-out\", \"ease-in-out\"]);\n\nexport const EasingSchema = z.union([\n LinearEasingSchema,\n CubicBezierEasingSchema,\n SpringEasingSchema,\n StepEasingSchema,\n EasingPresetSchema,\n]);\n","import { z } from \"zod\";\nimport { ColorSchema } from \"./color.js\";\n\nexport const ShadowSchema = z.object({\n color: ColorSchema,\n blur: z.number().min(0),\n offsetX: z.number().optional(),\n offsetY: z.number().optional(),\n});\n","import { z } from \"zod\";\nimport { ShapeSchema, FillSchema, StrokeSchema, TextStyleSchema, PathPointSchema } from \"./shape.js\";\nimport { FrameSchema, BoundsSchema, AnchorPointSchema } from \"./coordinates.js\";\nimport { ShadowSchema } from \"./shadow.js\";\nimport { InteractionSchema } from \"./interaction.js\";\n\nexport const BlendModeSchema = z.enum([\n \"normal\", \"multiply\", \"screen\", \"overlay\",\n \"darken\", \"lighten\", \"color-dodge\", \"color-burn\",\n \"hard-light\", \"soft-light\", \"difference\", \"exclusion\",\n \"hue\", \"saturation\", \"color\", \"luminosity\",\n]);\n\nexport const MotionPathSchema = z.object({\n points: z.array(PathPointSchema).min(2, \"Motion path must have at least 2 points\"),\n closed: z.boolean().optional(),\n autoRotate: z.boolean().optional(),\n autoRotateOffset: z.number().optional(),\n});\n\nexport const ShapeVisualSchema = z.object({\n type: z.literal(\"shape\"),\n shape: ShapeSchema,\n fill: FillSchema.optional(),\n stroke: StrokeSchema.optional(),\n});\n\nexport const TextVisualSchema = z.object({\n type: z.literal(\"text\"),\n content: z.string(),\n style: TextStyleSchema,\n});\n\nexport const SpritesheetConfigSchema = z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n});\n\nexport const SourceRectSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n});\n\nexport const ImageVisualSchema = z.object({\n type: z.literal(\"image\"),\n assetId: z.string().min(1, \"assetId is required\"),\n src: z.string().optional(),\n sourceRect: SourceRectSchema.optional(),\n spritesheet: SpritesheetConfigSchema.optional(),\n frameIndex: z.number().int().min(0).optional(),\n});\n\nexport const GroupVisualSchema = z.object({\n type: z.literal(\"group\"),\n});\n\nexport const RefVisualSchema = z.object({\n type: z.literal(\"ref\"),\n src: z.string().min(1, \"src is required\"),\n state: z.string().optional(),\n frame: z.number().int().min(0).optional(),\n});\n\nexport const VisualSchema = z.discriminatedUnion(\"type\", [\n ShapeVisualSchema,\n TextVisualSchema,\n ImageVisualSchema,\n GroupVisualSchema,\n RefVisualSchema,\n]);\n\nexport const LayerSchema = z.object({\n id: z.string().min(1, \"Layer id is required\"),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n visual: VisualSchema,\n frame: FrameSchema,\n bounds: BoundsSchema,\n anchorPoint: AnchorPointSchema.optional(),\n parentId: z.string().optional(),\n opacity: z.number().min(0).max(1).optional(),\n rotation: z.number().optional(),\n scale: z.object({ x: z.number(), y: z.number() }).optional(),\n visible: z.boolean().optional(),\n shadow: ShadowSchema.optional(),\n blendMode: BlendModeSchema.optional(),\n motionPath: MotionPathSchema.optional(),\n clipPath: ShapeSchema.optional(),\n tint: z.object({\n color: z.string(),\n amount: z.number().min(0).max(1),\n }).optional(),\n interactions: z.array(InteractionSchema).optional(),\n});\n","import { z } from \"zod\";\n\nexport const TriggerTypeSchema = z.enum([\n \"click\", \"hover\", \"pointerdown\", \"pointerup\", \"timer\", \"signal\",\n]);\n\nexport const TriggerSchema = z.object({\n type: TriggerTypeSchema,\n delay: z.number().nonnegative(\"Timer delay must be non-negative\").optional(),\n signal: z.string().optional(),\n}).refine(\n (t) => t.type !== \"timer\" || t.delay !== undefined,\n { message: \"Timer trigger requires a delay\" },\n).refine(\n (t) => t.type !== \"signal\" || t.signal !== undefined,\n { message: \"Signal trigger requires a signal name\" },\n);\n\nexport const ActionTypeSchema = z.enum([\n \"go-to-state\", \"emit-signal\", \"set-variable\", \"toggle-visibility\",\n]);\n\nexport const ActionSchema = z.object({\n type: ActionTypeSchema,\n state: z.string().optional(),\n signal: z.string().optional(),\n variable: z.string().optional(),\n value: z.unknown().optional(),\n targetLayer: z.string().optional(),\n}).refine(\n (a) => a.type !== \"go-to-state\" || a.state !== undefined,\n { message: \"go-to-state action requires a state name\" },\n).refine(\n (a) => a.type !== \"emit-signal\" || a.signal !== undefined,\n { message: \"emit-signal action requires a signal name\" },\n).refine(\n (a) => a.type !== \"set-variable\" || (a.variable !== undefined && a.value !== undefined),\n { message: \"set-variable action requires variable and value\" },\n);\n\nexport const InteractionSchema = z.object({\n id: z.string().min(1, \"Interaction id is required\"),\n trigger: TriggerSchema,\n action: ActionSchema,\n description: z.string().optional(),\n});\n","import { z } from \"zod\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const AnimatablePropertySchema = z.enum([\n \"frame.x\",\n \"frame.y\",\n \"bounds.width\",\n \"bounds.height\",\n \"opacity\",\n \"rotation\",\n \"scale.x\",\n \"scale.y\",\n \"anchorPoint.x\",\n \"anchorPoint.y\",\n \"visual.shape.cornerRadius\",\n \"visual.fill.color\",\n \"visual.stroke.color\",\n \"visual.stroke.width\",\n \"visual.stroke.start\",\n \"visual.stroke.end\",\n \"visual.style.fontSize\",\n \"visual.style.color\",\n \"shadow.color\",\n \"shadow.blur\",\n \"shadow.offsetX\",\n \"shadow.offsetY\",\n \"motionPath.progress\",\n \"visual.fill.angle\",\n \"visual.fill.center.x\",\n \"visual.fill.center.y\",\n \"visual.fill.radius\",\n \"visual.image.sourceRect.x\",\n \"visual.image.sourceRect.y\",\n \"visual.image.sourceRect.width\",\n \"visual.image.sourceRect.height\",\n \"visual.image.frameIndex\",\n \"visible\",\n \"tint.color\",\n \"tint.amount\",\n]);\n\nexport const FrameRangeSchema = z.tuple([\n z.number().int().min(0, \"Frame start must be >= 0\"),\n z.number().int().min(0, \"Frame end must be >= 0\"),\n]).refine(([start, end]) => end >= start, {\n message: \"Frame range end must be >= start\",\n});\n\nexport const DeltaSchema = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n layer: z.string().min(1, \"Delta must reference a layer id\"),\n property: AnimatablePropertySchema,\n range: FrameRangeSchema,\n from: z.unknown(),\n to: z.unknown(),\n easing: EasingSchema.optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n","import { z } from \"zod\";\nimport { DeltaSchema } from \"./delta.js\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const AudioSchema = z.object({\n src: z.string().min(1, \"Audio src is required\"),\n offset: z.number().min(0, \"Audio offset must be non-negative\").optional(),\n volume: z.number().min(0).max(1, \"Audio volume must be 0–1\").optional(),\n loop: z.boolean().optional(),\n startFrame: z.number().int().min(0, \"Audio startFrame must be a non-negative integer\").optional(),\n});\n\nexport const StateTransitionConfigSchema = z.object({\n duration: z.number().int().positive(\"Transition duration must be a positive integer (frames)\"),\n easing: EasingSchema.optional(),\n});\n\nexport const StateSchema = z.object({\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n parent: z.string().optional(),\n duration: z.number().int().positive(\"State duration must be a positive integer (frames)\"),\n deltas: z.array(DeltaSchema),\n audio: AudioSchema.optional(),\n transitions: z.record(z.string(), StateTransitionConfigSchema).optional(),\n});\n","import { z } from \"zod\";\nimport { AnimatablePropertySchema } from \"./delta.js\";\nimport { EasingSchema } from \"./easing.js\";\n\nexport const PresetDeltaSchema = z.object({\n property: AnimatablePropertySchema,\n offset: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional(),\n from: z.unknown(),\n to: z.unknown(),\n easing: EasingSchema.optional(),\n});\n\nexport const PresetSchema = z.object({\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n deltas: z.array(PresetDeltaSchema).min(1, \"Preset must have at least one delta\"),\n});\n","import { z } from \"zod\";\n\nexport const VariableTypeSchema = z.enum([\"string\", \"number\", \"color\", \"asset\", \"boolean\"]);\n\nexport const VariableSchema = z.object({\n type: VariableTypeSchema,\n default: z.unknown().optional(),\n description: z.string().optional(),\n});\n","import { z } from \"zod\";\n\nexport const AssetTypeSchema = z.enum([\"image\", \"svg\", \"font\", \"animation\", \"audio\"]);\n\nexport const AssetSchema = z.object({\n type: AssetTypeSchema,\n src: z.string().min(1, \"Asset src is required\"),\n description: z.string().optional(),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).optional(),\n});\n","import { z } from \"zod\";\nimport { LayerSchema } from \"./layer.js\";\nimport { StateSchema } from \"./state.js\";\nimport { PresetSchema } from \"./preset.js\";\nimport { VariableSchema } from \"./variable.js\";\nimport { AssetSchema } from \"./asset.js\";\n\nexport const CanvasSchema = z.object({\n width: z.number().int().positive(\"Canvas width must be a positive integer\"),\n height: z.number().int().positive(\"Canvas height must be a positive integer\"),\n fps: z.number().int().positive(\"FPS must be a positive integer\"),\n background: z.string().optional(),\n});\n\nexport const AtelierDocumentSchema = z.object({\n version: z.string().min(1, \"Version is required\"),\n name: z.string().min(1, \"Animation name is required\"),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n canvas: CanvasSchema,\n variables: z.record(z.string(), VariableSchema).optional(),\n assets: z.record(z.string(), AssetSchema).optional(),\n presets: z.record(z.string(), PresetSchema).optional(),\n layers: z.array(LayerSchema),\n states: z.record(z.string(), StateSchema),\n});\n","import type { AtelierDocument, Layer, Delta } from \"@a-company/atelier-types\";\nimport { AtelierDocumentSchema } from \"./document.js\";\nimport { LayerSchema } from \"./layer.js\";\nimport { DeltaSchema } from \"./delta.js\";\nimport type { z } from \"zod\";\n\n/** Validation result — either success with typed data or failure with readable errors */\nexport type ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\n/** Format Zod errors into flat, AI-readable error messages */\nfunction formatErrors(error: z.ZodError): ValidationError[] {\n return error.issues.map((issue) => ({\n path: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n }));\n}\n\n/** Validate a complete AtelierDocument */\nexport function validateDocument(input: unknown): ValidationResult<AtelierDocument> {\n const result = AtelierDocumentSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as AtelierDocument };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n\n/** Validate a single Layer */\nexport function validateLayer(input: unknown): ValidationResult<Layer> {\n const result = LayerSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as Layer };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n\n/** Validate a single Delta */\nexport function validateDelta(input: unknown): ValidationResult<Delta> {\n const result = DeltaSchema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as Delta };\n }\n return { success: false, errors: formatErrors(result.error) };\n}\n","import { parse as yamlParse, stringify as yamlStringify } from \"yaml\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument } from \"./validate.js\";\nimport type { ValidationResult } from \"./validate.js\";\n\n/**\n * Parse a YAML string into a validated AtelierDocument.\n * Returns validation errors if the YAML is invalid or doesn't match the schema.\n */\nexport function parseAtelier(yamlString: string): ValidationResult<AtelierDocument> {\n let parsed: unknown;\n try {\n parsed = yamlParse(yamlString);\n } catch (err) {\n return {\n success: false,\n errors: [{ path: \"(yaml)\", message: `YAML parse error: ${(err as Error).message}` }],\n };\n }\n return validateDocument(parsed);\n}\n\n/**\n * Serialize an AtelierDocument to YAML string.\n */\nexport function serializeAtelier(doc: AtelierDocument): string {\n return yamlStringify(doc, { indent: 2 });\n}\n","// @a-company/atelier-mcp — Layer management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Layer, Visual, UnitValue } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n/** Zod schema for visual objects passed by the AI */\nconst VisualInputSchema = z.object({\n type: z.enum([\"shape\", \"text\", \"image\", \"group\", \"ref\"]).describe(\"Visual type\"),\n // shape visual fields\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]),\n cornerRadius: z.union([z.number(), z.tuple([z.number(), z.number(), z.number(), z.number()])]).optional(),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional(),\n closed: z.boolean().optional(),\n }).optional(),\n fill: z.record(z.unknown()).optional(),\n stroke: z.record(z.unknown()).optional(),\n // text visual fields\n content: z.string().optional(),\n style: z.record(z.unknown()).optional(),\n // image visual fields\n assetId: z.string().optional(),\n sourceRect: z.object({\n x: z.number(), y: z.number(), width: z.number().positive(), height: z.number().positive(),\n }).optional(),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).optional(),\n frameIndex: z.number().int().min(0).optional(),\n // ref visual fields\n src: z.string().optional(),\n state: z.string().optional(),\n frame: z.number().int().min(0).optional(),\n}).describe(\"Visual content definition\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_layer ───────────────────────────────────────\n server.tool(\n \"atelier_add_layer\",\n \"Add a new layer to an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Unique layer ID\"),\n visual: VisualInputSchema.describe(\"Visual content definition\"),\n x: z.union([z.number(), z.string()]).describe(\"X position (pixels or percentage)\"),\n y: z.union([z.number(), z.string()]).describe(\"Y position (pixels or percentage)\"),\n width: z.union([z.number(), z.string()]).describe(\"Width (pixels or percentage)\"),\n height: z.union([z.number(), z.string()]).describe(\"Height (pixels or percentage)\"),\n description: z.string().optional().describe(\"Layer description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n opacity: z.number().min(0).max(1).optional().describe(\"Opacity 0-1\"),\n rotation: z.number().optional().describe(\"Rotation in degrees\"),\n parentId: z.string().optional().describe(\"Parent layer ID for transform inheritance\"),\n anchorPoint: z.object({ x: z.number(), y: z.number() }).optional().describe(\"Anchor point (0-1 normalized)\"),\n scale: z.object({ x: z.number(), y: z.number() }).optional().describe(\"Scale factors\"),\n visible: z.boolean().optional().describe(\"Whether layer is visible\"),\n tint: z.object({\n color: z.string().describe(\"Tint color (hex string)\"),\n amount: z.number().min(0).max(1).describe(\"Tint amount (0 = none, 1 = full)\"),\n }).optional().describe(\"Color tint overlay\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, visual, x, y, width, height, description, tags, opacity, rotation, parentId, anchorPoint, scale, visible, tint }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Check for duplicate layer ID\n if (doc.layers.some(l => l.id === layerId)) {\n return err(`Layer \"${layerId}\" already exists in document \"${id}\"`);\n }\n\n // Validate parentId if provided\n if (parentId && !doc.layers.some(l => l.id === parentId)) {\n return err(`Parent layer \"${parentId}\" not found`);\n }\n\n const layer: Layer = {\n id: layerId,\n visual: visual as unknown as Visual,\n frame: { x: x as UnitValue, y: y as UnitValue },\n bounds: { width: width as UnitValue, height: height as UnitValue },\n ...(description != null ? { description } : {}),\n ...(tags ? { tags } : {}),\n ...(opacity != null ? { opacity } : {}),\n ...(rotation != null ? { rotation } : {}),\n ...(parentId ? { parentId } : {}),\n ...(anchorPoint ? { anchorPoint } : {}),\n ...(scale ? { scale } : {}),\n ...(visible != null ? { visible } : {}),\n ...(tint ? { tint } : {}),\n };\n\n doc.layers.push(layer);\n return ok({ layerId, index: doc.layers.length - 1 });\n },\n );\n\n // ── atelier_edit_layer ──────────────────────────────────────\n server.tool(\n \"atelier_edit_layer\",\n \"Edit properties of an existing layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to edit\"),\n x: z.union([z.number(), z.string()]).optional().describe(\"New X position\"),\n y: z.union([z.number(), z.string()]).optional().describe(\"New Y position\"),\n width: z.union([z.number(), z.string()]).optional().describe(\"New width\"),\n height: z.union([z.number(), z.string()]).optional().describe(\"New height\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n opacity: z.number().min(0).max(1).optional().describe(\"New opacity\"),\n rotation: z.number().optional().describe(\"New rotation\"),\n parentId: z.string().nullable().optional().describe(\"New parent layer ID (null to clear)\"),\n anchorPoint: z.object({ x: z.number(), y: z.number() }).optional().describe(\"New anchor point\"),\n scale: z.object({ x: z.number(), y: z.number() }).optional().describe(\"New scale\"),\n visible: z.boolean().optional().describe(\"New visibility\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, x, y, width, height, description, tags, opacity, rotation, parentId, anchorPoint, scale, visible }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (x != null) layer.frame.x = x as UnitValue;\n if (y != null) layer.frame.y = y as UnitValue;\n if (width != null) layer.bounds.width = width as UnitValue;\n if (height != null) layer.bounds.height = height as UnitValue;\n if (description != null) layer.description = description;\n if (tags) layer.tags = tags;\n if (opacity != null) layer.opacity = opacity;\n if (rotation != null) layer.rotation = rotation;\n if (parentId !== undefined) {\n if (parentId === null) {\n delete layer.parentId;\n } else {\n if (!doc.layers.some(l => l.id === parentId)) return err(`Parent layer \"${parentId}\" not found`);\n layer.parentId = parentId;\n }\n }\n if (anchorPoint) layer.anchorPoint = anchorPoint;\n if (scale) layer.scale = scale;\n if (visible != null) layer.visible = visible;\n\n return ok({ layerId, updated: true });\n },\n );\n\n // ── atelier_remove_layer ────────────────────────────────────\n server.tool(\n \"atelier_remove_layer\",\n \"Remove a layer from an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, layerId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const index = doc.layers.findIndex(l => l.id === layerId);\n if (index === -1) return err(`Layer \"${layerId}\" not found`);\n\n // Check for deltas that reference this layer\n const warnings: string[] = [];\n for (const [stateName, state] of Object.entries(doc.states)) {\n const deltaCount = state.deltas.filter(d => d.layer === layerId).length;\n if (deltaCount > 0) {\n warnings.push(`State \"${stateName}\" has ${deltaCount} delta(s) referencing this layer`);\n }\n }\n\n // Check for child layers\n const childCount = doc.layers.filter(l => l.parentId === layerId).length;\n if (childCount > 0) {\n warnings.push(`${childCount} child layer(s) reference this layer as parent`);\n }\n\n doc.layers.splice(index, 1);\n return ok({ layerId, removed: true, warnings });\n },\n );\n\n // ── atelier_list_layers ─────────────────────────────────────\n server.tool(\n \"atelier_list_layers\",\n \"List all layers in an Atelier document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layers = doc.layers.map((l, index) => ({\n index,\n id: l.id,\n type: l.visual.type,\n frame: l.frame,\n bounds: l.bounds,\n description: l.description,\n tags: l.tags,\n opacity: l.opacity,\n rotation: l.rotation,\n parentId: l.parentId,\n visible: l.visible,\n }));\n\n return ok({ layers, count: layers.length });\n },\n );\n\n // ── atelier_reorder ─────────────────────────────────────────\n server.tool(\n \"atelier_reorder\",\n \"Move a layer to a new position in the layer stack\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID to move\"),\n position: z.number().int().min(0).describe(\"Target position index (0-based)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, position }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const currentIndex = doc.layers.findIndex(l => l.id === layerId);\n if (currentIndex === -1) return err(`Layer \"${layerId}\" not found`);\n\n const targetPos = Math.min(position, doc.layers.length - 1);\n const [layer] = doc.layers.splice(currentIndex, 1);\n doc.layers.splice(targetPos, 0, layer);\n\n return ok({ layerId, from: currentIndex, to: targetPos });\n },\n );\n}\n","// @a-company/atelier-mcp — Shape, fill, and stroke tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, ShapeVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_shape ───────────────────────────────────────\n server.tool(\n \"atelier_set_shape\",\n \"Set the shape on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]).describe(\"Shape type\"),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional().describe(\"Corner radius (rect only)\"),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional().describe(\"Path points (path only)\"),\n closed: z.boolean().optional().describe(\"Whether path is closed (path only)\"),\n }).describe(\"Shape definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, shape }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).shape = shape as ShapeVisual[\"shape\"];\n return ok({ layerId, shape: shape.type });\n },\n );\n\n // ── atelier_set_fill ────────────────────────────────────────\n server.tool(\n \"atelier_set_fill\",\n \"Set the fill on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n fill: z.object({\n type: z.enum([\"solid\", \"linear-gradient\", \"radial-gradient\"]).describe(\"Fill type\"),\n color: z.unknown().optional().describe(\"Color for solid fill (hex string or RGBA/HSLA object)\"),\n angle: z.number().optional().describe(\"Angle in degrees (linear-gradient only)\"),\n center: z.object({\n x: z.union([z.number(), z.string()]),\n y: z.union([z.number(), z.string()]),\n }).optional().describe(\"Center point (radial-gradient only)\"),\n radius: z.union([z.number(), z.string()]).optional().describe(\"Radius (radial-gradient only)\"),\n stops: z.array(z.object({\n offset: z.number().min(0).max(1),\n color: z.unknown(),\n })).optional().describe(\"Gradient stops\"),\n }).describe(\"Fill definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, fill }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).fill = fill as unknown as ShapeVisual[\"fill\"];\n return ok({ layerId, fillType: fill.type });\n },\n );\n\n // ── atelier_set_stroke ──────────────────────────────────────\n server.tool(\n \"atelier_set_stroke\",\n \"Set the stroke on a shape-type layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a shape visual)\"),\n stroke: z.object({\n color: z.unknown().describe(\"Stroke color (hex string or RGBA/HSLA object)\"),\n width: z.number().positive().describe(\"Stroke width in pixels\"),\n dash: z.array(z.number()).optional().describe(\"Dash pattern\"),\n lineCap: z.enum([\"butt\", \"round\", \"square\"]).optional().describe(\"Line cap style\"),\n lineJoin: z.enum([\"miter\", \"round\", \"bevel\"]).optional().describe(\"Line join style\"),\n }).describe(\"Stroke definition\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, stroke }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"shape\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"shape\"`);\n\n (layer.visual as ShapeVisual).stroke = stroke as unknown as ShapeVisual[\"stroke\"];\n return ok({ layerId, strokeWidth: stroke.width });\n },\n );\n}\n","// @a-company/atelier-mcp — State management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_state ───────────────────────────────────────\n server.tool(\n \"atelier_add_state\",\n \"Add a named animation state to a document\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name (e.g. 'intro', 'hover', 'exit')\"),\n duration: z.number().positive().int().describe(\"Duration in frames\"),\n description: z.string().optional().describe(\"State description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, duration, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (doc.states[stateName]) {\n return err(`State \"${stateName}\" already exists`);\n }\n\n doc.states[stateName] = {\n duration,\n deltas: [],\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n return ok({ stateName, duration });\n },\n );\n\n // ── atelier_edit_state ──────────────────────────────────────\n server.tool(\n \"atelier_edit_state\",\n \"Edit metadata of an existing animation state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to edit\"),\n duration: z.number().positive().int().optional().describe(\"New duration in frames\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, duration, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (duration != null) state.duration = duration;\n if (description != null) state.description = description;\n if (tags) state.tags = tags;\n\n return ok({ stateName, updated: true });\n },\n );\n\n // ── atelier_remove_state ────────────────────────────────────\n server.tool(\n \"atelier_remove_state\",\n \"Remove an animation state and all its deltas\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, stateName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) return err(`State \"${stateName}\" not found`);\n\n const deltaCount = doc.states[stateName].deltas.length;\n delete doc.states[stateName];\n\n return ok({ stateName, removed: true, deltasRemoved: deltaCount });\n },\n );\n\n // ── atelier_list_states ─────────────────────────────────────\n server.tool(\n \"atelier_list_states\",\n \"List all animation states in a document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const states = Object.entries(doc.states).map(([name, state]) => ({\n name,\n duration: state.duration,\n description: state.description,\n tags: state.tags,\n deltaCount: state.deltas.length,\n }));\n\n return ok({ states, count: states.length });\n },\n );\n}\n","// @a-company/atelier-mcp — Delta (animation keyframe) tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Delta, AnimatableProperty, Easing } from \"@a-company/atelier-types\";\nimport { AnimatablePropertySchema, EasingSchema } from \"@a-company/atelier-schema\";\nimport { validateNoOverlap, expandPreset } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n// Canonical source: @a-company/atelier-schema — single source of truth for AnimatableProperty\nconst AnimatablePropertyEnum = AnimatablePropertySchema;\nconst EasingInputSchema = EasingSchema.describe(\"Easing function\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_delta ───────────────────────────────────────\n server.tool(\n \"atelier_add_delta\",\n \"Add an animation delta (keyframe transition) to a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n layer: z.string().describe(\"Target layer ID\"),\n property: AnimatablePropertyEnum.describe(\"Property to animate\"),\n range: z.tuple([z.number().int().min(0), z.number().int().min(0)]).describe(\"Frame range [start, end] inclusive\"),\n from: z.unknown().describe(\"Starting value\"),\n to: z.unknown().describe(\"Ending value\"),\n easing: EasingInputSchema.optional().describe(\"Easing function\"),\n description: z.string().optional().describe(\"Delta description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n deltaId: z.string().optional().describe(\"Custom delta ID\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, layer, property, range, from, to, easing, description, tags, deltaId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Validate state exists\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n // Validate layer exists\n if (!doc.layers.some(l => l.id === layer)) {\n return err(`Layer \"${layer}\" not found`);\n }\n\n // Validate range\n if (range[0] > range[1]) {\n return err(`Invalid range: start (${range[0]}) must be <= end (${range[1]})`);\n }\n\n const delta: Delta = {\n layer,\n property: property as AnimatableProperty,\n range: [range[0], range[1]],\n from,\n to,\n ...(easing ? { easing: easing as Easing } : {}),\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n ...(deltaId ? { id: deltaId } : {}),\n };\n\n // Check for overlaps\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n return err(overlap.message);\n }\n\n state.deltas.push(delta);\n return ok({ stateName, deltaIndex: state.deltas.length - 1, layer, property });\n },\n );\n\n // ── atelier_edit_delta ──────────────────────────────────────\n server.tool(\n \"atelier_edit_delta\",\n \"Edit an existing delta by index within a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n deltaIndex: z.number().int().min(0).describe(\"Delta index within the state\"),\n layer: z.string().optional().describe(\"New target layer ID\"),\n property: AnimatablePropertyEnum.optional().describe(\"New property to animate\"),\n range: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional().describe(\"New frame range [start, end]\"),\n from: z.unknown().optional().describe(\"New starting value\"),\n to: z.unknown().optional().describe(\"New ending value\"),\n easing: EasingInputSchema.optional().describe(\"New easing function\"),\n description: z.string().optional().describe(\"New description\"),\n tags: z.array(z.string()).optional().describe(\"New tags\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, deltaIndex, layer, property, range, from, to, easing, description, tags }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (deltaIndex >= state.deltas.length) {\n return err(`Delta index ${deltaIndex} out of range (${state.deltas.length} deltas)`);\n }\n\n const delta = state.deltas[deltaIndex];\n\n // Apply updates\n if (layer != null) {\n if (!doc.layers.some(l => l.id === layer)) return err(`Layer \"${layer}\" not found`);\n delta.layer = layer;\n }\n if (property != null) delta.property = property as AnimatableProperty;\n if (range != null) {\n if (range[0] > range[1]) return err(`Invalid range: start (${range[0]}) must be <= end (${range[1]})`);\n delta.range = [range[0], range[1]];\n }\n if (from !== undefined) delta.from = from;\n if (to !== undefined) delta.to = to;\n if (easing != null) delta.easing = easing as Easing;\n if (description != null) delta.description = description;\n if (tags) delta.tags = tags;\n\n // Re-validate overlaps with the updated delta against others\n const others = state.deltas.filter((_, i) => i !== deltaIndex);\n const overlap = validateNoOverlap(others, delta);\n if (overlap) {\n return err(`Edit would cause overlap: ${overlap.message}`);\n }\n\n return ok({ stateName, deltaIndex, updated: true });\n },\n );\n\n // ── atelier_remove_delta ────────────────────────────────────\n server.tool(\n \"atelier_remove_delta\",\n \"Remove a delta by index from a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n deltaIndex: z.number().int().min(0).describe(\"Delta index to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, stateName, deltaIndex }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (deltaIndex >= state.deltas.length) {\n return err(`Delta index ${deltaIndex} out of range (${state.deltas.length} deltas)`);\n }\n\n const removed = state.deltas.splice(deltaIndex, 1)[0];\n return ok({\n stateName,\n removed: {\n layer: removed.layer,\n property: removed.property,\n range: removed.range,\n },\n remainingDeltas: state.deltas.length,\n });\n },\n );\n\n // ── atelier_apply_preset ────────────────────────────────────\n server.tool(\n \"atelier_apply_preset\",\n \"Apply a preset to a layer, expanding it into concrete deltas\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to add deltas to\"),\n presetName: z.string().describe(\"Preset name defined in the document\"),\n layerId: z.string().describe(\"Target layer ID\"),\n startFrame: z.number().int().min(0).optional().describe(\"Start frame (default: 0)\"),\n duration: z.number().positive().int().optional().describe(\"Duration for preset (default: state duration)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, presetName, layerId, startFrame, duration }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (!doc.layers.some(l => l.id === layerId)) {\n return err(`Layer \"${layerId}\" not found`);\n }\n\n if (!doc.presets || !doc.presets[presetName]) {\n return err(`Preset \"${presetName}\" not found`);\n }\n\n const preset = doc.presets[presetName];\n const start = startFrame ?? 0;\n const dur = duration ?? state.duration;\n\n const deltas = expandPreset(preset, layerId, start, dur);\n\n // Validate no overlaps for each new delta\n const errors: string[] = [];\n for (const delta of deltas) {\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n errors.push(overlap.message);\n }\n }\n\n if (errors.length > 0) {\n return err(`Preset would cause overlaps:\\n${errors.join(\"\\n\")}`);\n }\n\n // Add all deltas\n state.deltas.push(...deltas);\n\n return ok({\n stateName,\n presetName,\n layerId,\n deltasAdded: deltas.length,\n totalDeltas: state.deltas.length,\n });\n },\n );\n}\n","/**\n * Linear easing — no acceleration.\n */\nexport function linear(t: number): number {\n return t;\n}\n\n/**\n * Cubic bezier easing — CSS-compatible.\n * Implements the same algorithm as CSS cubic-bezier().\n * @param x1 - first control point x\n * @param y1 - first control point y\n * @param x2 - second control point x\n * @param y2 - second control point y\n */\nexport function cubicBezier(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): (t: number) => number {\n // Use binary search to find the parametric t value that gives us our x,\n // then compute the corresponding y. This is the standard algorithm used\n // by browsers for CSS transitions.\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n\n // Binary search for the parametric t value that gives us our x\n let lo = 0;\n let hi = 1;\n let mid: number = 0;\n\n for (let i = 0; i < 20; i++) {\n mid = (lo + hi) / 2;\n const x = sampleBezier(x1, x2, mid);\n if (Math.abs(x - t) < 1e-6) break;\n if (x < t) lo = mid;\n else hi = mid;\n }\n\n mid = (lo + hi) / 2;\n return sampleBezier(y1, y2, mid);\n };\n}\n\n/** Sample a single axis of a cubic bezier at parametric t */\nfunction sampleBezier(p1: number, p2: number, t: number): number {\n // B(t) = 3(1-t)^2*t*p1 + 3(1-t)*t^2*p2 + t^3\n return 3 * (1 - t) * (1 - t) * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t;\n}\n\n/** Common CSS easing presets */\nexport const easeIn = cubicBezier(0.42, 0, 1, 1);\nexport const easeOut = cubicBezier(0, 0, 0.58, 1);\nexport const easeInOut = cubicBezier(0.42, 0, 0.58, 1);\n\n/**\n * Step easing — jumps between discrete values.\n * @param steps - number of steps\n * @param position - \"start\" or \"end\" (default \"end\")\n */\nexport function step(\n steps: number,\n position: \"start\" | \"end\" = \"end\",\n): (t: number) => number {\n return (t: number): number => {\n if (t <= 0) return position === \"start\" ? 1 / steps : 0;\n if (t >= 1) return 1;\n\n const s = Math.floor(t * steps);\n if (position === \"start\") {\n return Math.min((s + 1) / steps, 1);\n }\n return s / steps;\n };\n}\n","export interface SpringConfig {\n mass?: number; // default 1\n stiffness?: number; // default 100\n damping?: number; // default 10\n velocity?: number; // default 0\n}\n\n/**\n * Creates a spring easing function.\n * Uses damped harmonic oscillator physics.\n * Returns a function that takes t (0-1) and returns the spring value.\n *\n * The spring always goes from 0 to 1, but may overshoot.\n */\nexport function spring(config: SpringConfig = {}): (t: number) => number {\n const {\n mass = 1,\n stiffness = 100,\n damping = 10,\n velocity = 0,\n } = config;\n\n const w0 = Math.sqrt(stiffness / mass); // natural frequency\n const zeta = damping / (2 * Math.sqrt(stiffness * mass)); // damping ratio\n\n // Determine total duration to normalize t\n // We pre-calculate a reasonable duration where the spring settles\n const duration = estimateSettleTime(zeta, w0);\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n\n const time = t * duration;\n let value: number;\n\n if (zeta < 1) {\n // Underdamped\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n const A = 1;\n const B = (zeta * w0 + velocity) / wd;\n value =\n 1 -\n Math.exp(-zeta * w0 * time) *\n (A * Math.cos(wd * time) + B * Math.sin(wd * time));\n } else if (zeta === 1) {\n // Critically damped\n value = 1 - Math.exp(-w0 * time) * (1 + (w0 + velocity) * time);\n } else {\n // Overdamped\n const s1 = -w0 * (zeta - Math.sqrt(zeta * zeta - 1));\n const s2 = -w0 * (zeta + Math.sqrt(zeta * zeta - 1));\n const A = (velocity - s2) / (s1 - s2);\n const B = 1 - A;\n value = 1 - A * Math.exp(s1 * time) - B * Math.exp(s2 * time);\n }\n\n return value;\n };\n}\n\n/**\n * Estimates the time for a spring to settle within 0.1% of target.\n */\nfunction estimateSettleTime(zeta: number, w0: number): number {\n if (zeta >= 1) {\n return 10 / (zeta * w0);\n }\n // For underdamped: settling ~ -ln(0.001) / (zeta * w0)\n return Math.log(1000) / (zeta * w0);\n}\n","/**\n * Linear interpolation between two numbers.\n */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Clamp a value between min and max.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Interpolate between two multi-dimensional values.\n * Arrays must be the same length.\n */\nexport function lerpArray(a: number[], b: number[], t: number): number[] {\n return a.map((v, i) => lerp(v, b[i], t));\n}\n\n/**\n * Re-maps a value from one range to another.\n */\nexport function remap(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n const t = (value - inMin) / (inMax - inMin);\n return lerp(outMin, outMax, t);\n}\n","import { lerp, clamp } from \"./lerp.js\";\n\nexport interface RGBA {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n a: number; // 0-1\n}\n\nexport interface HSLA {\n h: number; // 0-360\n s: number; // 0-100\n l: number; // 0-100\n a: number; // 0-1\n}\n\n/**\n * Parse a hex color string to RGBA.\n * Supports: #RGB, #RGBA, #RRGGBB, #RRGGBBAA\n */\nexport function hexToRgba(hex: string): RGBA {\n let h = hex.replace(\"#\", \"\");\n\n if (h.length === 3)\n h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] + \"ff\";\n else if (h.length === 4)\n h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] + h[3] + h[3];\n else if (h.length === 6) h = h + \"ff\";\n\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n a: parseInt(h.slice(6, 8), 16) / 255,\n };\n}\n\n/**\n * Convert RGBA to hex string.\n */\nexport function rgbaToHex(color: RGBA): string {\n const r = clamp(Math.round(color.r), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const g = clamp(Math.round(color.g), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const b = clamp(Math.round(color.b), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n const a = clamp(Math.round(color.a * 255), 0, 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}${a === \"ff\" ? \"\" : a}`;\n}\n\n/**\n * Interpolate between two RGBA colors.\n */\nexport function lerpRgba(a: RGBA, b: RGBA, t: number): RGBA {\n return {\n r: lerp(a.r, b.r, t),\n g: lerp(a.g, b.g, t),\n b: lerp(a.b, b.b, t),\n a: lerp(a.a, b.a, t),\n };\n}\n\n/**\n * Convert RGBA to HSLA.\n */\nexport function rgbaToHsla(color: RGBA): HSLA {\n const r = color.r / 255;\n const g = color.g / 255;\n const b = color.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100, a: color.a };\n}\n\n/**\n * Convert HSLA to RGBA.\n */\nexport function hslaToRgba(color: HSLA): RGBA {\n const h = color.h / 360;\n const s = color.s / 100;\n const l = color.l / 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hueToRgb(p, q, h + 1 / 3);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n a: color.a,\n };\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\n/**\n * Interpolate between two HSLA colors (shortest hue path).\n */\nexport function lerpHsla(a: HSLA, b: HSLA, t: number): HSLA {\n // Handle hue wrapping — take the shortest path\n let dh = b.h - a.h;\n if (dh > 180) dh -= 360;\n if (dh < -180) dh += 360;\n\n return {\n h: (((a.h + dh * t) % 360) + 360) % 360,\n s: lerp(a.s, b.s, t),\n l: lerp(a.l, b.l, t),\n a: lerp(a.a, b.a, t),\n };\n}\n","/**\n * Path interpolation utilities for motion paths.\n * Evaluates position and tangent along a path defined by points with bezier handles.\n */\n\nexport interface PathPoint2D {\n x: number;\n y: number;\n in?: { x: number; y: number };\n out?: { x: number; y: number };\n}\n\nexport interface PathPosition {\n x: number;\n y: number;\n /** Tangent angle in degrees */\n angle: number;\n}\n\n/**\n * Compute the length of a single cubic bezier segment using subdivision.\n */\nfunction bezierSegmentLength(\n p0x: number, p0y: number,\n c0x: number, c0y: number,\n c1x: number, c1y: number,\n p1x: number, p1y: number,\n steps = 32,\n): number {\n let length = 0;\n let prevX = p0x;\n let prevY = p0y;\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const mt = 1 - t;\n const x = mt * mt * mt * p0x + 3 * mt * mt * t * c0x + 3 * mt * t * t * c1x + t * t * t * p1x;\n const y = mt * mt * mt * p0y + 3 * mt * mt * t * c0y + 3 * mt * t * t * c1y + t * t * t * p1y;\n const dx = x - prevX;\n const dy = y - prevY;\n length += Math.sqrt(dx * dx + dy * dy);\n prevX = x;\n prevY = y;\n }\n return length;\n}\n\n/**\n * Evaluate a cubic bezier at parameter t, returning position and tangent.\n */\nfunction evalBezier(\n p0x: number, p0y: number,\n c0x: number, c0y: number,\n c1x: number, c1y: number,\n p1x: number, p1y: number,\n t: number,\n): PathPosition {\n const mt = 1 - t;\n const x = mt * mt * mt * p0x + 3 * mt * mt * t * c0x + 3 * mt * t * t * c1x + t * t * t * p1x;\n const y = mt * mt * mt * p0y + 3 * mt * mt * t * c0y + 3 * mt * t * t * c1y + t * t * t * p1y;\n\n // Tangent (first derivative)\n const tx = 3 * mt * mt * (c0x - p0x) + 6 * mt * t * (c1x - c0x) + 3 * t * t * (p1x - c1x);\n const ty = 3 * mt * mt * (c0y - p0y) + 6 * mt * t * (c1y - c0y) + 3 * t * t * (p1y - c1y);\n\n const angle = Math.atan2(ty, tx) * (180 / Math.PI);\n\n return { x, y, angle };\n}\n\n/**\n * Build a lookup table of cumulative segment lengths for a path.\n */\nfunction buildSegmentLengths(points: PathPoint2D[], closed: boolean): number[] {\n const segCount = closed ? points.length : points.length - 1;\n const lengths: number[] = [];\n\n for (let i = 0; i < segCount; i++) {\n const p0 = points[i];\n const p1 = points[(i + 1) % points.length];\n\n const c0x = p0.x + (p0.out?.x ?? 0);\n const c0y = p0.y + (p0.out?.y ?? 0);\n const c1x = p1.x + (p1.in?.x ?? 0);\n const c1y = p1.y + (p1.in?.y ?? 0);\n\n lengths.push(bezierSegmentLength(p0.x, p0.y, c0x, c0y, c1x, c1y, p1.x, p1.y));\n }\n\n return lengths;\n}\n\n/**\n * Evaluate a point along a path at a given progress (0–1).\n * Uses arc-length parameterization for uniform speed.\n */\nexport function evaluatePathAtProgress(\n points: PathPoint2D[],\n progress: number,\n closed = false,\n): PathPosition {\n if (points.length < 2) {\n return { x: points[0]?.x ?? 0, y: points[0]?.y ?? 0, angle: 0 };\n }\n\n // Clamp progress\n const t = Math.max(0, Math.min(1, progress));\n\n const segLengths = buildSegmentLengths(points, closed);\n const totalLength = segLengths.reduce((a, b) => a + b, 0);\n\n if (totalLength === 0) {\n return { x: points[0].x, y: points[0].y, angle: 0 };\n }\n\n const targetLength = t * totalLength;\n\n // Find which segment the target length falls in\n let accumulated = 0;\n for (let i = 0; i < segLengths.length; i++) {\n const segLen = segLengths[i];\n if (accumulated + segLen >= targetLength || i === segLengths.length - 1) {\n // Progress within this segment\n const segProgress = segLen === 0 ? 0 : (targetLength - accumulated) / segLen;\n\n const p0 = points[i];\n const p1 = points[(i + 1) % points.length];\n\n const c0x = p0.x + (p0.out?.x ?? 0);\n const c0y = p0.y + (p0.out?.y ?? 0);\n const c1x = p1.x + (p1.in?.x ?? 0);\n const c1y = p1.y + (p1.in?.y ?? 0);\n\n return evalBezier(p0.x, p0.y, c0x, c0y, c1x, c1y, p1.x, p1.y, segProgress);\n }\n accumulated += segLen;\n }\n\n // Fallback (shouldn't reach here)\n const last = points[points.length - 1];\n return { x: last.x, y: last.y, angle: 0 };\n}\n","import type { Delta, FrameRange } from \"@a-company/atelier-types\";\nimport { lerp, clamp, hexToRgba, lerpRgba, rgbaToHex } from \"@a-company/atelier-math\";\nimport { resolveEasing } from \"./easing-resolver.js\";\nimport { isExpression, evaluateExpression, type ExpressionContext } from \"../expressions/expression-evaluator.js\";\n\n/**\n * Check if a frame is within a delta's range (inclusive).\n */\nexport function isFrameInRange(frame: number, range: FrameRange): boolean {\n return frame >= range[0] && frame <= range[1];\n}\n\n/**\n * Compute the progress (0-1) of a frame within a delta's range.\n */\nexport function computeProgress(frame: number, range: FrameRange): number {\n const [start, end] = range;\n if (start === end) return 1; // instantaneous\n return clamp((frame - start) / (end - start), 0, 1);\n}\n\n/**\n * Resolve a single delta's value at a given frame.\n * Returns undefined if the frame is outside the delta's range.\n * Returns the interpolated value if within range.\n *\n * If `from` or `to` is an expression object `{ expr: \"...\" }`,\n * it is evaluated with the current animation context before interpolation.\n */\nexport function resolveDeltaValue(delta: Delta, frame: number): unknown | undefined {\n if (!isFrameInRange(frame, delta.range)) {\n return undefined;\n }\n\n const progress = computeProgress(frame, delta.range);\n const easingFn = resolveEasing(delta.easing);\n const easedProgress = easingFn(progress);\n\n const exprCtx: ExpressionContext = {\n t: easedProgress,\n progress,\n frame,\n duration: delta.range[1] - delta.range[0],\n };\n\n const from = isExpression(delta.from)\n ? evaluateExpression(delta.from.expr, exprCtx)\n : delta.from;\n\n const to = isExpression(delta.to)\n ? evaluateExpression(delta.to.expr, exprCtx)\n : delta.to;\n\n return interpolateValue(from, to, easedProgress);\n}\n\n/**\n * Interpolate between two values based on eased progress.\n * Handles numbers, strings (pass-through at threshold), and nested objects.\n */\nexport function interpolateValue(from: unknown, to: unknown, t: number): unknown {\n // Number interpolation\n if (typeof from === \"number\" && typeof to === \"number\") {\n return lerp(from, to, t);\n }\n\n // Hex color interpolation\n if (typeof from === \"string\" && typeof to === \"string\") {\n if (from.startsWith(\"#\") && to.startsWith(\"#\")) {\n return rgbaToHex(lerpRgba(hexToRgba(from), hexToRgba(to), t));\n }\n // Non-color strings — snap at end\n return t >= 1 ? to : from;\n }\n\n // Boolean interpolation — snap at midpoint for frame-precise control\n if (typeof from === \"boolean\" && typeof to === \"boolean\") {\n return t >= 0.5 ? to : from;\n }\n\n // For unknown types, snap at end\n return t >= 1 ? to : from;\n}\n\n/**\n * Given multiple deltas for the SAME layer+property, find the active one\n * at a given frame and return its resolved value.\n *\n * If no delta is active at this frame, holds the `to` value of the most\n * recent completed delta (the one whose range ended most recently before\n * this frame). This prevents properties from reverting after animation ends.\n *\n * Assumes no overlaps (validated elsewhere).\n */\nexport function resolvePropertyAtFrame(\n deltas: Delta[],\n frame: number,\n): unknown | undefined {\n // Check for an active delta first\n for (const delta of deltas) {\n if (isFrameInRange(frame, delta.range)) {\n return resolveDeltaValue(delta, frame);\n }\n }\n\n // No active delta — hold the `to` value of the most recently completed delta\n let lastCompleted: Delta | undefined;\n for (const delta of deltas) {\n if (frame > delta.range[1]) {\n if (!lastCompleted || delta.range[1] > lastCompleted.range[1]) {\n lastCompleted = delta;\n }\n }\n }\n\n if (!lastCompleted) return undefined;\n\n // If the held `to` value is an expression, evaluate at t=1\n if (isExpression(lastCompleted.to)) {\n return evaluateExpression(lastCompleted.to.expr, {\n t: 1,\n progress: 1,\n frame,\n duration: lastCompleted.range[1] - lastCompleted.range[0],\n });\n }\n\n return lastCompleted.to;\n}\n","import type { Easing } from \"@a-company/atelier-types\";\nimport { linear, cubicBezier, easeIn, easeOut, easeInOut, step, spring } from \"@a-company/atelier-math\";\n\n/**\n * Converts an Easing type definition into an executable easing function.\n * Returns a function (t: number) => number where t is 0-1.\n */\nexport function resolveEasing(easing: Easing | undefined): (t: number) => number {\n if (!easing) return linear;\n\n // String presets\n if (typeof easing === \"string\") {\n switch (easing) {\n case \"linear\": return linear;\n case \"ease-in\": return easeIn;\n case \"ease-out\": return easeOut;\n case \"ease-in-out\": return easeInOut;\n default: return linear;\n }\n }\n\n // Object easing definitions\n switch (easing.type) {\n case \"linear\":\n return linear;\n case \"cubic-bezier\":\n return cubicBezier(easing.x1, easing.y1, easing.x2, easing.y2);\n case \"spring\":\n return spring({\n mass: easing.mass,\n stiffness: easing.stiffness,\n damping: easing.damping,\n velocity: easing.velocity,\n });\n case \"step\":\n return step(easing.steps, easing.position);\n default:\n return linear;\n }\n}\n","/**\n * Safe recursive descent expression evaluator.\n * No eval(), no Function(), no code generation.\n *\n * Supports:\n * - Numbers: 42, 3.14, -1\n * - Operators: + - * / % **\n * - Parentheses: (expr)\n * - Math functions: sin, cos, tan, abs, min, max, floor, ceil, round, sqrt, pow, clamp, sign, log\n * - Constants: pi, tau, e\n * - Context variables: t, frame, duration, progress\n * - Comparison: <, >, <=, >=, ==, !=\n * - Ternary: condition ? trueExpr : falseExpr\n */\n\n/** Context variables available during expression evaluation */\nexport interface ExpressionContext {\n /** Eased progress 0–1 */\n t: number;\n /** Raw progress 0–1 (before easing) */\n progress: number;\n /** Current frame number */\n frame: number;\n /** Delta duration in frames */\n duration: number;\n}\n\n// ── Tokenizer ───────────────────────────────────────────────\n\ntype TokenType =\n | \"number\"\n | \"ident\"\n | \"op\"\n | \"lparen\"\n | \"rparen\"\n | \"comma\"\n | \"question\"\n | \"colon\"\n | \"compare\"\n | \"eof\";\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Numbers\n if ((ch >= \"0\" && ch <= \"9\") || ch === \".\") {\n let num = \"\";\n while (i < expr.length && ((expr[i] >= \"0\" && expr[i] <= \"9\") || expr[i] === \".\")) {\n num += expr[i++];\n }\n tokens.push({ type: \"number\", value: num });\n continue;\n }\n\n // Identifiers (variables, functions, constants)\n if ((ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\") || ch === \"_\") {\n let id = \"\";\n while (i < expr.length && ((expr[i] >= \"a\" && expr[i] <= \"z\") || (expr[i] >= \"A\" && expr[i] <= \"Z\") || (expr[i] >= \"0\" && expr[i] <= \"9\") || expr[i] === \"_\")) {\n id += expr[i++];\n }\n tokens.push({ type: \"ident\", value: id });\n continue;\n }\n\n // Comparison operators (must check before single-char ops)\n if (ch === \"<\" || ch === \">\" || ch === \"!\" || ch === \"=\") {\n if (i + 1 < expr.length && expr[i + 1] === \"=\") {\n tokens.push({ type: \"compare\", value: ch + \"=\" });\n i += 2;\n continue;\n }\n if (ch === \"<\" || ch === \">\") {\n tokens.push({ type: \"compare\", value: ch });\n i++;\n continue;\n }\n }\n\n // Power operator\n if (ch === \"*\" && i + 1 < expr.length && expr[i + 1] === \"*\") {\n tokens.push({ type: \"op\", value: \"**\" });\n i += 2;\n continue;\n }\n\n // Operators\n if (ch === \"+\" || ch === \"-\" || ch === \"*\" || ch === \"/\" || ch === \"%\") {\n tokens.push({ type: \"op\", value: ch });\n i++;\n continue;\n }\n\n // Grouping and function calls\n if (ch === \"(\") { tokens.push({ type: \"lparen\", value: \"(\" }); i++; continue; }\n if (ch === \")\") { tokens.push({ type: \"rparen\", value: \")\" }); i++; continue; }\n if (ch === \",\") { tokens.push({ type: \"comma\", value: \",\" }); i++; continue; }\n\n // Ternary\n if (ch === \"?\") { tokens.push({ type: \"question\", value: \"?\" }); i++; continue; }\n if (ch === \":\") { tokens.push({ type: \"colon\", value: \":\" }); i++; continue; }\n\n throw new Error(`Expression: unexpected character '${ch}' at position ${i}`);\n }\n\n tokens.push({ type: \"eof\", value: \"\" });\n return tokens;\n}\n\n// ── Parser + Evaluator ──────────────────────────────────────\n\nconst CONSTANTS: Record<string, number> = {\n pi: Math.PI,\n PI: Math.PI,\n tau: Math.PI * 2,\n TAU: Math.PI * 2,\n e: Math.E,\n E: Math.E,\n};\n\nconst FUNCTIONS: Record<string, (...args: number[]) => number> = {\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n abs: Math.abs,\n floor: Math.floor,\n ceil: Math.ceil,\n round: Math.round,\n sqrt: Math.sqrt,\n sign: Math.sign,\n log: Math.log,\n min: (...args) => Math.min(...args),\n max: (...args) => Math.max(...args),\n pow: (a, b) => Math.pow(a, b),\n clamp: (v, lo, hi) => Math.min(Math.max(v, lo), hi),\n};\n\nclass Parser {\n private tokens: Token[];\n private pos = 0;\n private ctx: ExpressionContext;\n\n constructor(tokens: Token[], ctx: ExpressionContext) {\n this.tokens = tokens;\n this.ctx = ctx;\n }\n\n private peek(): Token {\n return this.tokens[this.pos];\n }\n\n private consume(expectedType?: TokenType): Token {\n const tok = this.tokens[this.pos++];\n if (expectedType && tok.type !== expectedType) {\n throw new Error(`Expression: expected ${expectedType} but got ${tok.type} '${tok.value}'`);\n }\n return tok;\n }\n\n /** Entry: ternary (lowest precedence) */\n parse(): number {\n const result = this.parseTernary();\n if (this.peek().type !== \"eof\") {\n throw new Error(`Expression: unexpected token '${this.peek().value}'`);\n }\n return result;\n }\n\n /** ternary: comparison ? expr : expr */\n private parseTernary(): number {\n const condition = this.parseComparison();\n if (this.peek().type === \"question\") {\n this.consume(); // ?\n const trueVal = this.parseTernary();\n this.consume(\"colon\"); // :\n const falseVal = this.parseTernary();\n return condition ? trueVal : falseVal;\n }\n return condition;\n }\n\n /** comparison: additive (< | > | <= | >= | == | !=) additive */\n private parseComparison(): number {\n let left = this.parseAdditive();\n while (this.peek().type === \"compare\") {\n const op = this.consume().value;\n const right = this.parseAdditive();\n switch (op) {\n case \"<\": left = left < right ? 1 : 0; break;\n case \">\": left = left > right ? 1 : 0; break;\n case \"<=\": left = left <= right ? 1 : 0; break;\n case \">=\": left = left >= right ? 1 : 0; break;\n case \"==\": left = left === right ? 1 : 0; break;\n case \"!=\": left = left !== right ? 1 : 0; break;\n }\n }\n return left;\n }\n\n /** additive: multiplicative (('+' | '-') multiplicative)* */\n private parseAdditive(): number {\n let left = this.parseMultiplicative();\n while (this.peek().type === \"op\" && (this.peek().value === \"+\" || this.peek().value === \"-\")) {\n const op = this.consume().value;\n const right = this.parseMultiplicative();\n left = op === \"+\" ? left + right : left - right;\n }\n return left;\n }\n\n /** multiplicative: power (('*' | '/' | '%') power)* */\n private parseMultiplicative(): number {\n let left = this.parsePower();\n while (this.peek().type === \"op\" && (this.peek().value === \"*\" || this.peek().value === \"/\" || this.peek().value === \"%\")) {\n const op = this.consume().value;\n const right = this.parsePower();\n if (op === \"*\") left = left * right;\n else if (op === \"/\") left = right !== 0 ? left / right : 0;\n else left = left % right;\n }\n return left;\n }\n\n /** power: unary ('**' unary)* (right-associative) */\n private parsePower(): number {\n const base = this.parseUnary();\n if (this.peek().type === \"op\" && this.peek().value === \"**\") {\n this.consume();\n const exp = this.parsePower(); // right-associative\n return Math.pow(base, exp);\n }\n return base;\n }\n\n /** unary: ('-' | '+') unary | primary */\n private parseUnary(): number {\n if (this.peek().type === \"op\" && (this.peek().value === \"-\" || this.peek().value === \"+\")) {\n const op = this.consume().value;\n const val = this.parseUnary();\n return op === \"-\" ? -val : val;\n }\n return this.parsePrimary();\n }\n\n /** primary: number | ident | function(args) | '(' expr ')' */\n private parsePrimary(): number {\n const tok = this.peek();\n\n // Number literal\n if (tok.type === \"number\") {\n this.consume();\n return parseFloat(tok.value);\n }\n\n // Identifier: constant, context variable, or function\n if (tok.type === \"ident\") {\n this.consume();\n const name = tok.value;\n\n // Function call\n if (this.peek().type === \"lparen\") {\n this.consume(); // (\n const args: number[] = [];\n if (this.peek().type !== \"rparen\") {\n args.push(this.parseTernary());\n while (this.peek().type === \"comma\") {\n this.consume(); // ,\n args.push(this.parseTernary());\n }\n }\n this.consume(\"rparen\"); // )\n\n const fn = FUNCTIONS[name];\n if (!fn) throw new Error(`Expression: unknown function '${name}'`);\n return fn(...args);\n }\n\n // Constant\n if (name in CONSTANTS) return CONSTANTS[name];\n\n // Context variable\n if (name in this.ctx) return (this.ctx as unknown as Record<string, number>)[name];\n\n throw new Error(`Expression: unknown variable '${name}'`);\n }\n\n // Parenthesized expression\n if (tok.type === \"lparen\") {\n this.consume(); // (\n const val = this.parseTernary();\n this.consume(\"rparen\"); // )\n return val;\n }\n\n throw new Error(`Expression: unexpected token '${tok.value}'`);\n }\n}\n\n// ── Public API ──────────────────────────────────────────────\n\n/**\n * Check if a value is an expression object { expr: string }.\n */\nexport function isExpression(value: unknown): value is { expr: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"expr\" in value &&\n typeof (value as Record<string, unknown>).expr === \"string\"\n );\n}\n\n/**\n * Evaluate an expression string with the given context.\n * Returns a number. Throws on syntax errors or unknown identifiers.\n */\nexport function evaluateExpression(expr: string, ctx: ExpressionContext): number {\n const tokens = tokenize(expr);\n const parser = new Parser(tokens, ctx);\n return parser.parse();\n}\n","import type { AtelierDocument, Layer, Delta, AnimatableProperty } from \"@a-company/atelier-types\";\nimport { resolvePropertyAtFrame } from \"./delta-resolver.js\";\n\n/** A resolved layer at a specific frame — all animated properties computed */\nexport interface ResolvedLayer {\n id: string;\n /** Original layer definition */\n layer: Layer;\n /** Computed property overrides from active deltas */\n computedProperties: Partial<Record<AnimatableProperty, unknown>>;\n}\n\n/** The resolved state of an entire document at a specific frame */\nexport interface ResolvedFrame {\n /** Frame number that was resolved */\n frame: number;\n /** State name that was resolved */\n stateName: string;\n /** All layers with their computed properties */\n layers: ResolvedLayer[];\n}\n\n/**\n * Resolve all layers at a given frame within a named state.\n * This is the main entry point for frame resolution.\n * @param overrideDeltas - Optional pre-merged deltas (used for hierarchical state resolution)\n */\nexport function resolveFrame(\n doc: AtelierDocument,\n stateName: string,\n frame: number,\n overrideDeltas?: Delta[],\n): ResolvedFrame {\n const state = doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found in document \"${doc.name}\"`);\n }\n\n // Group deltas by layer+property\n const deltasByLayerProperty = groupDeltas(overrideDeltas ?? state.deltas);\n\n // Resolve each layer\n const resolvedLayers: ResolvedLayer[] = doc.layers.map((layer) => {\n const computedProperties: Partial<Record<AnimatableProperty, unknown>> = {};\n\n // Find all animated properties for this layer\n const layerDeltas = deltasByLayerProperty.get(layer.id);\n if (layerDeltas) {\n for (const [property, deltas] of layerDeltas) {\n const value = resolvePropertyAtFrame(deltas, frame);\n if (value !== undefined) {\n computedProperties[property as AnimatableProperty] = value;\n }\n }\n }\n\n return { id: layer.id, layer, computedProperties };\n });\n\n return { frame, stateName, layers: resolvedLayers };\n}\n\n/**\n * Group deltas by layer ID, then by property name.\n */\nfunction groupDeltas(\n deltas: Delta[],\n): Map<string, Map<string, Delta[]>> {\n const map = new Map<string, Map<string, Delta[]>>();\n\n for (const delta of deltas) {\n let layerMap = map.get(delta.layer);\n if (!layerMap) {\n layerMap = new Map();\n map.set(delta.layer, layerMap);\n }\n\n let propDeltas = layerMap.get(delta.property);\n if (!propDeltas) {\n propDeltas = [];\n layerMap.set(delta.property, propDeltas);\n }\n\n propDeltas.push(delta);\n }\n\n return map;\n}\n","import type { Delta, FrameRange } from \"@a-company/atelier-types\";\n\nexport interface OverlapError {\n layerId: string;\n property: string;\n existingRange: FrameRange;\n newRange: FrameRange;\n message: string;\n}\n\n/**\n * Check if two frame ranges overlap.\n * Boundary-touching ranges (e.g., [0-50] and [50-90]) are allowed —\n * only ranges that share more than a single boundary frame are overlaps.\n */\nexport function rangesOverlap(a: FrameRange, b: FrameRange): boolean {\n return a[0] < b[1] && b[0] < a[1];\n}\n\n/**\n * Validate that a new delta doesn't overlap with existing deltas\n * on the same layer+property.\n */\nexport function validateNoOverlap(\n existing: Delta[],\n newDelta: Delta,\n): OverlapError | null {\n for (const delta of existing) {\n if (\n delta.layer === newDelta.layer &&\n delta.property === newDelta.property &&\n rangesOverlap(delta.range, newDelta.range)\n ) {\n return {\n layerId: newDelta.layer,\n property: newDelta.property,\n existingRange: delta.range,\n newRange: newDelta.range,\n message: `Overlapping delta on layer \"${newDelta.layer}\" property \"${newDelta.property}\": ` +\n `existing [${delta.range[0]}-${delta.range[1]}] overlaps with new [${newDelta.range[0]}-${newDelta.range[1]}]`,\n };\n }\n }\n return null;\n}\n\n/**\n * Validate all deltas in a state have no overlaps.\n * Returns all overlap errors found.\n */\nexport function validateAllDeltas(deltas: Delta[]): OverlapError[] {\n const errors: OverlapError[] = [];\n\n for (let i = 0; i < deltas.length; i++) {\n for (let j = i + 1; j < deltas.length; j++) {\n const a = deltas[i];\n const b = deltas[j];\n\n if (\n a.layer === b.layer &&\n a.property === b.property &&\n rangesOverlap(a.range, b.range)\n ) {\n errors.push({\n layerId: a.layer,\n property: a.property,\n existingRange: a.range,\n newRange: b.range,\n message: `Overlapping deltas on layer \"${a.layer}\" property \"${a.property}\": ` +\n `[${a.range[0]}-${a.range[1]}] overlaps with [${b.range[0]}-${b.range[1]}]`,\n });\n }\n }\n }\n\n return errors;\n}\n","import type {\n AtelierDocument, Canvas, Layer, State, Delta, Preset,\n Variable, Asset,\n} from \"@a-company/atelier-types\";\nimport { validateNoOverlap } from \"../validation/overlap-validator.js\";\n\n/**\n * Fluent builder for constructing AtelierDocument objects.\n * Validates constraints (like no-overlap) as you build.\n */\nexport class DocumentBuilder {\n private doc: AtelierDocument;\n\n constructor(name: string, canvas: Canvas) {\n this.doc = {\n version: \"1.0\",\n name,\n canvas,\n layers: [],\n states: {},\n };\n }\n\n /** Set document description */\n description(desc: string): this {\n this.doc.description = desc;\n return this;\n }\n\n /** Add tags to the document */\n tags(...tags: string[]): this {\n this.doc.tags = [...(this.doc.tags ?? []), ...tags];\n return this;\n }\n\n /** Add a variable definition */\n variable(id: string, variable: Variable): this {\n if (!this.doc.variables) this.doc.variables = {};\n this.doc.variables[id] = variable;\n return this;\n }\n\n /** Add an asset reference */\n asset(id: string, asset: Asset): this {\n if (!this.doc.assets) this.doc.assets = {};\n this.doc.assets[id] = asset;\n return this;\n }\n\n /** Add a preset */\n preset(id: string, preset: Preset): this {\n if (!this.doc.presets) this.doc.presets = {};\n this.doc.presets[id] = preset;\n return this;\n }\n\n /** Add a layer */\n addLayer(layer: Layer): this {\n // Check for duplicate IDs\n if (this.doc.layers.some(l => l.id === layer.id)) {\n throw new Error(`Layer with id \"${layer.id}\" already exists`);\n }\n this.doc.layers.push(layer);\n return this;\n }\n\n /** Add a state */\n addState(name: string, state: Omit<State, \"deltas\"> & { deltas?: Delta[] }): this {\n if (this.doc.states[name]) {\n throw new Error(`State \"${name}\" already exists`);\n }\n this.doc.states[name] = { ...state, deltas: state.deltas ?? [] };\n return this;\n }\n\n /** Add a delta to an existing state, with overlap validation */\n addDelta(stateName: string, delta: Delta): this {\n const state = this.doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n // Verify the layer exists\n if (!this.doc.layers.some(l => l.id === delta.layer)) {\n throw new Error(`Layer \"${delta.layer}\" not found — add the layer before adding deltas`);\n }\n\n // Check for overlaps\n const overlap = validateNoOverlap(state.deltas, delta);\n if (overlap) {\n throw new Error(overlap.message);\n }\n\n state.deltas.push(delta);\n return this;\n }\n\n /** Build and return the final document */\n build(): AtelierDocument {\n return JSON.parse(JSON.stringify(this.doc)) as AtelierDocument;\n }\n}\n\n/**\n * Create a new DocumentBuilder.\n * Convenience function for starting a builder chain.\n */\nexport function createDocument(name: string, canvas: Canvas): DocumentBuilder {\n return new DocumentBuilder(name, canvas);\n}\n","import type { UnitValue } from \"@a-company/atelier-types\";\n\n/**\n * Check if a UnitValue is a percentage string.\n */\nexport function isPercentage(value: UnitValue): value is `${number}%` {\n return typeof value === \"string\" && value.endsWith(\"%\");\n}\n\n/**\n * Parse a percentage string to its numeric value (0-100).\n */\nexport function parsePercentage(value: `${number}%`): number {\n return parseFloat(value);\n}\n\n/**\n * Resolve a UnitValue to pixels given a reference dimension.\n * Pixel values pass through unchanged.\n * Percentage values are computed relative to the reference.\n */\nexport function resolveUnit(value: UnitValue, reference: number): number {\n if (isPercentage(value)) {\n return (parsePercentage(value) / 100) * reference;\n }\n return value;\n}\n","import type { Preset, Delta, FrameRange } from \"@a-company/atelier-types\";\n\n/**\n * Expand a preset into concrete deltas for a specific layer and start frame.\n *\n * @param preset - The preset to expand\n * @param layerId - Target layer ID\n * @param startFrame - Frame to start the preset from\n * @param duration - Total duration to map preset offsets into\n */\nexport function expandPreset(\n preset: Preset,\n layerId: string,\n startFrame: number,\n duration: number,\n): Delta[] {\n return preset.deltas.map((pd, index) => {\n let range: FrameRange;\n if (pd.offset) {\n range = [startFrame + pd.offset[0], startFrame + pd.offset[1]];\n } else {\n range = [startFrame, startFrame + duration];\n }\n\n return {\n id: `preset-${layerId}-${index}`,\n layer: layerId,\n property: pd.property,\n range,\n from: pd.from,\n to: pd.to,\n easing: pd.easing,\n };\n });\n}\n","import type { AtelierDocument, Easing, State, Delta } from \"@a-company/atelier-types\";\nimport { resolveFrame, type ResolvedFrame } from \"../resolver/frame-resolver.js\";\nimport { resolveEasing } from \"../resolver/easing-resolver.js\";\n\nexport interface StateTransition {\n from: string;\n to: string;\n at: number; // frame at which transition occurs\n}\n\nexport interface PlaybackState {\n stateName: string;\n frame: number;\n resolved: ResolvedFrame;\n isComplete: boolean;\n}\n\nexport interface ActiveTransition {\n fromState: string;\n toState: string;\n duration: number;\n easingFn: (t: number) => number;\n transitionFrame: number; // how many frames into the transition\n}\n\nexport class StateMachine {\n private currentState: string;\n private currentFrame = 0;\n private transitions: StateTransition[] = [];\n private activeTransition: ActiveTransition | null = null;\n\n constructor(\n private doc: AtelierDocument,\n initialState?: string,\n ) {\n // Default to first state\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) throw new Error(\"Document has no states\");\n this.currentState = initialState ?? stateNames[0];\n if (!doc.states[this.currentState]) {\n throw new Error(`State \"${this.currentState}\" not found`);\n }\n }\n\n /** Get current state name */\n get state(): string {\n return this.currentState;\n }\n\n /** Get current frame */\n get frame(): number {\n return this.currentFrame;\n }\n\n /** Get all state names */\n get stateNames(): string[] {\n return Object.keys(this.doc.states);\n }\n\n /** Get current state duration */\n get duration(): number {\n return this.doc.states[this.currentState].duration;\n }\n\n /** Check if current state playback is complete */\n get isComplete(): boolean {\n return this.currentFrame >= this.duration - 1;\n }\n\n /** Check if currently in a transition blend */\n isTransitioning(): boolean {\n return this.activeTransition !== null;\n }\n\n /** Get transition progress (0–1) with easing applied, or null if not transitioning */\n getTransitionProgress(): number | null {\n if (!this.activeTransition) return null;\n const { transitionFrame, duration, easingFn } = this.activeTransition;\n const rawProgress = Math.min(transitionFrame / duration, 1);\n return easingFn(rawProgress);\n }\n\n // ── Hierarchical State Support ────────────────────────────\n\n /**\n * Resolve the ancestor chain for a state (root → … → parent → self).\n * Throws on circular parent references.\n */\n resolveAncestorChain(stateName: string): string[] {\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = stateName;\n\n while (current) {\n if (visited.has(current)) {\n throw new Error(`Circular parent reference detected: \"${current}\" already in chain [${chain.join(\" → \")}]`);\n }\n visited.add(current);\n chain.unshift(current); // prepend so root is first\n const stateObj: State | undefined = this.doc.states[current];\n if (!stateObj) {\n throw new Error(`Parent state \"${current}\" not found`);\n }\n current = stateObj.parent;\n }\n\n return chain;\n }\n\n /**\n * Collect merged deltas from ancestor chain.\n * Child overrides parent deltas for the same layer+property combination.\n * Deltas for different layer+property pairs are accumulated from all ancestors.\n */\n collectDeltas(stateName: string): Delta[] {\n const chain = this.resolveAncestorChain(stateName);\n // Walk root → child. Later entries override earlier for same layer+property.\n const deltaMap = new Map<string, Delta[]>();\n\n for (const ancestorName of chain) {\n const state = this.doc.states[ancestorName];\n // Group this state's deltas by layer+property\n const stateGroups = new Map<string, Delta[]>();\n for (const delta of state.deltas) {\n const key = `${delta.layer}:${delta.property}`;\n if (!stateGroups.has(key)) stateGroups.set(key, []);\n stateGroups.get(key)!.push(delta);\n }\n // Child replaces parent for same key\n for (const [key, deltas] of stateGroups) {\n deltaMap.set(key, deltas);\n }\n }\n\n // Flatten all deltas\n const result: Delta[] = [];\n for (const deltas of deltaMap.values()) {\n result.push(...deltas);\n }\n return result;\n }\n\n // ── Playback ──────────────────────────────────────────────\n\n /** Advance to next frame, returns resolved frame */\n tick(): PlaybackState {\n // Handle active transition\n if (this.activeTransition) {\n this.activeTransition.transitionFrame++;\n if (this.activeTransition.transitionFrame >= this.activeTransition.duration) {\n // Transition complete\n this.activeTransition = null;\n }\n }\n\n const resolved = this.resolveCurrentFrame();\n const result: PlaybackState = {\n stateName: this.currentState,\n frame: this.currentFrame,\n resolved,\n isComplete: this.isComplete,\n };\n if (this.currentFrame < this.duration - 1) {\n this.currentFrame++;\n }\n return result;\n }\n\n /** Resolve the current frame, blending if in transition */\n private resolveCurrentFrame(): ResolvedFrame {\n if (this.activeTransition) {\n const progress = this.getTransitionProgress()!;\n const fromResolved = resolveFrame(\n this.doc, this.activeTransition.fromState, this.currentFrame,\n this.collectDeltas(this.activeTransition.fromState),\n );\n const toResolved = resolveFrame(\n this.doc, this.activeTransition.toState, this.currentFrame,\n this.collectDeltas(this.activeTransition.toState),\n );\n return blendResolvedFrames(fromResolved, toResolved, progress);\n }\n\n // Check if current state has a parent — use merged deltas\n const state = this.doc.states[this.currentState];\n if (state.parent) {\n const mergedDeltas = this.collectDeltas(this.currentState);\n return resolveFrame(this.doc, this.currentState, this.currentFrame, mergedDeltas);\n }\n\n return resolveFrame(this.doc, this.currentState, this.currentFrame);\n }\n\n /** Transition to a different state (instant or blended) */\n transition(stateName: string, startFrame = 0): void {\n if (!this.doc.states[stateName]) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n const fromState = this.currentState;\n const currentStateObj = this.doc.states[fromState];\n const transConfig = currentStateObj.transitions?.[stateName];\n\n this.transitions.push({\n from: fromState,\n to: stateName,\n at: this.currentFrame,\n });\n\n if (transConfig && transConfig.duration > 0) {\n // Start a smooth transition\n this.activeTransition = {\n fromState,\n toState: stateName,\n duration: transConfig.duration,\n easingFn: resolveEasing(transConfig.easing),\n transitionFrame: 0,\n };\n }\n\n this.currentState = stateName;\n this.currentFrame = startFrame;\n }\n\n /**\n * Start a smooth transition to target state with explicit duration/easing.\n * This ignores any transitions config on the state.\n */\n transitionTo(targetState: string, duration: number, easing?: Easing): void {\n if (!this.doc.states[targetState]) {\n throw new Error(`State \"${targetState}\" not found`);\n }\n\n const fromState = this.currentState;\n this.transitions.push({\n from: fromState,\n to: targetState,\n at: this.currentFrame,\n });\n\n this.activeTransition = {\n fromState,\n toState: targetState,\n duration,\n easingFn: resolveEasing(easing),\n transitionFrame: 0,\n };\n\n this.currentState = targetState;\n this.currentFrame = 0;\n }\n\n /** Seek to a specific frame in current state */\n seek(frame: number): void {\n this.currentFrame = Math.max(0, Math.min(frame, this.duration - 1));\n }\n\n /** Reset to initial state */\n reset(stateName?: string): void {\n if (stateName) {\n if (!this.doc.states[stateName]) throw new Error(`State \"${stateName}\" not found`);\n this.currentState = stateName;\n }\n this.currentFrame = 0;\n this.activeTransition = null;\n }\n\n /** Get transition history */\n get history(): ReadonlyArray<StateTransition> {\n return this.transitions;\n }\n\n /** Resolve a specific frame without advancing */\n resolveAt(stateName: string, frame: number): ResolvedFrame {\n if (!this.doc.states[stateName]) throw new Error(`State \"${stateName}\" not found`);\n const state = this.doc.states[stateName];\n if (state.parent) {\n return resolveFrame(this.doc, stateName, frame, this.collectDeltas(stateName));\n }\n return resolveFrame(this.doc, stateName, frame);\n }\n\n /** Play through entire current state, calling callback on each frame */\n playThrough(onFrame: (state: PlaybackState) => void): void {\n this.currentFrame = 0;\n while (!this.isComplete) {\n onFrame(this.tick());\n }\n onFrame(this.tick()); // last frame\n }\n}\n\n// ── Frame Blending ────────────────────────────────────────────\n\nimport type { ResolvedLayer } from \"../resolver/frame-resolver.js\";\nimport type { AnimatableProperty } from \"@a-company/atelier-types\";\nimport { interpolateValue } from \"../resolver/delta-resolver.js\";\n\n/**\n * Blend two resolved frames together for smooth state transitions.\n * Numeric properties are lerped, colors are color-lerped, discrete values snap at t >= 0.5.\n */\nexport function blendResolvedFrames(\n frameA: ResolvedFrame,\n frameB: ResolvedFrame,\n t: number,\n): ResolvedFrame {\n // Build layer maps\n const mapA = new Map<string, ResolvedLayer>();\n const mapB = new Map<string, ResolvedLayer>();\n for (const l of frameA.layers) mapA.set(l.id, l);\n for (const l of frameB.layers) mapB.set(l.id, l);\n\n // Get all unique layer IDs\n const allIds = new Set([...mapA.keys(), ...mapB.keys()]);\n const blendedLayers: ResolvedLayer[] = [];\n\n for (const id of allIds) {\n const layerA = mapA.get(id);\n const layerB = mapB.get(id);\n\n if (layerA && layerB) {\n // Both exist — blend computed properties\n blendedLayers.push(blendLayers(layerA, layerB, t));\n } else if (layerA && !layerB) {\n // Only in A — fade out (set opacity toward 0)\n blendedLayers.push(fadeLayer(layerA, 1 - t));\n } else if (!layerA && layerB) {\n // Only in B — fade in (set opacity from 0)\n blendedLayers.push(fadeLayer(layerB, t));\n }\n }\n\n return {\n frame: frameB.frame,\n stateName: frameB.stateName,\n layers: blendedLayers,\n };\n}\n\nfunction blendLayers(a: ResolvedLayer, b: ResolvedLayer, t: number): ResolvedLayer {\n const allProps = new Set([\n ...Object.keys(a.computedProperties),\n ...Object.keys(b.computedProperties),\n ]);\n\n const blended: Partial<Record<AnimatableProperty, unknown>> = {};\n\n for (const prop of allProps) {\n const valA = a.computedProperties[prop as AnimatableProperty];\n const valB = b.computedProperties[prop as AnimatableProperty];\n\n if (valA !== undefined && valB !== undefined) {\n blended[prop as AnimatableProperty] = interpolateValue(valA, valB, t);\n } else if (valA !== undefined) {\n blended[prop as AnimatableProperty] = valA;\n } else {\n blended[prop as AnimatableProperty] = valB;\n }\n }\n\n return {\n id: a.id,\n layer: a.layer,\n computedProperties: blended,\n };\n}\n\nfunction fadeLayer(layer: ResolvedLayer, opacity: number): ResolvedLayer {\n const cp = { ...layer.computedProperties };\n const existingOpacity = (cp.opacity as number) ?? 1;\n cp.opacity = existingOpacity * opacity;\n return {\n id: layer.id,\n layer: layer.layer,\n computedProperties: cp,\n };\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\n\nexport interface TemplateBindings {\n [variableName: string]: unknown;\n}\n\nexport interface TemplateError {\n variable: string;\n message: string;\n}\n\nexport type TemplateResult =\n | {\n success: true;\n document: AtelierDocument;\n }\n | {\n success: false;\n errors: TemplateError[];\n };\n\n/**\n * Instantiate a template document by substituting variable values.\n * Walks the document tree, replacing {{variableName}} patterns with bound values.\n */\nexport function instantiateTemplate(\n template: AtelierDocument,\n bindings: TemplateBindings,\n): TemplateResult {\n // 1. Validate all required variables have bindings\n const errors: TemplateError[] = [];\n const variables = template.variables ?? {};\n\n for (const [name, variable] of Object.entries(variables)) {\n if (bindings[name] === undefined && variable.default === undefined) {\n errors.push({ variable: name, message: `Required variable \"${name}\" not provided` });\n }\n }\n\n // Check for unknown bindings\n for (const name of Object.keys(bindings)) {\n if (!variables[name]) {\n errors.push({ variable: name, message: `Unknown variable \"${name}\"` });\n }\n }\n\n if (errors.length > 0) return { success: false, errors };\n\n // 2. Merge bindings with defaults\n const resolved: Record<string, unknown> = {};\n for (const [name, variable] of Object.entries(variables)) {\n resolved[name] = bindings[name] ?? variable.default;\n }\n\n // 3. Deep clone and substitute\n const doc = JSON.parse(JSON.stringify(template)) as AtelierDocument;\n substituteInObject(doc as unknown as Record<string, unknown>, resolved);\n\n // 4. Remove variables section (no longer a template)\n delete doc.variables;\n\n return { success: true, document: doc };\n}\n\n/**\n * Recursively substitute {{variableName}} patterns in string values.\n */\nfunction substituteInObject(obj: Record<string, unknown>, bindings: Record<string, unknown>): void {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (typeof value === \"string\") {\n obj[key] = substituteString(value, bindings);\n } else if (Array.isArray(value)) {\n substituteInArray(value, bindings);\n } else if (value !== null && typeof value === \"object\") {\n substituteInObject(value as Record<string, unknown>, bindings);\n }\n }\n}\n\nfunction substituteInArray(arr: unknown[], bindings: Record<string, unknown>): void {\n for (let i = 0; i < arr.length; i++) {\n const value = arr[i];\n if (typeof value === \"string\") {\n arr[i] = substituteString(value, bindings);\n } else if (Array.isArray(value)) {\n substituteInArray(value, bindings);\n } else if (value !== null && typeof value === \"object\") {\n substituteInObject(value as Record<string, unknown>, bindings);\n }\n }\n}\n\n/**\n * Replace {{variableName}} in a string with the bound value.\n * If the entire string is a single {{var}}, return the raw value (preserving type).\n * Otherwise, interpolate into the string.\n */\nfunction substituteString(str: string, bindings: Record<string, unknown>): unknown {\n // Exact match: entire string is {{varName}} -> return raw value\n const exactMatch = str.match(/^\\{\\{(\\w+)\\}\\}$/);\n if (exactMatch) {\n const name = exactMatch[1];\n return name in bindings ? bindings[name] : str;\n }\n\n // Partial match: replace all {{varName}} occurrences with string values\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name: string) => {\n return name in bindings ? String(bindings[name]) : `{{${name}}}`;\n });\n}\n\n/**\n * List all variables used in a document (scan for {{variableName}} patterns).\n */\nexport function findTemplateVariables(doc: AtelierDocument): string[] {\n const vars = new Set<string>();\n scanForVariables(doc, vars);\n return Array.from(vars);\n}\n\nfunction scanForVariables(value: unknown, vars: Set<string>): void {\n if (typeof value === \"string\") {\n const matches = value.matchAll(/\\{\\{(\\w+)\\}\\}/g);\n for (const match of matches) {\n vars.add(match[1]);\n }\n } else if (Array.isArray(value)) {\n for (const item of value) scanForVariables(item, vars);\n } else if (value !== null && typeof value === \"object\") {\n for (const v of Object.values(value as Record<string, unknown>)) {\n scanForVariables(v, vars);\n }\n }\n}\n","import type { Audio } from \"@a-company/atelier-types\";\n\n/** Audio playback state at a given frame */\nexport interface AudioPlaybackState {\n /** Whether audio should be playing at this frame */\n shouldPlay: boolean;\n /** Current position in the audio track (seconds) */\n currentTime: number;\n /** Effective volume (0–1) */\n volume: number;\n}\n\n/**\n * Convert a frame number to time in seconds.\n */\nexport function frameToTime(frame: number, fps: number): number {\n return frame / fps;\n}\n\n/**\n * Convert time in seconds to a frame number (floored).\n */\nexport function timeToFrame(time: number, fps: number): number {\n return Math.floor(time * fps);\n}\n\n/**\n * Compute the audio playback state for a given frame.\n *\n * @param audio - Audio configuration from a state\n * @param frame - Current frame number within the state\n * @param fps - Frames per second from canvas config\n * @param stateDuration - Total state duration in frames\n * @returns AudioPlaybackState with shouldPlay, currentTime, and volume\n */\nexport function computeAudioState(\n audio: Audio,\n frame: number,\n fps: number,\n stateDuration: number,\n): AudioPlaybackState {\n const startFrame = audio.startFrame ?? 0;\n const offset = audio.offset ?? 0;\n const volume = audio.volume ?? 1;\n const loop = audio.loop ?? false;\n\n // Before audio starts\n if (frame < startFrame) {\n return { shouldPlay: false, currentTime: 0, volume };\n }\n\n // Time elapsed since audio started\n const elapsedFrames = frame - startFrame;\n const elapsedTime = frameToTime(elapsedFrames, fps);\n\n // Total available playback time (from startFrame to end of state)\n const availableFrames = stateDuration - startFrame;\n const availableTime = frameToTime(availableFrames, fps);\n\n if (!loop) {\n // Non-looping: audio plays from offset, stops at end of state\n const currentTime = offset + elapsedTime;\n return {\n shouldPlay: frame < stateDuration,\n currentTime,\n volume,\n };\n }\n\n // Looping: wrap elapsed time around available duration\n // The audio segment length is the available time\n const segmentDuration = availableTime;\n if (segmentDuration <= 0) {\n return { shouldPlay: false, currentTime: 0, volume };\n }\n\n const wrappedTime = elapsedTime % segmentDuration;\n const currentTime = offset + wrappedTime;\n\n return {\n shouldPlay: frame < stateDuration,\n currentTime,\n volume,\n };\n}\n\n/**\n * Compute audio cue points — frames where audio events occur.\n *\n * @param audio - Audio configuration\n * @param stateDuration - Total state duration in frames\n * @returns Array of { frame, event } describing audio events\n */\nexport function computeAudioCues(\n audio: Audio,\n stateDuration: number,\n): Array<{ frame: number; event: \"start\" | \"end\" | \"loop\" }> {\n const startFrame = audio.startFrame ?? 0;\n const loop = audio.loop ?? false;\n const cues: Array<{ frame: number; event: \"start\" | \"end\" | \"loop\" }> = [];\n\n if (startFrame < stateDuration) {\n cues.push({ frame: startFrame, event: \"start\" });\n }\n\n if (loop) {\n // In loop mode, audio restarts each full cycle\n const availableFrames = stateDuration - startFrame;\n if (availableFrames > 0) {\n // Loop points at each full cycle\n for (let i = 1; startFrame + i * availableFrames < stateDuration; i++) {\n cues.push({ frame: startFrame + i * availableFrames, event: \"loop\" });\n }\n }\n }\n\n // Audio ends when state ends\n if (stateDuration > startFrame) {\n cues.push({ frame: stateDuration - 1, event: \"end\" });\n }\n\n return cues;\n}\n","// @a-company/atelier-mcp — Preset management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Preset, PresetDelta } from \"@a-company/atelier-types\";\nimport { AnimatablePropertySchema, EasingSchema } from \"@a-company/atelier-schema\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\n// Canonical source: @a-company/atelier-schema — single source of truth for AnimatableProperty\nconst AnimatablePropertyEnum = AnimatablePropertySchema;\nconst EasingInputSchema = EasingSchema;\n\nconst PresetDeltaSchema = z.object({\n property: AnimatablePropertyEnum.describe(\"Animatable property\"),\n offset: z.tuple([z.number().int().min(0), z.number().int().min(0)]).optional().describe(\"Relative frame offset [start, end]\"),\n from: z.unknown().describe(\"Starting value\"),\n to: z.unknown().describe(\"Ending value\"),\n easing: EasingInputSchema.optional().describe(\"Easing function\"),\n});\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_define_preset ───────────────────────────────────\n server.tool(\n \"atelier_define_preset\",\n \"Define a reusable animation preset on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n presetName: z.string().describe(\"Preset name\"),\n description: z.string().optional().describe(\"Preset description\"),\n tags: z.array(z.string()).optional().describe(\"Tags\"),\n deltas: z.array(PresetDeltaSchema).min(1).describe(\"Array of preset delta definitions\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, presetName, description, tags, deltas }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.presets) doc.presets = {};\n\n const preset: Preset = {\n deltas: deltas as unknown as PresetDelta[],\n ...(description ? { description } : {}),\n ...(tags ? { tags } : {}),\n };\n\n doc.presets[presetName] = preset;\n\n return ok({ presetName, deltaCount: deltas.length });\n },\n );\n\n // ── atelier_list_presets ────────────────────────────────────\n server.tool(\n \"atelier_list_presets\",\n \"List all presets defined on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.presets || Object.keys(doc.presets).length === 0) {\n return ok({ presets: [], count: 0 });\n }\n\n const presets = Object.entries(doc.presets).map(([name, preset]) => ({\n name,\n description: preset.description,\n tags: preset.tags,\n deltaCount: preset.deltas.length,\n properties: preset.deltas.map(d => d.property),\n }));\n\n return ok({ presets, count: presets.length });\n },\n );\n}\n","// @a-company/atelier-mcp — Validation and preview tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { validateDocument } from \"@a-company/atelier-schema\";\nimport { validateAllDeltas, resolveFrame } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_validate ────────────────────────────────────────\n server.tool(\n \"atelier_validate\",\n \"Validate an Atelier document for schema correctness and delta overlaps\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n // Schema validation\n const schemaResult = validateDocument(doc);\n const schemaErrors = schemaResult.success ? [] : schemaResult.errors;\n\n // Overlap validation per state\n const overlapErrors: Array<{ state: string; message: string }> = [];\n for (const [stateName, state] of Object.entries(doc.states)) {\n const overlaps = validateAllDeltas(state.deltas);\n for (const overlap of overlaps) {\n overlapErrors.push({ state: stateName, message: overlap.message });\n }\n }\n\n const valid = schemaErrors.length === 0 && overlapErrors.length === 0;\n\n return ok({\n valid,\n schemaErrors,\n overlapErrors,\n summary: valid\n ? \"Document is valid\"\n : `Found ${schemaErrors.length} schema error(s) and ${overlapErrors.length} overlap error(s)`,\n });\n },\n );\n\n // ── atelier_preview ─────────────────────────────────────────\n server.tool(\n \"atelier_preview\",\n \"Preview the resolved state of all layers at a specific frame\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to preview\"),\n frame: z.number().int().min(0).describe(\"Frame number to resolve\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n try {\n const resolved = resolveFrame(doc, stateName, frame);\n\n const layers = resolved.layers.map(rl => ({\n id: rl.id,\n visualType: rl.layer.visual.type,\n baseFrame: rl.layer.frame,\n baseBounds: rl.layer.bounds,\n baseOpacity: rl.layer.opacity,\n baseRotation: rl.layer.rotation,\n computedProperties: rl.computedProperties,\n }));\n\n return ok({\n stateName: resolved.stateName,\n frame: resolved.frame,\n duration: doc.states[stateName].duration,\n layers,\n });\n } catch (e) {\n return err(`Preview failed: ${(e as Error).message}`);\n }\n },\n );\n}\n","// @a-company/atelier-mcp — Template variable tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { instantiateTemplate, findTemplateVariables } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_instantiate_template ──────────────────────────────\n server.tool(\n \"atelier_instantiate_template\",\n \"Instantiate a template document with variable bindings. Creates a new document in the store.\",\n {\n id: z.string().describe(\"Template document ID\"),\n bindings: z.record(z.unknown()).describe(\"Variable bindings: { variableName: value }\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, bindings }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const templateResult = instantiateTemplate(doc, bindings);\n\n if (!templateResult.success) {\n return err(`Template errors: ${templateResult.errors.map(e => `${e.variable}: ${e.message}`).join(\"; \")}`);\n }\n\n const newId = store.create(templateResult.document);\n return ok({\n id: newId,\n name: templateResult.document.name,\n message: \"Template instantiated successfully\",\n });\n },\n );\n\n // ── atelier_find_variables ────────────────────────────────────\n server.tool(\n \"atelier_find_variables\",\n \"Scan a document for {{variableName}} patterns. Returns the list of variable references found.\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const variables = findTemplateVariables(doc);\n const declared = doc.variables ? Object.keys(doc.variables) : [];\n\n return ok({\n variables,\n declared,\n undeclared: variables.filter(v => !declared.includes(v)),\n unused: declared.filter(d => !variables.includes(d)),\n });\n },\n );\n}\n","// @a-company/atelier-mcp — Layer effect tools (blend mode, shadow, motion path, clip path, visual editing)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type {\n AtelierDocument,\n ShapeVisual,\n TextVisual,\n ImageVisual,\n} from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_blend_mode ────────────────────────────────\n server.tool(\n \"atelier_set_blend_mode\",\n \"Set or clear the blend mode on a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n blendMode: z.enum([\n \"normal\", \"multiply\", \"screen\", \"overlay\", \"darken\", \"lighten\",\n \"color-dodge\", \"color-burn\", \"hard-light\", \"soft-light\",\n \"difference\", \"exclusion\", \"hue\", \"saturation\", \"color\", \"luminosity\",\n ]).nullable().describe(\"Blend mode to set, or null to clear\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, blendMode }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (blendMode === null) {\n delete layer.blendMode;\n return ok({ layerId, blendMode: null, cleared: true });\n }\n\n layer.blendMode = blendMode;\n return ok({ layerId, blendMode });\n },\n );\n\n // ── atelier_set_shadow ────────────────────────────────────\n server.tool(\n \"atelier_set_shadow\",\n \"Set or remove a drop shadow on a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n shadow: z.object({\n color: z.unknown().describe(\"Shadow color (hex string or RGBA/HSLA object)\"),\n blur: z.number().min(0).describe(\"Blur radius in pixels\"),\n offsetX: z.number().optional().describe(\"Horizontal offset in pixels\"),\n offsetY: z.number().optional().describe(\"Vertical offset in pixels\"),\n }).nullable().describe(\"Shadow definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, shadow }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (shadow === null) {\n delete layer.shadow;\n return ok({ layerId, shadow: null, removed: true });\n }\n\n layer.shadow = shadow as unknown as NonNullable<typeof layer.shadow>;\n return ok({ layerId, hasShadow: true });\n },\n );\n\n // ── atelier_set_tint ─────────────────────────────────────\n server.tool(\n \"atelier_set_tint\",\n \"Set or remove a color tint on a layer (works on any visual type)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n tint: z.object({\n color: z.string().describe(\"Tint color (hex string)\"),\n amount: z.number().min(0).max(1).describe(\"Tint amount (0 = none, 1 = full)\"),\n }).nullable().describe(\"Tint definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, tint }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (tint === null) {\n delete layer.tint;\n return ok({ layerId, tint: null, removed: true });\n }\n\n layer.tint = tint;\n return ok({ layerId, hasTint: true });\n },\n );\n\n // ── atelier_set_motion_path ───────────────────────────────\n server.tool(\n \"atelier_set_motion_path\",\n \"Set or remove a motion path on a layer for path-based position animation\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n motionPath: z.object({\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).min(2).describe(\"Path points (minimum 2)\"),\n closed: z.boolean().optional().describe(\"Whether the path is closed\"),\n autoRotate: z.boolean().optional().describe(\"Auto-rotate layer to follow path tangent\"),\n autoRotateOffset: z.number().optional().describe(\"Rotation offset in degrees when autoRotate is enabled\"),\n }).nullable().describe(\"Motion path definition, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, motionPath }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (motionPath === null) {\n delete layer.motionPath;\n return ok({ layerId, motionPath: null, removed: true });\n }\n\n layer.motionPath = motionPath as unknown as NonNullable<typeof layer.motionPath>;\n return ok({ layerId, pointCount: motionPath.points.length, closed: motionPath.closed ?? false });\n },\n );\n\n // ── atelier_set_clip_path ─────────────────────────────────\n server.tool(\n \"atelier_set_clip_path\",\n \"Set or remove a clip path on a layer to restrict rendering to within a shape\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n clipPath: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]).describe(\"Clip shape type\"),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional().describe(\"Corner radius (rect only)\"),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional().describe(\"Path points (path only)\"),\n closed: z.boolean().optional().describe(\"Whether path is closed (path only)\"),\n }).nullable().describe(\"Clip path shape, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, clipPath }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (clipPath === null) {\n delete layer.clipPath;\n return ok({ layerId, clipPath: null, removed: true });\n }\n\n layer.clipPath = clipPath as unknown as NonNullable<typeof layer.clipPath>;\n return ok({ layerId, clipType: clipPath.type });\n },\n );\n\n // ── atelier_edit_visual ───────────────────────────────────\n server.tool(\n \"atelier_edit_visual\",\n \"Edit visual content of an existing layer (text content/style, image src/assetId, shape/fill/stroke)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n // Text fields\n content: z.string().optional().describe(\"New text content (text layers only)\"),\n style: z.record(z.unknown()).optional().describe(\"Partial style update — only provided keys are overwritten (text layers only)\"),\n // Image fields\n src: z.string().optional().describe(\"Image source URL (image layers only)\"),\n assetId: z.string().optional().describe(\"Asset ID reference (image layers only)\"),\n sourceRect: z.object({\n x: z.number(), y: z.number(), width: z.number().positive(), height: z.number().positive(),\n }).nullable().optional().describe(\"Source rectangle crop (image layers only). Null to remove.\"),\n spritesheet: z.object({\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n frameCount: z.number().int().positive().optional(),\n frameWidth: z.number().positive(),\n frameHeight: z.number().positive(),\n }).nullable().optional().describe(\"Spritesheet config (image layers only). Null to remove.\"),\n frameIndex: z.number().int().min(0).optional().describe(\"Spritesheet frame index (image layers only)\"),\n // Shape fields\n shape: z.object({\n type: z.enum([\"rect\", \"ellipse\", \"path\"]),\n cornerRadius: z.union([\n z.number(),\n z.tuple([z.number(), z.number(), z.number(), z.number()]),\n ]).optional(),\n points: z.array(z.object({\n x: z.number(),\n y: z.number(),\n in: z.object({ x: z.number(), y: z.number() }).optional(),\n out: z.object({ x: z.number(), y: z.number() }).optional(),\n })).optional(),\n closed: z.boolean().optional(),\n }).optional().describe(\"New shape (shape layers only)\"),\n fill: z.record(z.unknown()).optional().describe(\"New fill definition (shape layers only)\"),\n stroke: z.record(z.unknown()).optional().describe(\"New stroke definition (shape layers only)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, content, style, src, assetId, sourceRect, spritesheet, frameIndex, shape, fill, stroke }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n const visualType = layer.visual.type;\n const updated: string[] = [];\n\n // Text fields\n if (content !== undefined) {\n if (visualType !== \"text\") return err(`Cannot set \"content\" on ${visualType} layer — text layers only`);\n (layer.visual as TextVisual).content = content;\n updated.push(\"content\");\n }\n if (style !== undefined) {\n if (visualType !== \"text\") return err(`Cannot set \"style\" on ${visualType} layer — text layers only`);\n const currentStyle = (layer.visual as TextVisual).style;\n Object.assign(currentStyle, style);\n updated.push(\"style\");\n }\n\n // Image fields\n if (src !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"src\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).src = src;\n updated.push(\"src\");\n }\n if (assetId !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"assetId\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).assetId = assetId;\n updated.push(\"assetId\");\n }\n if (sourceRect !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"sourceRect\" on ${visualType} layer — image layers only`);\n if (sourceRect === null) {\n delete (layer.visual as ImageVisual).sourceRect;\n updated.push(\"sourceRect (removed)\");\n } else {\n (layer.visual as ImageVisual).sourceRect = sourceRect;\n updated.push(\"sourceRect\");\n }\n }\n if (spritesheet !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"spritesheet\" on ${visualType} layer — image layers only`);\n if (spritesheet === null) {\n delete (layer.visual as ImageVisual).spritesheet;\n updated.push(\"spritesheet (removed)\");\n } else {\n (layer.visual as ImageVisual).spritesheet = spritesheet;\n updated.push(\"spritesheet\");\n }\n }\n if (frameIndex !== undefined) {\n if (visualType !== \"image\") return err(`Cannot set \"frameIndex\" on ${visualType} layer — image layers only`);\n (layer.visual as ImageVisual).frameIndex = frameIndex;\n updated.push(\"frameIndex\");\n }\n\n // Shape fields\n if (shape !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"shape\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).shape = shape as ShapeVisual[\"shape\"];\n updated.push(\"shape\");\n }\n if (fill !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"fill\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).fill = fill as unknown as ShapeVisual[\"fill\"];\n updated.push(\"fill\");\n }\n if (stroke !== undefined) {\n if (visualType !== \"shape\") return err(`Cannot set \"stroke\" on ${visualType} layer — shape layers only`);\n (layer.visual as ShapeVisual).stroke = stroke as unknown as ShapeVisual[\"stroke\"];\n updated.push(\"stroke\");\n }\n\n if (updated.length === 0) {\n return err(\"No visual fields provided to update\");\n }\n\n return ok({ layerId, visualType, updated });\n },\n );\n}\n","// @a-company/atelier-mcp — State configuration tools (audio, transitions, parent states)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nconst EasingInputSchema = z.union([\n z.enum([\"ease-in\", \"ease-out\", \"ease-in-out\"]),\n z.object({ type: z.literal(\"linear\") }),\n z.object({\n type: z.literal(\"cubic-bezier\"),\n x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(),\n }),\n z.object({\n type: z.literal(\"spring\"),\n mass: z.number().optional(),\n stiffness: z.number().optional(),\n damping: z.number().optional(),\n velocity: z.number().optional(),\n }),\n z.object({\n type: z.literal(\"step\"),\n steps: z.number().int().positive(),\n position: z.enum([\"start\", \"end\"]).optional(),\n }),\n]).describe(\"Easing function\");\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_audio ─────────────────────────────────────\n server.tool(\n \"atelier_set_audio\",\n \"Set or remove an audio track on a state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n audio: z.object({\n src: z.string().describe(\"Audio source — asset reference, file path, or URL\"),\n offset: z.number().min(0).optional().describe(\"Skip into audio in seconds (default: 0)\"),\n volume: z.number().min(0).max(1).optional().describe(\"Playback volume 0–1 (default: 1)\"),\n loop: z.boolean().optional().describe(\"Loop for state duration (default: false)\"),\n startFrame: z.number().int().min(0).optional().describe(\"Frame to start playing (default: 0)\"),\n }).nullable().describe(\"Audio configuration, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, audio }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (audio === null) {\n delete state.audio;\n return ok({ stateName, audio: null, removed: true });\n }\n\n state.audio = audio;\n return ok({ stateName, audioSrc: audio.src });\n },\n );\n\n // ── atelier_configure_transition ──────────────────────────\n server.tool(\n \"atelier_configure_transition\",\n \"Configure or remove a transition from one state to a target state\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"Source state name\"),\n targetState: z.string().describe(\"Target state name\"),\n transition: z.object({\n duration: z.number().positive().int().describe(\"Transition duration in frames\"),\n easing: EasingInputSchema.optional(),\n }).nullable().describe(\"Transition config, or null to remove\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, targetState, transition }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (stateName === targetState) {\n return err(\"Cannot create a transition from a state to itself\");\n }\n\n if (!doc.states[targetState]) {\n return err(`Target state \"${targetState}\" not found`);\n }\n\n if (transition === null) {\n if (state.transitions) {\n delete state.transitions[targetState];\n if (Object.keys(state.transitions).length === 0) {\n delete state.transitions;\n }\n }\n return ok({ stateName, targetState, removed: true });\n }\n\n if (!state.transitions) {\n state.transitions = {};\n }\n state.transitions[targetState] = transition as unknown as NonNullable<typeof state.transitions>[string];\n return ok({ stateName, targetState, duration: transition.duration });\n },\n );\n\n // ── atelier_set_state_parent ──────────────────────────────\n server.tool(\n \"atelier_set_state_parent\",\n \"Set or clear the parent state for hierarchical delta inheritance\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n parent: z.string().nullable().describe(\"Parent state name, or null to clear\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, stateName, parent }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const state = doc.states[stateName];\n if (!state) return err(`State \"${stateName}\" not found`);\n\n if (parent === null) {\n delete state.parent;\n return ok({ stateName, parent: null, cleared: true });\n }\n\n if (parent === stateName) {\n return err(\"A state cannot be its own parent\");\n }\n\n if (!doc.states[parent]) {\n return err(`Parent state \"${parent}\" not found`);\n }\n\n // Walk parent chain to detect cycles\n let current = parent;\n const visited = new Set<string>([stateName]);\n while (current) {\n if (visited.has(current)) {\n return err(`Circular reference detected: setting parent \"${parent}\" would create a cycle`);\n }\n visited.add(current);\n current = doc.states[current]?.parent as string;\n }\n\n state.parent = parent;\n return ok({ stateName, parent });\n },\n );\n}\n","// @a-company/atelier-mcp — Export tools (SVG, Lottie)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { renderFrameSVG } from \"@a-company/atelier-svg\";\nimport { exportToLottie } from \"@a-company/atelier-lottie\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_export_svg ────────────────────────────────────\n server.tool(\n \"atelier_export_svg\",\n \"Export a frame as an SVG string\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().optional().describe(\"State name (defaults to first state)\"),\n frame: z.number().int().min(0).optional().describe(\"Frame number (defaults to 0)\"),\n xmlDeclaration: z.boolean().optional().describe(\"Include XML declaration (default: false)\"),\n viewBox: z.boolean().optional().describe(\"Include viewBox attribute (default: true)\"),\n indent: z.number().int().min(0).optional().describe(\"Indent size in spaces (default: 2)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame, xmlDeclaration, viewBox, indent }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) {\n return err(\"Document has no states\");\n }\n\n const resolvedStateName = stateName ?? stateNames[0];\n if (!doc.states[resolvedStateName]) {\n return err(`State \"${resolvedStateName}\" not found`);\n }\n\n try {\n const svg = renderFrameSVG(doc, resolvedStateName, frame ?? 0, {\n xmlDeclaration,\n viewBox,\n indent,\n });\n return ok({ svg, stateName: resolvedStateName, frame: frame ?? 0 });\n } catch (e) {\n return err((e as Error).message);\n }\n },\n );\n\n // ── atelier_export_lottie ─────────────────────────────────\n server.tool(\n \"atelier_export_lottie\",\n \"Export a document to Lottie JSON format (lossy, best-effort)\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().optional().describe(\"State to export (defaults to first state)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n try {\n const { json, warnings } = exportToLottie(doc, {\n state: stateName,\n });\n return ok({ lottie: json as unknown as Record<string, unknown>, warnings });\n } catch (e) {\n return err((e as Error).message);\n }\n },\n );\n}\n","import type { Fill, Stroke, Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"./canvas-types.js\";\n\n/**\n * Convert an Atelier Color to a CSS color string.\n */\nexport function colorToCSS(color: Color): string {\n if (typeof color === \"string\") return color; // hex string\n\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return `rgba(${Math.round(c.r)}, ${Math.round(c.g)}, ${Math.round(c.b)}, ${c.a})`;\n }\n\n if (\"h\" in color) {\n const c = color as HSLAColor;\n return `hsla(${c.h}, ${c.s}%, ${c.l}%, ${c.a})`;\n }\n\n return \"#000000\";\n}\n\n/**\n * Apply a Fill to the canvas context's fillStyle.\n */\nexport function applyFill(ctx: RenderContext, fill: Fill, width: number, height: number): void {\n switch (fill.type) {\n case \"solid\":\n ctx.fillStyle = colorToCSS(fill.color);\n break;\n\n case \"linear-gradient\": {\n const rad = (fill.angle * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const halfW = width / 2;\n const halfH = height / 2;\n const grad = ctx.createLinearGradient(\n halfW - cos * halfW, halfH - sin * halfH,\n halfW + cos * halfW, halfH + sin * halfH,\n );\n for (const stop of fill.stops) {\n grad.addColorStop(stop.offset, colorToCSS(stop.color));\n }\n ctx.fillStyle = grad as unknown as string;\n break;\n }\n\n case \"radial-gradient\": {\n const cx = typeof fill.center.x === \"number\" ? fill.center.x : (parseFloat(fill.center.x) / 100) * width;\n const cy = typeof fill.center.y === \"number\" ? fill.center.y : (parseFloat(fill.center.y) / 100) * height;\n const r = typeof fill.radius === \"number\" ? fill.radius : (parseFloat(fill.radius) / 100) * Math.max(width, height);\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, r);\n for (const stop of fill.stops) {\n grad.addColorStop(stop.offset, colorToCSS(stop.color));\n }\n ctx.fillStyle = grad as unknown as string;\n break;\n }\n }\n}\n\n/**\n * Apply a Stroke to the canvas context.\n * @param pathLength - total perimeter of the shape (needed for strokeStart/strokeEnd trim)\n */\nexport function applyStroke(ctx: RenderContext, stroke: Stroke, pathLength: number): void {\n ctx.strokeStyle = colorToCSS(stroke.color);\n ctx.lineWidth = stroke.width;\n if (stroke.lineCap) ctx.lineCap = stroke.lineCap;\n if (stroke.lineJoin) ctx.lineJoin = stroke.lineJoin;\n\n const start = stroke.strokeStart ?? 0;\n const end = stroke.strokeEnd ?? 1;\n\n if (start !== 0 || end !== 1) {\n const visible = (end - start) * pathLength;\n ctx.setLineDash([Math.max(visible, 0), pathLength + 1]);\n ctx.lineDashOffset = -start * pathLength;\n } else if (stroke.dash) {\n ctx.setLineDash(stroke.dash);\n }\n}\n","import type { Layer, Visual, ShapeVisual, TextVisual, ImageVisual, Color, BlendMode, LinearGradientFill, RadialGradientFill } from \"@a-company/atelier-types\";\nimport { colorToCSS } from \"./styles.js\";\nimport { evaluatePathAtProgress } from \"@a-company/atelier-math\";\nimport type { ResolvedLayer } from \"@a-company/atelier-core\";\n\n/**\n * Effective values for a layer at a given frame,\n * with computed properties merged over defaults.\n */\nexport interface EffectiveLayer {\n /** Original layer */\n layer: Layer;\n /** Visual with animated property overrides applied */\n visual: Visual;\n /** Effective frame position (may be animated) */\n x: number;\n y: number;\n /** Effective bounds */\n width: number;\n height: number;\n /** Effective transform values */\n opacity: number;\n rotation: number;\n scaleX: number;\n scaleY: number;\n anchorX: number;\n anchorY: number;\n /** Resolved shadow (if layer has shadow or shadow is animated) */\n shadow?: {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n };\n /** Blend mode for compositing */\n blendMode: string;\n /** Motion path auto-rotation in degrees (applied additively to rotation) */\n motionPathAngle: number;\n /** Whether this layer is visible (may be animated) */\n visible: boolean;\n /** Color tint overlay */\n tint?: {\n color: string;\n amount: number;\n };\n}\n\n/**\n * Resolve a UnitValue to pixels. Percentages resolve against a reference dimension.\n */\nfunction resolveUnit(value: number | string, reference: number): number {\n if (typeof value === \"string\" && value.endsWith(\"%\")) {\n return (parseFloat(value) / 100) * reference;\n }\n return value as number;\n}\n\n/**\n * Build the effective layer values by merging computed properties over layer defaults.\n * @param resolved - The resolved layer from frame resolution\n * @param parentWidth - Parent/canvas width for percentage resolution\n * @param parentHeight - Parent/canvas height for percentage resolution\n */\nexport function buildEffectiveLayer(\n resolved: ResolvedLayer,\n parentWidth: number,\n parentHeight: number,\n): EffectiveLayer {\n const { layer, computedProperties } = resolved;\n const cp = computedProperties as Record<string, unknown>;\n\n const hasShadow = layer.shadow || cp[\"shadow.blur\"] !== undefined || cp[\"shadow.color\"] !== undefined;\n const hasTint = layer.tint || cp[\"tint.amount\"] !== undefined || cp[\"tint.color\"] !== undefined;\n\n // Resolve base position\n let x = resolveUnit((cp[\"frame.x\"] ?? layer.frame.x) as number | string, parentWidth);\n let y = resolveUnit((cp[\"frame.y\"] ?? layer.frame.y) as number | string, parentHeight);\n let motionPathAngle = 0;\n\n // Motion path overrides position when progress is animated\n const motionProgress = cp[\"motionPath.progress\"] as number | undefined;\n if (motionProgress !== undefined && layer.motionPath && layer.motionPath.points.length >= 2) {\n const pos = evaluatePathAtProgress(layer.motionPath.points, motionProgress, layer.motionPath.closed);\n x = pos.x;\n y = pos.y;\n if (layer.motionPath.autoRotate) {\n motionPathAngle = pos.angle + (layer.motionPath.autoRotateOffset ?? 0);\n }\n }\n\n return {\n layer,\n visual: buildEffectiveVisual(layer.visual, cp),\n x,\n y,\n width: resolveUnit((cp[\"bounds.width\"] ?? layer.bounds.width) as number | string, parentWidth),\n height: resolveUnit((cp[\"bounds.height\"] ?? layer.bounds.height) as number | string, parentHeight),\n opacity: (cp[\"opacity\"] as number) ?? layer.opacity ?? 1,\n rotation: (cp[\"rotation\"] as number) ?? layer.rotation ?? 0,\n scaleX: (cp[\"scale.x\"] as number) ?? layer.scale?.x ?? 1,\n scaleY: (cp[\"scale.y\"] as number) ?? layer.scale?.y ?? 1,\n anchorX: (cp[\"anchorPoint.x\"] as number) ?? layer.anchorPoint?.x ?? 0,\n anchorY: (cp[\"anchorPoint.y\"] as number) ?? layer.anchorPoint?.y ?? 0,\n shadow: hasShadow ? {\n color: colorToCSS((cp[\"shadow.color\"] ?? layer.shadow?.color ?? \"#00000080\") as Color),\n blur: (cp[\"shadow.blur\"] as number) ?? layer.shadow?.blur ?? 0,\n offsetX: (cp[\"shadow.offsetX\"] as number) ?? layer.shadow?.offsetX ?? 0,\n offsetY: (cp[\"shadow.offsetY\"] as number) ?? layer.shadow?.offsetY ?? 0,\n } : undefined,\n blendMode: (layer.blendMode as BlendMode) ?? \"normal\",\n motionPathAngle,\n visible: (cp[\"visible\"] as boolean) ?? layer.visible ?? true,\n tint: hasTint ? {\n color: colorToCSS((cp[\"tint.color\"] ?? layer.tint?.color ?? \"#FF0000\") as Color),\n amount: (cp[\"tint.amount\"] as number) ?? layer.tint?.amount ?? 0,\n } : undefined,\n };\n}\n\n/**\n * Build an effective visual by applying computed property overrides.\n * Returns the original visual if no visual properties are animated.\n */\nfunction buildEffectiveVisual(visual: Visual, cp: Record<string, unknown>): Visual {\n const hasVisualOverride =\n cp[\"visual.fill.color\"] !== undefined ||\n cp[\"visual.fill.angle\"] !== undefined ||\n cp[\"visual.fill.center.x\"] !== undefined ||\n cp[\"visual.fill.center.y\"] !== undefined ||\n cp[\"visual.fill.radius\"] !== undefined ||\n cp[\"visual.stroke.color\"] !== undefined ||\n cp[\"visual.stroke.width\"] !== undefined ||\n cp[\"visual.stroke.start\"] !== undefined ||\n cp[\"visual.stroke.end\"] !== undefined ||\n cp[\"visual.shape.cornerRadius\"] !== undefined ||\n cp[\"visual.style.fontSize\"] !== undefined ||\n cp[\"visual.style.color\"] !== undefined;\n\n const hasImageOverride =\n cp[\"visual.image.sourceRect.x\"] !== undefined ||\n cp[\"visual.image.sourceRect.y\"] !== undefined ||\n cp[\"visual.image.sourceRect.width\"] !== undefined ||\n cp[\"visual.image.sourceRect.height\"] !== undefined ||\n cp[\"visual.image.frameIndex\"] !== undefined;\n\n if (!hasVisualOverride && !hasImageOverride) return visual;\n\n if (visual.type === \"shape\") {\n const v: ShapeVisual = { ...visual };\n\n if (cp[\"visual.shape.cornerRadius\"] !== undefined && v.shape.type === \"rect\") {\n v.shape = { ...v.shape, cornerRadius: cp[\"visual.shape.cornerRadius\"] as number };\n }\n\n if (v.fill) {\n if (cp[\"visual.fill.color\"] !== undefined && v.fill.type === \"solid\") {\n v.fill = { ...v.fill, color: cp[\"visual.fill.color\"] as string };\n }\n if (cp[\"visual.fill.angle\"] !== undefined && v.fill.type === \"linear-gradient\") {\n v.fill = { ...v.fill, angle: cp[\"visual.fill.angle\"] as number } as LinearGradientFill;\n }\n if (v.fill.type === \"radial-gradient\") {\n const cx = cp[\"visual.fill.center.x\"];\n const cy = cp[\"visual.fill.center.y\"];\n const r = cp[\"visual.fill.radius\"];\n if (cx !== undefined || cy !== undefined || r !== undefined) {\n const f = v.fill as RadialGradientFill;\n v.fill = {\n ...f,\n center: {\n x: cx !== undefined ? (cx as number) : f.center.x,\n y: cy !== undefined ? (cy as number) : f.center.y,\n },\n radius: r !== undefined ? (r as number) : f.radius,\n } as RadialGradientFill;\n }\n }\n }\n\n if (v.stroke) {\n const strokeColor = cp[\"visual.stroke.color\"] ?? v.stroke.color;\n const strokeWidth = (cp[\"visual.stroke.width\"] as number) ?? v.stroke.width;\n const strokeStart = (cp[\"visual.stroke.start\"] as number | undefined) ?? v.stroke.strokeStart;\n const strokeEnd = (cp[\"visual.stroke.end\"] as number | undefined) ?? v.stroke.strokeEnd;\n if (\n strokeColor !== v.stroke.color ||\n strokeWidth !== v.stroke.width ||\n strokeStart !== v.stroke.strokeStart ||\n strokeEnd !== v.stroke.strokeEnd\n ) {\n v.stroke = {\n ...v.stroke,\n color: strokeColor as string,\n width: strokeWidth,\n strokeStart,\n strokeEnd,\n };\n }\n }\n\n return v;\n }\n\n if (visual.type === \"text\") {\n const v: TextVisual = { ...visual };\n const fontSize = (cp[\"visual.style.fontSize\"] as number) ?? v.style.fontSize;\n const color = cp[\"visual.style.color\"] ?? v.style.color;\n if (fontSize !== v.style.fontSize || color !== v.style.color) {\n v.style = { ...v.style, fontSize, color: color as string };\n }\n return v;\n }\n\n if (visual.type === \"image\" && hasImageOverride) {\n const v: ImageVisual = { ...visual };\n\n // Merge animated sourceRect fields\n if (\n cp[\"visual.image.sourceRect.x\"] !== undefined ||\n cp[\"visual.image.sourceRect.y\"] !== undefined ||\n cp[\"visual.image.sourceRect.width\"] !== undefined ||\n cp[\"visual.image.sourceRect.height\"] !== undefined\n ) {\n const base = v.sourceRect ?? { x: 0, y: 0, width: 0, height: 0 };\n v.sourceRect = {\n x: (cp[\"visual.image.sourceRect.x\"] as number) ?? base.x,\n y: (cp[\"visual.image.sourceRect.y\"] as number) ?? base.y,\n width: (cp[\"visual.image.sourceRect.width\"] as number) ?? base.width,\n height: (cp[\"visual.image.sourceRect.height\"] as number) ?? base.height,\n };\n }\n\n // Merge animated frameIndex\n if (cp[\"visual.image.frameIndex\"] !== undefined) {\n v.frameIndex = Math.floor(cp[\"visual.image.frameIndex\"] as number);\n }\n\n return v;\n }\n\n return visual;\n}\n","import type { ShapeVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { applyFill, applyStroke } from \"../styles.js\";\n\nexport function renderShape(ctx: RenderContext, eff: EffectiveLayer): void {\n const visual = eff.visual as ShapeVisual;\n const { shape } = visual;\n const { width, height } = eff;\n\n switch (shape.type) {\n case \"rect\":\n renderRect(ctx, width, height, shape.cornerRadius, visual);\n break;\n case \"ellipse\":\n renderEllipse(ctx, width, height, visual);\n break;\n case \"path\":\n renderPath(ctx, shape.points, shape.closed, visual);\n break;\n }\n}\n\n// ── Perimeter helpers ───────────────────────────────────────\n\nfunction rectPerimeter(w: number, h: number): number {\n return 2 * (w + h);\n}\n\nfunction ellipsePerimeter(w: number, h: number): number {\n const a = w / 2;\n const b = h / 2;\n // Ramanujan approximation\n return Math.PI * (3 * (a + b) - Math.sqrt((3 * a + b) * (a + 3 * b)));\n}\n\nfunction dist(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction pathPerimeter(\n points: { x: number; y: number; in?: { x: number; y: number }; out?: { x: number; y: number } }[],\n closed: boolean | undefined,\n): number {\n let length = 0;\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n if (prev.out && curr.in) {\n // Approximate bezier with chord * 1.2\n length += dist(prev.x, prev.y, curr.x, curr.y) * 1.2;\n } else {\n length += dist(prev.x, prev.y, curr.x, curr.y);\n }\n }\n if (closed && points.length > 1) {\n const first = points[0];\n const last = points[points.length - 1];\n length += dist(last.x, last.y, first.x, first.y);\n }\n return length;\n}\n\n// ── Renderers ───────────────────────────────────────────────\n\nfunction renderRect(\n ctx: RenderContext,\n width: number,\n height: number,\n cornerRadius: number | [number, number, number, number] | undefined,\n visual: ShapeVisual,\n): void {\n if (visual.fill) {\n applyFill(ctx, visual.fill, width, height);\n if (cornerRadius && ctx.roundRect) {\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, cornerRadius);\n ctx.fill();\n } else {\n ctx.fillRect(0, 0, width, height);\n }\n }\n if (visual.stroke) {\n const perimeter = rectPerimeter(width, height);\n applyStroke(ctx, visual.stroke, perimeter);\n if (cornerRadius && ctx.roundRect) {\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, cornerRadius);\n ctx.stroke();\n } else {\n ctx.strokeRect(0, 0, width, height);\n }\n }\n}\n\nfunction renderEllipse(\n ctx: RenderContext,\n width: number,\n height: number,\n visual: ShapeVisual,\n): void {\n ctx.beginPath();\n ctx.ellipse(width / 2, height / 2, width / 2, height / 2, 0, 0, Math.PI * 2);\n\n if (visual.fill) {\n applyFill(ctx, visual.fill, width, height);\n ctx.fill();\n }\n if (visual.stroke) {\n const perimeter = ellipsePerimeter(width, height);\n applyStroke(ctx, visual.stroke, perimeter);\n ctx.stroke();\n }\n}\n\nfunction renderPath(\n ctx: RenderContext,\n points: { x: number; y: number; in?: { x: number; y: number }; out?: { x: number; y: number } }[],\n closed: boolean | undefined,\n visual: ShapeVisual,\n): void {\n if (points.length < 2) return;\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n\n if (prev.out && curr.in) {\n ctx.bezierCurveTo(\n prev.x + prev.out.x, prev.y + prev.out.y,\n curr.x + curr.in.x, curr.y + curr.in.y,\n curr.x, curr.y,\n );\n } else {\n ctx.lineTo(curr.x, curr.y);\n }\n }\n\n if (closed) ctx.closePath();\n\n if (visual.fill) {\n applyFill(ctx, visual.fill, 0, 0);\n ctx.fill();\n }\n if (visual.stroke) {\n const perimeter = pathPerimeter(points, closed);\n applyStroke(ctx, visual.stroke, perimeter);\n ctx.stroke();\n }\n}\n","import type { TextVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { colorToCSS } from \"../styles.js\";\n\nexport function renderText(ctx: RenderContext, eff: EffectiveLayer): void {\n const visual = eff.visual as TextVisual;\n const { style } = visual;\n\n // Build font string\n const fontStyle = style.fontStyle ?? \"normal\";\n const fontWeight = style.fontWeight ?? \"normal\";\n const fontSize = style.fontSize;\n const fontFamily = style.fontFamily;\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n\n // Set alignment — position text within its bounding box\n const align = style.textAlign ?? \"left\";\n ctx.textAlign = align;\n ctx.textBaseline = \"top\";\n\n // Set color\n ctx.fillStyle = colorToCSS(style.color);\n\n // Canvas 2D textAlign anchors at the draw point, so offset within bounds:\n // \"left\" → draw at x=0 (text flows right from left edge)\n // \"center\" → draw at x=width/2 (text centers within bounds)\n // \"right\" → draw at x=width (text flows left from right edge)\n let textX = 0;\n if (align === \"center\") {\n textX = eff.width / 2;\n } else if (align === \"right\") {\n textX = eff.width;\n }\n\n ctx.fillText(visual.content, textX, 0);\n}\n","import type { ImageVisual } from \"@a-company/atelier-types\";\nimport type { RenderContext } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport type { ImageCache } from \"../image-cache.js\";\n\n/**\n * Render an image layer to the canvas.\n * Supports sourceRect cropping and spritesheet grid animation.\n * If the image hasn't loaded yet, triggers a cache load and returns\n * (the image will appear on the next re-render).\n */\nexport function renderImage(ctx: RenderContext, eff: EffectiveLayer, imageCache: ImageCache): void {\n const visual = eff.visual as ImageVisual;\n const src = visual.src;\n if (!src) return;\n\n const img = imageCache.get(src);\n if (!img) {\n imageCache.load(src);\n return;\n }\n\n // Spritesheet grid computation takes precedence over manual sourceRect\n if (visual.spritesheet) {\n const { columns, rows, frameWidth, frameHeight, frameCount } = visual.spritesheet;\n const maxFrames = frameCount ?? (columns * rows);\n const idx = Math.max(0, Math.min(Math.floor(visual.frameIndex ?? 0), maxFrames - 1));\n const col = idx % columns;\n const row = Math.floor(idx / columns);\n const sx = col * frameWidth;\n const sy = row * frameHeight;\n (ctx.drawImage as Function)(img, sx, sy, frameWidth, frameHeight, 0, 0, eff.width, eff.height);\n return;\n }\n\n // Manual sourceRect crop\n if (visual.sourceRect) {\n const sr = visual.sourceRect;\n (ctx.drawImage as Function)(img, sr.x, sr.y, sr.width, sr.height, 0, 0, eff.width, eff.height);\n return;\n }\n\n // Default: draw full image to bounds\n ctx.drawImage(img, 0, 0, eff.width, eff.height);\n}\n","import type { AtelierDocument, RefVisual, ImageVisual } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport type { RenderContext, DocumentResolver } from \"../canvas-types.js\";\nimport type { EffectiveLayer } from \"../apply-properties.js\";\nimport { buildEffectiveLayer } from \"../apply-properties.js\";\nimport { renderShape } from \"./shape-renderer.js\";\nimport { renderText } from \"./text-renderer.js\";\nimport { renderImage } from \"./image-renderer.js\";\nimport type { ImageCache } from \"../image-cache.js\";\n\nexport interface RefRenderOpts {\n documentResolver?: DocumentResolver;\n maxRefDepth?: number;\n imageCache?: ImageCache;\n /** Internal: tracks visited refs for cycle detection */\n _visitedRefs?: Set<string>;\n /** Internal: current recursion depth */\n _depth?: number;\n}\n\n/**\n * Render a ref layer. If a documentResolver is provided, resolves and renders\n * the sub-document inline. Otherwise falls back to a placeholder rectangle.\n */\nexport function renderRef(\n ctx: RenderContext,\n eff: EffectiveLayer,\n opts?: RefRenderOpts,\n _parentDoc?: AtelierDocument,\n): void {\n const visual = eff.visual as RefVisual;\n const resolver = opts?.documentResolver;\n\n if (!resolver) {\n renderPlaceholder(ctx, eff, `REF: ${visual.src}`);\n return;\n }\n\n const depth = opts?._depth ?? 0;\n const maxDepth = opts?.maxRefDepth ?? 4;\n\n if (depth >= maxDepth) {\n renderPlaceholder(ctx, eff, \"MAX DEPTH\");\n return;\n }\n\n const visitedRefs = opts?._visitedRefs ?? new Set<string>();\n\n if (visitedRefs.has(visual.src)) {\n renderPlaceholder(ctx, eff, \"CYCLE\");\n return;\n }\n\n const subDoc = resolver(visual.src);\n if (!subDoc) {\n renderPlaceholder(ctx, eff, \"NOT FOUND\");\n return;\n }\n\n // Determine which state and frame to render\n const stateNames = Object.keys(subDoc.states);\n if (stateNames.length === 0) {\n renderPlaceholder(ctx, eff, \"NO STATES\");\n return;\n }\n\n const stateName = visual.state ?? stateNames[0];\n const stateObj = subDoc.states[stateName];\n if (!stateObj) {\n renderPlaceholder(ctx, eff, `STATE? ${stateName}`);\n return;\n }\n\n const maxFrame = Math.max(0, stateObj.duration - 1);\n const frame = Math.min(visual.frame ?? 0, maxFrame);\n\n // Resolve the sub-document frame\n const resolved = resolveFrame(subDoc, stateName, frame);\n\n // Mark as visited for cycle detection\n visitedRefs.add(visual.src);\n\n // Scale to fit eff bounds\n const scaleX = eff.width / subDoc.canvas.width;\n const scaleY = eff.height / subDoc.canvas.height;\n\n ctx.save();\n ctx.scale(scaleX, scaleY);\n\n // Build and render sub-doc layers\n const { width: subW, height: subH } = subDoc.canvas;\n\n for (const resolvedLayer of resolved.layers) {\n const subEff = buildEffectiveLayer(resolvedLayer, subW, subH);\n\n if (!subEff.visible) continue;\n if (subEff.opacity <= 0) continue;\n\n // Resolve asset for images\n if (resolvedLayer.layer.visual.type === \"image\") {\n const iv = subEff.visual as ImageVisual;\n if (!iv.src && iv.assetId && subDoc.assets?.[iv.assetId]) {\n iv.src = subDoc.assets[iv.assetId].src;\n }\n }\n\n ctx.save();\n ctx.globalAlpha = subEff.opacity;\n ctx.translate(subEff.x, subEff.y);\n\n switch (resolvedLayer.layer.visual.type) {\n case \"shape\":\n renderShape(ctx, subEff);\n break;\n case \"text\":\n renderText(ctx, subEff);\n break;\n case \"image\":\n if (opts?.imageCache) renderImage(ctx, subEff, opts.imageCache);\n break;\n case \"ref\":\n renderRef(ctx, subEff, {\n ...opts,\n _visitedRefs: visitedRefs,\n _depth: depth + 1,\n }, subDoc);\n break;\n case \"group\":\n break;\n }\n\n ctx.restore();\n }\n\n ctx.restore();\n\n // Remove from visited after rendering (allow same ref in different branches)\n visitedRefs.delete(visual.src);\n}\n\n/** Render a dashed placeholder rectangle with label */\nfunction renderPlaceholder(ctx: RenderContext, eff: EffectiveLayer, label: string): void {\n const { width, height } = eff;\n\n ctx.strokeStyle = \"#888888\";\n ctx.lineWidth = 2;\n ctx.setLineDash([6, 4]);\n ctx.strokeRect(0, 0, width, height);\n ctx.setLineDash([]);\n\n ctx.fillStyle = \"#888888\";\n ctx.font = `${Math.max(12, Math.min(16, height * 0.15))}px sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, width / 2, height / 2, width - 8);\n}\n","import type { AtelierDocument, ImageVisual, Shape } from \"@a-company/atelier-types\";\nimport type { ResolvedFrame } from \"@a-company/atelier-core\";\nimport type { RenderContext, DocumentResolver } from \"./canvas-types.js\";\nimport { buildEffectiveLayer, type EffectiveLayer } from \"./apply-properties.js\";\nimport { renderShape } from \"./renderers/shape-renderer.js\";\nimport { renderText } from \"./renderers/text-renderer.js\";\nimport { renderImage } from \"./renderers/image-renderer.js\";\nimport { renderRef } from \"./renderers/ref-renderer.js\";\nimport type { ImageCache } from \"./image-cache.js\";\n\n/** Options for renderFrame */\nexport interface RenderOptions {\n imageCache?: ImageCache;\n documentResolver?: DocumentResolver;\n maxRefDepth?: number;\n}\n\n/**\n * Render a resolved frame to a Canvas 2D context.\n * Clears the canvas and draws all visible layers in order.\n */\nexport function renderFrame(\n ctx: RenderContext,\n resolvedFrame: ResolvedFrame,\n doc: AtelierDocument,\n optsOrCache?: RenderOptions | ImageCache,\n): void {\n // Backward compatible: detect old ImageCache arg vs new RenderOptions\n let imageCache: ImageCache | undefined;\n let documentResolver: DocumentResolver | undefined;\n let maxRefDepth = 4;\n\n if (optsOrCache && typeof (optsOrCache as ImageCache).get === \"function\") {\n imageCache = optsOrCache as ImageCache;\n } else if (optsOrCache) {\n const opts = optsOrCache as RenderOptions;\n imageCache = opts.imageCache;\n documentResolver = opts.documentResolver;\n maxRefDepth = opts.maxRefDepth ?? 4;\n }\n const { width, height } = doc.canvas;\n\n // Clear canvas\n ctx.fillStyle = doc.canvas.background ?? \"transparent\";\n ctx.fillRect(0, 0, width, height);\n\n // Build effective layers into a map for ancestor transform lookups\n const effMap = new Map<string, EffectiveLayer>();\n const effList: EffectiveLayer[] = [];\n\n for (const resolvedLayer of resolvedFrame.layers) {\n const eff = buildEffectiveLayer(resolvedLayer, width, height);\n effMap.set(resolvedLayer.layer.id, eff);\n effList.push(eff);\n }\n\n // Render each layer in order (painters algorithm — first = back)\n for (const eff of effList) {\n const { layer } = eff;\n\n // Skip invisible layers\n if (!eff.visible) continue;\n\n // Skip fully transparent layers\n if (eff.opacity <= 0) continue;\n\n // Resolve assetId → src for image visuals\n if (layer.visual.type === \"image\") {\n const iv = eff.visual as ImageVisual;\n if (!iv.src && iv.assetId && doc.assets?.[iv.assetId]) {\n iv.src = doc.assets[iv.assetId].src;\n }\n }\n\n ctx.save();\n\n // Apply ancestor transforms (group/parent inheritance)\n applyAncestorTransforms(ctx, layer.id, effMap, doc);\n\n // Apply transforms\n ctx.globalAlpha = eff.opacity;\n\n // Apply blend mode\n if (eff.blendMode !== \"normal\") {\n ctx.globalCompositeOperation = blendModeToComposite(eff.blendMode);\n }\n\n ctx.translate(eff.x, eff.y);\n\n // Apply anchor-relative transforms\n const anchorPixelX = eff.anchorX * eff.width;\n const anchorPixelY = eff.anchorY * eff.height;\n\n // Combine explicit rotation with motion path auto-rotation\n const totalRotation = eff.rotation + eff.motionPathAngle;\n\n if (totalRotation !== 0 || eff.scaleX !== 1 || eff.scaleY !== 1) {\n ctx.translate(anchorPixelX, anchorPixelY);\n if (totalRotation !== 0) {\n ctx.rotate((totalRotation * Math.PI) / 180);\n }\n if (eff.scaleX !== 1 || eff.scaleY !== 1) {\n ctx.scale(eff.scaleX, eff.scaleY);\n }\n ctx.translate(-anchorPixelX, -anchorPixelY);\n }\n\n // Apply shadow if present\n if (eff.shadow) {\n ctx.shadowColor = eff.shadow.color;\n ctx.shadowBlur = eff.shadow.blur;\n ctx.shadowOffsetX = eff.shadow.offsetX;\n ctx.shadowOffsetY = eff.shadow.offsetY;\n }\n\n // Apply clip path if present\n if (layer.clipPath) {\n applyClipPath(ctx, layer.clipPath, eff.width, eff.height);\n }\n\n // Tint requires offscreen compositing — draw to offscreen if tint is active\n const hasTint = eff.tint && eff.tint.amount > 0 && ctx.createOffscreen;\n let renderCtx = ctx;\n let offscreen: { ctx: RenderContext; canvas: unknown } | null = null;\n\n if (hasTint) {\n offscreen = ctx.createOffscreen!(eff.width, eff.height);\n renderCtx = offscreen.ctx;\n }\n\n // Ref rendering options (passed through for sub-doc composition)\n const refOpts = { documentResolver, maxRefDepth, imageCache };\n\n // Dispatch to type-specific renderer\n switch (layer.visual.type) {\n case \"shape\":\n renderShape(renderCtx, eff);\n break;\n case \"text\":\n renderText(renderCtx, eff);\n break;\n case \"image\":\n if (imageCache) renderImage(renderCtx, eff, imageCache);\n break;\n case \"group\":\n // Groups are structural containers — no visual output\n break;\n case \"ref\":\n renderRef(renderCtx, eff, refOpts, doc);\n break;\n }\n\n // Apply tint via multiply composite on offscreen canvas\n if (hasTint && offscreen && eff.tint) {\n const offCtx = offscreen.ctx;\n // Draw tint color over the content using multiply\n offCtx.save();\n offCtx.globalCompositeOperation = \"multiply\";\n offCtx.fillStyle = eff.tint.color;\n offCtx.fillRect(0, 0, eff.width, eff.height);\n offCtx.restore();\n\n // Clip to original content shape using destination-in\n offCtx.save();\n offCtx.globalCompositeOperation = \"destination-in\";\n // Re-render the content to create the alpha mask\n switch (layer.visual.type) {\n case \"shape\": renderShape(offCtx, eff); break;\n case \"text\": renderText(offCtx, eff); break;\n case \"image\": if (imageCache) renderImage(offCtx, eff, imageCache); break;\n case \"ref\": renderRef(offCtx, eff, refOpts, doc); break;\n }\n offCtx.restore();\n\n // Blend tinted offscreen back with original at tint.amount alpha\n // First draw original content\n switch (layer.visual.type) {\n case \"shape\": renderShape(ctx, eff); break;\n case \"text\": renderText(ctx, eff); break;\n case \"image\": if (imageCache) renderImage(ctx, eff, imageCache); break;\n case \"ref\": renderRef(ctx, eff, refOpts, doc); break;\n }\n // Then overlay tinted version at tint amount\n const prevAlpha = ctx.globalAlpha;\n ctx.globalAlpha = eff.tint.amount;\n ctx.drawImage(offscreen.canvas, 0, 0, eff.width, eff.height);\n ctx.globalAlpha = prevAlpha;\n }\n\n ctx.restore();\n }\n}\n\n/** Apply a shape as a clipping region */\nfunction applyClipPath(ctx: RenderContext, shape: Shape, width: number, height: number): void {\n ctx.beginPath();\n switch (shape.type) {\n case \"rect\":\n if (shape.cornerRadius && ctx.roundRect) {\n ctx.roundRect(0, 0, width, height, shape.cornerRadius);\n } else {\n // Manual rect path for clipping (fillRect doesn't create a path)\n ctx.moveTo(0, 0);\n ctx.lineTo(width, 0);\n ctx.lineTo(width, height);\n ctx.lineTo(0, height);\n ctx.closePath();\n }\n break;\n case \"ellipse\":\n ctx.ellipse(width / 2, height / 2, width / 2, height / 2, 0, 0, Math.PI * 2);\n break;\n case \"path\":\n if (shape.points.length >= 2) {\n ctx.moveTo(shape.points[0].x, shape.points[0].y);\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n if (prev.out && curr.in) {\n ctx.bezierCurveTo(\n prev.x + prev.out.x, prev.y + prev.out.y,\n curr.x + curr.in.x, curr.y + curr.in.y,\n curr.x, curr.y,\n );\n } else {\n ctx.lineTo(curr.x, curr.y);\n }\n }\n if (shape.closed) ctx.closePath();\n }\n break;\n }\n ctx.clip();\n}\n\n/** Map Atelier blend mode names to Canvas 2D globalCompositeOperation values */\nfunction blendModeToComposite(mode: string): string {\n const map: Record<string, string> = {\n \"multiply\": \"multiply\",\n \"screen\": \"screen\",\n \"overlay\": \"overlay\",\n \"darken\": \"darken\",\n \"lighten\": \"lighten\",\n \"color-dodge\": \"color-dodge\",\n \"color-burn\": \"color-burn\",\n \"hard-light\": \"hard-light\",\n \"soft-light\": \"soft-light\",\n \"difference\": \"difference\",\n \"exclusion\": \"exclusion\",\n \"hue\": \"hue\",\n \"saturation\": \"saturation\",\n \"color\": \"color\",\n \"luminosity\": \"luminosity\",\n };\n return map[mode] ?? \"source-over\";\n}\n\n/**\n * Walk the parentId chain and apply each ancestor's transforms.\n * This makes child layers inherit parent position/rotation/scale.\n */\nfunction applyAncestorTransforms(\n ctx: RenderContext,\n layerId: string,\n effMap: Map<string, EffectiveLayer>,\n doc: AtelierDocument,\n): void {\n // Collect ancestor chain (excluding self)\n const chain: EffectiveLayer[] = [];\n const layer = doc.layers.find((l) => l.id === layerId);\n let parentId = layer?.parentId;\n const visited = new Set<string>();\n\n while (parentId && !visited.has(parentId)) {\n visited.add(parentId);\n const parentEff = effMap.get(parentId);\n if (!parentEff) break;\n chain.push(parentEff);\n parentId = parentEff.layer.parentId;\n }\n\n // Apply from root ancestor down to direct parent\n for (let i = chain.length - 1; i >= 0; i--) {\n const p = chain[i];\n ctx.translate(p.x, p.y);\n\n const ax = p.anchorX * p.width;\n const ay = p.anchorY * p.height;\n\n if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {\n ctx.translate(ax, ay);\n if (p.rotation !== 0) ctx.rotate((p.rotation * Math.PI) / 180);\n if (p.scaleX !== 1 || p.scaleY !== 1) ctx.scale(p.scaleX, p.scaleY);\n ctx.translate(-ax, -ay);\n }\n }\n}\n","/**\n * A loaded image entry that can be drawn via RenderContext.drawImage.\n */\nexport interface CachedImage {\n complete: boolean;\n image: unknown;\n}\n\n/**\n * Simple image cache for loading and caching images.\n * Browser-agnostic — the actual Image constructor is injected via createImage.\n * Triggers an onLoad callback when an image finishes loading so the\n * renderer can re-render the current frame.\n */\nexport class ImageCache {\n private cache = new Map<string, CachedImage>();\n private loading = new Set<string>();\n private onLoad?: () => void;\n private createImage?: (src: string, onLoad: () => void, onError: () => void) => unknown;\n\n constructor(opts?: {\n onLoad?: () => void;\n createImage?: (src: string, onLoad: () => void, onError: () => void) => unknown;\n }) {\n this.onLoad = opts?.onLoad;\n this.createImage = opts?.createImage;\n }\n\n get(src: string): unknown | null {\n const entry = this.cache.get(src);\n return entry?.complete ? entry.image : null;\n }\n\n load(src: string): void {\n if (this.cache.has(src) || this.loading.has(src)) return;\n if (!this.createImage) return;\n this.loading.add(src);\n const image = this.createImage(\n src,\n () => {\n this.cache.set(src, { complete: true, image });\n this.loading.delete(src);\n this.onLoad?.();\n },\n () => {\n this.loading.delete(src);\n },\n );\n }\n}\n","import type { AtelierDocument, ImageVisual, RefVisual } from \"@a-company/atelier-types\";\nimport { resolveFrame, type ResolvedFrame } from \"@a-company/atelier-core\";\nimport { buildEffectiveLayer, type EffectiveLayer, type DocumentResolver } from \"@a-company/atelier-canvas\";\nimport { buildTransform, buildStyleAttrs } from \"./svg-properties.js\";\nimport { renderShapeSVG } from \"./svg-shapes.js\";\nimport { renderTextSVG } from \"./svg-text.js\";\nimport { buildShadowFilter, buildTintFilter, resetFilterCounter } from \"./svg-filters.js\";\nimport { resetGradientCounter } from \"./svg-gradients.js\";\nimport { buildClipPathDef, resetClipCounter } from \"./svg-clip.js\";\nimport { escapeXml } from \"./svg-properties.js\";\n\nexport interface RenderSVGOptions {\n /** Include XML declaration (default: false) */\n xmlDeclaration?: boolean;\n /** Include viewBox attribute (default: true) */\n viewBox?: boolean;\n /** Indent size in spaces (default: 2) */\n indent?: number;\n /** Resolves ref layer src paths to loaded AtelierDocuments */\n documentResolver?: DocumentResolver;\n /** Maximum ref nesting depth (default: 4) */\n maxRefDepth?: number;\n}\n\n/**\n * Render a resolved frame as an SVG string.\n * If no resolved frame is provided, resolves the given state and frame.\n */\nexport function renderFrameSVG(\n doc: AtelierDocument,\n stateOrFrame: string | ResolvedFrame,\n frame?: number,\n opts?: RenderSVGOptions,\n): string {\n // Reset counters for deterministic IDs\n resetGradientCounter();\n resetFilterCounter();\n resetClipCounter();\n\n let resolved: ResolvedFrame;\n if (typeof stateOrFrame === \"string\") {\n resolved = resolveFrame(doc, stateOrFrame, frame ?? 0);\n } else {\n resolved = stateOrFrame;\n }\n\n const { width, height } = doc.canvas;\n const indent = opts?.indent ?? 2;\n const pad = \" \".repeat(indent);\n\n // Build effective layers\n const effLayers: EffectiveLayer[] = resolved.layers.map(rl =>\n buildEffectiveLayer(rl, width, height),\n );\n\n // Collect all defs and layer elements\n const allDefs: string[] = [];\n const layerElements: string[] = [];\n\n for (let i = 0; i < effLayers.length; i++) {\n const eff = effLayers[i];\n const layer = resolved.layers[i].layer;\n\n // Skip invisible or fully transparent\n if (!eff.visible) continue;\n if (eff.opacity <= 0) continue;\n\n // Resolve asset for images\n if (layer.visual.type === \"image\") {\n const iv = eff.visual as ImageVisual;\n if (!iv.src && iv.assetId && doc.assets?.[iv.assetId]) {\n (eff.visual as ImageVisual).src = doc.assets[iv.assetId].src;\n }\n }\n\n // Build transform\n const transform = buildTransform(eff);\n const styleAttrs = buildStyleAttrs(eff);\n\n // Build shadow filter\n const filterResult = buildShadowFilter(eff);\n if (filterResult) allDefs.push(filterResult.defs);\n\n // Build tint filter\n const tintResult = buildTintFilter(eff);\n if (tintResult) allDefs.push(tintResult.defs);\n\n // Build clip path\n let clipAttr = \"\";\n if (layer.clipPath) {\n const clipResult = buildClipPathDef(layer.clipPath, eff.width, eff.height);\n if (clipResult.defs) {\n allDefs.push(clipResult.defs);\n clipAttr = ` clip-path=\"${clipResult.clipRef}\"`;\n }\n }\n\n // Build group attributes\n const gAttrs: string[] = [];\n if (transform) gAttrs.push(`transform=\"${transform}\"`);\n if (styleAttrs) gAttrs.push(styleAttrs);\n // Apply combined or individual filters\n if (filterResult && tintResult) {\n // When both shadow and tint exist, we need a combined filter\n // For simplicity, apply shadow filter and tint separately via style\n gAttrs.push(`filter=\"${filterResult.filterRef}\"`);\n // Tint is a second filter — wrap content in nested group\n } else if (filterResult) {\n gAttrs.push(`filter=\"${filterResult.filterRef}\"`);\n } else if (tintResult) {\n gAttrs.push(`filter=\"${tintResult.filterRef}\"`);\n }\n if (clipAttr) gAttrs.push(clipAttr.trim());\n\n // Render visual content\n let content = \"\";\n let layerDefs = \"\";\n\n switch (layer.visual.type) {\n case \"shape\": {\n const result = renderShapeSVG(eff, eff.visual as import(\"@a-company/atelier-types\").ShapeVisual);\n content = result.elements;\n layerDefs = result.defs;\n break;\n }\n case \"text\":\n content = renderTextSVG(eff, eff.visual as import(\"@a-company/atelier-types\").TextVisual);\n break;\n case \"image\": {\n const iv = eff.visual as ImageVisual;\n if (iv.src) {\n if (iv.spritesheet) {\n // Spritesheet: compute source rect and use full sheet dimensions for inner image\n const { columns, rows, frameWidth, frameHeight, frameCount } = iv.spritesheet;\n const maxFrames = frameCount ?? (columns * rows);\n const idx = Math.max(0, Math.min(Math.floor(iv.frameIndex ?? 0), maxFrames - 1));\n const col = idx % columns;\n const row = Math.floor(idx / columns);\n const sx = col * frameWidth;\n const sy = row * frameHeight;\n const imgW = columns * frameWidth;\n const imgH = rows * frameHeight;\n content = `<svg viewBox=\"${sx} ${sy} ${frameWidth} ${frameHeight}\" width=\"${eff.width}\" height=\"${eff.height}\">` +\n `<image href=\"${escapeXml(iv.src)}\" width=\"${imgW}\" height=\"${imgH}\" />` +\n `</svg>`;\n } else if (iv.sourceRect) {\n // Manual sourceRect: viewBox crops from image coordinate space\n const sr = iv.sourceRect;\n content = `<svg viewBox=\"${sr.x} ${sr.y} ${sr.width} ${sr.height}\" width=\"${eff.width}\" height=\"${eff.height}\">` +\n `<image href=\"${escapeXml(iv.src)}\" width=\"${eff.width}\" height=\"${eff.height}\" />` +\n `</svg>`;\n } else {\n content = `<image href=\"${escapeXml(iv.src)}\" width=\"${eff.width}\" height=\"${eff.height}\" />`;\n }\n }\n break;\n }\n case \"group\":\n // Groups are structural — no visual content in SVG either\n break;\n case \"ref\": {\n const refVisual = eff.visual as RefVisual;\n const refContent = renderRefSVG(eff, refVisual, doc, opts);\n content = refContent;\n break;\n }\n }\n\n if (layerDefs) allDefs.push(layerDefs);\n\n if (content) {\n const gOpen = gAttrs.length > 0 ? `<g ${gAttrs.join(\" \")}>` : \"<g>\";\n layerElements.push(`${pad}${gOpen}${content}</g>`);\n }\n }\n\n // Build SVG\n const lines: string[] = [];\n\n if (opts?.xmlDeclaration) {\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n }\n\n const viewBox = opts?.viewBox !== false ? ` viewBox=\"0 0 ${width} ${height}\"` : \"\";\n const bg = doc.canvas.background;\n\n lines.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\"${viewBox}>`);\n\n // Defs section\n if (allDefs.length > 0) {\n lines.push(`${pad}<defs>`);\n for (const def of allDefs) {\n lines.push(`${pad}${pad}${def}`);\n }\n lines.push(`${pad}</defs>`);\n }\n\n // Background\n if (bg && bg !== \"transparent\") {\n lines.push(`${pad}<rect width=\"${width}\" height=\"${height}\" fill=\"${bg}\" />`);\n }\n\n // Layers\n lines.push(...layerElements);\n\n lines.push(\"</svg>\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a ref layer as SVG. Uses documentResolver to inline sub-doc content,\n * or falls back to a dashed placeholder rectangle.\n */\nfunction renderRefSVG(\n eff: EffectiveLayer,\n visual: RefVisual,\n _parentDoc: AtelierDocument,\n opts?: RenderSVGOptions,\n _depth?: number,\n _visitedRefs?: Set<string>,\n): string {\n const resolver = opts?.documentResolver;\n\n if (!resolver) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const depth = _depth ?? 0;\n const maxDepth = opts?.maxRefDepth ?? 4;\n if (depth >= maxDepth) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#c33\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#c33\" font-size=\"12\">MAX DEPTH</text>`;\n }\n\n const visitedRefs = _visitedRefs ?? new Set<string>();\n if (visitedRefs.has(visual.src)) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#c33\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#c33\" font-size=\"12\">CYCLE</text>`;\n }\n\n const subDoc = resolver(visual.src);\n if (!subDoc) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" /><text x=\"${eff.width / 2}\" y=\"${eff.height / 2}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#999\" font-size=\"12\">NOT FOUND</text>`;\n }\n\n const stateNames = Object.keys(subDoc.states);\n if (stateNames.length === 0) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const stateName = visual.state ?? stateNames[0];\n const stateObj = subDoc.states[stateName];\n if (!stateObj) {\n return `<rect width=\"${eff.width}\" height=\"${eff.height}\" fill=\"none\" stroke=\"#999\" stroke-dasharray=\"4 2\" />`;\n }\n\n const maxFrame = Math.max(0, stateObj.duration - 1);\n const frame = Math.min(visual.frame ?? 0, maxFrame);\n\n visitedRefs.add(visual.src);\n\n // Render sub-doc as nested <svg> with viewBox for scaling\n const subW = subDoc.canvas.width;\n const subH = subDoc.canvas.height;\n const resolved = resolveFrame(subDoc, stateName, frame);\n\n const subParts: string[] = [];\n for (const rl of resolved.layers) {\n const subEff = buildEffectiveLayer(rl, subW, subH);\n if (!subEff.visible || subEff.opacity <= 0) continue;\n\n // Resolve asset\n if (rl.layer.visual.type === \"image\") {\n const iv = subEff.visual as ImageVisual;\n if (!iv.src && iv.assetId && subDoc.assets?.[iv.assetId]) {\n iv.src = subDoc.assets[iv.assetId].src;\n }\n }\n\n const transform = buildTransform(subEff);\n const styleAttrs = buildStyleAttrs(subEff);\n const gAttrs: string[] = [];\n if (transform) gAttrs.push(`transform=\"${transform}\"`);\n if (styleAttrs) gAttrs.push(styleAttrs);\n\n let childContent = \"\";\n switch (rl.layer.visual.type) {\n case \"shape\": {\n const result = renderShapeSVG(subEff, subEff.visual as import(\"@a-company/atelier-types\").ShapeVisual);\n childContent = result.elements;\n break;\n }\n case \"text\":\n childContent = renderTextSVG(subEff, subEff.visual as import(\"@a-company/atelier-types\").TextVisual);\n break;\n case \"image\": {\n const iv = subEff.visual as ImageVisual;\n if (iv.src) {\n childContent = `<image href=\"${escapeXml(iv.src)}\" width=\"${subEff.width}\" height=\"${subEff.height}\" />`;\n }\n break;\n }\n case \"ref\": {\n const refV = subEff.visual as RefVisual;\n childContent = renderRefSVG(subEff, refV, subDoc, opts, depth + 1, visitedRefs);\n break;\n }\n }\n\n if (childContent) {\n const gOpen = gAttrs.length > 0 ? `<g ${gAttrs.join(\" \")}>` : \"<g>\";\n subParts.push(`${gOpen}${childContent}</g>`);\n }\n }\n\n visitedRefs.delete(visual.src);\n\n return `<svg x=\"0\" y=\"0\" width=\"${eff.width}\" height=\"${eff.height}\" viewBox=\"0 0 ${subW} ${subH}\">${subParts.join(\"\")}</svg>`;\n}\n","import type { EffectiveLayer } from \"@a-company/atelier-canvas\";\n\n/** Build SVG transform attribute from effective layer values */\nexport function buildTransform(eff: EffectiveLayer): string {\n const parts: string[] = [];\n\n // Translate to position\n if (eff.x !== 0 || eff.y !== 0) {\n parts.push(`translate(${eff.x}, ${eff.y})`);\n }\n\n const totalRotation = eff.rotation + eff.motionPathAngle;\n if (totalRotation !== 0 || eff.scaleX !== 1 || eff.scaleY !== 1) {\n const ax = eff.anchorX * eff.width;\n const ay = eff.anchorY * eff.height;\n\n // Move to anchor, apply rotation/scale, move back\n if (ax !== 0 || ay !== 0) {\n parts.push(`translate(${ax}, ${ay})`);\n }\n if (totalRotation !== 0) {\n parts.push(`rotate(${totalRotation})`);\n }\n if (eff.scaleX !== 1 || eff.scaleY !== 1) {\n parts.push(`scale(${eff.scaleX}, ${eff.scaleY})`);\n }\n if (ax !== 0 || ay !== 0) {\n parts.push(`translate(${-ax}, ${-ay})`);\n }\n }\n\n return parts.length > 0 ? parts.join(\" \") : \"\";\n}\n\n/** Build common SVG style attributes */\nexport function buildStyleAttrs(eff: EffectiveLayer): string {\n const attrs: string[] = [];\n\n if (eff.opacity < 1) {\n attrs.push(`opacity=\"${eff.opacity}\"`);\n }\n\n if (eff.blendMode !== \"normal\") {\n attrs.push(`style=\"mix-blend-mode: ${eff.blendMode}\"`);\n }\n\n return attrs.join(\" \");\n}\n\n/** Escape XML special characters */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { Fill, LinearGradientFill, RadialGradientFill, Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\n\nlet gradientIdCounter = 0;\n\nexport function resetGradientCounter(): void {\n gradientIdCounter = 0;\n}\n\n/** Convert an Atelier Color to a CSS color string */\nexport function colorToCSS(color: Color): string {\n if (typeof color === \"string\") return color;\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return `rgba(${Math.round(c.r)}, ${Math.round(c.g)}, ${Math.round(c.b)}, ${c.a})`;\n }\n if (\"h\" in color) {\n const c = color as HSLAColor;\n return `hsla(${c.h}, ${c.s}%, ${c.l}%, ${c.a})`;\n }\n return \"#000000\";\n}\n\n/** Generate SVG gradient defs and return the fill reference */\nexport function buildGradientDef(fill: Fill, width: number, height: number): { defs: string; fillRef: string } {\n if (fill.type === \"solid\") {\n return { defs: \"\", fillRef: colorToCSS(fill.color) };\n }\n\n if (fill.type === \"linear-gradient\") {\n return buildLinearGradient(fill, width, height);\n }\n\n if (fill.type === \"radial-gradient\") {\n return buildRadialGradient(fill, width, height);\n }\n\n return { defs: \"\", fillRef: \"none\" };\n}\n\nfunction buildLinearGradient(fill: LinearGradientFill, _width: number, _height: number): { defs: string; fillRef: string } {\n const id = `grad-${++gradientIdCounter}`;\n const rad = (fill.angle * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n // Map angle to x1,y1,x2,y2 (0-1 percentages)\n const x1 = 0.5 - cos * 0.5;\n const y1 = 0.5 - sin * 0.5;\n const x2 = 0.5 + cos * 0.5;\n const y2 = 0.5 + sin * 0.5;\n\n const stops = fill.stops.map(s =>\n `<stop offset=\"${s.offset}\" stop-color=\"${colorToCSS(s.color)}\" />`\n ).join(\"\");\n\n const def = `<linearGradient id=\"${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\">${stops}</linearGradient>`;\n return { defs: def, fillRef: `url(#${id})` };\n}\n\nfunction buildRadialGradient(fill: RadialGradientFill, width: number, height: number): { defs: string; fillRef: string } {\n const id = `grad-${++gradientIdCounter}`;\n\n const cx = typeof fill.center.x === \"number\" ? fill.center.x : (parseFloat(fill.center.x) / 100) * width;\n const cy = typeof fill.center.y === \"number\" ? fill.center.y : (parseFloat(fill.center.y) / 100) * height;\n const r = typeof fill.radius === \"number\" ? fill.radius : (parseFloat(fill.radius) / 100) * Math.max(width, height);\n\n const stops = fill.stops.map(s =>\n `<stop offset=\"${s.offset}\" stop-color=\"${colorToCSS(s.color)}\" />`\n ).join(\"\");\n\n const def = `<radialGradient id=\"${id}\" cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" gradientUnits=\"userSpaceOnUse\">${stops}</radialGradient>`;\n return { defs: def, fillRef: `url(#${id})` };\n}\n","import type { ShapeVisual, Shape, RectShape, PathShape, Stroke } from \"@a-company/atelier-types\";\nimport type { EffectiveLayer } from \"@a-company/atelier-canvas\";\nimport { buildGradientDef, colorToCSS } from \"./svg-gradients.js\";\n\n/** Render a shape visual as SVG elements */\nexport function renderShapeSVG(\n eff: EffectiveLayer,\n visual: ShapeVisual,\n): { elements: string; defs: string } {\n const { shape } = visual;\n const defs: string[] = [];\n\n let fillAttr = \"none\";\n if (visual.fill) {\n const gradResult = buildGradientDef(visual.fill, eff.width, eff.height);\n if (gradResult.defs) defs.push(gradResult.defs);\n fillAttr = gradResult.fillRef;\n }\n\n let strokeAttrs = \"\";\n if (visual.stroke) {\n strokeAttrs = buildStrokeAttrs(visual.stroke);\n }\n\n const element = buildShapeElement(shape, eff.width, eff.height, fillAttr, strokeAttrs);\n return { elements: element, defs: defs.join(\"\") };\n}\n\nfunction buildShapeElement(\n shape: Shape,\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n switch (shape.type) {\n case \"rect\":\n return buildRectElement(shape, width, height, fill, strokeAttrs);\n case \"ellipse\":\n return buildEllipseElement(width, height, fill, strokeAttrs);\n case \"path\":\n return buildPathElement(shape, fill, strokeAttrs);\n }\n}\n\nfunction buildRectElement(\n shape: RectShape,\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n let rx = \"\";\n if (shape.cornerRadius) {\n const r = typeof shape.cornerRadius === \"number\" ? shape.cornerRadius : shape.cornerRadius[0];\n rx = ` rx=\"${r}\" ry=\"${r}\"`;\n }\n return `<rect width=\"${width}\" height=\"${height}\" fill=\"${fill}\"${rx}${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildEllipseElement(\n width: number,\n height: number,\n fill: string,\n strokeAttrs: string,\n): string {\n const cx = width / 2;\n const cy = height / 2;\n const rx = width / 2;\n const ry = height / 2;\n return `<ellipse cx=\"${cx}\" cy=\"${cy}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"${fill}\"${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildPathElement(\n shape: PathShape,\n fill: string,\n strokeAttrs: string,\n): string {\n if (shape.points.length < 2) return \"\";\n\n const d: string[] = [];\n d.push(`M ${shape.points[0].x} ${shape.points[0].y}`);\n\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n\n if (prev.out && curr.in) {\n d.push(`C ${prev.x + prev.out.x} ${prev.y + prev.out.y} ${curr.x + curr.in.x} ${curr.y + curr.in.y} ${curr.x} ${curr.y}`);\n } else {\n d.push(`L ${curr.x} ${curr.y}`);\n }\n }\n\n if (shape.closed) d.push(\"Z\");\n\n return `<path d=\"${d.join(\" \")}\" fill=\"${fill}\"${strokeAttrs ? \" \" + strokeAttrs : \"\"} />`;\n}\n\nfunction buildStrokeAttrs(stroke: Stroke): string {\n const parts: string[] = [];\n parts.push(`stroke=\"${colorToCSS(stroke.color)}\"`);\n parts.push(`stroke-width=\"${stroke.width}\"`);\n\n if (stroke.lineCap) parts.push(`stroke-linecap=\"${stroke.lineCap}\"`);\n if (stroke.lineJoin) parts.push(`stroke-linejoin=\"${stroke.lineJoin}\"`);\n if (stroke.dash) parts.push(`stroke-dasharray=\"${stroke.dash.join(\" \")}\"`);\n\n return parts.join(\" \");\n}\n","import type { TextVisual } from \"@a-company/atelier-types\";\nimport type { EffectiveLayer } from \"@a-company/atelier-canvas\";\nimport { colorToCSS } from \"./svg-gradients.js\";\nimport { escapeXml } from \"./svg-properties.js\";\n\n/** Render a text visual as SVG elements */\nexport function renderTextSVG(eff: EffectiveLayer, visual: TextVisual): string {\n const { style } = visual;\n\n const attrs: string[] = [];\n\n // Font attributes\n attrs.push(`font-family=\"${escapeXml(style.fontFamily)}\"`);\n attrs.push(`font-size=\"${style.fontSize}\"`);\n\n if (style.fontWeight && style.fontWeight !== \"normal\") {\n attrs.push(`font-weight=\"${style.fontWeight}\"`);\n }\n if (style.fontStyle && style.fontStyle !== \"normal\") {\n attrs.push(`font-style=\"${style.fontStyle}\"`);\n }\n\n // Color\n attrs.push(`fill=\"${colorToCSS(style.color)}\"`);\n\n // Text alignment\n const align = style.textAlign ?? \"left\";\n let textAnchor = \"start\";\n let x = 0;\n if (align === \"center\") {\n textAnchor = \"middle\";\n x = eff.width / 2;\n } else if (align === \"right\") {\n textAnchor = \"end\";\n x = eff.width;\n }\n attrs.push(`text-anchor=\"${textAnchor}\"`);\n\n // Letter spacing\n if (style.letterSpacing) {\n attrs.push(`letter-spacing=\"${style.letterSpacing}\"`);\n }\n\n // SVG text baseline: use dominant-baseline for top alignment\n attrs.push(`dominant-baseline=\"hanging\"`);\n\n return `<text x=\"${x}\" y=\"0\" ${attrs.join(\" \")}>${escapeXml(visual.content)}</text>`;\n}\n","import type { EffectiveLayer } from \"@a-company/atelier-canvas\";\n\nlet filterIdCounter = 0;\n\nexport function resetFilterCounter(): void {\n filterIdCounter = 0;\n}\n\n/** Build SVG filter definition for shadow effects */\nexport function buildShadowFilter(eff: EffectiveLayer): { defs: string; filterRef: string } | null {\n if (!eff.shadow) return null;\n\n const id = `filter-${++filterIdCounter}`;\n const { color, blur, offsetX, offsetY } = eff.shadow;\n\n const def = [\n `<filter id=\"${id}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">`,\n `<feDropShadow dx=\"${offsetX}\" dy=\"${offsetY}\" stdDeviation=\"${blur / 2}\" flood-color=\"${color}\" />`,\n `</filter>`,\n ].join(\"\");\n\n return { defs: def, filterRef: `url(#${id})` };\n}\n\n/** Build SVG filter definition for tint effect (feFlood + feBlend multiply) */\nexport function buildTintFilter(eff: EffectiveLayer): { defs: string; filterRef: string } | null {\n if (!eff.tint || eff.tint.amount <= 0) return null;\n\n const id = `filter-${++filterIdCounter}`;\n const { color, amount } = eff.tint;\n\n const def = [\n `<filter id=\"${id}\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">`,\n `<feFlood flood-color=\"${color}\" flood-opacity=\"${amount}\" result=\"tint\" />`,\n `<feBlend in=\"SourceGraphic\" in2=\"tint\" mode=\"multiply\" />`,\n `</filter>`,\n ].join(\"\");\n\n return { defs: def, filterRef: `url(#${id})` };\n}\n","import type { Shape } from \"@a-company/atelier-types\";\n\nlet clipIdCounter = 0;\n\nexport function resetClipCounter(): void {\n clipIdCounter = 0;\n}\n\n/** Build SVG clipPath definition */\nexport function buildClipPathDef(shape: Shape, width: number, height: number): { defs: string; clipRef: string } {\n const id = `clip-${++clipIdCounter}`;\n let pathContent = \"\";\n\n switch (shape.type) {\n case \"rect\":\n if (shape.cornerRadius) {\n const r = typeof shape.cornerRadius === \"number\" ? shape.cornerRadius : shape.cornerRadius[0];\n pathContent = `<rect width=\"${width}\" height=\"${height}\" rx=\"${r}\" ry=\"${r}\" />`;\n } else {\n pathContent = `<rect width=\"${width}\" height=\"${height}\" />`;\n }\n break;\n case \"ellipse\":\n pathContent = `<ellipse cx=\"${width / 2}\" cy=\"${height / 2}\" rx=\"${width / 2}\" ry=\"${height / 2}\" />`;\n break;\n case \"path\": {\n if (shape.points.length < 2) return { defs: \"\", clipRef: \"\" };\n const d: string[] = [];\n d.push(`M ${shape.points[0].x} ${shape.points[0].y}`);\n for (let i = 1; i < shape.points.length; i++) {\n const prev = shape.points[i - 1];\n const curr = shape.points[i];\n if (prev.out && curr.in) {\n d.push(`C ${prev.x + prev.out.x} ${prev.y + prev.out.y} ${curr.x + curr.in.x} ${curr.y + curr.in.y} ${curr.x} ${curr.y}`);\n } else {\n d.push(`L ${curr.x} ${curr.y}`);\n }\n }\n if (shape.closed) d.push(\"Z\");\n pathContent = `<path d=\"${d.join(\" \")}\" />`;\n break;\n }\n }\n\n const def = `<clipPath id=\"${id}\">${pathContent}</clipPath>`;\n return { defs: def, clipRef: `url(#${id})` };\n}\n","import type { Color, RGBAColor, HSLAColor } from \"@a-company/atelier-types\";\n\n/** Convert an Atelier color to Lottie [r, g, b, a] format (0–1 range) */\nexport function colorToLottie(color: Color): number[] {\n if (typeof color === \"string\") {\n return hexToLottie(color);\n }\n\n if (\"r\" in color) {\n const c = color as RGBAColor;\n return [c.r / 255, c.g / 255, c.b / 255, c.a];\n }\n\n if (\"h\" in color) {\n const c = color as HSLAColor;\n const rgb = hslToRgb(c.h, c.s, c.l);\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, c.a];\n }\n\n return [0, 0, 0, 1];\n}\n\nfunction hexToLottie(hex: string): number[] {\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3 || clean.length === 4) {\n const r = parseInt(clean[0] + clean[0], 16) / 255;\n const g = parseInt(clean[1] + clean[1], 16) / 255;\n const b = parseInt(clean[2] + clean[2], 16) / 255;\n const a = clean.length === 4 ? parseInt(clean[3] + clean[3], 16) / 255 : 1;\n return [r, g, b, a];\n }\n const r = parseInt(clean.slice(0, 2), 16) / 255;\n const g = parseInt(clean.slice(2, 4), 16) / 255;\n const b = parseInt(clean.slice(4, 6), 16) / 255;\n const a = clean.length === 8 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n s = s / 100;\n l = l / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n };\n return [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n}\n","import type { ShapeVisual, Fill, Stroke } from \"@a-company/atelier-types\";\nimport type { LottieShapeItem } from \"./lottie-types.js\";\nimport { colorToLottie } from \"./map-colors.js\";\n\n/** Map an Atelier shape visual to Lottie shape items */\nexport function mapShapeVisual(\n visual: ShapeVisual,\n width: number,\n height: number,\n): LottieShapeItem[] {\n const items: LottieShapeItem[] = [];\n\n // Shape geometry\n switch (visual.shape.type) {\n case \"rect\":\n items.push({\n ty: \"rc\",\n nm: \"Rectangle\",\n d: 1,\n s: { a: 0, k: [width, height] },\n p: { a: 0, k: [width / 2, height / 2] },\n r: { a: 0, k: typeof visual.shape.cornerRadius === \"number\" ? visual.shape.cornerRadius : 0 },\n });\n break;\n case \"ellipse\":\n items.push({\n ty: \"el\",\n nm: \"Ellipse\",\n d: 1,\n s: { a: 0, k: [width, height] },\n p: { a: 0, k: [width / 2, height / 2] },\n });\n break;\n case \"path\": {\n const vertices = visual.shape.points.map(p => [p.x, p.y]);\n const inTangents = visual.shape.points.map(p => p.in ? [p.in.x, p.in.y] : [0, 0]);\n const outTangents = visual.shape.points.map(p => p.out ? [p.out.x, p.out.y] : [0, 0]);\n items.push({\n ty: \"sh\",\n nm: \"Path\",\n ks: {\n a: 0,\n k: {\n c: visual.shape.closed ?? false,\n v: vertices,\n i: inTangents,\n o: outTangents,\n },\n },\n });\n break;\n }\n }\n\n // Fill\n if (visual.fill) {\n items.push(mapFill(visual.fill, width, height));\n }\n\n // Stroke\n if (visual.stroke) {\n items.push(mapStroke(visual.stroke));\n }\n\n return items;\n}\n\nfunction mapFill(fill: Fill, _width: number, _height: number): LottieShapeItem {\n if (fill.type === \"solid\") {\n const color = colorToLottie(fill.color);\n return {\n ty: \"fl\",\n nm: \"Fill\",\n c: { a: 0, k: color.slice(0, 3) },\n o: { a: 0, k: (color[3] ?? 1) * 100 },\n r: 1,\n };\n }\n\n if (fill.type === \"linear-gradient\") {\n const stops: number[] = [];\n for (const stop of fill.stops) {\n const c = colorToLottie(stop.color);\n stops.push(stop.offset, c[0], c[1], c[2]);\n }\n return {\n ty: \"gf\",\n nm: \"Gradient Fill\",\n t: 1, // linear\n s: { a: 0, k: [0, 0] },\n e: { a: 0, k: [100, 0] },\n g: { p: fill.stops.length, k: { a: 0, k: stops } },\n r: 1,\n o: { a: 0, k: 100 },\n };\n }\n\n if (fill.type === \"radial-gradient\") {\n const stops: number[] = [];\n for (const stop of fill.stops) {\n const c = colorToLottie(stop.color);\n stops.push(stop.offset, c[0], c[1], c[2]);\n }\n return {\n ty: \"gf\",\n nm: \"Gradient Fill\",\n t: 2, // radial\n s: { a: 0, k: [50, 50] },\n e: { a: 0, k: [100, 50] },\n g: { p: fill.stops.length, k: { a: 0, k: stops } },\n r: 1,\n o: { a: 0, k: 100 },\n };\n }\n\n return { ty: \"fl\", nm: \"Fill\", c: { a: 0, k: [0, 0, 0] }, o: { a: 0, k: 100 }, r: 1 };\n}\n\nfunction mapStroke(stroke: Stroke): LottieShapeItem {\n const color = colorToLottie(stroke.color);\n return {\n ty: \"st\",\n nm: \"Stroke\",\n c: { a: 0, k: color.slice(0, 3) },\n o: { a: 0, k: (color[3] ?? 1) * 100 },\n w: { a: 0, k: stroke.width },\n lc: stroke.lineCap === \"round\" ? 2 : stroke.lineCap === \"square\" ? 3 : 1,\n lj: stroke.lineJoin === \"round\" ? 2 : stroke.lineJoin === \"bevel\" ? 3 : 1,\n };\n}\n","import type { Easing } from \"@a-company/atelier-types\";\n\nexport interface LottieEasing {\n i: { x: number[]; y: number[] };\n o: { x: number[]; y: number[] };\n}\n\n/** Map an Atelier easing to Lottie bezier easing curves */\nexport function mapEasing(easing: Easing | undefined): LottieEasing | { h: 1 } {\n if (!easing) return linearEasing();\n\n if (typeof easing === \"string\") {\n switch (easing) {\n case \"ease-in\":\n return bezierEasing(0.42, 0, 1, 1);\n case \"ease-out\":\n return bezierEasing(0, 0, 0.58, 1);\n case \"ease-in-out\":\n return bezierEasing(0.42, 0, 0.58, 1);\n default:\n return linearEasing();\n }\n }\n\n switch (easing.type) {\n case \"linear\":\n return linearEasing();\n case \"cubic-bezier\":\n return bezierEasing(easing.x1, easing.y1, easing.x2, easing.y2);\n case \"spring\":\n // Approximate spring as a cubic-bezier (lossy)\n return bezierEasing(0.25, 0.1, 0.25, 1);\n case \"step\":\n // Steps map to hold keyframes\n return { h: 1 };\n default:\n return linearEasing();\n }\n}\n\nfunction linearEasing(): LottieEasing {\n return {\n i: { x: [0.833], y: [0.833] },\n o: { x: [0.167], y: [0.167] },\n };\n}\n\nfunction bezierEasing(x1: number, y1: number, x2: number, y2: number): LottieEasing {\n return {\n i: { x: [x2], y: [y2] },\n o: { x: [x1], y: [y1] },\n };\n}\n\n/** Check if an easing is lossy (spring/step → approximated) */\nexport function isLossyEasing(easing: Easing | undefined): string | null {\n if (!easing || typeof easing === \"string\") return null;\n if (easing.type === \"spring\") return \"Spring easing approximated as cubic-bezier\";\n if (easing.type === \"step\") return \"Step easing mapped to hold keyframes\";\n return null;\n}\n","import type { Delta, AnimatableProperty } from \"@a-company/atelier-types\";\nimport type { LottieAnimatedValue, LottieAnimatedMultiValue, LottieKeyframe, LottieMultiKeyframe } from \"./lottie-types.js\";\nimport { mapEasing, isLossyEasing } from \"./map-easing.js\";\n\n/** Map deltas for a single layer+property to Lottie animated value */\nexport function mapDeltasToAnimated(\n deltas: Delta[],\n property: AnimatableProperty,\n warnings: string[],\n): LottieAnimatedValue {\n if (deltas.length === 0) {\n return { a: 0, k: 0 };\n }\n\n // Check for lossy easings\n for (const d of deltas) {\n const lossyMsg = isLossyEasing(d.easing);\n if (lossyMsg) warnings.push(`${property}: ${lossyMsg}`);\n }\n\n // If expressions, warn and use static\n for (const d of deltas) {\n if (isExpression(d.from) || isExpression(d.to)) {\n warnings.push(`${property}: Expression values not supported in Lottie, using static values`);\n return { a: 0, k: typeof d.from === \"number\" ? d.from : 0 };\n }\n }\n\n // Single delta — simple animated value\n if (deltas.length === 1) {\n const d = deltas[0];\n const fromVal = resolveValue(d.from, property);\n const toVal = resolveValue(d.to, property);\n\n if (fromVal === toVal) {\n return { a: 0, k: fromVal };\n }\n\n const easing = mapEasing(d.easing);\n const kfs: LottieKeyframe[] = [];\n\n if (\"h\" in easing) {\n kfs.push({ t: d.range[0], s: [fromVal], h: 1 });\n kfs.push({ t: d.range[1], s: [toVal] });\n } else {\n kfs.push({ t: d.range[0], s: [fromVal], e: [toVal], i: easing.i, o: easing.o });\n kfs.push({ t: d.range[1], s: [toVal] });\n }\n\n return { a: 1, k: kfs };\n }\n\n // Multiple deltas — chain keyframes\n const sorted = [...deltas].sort((a, b) => a.range[0] - b.range[0]);\n const kfs: LottieKeyframe[] = [];\n\n for (const d of sorted) {\n const fromVal = resolveValue(d.from, property);\n const toVal = resolveValue(d.to, property);\n const easing = mapEasing(d.easing);\n\n if (\"h\" in easing) {\n kfs.push({ t: d.range[0], s: [fromVal], h: 1 });\n } else {\n kfs.push({ t: d.range[0], s: [fromVal], e: [toVal], i: easing.i, o: easing.o });\n }\n }\n\n // Final keyframe\n const last = sorted[sorted.length - 1];\n kfs.push({ t: last.range[1], s: [resolveValue(last.to, property)] });\n\n return { a: 1, k: kfs };\n}\n\n/** Map position deltas (frame.x, frame.y) to Lottie multi-dimensional animated value */\nexport function mapPositionDeltas(\n xDeltas: Delta[],\n yDeltas: Delta[],\n baseX: number,\n baseY: number,\n warnings: string[],\n): LottieAnimatedMultiValue {\n const hasXAnim = xDeltas.length > 0;\n const hasYAnim = yDeltas.length > 0;\n\n if (!hasXAnim && !hasYAnim) {\n return { a: 0, k: [baseX, baseY, 0] };\n }\n\n // Collect all unique frame points\n const frames = new Set<number>();\n for (const d of [...xDeltas, ...yDeltas]) {\n frames.add(d.range[0]);\n frames.add(d.range[1]);\n }\n const sortedFrames = [...frames].sort((a, b) => a - b);\n\n if (sortedFrames.length < 2) {\n return { a: 0, k: [baseX, baseY, 0] };\n }\n\n // Build multi-dimensional keyframes\n const kfs: LottieMultiKeyframe[] = [];\n for (let i = 0; i < sortedFrames.length; i++) {\n const f = sortedFrames[i];\n const x = resolveAtFrame(xDeltas, f, baseX);\n const y = resolveAtFrame(yDeltas, f, baseY);\n\n if (i < sortedFrames.length - 1) {\n const nextF = sortedFrames[i + 1];\n const nextX = resolveAtFrame(xDeltas, nextF, baseX);\n const nextY = resolveAtFrame(yDeltas, nextF, baseY);\n\n // Find the active delta's easing\n const activeX = xDeltas.find(d => d.range[0] <= f && d.range[1] >= f);\n const activeY = yDeltas.find(d => d.range[0] <= f && d.range[1] >= f);\n const easing = mapEasing(activeX?.easing ?? activeY?.easing);\n\n if (\"h\" in easing) {\n kfs.push({ t: f, s: [x, y, 0], h: 1 });\n } else {\n kfs.push({ t: f, s: [x, y, 0], e: [nextX, nextY, 0], i: easing.i, o: easing.o });\n }\n } else {\n kfs.push({ t: f, s: [x, y, 0] });\n }\n }\n\n // Check for lossy warnings\n for (const d of [...xDeltas, ...yDeltas]) {\n const msg = isLossyEasing(d.easing);\n if (msg) warnings.push(`position: ${msg}`);\n }\n\n return { a: 1, k: kfs };\n}\n\nfunction resolveAtFrame(deltas: Delta[], frame: number, base: number): number {\n for (const d of deltas) {\n if (frame >= d.range[0] && frame <= d.range[1]) {\n const from = typeof d.from === \"number\" ? d.from : base;\n const to = typeof d.to === \"number\" ? d.to : base;\n const progress = d.range[0] === d.range[1] ? 1 : (frame - d.range[0]) / (d.range[1] - d.range[0]);\n return from + (to - from) * progress;\n }\n }\n // Hold last completed value\n let lastCompleted: Delta | undefined;\n for (const d of deltas) {\n if (frame > d.range[1]) {\n if (!lastCompleted || d.range[1] > lastCompleted.range[1]) {\n lastCompleted = d;\n }\n }\n }\n if (lastCompleted) return typeof lastCompleted.to === \"number\" ? lastCompleted.to : base;\n return base;\n}\n\nfunction resolveValue(val: unknown, _property: AnimatableProperty): number {\n if (typeof val === \"number\") return val;\n if (typeof val === \"string\" && val.startsWith(\"#\")) {\n // Color — for Lottie, colors are handled separately\n return 0;\n }\n return 0;\n}\n\nfunction isExpression(val: unknown): boolean {\n return typeof val === \"object\" && val !== null && \"expr\" in val;\n}\n","import type { AtelierDocument, Layer, Delta, State, UnitValue } from \"@a-company/atelier-types\";\nimport type { LottieLayer, LottieTransform, LottieTextData } from \"./lottie-types.js\";\nimport { mapShapeVisual } from \"./map-shapes.js\";\nimport { mapDeltasToAnimated, mapPositionDeltas } from \"./map-keyframes.js\";\nimport { colorToLottie } from \"./map-colors.js\";\n\n/** Resolve a UnitValue to a plain number (percentages treated as 0 for Lottie) */\nfunction toNum(v: UnitValue): number {\n return typeof v === \"number\" ? v : 0;\n}\n\n/** Map all layers in a document+state to Lottie layers */\nexport function mapLayers(\n doc: AtelierDocument,\n state: State,\n warnings: string[],\n): LottieLayer[] {\n const layerIndexMap = new Map<string, number>();\n doc.layers.forEach((l, i) => layerIndexMap.set(l.id, i));\n\n return doc.layers.map((layer, index) => {\n const deltas = state.deltas.filter(d => d.layer === layer.id);\n return mapLayer(layer, index, deltas, layerIndexMap, doc, warnings);\n });\n}\n\nfunction mapLayer(\n layer: Layer,\n index: number,\n deltas: Delta[],\n layerIndexMap: Map<string, number>,\n doc: AtelierDocument,\n warnings: string[],\n): LottieLayer {\n const duration = getMaxFrame(deltas, doc);\n\n const base: LottieLayer = {\n ty: getLayerType(layer),\n nm: layer.id,\n ind: index,\n ip: 0,\n op: duration,\n st: 0,\n ks: buildTransform(layer, deltas, warnings),\n };\n\n // Parent\n if (layer.parentId) {\n const parentIdx = layerIndexMap.get(layer.parentId);\n if (parentIdx !== undefined) {\n base.parent = parentIdx;\n }\n }\n\n // Blend mode\n if (layer.blendMode) {\n base.bm = mapBlendMode(layer.blendMode);\n }\n\n // Shape layer\n if (layer.visual.type === \"shape\") {\n base.shapes = mapShapeVisual(layer.visual, toNum(layer.bounds.width), toNum(layer.bounds.height));\n }\n\n // Text layer\n if (layer.visual.type === \"text\") {\n const color = colorToLottie(layer.visual.style.color);\n base.t = {\n d: {\n k: [{\n s: {\n s: layer.visual.style.fontSize,\n f: layer.visual.style.fontFamily,\n t: layer.visual.content,\n fc: color.slice(0, 3),\n j: layer.visual.style.textAlign === \"center\" ? 1 :\n layer.visual.style.textAlign === \"right\" ? 2 : 0,\n },\n t: 0,\n }],\n },\n } as LottieTextData;\n }\n\n // Image layer\n if (layer.visual.type === \"image\") {\n base.refId = layer.visual.assetId;\n base.w = toNum(layer.bounds.width);\n base.h = toNum(layer.bounds.height);\n\n if (layer.visual.spritesheet) {\n warnings.push(`Layer \"${layer.id}\": Spritesheet animation not supported in Lottie export`);\n }\n if (layer.visual.sourceRect) {\n warnings.push(`Layer \"${layer.id}\": sourceRect cropping not supported in Lottie export`);\n }\n }\n\n // Tint warning\n if (layer.tint && layer.tint.amount > 0) {\n warnings.push(`Layer \"${layer.id}\": Tint effect not supported in Lottie export`);\n }\n\n return base;\n}\n\nfunction getLayerType(layer: Layer): number {\n switch (layer.visual.type) {\n case \"shape\": return 4;\n case \"text\": return 5;\n case \"image\": return 2;\n case \"group\": return 3; // null layer\n case \"ref\": return 0; // precomp\n default: return 4;\n }\n}\n\nfunction buildTransform(\n layer: Layer,\n deltas: Delta[],\n warnings: string[],\n): LottieTransform {\n // Group deltas by property\n const byProp = new Map<string, Delta[]>();\n for (const d of deltas) {\n if (!byProp.has(d.property)) byProp.set(d.property, []);\n byProp.get(d.property)!.push(d);\n }\n\n const xDeltas = byProp.get(\"frame.x\") ?? [];\n const yDeltas = byProp.get(\"frame.y\") ?? [];\n const opacityDeltas = byProp.get(\"opacity\") ?? [];\n const rotationDeltas = byProp.get(\"rotation\") ?? [];\n const scaleXDeltas = byProp.get(\"scale.x\") ?? [];\n const scaleYDeltas = byProp.get(\"scale.y\") ?? [];\n\n // Position\n const position = mapPositionDeltas(\n xDeltas, yDeltas,\n typeof layer.frame.x === \"number\" ? layer.frame.x : 0,\n typeof layer.frame.y === \"number\" ? layer.frame.y : 0,\n warnings,\n );\n\n // Opacity (Lottie uses 0–100)\n let opacity;\n if (opacityDeltas.length > 0) {\n const raw = mapDeltasToAnimated(opacityDeltas, \"opacity\", warnings);\n // Scale 0-1 to 0-100\n if (raw.a === 0) {\n opacity = { a: 0 as const, k: (raw.k as number) * 100 };\n } else {\n const kfs = (raw.k as Array<{ t: number; s: [number]; e?: [number]; [key: string]: unknown }>).map(kf => ({\n ...kf,\n s: [kf.s[0] * 100] as [number],\n e: kf.e ? [kf.e[0] * 100] as [number] : undefined,\n }));\n opacity = { a: 1 as const, k: kfs };\n }\n } else {\n opacity = { a: 0 as const, k: (layer.opacity ?? 1) * 100 };\n }\n\n // Rotation\n const rotation = rotationDeltas.length > 0\n ? mapDeltasToAnimated(rotationDeltas, \"rotation\", warnings)\n : { a: 0 as const, k: layer.rotation ?? 0 };\n\n // Scale (Lottie uses 0–100)\n const baseScaleX = (layer.scale?.x ?? 1) * 100;\n const baseScaleY = (layer.scale?.y ?? 1) * 100;\n let scale;\n if (scaleXDeltas.length > 0 || scaleYDeltas.length > 0) {\n // Simplified: use x deltas for now\n scale = { a: 0 as const, k: [baseScaleX, baseScaleY, 100] };\n if (scaleXDeltas.length > 0 || scaleYDeltas.length > 0) {\n warnings.push(\"Scale animation partially mapped to Lottie\");\n }\n } else {\n scale = { a: 0 as const, k: [baseScaleX, baseScaleY, 100] };\n }\n\n // Anchor point\n const ax = (layer.anchorPoint?.x ?? 0) * toNum(layer.bounds.width);\n const ay = (layer.anchorPoint?.y ?? 0) * toNum(layer.bounds.height);\n\n return {\n o: opacity,\n r: rotation,\n p: position,\n a: { a: 0, k: [ax, ay, 0] },\n s: scale,\n };\n}\n\nfunction getMaxFrame(deltas: Delta[], doc: AtelierDocument): number {\n let max = 0;\n for (const state of Object.values(doc.states)) {\n if (state.duration > max) max = state.duration;\n }\n for (const d of deltas) {\n if (d.range[1] > max) max = d.range[1];\n }\n return max || 60;\n}\n\nfunction mapBlendMode(mode: string): number {\n const map: Record<string, number> = {\n normal: 0, multiply: 1, screen: 2, overlay: 3,\n darken: 4, lighten: 5, \"color-dodge\": 6, \"color-burn\": 7,\n \"hard-light\": 8, \"soft-light\": 9, difference: 10, exclusion: 11,\n hue: 12, saturation: 13, color: 14, luminosity: 15,\n };\n return map[mode] ?? 0;\n}\n","import type { AtelierDocument, State } from \"@a-company/atelier-types\";\n\n/** Check for unsupported features and collect warnings */\nexport function collectUnsupportedWarnings(doc: AtelierDocument, state: State): string[] {\n const warnings: string[] = [];\n\n // Audio not supported\n if (state.audio) {\n warnings.push(\"Audio tracks are not supported in Lottie format and will be dropped\");\n }\n\n // Expressions not supported\n for (const delta of state.deltas) {\n if (isExpression(delta.from) || isExpression(delta.to)) {\n warnings.push(`Expression values on \"${delta.layer}.${delta.property}\" not supported in Lottie`);\n }\n }\n\n // Shadow not supported in base Lottie\n for (const layer of doc.layers) {\n if (layer.shadow) {\n warnings.push(`Shadow on layer \"${layer.id}\" is not supported in base Lottie format`);\n }\n }\n\n // Motion path not directly mapped\n for (const layer of doc.layers) {\n if (layer.motionPath) {\n warnings.push(`Motion path on layer \"${layer.id}\" is not directly mappable to Lottie`);\n }\n }\n\n // Clip paths have limited support\n for (const layer of doc.layers) {\n if (layer.clipPath) {\n warnings.push(`Clip path on layer \"${layer.id}\" mapped as Lottie mask (partial support)`);\n }\n }\n\n // States/transitions\n if (Object.keys(doc.states).length > 1) {\n warnings.push(\"Multiple states flattened to single timeline in Lottie export\");\n }\n\n return warnings;\n}\n\nfunction isExpression(val: unknown): boolean {\n return typeof val === \"object\" && val !== null && \"expr\" in val;\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { LottieAnimation, LottieAsset } from \"./lottie-types.js\";\nimport { mapLayers } from \"./map-layers.js\";\nimport { collectUnsupportedWarnings } from \"./warnings.js\";\n\nexport interface ExportLottieOptions {\n /** State to export (defaults to first state) */\n state?: string;\n}\n\nexport interface ExportLottieResult {\n /** The Lottie JSON animation */\n json: LottieAnimation;\n /** Warnings about unsupported features */\n warnings: string[];\n}\n\n/**\n * Export an Atelier document to Lottie JSON format.\n * This is a lossy conversion — not all features are supported.\n */\nexport function exportToLottie(\n doc: AtelierDocument,\n opts?: ExportLottieOptions,\n): ExportLottieResult {\n const stateNames = Object.keys(doc.states);\n if (stateNames.length === 0) {\n throw new Error(\"Document has no states to export\");\n }\n\n const stateName = opts?.state ?? stateNames[0];\n const state = doc.states[stateName];\n if (!state) {\n throw new Error(`State \"${stateName}\" not found`);\n }\n\n const warnings: string[] = [];\n\n // Collect unsupported feature warnings\n warnings.push(...collectUnsupportedWarnings(doc, state));\n\n // Map layers\n const layers = mapLayers(doc, state, warnings);\n\n // Map assets\n const assets: LottieAsset[] = [];\n if (doc.assets) {\n for (const [id, asset] of Object.entries(doc.assets)) {\n if (asset.type === \"image\") {\n assets.push({\n id,\n w: 100,\n h: 100,\n p: asset.src,\n e: 0,\n });\n }\n }\n }\n\n const json: LottieAnimation = {\n v: \"5.7.4\",\n fr: doc.canvas.fps,\n ip: 0,\n op: state.duration,\n w: doc.canvas.width,\n h: doc.canvas.height,\n nm: doc.name,\n layers,\n ...(assets.length > 0 ? { assets } : {}),\n };\n\n // Deduplicate warnings\n const uniqueWarnings = [...new Set(warnings)];\n\n return { json, warnings: uniqueWarnings };\n}\n","// @a-company/atelier-mcp — Asset management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, ImageVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_asset ─────────────────────────────────────────\n server.tool(\n \"atelier_add_asset\",\n \"Register an external asset (image, SVG, font, animation, audio) on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n assetId: z.string().describe(\"Unique asset identifier\"),\n type: z.enum([\"image\", \"svg\", \"font\", \"animation\", \"audio\"]).describe(\"Asset type\"),\n src: z.string().describe(\"File path or URL\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n spritesheet: z.object({\n columns: z.number().int().positive().describe(\"Number of columns in the spritesheet grid\"),\n rows: z.number().int().positive().describe(\"Number of rows in the spritesheet grid\"),\n frameCount: z.number().int().positive().optional().describe(\"Total frame count (defaults to columns × rows)\"),\n frameWidth: z.number().positive().describe(\"Width of each frame in pixels\"),\n frameHeight: z.number().positive().describe(\"Height of each frame in pixels\"),\n }).optional().describe(\"Spritesheet metadata (image assets only)\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, assetId, type, src, description, spritesheet }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.assets) doc.assets = {};\n if (doc.assets[assetId]) return err(`Asset \"${assetId}\" already exists`);\n\n doc.assets[assetId] = {\n type,\n src,\n ...(description !== undefined ? { description } : {}),\n ...(spritesheet ? { spritesheet } : {}),\n };\n return ok({ assetId, type, src });\n },\n );\n\n // ── atelier_list_assets ───────────────────────────────────────\n server.tool(\n \"atelier_list_assets\",\n \"List all registered assets with usage info (which layers/states reference them)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const assets = doc.assets ?? {};\n const entries = Object.entries(assets).map(([assetId, asset]) => {\n // Find layers referencing this asset (ImageVisual.assetId)\n const referencingLayers = doc.layers\n .filter(l => l.visual.type === \"image\" && (l.visual as ImageVisual).assetId === assetId)\n .map(l => l.id);\n\n // Find states whose audio.src matches this assetId\n const referencingStates = Object.entries(doc.states)\n .filter(([, state]) => state.audio?.src === assetId)\n .map(([name]) => name);\n\n return {\n assetId,\n type: asset.type,\n src: asset.src,\n description: asset.description,\n usedByLayers: referencingLayers,\n usedByStates: referencingStates,\n };\n });\n\n return ok({ count: entries.length, assets: entries });\n },\n );\n\n // ── atelier_remove_asset ──────────────────────────────────────\n server.tool(\n \"atelier_remove_asset\",\n \"Remove a registered asset. Warns if layers or state audio still reference it.\",\n {\n id: z.string().describe(\"Document ID\"),\n assetId: z.string().describe(\"Asset ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, assetId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.assets?.[assetId]) return err(`Asset \"${assetId}\" not found`);\n\n const warnings: string[] = [];\n\n // Check layers referencing this asset\n const referencingLayers = doc.layers\n .filter(l => l.visual.type === \"image\" && (l.visual as ImageVisual).assetId === assetId)\n .map(l => l.id);\n if (referencingLayers.length > 0) {\n warnings.push(`Asset is referenced by layer(s): ${referencingLayers.join(\", \")}`);\n }\n\n // Check state audio referencing this asset\n const referencingStates = Object.entries(doc.states)\n .filter(([, state]) => state.audio?.src === assetId)\n .map(([name]) => name);\n if (referencingStates.length > 0) {\n warnings.push(`Asset is referenced by state audio: ${referencingStates.join(\", \")}`);\n }\n\n delete doc.assets[assetId];\n return ok({ assetId, warnings });\n },\n );\n}\n","// @a-company/atelier-mcp — Variable management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { findTemplateVariables } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_variable ──────────────────────────────────────\n server.tool(\n \"atelier_add_variable\",\n \"Define a template variable on a document\",\n {\n id: z.string().describe(\"Document ID\"),\n variableName: z.string().describe(\"Variable name (used in {{variableName}} patterns)\"),\n type: z.enum([\"string\", \"number\", \"color\", \"asset\", \"boolean\"]).describe(\"Variable type\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n default: z.unknown().optional().describe(\"Default value\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async (args) => {\n const result = getDoc(store, args.id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.variables) doc.variables = {};\n if (doc.variables[args.variableName]) return err(`Variable \"${args.variableName}\" already exists`);\n\n doc.variables[args.variableName] = {\n type: args.type,\n ...(args.description !== undefined ? { description: args.description } : {}),\n ...(args.default !== undefined ? { default: args.default } : {}),\n };\n return ok({ variableName: args.variableName, type: args.type });\n },\n );\n\n // ── atelier_list_variables ────────────────────────────────────\n server.tool(\n \"atelier_list_variables\",\n \"List all declared variables with usage info (which {{references}} exist in the document)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const variables = doc.variables ?? {};\n const referenced = findTemplateVariables(doc);\n\n const entries = Object.entries(variables).map(([name, variable]) => ({\n name,\n type: variable.type,\n description: variable.description,\n default: variable.default,\n referenced: referenced.includes(name),\n }));\n\n const undeclared = referenced.filter(r => !variables[r]);\n\n return ok({ count: entries.length, variables: entries, undeclared });\n },\n );\n\n // ── atelier_remove_variable ───────────────────────────────────\n server.tool(\n \"atelier_remove_variable\",\n \"Remove a declared variable. Warns if {{references}} still exist in the document.\",\n {\n id: z.string().describe(\"Document ID\"),\n variableName: z.string().describe(\"Variable name to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, variableName }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.variables?.[variableName]) return err(`Variable \"${variableName}\" not found`);\n\n const warnings: string[] = [];\n const referenced = findTemplateVariables(doc);\n if (referenced.includes(variableName)) {\n warnings.push(`Variable \"{{${variableName}}}\" is still referenced in the document`);\n }\n\n delete doc.variables[variableName];\n if (Object.keys(doc.variables).length === 0) {\n doc.variables = undefined;\n }\n return ok({ variableName, warnings });\n },\n );\n}\n","// @a-company/atelier-mcp — Interaction management tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, Interaction } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_add_interaction ───────────────────────────────────\n server.tool(\n \"atelier_add_interaction\",\n \"Add a trigger-action interaction to a layer (click, hover, timer, signal → go-to-state, emit-signal, set-variable, toggle-visibility)\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer to attach the interaction to\"),\n interactionId: z.string().describe(\"Unique interaction ID\"),\n trigger: z.object({\n type: z.enum([\"click\", \"hover\", \"pointerdown\", \"pointerup\", \"timer\", \"signal\"]).describe(\"Trigger type\"),\n delay: z.number().optional().describe(\"Delay in ms (timer trigger only)\"),\n signal: z.string().optional().describe(\"Signal name (signal trigger only)\"),\n }).describe(\"What triggers the interaction\"),\n action: z.object({\n type: z.enum([\"go-to-state\", \"emit-signal\", \"set-variable\", \"toggle-visibility\"]).describe(\"Action type\"),\n state: z.string().optional().describe(\"Target state (go-to-state only)\"),\n signal: z.string().optional().describe(\"Signal to emit (emit-signal only)\"),\n variable: z.string().optional().describe(\"Variable name (set-variable only)\"),\n value: z.unknown().optional().describe(\"Value to set (set-variable only)\"),\n targetLayer: z.string().optional().describe(\"Target layer ID (toggle-visibility, defaults to self)\"),\n }).describe(\"What happens when triggered\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, interactionId, trigger, action, description }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (!layer.interactions) layer.interactions = [];\n if (layer.interactions.some(i => i.id === interactionId)) {\n return err(`Interaction \"${interactionId}\" already exists on layer \"${layerId}\"`);\n }\n\n // Validate trigger-specific fields\n if (trigger.type === \"timer\" && trigger.delay === undefined) {\n return err(\"Timer trigger requires a delay\");\n }\n if (trigger.type === \"signal\" && !trigger.signal) {\n return err(\"Signal trigger requires a signal name\");\n }\n\n // Validate action-specific fields\n if (action.type === \"go-to-state\") {\n if (!action.state) return err(\"go-to-state action requires a state name\");\n if (!doc.states[action.state]) return err(`Target state \"${action.state}\" not found`);\n }\n if (action.type === \"emit-signal\" && !action.signal) {\n return err(\"emit-signal action requires a signal name\");\n }\n if (action.type === \"set-variable\") {\n if (!action.variable) return err(\"set-variable action requires a variable name\");\n if (action.value === undefined) return err(\"set-variable action requires a value\");\n }\n if (action.type === \"toggle-visibility\" && action.targetLayer) {\n if (!doc.layers.find(l => l.id === action.targetLayer)) {\n return err(`Target layer \"${action.targetLayer}\" not found`);\n }\n }\n\n const interaction: Interaction = {\n id: interactionId,\n trigger: trigger as Interaction[\"trigger\"],\n action: action as Interaction[\"action\"],\n ...(description !== undefined ? { description } : {}),\n };\n\n layer.interactions.push(interaction);\n return ok({ layerId, interactionId, triggerType: trigger.type, actionType: action.type });\n },\n );\n\n // ── atelier_list_interactions ─────────────────────────────────\n server.tool(\n \"atelier_list_interactions\",\n \"List all interactions across all layers or for a specific layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().optional().describe(\"Optional: filter to a specific layer\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, layerId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layers = layerId\n ? doc.layers.filter(l => l.id === layerId)\n : doc.layers;\n\n if (layerId && layers.length === 0) return err(`Layer \"${layerId}\" not found`);\n\n const interactions = layers.flatMap(l =>\n (l.interactions ?? []).map(i => ({\n layerId: l.id,\n interactionId: i.id,\n triggerType: i.trigger.type,\n actionType: i.action.type,\n description: i.description,\n trigger: i.trigger,\n action: i.action,\n })),\n );\n\n return ok({ count: interactions.length, interactions });\n },\n );\n\n // ── atelier_remove_interaction ────────────────────────────────\n server.tool(\n \"atelier_remove_interaction\",\n \"Remove an interaction from a layer\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID\"),\n interactionId: z.string().describe(\"Interaction ID to remove\"),\n },\n { readOnlyHint: false, destructiveHint: true },\n async ({ id, layerId, interactionId }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n\n if (!layer.interactions) return err(`Interaction \"${interactionId}\" not found on layer \"${layerId}\"`);\n\n const idx = layer.interactions.findIndex(i => i.id === interactionId);\n if (idx === -1) return err(`Interaction \"${interactionId}\" not found on layer \"${layerId}\"`);\n\n layer.interactions.splice(idx, 1);\n if (layer.interactions.length === 0) {\n layer.interactions = undefined;\n }\n return ok({ layerId, interactionId, remainingInteractions: layer.interactions?.length ?? 0 });\n },\n );\n}\n","// @a-company/atelier-mcp — Ref layer (composition/nesting) tools\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument, RefVisual } from \"@a-company/atelier-types\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_set_ref ───────────────────────────────────────────\n server.tool(\n \"atelier_set_ref\",\n \"Set the source reference on a ref-type layer. Can point to a file path or another in-memory document ID.\",\n {\n id: z.string().describe(\"Document ID\"),\n layerId: z.string().describe(\"Layer ID (must be a ref visual)\"),\n src: z.string().describe(\"File path, URL, or in-memory document ID\"),\n },\n { readOnlyHint: false, destructiveHint: false },\n async ({ id, layerId, src }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layer = doc.layers.find(l => l.id === layerId);\n if (!layer) return err(`Layer \"${layerId}\" not found`);\n if (layer.visual.type !== \"ref\") return err(`Layer \"${layerId}\" is type \"${layer.visual.type}\", not \"ref\"`);\n\n // Prevent self-reference\n if (src === id) return err(\"Cannot reference self — would cause infinite recursion\");\n\n (layer.visual as RefVisual).src = src;\n\n // Check if src is an in-memory document\n const isInMemory = store.has(src);\n return ok({ layerId, src, resolvedInMemory: isInMemory });\n },\n );\n\n // ── atelier_resolve_refs ──────────────────────────────────────\n server.tool(\n \"atelier_resolve_refs\",\n \"Check which ref layers can be resolved (point to valid in-memory documents)\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const refs = doc.layers\n .filter(l => l.visual.type === \"ref\")\n .map(l => {\n const src = (l.visual as RefVisual).src;\n const resolved = store.has(src);\n const targetDoc = resolved ? store.get(src) : undefined;\n return {\n layerId: l.id,\n src,\n resolved,\n targetName: targetDoc?.name,\n targetLayerCount: targetDoc?.layers.length,\n targetStateCount: targetDoc ? Object.keys(targetDoc.states).length : undefined,\n };\n });\n\n const resolvedCount = refs.filter(r => r.resolved).length;\n return ok({ count: refs.length, resolvedCount, refs });\n },\n );\n}\n","// @a-company/atelier-mcp — Performance tools (profiling, frame diff, batch preview)\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport type { DocumentStore } from \"../store.js\";\n\nfunction getDoc(store: DocumentStore, id: string): { doc: AtelierDocument } | { error: string } {\n const doc = store.get(id);\n if (!doc) return { error: `Document \"${id}\" not found` };\n return { doc };\n}\n\nfunction ok(data: Record<string, unknown>) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ success: true, ...data }) }] };\n}\n\nfunction err(message: string) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }], isError: true as const };\n}\n\nexport function register(server: McpServer, store: DocumentStore): void {\n // ── atelier_profile ─────────────────────────────────────────\n server.tool(\n \"atelier_profile\",\n \"Profile frame resolution performance — returns timing, layer count, property count, and delta count for a frame\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to profile\"),\n frame: z.number().int().min(0).describe(\"Frame number to resolve\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frame }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const state = doc.states[stateName];\n const deltaCount = state.deltas.length;\n const expressionCount = state.deltas.filter(\n d => (typeof d.from === \"object\" && d.from !== null && \"expr\" in d.from) ||\n (typeof d.to === \"object\" && d.to !== null && \"expr\" in d.to)\n ).length;\n\n const start = performance.now();\n const resolved = resolveFrame(doc, stateName, frame);\n const resolveTimeMs = performance.now() - start;\n\n let propertiesComputed = 0;\n const layerDetails = resolved.layers.map(rl => {\n const propCount = Object.keys(rl.computedProperties).length;\n propertiesComputed += propCount;\n return {\n id: rl.id,\n visualType: rl.layer.visual.type,\n propertiesComputed: propCount,\n properties: Object.keys(rl.computedProperties),\n };\n });\n\n return ok({\n stateName,\n frame,\n duration: state.duration,\n resolveTimeMs: Math.round(resolveTimeMs * 1000) / 1000,\n layerCount: doc.layers.length,\n deltaCount,\n expressionCount,\n propertiesComputed,\n layerDetails,\n });\n },\n );\n\n // ── atelier_diff_frames ────────────────────────────────────\n server.tool(\n \"atelier_diff_frames\",\n \"Compare two frames and return only the properties that changed between them\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name\"),\n frameA: z.number().int().min(0).describe(\"First frame number\"),\n frameB: z.number().int().min(0).describe(\"Second frame number\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frameA, frameB }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const resolvedA = resolveFrame(doc, stateName, frameA);\n const resolvedB = resolveFrame(doc, stateName, frameB);\n\n const changes: Array<{\n layerId: string;\n property: string;\n from: unknown;\n to: unknown;\n }> = [];\n\n for (const layerB of resolvedB.layers) {\n const layerA = resolvedA.layers.find(l => l.id === layerB.id);\n const propsA = layerA?.computedProperties ?? {};\n const propsB = layerB.computedProperties;\n\n // All property keys from both frames\n const allKeys = new Set([...Object.keys(propsA), ...Object.keys(propsB)]);\n for (const key of allKeys) {\n const valA = (propsA as Record<string, unknown>)[key];\n const valB = (propsB as Record<string, unknown>)[key];\n if (valA !== valB) {\n changes.push({ layerId: layerB.id, property: key, from: valA, to: valB });\n }\n }\n }\n\n return ok({\n stateName,\n frameA,\n frameB,\n changeCount: changes.length,\n changes,\n });\n },\n );\n\n // ── atelier_batch_preview ──────────────────────────────────\n server.tool(\n \"atelier_batch_preview\",\n \"Preview multiple frames at once — reduces round-trips for scrubbing or timeline inspection\",\n {\n id: z.string().describe(\"Document ID\"),\n stateName: z.string().describe(\"State name to preview\"),\n frames: z.array(z.number().int().min(0)).min(1).max(60).describe(\"Array of frame numbers to resolve (max 60)\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id, stateName, frames }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n if (!doc.states[stateName]) {\n return err(`State \"${stateName}\" not found`);\n }\n\n const start = performance.now();\n\n const results = frames.map(frame => {\n const resolved = resolveFrame(doc, stateName, frame);\n return {\n frame,\n layers: resolved.layers.map(rl => ({\n id: rl.id,\n computedProperties: rl.computedProperties,\n })),\n };\n });\n\n const totalTimeMs = performance.now() - start;\n\n return ok({\n stateName,\n duration: doc.states[stateName].duration,\n frameCount: frames.length,\n totalTimeMs: Math.round(totalTimeMs * 1000) / 1000,\n avgTimeMs: Math.round((totalTimeMs / frames.length) * 1000) / 1000,\n frames: results,\n });\n },\n );\n\n // ── atelier_complexity ─────────────────────────────────────\n server.tool(\n \"atelier_complexity\",\n \"Analyze document complexity — layer count, delta count, expression usage, state hierarchy depth\",\n {\n id: z.string().describe(\"Document ID\"),\n },\n { readOnlyHint: true, destructiveHint: false },\n async ({ id }) => {\n const result = getDoc(store, id);\n if (\"error\" in result) return err(result.error);\n const { doc } = result;\n\n const layerCount = doc.layers.length;\n const stateCount = Object.keys(doc.states).length;\n const assetCount = doc.assets ? Object.keys(doc.assets).length : 0;\n const variableCount = doc.variables ? Object.keys(doc.variables).length : 0;\n\n let totalDeltas = 0;\n let totalExpressions = 0;\n let maxStateDuration = 0;\n let totalInteractions = 0;\n\n const stateDetails: Array<{\n name: string;\n duration: number;\n deltaCount: number;\n expressionCount: number;\n hasAudio: boolean;\n hasParent: boolean;\n transitionCount: number;\n }> = [];\n\n for (const [name, state] of Object.entries(doc.states)) {\n const deltaCount = state.deltas.length;\n totalDeltas += deltaCount;\n\n const expressionCount = state.deltas.filter(\n d => (typeof d.from === \"object\" && d.from !== null && \"expr\" in d.from) ||\n (typeof d.to === \"object\" && d.to !== null && \"expr\" in d.to)\n ).length;\n totalExpressions += expressionCount;\n\n if (state.duration > maxStateDuration) maxStateDuration = state.duration;\n\n stateDetails.push({\n name,\n duration: state.duration,\n deltaCount,\n expressionCount,\n hasAudio: !!state.audio,\n hasParent: !!state.parent,\n transitionCount: state.transitions ? Object.keys(state.transitions).length : 0,\n });\n }\n\n for (const layer of doc.layers) {\n if (layer.interactions) totalInteractions += layer.interactions.length;\n }\n\n // Compute hierarchy depth\n let maxHierarchyDepth = 0;\n for (const [name] of Object.entries(doc.states)) {\n let depth = 0;\n let current = name;\n const visited = new Set<string>();\n while (doc.states[current]?.parent && !visited.has(current)) {\n visited.add(current);\n current = doc.states[current].parent!;\n depth++;\n }\n if (depth > maxHierarchyDepth) maxHierarchyDepth = depth;\n }\n\n // Unique animated properties\n const animatedProperties = new Set<string>();\n for (const state of Object.values(doc.states)) {\n for (const delta of state.deltas) {\n animatedProperties.add(delta.property);\n }\n }\n\n return ok({\n layerCount,\n stateCount,\n totalDeltas,\n totalExpressions,\n totalInteractions,\n assetCount,\n variableCount,\n maxStateDuration,\n maxHierarchyDepth,\n uniqueAnimatedProperties: [...animatedProperties],\n stateDetails,\n });\n },\n );\n}\n"],"mappings":"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","names":["z","z","err","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","AnimatablePropertyEnum","EasingInputSchema","PresetDeltaSchema","z","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","EasingInputSchema","register","z","colorToCSS","r","g","b","a","isExpression","kfs","buildTransform","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","getDoc","ok","err","register","z","register"]}