@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.
- package/dist/agent/index.cjs +111 -38
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +30 -2
- package/dist/agent/index.d.ts +30 -2
- package/dist/agent/index.js +96 -23
- package/dist/agent/index.js.map +1 -1
- package/dist/agent-caret-BmYhQF7L.d.cts +106 -0
- package/dist/agent-caret-BmYhQF7L.d.ts +106 -0
- package/dist/animation-editor/index.cjs +85 -47
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +82 -2
- package/dist/animation-editor/index.d.ts +82 -2
- package/dist/animation-editor/index.js +84 -46
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{chunk-LMUDHBWR.js → chunk-4YFMSPBU.js} +2 -2
- package/dist/{chunk-3I6V7PI4.cjs → chunk-7ZSU4MQZ.cjs} +45 -45
- package/dist/{chunk-3I6V7PI4.cjs.map → chunk-7ZSU4MQZ.cjs.map} +1 -1
- package/dist/{chunk-WLVZ235X.js → chunk-OK7T2LHK.js} +229 -2
- package/dist/chunk-OK7T2LHK.js.map +1 -0
- package/dist/{chunk-AHCENCU4.cjs → chunk-T4XWVPJK.cjs} +253 -26
- package/dist/chunk-T4XWVPJK.cjs.map +1 -0
- package/dist/extensions/index.cjs +27 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +2 -1
- package/dist/extensions/index.d.ts +2 -1
- package/dist/extensions/index.js +26 -2
- package/dist/{index-CTCc3m3C.d.ts → index-B16wbOn_.d.ts} +1 -0
- package/dist/{index-BcHyG0Wq.d.cts → index-BAt14aIU.d.cts} +1 -0
- package/dist/index.cjs +32 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-AHCENCU4.cjs.map +0 -1
- package/dist/chunk-WLVZ235X.js.map +0 -1
- /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
|
-
|
|
841
|
-
|
|
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
|
-
|
|
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
|
|
850
|
-
seg("scaleX", to.x, ease ?? MOTION_EASE_IN_OUT, start, end,
|
|
851
|
-
seg("scaleY", to.y, ease ?? MOTION_EASE_IN_OUT, start, end,
|
|
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
|
-
|
|
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
|
|
889
|
-
const
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
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
|