@pixerate/editor 0.57.0 → 0.59.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/index.cjs +23 -3
- package/dist/animation/index.cjs.map +1 -1
- package/dist/animation/index.d.cts +3 -2
- package/dist/animation/index.d.ts +3 -2
- package/dist/animation/index.js +23 -3
- package/dist/animation-editor/index.cjs +836 -158
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +454 -40
- package/dist/animation-editor/index.d.ts +454 -40
- package/dist/animation-editor/index.js +790 -112
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/behavior-Ymbld6jL.d.cts +60 -0
- package/dist/behavior-Ymbld6jL.d.ts +60 -0
- package/dist/canvas/index.cjs +35 -29
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +4 -4
- package/dist/canvas/index.d.ts +4 -4
- package/dist/canvas/index.js +9 -3
- package/dist/canvas/index.js.map +1 -1
- package/dist/{chunk-O4ONBPZW.cjs → chunk-2FGRTYJN.cjs} +4 -4
- package/dist/{chunk-O4ONBPZW.cjs.map → chunk-2FGRTYJN.cjs.map} +1 -1
- package/dist/{chunk-XZ4L3R4K.cjs → chunk-2FHLHZAL.cjs} +39 -3
- package/dist/chunk-2FHLHZAL.cjs.map +1 -0
- package/dist/chunk-3NYXDBBW.js +122 -0
- package/dist/chunk-3NYXDBBW.js.map +1 -0
- package/dist/{chunk-NONDTTH7.js → chunk-3TLL5OID.js} +17 -2
- package/dist/{chunk-NONDTTH7.js.map → chunk-3TLL5OID.js.map} +1 -1
- package/dist/{chunk-UB2OY7FD.js → chunk-AGR4P4UZ.js} +38 -2
- package/dist/chunk-AGR4P4UZ.js.map +1 -0
- package/dist/{chunk-SHOVAHUB.js → chunk-JK6M6V7G.js} +2 -2
- package/dist/{chunk-XCXQDPID.cjs → chunk-YJLCBA7V.cjs} +25 -10
- package/dist/chunk-YJLCBA7V.cjs.map +1 -0
- package/dist/chunk-ZCNLBRT6.cjs +122 -0
- package/dist/chunk-ZCNLBRT6.cjs.map +1 -0
- package/dist/{easing-CNGk-W6d.d.ts → easing-lM0Xo9Ni.d.cts} +14 -2
- package/dist/{easing-CNGk-W6d.d.cts → easing-lM0Xo9Ni.d.ts} +14 -2
- package/dist/parameters/index.cjs +2 -2
- package/dist/parameters/index.d.cts +1 -1
- package/dist/parameters/index.d.ts +1 -1
- package/dist/parameters/index.js +1 -1
- package/dist/{player-W-5DX3Go.d.ts → player-DV4Jujdq.d.ts} +1 -1
- package/dist/{player-Dg0FT0UI.d.cts → player-DrcP2xqj.d.cts} +1 -1
- package/dist/{svg-CPK82TtU.d.ts → svg-Dh17jCyA.d.ts} +22 -1
- package/dist/{svg-CLg2zqZA.d.cts → svg-ymShkNtu.d.cts} +22 -1
- package/dist/vector/index.cjs +472 -472
- package/dist/vector/index.d.cts +3 -3
- package/dist/vector/index.d.ts +3 -3
- package/dist/vector/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-UB2OY7FD.js.map +0 -1
- package/dist/chunk-XCXQDPID.cjs.map +0 -1
- package/dist/chunk-XZ4L3R4K.cjs.map +0 -1
- /package/dist/{chunk-SHOVAHUB.js.map → chunk-JK6M6V7G.js.map} +0 -0
|
@@ -4,7 +4,7 @@ var _chunkMR3Z4OQIcjs = require('./chunk-MR3Z4OQI.cjs');
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk2FHLHZALcjs = require('./chunk-2FHLHZAL.cjs');
|
|
8
8
|
|
|
9
9
|
// src/animation/keyframes.ts
|
|
10
10
|
var ANIMATION_TIME_EPSILON = 1e-6;
|
|
@@ -14,7 +14,7 @@ function isValue(value) {
|
|
|
14
14
|
function isAnimationKeyframe(value) {
|
|
15
15
|
if (typeof value !== "object" || value === null) return false;
|
|
16
16
|
const k = value;
|
|
17
|
-
return typeof k.time === "number" && Number.isFinite(k.time) && isValue(k.value) && (k.easing === void 0 ||
|
|
17
|
+
return typeof k.time === "number" && Number.isFinite(k.time) && isValue(k.value) && (k.easing === void 0 || _chunk2FHLHZALcjs.isAnimationEasing.call(void 0, k.easing));
|
|
18
18
|
}
|
|
19
19
|
var sortedCache = /* @__PURE__ */ new WeakMap();
|
|
20
20
|
function normalizeKeyframes(keyframes) {
|
|
@@ -78,7 +78,7 @@ function evaluateTrack(track, time, type = "number") {
|
|
|
78
78
|
const span = b.time - a.time;
|
|
79
79
|
const u = (time - a.time) / span;
|
|
80
80
|
if (a.easing === "hold") return a.value;
|
|
81
|
-
return interpolateAnimationValue(a.value, b.value,
|
|
81
|
+
return interpolateAnimationValue(a.value, b.value, _chunk2FHLHZALcjs.evaluateEasing.call(void 0, a.easing, u, span), type);
|
|
82
82
|
}
|
|
83
83
|
function wrapAnimationTime(time, duration, loop = "none") {
|
|
84
84
|
if (!Number.isFinite(time)) return 0;
|
|
@@ -384,4 +384,4 @@ function createAnimationPlayer(options) {
|
|
|
384
384
|
|
|
385
385
|
|
|
386
386
|
exports.ANIMATION_TIME_EPSILON = ANIMATION_TIME_EPSILON; exports.isAnimationKeyframe = isAnimationKeyframe; exports.normalizeKeyframes = normalizeKeyframes; exports.interpolateAnimationValue = interpolateAnimationValue; exports.evaluateTrack = evaluateTrack; exports.wrapAnimationTime = wrapAnimationTime; exports.pageHidden = pageHidden; exports.realClock = realClock; exports.ManualClock = ManualClock; exports.AnimationPlayer = AnimationPlayer; exports.createAnimationPlayer = createAnimationPlayer;
|
|
387
|
-
//# sourceMappingURL=chunk-
|
|
387
|
+
//# sourceMappingURL=chunk-2FGRTYJN.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-O4ONBPZW.cjs","../src/animation/keyframes.ts","../src/animation/evaluate.ts","../src/animation/clock.ts","../src/animation/player.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-O4ONBPZW.cjs","sourcesContent":[null,"// Portions ported from filmcraft-main/crates/project/src/keyframe.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { isAnimationEasing, type AnimationEasing } from './easing.js';\n\n/**\n * Keyframe tracks, independent of what they animate: each track is a list of keyframes\n * `{ time (ms), value, easing }`, where the easing governs the segment *leaving* the keyframe\n * (filmcraft / After Effects convention).\n */\n\n/** Keyframe times closer than this (ms) are the same time. */\nexport const ANIMATION_TIME_EPSILON = 1e-6;\n\n/** A keyframe value: a number, or a CSS colour for colour properties. */\nexport type AnimationValue = number | string;\n\nexport interface AnimationKeyframe {\n\t/** Time in milliseconds from the start of the timeline. */\n\ttime: number;\n\tvalue: AnimationValue;\n\t/** Easing of the segment from this keyframe to the next (default `linear`). */\n\teasing?: AnimationEasing;\n}\n\nexport interface AnimationTrack {\n\tkeyframes: AnimationKeyframe[];\n\t/** Disabled tracks keep their keyframes but do not animate (default `true`). */\n\tenabled?: boolean;\n}\n\n/** How a track's values interpolate: numbers linearly, colours in OKLab. */\nexport type AnimationValueType = 'number' | 'color';\n\nfunction isValue(value: unknown): value is AnimationValue {\n\treturn (typeof value === 'number' && Number.isFinite(value)) || typeof value === 'string';\n}\n\n/** Whether `value` is a well-formed keyframe. */\nexport function isAnimationKeyframe(value: unknown): value is AnimationKeyframe {\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst k = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof k.time === 'number' &&\n\t\tNumber.isFinite(k.time) &&\n\t\tisValue(k.value) &&\n\t\t(k.easing === undefined || isAnimationEasing(k.easing))\n\t);\n}\n\nconst sortedCache = new WeakMap<readonly AnimationKeyframe[], { items: AnimationKeyframe[]; out: AnimationKeyframe[] }>();\n\n/**\n * Keyframes sorted by time, invalid entries dropped and duplicate times merged (the *later*\n * entry in the array wins, so appending a keyframe replaces one at the same time). Cached per\n * array (revalidated by element identity), so evaluating every frame does not re-sort; treat\n * keyframe objects as immutable.\n */\nexport function normalizeKeyframes(keyframes: readonly AnimationKeyframe[] | undefined | null): AnimationKeyframe[] {\n\tif (!Array.isArray(keyframes)) return [];\n\tconst cached = sortedCache.get(keyframes);\n\t// The array may have been edited in place since: reuse only while it holds the same keyframes.\n\tif (cached && cached.items.length === keyframes.length && cached.items.every((k, i) => k === keyframes[i])) return cached.out;\n\tconst indexed = keyframes\n\t\t.map((k, i) => ({ k, i }))\n\t\t.filter(({ k }) => isAnimationKeyframe(k))\n\t\t.sort((a, b) => a.k.time - b.k.time || a.i - b.i);\n\tconst out: AnimationKeyframe[] = [];\n\tlet lastIndex = -1;\n\tfor (const { k, i } of indexed) {\n\t\tconst prev = out[out.length - 1];\n\t\tif (prev && Math.abs(k.time - prev.time) <= ANIMATION_TIME_EPSILON) {\n\t\t\tif (i > lastIndex) {\n\t\t\t\tout[out.length - 1] = k;\n\t\t\t\tlastIndex = i;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tout.push(k);\n\t\tlastIndex = i;\n\t}\n\tsortedCache.set(keyframes, { items: [...keyframes], out });\n\treturn out;\n}\n","// Portions ported from filmcraft-main/crates/project/src/keyframe.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { mixColorsOklab } from './color.js';\nimport { evaluateEasing } from './easing.js';\nimport { normalizeKeyframes, type AnimationKeyframe, type AnimationTrack, type AnimationValue, type AnimationValueType } from './keyframes.js';\n\n/** How time past the end of the timeline maps back into it. */\nexport type AnimationLoopMode = 'none' | 'loop' | 'ping-pong';\n\n/**\n * Interpolates between two keyframe values: numbers linearly, colours in OKLab (premultiplied\n * alpha). Mismatched or unreadable values hold `from` until `t` reaches 1.\n */\nexport function interpolateAnimationValue(from: AnimationValue, to: AnimationValue, t: number, type: AnimationValueType = 'number'): AnimationValue {\n\t// Numbers extrapolate, so overshooting easings (back, spring) overshoot the value too.\n\tif (typeof from === 'number' && typeof to === 'number') return from + (to - from) * t;\n\tif (t <= 0) return from;\n\tif (t >= 1) return to;\n\tif (type === 'color' || (typeof from === 'string' && typeof to === 'string')) {\n\t\tconst mixed = mixColorsOklab(from, to, t);\n\t\tif (mixed !== null) return mixed;\n\t}\n\treturn from;\n}\n\n/** Index of the last keyframe at or before `time` (-1 before the first). Binary search. */\nfunction segmentIndex(keys: readonly AnimationKeyframe[], time: number): number {\n\tlet lo = 0;\n\tlet hi = keys.length - 1;\n\tlet found = -1;\n\twhile (lo <= hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (keys[mid].time <= time) {\n\t\t\tfound = mid;\n\t\t\tlo = mid + 1;\n\t\t} else hi = mid - 1;\n\t}\n\treturn found;\n}\n\n/**\n * A track's value at `time`. Before the first keyframe it holds the first value, after the\n * last the last value. Keyframes may be unsorted or share times (see `normalizeKeyframes`).\n * Returns `undefined` for a track without valid keyframes.\n */\nexport function evaluateTrack(track: AnimationTrack | readonly AnimationKeyframe[] | undefined | null, time: number, type: AnimationValueType = 'number'): AnimationValue | undefined {\n\tconst keyframes = Array.isArray(track) ? track : (track as AnimationTrack | undefined)?.keyframes;\n\tconst keys = normalizeKeyframes(keyframes as AnimationKeyframe[]);\n\tif (keys.length === 0) return undefined;\n\tif (!(time > keys[0].time)) return keys[0].value;\n\tconst last = keys[keys.length - 1];\n\tif (time >= last.time) return last.value;\n\tconst i = segmentIndex(keys, time);\n\tconst a = keys[i];\n\tconst b = keys[i + 1];\n\tif (time === a.time) return a.value;\n\tconst span = b.time - a.time;\n\tconst u = (time - a.time) / span;\n\tif (a.easing === 'hold') return a.value;\n\treturn interpolateAnimationValue(a.value, b.value, evaluateEasing(a.easing, u, span), type);\n}\n\n/**\n * Maps a running time onto the timeline `[0, duration]`: clamped (`none`), wrapped (`loop`)\n * or bounced (`ping-pong`).\n */\nexport function wrapAnimationTime(time: number, duration: number, loop: AnimationLoopMode = 'none'): number {\n\tif (!Number.isFinite(time)) return 0;\n\tif (!(duration > 0)) return 0;\n\tif (loop === 'loop') return ((time % duration) + duration) % duration;\n\tif (loop === 'ping-pong') {\n\t\tconst period = duration * 2;\n\t\tconst m = ((time % period) + period) % period;\n\t\treturn m <= duration ? m : period - m;\n\t}\n\treturn Math.min(duration, Math.max(0, time));\n}\n","/**\n * The time source that animations (and canvas agent performances) play on.\n *\n * Defaults to `realClock` (requestAnimationFrame and setTimeout).\n * A `ManualClock` moves only when told to via `advance(ms)` or `tick(fps)`,\n * enabling deterministic frame-by-frame stepping for testing, video generation,\n * or headless server environments.\n */\n\nexport interface Clock {\n\t/** Current time in milliseconds. */\n\tnow(): number;\n\t/** Resolves on the next animation frame. */\n\tframe(): Promise<void>;\n\t/** Resolves after `ms` milliseconds of this clock's time. */\n\tsleep(ms: number): Promise<void>;\n\t/**\n\t * Whether the clock follows wall time. Live clocks stop or degrade when the\n\t * tab is in the background (browsers pause animation frames), so transitions\n\t * can commit immediately rather than leaving operations hanging.\n\t */\n\treadonly live: boolean;\n}\n\n/** Whether the browser tab is hidden (where RAF pauses). */\nexport const pageHidden = (): boolean =>\n\ttypeof document !== 'undefined' && document.hidden;\n\n/** Real-time clock using requestAnimationFrame and setTimeout. */\nexport const realClock: Clock = {\n\tlive: true,\n\tnow: () => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n\tframe: () =>\n\t\tnew Promise<void>((resolve) => {\n\t\t\tif (typeof requestAnimationFrame === 'function' && !pageHidden()) {\n\t\t\t\trequestAnimationFrame(() => resolve());\n\t\t\t} else {\n\t\t\t\tsetTimeout(resolve, 16);\n\t\t\t}\n\t\t}),\n\tsleep: (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, Math.max(0, ms)))\n};\n\nconst settle = () => new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n/**\n * A deterministic clock that only moves forward when `advance` or `tick` is called.\n * Allows step-by-step frame testing and video rendering without waiting for real time.\n */\nexport class ManualClock implements Clock {\n\treadonly live = false;\n\tprivate time: number;\n\tprivate frames: (() => void)[] = [];\n\tprivate sleepers: { at: number; seq: number; resolve: () => void }[] = [];\n\tprivate seq = 0;\n\n\tconstructor(start = 0) {\n\t\tthis.time = start;\n\t}\n\n\tpublic now(): number {\n\t\treturn this.time;\n\t}\n\n\tpublic frame(): Promise<void> {\n\t\treturn new Promise<void>((resolve) => this.frames.push(resolve));\n\t}\n\n\tpublic sleep(ms: number): Promise<void> {\n\t\treturn new Promise<void>((resolve) =>\n\t\t\tthis.sleepers.push({\n\t\t\t\tat: this.time + Math.max(0, ms),\n\t\t\t\tseq: this.seq++,\n\t\t\t\tresolve\n\t\t\t})\n\t\t);\n\t}\n\n\t/** Whether any frames or sleep timers are currently pending. */\n\tpublic get pending(): boolean {\n\t\treturn this.frames.length > 0 || this.sleepers.length > 0;\n\t}\n\n\t/** Advances time by `ms`, resolving due sleep timers in order, followed by queued frames. */\n\tpublic async advance(ms: number): Promise<void> {\n\t\tconst end = this.time + Math.max(0, ms);\n\t\tawait settle();\n\n\t\twhile (true) {\n\t\t\tlet next: (typeof this.sleepers)[number] | undefined;\n\t\t\tfor (const s of this.sleepers) {\n\t\t\t\tif (s.at <= end && (!next || s.at < next.at || (s.at === next.at && s.seq < next.seq))) {\n\t\t\t\t\tnext = s;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!next) break;\n\n\t\t\tthis.sleepers.splice(this.sleepers.indexOf(next), 1);\n\t\t\tthis.time = Math.max(this.time, next.at);\n\t\t\tnext.resolve();\n\t\t\tawait settle();\n\t\t}\n\n\t\tthis.time = end;\n\t\tconst dueFrames = this.frames.splice(0, this.frames.length);\n\t\tfor (const resolveFrame of dueFrames) {\n\t\t\tresolveFrame();\n\t\t}\n\t\tawait settle();\n\t}\n\n\t/** Convenience method to advance by 1 frame at a given fps (default: 60fps = 16.67ms). */\n\tpublic async tick(fps = 60): Promise<void> {\n\t\tawait this.advance(Math.round(1000 / fps));\n\t}\n}\n","import { realClock, type Clock } from './clock.js';\nimport { wrapAnimationTime, type AnimationLoopMode } from './evaluate.js';\n\nexport interface AnimationPlayerState {\n\t/** Playhead time in ms, inside `[0, duration]`. */\n\ttime: number;\n\tplaying: boolean;\n\t/** True between `scrub` and `endScrub`. */\n\tscrubbing: boolean;\n\tloop: AnimationLoopMode;\n\t/** Speed multiplier (negative plays backwards). */\n\tplaybackRate: number;\n\tduration: number;\n}\n\nexport interface AnimationPlayerOptions {\n\t/** Time source (default `realClock`: requestAnimationFrame). Pass a `ManualClock` in tests or for rendering. */\n\tclock?: Clock;\n\t/** Timeline length in ms, or a getter (e.g. the last keyframe time). Default 1000. */\n\tduration?: number | (() => number);\n\tloop?: AnimationLoopMode;\n\tplaybackRate?: number;\n\t/** Initial playhead time (default 0). */\n\ttime?: number;\n\t/** Called whenever the playhead moves (playback, seek, scrub). */\n\tonTime?: (time: number) => void;\n\t/** Called when non-looping playback reaches the end (or the start, playing backwards). */\n\tonEnd?: () => void;\n}\n\n/**\n * Plays a timeline on an injectable `Clock`: play / pause / seek / scrub with looping,\n * ping-pong and playback rate. It only asks the clock for frames while playing, so a\n * `ManualClock` steps it deterministically and the real clock's requestAnimationFrame is the\n * only place wall time enters.\n *\n * `getState()` returns a cached snapshot replaced on change (usable with `useSyncExternalStore`).\n */\nexport class AnimationPlayer {\n\tprivate readonly clock: Clock;\n\tprivate durationSource: number | (() => number);\n\tprivate onTime?: (time: number) => void;\n\tprivate onEnd?: () => void;\n\tprivate time: number;\n\tprivate playing = false;\n\tprivate scrubbing = false;\n\tprivate resumeAfterScrub = false;\n\tprivate loop: AnimationLoopMode;\n\tprivate rate: number;\n\t/** Unwrapped time at `anchorAt` (keeps the ping-pong direction across frames). */\n\tprivate anchorRaw = 0;\n\tprivate anchorAt = 0;\n\tprivate generation = 0;\n\tprivate cached: AnimationPlayerState;\n\tprivate listeners = new Set<(state: AnimationPlayerState) => void>();\n\n\tconstructor(options: AnimationPlayerOptions = {}) {\n\t\tthis.clock = options.clock ?? realClock;\n\t\tthis.durationSource = options.duration ?? 1000;\n\t\tthis.loop = options.loop ?? 'none';\n\t\tthis.rate = Number.isFinite(options.playbackRate) && options.playbackRate !== 0 ? options.playbackRate! : 1;\n\t\tthis.onTime = options.onTime;\n\t\tthis.onEnd = options.onEnd;\n\t\tthis.time = this.clamp(options.time ?? 0);\n\t\tthis.cached = this.snapshot();\n\t}\n\n\t/** Current timeline length (ms). */\n\tget duration(): number {\n\t\tconst d = typeof this.durationSource === 'function' ? this.durationSource() : this.durationSource;\n\t\treturn Number.isFinite(d) && d > 0 ? d : 0;\n\t}\n\n\tget currentTime(): number {\n\t\treturn this.time;\n\t}\n\n\tget isPlaying(): boolean {\n\t\treturn this.playing;\n\t}\n\n\tgetState(): AnimationPlayerState {\n\t\treturn this.cached;\n\t}\n\n\tsubscribe(listener: (state: AnimationPlayerState) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\t/** Replaces the callbacks (hooks keep them current without recreating the player). */\n\tsetCallbacks(callbacks: { onTime?: (time: number) => void; onEnd?: () => void }): void {\n\t\tthis.onTime = callbacks.onTime;\n\t\tthis.onEnd = callbacks.onEnd;\n\t}\n\n\tsetDuration(duration: number | (() => number)): void {\n\t\tthis.durationSource = duration;\n\t\tthis.time = this.clamp(this.time);\n\t\tthis.emit(false);\n\t}\n\n\tsetLoop(loop: AnimationLoopMode): void {\n\t\tif (loop === this.loop) return;\n\t\tthis.reanchor();\n\t\tthis.loop = loop;\n\t\tthis.emit(false);\n\t}\n\n\tsetPlaybackRate(rate: number): void {\n\t\tif (!Number.isFinite(rate) || rate === 0 || rate === this.rate) return;\n\t\tthis.reanchor();\n\t\tthis.rate = rate;\n\t\tthis.emit(false);\n\t}\n\n\t/** Starts playing from the playhead (from the start again when a one-shot play had ended). */\n\tplay(): void {\n\t\tif (this.playing) return;\n\t\tconst d = this.duration;\n\t\tif (this.loop === 'none' && d > 0) {\n\t\t\tif (this.rate > 0 && this.time >= d) this.time = 0;\n\t\t\tif (this.rate < 0 && this.time <= 0) this.time = d;\n\t\t}\n\t\tthis.playing = true;\n\t\tthis.scrubbing = false;\n\t\tthis.anchorRaw = this.time;\n\t\tthis.anchorAt = this.clock.now();\n\t\tthis.emit(false);\n\t\tthis.schedule();\n\t}\n\n\tpause(): void {\n\t\tif (!this.playing) return;\n\t\tthis.tick(false);\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.emit(true);\n\t}\n\n\ttoggle(): void {\n\t\tif (this.playing) this.pause();\n\t\telse this.play();\n\t}\n\n\t/** Pauses and returns to the start. */\n\tstop(): void {\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.seek(0);\n\t}\n\n\t/** Moves the playhead (clamped to the timeline); playback continues from there. */\n\tseek(time: number): void {\n\t\tif (!Number.isFinite(time)) return;\n\t\tthis.time = this.clamp(time);\n\t\tthis.anchorRaw = this.time;\n\t\tthis.anchorAt = this.clock.now();\n\t\tthis.emit(true);\n\t}\n\n\t/** Seeks while dragging the playhead: playback pauses until `endScrub`. */\n\tscrub(time: number): void {\n\t\tif (!this.scrubbing) {\n\t\t\tthis.resumeAfterScrub = this.playing;\n\t\t\tif (this.playing) {\n\t\t\t\tthis.playing = false;\n\t\t\t\tthis.generation++;\n\t\t\t}\n\t\t\tthis.scrubbing = true;\n\t\t}\n\t\tthis.seek(time);\n\t}\n\n\t/** Ends a scrub, resuming playback if it was playing when the scrub began. */\n\tendScrub(): void {\n\t\tif (!this.scrubbing) return;\n\t\tthis.scrubbing = false;\n\t\tconst resume = this.resumeAfterScrub;\n\t\tthis.resumeAfterScrub = false;\n\t\tif (resume) this.play();\n\t\telse this.emit(false);\n\t}\n\n\t/** Stops scheduling frames and drops listeners. */\n\tdestroy(): void {\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.listeners.clear();\n\t}\n\n\tprivate clamp(time: number): number {\n\t\treturn Math.min(this.duration, Math.max(0, Number.isFinite(time) ? time : 0));\n\t}\n\n\tprivate reanchor() {\n\t\tif (!this.playing) return;\n\t\tthis.tick(false);\n\t\tthis.anchorRaw = this.rawNow();\n\t\tthis.anchorAt = this.clock.now();\n\t}\n\n\tprivate rawNow(): number {\n\t\treturn this.anchorRaw + (this.clock.now() - this.anchorAt) * this.rate;\n\t}\n\n\tprivate schedule() {\n\t\tconst generation = this.generation;\n\t\tthis.clock.frame().then(() => {\n\t\t\tif (generation !== this.generation || !this.playing) return;\n\t\t\tthis.tick(true);\n\t\t\tif (this.playing) this.schedule();\n\t\t});\n\t}\n\n\t/** Advances the playhead to the clock's time; `notify` emits the change. */\n\tprivate tick(notify: boolean) {\n\t\tif (!this.playing) return;\n\t\tconst d = this.duration;\n\t\tconst raw = this.rawNow();\n\t\tlet ended = false;\n\t\tif (this.loop === 'none' || d <= 0) {\n\t\t\tif (this.rate > 0 && raw >= d) {\n\t\t\t\tthis.time = d;\n\t\t\t\tended = true;\n\t\t\t} else if (this.rate < 0 && raw <= 0) {\n\t\t\t\tthis.time = 0;\n\t\t\t\tended = true;\n\t\t\t} else this.time = this.clamp(raw);\n\t\t} else {\n\t\t\tthis.time = wrapAnimationTime(raw, d, this.loop);\n\t\t}\n\t\tif (ended) {\n\t\t\tthis.playing = false;\n\t\t\tthis.generation++;\n\t\t}\n\t\tif (notify || ended) this.emit(true);\n\t\tif (ended) this.onEnd?.();\n\t}\n\n\tprivate snapshot(): AnimationPlayerState {\n\t\treturn {\n\t\t\ttime: this.time,\n\t\t\tplaying: this.playing,\n\t\t\tscrubbing: this.scrubbing,\n\t\t\tloop: this.loop,\n\t\t\tplaybackRate: this.rate,\n\t\t\tduration: this.duration\n\t\t};\n\t}\n\n\tprivate emit(timeChanged: boolean) {\n\t\tconst next = this.snapshot();\n\t\tconst prev = this.cached;\n\t\tif (\n\t\t\tprev.time === next.time &&\n\t\t\tprev.playing === next.playing &&\n\t\t\tprev.scrubbing === next.scrubbing &&\n\t\t\tprev.loop === next.loop &&\n\t\t\tprev.playbackRate === next.playbackRate &&\n\t\t\tprev.duration === next.duration\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.cached = next;\n\t\tif (timeChanged && prev.time !== next.time) this.onTime?.(next.time);\n\t\tfor (const listener of this.listeners) listener(next);\n\t}\n}\n\nexport function createAnimationPlayer(options?: AnimationPlayerOptions): AnimationPlayer {\n\treturn new AnimationPlayer(options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-2FGRTYJN.cjs","../src/animation/keyframes.ts","../src/animation/evaluate.ts","../src/animation/clock.ts","../src/animation/player.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-2FGRTYJN.cjs","sourcesContent":[null,"// Portions ported from filmcraft-main/crates/project/src/keyframe.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { isAnimationEasing, type AnimationEasing } from './easing.js';\n\n/**\n * Keyframe tracks, independent of what they animate: each track is a list of keyframes\n * `{ time (ms), value, easing }`, where the easing governs the segment *leaving* the keyframe\n * (filmcraft / After Effects convention).\n */\n\n/** Keyframe times closer than this (ms) are the same time. */\nexport const ANIMATION_TIME_EPSILON = 1e-6;\n\n/** A keyframe value: a number, or a CSS colour for colour properties. */\nexport type AnimationValue = number | string;\n\nexport interface AnimationKeyframe {\n\t/** Time in milliseconds from the start of the timeline. */\n\ttime: number;\n\tvalue: AnimationValue;\n\t/** Easing of the segment from this keyframe to the next (default `linear`). */\n\teasing?: AnimationEasing;\n}\n\nexport interface AnimationTrack {\n\tkeyframes: AnimationKeyframe[];\n\t/** Disabled tracks keep their keyframes but do not animate (default `true`). */\n\tenabled?: boolean;\n}\n\n/** How a track's values interpolate: numbers linearly, colours in OKLab. */\nexport type AnimationValueType = 'number' | 'color';\n\nfunction isValue(value: unknown): value is AnimationValue {\n\treturn (typeof value === 'number' && Number.isFinite(value)) || typeof value === 'string';\n}\n\n/** Whether `value` is a well-formed keyframe. */\nexport function isAnimationKeyframe(value: unknown): value is AnimationKeyframe {\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst k = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof k.time === 'number' &&\n\t\tNumber.isFinite(k.time) &&\n\t\tisValue(k.value) &&\n\t\t(k.easing === undefined || isAnimationEasing(k.easing))\n\t);\n}\n\nconst sortedCache = new WeakMap<readonly AnimationKeyframe[], { items: AnimationKeyframe[]; out: AnimationKeyframe[] }>();\n\n/**\n * Keyframes sorted by time, invalid entries dropped and duplicate times merged (the *later*\n * entry in the array wins, so appending a keyframe replaces one at the same time). Cached per\n * array (revalidated by element identity), so evaluating every frame does not re-sort; treat\n * keyframe objects as immutable.\n */\nexport function normalizeKeyframes(keyframes: readonly AnimationKeyframe[] | undefined | null): AnimationKeyframe[] {\n\tif (!Array.isArray(keyframes)) return [];\n\tconst cached = sortedCache.get(keyframes);\n\t// The array may have been edited in place since: reuse only while it holds the same keyframes.\n\tif (cached && cached.items.length === keyframes.length && cached.items.every((k, i) => k === keyframes[i])) return cached.out;\n\tconst indexed = keyframes\n\t\t.map((k, i) => ({ k, i }))\n\t\t.filter(({ k }) => isAnimationKeyframe(k))\n\t\t.sort((a, b) => a.k.time - b.k.time || a.i - b.i);\n\tconst out: AnimationKeyframe[] = [];\n\tlet lastIndex = -1;\n\tfor (const { k, i } of indexed) {\n\t\tconst prev = out[out.length - 1];\n\t\tif (prev && Math.abs(k.time - prev.time) <= ANIMATION_TIME_EPSILON) {\n\t\t\tif (i > lastIndex) {\n\t\t\t\tout[out.length - 1] = k;\n\t\t\t\tlastIndex = i;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tout.push(k);\n\t\tlastIndex = i;\n\t}\n\tsortedCache.set(keyframes, { items: [...keyframes], out });\n\treturn out;\n}\n","// Portions ported from filmcraft-main/crates/project/src/keyframe.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { mixColorsOklab } from './color.js';\nimport { evaluateEasing } from './easing.js';\nimport { normalizeKeyframes, type AnimationKeyframe, type AnimationTrack, type AnimationValue, type AnimationValueType } from './keyframes.js';\n\n/** How time past the end of the timeline maps back into it. */\nexport type AnimationLoopMode = 'none' | 'loop' | 'ping-pong';\n\n/**\n * Interpolates between two keyframe values: numbers linearly, colours in OKLab (premultiplied\n * alpha). Mismatched or unreadable values hold `from` until `t` reaches 1.\n */\nexport function interpolateAnimationValue(from: AnimationValue, to: AnimationValue, t: number, type: AnimationValueType = 'number'): AnimationValue {\n\t// Numbers extrapolate, so overshooting easings (back, spring) overshoot the value too.\n\tif (typeof from === 'number' && typeof to === 'number') return from + (to - from) * t;\n\tif (t <= 0) return from;\n\tif (t >= 1) return to;\n\tif (type === 'color' || (typeof from === 'string' && typeof to === 'string')) {\n\t\tconst mixed = mixColorsOklab(from, to, t);\n\t\tif (mixed !== null) return mixed;\n\t}\n\treturn from;\n}\n\n/** Index of the last keyframe at or before `time` (-1 before the first). Binary search. */\nfunction segmentIndex(keys: readonly AnimationKeyframe[], time: number): number {\n\tlet lo = 0;\n\tlet hi = keys.length - 1;\n\tlet found = -1;\n\twhile (lo <= hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (keys[mid].time <= time) {\n\t\t\tfound = mid;\n\t\t\tlo = mid + 1;\n\t\t} else hi = mid - 1;\n\t}\n\treturn found;\n}\n\n/**\n * A track's value at `time`. Before the first keyframe it holds the first value, after the\n * last the last value. Keyframes may be unsorted or share times (see `normalizeKeyframes`).\n * Returns `undefined` for a track without valid keyframes.\n */\nexport function evaluateTrack(track: AnimationTrack | readonly AnimationKeyframe[] | undefined | null, time: number, type: AnimationValueType = 'number'): AnimationValue | undefined {\n\tconst keyframes = Array.isArray(track) ? track : (track as AnimationTrack | undefined)?.keyframes;\n\tconst keys = normalizeKeyframes(keyframes as AnimationKeyframe[]);\n\tif (keys.length === 0) return undefined;\n\tif (!(time > keys[0].time)) return keys[0].value;\n\tconst last = keys[keys.length - 1];\n\tif (time >= last.time) return last.value;\n\tconst i = segmentIndex(keys, time);\n\tconst a = keys[i];\n\tconst b = keys[i + 1];\n\tif (time === a.time) return a.value;\n\tconst span = b.time - a.time;\n\tconst u = (time - a.time) / span;\n\tif (a.easing === 'hold') return a.value;\n\treturn interpolateAnimationValue(a.value, b.value, evaluateEasing(a.easing, u, span), type);\n}\n\n/**\n * Maps a running time onto the timeline `[0, duration]`: clamped (`none`), wrapped (`loop`)\n * or bounced (`ping-pong`).\n */\nexport function wrapAnimationTime(time: number, duration: number, loop: AnimationLoopMode = 'none'): number {\n\tif (!Number.isFinite(time)) return 0;\n\tif (!(duration > 0)) return 0;\n\tif (loop === 'loop') return ((time % duration) + duration) % duration;\n\tif (loop === 'ping-pong') {\n\t\tconst period = duration * 2;\n\t\tconst m = ((time % period) + period) % period;\n\t\treturn m <= duration ? m : period - m;\n\t}\n\treturn Math.min(duration, Math.max(0, time));\n}\n","/**\n * The time source that animations (and canvas agent performances) play on.\n *\n * Defaults to `realClock` (requestAnimationFrame and setTimeout).\n * A `ManualClock` moves only when told to via `advance(ms)` or `tick(fps)`,\n * enabling deterministic frame-by-frame stepping for testing, video generation,\n * or headless server environments.\n */\n\nexport interface Clock {\n\t/** Current time in milliseconds. */\n\tnow(): number;\n\t/** Resolves on the next animation frame. */\n\tframe(): Promise<void>;\n\t/** Resolves after `ms` milliseconds of this clock's time. */\n\tsleep(ms: number): Promise<void>;\n\t/**\n\t * Whether the clock follows wall time. Live clocks stop or degrade when the\n\t * tab is in the background (browsers pause animation frames), so transitions\n\t * can commit immediately rather than leaving operations hanging.\n\t */\n\treadonly live: boolean;\n}\n\n/** Whether the browser tab is hidden (where RAF pauses). */\nexport const pageHidden = (): boolean =>\n\ttypeof document !== 'undefined' && document.hidden;\n\n/** Real-time clock using requestAnimationFrame and setTimeout. */\nexport const realClock: Clock = {\n\tlive: true,\n\tnow: () => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n\tframe: () =>\n\t\tnew Promise<void>((resolve) => {\n\t\t\tif (typeof requestAnimationFrame === 'function' && !pageHidden()) {\n\t\t\t\trequestAnimationFrame(() => resolve());\n\t\t\t} else {\n\t\t\t\tsetTimeout(resolve, 16);\n\t\t\t}\n\t\t}),\n\tsleep: (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, Math.max(0, ms)))\n};\n\nconst settle = () => new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n/**\n * A deterministic clock that only moves forward when `advance` or `tick` is called.\n * Allows step-by-step frame testing and video rendering without waiting for real time.\n */\nexport class ManualClock implements Clock {\n\treadonly live = false;\n\tprivate time: number;\n\tprivate frames: (() => void)[] = [];\n\tprivate sleepers: { at: number; seq: number; resolve: () => void }[] = [];\n\tprivate seq = 0;\n\n\tconstructor(start = 0) {\n\t\tthis.time = start;\n\t}\n\n\tpublic now(): number {\n\t\treturn this.time;\n\t}\n\n\tpublic frame(): Promise<void> {\n\t\treturn new Promise<void>((resolve) => this.frames.push(resolve));\n\t}\n\n\tpublic sleep(ms: number): Promise<void> {\n\t\treturn new Promise<void>((resolve) =>\n\t\t\tthis.sleepers.push({\n\t\t\t\tat: this.time + Math.max(0, ms),\n\t\t\t\tseq: this.seq++,\n\t\t\t\tresolve\n\t\t\t})\n\t\t);\n\t}\n\n\t/** Whether any frames or sleep timers are currently pending. */\n\tpublic get pending(): boolean {\n\t\treturn this.frames.length > 0 || this.sleepers.length > 0;\n\t}\n\n\t/** Advances time by `ms`, resolving due sleep timers in order, followed by queued frames. */\n\tpublic async advance(ms: number): Promise<void> {\n\t\tconst end = this.time + Math.max(0, ms);\n\t\tawait settle();\n\n\t\twhile (true) {\n\t\t\tlet next: (typeof this.sleepers)[number] | undefined;\n\t\t\tfor (const s of this.sleepers) {\n\t\t\t\tif (s.at <= end && (!next || s.at < next.at || (s.at === next.at && s.seq < next.seq))) {\n\t\t\t\t\tnext = s;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!next) break;\n\n\t\t\tthis.sleepers.splice(this.sleepers.indexOf(next), 1);\n\t\t\tthis.time = Math.max(this.time, next.at);\n\t\t\tnext.resolve();\n\t\t\tawait settle();\n\t\t}\n\n\t\tthis.time = end;\n\t\tconst dueFrames = this.frames.splice(0, this.frames.length);\n\t\tfor (const resolveFrame of dueFrames) {\n\t\t\tresolveFrame();\n\t\t}\n\t\tawait settle();\n\t}\n\n\t/** Convenience method to advance by 1 frame at a given fps (default: 60fps = 16.67ms). */\n\tpublic async tick(fps = 60): Promise<void> {\n\t\tawait this.advance(Math.round(1000 / fps));\n\t}\n}\n","import { realClock, type Clock } from './clock.js';\nimport { wrapAnimationTime, type AnimationLoopMode } from './evaluate.js';\n\nexport interface AnimationPlayerState {\n\t/** Playhead time in ms, inside `[0, duration]`. */\n\ttime: number;\n\tplaying: boolean;\n\t/** True between `scrub` and `endScrub`. */\n\tscrubbing: boolean;\n\tloop: AnimationLoopMode;\n\t/** Speed multiplier (negative plays backwards). */\n\tplaybackRate: number;\n\tduration: number;\n}\n\nexport interface AnimationPlayerOptions {\n\t/** Time source (default `realClock`: requestAnimationFrame). Pass a `ManualClock` in tests or for rendering. */\n\tclock?: Clock;\n\t/** Timeline length in ms, or a getter (e.g. the last keyframe time). Default 1000. */\n\tduration?: number | (() => number);\n\tloop?: AnimationLoopMode;\n\tplaybackRate?: number;\n\t/** Initial playhead time (default 0). */\n\ttime?: number;\n\t/** Called whenever the playhead moves (playback, seek, scrub). */\n\tonTime?: (time: number) => void;\n\t/** Called when non-looping playback reaches the end (or the start, playing backwards). */\n\tonEnd?: () => void;\n}\n\n/**\n * Plays a timeline on an injectable `Clock`: play / pause / seek / scrub with looping,\n * ping-pong and playback rate. It only asks the clock for frames while playing, so a\n * `ManualClock` steps it deterministically and the real clock's requestAnimationFrame is the\n * only place wall time enters.\n *\n * `getState()` returns a cached snapshot replaced on change (usable with `useSyncExternalStore`).\n */\nexport class AnimationPlayer {\n\tprivate readonly clock: Clock;\n\tprivate durationSource: number | (() => number);\n\tprivate onTime?: (time: number) => void;\n\tprivate onEnd?: () => void;\n\tprivate time: number;\n\tprivate playing = false;\n\tprivate scrubbing = false;\n\tprivate resumeAfterScrub = false;\n\tprivate loop: AnimationLoopMode;\n\tprivate rate: number;\n\t/** Unwrapped time at `anchorAt` (keeps the ping-pong direction across frames). */\n\tprivate anchorRaw = 0;\n\tprivate anchorAt = 0;\n\tprivate generation = 0;\n\tprivate cached: AnimationPlayerState;\n\tprivate listeners = new Set<(state: AnimationPlayerState) => void>();\n\n\tconstructor(options: AnimationPlayerOptions = {}) {\n\t\tthis.clock = options.clock ?? realClock;\n\t\tthis.durationSource = options.duration ?? 1000;\n\t\tthis.loop = options.loop ?? 'none';\n\t\tthis.rate = Number.isFinite(options.playbackRate) && options.playbackRate !== 0 ? options.playbackRate! : 1;\n\t\tthis.onTime = options.onTime;\n\t\tthis.onEnd = options.onEnd;\n\t\tthis.time = this.clamp(options.time ?? 0);\n\t\tthis.cached = this.snapshot();\n\t}\n\n\t/** Current timeline length (ms). */\n\tget duration(): number {\n\t\tconst d = typeof this.durationSource === 'function' ? this.durationSource() : this.durationSource;\n\t\treturn Number.isFinite(d) && d > 0 ? d : 0;\n\t}\n\n\tget currentTime(): number {\n\t\treturn this.time;\n\t}\n\n\tget isPlaying(): boolean {\n\t\treturn this.playing;\n\t}\n\n\tgetState(): AnimationPlayerState {\n\t\treturn this.cached;\n\t}\n\n\tsubscribe(listener: (state: AnimationPlayerState) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\t/** Replaces the callbacks (hooks keep them current without recreating the player). */\n\tsetCallbacks(callbacks: { onTime?: (time: number) => void; onEnd?: () => void }): void {\n\t\tthis.onTime = callbacks.onTime;\n\t\tthis.onEnd = callbacks.onEnd;\n\t}\n\n\tsetDuration(duration: number | (() => number)): void {\n\t\tthis.durationSource = duration;\n\t\tthis.time = this.clamp(this.time);\n\t\tthis.emit(false);\n\t}\n\n\tsetLoop(loop: AnimationLoopMode): void {\n\t\tif (loop === this.loop) return;\n\t\tthis.reanchor();\n\t\tthis.loop = loop;\n\t\tthis.emit(false);\n\t}\n\n\tsetPlaybackRate(rate: number): void {\n\t\tif (!Number.isFinite(rate) || rate === 0 || rate === this.rate) return;\n\t\tthis.reanchor();\n\t\tthis.rate = rate;\n\t\tthis.emit(false);\n\t}\n\n\t/** Starts playing from the playhead (from the start again when a one-shot play had ended). */\n\tplay(): void {\n\t\tif (this.playing) return;\n\t\tconst d = this.duration;\n\t\tif (this.loop === 'none' && d > 0) {\n\t\t\tif (this.rate > 0 && this.time >= d) this.time = 0;\n\t\t\tif (this.rate < 0 && this.time <= 0) this.time = d;\n\t\t}\n\t\tthis.playing = true;\n\t\tthis.scrubbing = false;\n\t\tthis.anchorRaw = this.time;\n\t\tthis.anchorAt = this.clock.now();\n\t\tthis.emit(false);\n\t\tthis.schedule();\n\t}\n\n\tpause(): void {\n\t\tif (!this.playing) return;\n\t\tthis.tick(false);\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.emit(true);\n\t}\n\n\ttoggle(): void {\n\t\tif (this.playing) this.pause();\n\t\telse this.play();\n\t}\n\n\t/** Pauses and returns to the start. */\n\tstop(): void {\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.seek(0);\n\t}\n\n\t/** Moves the playhead (clamped to the timeline); playback continues from there. */\n\tseek(time: number): void {\n\t\tif (!Number.isFinite(time)) return;\n\t\tthis.time = this.clamp(time);\n\t\tthis.anchorRaw = this.time;\n\t\tthis.anchorAt = this.clock.now();\n\t\tthis.emit(true);\n\t}\n\n\t/** Seeks while dragging the playhead: playback pauses until `endScrub`. */\n\tscrub(time: number): void {\n\t\tif (!this.scrubbing) {\n\t\t\tthis.resumeAfterScrub = this.playing;\n\t\t\tif (this.playing) {\n\t\t\t\tthis.playing = false;\n\t\t\t\tthis.generation++;\n\t\t\t}\n\t\t\tthis.scrubbing = true;\n\t\t}\n\t\tthis.seek(time);\n\t}\n\n\t/** Ends a scrub, resuming playback if it was playing when the scrub began. */\n\tendScrub(): void {\n\t\tif (!this.scrubbing) return;\n\t\tthis.scrubbing = false;\n\t\tconst resume = this.resumeAfterScrub;\n\t\tthis.resumeAfterScrub = false;\n\t\tif (resume) this.play();\n\t\telse this.emit(false);\n\t}\n\n\t/** Stops scheduling frames and drops listeners. */\n\tdestroy(): void {\n\t\tthis.playing = false;\n\t\tthis.generation++;\n\t\tthis.listeners.clear();\n\t}\n\n\tprivate clamp(time: number): number {\n\t\treturn Math.min(this.duration, Math.max(0, Number.isFinite(time) ? time : 0));\n\t}\n\n\tprivate reanchor() {\n\t\tif (!this.playing) return;\n\t\tthis.tick(false);\n\t\tthis.anchorRaw = this.rawNow();\n\t\tthis.anchorAt = this.clock.now();\n\t}\n\n\tprivate rawNow(): number {\n\t\treturn this.anchorRaw + (this.clock.now() - this.anchorAt) * this.rate;\n\t}\n\n\tprivate schedule() {\n\t\tconst generation = this.generation;\n\t\tthis.clock.frame().then(() => {\n\t\t\tif (generation !== this.generation || !this.playing) return;\n\t\t\tthis.tick(true);\n\t\t\tif (this.playing) this.schedule();\n\t\t});\n\t}\n\n\t/** Advances the playhead to the clock's time; `notify` emits the change. */\n\tprivate tick(notify: boolean) {\n\t\tif (!this.playing) return;\n\t\tconst d = this.duration;\n\t\tconst raw = this.rawNow();\n\t\tlet ended = false;\n\t\tif (this.loop === 'none' || d <= 0) {\n\t\t\tif (this.rate > 0 && raw >= d) {\n\t\t\t\tthis.time = d;\n\t\t\t\tended = true;\n\t\t\t} else if (this.rate < 0 && raw <= 0) {\n\t\t\t\tthis.time = 0;\n\t\t\t\tended = true;\n\t\t\t} else this.time = this.clamp(raw);\n\t\t} else {\n\t\t\tthis.time = wrapAnimationTime(raw, d, this.loop);\n\t\t}\n\t\tif (ended) {\n\t\t\tthis.playing = false;\n\t\t\tthis.generation++;\n\t\t}\n\t\tif (notify || ended) this.emit(true);\n\t\tif (ended) this.onEnd?.();\n\t}\n\n\tprivate snapshot(): AnimationPlayerState {\n\t\treturn {\n\t\t\ttime: this.time,\n\t\t\tplaying: this.playing,\n\t\t\tscrubbing: this.scrubbing,\n\t\t\tloop: this.loop,\n\t\t\tplaybackRate: this.rate,\n\t\t\tduration: this.duration\n\t\t};\n\t}\n\n\tprivate emit(timeChanged: boolean) {\n\t\tconst next = this.snapshot();\n\t\tconst prev = this.cached;\n\t\tif (\n\t\t\tprev.time === next.time &&\n\t\t\tprev.playing === next.playing &&\n\t\t\tprev.scrubbing === next.scrubbing &&\n\t\t\tprev.loop === next.loop &&\n\t\t\tprev.playbackRate === next.playbackRate &&\n\t\t\tprev.duration === next.duration\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.cached = next;\n\t\tif (timeChanged && prev.time !== next.time) this.onTime?.(next.time);\n\t\tfor (const listener of this.listeners) listener(next);\n\t}\n}\n\nexport function createAnimationPlayer(options?: AnimationPlayerOptions): AnimationPlayer {\n\treturn new AnimationPlayer(options);\n}\n"]}
|
|
@@ -12,6 +12,10 @@ var ANIMATION_EASING_PRESETS = [
|
|
|
12
12
|
"ease-in-out-elastic",
|
|
13
13
|
"elastic",
|
|
14
14
|
"spring",
|
|
15
|
+
"spring-gentle",
|
|
16
|
+
"spring-quick",
|
|
17
|
+
"spring-bouncy",
|
|
18
|
+
"spring-slow",
|
|
15
19
|
"hold"
|
|
16
20
|
];
|
|
17
21
|
var ANIMATION_EASING_LABELS = {
|
|
@@ -27,7 +31,11 @@ var ANIMATION_EASING_LABELS = {
|
|
|
27
31
|
"ease-in-elastic": "Elastic in",
|
|
28
32
|
"ease-in-out-elastic": "Elastic in-out",
|
|
29
33
|
elastic: "Elastic",
|
|
30
|
-
spring: "Spring"
|
|
34
|
+
spring: "Spring",
|
|
35
|
+
"spring-gentle": "Spring (gentle)",
|
|
36
|
+
"spring-quick": "Spring (quick)",
|
|
37
|
+
"spring-bouncy": "Spring (bouncy)",
|
|
38
|
+
"spring-slow": "Spring (slow)"
|
|
31
39
|
};
|
|
32
40
|
var CUBIC_BEZIER_PRESETS = {
|
|
33
41
|
linear: [0, 0, 1, 1],
|
|
@@ -39,6 +47,30 @@ var CUBIC_BEZIER_PRESETS = {
|
|
|
39
47
|
"ease-out-back": [0.34, 1.56, 0.64, 1]
|
|
40
48
|
};
|
|
41
49
|
var DEFAULT_SPRING = { stiffness: 170, damping: 26, mass: 1, velocity: 0 };
|
|
50
|
+
var SPRING_PRESETS = {
|
|
51
|
+
"spring-gentle": { mass: 1, stiffness: 100, damping: 15, velocity: 0 },
|
|
52
|
+
"spring-quick": { mass: 1, stiffness: 300, damping: 20, velocity: 0 },
|
|
53
|
+
"spring-bouncy": { mass: 1, stiffness: 600, damping: 15, velocity: 0 },
|
|
54
|
+
"spring-slow": { mass: 1, stiffness: 80, damping: 20, velocity: 0 }
|
|
55
|
+
};
|
|
56
|
+
function springSettleMs(spring) {
|
|
57
|
+
const stiffness = Math.max(1e-6, finite(spring.stiffness, DEFAULT_SPRING.stiffness));
|
|
58
|
+
const damping = Math.max(0, finite(spring.damping, DEFAULT_SPRING.damping));
|
|
59
|
+
const mass = Math.max(1e-6, finite(spring.mass, DEFAULT_SPRING.mass));
|
|
60
|
+
const w0 = Math.sqrt(stiffness / mass);
|
|
61
|
+
const zeta = damping / (2 * Math.sqrt(stiffness * mass));
|
|
62
|
+
let seconds;
|
|
63
|
+
if (zeta <= 0) seconds = Infinity;
|
|
64
|
+
else if (zeta < 1 - 1e-6) seconds = 6.9 / (zeta * w0);
|
|
65
|
+
else if (zeta <= 1 + 1e-6) seconds = 9.2 / w0;
|
|
66
|
+
else seconds = 9.2 / (w0 * (zeta - Math.sqrt(zeta * zeta - 1)));
|
|
67
|
+
return Math.round(Math.min(1e4, Math.max(50, seconds * 1e3)));
|
|
68
|
+
}
|
|
69
|
+
function reverseCubicBezier(easing) {
|
|
70
|
+
const r = resolveEasing(easing);
|
|
71
|
+
if (r === "hold" || r.type !== "cubic-bezier") return null;
|
|
72
|
+
return { type: "cubic-bezier", x1: 1 - r.x2, y1: 1 - r.y2, x2: 1 - r.x1, y2: 1 - r.y1 };
|
|
73
|
+
}
|
|
42
74
|
var DEFAULT_ELASTIC = { amplitude: 1, period: 0.3, mode: "out" };
|
|
43
75
|
var clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
|
|
44
76
|
var finite = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : fallback;
|
|
@@ -123,6 +155,7 @@ function springAt(spring, seconds) {
|
|
|
123
155
|
function resolveEasing(easing) {
|
|
124
156
|
if (easing === "hold") return "hold";
|
|
125
157
|
if (easing === "spring") return { type: "spring", ...DEFAULT_SPRING };
|
|
158
|
+
if (typeof easing === "string" && easing in SPRING_PRESETS) return { type: "spring", ...SPRING_PRESETS[easing] };
|
|
126
159
|
if (easing === "elastic" || easing === "ease-out-elastic") {
|
|
127
160
|
return { type: "elastic", ...DEFAULT_ELASTIC, mode: "out" };
|
|
128
161
|
}
|
|
@@ -258,5 +291,8 @@ function easingLabel(easing) {
|
|
|
258
291
|
|
|
259
292
|
|
|
260
293
|
|
|
261
|
-
|
|
262
|
-
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
exports.ANIMATION_EASING_PRESETS = ANIMATION_EASING_PRESETS; exports.ANIMATION_EASING_LABELS = ANIMATION_EASING_LABELS; exports.CUBIC_BEZIER_PRESETS = CUBIC_BEZIER_PRESETS; exports.SPRING_PRESETS = SPRING_PRESETS; exports.springSettleMs = springSettleMs; exports.reverseCubicBezier = reverseCubicBezier; exports.elasticAt = elasticAt; exports.cubicBezierAt = cubicBezierAt; exports.springAt = springAt; exports.resolveEasing = resolveEasing; exports.evaluateEasing = evaluateEasing; exports.easingFromInfluence = easingFromInfluence; exports.parseCssEasing = parseCssEasing; exports.isAnimationEasing = isAnimationEasing; exports.easingToCss = easingToCss; exports.easingLabel = easingLabel;
|
|
298
|
+
//# sourceMappingURL=chunk-2FHLHZAL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-2FHLHZAL.cjs","../src/animation/easing.ts"],"names":["s"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-2FHLHZAL.cjs","sourcesContent":[null,"// Portions ported from filmcraft-main/crates/project/src/keyframe.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Keyframe easing: the curve a segment follows from one keyframe to the next.\n *\n * - `hold` keeps the first keyframe's value until the next one (a step).\n * - `linear` and the CSS presets (`ease`, `ease-in`, `ease-out`, `ease-in-out`) are\n * CSS-compatible `cubic-bezier()` curves; `{ type: 'cubic-bezier', x1, y1, x2, y2 }` is any\n * such curve (x1 / y1 is the leaving keyframe's out handle, x2 / y2 the next one's in handle).\n * - `spring` is a damped spring settling on the next value (it may overshoot).\n */\n\n/** Named easing presets. */\nexport type AnimationEasingPreset =\n\t| 'linear'\n\t| 'hold'\n\t| 'ease'\n\t| 'ease-in'\n\t| 'ease-out'\n\t| 'ease-in-out'\n\t| 'ease-in-back'\n\t| 'ease-out-back'\n\t| 'ease-out-elastic'\n\t| 'ease-in-elastic'\n\t| 'ease-in-out-elastic'\n\t| 'elastic'\n\t| 'spring'\n\t| 'spring-gentle'\n\t| 'spring-quick'\n\t| 'spring-bouncy'\n\t| 'spring-slow';\n\nexport interface CubicBezierEasing {\n\ttype: 'cubic-bezier';\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n}\n\nexport interface SpringEasing {\n\ttype: 'spring';\n\t/** Spring stiffness (default 170). */\n\tstiffness?: number;\n\t/** Damping (default 26). */\n\tdamping?: number;\n\t/** Mass (default 1). */\n\tmass?: number;\n\t/** Initial velocity in units of the segment's value change per second (default 0). */\n\tvelocity?: number;\n}\n\nexport interface ElasticEasing {\n\ttype: 'elastic';\n\t/** Amplitude / overshoot factor (default 1). */\n\tamplitude?: number;\n\t/** Period of oscillation as a fraction of duration (default 0.3). */\n\tperiod?: number;\n\t/** Mode of elastic oscillation ('out' | 'in' | 'in-out', default 'out'). */\n\tmode?: 'out' | 'in' | 'in-out';\n}\n\nexport type AnimationEasing = AnimationEasingPreset | CubicBezierEasing | SpringEasing | ElasticEasing;\n\n/** Preset names, in picker order. */\nexport const ANIMATION_EASING_PRESETS: readonly AnimationEasingPreset[] = [\n\t'linear',\n\t'ease',\n\t'ease-in',\n\t'ease-out',\n\t'ease-in-out',\n\t'ease-in-back',\n\t'ease-out-back',\n\t'ease-out-elastic',\n\t'ease-in-elastic',\n\t'ease-in-out-elastic',\n\t'elastic',\n\t'spring',\n\t'spring-gentle',\n\t'spring-quick',\n\t'spring-bouncy',\n\t'spring-slow',\n\t'hold'\n];\n\n/** Picker labels for the presets. */\nexport const ANIMATION_EASING_LABELS: Readonly<Record<AnimationEasingPreset, string>> = {\n\tlinear: 'Linear',\n\thold: 'Hold',\n\tease: 'Ease',\n\t'ease-in': 'Ease in',\n\t'ease-out': 'Ease out',\n\t'ease-in-out': 'Ease in-out',\n\t'ease-in-back': 'Back in',\n\t'ease-out-back': 'Back out',\n\t'ease-out-elastic': 'Elastic out',\n\t'ease-in-elastic': 'Elastic in',\n\t'ease-in-out-elastic': 'Elastic in-out',\n\telastic: 'Elastic',\n\tspring: 'Spring',\n\t'spring-gentle': 'Spring (gentle)',\n\t'spring-quick': 'Spring (quick)',\n\t'spring-bouncy': 'Spring (bouncy)',\n\t'spring-slow': 'Spring (slow)'\n};\n\n/** The CSS control points of the bezier presets (CSS Easing Functions Level 1 values for the CSS keywords). */\nexport const CUBIC_BEZIER_PRESETS: Readonly<Record<string, readonly [number, number, number, number]>> = {\n\tlinear: [0, 0, 1, 1],\n\tease: [0.25, 0.1, 0.25, 1],\n\t'ease-in': [0.42, 0, 1, 1],\n\t'ease-out': [0, 0, 0.58, 1],\n\t'ease-in-out': [0.42, 0, 0.58, 1],\n\t'ease-in-back': [0.36, 0, 0.66, -0.56],\n\t'ease-out-back': [0.34, 1.56, 0.64, 1]\n};\n\nconst DEFAULT_SPRING = { stiffness: 170, damping: 26, mass: 1, velocity: 0 };\n\n/**\n * Figma's named springs (mass 1): gentle 100 / 15, quick 300 / 20, bouncy 600 / 15, slow 80 / 20\n * (stiffness / damping). Each plays until it settles (see `springSettleMs`).\n */\nexport const SPRING_PRESETS: Readonly<Record<'spring-gentle' | 'spring-quick' | 'spring-bouncy' | 'spring-slow', Required<Omit<SpringEasing, 'type'>>>> = {\n\t'spring-gentle': { mass: 1, stiffness: 100, damping: 15, velocity: 0 },\n\t'spring-quick': { mass: 1, stiffness: 300, damping: 20, velocity: 0 },\n\t'spring-bouncy': { mass: 1, stiffness: 600, damping: 15, velocity: 0 },\n\t'spring-slow': { mass: 1, stiffness: 80, damping: 20, velocity: 0 }\n};\n\n/**\n * How long a spring takes to settle within 0.1% of its target, in ms (clamped to 50–10000):\n * 6.9 / (ζ·ω₀) s when under-damped, else 9.2 / its slowest rate.\n */\nexport function springSettleMs(spring: Omit<SpringEasing, 'type'>): number {\n\tconst stiffness = Math.max(1e-6, finite(spring.stiffness, DEFAULT_SPRING.stiffness));\n\tconst damping = Math.max(0, finite(spring.damping, DEFAULT_SPRING.damping));\n\tconst mass = Math.max(1e-6, finite(spring.mass, DEFAULT_SPRING.mass));\n\tconst w0 = Math.sqrt(stiffness / mass);\n\tconst zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\tlet seconds: number;\n\tif (zeta <= 0) seconds = Infinity;\n\telse if (zeta < 1 - 1e-6) seconds = 6.9 / (zeta * w0);\n\telse if (zeta <= 1 + 1e-6) seconds = 9.2 / w0;\n\telse seconds = 9.2 / (w0 * (zeta - Math.sqrt(zeta * zeta - 1)));\n\treturn Math.round(Math.min(10000, Math.max(50, seconds * 1000)));\n}\n\n/** The same curve run backwards in time (`1 − e(1 − u)`) for a cubic-bezier, or null for other easings. */\nexport function reverseCubicBezier(easing: AnimationEasing | string | undefined | null): CubicBezierEasing | null {\n\tconst r = resolveEasing(easing);\n\tif (r === 'hold' || r.type !== 'cubic-bezier') return null;\n\treturn { type: 'cubic-bezier', x1: 1 - r.x2, y1: 1 - r.y2, x2: 1 - r.x1, y2: 1 - r.y1 };\n}\nconst DEFAULT_ELASTIC = { amplitude: 1, period: 0.3, mode: 'out' as const };\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\nconst finite = (v: unknown, fallback: number) => (typeof v === 'number' && Number.isFinite(v) ? v : fallback);\n\n/**\n * Normalised position for a parametric elastic oscillation curve (as used in Rive and Penner curves).\n * Amplitude controls the overshoot intensity; period controls the wave frequency across normalized progress `t` (0–1).\n */\nexport function elasticAt(elastic: Omit<ElasticEasing, 'type'>, t: number): number {\n\tif (t <= 0) return 0;\n\tif (t >= 1) return 1;\n\n\tconst a = Math.max(1e-6, finite(elastic.amplitude, DEFAULT_ELASTIC.amplitude));\n\tconst p = Math.max(1e-6, finite(elastic.period, DEFAULT_ELASTIC.period));\n\tconst mode = elastic.mode ?? 'out';\n\n\tconst TAU = 2 * Math.PI;\n\n\tconst solveOut = (u: number, amp: number, per: number) => {\n\t\tconst s = amp < 1 ? per / 4 : (per / TAU) * Math.asin(1 / amp);\n\t\treturn amp * Math.pow(2, -10 * u) * Math.sin(((u - s) * TAU) / per) + 1;\n\t};\n\n\tconst solveIn = (u: number, amp: number, per: number) => {\n\t\tconst s = amp < 1 ? per / 4 : (per / TAU) * Math.asin(1 / amp);\n\t\tconst adjusted = u - 1;\n\t\treturn -(amp * Math.pow(2, 10 * adjusted) * Math.sin(((adjusted - s) * TAU) / per));\n\t};\n\n\tif (mode === 'in') {\n\t\treturn solveIn(t, a, p);\n\t}\n\tif (mode === 'in-out') {\n\t\tif (t < 0.5) {\n\t\t\treturn 0.5 * solveIn(t * 2, a, p);\n\t\t}\n\t\treturn 0.5 + 0.5 * solveOut((t - 0.5) * 2, a, p);\n\t}\n\treturn solveOut(t, a, p);\n}\n\n/**\n * Solves a CSS `cubic-bezier(x1, y1, x2, y2)` for y at progress x (Newton steps with a\n * bisection fallback). x1 / x2 are clamped to 0–1 as CSS requires.\n */\nexport function cubicBezierAt(x1: number, y1: number, x2: number, y2: number, x: number): number {\n\tif (x <= 0) return 0;\n\tif (x >= 1) return 1;\n\tx1 = clamp(x1, 0, 1);\n\tx2 = clamp(x2, 0, 1);\n\tconst bx = (s: number) => 3 * (1 - s) * (1 - s) * s * x1 + 3 * (1 - s) * s * s * x2 + s * s * s;\n\tconst by = (s: number) => 3 * (1 - s) * (1 - s) * s * y1 + 3 * (1 - s) * s * s * y2 + s * s * s;\n\tconst dbx = (s: number) => 3 * (1 - s) * (1 - s) * x1 + 6 * (1 - s) * s * (x2 - x1) + 3 * s * s * (1 - x2);\n\tlet s = x;\n\tfor (let i = 0; i < 8; i++) {\n\t\tconst d = dbx(s);\n\t\tif (Math.abs(d) < 1e-9) break;\n\t\tconst next = s - (bx(s) - x) / d;\n\t\tif (!(next >= 0 && next <= 1)) break;\n\t\ts = next;\n\t}\n\tif (Math.abs(bx(s) - x) > 1e-7) {\n\t\tlet lo = 0;\n\t\tlet hi = 1;\n\t\tfor (let i = 0; i < 60; i++) {\n\t\t\ts = (lo + hi) / 2;\n\t\t\tif (bx(s) < x) lo = s;\n\t\t\telse hi = s;\n\t\t}\n\t}\n\treturn by(s);\n}\n\n/**\n * Normalised position of a damped spring released from 0 towards 1, `seconds` after release.\n * Closed form for under-, critically and over-damped springs.\n */\nexport function springAt(spring: Omit<SpringEasing, 'type'>, seconds: number): number {\n\tconst stiffness = Math.max(1e-6, finite(spring.stiffness, DEFAULT_SPRING.stiffness));\n\tconst damping = Math.max(0, finite(spring.damping, DEFAULT_SPRING.damping));\n\tconst mass = Math.max(1e-6, finite(spring.mass, DEFAULT_SPRING.mass));\n\tconst v0 = -finite(spring.velocity, DEFAULT_SPRING.velocity);\n\tconst t = Math.max(0, seconds);\n\tconst w0 = Math.sqrt(stiffness / mass);\n\tconst zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\t// x(t) is the displacement from the target (starts at 1); progress = 1 - x.\n\tlet x: number;\n\tif (zeta < 1 - 1e-6) {\n\t\tconst wd = w0 * Math.sqrt(1 - zeta * zeta);\n\t\tx = Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0 + v0) / wd) * Math.sin(wd * t));\n\t} else if (zeta <= 1 + 1e-6) {\n\t\tx = Math.exp(-w0 * t) * (1 + (w0 + v0) * t);\n\t} else {\n\t\tconst r = Math.sqrt(zeta * zeta - 1);\n\t\tconst s1 = -w0 * (zeta - r);\n\t\tconst s2 = -w0 * (zeta + r);\n\t\tconst c2 = (v0 - s1) / (s2 - s1);\n\t\tconst c1 = 1 - c2;\n\t\tx = c1 * Math.exp(s1 * t) + c2 * Math.exp(s2 * t);\n\t}\n\treturn 1 - x;\n}\n\n/** Resolves an easing to a cubic-bezier, spring, elastic or hold descriptor (unknown input → linear). */\nexport function resolveEasing(\n\teasing: AnimationEasing | string | undefined | null\n): CubicBezierEasing | Required<SpringEasing> | Required<ElasticEasing> | 'hold' {\n\tif (easing === 'hold') return 'hold';\n\tif (easing === 'spring') return { type: 'spring', ...DEFAULT_SPRING };\n\tif (typeof easing === 'string' && easing in SPRING_PRESETS) return { type: 'spring', ...SPRING_PRESETS[easing as keyof typeof SPRING_PRESETS] };\n\tif (easing === 'elastic' || easing === 'ease-out-elastic') {\n\t\treturn { type: 'elastic', ...DEFAULT_ELASTIC, mode: 'out' };\n\t}\n\tif (easing === 'ease-in-elastic') {\n\t\treturn { type: 'elastic', ...DEFAULT_ELASTIC, mode: 'in' };\n\t}\n\tif (easing === 'ease-in-out-elastic') {\n\t\treturn { type: 'elastic', ...DEFAULT_ELASTIC, mode: 'in-out' };\n\t}\n\tif (typeof easing === 'string') {\n\t\tconst preset = CUBIC_BEZIER_PRESETS[easing];\n\t\tif (preset) return { type: 'cubic-bezier', x1: preset[0], y1: preset[1], x2: preset[2], y2: preset[3] };\n\t\tconst parsed = parseCssEasing(easing);\n\t\treturn parsed ? resolveEasing(parsed) : { type: 'cubic-bezier', x1: 0, y1: 0, x2: 1, y2: 1 };\n\t}\n\tif (easing && typeof easing === 'object') {\n\t\tif (easing.type === 'spring') {\n\t\t\treturn {\n\t\t\t\ttype: 'spring',\n\t\t\t\tstiffness: finite(easing.stiffness, DEFAULT_SPRING.stiffness),\n\t\t\t\tdamping: finite(easing.damping, DEFAULT_SPRING.damping),\n\t\t\t\tmass: finite(easing.mass, DEFAULT_SPRING.mass),\n\t\t\t\tvelocity: finite(easing.velocity, DEFAULT_SPRING.velocity)\n\t\t\t};\n\t\t}\n\t\tif (easing.type === 'elastic') {\n\t\t\treturn {\n\t\t\t\ttype: 'elastic',\n\t\t\t\tamplitude: finite(easing.amplitude, DEFAULT_ELASTIC.amplitude),\n\t\t\t\tperiod: finite(easing.period, DEFAULT_ELASTIC.period),\n\t\t\t\tmode: easing.mode === 'in' || easing.mode === 'in-out' ? easing.mode : 'out'\n\t\t\t};\n\t\t}\n\t\tif (easing.type === 'cubic-bezier') {\n\t\t\treturn {\n\t\t\t\ttype: 'cubic-bezier',\n\t\t\t\tx1: clamp(finite(easing.x1, 0), 0, 1),\n\t\t\t\ty1: finite(easing.y1, 0),\n\t\t\t\tx2: clamp(finite(easing.x2, 1), 0, 1),\n\t\t\t\ty2: finite(easing.y2, 1)\n\t\t\t};\n\t\t}\n\t}\n\treturn { type: 'cubic-bezier', x1: 0, y1: 0, x2: 1, y2: 1 };\n}\n\n/**\n * Eased progress for linear progress `u` (0–1) through a segment lasting `durationMs`\n * (springs depend on real time; other curves ignore it). `hold` returns 0 until `u` reaches 1.\n */\nexport function evaluateEasing(easing: AnimationEasing | string | undefined | null, u: number, durationMs = 1000): number {\n\tif (!(u > 0)) return 0;\n\tif (u >= 1) return 1;\n\tconst resolved = resolveEasing(easing);\n\tif (resolved === 'hold') return 0;\n\tif (resolved.type === 'spring') return springAt(resolved, (u * Math.max(0, durationMs)) / 1000);\n\tif (resolved.type === 'elastic') return elasticAt(resolved, u);\n\tconst { x1, y1, x2, y2 } = resolved;\n\tif (x1 === y1 && x2 === y2) return u; // linear\n\treturn cubicBezierAt(x1, y1, x2, y2, u);\n}\n\n/**\n * The easing filmcraft (and Premiere) derive from temporal \"influence\" handles: flat handles of\n * the given influences (0.01–1, default 1/3) on the leaving and arriving keyframe.\n */\nexport function easingFromInfluence(outInfluence = 1 / 3, inInfluence = 1 / 3): CubicBezierEasing {\n\treturn {\n\t\ttype: 'cubic-bezier',\n\t\tx1: clamp(outInfluence, 0.01, 1),\n\t\ty1: 0,\n\t\tx2: 1 - clamp(inInfluence, 0.01, 1),\n\t\ty2: 1\n\t};\n}\n\nconst NUMBER = String.raw`\\s*(-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)\\s*`;\nconst CUBIC_RE = new RegExp(`^cubic-bezier\\\\(${NUMBER},${NUMBER},${NUMBER},${NUMBER}\\\\)$`, 'i');\n\n/**\n * Parses a CSS easing (`linear`, `ease…`, `cubic-bezier(…)`, `steps(1, end)` / `step-end` →\n * hold) or a preset name. Returns `null` for anything else.\n */\nexport function parseCssEasing(text: string): AnimationEasing | null {\n\tconst value = text.trim().toLowerCase();\n\tif (value.length > 200) return null;\n\tif ((ANIMATION_EASING_PRESETS as readonly string[]).includes(value)) return value as AnimationEasingPreset;\n\tif (value === 'step-end' || /^steps\\(\\s*1\\s*(,\\s*(end|jump-end)\\s*)?\\)$/.test(value)) return 'hold';\n\tconst m = CUBIC_RE.exec(value);\n\tif (!m) return null;\n\tconst [x1, y1, x2, y2] = m.slice(1).map(Number);\n\tif (![x1, y1, x2, y2].every(Number.isFinite) || x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) return null;\n\treturn { type: 'cubic-bezier', x1, y1, x2, y2 };\n}\n\n/** Whether a value is a usable easing (preset name, CSS easing string or descriptor). */\nexport function isAnimationEasing(value: unknown): value is AnimationEasing {\n\tif (typeof value === 'string') return parseCssEasing(value) !== null;\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst e = value as Record<string, unknown>;\n\tif (e.type === 'spring') return true;\n\tif (e.type === 'elastic') return true;\n\treturn e.type === 'cubic-bezier' && [e.x1, e.y1, e.x2, e.y2].every((v) => typeof v === 'number' && Number.isFinite(v));\n}\n\nconst round = (v: number, digits = 4) => {\n\tconst p = 10 ** digits;\n\treturn Math.round(v * p) / p;\n};\n\n/**\n * The CSS `animation-timing-function` for an easing: a keyword or `cubic-bezier()`,\n * `steps(1, end)` for hold, and a sampled `linear(…)` for springs over `durationMs`.\n */\nexport function easingToCss(easing: AnimationEasing | string | undefined | null, durationMs = 1000, samples = 24): string {\n\tconst resolved = resolveEasing(easing);\n\tif (resolved === 'hold') return 'steps(1, end)';\n\tif (resolved.type === 'spring') {\n\t\tconst n = Math.max(2, Math.floor(samples));\n\t\tconst points: string[] = [];\n\t\tfor (let i = 0; i <= n; i++) points.push(String(round(i === n ? 1 : springAt(resolved, ((i / n) * durationMs) / 1000))));\n\t\treturn `linear(${points.join(', ')})`;\n\t}\n\tif (resolved.type === 'elastic') {\n\t\tconst n = Math.max(2, Math.floor(samples));\n\t\tconst points: string[] = [];\n\t\tfor (let i = 0; i <= n; i++) points.push(String(round(i === n ? 1 : elasticAt(resolved, i / n))));\n\t\treturn `linear(${points.join(', ')})`;\n\t}\n\tconst { x1, y1, x2, y2 } = resolved;\n\tfor (const [name, p] of Object.entries(CUBIC_BEZIER_PRESETS)) {\n\t\tif (['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out'].includes(name) && p[0] === x1 && p[1] === y1 && p[2] === x2 && p[3] === y2) {\n\t\t\treturn name;\n\t\t}\n\t}\n\treturn `cubic-bezier(${round(x1)}, ${round(y1)}, ${round(x2)}, ${round(y2)})`;\n}\n\n/** Short label for an easing (a preset's label, or `Custom` / `Spring` / `Elastic`). */\nexport function easingLabel(easing: AnimationEasing | undefined | null): string {\n\tif (easing === undefined || easing === null) return ANIMATION_EASING_LABELS.linear;\n\tif (typeof easing === 'string') return ANIMATION_EASING_LABELS[easing as AnimationEasingPreset] ?? easing;\n\tif (easing.type === 'spring') return 'Spring';\n\tif (easing.type === 'elastic') return 'Elastic';\n\treturn 'Custom';\n}\n"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// src/animation/behavior.ts
|
|
2
|
+
var MOTION_BEHAVIORS = ["pulse", "oscillate", "wriggle", "overshoot"];
|
|
3
|
+
var WRIGGLE_EDGE = 0.15;
|
|
4
|
+
function wave(kind, angle) {
|
|
5
|
+
switch (kind) {
|
|
6
|
+
case "square":
|
|
7
|
+
return Math.sin(angle) >= 0 ? 1 : -1;
|
|
8
|
+
case "triangle":
|
|
9
|
+
return 2 / Math.PI * Math.asin(Math.sin(angle));
|
|
10
|
+
case "sawtooth": {
|
|
11
|
+
const norm = angle / (2 * Math.PI) % 1;
|
|
12
|
+
return 2 * (norm < 0 ? norm + 1 : norm) - 1;
|
|
13
|
+
}
|
|
14
|
+
default:
|
|
15
|
+
return Math.sin(angle);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function behaviorProgress(behavior, t, index = 0, ms = 800) {
|
|
19
|
+
const time = Math.max(0, t);
|
|
20
|
+
switch (behavior.type) {
|
|
21
|
+
case "pulse":
|
|
22
|
+
return 0.5 + 0.5 * Math.sin(2 * Math.PI * (behavior.count ?? 1) * time - Math.PI / 2);
|
|
23
|
+
case "oscillate": {
|
|
24
|
+
const w = wave(behavior.wave, 2 * Math.PI * (behavior.count ?? 1) * time);
|
|
25
|
+
const decay = behavior.decay ?? 0;
|
|
26
|
+
return decay > 0 ? w * Math.max(0, 1 - t) ** decay : w;
|
|
27
|
+
}
|
|
28
|
+
case "wriggle": {
|
|
29
|
+
const edge = quinticFade(Math.min(1, Math.max(0, Math.min(t, 1 - t) / WRIGGLE_EDGE)));
|
|
30
|
+
if (edge === 0) return 0;
|
|
31
|
+
return edge * fractalWiggle(behavior.frequency ?? 2, 1, behavior.octaves ?? 2, 0.5, t * ms / 1e3, behavior.seed ?? 42, index);
|
|
32
|
+
}
|
|
33
|
+
case "overshoot": {
|
|
34
|
+
const p = Math.min(1, time);
|
|
35
|
+
if (p >= 1) return 1;
|
|
36
|
+
return 1 - Math.exp(-(behavior.damping ?? 4) * p) * Math.cos((behavior.cycles ?? 3) * Math.PI * p);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function isMotionBehavior(value) {
|
|
41
|
+
if (typeof value !== "object" || value === null) return false;
|
|
42
|
+
const b = value;
|
|
43
|
+
const positive = (k) => b[k] === void 0 || typeof b[k] === "number" && Number.isFinite(b[k]) && b[k] > 0;
|
|
44
|
+
const atLeastZero = (k) => b[k] === void 0 || typeof b[k] === "number" && Number.isFinite(b[k]) && b[k] >= 0;
|
|
45
|
+
switch (b.type) {
|
|
46
|
+
case "pulse":
|
|
47
|
+
return positive("count");
|
|
48
|
+
case "oscillate":
|
|
49
|
+
return positive("count") && atLeastZero("decay") && (b.wave === void 0 || ["sine", "triangle", "square", "sawtooth"].includes(b.wave));
|
|
50
|
+
case "wriggle":
|
|
51
|
+
return positive("frequency") && positive("octaves") && (b.seed === void 0 || Number.isInteger(b.seed));
|
|
52
|
+
case "overshoot":
|
|
53
|
+
return positive("cycles") && atLeastZero("damping");
|
|
54
|
+
default:
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function motionSeedFromId(id) {
|
|
59
|
+
let h = 2166136261;
|
|
60
|
+
for (let i = 0; i < id.length; i++) h = Math.imul(h ^ id.charCodeAt(i), 16777619);
|
|
61
|
+
return (h >>> 0) % 2147483647 || 1;
|
|
62
|
+
}
|
|
63
|
+
var GOLDEN_GAMMA = 0x9e3779b97f4a7c15n;
|
|
64
|
+
var MULT1 = 0xbf58476d1ce4e5b9n;
|
|
65
|
+
var MULT2 = 0x94d049bb133111ebn;
|
|
66
|
+
var MASK64 = 0xffffffffffffffffn;
|
|
67
|
+
var BASE_MIX = 0x2545f4914f6cdd1dn;
|
|
68
|
+
var POW2_53 = 9007199254740992;
|
|
69
|
+
function hash64(x) {
|
|
70
|
+
let v = x + GOLDEN_GAMMA & MASK64;
|
|
71
|
+
v = (v ^ v >> 30n) * MULT1 & MASK64;
|
|
72
|
+
v = (v ^ v >> 27n) * MULT2 & MASK64;
|
|
73
|
+
return (v ^ v >> 31n) & MASK64;
|
|
74
|
+
}
|
|
75
|
+
function mixSeeds(parts) {
|
|
76
|
+
let h = BASE_MIX;
|
|
77
|
+
for (const p of parts) {
|
|
78
|
+
const val = typeof p === "bigint" ? p : BigInt(Math.floor(p));
|
|
79
|
+
h = hash64(h ^ hash64(val & MASK64));
|
|
80
|
+
}
|
|
81
|
+
return h;
|
|
82
|
+
}
|
|
83
|
+
function unitFloat(seed) {
|
|
84
|
+
return Number(hash64(seed) >> 11n) / POW2_53;
|
|
85
|
+
}
|
|
86
|
+
function quinticFade(t) {
|
|
87
|
+
return t * t * t * (t * (t * 6 - 15) + 10);
|
|
88
|
+
}
|
|
89
|
+
function noise1d(seed, x) {
|
|
90
|
+
if (!Number.isFinite(x)) return 0;
|
|
91
|
+
const floorX = Math.floor(x);
|
|
92
|
+
const u = quinticFade(x - floorX);
|
|
93
|
+
const i = BigInt(floorX);
|
|
94
|
+
const a = unitFloat(seed ^ hash64(i & MASK64)) * 2 - 1;
|
|
95
|
+
const b = unitFloat(seed ^ hash64(i + 1n & MASK64)) * 2 - 1;
|
|
96
|
+
return a + (b - a) * u;
|
|
97
|
+
}
|
|
98
|
+
function fractalWiggle(freq, amp, octaves = 3, ampMult = 0.5, t = 0, seed = 42, dimension = 0) {
|
|
99
|
+
const oct = Math.max(1, Math.min(16, Math.floor(octaves)));
|
|
100
|
+
let currentAmp = amp;
|
|
101
|
+
let currentFreq = freq;
|
|
102
|
+
let sum = 0;
|
|
103
|
+
const baseSeed = BigInt(Math.floor(seed));
|
|
104
|
+
for (let k = 0; k < oct; k++) {
|
|
105
|
+
const s = mixSeeds([baseSeed, BigInt(dimension), BigInt(k)]);
|
|
106
|
+
const phaseOffset = unitFloat(s) * 1e3;
|
|
107
|
+
sum += currentAmp * noise1d(s, currentFreq * t + phaseOffset);
|
|
108
|
+
currentAmp *= ampMult;
|
|
109
|
+
currentFreq *= 2;
|
|
110
|
+
}
|
|
111
|
+
return sum;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
MOTION_BEHAVIORS,
|
|
116
|
+
behaviorProgress,
|
|
117
|
+
isMotionBehavior,
|
|
118
|
+
motionSeedFromId,
|
|
119
|
+
quinticFade,
|
|
120
|
+
fractalWiggle
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=chunk-3NYXDBBW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animation/behavior.ts"],"sourcesContent":["/**\n * Behaviours: how a change gets from `from` to `to` other than straight along its ease (a\n * pulse there and back, an oscillation, a seeded wriggle, a springy overshoot). Ported from\n * `@pixerate/flair` (MIT): `SvgBehavior` and `behaviorProgress` in `vector/motion.ts`, the\n * oscillate and overshoot evaluators in `scene/behavior.ts` and the noise in `time/noise.ts`.\n * The numbers must stay identical to Flair's, so a behaviour exported to Flair plays the same\n * frames there as here (the animation editor writes them as Flair `behavior`s, Flair ≥ 0.38).\n */\n\n/**\n * A behaviour: its progress `u` at each moment, where 0 is `from`, 1 is `to`, and numbers go\n * past either. `t` is the change's time, 0–1, through its ease (linear unless given).\n *\n * - `pulse`: there and back `count` times (default 1): u = sin²(π·count·t).\n * - `oscillate`: swings round `from`, out to `to` and as far the other way, `count` times\n * (default 1), dying away by (1 − t)^`decay` (default 0, no decay).\n * - `wriggle`: wanders round `from` by up to about `to − from`, as seeded smooth fractal noise\n * at `frequency` Hz (default 2) with `octaves` layers (default 2); each number in a value\n * wanders on its own channel. It eases out of and back to rest over the first and last 15%\n * of its time. The same `seed` (default 42) gives the same wander.\n * - `overshoot`: goes to `to`, past it and back, settling like a spring:\n * u = 1 − e^(−damping·t)·cos(cycles·π·t) (default 3 cycles, damping 4).\n */\nexport type MotionBehavior =\n\t| { type: 'pulse'; count?: number }\n\t| { type: 'oscillate'; count?: number; decay?: number; wave?: 'sine' | 'triangle' | 'square' | 'sawtooth' }\n\t| { type: 'wriggle'; frequency?: number; octaves?: number; seed?: number }\n\t| { type: 'overshoot'; cycles?: number; damping?: number };\n\n/** Every `MotionBehavior` type. */\nexport const MOTION_BEHAVIORS = ['pulse', 'oscillate', 'wriggle', 'overshoot'] as const;\n\n/** Share of a wriggle's time spent easing out of and back to rest, at each end. */\nconst WRIGGLE_EDGE = 0.15;\n\nfunction wave(kind: 'sine' | 'triangle' | 'square' | 'sawtooth' | undefined, angle: number): number {\n\tswitch (kind) {\n\t\tcase 'square':\n\t\t\treturn Math.sin(angle) >= 0 ? 1 : -1;\n\t\tcase 'triangle':\n\t\t\treturn (2 / Math.PI) * Math.asin(Math.sin(angle));\n\t\tcase 'sawtooth': {\n\t\t\tconst norm = (angle / (2 * Math.PI)) % 1;\n\t\t\treturn 2 * (norm < 0 ? norm + 1 : norm) - 1;\n\t\t}\n\t\tdefault:\n\t\t\treturn Math.sin(angle);\n\t}\n}\n\n/**\n * A behaviour's progress at `t` (0–1, eased) of a change lasting `ms`, for the `index`-th number\n * in a value (only a wriggle tells numbers apart).\n */\nexport function behaviorProgress(behavior: MotionBehavior, t: number, index = 0, ms = 800): number {\n\tconst time = Math.max(0, t);\n\tswitch (behavior.type) {\n\t\tcase 'pulse':\n\t\t\t// sin²(πct) = (1 − cos 2πct) / 2: written as Flair writes it, so the numbers match.\n\t\t\treturn 0.5 + 0.5 * Math.sin(2 * Math.PI * (behavior.count ?? 1) * time - Math.PI / 2);\n\t\tcase 'oscillate': {\n\t\t\tconst w = wave(behavior.wave, 2 * Math.PI * (behavior.count ?? 1) * time);\n\t\t\tconst decay = behavior.decay ?? 0;\n\t\t\treturn decay > 0 ? w * Math.max(0, 1 - t) ** decay : w;\n\t\t}\n\t\tcase 'wriggle': {\n\t\t\tconst edge = quinticFade(Math.min(1, Math.max(0, Math.min(t, 1 - t) / WRIGGLE_EDGE)));\n\t\t\tif (edge === 0) return 0;\n\t\t\treturn edge * fractalWiggle(behavior.frequency ?? 2, 1, behavior.octaves ?? 2, 0.5, (t * ms) / 1000, behavior.seed ?? 42, index);\n\t\t}\n\t\tcase 'overshoot': {\n\t\t\tconst p = Math.min(1, time);\n\t\t\tif (p >= 1) return 1;\n\t\t\treturn 1 - Math.exp(-(behavior.damping ?? 4) * p) * Math.cos((behavior.cycles ?? 3) * Math.PI * p);\n\t\t}\n\t}\n}\n\n/** Whether `value` is a well-formed `MotionBehavior`. */\nexport function isMotionBehavior(value: unknown): value is MotionBehavior {\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst b = value as Record<string, unknown>;\n\tconst positive = (k: string) => b[k] === undefined || (typeof b[k] === 'number' && Number.isFinite(b[k]) && (b[k] as number) > 0);\n\tconst atLeastZero = (k: string) => b[k] === undefined || (typeof b[k] === 'number' && Number.isFinite(b[k]) && (b[k] as number) >= 0);\n\tswitch (b.type) {\n\t\tcase 'pulse':\n\t\t\treturn positive('count');\n\t\tcase 'oscillate':\n\t\t\treturn positive('count') && atLeastZero('decay') && (b.wave === undefined || ['sine', 'triangle', 'square', 'sawtooth'].includes(b.wave as string));\n\t\tcase 'wriggle':\n\t\t\treturn positive('frequency') && positive('octaves') && (b.seed === undefined || Number.isInteger(b.seed));\n\t\tcase 'overshoot':\n\t\t\treturn positive('cycles') && atLeastZero('damping');\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A seed from an id (FNV-1a), so each element wriggles its own way: Flair's `seedOf`. */\nexport function motionSeedFromId(id: string): number {\n\tlet h = 0x811c9dc5;\n\tfor (let i = 0; i < id.length; i++) h = Math.imul(h ^ id.charCodeAt(i), 0x01000193);\n\treturn (h >>> 0) % 2147483647 || 1;\n}\n\n// ── Noise (SplitMix64 hashing, quintic value noise), as Flair's `time/noise.ts` ─────────────\n\nconst GOLDEN_GAMMA = 0x9e3779b97f4a7c15n;\nconst MULT1 = 0xbf58476d1ce4e5b9n;\nconst MULT2 = 0x94d049bb133111ebn;\nconst MASK64 = 0xffffffffffffffffn;\nconst BASE_MIX = 0x2545f4914f6cdd1dn;\nconst POW2_53 = 9007199254740992;\n\nfunction hash64(x: bigint): bigint {\n\tlet v = (x + GOLDEN_GAMMA) & MASK64;\n\tv = ((v ^ (v >> 30n)) * MULT1) & MASK64;\n\tv = ((v ^ (v >> 27n)) * MULT2) & MASK64;\n\treturn (v ^ (v >> 31n)) & MASK64;\n}\n\nfunction mixSeeds(parts: (bigint | number)[]): bigint {\n\tlet h = BASE_MIX;\n\tfor (const p of parts) {\n\t\tconst val = typeof p === 'bigint' ? p : BigInt(Math.floor(p));\n\t\th = hash64(h ^ hash64(val & MASK64));\n\t}\n\treturn h;\n}\n\nfunction unitFloat(seed: bigint): number {\n\treturn Number(hash64(seed) >> 11n) / POW2_53;\n}\n\n/** 6t⁵ − 15t⁴ + 10t³: zero slope and curvature at 0 and 1. */\nexport function quinticFade(t: number): number {\n\treturn t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n\nfunction noise1d(seed: bigint, x: number): number {\n\tif (!Number.isFinite(x)) return 0;\n\tconst floorX = Math.floor(x);\n\tconst u = quinticFade(x - floorX);\n\tconst i = BigInt(floorX);\n\tconst a = unitFloat(seed ^ hash64(i & MASK64)) * 2 - 1;\n\tconst b = unitFloat(seed ^ hash64((i + 1n) & MASK64)) * 2 - 1;\n\treturn a + (b - a) * u;\n}\n\n/**\n * Multi-octave smooth noise (After Effects' `wiggle`): the sum over `octaves` of\n * amp·ampMult^k · noise(freq·2^k·t), each octave and `dimension` seeded apart. `t` in seconds.\n */\nexport function fractalWiggle(freq: number, amp: number, octaves = 3, ampMult = 0.5, t = 0, seed = 42, dimension = 0): number {\n\tconst oct = Math.max(1, Math.min(16, Math.floor(octaves)));\n\tlet currentAmp = amp;\n\tlet currentFreq = freq;\n\tlet sum = 0;\n\tconst baseSeed = BigInt(Math.floor(seed));\n\tfor (let k = 0; k < oct; k++) {\n\t\tconst s = mixSeeds([baseSeed, BigInt(dimension), BigInt(k)]);\n\t\tconst phaseOffset = unitFloat(s) * 1000.0;\n\t\tsum += currentAmp * noise1d(s, currentFreq * t + phaseOffset);\n\t\tcurrentAmp *= ampMult;\n\t\tcurrentFreq *= 2.0;\n\t}\n\treturn sum;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
} from "./chunk-TGD52FEZ.js";
|
|
41
41
|
import {
|
|
42
42
|
evaluateEasing
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-AGR4P4UZ.js";
|
|
44
44
|
|
|
45
45
|
// src/vector/types.ts
|
|
46
46
|
var VECTOR_CORNER_KINDS = ["round", "inverted", "chamfer"];
|
|
@@ -5195,6 +5195,21 @@ function vectorDocumentToSvg(doc, options = {}) {
|
|
|
5195
5195
|
};
|
|
5196
5196
|
const emit2 = (node, depth) => {
|
|
5197
5197
|
if (node.visible === false && !options.includeHidden) return;
|
|
5198
|
+
const wrappers = options.wrap?.[node.id] ?? [];
|
|
5199
|
+
wrappers.forEach((w2, i) => {
|
|
5200
|
+
let attrs = w2.id !== void 0 ? ` id="${escapeAttr(w2.id)}"` : "";
|
|
5201
|
+
if (w2.transform) attrs += ` transform="${escapeAttr(w2.transform)}"`;
|
|
5202
|
+
if (w2.clip) {
|
|
5203
|
+
const shape = Object.entries(w2.clip.attrs).map(([k, v2]) => ` ${k}="${formatNumber(v2, 4)}"`).join("");
|
|
5204
|
+
defs.push(`<clipPath id="${escapeAttr(w2.clip.id)}" clipPathUnits="objectBoundingBox"><${w2.clip.shape}${w2.clip.shapeId !== void 0 ? ` id="${escapeAttr(w2.clip.shapeId)}"` : ""}${shape}/></clipPath>`);
|
|
5205
|
+
attrs += ` clip-path="url(#${escapeAttr(w2.clip.id)})"`;
|
|
5206
|
+
}
|
|
5207
|
+
lines.push(`${indent(depth + i)}<g${attrs}>`);
|
|
5208
|
+
});
|
|
5209
|
+
emitNode(node, depth + wrappers.length);
|
|
5210
|
+
for (let i = wrappers.length - 1; i >= 0; i--) lines.push(`${indent(depth + i)}</g>`);
|
|
5211
|
+
};
|
|
5212
|
+
const emitNode = (node, depth) => {
|
|
5198
5213
|
if (hasOwnVectorAppearance(node)) {
|
|
5199
5214
|
const live2 = {
|
|
5200
5215
|
kind: node.type,
|
|
@@ -5976,4 +5991,4 @@ export {
|
|
|
5976
5991
|
parseSvgTransform,
|
|
5977
5992
|
parseVectorSvg
|
|
5978
5993
|
};
|
|
5979
|
-
//# sourceMappingURL=chunk-
|
|
5994
|
+
//# sourceMappingURL=chunk-3TLL5OID.js.map
|