@pixerate/editor 0.66.1 → 0.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation-editor/index.cjs +52 -9
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +34 -3
- package/dist/animation-editor/index.d.ts +34 -3
- package/dist/animation-editor/index.js +51 -8
- package/dist/animation-editor/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -55,6 +55,7 @@ var _chunkA6PHCAGXcjs = require('../chunk-A6PHCAGX.cjs');
|
|
|
55
55
|
var _chunk2FHLHZALcjs = require('../chunk-2FHLHZAL.cjs');
|
|
56
56
|
|
|
57
57
|
// src/animation-editor/types.ts
|
|
58
|
+
var MOTION_TRIGGERS = ["click", "hover", "press", "scroll"];
|
|
58
59
|
var MOTION_COMMAND_TYPES = [
|
|
59
60
|
"enter",
|
|
60
61
|
"exit",
|
|
@@ -153,6 +154,9 @@ var MOTION_ISSUE_CODES = {
|
|
|
153
154
|
"spring-cut-short": { severity: "warning", wording: "A spring is given a duration shorter than it takes to settle, so it jumps to its end." },
|
|
154
155
|
"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." },
|
|
155
156
|
"cue-missed": { severity: "warning", wording: "A shot starts after its cue, because the shot before runs past it." },
|
|
157
|
+
"trigger-loop": { severity: "note", wording: "A scene that plays on a trigger ignores its loop." },
|
|
158
|
+
"click-cue": { severity: "warning", wording: "A shot of a click-triggered scene is cued, but clicks decide when its shots start." },
|
|
159
|
+
"click-one-shot": { severity: "note", wording: "A click-triggered scene has one shot, so every click replays it." },
|
|
156
160
|
"scene-too-long": { severity: "warning", wording: "The scene runs past its target length." },
|
|
157
161
|
"scene-too-short": { severity: "warning", wording: "The scene ends before its target length." },
|
|
158
162
|
"unknown-control-color": { severity: "warning", wording: "A control stands for a colour the scene never uses." },
|
|
@@ -210,7 +214,7 @@ ${problems.map((p) => `- ${p}`).join("\n")}`);
|
|
|
210
214
|
this.problems = problems;
|
|
211
215
|
}
|
|
212
216
|
};
|
|
213
|
-
var SCENE_KEYS = ["version", "name", "description", "artwork", "shots", "loop", "fps", "steps", "beat", "narration", "target", "controls", "presets"];
|
|
217
|
+
var SCENE_KEYS = ["version", "name", "description", "artwork", "shots", "loop", "trigger", "fps", "steps", "beat", "narration", "target", "controls", "presets"];
|
|
214
218
|
var SHOT_KEYS = ["id", "label", "camera", "at", "run", "hold", "speed"];
|
|
215
219
|
var CAMERA_KEYS = ["x", "y", "width", "height", "frame", "padding", "ease", "ms", "geometric"];
|
|
216
220
|
var BASE_KEYS = ["type", "targets", "duration", "delay", "stagger", "with", "ease", "note", "repeat", "repeatMode", "steps"];
|
|
@@ -403,6 +407,7 @@ function motionSceneShapeProblems(input) {
|
|
|
403
407
|
const art = input.artwork;
|
|
404
408
|
if (!isObject(art) || !isNum(art.width) || !isNum(art.height) || !(art.width > 0) || !(art.height > 0) || !Array.isArray(art.nodes))
|
|
405
409
|
problems.push('Scene: "artwork" must be a vector document { width, height, nodes }.');
|
|
410
|
+
if (input.trigger !== void 0 && !MOTION_TRIGGERS.includes(input.trigger)) problems.push(`Scene: "trigger" must be one of ${MOTION_TRIGGERS.join(", ")}.`);
|
|
406
411
|
if (input.loop !== void 0 && !["none", "loop", "ping-pong"].includes(input.loop)) problems.push('Scene: "loop" must be "none", "loop" or "ping-pong".');
|
|
407
412
|
if (input.fps !== void 0 && !(isNum(input.fps) && input.fps > 0 && input.fps <= 120)) problems.push('Scene: "fps" must be a number from 1 to 120.');
|
|
408
413
|
if (input.beat !== void 0) {
|
|
@@ -1493,6 +1498,15 @@ function checkMotionScene(scene) {
|
|
|
1493
1498
|
}
|
|
1494
1499
|
});
|
|
1495
1500
|
});
|
|
1501
|
+
if (scene.trigger) {
|
|
1502
|
+
if ((_nullishCoalesce(scene.loop, () => ( "none"))) !== "none") issues.push(motionIssue("trigger-loop", `The scene plays on ${scene.trigger}, so its "${scene.loop}" loop does not apply; set loop to "none" or remove the trigger.`, {}));
|
|
1503
|
+
if (scene.trigger === "click") {
|
|
1504
|
+
if (scene.shots.length === 1) issues.push(motionIssue("click-one-shot", "The scene plays on click but has one shot, so every click replays it from the start; split it into shots (the first plays on load, each click plays the next).", { shot: scene.shots[0].id }));
|
|
1505
|
+
scene.shots.forEach((shot, i) => {
|
|
1506
|
+
if (i > 0 && shot.at) issues.push(motionIssue("click-cue", `Shot "${shot.id}" is cued, but on click a shot starts when it is clicked to; remove its "at" or the trigger.`, { shot: shot.id }));
|
|
1507
|
+
});
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1496
1510
|
scene.shots.forEach((shot, i) => {
|
|
1497
1511
|
if (!shot.at) return;
|
|
1498
1512
|
const timing = timeline.shots[i];
|
|
@@ -1600,6 +1614,11 @@ function applyOne(scene, edit) {
|
|
|
1600
1614
|
if (edit.description === null) delete next.description;
|
|
1601
1615
|
else if (edit.description !== void 0) next.description = edit.description;
|
|
1602
1616
|
if (edit.loop !== void 0) next.loop = edit.loop;
|
|
1617
|
+
if (edit.trigger === null) delete next.trigger;
|
|
1618
|
+
else if (edit.trigger !== void 0) {
|
|
1619
|
+
if (!["click", "hover", "press", "scroll"].includes(edit.trigger)) fail('"trigger" must be click, hover, press or scroll, or null to play on its own.');
|
|
1620
|
+
next.trigger = edit.trigger;
|
|
1621
|
+
}
|
|
1603
1622
|
if (edit.fps !== void 0) next.fps = edit.fps;
|
|
1604
1623
|
if (edit.steps === null) delete next.steps;
|
|
1605
1624
|
else if (edit.steps !== void 0) {
|
|
@@ -2044,9 +2063,25 @@ function toFlairSvgMotion(scene, options = {}) {
|
|
|
2044
2063
|
}
|
|
2045
2064
|
}
|
|
2046
2065
|
animate.sort((x, y) => (_nullishCoalesce(x.delay, () => ( 0))) - (_nullishCoalesce(y.delay, () => ( 0))));
|
|
2066
|
+
const lastChange = animate.reduce((m, a) => Math.max(m, (_nullishCoalesce(a.delay, () => ( 0))) + (_nullishCoalesce(a.ms, () => ( 0)))), 0);
|
|
2067
|
+
const trigger = options.trigger === null ? void 0 : _nullishCoalesce(options.trigger, () => ( scene.trigger));
|
|
2068
|
+
if (trigger === "click" && timeline.shots.length > 1) {
|
|
2069
|
+
for (const a of animate) {
|
|
2070
|
+
const at = _nullishCoalesce(a.delay, () => ( 0));
|
|
2071
|
+
let step = 0;
|
|
2072
|
+
timeline.shots.forEach((shot, i) => {
|
|
2073
|
+
if (shot.start <= at + 1e-6) step = i;
|
|
2074
|
+
});
|
|
2075
|
+
const delay = round2(at - timeline.shots[step].start);
|
|
2076
|
+
delete a.delay;
|
|
2077
|
+
if (delay > 0) a.delay = delay;
|
|
2078
|
+
if (step > 0) a.step = step;
|
|
2079
|
+
}
|
|
2080
|
+
animate.sort((x, y) => (_nullishCoalesce(x.step, () => ( 0))) - (_nullishCoalesce(y.step, () => ( 0))) || (_nullishCoalesce(x.delay, () => ( 0))) - (_nullishCoalesce(y.delay, () => ( 0))));
|
|
2081
|
+
}
|
|
2082
|
+
if (trigger && (_nullishCoalesce(scene.loop, () => ( "none"))) !== "none") notes.push(`The scene plays on ${trigger}, so its loop does not apply in Flair.`);
|
|
2047
2083
|
let svg = _chunkYJLCBA7Vcjs.vectorDocumentToSvg.call(void 0, { ...scene.artwork, nodes: _chunkYJLCBA7Vcjs.expandVectorAppearances.call(void 0, scene.artwork.nodes) }, { pretty: false, precision, wrap });
|
|
2048
2084
|
if (routes.length) svg = svg.replace(/^(<svg[^>]*>)/, `$1<defs>${routes.join("")}</defs>`);
|
|
2049
|
-
const lastChange = animate.reduce((m, a) => Math.max(m, (_nullishCoalesce(a.delay, () => ( 0))) + (_nullishCoalesce(a.ms, () => ( 0)))), 0);
|
|
2050
2085
|
let motion = { svg, animate };
|
|
2051
2086
|
if (_optionalChain([scene, 'access', _57 => _57.controls, 'optionalAccess', _58 => _58.length])) {
|
|
2052
2087
|
const declarations = scene.controls.map((c) => `{{${c.name}: color default=${c.default.toUpperCase()}${c.label ? ` label='${c.label.replace(/'/g, "\u2019")}'` : ""}}}`).join(" ");
|
|
@@ -2056,7 +2091,7 @@ function toFlairSvgMotion(scene, options = {}) {
|
|
|
2056
2091
|
svg = svg.slice(0, header) + swap(svg.slice(header));
|
|
2057
2092
|
motion = { 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]])) } : a) };
|
|
2058
2093
|
}
|
|
2059
|
-
return { motion, duration: timeline.duration, hold: Math.max(0, round2(timeline.duration - lastChange)), sampled, notes: [...new Set(notes)] };
|
|
2094
|
+
return { motion, duration: timeline.duration, hold: Math.max(0, round2(timeline.duration - lastChange)), sampled, notes: [...new Set(notes)], ...trigger ? { trigger } : {} };
|
|
2060
2095
|
}
|
|
2061
2096
|
var kebab = (text) => text.trim().replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[^A-Za-z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase() || "animation";
|
|
2062
2097
|
function toFlairVectorEffect(scene, options = {}) {
|
|
@@ -2071,7 +2106,7 @@ function toFlairVectorEffect(scene, options = {}) {
|
|
|
2071
2106
|
motion: out.motion,
|
|
2072
2107
|
hold: out.hold,
|
|
2073
2108
|
..._optionalChain([scene, 'access', _59 => _59.presets, 'optionalAccess', _60 => _60.length]) ? { presets: scene.presets } : {},
|
|
2074
|
-
...
|
|
2109
|
+
...out.trigger ? { trigger: out.trigger } : {}
|
|
2075
2110
|
};
|
|
2076
2111
|
}
|
|
2077
2112
|
function toFlairEffectDocument(scene, options = {}) {
|
|
@@ -2083,7 +2118,8 @@ function toFlairEffectDocument(scene, options = {}) {
|
|
|
2083
2118
|
values: Object.fromEntries((_nullishCoalesce(scene.controls, () => ( []))).map((c) => [c.name, c.default])),
|
|
2084
2119
|
tracks: {},
|
|
2085
2120
|
duration: out.duration,
|
|
2086
|
-
|
|
2121
|
+
// Flair's editor documents have no trigger: a click scene keeps its steps, and plays through there.
|
|
2122
|
+
loop: !out.trigger && (_nullishCoalesce(scene.loop, () => ( "none"))) !== "none",
|
|
2087
2123
|
presets: _nullishCoalesce(scene.presets, () => ( []))
|
|
2088
2124
|
};
|
|
2089
2125
|
}
|
|
@@ -2278,9 +2314,8 @@ function fromFlairVectorEffect(effect, options = {}) {
|
|
|
2278
2314
|
const result = fromFlairSvgMotion(effect.motion, { name: _nullishCoalesce(_nullishCoalesce(options.name, () => ( effect.id)), () => ( effect.name)), hold: _nullishCoalesce(options.hold, () => ( effect.hold)) });
|
|
2279
2315
|
const names = new Set((_nullishCoalesce(result.scene.controls, () => ( []))).map((c) => c.name));
|
|
2280
2316
|
const presets = (_nullishCoalesce(effect.presets, () => ( []))).map((p) => ({ name: p.name, values: Object.fromEntries(Object.entries(p.values).flatMap(([k, v]) => names.has(k) && presetColor(v) ? [[k, presetColor(v)]] : [])) })).filter((p) => Object.keys(p.values).length);
|
|
2281
|
-
const scene = { ...result.scene, ...effect.description ? { description: effect.description } : {}, ...presets.length ? { presets } : {} };
|
|
2317
|
+
const scene = { ...result.scene, ...effect.description ? { description: effect.description } : {}, ...presets.length ? { presets } : {}, ...effect.trigger ? { trigger: effect.trigger } : {} };
|
|
2282
2318
|
const notes = [...result.notes];
|
|
2283
|
-
if (effect.trigger) notes.push(`The effect plays on ${effect.trigger}; scenes play through, so the trigger is not kept (pass it back to toFlairVectorEffect).`);
|
|
2284
2319
|
return { scene, notes, issues: checkMotionScene(scene) };
|
|
2285
2320
|
}
|
|
2286
2321
|
|
|
@@ -2359,6 +2394,7 @@ function toLottie(scene, options = {}) {
|
|
|
2359
2394
|
const timeline = compileMotionScene(scene);
|
|
2360
2395
|
const nodes = indexMotionNodes(scene.artwork.nodes);
|
|
2361
2396
|
const notes = [];
|
|
2397
|
+
if (scene.trigger) notes.push(`The scene plays on ${scene.trigger}; Lottie has no trigger, so it plays through (markers show where each shot starts, for a player to stop at).`);
|
|
2362
2398
|
let sampled = 0;
|
|
2363
2399
|
const track = (id, p) => _nullishCoalesce(timeline.tracks.get(motionTrackKey(id, p)), () => ( []));
|
|
2364
2400
|
const layers = (id, p) => _nullishCoalesce(timeline.tracks.get(`${motionTrackKey(id, p)}\0add`), () => ( []));
|
|
@@ -2987,6 +3023,10 @@ var SETTINGS = {
|
|
|
2987
3023
|
name: { type: "string", minLength: 1, description: 'Short name, e.g. "logo-reveal".' },
|
|
2988
3024
|
description: { type: ["string", "null"], description: "What it shows; null clears." },
|
|
2989
3025
|
loop: { type: "string", enum: ["none", "loop", "ping-pong"], description: "Playback past the end (default none)." },
|
|
3026
|
+
trigger: {
|
|
3027
|
+
anyOf: [{ type: "string", enum: ["click", "hover", "press", "scroll"] }, { type: "null" }],
|
|
3028
|
+
description: "Play in answer to the viewer when exported to Flair: click (the first shot plays on load, each click plays the next shot), hover or press (plays while the pointer is over or down, rewinds when it leaves), scroll (scrubs as it scrolls past). null plays on its own (default). The editor previews it played through."
|
|
3029
|
+
},
|
|
2990
3030
|
fps: { type: "number", minimum: 1, maximum: 120, description: "Sampling rate for exports (default 30)." },
|
|
2991
3031
|
steps: { 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).' },
|
|
2992
3032
|
beat: {
|
|
@@ -3109,6 +3149,7 @@ function createAnimationEditorToolProvider(controller, options = {}) {
|
|
|
3109
3149
|
artwork: { width: s.artwork.width, height: s.artwork.height },
|
|
3110
3150
|
duration: compileMotionScene(s).duration,
|
|
3111
3151
|
loop: _nullishCoalesce(s.loop, () => ( "none")),
|
|
3152
|
+
...s.trigger ? { trigger: s.trigger } : {},
|
|
3112
3153
|
...s.target ? { target: s.target } : {},
|
|
3113
3154
|
...includeElements ? { elements: describeMotionElements(s) } : {},
|
|
3114
3155
|
shots: describeMotionShots(s),
|
|
@@ -3454,7 +3495,7 @@ function createAnimationEditorToolProvider(controller, options = {}) {
|
|
|
3454
3495
|
const setSettings = {
|
|
3455
3496
|
name: "set_animation_settings",
|
|
3456
3497
|
title: "Change animation settings",
|
|
3457
|
-
description: "Sets the name, description, loop mode, export frame rate, stepped time, beat grid, narration word timings or target length. Returns the timing.",
|
|
3498
|
+
description: "Sets the name, description, loop mode, trigger (click, hover, press or scroll), export frame rate, stepped time, beat grid, narration word timings or target length. Returns the timing.",
|
|
3458
3499
|
inputSchema: object(SETTINGS),
|
|
3459
3500
|
annotations: { title: "Change animation settings", ...WRITE_IDEMPOTENT },
|
|
3460
3501
|
handler: (args) => apply({ op: "set_settings", ...args }, "Change settings")
|
|
@@ -3580,6 +3621,7 @@ Working method
|
|
|
3580
3621
|
1. 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).
|
|
3581
3622
|
2. Plan a few shots, each one idea. Add them with insert_shots (add_commands, update_command, move_command and delete_commands refine a shot), or edit_animation to make several edits as one step (dry_run first when unsure).
|
|
3582
3623
|
3. 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; add onion_skin or motion_paths to see the motion in one picture, or get_motion_path for the numbers.
|
|
3624
|
+
- For something the viewer plays (a button, a toggle, a step-by-step explainer), set "trigger" with set_animation_settings: click plays the next shot on each click (make the last shot lead back to how the first ended for a toggle), hover or press plays and rewinds, scroll scrubs.
|
|
3583
3625
|
4. To make a reusable Flair effect, set_animation_controls (colour controls stand for every use of their default colour) and export_flair_effect.
|
|
3584
3626
|
|
|
3585
3627
|
Keep 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.`;
|
|
@@ -3976,5 +4018,6 @@ function parseMotionNarration(text) {
|
|
|
3976
4018
|
|
|
3977
4019
|
|
|
3978
4020
|
|
|
3979
|
-
|
|
4021
|
+
|
|
4022
|
+
exports.ANIMATION_EDITOR_AGENT_INSTRUCTIONS = ANIMATION_EDITOR_AGENT_INSTRUCTIONS; exports.AnimationEditorController = AnimationEditorController; exports.FLAIR_EASES = FLAIR_EASES; exports.FLAIR_EXPORT_VERSION = FLAIR_EXPORT_VERSION; exports.MOTION_ADDITIVE_PROPERTIES = MOTION_ADDITIVE_PROPERTIES; exports.MOTION_BLENDS = MOTION_BLENDS; exports.MOTION_CAMERA_MS = MOTION_CAMERA_MS; exports.MOTION_COMMAND_SCHEMA = MOTION_COMMAND_SCHEMA; exports.MOTION_COMMAND_TYPES = MOTION_COMMAND_TYPES; exports.MOTION_DEFAULT_DURATIONS = MOTION_DEFAULT_DURATIONS; exports.MOTION_DEFAULT_HOLD = MOTION_DEFAULT_HOLD; exports.MOTION_DIRECTIONS = MOTION_DIRECTIONS; exports.MOTION_DRAW_EFFECT_ID = MOTION_DRAW_EFFECT_ID; exports.MOTION_DRAW_MS_PER_UNIT = MOTION_DRAW_MS_PER_UNIT; exports.MOTION_DRAW_RANGE = MOTION_DRAW_RANGE; exports.MOTION_EASE_CHOICES = MOTION_EASE_CHOICES; exports.MOTION_EASE_IN_OUT = MOTION_EASE_IN_OUT; exports.MOTION_EASE_OUT = MOTION_EASE_OUT; exports.MOTION_EDIT_OPS = MOTION_EDIT_OPS; exports.MOTION_ENTER_STYLES = MOTION_ENTER_STYLES; exports.MOTION_EXIT_STYLES = MOTION_EXIT_STYLES; exports.MOTION_IRIS_SHAPES = MOTION_IRIS_SHAPES; exports.MOTION_ISSUE_CODES = MOTION_ISSUE_CODES; exports.MOTION_MIN_CHANGE_MS = MOTION_MIN_CHANGE_MS; exports.MOTION_REPEAT_MODES = MOTION_REPEAT_MODES; exports.MOTION_SPEED_RANGE = MOTION_SPEED_RANGE; exports.MOTION_SPLIT_ORIENTATIONS = MOTION_SPLIT_ORIENTATIONS; exports.MOTION_TRIGGERS = MOTION_TRIGGERS; exports.MotionSceneFormatError = MotionSceneFormatError; exports.activeSegment = activeSegment; exports.applyMotionControlValues = applyMotionControlValues; exports.applyMotionEdits = applyMotionEdits; exports.checkMotionScene = checkMotionScene; exports.commandShapeProblems = commandShapeProblems; exports.compileMotionScene = compileMotionScene; exports.createAnimationEditorToolProvider = createAnimationEditorToolProvider; exports.createMotionScene = createMotionScene; exports.defaultMotionCommand = defaultMotionCommand; exports.describeMotionElements = describeMotionElements; exports.describeMotionShots = describeMotionShots; exports.duplicateMotionCommandEdit = duplicateMotionCommandEdit; exports.fitMotionRect = fitMotionRect; exports.fitMotionScene = fitMotionScene; exports.fitMotionSceneEdits = fitMotionSceneEdits; exports.flairAtLeast = flairAtLeast; exports.flairCurveFor = flairCurveFor; exports.flairEaseFor = flairEaseFor; exports.formatMotionNarration = formatMotionNarration; exports.freshShotId = freshShotId; exports.fromFlairSvgMotion = fromFlairSvgMotion; exports.fromFlairVectorEffect = fromFlairVectorEffect; exports.highlightMotionSvg = highlightMotionSvg; exports.indexMotionNodes = indexMotionNodes; exports.interpolateMotionValue = interpolateMotionValue; exports.isMotionCommand = isMotionCommand; exports.isMotionShot = isMotionShot; exports.matchMotionNodes = matchMotionNodes; exports.motionAddTrackKey = motionAddTrackKey; exports.motionBeatAt = motionBeatAt; exports.motionBeatTime = motionBeatTime; exports.motionClipAttrs = motionClipAttrs; exports.motionCommandDuration = motionCommandDuration; exports.motionCommandFields = motionCommandFields; exports.motionCommandRepeat = motionCommandRepeat; exports.motionCommandRows = motionCommandRows; exports.motionCommandSummary = motionCommandSummary; exports.motionCueChoices = motionCueChoices; exports.motionCueFromKey = motionCueFromKey; exports.motionCueKey = motionCueKey; exports.motionCueTime = motionCueTime; exports.motionCycleDuration = motionCycleDuration; exports.motionEaseKey = motionEaseKey; exports.motionEasingCurve = motionEasingCurve; exports.motionEasingGuides = motionEasingGuides; exports.motionEasingPath = motionEasingPath; exports.motionFieldEdit = motionFieldEdit; exports.motionFieldLabel = motionFieldLabel; exports.motionFlairPrimitive = motionFlairPrimitive; exports.motionFollowRoute = motionFollowRoute; exports.motionFrameAt = motionFrameAt; exports.motionFrameToSvg = motionFrameToSvg; exports.motionGhosts = motionGhosts; exports.motionIssue = motionIssue; exports.motionIssueKey = motionIssueKey; exports.motionIssueLine = motionIssueLine; exports.motionMovingIds = motionMovingIds; exports.motionNodeAtElement = motionNodeAtElement; exports.motionNodeClips = motionNodeClips; exports.motionNodeOffset = motionNodeOffset; exports.motionPath = motionPath; exports.motionPathLength = motionPathLength; exports.motionPathsSvg = motionPathsSvg; exports.motionRestValue = motionRestValue; exports.motionRevealClip = motionRevealClip; exports.motionRevealPadding = motionRevealPadding; exports.motionRulerTicks = motionRulerTicks; exports.motionSceneShapeProblems = motionSceneShapeProblems; exports.motionSceneToJson = motionSceneToJson; exports.motionShotAt = motionShotAt; exports.motionShotCueTime = motionShotCueTime; exports.motionShotTimeScale = motionShotTimeScale; exports.motionStageSvg = motionStageSvg; exports.motionTrackKey = motionTrackKey; exports.namedWithSuggestion = namedWithSuggestion; exports.parseMotionFieldInput = parseMotionFieldInput; exports.parseMotionNarration = parseMotionNarration; exports.parseMotionScene = parseMotionScene; exports.resolveMotionCamera = resolveMotionCamera; exports.segmentProgress = segmentProgress; exports.segmentValue = segmentValue; exports.shotShapeProblems = shotShapeProblems; exports.suggestName = suggestName; exports.toFlairEffectDocument = toFlairEffectDocument; exports.toFlairSvgMotion = toFlairSvgMotion; exports.toFlairVectorEffect = toFlairVectorEffect; exports.toLottie = toLottie; exports.trackValue = trackValue; exports.withMotionLayers = withMotionLayers; exports.withViewBox = withViewBox;
|
|
3980
4023
|
//# sourceMappingURL=index.cjs.map
|