@pixerate/editor 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +20 -1
  2. package/dist/HistoryManager-DWSLd6Tf.d.ts +150 -0
  3. package/dist/HistoryManager-DeQQMBCj.d.cts +150 -0
  4. package/dist/agent/index.cjs +20 -427
  5. package/dist/agent/index.cjs.map +1 -1
  6. package/dist/agent/index.d.cts +4 -342
  7. package/dist/agent/index.d.ts +4 -342
  8. package/dist/agent/index.js +14 -421
  9. package/dist/agent/index.js.map +1 -1
  10. package/dist/animation/index.cjs +6 -2
  11. package/dist/animation/index.cjs.map +1 -1
  12. package/dist/animation/index.d.cts +3 -73
  13. package/dist/animation/index.d.ts +3 -73
  14. package/dist/animation/index.js +17 -13
  15. package/dist/{builtins-nMXh9sT3.d.cts → builtins-DxC3aUR2.d.cts} +2 -2
  16. package/dist/{builtins-haN82vjT.d.ts → builtins-NGxNxQfJ.d.ts} +2 -2
  17. package/dist/canvas/index.cjs +338 -28
  18. package/dist/canvas/index.cjs.map +1 -1
  19. package/dist/canvas/index.d.cts +109 -4
  20. package/dist/canvas/index.d.ts +109 -4
  21. package/dist/canvas/index.js +323 -13
  22. package/dist/canvas/index.js.map +1 -1
  23. package/dist/chunk-36BLROHV.js +438 -0
  24. package/dist/chunk-36BLROHV.js.map +1 -0
  25. package/dist/{chunk-OYEFRO3D.cjs → chunk-6MDQKHRH.cjs} +4 -4
  26. package/dist/{chunk-OYEFRO3D.cjs.map → chunk-6MDQKHRH.cjs.map} +1 -1
  27. package/dist/{chunk-ARRTP33I.js → chunk-D6S5M7HV.js} +2 -2
  28. package/dist/{chunk-ARRTP33I.js.map → chunk-D6S5M7HV.js.map} +1 -1
  29. package/dist/{chunk-MXZJ4PKN.js → chunk-DDADOHJW.js} +8 -8
  30. package/dist/{chunk-CPOKFNBG.cjs → chunk-I6BZB5ZH.cjs} +2 -2
  31. package/dist/{chunk-CPOKFNBG.cjs.map → chunk-I6BZB5ZH.cjs.map} +1 -1
  32. package/dist/chunk-PIIAZV3L.cjs +244 -0
  33. package/dist/chunk-PIIAZV3L.cjs.map +1 -0
  34. package/dist/{chunk-G2I4QJOT.cjs → chunk-QKLRAA4T.cjs} +3 -244
  35. package/dist/chunk-QKLRAA4T.cjs.map +1 -0
  36. package/dist/{chunk-2H7ZHPEJ.js → chunk-QVZZGT4X.js} +1 -242
  37. package/dist/chunk-QVZZGT4X.js.map +1 -0
  38. package/dist/chunk-UB2OY7FD.js +262 -0
  39. package/dist/chunk-UB2OY7FD.js.map +1 -0
  40. package/dist/chunk-V7CC7RZ6.cjs +438 -0
  41. package/dist/chunk-V7CC7RZ6.cjs.map +1 -0
  42. package/dist/{chunk-PWJARCI4.js → chunk-W7BOBWZD.js} +5 -196
  43. package/dist/chunk-W7BOBWZD.js.map +1 -0
  44. package/dist/{chunk-TTYCN6ZH.cjs → chunk-XHRZSB77.cjs} +8 -199
  45. package/dist/chunk-XHRZSB77.cjs.map +1 -0
  46. package/dist/chunk-XZ4L3R4K.cjs +262 -0
  47. package/dist/chunk-XZ4L3R4K.cjs.map +1 -0
  48. package/dist/chunk-YK57D7PW.js +244 -0
  49. package/dist/chunk-YK57D7PW.js.map +1 -0
  50. package/dist/commands/index.cjs +2 -2
  51. package/dist/commands/index.cjs.map +1 -1
  52. package/dist/commands/index.d.cts +2 -2
  53. package/dist/commands/index.d.ts +2 -2
  54. package/dist/commands/index.js +1 -1
  55. package/dist/commands/index.js.map +1 -1
  56. package/dist/easing-DTmX99QG.d.cts +88 -0
  57. package/dist/easing-DTmX99QG.d.ts +88 -0
  58. package/dist/extensions/index.cjs +5 -5
  59. package/dist/extensions/index.cjs.map +1 -1
  60. package/dist/extensions/index.js +9 -9
  61. package/dist/generation/index.cjs +2 -2
  62. package/dist/generation/index.cjs.map +1 -1
  63. package/dist/generation/index.js +1 -1
  64. package/dist/generation/index.js.map +1 -1
  65. package/dist/history/index.cjs +4 -2
  66. package/dist/history/index.cjs.map +1 -1
  67. package/dist/history/index.d.cts +3 -149
  68. package/dist/history/index.d.ts +3 -149
  69. package/dist/history/index.js +5 -3
  70. package/dist/image-editor/index.cjs.map +1 -1
  71. package/dist/image-editor/index.js.map +1 -1
  72. package/dist/index.cjs +15 -13
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +3 -2
  75. package/dist/index.d.ts +3 -2
  76. package/dist/index.js +22 -20
  77. package/dist/index.js.map +1 -1
  78. package/dist/parameters/index.cjs +1320 -0
  79. package/dist/parameters/index.cjs.map +1 -0
  80. package/dist/parameters/index.d.cts +625 -0
  81. package/dist/parameters/index.d.ts +625 -0
  82. package/dist/parameters/index.js +1320 -0
  83. package/dist/parameters/index.js.map +1 -0
  84. package/dist/tools/index.cjs +31 -0
  85. package/dist/tools/index.cjs.map +1 -0
  86. package/dist/tools/index.d.cts +343 -0
  87. package/dist/tools/index.d.ts +343 -0
  88. package/dist/tools/index.js +31 -0
  89. package/dist/tools/index.js.map +1 -0
  90. package/dist/{types-GT5a5YAX.d.cts → types-DsiXGmjo.d.cts} +1 -1
  91. package/dist/{types-GT5a5YAX.d.ts → types-DsiXGmjo.d.ts} +1 -1
  92. package/package.json +11 -1
  93. package/dist/chunk-2H7ZHPEJ.js.map +0 -1
  94. package/dist/chunk-G2I4QJOT.cjs.map +0 -1
  95. package/dist/chunk-PWJARCI4.js.map +0 -1
  96. package/dist/chunk-TTYCN6ZH.cjs.map +0 -1
  97. /package/dist/{chunk-MXZJ4PKN.js.map → chunk-DDADOHJW.js.map} +0 -0
@@ -0,0 +1,262 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/animation/easing.ts
2
+ var ANIMATION_EASING_PRESETS = [
3
+ "linear",
4
+ "ease",
5
+ "ease-in",
6
+ "ease-out",
7
+ "ease-in-out",
8
+ "ease-in-back",
9
+ "ease-out-back",
10
+ "ease-out-elastic",
11
+ "ease-in-elastic",
12
+ "ease-in-out-elastic",
13
+ "elastic",
14
+ "spring",
15
+ "hold"
16
+ ];
17
+ var ANIMATION_EASING_LABELS = {
18
+ linear: "Linear",
19
+ hold: "Hold",
20
+ ease: "Ease",
21
+ "ease-in": "Ease in",
22
+ "ease-out": "Ease out",
23
+ "ease-in-out": "Ease in-out",
24
+ "ease-in-back": "Back in",
25
+ "ease-out-back": "Back out",
26
+ "ease-out-elastic": "Elastic out",
27
+ "ease-in-elastic": "Elastic in",
28
+ "ease-in-out-elastic": "Elastic in-out",
29
+ elastic: "Elastic",
30
+ spring: "Spring"
31
+ };
32
+ var CUBIC_BEZIER_PRESETS = {
33
+ linear: [0, 0, 1, 1],
34
+ ease: [0.25, 0.1, 0.25, 1],
35
+ "ease-in": [0.42, 0, 1, 1],
36
+ "ease-out": [0, 0, 0.58, 1],
37
+ "ease-in-out": [0.42, 0, 0.58, 1],
38
+ "ease-in-back": [0.36, 0, 0.66, -0.56],
39
+ "ease-out-back": [0.34, 1.56, 0.64, 1]
40
+ };
41
+ var DEFAULT_SPRING = { stiffness: 170, damping: 26, mass: 1, velocity: 0 };
42
+ var DEFAULT_ELASTIC = { amplitude: 1, period: 0.3, mode: "out" };
43
+ var clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
44
+ var finite = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : fallback;
45
+ function elasticAt(elastic, t) {
46
+ if (t <= 0) return 0;
47
+ if (t >= 1) return 1;
48
+ const a = Math.max(1e-6, finite(elastic.amplitude, DEFAULT_ELASTIC.amplitude));
49
+ const p = Math.max(1e-6, finite(elastic.period, DEFAULT_ELASTIC.period));
50
+ const mode = _nullishCoalesce(elastic.mode, () => ( "out"));
51
+ const TAU = 2 * Math.PI;
52
+ const solveOut = (u, amp, per) => {
53
+ const s = amp < 1 ? per / 4 : per / TAU * Math.asin(1 / amp);
54
+ return amp * Math.pow(2, -10 * u) * Math.sin((u - s) * TAU / per) + 1;
55
+ };
56
+ const solveIn = (u, amp, per) => {
57
+ const s = amp < 1 ? per / 4 : per / TAU * Math.asin(1 / amp);
58
+ const adjusted = u - 1;
59
+ return -(amp * Math.pow(2, 10 * adjusted) * Math.sin((adjusted - s) * TAU / per));
60
+ };
61
+ if (mode === "in") {
62
+ return solveIn(t, a, p);
63
+ }
64
+ if (mode === "in-out") {
65
+ if (t < 0.5) {
66
+ return 0.5 * solveIn(t * 2, a, p);
67
+ }
68
+ return 0.5 + 0.5 * solveOut((t - 0.5) * 2, a, p);
69
+ }
70
+ return solveOut(t, a, p);
71
+ }
72
+ function cubicBezierAt(x1, y1, x2, y2, x) {
73
+ if (x <= 0) return 0;
74
+ if (x >= 1) return 1;
75
+ x1 = clamp(x1, 0, 1);
76
+ x2 = clamp(x2, 0, 1);
77
+ const bx = (s2) => 3 * (1 - s2) * (1 - s2) * s2 * x1 + 3 * (1 - s2) * s2 * s2 * x2 + s2 * s2 * s2;
78
+ const by = (s2) => 3 * (1 - s2) * (1 - s2) * s2 * y1 + 3 * (1 - s2) * s2 * s2 * y2 + s2 * s2 * s2;
79
+ const dbx = (s2) => 3 * (1 - s2) * (1 - s2) * x1 + 6 * (1 - s2) * s2 * (x2 - x1) + 3 * s2 * s2 * (1 - x2);
80
+ let s = x;
81
+ for (let i = 0; i < 8; i++) {
82
+ const d = dbx(s);
83
+ if (Math.abs(d) < 1e-9) break;
84
+ const next = s - (bx(s) - x) / d;
85
+ if (!(next >= 0 && next <= 1)) break;
86
+ s = next;
87
+ }
88
+ if (Math.abs(bx(s) - x) > 1e-7) {
89
+ let lo = 0;
90
+ let hi = 1;
91
+ for (let i = 0; i < 60; i++) {
92
+ s = (lo + hi) / 2;
93
+ if (bx(s) < x) lo = s;
94
+ else hi = s;
95
+ }
96
+ }
97
+ return by(s);
98
+ }
99
+ function springAt(spring, seconds) {
100
+ const stiffness = Math.max(1e-6, finite(spring.stiffness, DEFAULT_SPRING.stiffness));
101
+ const damping = Math.max(0, finite(spring.damping, DEFAULT_SPRING.damping));
102
+ const mass = Math.max(1e-6, finite(spring.mass, DEFAULT_SPRING.mass));
103
+ const v0 = -finite(spring.velocity, DEFAULT_SPRING.velocity);
104
+ const t = Math.max(0, seconds);
105
+ const w0 = Math.sqrt(stiffness / mass);
106
+ const zeta = damping / (2 * Math.sqrt(stiffness * mass));
107
+ let x;
108
+ if (zeta < 1 - 1e-6) {
109
+ const wd = w0 * Math.sqrt(1 - zeta * zeta);
110
+ x = Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + (zeta * w0 + v0) / wd * Math.sin(wd * t));
111
+ } else if (zeta <= 1 + 1e-6) {
112
+ x = Math.exp(-w0 * t) * (1 + (w0 + v0) * t);
113
+ } else {
114
+ const r = Math.sqrt(zeta * zeta - 1);
115
+ const s1 = -w0 * (zeta - r);
116
+ const s2 = -w0 * (zeta + r);
117
+ const c2 = (v0 - s1) / (s2 - s1);
118
+ const c1 = 1 - c2;
119
+ x = c1 * Math.exp(s1 * t) + c2 * Math.exp(s2 * t);
120
+ }
121
+ return 1 - x;
122
+ }
123
+ function resolveEasing(easing) {
124
+ if (easing === "hold") return "hold";
125
+ if (easing === "spring") return { type: "spring", ...DEFAULT_SPRING };
126
+ if (easing === "elastic" || easing === "ease-out-elastic") {
127
+ return { type: "elastic", ...DEFAULT_ELASTIC, mode: "out" };
128
+ }
129
+ if (easing === "ease-in-elastic") {
130
+ return { type: "elastic", ...DEFAULT_ELASTIC, mode: "in" };
131
+ }
132
+ if (easing === "ease-in-out-elastic") {
133
+ return { type: "elastic", ...DEFAULT_ELASTIC, mode: "in-out" };
134
+ }
135
+ if (typeof easing === "string") {
136
+ const preset = CUBIC_BEZIER_PRESETS[easing];
137
+ if (preset) return { type: "cubic-bezier", x1: preset[0], y1: preset[1], x2: preset[2], y2: preset[3] };
138
+ const parsed = parseCssEasing(easing);
139
+ return parsed ? resolveEasing(parsed) : { type: "cubic-bezier", x1: 0, y1: 0, x2: 1, y2: 1 };
140
+ }
141
+ if (easing && typeof easing === "object") {
142
+ if (easing.type === "spring") {
143
+ return {
144
+ type: "spring",
145
+ stiffness: finite(easing.stiffness, DEFAULT_SPRING.stiffness),
146
+ damping: finite(easing.damping, DEFAULT_SPRING.damping),
147
+ mass: finite(easing.mass, DEFAULT_SPRING.mass),
148
+ velocity: finite(easing.velocity, DEFAULT_SPRING.velocity)
149
+ };
150
+ }
151
+ if (easing.type === "elastic") {
152
+ return {
153
+ type: "elastic",
154
+ amplitude: finite(easing.amplitude, DEFAULT_ELASTIC.amplitude),
155
+ period: finite(easing.period, DEFAULT_ELASTIC.period),
156
+ mode: easing.mode === "in" || easing.mode === "in-out" ? easing.mode : "out"
157
+ };
158
+ }
159
+ if (easing.type === "cubic-bezier") {
160
+ return {
161
+ type: "cubic-bezier",
162
+ x1: clamp(finite(easing.x1, 0), 0, 1),
163
+ y1: finite(easing.y1, 0),
164
+ x2: clamp(finite(easing.x2, 1), 0, 1),
165
+ y2: finite(easing.y2, 1)
166
+ };
167
+ }
168
+ }
169
+ return { type: "cubic-bezier", x1: 0, y1: 0, x2: 1, y2: 1 };
170
+ }
171
+ function evaluateEasing(easing, u, durationMs = 1e3) {
172
+ if (!(u > 0)) return 0;
173
+ if (u >= 1) return 1;
174
+ const resolved = resolveEasing(easing);
175
+ if (resolved === "hold") return 0;
176
+ if (resolved.type === "spring") return springAt(resolved, u * Math.max(0, durationMs) / 1e3);
177
+ if (resolved.type === "elastic") return elasticAt(resolved, u);
178
+ const { x1, y1, x2, y2 } = resolved;
179
+ if (x1 === y1 && x2 === y2) return u;
180
+ return cubicBezierAt(x1, y1, x2, y2, u);
181
+ }
182
+ function easingFromInfluence(outInfluence = 1 / 3, inInfluence = 1 / 3) {
183
+ return {
184
+ type: "cubic-bezier",
185
+ x1: clamp(outInfluence, 0.01, 1),
186
+ y1: 0,
187
+ x2: 1 - clamp(inInfluence, 0.01, 1),
188
+ y2: 1
189
+ };
190
+ }
191
+ var NUMBER = String.raw`\s*(-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)\s*`;
192
+ var CUBIC_RE = new RegExp(`^cubic-bezier\\(${NUMBER},${NUMBER},${NUMBER},${NUMBER}\\)$`, "i");
193
+ function parseCssEasing(text) {
194
+ const value = text.trim().toLowerCase();
195
+ if (value.length > 200) return null;
196
+ if (ANIMATION_EASING_PRESETS.includes(value)) return value;
197
+ if (value === "step-end" || /^steps\(\s*1\s*(,\s*(end|jump-end)\s*)?\)$/.test(value)) return "hold";
198
+ const m = CUBIC_RE.exec(value);
199
+ if (!m) return null;
200
+ const [x1, y1, x2, y2] = m.slice(1).map(Number);
201
+ if (![x1, y1, x2, y2].every(Number.isFinite) || x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) return null;
202
+ return { type: "cubic-bezier", x1, y1, x2, y2 };
203
+ }
204
+ function isAnimationEasing(value) {
205
+ if (typeof value === "string") return parseCssEasing(value) !== null;
206
+ if (typeof value !== "object" || value === null) return false;
207
+ const e = value;
208
+ if (e.type === "spring") return true;
209
+ if (e.type === "elastic") return true;
210
+ return e.type === "cubic-bezier" && [e.x1, e.y1, e.x2, e.y2].every((v) => typeof v === "number" && Number.isFinite(v));
211
+ }
212
+ var round = (v, digits = 4) => {
213
+ const p = 10 ** digits;
214
+ return Math.round(v * p) / p;
215
+ };
216
+ function easingToCss(easing, durationMs = 1e3, samples = 24) {
217
+ const resolved = resolveEasing(easing);
218
+ if (resolved === "hold") return "steps(1, end)";
219
+ if (resolved.type === "spring") {
220
+ const n = Math.max(2, Math.floor(samples));
221
+ const points = [];
222
+ for (let i = 0; i <= n; i++) points.push(String(round(i === n ? 1 : springAt(resolved, i / n * durationMs / 1e3))));
223
+ return `linear(${points.join(", ")})`;
224
+ }
225
+ if (resolved.type === "elastic") {
226
+ const n = Math.max(2, Math.floor(samples));
227
+ const points = [];
228
+ for (let i = 0; i <= n; i++) points.push(String(round(i === n ? 1 : elasticAt(resolved, i / n))));
229
+ return `linear(${points.join(", ")})`;
230
+ }
231
+ const { x1, y1, x2, y2 } = resolved;
232
+ for (const [name, p] of Object.entries(CUBIC_BEZIER_PRESETS)) {
233
+ if (["linear", "ease", "ease-in", "ease-out", "ease-in-out"].includes(name) && p[0] === x1 && p[1] === y1 && p[2] === x2 && p[3] === y2) {
234
+ return name;
235
+ }
236
+ }
237
+ return `cubic-bezier(${round(x1)}, ${round(y1)}, ${round(x2)}, ${round(y2)})`;
238
+ }
239
+ function easingLabel(easing) {
240
+ if (easing === void 0 || easing === null) return ANIMATION_EASING_LABELS.linear;
241
+ if (typeof easing === "string") return _nullishCoalesce(ANIMATION_EASING_LABELS[easing], () => ( easing));
242
+ if (easing.type === "spring") return "Spring";
243
+ if (easing.type === "elastic") return "Elastic";
244
+ return "Custom";
245
+ }
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ exports.ANIMATION_EASING_PRESETS = ANIMATION_EASING_PRESETS; exports.ANIMATION_EASING_LABELS = ANIMATION_EASING_LABELS; exports.CUBIC_BEZIER_PRESETS = CUBIC_BEZIER_PRESETS; 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;
262
+ //# sourceMappingURL=chunk-XZ4L3R4K.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-XZ4L3R4K.cjs","../src/animation/easing.ts"],"names":["s"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-XZ4L3R4K.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\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'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};\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 };\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 (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,244 @@
1
+ // src/dirty.ts
2
+ function defaultIsEqual(a, b) {
3
+ if (Object.is(a, b)) return true;
4
+ if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
5
+ return false;
6
+ }
7
+ if (Array.isArray(a) && Array.isArray(b)) {
8
+ if (a.length !== b.length) return false;
9
+ for (let i = 0; i < a.length; i++) {
10
+ if (!defaultIsEqual(a[i], b[i])) return false;
11
+ }
12
+ return true;
13
+ }
14
+ if (Array.isArray(a) !== Array.isArray(b)) {
15
+ return false;
16
+ }
17
+ const keysA = Object.keys(a);
18
+ const keysB = Object.keys(b);
19
+ if (keysA.length !== keysB.length) return false;
20
+ for (const key of keysA) {
21
+ if (!Object.prototype.hasOwnProperty.call(b, key)) return false;
22
+ if (!defaultIsEqual(a[key], b[key])) return false;
23
+ }
24
+ return true;
25
+ }
26
+ var isThenable = (value) => !!value && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
27
+ var DirtyTracker = class {
28
+ baseline;
29
+ isEqual;
30
+ normalize;
31
+ normalizedBaseline = null;
32
+ /** `isDirty` result as of a revision (and baseline version). */
33
+ cache = null;
34
+ baselineVersion = 0;
35
+ suppressDepth = 0;
36
+ hasValue = false;
37
+ lastValue;
38
+ dirtyState = false;
39
+ listeners = /* @__PURE__ */ new Set();
40
+ constructor(initialBaseline, options) {
41
+ this.baseline = initialBaseline;
42
+ if (typeof options === "function") {
43
+ this.isEqual = options;
44
+ } else {
45
+ this.isEqual = options?.isEqual ?? defaultIsEqual;
46
+ this.normalize = options?.normalize;
47
+ }
48
+ }
49
+ /**
50
+ * Returns current baseline value.
51
+ */
52
+ getBaseline() {
53
+ return this.baseline;
54
+ }
55
+ changeBaseline(value) {
56
+ this.baseline = value;
57
+ this.baselineVersion++;
58
+ this.normalizedBaseline = null;
59
+ this.cache = null;
60
+ }
61
+ /**
62
+ * Sets a new baseline value without triggering any dirty state.
63
+ * If a value is being tracked (`update`), `dirty` is recomputed against it.
64
+ */
65
+ setBaseline(value) {
66
+ this.changeBaseline(value);
67
+ if (this.hasValue) {
68
+ this.setDirtyState(this.compare(this.lastValue));
69
+ }
70
+ }
71
+ compare(current) {
72
+ if (!this.normalize) return !this.isEqual(this.baseline, current);
73
+ this.normalizedBaseline ??= { value: this.normalize(this.baseline) };
74
+ return !this.isEqual(
75
+ this.normalizedBaseline.value,
76
+ this.normalize(current)
77
+ );
78
+ }
79
+ /**
80
+ * Checks whether the given value differs from the baseline.
81
+ * With a `revision` (e.g. `HistoryManager.getRevision()`), the result is
82
+ * cached and reused for the same revision until the baseline changes.
83
+ */
84
+ isDirty(current, revision) {
85
+ if (revision === void 0) return this.compare(current);
86
+ const cache = this.cache;
87
+ if (cache && cache.revision === revision && cache.baseline === this.baselineVersion) {
88
+ return cache.dirty;
89
+ }
90
+ const dirty = this.compare(current);
91
+ this.cache = { revision, baseline: this.baselineVersion, dirty };
92
+ return dirty;
93
+ }
94
+ /**
95
+ * Resets the baseline to the provided current value (or clears dirty status).
96
+ */
97
+ reset(current) {
98
+ this.changeBaseline(current);
99
+ this.hasValue = true;
100
+ this.lastValue = current;
101
+ this.setDirtyState(false);
102
+ }
103
+ /**
104
+ * Records the current value and returns whether it is dirty. While
105
+ * suppressed (`suppress`), the value becomes the new baseline instead, so
106
+ * programmatic loads and restores never mark the document dirty.
107
+ */
108
+ update(current, revision) {
109
+ this.hasValue = true;
110
+ this.lastValue = current;
111
+ if (this.suppressDepth > 0) {
112
+ this.changeBaseline(current);
113
+ this.setDirtyState(false);
114
+ return false;
115
+ }
116
+ const dirty = this.isDirty(current, revision);
117
+ this.setDirtyState(dirty);
118
+ return dirty;
119
+ }
120
+ /** Whether the last value passed to `update` differs from the baseline. */
121
+ get dirty() {
122
+ return this.dirtyState;
123
+ }
124
+ /** Whether `suppress` is currently running. */
125
+ get suppressed() {
126
+ return this.suppressDepth > 0;
127
+ }
128
+ /**
129
+ * Marks the document saved: `current` (default: the last value passed to
130
+ * `update`) becomes the baseline.
131
+ */
132
+ markClean(...args) {
133
+ if (args.length > 0) {
134
+ this.reset(args[0]);
135
+ } else if (this.hasValue) {
136
+ this.reset(this.lastValue);
137
+ } else {
138
+ this.setDirtyState(false);
139
+ }
140
+ }
141
+ /**
142
+ * Runs `fn` without marking anything dirty: every `update` during it
143
+ * rebaselines. Re-entrant (depth counter). If `fn` returns a promise, the
144
+ * suppression lasts until it settles.
145
+ */
146
+ suppress(fn) {
147
+ this.suppressDepth++;
148
+ let result;
149
+ try {
150
+ result = fn();
151
+ } catch (error) {
152
+ this.suppressDepth--;
153
+ throw error;
154
+ }
155
+ if (isThenable(result)) {
156
+ const release = () => {
157
+ this.suppressDepth--;
158
+ };
159
+ return result.then(
160
+ (value) => {
161
+ release();
162
+ return value;
163
+ },
164
+ (error) => {
165
+ release();
166
+ throw error;
167
+ }
168
+ );
169
+ }
170
+ this.suppressDepth--;
171
+ return result;
172
+ }
173
+ /**
174
+ * Subscribes to changes of `dirty`. The listener is called immediately with
175
+ * the current value. Returns an unsubscribe function.
176
+ */
177
+ subscribe(listener) {
178
+ this.listeners.add(listener);
179
+ listener(this.dirtyState);
180
+ return () => {
181
+ this.listeners.delete(listener);
182
+ };
183
+ }
184
+ setDirtyState(dirty) {
185
+ if (dirty === this.dirtyState) return;
186
+ this.dirtyState = dirty;
187
+ this.listeners.forEach((listener) => {
188
+ try {
189
+ listener(dirty);
190
+ } catch (err) {
191
+ console.error("[DirtyTracker] Error in listener:", err);
192
+ }
193
+ });
194
+ }
195
+ };
196
+ function createDirtyTracker(initialBaseline, options) {
197
+ return new DirtyTracker(initialBaseline, options);
198
+ }
199
+ function withoutDirty(tracker, fn) {
200
+ return tracker.suppress(fn);
201
+ }
202
+ function bindDirtyToHistory(options) {
203
+ const { history, getValue } = options;
204
+ const tracker = options.tracker ?? new DirtyTracker(getValue(), {
205
+ isEqual: options.isEqual,
206
+ normalize: options.normalize
207
+ });
208
+ const unsubscribe = history.subscribe(() => {
209
+ tracker.update(getValue(), history.getRevision?.());
210
+ });
211
+ return {
212
+ tracker,
213
+ get dirty() {
214
+ return tracker.dirty;
215
+ },
216
+ markClean: () => tracker.markClean(getValue()),
217
+ suppress: (fn) => {
218
+ const rebaseline = () => {
219
+ if (!tracker.suppressed) tracker.reset(getValue());
220
+ };
221
+ const result = tracker.suppress(fn);
222
+ if (isThenable(result)) {
223
+ return result.then((value) => {
224
+ rebaseline();
225
+ return value;
226
+ });
227
+ }
228
+ rebaseline();
229
+ return result;
230
+ },
231
+ refresh: () => tracker.update(getValue()),
232
+ subscribe: (listener) => tracker.subscribe(listener),
233
+ destroy: unsubscribe
234
+ };
235
+ }
236
+
237
+ export {
238
+ defaultIsEqual,
239
+ DirtyTracker,
240
+ createDirtyTracker,
241
+ withoutDirty,
242
+ bindDirtyToHistory
243
+ };
244
+ //# sourceMappingURL=chunk-YK57D7PW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dirty.ts"],"sourcesContent":["// Portions ported from soundcraft-main/crates/engine/src/lib.rs (MIT OR Apache-2.0,\n// © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Compares two values for structural equality.\n * Handles primitives, objects, arrays, and null/undefined.\n */\nexport function defaultIsEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n // Fast path for arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!defaultIsEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n const keysA = Object.keys(a) as (keyof T)[];\n const keysB = Object.keys(b) as (keyof T)[];\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!defaultIsEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\nexport interface DirtyTrackerOptions<T> {\n /**\n * Equality check. When `normalize` is set it receives the normalized values.\n */\n isEqual?: (a: T, b: T) => boolean;\n /**\n * Projects a value onto the part that counts as \"the document\" before\n * comparing, e.g. `({ selection, viewport, ...doc }) => doc` so that\n * selecting, scrolling or zooming never marks the document dirty.\n */\n normalize?: (value: T) => unknown;\n}\n\ntype Thenable = { then: (...args: any[]) => any };\n\nconst isThenable = (value: unknown): value is Thenable =>\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as Thenable).then === \"function\";\n\n/**\n * Tracks a baseline (saved) value and determines whether the current value is\n * dirty (modified).\n *\n * Stateless use: `isDirty(current)`. Stateful use: feed values with\n * `update(current, revision?)`, read `dirty`, `subscribe` to changes, call\n * `markClean()` after saving and wrap programmatic loads in `suppress(fn)`.\n */\nexport class DirtyTracker<T = unknown> {\n private baseline: T;\n private readonly isEqual: (a: T, b: T) => boolean;\n private readonly normalize?: (value: T) => unknown;\n private normalizedBaseline: { value: unknown } | null = null;\n /** `isDirty` result as of a revision (and baseline version). */\n private cache: { revision: number; baseline: number; dirty: boolean } | null =\n null;\n private baselineVersion = 0;\n private suppressDepth = 0;\n private hasValue = false;\n private lastValue: T | undefined;\n private dirtyState = false;\n private listeners = new Set<(dirty: boolean) => void>();\n\n constructor(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n ) {\n this.baseline = initialBaseline;\n if (typeof options === \"function\") {\n this.isEqual = options;\n } else {\n this.isEqual = options?.isEqual ?? defaultIsEqual;\n this.normalize = options?.normalize;\n }\n }\n\n /**\n * Returns current baseline value.\n */\n public getBaseline(): T {\n return this.baseline;\n }\n\n private changeBaseline(value: T): void {\n this.baseline = value;\n this.baselineVersion++;\n this.normalizedBaseline = null;\n this.cache = null;\n }\n\n /**\n * Sets a new baseline value without triggering any dirty state.\n * If a value is being tracked (`update`), `dirty` is recomputed against it.\n */\n public setBaseline(value: T): void {\n this.changeBaseline(value);\n if (this.hasValue) {\n this.setDirtyState(this.compare(this.lastValue as T));\n }\n }\n\n private compare(current: T): boolean {\n if (!this.normalize) return !this.isEqual(this.baseline, current);\n this.normalizedBaseline ??= { value: this.normalize(this.baseline) };\n return !this.isEqual(\n this.normalizedBaseline.value as T,\n this.normalize(current) as T,\n );\n }\n\n /**\n * Checks whether the given value differs from the baseline.\n * With a `revision` (e.g. `HistoryManager.getRevision()`), the result is\n * cached and reused for the same revision until the baseline changes.\n */\n public isDirty(current: T, revision?: number): boolean {\n if (revision === undefined) return this.compare(current);\n const cache = this.cache;\n if (\n cache &&\n cache.revision === revision &&\n cache.baseline === this.baselineVersion\n ) {\n return cache.dirty;\n }\n const dirty = this.compare(current);\n this.cache = { revision, baseline: this.baselineVersion, dirty };\n return dirty;\n }\n\n /**\n * Resets the baseline to the provided current value (or clears dirty status).\n */\n public reset(current: T): void {\n this.changeBaseline(current);\n this.hasValue = true;\n this.lastValue = current;\n this.setDirtyState(false);\n }\n\n /**\n * Records the current value and returns whether it is dirty. While\n * suppressed (`suppress`), the value becomes the new baseline instead, so\n * programmatic loads and restores never mark the document dirty.\n */\n public update(current: T, revision?: number): boolean {\n this.hasValue = true;\n this.lastValue = current;\n if (this.suppressDepth > 0) {\n this.changeBaseline(current);\n this.setDirtyState(false);\n return false;\n }\n const dirty = this.isDirty(current, revision);\n this.setDirtyState(dirty);\n return dirty;\n }\n\n /** Whether the last value passed to `update` differs from the baseline. */\n public get dirty(): boolean {\n return this.dirtyState;\n }\n\n /** Whether `suppress` is currently running. */\n public get suppressed(): boolean {\n return this.suppressDepth > 0;\n }\n\n /**\n * Marks the document saved: `current` (default: the last value passed to\n * `update`) becomes the baseline.\n */\n public markClean(...args: [] | [current: T]): void {\n if (args.length > 0) {\n this.reset(args[0] as T);\n } else if (this.hasValue) {\n this.reset(this.lastValue as T);\n } else {\n this.setDirtyState(false);\n }\n }\n\n /**\n * Runs `fn` without marking anything dirty: every `update` during it\n * rebaselines. Re-entrant (depth counter). If `fn` returns a promise, the\n * suppression lasts until it settles.\n */\n public suppress<R>(fn: () => R): R {\n this.suppressDepth++;\n let result: R;\n try {\n result = fn();\n } catch (error) {\n this.suppressDepth--;\n throw error;\n }\n if (isThenable(result)) {\n const release = () => {\n this.suppressDepth--;\n };\n return (result as unknown as Promise<unknown>).then(\n (value) => {\n release();\n return value;\n },\n (error) => {\n release();\n throw error;\n },\n ) as unknown as R;\n }\n this.suppressDepth--;\n return result;\n }\n\n /**\n * Subscribes to changes of `dirty`. The listener is called immediately with\n * the current value. Returns an unsubscribe function.\n */\n public subscribe(listener: (dirty: boolean) => void): () => void {\n this.listeners.add(listener);\n listener(this.dirtyState);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private setDirtyState(dirty: boolean): void {\n if (dirty === this.dirtyState) return;\n this.dirtyState = dirty;\n this.listeners.forEach((listener) => {\n try {\n listener(dirty);\n } catch (err) {\n console.error(\"[DirtyTracker] Error in listener:\", err);\n }\n });\n }\n}\n\n/**\n * Creates a DirtyTracker instance.\n */\nexport function createDirtyTracker<T>(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n): DirtyTracker<T> {\n return new DirtyTracker(initialBaseline, options);\n}\n\n/**\n * Runs `fn` with dirty tracking suppressed (see `DirtyTracker.suppress`).\n */\nexport function withoutDirty<R>(tracker: DirtyTracker<any>, fn: () => R): R {\n return tracker.suppress(fn);\n}\n\n/** Minimal history surface used by `bindDirtyToHistory` (`HistoryManager` satisfies it). */\nexport interface DirtyHistorySource {\n subscribe(listener: (...args: any[]) => void): () => void;\n getRevision?(): number;\n}\n\nexport interface BindDirtyToHistoryOptions<T> extends DirtyTrackerOptions<T> {\n history: DirtyHistorySource;\n /** Reads the current document value. */\n getValue: () => T;\n /** Existing tracker to drive (default: a new one baselined on `getValue()`). */\n tracker?: DirtyTracker<T>;\n}\n\nexport interface HistoryDirtyBinding<T> {\n readonly tracker: DirtyTracker<T>;\n /** Whether the document differs from the saved baseline. */\n readonly dirty: boolean;\n /** Marks the current value as saved. */\n markClean(): void;\n /** Runs `fn` (e.g. a load or restore) without marking the document dirty. */\n suppress<R>(fn: () => R): R;\n /** Re-reads the value after a change made outside the history. */\n refresh(): boolean;\n subscribe(listener: (dirty: boolean) => void): () => void;\n /** Stops listening to the history. */\n destroy(): void;\n}\n\n/**\n * Keeps a `DirtyTracker` in step with a `HistoryManager`: every history change\n * re-reads the value (cached per history revision), so undoing back to the\n * saved state makes the document clean again.\n */\nexport function bindDirtyToHistory<T>(\n options: BindDirtyToHistoryOptions<T>,\n): HistoryDirtyBinding<T> {\n const { history, getValue } = options;\n const tracker =\n options.tracker ??\n new DirtyTracker<T>(getValue(), {\n isEqual: options.isEqual,\n normalize: options.normalize,\n });\n const unsubscribe = history.subscribe(() => {\n tracker.update(getValue(), history.getRevision?.());\n });\n return {\n tracker,\n get dirty() {\n return tracker.dirty;\n },\n markClean: () => tracker.markClean(getValue()),\n suppress: <R>(fn: () => R): R => {\n // The loaded value becomes the baseline even if the load never touched the history.\n const rebaseline = () => {\n if (!tracker.suppressed) tracker.reset(getValue());\n };\n const result = tracker.suppress(fn);\n if (isThenable(result)) {\n return (result as unknown as Promise<unknown>).then((value) => {\n rebaseline();\n return value;\n }) as unknown as R;\n }\n rebaseline();\n return result;\n },\n refresh: () => tracker.update(getValue()),\n subscribe: (listener) => tracker.subscribe(listener),\n destroy: unsubscribe,\n };\n}\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@
10
10
  var _chunkHXDMZQTDcjs = require('../chunk-HXDMZQTD.cjs');
11
11
 
12
12
 
13
- var _chunkCPOKFNBGcjs = require('../chunk-CPOKFNBG.cjs');
13
+ var _chunkI6BZB5ZHcjs = require('../chunk-I6BZB5ZH.cjs');
14
14
 
15
15
 
16
16
 
@@ -205,7 +205,7 @@ var CommandRegistry = (_class = class {
205
205
  const unknown = unknownParams(spec, input);
206
206
  if (unknown) return { ok: false, id, code: "invalid_params", message: unknown };
207
207
  if (spec.params) {
208
- const details = _chunkCPOKFNBGcjs.validateJsonSchema.call(void 0, input, spec.params);
208
+ const details = _chunkI6BZB5ZHcjs.validateJsonSchema.call(void 0, input, spec.params);
209
209
  if (details.length > 0) {
210
210
  return {
211
211
  ok: false,