@clipkit/runtime 1.0.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 (219) hide show
  1. package/LICENSE +54 -0
  2. package/README.md +98 -0
  3. package/dist/animation/easings.d.ts +9 -0
  4. package/dist/animation/easings.d.ts.map +1 -0
  5. package/dist/animation/easings.js +230 -0
  6. package/dist/animation/easings.js.map +1 -0
  7. package/dist/animation/expr.d.ts +44 -0
  8. package/dist/animation/expr.d.ts.map +1 -0
  9. package/dist/animation/expr.js +236 -0
  10. package/dist/animation/expr.js.map +1 -0
  11. package/dist/animation/keyframes.d.ts +23 -0
  12. package/dist/animation/keyframes.d.ts.map +1 -0
  13. package/dist/animation/keyframes.js +117 -0
  14. package/dist/animation/keyframes.js.map +1 -0
  15. package/dist/animation/motion-path.d.ts +18 -0
  16. package/dist/animation/motion-path.d.ts.map +1 -0
  17. package/dist/animation/motion-path.js +269 -0
  18. package/dist/animation/motion-path.js.map +1 -0
  19. package/dist/animation/noise1d.d.ts +5 -0
  20. package/dist/animation/noise1d.d.ts.map +1 -0
  21. package/dist/animation/noise1d.js +27 -0
  22. package/dist/animation/noise1d.js.map +1 -0
  23. package/dist/animation/presets.d.ts +60 -0
  24. package/dist/animation/presets.d.ts.map +1 -0
  25. package/dist/animation/presets.js +221 -0
  26. package/dist/animation/presets.js.map +1 -0
  27. package/dist/assets/cache.d.ts +18 -0
  28. package/dist/assets/cache.d.ts.map +1 -0
  29. package/dist/assets/cache.js +56 -0
  30. package/dist/assets/cache.js.map +1 -0
  31. package/dist/assets/fonts.d.ts +20 -0
  32. package/dist/assets/fonts.d.ts.map +1 -0
  33. package/dist/assets/fonts.js +127 -0
  34. package/dist/assets/fonts.js.map +1 -0
  35. package/dist/assets/loader.d.ts +18 -0
  36. package/dist/assets/loader.d.ts.map +1 -0
  37. package/dist/assets/loader.js +87 -0
  38. package/dist/assets/loader.js.map +1 -0
  39. package/dist/assets/lut.d.ts +5 -0
  40. package/dist/assets/lut.d.ts.map +1 -0
  41. package/dist/assets/lut.js +77 -0
  42. package/dist/assets/lut.js.map +1 -0
  43. package/dist/assets/media-time.d.ts +31 -0
  44. package/dist/assets/media-time.d.ts.map +1 -0
  45. package/dist/assets/media-time.js +65 -0
  46. package/dist/assets/media-time.js.map +1 -0
  47. package/dist/assets/mp4-frame-source.d.ts +44 -0
  48. package/dist/assets/mp4-frame-source.d.ts.map +1 -0
  49. package/dist/assets/mp4-frame-source.js +387 -0
  50. package/dist/assets/mp4-frame-source.js.map +1 -0
  51. package/dist/audio/encoder.d.ts +31 -0
  52. package/dist/audio/encoder.d.ts.map +1 -0
  53. package/dist/audio/encoder.js +96 -0
  54. package/dist/audio/encoder.js.map +1 -0
  55. package/dist/audio/fades.d.ts +16 -0
  56. package/dist/audio/fades.d.ts.map +1 -0
  57. package/dist/audio/fades.js +43 -0
  58. package/dist/audio/fades.js.map +1 -0
  59. package/dist/audio/limiter.d.ts +8 -0
  60. package/dist/audio/limiter.d.ts.map +1 -0
  61. package/dist/audio/limiter.js +39 -0
  62. package/dist/audio/limiter.js.map +1 -0
  63. package/dist/audio/loader.d.ts +6 -0
  64. package/dist/audio/loader.d.ts.map +1 -0
  65. package/dist/audio/loader.js +42 -0
  66. package/dist/audio/loader.js.map +1 -0
  67. package/dist/audio/mixer.d.ts +17 -0
  68. package/dist/audio/mixer.d.ts.map +1 -0
  69. package/dist/audio/mixer.js +204 -0
  70. package/dist/audio/mixer.js.map +1 -0
  71. package/dist/audio/varispeed.d.ts +24 -0
  72. package/dist/audio/varispeed.d.ts.map +1 -0
  73. package/dist/audio/varispeed.js +114 -0
  74. package/dist/audio/varispeed.js.map +1 -0
  75. package/dist/audio/wav.d.ts +6 -0
  76. package/dist/audio/wav.d.ts.map +1 -0
  77. package/dist/audio/wav.js +62 -0
  78. package/dist/audio/wav.js.map +1 -0
  79. package/dist/backend/backend.d.ts +579 -0
  80. package/dist/backend/backend.d.ts.map +1 -0
  81. package/dist/backend/backend.js +17 -0
  82. package/dist/backend/backend.js.map +1 -0
  83. package/dist/backend/webgl-backend.d.ts +97 -0
  84. package/dist/backend/webgl-backend.d.ts.map +1 -0
  85. package/dist/backend/webgl-backend.js +2142 -0
  86. package/dist/backend/webgl-backend.js.map +1 -0
  87. package/dist/backend/webgpu-backend.d.ts +121 -0
  88. package/dist/backend/webgpu-backend.d.ts.map +1 -0
  89. package/dist/backend/webgpu-backend.js +2481 -0
  90. package/dist/backend/webgpu-backend.js.map +1 -0
  91. package/dist/compositor/bitfont.d.ts +8 -0
  92. package/dist/compositor/bitfont.d.ts.map +1 -0
  93. package/dist/compositor/bitfont.js +52 -0
  94. package/dist/compositor/bitfont.js.map +1 -0
  95. package/dist/compositor/camera.d.ts +5 -0
  96. package/dist/compositor/camera.d.ts.map +1 -0
  97. package/dist/compositor/camera.js +114 -0
  98. package/dist/compositor/camera.js.map +1 -0
  99. package/dist/compositor/color.d.ts +26 -0
  100. package/dist/compositor/color.d.ts.map +1 -0
  101. package/dist/compositor/color.js +189 -0
  102. package/dist/compositor/color.js.map +1 -0
  103. package/dist/compositor/element-renderers/caption.d.ts +4 -0
  104. package/dist/compositor/element-renderers/caption.d.ts.map +1 -0
  105. package/dist/compositor/element-renderers/caption.js +376 -0
  106. package/dist/compositor/element-renderers/caption.js.map +1 -0
  107. package/dist/compositor/element-renderers/group.d.ts +12 -0
  108. package/dist/compositor/element-renderers/group.d.ts.map +1 -0
  109. package/dist/compositor/element-renderers/group.js +259 -0
  110. package/dist/compositor/element-renderers/group.js.map +1 -0
  111. package/dist/compositor/element-renderers/image.d.ts +4 -0
  112. package/dist/compositor/element-renderers/image.d.ts.map +1 -0
  113. package/dist/compositor/element-renderers/image.js +97 -0
  114. package/dist/compositor/element-renderers/image.js.map +1 -0
  115. package/dist/compositor/element-renderers/lit.d.ts +6 -0
  116. package/dist/compositor/element-renderers/lit.d.ts.map +1 -0
  117. package/dist/compositor/element-renderers/lit.js +82 -0
  118. package/dist/compositor/element-renderers/lit.js.map +1 -0
  119. package/dist/compositor/element-renderers/particles.d.ts +4 -0
  120. package/dist/compositor/element-renderers/particles.d.ts.map +1 -0
  121. package/dist/compositor/element-renderers/particles.js +212 -0
  122. package/dist/compositor/element-renderers/particles.js.map +1 -0
  123. package/dist/compositor/element-renderers/shape.d.ts +4 -0
  124. package/dist/compositor/element-renderers/shape.d.ts.map +1 -0
  125. package/dist/compositor/element-renderers/shape.js +171 -0
  126. package/dist/compositor/element-renderers/shape.js.map +1 -0
  127. package/dist/compositor/element-renderers/svg.d.ts +4 -0
  128. package/dist/compositor/element-renderers/svg.d.ts.map +1 -0
  129. package/dist/compositor/element-renderers/svg.js +210 -0
  130. package/dist/compositor/element-renderers/svg.js.map +1 -0
  131. package/dist/compositor/element-renderers/text.d.ts +25 -0
  132. package/dist/compositor/element-renderers/text.d.ts.map +1 -0
  133. package/dist/compositor/element-renderers/text.js +1358 -0
  134. package/dist/compositor/element-renderers/text.js.map +1 -0
  135. package/dist/compositor/element-renderers/video.d.ts +12 -0
  136. package/dist/compositor/element-renderers/video.d.ts.map +1 -0
  137. package/dist/compositor/element-renderers/video.js +109 -0
  138. package/dist/compositor/element-renderers/video.js.map +1 -0
  139. package/dist/compositor/fit.d.ts +18 -0
  140. package/dist/compositor/fit.d.ts.map +1 -0
  141. package/dist/compositor/fit.js +106 -0
  142. package/dist/compositor/fit.js.map +1 -0
  143. package/dist/compositor/lighting.d.ts +63 -0
  144. package/dist/compositor/lighting.d.ts.map +1 -0
  145. package/dist/compositor/lighting.js +141 -0
  146. package/dist/compositor/lighting.js.map +1 -0
  147. package/dist/compositor/mat4.d.ts +88 -0
  148. package/dist/compositor/mat4.d.ts.map +1 -0
  149. package/dist/compositor/mat4.js +245 -0
  150. package/dist/compositor/mat4.js.map +1 -0
  151. package/dist/compositor/project.d.ts +24 -0
  152. package/dist/compositor/project.d.ts.map +1 -0
  153. package/dist/compositor/project.js +105 -0
  154. package/dist/compositor/project.js.map +1 -0
  155. package/dist/compositor/render-context.d.ts +194 -0
  156. package/dist/compositor/render-context.d.ts.map +1 -0
  157. package/dist/compositor/render-context.js +10 -0
  158. package/dist/compositor/render-context.js.map +1 -0
  159. package/dist/compositor/resolve.d.ts +80 -0
  160. package/dist/compositor/resolve.d.ts.map +1 -0
  161. package/dist/compositor/resolve.js +276 -0
  162. package/dist/compositor/resolve.js.map +1 -0
  163. package/dist/compositor/scene.d.ts +10 -0
  164. package/dist/compositor/scene.d.ts.map +1 -0
  165. package/dist/compositor/scene.js +658 -0
  166. package/dist/compositor/scene.js.map +1 -0
  167. package/dist/compositor/transform.d.ts +73 -0
  168. package/dist/compositor/transform.d.ts.map +1 -0
  169. package/dist/compositor/transform.js +229 -0
  170. package/dist/compositor/transform.js.map +1 -0
  171. package/dist/compositor/unit.d.ts +27 -0
  172. package/dist/compositor/unit.d.ts.map +1 -0
  173. package/dist/compositor/unit.js +74 -0
  174. package/dist/compositor/unit.js.map +1 -0
  175. package/dist/encoder/exporter.d.ts +95 -0
  176. package/dist/encoder/exporter.d.ts.map +1 -0
  177. package/dist/encoder/exporter.js +341 -0
  178. package/dist/encoder/exporter.js.map +1 -0
  179. package/dist/encoder/index.d.ts +3 -0
  180. package/dist/encoder/index.d.ts.map +1 -0
  181. package/dist/encoder/index.js +2 -0
  182. package/dist/encoder/index.js.map +1 -0
  183. package/dist/index.d.ts +12 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +27 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/logger.d.ts +13 -0
  188. package/dist/logger.d.ts.map +1 -0
  189. package/dist/logger.js +32 -0
  190. package/dist/logger.js.map +1 -0
  191. package/dist/runtime.d.ts +216 -0
  192. package/dist/runtime.d.ts.map +1 -0
  193. package/dist/runtime.js +1012 -0
  194. package/dist/runtime.js.map +1 -0
  195. package/dist/svg/morph.d.ts +6 -0
  196. package/dist/svg/morph.d.ts.map +1 -0
  197. package/dist/svg/morph.js +62 -0
  198. package/dist/svg/morph.js.map +1 -0
  199. package/dist/svg/svg-renderer.d.ts +18 -0
  200. package/dist/svg/svg-renderer.d.ts.map +1 -0
  201. package/dist/svg/svg-renderer.js +142 -0
  202. package/dist/svg/svg-renderer.js.map +1 -0
  203. package/dist/text/caption-chunk.d.ts +17 -0
  204. package/dist/text/caption-chunk.d.ts.map +1 -0
  205. package/dist/text/caption-chunk.js +76 -0
  206. package/dist/text/caption-chunk.js.map +1 -0
  207. package/dist/text/font-atlas.d.ts +63 -0
  208. package/dist/text/font-atlas.d.ts.map +1 -0
  209. package/dist/text/font-atlas.js +225 -0
  210. package/dist/text/font-atlas.js.map +1 -0
  211. package/dist/text/measure.d.ts +38 -0
  212. package/dist/text/measure.d.ts.map +1 -0
  213. package/dist/text/measure.js +164 -0
  214. package/dist/text/measure.js.map +1 -0
  215. package/dist/text/text-animation.d.ts +52 -0
  216. package/dist/text/text-animation.d.ts.map +1 -0
  217. package/dist/text/text-animation.js +133 -0
  218. package/dist/text/text-animation.js.map +1 -0
  219. package/package.json +47 -0
@@ -0,0 +1,236 @@
1
+ // Tier-A expression evaluator (CKP/1.0 — see EXPRESSIONS-PLAN.md / PROTOCOL.md).
2
+ //
3
+ // A numeric property may be `{ expr: "<formula>" }` — a PURE function of the
4
+ // element's local time `t` and its own index/params (`i`, `n`, `dur`, `value`).
5
+ // No element references, no runtime inputs: it is deterministic across renderers,
6
+ // bakeable to keyframes, and GPU-shaped.
7
+ //
8
+ // This is a real sandbox — a tokenizer + Pratt parser + tree-walk evaluator,
9
+ // NOT eval()/Function(). It accepts ONLY the closed grammar below; an unknown
10
+ // identifier, member access, assignment, statement, or string is a parse error,
11
+ // and the caller falls back to the property's base value. There are no host
12
+ // objects in scope and no loops, so evaluation is bounded and non-recursive.
13
+ import { EXPR_VOCABULARY } from '@clipkit/protocol';
14
+ import { noise1d, hash01 } from './noise1d.js';
15
+ const CONSTS = { PI: Math.PI, TAU: Math.PI * 2, E: Math.E };
16
+ // The variable set is the protocol vocabulary verbatim (single source of truth).
17
+ const VARS = new Set(EXPR_VOCABULARY.vars);
18
+ // Native functions: (args, scope) → number. Pure; `wiggle` reads scope.t.
19
+ const FNS = {
20
+ sin: (a) => Math.sin(a[0]), cos: (a) => Math.cos(a[0]), tan: (a) => Math.tan(a[0]),
21
+ asin: (a) => Math.asin(a[0]), acos: (a) => Math.acos(a[0]), atan: (a) => Math.atan(a[0]),
22
+ atan2: (a) => Math.atan2(a[0], a[1]), sinh: (a) => Math.sinh(a[0]), cosh: (a) => Math.cosh(a[0]), tanh: (a) => Math.tanh(a[0]),
23
+ abs: (a) => Math.abs(a[0]), sign: (a) => Math.sign(a[0]), sqrt: (a) => Math.sqrt(a[0]), cbrt: (a) => Math.cbrt(a[0]),
24
+ pow: (a) => Math.pow(a[0], a[1]), exp: (a) => Math.exp(a[0]), log: (a) => Math.log(a[0]), log2: (a) => Math.log2(a[0]),
25
+ floor: (a) => Math.floor(a[0]), ceil: (a) => Math.ceil(a[0]), round: (a) => Math.round(a[0]), trunc: (a) => Math.trunc(a[0]),
26
+ fract: (a) => a[0] - Math.floor(a[0]), hypot: (a) => Math.hypot(...a),
27
+ min: (a) => Math.min(...a), max: (a) => Math.max(...a), mod: (a) => ((a[0] % a[1]) + a[1]) % a[1],
28
+ clamp: (a) => Math.min(Math.max(a[0], a[1]), a[2]),
29
+ lerp: (a) => a[0] + (a[1] - a[0]) * a[2],
30
+ mix: (a) => a[0] + (a[1] - a[0]) * a[2],
31
+ step: (a) => (a[1] < a[0] ? 0 : 1),
32
+ smoothstep: (a) => { const u = Math.min(Math.max((a[2] - a[0]) / (a[1] - a[0]), 0), 1); return u * u * (3 - 2 * u); },
33
+ // map x∈[x0,x1] → [y0,y1], clamped (linear) / cubic in-out (ease)
34
+ linear: (a) => { const u = clamp01((a[0] - a[1]) / (a[2] - a[1])); return a[3] + (a[4] - a[3]) * u; },
35
+ ease: (a) => { const u = clamp01((a[0] - a[1]) / (a[2] - a[1])); const e = u < 0.5 ? 4 * u * u * u : 1 - Math.pow(-2 * u + 2, 3) / 2; return a[3] + (a[4] - a[3]) * e; },
36
+ noise: (a) => 2 * noise1d(a[0], a[1] ?? 0) - 1,
37
+ wiggle: (a, s) => (a[1] ?? 0) * (2 * noise1d(s.t * (a[0] ?? 0), a[2] ?? 0) - 1),
38
+ random: (a) => hash01(a[0] ?? 0),
39
+ };
40
+ const clamp01 = (x) => Math.min(Math.max(x, 0), 1);
41
+ const _exprVocabularyLock = true;
42
+ void _exprVocabularyLock;
43
+ // String-keyed views for eval-time lookup — the parser has already validated
44
+ // every name against the closed vocabulary, so these accesses are total.
45
+ const FN_TABLE = FNS;
46
+ const CONST_TABLE = CONSTS;
47
+ function lex(src) {
48
+ const out = [];
49
+ let i = 0;
50
+ while (i < src.length) {
51
+ const c = src[i];
52
+ if (c === ' ' || c === '\t' || c === '\n' || c === '\r') {
53
+ i++;
54
+ continue;
55
+ }
56
+ if ((c >= '0' && c <= '9') || (c === '.' && /[0-9]/.test(src[i + 1] ?? ''))) {
57
+ const m = /^[0-9]*\.?[0-9]+(?:[eE][+-]?[0-9]+)?/.exec(src.slice(i));
58
+ if (!m)
59
+ return null;
60
+ out.push({ t: 'num', v: parseFloat(m[0]) });
61
+ i += m[0].length;
62
+ continue;
63
+ }
64
+ if (/[A-Za-z_]/.test(c)) {
65
+ const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(src.slice(i));
66
+ out.push({ t: 'id', v: m[0] });
67
+ i += m[0].length;
68
+ continue;
69
+ }
70
+ const two = src.slice(i, i + 2);
71
+ if (['<=', '>=', '==', '!=', '&&', '||'].includes(two)) {
72
+ out.push({ t: 'op', v: two });
73
+ i += 2;
74
+ continue;
75
+ }
76
+ if ('+-*/%^()<>!?:,'.includes(c)) {
77
+ out.push({ t: 'op', v: c });
78
+ i++;
79
+ continue;
80
+ }
81
+ return null; // illegal character
82
+ }
83
+ return out;
84
+ }
85
+ // ── Pratt parser ─────────────────────────────────────────────────────────────
86
+ // binding powers for binary operators (higher = tighter)
87
+ const BP = {
88
+ '||': 2, '&&': 3, '==': 4, '!=': 4, '<': 5, '>': 5, '<=': 5, '>=': 5,
89
+ '+': 6, '-': 6, '*': 7, '/': 7, '%': 7, '^': 9,
90
+ };
91
+ function parse(toks) {
92
+ let p = 0;
93
+ const peek = () => toks[p];
94
+ const eat = () => toks[p++];
95
+ function primary() {
96
+ const tk = peek();
97
+ if (!tk)
98
+ return null;
99
+ if (tk.t === 'num') {
100
+ eat();
101
+ return { k: 'num', v: tk.v };
102
+ }
103
+ if (tk.t === 'op' && (tk.v === '-' || tk.v === '!')) {
104
+ eat();
105
+ const a = unary();
106
+ return a && { k: 'un', op: tk.v, a };
107
+ }
108
+ if (tk.t === 'op' && tk.v === '(') {
109
+ eat();
110
+ const e = expr(0);
111
+ if (!e || eat()?.v !== ')')
112
+ return null;
113
+ return e;
114
+ }
115
+ if (tk.t === 'id') {
116
+ eat();
117
+ if (peek()?.t === 'op' && peek()?.v === '(') { // function call
118
+ eat();
119
+ const args = [];
120
+ if (!(peek()?.t === 'op' && peek()?.v === ')')) {
121
+ for (;;) {
122
+ const a = expr(0);
123
+ if (!a)
124
+ return null;
125
+ args.push(a);
126
+ const s = peek();
127
+ if (s?.v === ',') {
128
+ eat();
129
+ continue;
130
+ }
131
+ break;
132
+ }
133
+ }
134
+ if (eat()?.v !== ')')
135
+ return null;
136
+ if (!(tk.v in FNS))
137
+ return null; // unknown function → reject
138
+ return { k: 'call', name: tk.v, args };
139
+ }
140
+ if (tk.v in CONSTS || VARS.has(tk.v))
141
+ return { k: 'var', name: tk.v };
142
+ return null; // unknown identifier → reject
143
+ }
144
+ return null;
145
+ }
146
+ function unary() { return primary(); }
147
+ function expr(min) {
148
+ let left = unary();
149
+ if (!left)
150
+ return null;
151
+ for (;;) {
152
+ const tk = peek();
153
+ if (tk?.t === 'op' && tk.v === '?') { // ternary (lowest, right-assoc)
154
+ if (min > 1)
155
+ break;
156
+ eat();
157
+ const a = expr(0);
158
+ if (!a || eat()?.v !== ':')
159
+ return null;
160
+ const b = expr(1);
161
+ if (!b)
162
+ return null;
163
+ left = { k: 'tern', c: left, a, b };
164
+ continue;
165
+ }
166
+ if (tk?.t !== 'op' || !(tk.v in BP) || BP[tk.v] < min)
167
+ break;
168
+ eat();
169
+ const rbp = tk.v === '^' ? BP[tk.v] : BP[tk.v] + 1; // ^ right-assoc
170
+ const right = expr(rbp);
171
+ if (!right)
172
+ return null;
173
+ left = { k: 'bin', op: tk.v, a: left, b: right };
174
+ }
175
+ return left;
176
+ }
177
+ const root = expr(0);
178
+ return root && p === toks.length ? root : null;
179
+ }
180
+ // ── evaluate ─────────────────────────────────────────────────────────────────
181
+ function evalNode(node, s) {
182
+ switch (node.k) {
183
+ case 'num': return node.v;
184
+ case 'var': return node.name in CONST_TABLE ? CONST_TABLE[node.name] : s[node.name];
185
+ case 'un': return node.op === '-' ? -evalNode(node.a, s) : evalNode(node.a, s) === 0 ? 1 : 0;
186
+ case 'tern': return evalNode(node.c, s) !== 0 ? evalNode(node.a, s) : evalNode(node.b, s);
187
+ case 'call': return FN_TABLE[node.name](node.args.map((a) => evalNode(a, s)), s);
188
+ case 'bin': {
189
+ const a = evalNode(node.a, s);
190
+ if (node.op === '&&')
191
+ return a !== 0 && evalNode(node.b, s) !== 0 ? 1 : 0;
192
+ if (node.op === '||')
193
+ return a !== 0 || evalNode(node.b, s) !== 0 ? 1 : 0;
194
+ const b = evalNode(node.b, s);
195
+ switch (node.op) {
196
+ case '+': return a + b;
197
+ case '-': return a - b;
198
+ case '*': return a * b;
199
+ case '/': return a / b;
200
+ case '%': return a % b;
201
+ case '^': return Math.pow(a, b);
202
+ case '<': return a < b ? 1 : 0;
203
+ case '>': return a > b ? 1 : 0;
204
+ case '<=': return a <= b ? 1 : 0;
205
+ case '>=': return a >= b ? 1 : 0;
206
+ case '==': return a === b ? 1 : 0;
207
+ case '!=': return a !== b ? 1 : 0;
208
+ }
209
+ return NaN;
210
+ }
211
+ }
212
+ }
213
+ // compile-once cache; null = parse error (poisoned so we don't retry)
214
+ const CACHE = new Map();
215
+ export function compileExpr(src) {
216
+ if (CACHE.has(src))
217
+ return CACHE.get(src);
218
+ const toks = lex(src);
219
+ const ast = toks ? parse(toks) : null;
220
+ CACHE.set(src, ast);
221
+ return ast;
222
+ }
223
+ /** True when a property value is an expression object `{ expr: string }`. */
224
+ export function isExpr(v) {
225
+ return typeof v === 'object' && v !== null && typeof v.expr === 'string';
226
+ }
227
+ /** Evaluate `{expr}` in the given scope; returns NaN-guarded `scope.value` on
228
+ * parse error or non-finite result. */
229
+ export function evalExpr(value, scope) {
230
+ const ast = compileExpr(value.expr);
231
+ if (!ast)
232
+ return scope.value;
233
+ const r = evalNode(ast, scope);
234
+ return Number.isFinite(r) ? r : scope.value;
235
+ }
236
+ //# sourceMappingURL=expr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/animation/expr.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,kFAAkF;AAClF,yCAAyC;AACzC,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAmB/C,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAmC,CAAC;AAC7F,iFAAiF;AACjF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,eAAe,CAAC,IAAI,CAAC,CAAC;AAEnD,0EAA0E;AAC1E,MAAM,GAAG,GAAG;IACV,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IACrF,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IAC3F,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IACnI,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IACxH,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IAC3H,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,C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"}
@@ -0,0 +1,23 @@
1
+ import type { Keyframe } from '@clipkit/protocol';
2
+ import { type RGBA } from '../compositor/color.js';
3
+ /**
4
+ * Interpolate a numeric keyframe sequence at a given time (seconds).
5
+ * Returns the start value before the first keyframe, and the end value
6
+ * after the last. Keyframes are assumed to be sorted by time.
7
+ */
8
+ /**
9
+ * Fold local time for looping keyframe animations (§6.3): `true` wraps
10
+ * modulo the last keyframe's time; `'ping-pong'` reflects.
11
+ */
12
+ export declare function foldKeyframeTime(keyframes: Keyframe[], loop: boolean | 'ping-pong' | undefined, t: number): number;
13
+ export declare function interpolateKeyframes(keyframes: Keyframe[], time: number): number;
14
+ /**
15
+ * Interpolate a COLOR keyframe sequence at a given time. Values are CSS
16
+ * color strings (hex / rgb / rgba); interpolation is componentwise in
17
+ * straight-alpha RGB space, easing taken from the destination keyframe
18
+ * (same convention as numeric keyframes). Returns straight-alpha RGBA.
19
+ */
20
+ export declare function interpolateColorKeyframes(keyframes: Keyframe[], time: number): RGBA;
21
+ /** True when every keyframe value parses as a color string. */
22
+ export declare function isColorKeyframes(keyframes: Keyframe[]): boolean;
23
+ //# sourceMappingURL=keyframes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframes.d.ts","sourceRoot":"","sources":["../../src/animation/keyframes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,EACvC,CAAC,EAAE,MAAM,GACR,MAAM,CAUR;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BhF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA8BnF;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAS/D"}
@@ -0,0 +1,117 @@
1
+ // Keyframe interpolation. Pure function — no caching, no state.
2
+ // The previous v0 implementation had a frame cache keyed by time, which
3
+ // meant every distinct frame was a cache miss. We drop the cache entirely
4
+ // here; if profiling shows interpolation is hot, we add memoization later.
5
+ import { applyEasing } from './easings.js';
6
+ import { parseColor } from '../compositor/color.js';
7
+ /**
8
+ * Interpolate a numeric keyframe sequence at a given time (seconds).
9
+ * Returns the start value before the first keyframe, and the end value
10
+ * after the last. Keyframes are assumed to be sorted by time.
11
+ */
12
+ /**
13
+ * Fold local time for looping keyframe animations (§6.3): `true` wraps
14
+ * modulo the last keyframe's time; `'ping-pong'` reflects.
15
+ */
16
+ export function foldKeyframeTime(keyframes, loop, t) {
17
+ if (!loop || keyframes.length < 2 || t <= 0)
18
+ return t;
19
+ const last = keyframes[keyframes.length - 1].time;
20
+ const span = typeof last === 'number' ? last : parseFloat(String(last));
21
+ if (!Number.isFinite(span) || span <= 0)
22
+ return t;
23
+ if (loop === 'ping-pong') {
24
+ const c = t % (2 * span);
25
+ return c <= span ? c : 2 * span - c;
26
+ }
27
+ return t % span;
28
+ }
29
+ export function interpolateKeyframes(keyframes, time) {
30
+ if (keyframes.length === 0)
31
+ return 0;
32
+ if (keyframes.length === 1)
33
+ return toNumber(keyframes[0].value);
34
+ const first = keyframes[0];
35
+ const last = keyframes[keyframes.length - 1];
36
+ if (time <= toNumber(first.time))
37
+ return toNumber(first.value);
38
+ if (time >= toNumber(last.time))
39
+ return toNumber(last.value);
40
+ for (let i = 0; i < keyframes.length - 1; i++) {
41
+ const a = keyframes[i];
42
+ const b = keyframes[i + 1];
43
+ const at = toNumber(a.time);
44
+ const bt = toNumber(b.time);
45
+ if (time >= at && time <= bt) {
46
+ const span = bt - at;
47
+ const localT = span > 0 ? (time - at) / span : 0;
48
+ const easedT = applyEasing(b.easing, localT);
49
+ const av = toNumber(a.value);
50
+ const bv = toNumber(b.value);
51
+ return av + (bv - av) * easedT;
52
+ }
53
+ }
54
+ // Unreachable given the sentinels above, but TS doesn't know that.
55
+ return toNumber(last.value);
56
+ }
57
+ /**
58
+ * Interpolate a COLOR keyframe sequence at a given time. Values are CSS
59
+ * color strings (hex / rgb / rgba); interpolation is componentwise in
60
+ * straight-alpha RGB space, easing taken from the destination keyframe
61
+ * (same convention as numeric keyframes). Returns straight-alpha RGBA.
62
+ */
63
+ export function interpolateColorKeyframes(keyframes, time) {
64
+ if (keyframes.length === 0)
65
+ return [1, 1, 1, 1];
66
+ if (keyframes.length === 1)
67
+ return toColor(keyframes[0].value);
68
+ const first = keyframes[0];
69
+ const last = keyframes[keyframes.length - 1];
70
+ if (time <= toNumber(first.time))
71
+ return toColor(first.value);
72
+ if (time >= toNumber(last.time))
73
+ return toColor(last.value);
74
+ for (let i = 0; i < keyframes.length - 1; i++) {
75
+ const a = keyframes[i];
76
+ const b = keyframes[i + 1];
77
+ const at = toNumber(a.time);
78
+ const bt = toNumber(b.time);
79
+ if (time >= at && time <= bt) {
80
+ const span = bt - at;
81
+ const localT = span > 0 ? (time - at) / span : 0;
82
+ const easedT = applyEasing(b.easing, localT);
83
+ const av = toColor(a.value);
84
+ const bv = toColor(b.value);
85
+ return [
86
+ av[0] + (bv[0] - av[0]) * easedT,
87
+ av[1] + (bv[1] - av[1]) * easedT,
88
+ av[2] + (bv[2] - av[2]) * easedT,
89
+ av[3] + (bv[3] - av[3]) * easedT,
90
+ ];
91
+ }
92
+ }
93
+ return toColor(last.value);
94
+ }
95
+ /** True when every keyframe value parses as a color string. */
96
+ export function isColorKeyframes(keyframes) {
97
+ return (keyframes.length > 0 &&
98
+ keyframes.every((k) => typeof k.value === 'string' &&
99
+ (k.value.startsWith('#') || k.value.trim().startsWith('rgb'))));
100
+ }
101
+ function toColor(v) {
102
+ return parseColor(typeof v === 'string' ? v : undefined);
103
+ }
104
+ /**
105
+ * Coerce a Keyframe.time or .value (which the schema allows as number or
106
+ * string e.g. "1.5s") to a number. Non-numeric strings yield 0.
107
+ */
108
+ function toNumber(v) {
109
+ if (typeof v === 'number')
110
+ return Number.isFinite(v) ? v : 0;
111
+ if (typeof v === 'string') {
112
+ const n = parseFloat(v);
113
+ return Number.isFinite(n) ? n : 0;
114
+ }
115
+ return 0;
116
+ }
117
+ //# sourceMappingURL=keyframes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframes.js","sourceRoot":"","sources":["../../src/animation/keyframes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { BaseElement } from '@clipkit/protocol';
2
+ export interface MotionPathSample {
3
+ x: number;
4
+ y: number;
5
+ /** Path z for 3D paths (§6.7); null on 2D paths — element `z` untouched. */
6
+ z: number | null;
7
+ /** Path travel direction at the sample, degrees (atan2(dy, dx) — xy projection). */
8
+ angle: number;
9
+ /** Whether the animation requested auto-orientation. */
10
+ autoOrient: boolean;
11
+ }
12
+ /**
13
+ * Resolve the element's `position` motion path at element-local time.
14
+ * Returns null when the element has no position path. Endpoint clamps
15
+ * hold the first/last point with the adjacent segment's end tangent.
16
+ */
17
+ export declare function resolveMotionPath(element: BaseElement, localTime: number): MotionPathSample | null;
18
+ //# sourceMappingURL=motion-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-path.d.ts","sourceRoot":"","sources":["../../src/animation/motion-path.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,mBAAmB,CAAC;AAGlF,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,4EAA4E;IAC5E,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjB,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAC;CACrB;AA6LD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI,CA+CzB"}