@dnyantra/dtly 0.0.0-stage → 0.2.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 (76) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +172 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +95 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/anim.d.ts +3 -0
  7. package/dist/core/anim.js +61 -0
  8. package/dist/core/anim.js.map +1 -0
  9. package/dist/core/color.d.ts +4 -0
  10. package/dist/core/color.js +28 -0
  11. package/dist/core/color.js.map +1 -0
  12. package/dist/core/ease.d.ts +8 -0
  13. package/dist/core/ease.js +90 -0
  14. package/dist/core/ease.js.map +1 -0
  15. package/dist/core/model.d.ts +229 -0
  16. package/dist/core/model.js +4 -0
  17. package/dist/core/model.js.map +1 -0
  18. package/dist/core/text.d.ts +41 -0
  19. package/dist/core/text.js +222 -0
  20. package/dist/core/text.js.map +1 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.js +13 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/mcp/index.d.ts +1 -0
  25. package/dist/mcp/index.js +2 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/mcp/server.d.ts +3 -0
  28. package/dist/mcp/server.js +193 -0
  29. package/dist/mcp/server.js.map +1 -0
  30. package/dist/node.d.ts +4 -0
  31. package/dist/node.js +6 -0
  32. package/dist/node.js.map +1 -0
  33. package/dist/ops/ops.d.ts +39 -0
  34. package/dist/ops/ops.js +259 -0
  35. package/dist/ops/ops.js.map +1 -0
  36. package/dist/ops/store.d.ts +4 -0
  37. package/dist/ops/store.js +22 -0
  38. package/dist/ops/store.js.map +1 -0
  39. package/dist/presets/index.d.ts +14 -0
  40. package/dist/presets/index.js +235 -0
  41. package/dist/presets/index.js.map +1 -0
  42. package/dist/presets/text.d.ts +5 -0
  43. package/dist/presets/text.js +19 -0
  44. package/dist/presets/text.js.map +1 -0
  45. package/dist/render/export.d.ts +43 -0
  46. package/dist/render/export.js +215 -0
  47. package/dist/render/export.js.map +1 -0
  48. package/dist/render/ffmpeg.d.ts +1 -0
  49. package/dist/render/ffmpeg.js +16 -0
  50. package/dist/render/ffmpeg.js.map +1 -0
  51. package/dist/render/node-host.d.ts +18 -0
  52. package/dist/render/node-host.js +168 -0
  53. package/dist/render/node-host.js.map +1 -0
  54. package/dist/render/renderer.d.ts +36 -0
  55. package/dist/render/renderer.js +372 -0
  56. package/dist/render/renderer.js.map +1 -0
  57. package/dist/starter.d.ts +5 -0
  58. package/dist/starter.js +32 -0
  59. package/dist/starter.js.map +1 -0
  60. package/dist/studio/server.d.ts +12 -0
  61. package/dist/studio/server.js +190 -0
  62. package/dist/studio/server.js.map +1 -0
  63. package/dist/studio-app/app.css +2 -0
  64. package/dist/studio-app/app.css.map +7 -0
  65. package/dist/studio-app/app.js +5 -0
  66. package/dist/studio-app/app.js.map +7 -0
  67. package/dist/studio-app/index.html +15 -0
  68. package/dist/version.d.ts +2 -0
  69. package/dist/version.js +3 -0
  70. package/dist/version.js.map +1 -0
  71. package/fonts/Baloo2.ttf +0 -0
  72. package/fonts/Mukta-Bold.ttf +0 -0
  73. package/fonts/OFL-Baloo2.txt +93 -0
  74. package/fonts/OFL-Mukta.txt +93 -0
  75. package/package.json +84 -4
  76. package/plugin/skills/dtly/SKILL.md +94 -0
@@ -0,0 +1,235 @@
1
+ import { addLayer, findLayer, getComp, OpError, setKeyframe, updateLayer } from '../ops/ops.js';
2
+ import { TEXT_ANIMATORS } from './text.js';
3
+ const num = (v, d) => (typeof v === 'number' ? v : d);
4
+ const str = (v, d) => (typeof v === 'string' ? v : d);
5
+ const r3 = (t) => Math.round(t * 1000) / 1000;
6
+ const kf = (...k) => ({ keyframes: k.map(([t, v, ease]) => (ease ? { t: r3(t), v, ease } : { t: r3(t), v })) });
7
+ export const PRESETS = {};
8
+ for (const [name, def] of Object.entries(TEXT_ANIMATORS)) {
9
+ PRESETS[`text.${name}`] = {
10
+ kind: 'text',
11
+ description: def.description,
12
+ params: '{layer: textLayerId, delay?: s, stagger?: s, duration?: s, replace?: boolean}',
13
+ apply: (p, _comp, o) => {
14
+ const { layer } = findLayer(p, str(o.layer, ''));
15
+ if (layer.type !== 'text')
16
+ throw new OpError(`${layer.id} is not a text layer`);
17
+ const anims = def.animators.map((a) => ({ ...a, ...(o.delay !== undefined && { delay: num(o.delay, 0) }), ...(o.stagger !== undefined && { stagger: num(o.stagger, 0) }), ...(o.duration !== undefined && { duration: num(o.duration, 0.5) }) }));
18
+ layer.animators = o.replace === false ? [...(layer.animators ?? []), ...anims] : [...(layer.animators ?? []).filter((a) => (a.mode === 'out') !== (anims[0].mode === 'out')), ...anims];
19
+ return { created: [], note: `Applied ${name} to ${layer.id}` };
20
+ },
21
+ };
22
+ }
23
+ PRESETS['kinetic.sequence'] = {
24
+ kind: 'kinetic',
25
+ description: 'Classic kinetic typography: phrases appear one after another in the same spot, each with its own entrance, emphasis words bigger and coloured.',
26
+ params: '{phrases: string[], start?: s, each?: s (default by length), position?: [x,y], size?: px, color?, accent?: color, emphasis?: string[] (words to highlight), style?: "slam"|"popIn"|"fadeUp"|"blurIn"|"cascade", font?, maxWidth?, holdLast?: boolean (default true: last phrase stays to the end of the comp)}',
27
+ apply: (p, compId, o) => {
28
+ const comp = getComp(p, compId);
29
+ const phrases = o.phrases ?? [];
30
+ const pos = o.position ?? [comp.width / 2, comp.height / 2];
31
+ const size = num(o.size, Math.round(comp.width / 9));
32
+ const style = str(o.style, 'slam');
33
+ const emphasis = new Set((o.emphasis ?? []).map((w) => w.toLowerCase()));
34
+ let t = num(o.start, 0);
35
+ const created = [];
36
+ const holdLast = o.holdLast !== false;
37
+ phrases.forEach((text, i) => {
38
+ const words = text.split(/\s+/).length;
39
+ const each = num(o.each, Math.max(0.7, 0.35 + words * 0.32));
40
+ const last = holdLast && i === phrases.length - 1;
41
+ const outPoint = last ? Math.max(comp.duration, t + each) : t + each;
42
+ const isEmph = text.split(/\s+/).some((w) => emphasis.has(w.toLowerCase()));
43
+ const layer = addLayer(p, comp.id, {
44
+ type: 'text', name: `kinetic-${i + 1}`, text, inPoint: r3(t), outPoint: r3(outPoint),
45
+ size: isEmph ? Math.round(size * 1.35) : size, weight: 800, font: o.font,
46
+ color: isEmph ? str(o.accent, '#FFC93C') : str(o.color, '#ffffff'), maxWidth: num(o.maxWidth, comp.width * 0.86),
47
+ transform: { position: pos, scale: kf([t, [100, 100]], [outPoint, [100 + 8 * ((outPoint - t) / each), 100 + 8 * ((outPoint - t) / each)]]) },
48
+ animators: [...TEXT_ANIMATORS[style in TEXT_ANIMATORS ? style : 'slam'].animators, ...(last ? [] : [{ unit: 'word', mode: 'out', stagger: 0.03, duration: 0.18, ease: 'easeIn', from: { opacity: 0, scale: 80 } }])],
49
+ });
50
+ created.push(layer.id);
51
+ t = r3(t + each);
52
+ });
53
+ return { created, note: `Sequence ends at ${t.toFixed(2)}s` };
54
+ },
55
+ };
56
+ PRESETS['opener.logoReveal'] = {
57
+ kind: 'opener',
58
+ description: 'Brand opener: a ring draws on and bursts, the title tracks in, an accent line draws, and a tagline reveals from a mask.',
59
+ params: '{title: string, tagline?: string, start?: s, color?: brand colour, accent?: colour, textColor?, position?: [x,y], size?: px, font?}',
60
+ apply: (p, compId, o) => {
61
+ const comp = getComp(p, compId);
62
+ const t0 = num(o.start, 0);
63
+ const [cx, cy] = o.position ?? [comp.width / 2, comp.height / 2];
64
+ const color = str(o.color, '#E8692A'), accent = str(o.accent, '#FFC93C');
65
+ const size = num(o.size, Math.round(comp.width / 7.5));
66
+ const r = Math.min(comp.width, comp.height) * 0.42;
67
+ const created = [];
68
+ const add = (l) => created.push(addLayer(p, comp.id, l).id);
69
+ add({ type: 'shape', name: 'reveal-ring', shape: 'ellipse', size: [r, r], stroke: color, strokeWidth: 10, inPoint: t0, outPoint: t0 + 1.6, motionBlur: { samples: 8 },
70
+ transform: { position: [cx, cy], rotation: kf([t0, -120, 'expoOut'], [t0 + 1, 0]), scale: kf([t0 + 0.7, [100, 100], 'expoOut'], [t0 + 1.4, [260, 260]]), opacity: kf([t0 + 0.9, 100], [t0 + 1.4, 0]) },
71
+ trim: { end: kf([t0, 0, 'expoOut'], [t0 + 0.8, 100]) } });
72
+ add({ type: 'shape', name: 'reveal-burst', shape: 'ellipse', size: [r * 0.9, r * 0.9], fill: color, inPoint: t0 + 0.7, outPoint: t0 + 1.5,
73
+ transform: { position: [cx, cy], scale: kf([t0 + 0.7, [0, 0], 'expoOut'], [t0 + 1.2, [220, 220]]), opacity: kf([t0 + 0.9, 90], [t0 + 1.5, 0]) } });
74
+ add({ type: 'text', name: 'opener-title', text: str(o.title, 'TITLE'), size, weight: 800, color: str(o.textColor, '#ffffff'), font: o.font, inPoint: t0 + 0.8,
75
+ maxWidth: comp.width * 0.88, transform: { position: [cx, cy] },
76
+ animators: [{ unit: 'grapheme', stagger: 0.025, duration: 1.1, ease: 'expoOut', from: { opacity: 0, tracking: 40, blur: 10 } }],
77
+ effects: [{ type: 'dropShadow', blur: 30, distance: 0, opacity: 50 }] });
78
+ add({ type: 'shape', name: 'opener-line', shape: 'line', points: [[-comp.width * 0.3, 0], [comp.width * 0.3, 0]], stroke: accent, strokeWidth: 8, inPoint: t0 + 1.2,
79
+ transform: { position: [cx, cy + size * 0.85] }, trim: { start: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 0]), end: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 100]) } });
80
+ if (o.tagline)
81
+ add({ type: 'text', name: 'opener-tagline', text: str(o.tagline, ''), size: Math.round(size * 0.42), weight: 600, color: accent, font: o.font, inPoint: t0 + 1.5,
82
+ transform: { position: [cx, cy + size * 1.4] }, animators: [{ unit: 'line', clip: true, stagger: 0.1, duration: 0.8, ease: 'expoOut', from: { y: size * 0.6 } }] });
83
+ return { created, note: `Opener settles at ${(t0 + 2.3).toFixed(1)}s` };
84
+ },
85
+ };
86
+ PRESETS['opener.bars'] = {
87
+ kind: 'opener',
88
+ description: 'Coloured bars sweep across the frame in a stagger, uncovering a title that slams in.',
89
+ params: '{title: string, start?: s, colors?: string[], textColor?, size?: px, font?, direction?: "left"|"right"}',
90
+ apply: (p, compId, o) => {
91
+ const comp = getComp(p, compId);
92
+ const t0 = num(o.start, 0);
93
+ const colors = o.colors ?? ['#E8692A', '#FFC93C', '#F6EEDF', '#1A1512'];
94
+ const dir = o.direction === 'right' ? -1 : 1;
95
+ const barH = comp.height / colors.length;
96
+ const created = [];
97
+ colors.forEach((c, i) => {
98
+ const ts = t0 + i * 0.08;
99
+ created.push(addLayer(p, comp.id, { type: 'solid', name: `bar-${i + 1}`, color: c, size: [comp.width, barH + 2], inPoint: t0, outPoint: t0 + 1.6,
100
+ transform: { anchor: [0, 0], position: kf([ts, [-comp.width * dir, i * barH], 'expoInOut'], [ts + 0.6, [0, i * barH], 'expoInOut'], [ts + 0.85, [0, i * barH], 'expoInOut'], [ts + 1.4, [comp.width * dir, i * barH]]) } }).id);
101
+ });
102
+ created.unshift(addLayer(p, comp.id, { type: 'text', name: 'bars-title', text: str(o.title, 'TITLE'), size: num(o.size, Math.round(comp.width / 8)), weight: 800, color: str(o.textColor, '#ffffff'),
103
+ font: o.font, inPoint: t0 + 0.9, maxWidth: comp.width * 0.88,
104
+ animators: TEXT_ANIMATORS.slam.animators }, 0).id);
105
+ return { created };
106
+ },
107
+ };
108
+ PRESETS['slides.slideshow'] = {
109
+ kind: 'slides',
110
+ description: 'Slider/slideshow from images and clips: each slide gets a slow Ken Burns move, an optional caption, and a transition into the next.',
111
+ params: '{items: [{src, type?: "image"|"video", caption?, trimIn?, speed?}], start?: s, each?: s, transition?: type or list of types cycled per cut ("push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp"), transitionDuration?: s, captionStyle?: text preset name, captionColor?, captionY?: px, plate?: colour, fitComp?: boolean (default true: comp duration = slideshow end)}',
112
+ apply: (p, compId, o) => {
113
+ const comp = getComp(p, compId);
114
+ const items = o.items ?? [];
115
+ const each = num(o.each, 3), td = num(o.transitionDuration, 0.5), t0 = num(o.start, 0);
116
+ const created = [];
117
+ const ids = [];
118
+ items.forEach((it, i) => {
119
+ const start = t0 + i * (each - td);
120
+ const end = start + each;
121
+ const type = it.type ?? (/\.(mp4|mov|webm|m4v)$/i.test(it.src) ? 'video' : 'image');
122
+ const zoomIn = i % 2 === 0;
123
+ const layer = addLayer(p, comp.id, {
124
+ type, name: `slide-${i + 1}`, src: it.src, inPoint: +start.toFixed(3), outPoint: +end.toFixed(3),
125
+ ...(type === 'video' ? { trimIn: it.trimIn ?? 0, speed: it.speed ?? 1 } : {}),
126
+ transform: { scale: kf([start, zoomIn ? [104, 104] : [118, 118]], [end, zoomIn ? [118, 118] : [104, 104]]) },
127
+ }, comp.layers.length);
128
+ ids.push(layer.id);
129
+ created.push(layer.id);
130
+ if (it.caption) {
131
+ created.push(addLayer(p, comp.id, { type: 'text', name: `caption-${i + 1}`, text: it.caption, size: Math.round(comp.width / 15), weight: 800, color: str(o.captionColor, '#ffffff'),
132
+ inPoint: +(start + td * 0.6).toFixed(3), outPoint: +(end - td).toFixed(3), maxWidth: comp.width * 0.84,
133
+ transform: { position: [comp.width / 2, num(o.captionY, comp.height * 0.78)] },
134
+ box: o.plate ? { color: str(o.plate, '#000000'), padding: [32, 16], radius: 18, reveal: kf([start + td * 0.6, 0, 'expoOut'], [start + td * 0.6 + 0.5, 100]) } : undefined,
135
+ shadow: o.plate ? undefined : { color: 'rgba(0,0,0,0.7)', blur: 18, y: 4 },
136
+ animators: [...TEXT_ANIMATORS[str(o.captionStyle, 'fadeUp')]?.animators ?? TEXT_ANIMATORS.fadeUp.animators, ...TEXT_ANIMATORS.fadeOutDown.animators] }, 0).id);
137
+ }
138
+ });
139
+ // Transitions between consecutive slides.
140
+ const types = Array.isArray(o.transition) ? o.transition : [str(o.transition, 'push')];
141
+ for (let i = 1; i < ids.length; i++)
142
+ PRESETS['transition.between'].apply(p, comp.id, { from: ids[i - 1], to: ids[i], type: types[(i - 1) % types.length], duration: td });
143
+ const end = r3(t0 + items.length * (each - td) + td);
144
+ if (o.fitComp !== false)
145
+ comp.duration = end;
146
+ return { created, note: `Slideshow ends at ${end}s${o.fitComp !== false ? ' (comp duration set to match)' : ''}` };
147
+ },
148
+ };
149
+ PRESETS['transition.between'] = {
150
+ kind: 'transition',
151
+ description: 'Animates two overlapping layers (clips, images or precomps) so one hands over to the other at the overlap.',
152
+ params: '{from: layerId (outgoing), to: layerId (incoming, must start before `from` ends), type: "push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp", duration?: s}',
153
+ apply: (p, compId, o) => {
154
+ const a = findLayer(p, str(o.from, '')), b = findLayer(p, str(o.to, ''));
155
+ const comp = a.comp;
156
+ const d = num(o.duration, 0.5);
157
+ const t1 = b.layer.inPoint ?? 0, t2 = t1 + d;
158
+ const W = comp.width, H = comp.height;
159
+ const center = [W / 2, H / 2];
160
+ const type = str(o.type, 'push');
161
+ const pos = (id, ...k) => k.forEach(([t, v, e]) => setKeyframe(p, id, 'transform.position', t, v, e));
162
+ // Incoming must sit above the outgoing layer for overlays like wipe/crossfade.
163
+ if (b.index > a.index) {
164
+ comp.layers.splice(b.index, 1);
165
+ comp.layers.splice(a.index, 0, b.layer);
166
+ }
167
+ switch (type) {
168
+ case 'crossfade':
169
+ setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easyEase');
170
+ setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);
171
+ break;
172
+ case 'zoom':
173
+ setKeyframe(p, a.layer.id, 'transform.opacity', t1, 100, 'easeIn');
174
+ setKeyframe(p, a.layer.id, 'transform.opacity', t2, 0);
175
+ updateLayer(p, a.layer.id, { effects: [...(a.layer.effects ?? []), { type: 'blur', radius: kf([t1, 0, 'easeIn'], [t2, 25]) }] });
176
+ setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easeOut');
177
+ setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);
178
+ break;
179
+ case 'wipe':
180
+ updateLayer(p, b.layer.id, { masks: [{ shape: 'rect', rect: kf([t1, [0, 0, 0, H], 'expoInOut'], [t2, [0, 0, W * 1.2, H]]) }] });
181
+ break;
182
+ case 'slideUp':
183
+ pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [W / 2, -H / 2]]);
184
+ pos(b.layer.id, [t1, [W / 2, H * 1.5], 'expoInOut'], [t2, center]);
185
+ break;
186
+ case 'whip':
187
+ pos(a.layer.id, [t1, center, 'expoIn'], [t2, [-W / 2, H / 2]]);
188
+ pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoOut'], [t2, center]);
189
+ for (const id of [a.layer.id, b.layer.id])
190
+ updateLayer(p, id, { motionBlur: { samples: 12, shutter: 360 } });
191
+ break;
192
+ default: // push
193
+ pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [-W / 2, H / 2]]);
194
+ pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoInOut'], [t2, center]);
195
+ }
196
+ return { created: [], note: `${type} from ${a.layer.id} to ${b.layer.id} at ${t1}s–${t2}s` };
197
+ },
198
+ };
199
+ PRESETS['element.lowerThird'] = {
200
+ kind: 'element',
201
+ description: 'Lower third: an accent bar wipes in, then name and title slide out from behind it.',
202
+ params: '{name: string, title?: string, start?: s, duration?: s, color?, textColor?, y?: px, font?}',
203
+ apply: (p, compId, o) => {
204
+ const comp = getComp(p, compId);
205
+ const t0 = num(o.start, 0), dur = num(o.duration, 4), y = num(o.y, comp.height * 0.72);
206
+ const color = str(o.color, '#E8692A');
207
+ const x = comp.width * 0.08;
208
+ const created = [];
209
+ const bar = addLayer(p, comp.id, { type: 'solid', name: 'lt-bar', color, size: [12, 170], inPoint: t0, outPoint: t0 + dur,
210
+ transform: { anchor: [0, 0], position: [x, y], scale: kf([t0, [100, 0], 'expoOut'], [t0 + 0.5, [100, 100]], [t0 + dur - 0.5, [100, 100], 'expoIn'], [t0 + dur, [100, 0]]) } });
211
+ created.push(bar.id);
212
+ const mk = (text, size, dy, delay, c, name) => created.push(addLayer(p, comp.id, { type: 'text', name, text, size, weight: 800, align: 'left', color: c, font: o.font, inPoint: t0 + delay, outPoint: t0 + dur,
213
+ transform: { position: [x + 34, y + dy] }, masks: [{ shape: 'rect', rect: [0, -200, comp.width, 400] }],
214
+ animators: [{ unit: 'line', duration: 0.7, ease: 'expoOut', from: { x: -comp.width * 0.6 } }, { unit: 'line', mode: 'out', duration: 0.5, ease: 'expoIn', from: { x: -comp.width * 0.6 } }] }).id);
215
+ mk(str(o.name, 'Name'), Math.round(comp.width / 15), 55, 0.25, str(o.textColor, '#ffffff'), 'lt-name');
216
+ if (o.title)
217
+ mk(str(o.title, ''), Math.round(comp.width / 28), 125, 0.4, color, 'lt-title');
218
+ return { created };
219
+ },
220
+ };
221
+ PRESETS['element.highlightWord'] = {
222
+ kind: 'element',
223
+ description: 'Adds a background plate that wipes in behind an existing text layer (marker highlight).',
224
+ params: '{layer: textLayerId, color?, at?: s, duration?: s, padding?: [x,y], radius?}',
225
+ apply: (p, _c, o) => {
226
+ const { layer } = findLayer(p, str(o.layer, ''));
227
+ if (layer.type !== 'text')
228
+ throw new OpError(`${layer.id} is not a text layer`);
229
+ const at = num(o.at, layer.inPoint ?? 0), d = num(o.duration, 0.45);
230
+ layer.box = { color: str(o.color, '#E8692A'), padding: o.padding ?? [26, 10], radius: num(o.radius, 14), reveal: kf([at, 0, 'expoOut'], [at + d, 100]) };
231
+ return { created: [] };
232
+ },
233
+ };
234
+ export const listPresets = () => Object.entries(PRESETS).map(([name, p]) => `${name} [${p.kind}] — ${p.description}\n params: ${p.params}`).join('\n');
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TextAnimator } from '../core/model.js';
2
+ export declare const TEXT_ANIMATORS: Record<string, {
3
+ description: string;
4
+ animators: TextAnimator[];
5
+ }>;
@@ -0,0 +1,19 @@
1
+ // Text animator presets — the "Animation Presets > Text" folder of DT.ly.
2
+ export const TEXT_ANIMATORS = {
3
+ typewriter: { description: 'Letters appear one by one with no motion.', animators: [{ unit: 'grapheme', stagger: 0.05, duration: 0.01, ease: 'hold', from: { opacity: 0 } }] },
4
+ fadeUp: { description: 'Words fade in while rising slightly. Calm, readable default.', animators: [{ unit: 'word', stagger: 0.08, duration: 0.6, ease: 'cubicOut', from: { opacity: 0, y: 40 } }] },
5
+ popIn: { description: 'Words scale up from zero with an overshoot. Playful, energetic.', animators: [{ unit: 'word', stagger: 0.1, duration: 0.55, ease: 'backOut', from: { opacity: 0, scale: 0 } }] },
6
+ slam: { description: 'Words crash in from huge and blurred. Punchy kinetic typography.', animators: [{ unit: 'word', stagger: 0.18, duration: 0.35, ease: 'expoOut', from: { opacity: 0, scale: 320, blur: 14 } }] },
7
+ blurIn: { description: 'Letters sharpen from a blur. Elegant, premium.', animators: [{ unit: 'grapheme', stagger: 0.03, duration: 0.7, ease: 'cubicOut', from: { opacity: 0, blur: 18, x: -20 } }] },
8
+ maskedLines: { description: 'Each line slides up from behind its own mask. The classic title reveal.', animators: [{ unit: 'line', stagger: 0.12, duration: 0.8, ease: 'expoOut', clip: true, from: { y: 120 } }] },
9
+ cascade: { description: 'Letters drop and rotate into place with an overshoot.', animators: [{ unit: 'grapheme', stagger: 0.035, duration: 0.7, ease: 'backOut', from: { opacity: 0, y: -70, rotation: -25 } }] },
10
+ trackingIn: { description: 'Letter spacing collapses from wide to normal while fading in. Cinematic openers.', animators: [{ unit: 'grapheme', stagger: 0, duration: 1.4, ease: 'expoOut', from: { opacity: 0, tracking: 60 } }] },
11
+ centerOut: { description: 'Letters grow outward from the middle of the word.', animators: [{ unit: 'grapheme', order: 'center', stagger: 0.04, duration: 0.5, ease: 'backOut', from: { opacity: 0, scale: 0 } }] },
12
+ randomFlicker: { description: 'Letters switch on in random order.', animators: [{ unit: 'grapheme', order: 'random', stagger: 0.03, duration: 0.08, ease: 'hold', from: { opacity: 0 } }] },
13
+ colorSweep: { description: 'A highlight colour sweeps through the letters, settling to the text colour.', animators: [{ unit: 'grapheme', stagger: 0.04, duration: 0.5, ease: 'easeOut', from: { color: '#FFC93C', scale: 115 } }] },
14
+ // Exits (mode: out) end at the layer's outPoint.
15
+ fadeOutDown: { description: 'Exit: words fade out while dropping.', animators: [{ unit: 'word', mode: 'out', stagger: 0.05, duration: 0.4, ease: 'easeIn', from: { opacity: 0, y: 40 } }] },
16
+ blurOut: { description: 'Exit: letters blur away.', animators: [{ unit: 'grapheme', mode: 'out', stagger: 0.02, duration: 0.45, ease: 'easeIn', from: { opacity: 0, blur: 16 } }] },
17
+ maskedLinesOut: { description: 'Exit: lines slide up out of their masks.', animators: [{ unit: 'line', mode: 'out', stagger: 0.08, duration: 0.5, ease: 'expoInOut', clip: true, from: { y: -120 } }] },
18
+ };
19
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/presets/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type Project } from '../core/model.js';
2
+ export declare const loadProject: (file: string) => Project;
3
+ export declare const renderStill: (projectFile: string, time: number, out: string, opts?: {
4
+ comp?: string;
5
+ scale?: number;
6
+ }) => Promise<string>;
7
+ export declare const renderContactSheet: (projectFile: string, times: number[], out: string, opts?: {
8
+ comp?: string;
9
+ columns?: number;
10
+ thumbWidth?: number;
11
+ }) => Promise<string>;
12
+ export declare const renderVideo: (projectFile: string, out: string, opts?: {
13
+ comp?: string;
14
+ from?: number;
15
+ to?: number;
16
+ crf?: number;
17
+ audio?: boolean;
18
+ onProgress?: (done: number, total: number) => void;
19
+ }) => Promise<{
20
+ out: string;
21
+ frames: number;
22
+ seconds: number;
23
+ audioTracks: number;
24
+ }>;
25
+ export declare const renderVideoParallel: (projectFile: string, out: string, opts?: {
26
+ comp?: string;
27
+ from?: number;
28
+ to?: number;
29
+ crf?: number;
30
+ workers?: number;
31
+ onProgress?: (done: number, total: number) => void;
32
+ }) => Promise<{
33
+ out: string;
34
+ frames: number;
35
+ seconds: number;
36
+ audioTracks: number;
37
+ } | {
38
+ out: string;
39
+ frames: number;
40
+ seconds: number;
41
+ audioTracks: number;
42
+ workers: number;
43
+ }>;
@@ -0,0 +1,215 @@
1
+ import { fork, spawn } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { isAnimated } from '../core/model.js';
7
+ import { checkFfmpeg } from './ffmpeg.js';
8
+ import { newCanvas, NodeHost, registerFonts } from './node-host.js';
9
+ import { Renderer } from './renderer.js';
10
+ export const loadProject = (file) => JSON.parse(fs.readFileSync(file, 'utf8'));
11
+ const setup = (projectFile, project) => {
12
+ const p = project ?? loadProject(projectFile);
13
+ if (p.comps.some((c) => c.layers.some((l) => l.type === 'video' || l.type === 'audio')))
14
+ checkFfmpeg();
15
+ const baseDir = path.dirname(path.resolve(projectFile));
16
+ registerFonts(p, baseDir);
17
+ const host = new NodeHost(baseDir);
18
+ return { project: p, baseDir, host, renderer: new Renderer(p, host) };
19
+ };
20
+ // Renders one frame (or a scaled-down still) to PNG/JPG.
21
+ export const renderStill = async (projectFile, time, out, opts = {}) => {
22
+ const { project, host, renderer } = setup(projectFile);
23
+ const comp = renderer.comp(opts.comp ?? project.root);
24
+ const scale = opts.scale ?? 1;
25
+ const canvas = newCanvas(Math.round(comp.width * scale), Math.round(comp.height * scale));
26
+ const full = newCanvas(comp.width, comp.height);
27
+ await renderer.renderComp(full.getContext('2d'), comp, time);
28
+ canvas.getContext('2d').drawImage(full, 0, 0, canvas.width, canvas.height);
29
+ await canvas.toFile(out);
30
+ host.close();
31
+ return out;
32
+ };
33
+ // A grid of frames for quick review (what an agent "looks at" instead of scrubbing).
34
+ export const renderContactSheet = async (projectFile, times, out, opts = {}) => {
35
+ const { project, host, renderer } = setup(projectFile);
36
+ const comp = renderer.comp(opts.comp ?? project.root);
37
+ const cols = opts.columns ?? Math.min(times.length, 6);
38
+ const tw = opts.thumbWidth ?? 240, th = Math.round((tw * comp.height) / comp.width);
39
+ const rows = Math.ceil(times.length / cols);
40
+ const sheet = newCanvas(cols * tw, rows * (th + 28));
41
+ const sc = sheet.getContext('2d');
42
+ sc.fillStyle = '#111';
43
+ sc.fillRect(0, 0, sheet.width, sheet.height);
44
+ const full = newCanvas(comp.width, comp.height);
45
+ for (const [i, t] of times.entries()) {
46
+ const fc = full.getContext('2d');
47
+ fc.setTransform(1, 0, 0, 1, 0, 0);
48
+ fc.clearRect(0, 0, comp.width, comp.height);
49
+ await renderer.renderComp(fc, comp, t);
50
+ const x = (i % cols) * tw, y = Math.floor(i / cols) * (th + 28);
51
+ sc.drawImage(full, x, y, tw, th);
52
+ sc.fillStyle = '#ddd';
53
+ sc.font = '16px sans-serif';
54
+ sc.fillText(`${t.toFixed(2)}s`, x + 8, y + th + 20);
55
+ }
56
+ await sheet.toFile(out);
57
+ host.close();
58
+ return out;
59
+ };
60
+ // Collects audio from audio layers and un-muted video layers, through nested comps.
61
+ const collectAudio = (project, comp, offset, srcShift, windowEnd, baseDir, out) => {
62
+ for (const l of comp.layers) {
63
+ const inP = l.inPoint ?? 0, outP = Math.min(l.outPoint ?? comp.duration, comp.duration);
64
+ if (l.type === 'audio' || (l.type === 'video' && l.volume !== undefined && l.volume !== 0)) {
65
+ const speed = l.type === 'video' ? l.speed ?? 1 : 1;
66
+ const start = offset + inP - srcShift;
67
+ const visibleFrom = Math.max(start, offset);
68
+ const end = Math.min(offset + outP - srcShift, windowEnd);
69
+ if (end <= visibleFrom)
70
+ continue;
71
+ out.push({
72
+ file: path.resolve(baseDir, l.src),
73
+ start: visibleFrom,
74
+ trimIn: (l.trimIn ?? 0) + (visibleFrom - start) * speed,
75
+ duration: end - visibleFrom,
76
+ speed,
77
+ volume: l.volume ?? 1,
78
+ fadeIn: l.type === 'audio' ? l.fadeIn : undefined,
79
+ fadeOut: l.type === 'audio' ? l.fadeOut : undefined,
80
+ });
81
+ }
82
+ if (l.type === 'precomp') {
83
+ const child = project.comps.find((c) => c.id === l.comp);
84
+ if (child)
85
+ collectAudio(project, child, offset + inP, l.timeOffset ?? 0, Math.min(windowEnd, offset + outP), baseDir, out);
86
+ }
87
+ }
88
+ };
89
+ // Piecewise-linear FFmpeg volume expression from keyframes (local time t from 0).
90
+ const volumeExpr = (v, layerStart) => {
91
+ if (typeof v === 'number')
92
+ return String(v);
93
+ if (!isAnimated(v))
94
+ return '1';
95
+ const kfs = [...v.keyframes].sort((a, b) => a.t - b.t).map((k) => ({ t: k.t - layerStart, v: k.v }));
96
+ let expr = String(kfs[kfs.length - 1].v);
97
+ for (let i = kfs.length - 2; i >= 0; i--) {
98
+ const a = kfs[i], b = kfs[i + 1];
99
+ const seg = `${a.v}+(${b.v - a.v})*(t-${a.t})/${Math.max(1e-6, b.t - a.t)}`;
100
+ expr = `if(lt(t,${b.t}),${seg},${expr})`;
101
+ }
102
+ return `if(lt(t,${kfs[0].t}),${kfs[0].v},${expr})`;
103
+ };
104
+ // Audio inputs + filter graph for the window [from, to), with FFmpeg input indices starting at `firstInput`.
105
+ const audioGraph = (project, comp, baseDir, from, to, firstInput) => {
106
+ const clips = [];
107
+ collectAudio(project, comp, 0, 0, comp.duration, baseDir, clips);
108
+ const audible = clips
109
+ .map((c) => ({ ...c, start: c.start - from }))
110
+ .filter((c) => c.start + c.duration > 0 && c.start < to - from)
111
+ .map((c) => (c.start < 0 ? { ...c, trimIn: c.trimIn - c.start * c.speed, duration: c.duration + c.start, start: 0 } : c));
112
+ if (!audible.length)
113
+ return { inputs: [], filter: null, count: 0 };
114
+ const chains = audible.map((c, i) => {
115
+ const f = [`atrim=start=${c.trimIn.toFixed(4)}:duration=${(c.duration * c.speed).toFixed(4)}`, 'asetpts=PTS-STARTPTS'];
116
+ if (c.speed !== 1)
117
+ f.push(`atempo=${Math.min(2, Math.max(0.5, c.speed))}`);
118
+ f.push(`volume='${volumeExpr(c.volume, c.start + from)}':eval=frame`);
119
+ if (c.fadeIn)
120
+ f.push(`afade=t=in:st=0:d=${c.fadeIn}`);
121
+ if (c.fadeOut)
122
+ f.push(`afade=t=out:st=${Math.max(0, c.duration - c.fadeOut)}:d=${c.fadeOut}`);
123
+ const ms = Math.round(c.start * 1000);
124
+ f.push(`adelay=${ms}|${ms}`, 'aformat=sample_rates=48000:channel_layouts=stereo');
125
+ return `[${firstInput + i}:a]${f.join(',')}[a${i}]`;
126
+ });
127
+ const mix = `${audible.map((_, i) => `[a${i}]`).join('')}amix=inputs=${audible.length}:normalize=0:dropout_transition=0,alimiter=limit=0.95,apad,atrim=duration=${(to - from).toFixed(3)}[aout]`;
128
+ return { inputs: audible.flatMap((c) => ['-i', c.file]), filter: [...chains, mix].join(';'), count: audible.length };
129
+ };
130
+ const runFfmpeg = (args, stdin = false) => {
131
+ const ff = spawn('ffmpeg', args, { stdio: [stdin ? 'pipe' : 'ignore', 'inherit', 'pipe'] });
132
+ let err = '';
133
+ ff.stderr.on('data', (d) => (err += d));
134
+ const done = new Promise((res, rej) => ff.on('close', (code) => (code === 0 ? res() : rej(new Error(`ffmpeg failed (${code}): ${err.slice(-2000)}`)))));
135
+ return { ff, done };
136
+ };
137
+ const X264 = (crf = 18) => ['-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-crf', String(crf), '-preset', 'medium'];
138
+ export const renderVideo = async (projectFile, out, opts = {}) => {
139
+ checkFfmpeg();
140
+ const { project, baseDir, host, renderer } = setup(projectFile);
141
+ const comp = renderer.comp(opts.comp ?? project.root);
142
+ const from = opts.from ?? 0, to = Math.min(opts.to ?? comp.duration, comp.duration);
143
+ const total = Math.round((to - from) * comp.fps);
144
+ const audio = opts.audio === false ? { inputs: [], filter: null, count: 0 } : audioGraph(project, comp, baseDir, from, to, 1);
145
+ const args = ['-y', '-v', 'error', '-f', 'rawvideo', '-pix_fmt', 'rgba', '-s', `${comp.width}x${comp.height}`, '-r', String(comp.fps), '-i', '-', ...audio.inputs];
146
+ if (audio.filter)
147
+ args.push('-filter_complex', audio.filter, '-map', '0:v', '-map', '[aout]', '-c:a', 'aac', '-b:a', '192k');
148
+ args.push(...X264(opts.crf), '-movflags', '+faststart', '-frames:v', String(total), out);
149
+ const { ff, done } = runFfmpeg(args, true);
150
+ const canvas = newCanvas(comp.width, comp.height);
151
+ const ctx = canvas.getContext('2d');
152
+ for (let f = 0; f < total; f++) {
153
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
154
+ ctx.clearRect(0, 0, comp.width, comp.height);
155
+ if (!comp.background) {
156
+ ctx.fillStyle = '#000';
157
+ ctx.fillRect(0, 0, comp.width, comp.height);
158
+ }
159
+ await renderer.renderComp(ctx, comp, from + f / comp.fps);
160
+ const raw = canvas.toBufferSync('raw');
161
+ if (!ff.stdin.write(raw))
162
+ await new Promise((r) => ff.stdin.once('drain', r));
163
+ opts.onProgress?.(f + 1, total);
164
+ }
165
+ ff.stdin.end();
166
+ await done;
167
+ host.close();
168
+ return { out, frames: total, seconds: to - from, audioTracks: audio.count };
169
+ };
170
+ // Splits the timeline across worker processes (one per core), then joins the chunks
171
+ // losslessly and mixes the audio once over the whole range.
172
+ export const renderVideoParallel = async (projectFile, out, opts = {}) => {
173
+ checkFfmpeg();
174
+ const project = loadProject(projectFile);
175
+ const comp = project.comps.find((c) => c.id === (opts.comp ?? project.root));
176
+ if (!comp)
177
+ throw new Error(`Unknown comp ${opts.comp}`);
178
+ const from = opts.from ?? 0, to = Math.min(opts.to ?? comp.duration, comp.duration);
179
+ const f0 = Math.round(from * comp.fps), total = Math.round((to - from) * comp.fps);
180
+ // One process is fastest for short videos (worker start-up dominates); opt in for long renders.
181
+ const workers = Math.max(1, Math.min(opts.workers ?? 1, os.cpus().length, Math.ceil(total / 15)));
182
+ if (workers === 1)
183
+ return renderVideo(projectFile, out, opts);
184
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'dtly-'));
185
+ const here = fileURLToPath(import.meta.url);
186
+ const cli = path.resolve(path.dirname(here), here.endsWith('.ts') ? '../cli.ts' : '../cli.js');
187
+ const progress = new Array(workers).fill(0);
188
+ const chunks = [...Array(workers).keys()].map((i) => {
189
+ const a = f0 + Math.floor((total * i) / workers), b = f0 + Math.floor((total * (i + 1)) / workers);
190
+ return { file: path.join(tmp, `chunk-${i}.mp4`), from: a / comp.fps, to: b / comp.fps, frames: b - a };
191
+ });
192
+ await Promise.all(chunks.map((c, i) => new Promise((res, rej) => {
193
+ const child = fork(cli, ['chunk', projectFile, c.file, String(c.from), String(c.to), opts.comp ?? '', String(opts.crf ?? 18)], { execArgv: process.execArgv, stdio: ['ignore', 'ignore', 'pipe', 'ipc'] });
194
+ let err = '';
195
+ child.stderr.on('data', (d) => (err += d));
196
+ child.on('message', (m) => {
197
+ if (m.done !== undefined) {
198
+ progress[i] = m.done;
199
+ opts.onProgress?.(progress.reduce((x, y) => x + y, 0), total);
200
+ }
201
+ });
202
+ child.on('exit', (code) => (code === 0 ? res() : rej(new Error(`chunk ${i} failed: ${err.slice(-1500)}`))));
203
+ })));
204
+ const list = path.join(tmp, 'list.txt');
205
+ fs.writeFileSync(list, chunks.map((c) => `file '${c.file}'`).join('\n'));
206
+ const audio = audioGraph(project, comp, path.dirname(path.resolve(projectFile)), from, to, 1);
207
+ const args = ['-y', '-v', 'error', '-f', 'concat', '-safe', '0', '-i', list, ...audio.inputs];
208
+ if (audio.filter)
209
+ args.push('-filter_complex', audio.filter, '-map', '0:v', '-map', '[aout]', '-c:a', 'aac', '-b:a', '192k');
210
+ args.push('-c:v', 'copy', '-movflags', '+faststart', out);
211
+ await runFfmpeg(args).done;
212
+ fs.rmSync(tmp, { recursive: true, force: true });
213
+ return { out, frames: total, seconds: to - from, audioTracks: audio.count, workers };
214
+ };
215
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/render/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const checkFfmpeg: () => void;