@pixerate/editor 0.62.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +1 -0
- package/dist/animation-editor/index.cjs +156 -33
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +64 -3
- package/dist/animation-editor/index.d.ts +64 -3
- package/dist/animation-editor/index.js +131 -8
- package/dist/animation-editor/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/animation-editor/types.ts","../../src/animation-editor/issues.ts","../../src/animation-editor/parse.ts","../../src/animation-editor/match.ts","../../src/animation-editor/compile.ts","../../src/animation-editor/evaluate.ts","../../src/animation-editor/check.ts","../../src/animation-editor/edit.ts","../../src/animation-editor/fit.ts","../../src/animation-editor/flair.ts","../../src/animation-editor/flair-import.ts","../../src/animation-editor/controller.ts","../../src/animation-editor/tools.ts","../../src/animation-editor/instructions.ts"],"sourcesContent":["import type { AnimationEasing } from '../animation/easing.js';\nimport type { AnimationLoopMode } from '../animation/evaluate.js';\nimport type { VectorDocument } from '../vector/types.js';\n\n/**\n * A vector animation as plain JSON: a piece of vector artwork (the editor's `VectorDocument`,\n * as the vector editor draws it) and the shots that bring it to life.\n *\n * Shots, not timelines: a shot frames the camera, plays its commands and holds. Timing comes\n * from the content (each command has a sensible default length, and drawing a line takes as\n * long as the line is long), so there are no keyframes to manage. The same scene plays the\n * same frames every time: every frame is a pure function of time.\n */\nexport interface MotionScene {\n\t/** Format version (always 1). */\n\tversion: 1;\n\t/** A short name, e.g. `logo-reveal`. */\n\tname: string;\n\tdescription?: string;\n\t/** The artwork in its resting state. Commands target its node ids. */\n\tartwork: VectorDocument;\n\tshots: MotionShot[];\n\t/** Playback past the end: stop (`none`, default), `loop` or `ping-pong`. */\n\tloop?: AnimationLoopMode;\n\t/** Frame rate used to sample motion that a target format cannot express exactly (default 30). */\n\tfps?: number;\n\t/**\n\t * Stepped time for every command that gives none: changes hold on a grid of this many frames\n\t * per second (\"on twos\" at 12), for a hand-drawn look. Default: smooth.\n\t */\n\tsteps?: number;\n\t/** Wanted length in seconds `[min, max]`; `check` warns outside it. */\n\ttarget?: [number, number];\n\t/** Parameters a Flair effect made from this scene exposes (see `toFlairVectorEffect`). */\n\tcontrols?: MotionControl[];\n\t/** Named sets of control values. */\n\tpresets?: MotionPreset[];\n}\n\n/** A rectangle of the artwork, in document units. */\nexport interface MotionRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Where the camera looks: a rectangle, or the id of a node to frame (with `padding` around\n * its bounds, default 24). The camera eases there over `ms` (default 1000; the first shot cuts).\n */\nexport type MotionCamera = (MotionRect | { frame: string; padding?: number }) & {\n\tease?: AnimationEasing;\n\tms?: number;\n\t/** Zoom at a steady rate (the size changes by the same factor each moment) instead of linearly. */\n\tgeometric?: boolean;\n};\n\n/** One beat of the animation. */\nexport interface MotionShot {\n\t/** Stable id (unique in the scene), e.g. `intro`. */\n\tid: string;\n\t/** What happens in this shot, in a few words (shown on the timeline). */\n\tlabel?: string;\n\t/** Omit to keep the current framing. */\n\tcamera?: MotionCamera;\n\t/** Commands, played one after another (unless a command says `with: \"previous\"`). */\n\trun: MotionCommand[];\n\t/** Milliseconds to hold after the commands finish (default 600). */\n\thold?: number;\n\t/**\n\t * Plays the whole shot this many times as fast (default 1): its camera move, delays,\n\t * durations, staggers and hold all scale by 1 / speed. `fit_animation` sets it to fit a length.\n\t */\n\tspeed?: number;\n}\n\n/** Fields every command takes. */\nexport interface MotionCommandBase {\n\t/** Node ids from the artwork (groups animate as one). */\n\ttargets: string[];\n\t/** Length in ms for each target, one cycle when repeating (each type has a default; `draw` follows the path length; a spring `ease` lasts until it settles). */\n\tduration?: number;\n\t/** Wait this many ms before starting (default 0). */\n\tdelay?: number;\n\t/** Start each further target this many ms after the one before (default 0). */\n\tstagger?: number;\n\t/** `after` (default) starts when the commands before it finish; `previous` starts with the command before. */\n\twith?: 'after' | 'previous';\n\t/** An easing; a spring with no `duration` lasts until it settles. */\n\tease?: AnimationEasing;\n\t/** Why this command is here (for people and agents reading the scene). */\n\tnote?: string;\n\t/**\n\t * Play the change this many times (a whole number, default 1); `duration` is one cycle. Not\n\t * for `enter`, `exit` or `wait`.\n\t */\n\trepeat?: number;\n\t/**\n\t * How repeats follow each other: `loop` (default) starts each cycle afresh, `mirror` plays\n\t * every other one backwards, `offset` carries on from where the last ended (rotate by 90,\n\t * repeat 4: a full turn). Colours and shapes offset like `loop`.\n\t */\n\trepeatMode?: 'loop' | 'mirror' | 'offset';\n\t/** Stepped time: hold the change on a grid of this many frames per second (default: the scene's `steps`, else smooth). */\n\tsteps?: number;\n}\n\nexport type MotionEnterStyle = 'fade' | 'pop' | 'grow' | 'slide' | 'draw' | 'zoom' | 'rise' | 'wipe' | 'iris' | 'split';\nexport type MotionExitStyle = 'fade' | 'shrink' | 'slide' | 'undraw' | 'wipe';\nexport type MotionDirection = 'up' | 'down' | 'left' | 'right';\n/** The opening an `iris` reveals through. */\nexport type MotionIrisShape = 'circle' | 'box';\n/** The line a `split` opens from. */\nexport type MotionSplitOrientation = 'horizontal' | 'vertical';\n\n/**\n * Brings hidden targets in. Targets entered in a shot are hidden before it. Each style is a\n * Flair motion primitive (`entrance.<style>`) with the same defaults.\n */\nexport interface MotionEnterCommand extends MotionCommandBase {\n\ttype: 'enter';\n\t/**\n\t * Default `fade`. `draw` draws the outline on, then fades the fill in. `pop` scales up past\n\t * full size and settles; `zoom` settles from larger; `rise` rises a short way with a little\n\t * overshoot. `wipe`, `iris` and `split` reveal the target through a clip over its box (see\n\t * `MotionFrame.clips`), reaching past it far enough to show its whole stroke.\n\t */\n\tstyle?: MotionEnterStyle;\n\t/**\n\t * For `slide`: the direction of travel (default `up`). For `wipe`: the way the edge travels\n\t * (default `right`, which reveals from the left).\n\t */\n\tdirection?: MotionDirection;\n\t/** For `slide` (default 40) and `rise` (default 20): how far in document units. */\n\tdistance?: number;\n\t/** For `pop` (default 0.5) and `zoom` (default 1.6): the starting scale. */\n\tscale?: number;\n\t/** For `iris`: open through a `circle` (default; an ellipse on a box that is not square) or a `box`. */\n\tshape?: MotionIrisShape;\n\t/** For `split`: open up and down from a `horizontal` line through the middle (default), or left and right from a `vertical` one. */\n\torientation?: MotionSplitOrientation;\n}\n\n/** Takes targets out. */\nexport interface MotionExitCommand extends MotionCommandBase {\n\ttype: 'exit';\n\t/** Default `fade`. `wipe` hides the target behind an edge travelling `direction` (a wipe in, reversed). */\n\tstyle?: MotionExitStyle;\n\t/** For `slide`: the direction of travel (default `down`). For `wipe`: the way the edge travels (default `right`, which hides from the left). */\n\tdirection?: MotionDirection;\n\tdistance?: number;\n}\n\n/** Draws a stroke on (or off) between two fractions of its length. */\nexport interface MotionDrawCommand extends MotionCommandBase {\n\ttype: 'draw';\n\t/** Fraction drawn at the end (default 1). */\n\tto?: number;\n\t/** Fraction drawn at the start (default: what is drawn now). */\n\tfrom?: number;\n}\n\n/** Moves targets by an offset, or to a point (their centre lands there). */\nexport interface MotionMoveCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'move';\n\tby?: { x: number; y: number };\n\tto?: { x: number; y: number };\n}\n\n/** Turns targets about their centre, by or to an angle in degrees (clockwise). */\nexport interface MotionRotateCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'rotate';\n\tby?: number;\n\tto?: number;\n}\n\n/** Scales targets about their centre (1 = rest size). */\nexport interface MotionScaleCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'scale';\n\tto: number | { x: number; y: number };\n\t/** Grow at a steady rate (the same factor each moment), which reads as an even zoom. */\n\tgeometric?: boolean;\n}\n\n/** Changes opacity (0–1). */\nexport interface MotionFadeCommand extends MotionCommandBase {\n\ttype: 'fade';\n\tto: number;\n}\n\n/** Changes solid paints and stroke width. Colours mix in OKLab. */\nexport interface MotionStyleCommand extends MotionCommandBase {\n\ttype: 'style';\n\tfill?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n}\n\n/** Morphs each target into the shape of another node (`into`), which usually stays hidden. */\nexport interface MotionMorphCommand extends MotionCommandBase {\n\ttype: 'morph';\n\tinto: string;\n}\n\n/**\n * Smart Animate: tweens a group into another group (`into`, usually hidden), part by part. Each\n * part of the target takes the shape, paint and place of its partner in `into`, paired by name,\n * then by id (`card-a-title` ↔ `card-b-title`), then by kind in order. Parts with no partner fade\n * out; parts of `into` with no partner do not appear (`check` lists them).\n */\nexport interface MotionMatchCommand extends MotionCommandBase {\n\ttype: 'match';\n\t/** Id of the group (or node) to become. */\n\tinto: string;\n}\n\n/** Moves targets along a path node, centre on the path. */\nexport interface MotionFollowCommand extends MotionCommandBase {\n\ttype: 'follow';\n\t/** Id of a path node in the artwork (it can be hidden). */\n\tpath: string;\n\t/**\n\t * Turn with the path's direction (default false). Moves, shakes and wiggles made during the\n\t * follow then turn with it too: they are offsets from the target's place on the path.\n\t */\n\trotate?: boolean;\n\t/** Fractions of the path's length to travel between (default 0 → 1). */\n\tfrom?: number;\n\tto?: number;\n}\n\n/** Scales up and back, `count` times (draws the eye). */\nexport interface MotionPulseCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'pulse';\n\t/** Extra scale at the peak (default 0.15). */\n\tamount?: number;\n\tcount?: number;\n}\n\n/** Shakes side to side (or up and down), settling. */\nexport interface MotionShakeCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'shake';\n\t/** Distance in document units (default 8). */\n\tamount?: number;\n\tcount?: number;\n\t/** Default `horizontal`. */\n\taxis?: 'horizontal' | 'vertical';\n}\n\n/** Rocks about the centre by `angle` either way, settling (Flair's `emphasis.teeter`). */\nexport interface MotionTeeterCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'teeter';\n\t/** Degrees either way (default 8). */\n\tangle?: number;\n\t/** Rocks (default 3). */\n\tcount?: number;\n}\n\n/** Bobs up and down without settling, like something floating (Flair's `emphasis.wave`). */\nexport interface MotionWaveCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'wave';\n\t/** Height in document units (default 6). */\n\tamount?: number;\n\t/** Bobs (default 2). */\n\tcount?: number;\n}\n\n/**\n * Wanders about its place as smooth seeded noise, easing out of and back to rest (Flair's\n * `emphasis.wiggle`). The same seed always wanders the same way.\n */\nexport interface MotionWiggleCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'wiggle';\n\t/** Up to about this far, in document units (default 6). */\n\tamount?: number;\n\t/** Wanders per second, in Hz (default 3). */\n\tfrequency?: number;\n\t/** Layers of finer detail (default 2). */\n\toctaves?: number;\n\t/** Also turns about the centre by up to about this many degrees (default 0). */\n\trotate?: number;\n\t/** A whole number; default: one picked from the target's id, so each target wanders its own way. */\n\tseed?: number;\n}\n\n/** Tints solid paint toward a colour and back, `count` times (Flair's `emphasis.color-pulse`). */\nexport interface MotionColorPulseCommand extends MotionCommandBase {\n\ttype: 'color-pulse';\n\t/** The tint (default `#f59e0b`). Mixes in OKLab. */\n\tcolor?: string;\n\t/** Which paint (default `fill`). On a group it tints every path in it. */\n\tpaint?: 'fill' | 'stroke';\n\tcount?: number;\n}\n\n/** Tweens a numeric parameter of a live path effect on the target (twist angle, wiggle time, zig zag size…). */\nexport interface MotionEffectCommand extends MotionCommandBase {\n\ttype: 'effect';\n\t/** Id of an effect in the target node's `effects`. */\n\teffect: string;\n\t/** A numeric parameter of that effect, e.g. `angle`. */\n\tparam: string;\n\tto: number;\n}\n\n/** Does nothing for `duration` ms. */\nexport interface MotionWaitCommand {\n\ttype: 'wait';\n\tduration: number;\n\twith?: 'after' | 'previous';\n\tnote?: string;\n}\n\nexport type MotionCommand =\n\t| MotionEnterCommand\n\t| MotionExitCommand\n\t| MotionDrawCommand\n\t| MotionMoveCommand\n\t| MotionRotateCommand\n\t| MotionScaleCommand\n\t| MotionFadeCommand\n\t| MotionStyleCommand\n\t| MotionMorphCommand\n\t| MotionMatchCommand\n\t| MotionFollowCommand\n\t| MotionPulseCommand\n\t| MotionShakeCommand\n\t| MotionTeeterCommand\n\t| MotionWaveCommand\n\t| MotionWiggleCommand\n\t| MotionColorPulseCommand\n\t| MotionEffectCommand\n\t| MotionWaitCommand;\n\nexport type MotionCommandType = MotionCommand['type'];\n\nexport const MOTION_COMMAND_TYPES: readonly MotionCommandType[] = [\n\t'enter',\n\t'exit',\n\t'draw',\n\t'move',\n\t'rotate',\n\t'scale',\n\t'fade',\n\t'style',\n\t'morph',\n\t'match',\n\t'follow',\n\t'pulse',\n\t'shake',\n\t'teeter',\n\t'wave',\n\t'wiggle',\n\t'color-pulse',\n\t'effect',\n\t'wait'\n];\nexport const MOTION_ENTER_STYLES: readonly MotionEnterStyle[] = ['fade', 'pop', 'grow', 'slide', 'draw', 'zoom', 'rise', 'wipe', 'iris', 'split'];\nexport const MOTION_BLENDS = ['replace', 'add'] as const;\nexport const MOTION_REPEAT_MODES = ['loop', 'mirror', 'offset'] as const;\nexport const MOTION_EXIT_STYLES: readonly MotionExitStyle[] = ['fade', 'shrink', 'slide', 'undraw', 'wipe'];\nexport const MOTION_IRIS_SHAPES: readonly MotionIrisShape[] = ['circle', 'box'];\nexport const MOTION_SPLIT_ORIENTATIONS: readonly MotionSplitOrientation[] = ['horizontal', 'vertical'];\nexport const MOTION_DIRECTIONS: readonly MotionDirection[] = ['up', 'down', 'left', 'right'];\n\n/**\n * A colour parameter of the effect made from the scene: it stands for every use of its\n * `default` colour in the artwork and the commands, so recolouring it recolours them all.\n */\nexport interface MotionControl {\n\t/** Identifier, e.g. `accent`. */\n\tname: string;\n\ttype: 'color';\n\t/** A `#rrggbb` colour used in the scene. */\n\tdefault: string;\n\tlabel?: string;\n}\n\nexport interface MotionPreset {\n\tname: string;\n\tvalues: Record<string, string>;\n}\n\n/** Default lengths (ms) of commands that give none. */\nexport const MOTION_DEFAULT_DURATIONS: Readonly<Record<Exclude<MotionCommandType, 'wait' | 'draw'>, number>> = {\n\tenter: 600,\n\texit: 450,\n\tmove: 700,\n\trotate: 700,\n\tscale: 500,\n\tfade: 400,\n\tstyle: 500,\n\tmorph: 900,\n\tmatch: 900,\n\tfollow: 1400,\n\tpulse: 600,\n\tshake: 500,\n\tteeter: 600,\n\twave: 1000,\n\twiggle: 1500,\n\t'color-pulse': 600,\n\teffect: 900\n};\n\n/** Default hold after a shot's commands (ms). */\nexport const MOTION_DEFAULT_HOLD = 600;\n/** Default camera move (ms). */\nexport const MOTION_CAMERA_MS = 1000;\n/** `draw` lasts `length × MOTION_DRAW_MS_PER_UNIT`, clamped to `MOTION_DRAW_RANGE`. */\nexport const MOTION_DRAW_MS_PER_UNIT = 1.5;\nexport const MOTION_DRAW_RANGE: readonly [number, number] = [500, 2500];\n\n/**\n * The Flair motion primitive (`@pixerate/flair/motion`) a command plays, or undefined when\n * Flair has none (`move`, `scale`, `fade`, `style`, `morph`, `effect`, `wait` are the editor's\n * own). Commands and primitives of the same name take the same parameters and defaults.\n */\nexport function motionFlairPrimitive(command: MotionCommand): string | undefined {\n\tswitch (command.type) {\n\t\tcase 'enter':\n\t\t\treturn `entrance.${command.style ?? 'fade'}`;\n\t\tcase 'exit':\n\t\t\treturn `exit.${command.style ?? 'fade'}`;\n\t\tcase 'pulse':\n\t\tcase 'shake':\n\t\tcase 'teeter':\n\t\tcase 'wave':\n\t\tcase 'wiggle':\n\t\tcase 'color-pulse':\n\t\t\treturn `emphasis.${command.type}`;\n\t\tcase 'rotate':\n\t\t\treturn command.by !== undefined ? 'emphasis.spin' : undefined;\n\t\tcase 'follow':\n\t\t\treturn 'path.follow';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n","/**\n * Problems with a scene, as data: every issue has a stable `code`, a severity, the shot and\n * command it is in and the ids it is about, beside its prose `message`, so an agent (or a UI)\n * can act on it without parsing sentences.\n */\n\n/** `error`: the scene does not play as written. `warning`: it plays, but probably not as meant. `note`: may well be intended. */\nexport type MotionIssueSeverity = 'error' | 'warning' | 'note';\n\n/** Every issue code with its severity and what it means. */\nexport const MOTION_ISSUE_CODES = {\n\t'no-shots': { severity: 'note', wording: 'The scene has no shots yet.' },\n\t'duplicate-shot-id': { severity: 'error', wording: 'Two shots share an id.' },\n\t'unknown-target': { severity: 'error', wording: 'A command names a node the artwork does not have.' },\n\t'unknown-path': { severity: 'error', wording: 'A follow command names a path the artwork does not have.' },\n\t'not-a-path': { severity: 'error', wording: 'A follow path must be a path node, not a group.' },\n\t'reveal-no-box': { severity: 'warning', wording: 'A wipe, iris or split cannot clip a node with no width or height (a lone straight line), so it fades instead.' },\n\t'unknown-shape': { severity: 'error', wording: 'A morph names a shape the artwork does not have.' },\n\t'match-self': { severity: 'error', wording: 'A match turns a group into itself or into a group it holds (or that holds it).' },\n\t'match-unpaired': { severity: 'note', wording: 'Parts of a match\\'s \"into\" group have no partner in the target, so they do not appear.' },\n\t'unknown-effect': { severity: 'error', wording: 'An effect command names an effect the node does not have.' },\n\t'unknown-effect-param': { severity: 'error', wording: 'An effect command names a parameter that is not a number of that effect.' },\n\t'unknown-frame': { severity: 'error', wording: 'A camera frames a node the artwork does not have.' },\n\t'invalid-camera': { severity: 'error', wording: 'A camera rectangle has no area.' },\n\t'invalid-color': { severity: 'error', wording: 'A colour cannot be read.' },\n\t'paint-not-color': { severity: 'warning', wording: 'A style command recolours a gradient or empty paint, which only switches at the end, or a colour pulse has no solid paint to tint.' },\n\t'overlap': { severity: 'warning', wording: 'Two commands change the same property of a node at the same time; the later one wins.' },\n\t'enter-visible': { severity: 'warning', wording: 'A node enters while it is already showing, so it blinks out first.' },\n\t'exit-hidden': { severity: 'warning', wording: 'A node exits or animates while it is hidden.' },\n\t'out-of-frame': { severity: 'warning', wording: 'A node a command animates ends up outside the camera.' },\n\t'too-fast': { severity: 'warning', wording: 'A change is too quick to follow.' },\n\t'spring-cut-short': { severity: 'warning', wording: 'A spring is given a duration shorter than it takes to settle, so it jumps to its end.' },\n\t'scene-too-long': { severity: 'warning', wording: 'The scene runs past its target length.' },\n\t'scene-too-short': { severity: 'warning', wording: 'The scene ends before its target length.' },\n\t'unknown-control-color': { severity: 'warning', wording: 'A control stands for a colour the scene never uses.' },\n\t'empty-shot': { severity: 'note', wording: 'A shot neither moves the camera nor runs a command.' },\n\t'camera-aspect': { severity: 'note', wording: 'A camera rectangle has a different shape from the artwork, so it is letterboxed.' }\n} as const satisfies Record<string, { severity: MotionIssueSeverity; wording: string }>;\n\nexport type MotionIssueCode = keyof typeof MOTION_ISSUE_CODES;\n\nexport interface MotionIssue {\n\tcode: MotionIssueCode;\n\tseverity: MotionIssueSeverity;\n\tmessage: string;\n\t/** Id of the shot it is in, when it is in one. */\n\tshot?: string;\n\t/** Index of the command in that shot's `run`. */\n\tcommand?: number;\n\t/** Node ids it is about. */\n\tids?: string[];\n\t/** What was measured, what was needed and in what unit (e.g. 80 vs 120 ms). */\n\tmeasured?: number;\n\tneeded?: number;\n\tunit?: 'ms' | 's' | 'units';\n}\n\nexport function motionIssue(code: MotionIssueCode, message: string, extra: Omit<MotionIssue, 'code' | 'severity' | 'message'> = {}): MotionIssue {\n\treturn { code, severity: MOTION_ISSUE_CODES[code].severity, message, ...extra };\n}\n\n/** A stable key for an issue (code and ids, else code and place), to compare two checks. */\nexport function motionIssueKey(issue: MotionIssue): string {\n\tif (issue.ids?.length) return `${issue.code}:${[...issue.ids].sort().join(',')}`;\n\treturn `${issue.code}@${issue.shot ?? ''}#${issue.command ?? ''}`;\n}\n\n/** One line: `Shot \"intro\", command 2: …`. */\nexport function motionIssueLine(issue: MotionIssue): string {\n\tconst where = issue.shot !== undefined ? `Shot \"${issue.shot}\"${issue.command !== undefined ? `, command ${issue.command + 1}` : ''}: ` : '';\n\treturn `${where}${issue.message}`;\n}\n\n/** Optimal string alignment (Damerau–Levenshtein) distance. */\nfunction editDistance(a: string, b: string): number {\n\tconst d: number[][] = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);\n\tfor (let j = 1; j <= b.length; j++) d[0][j] = j;\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\t\t\td[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);\n\t\t\tif (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n\t\t}\n\t}\n\treturn d[a.length][b.length];\n}\n\n/** The candidate closest to `word` (case-insensitive), if it is within a third of its length. */\nexport function suggestName(word: string, candidates: Iterable<string>): string | undefined {\n\tconst w = word.toLowerCase();\n\tlet best: string | undefined;\n\tlet bestDistance = Infinity;\n\tfor (const c of candidates) {\n\t\tconst distance = editDistance(w, c.toLowerCase());\n\t\tif (distance < bestDistance) {\n\t\t\tbest = c;\n\t\t\tbestDistance = distance;\n\t\t}\n\t}\n\treturn best !== undefined && bestDistance <= Math.max(1, Math.floor(word.length / 3)) ? best : undefined;\n}\n\n/** `\"sunn\" (did you mean \"sun\"?)`, or just `\"sunn\"`. */\nexport function namedWithSuggestion(word: string, candidates: Iterable<string>): string {\n\tconst s = suggestName(word, candidates);\n\treturn s !== undefined && s !== word ? `\"${word}\" (did you mean \"${s}\"?)` : `\"${word}\"`;\n}\n","import { isAnimationEasing } from '../animation/easing.js';\nimport { namedWithSuggestion } from './issues.js';\nimport { MOTION_COMMAND_TYPES, MOTION_DIRECTIONS, MOTION_ENTER_STYLES, MOTION_EXIT_STYLES, MOTION_REPEAT_MODES, MOTION_BLENDS, MOTION_IRIS_SHAPES, MOTION_SPLIT_ORIENTATIONS, type MotionCommand, type MotionScene, type MotionShot } from './types.js';\n\n/**\n * Shape checking: whether a value is a well-formed scene, listing every problem at once.\n * Meaning (do the ids exist, does the timing work) is `checkMotionScene`'s job.\n */\n\nexport class MotionSceneFormatError extends Error {\n\treadonly problems: string[];\n\tconstructor(problems: string[]) {\n\t\tsuper(`The scene is not well formed:\\n${problems.map((p) => `- ${p}`).join('\\n')}`);\n\t\tthis.name = 'MotionSceneFormatError';\n\t\tthis.problems = problems;\n\t}\n}\n\nconst SCENE_KEYS = ['version', 'name', 'description', 'artwork', 'shots', 'loop', 'fps', 'steps', 'target', 'controls', 'presets'];\nconst SHOT_KEYS = ['id', 'label', 'camera', 'run', 'hold', 'speed'];\nconst CAMERA_KEYS = ['x', 'y', 'width', 'height', 'frame', 'padding', 'ease', 'ms', 'geometric'];\nconst BASE_KEYS = ['type', 'targets', 'duration', 'delay', 'stagger', 'with', 'ease', 'note', 'repeat', 'repeatMode', 'steps'];\nconst COMMAND_KEYS: Record<string, string[]> = {\n\tenter: [...BASE_KEYS, 'style', 'direction', 'distance', 'scale', 'shape', 'orientation'],\n\texit: [...BASE_KEYS, 'style', 'direction', 'distance'],\n\tdraw: [...BASE_KEYS, 'from', 'to'],\n\tmove: [...BASE_KEYS, 'by', 'to', 'blend'],\n\trotate: [...BASE_KEYS, 'by', 'to', 'blend'],\n\tscale: [...BASE_KEYS, 'to', 'geometric', 'blend'],\n\tfade: [...BASE_KEYS, 'to'],\n\tstyle: [...BASE_KEYS, 'fill', 'stroke', 'strokeWidth'],\n\tmorph: [...BASE_KEYS, 'into'],\n\tmatch: [...BASE_KEYS, 'into'],\n\tfollow: [...BASE_KEYS, 'path', 'rotate', 'from', 'to'],\n\tpulse: [...BASE_KEYS, 'amount', 'count', 'blend'],\n\tshake: [...BASE_KEYS, 'amount', 'count', 'axis', 'blend'],\n\tteeter: [...BASE_KEYS, 'angle', 'count', 'blend'],\n\twave: [...BASE_KEYS, 'amount', 'count', 'blend'],\n\twiggle: [...BASE_KEYS, 'amount', 'frequency', 'octaves', 'rotate', 'seed', 'blend'],\n\t'color-pulse': [...BASE_KEYS, 'color', 'paint', 'count'],\n\teffect: [...BASE_KEYS, 'effect', 'param', 'to'],\n\twait: ['type', 'duration', 'with', 'note']\n};\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\nconst isNum = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst isPoint = (v: unknown) => isObject(v) && isNum(v.x) && isNum(v.y);\n\nfunction unknownKeys(value: Record<string, unknown>, known: readonly string[], where: string, problems: string[]) {\n\tfor (const key of Object.keys(value)) if (!known.includes(key)) problems.push(`${where}: unknown field ${namedWithSuggestion(key, known)}.`);\n}\n\n/** Problems with one command's shape (empty when well formed). `where` prefixes each. */\nexport function commandShapeProblems(command: unknown, where: string): string[] {\n\tconst problems: string[] = [];\n\tif (!isObject(command)) return [`${where} must be an object.`];\n\tconst type = command.type;\n\tif (typeof type !== 'string' || !(MOTION_COMMAND_TYPES as readonly string[]).includes(type)) {\n\t\treturn [`${where}: unknown type ${typeof type === 'string' ? namedWithSuggestion(type, MOTION_COMMAND_TYPES) : String(type)}; use one of ${MOTION_COMMAND_TYPES.join(', ')}.`];\n\t}\n\tunknownKeys(command, COMMAND_KEYS[type], `${where} (${type})`, problems);\n\tconst p = (msg: string) => problems.push(`${where} (${type}): ${msg}`);\n\tconst nonNegative = (key: string) => {\n\t\tif (command[key] !== undefined && !(isNum(command[key]) && (command[key] as number) >= 0)) p(`\"${key}\" must be a number of milliseconds ≥ 0.`);\n\t};\n\tconst fraction = (key: string) => {\n\t\tif (command[key] !== undefined && !(isNum(command[key]) && (command[key] as number) >= 0 && (command[key] as number) <= 1)) p(`\"${key}\" must be a fraction from 0 to 1.`);\n\t};\n\tconst optionalNumber = (key: string) => {\n\t\tif (command[key] !== undefined && !isNum(command[key])) p(`\"${key}\" must be a number.`);\n\t};\n\tif (command.with !== undefined && command.with !== 'after' && command.with !== 'previous') p(`\"with\" must be \"after\" or \"previous\".`);\n\tif (command.note !== undefined && typeof command.note !== 'string') p(`\"note\" must be a string.`);\n\tif (type === 'wait') {\n\t\tif (!isNum(command.duration) || command.duration < 0) p(`\"duration\" must be a number of milliseconds ≥ 0.`);\n\t\treturn problems;\n\t}\n\tif (!Array.isArray(command.targets) || command.targets.length === 0 || !command.targets.every((t) => typeof t === 'string' && t.length > 0)) p(`\"targets\" must be a non-empty list of node ids.`);\n\tnonNegative('duration');\n\tnonNegative('delay');\n\tnonNegative('stagger');\n\tif (command.ease !== undefined && !isAnimationEasing(command.ease)) p(`\"ease\" is not an easing; use a preset such as \"ease-in-out\" or \"spring-bouncy\", or { \"type\": \"cubic-bezier\", … } or { \"type\": \"spring\", … }.`);\n\tif (command.repeat !== undefined) {\n\t\tif (type === 'enter' || type === 'exit') p(`\"repeat\" is not for ${type} (it brings things in or out once); repeat an emphasis or a move instead.`);\n\t\telse if (!(Number.isInteger(command.repeat) && (command.repeat as number) >= 1 && (command.repeat as number) <= 1000)) p(`\"repeat\" must be a whole number from 1 to 1000.`);\n\t}\n\tif (command.blend !== undefined && !(MOTION_BLENDS as readonly unknown[]).includes(command.blend)) p(`\"blend\" must be \"replace\" (the change takes over) or \"add\" (a layer on top).`);\n\tif (command.repeatMode !== undefined && !(MOTION_REPEAT_MODES as readonly unknown[]).includes(command.repeatMode)) p(`\"repeatMode\" must be one of ${MOTION_REPEAT_MODES.join(', ')}.`);\n\tif (command.steps !== undefined && !(isNum(command.steps) && command.steps > 0 && command.steps <= 120)) p(`\"steps\" must be frames per second from above 0 to 120 (12 holds each pose for two frames at 24 fps).`);\n\tswitch (type) {\n\t\tcase 'enter':\n\t\tcase 'exit': {\n\t\t\tconst styles = type === 'enter' ? MOTION_ENTER_STYLES : MOTION_EXIT_STYLES;\n\t\t\tif (command.style !== undefined && !(typeof command.style === 'string' && (styles as readonly string[]).includes(command.style)))\n\t\t\t\tp(`\"style\" must be one of ${styles.join(', ')}${typeof command.style === 'string' ? ` (got ${namedWithSuggestion(command.style, styles)})` : ''}.`);\n\t\t\tif (command.direction !== undefined && !(MOTION_DIRECTIONS as readonly unknown[]).includes(command.direction)) p(`\"direction\" must be one of ${MOTION_DIRECTIONS.join(', ')}.`);\n\t\t\toptionalNumber('distance');\n\t\t\tif (command.scale !== undefined && !(isNum(command.scale) && command.scale >= 0)) p(`\"scale\" must be a number ≥ 0 (the starting scale for pop and zoom).`);\n\t\t\tif (command.shape !== undefined && !(MOTION_IRIS_SHAPES as readonly unknown[]).includes(command.shape)) p(`\"shape\" must be one of ${MOTION_IRIS_SHAPES.join(', ')} (the opening of an iris).`);\n\t\t\tif (command.orientation !== undefined && !(MOTION_SPLIT_ORIENTATIONS as readonly unknown[]).includes(command.orientation)) p(`\"orientation\" must be one of ${MOTION_SPLIT_ORIENTATIONS.join(', ')} (the line a split opens from).`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'draw':\n\t\t\tfraction('from');\n\t\t\tfraction('to');\n\t\t\tbreak;\n\t\tcase 'move':\n\t\t\tif (command.by === undefined && command.to === undefined) p(`give \"by\" (an offset) or \"to\" (a point).`);\n\t\t\tif (command.by !== undefined && command.to !== undefined) p(`give \"by\" or \"to\", not both.`);\n\t\t\tif (command.by !== undefined && !isPoint(command.by)) p(`\"by\" must be { \"x\": number, \"y\": number }.`);\n\t\t\tif (command.to !== undefined && !isPoint(command.to)) p(`\"to\" must be { \"x\": number, \"y\": number }.`);\n\t\t\tbreak;\n\t\tcase 'rotate':\n\t\t\tif (command.by === undefined && command.to === undefined) p(`give \"by\" or \"to\" (degrees).`);\n\t\t\tif (command.by !== undefined && command.to !== undefined) p(`give \"by\" or \"to\", not both.`);\n\t\t\toptionalNumber('by');\n\t\t\toptionalNumber('to');\n\t\t\tbreak;\n\t\tcase 'scale':\n\t\t\tif (!(isNum(command.to) || isPoint(command.to))) p(`\"to\" must be a number or { \"x\": number, \"y\": number }.`);\n\t\t\tif (command.geometric !== undefined && typeof command.geometric !== 'boolean') p(`\"geometric\" must be true or false.`);\n\t\t\tbreak;\n\t\tcase 'fade':\n\t\t\tif (!(isNum(command.to) && command.to >= 0 && command.to <= 1)) p(`\"to\" must be an opacity from 0 to 1.`);\n\t\t\tbreak;\n\t\tcase 'style':\n\t\t\tif (command.fill === undefined && command.stroke === undefined && command.strokeWidth === undefined) p(`give at least one of \"fill\", \"stroke\" or \"strokeWidth\".`);\n\t\t\tif (command.fill !== undefined && typeof command.fill !== 'string') p(`\"fill\" must be a CSS colour.`);\n\t\t\tif (command.stroke !== undefined && typeof command.stroke !== 'string') p(`\"stroke\" must be a CSS colour.`);\n\t\t\tif (command.strokeWidth !== undefined && !(isNum(command.strokeWidth) && command.strokeWidth >= 0)) p(`\"strokeWidth\" must be a number ≥ 0.`);\n\t\t\tbreak;\n\t\tcase 'morph':\n\t\tcase 'match':\n\t\t\tif (typeof command.into !== 'string' || !command.into) p(`\"into\" must be the id of a ${type === 'match' ? 'group to become' : 'node whose shape to take'}.`);\n\t\t\tbreak;\n\t\tcase 'follow':\n\t\t\tif (typeof command.path !== 'string' || !command.path) p(`\"path\" must be the id of a path node.`);\n\t\t\tif (command.rotate !== undefined && typeof command.rotate !== 'boolean') p(`\"rotate\" must be true or false.`);\n\t\t\tfraction('from');\n\t\t\tfraction('to');\n\t\t\tbreak;\n\t\tcase 'pulse':\n\t\tcase 'shake':\n\t\tcase 'teeter':\n\t\tcase 'wave':\n\t\tcase 'color-pulse':\n\t\t\toptionalNumber('amount');\n\t\t\toptionalNumber('angle');\n\t\t\tif (command.count !== undefined && !(Number.isInteger(command.count) && (command.count as number) >= 1)) p(`\"count\" must be a whole number ≥ 1.`);\n\t\t\tif (command.axis !== undefined && command.axis !== 'horizontal' && command.axis !== 'vertical') p(`\"axis\" must be \"horizontal\" or \"vertical\".`);\n\t\t\tif (command.color !== undefined && typeof command.color !== 'string') p(`\"color\" must be a CSS colour.`);\n\t\t\tif (command.paint !== undefined && command.paint !== 'fill' && command.paint !== 'stroke') p(`\"paint\" must be \"fill\" or \"stroke\".`);\n\t\t\tbreak;\n\t\tcase 'wiggle':\n\t\t\toptionalNumber('amount');\n\t\t\toptionalNumber('rotate');\n\t\t\tif (command.frequency !== undefined && !(isNum(command.frequency) && command.frequency > 0)) p(`\"frequency\" must be a number of Hz > 0.`);\n\t\t\tif (command.octaves !== undefined && !(Number.isInteger(command.octaves) && (command.octaves as number) >= 1 && (command.octaves as number) <= 8)) p(`\"octaves\" must be a whole number from 1 to 8.`);\n\t\t\tif (command.seed !== undefined && !(Number.isInteger(command.seed) && (command.seed as number) >= 0)) p(`\"seed\" must be a whole number ≥ 0.`);\n\t\t\tbreak;\n\t\tcase 'effect':\n\t\t\tif (typeof command.effect !== 'string' || !command.effect) p(`\"effect\" must be the id of one of the node's effects.`);\n\t\t\tif (typeof command.param !== 'string' || !command.param) p(`\"param\" must name a numeric parameter of the effect.`);\n\t\t\tif (!isNum(command.to)) p(`\"to\" must be a number.`);\n\t\t\tbreak;\n\t}\n\treturn problems;\n}\n\n/** Problems with one shot's shape. */\nexport function shotShapeProblems(shot: unknown, where: string): string[] {\n\tif (!isObject(shot)) return [`${where} must be an object.`];\n\tconst problems: string[] = [];\n\tunknownKeys(shot, SHOT_KEYS, where, problems);\n\tif (typeof shot.id !== 'string' || !/^[A-Za-z0-9_][\\w.-]*$/.test(shot.id)) problems.push(`${where}: \"id\" must be letters, digits, \"_\", \"-\" or \".\" (e.g. \"intro\").`);\n\tconst name = typeof shot.id === 'string' ? `Shot \"${shot.id}\"` : where;\n\tif (shot.label !== undefined && typeof shot.label !== 'string') problems.push(`${name}: \"label\" must be a string.`);\n\tif (shot.hold !== undefined && !(isNum(shot.hold) && shot.hold >= 0)) problems.push(`${name}: \"hold\" must be a number of milliseconds ≥ 0.`);\n\tif (shot.speed !== undefined && !(isNum(shot.speed) && shot.speed >= 0.05 && shot.speed <= 20)) problems.push(`${name}: \"speed\" must be a number from 0.05 to 20 (2 plays it twice as fast).`);\n\tif (shot.camera !== undefined) {\n\t\tconst c = shot.camera;\n\t\tif (!isObject(c)) problems.push(`${name}: \"camera\" must be an object.`);\n\t\telse {\n\t\t\tunknownKeys(c, CAMERA_KEYS, `${name} camera`, problems);\n\t\t\tconst isRect = ['x', 'y', 'width', 'height'].every((k) => isNum(c[k]));\n\t\t\tif (typeof c.frame === 'string') {\n\t\t\t\tif (c.padding !== undefined && !isNum(c.padding)) problems.push(`${name} camera: \"padding\" must be a number.`);\n\t\t\t} else if (!isRect) problems.push(`${name} camera: give { x, y, width, height } or { frame: \"<node id>\" }.`);\n\t\t\tif (c.ease !== undefined && !isAnimationEasing(c.ease)) problems.push(`${name} camera: \"ease\" is not an easing.`);\n\t\t\tif (c.ms !== undefined && !(isNum(c.ms) && c.ms >= 0)) problems.push(`${name} camera: \"ms\" must be a number ≥ 0.`);\n\t\t\tif (c.geometric !== undefined && typeof c.geometric !== 'boolean') problems.push(`${name} camera: \"geometric\" must be true or false.`);\n\t\t}\n\t}\n\tif (!Array.isArray(shot.run)) problems.push(`${name}: \"run\" must be a list of commands (it may be empty).`);\n\telse shot.run.forEach((command, i) => problems.push(...commandShapeProblems(command, `${name}, command ${i + 1}`)));\n\treturn problems;\n}\n\n/** Problems with a scene's shape (empty when well formed). */\nexport function motionSceneShapeProblems(input: unknown): string[] {\n\tif (!isObject(input)) return ['The scene must be an object.'];\n\tconst problems: string[] = [];\n\tunknownKeys(input, SCENE_KEYS, 'Scene', problems);\n\tif (input.version !== 1) problems.push('Scene: \"version\" must be 1.');\n\tif (typeof input.name !== 'string' || !input.name) problems.push('Scene: \"name\" must be a non-empty string.');\n\tif (input.description !== undefined && typeof input.description !== 'string') problems.push('Scene: \"description\" must be a string.');\n\tconst art = input.artwork;\n\tif (!isObject(art) || !isNum(art.width) || !isNum(art.height) || !(art.width > 0) || !(art.height > 0) || !Array.isArray(art.nodes))\n\t\tproblems.push('Scene: \"artwork\" must be a vector document { width, height, nodes }.');\n\tif (input.loop !== undefined && !['none', 'loop', 'ping-pong'].includes(input.loop as string)) problems.push('Scene: \"loop\" must be \"none\", \"loop\" or \"ping-pong\".');\n\tif (input.fps !== undefined && !(isNum(input.fps) && input.fps > 0 && input.fps <= 120)) problems.push('Scene: \"fps\" must be a number from 1 to 120.');\n\tif (input.steps !== undefined && !(isNum(input.steps) && input.steps > 0 && input.steps <= 120)) problems.push('Scene: \"steps\" must be frames per second from above 0 to 120.');\n\tif (input.target !== undefined && !(Array.isArray(input.target) && input.target.length === 2 && input.target.every(isNum) && input.target[0] <= input.target[1]))\n\t\tproblems.push('Scene: \"target\" must be [min, max] seconds.');\n\tif (input.controls !== undefined) {\n\t\tif (!Array.isArray(input.controls)) problems.push('Scene: \"controls\" must be a list.');\n\t\telse\n\t\t\tinput.controls.forEach((c, i) => {\n\t\t\t\tif (!isObject(c) || typeof c.name !== 'string' || !/^[A-Za-z_]\\w*$/.test(c.name) || c.type !== 'color' || typeof c.default !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(c.default))\n\t\t\t\t\tproblems.push(`Scene: control ${i + 1} must be { name (an identifier), type: \"color\", default: \"#rrggbb\", label? }.`);\n\t\t\t});\n\t}\n\tif (input.presets !== undefined && !(Array.isArray(input.presets) && input.presets.every((p) => isObject(p) && typeof p.name === 'string' && isObject(p.values))))\n\t\tproblems.push('Scene: \"presets\" must be a list of { name, values }.');\n\tif (!Array.isArray(input.shots)) problems.push('Scene: \"shots\" must be a list.');\n\telse input.shots.forEach((shot, i) => problems.push(...shotShapeProblems(shot, `Shot ${i + 1}`)));\n\treturn problems;\n}\n\n/** Reads a scene from JSON (a string or a parsed value). Throws `MotionSceneFormatError` listing every problem. */\nexport function parseMotionScene(input: unknown): MotionScene {\n\tlet value = input;\n\tif (typeof input === 'string') {\n\t\ttry {\n\t\t\tvalue = JSON.parse(input);\n\t\t} catch (error) {\n\t\t\tthrow new MotionSceneFormatError([`The scene is not valid JSON: ${(error as Error).message}`]);\n\t\t}\n\t}\n\tconst problems = motionSceneShapeProblems(value);\n\tif (problems.length) throw new MotionSceneFormatError(problems);\n\treturn value as MotionScene;\n}\n\n/** Writes a scene as JSON. */\nexport function motionSceneToJson(scene: MotionScene, space: number | string = 2): string {\n\treturn JSON.stringify(scene, null, space);\n}\n\n/** Whether `shot` is a well-formed shot. */\nexport const isMotionShot = (shot: unknown): shot is MotionShot => shotShapeProblems(shot, 'Shot').length === 0;\n/** Whether `command` is a well-formed command. */\nexport const isMotionCommand = (command: unknown): command is MotionCommand => commandShapeProblems(command, 'Command').length === 0;\n","// Pairing passes adapted from deckcraft-main/crates/anim/src/morph.rs (`morph_pairs`) and figcraft-main/crates/ui-egui/src/present.rs (`match_layers`), MIT OR Apache-2.0, © ArtCraft Team and contributors.\nimport type { VectorNode } from '../vector/types.js';\n\n/** How the parts of one node pair with the parts of another for a `match` (Smart Animate). */\nexport interface MotionMatch {\n\t/** `[from id, into id]`: each part of the target and the part of `into` it becomes. */\n\tpairs: [string, string][];\n\t/** Parts of the target with no partner (they fade out). */\n\tunpairedFrom: string[];\n\t/** Parts of `into` with no partner (they cannot appear). */\n\tunpairedInto: string[];\n}\n\nconst SEPARATOR = /[-_/.:]/;\n\n/** An id with the group's own id (or its last word) taken out, so `card-a-title` and `card-b-title` both read `title`. */\nfunction localId(id: string, groupId: string): string {\n\tif (groupId && id.includes(groupId)) return id.split(groupId).join('').replace(/^[-_/.:]+|[-_/.:]+$/g, '');\n\tconst parts = id.split(SEPARATOR);\n\treturn parts[parts.length - 1] ?? id;\n}\n\n/**\n * Pairs the parts of `from` with the parts of `into`, each part used once, in passes: the same\n * `name`, then the same id once each group's own id is taken out, then the same kind in order.\n * Paired groups pair their own parts the same way, so a part pairs with a part, never a group\n * with a path. Two paths (or a path and a group with no children) pair whole.\n */\nexport function matchMotionNodes(from: VectorNode, into: VectorNode): MotionMatch {\n\tconst out: MotionMatch = { pairs: [], unpairedFrom: [], unpairedInto: [] };\n\tconst visit = (a: VectorNode, b: VectorNode) => {\n\t\tconst aKids = a.type === 'group' ? a.children : [];\n\t\tconst bKids = b.type === 'group' ? b.children : [];\n\t\tif (!aKids.length || !bKids.length) {\n\t\t\tout.pairs.push([a.id, b.id]);\n\t\t\treturn;\n\t\t}\n\t\tconst left = new Set(aKids);\n\t\tconst right = new Set(bKids);\n\t\tconst pair = (key: (n: VectorNode, group: VectorNode) => string | undefined) => {\n\t\t\tfor (const x of [...left]) {\n\t\t\t\tconst k = key(x, a);\n\t\t\t\tif (!k) continue;\n\t\t\t\tconst y = [...right].find((n) => key(n, b) === k);\n\t\t\t\tif (!y) continue;\n\t\t\t\tleft.delete(x);\n\t\t\t\tright.delete(y);\n\t\t\t\tif (x.type === 'group' && y.type === 'group') visit(x, y);\n\t\t\t\telse out.pairs.push([x.id, y.id]);\n\t\t\t}\n\t\t};\n\t\tpair((n) => n.name?.trim() || undefined);\n\t\tpair((n, g) => localId(n.id, g.id) || undefined);\n\t\t// Then the same kind, in stacking order.\n\t\tfor (const x of [...left]) {\n\t\t\tconst y = [...right].find((n) => n.type === x.type);\n\t\t\tif (!y) continue;\n\t\t\tleft.delete(x);\n\t\t\tright.delete(y);\n\t\t\tif (x.type === 'group' && y.type === 'group') visit(x, y);\n\t\t\telse out.pairs.push([x.id, y.id]);\n\t\t}\n\t\tout.unpairedFrom.push(...[...left].map((n) => n.id));\n\t\tout.unpairedInto.push(...[...right].map((n) => n.id));\n\t};\n\tvisit(from, into);\n\treturn out;\n}\n","import { mixColorsOklab } from '../animation/color.js';\nimport { matchMotionNodes } from './match.js';\nimport { behaviorProgress, motionSeedFromId, type MotionBehavior } from '../animation/behavior.js';\nimport { evaluateEasing, resolveEasing, springSettleMs, type AnimationEasing } from '../animation/easing.js';\nimport { bezierPathLength } from '../canvas/pathops/bezier.js';\nimport {\n\tIDENTITY_MATRIX,\n\tapplyMatrix,\n\tcollectPathNodes,\n\tinvertMatrix,\n\tmultiplyMatrices,\n\tnodeMatrix,\n\tvectorNodeBounds,\n\tvectorPathWorldBezier,\n\ttype AffineMatrix\n} from '../vector/geometry.js';\nimport type { VectorBounds, VectorNode, VectorPaint } from '../vector/types.js';\nimport {\n\tMOTION_CAMERA_MS,\n\tMOTION_DEFAULT_DURATIONS,\n\tMOTION_DEFAULT_HOLD,\n\tMOTION_DRAW_MS_PER_UNIT,\n\tMOTION_DRAW_RANGE,\n\ttype MotionCamera,\n\ttype MotionCommand,\n\ttype MotionDirection,\n\ttype MotionIrisShape,\n\ttype MotionRect,\n\ttype MotionSplitOrientation,\n\ttype MotionScene,\n\ttype MotionShot\n} from './types.js';\n\n/**\n * Compiling a scene: shots and commands become timed segments, one per (node, property)\n * change. A property's value at a time is that of the latest segment to have started (its\n * `from` before the first one), so a node that enters later is hidden until then. This is\n * also how Flair's vector motion combines changes, which keeps the Flair export exact.\n */\n\n/**\n * Properties a segment can change. Offsets (`x`, `y`, `rotation`) are relative to the rest\n * pose, scales multiply it, and turns and scales are about the node's centre at rest.\n * `effect:<effectId>:<param>` tweens a live path effect's parameter. `camera` (node `\"\"`) is\n * the view box `[x, y, width, height]`. `clipRect` (`[x, y, width, height]`) and `clipCircle`\n * (`[cx, cy, r]`) are the reveal clips of `wipe`, `iris` and `split`, in the units of the\n * node's own box (0–1 across it, SVG's `objectBoundingBox`), as Flair's clip reveals are.\n */\nexport type MotionProperty =\n\t| 'opacity'\n\t| 'x'\n\t| 'y'\n\t| 'rotation'\n\t| 'scaleX'\n\t| 'scaleY'\n\t| 'fill'\n\t| 'stroke'\n\t| 'strokeWidth'\n\t| 'fillOpacity'\n\t| 'drawStart'\n\t| 'drawEnd'\n\t| 'shape'\n\t| 'follow'\n\t| 'clipRect'\n\t| 'clipCircle'\n\t| 'camera'\n\t| `effect:${string}:${string}`;\n\nexport type MotionValue = number | string | readonly number[];\n\nexport interface MotionSegment {\n\t/** Node id (`\"\"` for the camera). */\n\tnode: string;\n\tproperty: MotionProperty;\n\tstart: number;\n\tend: number;\n\tfrom: MotionValue;\n\tto: MotionValue;\n\tease: AnimationEasing;\n\t/** The shot and command (index in `run`) it comes from. */\n\tshot: string;\n\tcommand: number;\n\t/**\n\t * How the change gets from `from` to `to` when not straight along its ease (a pulse there and\n\t * back, a settling oscillation, a wriggle): Flair's `behavior`, exported as is.\n\t */\n\tbehavior?: MotionBehavior;\n\t/**\n\t * Which number of the node's exported value this is (x 0, y 1, rotation 2, matching the\n\t * transform Flair is given), so a wriggle wanders each on the channel Flair uses. Default 0.\n\t */\n\tindex?: number;\n\t/** Played backwards in time (a mirrored repeat): progress runs 1 → 0 through the ease. */\n\treverse?: boolean;\n\t/** Stepped time: progress holds on a grid of this many frames per second from the start. */\n\tsteps?: number;\n\t/** Numbers change by a steady factor (`from·(to/from)^u`); a camera zooms at a steady rate. */\n\tgeometric?: boolean;\n\t/**\n\t * `add`: the segment is a layer over the node's pose rather than a change to it. It lives on\n\t * its own track (`motionAddTrackKey`), runs from 0 (offsets, turns) or 1 (scales), and what\n\t * it adds stays once it ends, on top of whatever the pose does.\n\t */\n\tblend?: 'add';\n\t/** For `follow`: the path node id, and whether to turn with it. */\n\tpath?: string;\n\trotate?: boolean;\n}\n\nexport interface MotionShotTiming {\n\tid: string;\n\tindex: number;\n\tlabel?: string;\n\tstart: number;\n\t/** When the camera move ends and the commands begin. */\n\tcommandsStart: number;\n\t/** When the last command ends (the hold follows). */\n\tcommandsEnd: number;\n\tend: number;\n}\n\nexport interface MotionCommandTiming {\n\tshot: string;\n\tshotIndex: number;\n\tcommand: number;\n\ttype: MotionCommand['type'];\n\tstart: number;\n\tend: number;\n\t/** Length per target (ms). */\n\tduration: number;\n}\n\nexport interface MotionTimeline {\n\t/** Total length in ms. */\n\tduration: number;\n\tshots: MotionShotTiming[];\n\tcommands: MotionCommandTiming[];\n\tsegments: MotionSegment[];\n\t/** Segments per `node\\u0000property`, in start order. */\n\ttracks: ReadonlyMap<string, readonly MotionSegment[]>;\n}\n\n/** Where a node sits in the artwork. */\nexport interface MotionNodeEntry {\n\tnode: VectorNode;\n\t/** Ids from the root down to the node's parent. */\n\tancestors: string[];\n\t/** Parent space → document space. */\n\tparentWorld: AffineMatrix;\n\t/** Centre of the node's bounds at rest, in its parent's space. */\n\tcenter: { x: number; y: number };\n\t/** Bounds at rest in document space. */\n\tbounds: VectorBounds | null;\n\t/** Bounds at rest in its parent's space (what a reveal clip's box is). */\n\tbox: VectorBounds | null;\n}\n\nconst indexCache = new WeakMap<object, Map<string, MotionNodeEntry>>();\n\n/** Every node of the artwork by id (cached per node list). */\nexport function indexMotionNodes(nodes: readonly VectorNode[]): Map<string, MotionNodeEntry> {\n\tconst hit = indexCache.get(nodes);\n\tif (hit) return hit;\n\tconst out = new Map<string, MotionNodeEntry>();\n\tconst walk = (list: readonly VectorNode[], parentWorld: AffineMatrix, ancestors: string[]) => {\n\t\tfor (const node of list) {\n\t\t\tconst local = vectorNodeBounds(node);\n\t\t\tconst bounds = vectorNodeBounds(node, parentWorld);\n\t\t\tconst center = local ? { x: local.x + local.width / 2, y: local.y + local.height / 2 } : { x: 0, y: 0 };\n\t\t\tif (!out.has(node.id)) out.set(node.id, { node, ancestors, parentWorld, center, bounds, box: local });\n\t\t\tif (node.type === 'group') walk(node.children, multiplyMatrices(nodeMatrix(node), parentWorld), [...ancestors, node.id]);\n\t\t}\n\t};\n\twalk(nodes, IDENTITY_MATRIX, []);\n\tindexCache.set(nodes, out);\n\treturn out;\n}\n\nconst solid = (paint: VectorPaint | undefined): string | undefined => (typeof paint === 'string' && paint !== 'none' ? paint : undefined);\n\n/** The first solid paint of a node (a group's first path with one). */\nfunction firstPaint(node: VectorNode, key: 'fill' | 'stroke'): string | undefined {\n\tif (node.type === 'path') return solid(node[key]);\n\tfor (const p of collectPathNodes(node)) {\n\t\tconst s = solid(p[key]);\n\t\tif (s) return s;\n\t}\n\treturn undefined;\n}\n\n/** How far a stroke reaches past the outline: half its width (all of it outside, none inside). */\nfunction strokeReach(node: VectorNode): number {\n\tlet reach = 0;\n\tfor (const p of node.type === 'path' ? [node] : collectPathNodes(node)) {\n\t\tif (p.stroke == null || p.stroke === 'none') continue;\n\t\tconst width = p.strokeWidth ?? 1;\n\t\treach = Math.max(reach, p.strokeAlign === 'outside' ? width : p.strokeAlign === 'inside' ? 0 : width / 2);\n\t}\n\treturn reach;\n}\n\n/**\n * How far past its box (as a share of its width and height) a reveal clip reaches, so it shows\n * the whole stroke: the stroke's reach over the box plus 0.02, at most 1 (Flair's padding). Null\n * when the box has no width or height (a lone straight line), which a clip cannot reveal.\n */\nexport function motionRevealPadding(entry: MotionNodeEntry): readonly [number, number] | null {\n\tconst box = entry.box;\n\tif (!box || !(box.width > 0) || !(box.height > 0)) return null;\n\tconst s = strokeReach(entry.node);\n\treturn [Math.min(1, s / box.width + 0.02), Math.min(1, s / box.height + 0.02)];\n}\n\n/** Clip numbers as Flair writes them (4 decimals). */\nconst clipRound = (n: number) => Math.round(n * 1e4) / 1e4 || 0;\n\n/** A reveal clip that shows the whole node (padded past its box), in its box's units. */\nfunction revealFull(property: 'clipRect' | 'clipCircle', [px, py]: readonly [number, number]): number[] {\n\treturn (property === 'clipRect' ? [-px, -py, 1 + 2 * px, 1 + 2 * py] : [0.5, 0.5, Math.hypot(0.5 + px, 0.5 + py)]).map(clipRound);\n}\n\nconst OPPOSITE: Record<MotionDirection, MotionDirection> = { up: 'down', down: 'up', left: 'right', right: 'left' };\n\n/** What a reveal clip animates: a wipe (in, or out with `hide`), an iris or a split. */\nexport type MotionReveal = { style: 'wipe'; direction?: MotionDirection; hide?: boolean } | { style: 'iris'; shape?: MotionIrisShape } | { style: 'split'; orientation?: MotionSplitOrientation };\n\n/**\n * The reveal clip a `wipe`, `iris` or `split` animates, from and to (Flair's `entrance.wipe`,\n * `entrance.iris`, `entrance.split` and `exit.wipe`), or null when the node's box has no width\n * or height. An exit wipe is the enter wipe the other way, reversed in time.\n */\nexport function motionRevealClip(entry: MotionNodeEntry, reveal: MotionReveal): { property: 'clipRect' | 'clipCircle'; from: number[]; to: number[] } | null {\n\tconst pad = motionRevealPadding(entry);\n\tif (!pad) return null;\n\tconst [px, py] = pad;\n\tconst [w, h] = [1 + 2 * px, 1 + 2 * py];\n\tconst rect = (from: number[], to: number[]) => ({ property: 'clipRect' as const, from: from.map(clipRound), to: to.map(clipRound) });\n\tif (reveal.style === 'iris') {\n\t\tif (reveal.shape === 'box') return rect([0.5, 0.5, 0, 0], [-px, -py, w, h]);\n\t\treturn { property: 'clipCircle', from: [0.5, 0.5, 0], to: revealFull('clipCircle', pad) };\n\t}\n\tif (reveal.style === 'split') {\n\t\tif (reveal.orientation === 'vertical') return rect([0.5, -py, 0, h], [-px, -py, w, h]);\n\t\treturn rect([-px, 0.5, w, 0], [-px, -py, w, h]);\n\t}\n\tconst direction = reveal.direction ?? 'right';\n\tif (reveal.hide) {\n\t\tconst shown = motionRevealClip(entry, { style: 'wipe', direction: OPPOSITE[direction] })!;\n\t\treturn { ...shown, from: shown.to, to: shown.from };\n\t}\n\tswitch (direction) {\n\t\tcase 'right':\n\t\t\treturn rect([-px, -py, 0, h], [-px, -py, w, h]);\n\t\tcase 'left':\n\t\t\treturn rect([1 + px, -py, 0, h], [-px, -py, w, h]);\n\t\tcase 'down':\n\t\t\treturn rect([-px, -py, w, 0], [-px, -py, w, h]);\n\t\tcase 'up':\n\t\t\treturn rect([-px, 1 + py, w, 0], [-px, -py, w, h]);\n\t}\n}\n\n/** A property's value with no animation. */\nexport function motionRestValue(entry: MotionNodeEntry | undefined, property: MotionProperty, artwork: { width: number; height: number }): MotionValue {\n\tconst node = entry?.node;\n\tswitch (property) {\n\t\tcase 'opacity':\n\t\t\treturn node?.opacity ?? 1;\n\t\tcase 'x':\n\t\tcase 'y':\n\t\tcase 'rotation':\n\t\t\treturn 0;\n\t\tcase 'scaleX':\n\t\tcase 'scaleY':\n\t\tcase 'fillOpacity':\n\t\tcase 'drawEnd':\n\t\t\treturn 1;\n\t\tcase 'drawStart':\n\t\t\treturn 0;\n\t\tcase 'follow':\n\t\t\treturn -1;\n\t\tcase 'fill':\n\t\tcase 'stroke':\n\t\t\treturn (node && firstPaint(node, property)) ?? 'transparent';\n\t\tcase 'strokeWidth': {\n\t\t\tconst path = node?.type === 'path' ? node : node ? collectPathNodes(node)[0] : undefined;\n\t\t\treturn path?.strokeWidth ?? 1;\n\t\t}\n\t\tcase 'shape':\n\t\t\treturn node?.id ?? '';\n\t\tcase 'clipRect':\n\t\tcase 'clipCircle': {\n\t\t\tconst pad = entry && motionRevealPadding(entry);\n\t\t\treturn pad ? revealFull(property, pad) : [];\n\t\t}\n\t\tcase 'camera':\n\t\t\treturn [0, 0, artwork.width, artwork.height];\n\t}\n\tconst [, effectId, param] = property.split(':');\n\tconst effect = node?.effects?.find((e) => e.id === effectId);\n\tconst v = effect ? (effect.params as unknown as Record<string, unknown>)[param] : undefined;\n\treturn typeof v === 'number' ? v : 0;\n}\n\n/** `from` → `to` at eased progress `u` (numbers extrapolate, colours mix in OKLab, others switch at the end). */\nexport function interpolateMotionValue(from: MotionValue, to: MotionValue, u: number): MotionValue {\n\tif (typeof from === 'number' && typeof to === 'number') return from + (to - from) * u;\n\tif (Array.isArray(from) && Array.isArray(to) && from.length === to.length) return from.map((f, i) => f + ((to[i] as number) - f) * u);\n\tif (u <= 0) return from;\n\tif (u >= 1) return to;\n\tif (typeof from === 'string' && typeof to === 'string') {\n\t\tconst mixed = mixColorsOklab(from, to, u);\n\t\tif (mixed !== null) return mixed;\n\t}\n\treturn u < 1 ? from : to;\n}\n\n/** Progress (0–1, unclamped by the easing) of a segment at `time`: stepped, reversed and eased as the segment says. */\nexport function segmentProgress(segment: MotionSegment, time: number): { u: number; eased: number } {\n\tconst span = segment.end - segment.start;\n\tlet elapsed = time - segment.start;\n\tif (segment.steps && segment.steps > 0 && elapsed < span) elapsed = (Math.floor((elapsed * segment.steps) / 1000 + 1e-9) / segment.steps) * 1000;\n\tconst u = span <= 0 ? 1 : Math.min(1, Math.max(0, elapsed / span));\n\t// A reversed segment plays its forward run backwards: at u it shows what it showed at 1 − u.\n\treturn { u, eased: evaluateEasing(segment.ease, segment.reverse ? 1 - u : u, span) };\n}\n\n/** `from` → `to` by a steady factor: numbers above 0 grow geometrically; a camera box zooms at a steady rate, its centre keeping pace. */\nfunction geometricValue(from: MotionValue, to: MotionValue, e: number): MotionValue | undefined {\n\tconst grow = (a: number, b: number) => (a > 0 && b > 0 ? a * (b / a) ** e : undefined);\n\tif (typeof from === 'number' && typeof to === 'number') return grow(from, to);\n\tif (Array.isArray(from) && Array.isArray(to) && from.length === 4 && to.length === 4) {\n\t\tconst [x0, y0, w0, h0] = from as number[];\n\t\tconst [x1, y1, w1, h1] = to as number[];\n\t\tconst w = grow(w0, w1);\n\t\tconst h = grow(h0, h1);\n\t\tif (w === undefined || h === undefined) return undefined;\n\t\t// The centre moves the same share of the way as the size has changed.\n\t\tconst f = Math.abs(w1 - w0) > 1e-9 ? (w - w0) / (w1 - w0) : e;\n\t\tconst cx = x0 + w0 / 2 + (x1 + w1 / 2 - x0 - w0 / 2) * f;\n\t\tconst cy = y0 + h0 / 2 + (y1 + h1 / 2 - y0 - h0 / 2) * f;\n\t\treturn [cx - w / 2, cy - h / 2, w, h];\n\t}\n\treturn undefined;\n}\n\n/**\n * A segment's value at `time`: along its ease, through its behaviour when it has one. `raw`\n * ignores the behaviour (the value it swings towards), as Flair is given it.\n */\nexport function segmentValue(segment: MotionSegment, time: number, raw = false): MotionValue {\n\tconst { eased } = segmentProgress(segment, time);\n\tif (segment.geometric && !segment.behavior) {\n\t\tconst g = geometricValue(segment.from, segment.to, eased);\n\t\tif (g !== undefined) return g;\n\t}\n\tif (!segment.behavior || raw) return interpolateMotionValue(segment.from, segment.to, eased);\n\tconst p = behaviorProgress(segment.behavior, eased, segment.index ?? 0, segment.end - segment.start);\n\t// Colours (a colour pulse) mix only between their ends; numbers swing past them.\n\treturn typeof segment.from === 'string' ? interpolateMotionValue(segment.from, segment.to, Math.min(1, Math.max(0, p))) : interpolateMotionValue(segment.from, segment.to, p);\n}\n\n/** The segment in effect at `time` (the latest to have started), if any. */\nexport function activeSegment(track: readonly MotionSegment[] | undefined, time: number): MotionSegment | undefined {\n\tif (!track?.length) return undefined;\n\tlet found: MotionSegment | undefined;\n\tfor (const s of track) if (s.start <= time && (!found || s.start >= found.start)) found = s;\n\treturn found;\n}\n\n/** A track's value at `time`, or `undefined` when nothing animates it. `raw` ignores behaviours (see `segmentValue`). */\nexport function trackValue(track: readonly MotionSegment[] | undefined, time: number, raw = false): MotionValue | undefined {\n\tif (!track?.length) return undefined;\n\tconst s = activeSegment(track, time);\n\tif (s) return segmentValue(s, time, raw);\n\tlet first = track[0];\n\tfor (const t of track) if (t.start < first.start) first = t;\n\treturn first.from;\n}\n\nexport const motionTrackKey = (node: string, property: MotionProperty) => `${node}\\u0000${property}`;\n\n/** The track of a node property's additive layers (segments with `blend: 'add'`). */\nexport const motionAddTrackKey = (node: string, property: MotionProperty) => `${node}\\u0000${property}\\u0000add`;\n\n/** Properties that take additive layers: offsets and turns add, scales multiply. */\nexport const MOTION_ADDITIVE_PROPERTIES: readonly MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY'];\n\n/**\n * A property's value with its additive layers on top of `base` (its pose): every layer that has\n * started adds its value (offsets, turns) or multiplies by it (scales). `raw` ignores behaviours.\n */\nexport function withMotionLayers(timeline: Pick<MotionTimeline, 'tracks'>, node: string, property: MotionProperty, base: number, time: number, raw = false): number {\n\tconst layers = timeline.tracks.get(motionAddTrackKey(node, property));\n\tif (!layers) return base;\n\tconst scale = property === 'scaleX' || property === 'scaleY';\n\tlet v = base;\n\tfor (const layer of layers) {\n\t\tif (layer.start > time) continue;\n\t\tconst x = Number(segmentValue(layer, time, raw));\n\t\tif (Number.isFinite(x)) v = scale ? v * x : v + x;\n\t}\n\treturn v;\n}\n\n/** Grows a rectangle to the artwork's aspect ratio (about its centre). */\nexport function fitMotionRect(rect: MotionRect, aspect: number): MotionRect {\n\tconst cx = rect.x + rect.width / 2;\n\tconst cy = rect.y + rect.height / 2;\n\tlet { width, height } = rect;\n\tif (width / height < aspect) width = height * aspect;\n\telse height = width / aspect;\n\treturn { x: cx - width / 2, y: cy - height / 2, width, height };\n}\n\n/** The rectangle a camera looks at, or `null` when it frames an unknown node. */\nexport function resolveMotionCamera(camera: MotionCamera, scene: MotionScene): MotionRect | null {\n\tif ('frame' in camera && typeof camera.frame === 'string') {\n\t\tconst entry = indexMotionNodes(scene.artwork.nodes).get(camera.frame);\n\t\tif (!entry?.bounds) return null;\n\t\tconst pad = camera.padding ?? 24;\n\t\tconst b = entry.bounds;\n\t\tconst rect = { x: b.x - pad, y: b.y - pad, width: Math.max(1, b.width + pad * 2), height: Math.max(1, b.height + pad * 2) };\n\t\treturn fitMotionRect(rect, scene.artwork.width / scene.artwork.height);\n\t}\n\tconst r = camera as MotionRect;\n\treturn { x: r.x, y: r.y, width: r.width, height: r.height };\n}\n\n/** Length of a node's outline (its longest path for a group), in document units. */\nexport function motionPathLength(node: VectorNode, parentWorld: AffineMatrix = IDENTITY_MATRIX): number {\n\tlet longest = 0;\n\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\tfor (const p of paths) {\n\t\ttry {\n\t\t\tlongest = Math.max(longest, bezierPathLength(vectorPathWorldBezier(p, parentWorld, { effects: false })));\n\t\t} catch {\n\t\t\t/* unmeasurable: keep the default */\n\t\t}\n\t}\n\treturn longest;\n}\n\n/** How much a shot's `speed` stretches its time (1 / speed; 1 when unset or not above 0). */\nexport function motionShotTimeScale(shot: MotionShot): number {\n\treturn typeof shot.speed === 'number' && shot.speed > 0 && Number.isFinite(shot.speed) ? 1 / shot.speed : 1;\n}\n\n/** How many times a command plays (1 for `enter`, `exit` and `wait`, which do not repeat). */\nexport function motionCommandRepeat(command: MotionCommand): number {\n\tif (command.type === 'wait' || command.type === 'enter' || command.type === 'exit') return 1;\n\tconst n = command.repeat ?? 1;\n\treturn Number.isInteger(n) && n >= 1 ? n : 1;\n}\n\n/** How long one target of a command takes (ms), every repeat included. */\nexport function motionCommandDuration(command: MotionCommand, scene: MotionScene, target?: string): number {\n\treturn motionCycleDuration(command, scene, target) * motionCommandRepeat(command);\n}\n\n/** How long one cycle of a command takes for one target (ms): its `duration`, a spring's settle time, the line's length for a draw, or the type's default. */\nexport function motionCycleDuration(command: MotionCommand, scene: MotionScene, target?: string): number {\n\tif (command.type === 'wait') return command.duration;\n\tif (command.duration !== undefined) return command.duration;\n\tif (command.ease !== undefined) {\n\t\tconst ease = resolveEasing(command.ease);\n\t\tif (ease !== 'hold' && ease.type === 'spring') return springSettleMs(ease);\n\t}\n\tif (command.type === 'draw' || (command.type === 'enter' && command.style === 'draw') || (command.type === 'exit' && command.style === 'undraw')) {\n\t\tconst entry = target ? indexMotionNodes(scene.artwork.nodes).get(target) : undefined;\n\t\tconst length = entry ? motionPathLength(entry.node) : 0;\n\t\tconst ms = length * MOTION_DRAW_MS_PER_UNIT;\n\t\treturn Math.round(Math.min(MOTION_DRAW_RANGE[1], Math.max(MOTION_DRAW_RANGE[0], ms)));\n\t}\n\treturn MOTION_DEFAULT_DURATIONS[command.type];\n}\n\n/** Cubic ease-out, `1 − (1 − t)³` exactly (Flair's `out`): the default for things arriving. */\nexport const MOTION_EASE_OUT: AnimationEasing = { type: 'cubic-bezier', x1: 1 / 3, y1: 1, x2: 2 / 3, y2: 1 };\n/** Cubic ease-in-out (close to Flair's `in-out`): the default for moves. */\nexport const MOTION_EASE_IN_OUT: AnimationEasing = { type: 'cubic-bezier', x1: 0.65, y1: 0, x2: 0.35, y2: 1 };\n\nconst DIRECTION: Record<MotionDirection, { x: number; y: number }> = { up: { x: 0, y: -1 }, down: { x: 0, y: 1 }, left: { x: -1, y: 0 }, right: { x: 1, y: 0 } };\n\nconst timelineCache = new WeakMap<MotionScene, MotionTimeline>();\n\n/**\n * Times every shot and command and turns them into segments. Pure and cached per scene object\n * (treat scenes as immutable). Commands naming unknown nodes are timed but change nothing;\n * `checkMotionScene` reports them.\n */\nexport function compileMotionScene(scene: MotionScene): MotionTimeline {\n\tconst hit = timelineCache.get(scene);\n\tif (hit) return hit;\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst artwork = scene.artwork;\n\n\t// Pass 1: timing.\n\tconst shots: MotionShotTiming[] = [];\n\tconst commands: MotionCommandTiming[] = [];\n\tconst cameraMoves: { shot: string; start: number; end: number; to: MotionRect; ease: AnimationEasing; geometric: boolean }[] = [];\n\tlet t = 0;\n\tscene.shots.forEach((shot, index) => {\n\t\tconst start = t;\n\t\tlet cursor = start;\n\t\t// A shot's speed scales all of its time: camera move, delays, durations, staggers and hold.\n\t\tconst f = motionShotTimeScale(shot);\n\t\tif (shot.camera) {\n\t\t\tconst rect = resolveMotionCamera(shot.camera, scene);\n\t\t\tif (rect && rect.width > 0 && rect.height > 0) {\n\t\t\t\tconst ms = index === 0 ? 0 : (shot.camera.ms ?? MOTION_CAMERA_MS) * f;\n\t\t\t\tcameraMoves.push({ shot: shot.id, start, end: start + ms, to: rect, ease: shot.camera.ease ?? MOTION_EASE_IN_OUT, geometric: shot.camera.geometric === true });\n\t\t\t\tcursor = start + ms;\n\t\t\t}\n\t\t}\n\t\tconst commandsStart = cursor;\n\t\tlet runEnd = cursor;\n\t\tlet prevStart = cursor;\n\t\tshot.run.forEach((command, i) => {\n\t\t\tconst base = command.with === 'previous' && i > 0 ? prevStart : runEnd;\n\t\t\tconst begin = base + (command.type === 'wait' ? 0 : (command.delay ?? 0) * f);\n\t\t\tconst targets = command.type === 'wait' ? [] : command.targets;\n\t\t\tconst durations = command.type === 'wait' ? [command.duration * f] : targets.map((id) => motionCommandDuration(command, scene, id) * f);\n\t\t\tconst stagger = command.type === 'wait' ? 0 : (command.stagger ?? 0) * f;\n\t\t\tconst end = durations.reduce((m, d, k) => Math.max(m, begin + k * stagger + d), begin);\n\t\t\tcommands.push({ shot: shot.id, shotIndex: index, command: i, type: command.type, start: begin, end, duration: durations[0] ?? 0 });\n\t\t\tprevStart = begin;\n\t\t\trunEnd = Math.max(runEnd, end);\n\t\t});\n\t\tconst end = runEnd + (shot.hold ?? MOTION_DEFAULT_HOLD) * f;\n\t\tshots.push({ id: shot.id, index, ...(shot.label ? { label: shot.label } : {}), start, commandsStart, commandsEnd: runEnd, end });\n\t\tt = end;\n\t});\n\n\t// Pass 2: segments, in start order so each `from` is the value its segment starts at.\n\tconst tracks = new Map<string, MotionSegment[]>();\n\tconst segments: MotionSegment[] = [];\n\tconst valueAt = (node: string, property: MotionProperty, time: number): MotionValue => {\n\t\tconst v = trackValue(tracks.get(motionTrackKey(node, property)), time);\n\t\treturn v ?? motionRestValue(nodes.get(node), property, artwork);\n\t};\n\tconst push = (segment: MotionSegment) => {\n\t\tconst key = segment.blend === 'add' ? motionAddTrackKey(segment.node, segment.property) : motionTrackKey(segment.node, segment.property);\n\t\tlet track = tracks.get(key);\n\t\tif (!track) tracks.set(key, (track = []));\n\t\ttrack.push(segment);\n\t\tsegments.push(segment);\n\t};\n\n\ttype Job = { start: number; order: number; run: () => void };\n\tconst jobs: Job[] = [];\n\tlet order = 0;\n\tfor (const move of cameraMoves) {\n\t\tjobs.push({\n\t\t\tstart: move.start,\n\t\t\torder: order++,\n\t\t\trun: () => push({ node: '', property: 'camera', start: move.start, end: move.end, from: valueAt('', 'camera', move.start), to: [move.to.x, move.to.y, move.to.width, move.to.height], ease: move.ease, shot: move.shot, command: -1, ...(move.geometric ? { geometric: true } : {}) })\n\t\t});\n\t}\n\tfor (const timing of commands) {\n\t\tconst shot = scene.shots[timing.shotIndex];\n\t\tconst command = shot.run[timing.command];\n\t\tif (command.type === 'wait') continue;\n\t\tcommand.targets.forEach((target, k) => {\n\t\t\tconst entry = nodes.get(target);\n\t\t\tif (!entry) return;\n\t\t\tconst f = motionShotTimeScale(shot);\n\t\t\tconst start = timing.start + k * (command.stagger ?? 0) * f;\n\t\t\tconst cycle = motionCycleDuration(command, scene, target) * f;\n\t\t\tjobs.push({ start, order: order++, run: () => compileRepeated(command, target, entry, start, cycle, timing) });\n\t\t});\n\t}\n\tjobs.sort((a, b) => a.start - b.start || a.order - b.order).forEach((job) => job.run());\n\n\t/**\n\t * Compiles one cycle, then lays further cycles after it: `loop` restarts each from the first\n\t * cycle's start, `mirror` plays every other one backwards, `offset` carries numbers on from\n\t * where the last ended. Stepped time goes on every segment the command makes.\n\t */\n\tfunction compileRepeated(command: Exclude<MotionCommand, { type: 'wait' }>, node: string, entry: MotionNodeEntry, start: number, cycle: number, timing: MotionCommandTiming) {\n\t\tconst first = segments.length;\n\t\tcompileCommand(command, node, entry, start, cycle, timing);\n\t\tconst made = segments.slice(first);\n\t\tconst steps = command.steps ?? scene.steps;\n\t\tif (steps && steps > 0) for (const s of made) s.steps = steps;\n\t\tconst n = motionCommandRepeat(command);\n\t\tconst mode = command.repeatMode ?? 'loop';\n\t\tconst shift = (v: MotionValue, by: MotionValue, k: number): MotionValue => {\n\t\t\tif (typeof v === 'number' && typeof by === 'number') return v + by * k;\n\t\t\tif (Array.isArray(v) && Array.isArray(by) && v.length === by.length) return v.map((x, i) => x + (by[i] as number) * k);\n\t\t\treturn v;\n\t\t};\n\t\tfor (let k = 1; k < n; k++) {\n\t\t\tconst at = start + k * cycle;\n\t\t\tfor (const s of made) {\n\t\t\t\tif (mode === 'mirror' && k % 2 === 1) {\n\t\t\t\t\tpush({ ...s, start: at + (start + cycle - s.end), end: at + (start + cycle - s.start), reverse: !s.reverse });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst delta: MotionValue = typeof s.from === 'number' && typeof s.to === 'number' ? s.to - s.from : Array.isArray(s.from) && Array.isArray(s.to) && s.from.length === s.to.length ? s.to.map((x, i) => (x as number) - (s.from as number[])[i]) : 0;\n\t\t\t\tconst by = mode === 'offset' ? delta : 0;\n\t\t\t\tpush({ ...s, start: at + (s.start - start), end: at + (s.end - start), from: shift(s.from, by, k), to: shift(s.to, by, k) });\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction compileCommand(command: Exclude<MotionCommand, { type: 'wait' }>, node: string, entry: MotionNodeEntry, start: number, duration: number, timing: MotionCommandTiming) {\n\t\tconst end = start + duration;\n\t\tconst where = { shot: timing.shot, command: timing.command };\n\t\tconst seg = (property: MotionProperty, to: MotionValue, ease: AnimationEasing, s = start, e = end, extra: Partial<MotionSegment> = {}) =>\n\t\t\tpush({ node, property, start: s, end: e, from: extra.from ?? valueAt(node, property, s), to, ease, ...where, ...extra });\n\t\tconst rest = (p: MotionProperty) => motionRestValue(entry, p, artwork);\n\t\tconst num = (p: MotionProperty, time = start) => {\n\t\t\tconst v = valueAt(node, p, time);\n\t\t\treturn typeof v === 'number' ? v : 0;\n\t\t};\n\t\tconst ease = command.ease;\n\t\tswitch (command.type) {\n\t\t\tcase 'enter': {\n\t\t\t\tconst style = command.style ?? 'fade';\n\t\t\t\tconst opacity = rest('opacity');\n\t\t\t\tconst reveal =\n\t\t\t\t\tstyle === 'wipe' ? motionRevealClip(entry, { style, direction: command.direction }) : style === 'iris' ? motionRevealClip(entry, { style, shape: command.shape }) : style === 'split' ? motionRevealClip(entry, { style, orientation: command.orientation }) : null;\n\t\t\t\t// An earlier reveal or wipe out leaves its clip; entering opens it again, at once.\n\t\t\t\tfor (const p of ['clipRect', 'clipCircle'] as const) if (p !== reveal?.property && tracks.has(motionTrackKey(node, p))) seg(p, rest(p), 'linear', start, start);\n\t\t\t\tif (reveal) {\n\t\t\t\t\t// The clip reveals. Opacity is set at once too, so a node faded out before shows again,\n\t\t\t\t\t// and a later fade in (whose start would hold back to time 0) leaves this one alone.\n\t\t\t\t\tseg('opacity', opacity, 'linear', start, start);\n\t\t\t\t\tseg(reveal.property, reveal.to, ease ?? MOTION_EASE_OUT, start, end, { from: reveal.from });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (style === 'draw') {\n\t\t\t\t\tseg('drawEnd', 1, ease ?? MOTION_EASE_IN_OUT, start, start + duration * 0.75, { from: 0 });\n\t\t\t\t\tseg('fillOpacity', 1, MOTION_EASE_OUT, start + duration * 0.6, end, { from: 0 });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (style === 'pop' || style === 'zoom') {\n\t\t\t\t\tconst from = command.scale ?? (style === 'pop' ? 0.5 : 1.6);\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * (style === 'pop' ? 0.4 : 0.5), { from: 0 });\n\t\t\t\t\tseg('scaleX', 1, ease ?? (style === 'pop' ? 'ease-out-back' : MOTION_EASE_OUT), start, end, { from });\n\t\t\t\t\tseg('scaleY', 1, ease ?? (style === 'pop' ? 'ease-out-back' : MOTION_EASE_OUT), start, end, { from });\n\t\t\t\t} else if (style === 'rise') {\n\t\t\t\t\tconst y = num('y');\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * 0.5, { from: 0 });\n\t\t\t\t\tseg('y', y, ease ?? 'ease-out-back', start, end, { from: y + (command.distance ?? 20) });\n\t\t\t\t} else if (style === 'grow') {\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * 0.3, { from: 0 });\n\t\t\t\t\tseg('scaleX', 1, ease ?? MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t\tseg('scaleY', 1, ease ?? MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t} else if (style === 'slide') {\n\t\t\t\t\tconst dir = DIRECTION[command.direction ?? 'up'];\n\t\t\t\t\tconst distance = command.distance ?? 40;\n\t\t\t\t\tconst x = num('x');\n\t\t\t\t\tconst y = num('y');\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t\tseg('x', x, ease ?? MOTION_EASE_OUT, start, end, { from: x - dir.x * distance });\n\t\t\t\t\tseg('y', y, ease ?? MOTION_EASE_OUT, start, end, { from: y - dir.y * distance });\n\t\t\t\t} else seg('opacity', opacity, ease ?? MOTION_EASE_OUT, start, end, { from: 0 }); // fade, and a reveal of a node with no box\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'exit': {\n\t\t\t\tconst style = command.style ?? 'fade';\n\t\t\t\tconst wipe = style === 'wipe' ? motionRevealClip(entry, { style, direction: command.direction, hide: true }) : null;\n\t\t\t\tif (wipe) seg(wipe.property, wipe.to, ease ?? 'ease-in', start, end, { from: wipe.from });\n\t\t\t\telse if (style === 'undraw') {\n\t\t\t\t\tseg('fillOpacity', 0, 'ease-in', start, start + duration * 0.4);\n\t\t\t\t\tseg('drawEnd', 0, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\t} else if (style === 'shrink') {\n\t\t\t\t\tseg('scaleX', 0, ease ?? 'ease-in');\n\t\t\t\t\tseg('scaleY', 0, ease ?? 'ease-in');\n\t\t\t\t\tseg('opacity', 0, 'ease-in', start + duration * 0.6, end);\n\t\t\t\t} else if (style === 'slide') {\n\t\t\t\t\tconst dir = DIRECTION[command.direction ?? 'down'];\n\t\t\t\t\tconst distance = command.distance ?? 40;\n\t\t\t\t\tseg('x', num('x') + dir.x * distance, ease ?? 'ease-in');\n\t\t\t\t\tseg('y', num('y') + dir.y * distance, ease ?? 'ease-in');\n\t\t\t\t\tseg('opacity', 0, ease ?? 'ease-in');\n\t\t\t\t} else seg('opacity', 0, ease ?? 'ease-in'); // fade, and a wipe of a node with no box\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'draw': {\n\t\t\t\t// A stroke not drawn before draws on from nothing (and is hidden until then).\n\t\t\t\tconst drawn = tracks.has(motionTrackKey(node, 'drawEnd'));\n\t\t\t\tseg('drawEnd', command.to ?? 1, ease ?? MOTION_EASE_IN_OUT, start, end, command.from !== undefined ? { from: command.from } : drawn ? {} : { from: 0 });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'move': {\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tlet dx = command.by?.x ?? 0;\n\t\t\t\tlet dy = command.by?.y ?? 0;\n\t\t\t\tif (command.to) {\n\t\t\t\t\t// The centre lands on `to` (document space): convert the remaining offset to the parent's space.\n\t\t\t\t\tconst inv = invertMatrix(entry.parentWorld);\n\t\t\t\t\tconst target = applyMatrix(inv, command.to);\n\t\t\t\t\tdx = target.x - (entry.center.x + num('x'));\n\t\t\t\t\tdy = target.y - (entry.center.y + num('y'));\n\t\t\t\t}\n\t\t\t\tif (command.blend === 'add') {\n\t\t\t\t\tseg('x', dx, e, start, end, { from: 0, blend: 'add' });\n\t\t\t\t\tseg('y', dy, e, start, end, { from: 0, blend: 'add' });\n\t\t\t\t} else {\n\t\t\t\t\tseg('x', num('x') + dx, e);\n\t\t\t\t\tseg('y', num('y') + dy, e);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'rotate': {\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tif (command.blend === 'add') seg('rotation', command.to !== undefined ? command.to - num('rotation') : (command.by ?? 0), e, start, end, { from: 0, blend: 'add' });\n\t\t\t\telse seg('rotation', command.to ?? num('rotation') + (command.by ?? 0), e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'scale': {\n\t\t\t\tconst to = typeof command.to === 'number' ? { x: command.to, y: command.to } : command.to;\n\t\t\t\tconst extra = { ...(command.geometric ? { geometric: true } : {}), ...(command.blend === 'add' ? { from: 1, blend: 'add' as const } : {}) };\n\t\t\t\tseg('scaleX', to.x, ease ?? MOTION_EASE_IN_OUT, start, end, extra);\n\t\t\t\tseg('scaleY', to.y, ease ?? MOTION_EASE_IN_OUT, start, end, extra);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'fade':\n\t\t\t\tseg('opacity', command.to, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'style':\n\t\t\t\tif (command.fill !== undefined) seg('fill', command.fill, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tif (command.stroke !== undefined) seg('stroke', command.stroke, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tif (command.strokeWidth !== undefined) seg('strokeWidth', command.strokeWidth, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'morph':\n\t\t\t\tseg('shape', command.into, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'match': {\n\t\t\t\t// Smart Animate: each part morphs into its partner in `into`; parts with no partner fade out.\n\t\t\t\tconst into = nodes.get(command.into);\n\t\t\t\tif (!into || command.into === node) break;\n\t\t\t\tconst match = matchMotionNodes(entry.node, into.node);\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tfor (const [a, b] of match.pairs) push({ node: a, property: 'shape', start, end, from: valueAt(a, 'shape', start), to: b, ease: e, ...where });\n\t\t\t\tfor (const a of match.unpairedFrom) push({ node: a, property: 'opacity', start, end, from: valueAt(a, 'opacity', start), to: 0, ease: e, ...where });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'follow':\n\t\t\t\tseg('follow', command.to ?? 1, ease ?? MOTION_EASE_IN_OUT, start, end, { from: command.from ?? 0, path: command.path, rotate: command.rotate ?? false });\n\t\t\t\tbreak;\n\t\t\t// Emphasis: a change toward a peak that a behaviour swings round (as Flair's primitives do).\n\t\t\tcase 'pulse':\n\t\t\tcase 'shake':\n\t\t\tcase 'teeter':\n\t\t\tcase 'wave':\n\t\t\tcase 'wiggle': {\n\t\t\t\t// Emphasis is a layer over the pose by default (blend \"add\"), so it rides on a move or turn under way.\n\t\t\t\tconst add = (command.blend ?? 'add') === 'add';\n\t\t\t\t// A change of `by` (offsets, turns) or by a factor (scales), as a layer or on the pose.\n\t\t\t\tconst swing = (p: MotionProperty, by: number, extra: Partial<MotionSegment>) => {\n\t\t\t\t\tconst scale = p === 'scaleX' || p === 'scaleY';\n\t\t\t\t\tif (add) seg(p, by, ease ?? 'linear', start, end, { from: scale ? 1 : 0, blend: 'add', ...extra });\n\t\t\t\t\telse seg(p, scale ? num(p) * by : num(p) + by, ease ?? 'linear', start, end, extra);\n\t\t\t\t};\n\t\t\t\tif (command.type === 'pulse') {\n\t\t\t\t\tconst behavior: MotionBehavior = { type: 'pulse', count: command.count ?? 1 };\n\t\t\t\t\tswing('scaleX', 1 + (command.amount ?? 0.15), { behavior });\n\t\t\t\t\tswing('scaleY', 1 + (command.amount ?? 0.15), { behavior });\n\t\t\t\t} else if (command.type === 'shake') swing(command.axis === 'vertical' ? 'y' : 'x', command.amount ?? 8, { behavior: { type: 'oscillate', count: command.count ?? 3, decay: 1 } });\n\t\t\t\telse if (command.type === 'teeter') swing('rotation', command.angle ?? 8, { behavior: { type: 'oscillate', count: command.count ?? 3, decay: 1 } });\n\t\t\t\telse if (command.type === 'wave') swing('y', -(command.amount ?? 6), { behavior: { type: 'oscillate', count: command.count ?? 2 } });\n\t\t\t\telse {\n\t\t\t\t\tconst behavior: MotionBehavior = { type: 'wriggle', frequency: command.frequency ?? 3, octaves: command.octaves ?? 2, seed: command.seed || motionSeedFromId(node) };\n\t\t\t\t\tconst amount = command.amount ?? 6;\n\t\t\t\t\tswing('x', amount, { behavior, index: 0 });\n\t\t\t\t\tswing('y', amount, { behavior, index: 1 });\n\t\t\t\t\tif (command.rotate) swing('rotation', command.rotate, { behavior, index: 2 });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'color-pulse':\n\t\t\t\tseg(command.paint ?? 'fill', command.color ?? '#f59e0b', ease ?? 'linear', start, end, { behavior: { type: 'pulse', count: command.count ?? 1 } });\n\t\t\t\tbreak;\n\t\t\tcase 'effect':\n\t\t\t\tseg(`effect:${command.effect}:${command.param}`, command.to, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (const track of tracks.values()) track.sort((a, b) => a.start - b.start);\n\tsegments.sort((a, b) => a.start - b.start);\n\tconst duration = shots.length ? shots[shots.length - 1].end : 0;\n\tconst timeline: MotionTimeline = { duration, shots, commands, segments, tracks };\n\ttimelineCache.set(scene, timeline);\n\treturn timeline;\n}\n\n/** The shot playing at `time` (the last one at the end). */\nexport function motionShotAt(timeline: MotionTimeline, time: number): MotionShotTiming | undefined {\n\treturn timeline.shots.find((s) => time < s.end) ?? timeline.shots[timeline.shots.length - 1];\n}\n","import { normalizeTokenColor, hexToRgba, rgbaToHex } from '../tokens/color.js';\nimport { createVectorMorph, type VectorMorph } from '../vector/blend.js';\nimport { bezierPathLength, bezierPathPointAtLength, transformBezierPath, type BezierPath } from '../canvas/pathops/bezier.js';\nimport { createVectorEffect } from '../vector/appearance.js';\nimport { invertMatrix, multiplyMatrices, nodeMatrix, rotateMatrix, scaleMatrix, translateMatrix, vectorPathWorldBezier, isIdentityMatrix, type AffineMatrix } from '../vector/geometry.js';\nimport { vectorDocumentToSvg, type VectorSvgExportOptions, type VectorSvgWrapper } from '../vector/svg.js';\nimport type { VectorDocument, VectorEffect, VectorGradient, VectorNode, VectorPaint, VectorPathNode } from '../vector/types.js';\nimport { activeSegment, compileMotionScene, indexMotionNodes, motionAddTrackKey, motionTrackKey, withMotionLayers, segmentProgress, trackValue, type MotionNodeEntry, type MotionProperty, type MotionTimeline } from './compile.js';\nimport type { MotionRect, MotionScene } from './types.js';\n\n/**\n * A reveal clip (`wipe`, `iris`, `split`) in the units of the node's own box: 0–1 across it,\n * as SVG's `clipPathUnits=\"objectBoundingBox\"` and Flair's clip reveals are.\n */\nexport type MotionClipShape = { shape: 'rect'; x: number; y: number; width: number; height: number } | { shape: 'circle'; cx: number; cy: number; r: number };\n\n/** The artwork as it stands at one time, and where the camera looks. */\nexport interface MotionFrame {\n\ttime: number;\n\tdocument: VectorDocument;\n\tcamera: MotionRect;\n\t/**\n\t * Reveal clips by node id, outermost first: draw each of those nodes inside a group clipped\n\t * to each shape (`motionFrameToSvg` does). The vector model has no clips, so they ride here.\n\t */\n\tclips: Record<string, MotionClipShape[]>;\n}\n\nexport interface MotionFrameOptions {\n\t/** Control values (`{ accent: \"#0ea5e9\" }`): each recolours its control's default colour. */\n\tvalues?: Record<string, string>;\n\t/** Draw-on as a Trim Paths effect (default true). Off leaves strokes whole. */\n\tdraw?: boolean;\n\t/** Apply moves, turns, scales and follows (default true). Off leaves nodes where they rest. */\n\toffsets?: boolean;\n}\n\n/** Id of the trim effect that draws strokes on. */\nexport const MOTION_DRAW_EFFECT_ID = '~draw';\n\nconst TRANSFORM_PROPS: MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY', 'follow'];\nconst tidy = (v: number) => Math.round(v * 1e6) / 1e6 || 0;\n\n/** A copy of the scene with each control's default colour replaced by its value (exact, case-insensitive matches). */\nexport function applyMotionControlValues(scene: MotionScene, values: Record<string, string> | undefined): MotionScene {\n\tif (!values || !scene.controls?.length) return scene;\n\tconst map = new Map<string, string>();\n\tfor (const control of scene.controls) {\n\t\tconst value = values[control.name];\n\t\tif (typeof value === 'string' && normalizeTokenColor(value) !== null) map.set(control.default.toLowerCase(), value);\n\t}\n\tif (!map.size) return scene;\n\tconst walk = (v: unknown): unknown => {\n\t\tif (typeof v === 'string') return map.get(v.toLowerCase()) ?? v;\n\t\tif (Array.isArray(v)) return v.map(walk);\n\t\tif (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, walk(x)]));\n\t\treturn v;\n\t};\n\treturn { ...scene, artwork: walk(scene.artwork) as VectorDocument, shots: walk(scene.shots) as MotionScene['shots'] };\n}\n\n/** `color` with its alpha multiplied by `alpha` (as `#rrggbbaa`), or `color` when unreadable. */\nfunction fadeColor(color: string, alpha: number): string {\n\tconst hex = normalizeTokenColor(color);\n\tif (hex === null) return color;\n\tconst c = hexToRgba(hex)!;\n\treturn rgbaToHex(c.r, c.g, c.b, c.a * alpha);\n}\n\nfunction fadePaint(paint: VectorPaint | undefined, alpha: number): VectorPaint | undefined {\n\tif (alpha >= 1 || paint == null || paint === 'none') return paint;\n\tif (typeof paint === 'string') return fadeColor(paint, alpha);\n\tif ('stops' in paint && Array.isArray(paint.stops)) return { ...(paint as VectorGradient), stops: paint.stops.map((s) => ({ ...s, opacity: (s.opacity ?? 1) * alpha })) } as VectorGradient;\n\treturn paint;\n}\n\n/** Applies `fn` to the node if it is a path, else to every path inside it. */\nfunction mapPaths(node: VectorNode, fn: (path: VectorPathNode) => VectorPathNode): VectorNode {\n\tif (node.type === 'path') return fn(node);\n\treturn { ...node, children: node.children.map((c) => mapPaths(c, fn)) };\n}\n\nconst morphCache = new WeakMap<VectorNode, WeakMap<VectorNode, VectorMorph>>();\nfunction morphBetween(a: VectorNode, b: VectorNode): VectorMorph {\n\tlet inner = morphCache.get(a);\n\tif (!inner) morphCache.set(a, (inner = new WeakMap()));\n\tlet morph = inner.get(b);\n\tif (!morph) inner.set(b, (morph = createVectorMorph(a, b, { id: a.id })));\n\treturn morph;\n}\n\n/** A shape node by id as it rests in its own parent, mapped into `entry`'s parent space. */\nfunction shapeIn(entry: MotionNodeEntry, shape: MotionNodeEntry): VectorNode {\n\tif (shape === entry) return entry.node;\n\tconst m = multiplyMatrices(multiplyMatrices(nodeMatrix(shape.node), shape.parentWorld), invertMatrix(entry.parentWorld));\n\treturn { ...shape.node, ...(isIdentityMatrix(m) ? { transform: undefined } : { transform: m as VectorNode['transform'] }) } as VectorNode;\n}\n\n/** The node's own shape at `time` (a morph in progress, or the shape it last became). */\nfunction shapeAt(entry: MotionNodeEntry, timeline: MotionTimeline, nodes: Map<string, MotionNodeEntry>, time: number): VectorNode | null {\n\tconst track = timeline.tracks.get(motionTrackKey(entry.node.id, 'shape'));\n\tif (!track?.length) return null;\n\tconst s = activeSegment(track, time);\n\tconst fromId = String(s ? s.from : track[0].from);\n\tif (!s) return fromId === entry.node.id ? null : (nodes.get(fromId) ? shapeIn(entry, nodes.get(fromId)!) : null);\n\tconst a = nodes.get(fromId);\n\tconst b = nodes.get(String(s.to));\n\tif (!a || !b) return null;\n\tconst { eased } = segmentProgress(s, time);\n\tconst u = Math.min(1, Math.max(0, eased));\n\tif (u <= 0) return a === entry ? null : shapeIn(entry, a);\n\tif (u >= 1) return b === entry ? null : shapeIn(entry, b);\n\treturn morphBetween(shapeIn(entry, a), shapeIn(entry, b)).at(u);\n}\n\n/**\n * The path a node follows, in the node's parent's space (live effects left off), or null when\n * `path` is not a path or cannot be measured. Lengths and turns along it are measured there.\n */\nexport function motionFollowRoute(entry: MotionNodeEntry, path: MotionNodeEntry | undefined): BezierPath | null {\n\tif (!path || path.node.type !== 'path') return null;\n\ttry {\n\t\treturn transformBezierPath(vectorPathWorldBezier(path.node, path.parentWorld, { effects: false }), invertMatrix(entry.parentWorld));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Where a follow puts the node's centre (parent space), and the path's angle there in degrees. */\nfunction followAt(entry: MotionNodeEntry, timeline: MotionTimeline, nodes: Map<string, MotionNodeEntry>, time: number): { x: number; y: number; angle: number } | null {\n\tconst track = timeline.tracks.get(motionTrackKey(entry.node.id, 'follow'));\n\tconst s = activeSegment(track, time) ?? track?.[0];\n\tif (!s?.path) return null;\n\tconst route = motionFollowRoute(entry, nodes.get(s.path));\n\tconst progress = Number(trackValue(track, time));\n\tif (!route || !(progress >= 0)) return null;\n\ttry {\n\t\tconst at = bezierPathPointAtLength(route, Math.min(1, Math.max(0, progress)) * bezierPathLength(route));\n\t\tif (!at) return null;\n\t\treturn { x: at.point[0], y: at.point[1], angle: s.rotate ? (at.angle * 180) / Math.PI : 0 };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * The transform a node's offsets, turn, scale and follow add (parent space), or null when none:\n * scaled and turned about its centre, offset by `dx`, `dy`, then (following a path) its centre\n * carried to the point on the path and turned with it, as Flair's `along` carries a wrapper.\n * `raw` ignores behaviours (the pose a pulse or shake swings towards, as Flair is given it);\n * `follow: false` leaves the follow out (`dx` … `scaleY` never include it).\n */\nexport function motionNodeOffset(\n\tentry: MotionNodeEntry,\n\ttimeline: MotionTimeline,\n\ttime: number,\n\tnodes = indexMotionNodes([entry.node]),\n\traw = false,\n\tfollow = true\n): { matrix: AffineMatrix; dx: number; dy: number; rotation: number; scaleX: number; scaleY: number; follow: { x: number; y: number; angle: number } | null } | null {\n\t// The pose, with any additive layers (emphasis, blend \"add\") on top.\n\tconst read = (p: MotionProperty, rest: number) => {\n\t\tconst v = trackValue(timeline.tracks.get(motionTrackKey(entry.node.id, p)), time, raw);\n\t\treturn withMotionLayers(timeline, entry.node.id, p, typeof v === 'number' ? v : rest, time, raw);\n\t};\n\tif (!TRANSFORM_PROPS.some((p) => (follow || p !== 'follow') && (timeline.tracks.has(motionTrackKey(entry.node.id, p)) || timeline.tracks.has(motionAddTrackKey(entry.node.id, p))))) return null;\n\tconst dx = read('x', 0);\n\tconst dy = read('y', 0);\n\tconst rotation = read('rotation', 0);\n\tconst scaleX = read('scaleX', 1);\n\tconst scaleY = read('scaleY', 1);\n\tconst c = entry.center;\n\tlet matrix = multiplyMatrices(multiplyMatrices(scaleMatrix(scaleX, scaleY, c), rotateMatrix(rotation, c)), translateMatrix(dx, dy));\n\tconst along = follow ? followAt(entry, timeline, nodes, time) : null;\n\tif (along) matrix = multiplyMatrices(matrix, multiplyMatrices(multiplyMatrices(translateMatrix(-c.x, -c.y), rotateMatrix(along.angle)), translateMatrix(along.x, along.y)));\n\treturn { matrix, dx, dy, rotation, scaleX, scaleY, follow: along };\n}\n\n/** A node's reveal clips at `time`, outermost first (rect, then circle), with sizes kept ≥ 0. */\nexport function motionNodeClips(id: string, timeline: MotionTimeline, time: number): MotionClipShape[] {\n\tconst out: MotionClipShape[] = [];\n\tconst rect = trackValue(timeline.tracks.get(motionTrackKey(id, 'clipRect')), time);\n\tif (Array.isArray(rect) && rect.length === 4) out.push({ shape: 'rect', x: tidy(rect[0]), y: tidy(rect[1]), width: Math.max(0, tidy(rect[2])), height: Math.max(0, tidy(rect[3])) });\n\tconst circle = trackValue(timeline.tracks.get(motionTrackKey(id, 'clipCircle')), time);\n\tif (Array.isArray(circle) && circle.length === 3) out.push({ shape: 'circle', cx: tidy(circle[0]), cy: tidy(circle[1]), r: Math.max(0, tidy(circle[2])) });\n\treturn out;\n}\n\n/**\n * The scene at `time` (ms): the artwork with every change applied, and the camera. A pure\n * function of time, so frames can be drawn in any order (and the same frames come out every time).\n */\nexport function motionFrameAt(scene: MotionScene, time: number, options: MotionFrameOptions = {}): MotionFrame {\n\tconst s = applyMotionControlValues(scene, options.values);\n\tconst timeline = compileMotionScene(s);\n\tconst nodes = indexMotionNodes(s.artwork.nodes);\n\tconst drawOn = options.draw !== false;\n\tconst value = (id: string, p: MotionProperty) => trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\tconst animated = new Set(timeline.segments.map((seg) => seg.node));\n\tconst clips: Record<string, MotionClipShape[]> = {};\n\n\tconst visit = (node: VectorNode): VectorNode => {\n\t\tlet out: VectorNode = node.type === 'group' ? { ...node, children: node.children.map(visit) } : node;\n\t\tif (!animated.has(node.id)) return out;\n\t\tconst entry = nodes.get(node.id);\n\t\tif (!entry) return out;\n\t\tconst id = node.id;\n\t\tconst clip = motionNodeClips(id, timeline, time);\n\t\tif (clip.length) clips[id] = clip;\n\n\t\tconst shape = shapeAt(entry, timeline, nodes, time);\n\t\tif (shape) {\n\t\t\tconst { name, visible, opacity, locked } = node;\n\t\t\tout = { ...shape, id, ...(name ? { name } : {}), ...(locked ? { locked } : {}), visible, ...(opacity !== undefined ? { opacity } : {}) } as VectorNode;\n\t\t\tif (out.visible === undefined) delete out.visible;\n\t\t}\n\n\t\t// Live path effect parameters.\n\t\tconst effectTracks = [...timeline.tracks.keys()].filter((k) => k.startsWith(`${id}\\u0000effect:`));\n\t\tif (effectTracks.length && out.effects?.length) {\n\t\t\tout = {\n\t\t\t\t...out,\n\t\t\t\teffects: out.effects.map((effect) => {\n\t\t\t\t\tlet params = effect.params as unknown as Record<string, unknown>;\n\t\t\t\t\tfor (const key of effectTracks) {\n\t\t\t\t\t\tconst [, effectId, param] = key.split('\\u0000')[1].split(':');\n\t\t\t\t\t\tif (effectId !== effect.id) continue;\n\t\t\t\t\t\tconst v = trackValue(timeline.tracks.get(key), time);\n\t\t\t\t\t\tif (typeof v === 'number') params = { ...params, [param]: v };\n\t\t\t\t\t}\n\t\t\t\t\treturn params === (effect.params as unknown) ? effect : ({ ...effect, params } as VectorEffect);\n\t\t\t\t})\n\t\t\t};\n\t\t}\n\n\t\tconst fill = value(id, 'fill');\n\t\tconst stroke = value(id, 'stroke');\n\t\tconst strokeWidth = value(id, 'strokeWidth');\n\t\tconst fillOpacity = value(id, 'fillOpacity');\n\t\tconst drawStart = value(id, 'drawStart');\n\t\tconst drawEnd = value(id, 'drawEnd');\n\t\tconst draw = drawOn && (drawStart !== undefined || drawEnd !== undefined);\n\t\tif (fill !== undefined || stroke !== undefined || strokeWidth !== undefined || fillOpacity !== undefined || draw) {\n\t\t\tout = mapPaths(out, (path) => {\n\t\t\t\tlet p: VectorPathNode = path;\n\t\t\t\tif (typeof fill === 'string') p = { ...p, fill };\n\t\t\t\tif (typeof stroke === 'string') p = { ...p, stroke };\n\t\t\t\tif (typeof strokeWidth === 'number') p = { ...p, strokeWidth: Math.max(0, tidy(strokeWidth)) };\n\t\t\t\tif (typeof fillOpacity === 'number' && fillOpacity < 1) p = { ...p, fill: fadePaint(p.fill, Math.max(0, fillOpacity)) };\n\t\t\t\tif (draw) {\n\t\t\t\t\tconst start = Math.min(1, Math.max(0, typeof drawStart === 'number' ? drawStart : 0));\n\t\t\t\t\tconst end = Math.min(1, Math.max(0, typeof drawEnd === 'number' ? drawEnd : 1));\n\t\t\t\t\tif (start > 0 || end < 1) {\n\t\t\t\t\t\tconst trim = createVectorEffect('trim', MOTION_DRAW_EFFECT_ID, { start: tidy(start * 100), end: tidy(end * 100) })!;\n\t\t\t\t\t\tp = { ...p, effects: [trim, ...(p.effects ?? []).filter((e) => e.id !== MOTION_DRAW_EFFECT_ID)] };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn p;\n\t\t\t});\n\t\t}\n\n\t\tconst opacity = value(id, 'opacity');\n\t\tif (typeof opacity === 'number') {\n\t\t\tconst o = Math.min(1, Math.max(0, tidy(opacity)));\n\t\t\tout = { ...out, opacity: o };\n\t\t\tif (o >= 1) delete out.opacity;\n\t\t}\n\n\t\tconst offset = options.offsets === false ? null : motionNodeOffset(entry, timeline, time, nodes);\n\t\tif (offset && !isIdentityMatrix(offset.matrix)) {\n\t\t\tconst m = multiplyMatrices(nodeMatrix(out), offset.matrix).map(tidy) as unknown as VectorNode['transform'];\n\t\t\tout = { ...out, transform: m };\n\t\t}\n\t\treturn out;\n\t};\n\n\tconst document: VectorDocument = { ...s.artwork, nodes: s.artwork.nodes.map(visit) };\n\tconst cam = trackValue(timeline.tracks.get(motionTrackKey('', 'camera')), time);\n\tconst box = Array.isArray(cam) ? cam : [0, 0, s.artwork.width, s.artwork.height];\n\treturn { time, document, camera: { x: tidy(box[0]), y: tidy(box[1]), width: tidy(box[2]), height: tidy(box[3]) }, clips };\n}\n\nexport interface MotionSvgOptions extends MotionFrameOptions, VectorSvgExportOptions {}\n\n/** A clip shape's SVG attributes. */\nexport function motionClipAttrs(clip: MotionClipShape): Record<string, number> {\n\tconst { shape: _shape, ...attrs } = clip;\n\treturn attrs;\n}\n\n/** The scene at `time` as a standalone SVG (the camera becomes the `viewBox`, reveal clips wrap their nodes). */\nexport function motionFrameToSvg(scene: MotionScene, time: number, options: MotionSvgOptions = {}): string {\n\tconst frame = motionFrameAt(scene, time, options);\n\tconst prefix = options.idPrefix ?? 'vg-';\n\tconst wrap: Record<string, readonly VectorSvgWrapper[]> = { ...options.wrap };\n\tfor (const [id, clips] of Object.entries(frame.clips))\n\t\twrap[id] = [...(wrap[id] ?? []), ...clips.map((clip, i) => ({ clip: { id: `${prefix}reveal-${id}-${i}`, shape: clip.shape, attrs: motionClipAttrs(clip) } }))];\n\treturn withViewBox(vectorDocumentToSvg(frame.document, { ...options, wrap }), frame.camera);\n}\n\n/** Replaces the root `viewBox` of an SVG string. */\nexport function withViewBox(svg: string, box: MotionRect): string {\n\tconst f = (n: number) => String(Math.round(n * 1000) / 1000);\n\treturn svg.replace(/viewBox=\"[^\"]*\"/, `viewBox=\"${f(box.x)} ${f(box.y)} ${f(box.width)} ${f(box.height)}\"`);\n}\n","import { resolveEasing, springSettleMs } from '../animation/easing.js';\nimport { matchMotionNodes } from './match.js';\nimport { normalizeTokenColor } from '../tokens/color.js';\nimport { collectPathNodes } from '../vector/geometry.js';\nimport type { VectorNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes, motionRevealPadding, motionTrackKey, trackValue, type MotionTimeline } from './compile.js';\nimport { motionFrameAt } from './evaluate.js';\nimport { motionIssue, namedWithSuggestion, type MotionIssue } from './issues.js';\nimport type { MotionCommand, MotionScene } from './types.js';\n\n/** Changes shorter than this (ms) are too quick to follow. */\nexport const MOTION_MIN_CHANGE_MS = 120;\n\nconst NUMERIC_PARAMS = (node: VectorNode, effectId: string): string[] | null => {\n\tconst effect = node.effects?.find((e) => e.id === effectId);\n\tif (!effect) return null;\n\treturn Object.entries(effect.params as unknown as Record<string, unknown>)\n\t\t.filter(([, v]) => typeof v === 'number')\n\t\t.map(([k]) => k);\n};\n\nfunction usesColor(scene: MotionScene, color: string): boolean {\n\tconst target = color.toLowerCase();\n\tlet found = false;\n\tconst walk = (v: unknown) => {\n\t\tif (found) return;\n\t\tif (typeof v === 'string') found = v.toLowerCase() === target;\n\t\telse if (Array.isArray(v)) v.forEach(walk);\n\t\telse if (v && typeof v === 'object') Object.values(v).forEach(walk);\n\t};\n\twalk(scene.artwork);\n\twalk(scene.shots);\n\treturn found;\n}\n\nfunction visibleAt(timeline: MotionTimeline, id: string, time: number, node: VectorNode): boolean {\n\tconst num = (p: Parameters<typeof motionTrackKey>[1], rest: number) => {\n\t\tconst v = trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\t\treturn typeof v === 'number' ? v : rest;\n\t};\n\tif (node.visible === false) return false;\n\tif (num('opacity', node.opacity ?? 1) <= 0.01) return false;\n\tif (Math.abs(num('scaleX', 1) * num('scaleY', 1)) <= 1e-4) return false;\n\t// A reveal clip with no area (before a wipe in, after a wipe out).\n\tconst clip = (p: 'clipRect' | 'clipCircle') => trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\tconst rect = clip('clipRect');\n\tif (Array.isArray(rect) && (rect[2] <= 1e-4 || rect[3] <= 1e-4)) return false;\n\tconst circle = clip('clipCircle');\n\tif (Array.isArray(circle) && circle[2] <= 1e-4) return false;\n\tconst hasFill = node.type === 'path' ? !!node.fill && node.fill !== 'none' : collectPathNodes(node).some((p) => p.fill && p.fill !== 'none');\n\treturn num('drawEnd', 1) > 0.01 || (hasFill && num('fillOpacity', 1) > 0.01);\n}\n\n/**\n * What is wrong with a scene's meaning: unknown ids (with a \"did you mean\"), timing that\n * fights itself, things animated while hidden or off camera, and lengths outside the target.\n * The scene must be well formed (see `parseMotionScene`).\n */\nexport function checkMotionScene(scene: MotionScene): MotionIssue[] {\n\tconst issues: MotionIssue[] = [];\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst ids = [...nodes.keys()];\n\tconst timeline = compileMotionScene(scene);\n\tconst artAspect = scene.artwork.width / scene.artwork.height;\n\n\tif (!scene.shots.length) issues.push(motionIssue('no-shots', 'The scene has no shots yet; add one with a list of commands.'));\n\tconst seen = new Set<string>();\n\tfor (const shot of scene.shots) {\n\t\tif (seen.has(shot.id)) issues.push(motionIssue('duplicate-shot-id', `Shot id \"${shot.id}\" is used twice; give each shot its own id.`, { shot: shot.id }));\n\t\tseen.add(shot.id);\n\t}\n\n\tconst known = (id: string, code: 'unknown-target' | 'unknown-path' | 'unknown-shape' | 'unknown-frame', what: string, where: { shot: string; command?: number }) => {\n\t\tif (nodes.has(id)) return true;\n\t\tissues.push(motionIssue(code, `There is no ${what} ${namedWithSuggestion(id, ids)} in the artwork${ids.length ? '' : ' (it has no nodes yet)'}.`, { ...where, ids: [id] }));\n\t\treturn false;\n\t};\n\n\tscene.shots.forEach((shot, shotIndex) => {\n\t\tif (shot.camera && 'frame' in shot.camera && typeof shot.camera.frame === 'string') known(shot.camera.frame, 'unknown-frame', 'node to frame', { shot: shot.id });\n\t\telse if (shot.camera) {\n\t\t\tconst c = shot.camera as { width: number; height: number };\n\t\t\tif (!(c.width > 0 && c.height > 0)) issues.push(motionIssue('invalid-camera', `The camera needs a positive width and height (got ${c.width} × ${c.height}).`, { shot: shot.id }));\n\t\t\telse if (Math.abs(c.width / c.height / artAspect - 1) > 0.02)\n\t\t\t\tissues.push(motionIssue('camera-aspect', `The camera is ${c.width} × ${c.height}, a different shape from the ${scene.artwork.width} × ${scene.artwork.height} artwork, so it shows bands at the sides; frame a node instead to match.`, { shot: shot.id }));\n\t\t}\n\t\tif (!shot.run.length && !shot.camera && shotIndex > 0) issues.push(motionIssue('empty-shot', 'This shot only holds; add commands or a camera move, or remove it.', { shot: shot.id }));\n\n\t\tshot.run.forEach((command: MotionCommand, i) => {\n\t\t\tconst where = { shot: shot.id, command: i };\n\t\t\tif (command.type === 'wait') return;\n\t\t\tconst targets = command.targets.filter((id) => known(id, 'unknown-target', 'node', where));\n\t\t\tconst timing = timeline.commands.find((c) => c.shot === shot.id && c.command === i);\n\t\t\tif (timing && timing.duration > 0 && timing.duration < MOTION_MIN_CHANGE_MS)\n\t\t\t\tissues.push(motionIssue('too-fast', `This ${command.type} lasts ${timing.duration} ms, too quick to follow; make it at least ${MOTION_MIN_CHANGE_MS} ms.`, { ...where, measured: timing.duration, needed: MOTION_MIN_CHANGE_MS, unit: 'ms', ids: targets }));\n\t\t\tif (command.duration !== undefined && command.ease !== undefined) {\n\t\t\t\tconst ease = resolveEasing(command.ease);\n\t\t\t\tif (ease !== 'hold' && ease.type === 'spring') {\n\t\t\t\t\tconst settle = springSettleMs(ease);\n\t\t\t\t\tif (command.duration < settle * 0.9)\n\t\t\t\t\t\tissues.push(motionIssue('spring-cut-short', `This ${command.type}'s spring takes ${settle} ms to settle but lasts ${command.duration} ms, so it jumps to its end; leave \"duration\" out (the spring sets it) or make it at least ${settle} ms.`, { ...where, measured: command.duration, needed: settle, unit: 'ms', ids: targets }));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'follow' && known(command.path, 'unknown-path', 'path', where) && nodes.get(command.path)!.node.type !== 'path')\n\t\t\t\tissues.push(motionIssue('not-a-path', `\"${command.path}\" is a group; follow a single path node.`, { ...where, ids: [command.path] }));\n\t\t\tif (command.type === 'morph') known(command.into, 'unknown-shape', 'shape', where);\n\t\t\tif (command.type === 'match' && known(command.into, 'unknown-shape', 'group', where)) {\n\t\t\t\tconst into = nodes.get(command.into)!;\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst entry = nodes.get(id)!;\n\t\t\t\t\tif (id === command.into || into.ancestors.includes(id) || entry.ancestors.includes(command.into)) {\n\t\t\t\t\t\tissues.push(motionIssue('match-self', `\"${id}\" cannot match \"${command.into}\": one is the other or holds it. Match two separate groups (the second usually hidden).`, { ...where, ids: [id, command.into] }));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst m = matchMotionNodes(entry.node, into.node);\n\t\t\t\t\tif (m.unpairedInto.length)\n\t\t\t\t\t\tissues.push(motionIssue('match-unpaired', `${m.unpairedInto.map((x) => `\"${x}\"`).join(', ')} in \"${command.into}\" ${m.unpairedInto.length > 1 ? 'have' : 'has'} no partner in \"${id}\", so ${m.unpairedInto.length > 1 ? 'they do' : 'it does'} not appear; add a part with the same name or id to \"${id}\" (it can start hidden or tiny).`, { ...where, ids: m.unpairedInto }));\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst style = command.type === 'enter' || command.type === 'exit' ? command.style : undefined;\n\t\t\tif (style === 'wipe' || style === 'iris' || style === 'split')\n\t\t\t\tfor (const id of targets)\n\t\t\t\t\tif (!motionRevealPadding(nodes.get(id)!))\n\t\t\t\t\t\tissues.push(motionIssue('reveal-no-box', `\"${id}\" has no width or height (a straight line), so a ${style} cannot clip it and it fades instead; use style \"${command.type === 'enter' ? 'draw' : 'undraw'}\" for a line.`, { ...where, ids: [id] }));\n\t\t\tif (command.type === 'style') {\n\t\t\t\tfor (const key of ['fill', 'stroke'] as const) {\n\t\t\t\t\tconst color = command[key];\n\t\t\t\t\tif (color === undefined) continue;\n\t\t\t\t\tif (normalizeTokenColor(color) === null) {\n\t\t\t\t\t\tissues.push(motionIssue('invalid-color', `${key} \"${color}\" is not a colour this editor reads; use hex (\"#0ea5e9\"), rgb() or rgba().`, where));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const id of targets) {\n\t\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\t\t\t\t\tif (paths.some((p) => p[key] !== undefined && p[key] !== null && typeof p[key] !== 'string'))\n\t\t\t\t\t\t\tissues.push(motionIssue('paint-not-color', `\"${id}\" has a gradient ${key}; it switches to ${color} at the end instead of blending.`, { ...where, ids: [id] }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'color-pulse') {\n\t\t\t\tconst key = command.paint ?? 'fill';\n\t\t\t\tconst color = command.color ?? '#f59e0b';\n\t\t\t\tif (normalizeTokenColor(color) === null) issues.push(motionIssue('invalid-color', `color \"${color}\" is not a colour this editor reads; use hex (\"#0ea5e9\"), rgb() or rgba().`, where));\n\t\t\t\telse\n\t\t\t\t\tfor (const id of targets) {\n\t\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\t\t\t\t\tif (paths.some((p) => typeof p[key] !== 'string'))\n\t\t\t\t\t\t\tissues.push(motionIssue('paint-not-color', `\"${id}\" has a gradient or no ${key}, so a colour pulse cannot tint it; give it a solid ${key} or pulse the ${key === 'fill' ? 'stroke' : 'fill'}.`, { ...where, ids: [id] }));\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'effect') {\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\tconst params = NUMERIC_PARAMS(node, command.effect);\n\t\t\t\t\tconst effects = (node.effects ?? []).map((e) => e.id);\n\t\t\t\t\tif (!params)\n\t\t\t\t\t\tissues.push(motionIssue('unknown-effect', `\"${id}\" has no effect ${namedWithSuggestion(command.effect, effects)}${effects.length ? `; its effects are ${effects.map((e) => `\"${e}\"`).join(', ')}` : '; it has no live effects'}.`, { ...where, ids: [id] }));\n\t\t\t\t\telse if (!params.includes(command.param))\n\t\t\t\t\t\tissues.push(motionIssue('unknown-effect-param', `Effect \"${command.effect}\" has no numeric parameter ${namedWithSuggestion(command.param, params)}; use one of ${params.join(', ')}.`, { ...where, ids: [id] }));\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Visibility at the start of the command.\n\t\t\tif (timing) {\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\tconst before = Math.max(0, timing.start - 0.5);\n\t\t\t\t\tconst visible = timing.start > 0 ? visibleAt(timeline, id, before, node) : node.visible !== false;\n\t\t\t\t\tif (command.type === 'enter' && visible && timing.start > 0)\n\t\t\t\t\t\tissues.push(motionIssue('enter-visible', `\"${id}\" is already showing when it enters, so it blinks out first; remove the enter or exit it earlier.`, { ...where, ids: [id] }));\n\t\t\t\t\tconst probe = command.type === 'exit' ? timing.start + 0.5 : (timing.start + timing.end) / 2;\n\t\t\t\t\tif (command.type !== 'enter' && command.type !== 'draw' && !visibleAt(timeline, id, probe, node))\n\t\t\t\t\t\tissues.push(motionIssue('exit-hidden', `\"${id}\" is hidden when this ${command.type} starts, so it is not seen; enter it first.`, { ...where, ids: [id] }));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Two segments changing the same property of a node at the same time.\n\tfor (const [key, track] of timeline.tracks) {\n\t\t// Additive layers stack by design.\n\t\tif (key.endsWith('\\u0000add')) continue;\n\t\tfor (let i = 1; i < track.length; i++) {\n\t\t\tconst a = track[i - 1];\n\t\t\tconst b = track[i];\n\t\t\tif (b.start < a.end - 1 && (a.shot !== b.shot || a.command !== b.command)) {\n\t\t\t\tconst property = key.split('\\u0000')[1];\n\t\t\t\tif (!a.node) continue;\n\t\t\t\tissues.push(\n\t\t\t\t\tmotionIssue('overlap', `\"${a.node}\" ${property} is changed by two commands at once (shot \"${a.shot}\" command ${a.command + 1} and shot \"${b.shot}\" command ${b.command + 1}); the later one takes over. Start it after the first ends, or use with: \"after\".`, {\n\t\t\t\t\t\tshot: b.shot,\n\t\t\t\t\t\tcommand: b.command,\n\t\t\t\t\t\tids: [a.node]\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Animated nodes that end their command outside the camera.\n\tconst reported = new Set<string>();\n\tfor (const timing of timeline.commands) {\n\t\tconst command = scene.shots[timing.shotIndex].run[timing.command];\n\t\tif (command.type === 'wait' || command.type === 'exit') continue;\n\t\tconst frame = motionFrameAt(scene, timing.end);\n\t\tconst cam = frame.camera;\n\t\tconst docIndex = indexMotionNodes(frame.document.nodes);\n\t\tfor (const id of command.targets) {\n\t\t\tconst b = docIndex.get(id)?.bounds;\n\t\t\tif (!b || reported.has(id) || !visibleAt(timeline, id, timing.end, nodes.get(id)!.node)) continue;\n\t\t\tconst outside = b.x + b.width < cam.x || b.y + b.height < cam.y || b.x > cam.x + cam.width || b.y > cam.y + cam.height;\n\t\t\tif (outside) {\n\t\t\t\treported.add(id);\n\t\t\t\tissues.push(motionIssue('out-of-frame', `\"${id}\" is outside the camera when this ${command.type} ends, so it is not seen; move it into frame or move the camera.`, { shot: timing.shot, command: timing.command, ids: [id] }));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (scene.controls) {\n\t\tfor (const control of scene.controls) {\n\t\t\tif (!usesColor(scene, control.default))\n\t\t\t\tissues.push(motionIssue('unknown-control-color', `Control \"${control.name}\" stands for ${control.default}, which the scene never uses; set its default to a colour in the artwork.`));\n\t\t}\n\t}\n\n\tif (scene.target && scene.shots.length) {\n\t\tconst seconds = Math.round(timeline.duration / 100) / 10;\n\t\tconst [min, max] = scene.target;\n\t\tif (seconds > max) issues.push(motionIssue('scene-too-long', `The scene runs ${seconds} s, past its ${max} s target; shorten holds or durations, or fit it (fit_animation).`, { measured: seconds, needed: max, unit: 's' }));\n\t\tif (seconds < min) issues.push(motionIssue('scene-too-short', `The scene runs ${seconds} s, under its ${min} s target; hold longer, add shots, or fit it (fit_animation).`, { measured: seconds, needed: min, unit: 's' }));\n\t}\n\treturn issues;\n}\n","import type { VectorDocument } from '../vector/types.js';\nimport { checkMotionScene } from './check.js';\nimport { motionIssueKey, motionIssueLine, namedWithSuggestion, type MotionIssue } from './issues.js';\nimport { commandShapeProblems, motionSceneShapeProblems, shotShapeProblems } from './parse.js';\nimport type { MotionCommand, MotionControl, MotionPreset, MotionScene, MotionShot } from './types.js';\n\n/**\n * Edits as data: each is a pure function of the scene, all or nothing. An edit that leaves the\n * scene malformed, or adds an error the scene did not have (an unknown id, say), changes\n * nothing and says why; existing errors do not block unrelated edits, so a broken scene can be\n * fixed a step at a time.\n */\nexport type MotionEdit =\n\t| { op: 'set_settings'; name?: string; description?: string | null; loop?: MotionScene['loop']; fps?: number; steps?: number | null; target?: [number, number] | null }\n\t| { op: 'insert_shots'; shots: MotionShot[]; at?: number }\n\t| { op: 'update_shot'; shot: string; set?: Partial<MotionShot>; remove?: ('label' | 'camera' | 'hold' | 'speed')[] }\n\t| { op: 'delete_shots'; shots: string[] }\n\t| { op: 'move_shot'; shot: string; to: number }\n\t| { op: 'add_commands'; shot: string; commands: MotionCommand[]; at?: number }\n\t| { op: 'update_command'; shot: string; command: number; set?: Record<string, unknown>; remove?: string[] }\n\t| { op: 'delete_commands'; shot: string; commands: number[] }\n\t| { op: 'set_artwork'; artwork: VectorDocument }\n\t| { op: 'set_controls'; controls: MotionControl[]; presets?: MotionPreset[] }\n\t| { op: 'replace_scene'; scene: MotionScene };\n\nexport type MotionEditOp = MotionEdit['op'];\n\nexport const MOTION_EDIT_OPS: readonly MotionEditOp[] = [\n\t'set_settings',\n\t'insert_shots',\n\t'update_shot',\n\t'delete_shots',\n\t'move_shot',\n\t'add_commands',\n\t'update_command',\n\t'delete_commands',\n\t'set_artwork',\n\t'set_controls',\n\t'replace_scene'\n];\n\nexport type MotionEditResult =\n\t| {\n\t\t\tok: true;\n\t\t\tscene: MotionScene;\n\t\t\t/** Every issue the edited scene has. */\n\t\t\tissues: MotionIssue[];\n\t\t\t/** Edits that work but may surprise (a later command undoes this one, say). */\n\t\t\thints: string[];\n\t }\n\t| { ok: false; error: string };\n\nclass EditError extends Error {}\nconst fail = (message: string): never => {\n\tthrow new EditError(message);\n};\n\nfunction shotIndex(scene: MotionScene, id: string): number {\n\tconst i = scene.shots.findIndex((s) => s.id === id);\n\tif (i < 0) fail(`There is no shot ${namedWithSuggestion(id, scene.shots.map((s) => s.id))}; the shots are ${scene.shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\treturn i;\n}\n\nfunction position(at: number | undefined, length: number, what: string): number {\n\tif (at === undefined) return length;\n\tif (!Number.isInteger(at) || at < 0 || at > length) fail(`${what} must be a whole number from 0 to ${length} (got ${at}).`);\n\treturn at;\n}\n\nconst replaceShot = (scene: MotionScene, index: number, shot: MotionShot): MotionScene => ({ ...scene, shots: scene.shots.map((s, i) => (i === index ? shot : s)) });\n\n/** A free shot id: `base`, then `base-2`, `base-3`… */\nexport function freshShotId(scene: MotionScene, base = 'shot'): string {\n\tconst used = new Set(scene.shots.map((s) => s.id));\n\tif (!used.has(base)) return base;\n\tlet n = 2;\n\twhile (used.has(`${base}-${n}`)) n++;\n\treturn `${base}-${n}`;\n}\n\nfunction applyOne(scene: MotionScene, edit: MotionEdit): MotionScene {\n\tswitch (edit.op) {\n\t\tcase 'set_settings': {\n\t\t\tconst next: MotionScene = { ...scene };\n\t\t\tif (edit.name !== undefined) next.name = edit.name;\n\t\t\tif (edit.description === null) delete next.description;\n\t\t\telse if (edit.description !== undefined) next.description = edit.description;\n\t\t\tif (edit.loop !== undefined) next.loop = edit.loop;\n\t\t\tif (edit.fps !== undefined) next.fps = edit.fps;\n\t\t\tif (edit.steps === null) delete next.steps;\n\t\t\telse if (edit.steps !== undefined) {\n\t\t\t\tif (!(typeof edit.steps === 'number' && edit.steps > 0 && edit.steps <= 120)) fail('\"steps\" must be frames per second from above 0 to 120 (12 is \"on twos\" at 24 fps), or null for smooth.');\n\t\t\t\tnext.steps = edit.steps;\n\t\t\t}\n\t\t\tif (edit.target === null) delete next.target;\n\t\t\telse if (edit.target !== undefined) next.target = edit.target;\n\t\t\treturn next;\n\t\t}\n\t\tcase 'insert_shots': {\n\t\t\tif (!edit.shots.length) fail('Give at least one shot.');\n\t\t\tedit.shots.forEach((shot, i) => {\n\t\t\t\tconst problems = shotShapeProblems(shot, `Shot ${i + 1}`);\n\t\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\t});\n\t\t\tconst ids = new Set(scene.shots.map((s) => s.id));\n\t\t\tfor (const shot of edit.shots) {\n\t\t\t\tif (ids.has(shot.id)) fail(`Shot id \"${shot.id}\" is already used; choose another (e.g. \"${freshShotId(scene, shot.id)}\").`);\n\t\t\t\tids.add(shot.id);\n\t\t\t}\n\t\t\tconst at = position(edit.at, scene.shots.length, '\"at\"');\n\t\t\treturn { ...scene, shots: [...scene.shots.slice(0, at), ...edit.shots, ...scene.shots.slice(at)] };\n\t\t}\n\t\tcase 'update_shot': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst shot: MotionShot = { ...scene.shots[i], ...(edit.set ?? {}) };\n\t\t\tfor (const key of edit.remove ?? []) delete shot[key];\n\t\t\tif (shot.id !== edit.shot && scene.shots.some((s) => s.id === shot.id)) fail(`Shot id \"${shot.id}\" is already used; choose another.`);\n\t\t\tconst problems = shotShapeProblems(shot, `Shot \"${edit.shot}\"`);\n\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\treturn replaceShot(scene, i, shot);\n\t\t}\n\t\tcase 'delete_shots': {\n\t\t\tif (!edit.shots.length) fail('Give at least one shot id.');\n\t\t\tedit.shots.forEach((id) => shotIndex(scene, id));\n\t\t\tconst drop = new Set(edit.shots);\n\t\t\treturn { ...scene, shots: scene.shots.filter((s) => !drop.has(s.id)) };\n\t\t}\n\t\tcase 'move_shot': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst to = position(edit.to, scene.shots.length - 1, '\"to\"');\n\t\t\tconst shots = [...scene.shots];\n\t\t\tconst [shot] = shots.splice(i, 1);\n\t\t\tshots.splice(to, 0, shot);\n\t\t\treturn { ...scene, shots };\n\t\t}\n\t\tcase 'add_commands': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tif (!edit.commands.length) fail('Give at least one command.');\n\t\t\tedit.commands.forEach((command, k) => {\n\t\t\t\tconst problems = commandShapeProblems(command, `Command ${k + 1}`);\n\t\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\t});\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tconst at = position(edit.at, run.length, '\"at\"');\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: [...run.slice(0, at), ...edit.commands, ...run.slice(at)] });\n\t\t}\n\t\tcase 'update_command': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tif (!Number.isInteger(edit.command) || edit.command < 0 || edit.command >= run.length)\n\t\t\t\tfail(`Shot \"${edit.shot}\" has ${run.length} command${run.length === 1 ? '' : 's'}; \"command\" must be an index from 0 to ${run.length - 1} (got ${edit.command}).`);\n\t\t\tconst command = { ...run[edit.command], ...(edit.set ?? {}) } as Record<string, unknown>;\n\t\t\tfor (const key of edit.remove ?? []) {\n\t\t\t\tif (key === 'type') fail('\"type\" cannot be removed; replace the command instead.');\n\t\t\t\tdelete command[key];\n\t\t\t}\n\t\t\tconst problems = commandShapeProblems(command, `Command ${edit.command}`);\n\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: run.map((c, k) => (k === edit.command ? (command as unknown as MotionCommand) : c)) });\n\t\t}\n\t\tcase 'delete_commands': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tif (!edit.commands.length) fail('Give at least one command index.');\n\t\t\tfor (const k of edit.commands)\n\t\t\t\tif (!Number.isInteger(k) || k < 0 || k >= run.length) fail(`Shot \"${edit.shot}\" has no command ${k}; indexes run from 0 to ${run.length - 1}.`);\n\t\t\tconst drop = new Set(edit.commands);\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: run.filter((_, k) => !drop.has(k)) });\n\t\t}\n\t\tcase 'set_artwork':\n\t\t\treturn { ...scene, artwork: edit.artwork };\n\t\tcase 'set_controls': {\n\t\t\tconst next: MotionScene = { ...scene, controls: edit.controls };\n\t\t\tif (!edit.controls.length) delete next.controls;\n\t\t\tif (edit.presets !== undefined) {\n\t\t\t\tif (edit.presets.length) next.presets = edit.presets;\n\t\t\t\telse delete next.presets;\n\t\t\t}\n\t\t\tconst names = new Set(edit.controls.map((c) => c.name));\n\t\t\tfor (const preset of next.presets ?? [])\n\t\t\t\tfor (const key of Object.keys(preset.values))\n\t\t\t\t\tif (!names.has(key)) fail(`Preset \"${preset.name}\" sets ${namedWithSuggestion(key, names)}, which is not a control.`);\n\t\t\treturn next;\n\t\t}\n\t\tcase 'replace_scene':\n\t\t\treturn edit.scene;\n\t}\n}\n\nfunction errorKeys(issues: readonly MotionIssue[]): Set<string> {\n\treturn new Set(issues.filter((i) => i.severity === 'error').map(motionIssueKey));\n}\n\n/** Hints: commands whose change a later command takes over. */\nfunction editHints(before: MotionIssue[], after: MotionIssue[]): string[] {\n\tconst old = new Set(before.map(motionIssueKey));\n\treturn after.filter((i) => i.code === 'overlap' && !old.has(motionIssueKey(i))).map(motionIssueLine);\n}\n\n/** Applies edits in order, as one change. Fails without changing anything when one fails. */\nexport function applyMotionEdits(scene: MotionScene, edits: MotionEdit | readonly MotionEdit[]): MotionEditResult {\n\tconst list = Array.isArray(edits) ? edits : [edits as MotionEdit];\n\tconst before = checkMotionScene(scene);\n\tlet next = scene;\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst edit = list[i];\n\t\tconst prefix = list.length > 1 ? `op ${i + 1} (${edit?.op}): ` : '';\n\t\tif (!edit || !(MOTION_EDIT_OPS as readonly string[]).includes(edit.op))\n\t\t\treturn { ok: false, error: `${prefix}Unknown op ${namedWithSuggestion(String(edit?.op), MOTION_EDIT_OPS)}. Nothing was changed.` };\n\t\ttry {\n\t\t\tnext = applyOne(next, edit);\n\t\t} catch (error) {\n\t\t\tif (error instanceof EditError) return { ok: false, error: `${prefix}${error.message} Nothing was changed.` };\n\t\t\tthrow error;\n\t\t}\n\t\tconst problems = motionSceneShapeProblems(next);\n\t\tif (problems.length) return { ok: false, error: `${prefix}Nothing was changed: ${problems.join(' ')}` };\n\t}\n\tconst issues = checkMotionScene(next);\n\tconst had = errorKeys(before);\n\tconst added = issues.filter((i) => i.severity === 'error' && !had.has(motionIssueKey(i)));\n\tif (added.length) return { ok: false, error: `Nothing was changed: ${added.map(motionIssueLine).join(' ')}` };\n\treturn { ok: true, scene: next, issues, hints: editHints(before, issues) };\n}\n\n/** An empty scene over `artwork`. */\nexport function createMotionScene(artwork: VectorDocument, init: Partial<Omit<MotionScene, 'artwork' | 'version'>> = {}): MotionScene {\n\treturn { version: 1, name: init.name ?? 'animation', ...init, artwork, shots: init.shots ?? [] };\n}\n","// Protected regions adapted from effectcraft-main/crates/render/src/eval.rs (`responsive_source_time`), MIT OR Apache-2.0, © ArtCraft Team and contributors.\nimport { compileMotionScene } from './compile.js';\nimport { namedWithSuggestion } from './issues.js';\nimport type { MotionScene } from './types.js';\n\nexport interface MotionFitOptions {\n\t/** Shot ids that keep their pace (a logo hold, a line of narration); the others absorb the change. */\n\tkeep?: readonly string[];\n}\n\nexport interface MotionFit {\n\tscene: MotionScene;\n\t/** The length after fitting, ms (within a few ms of the target: speeds are rounded). */\n\tduration: number;\n\t/** The new `speed` of every shot that changed. */\n\tspeeds: Record<string, number>;\n}\n\n/** Speeds are kept within this range. */\nexport const MOTION_SPEED_RANGE: readonly [number, number] = [0.05, 20];\n\n/**\n * Fits a scene to `ms` by setting its shots' `speed`: the shots in `keep` play as they are and\n * the rest stretch or squeeze by the same factor, so their timing keeps its proportions (the\n * responsive time of After Effects' protected regions). Throws, changing nothing, when the\n * kept shots alone outlast the target or a speed would leave `MOTION_SPEED_RANGE`.\n */\nexport function fitMotionScene(scene: MotionScene, ms: number, options: MotionFitOptions = {}): MotionFit {\n\tif (!(Number.isFinite(ms) && ms > 0)) throw new Error('Give the length to fit as a number of milliseconds above 0.');\n\tconst ids = scene.shots.map((s) => s.id);\n\tconst keep = new Set(options.keep ?? []);\n\tfor (const id of keep) if (!ids.includes(id)) throw new Error(`There is no shot ${namedWithSuggestion(id, ids)} to keep.`);\n\tconst timeline = compileMotionScene(scene);\n\tlet kept = 0;\n\tlet rest = 0;\n\ttimeline.shots.forEach((t) => (keep.has(t.id) ? (kept += t.end - t.start) : (rest += t.end - t.start)));\n\tif (rest <= 0) throw new Error(keep.size ? 'Every shot is kept, so nothing can change pace; keep fewer shots.' : 'The scene has no length to fit; add shots first.');\n\tif (ms <= kept) throw new Error(`The kept shots alone last ${Math.round(kept)} ms, so the scene cannot fit ${Math.round(ms)} ms; keep fewer shots or give at least ${Math.ceil(kept) + 1} ms.`);\n\tconst k = (ms - kept) / rest;\n\tconst speeds: Record<string, number> = {};\n\tconst shots = scene.shots.map((shot) => {\n\t\tif (keep.has(shot.id)) return shot;\n\t\tconst speed = Math.round(((shot.speed ?? 1) / k) * 10000) / 10000;\n\t\tif (speed < MOTION_SPEED_RANGE[0] || speed > MOTION_SPEED_RANGE[1])\n\t\t\tthrow new Error(`Fitting ${Math.round(ms)} ms would play shot \"${shot.id}\" at ${speed}× (speeds run ${MOTION_SPEED_RANGE[0]}–${MOTION_SPEED_RANGE[1]}); aim nearer the current ${Math.round(timeline.duration)} ms.`);\n\t\tspeeds[shot.id] = speed;\n\t\tconst { speed: _old, ...rest } = shot;\n\t\treturn speed === 1 ? rest : { ...rest, speed };\n\t});\n\tconst fitted: MotionScene = { ...scene, shots };\n\treturn { scene: fitted, duration: compileMotionScene(fitted).duration, speeds };\n}\n","import type { MotionBehavior } from '../animation/behavior.js';\nimport { evaluateEasing, resolveEasing, reverseCubicBezier, type AnimationEasing } from '../animation/easing.js';\nimport { bezierPathToSvg, transformBezierPath } from '../canvas/pathops/bezier.js';\nimport { normalizeTokenColor } from '../tokens/color.js';\nimport { expandVectorAppearance, expandVectorAppearances } from '../vector/appearance.js';\nimport { IDENTITY_MATRIX, collectPathNodes, invertMatrix, nodeMatrix, vectorPathWorldBezier } from '../vector/geometry.js';\nimport { vectorDocumentToSvg, type VectorSvgWrapper } from '../vector/svg.js';\nimport type { VectorNode, VectorPathNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes, motionAddTrackKey, motionTrackKey, segmentValue, trackValue, type MotionProperty, type MotionSegment } from './compile.js';\nimport { motionClipAttrs, motionFollowRoute, motionFrameAt, motionNodeClips, motionNodeOffset } from './evaluate.js';\nimport type { MotionScene } from './types.js';\n\n/**\n * Export to Flair (`@pixerate/flair`): a scene becomes an `SvgMotion` (one SVG plus a list of\n * from → to changes on its elements), a catalog `VectorEffect`, or an `EffectDocument` for\n * Flair's effect editor. The types are mirrored here so this package does not depend on Flair.\n *\n * Changes are exact where Flair can express them: a change with a linear, cubic-out or\n * cubic-in-out curve (the editor's defaults) is one change, and so (Flair 0.36 and later) is\n * one with any cubic-bezier curve, written as `[x1, y1, x2, y2]`. Anything else (springs,\n * elastic, `hold`, morphs and live-effect tweens) is sampled at the\n * scene's `fps` into short linear changes, which Flair plays the same way. Pulses, shakes,\n * teeters, waves, wiggles and colour pulses are one change with a `behavior` (Flair 0.38).\n *\n * Reveals (`wipe`, `iris`, `split`) wrap their node in a group clipped through a rect or circle\n * in the group's own box units (`clipPathUnits=\"objectBoundingBox\"`), as Flair's\n * `entrance.wipe` does, and animate the shape's attributes. A follow wraps its node in a group\n * that Flair's `along` carries along a copy of the path in the node's parent's units (written\n * in `<defs>`, so the path may be hidden or anywhere), turning with it for `orient`, as\n * Flair's `path.follow` does.\n */\n\n/** Flair's easing names. */\nexport type FlairEaseName = 'linear' | 'in-out' | 'out';\n\n/** Flair's spring ease (Flair 0.39 and later): the editor's spring, number for number. */\nexport interface FlairSpringEase {\n\tspring: { mass?: number; stiffness?: number; damping?: number; velocity?: number };\n}\n\n/** A Flair easing: a name, (Flair 0.36 and later) a CSS cubic-bezier `[x1, y1, x2, y2]`, or (0.39) a spring. */\nexport type FlairEase = FlairEaseName | readonly [number, number, number, number] | FlairSpringEase;\n\n/** Flair's curves, for matching. */\nexport const FLAIR_EASES: Readonly<Record<FlairEaseName, (t: number) => number>> = {\n\tlinear: (t) => t,\n\t'in-out': (t) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n\tout: (t) => 1 - (1 - t) ** 3\n};\n\n/** One change of a Flair `SvgMotion` (mirrors `SvgAnimation` in `@pixerate/flair/vector`). */\nexport interface FlairSvgAnimation {\n\tid?: string;\n\tstep?: number;\n\tdelay?: number;\n\tms?: number;\n\tease?: FlairEase;\n\tattrs?: Record<string, readonly [string | number, string | number]>;\n\tdraw?: boolean | readonly [number, number];\n\t/** Moves the element along a path (by id), from and to the fractions of its length in `at`. */\n\talong?: string;\n\tat?: readonly [number, number];\n\t/** With `along`: turns the element with the path's direction. */\n\torient?: boolean;\n\t/** Flair 0.38 and later: how the change swings from → to (see `MotionBehavior`). */\n\tbehavior?: MotionBehavior;\n\t/** Flair 0.39 and later: stepped time, held on a grid of this many frames per second. */\n\tstrobe?: number;\n\t/** Flair 0.39 and later: whole cycles to play (default 1); with `alternate`, every other one backwards. */\n\trepeat?: number;\n\talternate?: boolean;\n\t/** Flair features scenes do not have (imports skip them with a note). */\n\tcount?: readonly [number, number];\n\twrite?: string;\n\tscramble?: string;\n\tsolo?: number;\n\tview?: readonly [number, number, number, number] | string;\n}\n\n/** Mirrors `SvgMotion` in `@pixerate/flair/vector`. */\nexport interface FlairSvgMotion {\n\tsvg: string;\n\tanimate?: FlairSvgAnimation[];\n}\n\n/** Mirrors Flair's catalog `VectorEffect` (`@pixerate/flair/catalog`). */\nexport interface FlairVectorEffect {\n\tkind: 'vector';\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tcategory: string;\n\ttags: string[];\n\tmotion: FlairSvgMotion;\n\tpresets?: { name: string; values: Record<string, string> }[];\n\t/** Ms on the last frame before looping. */\n\thold?: number;\n\ttrigger?: 'hover' | 'press' | 'click' | 'scroll';\n}\n\n/** Mirrors Flair's `EffectDocument` (`@pixerate/flair/editor`) for a vector effect. */\nexport interface FlairEffectDocument {\n\tversion: 1;\n\tname: string;\n\teffect: { kind: 'vector'; motion: FlairSvgMotion; hold?: number };\n\tvalues: Record<string, string>;\n\ttracks: Record<string, never>;\n\tduration: number;\n\tloop: boolean;\n\tpresets: { name: string; values: Record<string, string> }[];\n}\n\nexport interface FlairMotionExport {\n\tmotion: FlairSvgMotion;\n\t/** The scene's length (ms). */\n\tduration: number;\n\t/** Ms after the last change (Flair's `hold`). */\n\thold: number;\n\t/** Changes sampled into linear steps. */\n\tsampled: number;\n\t/** What could not be carried over, in sentences. */\n\tnotes: string[];\n}\n\nexport interface FlairExportOptions {\n\t/** Sampling rate for changes Flair cannot express exactly (default: the scene's `fps`, else 30). */\n\tfps?: number;\n\t/** Decimal places (default 3). */\n\tprecision?: number;\n\t/**\n\t * Write cubic-bezier easings (the `ease`, `ease-in`, `ease-out`, `ease-in-out`, `ease-in-back`\n\t * and `ease-out-back` presets, and `{ type: 'cubic-bezier' }` curves) as one change with\n\t * `ease: [x1, y1, x2, y2]` (default true). Needs Flair 0.36 or later; set false for older\n\t * Flair, and they are sampled into linear steps.\n\t */\n\tcurves?: boolean;\n\t/**\n\t * Write pulses, shakes, teeters, waves, wiggles and colour pulses as one change with a Flair\n\t * `behavior` (default true), so they play exactly. Needs Flair 0.38 or later; set false for\n\t * older Flair, and they are sampled into linear steps.\n\t */\n\tbehaviors?: boolean;\n\t/**\n\t * The Flair version the export is for (default `0.39`): it decides what is written exactly\n\t * and what is sampled. 0.36 adds cubic-bezier curves, 0.38 behaviours, 0.39 springs and\n\t * stepped time (`strobe`). `curves` and `behaviors` override it.\n\t */\n\tflair?: string;\n}\n\n/** The Flair version exports target by default. */\nexport const FLAIR_EXPORT_VERSION = '0.39';\n\n/** Whether Flair `version` is at least `min` (dotted numbers). */\nexport function flairAtLeast(version: string, min: string): boolean {\n\tconst a = version.split('.').map((n) => parseInt(n, 10) || 0);\n\tconst b = min.split('.').map((n) => parseInt(n, 10) || 0);\n\tfor (let i = 0; i < Math.max(a.length, b.length); i++) if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0);\n\treturn true;\n}\n\n/** The Flair easing that matches `ease` (within 1% everywhere), if any. */\nexport function flairEaseFor(ease: AnimationEasing): FlairEaseName | undefined {\n\tfor (const name of ['linear', 'out', 'in-out'] as const) {\n\t\tlet worst = 0;\n\t\tfor (let i = 1; i < 40; i++) {\n\t\t\tconst t = i / 40;\n\t\t\tworst = Math.max(worst, Math.abs(evaluateEasing(ease, t, 1000) - FLAIR_EASES[name](t)));\n\t\t}\n\t\tif (worst < 0.01) return name;\n\t}\n\treturn undefined;\n}\n\n/**\n * The Flair easing for `ease`: a Flair name when one matches within 1%, else (with `curves`,\n * the default) the curve's `[x1, y1, x2, y2]` when it is a cubic-bezier. Undefined for curves\n * Flair cannot play (springs, elastic, `hold`), which are sampled.\n */\nexport function flairCurveFor(ease: AnimationEasing, curves = true): FlairEase | undefined {\n\tconst name = flairEaseFor(ease);\n\tif (name || !curves) return name;\n\tconst resolved = resolveEasing(ease);\n\tif (resolved === 'hold' || resolved.type !== 'cubic-bezier') return undefined;\n\treturn [resolved.x1, resolved.y1, resolved.x2, resolved.y2];\n}\n\n/** Whether a curve leaves 0–1 (a back ease or a spring), so its values pass `from` or `to`. */\nconst overshoots = (ease: FlairEase) => typeof ease !== 'string' && ('spring' in ease || ease[1] < 0 || ease[1] > 1 || ease[3] < 0 || ease[3] > 1);\n\ntype ChannelValue = number | string | readonly number[];\n\ninterface Channel {\n\tid: string;\n\t/** `attrs`: several number attributes changing together (`attrs` names them, `value` gives them in order). */\n\tkind: 'attr' | 'attrs' | 'draw' | 'view';\n\tattr?: string;\n\tattrs?: readonly string[];\n\tsegments: MotionSegment[];\n\texact: (segment: MotionSegment) => boolean;\n\t/**\n\t * Whether a value past `from` → `to` plays the same in Flair as in the editor. Transforms and\n\t * the camera extrapolate; colours would leave 0–255 and opacity and draw-on are clamped here.\n\t */\n\tovershoot?: boolean;\n\tvalue: (time: number) => ChannelValue;\n\t/** The value with behaviours ignored: what a behaviour swings towards (default `value`). */\n\traw?: (time: number) => ChannelValue;\n}\n\nconst TRANSFORM_PROPS: MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY', 'follow'];\nconst LINEAR_TRANSFORM = new Set<MotionProperty>(['x', 'y', 'rotation', 'scaleX', 'scaleY']);\n\nfunction hex6(color: unknown): string {\n\tconst hex = normalizeTokenColor(color);\n\treturn hex ? hex.slice(0, 7) : '#000000';\n}\n\n/** A scene as a Flair `SvgMotion`. */\nexport function toFlairSvgMotion(scene: MotionScene, options: FlairExportOptions = {}): FlairMotionExport {\n\tconst fps = options.fps ?? scene.fps ?? 30;\n\tconst precision = options.precision ?? 3;\n\tconst flair = options.flair ?? FLAIR_EXPORT_VERSION;\n\tconst curves = options.curves ?? flairAtLeast(flair, '0.36');\n\tconst behaviors = options.behaviors ?? flairAtLeast(flair, '0.38');\n\tconst springs = flairAtLeast(flair, '0.39');\n\tconst strobes = flairAtLeast(flair, '0.39');\n\tconst writeEase = (ease: FlairEase): FlairEase => (typeof ease === 'string' || 'spring' in ease ? ease : (ease.map(round) as unknown as FlairEase));\n\t// The ease Flair is given for a segment: its curve (run backwards for a mirrored repeat) or its spring, if Flair can take it.\n\tconst easeOf = (segment: MotionSegment): FlairEase | undefined => {\n\t\tconst resolved = resolveEasing(segment.ease);\n\t\tif (resolved !== 'hold' && resolved.type === 'spring') {\n\t\t\tif (!springs || segment.reverse) return undefined;\n\t\t\tconst { mass, stiffness, damping, velocity } = resolved;\n\t\t\treturn { spring: { mass, stiffness, damping, velocity } };\n\t\t}\n\t\tif (!segment.reverse) return flairCurveFor(segment.ease, curves);\n\t\tconst back = reverseCubicBezier(segment.ease);\n\t\treturn back && curves ? flairCurveFor(back, curves) : undefined;\n\t};\n\t// A segment with a behaviour plays exactly when Flair can be given the behaviour.\n\tconst plays = (s: MotionSegment) => (!s.behavior || behaviors) && (!s.steps || strobes) && !s.geometric;\n\tconst round = (n: number) => Math.round(n * 10 ** precision) / 10 ** precision;\n\tconst f = (n: number) => String(round(n));\n\tconst timeline = compileMotionScene(scene);\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst notes: string[] = [];\n\tconst channels: Channel[] = [];\n\tconst track = (id: string, p: MotionProperty) => timeline.tracks.get(motionTrackKey(id, p)) ?? [];\n\n\t// The outermost node (of a path and its groups) whose track sets `p` for that path.\n\tconst owner = (path: VectorPathNode, p: MotionProperty): string | undefined => {\n\t\tconst entry = nodes.get(path.id);\n\t\tif (!entry) return undefined;\n\t\treturn [...entry.ancestors, path.id].find((id) => timeline.tracks.has(motionTrackKey(id, p)));\n\t};\n\n\tconst animatedNodes = new Set(timeline.segments.map((s) => s.node).filter(Boolean));\n\tconst pathsSeen = new Set<string>();\n\t// Groups written round nodes (outermost first), routes for `along`, and the ids they take.\n\tconst wrap: Record<string, VectorSvgWrapper[]> = {};\n\tconst routes: string[] = [];\n\tconst follows: { id: string; wrapper: string; routes: Map<string, string>; segments: MotionSegment[] }[] = [];\n\tconst usedIds = new Set(nodes.keys());\n\tconst freshId = (base: string) => {\n\t\tlet id = base;\n\t\tfor (let n = 2; usedIds.has(id); n++) id = `${base}-${n}`;\n\t\tusedIds.add(id);\n\t\treturn id;\n\t};\n\tfor (const id of animatedNodes) {\n\t\tconst entry = nodes.get(id)!;\n\t\tconst node = entry.node;\n\t\t// Wrappers only go round nodes that are drawn (a hidden node is left out of the SVG).\n\t\tconst drawn = [...entry.ancestors.map((a) => nodes.get(a)!.node), node].every((n) => n.visible !== false);\n\n\t\t// Reveal clips: a group clipped through a shape whose attributes change (outermost: it clips what the follow carries).\n\t\tfor (const [p, name] of [['clipRect', 'reveal'], ['clipCircle', 'iris']] as const) {\n\t\t\tif (!drawn || !timeline.tracks.has(motionTrackKey(id, p))) continue;\n\t\t\tconst wrapper = freshId(`${id}--${name}`);\n\t\t\tconst clipId = freshId(`${wrapper}-clip`);\n\t\t\tconst shapeId = freshId(`${wrapper}-clip-shape`);\n\t\t\tconst clipAt = (t: number) => motionNodeClips(id, timeline, t).find((c) => c.shape === (p === 'clipRect' ? 'rect' : 'circle'))!;\n\t\t\tconst rest = clipAt(0);\n\t\t\t(wrap[id] ??= []).push({ id: wrapper, clip: { id: clipId, shapeId, shape: rest.shape, attrs: motionClipAttrs(rest) } });\n\t\t\tchannels.push({ id: shapeId, kind: 'attrs', attrs: Object.keys(motionClipAttrs(rest)), segments: [...track(id, p)], exact: () => true, value: (t) => Object.values(motionClipAttrs(clipAt(t))).map((v) => Math.round(v * 1e4) / 1e4) });\n\t\t}\n\n\t\t// A follow: Flair's `along` carries a wrapper, and an inner one puts the node's centre on it.\n\t\tconst followSegments = track(id, 'follow');\n\t\tif (drawn && followSegments.length) {\n\t\t\tconst ids = new Map<string, string>();\n\t\t\tfor (const seg of followSegments) {\n\t\t\t\tif (!seg.path || ids.has(seg.path)) continue;\n\t\t\t\tconst route = motionFollowRoute(entry, nodes.get(seg.path));\n\t\t\t\tif (!route) continue;\n\t\t\t\tconst routeId = freshId(`${id}--follow-route`);\n\t\t\t\tids.set(seg.path, routeId);\n\t\t\t\troutes.push(`<path id=\"${routeId}\" d=\"${bezierPathToSvg(route, { precision })}\" fill=\"none\"/>`);\n\t\t\t}\n\t\t\tif (ids.size) {\n\t\t\t\tconst wrapper = freshId(`${id}--follow`);\n\t\t\t\tconst centre = freshId(`${id}--follow-centre`);\n\t\t\t\tconst c = entry.center;\n\t\t\t\t// Where the follow puts it at the start, for players that draw a still frame without `along`.\n\t\t\t\tconst at = motionNodeOffset(entry, timeline, 0, nodes)?.follow;\n\t\t\t\tconst placed = at ? `translate(${f(at.x)} ${f(at.y)})${at.angle ? ` rotate(${f(at.angle)})` : ''}` : undefined;\n\t\t\t\t(wrap[id] ??= []).push({ id: wrapper, ...(placed ? { transform: placed } : {}) }, { id: centre, transform: `translate(${f(-c.x)} ${f(-c.y)})` });\n\t\t\t\tfollows.push({ id, wrapper, routes: ids, segments: followSegments.filter((seg) => seg.path && ids.has(seg.path)) });\n\t\t\t}\n\t\t}\n\n\t\tif (timeline.tracks.has(motionTrackKey(id, 'opacity')))\n\t\t\tchannels.push({ id, kind: 'attr', attr: 'opacity', segments: [...track(id, 'opacity')], exact: plays, value: (t) => round(Math.min(1, Math.max(0, Number(trackValue(track(id, 'opacity'), t))))) });\n\n\t\t// The node's own moves, turns and scales (a follow is carried by its wrappers).\n\t\tconst followed = follows.some((x) => x.id === id);\n\t\t// Additive layers share the transform: alone in a stretch they are one change, overlapping the pose they are sampled.\n\t\tconst transformSegments = TRANSFORM_PROPS.flatMap((p) => (followed && p === 'follow' ? [] : [...track(id, p), ...(timeline.tracks.get(motionAddTrackKey(id, p)) ?? [])]));\n\t\tif (transformSegments.length) {\n\t\t\tconst base = node.transform ? ` matrix(${node.transform.map(f).join(' ')})` : '';\n\t\t\tconst c = entry.center;\n\t\t\tconst transformAt = (t: number, raw: boolean) => {\n\t\t\t\tconst o = motionNodeOffset(entry, timeline, t, nodes, raw, !followed)!;\n\t\t\t\treturn `translate(${f(o.dx)} ${f(o.dy)}) rotate(${f(o.rotation)} ${f(c.x)} ${f(c.y)}) translate(${f(c.x)} ${f(c.y)}) scale(${f(o.scaleX)} ${f(o.scaleY)}) translate(${f(-c.x)} ${f(-c.y)})${base}`;\n\t\t\t};\n\t\t\tchannels.push({\n\t\t\t\tid,\n\t\t\t\tkind: 'attr',\n\t\t\t\tattr: 'transform',\n\t\t\t\tsegments: transformSegments,\n\t\t\t\texact: (s) => LINEAR_TRANSFORM.has(s.property) && plays(s),\n\t\t\t\tovershoot: true,\n\t\t\t\t// x, y and the angle are the transform's numbers 0, 1 and 2 (`MotionSegment.index`).\n\t\t\t\tvalue: (t) => transformAt(t, false),\n\t\t\t\traw: (t) => transformAt(t, true)\n\t\t\t});\n\t\t}\n\n\t\t// Paint, width, fill fade and draw-on live on paths: a group's change goes to each path in it.\n\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\tfor (const path of paths) {\n\t\t\tif (pathsSeen.has(path.id)) continue;\n\t\t\tpathsSeen.add(path.id);\n\t\t\tconst paint = (p: 'fill' | 'stroke', attr: string) => {\n\t\t\t\tconst from = owner(path, p);\n\t\t\t\tif (from) channels.push({ id: path.id, kind: 'attr', attr, segments: [...track(from, p)], exact: plays, value: (t) => hex6(trackValue(track(from, p), t)), raw: (t) => hex6(trackValue(track(from, p), t, true)) });\n\t\t\t};\n\t\t\tpaint('fill', 'fill');\n\t\t\tpaint('stroke', 'stroke');\n\t\t\tconst width = owner(path, 'strokeWidth');\n\t\t\tif (width) channels.push({ id: path.id, kind: 'attr', attr: 'stroke-width', segments: [...track(width, 'strokeWidth')], exact: () => true, value: (t) => round(Number(trackValue(track(width, 'strokeWidth'), t))) });\n\t\t\tconst fade = owner(path, 'fillOpacity');\n\t\t\tif (fade) channels.push({ id: path.id, kind: 'attr', attr: 'fill-opacity', segments: [...track(fade, 'fillOpacity')], exact: () => true, value: (t) => round(Number(trackValue(track(fade, 'fillOpacity'), t))) });\n\t\t\tconst draw = owner(path, 'drawEnd');\n\t\t\tif (draw) channels.push({ id: path.id, kind: 'draw', segments: [...track(draw, 'drawEnd')], exact: () => true, value: (t) => round(Math.min(1, Math.max(0, Number(trackValue(track(draw, 'drawEnd'), t))))) });\n\t\t\tif (owner(path, 'drawStart')) notes.push(`\"${path.id}\": drawing from a start other than 0 is not exported; Flair draws from the start of the path.`);\n\t\t}\n\n\t\t// Shape changes (morphs, live effect tweens) are sampled as the path's `d`.\n\t\tconst shapeSegments = [...timeline.tracks.entries()].filter(([k]) => k.startsWith(`${id}\\u0000`) && (k.endsWith('\\u0000shape') || k.includes('\\u0000effect:'))).flatMap(([, v]) => v);\n\t\tif (shapeSegments.length) {\n\t\t\tif (node.type !== 'path') notes.push(`\"${id}\" is a group: its morph or effect animation is not exported (Flair tweens one path's \"d\").`);\n\t\t\telse {\n\t\t\t\tconst inverse = invertMatrix(nodeMatrix(node));\n\t\t\t\tchannels.push({\n\t\t\t\t\tid,\n\t\t\t\t\tkind: 'attr',\n\t\t\t\t\tattr: 'd',\n\t\t\t\t\tsegments: shapeSegments,\n\t\t\t\t\texact: () => false,\n\t\t\t\t\tvalue: (t) => {\n\t\t\t\t\t\tconst frame = motionFrameAt(scene, t, { draw: false, offsets: false });\n\t\t\t\t\t\tconst now = expandVectorAppearance(indexMotionNodes(frame.document.nodes).get(id)?.node as VectorNode);\n\t\t\t\t\t\tif (!now || now.type !== 'path') return '';\n\t\t\t\t\t\tconst bezier = transformBezierPath(vectorPathWorldBezier(now, IDENTITY_MATRIX, { effects: false }), inverse);\n\t\t\t\t\t\treturn bezierPathToSvg(bezier, { precision: Math.min(precision, 2) });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst camera = track('', 'camera');\n\tif (camera.length) channels.push({ id: '', kind: 'view', segments: [...camera], exact: () => true, overshoot: true, value: (t) => (trackValue(camera, t) as number[]).map(round) });\n\n\tconst animate: FlairSvgAnimation[] = [];\n\tlet sampled = 0;\n\tconst same = (a: ChannelValue, b: ChannelValue) => JSON.stringify(a) === JSON.stringify(b);\n\tconst emit = (channel: Channel, delay: number, ms: number, from: ChannelValue, to: ChannelValue, ease: FlairEase, segment?: MotionSegment) => {\n\t\tconst written = writeEase(ease);\n\t\tconst base = {\n\t\t\t...(channel.id ? { id: channel.id } : {}),\n\t\t\t...(delay > 0 ? { delay: round(delay) } : {}),\n\t\t\tms: round(ms),\n\t\t\tease: written,\n\t\t\t...(segment?.behavior ? { behavior: segment.behavior } : {}),\n\t\t\t...(segment?.steps ? { strobe: segment.steps } : {})\n\t\t};\n\t\tif (channel.kind === 'view') animate.push({ ...base, view: to as unknown as [number, number, number, number] });\n\t\telse if (channel.kind === 'draw') animate.push({ ...base, draw: [from as number, to as number] });\n\t\telse if (channel.kind === 'attrs') {\n\t\t\t// Only the numbers that change (as Flair's clip reveals write them).\n\t\t\tconst [a, b] = [from as readonly number[], to as readonly number[]];\n\t\t\tconst attrs = Object.fromEntries(channel.attrs!.flatMap((name, k) => (a[k] !== b[k] ? [[name, [a[k], b[k]] as const]] : [])));\n\t\t\tanimate.push({ ...base, attrs });\n\t\t}\n\t\telse animate.push({ ...base, attrs: { [channel.attr!]: [from as string | number, to as string | number] } });\n\t};\n\n\tfor (const channel of channels) {\n\t\tconst cuts = channel.segments.filter((s) => s.end <= s.start);\n\t\tfor (const cut of cuts) {\n\t\t\tconst [from, to] = [channel.value(Math.max(0, cut.start - 1e-3)), channel.value(cut.start)];\n\t\t\t// A cut to where the value already is changes nothing (at 0 it sets the start, so it stays).\n\t\t\tif (cut.start <= 0 || !same(from, to) || channel.kind === 'view') emit(channel, cut.start, 0, from, to, 'linear');\n\t\t}\n\t\tconst times = [...new Set(channel.segments.flatMap((s) => [s.start, s.end]))].sort((a, b) => a - b);\n\t\tfor (let i = 0; i + 1 < times.length; i++) {\n\t\t\tconst a = times[i];\n\t\t\tconst b = times[i + 1];\n\t\t\tconst active = channel.segments.filter((s) => s.start < b && s.end > a);\n\t\t\tif (!active.length) continue;\n\t\t\t// One change when every active segment spans exactly this interval with one exact curve (a move's x and y, say).\n\t\t\tconst first = active[0];\n\t\t\t// A behaviour (pulse, shake, wriggle…) is one change toward the value it swings round, when every active segment shares it.\n\t\t\tconst key = (x: MotionSegment) => JSON.stringify([x.ease, x.behavior, x.reverse ?? false, x.steps ?? 0]);\n\t\t\tconst together = active.every((x) => x.start === a && x.end === b && channel.exact(x) && key(x) === key(first));\n\t\t\tconst curve = together ? easeOf(first) : undefined;\n\t\t\tconst ease = curve && (!overshoots(curve) || channel.overshoot) ? curve : undefined;\n\t\t\tif (ease) {\n\t\t\t\tconst from = channel.value(a);\n\t\t\t\tconst to = first.behavior ? (channel.raw ?? channel.value)(b) : channel.value(b);\n\t\t\t\tif (!same(from, to) || channel.kind === 'view') emit(channel, a, b - a, from, to, ease, first);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst n = Math.max(1, Math.ceil(((b - a) * fps) / 1000));\n\t\t\tlet prev = channel.value(a);\n\t\t\tfor (let k = 1; k <= n; k++) {\n\t\t\t\tconst t0 = a + ((b - a) * (k - 1)) / n;\n\t\t\t\tconst t1 = a + ((b - a) * k) / n;\n\t\t\t\tconst next = channel.value(t1);\n\t\t\t\tif (!same(prev, next)) {\n\t\t\t\t\temit(channel, t0, t1 - t0, prev, next, 'linear');\n\t\t\t\t\tsampled++;\n\t\t\t\t}\n\t\t\t\tprev = next;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Follows: one `along` per follow, sampled into linear steps only for curves Flair cannot play.\n\tfor (const follow of follows) {\n\t\tconst starts = follow.segments.map((seg) => seg.start);\n\t\tfor (const seg of follow.segments) {\n\t\t\tconst along = { id: follow.wrapper, along: follow.routes.get(seg.path!)!, ...(seg.rotate ? { orient: true } : {}) };\n\t\t\tconst progress = (t: number) => round(Math.min(1, Math.max(0, Number(segmentValue(seg, t)))));\n\t\t\tconst curve = seg.end > seg.start ? (plays(seg) ? easeOf(seg) : undefined) : 'linear';\n\t\t\t// Past the ends, Flair stops turning (its direction is measured either side of the point), so overshoots are sampled.\n\t\t\tif (curve && !(overshoots(curve) && seg.rotate)) {\n\t\t\t\tconst ends = seg.reverse ? [Number(seg.to), Number(seg.from)] : [Number(seg.from), Number(seg.to)];\n\t\t\t\tanimate.push({ ...along, ...(seg.start > 0 ? { delay: round(seg.start) } : {}), ms: round(seg.end - seg.start), ease: writeEase(curve), ...(seg.steps ? { strobe: seg.steps } : {}), at: [round(ends[0]), round(ends[1])] });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Sampled up to the next follow's start, which takes over there.\n\t\t\tconst until = Math.min(seg.end, ...starts.filter((t) => t > seg.start));\n\t\t\tconst n = Math.max(1, Math.ceil(((until - seg.start) * fps) / 1000));\n\t\t\tfor (let k = 1; k <= n; k++) {\n\t\t\t\tconst t0 = seg.start + ((until - seg.start) * (k - 1)) / n;\n\t\t\t\tconst t1 = seg.start + ((until - seg.start) * k) / n;\n\t\t\t\tanimate.push({ ...along, ...(t0 > 0 ? { delay: round(t0) } : {}), ms: round(t1 - t0), ease: 'linear', at: [progress(t0), progress(t1)] });\n\t\t\t\tsampled++;\n\t\t\t}\n\t\t}\n\t}\n\tanimate.sort((x, y) => (x.delay ?? 0) - (y.delay ?? 0));\n\n\t// The SVG: the artwork at rest, live effects drawn as plain paths so shapes can be tweened,\n\t// with the wrappers that reveals and follows animate, and the routes follows take.\n\tlet svg = vectorDocumentToSvg({ ...scene.artwork, nodes: expandVectorAppearances(scene.artwork.nodes) }, { pretty: false, precision, wrap });\n\tif (routes.length) svg = svg.replace(/^(<svg[^>]*>)/, `$1<defs>${routes.join('')}</defs>`);\n\tconst lastChange = animate.reduce((m, a) => Math.max(m, (a.delay ?? 0) + (a.ms ?? 0)), 0);\n\n\t// Controls: each stands for its default colour wherever it appears.\n\tlet motion: FlairSvgMotion = { svg, animate };\n\tif (scene.controls?.length) {\n\t\tconst declarations = scene.controls.map((c) => `{{${c.name}: color default=${c.default.toUpperCase()}${c.label ? ` label='${c.label.replace(/'/g, '’')}'` : ''}}}`).join(' ');\n\t\tconst swap = (text: string) => scene.controls!.reduce((s, c) => s.replace(new RegExp(`${c.default}(?![0-9a-fA-F])`, 'gi'), `{{${c.name}}}`), text);\n\t\tsvg = svg.replace(/^(<svg[^>]*>)/, `$1<!-- ${declarations} -->`);\n\t\tconst header = svg.indexOf('-->') + 3;\n\t\tsvg = svg.slice(0, header) + swap(svg.slice(header));\n\t\tmotion = { svg, animate: animate.map((a) => (a.attrs ? { ...a, attrs: Object.fromEntries(Object.entries(a.attrs).map(([k, [x, y]]) => [k, [typeof x === 'string' ? swap(x) : x, typeof y === 'string' ? swap(y) : y] as const])) } : a)) };\n\t}\n\treturn { motion, duration: timeline.duration, hold: Math.max(0, round(timeline.duration - lastChange)), sampled, notes: [...new Set(notes)] };\n}\n\nexport interface FlairEffectOptions extends FlairExportOptions {\n\t/** Kebab-case id (default: the scene's name). */\n\tid?: string;\n\tname?: string;\n\tdescription?: string;\n\t/** Flair catalog category (default `icon`). */\n\tcategory?: string;\n\ttags?: string[];\n\ttrigger?: FlairVectorEffect['trigger'];\n}\n\nconst kebab = (text: string) =>\n\ttext\n\t\t.trim()\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t.replace(/[^A-Za-z0-9]+/g, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.toLowerCase() || 'animation';\n\n/** A scene as a Flair catalog vector effect, with its colour controls and presets. */\nexport function toFlairVectorEffect(scene: MotionScene, options: FlairEffectOptions = {}): FlairVectorEffect {\n\tconst out = toFlairSvgMotion(scene, options);\n\treturn {\n\t\tkind: 'vector',\n\t\tid: options.id ?? kebab(scene.name),\n\t\tname: options.name ?? scene.name,\n\t\tdescription: options.description ?? scene.description ?? '',\n\t\tcategory: options.category ?? 'icon',\n\t\ttags: options.tags ?? [],\n\t\tmotion: out.motion,\n\t\thold: out.hold,\n\t\t...(scene.presets?.length ? { presets: scene.presets } : {}),\n\t\t...(options.trigger ? { trigger: options.trigger } : {})\n\t};\n}\n\n/** A scene as a document for Flair's `EffectEditor` (`replaceDocument`). */\nexport function toFlairEffectDocument(scene: MotionScene, options: FlairExportOptions = {}): FlairEffectDocument {\n\tconst out = toFlairSvgMotion(scene, options);\n\treturn {\n\t\tversion: 1,\n\t\tname: scene.name,\n\t\teffect: { kind: 'vector', motion: out.motion, hold: out.hold },\n\t\tvalues: Object.fromEntries((scene.controls ?? []).map((c) => [c.name, c.default])),\n\t\ttracks: {},\n\t\tduration: out.duration,\n\t\tloop: (scene.loop ?? 'none') !== 'none',\n\t\tpresets: scene.presets ?? []\n\t};\n}\n","import type { MotionBehavior } from '../animation/behavior.js';\nimport type { AnimationEasing } from '../animation/easing.js';\nimport { applyMatrix, invertMatrix, multiplyMatrices, nodeMatrix, type AffineMatrix } from '../vector/geometry.js';\nimport { parseSvgTransform, parseVectorSvg } from '../vector/svg.js';\nimport { checkMotionScene } from './check.js';\nimport { indexMotionNodes, MOTION_EASE_IN_OUT, MOTION_EASE_OUT, type MotionNodeEntry } from './compile.js';\nimport type { FlairEase, FlairSvgAnimation, FlairSvgMotion, FlairVectorEffect } from './flair.js';\nimport type { MotionIssue } from './issues.js';\nimport { motionSceneShapeProblems } from './parse.js';\nimport type { MotionCamera, MotionCommand, MotionControl, MotionScene, MotionShot } from './types.js';\n\n/**\n * Import from Flair: a Flair `SvgMotion` (or a catalog `VectorEffect`) becomes a scene, so an\n * effect made in Flair, or taken from its catalog, can be opened and edited here. The reverse\n * of `toFlairSvgMotion`, as far as the scene model goes:\n *\n * - The SVG becomes the artwork (`parseVectorSvg`); `{{name: color …}}` placeholders become\n * colour controls (other placeholders take their defaults).\n * - Each Flair step becomes a shot, its changes commands timed by their `delay`, all together.\n * - Opacity, paint, stroke width, transforms (as move, rotate and scale), drawing on, following\n * a path, camera views and behaviours (pulse, shake, teeter, wave, wiggle, colour pulse) carry\n * over. Counting, writing text, solo containers and anything else are listed in `notes`.\n */\n\nexport interface FlairImportResult {\n\tscene: MotionScene;\n\t/** What could not be carried over exactly, in sentences. */\n\tnotes: string[];\n\t/** `checkMotionScene` of the result. */\n\tissues: MotionIssue[];\n}\n\nexport interface FlairImportOptions {\n\t/** The scene's name (default: the effect's, else `from-flair`). */\n\tname?: string;\n\t/** Hold after the last shot, ms (default: the effect's `hold`, else 600). */\n\thold?: number;\n}\n\n/** A `{{name}}` placeholder or `{{name: type attributes}}` declaration, as Flair writes them. */\nconst PLACEHOLDER = /\\{\\{\\s*([A-Za-z_]\\w*)\\s*(?::\\s*([A-Za-z0-9]*)([^}]*))?\\}\\}/g;\n\nfunction attributeOf(attrs: string, name: string): string | undefined {\n\tconst m = new RegExp(`(?:^|\\\\s)${name}=(?:'([^']*)'|(\\\\S+))`).exec(attrs);\n\treturn m ? (m[1] ?? m[2]) : undefined;\n}\n\n/** Placeholders replaced by their defaults; colour declarations become controls. */\nfunction resolvePlaceholders(motion: FlairSvgMotion, notes: string[]): { motion: FlairSvgMotion; controls: MotionControl[] } {\n\tconst text = JSON.stringify(motion);\n\tconst declared = new Map<string, { type: string; value: string; label?: string }>();\n\tfor (const m of text.matchAll(PLACEHOLDER)) {\n\t\tif (!m[2] || declared.has(m[1])) continue;\n\t\tconst attrs = m[3] ?? '';\n\t\tconst value = attributeOf(attrs, 'default');\n\t\tconst fallback = m[2] === 'color' ? '#000000' : '0';\n\t\tdeclared.set(m[1], { type: m[2], value: m[2] === 'color' ? (value ?? fallback).toLowerCase() : (value ?? fallback), ...(attributeOf(attrs, 'label') ? { label: attributeOf(attrs, 'label') } : {}) });\n\t}\n\tconst controls: MotionControl[] = [];\n\tfor (const [name, d] of declared) {\n\t\tif (d.type === 'color' && /^#[0-9a-fA-F]{6}$/.test(d.value)) controls.push({ name, type: 'color', default: d.value.toLowerCase(), ...(d.label ? { label: d.label } : {}) });\n\t\telse notes.push(`Control \"${name}\" (${d.type}) is fixed at its default ${d.value}: scenes take colour controls only.`);\n\t}\n\tconst unknown = new Set<string>();\n\tconst filled = text.replace(PLACEHOLDER, (_, name: string) => {\n\t\tconst d = declared.get(name);\n\t\tif (!d) unknown.add(name);\n\t\treturn (d?.value ?? '').replace(/\"/g, '\\\\\"');\n\t});\n\tfor (const name of unknown) notes.push(`Placeholder \"{{${name}}}\" has no declaration, so it was left empty.`);\n\t// SVG comments (where Flair declares controls) are dropped with the markup's comments.\n\treturn { motion: JSON.parse(filled) as FlairSvgMotion, controls };\n}\n\n/** A Flair ease as an editor easing. Flair's `in-out` is a cubic polynomial, close to the editor's ease-in-out curve. */\nfunction easingOf(ease: FlairEase | undefined, fallback: AnimationEasing): AnimationEasing {\n\tif (ease === undefined) return fallback;\n\tif (ease === 'linear') return 'linear';\n\tif (ease === 'out') return MOTION_EASE_OUT;\n\tif (ease === 'in-out') return MOTION_EASE_IN_OUT;\n\tif (Array.isArray(ease)) return { type: 'cubic-bezier', x1: ease[0], y1: ease[1], x2: ease[2], y2: ease[3] };\n\tif (typeof ease === 'object' && 'spring' in ease) return { type: 'spring', ...ease.spring };\n\treturn fallback;\n}\n\ninterface Pose {\n\tdx: number;\n\tdy: number;\n\trotation: number;\n\tsx: number;\n\tsy: number;\n}\n\n/** A Flair transform value as the editor's offset from the node's rest (move, turn and scale about its centre), or null when it skews. */\nfunction poseOf(value: string | number, entry: MotionNodeEntry): Pose | null {\n\tconst t = parseSvgTransform(String(value));\n\tconst o: AffineMatrix = multiplyMatrices(invertMatrix(nodeMatrix(entry.node)) ?? [1, 0, 0, 1, 0, 0], t);\n\tconst sx = Math.hypot(o[0], o[1]);\n\tif (!(sx > 1e-9)) return null;\n\tconst sy = (o[0] * o[3] - o[1] * o[2]) / sx;\n\t// No skew: the second column is the first turned a quarter, times sy.\n\tif (Math.abs(o[2] + (o[1] / sx) * sy) > 1e-6 || Math.abs(o[3] - (o[0] / sx) * sy) > 1e-6) return null;\n\tconst c = entry.center;\n\tconst moved = applyMatrix(o, c);\n\treturn { dx: moved.x - c.x, dy: moved.y - c.y, rotation: (Math.atan2(o[1], o[0]) * 180) / Math.PI, sx, sy };\n}\n\nconst near = (a: number, b: number, eps = 1e-6) => Math.abs(a - b) < eps;\nconst r3 = (n: number) => Math.round(n * 1000) / 1000;\n\n/** One Flair change as commands (all starting together), or a note on why it is skipped. */\nfunction commandsFor(anim: FlairSvgAnimation, nodes: Map<string, MotionNodeEntry>, entered: Set<string>, notes: string[]): MotionCommand[] {\n\tconst id = anim.id!;\n\tconst entry = nodes.get(id);\n\tconst where = `\"${id}\"`;\n\tif (!entry) {\n\t\tnotes.push(`A change to ${where} was skipped: the artwork has no element with that id.`);\n\t\treturn [];\n\t}\n\tconst targets = [id];\n\tconst duration = anim.ms ?? 800;\n\tconst timing = {\n\t\tduration,\n\t\t...(anim.strobe ? { steps: anim.strobe } : {}),\n\t\t...(anim.repeat && anim.repeat > 1 ? { repeat: anim.repeat, ...(anim.alternate ? { repeatMode: 'mirror' as const } : {}) } : {})\n\t};\n\tconst ease = (fallback: AnimationEasing) => ({ ease: easingOf(anim.ease, fallback) });\n\tconst out: MotionCommand[] = [];\n\tconst behavior: MotionBehavior | undefined = anim.behavior;\n\tconst unsupported = (['count', 'write', 'scramble', 'solo'] as const).filter((k) => (anim as Record<string, unknown>)[k] !== undefined);\n\tif (unsupported.length) notes.push(`${where}: ${unsupported.join(', ')} ${unsupported.length > 1 ? 'are' : 'is'} not part of scenes and was skipped.`);\n\n\tif (anim.draw !== undefined && anim.draw !== false) {\n\t\tconst [from, to] = anim.draw === true ? [0, 1] : anim.draw;\n\t\tout.push({ type: 'draw', targets, from, to, ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t}\n\tif (anim.along) {\n\t\tconst path = nodes.get(anim.along);\n\t\tif (!path || path.node.type !== 'path') notes.push(`${where} follows \"${anim.along}\", which is not a path in the artwork; the follow was skipped.`);\n\t\telse out.push({ type: 'follow', targets, path: anim.along, from: anim.at?.[0] ?? 0, to: anim.at?.[1] ?? 1, ...(anim.orient ? { rotate: true } : {}), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t}\n\tfor (const [attr, [a, b]] of Object.entries(anim.attrs ?? {})) {\n\t\tif (attr === 'opacity') {\n\t\t\tconst [from, to] = [Number(a), Number(b)];\n\t\t\tif (behavior) notes.push(`${where}: an opacity ${behavior.type} became a plain fade.`);\n\t\t\tif (from === 0 && to > 0 && !entered.has(id)) {\n\t\t\t\tentered.add(id);\n\t\t\t\tout.push({ type: 'enter', targets, style: 'fade', ...timing, ...ease(MOTION_EASE_OUT) });\n\t\t\t} else out.push({ type: 'fade', targets, to: Math.min(1, Math.max(0, to)), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t\t} else if (attr === 'fill' || attr === 'stroke') {\n\t\t\tif (behavior?.type === 'pulse') out.push({ type: 'color-pulse', targets, color: String(b), paint: attr, count: behavior.count ?? 1, ...timing, ...ease('linear') });\n\t\t\telse {\n\t\t\t\tif (behavior) notes.push(`${where}: a ${attr} ${behavior.type} became a plain colour change.`);\n\t\t\t\tout.push({ type: 'style', targets, [attr]: String(b), ...timing, ...ease(MOTION_EASE_IN_OUT) } as MotionCommand);\n\t\t\t}\n\t\t} else if (attr === 'stroke-width') {\n\t\t\tout.push({ type: 'style', targets, strokeWidth: Number(b), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t\t} else if (attr === 'transform') {\n\t\t\tconst p0 = poseOf(a, entry);\n\t\t\tconst p1 = poseOf(b, entry);\n\t\t\tif (!p0 || !p1) {\n\t\t\t\tnotes.push(`${where}: a transform that skews was skipped (scenes move, turn and scale).`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst d = { x: r3(p1.dx - p0.dx), y: r3(p1.dy - p0.dy), r: r3(p1.rotation - p0.rotation), sx: p1.sx / p0.sx, sy: p1.sy / p0.sy };\n\t\t\tif (behavior) {\n\t\t\t\tconst linear = ease('linear');\n\t\t\t\tconst moves = d.x !== 0 || d.y !== 0;\n\t\t\t\tconst turns = d.r !== 0;\n\t\t\t\tconst scales = !near(d.sx, 1) || !near(d.sy, 1);\n\t\t\t\tif (behavior.type === 'pulse' && scales && !moves && !turns) out.push({ type: 'pulse', targets, amount: r3(d.sx - 1), count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && (behavior.decay ?? 0) > 0 && turns && !moves && !scales) out.push({ type: 'teeter', targets, angle: d.r, count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && (behavior.decay ?? 0) > 0 && moves && !turns && !scales && (d.x === 0 || d.y === 0))\n\t\t\t\t\tout.push({ type: 'shake', targets, amount: d.x || d.y, count: behavior.count ?? 1, ...(d.x === 0 ? { axis: 'vertical' as const } : {}), ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && !behavior.decay && d.x === 0 && d.y !== 0 && !turns && !scales) out.push({ type: 'wave', targets, amount: -d.y, count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'wriggle' && !scales)\n\t\t\t\t\tout.push({ type: 'wiggle', targets, amount: Math.max(Math.abs(d.x), Math.abs(d.y)), ...(turns ? { rotate: Math.abs(d.r) } : {}), frequency: behavior.frequency ?? 2, octaves: behavior.octaves ?? 2, seed: behavior.seed ?? 42, ...timing, ...linear });\n\t\t\t\telse notes.push(`${where}: a transform ${behavior.type} that is not a pulse, shake, teeter, wave or wiggle was skipped.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst e = ease(MOTION_EASE_IN_OUT);\n\t\t\tif (d.x !== 0 || d.y !== 0) out.push({ type: 'move', targets, by: { x: d.x, y: d.y }, ...timing, ...e });\n\t\t\tif (d.r !== 0) out.push({ type: 'rotate', targets, to: r3(p1.rotation), ...timing, ...e });\n\t\t\tif (!near(d.sx, 1) || !near(d.sy, 1)) out.push({ type: 'scale', targets, to: near(p1.sx, p1.sy) ? r3(p1.sx) : { x: r3(p1.sx), y: r3(p1.sy) }, ...timing, ...e });\n\t\t} else notes.push(`${where}: changing \"${attr}\" is not part of scenes and was skipped.`);\n\t}\n\treturn out;\n}\n\n/** A Flair `SvgMotion` as a scene (see the module notes for what carries over). */\nexport function fromFlairSvgMotion(input: FlairSvgMotion, options: FlairImportOptions = {}): FlairImportResult {\n\tconst notes: string[] = [];\n\tif (!input || typeof input.svg !== 'string') throw new Error('Give a Flair SvgMotion: { svg: \"<svg …>\", animate: [ … ] }.');\n\tconst { motion, controls } = resolvePlaceholders(input, notes);\n\tconst artwork = parseVectorSvg(motion.svg);\n\tconst nodes = indexMotionNodes(artwork.nodes);\n\tconst byStep = new Map<number, FlairSvgAnimation[]>();\n\tfor (const anim of motion.animate ?? []) {\n\t\tconst step = Math.max(0, Math.floor(anim.step ?? 0));\n\t\tif (!byStep.has(step)) byStep.set(step, []);\n\t\tbyStep.get(step)!.push(anim);\n\t}\n\tconst steps = [...byStep.keys()].sort((a, b) => a - b);\n\tif (steps.length > 1) notes.push('Each Flair step became a shot played after the one before (Flair steps wait for clicks or set times).');\n\tconst entered = new Set<string>();\n\tconst shots: MotionShot[] = steps.map((step, index) => {\n\t\tconst anims = [...byStep.get(step)!].sort((a, b) => (a.delay ?? 0) - (b.delay ?? 0));\n\t\tlet camera: MotionCamera | undefined;\n\t\tlet cameraMs = 0;\n\t\tconst run: MotionCommand[] = [];\n\t\tlet last = 0;\n\t\tfor (const anim of anims) {\n\t\t\tif (anim.view !== undefined) {\n\t\t\t\tif (camera || (anim.delay ?? 0) > 0) {\n\t\t\t\t\tnotes.push(`Step ${step}: a camera move ${camera ? 'after the first' : `${anim.delay} ms in`} was dropped; a shot frames the camera once, at its start.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ms = anim.ms ?? 800;\n\t\t\t\tconst ease = easingOf(anim.ease, MOTION_EASE_IN_OUT);\n\t\t\t\tcamera = typeof anim.view === 'string' ? { frame: anim.view, padding: 0, ms, ease } : { x: anim.view[0], y: anim.view[1], width: anim.view[2], height: anim.view[3], ms, ease };\n\t\t\t\tcameraMs = index === 0 ? 0 : ms;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!anim.id) continue;\n\t\t\t// A shot's commands start after its camera move: earlier changes are pushed back to it.\n\t\t\tconst at = Math.max(0, (anim.delay ?? 0) - cameraMs);\n\t\t\tif (cameraMs && (anim.delay ?? 0) < cameraMs) notes.push(`Step ${step}: a change to \"${anim.id}\" during the camera move now starts after it.`);\n\t\t\tfor (const command of commandsFor(anim, nodes, entered, notes)) {\n\t\t\t\tconst first = run.length === 0;\n\t\t\t\trun.push({ ...command, ...(first ? {} : { with: 'previous' as const }), ...(at - last > 0 || first ? { delay: first ? at : at - last } : {}) } as MotionCommand);\n\t\t\t\tif (first && at === 0) delete (run[run.length - 1] as { delay?: number }).delay;\n\t\t\t\tlast = at;\n\t\t\t}\n\t\t}\n\t\treturn { id: `step-${step}`, ...(camera ? { camera } : {}), run, ...(index === steps.length - 1 ? { hold: options.hold ?? 600 } : {}) };\n\t});\n\tconst scene: MotionScene = { version: 1, name: options.name ?? 'from-flair', artwork, shots, ...(controls.length ? { controls } : {}) };\n\tconst problems = motionSceneShapeProblems(scene);\n\tif (problems.length) throw new Error(`The imported scene is not well formed:\\n${problems.join('\\n')}`);\n\treturn { scene, notes: [...new Set(notes)], issues: checkMotionScene(scene) };\n}\n\n/** A Flair catalog `VectorEffect` as a scene: its motion, name, description, colour controls and presets. */\nexport function fromFlairVectorEffect(effect: FlairVectorEffect, options: FlairImportOptions = {}): FlairImportResult {\n\tif (!effect || effect.kind !== 'vector' || !effect.motion) throw new Error('Give a Flair vector effect: { kind: \"vector\", id, name, motion: { svg, animate } }.');\n\tconst result = fromFlairSvgMotion(effect.motion, { name: options.name ?? effect.id ?? effect.name, hold: options.hold ?? effect.hold });\n\tconst names = new Set((result.scene.controls ?? []).map((c) => c.name));\n\tconst presets = (effect.presets ?? []).map((p) => ({ name: p.name, values: Object.fromEntries(Object.entries(p.values).filter(([k]) => names.has(k))) })).filter((p) => Object.keys(p.values).length);\n\tconst scene: MotionScene = { ...result.scene, ...(effect.description ? { description: effect.description } : {}), ...(presets.length ? { presets } : {}) };\n\tconst notes = [...result.notes];\n\tif (effect.trigger) notes.push(`The effect plays on ${effect.trigger}; scenes play through, so the trigger is not kept (pass it back to toFlairVectorEffect).`);\n\treturn { scene, notes, issues: checkMotionScene(scene) };\n}\n","import type { Clock } from '../animation/clock.js';\nimport type { AnimationLoopMode } from '../animation/evaluate.js';\nimport { AnimationPlayer } from '../animation/player.js';\nimport { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command } from '../history/types.js';\nimport type { VectorDocument } from '../vector/types.js';\nimport { checkMotionScene } from './check.js';\nimport { compileMotionScene, motionShotAt, type MotionShotTiming } from './compile.js';\nimport { applyMotionEdits, createMotionScene, type MotionEdit, type MotionEditResult } from './edit.js';\nimport { motionFrameAt, motionFrameToSvg, type MotionFrame, type MotionFrameOptions, type MotionSvgOptions } from './evaluate.js';\nimport { toFlairEffectDocument, toFlairSvgMotion, toFlairVectorEffect, type FlairEffectOptions, type FlairExportOptions } from './flair.js';\nimport type { MotionIssue } from './issues.js';\nimport { parseMotionScene } from './parse.js';\nimport type { MotionScene } from './types.js';\n\nexport interface AnimationEditorOptions {\n\t/** The scene to open (default: an empty one over a blank 800 × 450 artwork). */\n\tscene?: MotionScene;\n\t/** Shared undo history (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Time source for playback (default: requestAnimationFrame). Pass a `ManualClock` to step frames. */\n\tclock?: Clock;\n\treadOnly?: boolean;\n\t/** Called after every change to the scene (not on playback or selection). */\n\tonChange?: (scene: MotionScene) => void;\n}\n\n/** What is selected on the timeline: a shot, and optionally one of its commands. */\nexport interface AnimationEditorSelection {\n\tshot: string;\n\tcommand?: number;\n}\n\n/** A snapshot of the editor. The same object is returned until something changes. */\nexport interface AnimationEditorState {\n\tscene: MotionScene;\n\t/** Total length (ms). */\n\tduration: number;\n\t/** Each shot's timing. */\n\tshots: readonly MotionShotTiming[];\n\t/** The scene's problems (see `checkMotionScene`). */\n\tissues: readonly MotionIssue[];\n\t/** Playhead (ms). */\n\ttime: number;\n\tplaying: boolean;\n\tloop: AnimationLoopMode;\n\t/** Id of the shot under the playhead. */\n\tcurrentShot: string | null;\n\tselection: AnimationEditorSelection | null;\n\treadOnly: boolean;\n\t/** Why the last edit was refused, if it was. */\n\terror: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nconst BLANK: VectorDocument = { width: 800, height: 450, background: '#ffffff', nodes: [] };\n\n/**\n * Headless editor for a vector animation (a `MotionScene`): undoable, all-or-nothing edits,\n * playback on an injectable clock, a timeline selection and frames at any time. UI-agnostic:\n * React and Svelte bind it with `useAnimationEditor` / `createAnimationEditor`, and agents\n * drive it through `createAnimationEditorToolProvider`. `getState()` returns the same object\n * until something changes, so it works with `useSyncExternalStore` and Svelte runes.\n */\nexport class AnimationEditorController {\n\treadonly history: HistoryManager;\n\treadonly player: AnimationPlayer;\n\tprivate scene: MotionScene;\n\tprivate issues: MotionIssue[];\n\tprivate selection: AnimationEditorSelection | null = null;\n\tprivate readOnly: boolean;\n\tprivate error: string | null = null;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate readonly onChange?: (scene: MotionScene) => void;\n\tprivate readonly listeners = new Set<(state: AnimationEditorState) => void>();\n\tprivate readonly unsubscribers: (() => void)[] = [];\n\tprivate state!: AnimationEditorState;\n\n\tconstructor(options: AnimationEditorOptions = {}) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.scene = options.scene ? parseMotionScene(options.scene) : createMotionScene(BLANK);\n\t\tthis.issues = checkMotionScene(this.scene);\n\t\tthis.readOnly = options.readOnly ?? false;\n\t\tthis.onChange = options.onChange;\n\t\tthis.player = new AnimationPlayer({ clock: options.clock, duration: () => compileMotionScene(this.scene).duration, loop: this.scene.loop ?? 'none' });\n\t\tthis.state = this.computeState();\n\t\tthis.connect();\n\t}\n\n\tprivate connect() {\n\t\tif (this.unsubscribers.length) return;\n\t\tthis.unsubscribers.push(\n\t\t\tthis.player.subscribe(() => this.notify()),\n\t\t\tthis.history.subscribe(() => {\n\t\t\t\tif (!this.applying) this.notify();\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Pauses and stops listening to the player and history. Subscribing again reconnects, so a\n\t * controller survives React StrictMode's unmount / remount.\n\t */\n\tdestroy(): void {\n\t\tthis.player.pause();\n\t\tthis.unsubscribers.splice(0).forEach((u) => u());\n\t}\n\n\tgetState = (): AnimationEditorState => this.state;\n\n\tsubscribe = (listener: (state: AnimationEditorState) => void): (() => void) => {\n\t\tthis.connect();\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\t/** The current scene (immutable; edit through the controller). */\n\tgetScene(): MotionScene {\n\t\treturn this.scene;\n\t}\n\n\tprivate computeState(): AnimationEditorState {\n\t\tconst timeline = compileMotionScene(this.scene);\n\t\tconst p = this.player.getState();\n\t\tconst h = this.history.getState();\n\t\treturn {\n\t\t\tscene: this.scene,\n\t\t\tduration: timeline.duration,\n\t\t\tshots: timeline.shots,\n\t\t\tissues: this.issues,\n\t\t\ttime: p.time,\n\t\t\tplaying: p.playing,\n\t\t\tloop: p.loop,\n\t\t\tcurrentShot: motionShotAt(timeline, p.time)?.id ?? null,\n\t\t\tselection: this.selection,\n\t\t\treadOnly: this.readOnly,\n\t\t\terror: this.error,\n\t\t\tcanUndo: h.canUndo,\n\t\t\tcanRedo: h.canRedo,\n\t\t\tundoLabel: h.undoName,\n\t\t\tredoLabel: h.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify() {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[AnimationEditorController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setScene(scene: MotionScene) {\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tthis.scene = scene;\n\t\t\tthis.issues = checkMotionScene(scene);\n\t\t\tif (this.selection) {\n\t\t\t\tconst shot = scene.shots.find((s) => s.id === this.selection!.shot);\n\t\t\t\tif (!shot) this.selection = null;\n\t\t\t\telse if (this.selection.command !== undefined && this.selection.command >= shot.run.length) this.selection = { shot: shot.id };\n\t\t\t}\n\t\t\tthis.player.setLoop(scene.loop ?? 'none');\n\t\t\tthis.player.setDuration(() => compileMotionScene(this.scene).duration);\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify();\n\t\tthis.onChange?.(scene);\n\t}\n\n\tprivate commit(label: string, next: MotionScene) {\n\t\tconst before = this.scene;\n\t\tthis.error = null;\n\t\tif (next === before) {\n\t\t\tthis.notify();\n\t\t\treturn;\n\t\t}\n\t\tconst command: Command = {\n\t\t\tname: label,\n\t\t\ttag: 'animation-editor',\n\t\t\texecute: () => this.setScene(next),\n\t\t\tundo: () => this.setScene(before),\n\t\t\tredo: () => this.setScene(next)\n\t\t};\n\t\tthis.history.execute(command);\n\t}\n\n\tprivate refuse(message: string): MotionEditResult {\n\t\tthis.error = message;\n\t\tthis.notify();\n\t\treturn { ok: false, error: message };\n\t}\n\n\t/** Why edits are refused now, or `null` when they are allowed. */\n\treadOnlyReason(): string | null {\n\t\treturn this.readOnly ? 'The animation is read-only.' : null;\n\t}\n\n\t/**\n\t * Applies edits as one undo step, all or nothing (see `applyMotionEdits`). With\n\t * `dryRun` it reports what would happen and changes nothing.\n\t */\n\tapply(edits: MotionEdit | readonly MotionEdit[], label = 'Edit animation', options: { dryRun?: boolean } = {}): MotionEditResult {\n\t\tconst reason = this.readOnlyReason();\n\t\tif (reason) return this.refuse(reason);\n\t\tconst result = applyMotionEdits(this.scene, edits);\n\t\tif (!result.ok) return options.dryRun ? result : this.refuse(result.error);\n\t\tif (!options.dryRun) this.commit(label, result.scene);\n\t\treturn result;\n\t}\n\n\t/** Replaces the artwork (e.g. from a vector editor's `onChange`), as one undo step. */\n\tsetArtwork(artwork: VectorDocument, label = 'Change artwork'): MotionEditResult {\n\t\treturn this.apply({ op: 'set_artwork', artwork }, label);\n\t}\n\n\t/** Opens a scene (JSON or object). `clearHistory` drops the undo stack (opening a file); otherwise it is one undo step. */\n\tload(scene: MotionScene | string, options: { clearHistory?: boolean } = {}): MotionEditResult {\n\t\tlet parsed: MotionScene;\n\t\ttry {\n\t\t\tparsed = parseMotionScene(scene);\n\t\t} catch (error) {\n\t\t\treturn this.refuse((error as Error).message);\n\t\t}\n\t\tif (options.clearHistory) {\n\t\t\tthis.history.clear();\n\t\t\tthis.error = null;\n\t\t\tthis.selection = null;\n\t\t\tthis.setScene(parsed);\n\t\t\tthis.player.seek(0);\n\t\t\treturn { ok: true, scene: parsed, issues: this.issues, hints: [] };\n\t\t}\n\t\treturn this.apply({ op: 'replace_scene', scene: parsed }, 'Replace animation');\n\t}\n\n\tsetReadOnly(readOnly: boolean): void {\n\t\tif (this.readOnly === readOnly) return;\n\t\tthis.readOnly = readOnly;\n\t\tthis.notify();\n\t}\n\n\t/** Selects a shot (and optionally a command in it); `null` clears. Unknown shots clear. */\n\tselect(selection: AnimationEditorSelection | null): void {\n\t\tconst shot = selection && this.scene.shots.find((s) => s.id === selection.shot);\n\t\tconst next = shot ? { shot: shot.id, ...(selection!.command !== undefined && selection!.command < shot.run.length ? { command: selection!.command } : {}) } : null;\n\t\tif (JSON.stringify(next) === JSON.stringify(this.selection)) return;\n\t\tthis.selection = next;\n\t\tthis.notify();\n\t}\n\n\tplay(): void {\n\t\tthis.player.play();\n\t}\n\n\tpause(): void {\n\t\tthis.player.pause();\n\t}\n\n\ttoggle(): void {\n\t\tthis.player.toggle();\n\t}\n\n\t/** Moves the playhead (ms). */\n\tseek(time: number): void {\n\t\tthis.player.seek(time);\n\t}\n\n\t/** Moves the playhead to the start or end of a shot. Returns false for an unknown shot. */\n\tseekShot(id: string, at: 'start' | 'end' = 'start'): boolean {\n\t\tconst shot = compileMotionScene(this.scene).shots.find((s) => s.id === id);\n\t\tif (!shot) return false;\n\t\tthis.player.seek(at === 'start' ? shot.start : shot.end);\n\t\treturn true;\n\t}\n\n\tundo(): boolean {\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\treturn this.history.redo();\n\t}\n\n\t/** The scene at `time` (default: the playhead). */\n\tframe(time = this.player.currentTime, options: MotionFrameOptions = {}): MotionFrame {\n\t\treturn motionFrameAt(this.scene, time, options);\n\t}\n\n\t/** The scene at `time` (default: the playhead) as SVG. */\n\ttoSvg(time = this.player.currentTime, options: MotionSvgOptions = {}): string {\n\t\treturn motionFrameToSvg(this.scene, time, options);\n\t}\n\n\t/** The scene as a Flair `SvgMotion`. */\n\ttoFlairMotion(options: FlairExportOptions = {}) {\n\t\treturn toFlairSvgMotion(this.scene, options);\n\t}\n\n\t/** The scene as a Flair catalog vector effect. */\n\ttoFlairEffect(options: FlairEffectOptions = {}) {\n\t\treturn toFlairVectorEffect(this.scene, options);\n\t}\n\n\t/** The scene as a Flair `EffectDocument`. */\n\ttoFlairDocument(options: FlairExportOptions = {}) {\n\t\treturn toFlairEffectDocument(this.scene, options);\n\t}\n}\n","import { ANIMATION_EASING_PRESETS } from '../animation/easing.js';\nimport type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport { parseVectorSvg } from '../vector/svg.js';\nimport type { VectorNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes } from './compile.js';\nimport { fitMotionScene } from './fit.js';\nimport { fromFlairSvgMotion, fromFlairVectorEffect, type FlairImportResult } from './flair-import.js';\nimport type { AnimationEditorController } from './controller.js';\nimport { MOTION_EDIT_OPS, type MotionEdit, type MotionEditResult } from './edit.js';\nimport { motionIssueLine, type MotionIssue } from './issues.js';\nimport { MOTION_COMMAND_TYPES, MOTION_DIRECTIONS, MOTION_ENTER_STYLES, MOTION_EXIT_STYLES, MOTION_IRIS_SHAPES, MOTION_REPEAT_MODES, MOTION_BLENDS, MOTION_SPLIT_ORIENTATIONS, motionFlairPrimitive, type MotionScene } from './types.js';\n\nexport interface AnimationEditorToolProviderOptions {\n\t/** Provider id (unique per registry). Default `animation`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/** The animation cannot be edited: write tools are hidden and `get_animation` says why. A string is the reason. */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** Turns SVG into PNG (e.g. `rasterizeSvg`), so `render_animation_frame` can return an image. */\n\trasterize?: (svg: string, size: { width: number; height: number }) => Promise<{ data: string; mimeType: string }> | { data: string; mimeType: string };\n}\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false } as const;\nconst WRITE_IDEMPOTENT = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst object = (properties: Record<string, JsonSchema>, required: string[] = [], description?: string): JsonSchema & { type: 'object' } => ({\n\ttype: 'object' as const,\n\t...(description ? { description } : {}),\n\tproperties,\n\t...(required.length ? { required } : {}),\n\tadditionalProperties: false\n});\n\nconst SHOT_ID = { type: 'string', minLength: 1, description: 'A shot id from get_animation (e.g. \"intro\").' } as const;\nconst NODE_IDS = { type: 'array', items: { type: 'string', minLength: 1 }, minItems: 1, description: 'Node ids from get_animation\\'s \"elements\" (a group animates as one).' } as const;\nconst MS = (what: string) => ({ type: 'number', minimum: 0, description: `${what} in milliseconds.` }) as const;\nconst FRACTION = (what: string) => ({ type: 'number', minimum: 0, maximum: 1, description: what }) as const;\nconst POINT = (what: string) => object({ x: { type: 'number', description: 'Document units.' }, y: { type: 'number', description: 'Document units.' } }, ['x', 'y'], what);\nconst EASE: JsonSchema = {\n\tdescription: `Easing: a preset (${ANIMATION_EASING_PRESETS.join(', ')}), { \"type\": \"cubic-bezier\", \"x1\", \"y1\", \"x2\", \"y2\" }, { \"type\": \"spring\", … } or { \"type\": \"elastic\", … }. The spring presets are Figma's: gentle, quick, bouncy, slow. A command with a spring and no \"duration\" lasts until the spring settles. Default: a cubic ease-out for entrances, cubic ease-in-out for moves.`,\n\tanyOf: [\n\t\t{ type: 'string', enum: [...ANIMATION_EASING_PRESETS] },\n\t\tobject({ type: { const: 'cubic-bezier', description: 'Curve kind.' }, x1: { type: 'number', description: 'Out handle x (0–1).' }, y1: { type: 'number', description: 'Out handle y.' }, x2: { type: 'number', description: 'In handle x (0–1).' }, y2: { type: 'number', description: 'In handle y.' } }, ['type', 'x1', 'y1', 'x2', 'y2']),\n\t\tobject(\n\t\t\t{\n\t\t\t\ttype: { const: 'spring', description: 'A damped spring (may overshoot).' },\n\t\t\t\tstiffness: { type: 'number', exclusiveMinimum: 0, description: 'Stiffness (default 170; quick 300, bouncy 600).' },\n\t\t\t\tdamping: { type: 'number', minimum: 0, description: 'Damping (default 26; lower bounces more).' },\n\t\t\t\tmass: { type: 'number', exclusiveMinimum: 0, description: 'Mass (default 1).' },\n\t\t\t\tvelocity: { type: 'number', description: 'Starting speed, in changes per second (default 0).' }\n\t\t\t},\n\t\t\t['type']\n\t\t),\n\t\tobject(\n\t\t\t{\n\t\t\t\ttype: { const: 'elastic', description: 'A decaying wobble.' },\n\t\t\t\tamplitude: { type: 'number', minimum: 0, description: 'Overshoot factor (default 1).' },\n\t\t\t\tperiod: { type: 'number', exclusiveMinimum: 0, description: 'Wobble period as a fraction of the length (default 0.3).' },\n\t\t\t\tmode: { type: 'string', enum: ['out', 'in', 'in-out'], description: 'Where it wobbles (default out).' }\n\t\t\t},\n\t\t\t['type']\n\t\t)\n\t]\n};\n\nconst BASE: Record<string, JsonSchema> = {\n\ttargets: NODE_IDS,\n\tduration: MS('Length for each target (each type has a default; draw follows the path length)'),\n\tdelay: MS('Wait before starting (default 0)'),\n\tstagger: MS('Start each further target this much later (default 0)'),\n\twith: { type: 'string', enum: ['after', 'previous'], description: '\"after\" (default) starts when the commands before it finish; \"previous\" starts together with the command before.' },\n\tease: EASE,\n\tnote: { type: 'string', description: 'Why this command is here, in a few words.' },\n\trepeat: { type: 'integer', minimum: 1, maximum: 1000, description: 'Play it this many times (default 1); \"duration\" is one cycle. Not for enter or exit.' },\n\trepeatMode: { type: 'string', enum: [...MOTION_REPEAT_MODES], description: 'loop (default) restarts each cycle, mirror plays every other one backwards, offset carries on from where the last ended (rotate by 90 with repeat 4 makes a full turn).' },\n\tsteps: { type: 'number', exclusiveMinimum: 0, maximum: 120, description: 'Stepped time: hold on a grid of this many frames per second (12 = \"on twos\"). Default: the scene\\'s steps, else smooth.' }\n};\nconst BLEND = (fallback: 'replace' | 'add'): JsonSchema => ({\n\ttype: 'string',\n\tenum: [...MOTION_BLENDS],\n\tdescription: `\"add\" makes it a layer over the pose that stacks with other changes (a shake on a slide); \"replace\" makes it a change the next one takes over from (default ${fallback}).`\n});\nconst command = (type: string, description: string, extra: Record<string, JsonSchema> = {}, required: string[] = []): JsonSchema =>\n\tobject({ type: { const: type, description }, ...BASE, ...extra }, ['type', 'targets', ...required], description);\n\n/** JSON Schema of one command (each type its own strict branch). */\nexport const MOTION_COMMAND_SCHEMA: JsonSchema = {\n\tdescription: `A command (one of ${MOTION_COMMAND_TYPES.join(', ')}). Commands in a shot play one after another unless \"with\": \"previous\".`,\n\toneOf: [\n\t\tcommand('enter', 'Brings hidden targets in; they are hidden before this shot.', {\n\t\t\tstyle: {\n\t\t\t\ttype: 'string',\n\t\t\t\tenum: [...MOTION_ENTER_STYLES],\n\t\t\t\tdescription:\n\t\t\t\t\t'fade (default), pop (scales up past full size and settles), grow (from nothing), slide, draw (outline drawn on, then the fill fades in), zoom (settles from larger), rise (rises a short way, overshooting a touch), or a reveal through a clip over the target\\'s box: wipe (behind a travelling edge), iris (from the centre outwards) or split (from a line through the middle). Reveals need a box with a width and a height (not a lone straight line).'\n\t\t\t},\n\t\t\tdirection: { type: 'string', enum: [...MOTION_DIRECTIONS], description: 'For slide: direction of travel (default up). For wipe: the way the edge travels (default right, revealing from the left).' },\n\t\t\tdistance: { type: 'number', description: 'For slide (default 40) and rise (default 20): document units.' },\n\t\t\tscale: { type: 'number', minimum: 0, description: 'For pop (default 0.5) and zoom (default 1.6): the starting scale (1 = rest size).' },\n\t\t\tshape: { type: 'string', enum: [...MOTION_IRIS_SHAPES], description: 'For iris: open through a circle (default; an ellipse on a box that is not square) or a box.' },\n\t\t\torientation: { type: 'string', enum: [...MOTION_SPLIT_ORIENTATIONS], description: 'For split: horizontal (default) opens up and down from a horizontal line through the middle; vertical opens left and right.' }\n\t\t}),\n\t\tcommand('exit', 'Takes targets out.', {\n\t\t\tstyle: { type: 'string', enum: [...MOTION_EXIT_STYLES], description: 'fade (default), shrink, slide, undraw, or wipe (hides behind a travelling edge through a clip over the target\\'s box: a wipe in, reversed).' },\n\t\t\tdirection: { type: 'string', enum: [...MOTION_DIRECTIONS], description: 'For slide: direction of travel (default down). For wipe: the way the edge travels (default right, hiding from the left).' },\n\t\t\tdistance: { type: 'number', description: 'For slide: document units (default 40).' }\n\t\t}),\n\t\tcommand('draw', 'Draws strokes on (or off) to a fraction of their length.', { to: FRACTION('Fraction drawn at the end (default 1).'), from: FRACTION('Fraction drawn at the start (default: what is drawn now).') }),\n\t\tcommand('move', 'Moves targets by an offset or so their centre lands on a point.', { blend: BLEND('replace'), by: POINT('Offset in document units.'), to: POINT('Point (document coordinates) for the centre.') }),\n\t\tcommand('rotate', 'Turns targets about their centre (degrees, clockwise).', { blend: BLEND('replace'), by: { type: 'number', description: 'Degrees to turn by.' }, to: { type: 'number', description: 'Angle to turn to, in degrees from rest.' } }),\n\t\tcommand('scale', 'Scales targets about their centre (1 = rest size).', { blend: BLEND('replace'), to: { description: 'A factor, or { x, y } factors.', anyOf: [{ type: 'number' }, POINT('Factors per axis.')] }, geometric: { type: 'boolean', description: 'Grow by a steady factor, which reads as an even zoom (default false).' } }, ['to']),\n\t\tcommand('fade', 'Changes opacity.', { to: FRACTION('Opacity at the end (0–1).') }, ['to']),\n\t\tcommand('style', 'Blends solid fill / stroke colours (in OKLab) and stroke width. On a group it changes every path in it.', {\n\t\t\tfill: { type: 'string', description: 'CSS colour (hex, rgb(), rgba()).' },\n\t\t\tstroke: { type: 'string', description: 'CSS colour (hex, rgb(), rgba()).' },\n\t\t\tstrokeWidth: { type: 'number', minimum: 0, description: 'Document units.' }\n\t\t}),\n\t\tcommand('match', 'Smart Animate: tweens a group into another group (usually hidden), part by part. Parts pair by name, then by id with the group ids taken out (card-a-title ↔ card-b-title), then by kind in order; each takes its partner\\'s shape, paint and place. Unpaired parts fade out; parts of \"into\" with no partner do not appear (check_animation lists them).', { into: { type: 'string', minLength: 1, description: 'Id of the group to become.' } }, ['into']),\n\t\tcommand('morph', 'Morphs each target into the shape (and paint) of another node, which usually stays hidden.', { into: { type: 'string', minLength: 1, description: 'Id of the node whose shape to take.' } }, ['into']),\n\t\tcommand('follow', 'Moves targets along a path node, centre on the path.', {\n\t\t\tpath: { type: 'string', minLength: 1, description: 'Id of a path node (it can be hidden).' },\n\t\t\trotate: { type: 'boolean', description: 'Turn with the path (default false); moves and shakes made meanwhile turn with it too.' },\n\t\t\tfrom: FRACTION('Where to start along the path (default 0).'),\n\t\t\tto: FRACTION('Where to end along the path (default 1).')\n\t\t}, ['path']),\n\t\tcommand('pulse', 'Scales up and back to draw the eye.', { blend: BLEND('add'), amount: { type: 'number', description: 'Extra scale at the peak (default 0.15).' }, count: { type: 'integer', minimum: 1, description: 'Pulses (default 1).' } }),\n\t\tcommand('shake', 'Shakes side to side (or up and down), settling.', { blend: BLEND('add'),\n\t\t\tamount: { type: 'number', description: 'Document units (default 8).' },\n\t\t\tcount: { type: 'integer', minimum: 1, description: 'Shakes (default 3).' },\n\t\t\taxis: { type: 'string', enum: ['horizontal', 'vertical'], description: 'Default horizontal.' }\n\t\t}),\n\t\tcommand('teeter', 'Rocks about the centre either way, settling.', { blend: BLEND('add'), angle: { type: 'number', description: 'Degrees either way (default 8).' }, count: { type: 'integer', minimum: 1, description: 'Rocks (default 3).' } }),\n\t\tcommand('wave', 'Bobs up and down without settling, like something floating (default 1000 ms).', { blend: BLEND('add'), amount: { type: 'number', description: 'Height in document units (default 6).' }, count: { type: 'integer', minimum: 1, description: 'Bobs (default 2).' } }),\n\t\tcommand('wiggle', 'Wanders about its place as smooth seeded noise, easing out of and back to rest (default 1500 ms). The same seed always wanders the same way.', { blend: BLEND('add'),\n\t\t\tamount: { type: 'number', description: 'Up to about this far, in document units (default 6).' },\n\t\t\tfrequency: { type: 'number', exclusiveMinimum: 0, description: 'Wanders per second, in Hz (default 3).' },\n\t\t\toctaves: { type: 'integer', minimum: 1, maximum: 8, description: 'Layers of finer detail (default 2).' },\n\t\t\trotate: { type: 'number', description: 'Also turns about the centre by up to about this many degrees (default 0).' },\n\t\t\tseed: { type: 'integer', minimum: 0, description: 'Default: one picked from the target id, so each target wanders its own way.' }\n\t\t}),\n\t\tcommand('color-pulse', 'Tints solid paint toward a colour and back (mixed in OKLab). On a group it tints every path in it.', {\n\t\t\tcolor: { type: 'string', description: 'The tint, a CSS colour (default \"#f59e0b\").' },\n\t\t\tpaint: { type: 'string', enum: ['fill', 'stroke'], description: 'Which paint (default fill).' },\n\t\t\tcount: { type: 'integer', minimum: 1, description: 'Pulses (default 1).' }\n\t\t}),\n\t\tcommand('effect', 'Tweens a numeric parameter of a live path effect on the targets (twist angle, wiggle time, zig zag size, trim offset…).', {\n\t\t\teffect: { type: 'string', minLength: 1, description: 'Effect id from get_animation\\'s element \"effects\".' },\n\t\t\tparam: { type: 'string', minLength: 1, description: 'A numeric parameter of that effect (listed with it).' },\n\t\t\tto: { type: 'number', description: 'Value at the end.' }\n\t\t}, ['effect', 'param', 'to']),\n\t\tobject(\n\t\t\t{ type: { const: 'wait', description: 'Waits.' }, duration: MS('How long'), with: BASE.with, note: BASE.note },\n\t\t\t['type', 'duration'],\n\t\t\t'Waits before the next command.'\n\t\t)\n\t]\n};\n\nconst GEOMETRIC_CAMERA: JsonSchema = { type: 'boolean', description: 'Zoom at a steady rate, so a big zoom does not rush at the start (default false).' };\nconst CAMERA: JsonSchema = {\n\tdescription: 'Where the camera looks: a rectangle { x, y, width, height } in document units, or { frame: \"<node id>\", padding } to frame a node (fitted to the artwork\\'s shape). It eases there over \"ms\" (default 1000); the first shot cuts.',\n\tanyOf: [\n\t\tobject({ x: { type: 'number', description: 'Left.' }, y: { type: 'number', description: 'Top.' }, width: { type: 'number', exclusiveMinimum: 0, description: 'Width.' }, height: { type: 'number', exclusiveMinimum: 0, description: 'Height.' }, ease: EASE, ms: MS('Camera move length'), geometric: GEOMETRIC_CAMERA }, ['x', 'y', 'width', 'height']),\n\t\tobject({ frame: { type: 'string', minLength: 1, description: 'Node id to frame.' }, padding: { type: 'number', description: 'Margin around it (default 24).' }, ease: EASE, ms: MS('Camera move length'), geometric: GEOMETRIC_CAMERA }, ['frame'])\n\t]\n};\n\nconst SHOT_FIELDS: Record<string, JsonSchema> = {\n\tlabel: { type: 'string', description: 'What happens, in a few words.' },\n\tcamera: CAMERA,\n\trun: { type: 'array', items: MOTION_COMMAND_SCHEMA, description: 'Commands, in order.' },\n\thold: MS('Hold after the commands (default 600)'),\n\tspeed: { type: 'number', minimum: 0.05, maximum: 20, description: 'Play the whole shot this many times as fast (default 1; 0.5 is half speed). fit_animation sets it.' }\n};\nconst SHOT: JsonSchema = object({ id: { type: 'string', pattern: '^[A-Za-z0-9_][\\\\w.-]*$', description: 'Unique shot id, e.g. \"intro\".' }, ...SHOT_FIELDS }, ['id', 'run'], 'A shot.');\nconst CONTROL: JsonSchema = object(\n\t{\n\t\tname: { type: 'string', pattern: '^[A-Za-z_]\\\\w*$', description: 'Identifier, e.g. \"accent\".' },\n\t\ttype: { const: 'color', description: 'Controls are colours.' },\n\t\tdefault: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$', description: 'A #rrggbb colour the scene uses; the control stands for every use of it.' },\n\t\tlabel: { type: 'string', description: 'Label in a controls panel.' }\n\t},\n\t['name', 'type', 'default'],\n\t'A colour parameter of the Flair effect made from the scene.'\n);\nconst PRESET: JsonSchema = object({ name: { type: 'string', minLength: 1, description: 'Preset name.' }, values: { type: 'object', additionalProperties: { type: 'string' }, description: 'Control name → colour.' } }, ['name', 'values'], 'Named control values.');\n\nconst SETTINGS: Record<string, JsonSchema> = {\n\tname: { type: 'string', minLength: 1, description: 'Short name, e.g. \"logo-reveal\".' },\n\tdescription: { type: ['string', 'null'], description: 'What it shows; null clears.' },\n\tloop: { type: 'string', enum: ['none', 'loop', 'ping-pong'], description: 'Playback past the end (default none).' },\n\tfps: { type: 'number', minimum: 1, maximum: 120, description: 'Sampling rate for exports (default 30).' },\n\tsteps: { anyOf: [{ type: 'number', exclusiveMinimum: 0, maximum: 120 }, { type: 'null' }], description: 'Stepped time for every command without its own: changes hold on a grid of this many frames per second (12 = \"on twos\" at 24 fps) for a hand-drawn look; null makes it smooth again (default).' },\n\ttarget: { anyOf: [{ type: 'array', items: { type: 'number', minimum: 0 }, minItems: 2, maxItems: 2 }, { type: 'null' }], description: 'Wanted length [min, max] in seconds; null clears.' }\n};\n\n/** JSON Schema of one `edit_animation` op. */\nconst EDIT_OP: JsonSchema = {\n\tdescription: `One edit (${MOTION_EDIT_OPS.filter((o) => o !== 'replace_scene' && o !== 'set_artwork').join(', ')}), shaped like the tool of the same name with an \"op\" field.`,\n\toneOf: [\n\t\tobject({ op: { const: 'set_settings', description: 'Like set_animation_settings.' }, ...SETTINGS }, ['op']),\n\t\tobject({ op: { const: 'insert_shots', description: 'Like insert_shots.' }, shots: { type: 'array', items: SHOT, minItems: 1, description: 'Shots to add.' }, at: { type: 'integer', minimum: 0, description: 'Position (default: the end).' } }, ['op', 'shots']),\n\t\tobject({ op: { const: 'update_shot', description: 'Like update_shot.' }, shot: SHOT_ID, set: object({ id: SHOT.properties!.id, ...SHOT_FIELDS }, [], 'Fields to replace.'), remove: { type: 'array', items: { type: 'string', enum: ['label', 'camera', 'hold', 'speed'] }, description: 'Fields to clear.' } }, ['op', 'shot']),\n\t\tobject({ op: { const: 'delete_shots', description: 'Like delete_shots.' }, shots: { type: 'array', items: SHOT_ID, minItems: 1, description: 'Shot ids.' } }, ['op', 'shots']),\n\t\tobject({ op: { const: 'move_shot', description: 'Like move_shot.' }, shot: SHOT_ID, to: { type: 'integer', minimum: 0, description: 'New position (0 = first).' } }, ['op', 'shot', 'to']),\n\t\tobject({ op: { const: 'add_commands', description: 'Like add_commands.' }, shot: SHOT_ID, commands: { type: 'array', items: MOTION_COMMAND_SCHEMA, minItems: 1, description: 'Commands to add.' }, at: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run (default: the end).' } }, ['op', 'shot', 'commands']),\n\t\tobject({ op: { const: 'update_command', description: 'Like update_command.' }, shot: SHOT_ID, command: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run.' }, set: { type: 'object', description: 'Command fields to replace.' }, remove: { type: 'array', items: { type: 'string' }, description: 'Command fields to clear.' } }, ['op', 'shot', 'command']),\n\t\tobject({ op: { const: 'delete_commands', description: 'Like delete_commands.' }, shot: SHOT_ID, commands: { type: 'array', items: { type: 'integer', minimum: 0 }, minItems: 1, description: 'Indexes in the shot\\'s run.' } }, ['op', 'shot', 'commands']),\n\t\tobject({ op: { const: 'set_controls', description: 'Like set_controls.' }, controls: { type: 'array', items: CONTROL, description: 'Controls (empty clears).' }, presets: { type: 'array', items: PRESET, description: 'Presets (empty clears).' } }, ['op', 'controls'])\n\t]\n};\n\nfunction describeElement(node: VectorNode, ancestors: string[]) {\n\tconst effects = (node.effects ?? []).map((e) => ({\n\t\tid: e.id,\n\t\ttype: e.type,\n\t\tnumericParams: Object.fromEntries(Object.entries(e.params as unknown as Record<string, unknown>).filter(([, v]) => typeof v === 'number'))\n\t}));\n\treturn {\n\t\tid: node.id,\n\t\ttype: node.type,\n\t\t...(node.name ? { name: node.name } : {}),\n\t\t...(ancestors.length ? { parent: ancestors[ancestors.length - 1] } : {}),\n\t\t...(node.visible === false ? { hidden: true } : {}),\n\t\t...(node.type === 'path' && typeof node.fill === 'string' ? { fill: node.fill } : {}),\n\t\t...(node.type === 'path' && typeof node.stroke === 'string' ? { stroke: node.stroke } : {}),\n\t\t...(node.type === 'group' ? { children: node.children.map((c) => c.id) } : {}),\n\t\t...(effects.length ? { effects } : {})\n\t};\n}\n\nconst round = (n: number) => Math.round(n * 10) / 10;\n\n/** The elements of a scene's artwork, as agents see them. */\nexport function describeMotionElements(scene: MotionScene) {\n\treturn [...indexMotionNodes(scene.artwork.nodes).values()].map((e) => ({\n\t\t...describeElement(e.node, e.ancestors),\n\t\t...(e.bounds ? { bounds: { x: round(e.bounds.x), y: round(e.bounds.y), width: round(e.bounds.width), height: round(e.bounds.height) } } : {})\n\t}));\n}\n\n/** A scene's shots with their timing, as agents see them. */\nexport function describeMotionShots(scene: MotionScene) {\n\tconst timeline = compileMotionScene(scene);\n\treturn scene.shots.map((shot, i) => {\n\t\tconst t = timeline.shots[i];\n\t\treturn {\n\t\t\tid: shot.id,\n\t\t\t...(shot.label ? { label: shot.label } : {}),\n\t\t\tstart: t.start,\n\t\t\tend: t.end,\n\t\t\t...(shot.camera ? { camera: shot.camera } : {}),\n\t\t\t...(shot.hold !== undefined ? { hold: shot.hold } : {}),\n\t\t\tcommands: shot.run.map((c, index) => {\n\t\t\t\tconst ct = timeline.commands.find((x) => x.shotIndex === i && x.command === index)!;\n\t\t\t\tconst primitive = motionFlairPrimitive(c);\n\t\t\t\treturn { index, ...c, start: ct.start, end: ct.end, ...(primitive ? { flairPrimitive: primitive } : {}) };\n\t\t\t})\n\t\t};\n\t});\n}\n\nconst issueSummary = (issues: readonly MotionIssue[]) => ({\n\terrors: issues.filter((i) => i.severity === 'error').length,\n\twarnings: issues.filter((i) => i.severity === 'warning').length,\n\tnotes: issues.filter((i) => i.severity === 'note').length,\n\tlines: issues.map((i) => `${i.severity}: ${motionIssueLine(i)}`)\n});\n\n/**\n * Agent tools for an `AnimationEditorController`: read the scene (artwork elements, shots with\n * their timing, issues), render a frame, export to Flair, and change it a step at a time. Every\n * write is checked first (unknown ids with \"did you mean\", malformed commands), applies as one\n * undo step, and returns the resulting timing and any new issues. Write tools are hidden while\n * the animation is read-only.\n */\nexport function createAnimationEditorToolProvider(controller: AnimationEditorController, options: AnimationEditorToolProviderOptions = {}): AgentToolProvider {\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (r) return typeof r === 'string' ? r : 'This animation is read-only.';\n\t\treturn controller.readOnlyReason();\n\t};\n\tconst scene = () => controller.getScene();\n\tconst outcome = (result: MotionEditResult, extra: Record<string, unknown> = {}) => {\n\t\tif (!result.ok) throw new Error(result.error);\n\t\tconst timeline = compileMotionScene(result.scene);\n\t\treturn {\n\t\t\t...extra,\n\t\t\tduration: timeline.duration,\n\t\t\tshots: timeline.shots.map((s) => ({ id: s.id, start: s.start, end: s.end })),\n\t\t\tissues: issueSummary(result.issues),\n\t\t\t...(result.hints.length ? { hints: result.hints } : {})\n\t\t};\n\t};\n\tconst apply = (edits: MotionEdit | MotionEdit[], label: string, extra?: (s: MotionScene) => Record<string, unknown>) => {\n\t\tconst result = controller.apply(edits, label);\n\t\treturn outcome(result, result.ok && extra ? extra(result.scene) : {});\n\t};\n\n\tconst getAnimation: AgentTool = {\n\t\tname: 'get_animation',\n\t\ttitle: 'Read the animation',\n\t\tdescription:\n\t\t\t'Returns the vector animation: its name, artwork size, length (ms), loop mode, the artwork\\'s elements (id, type, name, parent, bounds, solid paints, live effects with their numeric parameters), every shot with its commands and their start/end times (and, where Flair has one, the Flair motion primitive a command plays as \"flairPrimitive\", e.g. \"entrance.pop\"), Flair controls, and a summary of issues. Use the ids it returns with the write tools.',\n\t\tinputSchema: object({ includeElements: { type: 'boolean', description: 'Include the artwork\\'s elements (default true).' } }),\n\t\tannotations: { title: 'Read the animation', ...READ },\n\t\thandler: ({ includeElements = true }) => {\n\t\t\tconst s = scene();\n\t\t\tconst reason = readOnlyReason();\n\t\t\treturn {\n\t\t\t\tname: s.name,\n\t\t\t\t...(s.description ? { description: s.description } : {}),\n\t\t\t\tartwork: { width: s.artwork.width, height: s.artwork.height },\n\t\t\t\tduration: compileMotionScene(s).duration,\n\t\t\t\tloop: s.loop ?? 'none',\n\t\t\t\t...(s.target ? { target: s.target } : {}),\n\t\t\t\t...(includeElements ? { elements: describeMotionElements(s) } : {}),\n\t\t\t\tshots: describeMotionShots(s),\n\t\t\t\t...(s.controls ? { controls: s.controls } : {}),\n\t\t\t\t...(s.presets ? { presets: s.presets } : {}),\n\t\t\t\tissues: issueSummary(controller.getState().issues),\n\t\t\t\t...(reason ? { readOnly: reason } : {})\n\t\t\t};\n\t\t}\n\t};\n\n\tconst getShot: AgentTool = {\n\t\tname: 'get_shot',\n\t\ttitle: 'Read one shot',\n\t\tdescription: 'Returns one shot as stored (id, label, camera, run, hold) with its start/end and each command\\'s start/end in ms.',\n\t\tinputSchema: object({ shot: SHOT_ID }, ['shot']),\n\t\tannotations: { title: 'Read one shot', ...READ },\n\t\thandler: ({ shot }) => {\n\t\t\tconst found = describeMotionShots(scene()).find((s) => s.id === shot);\n\t\t\tif (!found) throw new Error(`There is no shot \"${shot}\"; the shots are ${scene().shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\treturn found;\n\t\t}\n\t};\n\n\tconst findElements: AgentTool = {\n\t\tname: 'find_animation_elements',\n\t\ttitle: 'Find artwork elements',\n\t\tdescription: 'Finds artwork elements whose id or name contains the text (case-insensitive). Returns their id, type, name, parent, bounds, paints and live effects.',\n\t\tinputSchema: object({ query: { type: 'string', minLength: 1, description: 'Text to look for in ids and names.' }, limit: { type: 'integer', minimum: 1, maximum: 200, description: 'Most results (default 20).' } }, ['query']),\n\t\tannotations: { title: 'Find artwork elements', ...READ },\n\t\thandler: ({ query, limit = 20 }) => {\n\t\t\tconst q = String(query).toLowerCase();\n\t\t\tconst all = describeMotionElements(scene());\n\t\t\tconst elements = all.filter((e) => e.id.toLowerCase().includes(q) || ('name' in e && String(e.name).toLowerCase().includes(q)));\n\t\t\treturn { elements: elements.slice(0, limit), total: elements.length };\n\t\t}\n\t};\n\n\tconst checkAnimation: AgentTool = {\n\t\tname: 'check_animation',\n\t\ttitle: 'Check the animation',\n\t\tdescription:\n\t\t\t'Lists the animation\\'s problems: each with a stable code (unknown-target, overlap, out-of-frame, too-fast, enter-visible…), severity (error / warning / note), the shot and command index it is in, the node ids it is about, measured vs needed values, and a message saying how to fix it.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Check the animation', ...READ },\n\t\thandler: () => {\n\t\t\tconst issues = controller.getState().issues;\n\t\t\treturn { ...issueSummary(issues), issues };\n\t\t}\n\t};\n\n\tconst renderFrame: AgentTool = {\n\t\tname: 'render_animation_frame',\n\t\ttitle: 'Render a frame',\n\t\tdescription:\n\t\t\t'Draws the animation at one moment without changing it, to check it: standalone SVG by default, or a PNG image (format \"png\") when the host can rasterize. Give a time in ms, or a shot and where in it.',\n\t\tinputSchema: object({\n\t\t\ttime: MS('Time from the start'),\n\t\t\tshot: { ...SHOT_ID, description: 'Render a moment of this shot instead of \"time\".' },\n\t\t\tat: { type: 'string', enum: ['start', 'middle', 'end'], description: 'With shot: which moment (default end: everything drawn, before the next shot).' },\n\t\t\tformat: { type: 'string', enum: ['svg', 'png'], description: 'svg (default) or png (only when the host supports it).' }\n\t\t}),\n\t\tannotations: { title: 'Render a frame', ...READ },\n\t\thandler: async ({ time, shot, at = 'end', format = 'svg' }) => {\n\t\t\tconst s = scene();\n\t\t\tlet t = time ?? controller.getState().time;\n\t\t\tif (shot !== undefined) {\n\t\t\t\tconst timing = compileMotionScene(s).shots.find((x) => x.id === shot);\n\t\t\t\tif (!timing) throw new Error(`There is no shot \"${shot}\"; the shots are ${s.shots.map((x) => `\"${x.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\t\tt = at === 'start' ? timing.start : at === 'middle' ? (timing.commandsStart + timing.commandsEnd) / 2 : Math.max(timing.start, timing.end - 1);\n\t\t\t}\n\t\t\tconst svg = controller.toSvg(t, { pretty: false });\n\t\t\tif (format === 'png') {\n\t\t\t\tif (!options.rasterize) throw new Error('This host cannot make PNG images; call render_animation_frame with format \"svg\".');\n\t\t\t\tconst image = await options.rasterize(svg, { width: s.artwork.width, height: s.artwork.height });\n\t\t\t\treturn { content: [{ type: 'image', data: image.data, mimeType: image.mimeType }] };\n\t\t\t}\n\t\t\treturn { time: t, svg };\n\t\t}\n\t};\n\n\tconst CURVES_DESCRIPTION =\n\t\t'Write cubic-bezier easings (ease, ease-in, ease-out, ease-in-out, back eases, custom curves) as one change with ease: [x1, y1, x2, y2] (default true). Needs Flair 0.36 or later; false samples them into linear steps for older Flair.';\n\tconst FLAIR_DESCRIPTION =\n\t\t'The Flair version to export for (default 0.39): springs and stepped time need 0.39, behaviours 0.38, cubic-bezier curves 0.36; older versions get those sampled into linear steps.';\n\tconst BEHAVIORS_DESCRIPTION =\n\t\t'Write pulses, shakes, teeters, waves, wiggles and colour pulses as one change with a Flair behavior, so they play exactly (default true; needs Flair 0.38 or later). False samples them into linear steps for older Flair.';\n\n\tconst exportFlairMotion: AgentTool = {\n\t\tname: 'export_flair_motion',\n\t\ttitle: 'Export as Flair vector motion',\n\t\tdescription:\n\t\t\t'Returns the animation as a Flair SvgMotion ({ svg, animate }) that Flair\\'s SvgPlayer plays, plus its hold, how many changes were sampled into linear steps, and notes on anything not carried over.',\n\t\tinputSchema: object({\n\t\t\tfps: { type: 'number', minimum: 1, maximum: 120, description: 'Sampling rate for changes Flair cannot express exactly (default: the scene\\'s fps, else 30).' },\n\t\t\tcurves: { type: 'boolean', description: CURVES_DESCRIPTION },\n\t\t\tbehaviors: { type: 'boolean', description: BEHAVIORS_DESCRIPTION },\n\t\t\tflair: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?$', description: FLAIR_DESCRIPTION }\n\t\t}),\n\t\tannotations: { title: 'Export as Flair vector motion', ...READ },\n\t\thandler: ({ fps, curves, behaviors, flair }) => controller.toFlairMotion({ ...(fps ? { fps } : {}), ...(curves === undefined ? {} : { curves }), ...(behaviors === undefined ? {} : { behaviors }), ...(flair ? { flair } : {}) })\n\t};\n\n\tconst exportFlairEffect: AgentTool = {\n\t\tname: 'export_flair_effect',\n\t\ttitle: 'Export as a Flair effect',\n\t\tdescription:\n\t\t\t'Returns the animation as a Flair catalog vector effect: { kind: \"vector\", id, name, description, category, tags, motion, hold, presets }, with each colour control declared as a {{name: color}} placeholder. Add it to a Flair catalog or load it in Flair\\'s effect editor.',\n\t\tinputSchema: object({\n\t\t\tid: { type: 'string', pattern: '^[a-z0-9]+(-[a-z0-9]+)*$', description: 'Kebab-case id (default: from the scene\\'s name).' },\n\t\t\tname: { type: 'string', minLength: 1, description: 'Display name (default: the scene\\'s name).' },\n\t\t\tdescription: { type: 'string', description: 'One sentence (default: the scene\\'s description).' },\n\t\t\tcategory: { type: 'string', minLength: 1, description: 'Flair catalog category, e.g. icon, loader, ui, data, text, morph (default icon).' },\n\t\t\ttags: { type: 'array', items: { type: 'string' }, description: 'Search tags (default none).' },\n\t\t\tcurves: { type: 'boolean', description: CURVES_DESCRIPTION },\n\t\t\tbehaviors: { type: 'boolean', description: BEHAVIORS_DESCRIPTION },\n\t\t\tflair: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?$', description: FLAIR_DESCRIPTION }\n\t\t}),\n\t\tannotations: { title: 'Export as a Flair effect', ...READ },\n\t\thandler: (args) => controller.toFlairEffect(args)\n\t};\n\n\tconst setArtworkSvg: AgentTool = {\n\t\tname: 'set_animation_artwork_svg',\n\t\ttitle: 'Replace the artwork with SVG',\n\t\tdescription:\n\t\t\t'Replaces the artwork with an SVG (paths, shapes, groups, gradients; one undo step). Give every element you will animate an id: commands target ids. Shots that name ids the new artwork lacks are refused. Returns the elements.',\n\t\tinputSchema: object({ svg: { type: 'string', minLength: 1, description: 'A standalone <svg> with a viewBox.' } }, ['svg']),\n\t\tannotations: { title: 'Replace the artwork with SVG', ...DESTRUCTIVE },\n\t\thandler: ({ svg }) => {\n\t\t\tlet artwork;\n\t\t\ttry {\n\t\t\t\tartwork = parseVectorSvg(svg);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`The SVG could not be read: ${(error as Error).message}. Nothing was changed.`);\n\t\t\t}\n\t\t\treturn apply({ op: 'set_artwork', artwork }, 'Replace artwork', (s) => ({ elements: describeMotionElements(s) }));\n\t\t}\n\t};\n\n\tconst importFlairEffect: AgentTool = {\n\t\tname: 'import_flair_effect',\n\t\ttitle: 'Import a Flair effect',\n\t\tdescription:\n\t\t\t'Replaces the whole animation with a Flair vector effect or SvgMotion (one undo step): its SVG becomes the artwork, {{name: color}} placeholders become colour controls, and each Flair step becomes a shot of commands (fade, enter, style, move, rotate, scale, draw, follow, pulse, shake, teeter, wave, wiggle, color-pulse). Returns the shots, the elements, notes on anything not carried over and the issues. With dry_run it only reports what the import would give.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\teffect: { type: 'object', description: 'A Flair catalog vector effect { kind: \"vector\", id, name, motion: { svg, animate }, hold?, presets? }. Give this or \"motion\".' },\n\t\t\t\tmotion: { type: 'object', description: 'A Flair SvgMotion { svg, animate }. Give this or \"effect\".' },\n\t\t\t\tname: { type: 'string', minLength: 1, description: 'Name for the scene (default: the effect\\'s id, else \"from-flair\").' },\n\t\t\t\tdry_run: { type: 'boolean', description: 'Report without replacing anything (default false).' }\n\t\t\t},\n\t\t\t[]\n\t\t),\n\t\tannotations: { title: 'Import a Flair effect', ...DESTRUCTIVE },\n\t\thandler: ({ effect, motion, name, dry_run = false }) => {\n\t\t\tif ((effect === undefined) === (motion === undefined)) throw new Error('Give exactly one of \"effect\" (a Flair vector effect) or \"motion\" (a Flair SvgMotion). Nothing was changed.');\n\t\t\tlet result: FlairImportResult;\n\t\t\ttry {\n\t\t\t\tresult = effect !== undefined ? fromFlairVectorEffect(effect, name ? { name } : {}) : fromFlairSvgMotion(motion, name ? { name } : {});\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`The Flair effect could not be imported: ${(error as Error).message} Nothing was changed.`);\n\t\t\t}\n\t\t\tconst report = { notes: result.notes, issues: issueSummary(result.issues), shots: describeMotionShots(result.scene).map(({ id, start, end, commands }) => ({ id, start, end, commands: commands.length })) };\n\t\t\tif (dry_run) return { dry_run: true, ...report, hint: 'Nothing was replaced; call again without dry_run to import.' };\n\t\t\tconst applied = controller.apply({ op: 'replace_scene', scene: result.scene }, 'Import Flair effect');\n\t\t\treturn outcome(applied, applied.ok ? { ...report, elements: describeMotionElements(result.scene) } : {});\n\t\t}\n\t};\n\n\tconst fitAnimation: AgentTool = {\n\t\tname: 'fit_animation',\n\t\ttitle: 'Fit the animation to a length',\n\t\tdescription:\n\t\t\t'Makes the animation last a given time by setting its shots\\' speed (one undo step): shots in \"keep\" play as they are and the others stretch or squeeze together, keeping their proportions. Returns the new length, each changed shot\\'s speed and the timing. With dry_run it only reports them.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tseconds: { type: 'number', exclusiveMinimum: 0, description: 'The length to fit, in seconds.' },\n\t\t\t\tkeep: { type: 'array', items: SHOT_ID, description: 'Shots that keep their pace, e.g. a logo hold (default none).' },\n\t\t\t\tdry_run: { type: 'boolean', description: 'Report without changing anything (default false).' }\n\t\t\t},\n\t\t\t['seconds']\n\t\t),\n\t\tannotations: { title: 'Fit the animation to a length', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ seconds, keep, dry_run = false }) => {\n\t\t\tconst fit = fitMotionScene(controller.getState().scene, seconds * 1000, { keep: keep ?? [] });\n\t\t\tconst report = { duration: fit.duration, speeds: fit.speeds };\n\t\t\tif (dry_run) return { dry_run: true, ...report, hint: 'Nothing was changed; call again without dry_run to fit.' };\n\t\t\tconst edits = Object.entries(fit.speeds).map(([shot, speed]) => (speed === 1 ? { op: 'update_shot' as const, shot, remove: ['speed' as const] } : { op: 'update_shot' as const, shot, set: { speed } }));\n\t\t\treturn apply(edits, 'Fit to length', () => report);\n\t\t}\n\t};\n\n\tconst insertShots: AgentTool = {\n\t\tname: 'insert_shots',\n\t\ttitle: 'Add shots',\n\t\tdescription: 'Adds shots (one undo step) at a position (default: the end). Returns every shot\\'s new timing and any issues.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT, minItems: 1, description: 'Shots to add.' }, at: { type: 'integer', minimum: 0, description: 'Position, 0 = first (default: the end).' } }, ['shots']),\n\t\tannotations: { title: 'Add shots', ...WRITE },\n\t\thandler: ({ shots, at }) => apply({ op: 'insert_shots', shots, at }, 'Add shots', () => ({ added: shots.map((s: { id: string }) => s.id) }))\n\t};\n\n\tconst updateShot: AgentTool = {\n\t\tname: 'update_shot',\n\t\ttitle: 'Change a shot',\n\t\tdescription: 'Replaces the fields of one shot given in \"set\" (label, camera, run, hold, id) and clears those in \"remove\". Returns the new timing and issues.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tshot: SHOT_ID,\n\t\t\t\tset: object({ id: SHOT.properties!.id, ...SHOT_FIELDS }, [], 'Fields to replace.'),\n\t\t\t\tremove: { type: 'array', items: { type: 'string', enum: ['label', 'camera', 'hold', 'speed'] }, description: 'Fields to clear.' }\n\t\t\t},\n\t\t\t['shot']\n\t\t),\n\t\tannotations: { title: 'Change a shot', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, set, remove }) => apply({ op: 'update_shot', shot, set, remove }, 'Change shot')\n\t};\n\n\tconst deleteShots: AgentTool = {\n\t\tname: 'delete_shots',\n\t\ttitle: 'Delete shots',\n\t\tdescription: 'Removes shots by id (one undo step). Returns the remaining timing.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT_ID, minItems: 1, description: 'Shot ids.' } }, ['shots']),\n\t\tannotations: { title: 'Delete shots', ...DESTRUCTIVE },\n\t\thandler: ({ shots }) => apply({ op: 'delete_shots', shots }, 'Delete shots')\n\t};\n\n\tconst moveShot: AgentTool = {\n\t\tname: 'move_shot',\n\t\ttitle: 'Reorder a shot',\n\t\tdescription: 'Moves a shot to a new position (0 = first). Returns the new timing.',\n\t\tinputSchema: object({ shot: SHOT_ID, to: { type: 'integer', minimum: 0, description: 'New position, 0 = first.' } }, ['shot', 'to']),\n\t\tannotations: { title: 'Reorder a shot', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, to }) => apply({ op: 'move_shot', shot, to }, 'Move shot')\n\t};\n\n\tconst addCommands: AgentTool = {\n\t\tname: 'add_commands',\n\t\ttitle: 'Add commands to a shot',\n\t\tdescription: 'Adds commands to a shot\\'s run (one undo step), at an index (default: the end). Returns the indexes they got, their timing and any issues.',\n\t\tinputSchema: object({ shot: SHOT_ID, commands: { type: 'array', items: MOTION_COMMAND_SCHEMA, minItems: 1, description: 'Commands to add.' }, at: { type: 'integer', minimum: 0, description: 'Index in the run (default: the end).' } }, ['shot', 'commands']),\n\t\tannotations: { title: 'Add commands to a shot', ...WRITE },\n\t\thandler: ({ shot, commands, at }) => {\n\t\t\tconst before = scene().shots.find((s) => s.id === shot)?.run.length ?? 0;\n\t\t\tconst first = at ?? before;\n\t\t\treturn apply({ op: 'add_commands', shot, commands, at }, 'Add commands', (s) => {\n\t\t\t\tconst shots = describeMotionShots(s);\n\t\t\t\tconst added = shots.find((x) => x.id === shot)!.commands.slice(first, first + commands.length);\n\t\t\t\treturn { added: added.map((c) => ({ index: c.index, type: c.type, start: c.start, end: c.end })) };\n\t\t\t});\n\t\t}\n\t};\n\n\tconst updateCommand: AgentTool = {\n\t\tname: 'update_command',\n\t\ttitle: 'Change a command',\n\t\tdescription: 'Replaces fields of one command (by shot and index) given in \"set\" and clears those in \"remove\". Returns the command as it now stands with its timing.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tshot: SHOT_ID,\n\t\t\t\tcommand: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run (from get_animation).' },\n\t\t\t\tset: { type: 'object', description: 'Command fields to replace (see add_commands for each type\\'s fields).' },\n\t\t\t\tremove: { type: 'array', items: { type: 'string' }, description: 'Optional fields to clear (e.g. \"delay\").' }\n\t\t\t},\n\t\t\t['shot', 'command']\n\t\t),\n\t\tannotations: { title: 'Change a command', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, command, set, remove }) =>\n\t\t\tapply({ op: 'update_command', shot, command, set, remove }, 'Change command', (s) => ({ command: describeMotionShots(s).find((x) => x.id === shot)!.commands[command] }))\n\t};\n\n\tconst deleteCommands: AgentTool = {\n\t\tname: 'delete_commands',\n\t\ttitle: 'Delete commands',\n\t\tdescription: 'Removes commands from a shot by index (one undo step). Later commands move up. Returns the new timing.',\n\t\tinputSchema: object({ shot: SHOT_ID, commands: { type: 'array', items: { type: 'integer', minimum: 0 }, minItems: 1, description: 'Indexes in the shot\\'s run.' } }, ['shot', 'commands']),\n\t\tannotations: { title: 'Delete commands', ...DESTRUCTIVE },\n\t\thandler: ({ shot, commands }) => apply({ op: 'delete_commands', shot, commands }, 'Delete commands')\n\t};\n\n\tconst setSettings: AgentTool = {\n\t\tname: 'set_animation_settings',\n\t\ttitle: 'Change animation settings',\n\t\tdescription: 'Sets the name, description, loop mode, export frame rate, stepped time or target length. Returns the timing.',\n\t\tinputSchema: object(SETTINGS),\n\t\tannotations: { title: 'Change animation settings', ...WRITE_IDEMPOTENT },\n\t\thandler: (args) => apply({ op: 'set_settings', ...args }, 'Change settings')\n\t};\n\n\tconst setControls: AgentTool = {\n\t\tname: 'set_animation_controls',\n\t\ttitle: 'Set Flair controls',\n\t\tdescription:\n\t\t\t'Sets the colour controls (and presets) a Flair effect made from this animation exposes: each control stands for every use of its default colour. Replaces the existing controls; an empty list clears them. Returns the issues.',\n\t\tinputSchema: object({ controls: { type: 'array', items: CONTROL, description: 'Controls (empty clears).' }, presets: { type: 'array', items: PRESET, description: 'Presets (empty clears; omit to keep).' } }, ['controls']),\n\t\tannotations: { title: 'Set Flair controls', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ controls, presets }) => apply({ op: 'set_controls', controls, presets }, 'Set controls')\n\t};\n\n\tconst editAnimation: AgentTool = {\n\t\tname: 'edit_animation',\n\t\ttitle: 'Make several edits at once',\n\t\tdescription:\n\t\t\t'Applies several edits in order as one undo step, all or nothing: if one fails, nothing changes and the error names the op (\"op 2 (add_commands): …\"). With dry_run it only reports the timing and issues the edits would give.',\n\t\tinputSchema: object({ ops: { type: 'array', items: EDIT_OP, minItems: 1, description: 'Edits, applied in order.' }, dry_run: { type: 'boolean', description: 'Check without applying (default false).' } }, ['ops']),\n\t\tannotations: { title: 'Make several edits at once', ...WRITE },\n\t\thandler: ({ ops, dry_run = false }) => {\n\t\t\tconst result = controller.apply(ops, 'Edit animation', { dryRun: dry_run });\n\t\t\treturn outcome(result, dry_run ? { dry_run: true, hint: 'Nothing was applied; call again without dry_run to apply.' } : {});\n\t\t}\n\t};\n\n\tconst writeAnimation: AgentTool = {\n\t\tname: 'write_animation',\n\t\ttitle: 'Replace the animation\\'s shots',\n\t\tdescription:\n\t\t\t'Replaces every shot (and optionally the settings and controls), keeping the artwork, as one undo step. For small changes prefer the per-operation tools. Returns the timing and issues.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT, description: 'All shots, in order.' }, ...SETTINGS, controls: { type: 'array', items: CONTROL, description: 'Colour controls.' }, presets: { type: 'array', items: PRESET, description: 'Presets.' } }, ['shots']),\n\t\tannotations: { title: 'Replace the animation\\'s shots', ...DESTRUCTIVE },\n\t\thandler: ({ shots, controls, presets, ...settings }) => {\n\t\t\tconst current = scene();\n\t\t\tconst next: MotionScene = { ...current, shots };\n\t\t\tconst edits: MotionEdit[] = [{ op: 'replace_scene', scene: next }];\n\t\t\tif (Object.keys(settings).length) edits.push({ op: 'set_settings', ...settings });\n\t\t\tif (controls) edits.push({ op: 'set_controls', controls, presets });\n\t\t\treturn apply(edits, 'Replace animation');\n\t\t}\n\t};\n\n\tconst seekAnimation: AgentTool = {\n\t\tname: 'seek_animation',\n\t\ttitle: 'Show a moment',\n\t\tdescription: 'Moves the playhead the person sees to a time or the start of a shot, and plays or pauses. Does not change the animation. Returns the playhead time and shot.',\n\t\tinputSchema: object({ time: MS('Time from the start'), shot: { ...SHOT_ID, description: 'Go to the start of this shot instead of \"time\".' }, play: { type: 'boolean', description: 'true plays from there, false pauses (default: leave as is).' } }),\n\t\tannotations: { title: 'Show a moment', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ time, shot, play }) => {\n\t\t\tif (shot !== undefined && !controller.seekShot(shot)) throw new Error(`There is no shot \"${shot}\"; the shots are ${scene().shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\tif (shot === undefined && time !== undefined) controller.seek(time);\n\t\t\tif (play === true) controller.play();\n\t\t\tif (play === false) controller.pause();\n\t\t\tconst state = controller.getState();\n\t\t\treturn { time: state.time, shot: state.currentShot, playing: state.playing };\n\t\t}\n\t};\n\n\tconst undo: AgentTool = {\n\t\tname: 'undo_animation',\n\t\ttitle: 'Undo an animation edit',\n\t\tdescription: 'Undoes the last edit. Returns whether something was undone and its label.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Undo an animation edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().undoLabel;\n\t\t\tconst undone = controller.undo();\n\t\t\treturn { undone, ...(undone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst redo: AgentTool = {\n\t\tname: 'redo_animation',\n\t\ttitle: 'Redo an animation edit',\n\t\tdescription: 'Redoes the last undone edit. Returns whether something was redone and its label.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Redo an animation edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().redoLabel;\n\t\t\tconst redone = controller.redo();\n\t\t\treturn { redone, ...(redone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst reads = [getAnimation, getShot, findElements, checkAnimation, renderFrame, exportFlairMotion, exportFlairEffect, seekAnimation];\n\tconst writes = [setArtworkSvg, fitAnimation, importFlairEffect, insertShots, updateShot, deleteShots, moveShot, addCommands, updateCommand, deleteCommands, setSettings, setControls, editAnimation, writeAnimation, undo, redo];\n\n\treturn {\n\t\tid: options.id ?? 'animation',\n\t\tnamespace: options.namespace,\n\t\ttools: () => (readOnlyReason() ? reads : [...reads, ...writes]),\n\t\tsubscribe: (notify) => {\n\t\t\tlet last = readOnlyReason();\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tconst now = readOnlyReason();\n\t\t\t\tif (now !== last) {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n}\n","/**\n * A short authoring guide for a model writing vector animations with the animation editor's\n * tools. Static, so it caches well as part of a system prompt.\n */\nexport const ANIMATION_EDITOR_AGENT_INSTRUCTIONS = `You animate vector artwork. A scene is artwork (vector paths and groups, each with an id) plus shots.\n\nHow it plays\n- Shots play in order. A shot optionally moves the camera, plays its commands, then holds (default 600 ms).\n- Commands in a shot play one after another; give \"with\": \"previous\" to start one together with the command before, \"delay\" to wait, \"stagger\" to offset several targets.\n- Timing comes from the content: each command has a default length (enter 600 ms, move 700 ms, draw follows the path length). Only set \"duration\" to change the pace.\n- Anything that enters later is hidden until it enters. Things that never enter are visible from the start.\n- Every frame is a pure function of time: the same scene always plays the same frames.\n\nCommands\n- enter (fade, pop, grow, slide, draw) and exit (fade, shrink, slide, undraw) bring things in and out.\n- enter also reveals through a clip over the target's box: wipe (behind an edge travelling \"direction\", default right), iris (from the centre; \"shape\": circle or box) and split (from a line through the middle; \"orientation\": horizontal or vertical). exit wipe hides the same way. Reveals need a width and a height: use draw / undraw for a straight line.\n- draw draws strokes on to a fraction; move, rotate, scale and fade change the pose (about the centre); style blends solid colours and stroke width.\n- enter also has zoom (settles from larger) and rise (rises a short way, overshooting a touch); pop and zoom take a starting \"scale\".\n- morph turns a shape into another node's shape (keep the target hidden); match does the same for a whole group, part by part (Smart Animate: draw the end state as a second, hidden group whose parts share names with the first); follow moves along a path node (with \"rotate\", moves made meanwhile turn with the path).\n- Emphasis draws the eye and returns to rest: pulse (swell), shake (side to side, or \"axis\": \"vertical\"), teeter (rock), wave (bob, no settling), wiggle (seeded wander; the same seed wanders the same way) and color-pulse (tint and back).\n- Emphasis stacks on other motion: a shake during a slide shakes as it slides. Give move, rotate or scale \"blend\": \"add\" to stack them too (what they add stays); \"blend\": \"replace\" makes a change take over instead.\n- Any command but enter and exit can \"repeat\" (loop, mirror back and forth, or offset to carry on: rotate by 90, repeat 4 is a full turn); \"duration\" is one cycle.\n- Springs (\"spring-gentle\", \"spring-quick\", \"spring-bouncy\", \"spring-slow\" or { \"type\": \"spring\", … }) feel physical; leave \"duration\" out and the spring sets it.\n- \"steps\": 12 (on a command, or for the whole scene with set_animation_settings) holds poses \"on twos\" for a hand-drawn look. \"geometric\": true on scale or a camera zooms at an even rate.\n- Commands share their names and defaults with Flair's motion primitives (get_animation shows each one's \"flairPrimitive\"), and emphasis, reveals and follows export to Flair exactly.\n- effect tweens a numeric parameter of a live path effect already on the node (twist angle, wiggle time, zig zag size).\n\nWorking method\n1. get_animation to learn the element ids (set_animation_artwork_svg first if there is no artwork: give every element you will animate an id; or import_flair_effect to start from a Flair effect and edit it).\n2. Plan a few shots, each one idea. Add them with insert_shots, or edit_animation to make several edits as one step (dry_run first when unsure).\n3. To hit a length, fit_animation (keep the shots whose pace matters). check_animation and fix every error and warning; render_animation_frame (shot + \"end\") to look at the result.\n4. To make a reusable Flair effect, set_animation_controls (colour controls stand for every use of their default colour) and export_flair_effect.\n\nKeep motion purposeful: one thing moving at a time reads best, ease-out for arrivals, ease-in for exits, and hold long enough to see each result.`;\n"],"mappings":"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","names":["command","command","command","end","duration","ease","opacity","shotIndex","command","command","rest","TRANSFORM_PROPS","round","command","command","command"]}
|
|
1
|
+
{"version":3,"sources":["../../src/animation-editor/types.ts","../../src/animation-editor/issues.ts","../../src/animation-editor/parse.ts","../../src/animation-editor/match.ts","../../src/animation-editor/compile.ts","../../src/animation-editor/evaluate.ts","../../src/animation-editor/check.ts","../../src/animation-editor/edit.ts","../../src/animation-editor/fit.ts","../../src/animation-editor/flair.ts","../../src/animation-editor/flair-import.ts","../../src/animation-editor/controller.ts","../../src/animation-editor/tools.ts","../../src/animation-editor/instructions.ts"],"sourcesContent":["import type { AnimationEasing } from '../animation/easing.js';\nimport type { AnimationLoopMode } from '../animation/evaluate.js';\nimport type { VectorDocument } from '../vector/types.js';\n\n/**\n * A vector animation as plain JSON: a piece of vector artwork (the editor's `VectorDocument`,\n * as the vector editor draws it) and the shots that bring it to life.\n *\n * Shots, not timelines: a shot frames the camera, plays its commands and holds. Timing comes\n * from the content (each command has a sensible default length, and drawing a line takes as\n * long as the line is long), so there are no keyframes to manage. The same scene plays the\n * same frames every time: every frame is a pure function of time.\n */\nexport interface MotionScene {\n\t/** Format version (always 1). */\n\tversion: 1;\n\t/** A short name, e.g. `logo-reveal`. */\n\tname: string;\n\tdescription?: string;\n\t/** The artwork in its resting state. Commands target its node ids. */\n\tartwork: VectorDocument;\n\tshots: MotionShot[];\n\t/** Playback past the end: stop (`none`, default), `loop` or `ping-pong`. */\n\tloop?: AnimationLoopMode;\n\t/** Frame rate used to sample motion that a target format cannot express exactly (default 30). */\n\tfps?: number;\n\t/**\n\t * Stepped time for every command that gives none: changes hold on a grid of this many frames\n\t * per second (\"on twos\" at 12), for a hand-drawn look. Default: smooth.\n\t */\n\tsteps?: number;\n\t/** A beat grid to cue shots to (`MotionShot.at.beat`): music or a voiceover's rhythm. */\n\tbeat?: MotionBeatGrid;\n\t/** A voiceover's words with their times, to cue shots to (`MotionShot.at.word`). */\n\tnarration?: MotionNarration;\n\t/** Wanted length in seconds `[min, max]`; `check` warns outside it. */\n\ttarget?: [number, number];\n\t/** Parameters a Flair effect made from this scene exposes (see `toFlairVectorEffect`). */\n\tcontrols?: MotionControl[];\n\t/** Named sets of control values. */\n\tpresets?: MotionPreset[];\n}\n\n/** A rectangle of the artwork, in document units. */\nexport interface MotionRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Where the camera looks: a rectangle, or the id of a node to frame (with `padding` around\n * its bounds, default 24). The camera eases there over `ms` (default 1000; the first shot cuts).\n */\nexport type MotionCamera = (MotionRect | { frame: string; padding?: number }) & {\n\tease?: AnimationEasing;\n\tms?: number;\n\t/** Zoom at a steady rate (the size changes by the same factor each moment) instead of linearly. */\n\tgeometric?: boolean;\n};\n\n/** A steady beat: `bpm` beats a minute, the first at `offset` ms, `meter` beats a bar. */\nexport interface MotionBeatGrid {\n\tbpm: number;\n\t/** When beat 0 falls, ms (default 0). */\n\toffset?: number;\n\t/** Beats in a bar (default 4), for reading beats as bar and beat. */\n\tmeter?: number;\n}\n\n/** A voiceover: its words in order, each with when it is said (ms), from a TTS or speech-to-text word timing. */\nexport interface MotionNarration {\n\twords: { text: string; start: number; end?: number }[];\n}\n\n/** When a shot is cued to start: on a beat, on a narration word, or at a time. */\nexport interface MotionCue {\n\t/** Beat number on the scene's beat grid, from 0 (fractions for off-beats: 2.5 is the \"and\" of beat 3). */\n\tbeat?: number;\n\t/** Index of a word in the scene's narration, from 0. */\n\tword?: number;\n\t/** A time in ms. */\n\tms?: number;\n}\n\n/** One beat of the animation. */\nexport interface MotionShot {\n\t/** Stable id (unique in the scene), e.g. `intro`. */\n\tid: string;\n\t/** What happens in this shot, in a few words (shown on the timeline). */\n\tlabel?: string;\n\t/** Omit to keep the current framing. */\n\tcamera?: MotionCamera;\n\t/**\n\t * Start on a cue: a beat, a narration word or a time. The shot before holds until then; a\n\t * cue that comes before the shot before has ended is missed (`check` says by how much).\n\t * Give one of `beat`, `word` or `ms`.\n\t */\n\tat?: MotionCue;\n\t/** Commands, played one after another (unless a command says `with: \"previous\"`). */\n\trun: MotionCommand[];\n\t/** Milliseconds to hold after the commands finish (default 600). */\n\thold?: number;\n\t/**\n\t * Plays the whole shot this many times as fast (default 1): its camera move, delays,\n\t * durations, staggers and hold all scale by 1 / speed. `fit_animation` sets it to fit a length.\n\t */\n\tspeed?: number;\n}\n\n/** Fields every command takes. */\nexport interface MotionCommandBase {\n\t/** Node ids from the artwork (groups animate as one). */\n\ttargets: string[];\n\t/** Length in ms for each target, one cycle when repeating (each type has a default; `draw` follows the path length; a spring `ease` lasts until it settles). */\n\tduration?: number;\n\t/** Wait this many ms before starting (default 0). */\n\tdelay?: number;\n\t/** Start each further target this many ms after the one before (default 0). */\n\tstagger?: number;\n\t/** `after` (default) starts when the commands before it finish; `previous` starts with the command before. */\n\twith?: 'after' | 'previous';\n\t/** An easing; a spring with no `duration` lasts until it settles. */\n\tease?: AnimationEasing;\n\t/** Why this command is here (for people and agents reading the scene). */\n\tnote?: string;\n\t/**\n\t * Play the change this many times (a whole number, default 1); `duration` is one cycle. Not\n\t * for `enter`, `exit` or `wait`.\n\t */\n\trepeat?: number;\n\t/**\n\t * How repeats follow each other: `loop` (default) starts each cycle afresh, `mirror` plays\n\t * every other one backwards, `offset` carries on from where the last ended (rotate by 90,\n\t * repeat 4: a full turn). Colours and shapes offset like `loop`.\n\t */\n\trepeatMode?: 'loop' | 'mirror' | 'offset';\n\t/** Stepped time: hold the change on a grid of this many frames per second (default: the scene's `steps`, else smooth). */\n\tsteps?: number;\n}\n\nexport type MotionEnterStyle = 'fade' | 'pop' | 'grow' | 'slide' | 'draw' | 'zoom' | 'rise' | 'wipe' | 'iris' | 'split';\nexport type MotionExitStyle = 'fade' | 'shrink' | 'slide' | 'undraw' | 'wipe';\nexport type MotionDirection = 'up' | 'down' | 'left' | 'right';\n/** The opening an `iris` reveals through. */\nexport type MotionIrisShape = 'circle' | 'box';\n/** The line a `split` opens from. */\nexport type MotionSplitOrientation = 'horizontal' | 'vertical';\n\n/**\n * Brings hidden targets in. Targets entered in a shot are hidden before it. Each style is a\n * Flair motion primitive (`entrance.<style>`) with the same defaults.\n */\nexport interface MotionEnterCommand extends MotionCommandBase {\n\ttype: 'enter';\n\t/**\n\t * Default `fade`. `draw` draws the outline on, then fades the fill in. `pop` scales up past\n\t * full size and settles; `zoom` settles from larger; `rise` rises a short way with a little\n\t * overshoot. `wipe`, `iris` and `split` reveal the target through a clip over its box (see\n\t * `MotionFrame.clips`), reaching past it far enough to show its whole stroke.\n\t */\n\tstyle?: MotionEnterStyle;\n\t/**\n\t * For `slide`: the direction of travel (default `up`). For `wipe`: the way the edge travels\n\t * (default `right`, which reveals from the left).\n\t */\n\tdirection?: MotionDirection;\n\t/** For `slide` (default 40) and `rise` (default 20): how far in document units. */\n\tdistance?: number;\n\t/** For `pop` (default 0.5) and `zoom` (default 1.6): the starting scale. */\n\tscale?: number;\n\t/** For `iris`: open through a `circle` (default; an ellipse on a box that is not square) or a `box`. */\n\tshape?: MotionIrisShape;\n\t/** For `split`: open up and down from a `horizontal` line through the middle (default), or left and right from a `vertical` one. */\n\torientation?: MotionSplitOrientation;\n}\n\n/** Takes targets out. */\nexport interface MotionExitCommand extends MotionCommandBase {\n\ttype: 'exit';\n\t/** Default `fade`. `wipe` hides the target behind an edge travelling `direction` (a wipe in, reversed). */\n\tstyle?: MotionExitStyle;\n\t/** For `slide`: the direction of travel (default `down`). For `wipe`: the way the edge travels (default `right`, which hides from the left). */\n\tdirection?: MotionDirection;\n\tdistance?: number;\n}\n\n/** Draws a stroke on (or off) between two fractions of its length. */\nexport interface MotionDrawCommand extends MotionCommandBase {\n\ttype: 'draw';\n\t/** Fraction drawn at the end (default 1). */\n\tto?: number;\n\t/** Fraction drawn at the start (default: what is drawn now). */\n\tfrom?: number;\n}\n\n/** Moves targets by an offset, or to a point (their centre lands there). */\nexport interface MotionMoveCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'move';\n\tby?: { x: number; y: number };\n\tto?: { x: number; y: number };\n}\n\n/** Turns targets about their centre, by or to an angle in degrees (clockwise). */\nexport interface MotionRotateCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'rotate';\n\tby?: number;\n\tto?: number;\n}\n\n/** Scales targets about their centre (1 = rest size). */\nexport interface MotionScaleCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'scale';\n\tto: number | { x: number; y: number };\n\t/** Grow at a steady rate (the same factor each moment), which reads as an even zoom. */\n\tgeometric?: boolean;\n}\n\n/** Changes opacity (0–1). */\nexport interface MotionFadeCommand extends MotionCommandBase {\n\ttype: 'fade';\n\tto: number;\n}\n\n/** Changes solid paints and stroke width. Colours mix in OKLab. */\nexport interface MotionStyleCommand extends MotionCommandBase {\n\ttype: 'style';\n\tfill?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n}\n\n/** Morphs each target into the shape of another node (`into`), which usually stays hidden. */\nexport interface MotionMorphCommand extends MotionCommandBase {\n\ttype: 'morph';\n\tinto: string;\n}\n\n/**\n * Smart Animate: tweens a group into another group (`into`, usually hidden), part by part. Each\n * part of the target takes the shape, paint and place of its partner in `into`, paired by name,\n * then by id (`card-a-title` ↔ `card-b-title`), then by kind in order. Parts with no partner fade\n * out; parts of `into` with no partner do not appear (`check` lists them).\n */\nexport interface MotionMatchCommand extends MotionCommandBase {\n\ttype: 'match';\n\t/** Id of the group (or node) to become. */\n\tinto: string;\n}\n\n/** Moves targets along a path node, centre on the path. */\nexport interface MotionFollowCommand extends MotionCommandBase {\n\ttype: 'follow';\n\t/** Id of a path node in the artwork (it can be hidden). */\n\tpath: string;\n\t/**\n\t * Turn with the path's direction (default false). Moves, shakes and wiggles made during the\n\t * follow then turn with it too: they are offsets from the target's place on the path.\n\t */\n\trotate?: boolean;\n\t/** Fractions of the path's length to travel between (default 0 → 1). */\n\tfrom?: number;\n\tto?: number;\n}\n\n/** Scales up and back, `count` times (draws the eye). */\nexport interface MotionPulseCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'pulse';\n\t/** Extra scale at the peak (default 0.15). */\n\tamount?: number;\n\tcount?: number;\n}\n\n/** Shakes side to side (or up and down), settling. */\nexport interface MotionShakeCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'shake';\n\t/** Distance in document units (default 8). */\n\tamount?: number;\n\tcount?: number;\n\t/** Default `horizontal`. */\n\taxis?: 'horizontal' | 'vertical';\n}\n\n/** Rocks about the centre by `angle` either way, settling (Flair's `emphasis.teeter`). */\nexport interface MotionTeeterCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'teeter';\n\t/** Degrees either way (default 8). */\n\tangle?: number;\n\t/** Rocks (default 3). */\n\tcount?: number;\n}\n\n/** Bobs up and down without settling, like something floating (Flair's `emphasis.wave`). */\nexport interface MotionWaveCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'wave';\n\t/** Height in document units (default 6). */\n\tamount?: number;\n\t/** Bobs (default 2). */\n\tcount?: number;\n}\n\n/**\n * Wanders about its place as smooth seeded noise, easing out of and back to rest (Flair's\n * `emphasis.wiggle`). The same seed always wanders the same way.\n */\nexport interface MotionWiggleCommand extends MotionCommandBase {\n\t/**\n\t * `add` makes the change a layer over the pose instead of a change to it: it stacks on\n\t * whatever else moves the target (a shake on a slide), and what it adds stays once it ends.\n\t * Default `replace` for move, rotate and scale (the later change takes over), `add` for\n\t * pulse, shake, teeter, wave and wiggle.\n\t */\n\tblend?: 'replace' | 'add';\n\ttype: 'wiggle';\n\t/** Up to about this far, in document units (default 6). */\n\tamount?: number;\n\t/** Wanders per second, in Hz (default 3). */\n\tfrequency?: number;\n\t/** Layers of finer detail (default 2). */\n\toctaves?: number;\n\t/** Also turns about the centre by up to about this many degrees (default 0). */\n\trotate?: number;\n\t/** A whole number; default: one picked from the target's id, so each target wanders its own way. */\n\tseed?: number;\n}\n\n/** Tints solid paint toward a colour and back, `count` times (Flair's `emphasis.color-pulse`). */\nexport interface MotionColorPulseCommand extends MotionCommandBase {\n\ttype: 'color-pulse';\n\t/** The tint (default `#f59e0b`). Mixes in OKLab. */\n\tcolor?: string;\n\t/** Which paint (default `fill`). On a group it tints every path in it. */\n\tpaint?: 'fill' | 'stroke';\n\tcount?: number;\n}\n\n/** Tweens a numeric parameter of a live path effect on the target (twist angle, wiggle time, zig zag size…). */\nexport interface MotionEffectCommand extends MotionCommandBase {\n\ttype: 'effect';\n\t/** Id of an effect in the target node's `effects`. */\n\teffect: string;\n\t/** A numeric parameter of that effect, e.g. `angle`. */\n\tparam: string;\n\tto: number;\n}\n\n/** Does nothing for `duration` ms. */\nexport interface MotionWaitCommand {\n\ttype: 'wait';\n\tduration: number;\n\twith?: 'after' | 'previous';\n\tnote?: string;\n}\n\nexport type MotionCommand =\n\t| MotionEnterCommand\n\t| MotionExitCommand\n\t| MotionDrawCommand\n\t| MotionMoveCommand\n\t| MotionRotateCommand\n\t| MotionScaleCommand\n\t| MotionFadeCommand\n\t| MotionStyleCommand\n\t| MotionMorphCommand\n\t| MotionMatchCommand\n\t| MotionFollowCommand\n\t| MotionPulseCommand\n\t| MotionShakeCommand\n\t| MotionTeeterCommand\n\t| MotionWaveCommand\n\t| MotionWiggleCommand\n\t| MotionColorPulseCommand\n\t| MotionEffectCommand\n\t| MotionWaitCommand;\n\nexport type MotionCommandType = MotionCommand['type'];\n\nexport const MOTION_COMMAND_TYPES: readonly MotionCommandType[] = [\n\t'enter',\n\t'exit',\n\t'draw',\n\t'move',\n\t'rotate',\n\t'scale',\n\t'fade',\n\t'style',\n\t'morph',\n\t'match',\n\t'follow',\n\t'pulse',\n\t'shake',\n\t'teeter',\n\t'wave',\n\t'wiggle',\n\t'color-pulse',\n\t'effect',\n\t'wait'\n];\nexport const MOTION_ENTER_STYLES: readonly MotionEnterStyle[] = ['fade', 'pop', 'grow', 'slide', 'draw', 'zoom', 'rise', 'wipe', 'iris', 'split'];\nexport const MOTION_BLENDS = ['replace', 'add'] as const;\nexport const MOTION_REPEAT_MODES = ['loop', 'mirror', 'offset'] as const;\nexport const MOTION_EXIT_STYLES: readonly MotionExitStyle[] = ['fade', 'shrink', 'slide', 'undraw', 'wipe'];\nexport const MOTION_IRIS_SHAPES: readonly MotionIrisShape[] = ['circle', 'box'];\nexport const MOTION_SPLIT_ORIENTATIONS: readonly MotionSplitOrientation[] = ['horizontal', 'vertical'];\nexport const MOTION_DIRECTIONS: readonly MotionDirection[] = ['up', 'down', 'left', 'right'];\n\n/**\n * A colour parameter of the effect made from the scene: it stands for every use of its\n * `default` colour in the artwork and the commands, so recolouring it recolours them all.\n */\nexport interface MotionControl {\n\t/** Identifier, e.g. `accent`. */\n\tname: string;\n\ttype: 'color';\n\t/** A `#rrggbb` colour used in the scene. */\n\tdefault: string;\n\tlabel?: string;\n}\n\nexport interface MotionPreset {\n\tname: string;\n\tvalues: Record<string, string>;\n}\n\n/** Default lengths (ms) of commands that give none. */\nexport const MOTION_DEFAULT_DURATIONS: Readonly<Record<Exclude<MotionCommandType, 'wait' | 'draw'>, number>> = {\n\tenter: 600,\n\texit: 450,\n\tmove: 700,\n\trotate: 700,\n\tscale: 500,\n\tfade: 400,\n\tstyle: 500,\n\tmorph: 900,\n\tmatch: 900,\n\tfollow: 1400,\n\tpulse: 600,\n\tshake: 500,\n\tteeter: 600,\n\twave: 1000,\n\twiggle: 1500,\n\t'color-pulse': 600,\n\teffect: 900\n};\n\n/** Default hold after a shot's commands (ms). */\nexport const MOTION_DEFAULT_HOLD = 600;\n/** Default camera move (ms). */\nexport const MOTION_CAMERA_MS = 1000;\n/** `draw` lasts `length × MOTION_DRAW_MS_PER_UNIT`, clamped to `MOTION_DRAW_RANGE`. */\nexport const MOTION_DRAW_MS_PER_UNIT = 1.5;\nexport const MOTION_DRAW_RANGE: readonly [number, number] = [500, 2500];\n\n/**\n * The Flair motion primitive (`@pixerate/flair/motion`) a command plays, or undefined when\n * Flair has none (`move`, `scale`, `fade`, `style`, `morph`, `effect`, `wait` are the editor's\n * own). Commands and primitives of the same name take the same parameters and defaults.\n */\nexport function motionFlairPrimitive(command: MotionCommand): string | undefined {\n\tswitch (command.type) {\n\t\tcase 'enter':\n\t\t\treturn `entrance.${command.style ?? 'fade'}`;\n\t\tcase 'exit':\n\t\t\treturn `exit.${command.style ?? 'fade'}`;\n\t\tcase 'pulse':\n\t\tcase 'shake':\n\t\tcase 'teeter':\n\t\tcase 'wave':\n\t\tcase 'wiggle':\n\t\tcase 'color-pulse':\n\t\t\treturn `emphasis.${command.type}`;\n\t\tcase 'rotate':\n\t\t\treturn command.by !== undefined ? 'emphasis.spin' : undefined;\n\t\tcase 'follow':\n\t\t\treturn 'path.follow';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n","/**\n * Problems with a scene, as data: every issue has a stable `code`, a severity, the shot and\n * command it is in and the ids it is about, beside its prose `message`, so an agent (or a UI)\n * can act on it without parsing sentences.\n */\n\n/** `error`: the scene does not play as written. `warning`: it plays, but probably not as meant. `note`: may well be intended. */\nexport type MotionIssueSeverity = 'error' | 'warning' | 'note';\n\n/** Every issue code with its severity and what it means. */\nexport const MOTION_ISSUE_CODES = {\n\t'no-shots': { severity: 'note', wording: 'The scene has no shots yet.' },\n\t'duplicate-shot-id': { severity: 'error', wording: 'Two shots share an id.' },\n\t'unknown-target': { severity: 'error', wording: 'A command names a node the artwork does not have.' },\n\t'unknown-path': { severity: 'error', wording: 'A follow command names a path the artwork does not have.' },\n\t'not-a-path': { severity: 'error', wording: 'A follow path must be a path node, not a group.' },\n\t'reveal-no-box': { severity: 'warning', wording: 'A wipe, iris or split cannot clip a node with no width or height (a lone straight line), so it fades instead.' },\n\t'unknown-shape': { severity: 'error', wording: 'A morph names a shape the artwork does not have.' },\n\t'match-self': { severity: 'error', wording: 'A match turns a group into itself or into a group it holds (or that holds it).' },\n\t'match-unpaired': { severity: 'note', wording: 'Parts of a match\\'s \"into\" group have no partner in the target, so they do not appear.' },\n\t'unknown-effect': { severity: 'error', wording: 'An effect command names an effect the node does not have.' },\n\t'unknown-effect-param': { severity: 'error', wording: 'An effect command names a parameter that is not a number of that effect.' },\n\t'unknown-frame': { severity: 'error', wording: 'A camera frames a node the artwork does not have.' },\n\t'invalid-camera': { severity: 'error', wording: 'A camera rectangle has no area.' },\n\t'invalid-color': { severity: 'error', wording: 'A colour cannot be read.' },\n\t'paint-not-color': { severity: 'warning', wording: 'A style command recolours a gradient or empty paint, which only switches at the end, or a colour pulse has no solid paint to tint.' },\n\t'overlap': { severity: 'warning', wording: 'Two commands change the same property of a node at the same time; the later one wins.' },\n\t'enter-visible': { severity: 'warning', wording: 'A node enters while it is already showing, so it blinks out first.' },\n\t'exit-hidden': { severity: 'warning', wording: 'A node exits or animates while it is hidden.' },\n\t'out-of-frame': { severity: 'warning', wording: 'A node a command animates ends up outside the camera.' },\n\t'too-fast': { severity: 'warning', wording: 'A change is too quick to follow.' },\n\t'spring-cut-short': { severity: 'warning', wording: 'A spring is given a duration shorter than it takes to settle, so it jumps to its end.' },\n\t'unknown-cue': { severity: 'error', wording: 'A shot is cued to a beat with no beat grid, or to a word the narration does not have.' },\n\t'cue-missed': { severity: 'warning', wording: 'A shot starts after its cue, because the shot before runs past it.' },\n\t'scene-too-long': { severity: 'warning', wording: 'The scene runs past its target length.' },\n\t'scene-too-short': { severity: 'warning', wording: 'The scene ends before its target length.' },\n\t'unknown-control-color': { severity: 'warning', wording: 'A control stands for a colour the scene never uses.' },\n\t'empty-shot': { severity: 'note', wording: 'A shot neither moves the camera nor runs a command.' },\n\t'camera-aspect': { severity: 'note', wording: 'A camera rectangle has a different shape from the artwork, so it is letterboxed.' }\n} as const satisfies Record<string, { severity: MotionIssueSeverity; wording: string }>;\n\nexport type MotionIssueCode = keyof typeof MOTION_ISSUE_CODES;\n\nexport interface MotionIssue {\n\tcode: MotionIssueCode;\n\tseverity: MotionIssueSeverity;\n\tmessage: string;\n\t/** Id of the shot it is in, when it is in one. */\n\tshot?: string;\n\t/** Index of the command in that shot's `run`. */\n\tcommand?: number;\n\t/** Node ids it is about. */\n\tids?: string[];\n\t/** What was measured, what was needed and in what unit (e.g. 80 vs 120 ms). */\n\tmeasured?: number;\n\tneeded?: number;\n\tunit?: 'ms' | 's' | 'units';\n}\n\nexport function motionIssue(code: MotionIssueCode, message: string, extra: Omit<MotionIssue, 'code' | 'severity' | 'message'> = {}): MotionIssue {\n\treturn { code, severity: MOTION_ISSUE_CODES[code].severity, message, ...extra };\n}\n\n/** A stable key for an issue (code and ids, else code and place), to compare two checks. */\nexport function motionIssueKey(issue: MotionIssue): string {\n\tif (issue.ids?.length) return `${issue.code}:${[...issue.ids].sort().join(',')}`;\n\treturn `${issue.code}@${issue.shot ?? ''}#${issue.command ?? ''}`;\n}\n\n/** One line: `Shot \"intro\", command 2: …`. */\nexport function motionIssueLine(issue: MotionIssue): string {\n\tconst where = issue.shot !== undefined ? `Shot \"${issue.shot}\"${issue.command !== undefined ? `, command ${issue.command + 1}` : ''}: ` : '';\n\treturn `${where}${issue.message}`;\n}\n\n/** Optimal string alignment (Damerau–Levenshtein) distance. */\nfunction editDistance(a: string, b: string): number {\n\tconst d: number[][] = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);\n\tfor (let j = 1; j <= b.length; j++) d[0][j] = j;\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\t\t\td[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);\n\t\t\tif (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n\t\t}\n\t}\n\treturn d[a.length][b.length];\n}\n\n/** The candidate closest to `word` (case-insensitive), if it is within a third of its length. */\nexport function suggestName(word: string, candidates: Iterable<string>): string | undefined {\n\tconst w = word.toLowerCase();\n\tlet best: string | undefined;\n\tlet bestDistance = Infinity;\n\tfor (const c of candidates) {\n\t\tconst distance = editDistance(w, c.toLowerCase());\n\t\tif (distance < bestDistance) {\n\t\t\tbest = c;\n\t\t\tbestDistance = distance;\n\t\t}\n\t}\n\treturn best !== undefined && bestDistance <= Math.max(1, Math.floor(word.length / 3)) ? best : undefined;\n}\n\n/** `\"sunn\" (did you mean \"sun\"?)`, or just `\"sunn\"`. */\nexport function namedWithSuggestion(word: string, candidates: Iterable<string>): string {\n\tconst s = suggestName(word, candidates);\n\treturn s !== undefined && s !== word ? `\"${word}\" (did you mean \"${s}\"?)` : `\"${word}\"`;\n}\n","import { isAnimationEasing } from '../animation/easing.js';\nimport { namedWithSuggestion } from './issues.js';\nimport { MOTION_COMMAND_TYPES, MOTION_DIRECTIONS, MOTION_ENTER_STYLES, MOTION_EXIT_STYLES, MOTION_REPEAT_MODES, MOTION_BLENDS, MOTION_IRIS_SHAPES, MOTION_SPLIT_ORIENTATIONS, type MotionCommand, type MotionScene, type MotionShot } from './types.js';\n\n/**\n * Shape checking: whether a value is a well-formed scene, listing every problem at once.\n * Meaning (do the ids exist, does the timing work) is `checkMotionScene`'s job.\n */\n\nexport class MotionSceneFormatError extends Error {\n\treadonly problems: string[];\n\tconstructor(problems: string[]) {\n\t\tsuper(`The scene is not well formed:\\n${problems.map((p) => `- ${p}`).join('\\n')}`);\n\t\tthis.name = 'MotionSceneFormatError';\n\t\tthis.problems = problems;\n\t}\n}\n\nconst SCENE_KEYS = ['version', 'name', 'description', 'artwork', 'shots', 'loop', 'fps', 'steps', 'beat', 'narration', 'target', 'controls', 'presets'];\nconst SHOT_KEYS = ['id', 'label', 'camera', 'at', 'run', 'hold', 'speed'];\nconst CAMERA_KEYS = ['x', 'y', 'width', 'height', 'frame', 'padding', 'ease', 'ms', 'geometric'];\nconst BASE_KEYS = ['type', 'targets', 'duration', 'delay', 'stagger', 'with', 'ease', 'note', 'repeat', 'repeatMode', 'steps'];\nconst COMMAND_KEYS: Record<string, string[]> = {\n\tenter: [...BASE_KEYS, 'style', 'direction', 'distance', 'scale', 'shape', 'orientation'],\n\texit: [...BASE_KEYS, 'style', 'direction', 'distance'],\n\tdraw: [...BASE_KEYS, 'from', 'to'],\n\tmove: [...BASE_KEYS, 'by', 'to', 'blend'],\n\trotate: [...BASE_KEYS, 'by', 'to', 'blend'],\n\tscale: [...BASE_KEYS, 'to', 'geometric', 'blend'],\n\tfade: [...BASE_KEYS, 'to'],\n\tstyle: [...BASE_KEYS, 'fill', 'stroke', 'strokeWidth'],\n\tmorph: [...BASE_KEYS, 'into'],\n\tmatch: [...BASE_KEYS, 'into'],\n\tfollow: [...BASE_KEYS, 'path', 'rotate', 'from', 'to'],\n\tpulse: [...BASE_KEYS, 'amount', 'count', 'blend'],\n\tshake: [...BASE_KEYS, 'amount', 'count', 'axis', 'blend'],\n\tteeter: [...BASE_KEYS, 'angle', 'count', 'blend'],\n\twave: [...BASE_KEYS, 'amount', 'count', 'blend'],\n\twiggle: [...BASE_KEYS, 'amount', 'frequency', 'octaves', 'rotate', 'seed', 'blend'],\n\t'color-pulse': [...BASE_KEYS, 'color', 'paint', 'count'],\n\teffect: [...BASE_KEYS, 'effect', 'param', 'to'],\n\twait: ['type', 'duration', 'with', 'note']\n};\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\nconst isNum = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst isPoint = (v: unknown) => isObject(v) && isNum(v.x) && isNum(v.y);\n\nfunction unknownKeys(value: Record<string, unknown>, known: readonly string[], where: string, problems: string[]) {\n\tfor (const key of Object.keys(value)) if (!known.includes(key)) problems.push(`${where}: unknown field ${namedWithSuggestion(key, known)}.`);\n}\n\n/** Problems with one command's shape (empty when well formed). `where` prefixes each. */\nexport function commandShapeProblems(command: unknown, where: string): string[] {\n\tconst problems: string[] = [];\n\tif (!isObject(command)) return [`${where} must be an object.`];\n\tconst type = command.type;\n\tif (typeof type !== 'string' || !(MOTION_COMMAND_TYPES as readonly string[]).includes(type)) {\n\t\treturn [`${where}: unknown type ${typeof type === 'string' ? namedWithSuggestion(type, MOTION_COMMAND_TYPES) : String(type)}; use one of ${MOTION_COMMAND_TYPES.join(', ')}.`];\n\t}\n\tunknownKeys(command, COMMAND_KEYS[type], `${where} (${type})`, problems);\n\tconst p = (msg: string) => problems.push(`${where} (${type}): ${msg}`);\n\tconst nonNegative = (key: string) => {\n\t\tif (command[key] !== undefined && !(isNum(command[key]) && (command[key] as number) >= 0)) p(`\"${key}\" must be a number of milliseconds ≥ 0.`);\n\t};\n\tconst fraction = (key: string) => {\n\t\tif (command[key] !== undefined && !(isNum(command[key]) && (command[key] as number) >= 0 && (command[key] as number) <= 1)) p(`\"${key}\" must be a fraction from 0 to 1.`);\n\t};\n\tconst optionalNumber = (key: string) => {\n\t\tif (command[key] !== undefined && !isNum(command[key])) p(`\"${key}\" must be a number.`);\n\t};\n\tif (command.with !== undefined && command.with !== 'after' && command.with !== 'previous') p(`\"with\" must be \"after\" or \"previous\".`);\n\tif (command.note !== undefined && typeof command.note !== 'string') p(`\"note\" must be a string.`);\n\tif (type === 'wait') {\n\t\tif (!isNum(command.duration) || command.duration < 0) p(`\"duration\" must be a number of milliseconds ≥ 0.`);\n\t\treturn problems;\n\t}\n\tif (!Array.isArray(command.targets) || command.targets.length === 0 || !command.targets.every((t) => typeof t === 'string' && t.length > 0)) p(`\"targets\" must be a non-empty list of node ids.`);\n\tnonNegative('duration');\n\tnonNegative('delay');\n\tnonNegative('stagger');\n\tif (command.ease !== undefined && !isAnimationEasing(command.ease)) p(`\"ease\" is not an easing; use a preset such as \"ease-in-out\" or \"spring-bouncy\", or { \"type\": \"cubic-bezier\", … } or { \"type\": \"spring\", … }.`);\n\tif (command.repeat !== undefined) {\n\t\tif (type === 'enter' || type === 'exit') p(`\"repeat\" is not for ${type} (it brings things in or out once); repeat an emphasis or a move instead.`);\n\t\telse if (!(Number.isInteger(command.repeat) && (command.repeat as number) >= 1 && (command.repeat as number) <= 1000)) p(`\"repeat\" must be a whole number from 1 to 1000.`);\n\t}\n\tif (command.blend !== undefined && !(MOTION_BLENDS as readonly unknown[]).includes(command.blend)) p(`\"blend\" must be \"replace\" (the change takes over) or \"add\" (a layer on top).`);\n\tif (command.repeatMode !== undefined && !(MOTION_REPEAT_MODES as readonly unknown[]).includes(command.repeatMode)) p(`\"repeatMode\" must be one of ${MOTION_REPEAT_MODES.join(', ')}.`);\n\tif (command.steps !== undefined && !(isNum(command.steps) && command.steps > 0 && command.steps <= 120)) p(`\"steps\" must be frames per second from above 0 to 120 (12 holds each pose for two frames at 24 fps).`);\n\tswitch (type) {\n\t\tcase 'enter':\n\t\tcase 'exit': {\n\t\t\tconst styles = type === 'enter' ? MOTION_ENTER_STYLES : MOTION_EXIT_STYLES;\n\t\t\tif (command.style !== undefined && !(typeof command.style === 'string' && (styles as readonly string[]).includes(command.style)))\n\t\t\t\tp(`\"style\" must be one of ${styles.join(', ')}${typeof command.style === 'string' ? ` (got ${namedWithSuggestion(command.style, styles)})` : ''}.`);\n\t\t\tif (command.direction !== undefined && !(MOTION_DIRECTIONS as readonly unknown[]).includes(command.direction)) p(`\"direction\" must be one of ${MOTION_DIRECTIONS.join(', ')}.`);\n\t\t\toptionalNumber('distance');\n\t\t\tif (command.scale !== undefined && !(isNum(command.scale) && command.scale >= 0)) p(`\"scale\" must be a number ≥ 0 (the starting scale for pop and zoom).`);\n\t\t\tif (command.shape !== undefined && !(MOTION_IRIS_SHAPES as readonly unknown[]).includes(command.shape)) p(`\"shape\" must be one of ${MOTION_IRIS_SHAPES.join(', ')} (the opening of an iris).`);\n\t\t\tif (command.orientation !== undefined && !(MOTION_SPLIT_ORIENTATIONS as readonly unknown[]).includes(command.orientation)) p(`\"orientation\" must be one of ${MOTION_SPLIT_ORIENTATIONS.join(', ')} (the line a split opens from).`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'draw':\n\t\t\tfraction('from');\n\t\t\tfraction('to');\n\t\t\tbreak;\n\t\tcase 'move':\n\t\t\tif (command.by === undefined && command.to === undefined) p(`give \"by\" (an offset) or \"to\" (a point).`);\n\t\t\tif (command.by !== undefined && command.to !== undefined) p(`give \"by\" or \"to\", not both.`);\n\t\t\tif (command.by !== undefined && !isPoint(command.by)) p(`\"by\" must be { \"x\": number, \"y\": number }.`);\n\t\t\tif (command.to !== undefined && !isPoint(command.to)) p(`\"to\" must be { \"x\": number, \"y\": number }.`);\n\t\t\tbreak;\n\t\tcase 'rotate':\n\t\t\tif (command.by === undefined && command.to === undefined) p(`give \"by\" or \"to\" (degrees).`);\n\t\t\tif (command.by !== undefined && command.to !== undefined) p(`give \"by\" or \"to\", not both.`);\n\t\t\toptionalNumber('by');\n\t\t\toptionalNumber('to');\n\t\t\tbreak;\n\t\tcase 'scale':\n\t\t\tif (!(isNum(command.to) || isPoint(command.to))) p(`\"to\" must be a number or { \"x\": number, \"y\": number }.`);\n\t\t\tif (command.geometric !== undefined && typeof command.geometric !== 'boolean') p(`\"geometric\" must be true or false.`);\n\t\t\tbreak;\n\t\tcase 'fade':\n\t\t\tif (!(isNum(command.to) && command.to >= 0 && command.to <= 1)) p(`\"to\" must be an opacity from 0 to 1.`);\n\t\t\tbreak;\n\t\tcase 'style':\n\t\t\tif (command.fill === undefined && command.stroke === undefined && command.strokeWidth === undefined) p(`give at least one of \"fill\", \"stroke\" or \"strokeWidth\".`);\n\t\t\tif (command.fill !== undefined && typeof command.fill !== 'string') p(`\"fill\" must be a CSS colour.`);\n\t\t\tif (command.stroke !== undefined && typeof command.stroke !== 'string') p(`\"stroke\" must be a CSS colour.`);\n\t\t\tif (command.strokeWidth !== undefined && !(isNum(command.strokeWidth) && command.strokeWidth >= 0)) p(`\"strokeWidth\" must be a number ≥ 0.`);\n\t\t\tbreak;\n\t\tcase 'morph':\n\t\tcase 'match':\n\t\t\tif (typeof command.into !== 'string' || !command.into) p(`\"into\" must be the id of a ${type === 'match' ? 'group to become' : 'node whose shape to take'}.`);\n\t\t\tbreak;\n\t\tcase 'follow':\n\t\t\tif (typeof command.path !== 'string' || !command.path) p(`\"path\" must be the id of a path node.`);\n\t\t\tif (command.rotate !== undefined && typeof command.rotate !== 'boolean') p(`\"rotate\" must be true or false.`);\n\t\t\tfraction('from');\n\t\t\tfraction('to');\n\t\t\tbreak;\n\t\tcase 'pulse':\n\t\tcase 'shake':\n\t\tcase 'teeter':\n\t\tcase 'wave':\n\t\tcase 'color-pulse':\n\t\t\toptionalNumber('amount');\n\t\t\toptionalNumber('angle');\n\t\t\tif (command.count !== undefined && !(Number.isInteger(command.count) && (command.count as number) >= 1)) p(`\"count\" must be a whole number ≥ 1.`);\n\t\t\tif (command.axis !== undefined && command.axis !== 'horizontal' && command.axis !== 'vertical') p(`\"axis\" must be \"horizontal\" or \"vertical\".`);\n\t\t\tif (command.color !== undefined && typeof command.color !== 'string') p(`\"color\" must be a CSS colour.`);\n\t\t\tif (command.paint !== undefined && command.paint !== 'fill' && command.paint !== 'stroke') p(`\"paint\" must be \"fill\" or \"stroke\".`);\n\t\t\tbreak;\n\t\tcase 'wiggle':\n\t\t\toptionalNumber('amount');\n\t\t\toptionalNumber('rotate');\n\t\t\tif (command.frequency !== undefined && !(isNum(command.frequency) && command.frequency > 0)) p(`\"frequency\" must be a number of Hz > 0.`);\n\t\t\tif (command.octaves !== undefined && !(Number.isInteger(command.octaves) && (command.octaves as number) >= 1 && (command.octaves as number) <= 8)) p(`\"octaves\" must be a whole number from 1 to 8.`);\n\t\t\tif (command.seed !== undefined && !(Number.isInteger(command.seed) && (command.seed as number) >= 0)) p(`\"seed\" must be a whole number ≥ 0.`);\n\t\t\tbreak;\n\t\tcase 'effect':\n\t\t\tif (typeof command.effect !== 'string' || !command.effect) p(`\"effect\" must be the id of one of the node's effects.`);\n\t\t\tif (typeof command.param !== 'string' || !command.param) p(`\"param\" must name a numeric parameter of the effect.`);\n\t\t\tif (!isNum(command.to)) p(`\"to\" must be a number.`);\n\t\t\tbreak;\n\t}\n\treturn problems;\n}\n\n/** Problems with one shot's shape. */\nexport function shotShapeProblems(shot: unknown, where: string): string[] {\n\tif (!isObject(shot)) return [`${where} must be an object.`];\n\tconst problems: string[] = [];\n\tunknownKeys(shot, SHOT_KEYS, where, problems);\n\tif (typeof shot.id !== 'string' || !/^[A-Za-z0-9_][\\w.-]*$/.test(shot.id)) problems.push(`${where}: \"id\" must be letters, digits, \"_\", \"-\" or \".\" (e.g. \"intro\").`);\n\tconst name = typeof shot.id === 'string' ? `Shot \"${shot.id}\"` : where;\n\tif (shot.label !== undefined && typeof shot.label !== 'string') problems.push(`${name}: \"label\" must be a string.`);\n\tif (shot.hold !== undefined && !(isNum(shot.hold) && shot.hold >= 0)) problems.push(`${name}: \"hold\" must be a number of milliseconds ≥ 0.`);\n\tif (shot.speed !== undefined && !(isNum(shot.speed) && shot.speed >= 0.05 && shot.speed <= 20)) problems.push(`${name}: \"speed\" must be a number from 0.05 to 20 (2 plays it twice as fast).`);\n\tif (shot.at !== undefined) {\n\t\tconst at = shot.at;\n\t\tconst given = isObject(at) ? (['beat', 'word', 'ms'] as const).filter((k) => at[k] !== undefined) : [];\n\t\tif (!isObject(at) || given.length !== 1) problems.push(`${name}: \"at\" must give one of { \"beat\": number }, { \"word\": index } or { \"ms\": number }.`);\n\t\telse {\n\t\t\tunknownKeys(at, ['beat', 'word', 'ms'], `${name} at`, problems);\n\t\t\tconst k = given[0];\n\t\t\tif (!isNum(at[k]) || (at[k] as number) < 0 || (k === 'word' && !Number.isInteger(at[k]))) problems.push(`${name}: \"at.${k}\" must be ${k === 'word' ? 'a word index ≥ 0' : 'a number ≥ 0'}.`);\n\t\t}\n\t}\n\tif (shot.camera !== undefined) {\n\t\tconst c = shot.camera;\n\t\tif (!isObject(c)) problems.push(`${name}: \"camera\" must be an object.`);\n\t\telse {\n\t\t\tunknownKeys(c, CAMERA_KEYS, `${name} camera`, problems);\n\t\t\tconst isRect = ['x', 'y', 'width', 'height'].every((k) => isNum(c[k]));\n\t\t\tif (typeof c.frame === 'string') {\n\t\t\t\tif (c.padding !== undefined && !isNum(c.padding)) problems.push(`${name} camera: \"padding\" must be a number.`);\n\t\t\t} else if (!isRect) problems.push(`${name} camera: give { x, y, width, height } or { frame: \"<node id>\" }.`);\n\t\t\tif (c.ease !== undefined && !isAnimationEasing(c.ease)) problems.push(`${name} camera: \"ease\" is not an easing.`);\n\t\t\tif (c.ms !== undefined && !(isNum(c.ms) && c.ms >= 0)) problems.push(`${name} camera: \"ms\" must be a number ≥ 0.`);\n\t\t\tif (c.geometric !== undefined && typeof c.geometric !== 'boolean') problems.push(`${name} camera: \"geometric\" must be true or false.`);\n\t\t}\n\t}\n\tif (!Array.isArray(shot.run)) problems.push(`${name}: \"run\" must be a list of commands (it may be empty).`);\n\telse shot.run.forEach((command, i) => problems.push(...commandShapeProblems(command, `${name}, command ${i + 1}`)));\n\treturn problems;\n}\n\n/** Problems with a scene's shape (empty when well formed). */\nexport function motionSceneShapeProblems(input: unknown): string[] {\n\tif (!isObject(input)) return ['The scene must be an object.'];\n\tconst problems: string[] = [];\n\tunknownKeys(input, SCENE_KEYS, 'Scene', problems);\n\tif (input.version !== 1) problems.push('Scene: \"version\" must be 1.');\n\tif (typeof input.name !== 'string' || !input.name) problems.push('Scene: \"name\" must be a non-empty string.');\n\tif (input.description !== undefined && typeof input.description !== 'string') problems.push('Scene: \"description\" must be a string.');\n\tconst art = input.artwork;\n\tif (!isObject(art) || !isNum(art.width) || !isNum(art.height) || !(art.width > 0) || !(art.height > 0) || !Array.isArray(art.nodes))\n\t\tproblems.push('Scene: \"artwork\" must be a vector document { width, height, nodes }.');\n\tif (input.loop !== undefined && !['none', 'loop', 'ping-pong'].includes(input.loop as string)) problems.push('Scene: \"loop\" must be \"none\", \"loop\" or \"ping-pong\".');\n\tif (input.fps !== undefined && !(isNum(input.fps) && input.fps > 0 && input.fps <= 120)) problems.push('Scene: \"fps\" must be a number from 1 to 120.');\n\tif (input.beat !== undefined) {\n\t\tconst b = input.beat;\n\t\tif (!isObject(b) || !(isNum(b.bpm) && b.bpm >= 1 && b.bpm <= 1000) || (b.offset !== undefined && !isNum(b.offset)) || (b.meter !== undefined && !(Number.isInteger(b.meter) && (b.meter as number) >= 1)))\n\t\t\tproblems.push('Scene: \"beat\" must be { \"bpm\": 1–1000, \"offset\"?: ms, \"meter\"?: beats a bar }.');\n\t}\n\tif (input.narration !== undefined) {\n\t\tconst n = input.narration;\n\t\tif (!isObject(n) || !Array.isArray(n.words) || !n.words.every((w, i, all) => isObject(w) && typeof w.text === 'string' && isNum(w.start) && w.start >= 0 && (w.end === undefined || (isNum(w.end) && w.end >= w.start)) && (i === 0 || w.start >= ((all[i - 1] as Record<string, number>).start ?? 0))))\n\t\t\tproblems.push('Scene: \"narration\" must be { \"words\": [{ \"text\", \"start\": ms, \"end\"?: ms }, …] } in time order.');\n\t}\n\tif (input.steps !== undefined && !(isNum(input.steps) && input.steps > 0 && input.steps <= 120)) problems.push('Scene: \"steps\" must be frames per second from above 0 to 120.');\n\tif (input.target !== undefined && !(Array.isArray(input.target) && input.target.length === 2 && input.target.every(isNum) && input.target[0] <= input.target[1]))\n\t\tproblems.push('Scene: \"target\" must be [min, max] seconds.');\n\tif (input.controls !== undefined) {\n\t\tif (!Array.isArray(input.controls)) problems.push('Scene: \"controls\" must be a list.');\n\t\telse\n\t\t\tinput.controls.forEach((c, i) => {\n\t\t\t\tif (!isObject(c) || typeof c.name !== 'string' || !/^[A-Za-z_]\\w*$/.test(c.name) || c.type !== 'color' || typeof c.default !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(c.default))\n\t\t\t\t\tproblems.push(`Scene: control ${i + 1} must be { name (an identifier), type: \"color\", default: \"#rrggbb\", label? }.`);\n\t\t\t});\n\t}\n\tif (input.presets !== undefined && !(Array.isArray(input.presets) && input.presets.every((p) => isObject(p) && typeof p.name === 'string' && isObject(p.values))))\n\t\tproblems.push('Scene: \"presets\" must be a list of { name, values }.');\n\tif (!Array.isArray(input.shots)) problems.push('Scene: \"shots\" must be a list.');\n\telse input.shots.forEach((shot, i) => problems.push(...shotShapeProblems(shot, `Shot ${i + 1}`)));\n\treturn problems;\n}\n\n/** Reads a scene from JSON (a string or a parsed value). Throws `MotionSceneFormatError` listing every problem. */\nexport function parseMotionScene(input: unknown): MotionScene {\n\tlet value = input;\n\tif (typeof input === 'string') {\n\t\ttry {\n\t\t\tvalue = JSON.parse(input);\n\t\t} catch (error) {\n\t\t\tthrow new MotionSceneFormatError([`The scene is not valid JSON: ${(error as Error).message}`]);\n\t\t}\n\t}\n\tconst problems = motionSceneShapeProblems(value);\n\tif (problems.length) throw new MotionSceneFormatError(problems);\n\treturn value as MotionScene;\n}\n\n/** Writes a scene as JSON. */\nexport function motionSceneToJson(scene: MotionScene, space: number | string = 2): string {\n\treturn JSON.stringify(scene, null, space);\n}\n\n/** Whether `shot` is a well-formed shot. */\nexport const isMotionShot = (shot: unknown): shot is MotionShot => shotShapeProblems(shot, 'Shot').length === 0;\n/** Whether `command` is a well-formed command. */\nexport const isMotionCommand = (command: unknown): command is MotionCommand => commandShapeProblems(command, 'Command').length === 0;\n","// Pairing passes adapted from deckcraft-main/crates/anim/src/morph.rs (`morph_pairs`) and figcraft-main/crates/ui-egui/src/present.rs (`match_layers`), MIT OR Apache-2.0, © ArtCraft Team and contributors.\nimport type { VectorNode } from '../vector/types.js';\n\n/** How the parts of one node pair with the parts of another for a `match` (Smart Animate). */\nexport interface MotionMatch {\n\t/** `[from id, into id]`: each part of the target and the part of `into` it becomes. */\n\tpairs: [string, string][];\n\t/** Parts of the target with no partner (they fade out). */\n\tunpairedFrom: string[];\n\t/** Parts of `into` with no partner (they cannot appear). */\n\tunpairedInto: string[];\n}\n\nconst SEPARATOR = /[-_/.:]/;\n\n/** An id with the group's own id (or its last word) taken out, so `card-a-title` and `card-b-title` both read `title`. */\nfunction localId(id: string, groupId: string): string {\n\tif (groupId && id.includes(groupId)) return id.split(groupId).join('').replace(/^[-_/.:]+|[-_/.:]+$/g, '');\n\tconst parts = id.split(SEPARATOR);\n\treturn parts[parts.length - 1] ?? id;\n}\n\n/**\n * Pairs the parts of `from` with the parts of `into`, each part used once, in passes: the same\n * `name`, then the same id once each group's own id is taken out, then the same kind in order.\n * Paired groups pair their own parts the same way, so a part pairs with a part, never a group\n * with a path. Two paths (or a path and a group with no children) pair whole.\n */\nexport function matchMotionNodes(from: VectorNode, into: VectorNode): MotionMatch {\n\tconst out: MotionMatch = { pairs: [], unpairedFrom: [], unpairedInto: [] };\n\tconst visit = (a: VectorNode, b: VectorNode) => {\n\t\tconst aKids = a.type === 'group' ? a.children : [];\n\t\tconst bKids = b.type === 'group' ? b.children : [];\n\t\tif (!aKids.length || !bKids.length) {\n\t\t\tout.pairs.push([a.id, b.id]);\n\t\t\treturn;\n\t\t}\n\t\tconst left = new Set(aKids);\n\t\tconst right = new Set(bKids);\n\t\tconst pair = (key: (n: VectorNode, group: VectorNode) => string | undefined) => {\n\t\t\tfor (const x of [...left]) {\n\t\t\t\tconst k = key(x, a);\n\t\t\t\tif (!k) continue;\n\t\t\t\tconst y = [...right].find((n) => key(n, b) === k);\n\t\t\t\tif (!y) continue;\n\t\t\t\tleft.delete(x);\n\t\t\t\tright.delete(y);\n\t\t\t\tif (x.type === 'group' && y.type === 'group') visit(x, y);\n\t\t\t\telse out.pairs.push([x.id, y.id]);\n\t\t\t}\n\t\t};\n\t\tpair((n) => n.name?.trim() || undefined);\n\t\tpair((n, g) => localId(n.id, g.id) || undefined);\n\t\t// Then the same kind, in stacking order.\n\t\tfor (const x of [...left]) {\n\t\t\tconst y = [...right].find((n) => n.type === x.type);\n\t\t\tif (!y) continue;\n\t\t\tleft.delete(x);\n\t\t\tright.delete(y);\n\t\t\tif (x.type === 'group' && y.type === 'group') visit(x, y);\n\t\t\telse out.pairs.push([x.id, y.id]);\n\t\t}\n\t\tout.unpairedFrom.push(...[...left].map((n) => n.id));\n\t\tout.unpairedInto.push(...[...right].map((n) => n.id));\n\t};\n\tvisit(from, into);\n\treturn out;\n}\n","import { mixColorsOklab } from '../animation/color.js';\nimport { matchMotionNodes } from './match.js';\nimport { behaviorProgress, motionSeedFromId, type MotionBehavior } from '../animation/behavior.js';\nimport { evaluateEasing, resolveEasing, springSettleMs, type AnimationEasing } from '../animation/easing.js';\nimport { bezierPathLength } from '../canvas/pathops/bezier.js';\nimport {\n\tIDENTITY_MATRIX,\n\tapplyMatrix,\n\tcollectPathNodes,\n\tinvertMatrix,\n\tmultiplyMatrices,\n\tnodeMatrix,\n\tvectorNodeBounds,\n\tvectorPathWorldBezier,\n\ttype AffineMatrix\n} from '../vector/geometry.js';\nimport type { VectorBounds, VectorNode, VectorPaint } from '../vector/types.js';\nimport {\n\tMOTION_CAMERA_MS,\n\tMOTION_DEFAULT_DURATIONS,\n\tMOTION_DEFAULT_HOLD,\n\tMOTION_DRAW_MS_PER_UNIT,\n\tMOTION_DRAW_RANGE,\n\ttype MotionBeatGrid,\n\ttype MotionCamera,\n\ttype MotionCommand,\n\ttype MotionCue,\n\ttype MotionDirection,\n\ttype MotionIrisShape,\n\ttype MotionRect,\n\ttype MotionSplitOrientation,\n\ttype MotionScene,\n\ttype MotionShot\n} from './types.js';\n\n/**\n * Compiling a scene: shots and commands become timed segments, one per (node, property)\n * change. A property's value at a time is that of the latest segment to have started (its\n * `from` before the first one), so a node that enters later is hidden until then. This is\n * also how Flair's vector motion combines changes, which keeps the Flair export exact.\n */\n\n/**\n * Properties a segment can change. Offsets (`x`, `y`, `rotation`) are relative to the rest\n * pose, scales multiply it, and turns and scales are about the node's centre at rest.\n * `effect:<effectId>:<param>` tweens a live path effect's parameter. `camera` (node `\"\"`) is\n * the view box `[x, y, width, height]`. `clipRect` (`[x, y, width, height]`) and `clipCircle`\n * (`[cx, cy, r]`) are the reveal clips of `wipe`, `iris` and `split`, in the units of the\n * node's own box (0–1 across it, SVG's `objectBoundingBox`), as Flair's clip reveals are.\n */\nexport type MotionProperty =\n\t| 'opacity'\n\t| 'x'\n\t| 'y'\n\t| 'rotation'\n\t| 'scaleX'\n\t| 'scaleY'\n\t| 'fill'\n\t| 'stroke'\n\t| 'strokeWidth'\n\t| 'fillOpacity'\n\t| 'drawStart'\n\t| 'drawEnd'\n\t| 'shape'\n\t| 'follow'\n\t| 'clipRect'\n\t| 'clipCircle'\n\t| 'camera'\n\t| `effect:${string}:${string}`;\n\nexport type MotionValue = number | string | readonly number[];\n\nexport interface MotionSegment {\n\t/** Node id (`\"\"` for the camera). */\n\tnode: string;\n\tproperty: MotionProperty;\n\tstart: number;\n\tend: number;\n\tfrom: MotionValue;\n\tto: MotionValue;\n\tease: AnimationEasing;\n\t/** The shot and command (index in `run`) it comes from. */\n\tshot: string;\n\tcommand: number;\n\t/**\n\t * How the change gets from `from` to `to` when not straight along its ease (a pulse there and\n\t * back, a settling oscillation, a wriggle): Flair's `behavior`, exported as is.\n\t */\n\tbehavior?: MotionBehavior;\n\t/**\n\t * Which number of the node's exported value this is (x 0, y 1, rotation 2, matching the\n\t * transform Flair is given), so a wriggle wanders each on the channel Flair uses. Default 0.\n\t */\n\tindex?: number;\n\t/** Played backwards in time (a mirrored repeat): progress runs 1 → 0 through the ease. */\n\treverse?: boolean;\n\t/** Stepped time: progress holds on a grid of this many frames per second from the start. */\n\tsteps?: number;\n\t/** Numbers change by a steady factor (`from·(to/from)^u`); a camera zooms at a steady rate. */\n\tgeometric?: boolean;\n\t/**\n\t * `add`: the segment is a layer over the node's pose rather than a change to it. It lives on\n\t * its own track (`motionAddTrackKey`), runs from 0 (offsets, turns) or 1 (scales), and what\n\t * it adds stays once it ends, on top of whatever the pose does.\n\t */\n\tblend?: 'add';\n\t/** For `follow`: the path node id, and whether to turn with it. */\n\tpath?: string;\n\trotate?: boolean;\n}\n\nexport interface MotionShotTiming {\n\tid: string;\n\tindex: number;\n\tlabel?: string;\n\tstart: number;\n\t/** When the camera move ends and the commands begin. */\n\tcommandsStart: number;\n\t/** When the last command ends (the hold follows). */\n\tcommandsEnd: number;\n\tend: number;\n\t/** The time the shot is cued to start (`at`), when it has a cue that resolves. */\n\tcue?: number;\n\t/** How late the shot starts after its cue (ms), when the shot before ran past it. */\n\tmissedBy?: number;\n}\n\nexport interface MotionCommandTiming {\n\tshot: string;\n\tshotIndex: number;\n\tcommand: number;\n\ttype: MotionCommand['type'];\n\tstart: number;\n\tend: number;\n\t/** Length per target (ms). */\n\tduration: number;\n}\n\nexport interface MotionTimeline {\n\t/** Total length in ms. */\n\tduration: number;\n\tshots: MotionShotTiming[];\n\tcommands: MotionCommandTiming[];\n\tsegments: MotionSegment[];\n\t/** Segments per `node\\u0000property`, in start order. */\n\ttracks: ReadonlyMap<string, readonly MotionSegment[]>;\n}\n\n/** Where a node sits in the artwork. */\nexport interface MotionNodeEntry {\n\tnode: VectorNode;\n\t/** Ids from the root down to the node's parent. */\n\tancestors: string[];\n\t/** Parent space → document space. */\n\tparentWorld: AffineMatrix;\n\t/** Centre of the node's bounds at rest, in its parent's space. */\n\tcenter: { x: number; y: number };\n\t/** Bounds at rest in document space. */\n\tbounds: VectorBounds | null;\n\t/** Bounds at rest in its parent's space (what a reveal clip's box is). */\n\tbox: VectorBounds | null;\n}\n\nconst indexCache = new WeakMap<object, Map<string, MotionNodeEntry>>();\n\n/** Every node of the artwork by id (cached per node list). */\nexport function indexMotionNodes(nodes: readonly VectorNode[]): Map<string, MotionNodeEntry> {\n\tconst hit = indexCache.get(nodes);\n\tif (hit) return hit;\n\tconst out = new Map<string, MotionNodeEntry>();\n\tconst walk = (list: readonly VectorNode[], parentWorld: AffineMatrix, ancestors: string[]) => {\n\t\tfor (const node of list) {\n\t\t\tconst local = vectorNodeBounds(node);\n\t\t\tconst bounds = vectorNodeBounds(node, parentWorld);\n\t\t\tconst center = local ? { x: local.x + local.width / 2, y: local.y + local.height / 2 } : { x: 0, y: 0 };\n\t\t\tif (!out.has(node.id)) out.set(node.id, { node, ancestors, parentWorld, center, bounds, box: local });\n\t\t\tif (node.type === 'group') walk(node.children, multiplyMatrices(nodeMatrix(node), parentWorld), [...ancestors, node.id]);\n\t\t}\n\t};\n\twalk(nodes, IDENTITY_MATRIX, []);\n\tindexCache.set(nodes, out);\n\treturn out;\n}\n\nconst solid = (paint: VectorPaint | undefined): string | undefined => (typeof paint === 'string' && paint !== 'none' ? paint : undefined);\n\n/** The first solid paint of a node (a group's first path with one). */\nfunction firstPaint(node: VectorNode, key: 'fill' | 'stroke'): string | undefined {\n\tif (node.type === 'path') return solid(node[key]);\n\tfor (const p of collectPathNodes(node)) {\n\t\tconst s = solid(p[key]);\n\t\tif (s) return s;\n\t}\n\treturn undefined;\n}\n\n/** How far a stroke reaches past the outline: half its width (all of it outside, none inside). */\nfunction strokeReach(node: VectorNode): number {\n\tlet reach = 0;\n\tfor (const p of node.type === 'path' ? [node] : collectPathNodes(node)) {\n\t\tif (p.stroke == null || p.stroke === 'none') continue;\n\t\tconst width = p.strokeWidth ?? 1;\n\t\treach = Math.max(reach, p.strokeAlign === 'outside' ? width : p.strokeAlign === 'inside' ? 0 : width / 2);\n\t}\n\treturn reach;\n}\n\n/**\n * How far past its box (as a share of its width and height) a reveal clip reaches, so it shows\n * the whole stroke: the stroke's reach over the box plus 0.02, at most 1 (Flair's padding). Null\n * when the box has no width or height (a lone straight line), which a clip cannot reveal.\n */\nexport function motionRevealPadding(entry: MotionNodeEntry): readonly [number, number] | null {\n\tconst box = entry.box;\n\tif (!box || !(box.width > 0) || !(box.height > 0)) return null;\n\tconst s = strokeReach(entry.node);\n\treturn [Math.min(1, s / box.width + 0.02), Math.min(1, s / box.height + 0.02)];\n}\n\n/** Clip numbers as Flair writes them (4 decimals). */\nconst clipRound = (n: number) => Math.round(n * 1e4) / 1e4 || 0;\n\n/** A reveal clip that shows the whole node (padded past its box), in its box's units. */\nfunction revealFull(property: 'clipRect' | 'clipCircle', [px, py]: readonly [number, number]): number[] {\n\treturn (property === 'clipRect' ? [-px, -py, 1 + 2 * px, 1 + 2 * py] : [0.5, 0.5, Math.hypot(0.5 + px, 0.5 + py)]).map(clipRound);\n}\n\nconst OPPOSITE: Record<MotionDirection, MotionDirection> = { up: 'down', down: 'up', left: 'right', right: 'left' };\n\n/** What a reveal clip animates: a wipe (in, or out with `hide`), an iris or a split. */\nexport type MotionReveal = { style: 'wipe'; direction?: MotionDirection; hide?: boolean } | { style: 'iris'; shape?: MotionIrisShape } | { style: 'split'; orientation?: MotionSplitOrientation };\n\n/**\n * The reveal clip a `wipe`, `iris` or `split` animates, from and to (Flair's `entrance.wipe`,\n * `entrance.iris`, `entrance.split` and `exit.wipe`), or null when the node's box has no width\n * or height. An exit wipe is the enter wipe the other way, reversed in time.\n */\nexport function motionRevealClip(entry: MotionNodeEntry, reveal: MotionReveal): { property: 'clipRect' | 'clipCircle'; from: number[]; to: number[] } | null {\n\tconst pad = motionRevealPadding(entry);\n\tif (!pad) return null;\n\tconst [px, py] = pad;\n\tconst [w, h] = [1 + 2 * px, 1 + 2 * py];\n\tconst rect = (from: number[], to: number[]) => ({ property: 'clipRect' as const, from: from.map(clipRound), to: to.map(clipRound) });\n\tif (reveal.style === 'iris') {\n\t\tif (reveal.shape === 'box') return rect([0.5, 0.5, 0, 0], [-px, -py, w, h]);\n\t\treturn { property: 'clipCircle', from: [0.5, 0.5, 0], to: revealFull('clipCircle', pad) };\n\t}\n\tif (reveal.style === 'split') {\n\t\tif (reveal.orientation === 'vertical') return rect([0.5, -py, 0, h], [-px, -py, w, h]);\n\t\treturn rect([-px, 0.5, w, 0], [-px, -py, w, h]);\n\t}\n\tconst direction = reveal.direction ?? 'right';\n\tif (reveal.hide) {\n\t\tconst shown = motionRevealClip(entry, { style: 'wipe', direction: OPPOSITE[direction] })!;\n\t\treturn { ...shown, from: shown.to, to: shown.from };\n\t}\n\tswitch (direction) {\n\t\tcase 'right':\n\t\t\treturn rect([-px, -py, 0, h], [-px, -py, w, h]);\n\t\tcase 'left':\n\t\t\treturn rect([1 + px, -py, 0, h], [-px, -py, w, h]);\n\t\tcase 'down':\n\t\t\treturn rect([-px, -py, w, 0], [-px, -py, w, h]);\n\t\tcase 'up':\n\t\t\treturn rect([-px, 1 + py, w, 0], [-px, -py, w, h]);\n\t}\n}\n\n/** A property's value with no animation. */\nexport function motionRestValue(entry: MotionNodeEntry | undefined, property: MotionProperty, artwork: { width: number; height: number }): MotionValue {\n\tconst node = entry?.node;\n\tswitch (property) {\n\t\tcase 'opacity':\n\t\t\treturn node?.opacity ?? 1;\n\t\tcase 'x':\n\t\tcase 'y':\n\t\tcase 'rotation':\n\t\t\treturn 0;\n\t\tcase 'scaleX':\n\t\tcase 'scaleY':\n\t\tcase 'fillOpacity':\n\t\tcase 'drawEnd':\n\t\t\treturn 1;\n\t\tcase 'drawStart':\n\t\t\treturn 0;\n\t\tcase 'follow':\n\t\t\treturn -1;\n\t\tcase 'fill':\n\t\tcase 'stroke':\n\t\t\treturn (node && firstPaint(node, property)) ?? 'transparent';\n\t\tcase 'strokeWidth': {\n\t\t\tconst path = node?.type === 'path' ? node : node ? collectPathNodes(node)[0] : undefined;\n\t\t\treturn path?.strokeWidth ?? 1;\n\t\t}\n\t\tcase 'shape':\n\t\t\treturn node?.id ?? '';\n\t\tcase 'clipRect':\n\t\tcase 'clipCircle': {\n\t\t\tconst pad = entry && motionRevealPadding(entry);\n\t\t\treturn pad ? revealFull(property, pad) : [];\n\t\t}\n\t\tcase 'camera':\n\t\t\treturn [0, 0, artwork.width, artwork.height];\n\t}\n\tconst [, effectId, param] = property.split(':');\n\tconst effect = node?.effects?.find((e) => e.id === effectId);\n\tconst v = effect ? (effect.params as unknown as Record<string, unknown>)[param] : undefined;\n\treturn typeof v === 'number' ? v : 0;\n}\n\n/** `from` → `to` at eased progress `u` (numbers extrapolate, colours mix in OKLab, others switch at the end). */\nexport function interpolateMotionValue(from: MotionValue, to: MotionValue, u: number): MotionValue {\n\tif (typeof from === 'number' && typeof to === 'number') return from + (to - from) * u;\n\tif (Array.isArray(from) && Array.isArray(to) && from.length === to.length) return from.map((f, i) => f + ((to[i] as number) - f) * u);\n\tif (u <= 0) return from;\n\tif (u >= 1) return to;\n\tif (typeof from === 'string' && typeof to === 'string') {\n\t\tconst mixed = mixColorsOklab(from, to, u);\n\t\tif (mixed !== null) return mixed;\n\t}\n\treturn u < 1 ? from : to;\n}\n\n/** Progress (0–1, unclamped by the easing) of a segment at `time`: stepped, reversed and eased as the segment says. */\nexport function segmentProgress(segment: MotionSegment, time: number): { u: number; eased: number } {\n\tconst span = segment.end - segment.start;\n\tlet elapsed = time - segment.start;\n\tif (segment.steps && segment.steps > 0 && elapsed < span) elapsed = (Math.floor((elapsed * segment.steps) / 1000 + 1e-9) / segment.steps) * 1000;\n\tconst u = span <= 0 ? 1 : Math.min(1, Math.max(0, elapsed / span));\n\t// A reversed segment plays its forward run backwards: at u it shows what it showed at 1 − u.\n\treturn { u, eased: evaluateEasing(segment.ease, segment.reverse ? 1 - u : u, span) };\n}\n\n/** `from` → `to` by a steady factor: numbers above 0 grow geometrically; a camera box zooms at a steady rate, its centre keeping pace. */\nfunction geometricValue(from: MotionValue, to: MotionValue, e: number): MotionValue | undefined {\n\tconst grow = (a: number, b: number) => (a > 0 && b > 0 ? a * (b / a) ** e : undefined);\n\tif (typeof from === 'number' && typeof to === 'number') return grow(from, to);\n\tif (Array.isArray(from) && Array.isArray(to) && from.length === 4 && to.length === 4) {\n\t\tconst [x0, y0, w0, h0] = from as number[];\n\t\tconst [x1, y1, w1, h1] = to as number[];\n\t\tconst w = grow(w0, w1);\n\t\tconst h = grow(h0, h1);\n\t\tif (w === undefined || h === undefined) return undefined;\n\t\t// The centre moves the same share of the way as the size has changed.\n\t\tconst f = Math.abs(w1 - w0) > 1e-9 ? (w - w0) / (w1 - w0) : e;\n\t\tconst cx = x0 + w0 / 2 + (x1 + w1 / 2 - x0 - w0 / 2) * f;\n\t\tconst cy = y0 + h0 / 2 + (y1 + h1 / 2 - y0 - h0 / 2) * f;\n\t\treturn [cx - w / 2, cy - h / 2, w, h];\n\t}\n\treturn undefined;\n}\n\n/**\n * A segment's value at `time`: along its ease, through its behaviour when it has one. `raw`\n * ignores the behaviour (the value it swings towards), as Flair is given it.\n */\nexport function segmentValue(segment: MotionSegment, time: number, raw = false): MotionValue {\n\tconst { eased } = segmentProgress(segment, time);\n\tif (segment.geometric && !segment.behavior) {\n\t\tconst g = geometricValue(segment.from, segment.to, eased);\n\t\tif (g !== undefined) return g;\n\t}\n\tif (!segment.behavior || raw) return interpolateMotionValue(segment.from, segment.to, eased);\n\tconst p = behaviorProgress(segment.behavior, eased, segment.index ?? 0, segment.end - segment.start);\n\t// Colours (a colour pulse) mix only between their ends; numbers swing past them.\n\treturn typeof segment.from === 'string' ? interpolateMotionValue(segment.from, segment.to, Math.min(1, Math.max(0, p))) : interpolateMotionValue(segment.from, segment.to, p);\n}\n\n/** The segment in effect at `time` (the latest to have started), if any. */\nexport function activeSegment(track: readonly MotionSegment[] | undefined, time: number): MotionSegment | undefined {\n\tif (!track?.length) return undefined;\n\tlet found: MotionSegment | undefined;\n\tfor (const s of track) if (s.start <= time && (!found || s.start >= found.start)) found = s;\n\treturn found;\n}\n\n/** A track's value at `time`, or `undefined` when nothing animates it. `raw` ignores behaviours (see `segmentValue`). */\nexport function trackValue(track: readonly MotionSegment[] | undefined, time: number, raw = false): MotionValue | undefined {\n\tif (!track?.length) return undefined;\n\tconst s = activeSegment(track, time);\n\tif (s) return segmentValue(s, time, raw);\n\tlet first = track[0];\n\tfor (const t of track) if (t.start < first.start) first = t;\n\treturn first.from;\n}\n\nexport const motionTrackKey = (node: string, property: MotionProperty) => `${node}\\u0000${property}`;\n\n/** The track of a node property's additive layers (segments with `blend: 'add'`). */\nexport const motionAddTrackKey = (node: string, property: MotionProperty) => `${node}\\u0000${property}\\u0000add`;\n\n/** Properties that take additive layers: offsets and turns add, scales multiply. */\nexport const MOTION_ADDITIVE_PROPERTIES: readonly MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY'];\n\n/**\n * A property's value with its additive layers on top of `base` (its pose): every layer that has\n * started adds its value (offsets, turns) or multiplies by it (scales). `raw` ignores behaviours.\n */\nexport function withMotionLayers(timeline: Pick<MotionTimeline, 'tracks'>, node: string, property: MotionProperty, base: number, time: number, raw = false): number {\n\tconst layers = timeline.tracks.get(motionAddTrackKey(node, property));\n\tif (!layers) return base;\n\tconst scale = property === 'scaleX' || property === 'scaleY';\n\tlet v = base;\n\tfor (const layer of layers) {\n\t\tif (layer.start > time) continue;\n\t\tconst x = Number(segmentValue(layer, time, raw));\n\t\tif (Number.isFinite(x)) v = scale ? v * x : v + x;\n\t}\n\treturn v;\n}\n\n/** Grows a rectangle to the artwork's aspect ratio (about its centre). */\nexport function fitMotionRect(rect: MotionRect, aspect: number): MotionRect {\n\tconst cx = rect.x + rect.width / 2;\n\tconst cy = rect.y + rect.height / 2;\n\tlet { width, height } = rect;\n\tif (width / height < aspect) width = height * aspect;\n\telse height = width / aspect;\n\treturn { x: cx - width / 2, y: cy - height / 2, width, height };\n}\n\n/** The rectangle a camera looks at, or `null` when it frames an unknown node. */\nexport function resolveMotionCamera(camera: MotionCamera, scene: MotionScene): MotionRect | null {\n\tif ('frame' in camera && typeof camera.frame === 'string') {\n\t\tconst entry = indexMotionNodes(scene.artwork.nodes).get(camera.frame);\n\t\tif (!entry?.bounds) return null;\n\t\tconst pad = camera.padding ?? 24;\n\t\tconst b = entry.bounds;\n\t\tconst rect = { x: b.x - pad, y: b.y - pad, width: Math.max(1, b.width + pad * 2), height: Math.max(1, b.height + pad * 2) };\n\t\treturn fitMotionRect(rect, scene.artwork.width / scene.artwork.height);\n\t}\n\tconst r = camera as MotionRect;\n\treturn { x: r.x, y: r.y, width: r.width, height: r.height };\n}\n\n/** Length of a node's outline (its longest path for a group), in document units. */\nexport function motionPathLength(node: VectorNode, parentWorld: AffineMatrix = IDENTITY_MATRIX): number {\n\tlet longest = 0;\n\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\tfor (const p of paths) {\n\t\ttry {\n\t\t\tlongest = Math.max(longest, bezierPathLength(vectorPathWorldBezier(p, parentWorld, { effects: false })));\n\t\t} catch {\n\t\t\t/* unmeasurable: keep the default */\n\t\t}\n\t}\n\treturn longest;\n}\n\n/** How much a shot's `speed` stretches its time (1 / speed; 1 when unset or not above 0). */\nexport function motionShotTimeScale(shot: MotionShot): number {\n\treturn typeof shot.speed === 'number' && shot.speed > 0 && Number.isFinite(shot.speed) ? 1 / shot.speed : 1;\n}\n\n// Beat grid adapted from soundcraft-main/crates/time/src/{tempo,grid}.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors).\n/** When beat `beat` falls on a grid, ms: `offset + beat · 60000 / bpm`. */\nexport function motionBeatTime(grid: MotionBeatGrid, beat: number): number {\n\treturn (grid.offset ?? 0) + (beat * 60000) / grid.bpm;\n}\n\n/** The beat (fractional) at `ms` on a grid, and its bar and beat in the bar (both from 1). */\nexport function motionBeatAt(grid: MotionBeatGrid, ms: number): { beat: number; bar: number; beatInBar: number } {\n\tconst beat = ((ms - (grid.offset ?? 0)) * grid.bpm) / 60000;\n\tconst meter = Math.max(1, Math.round(grid.meter ?? 4));\n\tconst whole = Math.floor(beat + 1e-9);\n\treturn { beat, bar: Math.floor(whole / meter) + 1, beatInBar: (((whole % meter) + meter) % meter) + 1 };\n}\n\n/** The time a cue names, ms, or undefined when it names a beat with no grid or a word the narration lacks. */\nexport function motionCueTime(scene: Pick<MotionScene, 'beat' | 'narration'>, cue: MotionCue): number | undefined {\n\tif (typeof cue.ms === 'number') return Math.max(0, cue.ms);\n\tif (typeof cue.beat === 'number') return scene.beat && scene.beat.bpm > 0 ? Math.max(0, motionBeatTime(scene.beat, cue.beat)) : undefined;\n\tif (typeof cue.word === 'number') return scene.narration?.words[cue.word]?.start;\n\treturn undefined;\n}\n\n/** How many times a command plays (1 for `enter`, `exit` and `wait`, which do not repeat). */\nexport function motionCommandRepeat(command: MotionCommand): number {\n\tif (command.type === 'wait' || command.type === 'enter' || command.type === 'exit') return 1;\n\tconst n = command.repeat ?? 1;\n\treturn Number.isInteger(n) && n >= 1 ? n : 1;\n}\n\n/** How long one target of a command takes (ms), every repeat included. */\nexport function motionCommandDuration(command: MotionCommand, scene: MotionScene, target?: string): number {\n\treturn motionCycleDuration(command, scene, target) * motionCommandRepeat(command);\n}\n\n/** How long one cycle of a command takes for one target (ms): its `duration`, a spring's settle time, the line's length for a draw, or the type's default. */\nexport function motionCycleDuration(command: MotionCommand, scene: MotionScene, target?: string): number {\n\tif (command.type === 'wait') return command.duration;\n\tif (command.duration !== undefined) return command.duration;\n\tif (command.ease !== undefined) {\n\t\tconst ease = resolveEasing(command.ease);\n\t\tif (ease !== 'hold' && ease.type === 'spring') return springSettleMs(ease);\n\t}\n\tif (command.type === 'draw' || (command.type === 'enter' && command.style === 'draw') || (command.type === 'exit' && command.style === 'undraw')) {\n\t\tconst entry = target ? indexMotionNodes(scene.artwork.nodes).get(target) : undefined;\n\t\tconst length = entry ? motionPathLength(entry.node) : 0;\n\t\tconst ms = length * MOTION_DRAW_MS_PER_UNIT;\n\t\treturn Math.round(Math.min(MOTION_DRAW_RANGE[1], Math.max(MOTION_DRAW_RANGE[0], ms)));\n\t}\n\treturn MOTION_DEFAULT_DURATIONS[command.type];\n}\n\n/** Cubic ease-out, `1 − (1 − t)³` exactly (Flair's `out`): the default for things arriving. */\nexport const MOTION_EASE_OUT: AnimationEasing = { type: 'cubic-bezier', x1: 1 / 3, y1: 1, x2: 2 / 3, y2: 1 };\n/** Cubic ease-in-out (close to Flair's `in-out`): the default for moves. */\nexport const MOTION_EASE_IN_OUT: AnimationEasing = { type: 'cubic-bezier', x1: 0.65, y1: 0, x2: 0.35, y2: 1 };\n\nconst DIRECTION: Record<MotionDirection, { x: number; y: number }> = { up: { x: 0, y: -1 }, down: { x: 0, y: 1 }, left: { x: -1, y: 0 }, right: { x: 1, y: 0 } };\n\nconst timelineCache = new WeakMap<MotionScene, MotionTimeline>();\n\n/**\n * Times every shot and command and turns them into segments. Pure and cached per scene object\n * (treat scenes as immutable). Commands naming unknown nodes are timed but change nothing;\n * `checkMotionScene` reports them.\n */\nexport function compileMotionScene(scene: MotionScene): MotionTimeline {\n\tconst hit = timelineCache.get(scene);\n\tif (hit) return hit;\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst artwork = scene.artwork;\n\n\t// Pass 1: timing.\n\tconst shots: MotionShotTiming[] = [];\n\tconst commands: MotionCommandTiming[] = [];\n\tconst cameraMoves: { shot: string; start: number; end: number; to: MotionRect; ease: AnimationEasing; geometric: boolean }[] = [];\n\tlet t = 0;\n\tscene.shots.forEach((shot, index) => {\n\t\t// A cue holds the shot before until it comes (or, for the first shot, waits from 0).\n\t\tconst cue = shot.at ? motionCueTime(scene, shot.at) : undefined;\n\t\tif (cue !== undefined && cue > t) {\n\t\t\tif (shots.length) shots[shots.length - 1].end = cue;\n\t\t\tt = cue;\n\t\t}\n\t\tconst missedBy = cue !== undefined && t - cue > 0.5 ? t - cue : undefined;\n\t\tconst start = t;\n\t\tlet cursor = start;\n\t\t// A shot's speed scales all of its time: camera move, delays, durations, staggers and hold.\n\t\tconst f = motionShotTimeScale(shot);\n\t\tif (shot.camera) {\n\t\t\tconst rect = resolveMotionCamera(shot.camera, scene);\n\t\t\tif (rect && rect.width > 0 && rect.height > 0) {\n\t\t\t\tconst ms = index === 0 ? 0 : (shot.camera.ms ?? MOTION_CAMERA_MS) * f;\n\t\t\t\tcameraMoves.push({ shot: shot.id, start, end: start + ms, to: rect, ease: shot.camera.ease ?? MOTION_EASE_IN_OUT, geometric: shot.camera.geometric === true });\n\t\t\t\tcursor = start + ms;\n\t\t\t}\n\t\t}\n\t\tconst commandsStart = cursor;\n\t\tlet runEnd = cursor;\n\t\tlet prevStart = cursor;\n\t\tshot.run.forEach((command, i) => {\n\t\t\tconst base = command.with === 'previous' && i > 0 ? prevStart : runEnd;\n\t\t\tconst begin = base + (command.type === 'wait' ? 0 : (command.delay ?? 0) * f);\n\t\t\tconst targets = command.type === 'wait' ? [] : command.targets;\n\t\t\tconst durations = command.type === 'wait' ? [command.duration * f] : targets.map((id) => motionCommandDuration(command, scene, id) * f);\n\t\t\tconst stagger = command.type === 'wait' ? 0 : (command.stagger ?? 0) * f;\n\t\t\tconst end = durations.reduce((m, d, k) => Math.max(m, begin + k * stagger + d), begin);\n\t\t\tcommands.push({ shot: shot.id, shotIndex: index, command: i, type: command.type, start: begin, end, duration: durations[0] ?? 0 });\n\t\t\tprevStart = begin;\n\t\t\trunEnd = Math.max(runEnd, end);\n\t\t});\n\t\tconst end = runEnd + (shot.hold ?? MOTION_DEFAULT_HOLD) * f;\n\t\tshots.push({ id: shot.id, index, ...(shot.label ? { label: shot.label } : {}), start, commandsStart, commandsEnd: runEnd, end, ...(cue !== undefined ? { cue } : {}), ...(missedBy !== undefined ? { missedBy } : {}) });\n\t\tt = end;\n\t});\n\n\t// Pass 2: segments, in start order so each `from` is the value its segment starts at.\n\tconst tracks = new Map<string, MotionSegment[]>();\n\tconst segments: MotionSegment[] = [];\n\tconst valueAt = (node: string, property: MotionProperty, time: number): MotionValue => {\n\t\tconst v = trackValue(tracks.get(motionTrackKey(node, property)), time);\n\t\treturn v ?? motionRestValue(nodes.get(node), property, artwork);\n\t};\n\tconst push = (segment: MotionSegment) => {\n\t\tconst key = segment.blend === 'add' ? motionAddTrackKey(segment.node, segment.property) : motionTrackKey(segment.node, segment.property);\n\t\tlet track = tracks.get(key);\n\t\tif (!track) tracks.set(key, (track = []));\n\t\ttrack.push(segment);\n\t\tsegments.push(segment);\n\t};\n\n\ttype Job = { start: number; order: number; run: () => void };\n\tconst jobs: Job[] = [];\n\tlet order = 0;\n\tfor (const move of cameraMoves) {\n\t\tjobs.push({\n\t\t\tstart: move.start,\n\t\t\torder: order++,\n\t\t\trun: () => push({ node: '', property: 'camera', start: move.start, end: move.end, from: valueAt('', 'camera', move.start), to: [move.to.x, move.to.y, move.to.width, move.to.height], ease: move.ease, shot: move.shot, command: -1, ...(move.geometric ? { geometric: true } : {}) })\n\t\t});\n\t}\n\tfor (const timing of commands) {\n\t\tconst shot = scene.shots[timing.shotIndex];\n\t\tconst command = shot.run[timing.command];\n\t\tif (command.type === 'wait') continue;\n\t\tcommand.targets.forEach((target, k) => {\n\t\t\tconst entry = nodes.get(target);\n\t\t\tif (!entry) return;\n\t\t\tconst f = motionShotTimeScale(shot);\n\t\t\tconst start = timing.start + k * (command.stagger ?? 0) * f;\n\t\t\tconst cycle = motionCycleDuration(command, scene, target) * f;\n\t\t\tjobs.push({ start, order: order++, run: () => compileRepeated(command, target, entry, start, cycle, timing) });\n\t\t});\n\t}\n\tjobs.sort((a, b) => a.start - b.start || a.order - b.order).forEach((job) => job.run());\n\n\t/**\n\t * Compiles one cycle, then lays further cycles after it: `loop` restarts each from the first\n\t * cycle's start, `mirror` plays every other one backwards, `offset` carries numbers on from\n\t * where the last ended. Stepped time goes on every segment the command makes.\n\t */\n\tfunction compileRepeated(command: Exclude<MotionCommand, { type: 'wait' }>, node: string, entry: MotionNodeEntry, start: number, cycle: number, timing: MotionCommandTiming) {\n\t\tconst first = segments.length;\n\t\tcompileCommand(command, node, entry, start, cycle, timing);\n\t\tconst made = segments.slice(first);\n\t\tconst steps = command.steps ?? scene.steps;\n\t\tif (steps && steps > 0) for (const s of made) s.steps = steps;\n\t\tconst n = motionCommandRepeat(command);\n\t\tconst mode = command.repeatMode ?? 'loop';\n\t\tconst shift = (v: MotionValue, by: MotionValue, k: number): MotionValue => {\n\t\t\tif (typeof v === 'number' && typeof by === 'number') return v + by * k;\n\t\t\tif (Array.isArray(v) && Array.isArray(by) && v.length === by.length) return v.map((x, i) => x + (by[i] as number) * k);\n\t\t\treturn v;\n\t\t};\n\t\tfor (let k = 1; k < n; k++) {\n\t\t\tconst at = start + k * cycle;\n\t\t\tfor (const s of made) {\n\t\t\t\tif (mode === 'mirror' && k % 2 === 1) {\n\t\t\t\t\tpush({ ...s, start: at + (start + cycle - s.end), end: at + (start + cycle - s.start), reverse: !s.reverse });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst delta: MotionValue = typeof s.from === 'number' && typeof s.to === 'number' ? s.to - s.from : Array.isArray(s.from) && Array.isArray(s.to) && s.from.length === s.to.length ? s.to.map((x, i) => (x as number) - (s.from as number[])[i]) : 0;\n\t\t\t\tconst by = mode === 'offset' ? delta : 0;\n\t\t\t\tpush({ ...s, start: at + (s.start - start), end: at + (s.end - start), from: shift(s.from, by, k), to: shift(s.to, by, k) });\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction compileCommand(command: Exclude<MotionCommand, { type: 'wait' }>, node: string, entry: MotionNodeEntry, start: number, duration: number, timing: MotionCommandTiming) {\n\t\tconst end = start + duration;\n\t\tconst where = { shot: timing.shot, command: timing.command };\n\t\tconst seg = (property: MotionProperty, to: MotionValue, ease: AnimationEasing, s = start, e = end, extra: Partial<MotionSegment> = {}) =>\n\t\t\tpush({ node, property, start: s, end: e, from: extra.from ?? valueAt(node, property, s), to, ease, ...where, ...extra });\n\t\tconst rest = (p: MotionProperty) => motionRestValue(entry, p, artwork);\n\t\tconst num = (p: MotionProperty, time = start) => {\n\t\t\tconst v = valueAt(node, p, time);\n\t\t\treturn typeof v === 'number' ? v : 0;\n\t\t};\n\t\tconst ease = command.ease;\n\t\tswitch (command.type) {\n\t\t\tcase 'enter': {\n\t\t\t\tconst style = command.style ?? 'fade';\n\t\t\t\tconst opacity = rest('opacity');\n\t\t\t\tconst reveal =\n\t\t\t\t\tstyle === 'wipe' ? motionRevealClip(entry, { style, direction: command.direction }) : style === 'iris' ? motionRevealClip(entry, { style, shape: command.shape }) : style === 'split' ? motionRevealClip(entry, { style, orientation: command.orientation }) : null;\n\t\t\t\t// An earlier reveal or wipe out leaves its clip; entering opens it again, at once.\n\t\t\t\tfor (const p of ['clipRect', 'clipCircle'] as const) if (p !== reveal?.property && tracks.has(motionTrackKey(node, p))) seg(p, rest(p), 'linear', start, start);\n\t\t\t\tif (reveal) {\n\t\t\t\t\t// The clip reveals. Opacity is set at once too, so a node faded out before shows again,\n\t\t\t\t\t// and a later fade in (whose start would hold back to time 0) leaves this one alone.\n\t\t\t\t\tseg('opacity', opacity, 'linear', start, start);\n\t\t\t\t\tseg(reveal.property, reveal.to, ease ?? MOTION_EASE_OUT, start, end, { from: reveal.from });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (style === 'draw') {\n\t\t\t\t\tseg('drawEnd', 1, ease ?? MOTION_EASE_IN_OUT, start, start + duration * 0.75, { from: 0 });\n\t\t\t\t\tseg('fillOpacity', 1, MOTION_EASE_OUT, start + duration * 0.6, end, { from: 0 });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (style === 'pop' || style === 'zoom') {\n\t\t\t\t\tconst from = command.scale ?? (style === 'pop' ? 0.5 : 1.6);\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * (style === 'pop' ? 0.4 : 0.5), { from: 0 });\n\t\t\t\t\tseg('scaleX', 1, ease ?? (style === 'pop' ? 'ease-out-back' : MOTION_EASE_OUT), start, end, { from });\n\t\t\t\t\tseg('scaleY', 1, ease ?? (style === 'pop' ? 'ease-out-back' : MOTION_EASE_OUT), start, end, { from });\n\t\t\t\t} else if (style === 'rise') {\n\t\t\t\t\tconst y = num('y');\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * 0.5, { from: 0 });\n\t\t\t\t\tseg('y', y, ease ?? 'ease-out-back', start, end, { from: y + (command.distance ?? 20) });\n\t\t\t\t} else if (style === 'grow') {\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, start + duration * 0.3, { from: 0 });\n\t\t\t\t\tseg('scaleX', 1, ease ?? MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t\tseg('scaleY', 1, ease ?? MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t} else if (style === 'slide') {\n\t\t\t\t\tconst dir = DIRECTION[command.direction ?? 'up'];\n\t\t\t\t\tconst distance = command.distance ?? 40;\n\t\t\t\t\tconst x = num('x');\n\t\t\t\t\tconst y = num('y');\n\t\t\t\t\tseg('opacity', opacity, MOTION_EASE_OUT, start, end, { from: 0 });\n\t\t\t\t\tseg('x', x, ease ?? MOTION_EASE_OUT, start, end, { from: x - dir.x * distance });\n\t\t\t\t\tseg('y', y, ease ?? MOTION_EASE_OUT, start, end, { from: y - dir.y * distance });\n\t\t\t\t} else seg('opacity', opacity, ease ?? MOTION_EASE_OUT, start, end, { from: 0 }); // fade, and a reveal of a node with no box\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'exit': {\n\t\t\t\tconst style = command.style ?? 'fade';\n\t\t\t\tconst wipe = style === 'wipe' ? motionRevealClip(entry, { style, direction: command.direction, hide: true }) : null;\n\t\t\t\tif (wipe) seg(wipe.property, wipe.to, ease ?? 'ease-in', start, end, { from: wipe.from });\n\t\t\t\telse if (style === 'undraw') {\n\t\t\t\t\tseg('fillOpacity', 0, 'ease-in', start, start + duration * 0.4);\n\t\t\t\t\tseg('drawEnd', 0, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\t} else if (style === 'shrink') {\n\t\t\t\t\tseg('scaleX', 0, ease ?? 'ease-in');\n\t\t\t\t\tseg('scaleY', 0, ease ?? 'ease-in');\n\t\t\t\t\tseg('opacity', 0, 'ease-in', start + duration * 0.6, end);\n\t\t\t\t} else if (style === 'slide') {\n\t\t\t\t\tconst dir = DIRECTION[command.direction ?? 'down'];\n\t\t\t\t\tconst distance = command.distance ?? 40;\n\t\t\t\t\tseg('x', num('x') + dir.x * distance, ease ?? 'ease-in');\n\t\t\t\t\tseg('y', num('y') + dir.y * distance, ease ?? 'ease-in');\n\t\t\t\t\tseg('opacity', 0, ease ?? 'ease-in');\n\t\t\t\t} else seg('opacity', 0, ease ?? 'ease-in'); // fade, and a wipe of a node with no box\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'draw': {\n\t\t\t\t// A stroke not drawn before draws on from nothing (and is hidden until then).\n\t\t\t\tconst drawn = tracks.has(motionTrackKey(node, 'drawEnd'));\n\t\t\t\tseg('drawEnd', command.to ?? 1, ease ?? MOTION_EASE_IN_OUT, start, end, command.from !== undefined ? { from: command.from } : drawn ? {} : { from: 0 });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'move': {\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tlet dx = command.by?.x ?? 0;\n\t\t\t\tlet dy = command.by?.y ?? 0;\n\t\t\t\tif (command.to) {\n\t\t\t\t\t// The centre lands on `to` (document space): convert the remaining offset to the parent's space.\n\t\t\t\t\tconst inv = invertMatrix(entry.parentWorld);\n\t\t\t\t\tconst target = applyMatrix(inv, command.to);\n\t\t\t\t\tdx = target.x - (entry.center.x + num('x'));\n\t\t\t\t\tdy = target.y - (entry.center.y + num('y'));\n\t\t\t\t}\n\t\t\t\tif (command.blend === 'add') {\n\t\t\t\t\tseg('x', dx, e, start, end, { from: 0, blend: 'add' });\n\t\t\t\t\tseg('y', dy, e, start, end, { from: 0, blend: 'add' });\n\t\t\t\t} else {\n\t\t\t\t\tseg('x', num('x') + dx, e);\n\t\t\t\t\tseg('y', num('y') + dy, e);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'rotate': {\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tif (command.blend === 'add') seg('rotation', command.to !== undefined ? command.to - num('rotation') : (command.by ?? 0), e, start, end, { from: 0, blend: 'add' });\n\t\t\t\telse seg('rotation', command.to ?? num('rotation') + (command.by ?? 0), e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'scale': {\n\t\t\t\tconst to = typeof command.to === 'number' ? { x: command.to, y: command.to } : command.to;\n\t\t\t\tconst extra = { ...(command.geometric ? { geometric: true } : {}), ...(command.blend === 'add' ? { from: 1, blend: 'add' as const } : {}) };\n\t\t\t\tseg('scaleX', to.x, ease ?? MOTION_EASE_IN_OUT, start, end, extra);\n\t\t\t\tseg('scaleY', to.y, ease ?? MOTION_EASE_IN_OUT, start, end, extra);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'fade':\n\t\t\t\tseg('opacity', command.to, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'style':\n\t\t\t\tif (command.fill !== undefined) seg('fill', command.fill, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tif (command.stroke !== undefined) seg('stroke', command.stroke, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tif (command.strokeWidth !== undefined) seg('strokeWidth', command.strokeWidth, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'morph':\n\t\t\t\tseg('shape', command.into, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t\tcase 'match': {\n\t\t\t\t// Smart Animate: each part morphs into its partner in `into`; parts with no partner fade out.\n\t\t\t\tconst into = nodes.get(command.into);\n\t\t\t\tif (!into || command.into === node) break;\n\t\t\t\tconst match = matchMotionNodes(entry.node, into.node);\n\t\t\t\tconst e = ease ?? MOTION_EASE_IN_OUT;\n\t\t\t\tfor (const [a, b] of match.pairs) push({ node: a, property: 'shape', start, end, from: valueAt(a, 'shape', start), to: b, ease: e, ...where });\n\t\t\t\tfor (const a of match.unpairedFrom) push({ node: a, property: 'opacity', start, end, from: valueAt(a, 'opacity', start), to: 0, ease: e, ...where });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'follow':\n\t\t\t\tseg('follow', command.to ?? 1, ease ?? MOTION_EASE_IN_OUT, start, end, { from: command.from ?? 0, path: command.path, rotate: command.rotate ?? false });\n\t\t\t\tbreak;\n\t\t\t// Emphasis: a change toward a peak that a behaviour swings round (as Flair's primitives do).\n\t\t\tcase 'pulse':\n\t\t\tcase 'shake':\n\t\t\tcase 'teeter':\n\t\t\tcase 'wave':\n\t\t\tcase 'wiggle': {\n\t\t\t\t// Emphasis is a layer over the pose by default (blend \"add\"), so it rides on a move or turn under way.\n\t\t\t\tconst add = (command.blend ?? 'add') === 'add';\n\t\t\t\t// A change of `by` (offsets, turns) or by a factor (scales), as a layer or on the pose.\n\t\t\t\tconst swing = (p: MotionProperty, by: number, extra: Partial<MotionSegment>) => {\n\t\t\t\t\tconst scale = p === 'scaleX' || p === 'scaleY';\n\t\t\t\t\tif (add) seg(p, by, ease ?? 'linear', start, end, { from: scale ? 1 : 0, blend: 'add', ...extra });\n\t\t\t\t\telse seg(p, scale ? num(p) * by : num(p) + by, ease ?? 'linear', start, end, extra);\n\t\t\t\t};\n\t\t\t\tif (command.type === 'pulse') {\n\t\t\t\t\tconst behavior: MotionBehavior = { type: 'pulse', count: command.count ?? 1 };\n\t\t\t\t\tswing('scaleX', 1 + (command.amount ?? 0.15), { behavior });\n\t\t\t\t\tswing('scaleY', 1 + (command.amount ?? 0.15), { behavior });\n\t\t\t\t} else if (command.type === 'shake') swing(command.axis === 'vertical' ? 'y' : 'x', command.amount ?? 8, { behavior: { type: 'oscillate', count: command.count ?? 3, decay: 1 } });\n\t\t\t\telse if (command.type === 'teeter') swing('rotation', command.angle ?? 8, { behavior: { type: 'oscillate', count: command.count ?? 3, decay: 1 } });\n\t\t\t\telse if (command.type === 'wave') swing('y', -(command.amount ?? 6), { behavior: { type: 'oscillate', count: command.count ?? 2 } });\n\t\t\t\telse {\n\t\t\t\t\tconst behavior: MotionBehavior = { type: 'wriggle', frequency: command.frequency ?? 3, octaves: command.octaves ?? 2, seed: command.seed || motionSeedFromId(node) };\n\t\t\t\t\tconst amount = command.amount ?? 6;\n\t\t\t\t\tswing('x', amount, { behavior, index: 0 });\n\t\t\t\t\tswing('y', amount, { behavior, index: 1 });\n\t\t\t\t\tif (command.rotate) swing('rotation', command.rotate, { behavior, index: 2 });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'color-pulse':\n\t\t\t\tseg(command.paint ?? 'fill', command.color ?? '#f59e0b', ease ?? 'linear', start, end, { behavior: { type: 'pulse', count: command.count ?? 1 } });\n\t\t\t\tbreak;\n\t\t\tcase 'effect':\n\t\t\t\tseg(`effect:${command.effect}:${command.param}`, command.to, ease ?? MOTION_EASE_IN_OUT);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (const track of tracks.values()) track.sort((a, b) => a.start - b.start);\n\tsegments.sort((a, b) => a.start - b.start);\n\tconst duration = shots.length ? shots[shots.length - 1].end : 0;\n\tconst timeline: MotionTimeline = { duration, shots, commands, segments, tracks };\n\ttimelineCache.set(scene, timeline);\n\treturn timeline;\n}\n\n/** The shot playing at `time` (the last one at the end). */\nexport function motionShotAt(timeline: MotionTimeline, time: number): MotionShotTiming | undefined {\n\treturn timeline.shots.find((s) => time < s.end) ?? timeline.shots[timeline.shots.length - 1];\n}\n","import { normalizeTokenColor, hexToRgba, rgbaToHex } from '../tokens/color.js';\nimport { createVectorMorph, type VectorMorph } from '../vector/blend.js';\nimport { bezierPathLength, bezierPathPointAtLength, transformBezierPath, type BezierPath } from '../canvas/pathops/bezier.js';\nimport { createVectorEffect } from '../vector/appearance.js';\nimport { invertMatrix, multiplyMatrices, nodeMatrix, rotateMatrix, scaleMatrix, translateMatrix, vectorPathWorldBezier, isIdentityMatrix, type AffineMatrix } from '../vector/geometry.js';\nimport { vectorDocumentToSvg, type VectorSvgExportOptions, type VectorSvgWrapper } from '../vector/svg.js';\nimport type { VectorDocument, VectorEffect, VectorGradient, VectorNode, VectorPaint, VectorPathNode } from '../vector/types.js';\nimport { activeSegment, compileMotionScene, indexMotionNodes, motionAddTrackKey, motionTrackKey, withMotionLayers, segmentProgress, trackValue, type MotionNodeEntry, type MotionProperty, type MotionTimeline } from './compile.js';\nimport type { MotionRect, MotionScene } from './types.js';\n\n/**\n * A reveal clip (`wipe`, `iris`, `split`) in the units of the node's own box: 0–1 across it,\n * as SVG's `clipPathUnits=\"objectBoundingBox\"` and Flair's clip reveals are.\n */\nexport type MotionClipShape = { shape: 'rect'; x: number; y: number; width: number; height: number } | { shape: 'circle'; cx: number; cy: number; r: number };\n\n/** The artwork as it stands at one time, and where the camera looks. */\nexport interface MotionFrame {\n\ttime: number;\n\tdocument: VectorDocument;\n\tcamera: MotionRect;\n\t/**\n\t * Reveal clips by node id, outermost first: draw each of those nodes inside a group clipped\n\t * to each shape (`motionFrameToSvg` does). The vector model has no clips, so they ride here.\n\t */\n\tclips: Record<string, MotionClipShape[]>;\n}\n\nexport interface MotionFrameOptions {\n\t/** Control values (`{ accent: \"#0ea5e9\" }`): each recolours its control's default colour. */\n\tvalues?: Record<string, string>;\n\t/** Draw-on as a Trim Paths effect (default true). Off leaves strokes whole. */\n\tdraw?: boolean;\n\t/** Apply moves, turns, scales and follows (default true). Off leaves nodes where they rest. */\n\toffsets?: boolean;\n}\n\n/** Id of the trim effect that draws strokes on. */\nexport const MOTION_DRAW_EFFECT_ID = '~draw';\n\nconst TRANSFORM_PROPS: MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY', 'follow'];\nconst tidy = (v: number) => Math.round(v * 1e6) / 1e6 || 0;\n\n/** A copy of the scene with each control's default colour replaced by its value (exact, case-insensitive matches). */\nexport function applyMotionControlValues(scene: MotionScene, values: Record<string, string> | undefined): MotionScene {\n\tif (!values || !scene.controls?.length) return scene;\n\tconst map = new Map<string, string>();\n\tfor (const control of scene.controls) {\n\t\tconst value = values[control.name];\n\t\tif (typeof value === 'string' && normalizeTokenColor(value) !== null) map.set(control.default.toLowerCase(), value);\n\t}\n\tif (!map.size) return scene;\n\tconst walk = (v: unknown): unknown => {\n\t\tif (typeof v === 'string') return map.get(v.toLowerCase()) ?? v;\n\t\tif (Array.isArray(v)) return v.map(walk);\n\t\tif (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, walk(x)]));\n\t\treturn v;\n\t};\n\treturn { ...scene, artwork: walk(scene.artwork) as VectorDocument, shots: walk(scene.shots) as MotionScene['shots'] };\n}\n\n/** `color` with its alpha multiplied by `alpha` (as `#rrggbbaa`), or `color` when unreadable. */\nfunction fadeColor(color: string, alpha: number): string {\n\tconst hex = normalizeTokenColor(color);\n\tif (hex === null) return color;\n\tconst c = hexToRgba(hex)!;\n\treturn rgbaToHex(c.r, c.g, c.b, c.a * alpha);\n}\n\nfunction fadePaint(paint: VectorPaint | undefined, alpha: number): VectorPaint | undefined {\n\tif (alpha >= 1 || paint == null || paint === 'none') return paint;\n\tif (typeof paint === 'string') return fadeColor(paint, alpha);\n\tif ('stops' in paint && Array.isArray(paint.stops)) return { ...(paint as VectorGradient), stops: paint.stops.map((s) => ({ ...s, opacity: (s.opacity ?? 1) * alpha })) } as VectorGradient;\n\treturn paint;\n}\n\n/** Applies `fn` to the node if it is a path, else to every path inside it. */\nfunction mapPaths(node: VectorNode, fn: (path: VectorPathNode) => VectorPathNode): VectorNode {\n\tif (node.type === 'path') return fn(node);\n\treturn { ...node, children: node.children.map((c) => mapPaths(c, fn)) };\n}\n\nconst morphCache = new WeakMap<VectorNode, WeakMap<VectorNode, VectorMorph>>();\nfunction morphBetween(a: VectorNode, b: VectorNode): VectorMorph {\n\tlet inner = morphCache.get(a);\n\tif (!inner) morphCache.set(a, (inner = new WeakMap()));\n\tlet morph = inner.get(b);\n\tif (!morph) inner.set(b, (morph = createVectorMorph(a, b, { id: a.id })));\n\treturn morph;\n}\n\n/** A shape node by id as it rests in its own parent, mapped into `entry`'s parent space. */\nfunction shapeIn(entry: MotionNodeEntry, shape: MotionNodeEntry): VectorNode {\n\tif (shape === entry) return entry.node;\n\tconst m = multiplyMatrices(multiplyMatrices(nodeMatrix(shape.node), shape.parentWorld), invertMatrix(entry.parentWorld));\n\treturn { ...shape.node, ...(isIdentityMatrix(m) ? { transform: undefined } : { transform: m as VectorNode['transform'] }) } as VectorNode;\n}\n\n/** The node's own shape at `time` (a morph in progress, or the shape it last became). */\nfunction shapeAt(entry: MotionNodeEntry, timeline: MotionTimeline, nodes: Map<string, MotionNodeEntry>, time: number): VectorNode | null {\n\tconst track = timeline.tracks.get(motionTrackKey(entry.node.id, 'shape'));\n\tif (!track?.length) return null;\n\tconst s = activeSegment(track, time);\n\tconst fromId = String(s ? s.from : track[0].from);\n\tif (!s) return fromId === entry.node.id ? null : (nodes.get(fromId) ? shapeIn(entry, nodes.get(fromId)!) : null);\n\tconst a = nodes.get(fromId);\n\tconst b = nodes.get(String(s.to));\n\tif (!a || !b) return null;\n\tconst { eased } = segmentProgress(s, time);\n\tconst u = Math.min(1, Math.max(0, eased));\n\tif (u <= 0) return a === entry ? null : shapeIn(entry, a);\n\tif (u >= 1) return b === entry ? null : shapeIn(entry, b);\n\treturn morphBetween(shapeIn(entry, a), shapeIn(entry, b)).at(u);\n}\n\n/**\n * The path a node follows, in the node's parent's space (live effects left off), or null when\n * `path` is not a path or cannot be measured. Lengths and turns along it are measured there.\n */\nexport function motionFollowRoute(entry: MotionNodeEntry, path: MotionNodeEntry | undefined): BezierPath | null {\n\tif (!path || path.node.type !== 'path') return null;\n\ttry {\n\t\treturn transformBezierPath(vectorPathWorldBezier(path.node, path.parentWorld, { effects: false }), invertMatrix(entry.parentWorld));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Where a follow puts the node's centre (parent space), and the path's angle there in degrees. */\nfunction followAt(entry: MotionNodeEntry, timeline: MotionTimeline, nodes: Map<string, MotionNodeEntry>, time: number): { x: number; y: number; angle: number } | null {\n\tconst track = timeline.tracks.get(motionTrackKey(entry.node.id, 'follow'));\n\tconst s = activeSegment(track, time) ?? track?.[0];\n\tif (!s?.path) return null;\n\tconst route = motionFollowRoute(entry, nodes.get(s.path));\n\tconst progress = Number(trackValue(track, time));\n\tif (!route || !(progress >= 0)) return null;\n\ttry {\n\t\tconst at = bezierPathPointAtLength(route, Math.min(1, Math.max(0, progress)) * bezierPathLength(route));\n\t\tif (!at) return null;\n\t\treturn { x: at.point[0], y: at.point[1], angle: s.rotate ? (at.angle * 180) / Math.PI : 0 };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * The transform a node's offsets, turn, scale and follow add (parent space), or null when none:\n * scaled and turned about its centre, offset by `dx`, `dy`, then (following a path) its centre\n * carried to the point on the path and turned with it, as Flair's `along` carries a wrapper.\n * `raw` ignores behaviours (the pose a pulse or shake swings towards, as Flair is given it);\n * `follow: false` leaves the follow out (`dx` … `scaleY` never include it).\n */\nexport function motionNodeOffset(\n\tentry: MotionNodeEntry,\n\ttimeline: MotionTimeline,\n\ttime: number,\n\tnodes = indexMotionNodes([entry.node]),\n\traw = false,\n\tfollow = true\n): { matrix: AffineMatrix; dx: number; dy: number; rotation: number; scaleX: number; scaleY: number; follow: { x: number; y: number; angle: number } | null } | null {\n\t// The pose, with any additive layers (emphasis, blend \"add\") on top.\n\tconst read = (p: MotionProperty, rest: number) => {\n\t\tconst v = trackValue(timeline.tracks.get(motionTrackKey(entry.node.id, p)), time, raw);\n\t\treturn withMotionLayers(timeline, entry.node.id, p, typeof v === 'number' ? v : rest, time, raw);\n\t};\n\tif (!TRANSFORM_PROPS.some((p) => (follow || p !== 'follow') && (timeline.tracks.has(motionTrackKey(entry.node.id, p)) || timeline.tracks.has(motionAddTrackKey(entry.node.id, p))))) return null;\n\tconst dx = read('x', 0);\n\tconst dy = read('y', 0);\n\tconst rotation = read('rotation', 0);\n\tconst scaleX = read('scaleX', 1);\n\tconst scaleY = read('scaleY', 1);\n\tconst c = entry.center;\n\tlet matrix = multiplyMatrices(multiplyMatrices(scaleMatrix(scaleX, scaleY, c), rotateMatrix(rotation, c)), translateMatrix(dx, dy));\n\tconst along = follow ? followAt(entry, timeline, nodes, time) : null;\n\tif (along) matrix = multiplyMatrices(matrix, multiplyMatrices(multiplyMatrices(translateMatrix(-c.x, -c.y), rotateMatrix(along.angle)), translateMatrix(along.x, along.y)));\n\treturn { matrix, dx, dy, rotation, scaleX, scaleY, follow: along };\n}\n\n/** A node's reveal clips at `time`, outermost first (rect, then circle), with sizes kept ≥ 0. */\nexport function motionNodeClips(id: string, timeline: MotionTimeline, time: number): MotionClipShape[] {\n\tconst out: MotionClipShape[] = [];\n\tconst rect = trackValue(timeline.tracks.get(motionTrackKey(id, 'clipRect')), time);\n\tif (Array.isArray(rect) && rect.length === 4) out.push({ shape: 'rect', x: tidy(rect[0]), y: tidy(rect[1]), width: Math.max(0, tidy(rect[2])), height: Math.max(0, tidy(rect[3])) });\n\tconst circle = trackValue(timeline.tracks.get(motionTrackKey(id, 'clipCircle')), time);\n\tif (Array.isArray(circle) && circle.length === 3) out.push({ shape: 'circle', cx: tidy(circle[0]), cy: tidy(circle[1]), r: Math.max(0, tidy(circle[2])) });\n\treturn out;\n}\n\n/**\n * The scene at `time` (ms): the artwork with every change applied, and the camera. A pure\n * function of time, so frames can be drawn in any order (and the same frames come out every time).\n */\nexport function motionFrameAt(scene: MotionScene, time: number, options: MotionFrameOptions = {}): MotionFrame {\n\tconst s = applyMotionControlValues(scene, options.values);\n\tconst timeline = compileMotionScene(s);\n\tconst nodes = indexMotionNodes(s.artwork.nodes);\n\tconst drawOn = options.draw !== false;\n\tconst value = (id: string, p: MotionProperty) => trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\tconst animated = new Set(timeline.segments.map((seg) => seg.node));\n\tconst clips: Record<string, MotionClipShape[]> = {};\n\n\tconst visit = (node: VectorNode): VectorNode => {\n\t\tlet out: VectorNode = node.type === 'group' ? { ...node, children: node.children.map(visit) } : node;\n\t\tif (!animated.has(node.id)) return out;\n\t\tconst entry = nodes.get(node.id);\n\t\tif (!entry) return out;\n\t\tconst id = node.id;\n\t\tconst clip = motionNodeClips(id, timeline, time);\n\t\tif (clip.length) clips[id] = clip;\n\n\t\tconst shape = shapeAt(entry, timeline, nodes, time);\n\t\tif (shape) {\n\t\t\tconst { name, visible, opacity, locked } = node;\n\t\t\tout = { ...shape, id, ...(name ? { name } : {}), ...(locked ? { locked } : {}), visible, ...(opacity !== undefined ? { opacity } : {}) } as VectorNode;\n\t\t\tif (out.visible === undefined) delete out.visible;\n\t\t}\n\n\t\t// Live path effect parameters.\n\t\tconst effectTracks = [...timeline.tracks.keys()].filter((k) => k.startsWith(`${id}\\u0000effect:`));\n\t\tif (effectTracks.length && out.effects?.length) {\n\t\t\tout = {\n\t\t\t\t...out,\n\t\t\t\teffects: out.effects.map((effect) => {\n\t\t\t\t\tlet params = effect.params as unknown as Record<string, unknown>;\n\t\t\t\t\tfor (const key of effectTracks) {\n\t\t\t\t\t\tconst [, effectId, param] = key.split('\\u0000')[1].split(':');\n\t\t\t\t\t\tif (effectId !== effect.id) continue;\n\t\t\t\t\t\tconst v = trackValue(timeline.tracks.get(key), time);\n\t\t\t\t\t\tif (typeof v === 'number') params = { ...params, [param]: v };\n\t\t\t\t\t}\n\t\t\t\t\treturn params === (effect.params as unknown) ? effect : ({ ...effect, params } as VectorEffect);\n\t\t\t\t})\n\t\t\t};\n\t\t}\n\n\t\tconst fill = value(id, 'fill');\n\t\tconst stroke = value(id, 'stroke');\n\t\tconst strokeWidth = value(id, 'strokeWidth');\n\t\tconst fillOpacity = value(id, 'fillOpacity');\n\t\tconst drawStart = value(id, 'drawStart');\n\t\tconst drawEnd = value(id, 'drawEnd');\n\t\tconst draw = drawOn && (drawStart !== undefined || drawEnd !== undefined);\n\t\tif (fill !== undefined || stroke !== undefined || strokeWidth !== undefined || fillOpacity !== undefined || draw) {\n\t\t\tout = mapPaths(out, (path) => {\n\t\t\t\tlet p: VectorPathNode = path;\n\t\t\t\tif (typeof fill === 'string') p = { ...p, fill };\n\t\t\t\tif (typeof stroke === 'string') p = { ...p, stroke };\n\t\t\t\tif (typeof strokeWidth === 'number') p = { ...p, strokeWidth: Math.max(0, tidy(strokeWidth)) };\n\t\t\t\tif (typeof fillOpacity === 'number' && fillOpacity < 1) p = { ...p, fill: fadePaint(p.fill, Math.max(0, fillOpacity)) };\n\t\t\t\tif (draw) {\n\t\t\t\t\tconst start = Math.min(1, Math.max(0, typeof drawStart === 'number' ? drawStart : 0));\n\t\t\t\t\tconst end = Math.min(1, Math.max(0, typeof drawEnd === 'number' ? drawEnd : 1));\n\t\t\t\t\tif (start > 0 || end < 1) {\n\t\t\t\t\t\tconst trim = createVectorEffect('trim', MOTION_DRAW_EFFECT_ID, { start: tidy(start * 100), end: tidy(end * 100) })!;\n\t\t\t\t\t\tp = { ...p, effects: [trim, ...(p.effects ?? []).filter((e) => e.id !== MOTION_DRAW_EFFECT_ID)] };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn p;\n\t\t\t});\n\t\t}\n\n\t\tconst opacity = value(id, 'opacity');\n\t\tif (typeof opacity === 'number') {\n\t\t\tconst o = Math.min(1, Math.max(0, tidy(opacity)));\n\t\t\tout = { ...out, opacity: o };\n\t\t\tif (o >= 1) delete out.opacity;\n\t\t}\n\n\t\tconst offset = options.offsets === false ? null : motionNodeOffset(entry, timeline, time, nodes);\n\t\tif (offset && !isIdentityMatrix(offset.matrix)) {\n\t\t\tconst m = multiplyMatrices(nodeMatrix(out), offset.matrix).map(tidy) as unknown as VectorNode['transform'];\n\t\t\tout = { ...out, transform: m };\n\t\t}\n\t\treturn out;\n\t};\n\n\tconst document: VectorDocument = { ...s.artwork, nodes: s.artwork.nodes.map(visit) };\n\tconst cam = trackValue(timeline.tracks.get(motionTrackKey('', 'camera')), time);\n\tconst box = Array.isArray(cam) ? cam : [0, 0, s.artwork.width, s.artwork.height];\n\treturn { time, document, camera: { x: tidy(box[0]), y: tidy(box[1]), width: tidy(box[2]), height: tidy(box[3]) }, clips };\n}\n\nexport interface MotionSvgOptions extends MotionFrameOptions, VectorSvgExportOptions {}\n\n/** A clip shape's SVG attributes. */\nexport function motionClipAttrs(clip: MotionClipShape): Record<string, number> {\n\tconst { shape: _shape, ...attrs } = clip;\n\treturn attrs;\n}\n\n/** The scene at `time` as a standalone SVG (the camera becomes the `viewBox`, reveal clips wrap their nodes). */\nexport function motionFrameToSvg(scene: MotionScene, time: number, options: MotionSvgOptions = {}): string {\n\tconst frame = motionFrameAt(scene, time, options);\n\tconst prefix = options.idPrefix ?? 'vg-';\n\tconst wrap: Record<string, readonly VectorSvgWrapper[]> = { ...options.wrap };\n\tfor (const [id, clips] of Object.entries(frame.clips))\n\t\twrap[id] = [...(wrap[id] ?? []), ...clips.map((clip, i) => ({ clip: { id: `${prefix}reveal-${id}-${i}`, shape: clip.shape, attrs: motionClipAttrs(clip) } }))];\n\treturn withViewBox(vectorDocumentToSvg(frame.document, { ...options, wrap }), frame.camera);\n}\n\n/** Replaces the root `viewBox` of an SVG string. */\nexport function withViewBox(svg: string, box: MotionRect): string {\n\tconst f = (n: number) => String(Math.round(n * 1000) / 1000);\n\treturn svg.replace(/viewBox=\"[^\"]*\"/, `viewBox=\"${f(box.x)} ${f(box.y)} ${f(box.width)} ${f(box.height)}\"`);\n}\n","import { resolveEasing, springSettleMs } from '../animation/easing.js';\nimport { matchMotionNodes } from './match.js';\nimport { normalizeTokenColor } from '../tokens/color.js';\nimport { collectPathNodes } from '../vector/geometry.js';\nimport type { VectorNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes, motionRevealPadding, motionTrackKey, trackValue, type MotionTimeline } from './compile.js';\nimport { motionFrameAt } from './evaluate.js';\nimport { motionIssue, namedWithSuggestion, type MotionIssue } from './issues.js';\nimport type { MotionCommand, MotionScene } from './types.js';\n\n/** Changes shorter than this (ms) are too quick to follow. */\nexport const MOTION_MIN_CHANGE_MS = 120;\n\nconst NUMERIC_PARAMS = (node: VectorNode, effectId: string): string[] | null => {\n\tconst effect = node.effects?.find((e) => e.id === effectId);\n\tif (!effect) return null;\n\treturn Object.entries(effect.params as unknown as Record<string, unknown>)\n\t\t.filter(([, v]) => typeof v === 'number')\n\t\t.map(([k]) => k);\n};\n\nfunction usesColor(scene: MotionScene, color: string): boolean {\n\tconst target = color.toLowerCase();\n\tlet found = false;\n\tconst walk = (v: unknown) => {\n\t\tif (found) return;\n\t\tif (typeof v === 'string') found = v.toLowerCase() === target;\n\t\telse if (Array.isArray(v)) v.forEach(walk);\n\t\telse if (v && typeof v === 'object') Object.values(v).forEach(walk);\n\t};\n\twalk(scene.artwork);\n\twalk(scene.shots);\n\treturn found;\n}\n\nfunction visibleAt(timeline: MotionTimeline, id: string, time: number, node: VectorNode): boolean {\n\tconst num = (p: Parameters<typeof motionTrackKey>[1], rest: number) => {\n\t\tconst v = trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\t\treturn typeof v === 'number' ? v : rest;\n\t};\n\tif (node.visible === false) return false;\n\tif (num('opacity', node.opacity ?? 1) <= 0.01) return false;\n\tif (Math.abs(num('scaleX', 1) * num('scaleY', 1)) <= 1e-4) return false;\n\t// A reveal clip with no area (before a wipe in, after a wipe out).\n\tconst clip = (p: 'clipRect' | 'clipCircle') => trackValue(timeline.tracks.get(motionTrackKey(id, p)), time);\n\tconst rect = clip('clipRect');\n\tif (Array.isArray(rect) && (rect[2] <= 1e-4 || rect[3] <= 1e-4)) return false;\n\tconst circle = clip('clipCircle');\n\tif (Array.isArray(circle) && circle[2] <= 1e-4) return false;\n\tconst hasFill = node.type === 'path' ? !!node.fill && node.fill !== 'none' : collectPathNodes(node).some((p) => p.fill && p.fill !== 'none');\n\treturn num('drawEnd', 1) > 0.01 || (hasFill && num('fillOpacity', 1) > 0.01);\n}\n\n/**\n * What is wrong with a scene's meaning: unknown ids (with a \"did you mean\"), timing that\n * fights itself, things animated while hidden or off camera, and lengths outside the target.\n * The scene must be well formed (see `parseMotionScene`).\n */\nexport function checkMotionScene(scene: MotionScene): MotionIssue[] {\n\tconst issues: MotionIssue[] = [];\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst ids = [...nodes.keys()];\n\tconst timeline = compileMotionScene(scene);\n\tconst artAspect = scene.artwork.width / scene.artwork.height;\n\n\tif (!scene.shots.length) issues.push(motionIssue('no-shots', 'The scene has no shots yet; add one with a list of commands.'));\n\tconst seen = new Set<string>();\n\tfor (const shot of scene.shots) {\n\t\tif (seen.has(shot.id)) issues.push(motionIssue('duplicate-shot-id', `Shot id \"${shot.id}\" is used twice; give each shot its own id.`, { shot: shot.id }));\n\t\tseen.add(shot.id);\n\t}\n\n\tconst known = (id: string, code: 'unknown-target' | 'unknown-path' | 'unknown-shape' | 'unknown-frame', what: string, where: { shot: string; command?: number }) => {\n\t\tif (nodes.has(id)) return true;\n\t\tissues.push(motionIssue(code, `There is no ${what} ${namedWithSuggestion(id, ids)} in the artwork${ids.length ? '' : ' (it has no nodes yet)'}.`, { ...where, ids: [id] }));\n\t\treturn false;\n\t};\n\n\tscene.shots.forEach((shot, shotIndex) => {\n\t\tif (shot.camera && 'frame' in shot.camera && typeof shot.camera.frame === 'string') known(shot.camera.frame, 'unknown-frame', 'node to frame', { shot: shot.id });\n\t\telse if (shot.camera) {\n\t\t\tconst c = shot.camera as { width: number; height: number };\n\t\t\tif (!(c.width > 0 && c.height > 0)) issues.push(motionIssue('invalid-camera', `The camera needs a positive width and height (got ${c.width} × ${c.height}).`, { shot: shot.id }));\n\t\t\telse if (Math.abs(c.width / c.height / artAspect - 1) > 0.02)\n\t\t\t\tissues.push(motionIssue('camera-aspect', `The camera is ${c.width} × ${c.height}, a different shape from the ${scene.artwork.width} × ${scene.artwork.height} artwork, so it shows bands at the sides; frame a node instead to match.`, { shot: shot.id }));\n\t\t}\n\t\tif (!shot.run.length && !shot.camera && shotIndex > 0) issues.push(motionIssue('empty-shot', 'This shot only holds; add commands or a camera move, or remove it.', { shot: shot.id }));\n\n\t\tshot.run.forEach((command: MotionCommand, i) => {\n\t\t\tconst where = { shot: shot.id, command: i };\n\t\t\tif (command.type === 'wait') return;\n\t\t\tconst targets = command.targets.filter((id) => known(id, 'unknown-target', 'node', where));\n\t\t\tconst timing = timeline.commands.find((c) => c.shot === shot.id && c.command === i);\n\t\t\tif (timing && timing.duration > 0 && timing.duration < MOTION_MIN_CHANGE_MS)\n\t\t\t\tissues.push(motionIssue('too-fast', `This ${command.type} lasts ${timing.duration} ms, too quick to follow; make it at least ${MOTION_MIN_CHANGE_MS} ms.`, { ...where, measured: timing.duration, needed: MOTION_MIN_CHANGE_MS, unit: 'ms', ids: targets }));\n\t\t\tif (command.duration !== undefined && command.ease !== undefined) {\n\t\t\t\tconst ease = resolveEasing(command.ease);\n\t\t\t\tif (ease !== 'hold' && ease.type === 'spring') {\n\t\t\t\t\tconst settle = springSettleMs(ease);\n\t\t\t\t\tif (command.duration < settle * 0.9)\n\t\t\t\t\t\tissues.push(motionIssue('spring-cut-short', `This ${command.type}'s spring takes ${settle} ms to settle but lasts ${command.duration} ms, so it jumps to its end; leave \"duration\" out (the spring sets it) or make it at least ${settle} ms.`, { ...where, measured: command.duration, needed: settle, unit: 'ms', ids: targets }));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'follow' && known(command.path, 'unknown-path', 'path', where) && nodes.get(command.path)!.node.type !== 'path')\n\t\t\t\tissues.push(motionIssue('not-a-path', `\"${command.path}\" is a group; follow a single path node.`, { ...where, ids: [command.path] }));\n\t\t\tif (command.type === 'morph') known(command.into, 'unknown-shape', 'shape', where);\n\t\t\tif (command.type === 'match' && known(command.into, 'unknown-shape', 'group', where)) {\n\t\t\t\tconst into = nodes.get(command.into)!;\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst entry = nodes.get(id)!;\n\t\t\t\t\tif (id === command.into || into.ancestors.includes(id) || entry.ancestors.includes(command.into)) {\n\t\t\t\t\t\tissues.push(motionIssue('match-self', `\"${id}\" cannot match \"${command.into}\": one is the other or holds it. Match two separate groups (the second usually hidden).`, { ...where, ids: [id, command.into] }));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst m = matchMotionNodes(entry.node, into.node);\n\t\t\t\t\tif (m.unpairedInto.length)\n\t\t\t\t\t\tissues.push(motionIssue('match-unpaired', `${m.unpairedInto.map((x) => `\"${x}\"`).join(', ')} in \"${command.into}\" ${m.unpairedInto.length > 1 ? 'have' : 'has'} no partner in \"${id}\", so ${m.unpairedInto.length > 1 ? 'they do' : 'it does'} not appear; add a part with the same name or id to \"${id}\" (it can start hidden or tiny).`, { ...where, ids: m.unpairedInto }));\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst style = command.type === 'enter' || command.type === 'exit' ? command.style : undefined;\n\t\t\tif (style === 'wipe' || style === 'iris' || style === 'split')\n\t\t\t\tfor (const id of targets)\n\t\t\t\t\tif (!motionRevealPadding(nodes.get(id)!))\n\t\t\t\t\t\tissues.push(motionIssue('reveal-no-box', `\"${id}\" has no width or height (a straight line), so a ${style} cannot clip it and it fades instead; use style \"${command.type === 'enter' ? 'draw' : 'undraw'}\" for a line.`, { ...where, ids: [id] }));\n\t\t\tif (command.type === 'style') {\n\t\t\t\tfor (const key of ['fill', 'stroke'] as const) {\n\t\t\t\t\tconst color = command[key];\n\t\t\t\t\tif (color === undefined) continue;\n\t\t\t\t\tif (normalizeTokenColor(color) === null) {\n\t\t\t\t\t\tissues.push(motionIssue('invalid-color', `${key} \"${color}\" is not a colour this editor reads; use hex (\"#0ea5e9\"), rgb() or rgba().`, where));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const id of targets) {\n\t\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\t\t\t\t\tif (paths.some((p) => p[key] !== undefined && p[key] !== null && typeof p[key] !== 'string'))\n\t\t\t\t\t\t\tissues.push(motionIssue('paint-not-color', `\"${id}\" has a gradient ${key}; it switches to ${color} at the end instead of blending.`, { ...where, ids: [id] }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'color-pulse') {\n\t\t\t\tconst key = command.paint ?? 'fill';\n\t\t\t\tconst color = command.color ?? '#f59e0b';\n\t\t\t\tif (normalizeTokenColor(color) === null) issues.push(motionIssue('invalid-color', `color \"${color}\" is not a colour this editor reads; use hex (\"#0ea5e9\"), rgb() or rgba().`, where));\n\t\t\t\telse\n\t\t\t\t\tfor (const id of targets) {\n\t\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\t\t\t\t\tif (paths.some((p) => typeof p[key] !== 'string'))\n\t\t\t\t\t\t\tissues.push(motionIssue('paint-not-color', `\"${id}\" has a gradient or no ${key}, so a colour pulse cannot tint it; give it a solid ${key} or pulse the ${key === 'fill' ? 'stroke' : 'fill'}.`, { ...where, ids: [id] }));\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.type === 'effect') {\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\tconst params = NUMERIC_PARAMS(node, command.effect);\n\t\t\t\t\tconst effects = (node.effects ?? []).map((e) => e.id);\n\t\t\t\t\tif (!params)\n\t\t\t\t\t\tissues.push(motionIssue('unknown-effect', `\"${id}\" has no effect ${namedWithSuggestion(command.effect, effects)}${effects.length ? `; its effects are ${effects.map((e) => `\"${e}\"`).join(', ')}` : '; it has no live effects'}.`, { ...where, ids: [id] }));\n\t\t\t\t\telse if (!params.includes(command.param))\n\t\t\t\t\t\tissues.push(motionIssue('unknown-effect-param', `Effect \"${command.effect}\" has no numeric parameter ${namedWithSuggestion(command.param, params)}; use one of ${params.join(', ')}.`, { ...where, ids: [id] }));\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Visibility at the start of the command.\n\t\t\tif (timing) {\n\t\t\t\tfor (const id of targets) {\n\t\t\t\t\tconst node = nodes.get(id)!.node;\n\t\t\t\t\tconst before = Math.max(0, timing.start - 0.5);\n\t\t\t\t\tconst visible = timing.start > 0 ? visibleAt(timeline, id, before, node) : node.visible !== false;\n\t\t\t\t\tif (command.type === 'enter' && visible && timing.start > 0)\n\t\t\t\t\t\tissues.push(motionIssue('enter-visible', `\"${id}\" is already showing when it enters, so it blinks out first; remove the enter or exit it earlier.`, { ...where, ids: [id] }));\n\t\t\t\t\tconst probe = command.type === 'exit' ? timing.start + 0.5 : (timing.start + timing.end) / 2;\n\t\t\t\t\tif (command.type !== 'enter' && command.type !== 'draw' && !visibleAt(timeline, id, probe, node))\n\t\t\t\t\t\tissues.push(motionIssue('exit-hidden', `\"${id}\" is hidden when this ${command.type} starts, so it is not seen; enter it first.`, { ...where, ids: [id] }));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Cues: they must resolve, and the shot before must have ended by then.\n\tscene.shots.forEach((shot, i) => {\n\t\tif (!shot.at) return;\n\t\tconst timing = timeline.shots[i];\n\t\tif (timing.cue === undefined) {\n\t\t\tconst what = shot.at.beat !== undefined ? `beat ${shot.at.beat}, but the scene has no beat grid; set one with set_animation_settings ({ \"beat\": { \"bpm\": … } })` : `word ${shot.at.word}, but the narration has ${scene.narration?.words.length ?? 0} words (indexes from 0)`;\n\t\t\tissues.push(motionIssue('unknown-cue', `Shot \"${shot.id}\" is cued to ${what}.`, { shot: shot.id }));\n\t\t} else if (timing.missedBy !== undefined) {\n\t\t\tconst late = Math.round(timing.missedBy);\n\t\t\tissues.push(motionIssue('cue-missed', `Shot \"${shot.id}\" is cued at ${Math.round(timing.cue)} ms but starts ${late} ms late, because the shot before runs until ${Math.round(timing.start)} ms; shorten that shot (its hold, durations or speed) or cue this one later.`, { shot: shot.id, measured: late, needed: 0, unit: 'ms' }));\n\t\t}\n\t});\n\n\t// Two segments changing the same property of a node at the same time.\n\tfor (const [key, track] of timeline.tracks) {\n\t\t// Additive layers stack by design.\n\t\tif (key.endsWith('\\u0000add')) continue;\n\t\tfor (let i = 1; i < track.length; i++) {\n\t\t\tconst a = track[i - 1];\n\t\t\tconst b = track[i];\n\t\t\tif (b.start < a.end - 1 && (a.shot !== b.shot || a.command !== b.command)) {\n\t\t\t\tconst property = key.split('\\u0000')[1];\n\t\t\t\tif (!a.node) continue;\n\t\t\t\tissues.push(\n\t\t\t\t\tmotionIssue('overlap', `\"${a.node}\" ${property} is changed by two commands at once (shot \"${a.shot}\" command ${a.command + 1} and shot \"${b.shot}\" command ${b.command + 1}); the later one takes over. Start it after the first ends, or use with: \"after\".`, {\n\t\t\t\t\t\tshot: b.shot,\n\t\t\t\t\t\tcommand: b.command,\n\t\t\t\t\t\tids: [a.node]\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Animated nodes that end their command outside the camera.\n\tconst reported = new Set<string>();\n\tfor (const timing of timeline.commands) {\n\t\tconst command = scene.shots[timing.shotIndex].run[timing.command];\n\t\tif (command.type === 'wait' || command.type === 'exit') continue;\n\t\tconst frame = motionFrameAt(scene, timing.end);\n\t\tconst cam = frame.camera;\n\t\tconst docIndex = indexMotionNodes(frame.document.nodes);\n\t\tfor (const id of command.targets) {\n\t\t\tconst b = docIndex.get(id)?.bounds;\n\t\t\tif (!b || reported.has(id) || !visibleAt(timeline, id, timing.end, nodes.get(id)!.node)) continue;\n\t\t\tconst outside = b.x + b.width < cam.x || b.y + b.height < cam.y || b.x > cam.x + cam.width || b.y > cam.y + cam.height;\n\t\t\tif (outside) {\n\t\t\t\treported.add(id);\n\t\t\t\tissues.push(motionIssue('out-of-frame', `\"${id}\" is outside the camera when this ${command.type} ends, so it is not seen; move it into frame or move the camera.`, { shot: timing.shot, command: timing.command, ids: [id] }));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (scene.controls) {\n\t\tfor (const control of scene.controls) {\n\t\t\tif (!usesColor(scene, control.default))\n\t\t\t\tissues.push(motionIssue('unknown-control-color', `Control \"${control.name}\" stands for ${control.default}, which the scene never uses; set its default to a colour in the artwork.`));\n\t\t}\n\t}\n\n\tif (scene.target && scene.shots.length) {\n\t\tconst seconds = Math.round(timeline.duration / 100) / 10;\n\t\tconst [min, max] = scene.target;\n\t\tif (seconds > max) issues.push(motionIssue('scene-too-long', `The scene runs ${seconds} s, past its ${max} s target; shorten holds or durations, or fit it (fit_animation).`, { measured: seconds, needed: max, unit: 's' }));\n\t\tif (seconds < min) issues.push(motionIssue('scene-too-short', `The scene runs ${seconds} s, under its ${min} s target; hold longer, add shots, or fit it (fit_animation).`, { measured: seconds, needed: min, unit: 's' }));\n\t}\n\treturn issues;\n}\n","import type { VectorDocument } from '../vector/types.js';\nimport { checkMotionScene } from './check.js';\nimport { motionIssueKey, motionIssueLine, namedWithSuggestion, type MotionIssue } from './issues.js';\nimport { commandShapeProblems, motionSceneShapeProblems, shotShapeProblems } from './parse.js';\nimport type { MotionCommand, MotionControl, MotionPreset, MotionScene, MotionShot } from './types.js';\n\n/**\n * Edits as data: each is a pure function of the scene, all or nothing. An edit that leaves the\n * scene malformed, or adds an error the scene did not have (an unknown id, say), changes\n * nothing and says why; existing errors do not block unrelated edits, so a broken scene can be\n * fixed a step at a time.\n */\nexport type MotionEdit =\n\t| { op: 'set_settings'; name?: string; description?: string | null; loop?: MotionScene['loop']; fps?: number; steps?: number | null; beat?: MotionScene['beat'] | null; narration?: MotionScene['narration'] | null; target?: [number, number] | null }\n\t| { op: 'insert_shots'; shots: MotionShot[]; at?: number }\n\t| { op: 'update_shot'; shot: string; set?: Partial<MotionShot>; remove?: ('label' | 'camera' | 'hold' | 'speed' | 'at')[] }\n\t| { op: 'delete_shots'; shots: string[] }\n\t| { op: 'move_shot'; shot: string; to: number }\n\t| { op: 'add_commands'; shot: string; commands: MotionCommand[]; at?: number }\n\t| { op: 'update_command'; shot: string; command: number; set?: Record<string, unknown>; remove?: string[] }\n\t| { op: 'delete_commands'; shot: string; commands: number[] }\n\t| { op: 'set_artwork'; artwork: VectorDocument }\n\t| { op: 'set_controls'; controls: MotionControl[]; presets?: MotionPreset[] }\n\t| { op: 'replace_scene'; scene: MotionScene };\n\nexport type MotionEditOp = MotionEdit['op'];\n\nexport const MOTION_EDIT_OPS: readonly MotionEditOp[] = [\n\t'set_settings',\n\t'insert_shots',\n\t'update_shot',\n\t'delete_shots',\n\t'move_shot',\n\t'add_commands',\n\t'update_command',\n\t'delete_commands',\n\t'set_artwork',\n\t'set_controls',\n\t'replace_scene'\n];\n\nexport type MotionEditResult =\n\t| {\n\t\t\tok: true;\n\t\t\tscene: MotionScene;\n\t\t\t/** Every issue the edited scene has. */\n\t\t\tissues: MotionIssue[];\n\t\t\t/** Edits that work but may surprise (a later command undoes this one, say). */\n\t\t\thints: string[];\n\t }\n\t| { ok: false; error: string };\n\nclass EditError extends Error {}\nconst fail = (message: string): never => {\n\tthrow new EditError(message);\n};\n\nfunction shotIndex(scene: MotionScene, id: string): number {\n\tconst i = scene.shots.findIndex((s) => s.id === id);\n\tif (i < 0) fail(`There is no shot ${namedWithSuggestion(id, scene.shots.map((s) => s.id))}; the shots are ${scene.shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\treturn i;\n}\n\nfunction position(at: number | undefined, length: number, what: string): number {\n\tif (at === undefined) return length;\n\tif (!Number.isInteger(at) || at < 0 || at > length) fail(`${what} must be a whole number from 0 to ${length} (got ${at}).`);\n\treturn at;\n}\n\nconst replaceShot = (scene: MotionScene, index: number, shot: MotionShot): MotionScene => ({ ...scene, shots: scene.shots.map((s, i) => (i === index ? shot : s)) });\n\n/** A free shot id: `base`, then `base-2`, `base-3`… */\nexport function freshShotId(scene: MotionScene, base = 'shot'): string {\n\tconst used = new Set(scene.shots.map((s) => s.id));\n\tif (!used.has(base)) return base;\n\tlet n = 2;\n\twhile (used.has(`${base}-${n}`)) n++;\n\treturn `${base}-${n}`;\n}\n\nfunction applyOne(scene: MotionScene, edit: MotionEdit): MotionScene {\n\tswitch (edit.op) {\n\t\tcase 'set_settings': {\n\t\t\tconst next: MotionScene = { ...scene };\n\t\t\tif (edit.name !== undefined) next.name = edit.name;\n\t\t\tif (edit.description === null) delete next.description;\n\t\t\telse if (edit.description !== undefined) next.description = edit.description;\n\t\t\tif (edit.loop !== undefined) next.loop = edit.loop;\n\t\t\tif (edit.fps !== undefined) next.fps = edit.fps;\n\t\t\tif (edit.steps === null) delete next.steps;\n\t\t\telse if (edit.steps !== undefined) {\n\t\t\t\tif (!(typeof edit.steps === 'number' && edit.steps > 0 && edit.steps <= 120)) fail('\"steps\" must be frames per second from above 0 to 120 (12 is \"on twos\" at 24 fps), or null for smooth.');\n\t\t\t\tnext.steps = edit.steps;\n\t\t\t}\n\t\t\tfor (const key of ['beat', 'narration'] as const) {\n\t\t\t\tif (edit[key] === null) delete next[key];\n\t\t\t\telse if (edit[key] !== undefined) (next as unknown as Record<string, unknown>)[key] = edit[key];\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst problems = motionSceneShapeProblems(next).filter((p) => /\"beat\"|\"narration\"/.test(p));\n\t\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\t}\n\t\t\tif (edit.target === null) delete next.target;\n\t\t\telse if (edit.target !== undefined) next.target = edit.target;\n\t\t\treturn next;\n\t\t}\n\t\tcase 'insert_shots': {\n\t\t\tif (!edit.shots.length) fail('Give at least one shot.');\n\t\t\tedit.shots.forEach((shot, i) => {\n\t\t\t\tconst problems = shotShapeProblems(shot, `Shot ${i + 1}`);\n\t\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\t});\n\t\t\tconst ids = new Set(scene.shots.map((s) => s.id));\n\t\t\tfor (const shot of edit.shots) {\n\t\t\t\tif (ids.has(shot.id)) fail(`Shot id \"${shot.id}\" is already used; choose another (e.g. \"${freshShotId(scene, shot.id)}\").`);\n\t\t\t\tids.add(shot.id);\n\t\t\t}\n\t\t\tconst at = position(edit.at, scene.shots.length, '\"at\"');\n\t\t\treturn { ...scene, shots: [...scene.shots.slice(0, at), ...edit.shots, ...scene.shots.slice(at)] };\n\t\t}\n\t\tcase 'update_shot': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst shot: MotionShot = { ...scene.shots[i], ...(edit.set ?? {}) };\n\t\t\tfor (const key of edit.remove ?? []) delete shot[key];\n\t\t\tif (shot.id !== edit.shot && scene.shots.some((s) => s.id === shot.id)) fail(`Shot id \"${shot.id}\" is already used; choose another.`);\n\t\t\tconst problems = shotShapeProblems(shot, `Shot \"${edit.shot}\"`);\n\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\treturn replaceShot(scene, i, shot);\n\t\t}\n\t\tcase 'delete_shots': {\n\t\t\tif (!edit.shots.length) fail('Give at least one shot id.');\n\t\t\tedit.shots.forEach((id) => shotIndex(scene, id));\n\t\t\tconst drop = new Set(edit.shots);\n\t\t\treturn { ...scene, shots: scene.shots.filter((s) => !drop.has(s.id)) };\n\t\t}\n\t\tcase 'move_shot': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst to = position(edit.to, scene.shots.length - 1, '\"to\"');\n\t\t\tconst shots = [...scene.shots];\n\t\t\tconst [shot] = shots.splice(i, 1);\n\t\t\tshots.splice(to, 0, shot);\n\t\t\treturn { ...scene, shots };\n\t\t}\n\t\tcase 'add_commands': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tif (!edit.commands.length) fail('Give at least one command.');\n\t\t\tedit.commands.forEach((command, k) => {\n\t\t\t\tconst problems = commandShapeProblems(command, `Command ${k + 1}`);\n\t\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\t});\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tconst at = position(edit.at, run.length, '\"at\"');\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: [...run.slice(0, at), ...edit.commands, ...run.slice(at)] });\n\t\t}\n\t\tcase 'update_command': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tif (!Number.isInteger(edit.command) || edit.command < 0 || edit.command >= run.length)\n\t\t\t\tfail(`Shot \"${edit.shot}\" has ${run.length} command${run.length === 1 ? '' : 's'}; \"command\" must be an index from 0 to ${run.length - 1} (got ${edit.command}).`);\n\t\t\tconst command = { ...run[edit.command], ...(edit.set ?? {}) } as Record<string, unknown>;\n\t\t\tfor (const key of edit.remove ?? []) {\n\t\t\t\tif (key === 'type') fail('\"type\" cannot be removed; replace the command instead.');\n\t\t\t\tdelete command[key];\n\t\t\t}\n\t\t\tconst problems = commandShapeProblems(command, `Command ${edit.command}`);\n\t\t\tif (problems.length) fail(problems.join(' '));\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: run.map((c, k) => (k === edit.command ? (command as unknown as MotionCommand) : c)) });\n\t\t}\n\t\tcase 'delete_commands': {\n\t\t\tconst i = shotIndex(scene, edit.shot);\n\t\t\tconst run = scene.shots[i].run;\n\t\t\tif (!edit.commands.length) fail('Give at least one command index.');\n\t\t\tfor (const k of edit.commands)\n\t\t\t\tif (!Number.isInteger(k) || k < 0 || k >= run.length) fail(`Shot \"${edit.shot}\" has no command ${k}; indexes run from 0 to ${run.length - 1}.`);\n\t\t\tconst drop = new Set(edit.commands);\n\t\t\treturn replaceShot(scene, i, { ...scene.shots[i], run: run.filter((_, k) => !drop.has(k)) });\n\t\t}\n\t\tcase 'set_artwork':\n\t\t\treturn { ...scene, artwork: edit.artwork };\n\t\tcase 'set_controls': {\n\t\t\tconst next: MotionScene = { ...scene, controls: edit.controls };\n\t\t\tif (!edit.controls.length) delete next.controls;\n\t\t\tif (edit.presets !== undefined) {\n\t\t\t\tif (edit.presets.length) next.presets = edit.presets;\n\t\t\t\telse delete next.presets;\n\t\t\t}\n\t\t\tconst names = new Set(edit.controls.map((c) => c.name));\n\t\t\tfor (const preset of next.presets ?? [])\n\t\t\t\tfor (const key of Object.keys(preset.values))\n\t\t\t\t\tif (!names.has(key)) fail(`Preset \"${preset.name}\" sets ${namedWithSuggestion(key, names)}, which is not a control.`);\n\t\t\treturn next;\n\t\t}\n\t\tcase 'replace_scene':\n\t\t\treturn edit.scene;\n\t}\n}\n\nfunction errorKeys(issues: readonly MotionIssue[]): Set<string> {\n\treturn new Set(issues.filter((i) => i.severity === 'error').map(motionIssueKey));\n}\n\n/** Hints: commands whose change a later command takes over. */\nfunction editHints(before: MotionIssue[], after: MotionIssue[]): string[] {\n\tconst old = new Set(before.map(motionIssueKey));\n\treturn after.filter((i) => i.code === 'overlap' && !old.has(motionIssueKey(i))).map(motionIssueLine);\n}\n\n/** Applies edits in order, as one change. Fails without changing anything when one fails. */\nexport function applyMotionEdits(scene: MotionScene, edits: MotionEdit | readonly MotionEdit[]): MotionEditResult {\n\tconst list = Array.isArray(edits) ? edits : [edits as MotionEdit];\n\tconst before = checkMotionScene(scene);\n\tlet next = scene;\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst edit = list[i];\n\t\tconst prefix = list.length > 1 ? `op ${i + 1} (${edit?.op}): ` : '';\n\t\tif (!edit || !(MOTION_EDIT_OPS as readonly string[]).includes(edit.op))\n\t\t\treturn { ok: false, error: `${prefix}Unknown op ${namedWithSuggestion(String(edit?.op), MOTION_EDIT_OPS)}. Nothing was changed.` };\n\t\ttry {\n\t\t\tnext = applyOne(next, edit);\n\t\t} catch (error) {\n\t\t\tif (error instanceof EditError) return { ok: false, error: `${prefix}${error.message} Nothing was changed.` };\n\t\t\tthrow error;\n\t\t}\n\t\tconst problems = motionSceneShapeProblems(next);\n\t\tif (problems.length) return { ok: false, error: `${prefix}Nothing was changed: ${problems.join(' ')}` };\n\t}\n\tconst issues = checkMotionScene(next);\n\tconst had = errorKeys(before);\n\tconst added = issues.filter((i) => i.severity === 'error' && !had.has(motionIssueKey(i)));\n\tif (added.length) return { ok: false, error: `Nothing was changed: ${added.map(motionIssueLine).join(' ')}` };\n\treturn { ok: true, scene: next, issues, hints: editHints(before, issues) };\n}\n\n/** An empty scene over `artwork`. */\nexport function createMotionScene(artwork: VectorDocument, init: Partial<Omit<MotionScene, 'artwork' | 'version'>> = {}): MotionScene {\n\treturn { version: 1, name: init.name ?? 'animation', ...init, artwork, shots: init.shots ?? [] };\n}\n","// Protected regions adapted from effectcraft-main/crates/render/src/eval.rs (`responsive_source_time`), MIT OR Apache-2.0, © ArtCraft Team and contributors.\nimport { compileMotionScene } from './compile.js';\nimport { namedWithSuggestion } from './issues.js';\nimport type { MotionScene } from './types.js';\n\nexport interface MotionFitOptions {\n\t/** Shot ids that keep their pace (a logo hold, a line of narration); the others absorb the change. */\n\tkeep?: readonly string[];\n}\n\nexport interface MotionFit {\n\tscene: MotionScene;\n\t/** The length after fitting, ms (within a few ms of the target: speeds are rounded). */\n\tduration: number;\n\t/** The new `speed` of every shot that changed. */\n\tspeeds: Record<string, number>;\n}\n\n/** Speeds are kept within this range. */\nexport const MOTION_SPEED_RANGE: readonly [number, number] = [0.05, 20];\n\n/**\n * Fits a scene to `ms` by setting its shots' `speed`: the shots in `keep` play as they are and\n * the rest stretch or squeeze by the same factor, so their timing keeps its proportions (the\n * responsive time of After Effects' protected regions). Throws, changing nothing, when the\n * kept shots alone outlast the target or a speed would leave `MOTION_SPEED_RANGE`.\n */\nexport function fitMotionScene(scene: MotionScene, ms: number, options: MotionFitOptions = {}): MotionFit {\n\tif (!(Number.isFinite(ms) && ms > 0)) throw new Error('Give the length to fit as a number of milliseconds above 0.');\n\tconst ids = scene.shots.map((s) => s.id);\n\tconst keep = new Set(options.keep ?? []);\n\tfor (const id of keep) if (!ids.includes(id)) throw new Error(`There is no shot ${namedWithSuggestion(id, ids)} to keep.`);\n\tconst timeline = compileMotionScene(scene);\n\tlet kept = 0;\n\tlet rest = 0;\n\ttimeline.shots.forEach((t) => (keep.has(t.id) ? (kept += t.end - t.start) : (rest += t.end - t.start)));\n\tif (rest <= 0) throw new Error(keep.size ? 'Every shot is kept, so nothing can change pace; keep fewer shots.' : 'The scene has no length to fit; add shots first.');\n\tif (ms <= kept) throw new Error(`The kept shots alone last ${Math.round(kept)} ms, so the scene cannot fit ${Math.round(ms)} ms; keep fewer shots or give at least ${Math.ceil(kept) + 1} ms.`);\n\tconst k = (ms - kept) / rest;\n\tconst speeds: Record<string, number> = {};\n\tconst shots = scene.shots.map((shot) => {\n\t\tif (keep.has(shot.id)) return shot;\n\t\tconst speed = Math.round(((shot.speed ?? 1) / k) * 10000) / 10000;\n\t\tif (speed < MOTION_SPEED_RANGE[0] || speed > MOTION_SPEED_RANGE[1])\n\t\t\tthrow new Error(`Fitting ${Math.round(ms)} ms would play shot \"${shot.id}\" at ${speed}× (speeds run ${MOTION_SPEED_RANGE[0]}–${MOTION_SPEED_RANGE[1]}); aim nearer the current ${Math.round(timeline.duration)} ms.`);\n\t\tspeeds[shot.id] = speed;\n\t\tconst { speed: _old, ...rest } = shot;\n\t\treturn speed === 1 ? rest : { ...rest, speed };\n\t});\n\tconst fitted: MotionScene = { ...scene, shots };\n\treturn { scene: fitted, duration: compileMotionScene(fitted).duration, speeds };\n}\n","import type { MotionBehavior } from '../animation/behavior.js';\nimport { evaluateEasing, resolveEasing, reverseCubicBezier, type AnimationEasing } from '../animation/easing.js';\nimport { bezierPathToSvg, transformBezierPath } from '../canvas/pathops/bezier.js';\nimport { normalizeTokenColor } from '../tokens/color.js';\nimport { expandVectorAppearance, expandVectorAppearances } from '../vector/appearance.js';\nimport { IDENTITY_MATRIX, collectPathNodes, invertMatrix, nodeMatrix, vectorPathWorldBezier } from '../vector/geometry.js';\nimport { vectorDocumentToSvg, type VectorSvgWrapper } from '../vector/svg.js';\nimport type { VectorNode, VectorPathNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes, motionAddTrackKey, motionTrackKey, segmentValue, trackValue, type MotionProperty, type MotionSegment } from './compile.js';\nimport { motionClipAttrs, motionFollowRoute, motionFrameAt, motionNodeClips, motionNodeOffset } from './evaluate.js';\nimport type { MotionScene } from './types.js';\n\n/**\n * Export to Flair (`@pixerate/flair`): a scene becomes an `SvgMotion` (one SVG plus a list of\n * from → to changes on its elements), a catalog `VectorEffect`, or an `EffectDocument` for\n * Flair's effect editor. The types are mirrored here so this package does not depend on Flair.\n *\n * Changes are exact where Flair can express them: a change with a linear, cubic-out or\n * cubic-in-out curve (the editor's defaults) is one change, and so (Flair 0.36 and later) is\n * one with any cubic-bezier curve, written as `[x1, y1, x2, y2]`. Anything else (springs,\n * elastic, `hold`, morphs and live-effect tweens) is sampled at the\n * scene's `fps` into short linear changes, which Flair plays the same way. Pulses, shakes,\n * teeters, waves, wiggles and colour pulses are one change with a `behavior` (Flair 0.38).\n *\n * Reveals (`wipe`, `iris`, `split`) wrap their node in a group clipped through a rect or circle\n * in the group's own box units (`clipPathUnits=\"objectBoundingBox\"`), as Flair's\n * `entrance.wipe` does, and animate the shape's attributes. A follow wraps its node in a group\n * that Flair's `along` carries along a copy of the path in the node's parent's units (written\n * in `<defs>`, so the path may be hidden or anywhere), turning with it for `orient`, as\n * Flair's `path.follow` does.\n */\n\n/** Flair's easing names. */\nexport type FlairEaseName = 'linear' | 'in-out' | 'out';\n\n/** Flair's spring ease (Flair 0.39 and later): the editor's spring, number for number. */\nexport interface FlairSpringEase {\n\tspring: { mass?: number; stiffness?: number; damping?: number; velocity?: number };\n}\n\n/** A Flair easing: a name, (Flair 0.36 and later) a CSS cubic-bezier `[x1, y1, x2, y2]`, or (0.39) a spring. */\nexport type FlairEase = FlairEaseName | readonly [number, number, number, number] | FlairSpringEase;\n\n/** Flair's curves, for matching. */\nexport const FLAIR_EASES: Readonly<Record<FlairEaseName, (t: number) => number>> = {\n\tlinear: (t) => t,\n\t'in-out': (t) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n\tout: (t) => 1 - (1 - t) ** 3\n};\n\n/** One change of a Flair `SvgMotion` (mirrors `SvgAnimation` in `@pixerate/flair/vector`). */\nexport interface FlairSvgAnimation {\n\tid?: string;\n\tstep?: number;\n\tdelay?: number;\n\tms?: number;\n\tease?: FlairEase;\n\tattrs?: Record<string, readonly [string | number, string | number]>;\n\tdraw?: boolean | readonly [number, number];\n\t/** Moves the element along a path (by id), from and to the fractions of its length in `at`. */\n\talong?: string;\n\tat?: readonly [number, number];\n\t/** With `along`: turns the element with the path's direction. */\n\torient?: boolean;\n\t/** Flair 0.38 and later: how the change swings from → to (see `MotionBehavior`). */\n\tbehavior?: MotionBehavior;\n\t/** Flair 0.39 and later: stepped time, held on a grid of this many frames per second. */\n\tstrobe?: number;\n\t/** Flair 0.39 and later: whole cycles to play (default 1); with `alternate`, every other one backwards. */\n\trepeat?: number;\n\talternate?: boolean;\n\t/** Flair features scenes do not have (imports skip them with a note). */\n\tcount?: readonly [number, number];\n\twrite?: string;\n\tscramble?: string;\n\tsolo?: number;\n\tview?: readonly [number, number, number, number] | string;\n}\n\n/** Mirrors `SvgMotion` in `@pixerate/flair/vector`. */\nexport interface FlairSvgMotion {\n\tsvg: string;\n\tanimate?: FlairSvgAnimation[];\n}\n\n/** Mirrors Flair's catalog `VectorEffect` (`@pixerate/flair/catalog`). */\nexport interface FlairVectorEffect {\n\tkind: 'vector';\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tcategory: string;\n\ttags: string[];\n\tmotion: FlairSvgMotion;\n\tpresets?: { name: string; values: Record<string, string> }[];\n\t/** Ms on the last frame before looping. */\n\thold?: number;\n\ttrigger?: 'hover' | 'press' | 'click' | 'scroll';\n}\n\n/** Mirrors Flair's `EffectDocument` (`@pixerate/flair/editor`) for a vector effect. */\nexport interface FlairEffectDocument {\n\tversion: 1;\n\tname: string;\n\teffect: { kind: 'vector'; motion: FlairSvgMotion; hold?: number };\n\tvalues: Record<string, string>;\n\ttracks: Record<string, never>;\n\tduration: number;\n\tloop: boolean;\n\tpresets: { name: string; values: Record<string, string> }[];\n}\n\nexport interface FlairMotionExport {\n\tmotion: FlairSvgMotion;\n\t/** The scene's length (ms). */\n\tduration: number;\n\t/** Ms after the last change (Flair's `hold`). */\n\thold: number;\n\t/** Changes sampled into linear steps. */\n\tsampled: number;\n\t/** What could not be carried over, in sentences. */\n\tnotes: string[];\n}\n\nexport interface FlairExportOptions {\n\t/** Sampling rate for changes Flair cannot express exactly (default: the scene's `fps`, else 30). */\n\tfps?: number;\n\t/** Decimal places (default 3). */\n\tprecision?: number;\n\t/**\n\t * Write cubic-bezier easings (the `ease`, `ease-in`, `ease-out`, `ease-in-out`, `ease-in-back`\n\t * and `ease-out-back` presets, and `{ type: 'cubic-bezier' }` curves) as one change with\n\t * `ease: [x1, y1, x2, y2]` (default true). Needs Flair 0.36 or later; set false for older\n\t * Flair, and they are sampled into linear steps.\n\t */\n\tcurves?: boolean;\n\t/**\n\t * Write pulses, shakes, teeters, waves, wiggles and colour pulses as one change with a Flair\n\t * `behavior` (default true), so they play exactly. Needs Flair 0.38 or later; set false for\n\t * older Flair, and they are sampled into linear steps.\n\t */\n\tbehaviors?: boolean;\n\t/**\n\t * The Flair version the export is for (default `0.39`): it decides what is written exactly\n\t * and what is sampled. 0.36 adds cubic-bezier curves, 0.38 behaviours, 0.39 springs and\n\t * stepped time (`strobe`). `curves` and `behaviors` override it.\n\t */\n\tflair?: string;\n}\n\n/** The Flair version exports target by default. */\nexport const FLAIR_EXPORT_VERSION = '0.39';\n\n/** Whether Flair `version` is at least `min` (dotted numbers). */\nexport function flairAtLeast(version: string, min: string): boolean {\n\tconst a = version.split('.').map((n) => parseInt(n, 10) || 0);\n\tconst b = min.split('.').map((n) => parseInt(n, 10) || 0);\n\tfor (let i = 0; i < Math.max(a.length, b.length); i++) if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0);\n\treturn true;\n}\n\n/** The Flair easing that matches `ease` (within 1% everywhere), if any. */\nexport function flairEaseFor(ease: AnimationEasing): FlairEaseName | undefined {\n\tfor (const name of ['linear', 'out', 'in-out'] as const) {\n\t\tlet worst = 0;\n\t\tfor (let i = 1; i < 40; i++) {\n\t\t\tconst t = i / 40;\n\t\t\tworst = Math.max(worst, Math.abs(evaluateEasing(ease, t, 1000) - FLAIR_EASES[name](t)));\n\t\t}\n\t\tif (worst < 0.01) return name;\n\t}\n\treturn undefined;\n}\n\n/**\n * The Flair easing for `ease`: a Flair name when one matches within 1%, else (with `curves`,\n * the default) the curve's `[x1, y1, x2, y2]` when it is a cubic-bezier. Undefined for curves\n * Flair cannot play (springs, elastic, `hold`), which are sampled.\n */\nexport function flairCurveFor(ease: AnimationEasing, curves = true): FlairEase | undefined {\n\tconst name = flairEaseFor(ease);\n\tif (name || !curves) return name;\n\tconst resolved = resolveEasing(ease);\n\tif (resolved === 'hold' || resolved.type !== 'cubic-bezier') return undefined;\n\treturn [resolved.x1, resolved.y1, resolved.x2, resolved.y2];\n}\n\n/** Whether a curve leaves 0–1 (a back ease or a spring), so its values pass `from` or `to`. */\nconst overshoots = (ease: FlairEase) => typeof ease !== 'string' && ('spring' in ease || ease[1] < 0 || ease[1] > 1 || ease[3] < 0 || ease[3] > 1);\n\ntype ChannelValue = number | string | readonly number[];\n\ninterface Channel {\n\tid: string;\n\t/** `attrs`: several number attributes changing together (`attrs` names them, `value` gives them in order). */\n\tkind: 'attr' | 'attrs' | 'draw' | 'view';\n\tattr?: string;\n\tattrs?: readonly string[];\n\tsegments: MotionSegment[];\n\texact: (segment: MotionSegment) => boolean;\n\t/**\n\t * Whether a value past `from` → `to` plays the same in Flair as in the editor. Transforms and\n\t * the camera extrapolate; colours would leave 0–255 and opacity and draw-on are clamped here.\n\t */\n\tovershoot?: boolean;\n\tvalue: (time: number) => ChannelValue;\n\t/** The value with behaviours ignored: what a behaviour swings towards (default `value`). */\n\traw?: (time: number) => ChannelValue;\n}\n\nconst TRANSFORM_PROPS: MotionProperty[] = ['x', 'y', 'rotation', 'scaleX', 'scaleY', 'follow'];\nconst LINEAR_TRANSFORM = new Set<MotionProperty>(['x', 'y', 'rotation', 'scaleX', 'scaleY']);\n\nfunction hex6(color: unknown): string {\n\tconst hex = normalizeTokenColor(color);\n\treturn hex ? hex.slice(0, 7) : '#000000';\n}\n\n/** A scene as a Flair `SvgMotion`. */\nexport function toFlairSvgMotion(scene: MotionScene, options: FlairExportOptions = {}): FlairMotionExport {\n\tconst fps = options.fps ?? scene.fps ?? 30;\n\tconst precision = options.precision ?? 3;\n\tconst flair = options.flair ?? FLAIR_EXPORT_VERSION;\n\tconst curves = options.curves ?? flairAtLeast(flair, '0.36');\n\tconst behaviors = options.behaviors ?? flairAtLeast(flair, '0.38');\n\tconst springs = flairAtLeast(flair, '0.39');\n\tconst strobes = flairAtLeast(flair, '0.39');\n\tconst writeEase = (ease: FlairEase): FlairEase => (typeof ease === 'string' || 'spring' in ease ? ease : (ease.map(round) as unknown as FlairEase));\n\t// The ease Flair is given for a segment: its curve (run backwards for a mirrored repeat) or its spring, if Flair can take it.\n\tconst easeOf = (segment: MotionSegment): FlairEase | undefined => {\n\t\tconst resolved = resolveEasing(segment.ease);\n\t\tif (resolved !== 'hold' && resolved.type === 'spring') {\n\t\t\tif (!springs || segment.reverse) return undefined;\n\t\t\tconst { mass, stiffness, damping, velocity } = resolved;\n\t\t\treturn { spring: { mass, stiffness, damping, velocity } };\n\t\t}\n\t\tif (!segment.reverse) return flairCurveFor(segment.ease, curves);\n\t\tconst back = reverseCubicBezier(segment.ease);\n\t\treturn back && curves ? flairCurveFor(back, curves) : undefined;\n\t};\n\t// A segment with a behaviour plays exactly when Flair can be given the behaviour.\n\tconst plays = (s: MotionSegment) => (!s.behavior || behaviors) && (!s.steps || strobes) && !s.geometric;\n\tconst round = (n: number) => Math.round(n * 10 ** precision) / 10 ** precision;\n\tconst f = (n: number) => String(round(n));\n\tconst timeline = compileMotionScene(scene);\n\tconst nodes = indexMotionNodes(scene.artwork.nodes);\n\tconst notes: string[] = [];\n\tconst channels: Channel[] = [];\n\tconst track = (id: string, p: MotionProperty) => timeline.tracks.get(motionTrackKey(id, p)) ?? [];\n\n\t// The outermost node (of a path and its groups) whose track sets `p` for that path.\n\tconst owner = (path: VectorPathNode, p: MotionProperty): string | undefined => {\n\t\tconst entry = nodes.get(path.id);\n\t\tif (!entry) return undefined;\n\t\treturn [...entry.ancestors, path.id].find((id) => timeline.tracks.has(motionTrackKey(id, p)));\n\t};\n\n\tconst animatedNodes = new Set(timeline.segments.map((s) => s.node).filter(Boolean));\n\tconst pathsSeen = new Set<string>();\n\t// Groups written round nodes (outermost first), routes for `along`, and the ids they take.\n\tconst wrap: Record<string, VectorSvgWrapper[]> = {};\n\tconst routes: string[] = [];\n\tconst follows: { id: string; wrapper: string; routes: Map<string, string>; segments: MotionSegment[] }[] = [];\n\tconst usedIds = new Set(nodes.keys());\n\tconst freshId = (base: string) => {\n\t\tlet id = base;\n\t\tfor (let n = 2; usedIds.has(id); n++) id = `${base}-${n}`;\n\t\tusedIds.add(id);\n\t\treturn id;\n\t};\n\tfor (const id of animatedNodes) {\n\t\tconst entry = nodes.get(id)!;\n\t\tconst node = entry.node;\n\t\t// Wrappers only go round nodes that are drawn (a hidden node is left out of the SVG).\n\t\tconst drawn = [...entry.ancestors.map((a) => nodes.get(a)!.node), node].every((n) => n.visible !== false);\n\n\t\t// Reveal clips: a group clipped through a shape whose attributes change (outermost: it clips what the follow carries).\n\t\tfor (const [p, name] of [['clipRect', 'reveal'], ['clipCircle', 'iris']] as const) {\n\t\t\tif (!drawn || !timeline.tracks.has(motionTrackKey(id, p))) continue;\n\t\t\tconst wrapper = freshId(`${id}--${name}`);\n\t\t\tconst clipId = freshId(`${wrapper}-clip`);\n\t\t\tconst shapeId = freshId(`${wrapper}-clip-shape`);\n\t\t\tconst clipAt = (t: number) => motionNodeClips(id, timeline, t).find((c) => c.shape === (p === 'clipRect' ? 'rect' : 'circle'))!;\n\t\t\tconst rest = clipAt(0);\n\t\t\t(wrap[id] ??= []).push({ id: wrapper, clip: { id: clipId, shapeId, shape: rest.shape, attrs: motionClipAttrs(rest) } });\n\t\t\tchannels.push({ id: shapeId, kind: 'attrs', attrs: Object.keys(motionClipAttrs(rest)), segments: [...track(id, p)], exact: () => true, value: (t) => Object.values(motionClipAttrs(clipAt(t))).map((v) => Math.round(v * 1e4) / 1e4) });\n\t\t}\n\n\t\t// A follow: Flair's `along` carries a wrapper, and an inner one puts the node's centre on it.\n\t\tconst followSegments = track(id, 'follow');\n\t\tif (drawn && followSegments.length) {\n\t\t\tconst ids = new Map<string, string>();\n\t\t\tfor (const seg of followSegments) {\n\t\t\t\tif (!seg.path || ids.has(seg.path)) continue;\n\t\t\t\tconst route = motionFollowRoute(entry, nodes.get(seg.path));\n\t\t\t\tif (!route) continue;\n\t\t\t\tconst routeId = freshId(`${id}--follow-route`);\n\t\t\t\tids.set(seg.path, routeId);\n\t\t\t\troutes.push(`<path id=\"${routeId}\" d=\"${bezierPathToSvg(route, { precision })}\" fill=\"none\"/>`);\n\t\t\t}\n\t\t\tif (ids.size) {\n\t\t\t\tconst wrapper = freshId(`${id}--follow`);\n\t\t\t\tconst centre = freshId(`${id}--follow-centre`);\n\t\t\t\tconst c = entry.center;\n\t\t\t\t// Where the follow puts it at the start, for players that draw a still frame without `along`.\n\t\t\t\tconst at = motionNodeOffset(entry, timeline, 0, nodes)?.follow;\n\t\t\t\tconst placed = at ? `translate(${f(at.x)} ${f(at.y)})${at.angle ? ` rotate(${f(at.angle)})` : ''}` : undefined;\n\t\t\t\t(wrap[id] ??= []).push({ id: wrapper, ...(placed ? { transform: placed } : {}) }, { id: centre, transform: `translate(${f(-c.x)} ${f(-c.y)})` });\n\t\t\t\tfollows.push({ id, wrapper, routes: ids, segments: followSegments.filter((seg) => seg.path && ids.has(seg.path)) });\n\t\t\t}\n\t\t}\n\n\t\tif (timeline.tracks.has(motionTrackKey(id, 'opacity')))\n\t\t\tchannels.push({ id, kind: 'attr', attr: 'opacity', segments: [...track(id, 'opacity')], exact: plays, value: (t) => round(Math.min(1, Math.max(0, Number(trackValue(track(id, 'opacity'), t))))) });\n\n\t\t// The node's own moves, turns and scales (a follow is carried by its wrappers).\n\t\tconst followed = follows.some((x) => x.id === id);\n\t\t// Additive layers share the transform: alone in a stretch they are one change, overlapping the pose they are sampled.\n\t\tconst transformSegments = TRANSFORM_PROPS.flatMap((p) => (followed && p === 'follow' ? [] : [...track(id, p), ...(timeline.tracks.get(motionAddTrackKey(id, p)) ?? [])]));\n\t\tif (transformSegments.length) {\n\t\t\tconst base = node.transform ? ` matrix(${node.transform.map(f).join(' ')})` : '';\n\t\t\tconst c = entry.center;\n\t\t\tconst transformAt = (t: number, raw: boolean) => {\n\t\t\t\tconst o = motionNodeOffset(entry, timeline, t, nodes, raw, !followed)!;\n\t\t\t\treturn `translate(${f(o.dx)} ${f(o.dy)}) rotate(${f(o.rotation)} ${f(c.x)} ${f(c.y)}) translate(${f(c.x)} ${f(c.y)}) scale(${f(o.scaleX)} ${f(o.scaleY)}) translate(${f(-c.x)} ${f(-c.y)})${base}`;\n\t\t\t};\n\t\t\tchannels.push({\n\t\t\t\tid,\n\t\t\t\tkind: 'attr',\n\t\t\t\tattr: 'transform',\n\t\t\t\tsegments: transformSegments,\n\t\t\t\texact: (s) => LINEAR_TRANSFORM.has(s.property) && plays(s),\n\t\t\t\tovershoot: true,\n\t\t\t\t// x, y and the angle are the transform's numbers 0, 1 and 2 (`MotionSegment.index`).\n\t\t\t\tvalue: (t) => transformAt(t, false),\n\t\t\t\traw: (t) => transformAt(t, true)\n\t\t\t});\n\t\t}\n\n\t\t// Paint, width, fill fade and draw-on live on paths: a group's change goes to each path in it.\n\t\tconst paths = node.type === 'path' ? [node] : collectPathNodes(node);\n\t\tfor (const path of paths) {\n\t\t\tif (pathsSeen.has(path.id)) continue;\n\t\t\tpathsSeen.add(path.id);\n\t\t\tconst paint = (p: 'fill' | 'stroke', attr: string) => {\n\t\t\t\tconst from = owner(path, p);\n\t\t\t\tif (from) channels.push({ id: path.id, kind: 'attr', attr, segments: [...track(from, p)], exact: plays, value: (t) => hex6(trackValue(track(from, p), t)), raw: (t) => hex6(trackValue(track(from, p), t, true)) });\n\t\t\t};\n\t\t\tpaint('fill', 'fill');\n\t\t\tpaint('stroke', 'stroke');\n\t\t\tconst width = owner(path, 'strokeWidth');\n\t\t\tif (width) channels.push({ id: path.id, kind: 'attr', attr: 'stroke-width', segments: [...track(width, 'strokeWidth')], exact: () => true, value: (t) => round(Number(trackValue(track(width, 'strokeWidth'), t))) });\n\t\t\tconst fade = owner(path, 'fillOpacity');\n\t\t\tif (fade) channels.push({ id: path.id, kind: 'attr', attr: 'fill-opacity', segments: [...track(fade, 'fillOpacity')], exact: () => true, value: (t) => round(Number(trackValue(track(fade, 'fillOpacity'), t))) });\n\t\t\tconst draw = owner(path, 'drawEnd');\n\t\t\tif (draw) channels.push({ id: path.id, kind: 'draw', segments: [...track(draw, 'drawEnd')], exact: () => true, value: (t) => round(Math.min(1, Math.max(0, Number(trackValue(track(draw, 'drawEnd'), t))))) });\n\t\t\tif (owner(path, 'drawStart')) notes.push(`\"${path.id}\": drawing from a start other than 0 is not exported; Flair draws from the start of the path.`);\n\t\t}\n\n\t\t// Shape changes (morphs, live effect tweens) are sampled as the path's `d`.\n\t\tconst shapeSegments = [...timeline.tracks.entries()].filter(([k]) => k.startsWith(`${id}\\u0000`) && (k.endsWith('\\u0000shape') || k.includes('\\u0000effect:'))).flatMap(([, v]) => v);\n\t\tif (shapeSegments.length) {\n\t\t\tif (node.type !== 'path') notes.push(`\"${id}\" is a group: its morph or effect animation is not exported (Flair tweens one path's \"d\").`);\n\t\t\telse {\n\t\t\t\tconst inverse = invertMatrix(nodeMatrix(node));\n\t\t\t\tchannels.push({\n\t\t\t\t\tid,\n\t\t\t\t\tkind: 'attr',\n\t\t\t\t\tattr: 'd',\n\t\t\t\t\tsegments: shapeSegments,\n\t\t\t\t\texact: () => false,\n\t\t\t\t\tvalue: (t) => {\n\t\t\t\t\t\tconst frame = motionFrameAt(scene, t, { draw: false, offsets: false });\n\t\t\t\t\t\tconst now = expandVectorAppearance(indexMotionNodes(frame.document.nodes).get(id)?.node as VectorNode);\n\t\t\t\t\t\tif (!now || now.type !== 'path') return '';\n\t\t\t\t\t\tconst bezier = transformBezierPath(vectorPathWorldBezier(now, IDENTITY_MATRIX, { effects: false }), inverse);\n\t\t\t\t\t\treturn bezierPathToSvg(bezier, { precision: Math.min(precision, 2) });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst camera = track('', 'camera');\n\tif (camera.length) channels.push({ id: '', kind: 'view', segments: [...camera], exact: () => true, overshoot: true, value: (t) => (trackValue(camera, t) as number[]).map(round) });\n\n\tconst animate: FlairSvgAnimation[] = [];\n\tlet sampled = 0;\n\tconst same = (a: ChannelValue, b: ChannelValue) => JSON.stringify(a) === JSON.stringify(b);\n\tconst emit = (channel: Channel, delay: number, ms: number, from: ChannelValue, to: ChannelValue, ease: FlairEase, segment?: MotionSegment) => {\n\t\tconst written = writeEase(ease);\n\t\tconst base = {\n\t\t\t...(channel.id ? { id: channel.id } : {}),\n\t\t\t...(delay > 0 ? { delay: round(delay) } : {}),\n\t\t\tms: round(ms),\n\t\t\tease: written,\n\t\t\t...(segment?.behavior ? { behavior: segment.behavior } : {}),\n\t\t\t...(segment?.steps ? { strobe: segment.steps } : {})\n\t\t};\n\t\tif (channel.kind === 'view') animate.push({ ...base, view: to as unknown as [number, number, number, number] });\n\t\telse if (channel.kind === 'draw') animate.push({ ...base, draw: [from as number, to as number] });\n\t\telse if (channel.kind === 'attrs') {\n\t\t\t// Only the numbers that change (as Flair's clip reveals write them).\n\t\t\tconst [a, b] = [from as readonly number[], to as readonly number[]];\n\t\t\tconst attrs = Object.fromEntries(channel.attrs!.flatMap((name, k) => (a[k] !== b[k] ? [[name, [a[k], b[k]] as const]] : [])));\n\t\t\tanimate.push({ ...base, attrs });\n\t\t}\n\t\telse animate.push({ ...base, attrs: { [channel.attr!]: [from as string | number, to as string | number] } });\n\t};\n\n\tfor (const channel of channels) {\n\t\tconst cuts = channel.segments.filter((s) => s.end <= s.start);\n\t\tfor (const cut of cuts) {\n\t\t\tconst [from, to] = [channel.value(Math.max(0, cut.start - 1e-3)), channel.value(cut.start)];\n\t\t\t// A cut to where the value already is changes nothing (at 0 it sets the start, so it stays).\n\t\t\tif (cut.start <= 0 || !same(from, to) || channel.kind === 'view') emit(channel, cut.start, 0, from, to, 'linear');\n\t\t}\n\t\tconst times = [...new Set(channel.segments.flatMap((s) => [s.start, s.end]))].sort((a, b) => a - b);\n\t\tfor (let i = 0; i + 1 < times.length; i++) {\n\t\t\tconst a = times[i];\n\t\t\tconst b = times[i + 1];\n\t\t\tconst active = channel.segments.filter((s) => s.start < b && s.end > a);\n\t\t\tif (!active.length) continue;\n\t\t\t// One change when every active segment spans exactly this interval with one exact curve (a move's x and y, say).\n\t\t\tconst first = active[0];\n\t\t\t// A behaviour (pulse, shake, wriggle…) is one change toward the value it swings round, when every active segment shares it.\n\t\t\tconst key = (x: MotionSegment) => JSON.stringify([x.ease, x.behavior, x.reverse ?? false, x.steps ?? 0]);\n\t\t\tconst together = active.every((x) => x.start === a && x.end === b && channel.exact(x) && key(x) === key(first));\n\t\t\tconst curve = together ? easeOf(first) : undefined;\n\t\t\tconst ease = curve && (!overshoots(curve) || channel.overshoot) ? curve : undefined;\n\t\t\tif (ease) {\n\t\t\t\tconst from = channel.value(a);\n\t\t\t\tconst to = first.behavior ? (channel.raw ?? channel.value)(b) : channel.value(b);\n\t\t\t\tif (!same(from, to) || channel.kind === 'view') emit(channel, a, b - a, from, to, ease, first);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst n = Math.max(1, Math.ceil(((b - a) * fps) / 1000));\n\t\t\tlet prev = channel.value(a);\n\t\t\tfor (let k = 1; k <= n; k++) {\n\t\t\t\tconst t0 = a + ((b - a) * (k - 1)) / n;\n\t\t\t\tconst t1 = a + ((b - a) * k) / n;\n\t\t\t\tconst next = channel.value(t1);\n\t\t\t\tif (!same(prev, next)) {\n\t\t\t\t\temit(channel, t0, t1 - t0, prev, next, 'linear');\n\t\t\t\t\tsampled++;\n\t\t\t\t}\n\t\t\t\tprev = next;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Follows: one `along` per follow, sampled into linear steps only for curves Flair cannot play.\n\tfor (const follow of follows) {\n\t\tconst starts = follow.segments.map((seg) => seg.start);\n\t\tfor (const seg of follow.segments) {\n\t\t\tconst along = { id: follow.wrapper, along: follow.routes.get(seg.path!)!, ...(seg.rotate ? { orient: true } : {}) };\n\t\t\tconst progress = (t: number) => round(Math.min(1, Math.max(0, Number(segmentValue(seg, t)))));\n\t\t\tconst curve = seg.end > seg.start ? (plays(seg) ? easeOf(seg) : undefined) : 'linear';\n\t\t\t// Past the ends, Flair stops turning (its direction is measured either side of the point), so overshoots are sampled.\n\t\t\tif (curve && !(overshoots(curve) && seg.rotate)) {\n\t\t\t\tconst ends = seg.reverse ? [Number(seg.to), Number(seg.from)] : [Number(seg.from), Number(seg.to)];\n\t\t\t\tanimate.push({ ...along, ...(seg.start > 0 ? { delay: round(seg.start) } : {}), ms: round(seg.end - seg.start), ease: writeEase(curve), ...(seg.steps ? { strobe: seg.steps } : {}), at: [round(ends[0]), round(ends[1])] });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Sampled up to the next follow's start, which takes over there.\n\t\t\tconst until = Math.min(seg.end, ...starts.filter((t) => t > seg.start));\n\t\t\tconst n = Math.max(1, Math.ceil(((until - seg.start) * fps) / 1000));\n\t\t\tfor (let k = 1; k <= n; k++) {\n\t\t\t\tconst t0 = seg.start + ((until - seg.start) * (k - 1)) / n;\n\t\t\t\tconst t1 = seg.start + ((until - seg.start) * k) / n;\n\t\t\t\tanimate.push({ ...along, ...(t0 > 0 ? { delay: round(t0) } : {}), ms: round(t1 - t0), ease: 'linear', at: [progress(t0), progress(t1)] });\n\t\t\t\tsampled++;\n\t\t\t}\n\t\t}\n\t}\n\tanimate.sort((x, y) => (x.delay ?? 0) - (y.delay ?? 0));\n\n\t// The SVG: the artwork at rest, live effects drawn as plain paths so shapes can be tweened,\n\t// with the wrappers that reveals and follows animate, and the routes follows take.\n\tlet svg = vectorDocumentToSvg({ ...scene.artwork, nodes: expandVectorAppearances(scene.artwork.nodes) }, { pretty: false, precision, wrap });\n\tif (routes.length) svg = svg.replace(/^(<svg[^>]*>)/, `$1<defs>${routes.join('')}</defs>`);\n\tconst lastChange = animate.reduce((m, a) => Math.max(m, (a.delay ?? 0) + (a.ms ?? 0)), 0);\n\n\t// Controls: each stands for its default colour wherever it appears.\n\tlet motion: FlairSvgMotion = { svg, animate };\n\tif (scene.controls?.length) {\n\t\tconst declarations = scene.controls.map((c) => `{{${c.name}: color default=${c.default.toUpperCase()}${c.label ? ` label='${c.label.replace(/'/g, '’')}'` : ''}}}`).join(' ');\n\t\tconst swap = (text: string) => scene.controls!.reduce((s, c) => s.replace(new RegExp(`${c.default}(?![0-9a-fA-F])`, 'gi'), `{{${c.name}}}`), text);\n\t\tsvg = svg.replace(/^(<svg[^>]*>)/, `$1<!-- ${declarations} -->`);\n\t\tconst header = svg.indexOf('-->') + 3;\n\t\tsvg = svg.slice(0, header) + swap(svg.slice(header));\n\t\tmotion = { svg, animate: animate.map((a) => (a.attrs ? { ...a, attrs: Object.fromEntries(Object.entries(a.attrs).map(([k, [x, y]]) => [k, [typeof x === 'string' ? swap(x) : x, typeof y === 'string' ? swap(y) : y] as const])) } : a)) };\n\t}\n\treturn { motion, duration: timeline.duration, hold: Math.max(0, round(timeline.duration - lastChange)), sampled, notes: [...new Set(notes)] };\n}\n\nexport interface FlairEffectOptions extends FlairExportOptions {\n\t/** Kebab-case id (default: the scene's name). */\n\tid?: string;\n\tname?: string;\n\tdescription?: string;\n\t/** Flair catalog category (default `icon`). */\n\tcategory?: string;\n\ttags?: string[];\n\ttrigger?: FlairVectorEffect['trigger'];\n}\n\nconst kebab = (text: string) =>\n\ttext\n\t\t.trim()\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t.replace(/[^A-Za-z0-9]+/g, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.toLowerCase() || 'animation';\n\n/** A scene as a Flair catalog vector effect, with its colour controls and presets. */\nexport function toFlairVectorEffect(scene: MotionScene, options: FlairEffectOptions = {}): FlairVectorEffect {\n\tconst out = toFlairSvgMotion(scene, options);\n\treturn {\n\t\tkind: 'vector',\n\t\tid: options.id ?? kebab(scene.name),\n\t\tname: options.name ?? scene.name,\n\t\tdescription: options.description ?? scene.description ?? '',\n\t\tcategory: options.category ?? 'icon',\n\t\ttags: options.tags ?? [],\n\t\tmotion: out.motion,\n\t\thold: out.hold,\n\t\t...(scene.presets?.length ? { presets: scene.presets } : {}),\n\t\t...(options.trigger ? { trigger: options.trigger } : {})\n\t};\n}\n\n/** A scene as a document for Flair's `EffectEditor` (`replaceDocument`). */\nexport function toFlairEffectDocument(scene: MotionScene, options: FlairExportOptions = {}): FlairEffectDocument {\n\tconst out = toFlairSvgMotion(scene, options);\n\treturn {\n\t\tversion: 1,\n\t\tname: scene.name,\n\t\teffect: { kind: 'vector', motion: out.motion, hold: out.hold },\n\t\tvalues: Object.fromEntries((scene.controls ?? []).map((c) => [c.name, c.default])),\n\t\ttracks: {},\n\t\tduration: out.duration,\n\t\tloop: (scene.loop ?? 'none') !== 'none',\n\t\tpresets: scene.presets ?? []\n\t};\n}\n","import type { MotionBehavior } from '../animation/behavior.js';\nimport type { AnimationEasing } from '../animation/easing.js';\nimport { applyMatrix, invertMatrix, multiplyMatrices, nodeMatrix, type AffineMatrix } from '../vector/geometry.js';\nimport { parseSvgTransform, parseVectorSvg } from '../vector/svg.js';\nimport { checkMotionScene } from './check.js';\nimport { indexMotionNodes, MOTION_EASE_IN_OUT, MOTION_EASE_OUT, type MotionNodeEntry } from './compile.js';\nimport type { FlairEase, FlairSvgAnimation, FlairSvgMotion, FlairVectorEffect } from './flair.js';\nimport type { MotionIssue } from './issues.js';\nimport { motionSceneShapeProblems } from './parse.js';\nimport type { MotionCamera, MotionCommand, MotionControl, MotionScene, MotionShot } from './types.js';\n\n/**\n * Import from Flair: a Flair `SvgMotion` (or a catalog `VectorEffect`) becomes a scene, so an\n * effect made in Flair, or taken from its catalog, can be opened and edited here. The reverse\n * of `toFlairSvgMotion`, as far as the scene model goes:\n *\n * - The SVG becomes the artwork (`parseVectorSvg`); `{{name: color …}}` placeholders become\n * colour controls (other placeholders take their defaults).\n * - Each Flair step becomes a shot, its changes commands timed by their `delay`, all together.\n * - Opacity, paint, stroke width, transforms (as move, rotate and scale), drawing on, following\n * a path, camera views and behaviours (pulse, shake, teeter, wave, wiggle, colour pulse) carry\n * over. Counting, writing text, solo containers and anything else are listed in `notes`.\n */\n\nexport interface FlairImportResult {\n\tscene: MotionScene;\n\t/** What could not be carried over exactly, in sentences. */\n\tnotes: string[];\n\t/** `checkMotionScene` of the result. */\n\tissues: MotionIssue[];\n}\n\nexport interface FlairImportOptions {\n\t/** The scene's name (default: the effect's, else `from-flair`). */\n\tname?: string;\n\t/** Hold after the last shot, ms (default: the effect's `hold`, else 600). */\n\thold?: number;\n}\n\n/** A `{{name}}` placeholder or `{{name: type attributes}}` declaration, as Flair writes them. */\nconst PLACEHOLDER = /\\{\\{\\s*([A-Za-z_]\\w*)\\s*(?::\\s*([A-Za-z0-9]*)([^}]*))?\\}\\}/g;\n\nfunction attributeOf(attrs: string, name: string): string | undefined {\n\tconst m = new RegExp(`(?:^|\\\\s)${name}=(?:'([^']*)'|(\\\\S+))`).exec(attrs);\n\treturn m ? (m[1] ?? m[2]) : undefined;\n}\n\n/** Placeholders replaced by their defaults; colour declarations become controls. */\nfunction resolvePlaceholders(motion: FlairSvgMotion, notes: string[]): { motion: FlairSvgMotion; controls: MotionControl[] } {\n\tconst text = JSON.stringify(motion);\n\tconst declared = new Map<string, { type: string; value: string; label?: string }>();\n\tfor (const m of text.matchAll(PLACEHOLDER)) {\n\t\tif (!m[2] || declared.has(m[1])) continue;\n\t\tconst attrs = m[3] ?? '';\n\t\tconst value = attributeOf(attrs, 'default');\n\t\tconst fallback = m[2] === 'color' ? '#000000' : '0';\n\t\tdeclared.set(m[1], { type: m[2], value: m[2] === 'color' ? (value ?? fallback).toLowerCase() : (value ?? fallback), ...(attributeOf(attrs, 'label') ? { label: attributeOf(attrs, 'label') } : {}) });\n\t}\n\tconst controls: MotionControl[] = [];\n\tfor (const [name, d] of declared) {\n\t\tif (d.type === 'color' && /^#[0-9a-fA-F]{6}$/.test(d.value)) controls.push({ name, type: 'color', default: d.value.toLowerCase(), ...(d.label ? { label: d.label } : {}) });\n\t\telse notes.push(`Control \"${name}\" (${d.type}) is fixed at its default ${d.value}: scenes take colour controls only.`);\n\t}\n\tconst unknown = new Set<string>();\n\tconst filled = text.replace(PLACEHOLDER, (_, name: string) => {\n\t\tconst d = declared.get(name);\n\t\tif (!d) unknown.add(name);\n\t\treturn (d?.value ?? '').replace(/\"/g, '\\\\\"');\n\t});\n\tfor (const name of unknown) notes.push(`Placeholder \"{{${name}}}\" has no declaration, so it was left empty.`);\n\t// SVG comments (where Flair declares controls) are dropped with the markup's comments.\n\treturn { motion: JSON.parse(filled) as FlairSvgMotion, controls };\n}\n\n/** A Flair ease as an editor easing. Flair's `in-out` is a cubic polynomial, close to the editor's ease-in-out curve. */\nfunction easingOf(ease: FlairEase | undefined, fallback: AnimationEasing): AnimationEasing {\n\tif (ease === undefined) return fallback;\n\tif (ease === 'linear') return 'linear';\n\tif (ease === 'out') return MOTION_EASE_OUT;\n\tif (ease === 'in-out') return MOTION_EASE_IN_OUT;\n\tif (Array.isArray(ease)) return { type: 'cubic-bezier', x1: ease[0], y1: ease[1], x2: ease[2], y2: ease[3] };\n\tif (typeof ease === 'object' && 'spring' in ease) return { type: 'spring', ...ease.spring };\n\treturn fallback;\n}\n\ninterface Pose {\n\tdx: number;\n\tdy: number;\n\trotation: number;\n\tsx: number;\n\tsy: number;\n}\n\n/** A Flair transform value as the editor's offset from the node's rest (move, turn and scale about its centre), or null when it skews. */\nfunction poseOf(value: string | number, entry: MotionNodeEntry): Pose | null {\n\tconst t = parseSvgTransform(String(value));\n\tconst o: AffineMatrix = multiplyMatrices(invertMatrix(nodeMatrix(entry.node)) ?? [1, 0, 0, 1, 0, 0], t);\n\tconst sx = Math.hypot(o[0], o[1]);\n\tif (!(sx > 1e-9)) return null;\n\tconst sy = (o[0] * o[3] - o[1] * o[2]) / sx;\n\t// No skew: the second column is the first turned a quarter, times sy.\n\tif (Math.abs(o[2] + (o[1] / sx) * sy) > 1e-6 || Math.abs(o[3] - (o[0] / sx) * sy) > 1e-6) return null;\n\tconst c = entry.center;\n\tconst moved = applyMatrix(o, c);\n\treturn { dx: moved.x - c.x, dy: moved.y - c.y, rotation: (Math.atan2(o[1], o[0]) * 180) / Math.PI, sx, sy };\n}\n\nconst near = (a: number, b: number, eps = 1e-6) => Math.abs(a - b) < eps;\nconst r3 = (n: number) => Math.round(n * 1000) / 1000;\n\n/** One Flair change as commands (all starting together), or a note on why it is skipped. */\nfunction commandsFor(anim: FlairSvgAnimation, nodes: Map<string, MotionNodeEntry>, entered: Set<string>, notes: string[]): MotionCommand[] {\n\tconst id = anim.id!;\n\tconst entry = nodes.get(id);\n\tconst where = `\"${id}\"`;\n\tif (!entry) {\n\t\tnotes.push(`A change to ${where} was skipped: the artwork has no element with that id.`);\n\t\treturn [];\n\t}\n\tconst targets = [id];\n\tconst duration = anim.ms ?? 800;\n\tconst timing = {\n\t\tduration,\n\t\t...(anim.strobe ? { steps: anim.strobe } : {}),\n\t\t...(anim.repeat && anim.repeat > 1 ? { repeat: anim.repeat, ...(anim.alternate ? { repeatMode: 'mirror' as const } : {}) } : {})\n\t};\n\tconst ease = (fallback: AnimationEasing) => ({ ease: easingOf(anim.ease, fallback) });\n\tconst out: MotionCommand[] = [];\n\tconst behavior: MotionBehavior | undefined = anim.behavior;\n\tconst unsupported = (['count', 'write', 'scramble', 'solo'] as const).filter((k) => (anim as Record<string, unknown>)[k] !== undefined);\n\tif (unsupported.length) notes.push(`${where}: ${unsupported.join(', ')} ${unsupported.length > 1 ? 'are' : 'is'} not part of scenes and was skipped.`);\n\n\tif (anim.draw !== undefined && anim.draw !== false) {\n\t\tconst [from, to] = anim.draw === true ? [0, 1] : anim.draw;\n\t\tout.push({ type: 'draw', targets, from, to, ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t}\n\tif (anim.along) {\n\t\tconst path = nodes.get(anim.along);\n\t\tif (!path || path.node.type !== 'path') notes.push(`${where} follows \"${anim.along}\", which is not a path in the artwork; the follow was skipped.`);\n\t\telse out.push({ type: 'follow', targets, path: anim.along, from: anim.at?.[0] ?? 0, to: anim.at?.[1] ?? 1, ...(anim.orient ? { rotate: true } : {}), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t}\n\tfor (const [attr, [a, b]] of Object.entries(anim.attrs ?? {})) {\n\t\tif (attr === 'opacity') {\n\t\t\tconst [from, to] = [Number(a), Number(b)];\n\t\t\tif (behavior) notes.push(`${where}: an opacity ${behavior.type} became a plain fade.`);\n\t\t\tif (from === 0 && to > 0 && !entered.has(id)) {\n\t\t\t\tentered.add(id);\n\t\t\t\tout.push({ type: 'enter', targets, style: 'fade', ...timing, ...ease(MOTION_EASE_OUT) });\n\t\t\t} else out.push({ type: 'fade', targets, to: Math.min(1, Math.max(0, to)), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t\t} else if (attr === 'fill' || attr === 'stroke') {\n\t\t\tif (behavior?.type === 'pulse') out.push({ type: 'color-pulse', targets, color: String(b), paint: attr, count: behavior.count ?? 1, ...timing, ...ease('linear') });\n\t\t\telse {\n\t\t\t\tif (behavior) notes.push(`${where}: a ${attr} ${behavior.type} became a plain colour change.`);\n\t\t\t\tout.push({ type: 'style', targets, [attr]: String(b), ...timing, ...ease(MOTION_EASE_IN_OUT) } as MotionCommand);\n\t\t\t}\n\t\t} else if (attr === 'stroke-width') {\n\t\t\tout.push({ type: 'style', targets, strokeWidth: Number(b), ...timing, ...ease(MOTION_EASE_IN_OUT) });\n\t\t} else if (attr === 'transform') {\n\t\t\tconst p0 = poseOf(a, entry);\n\t\t\tconst p1 = poseOf(b, entry);\n\t\t\tif (!p0 || !p1) {\n\t\t\t\tnotes.push(`${where}: a transform that skews was skipped (scenes move, turn and scale).`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst d = { x: r3(p1.dx - p0.dx), y: r3(p1.dy - p0.dy), r: r3(p1.rotation - p0.rotation), sx: p1.sx / p0.sx, sy: p1.sy / p0.sy };\n\t\t\tif (behavior) {\n\t\t\t\tconst linear = ease('linear');\n\t\t\t\tconst moves = d.x !== 0 || d.y !== 0;\n\t\t\t\tconst turns = d.r !== 0;\n\t\t\t\tconst scales = !near(d.sx, 1) || !near(d.sy, 1);\n\t\t\t\tif (behavior.type === 'pulse' && scales && !moves && !turns) out.push({ type: 'pulse', targets, amount: r3(d.sx - 1), count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && (behavior.decay ?? 0) > 0 && turns && !moves && !scales) out.push({ type: 'teeter', targets, angle: d.r, count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && (behavior.decay ?? 0) > 0 && moves && !turns && !scales && (d.x === 0 || d.y === 0))\n\t\t\t\t\tout.push({ type: 'shake', targets, amount: d.x || d.y, count: behavior.count ?? 1, ...(d.x === 0 ? { axis: 'vertical' as const } : {}), ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'oscillate' && !behavior.decay && d.x === 0 && d.y !== 0 && !turns && !scales) out.push({ type: 'wave', targets, amount: -d.y, count: behavior.count ?? 1, ...timing, ...linear });\n\t\t\t\telse if (behavior.type === 'wriggle' && !scales)\n\t\t\t\t\tout.push({ type: 'wiggle', targets, amount: Math.max(Math.abs(d.x), Math.abs(d.y)), ...(turns ? { rotate: Math.abs(d.r) } : {}), frequency: behavior.frequency ?? 2, octaves: behavior.octaves ?? 2, seed: behavior.seed ?? 42, ...timing, ...linear });\n\t\t\t\telse notes.push(`${where}: a transform ${behavior.type} that is not a pulse, shake, teeter, wave or wiggle was skipped.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst e = ease(MOTION_EASE_IN_OUT);\n\t\t\tif (d.x !== 0 || d.y !== 0) out.push({ type: 'move', targets, by: { x: d.x, y: d.y }, ...timing, ...e });\n\t\t\tif (d.r !== 0) out.push({ type: 'rotate', targets, to: r3(p1.rotation), ...timing, ...e });\n\t\t\tif (!near(d.sx, 1) || !near(d.sy, 1)) out.push({ type: 'scale', targets, to: near(p1.sx, p1.sy) ? r3(p1.sx) : { x: r3(p1.sx), y: r3(p1.sy) }, ...timing, ...e });\n\t\t} else notes.push(`${where}: changing \"${attr}\" is not part of scenes and was skipped.`);\n\t}\n\treturn out;\n}\n\n/** A Flair `SvgMotion` as a scene (see the module notes for what carries over). */\nexport function fromFlairSvgMotion(input: FlairSvgMotion, options: FlairImportOptions = {}): FlairImportResult {\n\tconst notes: string[] = [];\n\tif (!input || typeof input.svg !== 'string') throw new Error('Give a Flair SvgMotion: { svg: \"<svg …>\", animate: [ … ] }.');\n\tconst { motion, controls } = resolvePlaceholders(input, notes);\n\tconst artwork = parseVectorSvg(motion.svg);\n\tconst nodes = indexMotionNodes(artwork.nodes);\n\tconst byStep = new Map<number, FlairSvgAnimation[]>();\n\tfor (const anim of motion.animate ?? []) {\n\t\tconst step = Math.max(0, Math.floor(anim.step ?? 0));\n\t\tif (!byStep.has(step)) byStep.set(step, []);\n\t\tbyStep.get(step)!.push(anim);\n\t}\n\tconst steps = [...byStep.keys()].sort((a, b) => a - b);\n\tif (steps.length > 1) notes.push('Each Flair step became a shot played after the one before (Flair steps wait for clicks or set times).');\n\tconst entered = new Set<string>();\n\tconst shots: MotionShot[] = steps.map((step, index) => {\n\t\tconst anims = [...byStep.get(step)!].sort((a, b) => (a.delay ?? 0) - (b.delay ?? 0));\n\t\tlet camera: MotionCamera | undefined;\n\t\tlet cameraMs = 0;\n\t\tconst run: MotionCommand[] = [];\n\t\tlet last = 0;\n\t\tfor (const anim of anims) {\n\t\t\tif (anim.view !== undefined) {\n\t\t\t\tif (camera || (anim.delay ?? 0) > 0) {\n\t\t\t\t\tnotes.push(`Step ${step}: a camera move ${camera ? 'after the first' : `${anim.delay} ms in`} was dropped; a shot frames the camera once, at its start.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ms = anim.ms ?? 800;\n\t\t\t\tconst ease = easingOf(anim.ease, MOTION_EASE_IN_OUT);\n\t\t\t\tcamera = typeof anim.view === 'string' ? { frame: anim.view, padding: 0, ms, ease } : { x: anim.view[0], y: anim.view[1], width: anim.view[2], height: anim.view[3], ms, ease };\n\t\t\t\tcameraMs = index === 0 ? 0 : ms;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!anim.id) continue;\n\t\t\t// A shot's commands start after its camera move: earlier changes are pushed back to it.\n\t\t\tconst at = Math.max(0, (anim.delay ?? 0) - cameraMs);\n\t\t\tif (cameraMs && (anim.delay ?? 0) < cameraMs) notes.push(`Step ${step}: a change to \"${anim.id}\" during the camera move now starts after it.`);\n\t\t\tfor (const command of commandsFor(anim, nodes, entered, notes)) {\n\t\t\t\tconst first = run.length === 0;\n\t\t\t\trun.push({ ...command, ...(first ? {} : { with: 'previous' as const }), ...(at - last > 0 || first ? { delay: first ? at : at - last } : {}) } as MotionCommand);\n\t\t\t\tif (first && at === 0) delete (run[run.length - 1] as { delay?: number }).delay;\n\t\t\t\tlast = at;\n\t\t\t}\n\t\t}\n\t\treturn { id: `step-${step}`, ...(camera ? { camera } : {}), run, ...(index === steps.length - 1 ? { hold: options.hold ?? 600 } : {}) };\n\t});\n\tconst scene: MotionScene = { version: 1, name: options.name ?? 'from-flair', artwork, shots, ...(controls.length ? { controls } : {}) };\n\tconst problems = motionSceneShapeProblems(scene);\n\tif (problems.length) throw new Error(`The imported scene is not well formed:\\n${problems.join('\\n')}`);\n\treturn { scene, notes: [...new Set(notes)], issues: checkMotionScene(scene) };\n}\n\n/** A Flair catalog `VectorEffect` as a scene: its motion, name, description, colour controls and presets. */\nexport function fromFlairVectorEffect(effect: FlairVectorEffect, options: FlairImportOptions = {}): FlairImportResult {\n\tif (!effect || effect.kind !== 'vector' || !effect.motion) throw new Error('Give a Flair vector effect: { kind: \"vector\", id, name, motion: { svg, animate } }.');\n\tconst result = fromFlairSvgMotion(effect.motion, { name: options.name ?? effect.id ?? effect.name, hold: options.hold ?? effect.hold });\n\tconst names = new Set((result.scene.controls ?? []).map((c) => c.name));\n\tconst presets = (effect.presets ?? []).map((p) => ({ name: p.name, values: Object.fromEntries(Object.entries(p.values).filter(([k]) => names.has(k))) })).filter((p) => Object.keys(p.values).length);\n\tconst scene: MotionScene = { ...result.scene, ...(effect.description ? { description: effect.description } : {}), ...(presets.length ? { presets } : {}) };\n\tconst notes = [...result.notes];\n\tif (effect.trigger) notes.push(`The effect plays on ${effect.trigger}; scenes play through, so the trigger is not kept (pass it back to toFlairVectorEffect).`);\n\treturn { scene, notes, issues: checkMotionScene(scene) };\n}\n","import type { Clock } from '../animation/clock.js';\nimport type { AnimationLoopMode } from '../animation/evaluate.js';\nimport { AnimationPlayer } from '../animation/player.js';\nimport { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command } from '../history/types.js';\nimport type { VectorDocument } from '../vector/types.js';\nimport { checkMotionScene } from './check.js';\nimport { compileMotionScene, motionShotAt, type MotionShotTiming } from './compile.js';\nimport { applyMotionEdits, createMotionScene, type MotionEdit, type MotionEditResult } from './edit.js';\nimport { motionFrameAt, motionFrameToSvg, type MotionFrame, type MotionFrameOptions, type MotionSvgOptions } from './evaluate.js';\nimport { toFlairEffectDocument, toFlairSvgMotion, toFlairVectorEffect, type FlairEffectOptions, type FlairExportOptions } from './flair.js';\nimport type { MotionIssue } from './issues.js';\nimport { parseMotionScene } from './parse.js';\nimport type { MotionScene } from './types.js';\n\nexport interface AnimationEditorOptions {\n\t/** The scene to open (default: an empty one over a blank 800 × 450 artwork). */\n\tscene?: MotionScene;\n\t/** Shared undo history (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Time source for playback (default: requestAnimationFrame). Pass a `ManualClock` to step frames. */\n\tclock?: Clock;\n\treadOnly?: boolean;\n\t/** Called after every change to the scene (not on playback or selection). */\n\tonChange?: (scene: MotionScene) => void;\n}\n\n/** What is selected on the timeline: a shot, and optionally one of its commands. */\nexport interface AnimationEditorSelection {\n\tshot: string;\n\tcommand?: number;\n}\n\n/** A snapshot of the editor. The same object is returned until something changes. */\nexport interface AnimationEditorState {\n\tscene: MotionScene;\n\t/** Total length (ms). */\n\tduration: number;\n\t/** Each shot's timing. */\n\tshots: readonly MotionShotTiming[];\n\t/** The scene's problems (see `checkMotionScene`). */\n\tissues: readonly MotionIssue[];\n\t/** Playhead (ms). */\n\ttime: number;\n\tplaying: boolean;\n\tloop: AnimationLoopMode;\n\t/** Id of the shot under the playhead. */\n\tcurrentShot: string | null;\n\tselection: AnimationEditorSelection | null;\n\treadOnly: boolean;\n\t/** Why the last edit was refused, if it was. */\n\terror: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nconst BLANK: VectorDocument = { width: 800, height: 450, background: '#ffffff', nodes: [] };\n\n/**\n * Headless editor for a vector animation (a `MotionScene`): undoable, all-or-nothing edits,\n * playback on an injectable clock, a timeline selection and frames at any time. UI-agnostic:\n * React and Svelte bind it with `useAnimationEditor` / `createAnimationEditor`, and agents\n * drive it through `createAnimationEditorToolProvider`. `getState()` returns the same object\n * until something changes, so it works with `useSyncExternalStore` and Svelte runes.\n */\nexport class AnimationEditorController {\n\treadonly history: HistoryManager;\n\treadonly player: AnimationPlayer;\n\tprivate scene: MotionScene;\n\tprivate issues: MotionIssue[];\n\tprivate selection: AnimationEditorSelection | null = null;\n\tprivate readOnly: boolean;\n\tprivate error: string | null = null;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate readonly onChange?: (scene: MotionScene) => void;\n\tprivate readonly listeners = new Set<(state: AnimationEditorState) => void>();\n\tprivate readonly unsubscribers: (() => void)[] = [];\n\tprivate state!: AnimationEditorState;\n\n\tconstructor(options: AnimationEditorOptions = {}) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.scene = options.scene ? parseMotionScene(options.scene) : createMotionScene(BLANK);\n\t\tthis.issues = checkMotionScene(this.scene);\n\t\tthis.readOnly = options.readOnly ?? false;\n\t\tthis.onChange = options.onChange;\n\t\tthis.player = new AnimationPlayer({ clock: options.clock, duration: () => compileMotionScene(this.scene).duration, loop: this.scene.loop ?? 'none' });\n\t\tthis.state = this.computeState();\n\t\tthis.connect();\n\t}\n\n\tprivate connect() {\n\t\tif (this.unsubscribers.length) return;\n\t\tthis.unsubscribers.push(\n\t\t\tthis.player.subscribe(() => this.notify()),\n\t\t\tthis.history.subscribe(() => {\n\t\t\t\tif (!this.applying) this.notify();\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Pauses and stops listening to the player and history. Subscribing again reconnects, so a\n\t * controller survives React StrictMode's unmount / remount.\n\t */\n\tdestroy(): void {\n\t\tthis.player.pause();\n\t\tthis.unsubscribers.splice(0).forEach((u) => u());\n\t}\n\n\tgetState = (): AnimationEditorState => this.state;\n\n\tsubscribe = (listener: (state: AnimationEditorState) => void): (() => void) => {\n\t\tthis.connect();\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\t/** The current scene (immutable; edit through the controller). */\n\tgetScene(): MotionScene {\n\t\treturn this.scene;\n\t}\n\n\tprivate computeState(): AnimationEditorState {\n\t\tconst timeline = compileMotionScene(this.scene);\n\t\tconst p = this.player.getState();\n\t\tconst h = this.history.getState();\n\t\treturn {\n\t\t\tscene: this.scene,\n\t\t\tduration: timeline.duration,\n\t\t\tshots: timeline.shots,\n\t\t\tissues: this.issues,\n\t\t\ttime: p.time,\n\t\t\tplaying: p.playing,\n\t\t\tloop: p.loop,\n\t\t\tcurrentShot: motionShotAt(timeline, p.time)?.id ?? null,\n\t\t\tselection: this.selection,\n\t\t\treadOnly: this.readOnly,\n\t\t\terror: this.error,\n\t\t\tcanUndo: h.canUndo,\n\t\t\tcanRedo: h.canRedo,\n\t\t\tundoLabel: h.undoName,\n\t\t\tredoLabel: h.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify() {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[AnimationEditorController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setScene(scene: MotionScene) {\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tthis.scene = scene;\n\t\t\tthis.issues = checkMotionScene(scene);\n\t\t\tif (this.selection) {\n\t\t\t\tconst shot = scene.shots.find((s) => s.id === this.selection!.shot);\n\t\t\t\tif (!shot) this.selection = null;\n\t\t\t\telse if (this.selection.command !== undefined && this.selection.command >= shot.run.length) this.selection = { shot: shot.id };\n\t\t\t}\n\t\t\tthis.player.setLoop(scene.loop ?? 'none');\n\t\t\tthis.player.setDuration(() => compileMotionScene(this.scene).duration);\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify();\n\t\tthis.onChange?.(scene);\n\t}\n\n\tprivate commit(label: string, next: MotionScene) {\n\t\tconst before = this.scene;\n\t\tthis.error = null;\n\t\tif (next === before) {\n\t\t\tthis.notify();\n\t\t\treturn;\n\t\t}\n\t\tconst command: Command = {\n\t\t\tname: label,\n\t\t\ttag: 'animation-editor',\n\t\t\texecute: () => this.setScene(next),\n\t\t\tundo: () => this.setScene(before),\n\t\t\tredo: () => this.setScene(next)\n\t\t};\n\t\tthis.history.execute(command);\n\t}\n\n\tprivate refuse(message: string): MotionEditResult {\n\t\tthis.error = message;\n\t\tthis.notify();\n\t\treturn { ok: false, error: message };\n\t}\n\n\t/** Why edits are refused now, or `null` when they are allowed. */\n\treadOnlyReason(): string | null {\n\t\treturn this.readOnly ? 'The animation is read-only.' : null;\n\t}\n\n\t/**\n\t * Applies edits as one undo step, all or nothing (see `applyMotionEdits`). With\n\t * `dryRun` it reports what would happen and changes nothing.\n\t */\n\tapply(edits: MotionEdit | readonly MotionEdit[], label = 'Edit animation', options: { dryRun?: boolean } = {}): MotionEditResult {\n\t\tconst reason = this.readOnlyReason();\n\t\tif (reason) return this.refuse(reason);\n\t\tconst result = applyMotionEdits(this.scene, edits);\n\t\tif (!result.ok) return options.dryRun ? result : this.refuse(result.error);\n\t\tif (!options.dryRun) this.commit(label, result.scene);\n\t\treturn result;\n\t}\n\n\t/** Replaces the artwork (e.g. from a vector editor's `onChange`), as one undo step. */\n\tsetArtwork(artwork: VectorDocument, label = 'Change artwork'): MotionEditResult {\n\t\treturn this.apply({ op: 'set_artwork', artwork }, label);\n\t}\n\n\t/** Opens a scene (JSON or object). `clearHistory` drops the undo stack (opening a file); otherwise it is one undo step. */\n\tload(scene: MotionScene | string, options: { clearHistory?: boolean } = {}): MotionEditResult {\n\t\tlet parsed: MotionScene;\n\t\ttry {\n\t\t\tparsed = parseMotionScene(scene);\n\t\t} catch (error) {\n\t\t\treturn this.refuse((error as Error).message);\n\t\t}\n\t\tif (options.clearHistory) {\n\t\t\tthis.history.clear();\n\t\t\tthis.error = null;\n\t\t\tthis.selection = null;\n\t\t\tthis.setScene(parsed);\n\t\t\tthis.player.seek(0);\n\t\t\treturn { ok: true, scene: parsed, issues: this.issues, hints: [] };\n\t\t}\n\t\treturn this.apply({ op: 'replace_scene', scene: parsed }, 'Replace animation');\n\t}\n\n\tsetReadOnly(readOnly: boolean): void {\n\t\tif (this.readOnly === readOnly) return;\n\t\tthis.readOnly = readOnly;\n\t\tthis.notify();\n\t}\n\n\t/** Selects a shot (and optionally a command in it); `null` clears. Unknown shots clear. */\n\tselect(selection: AnimationEditorSelection | null): void {\n\t\tconst shot = selection && this.scene.shots.find((s) => s.id === selection.shot);\n\t\tconst next = shot ? { shot: shot.id, ...(selection!.command !== undefined && selection!.command < shot.run.length ? { command: selection!.command } : {}) } : null;\n\t\tif (JSON.stringify(next) === JSON.stringify(this.selection)) return;\n\t\tthis.selection = next;\n\t\tthis.notify();\n\t}\n\n\tplay(): void {\n\t\tthis.player.play();\n\t}\n\n\tpause(): void {\n\t\tthis.player.pause();\n\t}\n\n\ttoggle(): void {\n\t\tthis.player.toggle();\n\t}\n\n\t/** Moves the playhead (ms). */\n\tseek(time: number): void {\n\t\tthis.player.seek(time);\n\t}\n\n\t/** Moves the playhead to the start or end of a shot. Returns false for an unknown shot. */\n\tseekShot(id: string, at: 'start' | 'end' = 'start'): boolean {\n\t\tconst shot = compileMotionScene(this.scene).shots.find((s) => s.id === id);\n\t\tif (!shot) return false;\n\t\tthis.player.seek(at === 'start' ? shot.start : shot.end);\n\t\treturn true;\n\t}\n\n\tundo(): boolean {\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\treturn this.history.redo();\n\t}\n\n\t/** The scene at `time` (default: the playhead). */\n\tframe(time = this.player.currentTime, options: MotionFrameOptions = {}): MotionFrame {\n\t\treturn motionFrameAt(this.scene, time, options);\n\t}\n\n\t/** The scene at `time` (default: the playhead) as SVG. */\n\ttoSvg(time = this.player.currentTime, options: MotionSvgOptions = {}): string {\n\t\treturn motionFrameToSvg(this.scene, time, options);\n\t}\n\n\t/** The scene as a Flair `SvgMotion`. */\n\ttoFlairMotion(options: FlairExportOptions = {}) {\n\t\treturn toFlairSvgMotion(this.scene, options);\n\t}\n\n\t/** The scene as a Flair catalog vector effect. */\n\ttoFlairEffect(options: FlairEffectOptions = {}) {\n\t\treturn toFlairVectorEffect(this.scene, options);\n\t}\n\n\t/** The scene as a Flair `EffectDocument`. */\n\ttoFlairDocument(options: FlairExportOptions = {}) {\n\t\treturn toFlairEffectDocument(this.scene, options);\n\t}\n}\n","import { ANIMATION_EASING_PRESETS } from '../animation/easing.js';\nimport type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport { parseVectorSvg } from '../vector/svg.js';\nimport type { VectorNode } from '../vector/types.js';\nimport { compileMotionScene, indexMotionNodes, motionBeatAt, motionBeatTime } from './compile.js';\nimport { fitMotionScene } from './fit.js';\nimport { fromFlairSvgMotion, fromFlairVectorEffect, type FlairImportResult } from './flair-import.js';\nimport type { AnimationEditorController } from './controller.js';\nimport { MOTION_EDIT_OPS, type MotionEdit, type MotionEditResult } from './edit.js';\nimport { motionIssueLine, type MotionIssue } from './issues.js';\nimport { MOTION_COMMAND_TYPES, MOTION_DIRECTIONS, MOTION_ENTER_STYLES, MOTION_EXIT_STYLES, MOTION_IRIS_SHAPES, MOTION_REPEAT_MODES, MOTION_BLENDS, MOTION_SPLIT_ORIENTATIONS, motionFlairPrimitive, type MotionScene } from './types.js';\n\nexport interface AnimationEditorToolProviderOptions {\n\t/** Provider id (unique per registry). Default `animation`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/** The animation cannot be edited: write tools are hidden and `get_animation` says why. A string is the reason. */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** Turns SVG into PNG (e.g. `rasterizeSvg`), so `render_animation_frame` can return an image. */\n\trasterize?: (svg: string, size: { width: number; height: number }) => Promise<{ data: string; mimeType: string }> | { data: string; mimeType: string };\n}\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false } as const;\nconst WRITE_IDEMPOTENT = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst object = (properties: Record<string, JsonSchema>, required: string[] = [], description?: string): JsonSchema & { type: 'object' } => ({\n\ttype: 'object' as const,\n\t...(description ? { description } : {}),\n\tproperties,\n\t...(required.length ? { required } : {}),\n\tadditionalProperties: false\n});\n\nconst SHOT_ID = { type: 'string', minLength: 1, description: 'A shot id from get_animation (e.g. \"intro\").' } as const;\nconst NODE_IDS = { type: 'array', items: { type: 'string', minLength: 1 }, minItems: 1, description: 'Node ids from get_animation\\'s \"elements\" (a group animates as one).' } as const;\nconst MS = (what: string) => ({ type: 'number', minimum: 0, description: `${what} in milliseconds.` }) as const;\nconst FRACTION = (what: string) => ({ type: 'number', minimum: 0, maximum: 1, description: what }) as const;\nconst POINT = (what: string) => object({ x: { type: 'number', description: 'Document units.' }, y: { type: 'number', description: 'Document units.' } }, ['x', 'y'], what);\nconst EASE: JsonSchema = {\n\tdescription: `Easing: a preset (${ANIMATION_EASING_PRESETS.join(', ')}), { \"type\": \"cubic-bezier\", \"x1\", \"y1\", \"x2\", \"y2\" }, { \"type\": \"spring\", … } or { \"type\": \"elastic\", … }. The spring presets are Figma's: gentle, quick, bouncy, slow. A command with a spring and no \"duration\" lasts until the spring settles. Default: a cubic ease-out for entrances, cubic ease-in-out for moves.`,\n\tanyOf: [\n\t\t{ type: 'string', enum: [...ANIMATION_EASING_PRESETS] },\n\t\tobject({ type: { const: 'cubic-bezier', description: 'Curve kind.' }, x1: { type: 'number', description: 'Out handle x (0–1).' }, y1: { type: 'number', description: 'Out handle y.' }, x2: { type: 'number', description: 'In handle x (0–1).' }, y2: { type: 'number', description: 'In handle y.' } }, ['type', 'x1', 'y1', 'x2', 'y2']),\n\t\tobject(\n\t\t\t{\n\t\t\t\ttype: { const: 'spring', description: 'A damped spring (may overshoot).' },\n\t\t\t\tstiffness: { type: 'number', exclusiveMinimum: 0, description: 'Stiffness (default 170; quick 300, bouncy 600).' },\n\t\t\t\tdamping: { type: 'number', minimum: 0, description: 'Damping (default 26; lower bounces more).' },\n\t\t\t\tmass: { type: 'number', exclusiveMinimum: 0, description: 'Mass (default 1).' },\n\t\t\t\tvelocity: { type: 'number', description: 'Starting speed, in changes per second (default 0).' }\n\t\t\t},\n\t\t\t['type']\n\t\t),\n\t\tobject(\n\t\t\t{\n\t\t\t\ttype: { const: 'elastic', description: 'A decaying wobble.' },\n\t\t\t\tamplitude: { type: 'number', minimum: 0, description: 'Overshoot factor (default 1).' },\n\t\t\t\tperiod: { type: 'number', exclusiveMinimum: 0, description: 'Wobble period as a fraction of the length (default 0.3).' },\n\t\t\t\tmode: { type: 'string', enum: ['out', 'in', 'in-out'], description: 'Where it wobbles (default out).' }\n\t\t\t},\n\t\t\t['type']\n\t\t)\n\t]\n};\n\nconst BASE: Record<string, JsonSchema> = {\n\ttargets: NODE_IDS,\n\tduration: MS('Length for each target (each type has a default; draw follows the path length)'),\n\tdelay: MS('Wait before starting (default 0)'),\n\tstagger: MS('Start each further target this much later (default 0)'),\n\twith: { type: 'string', enum: ['after', 'previous'], description: '\"after\" (default) starts when the commands before it finish; \"previous\" starts together with the command before.' },\n\tease: EASE,\n\tnote: { type: 'string', description: 'Why this command is here, in a few words.' },\n\trepeat: { type: 'integer', minimum: 1, maximum: 1000, description: 'Play it this many times (default 1); \"duration\" is one cycle. Not for enter or exit.' },\n\trepeatMode: { type: 'string', enum: [...MOTION_REPEAT_MODES], description: 'loop (default) restarts each cycle, mirror plays every other one backwards, offset carries on from where the last ended (rotate by 90 with repeat 4 makes a full turn).' },\n\tsteps: { type: 'number', exclusiveMinimum: 0, maximum: 120, description: 'Stepped time: hold on a grid of this many frames per second (12 = \"on twos\"). Default: the scene\\'s steps, else smooth.' }\n};\nconst BLEND = (fallback: 'replace' | 'add'): JsonSchema => ({\n\ttype: 'string',\n\tenum: [...MOTION_BLENDS],\n\tdescription: `\"add\" makes it a layer over the pose that stacks with other changes (a shake on a slide); \"replace\" makes it a change the next one takes over from (default ${fallback}).`\n});\nconst command = (type: string, description: string, extra: Record<string, JsonSchema> = {}, required: string[] = []): JsonSchema =>\n\tobject({ type: { const: type, description }, ...BASE, ...extra }, ['type', 'targets', ...required], description);\n\n/** JSON Schema of one command (each type its own strict branch). */\nexport const MOTION_COMMAND_SCHEMA: JsonSchema = {\n\tdescription: `A command (one of ${MOTION_COMMAND_TYPES.join(', ')}). Commands in a shot play one after another unless \"with\": \"previous\".`,\n\toneOf: [\n\t\tcommand('enter', 'Brings hidden targets in; they are hidden before this shot.', {\n\t\t\tstyle: {\n\t\t\t\ttype: 'string',\n\t\t\t\tenum: [...MOTION_ENTER_STYLES],\n\t\t\t\tdescription:\n\t\t\t\t\t'fade (default), pop (scales up past full size and settles), grow (from nothing), slide, draw (outline drawn on, then the fill fades in), zoom (settles from larger), rise (rises a short way, overshooting a touch), or a reveal through a clip over the target\\'s box: wipe (behind a travelling edge), iris (from the centre outwards) or split (from a line through the middle). Reveals need a box with a width and a height (not a lone straight line).'\n\t\t\t},\n\t\t\tdirection: { type: 'string', enum: [...MOTION_DIRECTIONS], description: 'For slide: direction of travel (default up). For wipe: the way the edge travels (default right, revealing from the left).' },\n\t\t\tdistance: { type: 'number', description: 'For slide (default 40) and rise (default 20): document units.' },\n\t\t\tscale: { type: 'number', minimum: 0, description: 'For pop (default 0.5) and zoom (default 1.6): the starting scale (1 = rest size).' },\n\t\t\tshape: { type: 'string', enum: [...MOTION_IRIS_SHAPES], description: 'For iris: open through a circle (default; an ellipse on a box that is not square) or a box.' },\n\t\t\torientation: { type: 'string', enum: [...MOTION_SPLIT_ORIENTATIONS], description: 'For split: horizontal (default) opens up and down from a horizontal line through the middle; vertical opens left and right.' }\n\t\t}),\n\t\tcommand('exit', 'Takes targets out.', {\n\t\t\tstyle: { type: 'string', enum: [...MOTION_EXIT_STYLES], description: 'fade (default), shrink, slide, undraw, or wipe (hides behind a travelling edge through a clip over the target\\'s box: a wipe in, reversed).' },\n\t\t\tdirection: { type: 'string', enum: [...MOTION_DIRECTIONS], description: 'For slide: direction of travel (default down). For wipe: the way the edge travels (default right, hiding from the left).' },\n\t\t\tdistance: { type: 'number', description: 'For slide: document units (default 40).' }\n\t\t}),\n\t\tcommand('draw', 'Draws strokes on (or off) to a fraction of their length.', { to: FRACTION('Fraction drawn at the end (default 1).'), from: FRACTION('Fraction drawn at the start (default: what is drawn now).') }),\n\t\tcommand('move', 'Moves targets by an offset or so their centre lands on a point.', { blend: BLEND('replace'), by: POINT('Offset in document units.'), to: POINT('Point (document coordinates) for the centre.') }),\n\t\tcommand('rotate', 'Turns targets about their centre (degrees, clockwise).', { blend: BLEND('replace'), by: { type: 'number', description: 'Degrees to turn by.' }, to: { type: 'number', description: 'Angle to turn to, in degrees from rest.' } }),\n\t\tcommand('scale', 'Scales targets about their centre (1 = rest size).', { blend: BLEND('replace'), to: { description: 'A factor, or { x, y } factors.', anyOf: [{ type: 'number' }, POINT('Factors per axis.')] }, geometric: { type: 'boolean', description: 'Grow by a steady factor, which reads as an even zoom (default false).' } }, ['to']),\n\t\tcommand('fade', 'Changes opacity.', { to: FRACTION('Opacity at the end (0–1).') }, ['to']),\n\t\tcommand('style', 'Blends solid fill / stroke colours (in OKLab) and stroke width. On a group it changes every path in it.', {\n\t\t\tfill: { type: 'string', description: 'CSS colour (hex, rgb(), rgba()).' },\n\t\t\tstroke: { type: 'string', description: 'CSS colour (hex, rgb(), rgba()).' },\n\t\t\tstrokeWidth: { type: 'number', minimum: 0, description: 'Document units.' }\n\t\t}),\n\t\tcommand('match', 'Smart Animate: tweens a group into another group (usually hidden), part by part. Parts pair by name, then by id with the group ids taken out (card-a-title ↔ card-b-title), then by kind in order; each takes its partner\\'s shape, paint and place. Unpaired parts fade out; parts of \"into\" with no partner do not appear (check_animation lists them).', { into: { type: 'string', minLength: 1, description: 'Id of the group to become.' } }, ['into']),\n\t\tcommand('morph', 'Morphs each target into the shape (and paint) of another node, which usually stays hidden.', { into: { type: 'string', minLength: 1, description: 'Id of the node whose shape to take.' } }, ['into']),\n\t\tcommand('follow', 'Moves targets along a path node, centre on the path.', {\n\t\t\tpath: { type: 'string', minLength: 1, description: 'Id of a path node (it can be hidden).' },\n\t\t\trotate: { type: 'boolean', description: 'Turn with the path (default false); moves and shakes made meanwhile turn with it too.' },\n\t\t\tfrom: FRACTION('Where to start along the path (default 0).'),\n\t\t\tto: FRACTION('Where to end along the path (default 1).')\n\t\t}, ['path']),\n\t\tcommand('pulse', 'Scales up and back to draw the eye.', { blend: BLEND('add'), amount: { type: 'number', description: 'Extra scale at the peak (default 0.15).' }, count: { type: 'integer', minimum: 1, description: 'Pulses (default 1).' } }),\n\t\tcommand('shake', 'Shakes side to side (or up and down), settling.', { blend: BLEND('add'),\n\t\t\tamount: { type: 'number', description: 'Document units (default 8).' },\n\t\t\tcount: { type: 'integer', minimum: 1, description: 'Shakes (default 3).' },\n\t\t\taxis: { type: 'string', enum: ['horizontal', 'vertical'], description: 'Default horizontal.' }\n\t\t}),\n\t\tcommand('teeter', 'Rocks about the centre either way, settling.', { blend: BLEND('add'), angle: { type: 'number', description: 'Degrees either way (default 8).' }, count: { type: 'integer', minimum: 1, description: 'Rocks (default 3).' } }),\n\t\tcommand('wave', 'Bobs up and down without settling, like something floating (default 1000 ms).', { blend: BLEND('add'), amount: { type: 'number', description: 'Height in document units (default 6).' }, count: { type: 'integer', minimum: 1, description: 'Bobs (default 2).' } }),\n\t\tcommand('wiggle', 'Wanders about its place as smooth seeded noise, easing out of and back to rest (default 1500 ms). The same seed always wanders the same way.', { blend: BLEND('add'),\n\t\t\tamount: { type: 'number', description: 'Up to about this far, in document units (default 6).' },\n\t\t\tfrequency: { type: 'number', exclusiveMinimum: 0, description: 'Wanders per second, in Hz (default 3).' },\n\t\t\toctaves: { type: 'integer', minimum: 1, maximum: 8, description: 'Layers of finer detail (default 2).' },\n\t\t\trotate: { type: 'number', description: 'Also turns about the centre by up to about this many degrees (default 0).' },\n\t\t\tseed: { type: 'integer', minimum: 0, description: 'Default: one picked from the target id, so each target wanders its own way.' }\n\t\t}),\n\t\tcommand('color-pulse', 'Tints solid paint toward a colour and back (mixed in OKLab). On a group it tints every path in it.', {\n\t\t\tcolor: { type: 'string', description: 'The tint, a CSS colour (default \"#f59e0b\").' },\n\t\t\tpaint: { type: 'string', enum: ['fill', 'stroke'], description: 'Which paint (default fill).' },\n\t\t\tcount: { type: 'integer', minimum: 1, description: 'Pulses (default 1).' }\n\t\t}),\n\t\tcommand('effect', 'Tweens a numeric parameter of a live path effect on the targets (twist angle, wiggle time, zig zag size, trim offset…).', {\n\t\t\teffect: { type: 'string', minLength: 1, description: 'Effect id from get_animation\\'s element \"effects\".' },\n\t\t\tparam: { type: 'string', minLength: 1, description: 'A numeric parameter of that effect (listed with it).' },\n\t\t\tto: { type: 'number', description: 'Value at the end.' }\n\t\t}, ['effect', 'param', 'to']),\n\t\tobject(\n\t\t\t{ type: { const: 'wait', description: 'Waits.' }, duration: MS('How long'), with: BASE.with, note: BASE.note },\n\t\t\t['type', 'duration'],\n\t\t\t'Waits before the next command.'\n\t\t)\n\t]\n};\n\nconst GEOMETRIC_CAMERA: JsonSchema = { type: 'boolean', description: 'Zoom at a steady rate, so a big zoom does not rush at the start (default false).' };\nconst CAMERA: JsonSchema = {\n\tdescription: 'Where the camera looks: a rectangle { x, y, width, height } in document units, or { frame: \"<node id>\", padding } to frame a node (fitted to the artwork\\'s shape). It eases there over \"ms\" (default 1000); the first shot cuts.',\n\tanyOf: [\n\t\tobject({ x: { type: 'number', description: 'Left.' }, y: { type: 'number', description: 'Top.' }, width: { type: 'number', exclusiveMinimum: 0, description: 'Width.' }, height: { type: 'number', exclusiveMinimum: 0, description: 'Height.' }, ease: EASE, ms: MS('Camera move length'), geometric: GEOMETRIC_CAMERA }, ['x', 'y', 'width', 'height']),\n\t\tobject({ frame: { type: 'string', minLength: 1, description: 'Node id to frame.' }, padding: { type: 'number', description: 'Margin around it (default 24).' }, ease: EASE, ms: MS('Camera move length'), geometric: GEOMETRIC_CAMERA }, ['frame'])\n\t]\n};\n\nconst SHOT_FIELDS: Record<string, JsonSchema> = {\n\tlabel: { type: 'string', description: 'What happens, in a few words.' },\n\tcamera: CAMERA,\n\trun: { type: 'array', items: MOTION_COMMAND_SCHEMA, description: 'Commands, in order.' },\n\thold: MS('Hold after the commands (default 600)'),\n\tspeed: { type: 'number', minimum: 0.05, maximum: 20, description: 'Play the whole shot this many times as fast (default 1; 0.5 is half speed). fit_animation sets it.' },\n\tat: object(\n\t\t{ beat: { type: 'number', minimum: 0, description: 'Beat number on the scene\\'s beat grid, from 0 (2.5 is the \"and\" of beat 3).' }, word: { type: 'integer', minimum: 0, description: 'Index of a narration word, from 0.' }, ms: { type: 'number', minimum: 0, description: 'A time in ms.' } },\n\t\t[],\n\t\t'Start this shot on a cue (give one of beat, word or ms); the shot before holds until then. get_timing_grid lists beats and words.'\n\t)\n};\nconst SHOT: JsonSchema = object({ id: { type: 'string', pattern: '^[A-Za-z0-9_][\\\\w.-]*$', description: 'Unique shot id, e.g. \"intro\".' }, ...SHOT_FIELDS }, ['id', 'run'], 'A shot.');\nconst CONTROL: JsonSchema = object(\n\t{\n\t\tname: { type: 'string', pattern: '^[A-Za-z_]\\\\w*$', description: 'Identifier, e.g. \"accent\".' },\n\t\ttype: { const: 'color', description: 'Controls are colours.' },\n\t\tdefault: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$', description: 'A #rrggbb colour the scene uses; the control stands for every use of it.' },\n\t\tlabel: { type: 'string', description: 'Label in a controls panel.' }\n\t},\n\t['name', 'type', 'default'],\n\t'A colour parameter of the Flair effect made from the scene.'\n);\nconst PRESET: JsonSchema = object({ name: { type: 'string', minLength: 1, description: 'Preset name.' }, values: { type: 'object', additionalProperties: { type: 'string' }, description: 'Control name → colour.' } }, ['name', 'values'], 'Named control values.');\n\nconst SETTINGS: Record<string, JsonSchema> = {\n\tname: { type: 'string', minLength: 1, description: 'Short name, e.g. \"logo-reveal\".' },\n\tdescription: { type: ['string', 'null'], description: 'What it shows; null clears.' },\n\tloop: { type: 'string', enum: ['none', 'loop', 'ping-pong'], description: 'Playback past the end (default none).' },\n\tfps: { type: 'number', minimum: 1, maximum: 120, description: 'Sampling rate for exports (default 30).' },\n\tsteps: { anyOf: [{ type: 'number', exclusiveMinimum: 0, maximum: 120 }, { type: 'null' }], description: 'Stepped time for every command without its own: changes hold on a grid of this many frames per second (12 = \"on twos\" at 24 fps) for a hand-drawn look; null makes it smooth again (default).' },\n\tbeat: {\n\t\tanyOf: [\n\t\t\tobject({ bpm: { type: 'number', minimum: 1, maximum: 1000, description: 'Beats a minute.' }, offset: { type: 'number', description: 'When beat 0 falls, ms (default 0).' }, meter: { type: 'integer', minimum: 1, description: 'Beats a bar (default 4).' } }, ['bpm']),\n\t\t\t{ type: 'null' }\n\t\t],\n\t\tdescription: 'A beat grid (music or a voiceover\\'s rhythm) that shots can be cued to with \"at\": { \"beat\": n }; null clears.'\n\t},\n\tnarration: {\n\t\tanyOf: [\n\t\t\tobject({ words: { type: 'array', items: object({ text: { type: 'string', description: 'The word.' }, start: { type: 'number', minimum: 0, description: 'When it is said, ms.' }, end: { type: 'number', minimum: 0, description: 'When it ends, ms.' } }, ['text', 'start']), description: 'Words in time order, from a TTS or speech-to-text word timing.' } }, ['words']),\n\t\t\t{ type: 'null' }\n\t\t],\n\t\tdescription: 'A voiceover\\'s word timings that shots can be cued to with \"at\": { \"word\": index }; null clears.'\n\t},\n\ttarget: { anyOf: [{ type: 'array', items: { type: 'number', minimum: 0 }, minItems: 2, maxItems: 2 }, { type: 'null' }], description: 'Wanted length [min, max] in seconds; null clears.' }\n};\n\n/** JSON Schema of one `edit_animation` op. */\nconst EDIT_OP: JsonSchema = {\n\tdescription: `One edit (${MOTION_EDIT_OPS.filter((o) => o !== 'replace_scene' && o !== 'set_artwork').join(', ')}), shaped like the tool of the same name with an \"op\" field.`,\n\toneOf: [\n\t\tobject({ op: { const: 'set_settings', description: 'Like set_animation_settings.' }, ...SETTINGS }, ['op']),\n\t\tobject({ op: { const: 'insert_shots', description: 'Like insert_shots.' }, shots: { type: 'array', items: SHOT, minItems: 1, description: 'Shots to add.' }, at: { type: 'integer', minimum: 0, description: 'Position (default: the end).' } }, ['op', 'shots']),\n\t\tobject({ op: { const: 'update_shot', description: 'Like update_shot.' }, shot: SHOT_ID, set: object({ id: SHOT.properties!.id, ...SHOT_FIELDS }, [], 'Fields to replace.'), remove: { type: 'array', items: { type: 'string', enum: ['label', 'camera', 'hold', 'speed', 'at'] }, description: 'Fields to clear.' } }, ['op', 'shot']),\n\t\tobject({ op: { const: 'delete_shots', description: 'Like delete_shots.' }, shots: { type: 'array', items: SHOT_ID, minItems: 1, description: 'Shot ids.' } }, ['op', 'shots']),\n\t\tobject({ op: { const: 'move_shot', description: 'Like move_shot.' }, shot: SHOT_ID, to: { type: 'integer', minimum: 0, description: 'New position (0 = first).' } }, ['op', 'shot', 'to']),\n\t\tobject({ op: { const: 'add_commands', description: 'Like add_commands.' }, shot: SHOT_ID, commands: { type: 'array', items: MOTION_COMMAND_SCHEMA, minItems: 1, description: 'Commands to add.' }, at: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run (default: the end).' } }, ['op', 'shot', 'commands']),\n\t\tobject({ op: { const: 'update_command', description: 'Like update_command.' }, shot: SHOT_ID, command: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run.' }, set: { type: 'object', description: 'Command fields to replace.' }, remove: { type: 'array', items: { type: 'string' }, description: 'Command fields to clear.' } }, ['op', 'shot', 'command']),\n\t\tobject({ op: { const: 'delete_commands', description: 'Like delete_commands.' }, shot: SHOT_ID, commands: { type: 'array', items: { type: 'integer', minimum: 0 }, minItems: 1, description: 'Indexes in the shot\\'s run.' } }, ['op', 'shot', 'commands']),\n\t\tobject({ op: { const: 'set_controls', description: 'Like set_controls.' }, controls: { type: 'array', items: CONTROL, description: 'Controls (empty clears).' }, presets: { type: 'array', items: PRESET, description: 'Presets (empty clears).' } }, ['op', 'controls'])\n\t]\n};\n\nfunction describeElement(node: VectorNode, ancestors: string[]) {\n\tconst effects = (node.effects ?? []).map((e) => ({\n\t\tid: e.id,\n\t\ttype: e.type,\n\t\tnumericParams: Object.fromEntries(Object.entries(e.params as unknown as Record<string, unknown>).filter(([, v]) => typeof v === 'number'))\n\t}));\n\treturn {\n\t\tid: node.id,\n\t\ttype: node.type,\n\t\t...(node.name ? { name: node.name } : {}),\n\t\t...(ancestors.length ? { parent: ancestors[ancestors.length - 1] } : {}),\n\t\t...(node.visible === false ? { hidden: true } : {}),\n\t\t...(node.type === 'path' && typeof node.fill === 'string' ? { fill: node.fill } : {}),\n\t\t...(node.type === 'path' && typeof node.stroke === 'string' ? { stroke: node.stroke } : {}),\n\t\t...(node.type === 'group' ? { children: node.children.map((c) => c.id) } : {}),\n\t\t...(effects.length ? { effects } : {})\n\t};\n}\n\nconst round = (n: number) => Math.round(n * 10) / 10;\n\n/** The elements of a scene's artwork, as agents see them. */\nexport function describeMotionElements(scene: MotionScene) {\n\treturn [...indexMotionNodes(scene.artwork.nodes).values()].map((e) => ({\n\t\t...describeElement(e.node, e.ancestors),\n\t\t...(e.bounds ? { bounds: { x: round(e.bounds.x), y: round(e.bounds.y), width: round(e.bounds.width), height: round(e.bounds.height) } } : {})\n\t}));\n}\n\n/** A scene's shots with their timing, as agents see them. */\nexport function describeMotionShots(scene: MotionScene) {\n\tconst timeline = compileMotionScene(scene);\n\treturn scene.shots.map((shot, i) => {\n\t\tconst t = timeline.shots[i];\n\t\treturn {\n\t\t\tid: shot.id,\n\t\t\t...(shot.label ? { label: shot.label } : {}),\n\t\t\tstart: t.start,\n\t\t\tend: t.end,\n\t\t\t...(shot.camera ? { camera: shot.camera } : {}),\n\t\t\t...(shot.hold !== undefined ? { hold: shot.hold } : {}),\n\t\t\t...(t.cue !== undefined ? { cue: Math.round(t.cue) } : {}),\n\t\t\t...(t.missedBy !== undefined ? { missedBy: Math.round(t.missedBy) } : {}),\n\t\t\tcommands: shot.run.map((c, index) => {\n\t\t\t\tconst ct = timeline.commands.find((x) => x.shotIndex === i && x.command === index)!;\n\t\t\t\tconst primitive = motionFlairPrimitive(c);\n\t\t\t\treturn { index, ...c, start: ct.start, end: ct.end, ...(primitive ? { flairPrimitive: primitive } : {}) };\n\t\t\t})\n\t\t};\n\t});\n}\n\nconst issueSummary = (issues: readonly MotionIssue[]) => ({\n\terrors: issues.filter((i) => i.severity === 'error').length,\n\twarnings: issues.filter((i) => i.severity === 'warning').length,\n\tnotes: issues.filter((i) => i.severity === 'note').length,\n\tlines: issues.map((i) => `${i.severity}: ${motionIssueLine(i)}`)\n});\n\n/**\n * Agent tools for an `AnimationEditorController`: read the scene (artwork elements, shots with\n * their timing, issues), render a frame, export to Flair, and change it a step at a time. Every\n * write is checked first (unknown ids with \"did you mean\", malformed commands), applies as one\n * undo step, and returns the resulting timing and any new issues. Write tools are hidden while\n * the animation is read-only.\n */\nexport function createAnimationEditorToolProvider(controller: AnimationEditorController, options: AnimationEditorToolProviderOptions = {}): AgentToolProvider {\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (r) return typeof r === 'string' ? r : 'This animation is read-only.';\n\t\treturn controller.readOnlyReason();\n\t};\n\tconst scene = () => controller.getScene();\n\tconst outcome = (result: MotionEditResult, extra: Record<string, unknown> = {}) => {\n\t\tif (!result.ok) throw new Error(result.error);\n\t\tconst timeline = compileMotionScene(result.scene);\n\t\treturn {\n\t\t\t...extra,\n\t\t\tduration: timeline.duration,\n\t\t\tshots: timeline.shots.map((s) => ({ id: s.id, start: s.start, end: s.end })),\n\t\t\tissues: issueSummary(result.issues),\n\t\t\t...(result.hints.length ? { hints: result.hints } : {})\n\t\t};\n\t};\n\tconst apply = (edits: MotionEdit | MotionEdit[], label: string, extra?: (s: MotionScene) => Record<string, unknown>) => {\n\t\tconst result = controller.apply(edits, label);\n\t\treturn outcome(result, result.ok && extra ? extra(result.scene) : {});\n\t};\n\n\tconst getAnimation: AgentTool = {\n\t\tname: 'get_animation',\n\t\ttitle: 'Read the animation',\n\t\tdescription:\n\t\t\t'Returns the vector animation: its name, artwork size, length (ms), loop mode, the artwork\\'s elements (id, type, name, parent, bounds, solid paints, live effects with their numeric parameters), every shot with its commands and their start/end times (and, where Flair has one, the Flair motion primitive a command plays as \"flairPrimitive\", e.g. \"entrance.pop\"), Flair controls, and a summary of issues. Use the ids it returns with the write tools.',\n\t\tinputSchema: object({ includeElements: { type: 'boolean', description: 'Include the artwork\\'s elements (default true).' } }),\n\t\tannotations: { title: 'Read the animation', ...READ },\n\t\thandler: ({ includeElements = true }) => {\n\t\t\tconst s = scene();\n\t\t\tconst reason = readOnlyReason();\n\t\t\treturn {\n\t\t\t\tname: s.name,\n\t\t\t\t...(s.description ? { description: s.description } : {}),\n\t\t\t\tartwork: { width: s.artwork.width, height: s.artwork.height },\n\t\t\t\tduration: compileMotionScene(s).duration,\n\t\t\t\tloop: s.loop ?? 'none',\n\t\t\t\t...(s.target ? { target: s.target } : {}),\n\t\t\t\t...(includeElements ? { elements: describeMotionElements(s) } : {}),\n\t\t\t\tshots: describeMotionShots(s),\n\t\t\t\t...(s.controls ? { controls: s.controls } : {}),\n\t\t\t\t...(s.presets ? { presets: s.presets } : {}),\n\t\t\t\tissues: issueSummary(controller.getState().issues),\n\t\t\t\t...(reason ? { readOnly: reason } : {})\n\t\t\t};\n\t\t}\n\t};\n\n\tconst getShot: AgentTool = {\n\t\tname: 'get_shot',\n\t\ttitle: 'Read one shot',\n\t\tdescription: 'Returns one shot as stored (id, label, camera, run, hold) with its start/end and each command\\'s start/end in ms.',\n\t\tinputSchema: object({ shot: SHOT_ID }, ['shot']),\n\t\tannotations: { title: 'Read one shot', ...READ },\n\t\thandler: ({ shot }) => {\n\t\t\tconst found = describeMotionShots(scene()).find((s) => s.id === shot);\n\t\t\tif (!found) throw new Error(`There is no shot \"${shot}\"; the shots are ${scene().shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\treturn found;\n\t\t}\n\t};\n\n\tconst findElements: AgentTool = {\n\t\tname: 'find_animation_elements',\n\t\ttitle: 'Find artwork elements',\n\t\tdescription: 'Finds artwork elements whose id or name contains the text (case-insensitive). Returns their id, type, name, parent, bounds, paints and live effects.',\n\t\tinputSchema: object({ query: { type: 'string', minLength: 1, description: 'Text to look for in ids and names.' }, limit: { type: 'integer', minimum: 1, maximum: 200, description: 'Most results (default 20).' } }, ['query']),\n\t\tannotations: { title: 'Find artwork elements', ...READ },\n\t\thandler: ({ query, limit = 20 }) => {\n\t\t\tconst q = String(query).toLowerCase();\n\t\t\tconst all = describeMotionElements(scene());\n\t\t\tconst elements = all.filter((e) => e.id.toLowerCase().includes(q) || ('name' in e && String(e.name).toLowerCase().includes(q)));\n\t\t\treturn { elements: elements.slice(0, limit), total: elements.length };\n\t\t}\n\t};\n\n\tconst checkAnimation: AgentTool = {\n\t\tname: 'check_animation',\n\t\ttitle: 'Check the animation',\n\t\tdescription:\n\t\t\t'Lists the animation\\'s problems: each with a stable code (unknown-target, overlap, out-of-frame, too-fast, enter-visible…), severity (error / warning / note), the shot and command index it is in, the node ids it is about, measured vs needed values, and a message saying how to fix it.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Check the animation', ...READ },\n\t\thandler: () => {\n\t\t\tconst issues = controller.getState().issues;\n\t\t\treturn { ...issueSummary(issues), issues };\n\t\t}\n\t};\n\n\tconst renderFrame: AgentTool = {\n\t\tname: 'render_animation_frame',\n\t\ttitle: 'Render a frame',\n\t\tdescription:\n\t\t\t'Draws the animation at one moment without changing it, to check it: standalone SVG by default, or a PNG image (format \"png\") when the host can rasterize. Give a time in ms, or a shot and where in it.',\n\t\tinputSchema: object({\n\t\t\ttime: MS('Time from the start'),\n\t\t\tshot: { ...SHOT_ID, description: 'Render a moment of this shot instead of \"time\".' },\n\t\t\tat: { type: 'string', enum: ['start', 'middle', 'end'], description: 'With shot: which moment (default end: everything drawn, before the next shot).' },\n\t\t\tformat: { type: 'string', enum: ['svg', 'png'], description: 'svg (default) or png (only when the host supports it).' }\n\t\t}),\n\t\tannotations: { title: 'Render a frame', ...READ },\n\t\thandler: async ({ time, shot, at = 'end', format = 'svg' }) => {\n\t\t\tconst s = scene();\n\t\t\tlet t = time ?? controller.getState().time;\n\t\t\tif (shot !== undefined) {\n\t\t\t\tconst timing = compileMotionScene(s).shots.find((x) => x.id === shot);\n\t\t\t\tif (!timing) throw new Error(`There is no shot \"${shot}\"; the shots are ${s.shots.map((x) => `\"${x.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\t\tt = at === 'start' ? timing.start : at === 'middle' ? (timing.commandsStart + timing.commandsEnd) / 2 : Math.max(timing.start, timing.end - 1);\n\t\t\t}\n\t\t\tconst svg = controller.toSvg(t, { pretty: false });\n\t\t\tif (format === 'png') {\n\t\t\t\tif (!options.rasterize) throw new Error('This host cannot make PNG images; call render_animation_frame with format \"svg\".');\n\t\t\t\tconst image = await options.rasterize(svg, { width: s.artwork.width, height: s.artwork.height });\n\t\t\t\treturn { content: [{ type: 'image', data: image.data, mimeType: image.mimeType }] };\n\t\t\t}\n\t\t\treturn { time: t, svg };\n\t\t}\n\t};\n\n\tconst CURVES_DESCRIPTION =\n\t\t'Write cubic-bezier easings (ease, ease-in, ease-out, ease-in-out, back eases, custom curves) as one change with ease: [x1, y1, x2, y2] (default true). Needs Flair 0.36 or later; false samples them into linear steps for older Flair.';\n\tconst FLAIR_DESCRIPTION =\n\t\t'The Flair version to export for (default 0.39): springs and stepped time need 0.39, behaviours 0.38, cubic-bezier curves 0.36; older versions get those sampled into linear steps.';\n\tconst BEHAVIORS_DESCRIPTION =\n\t\t'Write pulses, shakes, teeters, waves, wiggles and colour pulses as one change with a Flair behavior, so they play exactly (default true; needs Flair 0.38 or later). False samples them into linear steps for older Flair.';\n\n\tconst getTimingGrid: AgentTool = {\n\t\tname: 'get_timing_grid',\n\t\ttitle: 'Read the beat grid and narration',\n\t\tdescription:\n\t\t\t'Returns the beats (number, time in ms, bar and beat in the bar) and narration words (index, text, start, end) between two times, to cue shots to with \"at\". Also says which shot plays at each. Without a beat grid or narration, that part is empty and says how to add one.',\n\t\tinputSchema: object({\n\t\t\tfrom: { type: 'number', minimum: 0, description: 'From this time, ms (default 0).' },\n\t\t\tto: { type: 'number', minimum: 0, description: 'Up to this time, ms (default: the end of the animation, or of the narration if later).' },\n\t\t\tlimit: { type: 'integer', minimum: 1, maximum: 1000, description: 'At most this many beats and words each (default 200).' }\n\t\t}),\n\t\tannotations: { title: 'Read the beat grid and narration', ...READ },\n\t\thandler: ({ from = 0, to, limit = 200 }) => {\n\t\t\tconst s = scene();\n\t\t\tconst timeline = compileMotionScene(s);\n\t\t\tconst words = s.narration?.words ?? [];\n\t\t\tconst end = to ?? Math.max(timeline.duration, words.length ? (words[words.length - 1].end ?? words[words.length - 1].start) : 0);\n\t\t\tconst shotAt = (ms: number) => timeline.shots.find((x) => ms >= x.start && ms < x.end)?.id;\n\t\t\tconst beats: { beat: number; ms: number; bar: number; beatInBar: number; shot?: string }[] = [];\n\t\t\tif (s.beat && s.beat.bpm > 0) {\n\t\t\t\tconst first = Math.max(0, Math.ceil(motionBeatAt(s.beat, from).beat - 1e-9));\n\t\t\t\tfor (let b = first; beats.length < limit; b++) {\n\t\t\t\t\tconst ms = motionBeatTime(s.beat, b);\n\t\t\t\t\tif (ms > end) break;\n\t\t\t\t\tconst at = motionBeatAt(s.beat, ms);\n\t\t\t\t\tconst shot = shotAt(ms);\n\t\t\t\t\tbeats.push({ beat: b, ms: Math.round(ms), bar: at.bar, beatInBar: at.beatInBar, ...(shot ? { shot } : {}) });\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst listed = words\n\t\t\t\t.map((w, index) => ({ index, text: w.text, start: w.start, ...(w.end !== undefined ? { end: w.end } : {}), ...(shotAt(w.start) ? { shot: shotAt(w.start) } : {}) }))\n\t\t\t\t.filter((w) => w.start >= from && w.start <= end)\n\t\t\t\t.slice(0, limit);\n\t\t\treturn {\n\t\t\t\tfrom,\n\t\t\t\tto: Math.round(end),\n\t\t\t\t...(s.beat ? { grid: s.beat, beats } : { beats: [], hint: 'No beat grid: set_animation_settings with { \"beat\": { \"bpm\": 120 } }.' }),\n\t\t\t\t...(words.length ? { words: listed } : { words: [], narrationHint: 'No narration: set_animation_settings with { \"narration\": { \"words\": [{ \"text\", \"start\" }, …] } }.' })\n\t\t\t};\n\t\t}\n\t};\n\n\tconst exportFlairMotion: AgentTool = {\n\t\tname: 'export_flair_motion',\n\t\ttitle: 'Export as Flair vector motion',\n\t\tdescription:\n\t\t\t'Returns the animation as a Flair SvgMotion ({ svg, animate }) that Flair\\'s SvgPlayer plays, plus its hold, how many changes were sampled into linear steps, and notes on anything not carried over.',\n\t\tinputSchema: object({\n\t\t\tfps: { type: 'number', minimum: 1, maximum: 120, description: 'Sampling rate for changes Flair cannot express exactly (default: the scene\\'s fps, else 30).' },\n\t\t\tcurves: { type: 'boolean', description: CURVES_DESCRIPTION },\n\t\t\tbehaviors: { type: 'boolean', description: BEHAVIORS_DESCRIPTION },\n\t\t\tflair: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?$', description: FLAIR_DESCRIPTION }\n\t\t}),\n\t\tannotations: { title: 'Export as Flair vector motion', ...READ },\n\t\thandler: ({ fps, curves, behaviors, flair }) => controller.toFlairMotion({ ...(fps ? { fps } : {}), ...(curves === undefined ? {} : { curves }), ...(behaviors === undefined ? {} : { behaviors }), ...(flair ? { flair } : {}) })\n\t};\n\n\tconst exportFlairEffect: AgentTool = {\n\t\tname: 'export_flair_effect',\n\t\ttitle: 'Export as a Flair effect',\n\t\tdescription:\n\t\t\t'Returns the animation as a Flair catalog vector effect: { kind: \"vector\", id, name, description, category, tags, motion, hold, presets }, with each colour control declared as a {{name: color}} placeholder. Add it to a Flair catalog or load it in Flair\\'s effect editor.',\n\t\tinputSchema: object({\n\t\t\tid: { type: 'string', pattern: '^[a-z0-9]+(-[a-z0-9]+)*$', description: 'Kebab-case id (default: from the scene\\'s name).' },\n\t\t\tname: { type: 'string', minLength: 1, description: 'Display name (default: the scene\\'s name).' },\n\t\t\tdescription: { type: 'string', description: 'One sentence (default: the scene\\'s description).' },\n\t\t\tcategory: { type: 'string', minLength: 1, description: 'Flair catalog category, e.g. icon, loader, ui, data, text, morph (default icon).' },\n\t\t\ttags: { type: 'array', items: { type: 'string' }, description: 'Search tags (default none).' },\n\t\t\tcurves: { type: 'boolean', description: CURVES_DESCRIPTION },\n\t\t\tbehaviors: { type: 'boolean', description: BEHAVIORS_DESCRIPTION },\n\t\t\tflair: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?$', description: FLAIR_DESCRIPTION }\n\t\t}),\n\t\tannotations: { title: 'Export as a Flair effect', ...READ },\n\t\thandler: (args) => controller.toFlairEffect(args)\n\t};\n\n\tconst setArtworkSvg: AgentTool = {\n\t\tname: 'set_animation_artwork_svg',\n\t\ttitle: 'Replace the artwork with SVG',\n\t\tdescription:\n\t\t\t'Replaces the artwork with an SVG (paths, shapes, groups, gradients; one undo step). Give every element you will animate an id: commands target ids. Shots that name ids the new artwork lacks are refused. Returns the elements.',\n\t\tinputSchema: object({ svg: { type: 'string', minLength: 1, description: 'A standalone <svg> with a viewBox.' } }, ['svg']),\n\t\tannotations: { title: 'Replace the artwork with SVG', ...DESTRUCTIVE },\n\t\thandler: ({ svg }) => {\n\t\t\tlet artwork;\n\t\t\ttry {\n\t\t\t\tartwork = parseVectorSvg(svg);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`The SVG could not be read: ${(error as Error).message}. Nothing was changed.`);\n\t\t\t}\n\t\t\treturn apply({ op: 'set_artwork', artwork }, 'Replace artwork', (s) => ({ elements: describeMotionElements(s) }));\n\t\t}\n\t};\n\n\tconst importFlairEffect: AgentTool = {\n\t\tname: 'import_flair_effect',\n\t\ttitle: 'Import a Flair effect',\n\t\tdescription:\n\t\t\t'Replaces the whole animation with a Flair vector effect or SvgMotion (one undo step): its SVG becomes the artwork, {{name: color}} placeholders become colour controls, and each Flair step becomes a shot of commands (fade, enter, style, move, rotate, scale, draw, follow, pulse, shake, teeter, wave, wiggle, color-pulse). Returns the shots, the elements, notes on anything not carried over and the issues. With dry_run it only reports what the import would give.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\teffect: { type: 'object', description: 'A Flair catalog vector effect { kind: \"vector\", id, name, motion: { svg, animate }, hold?, presets? }. Give this or \"motion\".' },\n\t\t\t\tmotion: { type: 'object', description: 'A Flair SvgMotion { svg, animate }. Give this or \"effect\".' },\n\t\t\t\tname: { type: 'string', minLength: 1, description: 'Name for the scene (default: the effect\\'s id, else \"from-flair\").' },\n\t\t\t\tdry_run: { type: 'boolean', description: 'Report without replacing anything (default false).' }\n\t\t\t},\n\t\t\t[]\n\t\t),\n\t\tannotations: { title: 'Import a Flair effect', ...DESTRUCTIVE },\n\t\thandler: ({ effect, motion, name, dry_run = false }) => {\n\t\t\tif ((effect === undefined) === (motion === undefined)) throw new Error('Give exactly one of \"effect\" (a Flair vector effect) or \"motion\" (a Flair SvgMotion). Nothing was changed.');\n\t\t\tlet result: FlairImportResult;\n\t\t\ttry {\n\t\t\t\tresult = effect !== undefined ? fromFlairVectorEffect(effect, name ? { name } : {}) : fromFlairSvgMotion(motion, name ? { name } : {});\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`The Flair effect could not be imported: ${(error as Error).message} Nothing was changed.`);\n\t\t\t}\n\t\t\tconst report = { notes: result.notes, issues: issueSummary(result.issues), shots: describeMotionShots(result.scene).map(({ id, start, end, commands }) => ({ id, start, end, commands: commands.length })) };\n\t\t\tif (dry_run) return { dry_run: true, ...report, hint: 'Nothing was replaced; call again without dry_run to import.' };\n\t\t\tconst applied = controller.apply({ op: 'replace_scene', scene: result.scene }, 'Import Flair effect');\n\t\t\treturn outcome(applied, applied.ok ? { ...report, elements: describeMotionElements(result.scene) } : {});\n\t\t}\n\t};\n\n\tconst fitAnimation: AgentTool = {\n\t\tname: 'fit_animation',\n\t\ttitle: 'Fit the animation to a length',\n\t\tdescription:\n\t\t\t'Makes the animation last a given time by setting its shots\\' speed (one undo step): shots in \"keep\" play as they are and the others stretch or squeeze together, keeping their proportions. Returns the new length, each changed shot\\'s speed and the timing. With dry_run it only reports them.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tseconds: { type: 'number', exclusiveMinimum: 0, description: 'The length to fit, in seconds.' },\n\t\t\t\tkeep: { type: 'array', items: SHOT_ID, description: 'Shots that keep their pace, e.g. a logo hold (default none).' },\n\t\t\t\tdry_run: { type: 'boolean', description: 'Report without changing anything (default false).' }\n\t\t\t},\n\t\t\t['seconds']\n\t\t),\n\t\tannotations: { title: 'Fit the animation to a length', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ seconds, keep, dry_run = false }) => {\n\t\t\tconst fit = fitMotionScene(controller.getState().scene, seconds * 1000, { keep: keep ?? [] });\n\t\t\tconst report = { duration: fit.duration, speeds: fit.speeds };\n\t\t\tif (dry_run) return { dry_run: true, ...report, hint: 'Nothing was changed; call again without dry_run to fit.' };\n\t\t\tconst edits = Object.entries(fit.speeds).map(([shot, speed]) => (speed === 1 ? { op: 'update_shot' as const, shot, remove: ['speed' as const] } : { op: 'update_shot' as const, shot, set: { speed } }));\n\t\t\treturn apply(edits, 'Fit to length', () => report);\n\t\t}\n\t};\n\n\tconst insertShots: AgentTool = {\n\t\tname: 'insert_shots',\n\t\ttitle: 'Add shots',\n\t\tdescription: 'Adds shots (one undo step) at a position (default: the end). Returns every shot\\'s new timing and any issues.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT, minItems: 1, description: 'Shots to add.' }, at: { type: 'integer', minimum: 0, description: 'Position, 0 = first (default: the end).' } }, ['shots']),\n\t\tannotations: { title: 'Add shots', ...WRITE },\n\t\thandler: ({ shots, at }) => apply({ op: 'insert_shots', shots, at }, 'Add shots', () => ({ added: shots.map((s: { id: string }) => s.id) }))\n\t};\n\n\tconst updateShot: AgentTool = {\n\t\tname: 'update_shot',\n\t\ttitle: 'Change a shot',\n\t\tdescription: 'Replaces the fields of one shot given in \"set\" (label, camera, run, hold, id) and clears those in \"remove\". Returns the new timing and issues.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tshot: SHOT_ID,\n\t\t\t\tset: object({ id: SHOT.properties!.id, ...SHOT_FIELDS }, [], 'Fields to replace.'),\n\t\t\t\tremove: { type: 'array', items: { type: 'string', enum: ['label', 'camera', 'hold', 'speed', 'at'] }, description: 'Fields to clear.' }\n\t\t\t},\n\t\t\t['shot']\n\t\t),\n\t\tannotations: { title: 'Change a shot', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, set, remove }) => apply({ op: 'update_shot', shot, set, remove }, 'Change shot')\n\t};\n\n\tconst deleteShots: AgentTool = {\n\t\tname: 'delete_shots',\n\t\ttitle: 'Delete shots',\n\t\tdescription: 'Removes shots by id (one undo step). Returns the remaining timing.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT_ID, minItems: 1, description: 'Shot ids.' } }, ['shots']),\n\t\tannotations: { title: 'Delete shots', ...DESTRUCTIVE },\n\t\thandler: ({ shots }) => apply({ op: 'delete_shots', shots }, 'Delete shots')\n\t};\n\n\tconst moveShot: AgentTool = {\n\t\tname: 'move_shot',\n\t\ttitle: 'Reorder a shot',\n\t\tdescription: 'Moves a shot to a new position (0 = first). Returns the new timing.',\n\t\tinputSchema: object({ shot: SHOT_ID, to: { type: 'integer', minimum: 0, description: 'New position, 0 = first.' } }, ['shot', 'to']),\n\t\tannotations: { title: 'Reorder a shot', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, to }) => apply({ op: 'move_shot', shot, to }, 'Move shot')\n\t};\n\n\tconst addCommands: AgentTool = {\n\t\tname: 'add_commands',\n\t\ttitle: 'Add commands to a shot',\n\t\tdescription: 'Adds commands to a shot\\'s run (one undo step), at an index (default: the end). Returns the indexes they got, their timing and any issues.',\n\t\tinputSchema: object({ shot: SHOT_ID, commands: { type: 'array', items: MOTION_COMMAND_SCHEMA, minItems: 1, description: 'Commands to add.' }, at: { type: 'integer', minimum: 0, description: 'Index in the run (default: the end).' } }, ['shot', 'commands']),\n\t\tannotations: { title: 'Add commands to a shot', ...WRITE },\n\t\thandler: ({ shot, commands, at }) => {\n\t\t\tconst before = scene().shots.find((s) => s.id === shot)?.run.length ?? 0;\n\t\t\tconst first = at ?? before;\n\t\t\treturn apply({ op: 'add_commands', shot, commands, at }, 'Add commands', (s) => {\n\t\t\t\tconst shots = describeMotionShots(s);\n\t\t\t\tconst added = shots.find((x) => x.id === shot)!.commands.slice(first, first + commands.length);\n\t\t\t\treturn { added: added.map((c) => ({ index: c.index, type: c.type, start: c.start, end: c.end })) };\n\t\t\t});\n\t\t}\n\t};\n\n\tconst updateCommand: AgentTool = {\n\t\tname: 'update_command',\n\t\ttitle: 'Change a command',\n\t\tdescription: 'Replaces fields of one command (by shot and index) given in \"set\" and clears those in \"remove\". Returns the command as it now stands with its timing.',\n\t\tinputSchema: object(\n\t\t\t{\n\t\t\t\tshot: SHOT_ID,\n\t\t\t\tcommand: { type: 'integer', minimum: 0, description: 'Index in the shot\\'s run (from get_animation).' },\n\t\t\t\tset: { type: 'object', description: 'Command fields to replace (see add_commands for each type\\'s fields).' },\n\t\t\t\tremove: { type: 'array', items: { type: 'string' }, description: 'Optional fields to clear (e.g. \"delay\").' }\n\t\t\t},\n\t\t\t['shot', 'command']\n\t\t),\n\t\tannotations: { title: 'Change a command', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ shot, command, set, remove }) =>\n\t\t\tapply({ op: 'update_command', shot, command, set, remove }, 'Change command', (s) => ({ command: describeMotionShots(s).find((x) => x.id === shot)!.commands[command] }))\n\t};\n\n\tconst deleteCommands: AgentTool = {\n\t\tname: 'delete_commands',\n\t\ttitle: 'Delete commands',\n\t\tdescription: 'Removes commands from a shot by index (one undo step). Later commands move up. Returns the new timing.',\n\t\tinputSchema: object({ shot: SHOT_ID, commands: { type: 'array', items: { type: 'integer', minimum: 0 }, minItems: 1, description: 'Indexes in the shot\\'s run.' } }, ['shot', 'commands']),\n\t\tannotations: { title: 'Delete commands', ...DESTRUCTIVE },\n\t\thandler: ({ shot, commands }) => apply({ op: 'delete_commands', shot, commands }, 'Delete commands')\n\t};\n\n\tconst setSettings: AgentTool = {\n\t\tname: 'set_animation_settings',\n\t\ttitle: 'Change animation settings',\n\t\tdescription: 'Sets the name, description, loop mode, export frame rate, stepped time, beat grid, narration word timings or target length. Returns the timing.',\n\t\tinputSchema: object(SETTINGS),\n\t\tannotations: { title: 'Change animation settings', ...WRITE_IDEMPOTENT },\n\t\thandler: (args) => apply({ op: 'set_settings', ...args }, 'Change settings')\n\t};\n\n\tconst setControls: AgentTool = {\n\t\tname: 'set_animation_controls',\n\t\ttitle: 'Set Flair controls',\n\t\tdescription:\n\t\t\t'Sets the colour controls (and presets) a Flair effect made from this animation exposes: each control stands for every use of its default colour. Replaces the existing controls; an empty list clears them. Returns the issues.',\n\t\tinputSchema: object({ controls: { type: 'array', items: CONTROL, description: 'Controls (empty clears).' }, presets: { type: 'array', items: PRESET, description: 'Presets (empty clears; omit to keep).' } }, ['controls']),\n\t\tannotations: { title: 'Set Flair controls', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ controls, presets }) => apply({ op: 'set_controls', controls, presets }, 'Set controls')\n\t};\n\n\tconst editAnimation: AgentTool = {\n\t\tname: 'edit_animation',\n\t\ttitle: 'Make several edits at once',\n\t\tdescription:\n\t\t\t'Applies several edits in order as one undo step, all or nothing: if one fails, nothing changes and the error names the op (\"op 2 (add_commands): …\"). With dry_run it only reports the timing and issues the edits would give.',\n\t\tinputSchema: object({ ops: { type: 'array', items: EDIT_OP, minItems: 1, description: 'Edits, applied in order.' }, dry_run: { type: 'boolean', description: 'Check without applying (default false).' } }, ['ops']),\n\t\tannotations: { title: 'Make several edits at once', ...WRITE },\n\t\thandler: ({ ops, dry_run = false }) => {\n\t\t\tconst result = controller.apply(ops, 'Edit animation', { dryRun: dry_run });\n\t\t\treturn outcome(result, dry_run ? { dry_run: true, hint: 'Nothing was applied; call again without dry_run to apply.' } : {});\n\t\t}\n\t};\n\n\tconst writeAnimation: AgentTool = {\n\t\tname: 'write_animation',\n\t\ttitle: 'Replace the animation\\'s shots',\n\t\tdescription:\n\t\t\t'Replaces every shot (and optionally the settings and controls), keeping the artwork, as one undo step. For small changes prefer the per-operation tools. Returns the timing and issues.',\n\t\tinputSchema: object({ shots: { type: 'array', items: SHOT, description: 'All shots, in order.' }, ...SETTINGS, controls: { type: 'array', items: CONTROL, description: 'Colour controls.' }, presets: { type: 'array', items: PRESET, description: 'Presets.' } }, ['shots']),\n\t\tannotations: { title: 'Replace the animation\\'s shots', ...DESTRUCTIVE },\n\t\thandler: ({ shots, controls, presets, ...settings }) => {\n\t\t\tconst current = scene();\n\t\t\tconst next: MotionScene = { ...current, shots };\n\t\t\tconst edits: MotionEdit[] = [{ op: 'replace_scene', scene: next }];\n\t\t\tif (Object.keys(settings).length) edits.push({ op: 'set_settings', ...settings });\n\t\t\tif (controls) edits.push({ op: 'set_controls', controls, presets });\n\t\t\treturn apply(edits, 'Replace animation');\n\t\t}\n\t};\n\n\tconst seekAnimation: AgentTool = {\n\t\tname: 'seek_animation',\n\t\ttitle: 'Show a moment',\n\t\tdescription: 'Moves the playhead the person sees to a time or the start of a shot, and plays or pauses. Does not change the animation. Returns the playhead time and shot.',\n\t\tinputSchema: object({ time: MS('Time from the start'), shot: { ...SHOT_ID, description: 'Go to the start of this shot instead of \"time\".' }, play: { type: 'boolean', description: 'true plays from there, false pauses (default: leave as is).' } }),\n\t\tannotations: { title: 'Show a moment', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ time, shot, play }) => {\n\t\t\tif (shot !== undefined && !controller.seekShot(shot)) throw new Error(`There is no shot \"${shot}\"; the shots are ${scene().shots.map((s) => `\"${s.id}\"`).join(', ') || 'none yet'}.`);\n\t\t\tif (shot === undefined && time !== undefined) controller.seek(time);\n\t\t\tif (play === true) controller.play();\n\t\t\tif (play === false) controller.pause();\n\t\t\tconst state = controller.getState();\n\t\t\treturn { time: state.time, shot: state.currentShot, playing: state.playing };\n\t\t}\n\t};\n\n\tconst undo: AgentTool = {\n\t\tname: 'undo_animation',\n\t\ttitle: 'Undo an animation edit',\n\t\tdescription: 'Undoes the last edit. Returns whether something was undone and its label.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Undo an animation edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().undoLabel;\n\t\t\tconst undone = controller.undo();\n\t\t\treturn { undone, ...(undone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst redo: AgentTool = {\n\t\tname: 'redo_animation',\n\t\ttitle: 'Redo an animation edit',\n\t\tdescription: 'Redoes the last undone edit. Returns whether something was redone and its label.',\n\t\tinputSchema: object({}),\n\t\tannotations: { title: 'Redo an animation edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().redoLabel;\n\t\t\tconst redone = controller.redo();\n\t\t\treturn { redone, ...(redone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst reads = [getAnimation, getShot, findElements, getTimingGrid, checkAnimation, renderFrame, exportFlairMotion, exportFlairEffect, seekAnimation];\n\tconst writes = [setArtworkSvg, fitAnimation, importFlairEffect, insertShots, updateShot, deleteShots, moveShot, addCommands, updateCommand, deleteCommands, setSettings, setControls, editAnimation, writeAnimation, undo, redo];\n\n\treturn {\n\t\tid: options.id ?? 'animation',\n\t\tnamespace: options.namespace,\n\t\ttools: () => (readOnlyReason() ? reads : [...reads, ...writes]),\n\t\tsubscribe: (notify) => {\n\t\t\tlet last = readOnlyReason();\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tconst now = readOnlyReason();\n\t\t\t\tif (now !== last) {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n}\n","/**\n * A short authoring guide for a model writing vector animations with the animation editor's\n * tools. Static, so it caches well as part of a system prompt.\n */\nexport const ANIMATION_EDITOR_AGENT_INSTRUCTIONS = `You animate vector artwork. A scene is artwork (vector paths and groups, each with an id) plus shots.\n\nHow it plays\n- Shots play in order. A shot optionally moves the camera, plays its commands, then holds (default 600 ms).\n- Commands in a shot play one after another; give \"with\": \"previous\" to start one together with the command before, \"delay\" to wait, \"stagger\" to offset several targets.\n- Timing comes from the content: each command has a default length (enter 600 ms, move 700 ms, draw follows the path length). Only set \"duration\" to change the pace.\n- Anything that enters later is hidden until it enters. Things that never enter are visible from the start.\n- Every frame is a pure function of time: the same scene always plays the same frames.\n\nCommands\n- enter (fade, pop, grow, slide, draw) and exit (fade, shrink, slide, undraw) bring things in and out.\n- enter also reveals through a clip over the target's box: wipe (behind an edge travelling \"direction\", default right), iris (from the centre; \"shape\": circle or box) and split (from a line through the middle; \"orientation\": horizontal or vertical). exit wipe hides the same way. Reveals need a width and a height: use draw / undraw for a straight line.\n- draw draws strokes on to a fraction; move, rotate, scale and fade change the pose (about the centre); style blends solid colours and stroke width.\n- enter also has zoom (settles from larger) and rise (rises a short way, overshooting a touch); pop and zoom take a starting \"scale\".\n- morph turns a shape into another node's shape (keep the target hidden); match does the same for a whole group, part by part (Smart Animate: draw the end state as a second, hidden group whose parts share names with the first); follow moves along a path node (with \"rotate\", moves made meanwhile turn with the path).\n- Emphasis draws the eye and returns to rest: pulse (swell), shake (side to side, or \"axis\": \"vertical\"), teeter (rock), wave (bob, no settling), wiggle (seeded wander; the same seed wanders the same way) and color-pulse (tint and back).\n- Emphasis stacks on other motion: a shake during a slide shakes as it slides. Give move, rotate or scale \"blend\": \"add\" to stack them too (what they add stays); \"blend\": \"replace\" makes a change take over instead.\n- Any command but enter and exit can \"repeat\" (loop, mirror back and forth, or offset to carry on: rotate by 90, repeat 4 is a full turn); \"duration\" is one cycle.\n- Springs (\"spring-gentle\", \"spring-quick\", \"spring-bouncy\", \"spring-slow\" or { \"type\": \"spring\", … }) feel physical; leave \"duration\" out and the spring sets it.\n- To time shots to music or a voiceover: set a \"beat\" grid or \"narration\" word timings with set_animation_settings, read them with get_timing_grid, and give a shot \"at\": { \"beat\": n } or { \"word\": i }. The shot before holds until the cue; check_animation warns when a cue is missed.\n- \"steps\": 12 (on a command, or for the whole scene with set_animation_settings) holds poses \"on twos\" for a hand-drawn look. \"geometric\": true on scale or a camera zooms at an even rate.\n- Commands share their names and defaults with Flair's motion primitives (get_animation shows each one's \"flairPrimitive\"), and emphasis, reveals and follows export to Flair exactly.\n- effect tweens a numeric parameter of a live path effect already on the node (twist angle, wiggle time, zig zag size).\n\nWorking method\n1. get_animation to learn the element ids (set_animation_artwork_svg first if there is no artwork: give every element you will animate an id; or import_flair_effect to start from a Flair effect and edit it).\n2. Plan a few shots, each one idea. Add them with insert_shots, or edit_animation to make several edits as one step (dry_run first when unsure).\n3. To hit a length, fit_animation (keep the shots whose pace matters). check_animation and fix every error and warning; render_animation_frame (shot + \"end\") to look at the result.\n4. To make a reusable Flair effect, set_animation_controls (colour controls stand for every use of their default colour) and export_flair_effect.\n\nKeep motion purposeful: one thing moving at a time reads best, ease-out for arrivals, ease-in for exits, and hold long enough to see each result.`;\n"],"mappings":"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","names":["command","command","command","end","duration","ease","opacity","shotIndex","command","command","rest","TRANSFORM_PROPS","round","command","command","command"]}
|