frameyard 0.5.0 → 0.6.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 (96) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/GLOSSARY.md +152 -24
  3. package/README.md +94 -29
  4. package/dist/cli.js +111 -14
  5. package/dist/cli.js.map +1 -1
  6. package/dist/contracts.d.ts +12 -0
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js.map +1 -1
  9. package/dist/errors.d.ts +1 -1
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/errors.js.map +1 -1
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/preview/main.js +89 -11
  17. package/dist/preview/main.js.map +1 -1
  18. package/dist/preview/timeline-data.d.ts +85 -0
  19. package/dist/preview/timeline-data.d.ts.map +1 -0
  20. package/dist/preview/timeline-data.js +2 -0
  21. package/dist/preview/timeline-data.js.map +1 -0
  22. package/dist/preview/timeline-host.d.ts +19 -0
  23. package/dist/preview/timeline-host.d.ts.map +1 -0
  24. package/dist/preview/timeline-host.js +297 -0
  25. package/dist/preview/timeline-host.js.map +1 -0
  26. package/dist/preview/timeline-main.d.ts +17 -0
  27. package/dist/preview/timeline-main.d.ts.map +1 -0
  28. package/dist/preview/timeline-main.js +364 -0
  29. package/dist/preview/timeline-main.js.map +1 -0
  30. package/dist/project.d.ts +16 -1
  31. package/dist/project.d.ts.map +1 -1
  32. package/dist/project.js +81 -26
  33. package/dist/project.js.map +1 -1
  34. package/dist/renderer/browser.d.ts +2 -0
  35. package/dist/renderer/browser.d.ts.map +1 -1
  36. package/dist/renderer/browser.js +6 -1
  37. package/dist/renderer/browser.js.map +1 -1
  38. package/dist/renderer/ffmpeg.d.ts +61 -0
  39. package/dist/renderer/ffmpeg.d.ts.map +1 -1
  40. package/dist/renderer/ffmpeg.js +198 -0
  41. package/dist/renderer/ffmpeg.js.map +1 -1
  42. package/dist/renderer/timeline.d.ts +109 -0
  43. package/dist/renderer/timeline.d.ts.map +1 -0
  44. package/dist/renderer/timeline.js +984 -0
  45. package/dist/renderer/timeline.js.map +1 -0
  46. package/dist/scaffold.d.ts.map +1 -1
  47. package/dist/scaffold.js +89 -24
  48. package/dist/scaffold.js.map +1 -1
  49. package/dist/server/preview-html.d.ts.map +1 -1
  50. package/dist/server/preview-html.js +15 -1
  51. package/dist/server/preview-html.js.map +1 -1
  52. package/dist/server/server.d.ts.map +1 -1
  53. package/dist/server/server.js +39 -1
  54. package/dist/server/server.js.map +1 -1
  55. package/dist/server/timeline-preview-data.d.ts +4 -0
  56. package/dist/server/timeline-preview-data.d.ts.map +1 -0
  57. package/dist/server/timeline-preview-data.js +97 -0
  58. package/dist/server/timeline-preview-data.js.map +1 -0
  59. package/dist/server/timeline-preview-html.d.ts +4 -0
  60. package/dist/server/timeline-preview-html.d.ts.map +1 -0
  61. package/dist/server/timeline-preview-html.js +227 -0
  62. package/dist/server/timeline-preview-html.js.map +1 -0
  63. package/dist/timeline/plan.d.ts +32 -0
  64. package/dist/timeline/plan.d.ts.map +1 -0
  65. package/dist/timeline/plan.js +68 -0
  66. package/dist/timeline/plan.js.map +1 -0
  67. package/dist/timeline/resolve.d.ts +60 -0
  68. package/dist/timeline/resolve.d.ts.map +1 -0
  69. package/dist/timeline/resolve.js +523 -0
  70. package/dist/timeline/resolve.js.map +1 -0
  71. package/dist/timeline/schema.d.ts +71 -0
  72. package/dist/timeline/schema.d.ts.map +1 -0
  73. package/dist/timeline/schema.js +425 -0
  74. package/dist/timeline/schema.js.map +1 -0
  75. package/dist/version.d.ts +1 -1
  76. package/dist/version.js +1 -1
  77. package/docs/adr/0002-make-frame-and-props-the-only-animation-state.md +2 -0
  78. package/docs/adr/0005-keep-parallel-rendering-opt-in-and-frame-ordered.md +2 -0
  79. package/docs/adr/0007-make-html-documents-the-composition-unit.md +1 -1
  80. package/docs/adr/0009-composite-production-frames-in-software.md +1 -1
  81. package/docs/adr/0010-make-timelines-the-render-unit.md +24 -0
  82. package/docs/adr/0011-compose-timeline-frames-in-a-live-browser-host.md +22 -0
  83. package/docs/adr/0012-render-timelines-with-segmented-lossless-clip-intermediates.md +31 -0
  84. package/docs/v0.1-design.md +135 -86
  85. package/examples/demo/README.md +10 -3
  86. package/examples/demo/timelines/demo.timeline.json +12 -0
  87. package/examples/demo/video.config.js +4 -0
  88. package/examples/video/README.md +50 -6
  89. package/examples/video/compositions/video-overlay.html +350 -0
  90. package/examples/video/props/video-timeline.json +10 -0
  91. package/examples/video/timelines/video-timeline-mp4.timeline.json +44 -0
  92. package/examples/video/timelines/video-timeline.timeline.json +44 -0
  93. package/examples/video/video.config.js +6 -0
  94. package/package.json +1 -1
  95. package/skills/frameyard/SKILL.md +17 -13
  96. package/skills/frameyard/references/timelines.md +141 -0
@@ -0,0 +1,364 @@
1
+ import { createTimelineHost } from "./timeline-host.js";
2
+ function byId(id) {
3
+ const element = document.getElementById(id);
4
+ if (!element) {
5
+ throw new Error(`Timeline preview markup is missing #${id}.`);
6
+ }
7
+ return element;
8
+ }
9
+ function clampFrame(frame, duration) {
10
+ return Math.max(0, Math.min(duration - 1, Math.floor(frame)));
11
+ }
12
+ async function fetchTimelineData(timelineId) {
13
+ const response = await fetch(`/__frameyard/timeline/${encodeURIComponent(timelineId)}.json`, {
14
+ cache: "no-store",
15
+ });
16
+ if (!response.ok) {
17
+ let message = `Could not load timeline data (${response.status}).`;
18
+ try {
19
+ const body = (await response.json());
20
+ if (body.error?.message) {
21
+ message = body.error.message;
22
+ }
23
+ }
24
+ catch {
25
+ // Keep the status message.
26
+ }
27
+ throw new Error(message);
28
+ }
29
+ return (await response.json());
30
+ }
31
+ function showError(error) {
32
+ if (document.body.dataset.embed === "1") {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ window.__fyTimelineError = { message };
35
+ }
36
+ const box = document.getElementById("error");
37
+ if (!box) {
38
+ console.error(error);
39
+ return;
40
+ }
41
+ box.hidden = false;
42
+ box.textContent = error instanceof Error ? error.message : String(error);
43
+ console.error(error);
44
+ }
45
+ function renderDiagnostics(data) {
46
+ const box = document.getElementById("diagnostics");
47
+ if (!box) {
48
+ return;
49
+ }
50
+ const diagnostics = data.diagnostics;
51
+ box.hidden = diagnostics.length === 0;
52
+ box.replaceChildren(...diagnostics.map((diagnostic) => {
53
+ const line = document.createElement("div");
54
+ line.textContent = `${diagnostic.severity}: [${diagnostic.code}] ${diagnostic.message}`;
55
+ return line;
56
+ }));
57
+ }
58
+ function clipClass(clip) {
59
+ if (clip.source.kind === "composition") {
60
+ return "clip composition";
61
+ }
62
+ if (clip.source.kind === "timeline") {
63
+ return "clip nested";
64
+ }
65
+ if (clip.source.kind === "audio") {
66
+ return "clip audio";
67
+ }
68
+ return "clip";
69
+ }
70
+ function renderTracks(data) {
71
+ const container = byId("tracks");
72
+ container.replaceChildren();
73
+ const playheads = [];
74
+ const labels = new Map();
75
+ for (const track of data.tracks) {
76
+ const row = document.createElement("div");
77
+ row.className = "track";
78
+ const label = document.createElement("div");
79
+ label.className = "track-label";
80
+ const name = track.name ?? track.id;
81
+ label.textContent = name;
82
+ label.title = `${track.kind} ${track.id}`;
83
+ const lane = document.createElement("div");
84
+ lane.className = "lane";
85
+ labels.set(track.id, name);
86
+ const clips = data.clips.filter((clip) => clip.track === track.id).sort((left, right) => left.start - right.start);
87
+ for (const clip of clips) {
88
+ const element = document.createElement("div");
89
+ element.className = clipClass(clip);
90
+ element.style.left = `${(clip.start / data.durationInFrames) * 100}%`;
91
+ element.style.width = `${(clip.duration / data.durationInFrames) * 100}%`;
92
+ element.textContent = clip.id;
93
+ element.title = `${clip.id} · ${clip.source.kind} · ${clip.start}..${clip.end}`;
94
+ lane.append(element);
95
+ }
96
+ const playhead = document.createElement("div");
97
+ playhead.style.position = "absolute";
98
+ playhead.style.top = "0";
99
+ playhead.style.bottom = "0";
100
+ playhead.style.width = "1px";
101
+ playhead.style.background = "#b8f36b";
102
+ playhead.style.boxShadow = "0 0 10px rgba(184,243,107,.7)";
103
+ playhead.style.pointerEvents = "none";
104
+ playhead.style.left = "0%";
105
+ lane.append(playhead);
106
+ playheads.push(playhead);
107
+ row.append(label, lane);
108
+ container.append(row);
109
+ }
110
+ return { playheads, labels };
111
+ }
112
+ function fitStage(stage, wrap, viewport, format) {
113
+ const availableWidth = Math.max(80, viewport.clientWidth - 40);
114
+ const availableHeight = Math.max(60, viewport.clientHeight - 40);
115
+ const scale = Math.min(availableWidth / format.width, availableHeight / format.height);
116
+ stage.style.transform = `scale(${scale})`;
117
+ stage.style.transformOrigin = "top left";
118
+ wrap.style.width = `${format.width * scale}px`;
119
+ wrap.style.height = `${format.height * scale}px`;
120
+ }
121
+ async function main() {
122
+ const body = document.body;
123
+ const timelineId = body.dataset.timelineId;
124
+ if (!timelineId) {
125
+ throw new Error("Missing timeline id.");
126
+ }
127
+ const data = await fetchTimelineData(timelineId);
128
+ const stage = byId("stage");
129
+ const embedded = body.dataset.embed === "1";
130
+ if (embedded) {
131
+ stage.style.position = "absolute";
132
+ stage.style.inset = "0";
133
+ const host = createTimelineHost(stage, data, { background: data.background ?? "transparent" });
134
+ window.__fyTimeline = {
135
+ ready: host.ready,
136
+ format: host.format,
137
+ durationInFrames: host.durationInFrames,
138
+ load: () => host.load(),
139
+ seek: (frame) => host.seek(frame),
140
+ settle: () => host.settle(),
141
+ dispose: () => host.dispose(),
142
+ };
143
+ return;
144
+ }
145
+ const viewport = byId("viewport");
146
+ const stageWrap = byId("stage-wrap");
147
+ const host = createTimelineHost(stage, data);
148
+ const meta = byId("meta");
149
+ const title = byId("title");
150
+ const playButton = byId("play-button");
151
+ const jumpBackButton = byId("jump-back");
152
+ const stepBackButton = byId("step-back");
153
+ const stepForwardButton = byId("step-forward");
154
+ const jumpForwardButton = byId("jump-forward");
155
+ const scrubber = byId("scrub");
156
+ const frameLabel = byId("frame");
157
+ const durationLabel = byId("duration");
158
+ const clockLabel = byId("clock");
159
+ const muteCheckbox = byId("mute");
160
+ const volumeSlider = byId("volume");
161
+ const audioEntries = data.audioClips.map((clip) => {
162
+ const audio = new Audio(clip.url);
163
+ audio.preload = "auto";
164
+ audio.volume = clip.volume;
165
+ return { clip, audio };
166
+ });
167
+ const { playheads } = renderTracks(data);
168
+ const fps = data.format.fps;
169
+ const framesPerSecond = Math.max(1, Math.round(fps));
170
+ const duration = data.durationInFrames;
171
+ let currentFrame = 0;
172
+ let playing = false;
173
+ let animationFrame = 0;
174
+ let playStartFrame = 0;
175
+ let playStartClock = 0;
176
+ let seeking = false;
177
+ let pendingFrame = null;
178
+ let masterVolume = Number(volumeSlider.value) || 0.8;
179
+ let muted = false;
180
+ title.textContent = data.timeline;
181
+ meta.textContent = `${data.format.width}×${data.format.height} · ${fps} fps · ${duration} frames · ${(duration / fps).toFixed(2)}s`;
182
+ document.title = `${data.timeline} — Frameyard Timeline`;
183
+ scrubber.max = String(Math.max(0, duration - 1));
184
+ durationLabel.textContent = String(duration);
185
+ const updateAudio = (forceSeek) => {
186
+ for (const { clip, audio } of audioEntries) {
187
+ const endFrame = clip.trimDuration !== undefined ? clip.startFrame + clip.trimDuration * fps : Number.POSITIVE_INFINITY;
188
+ const active = currentFrame >= clip.startFrame && currentFrame < endFrame;
189
+ const desired = clip.trimStart + Math.max(0, (currentFrame - clip.startFrame) / fps);
190
+ audio.volume = Math.max(0, Math.min(1, clip.volume * masterVolume * (muted ? 0 : 1)));
191
+ if (forceSeek || !playing) {
192
+ if (active && Number.isFinite(desired)) {
193
+ audio.currentTime = desired;
194
+ }
195
+ }
196
+ if (playing && active) {
197
+ if (audio.paused) {
198
+ if (Math.abs(audio.currentTime - desired) > 0.25) {
199
+ audio.currentTime = desired;
200
+ }
201
+ void audio.play().catch(() => undefined);
202
+ }
203
+ }
204
+ else {
205
+ audio.pause();
206
+ }
207
+ }
208
+ };
209
+ const updateUi = () => {
210
+ frameLabel.textContent = String(currentFrame);
211
+ scrubber.value = String(currentFrame);
212
+ clockLabel.textContent = `${(currentFrame / fps).toFixed(2)}s`;
213
+ const percent = duration <= 1 ? 0 : (currentFrame / (duration - 1)) * 100;
214
+ for (const playhead of playheads) {
215
+ playhead.style.left = `${percent}%`;
216
+ }
217
+ };
218
+ const renderFrame = async (target) => {
219
+ if (seeking) {
220
+ const next = clampFrame(target, duration);
221
+ if (next !== currentFrame) {
222
+ currentFrame = next;
223
+ pendingFrame = next;
224
+ updateUi();
225
+ }
226
+ return;
227
+ }
228
+ seeking = true;
229
+ const requested = clampFrame(target, duration);
230
+ currentFrame = requested;
231
+ updateUi();
232
+ let failed = false;
233
+ try {
234
+ await host.seek(requested);
235
+ }
236
+ catch (error) {
237
+ failed = true;
238
+ playing = false;
239
+ pendingFrame = null;
240
+ updateAudio(true);
241
+ showError(error);
242
+ }
243
+ finally {
244
+ seeking = false;
245
+ }
246
+ updateAudio(!playing);
247
+ if (!failed && pendingFrame !== null) {
248
+ const next = pendingFrame;
249
+ pendingFrame = null;
250
+ if (next !== requested) {
251
+ await renderFrame(next);
252
+ }
253
+ }
254
+ };
255
+ const stopPlayback = () => {
256
+ playing = false;
257
+ cancelAnimationFrame(animationFrame);
258
+ playButton.innerHTML = "&#9654;";
259
+ updateAudio(false);
260
+ };
261
+ const loop = () => {
262
+ if (!playing) {
263
+ return;
264
+ }
265
+ const target = playStartFrame + Math.floor(((performance.now() - playStartClock) / 1000) * fps);
266
+ if (target >= duration - 1) {
267
+ currentFrame = duration - 1;
268
+ playing = false;
269
+ playButton.innerHTML = "&#9654;";
270
+ updateUi();
271
+ void renderFrame(currentFrame);
272
+ updateAudio(false);
273
+ return;
274
+ }
275
+ if (target !== currentFrame) {
276
+ void renderFrame(target);
277
+ }
278
+ animationFrame = requestAnimationFrame(loop);
279
+ };
280
+ const setPlaying = (value) => {
281
+ if (value) {
282
+ if (playing) {
283
+ return;
284
+ }
285
+ if (currentFrame >= duration - 1) {
286
+ currentFrame = 0;
287
+ void renderFrame(0);
288
+ }
289
+ playing = true;
290
+ playStartFrame = currentFrame;
291
+ playStartClock = performance.now();
292
+ playButton.innerHTML = "&#10074;&#10074;";
293
+ updateAudio(true);
294
+ animationFrame = requestAnimationFrame(loop);
295
+ }
296
+ else {
297
+ stopPlayback();
298
+ }
299
+ };
300
+ const stepFrame = (delta) => {
301
+ stopPlayback();
302
+ const target = clampFrame(currentFrame + delta, duration);
303
+ if (target !== currentFrame) {
304
+ void renderFrame(target);
305
+ }
306
+ };
307
+ const isTextEntry = (target) => {
308
+ if (!(target instanceof HTMLElement)) {
309
+ return false;
310
+ }
311
+ return (target.isContentEditable ||
312
+ target.tagName === "INPUT" ||
313
+ target.tagName === "TEXTAREA" ||
314
+ target.tagName === "SELECT");
315
+ };
316
+ const handleTransportKey = (event) => {
317
+ if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || isTextEntry(event.target)) {
318
+ return;
319
+ }
320
+ const frames = event.shiftKey ? framesPerSecond : 1;
321
+ if (event.key === "ArrowLeft") {
322
+ event.preventDefault();
323
+ stepFrame(-frames);
324
+ }
325
+ else if (event.key === "ArrowRight") {
326
+ event.preventDefault();
327
+ stepFrame(frames);
328
+ }
329
+ };
330
+ playButton.addEventListener("click", () => setPlaying(!playing));
331
+ stepBackButton.addEventListener("click", () => stepFrame(-1));
332
+ stepForwardButton.addEventListener("click", () => stepFrame(1));
333
+ jumpBackButton.addEventListener("click", () => stepFrame(-framesPerSecond));
334
+ jumpForwardButton.addEventListener("click", () => stepFrame(framesPerSecond));
335
+ window.addEventListener("keydown", handleTransportKey);
336
+ scrubber.addEventListener("input", () => {
337
+ stopPlayback();
338
+ void renderFrame(Number(scrubber.value));
339
+ });
340
+ muteCheckbox.addEventListener("change", () => {
341
+ muted = muteCheckbox.checked;
342
+ updateAudio(true);
343
+ });
344
+ volumeSlider.addEventListener("input", () => {
345
+ masterVolume = Number(volumeSlider.value);
346
+ updateAudio(true);
347
+ });
348
+ window.addEventListener("resize", () => fitStage(stage, stageWrap, viewport, data.format));
349
+ fitStage(stage, stageWrap, viewport, data.format);
350
+ renderDiagnostics(data);
351
+ updateUi();
352
+ await host.load();
353
+ await renderFrame(0);
354
+ }
355
+ window.addEventListener("error", (event) => {
356
+ if (event.error) {
357
+ showError(event.error);
358
+ }
359
+ });
360
+ window.addEventListener("unhandledrejection", (event) => {
361
+ showError(event.reason);
362
+ });
363
+ void main().catch(showError);
364
+ //# sourceMappingURL=timeline-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-main.js","sourceRoot":"","sources":["../../src/preview/timeline-main.ts"],"names":[],"mappings":"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"}
package/dist/project.d.ts CHANGED
@@ -1,4 +1,10 @@
1
1
  export type CompositionKind = "html";
2
+ export type TimelineKind = "timeline";
3
+ export interface ProjectFormat {
4
+ width: number;
5
+ height: number;
6
+ fps: number;
7
+ }
2
8
  export interface ProjectComposition {
3
9
  id: string;
4
10
  /** Forward-slash relative path from the project root, without a leading "./". */
@@ -6,13 +12,22 @@ export interface ProjectComposition {
6
12
  absoluteEntry: string;
7
13
  kind: CompositionKind;
8
14
  }
15
+ export interface ProjectTimeline {
16
+ id: string;
17
+ /** Forward-slash relative path from the project root, without a leading "./". */
18
+ entry: string;
19
+ absoluteEntry: string;
20
+ kind: TimelineKind;
21
+ }
9
22
  export interface Project {
10
23
  root: string;
11
24
  configPath: string;
25
+ format?: ProjectFormat;
12
26
  compositions: Map<string, ProjectComposition>;
27
+ timelines: Map<string, ProjectTimeline>;
13
28
  }
14
29
  /** Walks up from a directory until it finds video.config.js. */
15
30
  export declare function resolveProjectRoot(start?: string): Promise<string>;
16
- /** Loads video.config.js and validates its explicitly listed composition entries. */
31
+ /** Loads video.config.js and validates its explicit composition and timeline entries. */
17
32
  export declare function loadProject(projectRoot: string): Promise<Project>;
18
33
  //# sourceMappingURL=project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAYD,gEAAgE;AAChE,wBAAsB,kBAAkB,CAAC,KAAK,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AAED,qFAAqF;AACrF,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsEvE"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACzC;AAYD,gEAAgE;AAChE,wBAAsB,kBAAkB,CAAC,KAAK,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AA+CD,yFAAyF;AACzF,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoGvE"}
package/dist/project.js CHANGED
@@ -3,7 +3,7 @@ import path from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
4
  import { FrameyardError } from "./errors.js";
5
5
  import { isPlainObject } from "./contracts.js";
6
- const COMPOSITION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
6
+ const PROJECT_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
7
7
  async function isFile(filePath) {
8
8
  try {
9
9
  return (await stat(filePath)).isFile();
@@ -34,7 +34,40 @@ export async function resolveProjectRoot(start = process.cwd()) {
34
34
  current = parent;
35
35
  }
36
36
  }
37
- /** Loads video.config.js and validates its explicitly listed composition entries. */
37
+ function normalizeFormat(value) {
38
+ if (!isPlainObject(value)) {
39
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js format must be an object with width, height, and fps.");
40
+ }
41
+ const { width, height, fps } = value;
42
+ if (!Number.isInteger(width) || width <= 0) {
43
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js format.width must be a positive integer.");
44
+ }
45
+ if (!Number.isInteger(height) || height <= 0) {
46
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js format.height must be a positive integer.");
47
+ }
48
+ if (typeof fps !== "number" || !Number.isFinite(fps) || fps <= 0) {
49
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js format.fps must be a positive number.");
50
+ }
51
+ return { width: width, height: height, fps };
52
+ }
53
+ function entryPath(root, id, entryValue, extension) {
54
+ if (typeof entryValue !== "string" || entryValue.length === 0) {
55
+ throw new FrameyardError("CONFIG_INVALID", `Entry "${id}" must be a non-empty string.`);
56
+ }
57
+ const entry = entryValue.replaceAll("\\", "/");
58
+ if (entry.startsWith("/") || /^[A-Za-z]:/.test(entry)) {
59
+ throw new FrameyardError("CONFIG_INVALID", `Entry "${id}" must be relative to the project root.`);
60
+ }
61
+ const absoluteEntry = path.resolve(root, entry);
62
+ if (absoluteEntry !== root && !absoluteEntry.startsWith(root + path.sep)) {
63
+ throw new FrameyardError("CONFIG_INVALID", `Entry "${id}" escapes the project root: ${entryValue}`);
64
+ }
65
+ if (path.extname(absoluteEntry).toLowerCase() !== extension) {
66
+ throw new FrameyardError("CONFIG_INVALID", `Entry "${id}" must be a ${extension} file: ${entryValue}`);
67
+ }
68
+ return { entry: path.relative(root, absoluteEntry).split(path.sep).join("/"), absoluteEntry };
69
+ }
70
+ /** Loads video.config.js and validates its explicit composition and timeline entries. */
38
71
  export async function loadProject(projectRoot) {
39
72
  const root = path.resolve(projectRoot);
40
73
  const configPath = path.join(root, "video.config.js");
@@ -54,39 +87,61 @@ export async function loadProject(projectRoot) {
54
87
  if (!isPlainObject(config)) {
55
88
  throw new FrameyardError("CONFIG_INVALID", "video.config.js must default-export a configuration object.");
56
89
  }
57
- const entries = config.compositions;
58
- if (!isPlainObject(entries)) {
90
+ const rawCompositions = config.compositions;
91
+ const rawTimelines = config.timelines;
92
+ if (rawCompositions === undefined && rawTimelines === undefined) {
93
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js must contain a compositions or timelines object.");
94
+ }
95
+ if (rawCompositions !== undefined && !isPlainObject(rawCompositions)) {
59
96
  throw new FrameyardError("CONFIG_INVALID", "video.config.js must contain a compositions object.");
60
97
  }
98
+ if (rawTimelines !== undefined && !isPlainObject(rawTimelines)) {
99
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js timelines must be an object.");
100
+ }
101
+ const format = config.format === undefined ? undefined : normalizeFormat(config.format);
61
102
  const compositions = new Map();
62
- for (const [id, rawEntry] of Object.entries(entries)) {
63
- if (!COMPOSITION_ID.test(id)) {
103
+ const timelines = new Map();
104
+ const ids = new Set();
105
+ for (const [id, rawEntry] of Object.entries(rawCompositions ?? {})) {
106
+ if (!PROJECT_ID.test(id)) {
64
107
  throw new FrameyardError("CONFIG_INVALID", `Invalid composition id "${id}". Use letters, digits, dots, underscores, or hyphens, starting with a letter or digit.`);
65
108
  }
66
- if (typeof rawEntry !== "string" || rawEntry.length === 0) {
67
- throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry must be a non-empty string.`);
109
+ if (ids.has(id)) {
110
+ throw new FrameyardError("CONFIG_INVALID", `Project id "${id}" is used by more than one entry.`);
68
111
  }
69
- const entry = rawEntry.replaceAll("\\", "/");
70
- if (entry.startsWith("/") || /^[A-Za-z]:/.test(entry)) {
71
- throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry must be relative to the project root.`);
112
+ const location = entryPath(root, id, rawEntry, ".html");
113
+ if (!(await isFile(location.absoluteEntry))) {
114
+ throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry does not exist: ${String(rawEntry)}`);
72
115
  }
73
- const absoluteEntry = path.resolve(root, entry);
74
- if (absoluteEntry !== root && !absoluteEntry.startsWith(root + path.sep)) {
75
- throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry escapes the project root: ${rawEntry}`);
116
+ ids.add(id);
117
+ compositions.set(id, { id, ...location, kind: "html" });
118
+ }
119
+ for (const [id, rawEntry] of Object.entries(rawTimelines ?? {})) {
120
+ if (!PROJECT_ID.test(id)) {
121
+ throw new FrameyardError("CONFIG_INVALID", `Invalid timeline id "${id}". Use letters, digits, dots, underscores, or hyphens, starting with a letter or digit.`);
76
122
  }
77
- if (!(await isFile(absoluteEntry))) {
78
- throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry does not exist: ${rawEntry}`);
123
+ if (ids.has(id)) {
124
+ throw new FrameyardError("CONFIG_INVALID", `Project id "${id}" is used by more than one entry.`);
79
125
  }
80
- if (path.extname(absoluteEntry).toLowerCase() !== ".html") {
81
- throw new FrameyardError("CONFIG_INVALID", `Composition "${id}" entry must be an .html file: ${rawEntry}`);
126
+ const location = entryPath(root, id, rawEntry, ".json");
127
+ if (!(await isFile(location.absoluteEntry))) {
128
+ throw new FrameyardError("CONFIG_INVALID", `Timeline "${id}" entry does not exist: ${String(rawEntry)}`);
82
129
  }
83
- compositions.set(id, {
84
- id,
85
- entry: path.relative(root, absoluteEntry).split(path.sep).join("/"),
86
- absoluteEntry,
87
- kind: "html",
88
- });
89
- }
90
- return { root, configPath, compositions };
130
+ ids.add(id);
131
+ timelines.set(id, { id, ...location, kind: "timeline" });
132
+ }
133
+ if (compositions.size === 0 && timelines.size === 0) {
134
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js must list at least one composition or timeline.");
135
+ }
136
+ if (timelines.size > 0 && !format) {
137
+ throw new FrameyardError("CONFIG_INVALID", "video.config.js must declare format { width, height, fps } when it lists timelines.");
138
+ }
139
+ return {
140
+ root,
141
+ configPath,
142
+ ...(format ? { format } : {}),
143
+ compositions,
144
+ timelines,
145
+ };
91
146
  }
92
147
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,8 @@ export declare function openCompositionSession(options: {
28
28
  props?: unknown;
29
29
  info: CompositionSourceInfo;
30
30
  staticDiagnostics: readonly CompositionDiagnostic[];
31
+ /** Captures the document over a transparent browser background. */
32
+ transparentBackground?: boolean;
31
33
  }): Promise<CompositionSession>;
32
34
  export {};
33
35
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/renderer/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAmD,MAAM,YAAY,CAAC;AACrG,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,EACL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnF,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,EAAE,sBAAsB,EAAE,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACpD,aAAa,IAAI,IAAI,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAqBD,eAAO,MAAM,YAAY,EAAE,MAAM,EAkBhC,CAAC;AAEF,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,qBAOrC,CAAC;AAoDF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACrD,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkP9B"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/renderer/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAmD,MAAM,YAAY,CAAC;AACrG,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,EACL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnF,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,EAAE,sBAAsB,EAAE,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACpD,aAAa,IAAI,IAAI,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAqBD,eAAO,MAAM,YAAY,EAAE,MAAM,EAkBhC,CAAC;AAEF,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,qBAOrC,CAAC;AAoDF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACpD,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwP9B"}
@@ -94,6 +94,12 @@ export async function openCompositionSession(options) {
94
94
  });
95
95
  page = await context.newPage();
96
96
  page.setDefaultTimeout(60_000);
97
+ cdp = await context.newCDPSession(page);
98
+ if (options.transparentBackground) {
99
+ await cdp.send("Emulation.setDefaultBackgroundColorOverride", {
100
+ color: { r: 0, g: 0, b: 0, a: 0 },
101
+ });
102
+ }
97
103
  const pageErrors = [];
98
104
  page.on("pageerror", (error) => {
99
105
  pageErrors.push(error.message);
@@ -156,7 +162,6 @@ export async function openCompositionSession(options) {
156
162
  }));
157
163
  // Loading is complete. Frame production must not depend on new network data.
158
164
  await page.route("**/*", (route) => route.abort("blockedbyclient"));
159
- cdp = await context.newCDPSession(page);
160
165
  const activePage = page;
161
166
  const activeCdp = cdp;
162
167
  const assertHealthy = () => {