@pixerate/editor 0.59.0 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/agent/index.cjs +111 -38
  2. package/dist/agent/index.cjs.map +1 -1
  3. package/dist/agent/index.d.cts +30 -2
  4. package/dist/agent/index.d.ts +30 -2
  5. package/dist/agent/index.js +96 -23
  6. package/dist/agent/index.js.map +1 -1
  7. package/dist/agent-caret-BmYhQF7L.d.cts +106 -0
  8. package/dist/agent-caret-BmYhQF7L.d.ts +106 -0
  9. package/dist/animation-editor/index.cjs +85 -47
  10. package/dist/animation-editor/index.cjs.map +1 -1
  11. package/dist/animation-editor/index.d.cts +82 -2
  12. package/dist/animation-editor/index.d.ts +82 -2
  13. package/dist/animation-editor/index.js +84 -46
  14. package/dist/animation-editor/index.js.map +1 -1
  15. package/dist/{chunk-LMUDHBWR.js → chunk-4YFMSPBU.js} +2 -2
  16. package/dist/{chunk-3I6V7PI4.cjs → chunk-7ZSU4MQZ.cjs} +45 -45
  17. package/dist/{chunk-3I6V7PI4.cjs.map → chunk-7ZSU4MQZ.cjs.map} +1 -1
  18. package/dist/{chunk-WLVZ235X.js → chunk-OK7T2LHK.js} +229 -2
  19. package/dist/chunk-OK7T2LHK.js.map +1 -0
  20. package/dist/{chunk-AHCENCU4.cjs → chunk-T4XWVPJK.cjs} +253 -26
  21. package/dist/chunk-T4XWVPJK.cjs.map +1 -0
  22. package/dist/extensions/index.cjs +27 -3
  23. package/dist/extensions/index.cjs.map +1 -1
  24. package/dist/extensions/index.d.cts +2 -1
  25. package/dist/extensions/index.d.ts +2 -1
  26. package/dist/extensions/index.js +26 -2
  27. package/dist/{index-CTCc3m3C.d.ts → index-B16wbOn_.d.ts} +1 -0
  28. package/dist/{index-BcHyG0Wq.d.cts → index-BAt14aIU.d.cts} +1 -0
  29. package/dist/index.cjs +32 -8
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +3 -2
  32. package/dist/index.d.ts +3 -2
  33. package/dist/index.js +26 -2
  34. package/dist/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/chunk-AHCENCU4.cjs.map +0 -1
  37. package/dist/chunk-WLVZ235X.js.map +0 -1
  38. /package/dist/{chunk-LMUDHBWR.js.map → chunk-4YFMSPBU.js.map} +0 -0
@@ -74,6 +74,7 @@ var MOTION_COMMAND_TYPES = [
74
74
  "wait"
75
75
  ];
76
76
  var MOTION_ENTER_STYLES = ["fade", "pop", "grow", "slide", "draw", "zoom", "rise", "wipe", "iris", "split"];
77
+ var MOTION_BLENDS = ["replace", "add"];
77
78
  var MOTION_REPEAT_MODES = ["loop", "mirror", "offset"];
78
79
  var MOTION_EXIT_STYLES = ["fade", "shrink", "slide", "undraw", "wipe"];
79
80
  var MOTION_IRIS_SHAPES = ["circle", "box"];
@@ -209,18 +210,18 @@ var COMMAND_KEYS = {
209
210
  enter: [...BASE_KEYS, "style", "direction", "distance", "scale", "shape", "orientation"],
210
211
  exit: [...BASE_KEYS, "style", "direction", "distance"],
211
212
  draw: [...BASE_KEYS, "from", "to"],
212
- move: [...BASE_KEYS, "by", "to"],
213
- rotate: [...BASE_KEYS, "by", "to"],
214
- scale: [...BASE_KEYS, "to", "geometric"],
213
+ move: [...BASE_KEYS, "by", "to", "blend"],
214
+ rotate: [...BASE_KEYS, "by", "to", "blend"],
215
+ scale: [...BASE_KEYS, "to", "geometric", "blend"],
215
216
  fade: [...BASE_KEYS, "to"],
216
217
  style: [...BASE_KEYS, "fill", "stroke", "strokeWidth"],
217
218
  morph: [...BASE_KEYS, "into"],
218
219
  follow: [...BASE_KEYS, "path", "rotate", "from", "to"],
219
- pulse: [...BASE_KEYS, "amount", "count"],
220
- shake: [...BASE_KEYS, "amount", "count", "axis"],
221
- teeter: [...BASE_KEYS, "angle", "count"],
222
- wave: [...BASE_KEYS, "amount", "count"],
223
- wiggle: [...BASE_KEYS, "amount", "frequency", "octaves", "rotate", "seed"],
220
+ pulse: [...BASE_KEYS, "amount", "count", "blend"],
221
+ shake: [...BASE_KEYS, "amount", "count", "axis", "blend"],
222
+ teeter: [...BASE_KEYS, "angle", "count", "blend"],
223
+ wave: [...BASE_KEYS, "amount", "count", "blend"],
224
+ wiggle: [...BASE_KEYS, "amount", "frequency", "octaves", "rotate", "seed", "blend"],
224
225
  "color-pulse": [...BASE_KEYS, "color", "paint", "count"],
225
226
  effect: [...BASE_KEYS, "effect", "param", "to"],
226
227
  wait: ["type", "duration", "with", "note"]
@@ -264,6 +265,7 @@ function commandShapeProblems(command2, where) {
264
265
  if (type === "enter" || type === "exit") p(`"repeat" is not for ${type} (it brings things in or out once); repeat an emphasis or a move instead.`);
265
266
  else if (!(Number.isInteger(command2.repeat) && command2.repeat >= 1 && command2.repeat <= 1e3)) p(`"repeat" must be a whole number from 1 to 1000.`);
266
267
  }
268
+ if (command2.blend !== void 0 && !MOTION_BLENDS.includes(command2.blend)) p(`"blend" must be "replace" (the change takes over) or "add" (a layer on top).`);
267
269
  if (command2.repeatMode !== void 0 && !MOTION_REPEAT_MODES.includes(command2.repeatMode)) p(`"repeatMode" must be one of ${MOTION_REPEAT_MODES.join(", ")}.`);
268
270
  if (command2.steps !== void 0 && !(isNum(command2.steps) && command2.steps > 0 && command2.steps <= 120)) p(`"steps" must be frames per second from above 0 to 120 (12 holds each pose for two frames at 24 fps).`);
269
271
  switch (type) {
@@ -595,6 +597,20 @@ function trackValue(track, time, raw = false) {
595
597
  return first.from;
596
598
  }
597
599
  var motionTrackKey = (node, property) => `${node}\0${property}`;
600
+ var motionAddTrackKey = (node, property) => `${node}\0${property}\0add`;
601
+ var MOTION_ADDITIVE_PROPERTIES = ["x", "y", "rotation", "scaleX", "scaleY"];
602
+ function withMotionLayers(timeline, node, property, base, time, raw = false) {
603
+ const layers = timeline.tracks.get(motionAddTrackKey(node, property));
604
+ if (!layers) return base;
605
+ const scale = property === "scaleX" || property === "scaleY";
606
+ let v = base;
607
+ for (const layer of layers) {
608
+ if (layer.start > time) continue;
609
+ const x = Number(segmentValue(layer, time, raw));
610
+ if (Number.isFinite(x)) v = scale ? v * x : v + x;
611
+ }
612
+ return v;
613
+ }
598
614
  function fitMotionRect(rect, aspect) {
599
615
  const cx = rect.x + rect.width / 2;
600
616
  const cy = rect.y + rect.height / 2;
@@ -698,7 +714,7 @@ function compileMotionScene(scene) {
698
714
  return v ?? motionRestValue(nodes.get(node), property, artwork);
699
715
  };
700
716
  const push = (segment) => {
701
- const key = motionTrackKey(segment.node, segment.property);
717
+ const key = segment.blend === "add" ? motionAddTrackKey(segment.node, segment.property) : motionTrackKey(segment.node, segment.property);
702
718
  let track = tracks.get(key);
703
719
  if (!track) tracks.set(key, track = []);
704
720
  track.push(segment);
@@ -837,18 +853,26 @@ function compileMotionScene(scene) {
837
853
  dx = target.x - (entry.center.x + num("x"));
838
854
  dy = target.y - (entry.center.y + num("y"));
839
855
  }
840
- seg("x", num("x") + dx, e);
841
- seg("y", num("y") + dy, e);
856
+ if (command2.blend === "add") {
857
+ seg("x", dx, e, start, end, { from: 0, blend: "add" });
858
+ seg("y", dy, e, start, end, { from: 0, blend: "add" });
859
+ } else {
860
+ seg("x", num("x") + dx, e);
861
+ seg("y", num("y") + dy, e);
862
+ }
842
863
  break;
843
864
  }
844
- case "rotate":
845
- seg("rotation", command2.to ?? num("rotation") + (command2.by ?? 0), ease ?? MOTION_EASE_IN_OUT);
865
+ case "rotate": {
866
+ const e = ease ?? MOTION_EASE_IN_OUT;
867
+ if (command2.blend === "add") seg("rotation", command2.to !== void 0 ? command2.to - num("rotation") : command2.by ?? 0, e, start, end, { from: 0, blend: "add" });
868
+ else seg("rotation", command2.to ?? num("rotation") + (command2.by ?? 0), e);
846
869
  break;
870
+ }
847
871
  case "scale": {
848
872
  const to = typeof command2.to === "number" ? { x: command2.to, y: command2.to } : command2.to;
849
- const geometric = command2.geometric ? { geometric: true } : {};
850
- seg("scaleX", to.x, ease ?? MOTION_EASE_IN_OUT, start, end, geometric);
851
- seg("scaleY", to.y, ease ?? MOTION_EASE_IN_OUT, start, end, geometric);
873
+ const extra = { ...command2.geometric ? { geometric: true } : {}, ...command2.blend === "add" ? { from: 1, blend: "add" } : {} };
874
+ seg("scaleX", to.x, ease ?? MOTION_EASE_IN_OUT, start, end, extra);
875
+ seg("scaleY", to.y, ease ?? MOTION_EASE_IN_OUT, start, end, extra);
852
876
  break;
853
877
  }
854
878
  case "fade":
@@ -866,30 +890,31 @@ function compileMotionScene(scene) {
866
890
  seg("follow", command2.to ?? 1, ease ?? MOTION_EASE_IN_OUT, start, end, { from: command2.from ?? 0, path: command2.path, rotate: command2.rotate ?? false });
867
891
  break;
868
892
  // Emphasis: a change toward a peak that a behaviour swings round (as Flair's primitives do).
869
- case "pulse": {
870
- const behavior = { type: "pulse", count: command2.count ?? 1 };
871
- const k = 1 + (command2.amount ?? 0.15);
872
- seg("scaleX", num("scaleX") * k, ease ?? "linear", start, end, { behavior });
873
- seg("scaleY", num("scaleY") * k, ease ?? "linear", start, end, { behavior });
874
- break;
875
- }
876
- case "shake": {
877
- const p = command2.axis === "vertical" ? "y" : "x";
878
- seg(p, num(p) + (command2.amount ?? 8), ease ?? "linear", start, end, { behavior: { type: "oscillate", count: command2.count ?? 3, decay: 1 } });
879
- break;
880
- }
893
+ case "pulse":
894
+ case "shake":
881
895
  case "teeter":
882
- seg("rotation", num("rotation") + (command2.angle ?? 8), ease ?? "linear", start, end, { behavior: { type: "oscillate", count: command2.count ?? 3, decay: 1 } });
883
- break;
884
896
  case "wave":
885
- seg("y", num("y") - (command2.amount ?? 6), ease ?? "linear", start, end, { behavior: { type: "oscillate", count: command2.count ?? 2 } });
886
- break;
887
897
  case "wiggle": {
888
- const behavior = { type: "wriggle", frequency: command2.frequency ?? 3, octaves: command2.octaves ?? 2, seed: command2.seed || motionSeedFromId(node) };
889
- const amount = command2.amount ?? 6;
890
- seg("x", num("x") + amount, ease ?? "linear", start, end, { behavior, index: 0 });
891
- seg("y", num("y") + amount, ease ?? "linear", start, end, { behavior, index: 1 });
892
- if (command2.rotate) seg("rotation", num("rotation") + command2.rotate, ease ?? "linear", start, end, { behavior, index: 2 });
898
+ const add = (command2.blend ?? "add") === "add";
899
+ const swing = (p, by, extra) => {
900
+ const scale = p === "scaleX" || p === "scaleY";
901
+ if (add) seg(p, by, ease ?? "linear", start, end, { from: scale ? 1 : 0, blend: "add", ...extra });
902
+ else seg(p, scale ? num(p) * by : num(p) + by, ease ?? "linear", start, end, extra);
903
+ };
904
+ if (command2.type === "pulse") {
905
+ const behavior = { type: "pulse", count: command2.count ?? 1 };
906
+ swing("scaleX", 1 + (command2.amount ?? 0.15), { behavior });
907
+ swing("scaleY", 1 + (command2.amount ?? 0.15), { behavior });
908
+ } else if (command2.type === "shake") swing(command2.axis === "vertical" ? "y" : "x", command2.amount ?? 8, { behavior: { type: "oscillate", count: command2.count ?? 3, decay: 1 } });
909
+ else if (command2.type === "teeter") swing("rotation", command2.angle ?? 8, { behavior: { type: "oscillate", count: command2.count ?? 3, decay: 1 } });
910
+ else if (command2.type === "wave") swing("y", -(command2.amount ?? 6), { behavior: { type: "oscillate", count: command2.count ?? 2 } });
911
+ else {
912
+ const behavior = { type: "wriggle", frequency: command2.frequency ?? 3, octaves: command2.octaves ?? 2, seed: command2.seed || motionSeedFromId(node) };
913
+ const amount = command2.amount ?? 6;
914
+ swing("x", amount, { behavior, index: 0 });
915
+ swing("y", amount, { behavior, index: 1 });
916
+ if (command2.rotate) swing("rotation", command2.rotate, { behavior, index: 2 });
917
+ }
893
918
  break;
894
919
  }
895
920
  case "color-pulse":
@@ -1001,9 +1026,9 @@ function followAt(entry, timeline, nodes, time) {
1001
1026
  function motionNodeOffset(entry, timeline, time, nodes = indexMotionNodes([entry.node]), raw = false, follow = true) {
1002
1027
  const read = (p, rest) => {
1003
1028
  const v = trackValue(timeline.tracks.get(motionTrackKey(entry.node.id, p)), time, raw);
1004
- return typeof v === "number" ? v : rest;
1029
+ return withMotionLayers(timeline, entry.node.id, p, typeof v === "number" ? v : rest, time, raw);
1005
1030
  };
1006
- if (!TRANSFORM_PROPS.some((p) => (follow || p !== "follow") && timeline.tracks.has(motionTrackKey(entry.node.id, p)))) return null;
1031
+ if (!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;
1007
1032
  const dx = read("x", 0);
1008
1033
  const dy = read("y", 0);
1009
1034
  const rotation = read("rotation", 0);
@@ -1261,6 +1286,7 @@ function checkMotionScene(scene) {
1261
1286
  });
1262
1287
  });
1263
1288
  for (const [key, track] of timeline.tracks) {
1289
+ if (key.endsWith("\0add")) continue;
1264
1290
  for (let i = 1; i < track.length; i++) {
1265
1291
  const a = track[i - 1];
1266
1292
  const b = track[i];
@@ -1610,7 +1636,7 @@ function toFlairSvgMotion(scene, options = {}) {
1610
1636
  if (timeline.tracks.has(motionTrackKey(id, "opacity")))
1611
1637
  channels.push({ id, kind: "attr", attr: "opacity", segments: [...track(id, "opacity")], exact: plays, value: (t) => round2(Math.min(1, Math.max(0, Number(trackValue(track(id, "opacity"), t))))) });
1612
1638
  const followed = follows.some((x) => x.id === id);
1613
- const transformSegments = TRANSFORM_PROPS2.flatMap((p) => followed && p === "follow" ? [] : track(id, p));
1639
+ const transformSegments = TRANSFORM_PROPS2.flatMap((p) => followed && p === "follow" ? [] : [...track(id, p), ...timeline.tracks.get(motionAddTrackKey(id, p)) ?? []]);
1614
1640
  if (transformSegments.length) {
1615
1641
  const base = node.transform ? ` matrix(${node.transform.map(f).join(" ")})` : "";
1616
1642
  const c = entry.center;
@@ -2269,6 +2295,11 @@ var BASE = {
2269
2295
  repeatMode: { 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)." },
2270
2296
  steps: { 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.` }
2271
2297
  };
2298
+ var BLEND = (fallback) => ({
2299
+ type: "string",
2300
+ enum: [...MOTION_BLENDS],
2301
+ description: `"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}).`
2302
+ });
2272
2303
  var command = (type, description, extra = {}, required = []) => object({ type: { const: type, description }, ...BASE, ...extra }, ["type", "targets", ...required], description);
2273
2304
  var MOTION_COMMAND_SCHEMA = {
2274
2305
  description: `A command (one of ${MOTION_COMMAND_TYPES.join(", ")}). Commands in a shot play one after another unless "with": "previous".`,
@@ -2291,9 +2322,9 @@ var MOTION_COMMAND_SCHEMA = {
2291
2322
  distance: { type: "number", description: "For slide: document units (default 40)." }
2292
2323
  }),
2293
2324
  command("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).") }),
2294
- command("move", "Moves targets by an offset or so their centre lands on a point.", { by: POINT("Offset in document units."), to: POINT("Point (document coordinates) for the centre.") }),
2295
- command("rotate", "Turns targets about their centre (degrees, clockwise).", { by: { type: "number", description: "Degrees to turn by." }, to: { type: "number", description: "Angle to turn to, in degrees from rest." } }),
2296
- command("scale", "Scales targets about their centre (1 = rest size).", { 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"]),
2325
+ command("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.") }),
2326
+ command("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." } }),
2327
+ command("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"]),
2297
2328
  command("fade", "Changes opacity.", { to: FRACTION("Opacity at the end (0\u20131).") }, ["to"]),
2298
2329
  command("style", "Blends solid fill / stroke colours (in OKLab) and stroke width. On a group it changes every path in it.", {
2299
2330
  fill: { type: "string", description: "CSS colour (hex, rgb(), rgba())." },
@@ -2307,15 +2338,17 @@ var MOTION_COMMAND_SCHEMA = {
2307
2338
  from: FRACTION("Where to start along the path (default 0)."),
2308
2339
  to: FRACTION("Where to end along the path (default 1).")
2309
2340
  }, ["path"]),
2310
- command("pulse", "Scales up and back to draw the eye.", { amount: { type: "number", description: "Extra scale at the peak (default 0.15)." }, count: { type: "integer", minimum: 1, description: "Pulses (default 1)." } }),
2341
+ command("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)." } }),
2311
2342
  command("shake", "Shakes side to side (or up and down), settling.", {
2343
+ blend: BLEND("add"),
2312
2344
  amount: { type: "number", description: "Document units (default 8)." },
2313
2345
  count: { type: "integer", minimum: 1, description: "Shakes (default 3)." },
2314
2346
  axis: { type: "string", enum: ["horizontal", "vertical"], description: "Default horizontal." }
2315
2347
  }),
2316
- command("teeter", "Rocks about the centre either way, settling.", { angle: { type: "number", description: "Degrees either way (default 8)." }, count: { type: "integer", minimum: 1, description: "Rocks (default 3)." } }),
2317
- command("wave", "Bobs up and down without settling, like something floating (default 1000 ms).", { amount: { type: "number", description: "Height in document units (default 6)." }, count: { type: "integer", minimum: 1, description: "Bobs (default 2)." } }),
2348
+ command("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)." } }),
2349
+ command("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)." } }),
2318
2350
  command("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.", {
2351
+ blend: BLEND("add"),
2319
2352
  amount: { type: "number", description: "Up to about this far, in document units (default 6)." },
2320
2353
  frequency: { type: "number", exclusiveMinimum: 0, description: "Wanders per second, in Hz (default 3)." },
2321
2354
  octaves: { type: "integer", minimum: 1, maximum: 8, description: "Layers of finer detail (default 2)." },
@@ -2821,6 +2854,7 @@ Commands
2821
2854
  - enter also has zoom (settles from larger) and rise (rises a short way, overshooting a touch); pop and zoom take a starting "scale".
2822
2855
  - morph turns a shape into another node's shape (keep the target hidden); follow moves along a path node (with "rotate", moves made meanwhile turn with the path).
2823
2856
  - 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).
2857
+ - 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.
2824
2858
  - 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.
2825
2859
  - Springs ("spring-gentle", "spring-quick", "spring-bouncy", "spring-slow" or { "type": "spring", \u2026 }) feel physical; leave "duration" out and the spring sets it.
2826
2860
  - "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.
@@ -2839,6 +2873,8 @@ export {
2839
2873
  AnimationEditorController,
2840
2874
  FLAIR_EASES,
2841
2875
  FLAIR_EXPORT_VERSION,
2876
+ MOTION_ADDITIVE_PROPERTIES,
2877
+ MOTION_BLENDS,
2842
2878
  MOTION_CAMERA_MS,
2843
2879
  MOTION_COMMAND_SCHEMA,
2844
2880
  MOTION_COMMAND_TYPES,
@@ -2880,6 +2916,7 @@ export {
2880
2916
  interpolateMotionValue,
2881
2917
  isMotionCommand,
2882
2918
  isMotionShot,
2919
+ motionAddTrackKey,
2883
2920
  motionClipAttrs,
2884
2921
  motionCommandDuration,
2885
2922
  motionCommandRepeat,
@@ -2912,6 +2949,7 @@ export {
2912
2949
  toFlairSvgMotion,
2913
2950
  toFlairVectorEffect,
2914
2951
  trackValue,
2952
+ withMotionLayers,
2915
2953
  withViewBox
2916
2954
  };
2917
2955
  //# sourceMappingURL=index.js.map