@argo-video/cli 0.1.0 → 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 (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/asset-server.d.ts +7 -0
  4. package/dist/asset-server.d.ts.map +1 -0
  5. package/dist/asset-server.js +69 -0
  6. package/dist/asset-server.js.map +1 -0
  7. package/dist/captions.d.ts +17 -0
  8. package/dist/captions.d.ts.map +1 -0
  9. package/dist/captions.js +23 -0
  10. package/dist/captions.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +87 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +49 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +76 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/export.d.ts +19 -0
  20. package/dist/export.d.ts.map +1 -0
  21. package/dist/export.js +66 -0
  22. package/dist/export.js.map +1 -0
  23. package/dist/fixtures.d.ts +13 -0
  24. package/dist/fixtures.d.ts.map +1 -0
  25. package/dist/fixtures.js +49 -0
  26. package/dist/fixtures.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/init.d.ts +2 -0
  32. package/dist/init.d.ts.map +1 -0
  33. package/{src/init.ts → dist/init.js} +39 -54
  34. package/dist/init.js.map +1 -0
  35. package/dist/narration.d.ts +32 -0
  36. package/dist/narration.d.ts.map +1 -0
  37. package/dist/narration.js +86 -0
  38. package/dist/narration.js.map +1 -0
  39. package/dist/overlays/index.d.ts +13 -0
  40. package/dist/overlays/index.d.ts.map +1 -0
  41. package/dist/overlays/index.js +45 -0
  42. package/dist/overlays/index.js.map +1 -0
  43. package/dist/overlays/manifest.d.ts +5 -0
  44. package/dist/overlays/manifest.d.ts.map +1 -0
  45. package/dist/overlays/manifest.js +52 -0
  46. package/dist/overlays/manifest.js.map +1 -0
  47. package/dist/overlays/motion.d.ts +4 -0
  48. package/dist/overlays/motion.d.ts.map +1 -0
  49. package/dist/overlays/motion.js +25 -0
  50. package/dist/overlays/motion.js.map +1 -0
  51. package/dist/overlays/templates.d.ts +8 -0
  52. package/dist/overlays/templates.d.ts.map +1 -0
  53. package/dist/overlays/templates.js +102 -0
  54. package/dist/overlays/templates.js.map +1 -0
  55. package/dist/overlays/types.d.ts +46 -0
  56. package/dist/overlays/types.d.ts.map +1 -0
  57. package/dist/overlays/types.js +25 -0
  58. package/dist/overlays/types.js.map +1 -0
  59. package/dist/overlays/zones.d.ts +23 -0
  60. package/dist/overlays/zones.d.ts.map +1 -0
  61. package/dist/overlays/zones.js +117 -0
  62. package/dist/overlays/zones.js.map +1 -0
  63. package/dist/pipeline.d.ts +3 -0
  64. package/dist/pipeline.d.ts.map +1 -0
  65. package/dist/pipeline.js +109 -0
  66. package/dist/pipeline.js.map +1 -0
  67. package/dist/record.d.ts +15 -0
  68. package/dist/record.d.ts.map +1 -0
  69. package/dist/record.js +110 -0
  70. package/dist/record.js.map +1 -0
  71. package/dist/tts/align.d.ts +26 -0
  72. package/dist/tts/align.d.ts.map +1 -0
  73. package/dist/tts/align.js +53 -0
  74. package/dist/tts/align.js.map +1 -0
  75. package/dist/tts/cache.d.ts +31 -0
  76. package/dist/tts/cache.d.ts.map +1 -0
  77. package/dist/tts/cache.js +51 -0
  78. package/dist/tts/cache.js.map +1 -0
  79. package/dist/tts/engine.d.ts +41 -0
  80. package/dist/tts/engine.d.ts.map +1 -0
  81. package/dist/tts/engine.js +108 -0
  82. package/dist/tts/engine.js.map +1 -0
  83. package/dist/tts/generate.d.ts +21 -0
  84. package/dist/tts/generate.d.ts.map +1 -0
  85. package/dist/tts/generate.js +61 -0
  86. package/dist/tts/generate.js.map +1 -0
  87. package/dist/tts/kokoro.d.ts +30 -0
  88. package/dist/tts/kokoro.d.ts.map +1 -0
  89. package/dist/tts/kokoro.js +66 -0
  90. package/dist/tts/kokoro.js.map +1 -0
  91. package/package.json +13 -1
  92. package/.claude/settings.local.json +0 -34
  93. package/DESIGN.md +0 -261
  94. package/docs/enhancement-proposal.md +0 -262
  95. package/docs/superpowers/plans/2026-03-12-argo.md +0 -208
  96. package/docs/superpowers/plans/2026-03-12-editorial-overlay-system.md +0 -1560
  97. package/docs/superpowers/plans/2026-03-13-npm-rename-skill-showcase.md +0 -499
  98. package/docs/superpowers/specs/2026-03-13-npm-rename-skill-showcase-design.md +0 -109
  99. package/skills/argo-demo-creator.md +0 -355
  100. package/src/asset-server.ts +0 -81
  101. package/src/captions.ts +0 -36
  102. package/src/cli.ts +0 -97
  103. package/src/config.ts +0 -125
  104. package/src/export.ts +0 -93
  105. package/src/fixtures.ts +0 -50
  106. package/src/index.ts +0 -41
  107. package/src/narration.ts +0 -31
  108. package/src/overlays/index.ts +0 -54
  109. package/src/overlays/manifest.ts +0 -68
  110. package/src/overlays/motion.ts +0 -27
  111. package/src/overlays/templates.ts +0 -121
  112. package/src/overlays/types.ts +0 -73
  113. package/src/overlays/zones.ts +0 -82
  114. package/src/pipeline.ts +0 -120
  115. package/src/record.ts +0 -123
  116. package/src/tts/align.ts +0 -75
  117. package/src/tts/cache.ts +0 -65
  118. package/src/tts/engine.ts +0 -147
  119. package/src/tts/generate.ts +0 -83
  120. package/src/tts/kokoro.ts +0 -51
  121. package/tests/asset-server.test.ts +0 -67
  122. package/tests/captions.test.ts +0 -76
  123. package/tests/cli.test.ts +0 -131
  124. package/tests/config.test.ts +0 -150
  125. package/tests/e2e/fake-server.ts +0 -45
  126. package/tests/e2e/record.e2e.test.ts +0 -131
  127. package/tests/export.test.ts +0 -155
  128. package/tests/fixtures.test.ts +0 -74
  129. package/tests/init.test.ts +0 -77
  130. package/tests/narration.test.ts +0 -120
  131. package/tests/overlays/index.test.ts +0 -73
  132. package/tests/overlays/manifest.test.ts +0 -120
  133. package/tests/overlays/motion.test.ts +0 -34
  134. package/tests/overlays/templates.test.ts +0 -69
  135. package/tests/overlays/types.test.ts +0 -36
  136. package/tests/overlays/zones.test.ts +0 -49
  137. package/tests/pipeline.test.ts +0 -177
  138. package/tests/record.test.ts +0 -87
  139. package/tests/tts/align.test.ts +0 -118
  140. package/tests/tts/cache.test.ts +0 -110
  141. package/tests/tts/engine.test.ts +0 -204
  142. package/tests/tts/generate.test.ts +0 -177
  143. package/tests/tts/kokoro.test.ts +0 -25
  144. package/tsconfig.json +0 -19
@@ -1,21 +1,20 @@
1
1
  import { mkdir, writeFile, access } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
-
4
- async function writeIfMissing(filePath: string, content: string): Promise<boolean> {
5
- try {
6
- await access(filePath);
7
- console.log(` skip ${filePath} (already exists)`);
8
- return false;
9
- } catch (err: any) {
10
- if (err?.code !== 'ENOENT') {
11
- throw new Error(`Cannot access ${filePath}: ${err.message}`);
3
+ async function writeIfMissing(filePath, content) {
4
+ try {
5
+ await access(filePath);
6
+ console.log(` skip ${filePath} (already exists)`);
7
+ return false;
8
+ }
9
+ catch (err) {
10
+ if (err?.code !== 'ENOENT') {
11
+ throw new Error(`Cannot access ${filePath}: ${err.message}`);
12
+ }
13
+ await writeFile(filePath, content, 'utf-8');
14
+ console.log(` create ${filePath}`);
15
+ return true;
12
16
  }
13
- await writeFile(filePath, content, 'utf-8');
14
- console.log(` create ${filePath}`);
15
- return true;
16
- }
17
17
  }
18
-
19
18
  const EXAMPLE_DEMO = `import { test } from '@argo-video/cli';
20
19
  import { showCaption, withCaption } from '@argo-video/cli';
21
20
 
@@ -34,37 +33,26 @@ test('example', async ({ page, narration }) => {
34
33
  await showCaption(page, 'done', 'All done!', 2000);
35
34
  });
36
35
  `;
37
-
38
- const EXAMPLE_VOICEOVER = JSON.stringify(
39
- [
36
+ const EXAMPLE_VOICEOVER = JSON.stringify([
40
37
  { scene: 'welcome', text: 'Welcome to our app — let me show you around.' },
41
38
  { scene: 'action', text: 'It only takes one click to get started.' },
42
39
  { scene: 'done', text: "And that's it. You're all set.", voice: 'af_heart' },
43
- ],
44
- null,
45
- 2,
46
- ) + '\n';
47
-
48
- const EXAMPLE_OVERLAYS = JSON.stringify(
49
- [
40
+ ], null, 2) + '\n';
41
+ const EXAMPLE_OVERLAYS = JSON.stringify([
50
42
  {
51
- scene: 'welcome',
52
- type: 'lower-third',
53
- text: 'Welcome to our app',
43
+ scene: 'welcome',
44
+ type: 'lower-third',
45
+ text: 'Welcome to our app',
54
46
  },
55
47
  {
56
- scene: 'action',
57
- type: 'headline-card',
58
- placement: 'top-left',
59
- title: 'One-click setup',
60
- body: 'Just press the button to get started.',
61
- motion: 'slide-in',
48
+ scene: 'action',
49
+ type: 'headline-card',
50
+ placement: 'top-left',
51
+ title: 'One-click setup',
52
+ body: 'Just press the button to get started.',
53
+ motion: 'slide-in',
62
54
  },
63
- ],
64
- null,
65
- 2,
66
- ) + '\n';
67
-
55
+ ], null, 2) + '\n';
68
56
  const ARGO_CONFIG = `export default {
69
57
  baseURL: 'http://localhost:3000',
70
58
  demosDir: 'demos/',
@@ -74,7 +62,6 @@ const ARGO_CONFIG = `export default {
74
62
  export: { preset: 'slow', crf: 16 },
75
63
  };
76
64
  `;
77
-
78
65
  const PLAYWRIGHT_CONFIG = `import { defineConfig } from '@playwright/test';
79
66
 
80
67
  export default defineConfig({
@@ -96,19 +83,17 @@ export default defineConfig({
96
83
  ],
97
84
  });
98
85
  `;
99
-
100
- export async function init(cwd: string = process.cwd()): Promise<void> {
101
- const demosDir = join(cwd, 'demos');
102
- await mkdir(demosDir, { recursive: true });
103
-
104
- await writeIfMissing(join(demosDir, 'example.demo.ts'), EXAMPLE_DEMO);
105
- await writeIfMissing(join(demosDir, 'example.voiceover.json'), EXAMPLE_VOICEOVER);
106
- await writeIfMissing(join(demosDir, 'example.overlays.json'), EXAMPLE_OVERLAYS);
107
- await writeIfMissing(join(cwd, 'argo.config.js'), ARGO_CONFIG);
108
- await writeIfMissing(join(cwd, 'playwright.config.ts'), PLAYWRIGHT_CONFIG);
109
-
110
- console.log('\nArgo initialized! Next steps:');
111
- console.log(' 1. Edit demos/example.demo.ts');
112
- console.log(' 2. Run: npx argo record example');
113
- console.log(' 3. Run: npx argo pipeline example');
86
+ export async function init(cwd = process.cwd()) {
87
+ const demosDir = join(cwd, 'demos');
88
+ await mkdir(demosDir, { recursive: true });
89
+ await writeIfMissing(join(demosDir, 'example.demo.ts'), EXAMPLE_DEMO);
90
+ await writeIfMissing(join(demosDir, 'example.voiceover.json'), EXAMPLE_VOICEOVER);
91
+ await writeIfMissing(join(demosDir, 'example.overlays.json'), EXAMPLE_OVERLAYS);
92
+ await writeIfMissing(join(cwd, 'argo.config.js'), ARGO_CONFIG);
93
+ await writeIfMissing(join(cwd, 'playwright.config.ts'), PLAYWRIGHT_CONFIG);
94
+ console.log('\nArgo initialized! Next steps:');
95
+ console.log(' 1. Edit demos/example.demo.ts');
96
+ console.log(' 2. Run: npx argo record example');
97
+ console.log(' 3. Run: npx argo pipeline example');
114
98
  }
99
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface SceneDurationOptions {
2
+ leadInMs?: number;
3
+ leadOutMs?: number;
4
+ minMs?: number;
5
+ maxMs?: number;
6
+ multiplier?: number;
7
+ fallbackMs?: number;
8
+ }
9
+ export declare class NarrationTimeline {
10
+ private timings;
11
+ private startTime;
12
+ private sceneDurations;
13
+ private cachedPlacements;
14
+ constructor(sceneDurations?: Record<string, number>);
15
+ start(): void;
16
+ mark(scene: string): void;
17
+ getTimings(): Record<string, number>;
18
+ flush(outputPath: string): Promise<void>;
19
+ private getBaseDuration;
20
+ private getPlacements;
21
+ /**
22
+ * Compute a hold duration for a scene based on its TTS clip length.
23
+ * Use for overlay durations and passive reading time — not for
24
+ * page loads, click completion, or selector readiness.
25
+ *
26
+ * When the scene has already been marked, this returns the remaining wait
27
+ * from "now", not the full scene duration. It also accounts for any audio
28
+ * backlog caused by earlier clips running long.
29
+ */
30
+ durationFor(scene: string, options?: SceneDurationOptions): number;
31
+ }
32
+ //# sourceMappingURL=narration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narration.d.ts","sourceRoot":"","sources":["../src/narration.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMnD,KAAK,IAAI,IAAI;IAMb,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWzB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI9B,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,aAAa;IAerB;;;;;;;;OAQG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM;CAmBnE"}
@@ -0,0 +1,86 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { schedulePlacements } from './tts/align.js';
4
+ export class NarrationTimeline {
5
+ timings = new Map();
6
+ startTime = null;
7
+ sceneDurations = {};
8
+ cachedPlacements = null;
9
+ constructor(sceneDurations) {
10
+ if (sceneDurations) {
11
+ this.sceneDurations = sceneDurations;
12
+ }
13
+ }
14
+ start() {
15
+ this.startTime = Date.now();
16
+ this.timings = new Map();
17
+ this.cachedPlacements = null;
18
+ }
19
+ mark(scene) {
20
+ if (this.startTime === null) {
21
+ throw new Error('Cannot mark before start() has been called');
22
+ }
23
+ if (this.timings.has(scene)) {
24
+ throw new Error(`Duplicate scene name: "${scene}"`);
25
+ }
26
+ this.timings.set(scene, Date.now() - this.startTime);
27
+ this.cachedPlacements = null;
28
+ }
29
+ getTimings() {
30
+ return Object.fromEntries(this.timings);
31
+ }
32
+ async flush(outputPath) {
33
+ await mkdir(dirname(outputPath), { recursive: true });
34
+ await writeFile(outputPath, JSON.stringify(this.getTimings(), null, 2), 'utf-8');
35
+ }
36
+ getBaseDuration(scene, options) {
37
+ const clipMs = this.sceneDurations[scene];
38
+ const fallback = options?.fallbackMs ?? 3000;
39
+ if (clipMs === undefined)
40
+ return fallback;
41
+ const raw = clipMs * (options?.multiplier ?? 1)
42
+ + (options?.leadInMs ?? 200)
43
+ + (options?.leadOutMs ?? 400);
44
+ const min = options?.minMs ?? 2200;
45
+ const max = options?.maxMs ?? 8000;
46
+ return Math.max(min, Math.min(max, raw));
47
+ }
48
+ getPlacements() {
49
+ if (this.cachedPlacements)
50
+ return this.cachedPlacements;
51
+ const scheduledScenes = Array.from(this.timings.entries())
52
+ .filter(([name]) => this.sceneDurations[name] !== undefined)
53
+ .map(([name, startMs]) => ({
54
+ scene: name,
55
+ startMs,
56
+ durationMs: this.sceneDurations[name],
57
+ }));
58
+ this.cachedPlacements = schedulePlacements(scheduledScenes);
59
+ return this.cachedPlacements;
60
+ }
61
+ /**
62
+ * Compute a hold duration for a scene based on its TTS clip length.
63
+ * Use for overlay durations and passive reading time — not for
64
+ * page loads, click completion, or selector readiness.
65
+ *
66
+ * When the scene has already been marked, this returns the remaining wait
67
+ * from "now", not the full scene duration. It also accounts for any audio
68
+ * backlog caused by earlier clips running long.
69
+ */
70
+ durationFor(scene, options) {
71
+ const baseDurationMs = this.getBaseDuration(scene, options);
72
+ if (this.startTime === null)
73
+ return baseDurationMs;
74
+ const markMs = this.timings.get(scene);
75
+ if (markMs === undefined)
76
+ return baseDurationMs;
77
+ const placement = this.getPlacements().find((p) => p.scene === scene);
78
+ if (!placement)
79
+ return baseDurationMs;
80
+ const leadOutMs = options?.leadOutMs ?? 400;
81
+ const desiredEndMs = Math.max(markMs + baseDurationMs, placement.endMs + leadOutMs);
82
+ const nowMs = Math.max(0, Date.now() - this.startTime);
83
+ return Math.max(0, Math.ceil(desiredEndMs - nowMs));
84
+ }
85
+ }
86
+ //# sourceMappingURL=narration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narration.js","sourceRoot":"","sources":["../src/narration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Page } from '@playwright/test';
2
+ import type { OverlayCue, Zone } from './types.js';
3
+ export type { OverlayCue, OverlayManifestEntry, Zone, TemplateType, MotionPreset } from './types.js';
4
+ export { renderTemplate } from './templates.js';
5
+ export type { BackgroundTheme } from './zones.js';
6
+ export declare function showOverlay(page: Page, _scene: string, cue: OverlayCue, durationMs: number, options?: {
7
+ autoBackground?: boolean;
8
+ }): Promise<void>;
9
+ export declare function hideOverlay(page: Page, zone?: Zone): Promise<void>;
10
+ export declare function withOverlay(page: Page, _scene: string, cue: OverlayCue, action: () => Promise<void>, options?: {
11
+ autoBackground?: boolean;
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/overlays/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMnD,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiBlD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,IAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,45 @@
1
+ import { injectIntoZone, removeZone, ZONE_ID_PREFIX, detectBackgroundTheme } from './zones.js';
2
+ import { renderTemplate } from './templates.js';
3
+ import { getMotionCSS, getMotionStyles } from './motion.js';
4
+ export { renderTemplate } from './templates.js';
5
+ function getConfigAutoBackground() {
6
+ return process.env.ARGO_AUTO_BACKGROUND === '1';
7
+ }
8
+ async function resolveTheme(page, cue, zone, optionsAutoBackground) {
9
+ const shouldDetect = cue.autoBackground ?? optionsAutoBackground ?? getConfigAutoBackground();
10
+ if (!shouldDetect)
11
+ return 'dark';
12
+ return detectBackgroundTheme(page, zone);
13
+ }
14
+ export async function showOverlay(page, _scene, cue, durationMs, options) {
15
+ const zone = cue.placement ?? 'bottom-center';
16
+ const motion = cue.motion ?? 'none';
17
+ const theme = await resolveTheme(page, cue, zone, options?.autoBackground);
18
+ const { contentHtml, styles } = renderTemplate(cue, theme);
19
+ const zoneId = ZONE_ID_PREFIX + zone;
20
+ const motionCSS = getMotionCSS(motion, zoneId);
21
+ const motionStyles = getMotionStyles(motion, zoneId);
22
+ await injectIntoZone(page, zone, contentHtml, { ...styles, ...motionStyles }, motionCSS);
23
+ await page.waitForTimeout(durationMs);
24
+ await removeZone(page, zone);
25
+ }
26
+ export async function hideOverlay(page, zone = 'bottom-center') {
27
+ await removeZone(page, zone);
28
+ }
29
+ export async function withOverlay(page, _scene, cue, action, options) {
30
+ const zone = cue.placement ?? 'bottom-center';
31
+ const motion = cue.motion ?? 'none';
32
+ const theme = await resolveTheme(page, cue, zone, options?.autoBackground);
33
+ const { contentHtml, styles } = renderTemplate(cue, theme);
34
+ const zoneId = ZONE_ID_PREFIX + zone;
35
+ const motionCSS = getMotionCSS(motion, zoneId);
36
+ const motionStyles = getMotionStyles(motion, zoneId);
37
+ await injectIntoZone(page, zone, contentHtml, { ...styles, ...motionStyles }, motionCSS);
38
+ try {
39
+ await action();
40
+ }
41
+ finally {
42
+ await removeZone(page, zone);
43
+ }
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/overlays/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { OverlayManifestEntry } from './types.js';
2
+ export declare function loadOverlayManifest(manifestPath: string): Promise<OverlayManifestEntry[] | null>;
3
+ export declare function hasImageAssets(entries: OverlayManifestEntry[]): boolean;
4
+ export declare function resolveAssetURLs(entries: OverlayManifestEntry[], assetBaseURL: string): OverlayManifestEntry[];
5
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/overlays/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CA4CxC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAEvE;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,oBAAoB,EAAE,CAOxB"}
@@ -0,0 +1,52 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { isValidTemplateType, isValidZone, isValidMotion } from './types.js';
4
+ export async function loadOverlayManifest(manifestPath) {
5
+ if (!existsSync(manifestPath))
6
+ return null;
7
+ const raw = await readFile(manifestPath, 'utf-8');
8
+ let parsed;
9
+ try {
10
+ parsed = JSON.parse(raw);
11
+ }
12
+ catch (err) {
13
+ throw new Error(`Failed to parse overlay manifest ${manifestPath}: ${err.message}`);
14
+ }
15
+ if (!Array.isArray(parsed)) {
16
+ throw new Error(`Overlay manifest ${manifestPath} must contain a JSON array`);
17
+ }
18
+ const entries = [];
19
+ for (let i = 0; i < parsed.length; i++) {
20
+ const entry = parsed[i];
21
+ const prefix = `Overlay manifest entry ${i}`;
22
+ if (!entry.scene || typeof entry.scene !== 'string') {
23
+ throw new Error(`${prefix}: missing required field "scene"`);
24
+ }
25
+ if (!entry.type || typeof entry.type !== 'string') {
26
+ throw new Error(`${prefix}: missing required field "type"`);
27
+ }
28
+ if (!isValidTemplateType(entry.type)) {
29
+ throw new Error(`${prefix}: unknown overlay type "${entry.type}"`);
30
+ }
31
+ if (entry.placement && !isValidZone(entry.placement)) {
32
+ throw new Error(`${prefix}: unknown placement "${entry.placement}"`);
33
+ }
34
+ if (entry.motion && !isValidMotion(entry.motion)) {
35
+ throw new Error(`${prefix}: unknown motion "${entry.motion}"`);
36
+ }
37
+ entries.push(entry);
38
+ }
39
+ return entries;
40
+ }
41
+ export function hasImageAssets(entries) {
42
+ return entries.some((e) => e.type === 'image-card');
43
+ }
44
+ export function resolveAssetURLs(entries, assetBaseURL) {
45
+ return entries.map((e) => {
46
+ if (e.type === 'image-card' && e.src && !e.src.startsWith('http')) {
47
+ return { ...e, src: `${assetBaseURL}/${e.src.replace(/^assets\//, '')}` };
48
+ }
49
+ return e;
50
+ });
51
+ }
52
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/overlays/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MotionPreset } from './types.js';
2
+ export declare function getMotionCSS(motion: MotionPreset, elementId: string): string;
3
+ export declare function getMotionStyles(motion: MotionPreset, elementId: string): Record<string, string>;
4
+ //# sourceMappingURL=motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../../src/overlays/motion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW/F"}
@@ -0,0 +1,25 @@
1
+ export function getMotionCSS(motion, elementId) {
2
+ const animName = `argo-${motion}-${elementId}`;
3
+ switch (motion) {
4
+ case 'fade-in':
5
+ return `@keyframes ${animName} { from { opacity: 0; } to { opacity: 1; } }`;
6
+ case 'slide-in':
7
+ return `@keyframes ${animName} { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } }`;
8
+ case 'none':
9
+ default:
10
+ return '';
11
+ }
12
+ }
13
+ export function getMotionStyles(motion, elementId) {
14
+ const animName = `argo-${motion}-${elementId}`;
15
+ switch (motion) {
16
+ case 'fade-in':
17
+ return { animation: `${animName} 300ms ease-out forwards` };
18
+ case 'slide-in':
19
+ return { animation: `${animName} 400ms ease-out forwards` };
20
+ case 'none':
21
+ default:
22
+ return {};
23
+ }
24
+ }
25
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","sourceRoot":"","sources":["../../src/overlays/motion.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,SAAiB;IAClE,MAAM,QAAQ,GAAG,QAAQ,MAAM,IAAI,SAAS,EAAE,CAAC;IAC/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,cAAc,QAAQ,8CAA8C,CAAC;QAC9E,KAAK,UAAU;YACb,OAAO,cAAc,QAAQ,sGAAsG,CAAC;QACtI,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB,EAAE,SAAiB;IACrE,MAAM,QAAQ,GAAG,QAAQ,MAAM,IAAI,SAAS,EAAE,CAAC;IAC/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,0BAA0B,EAAE,CAAC;QAC9D,KAAK,UAAU;YACb,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,0BAA0B,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { OverlayCue } from './types.js';
2
+ import type { BackgroundTheme } from './zones.js';
3
+ export interface TemplateResult {
4
+ contentHtml: string;
5
+ styles: Record<string, string>;
6
+ }
7
+ export declare function renderTemplate(cue: OverlayCue, theme?: BackgroundTheme): TemplateResult;
8
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/overlays/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AA4GD,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,GAAE,eAAwB,GAAG,cAAc,CAW/F"}
@@ -0,0 +1,102 @@
1
+ function escapeHtml(str) {
2
+ return str
3
+ .replace(/&/g, '&amp;')
4
+ .replace(/</g, '&lt;')
5
+ .replace(/>/g, '&gt;')
6
+ .replace(/"/g, '&quot;');
7
+ }
8
+ function lowerThird(text, theme) {
9
+ const isDark = theme === 'dark';
10
+ return {
11
+ contentHtml: `<span>${escapeHtml(text)}</span>`,
12
+ styles: {
13
+ background: isDark ? 'rgba(0, 0, 0, 0.85)' : 'rgba(255, 255, 255, 0.9)',
14
+ color: isDark ? '#fff' : '#1a1a1a',
15
+ padding: '16px 32px',
16
+ borderRadius: '12px',
17
+ fontSize: '28px',
18
+ fontWeight: '500',
19
+ textAlign: 'center',
20
+ maxWidth: '80vw',
21
+ letterSpacing: '0.01em',
22
+ lineHeight: '1.4',
23
+ boxShadow: isDark ? '0 4px 24px rgba(0, 0, 0, 0.3)' : '0 4px 24px rgba(0, 0, 0, 0.12)',
24
+ },
25
+ };
26
+ }
27
+ function headlineCard(title, theme, kicker, body) {
28
+ const isDark = theme === 'dark';
29
+ const parts = [];
30
+ if (kicker) {
31
+ parts.push(`<div style="font-size:12px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:${isDark ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.5)'};margin-bottom:8px">${escapeHtml(kicker)}</div>`);
32
+ }
33
+ parts.push(`<div style="font-size:26px;font-weight:700;line-height:1.25;color:${isDark ? '#fff' : '#1a1a1a'}">${escapeHtml(title)}</div>`);
34
+ if (body) {
35
+ parts.push(`<div style="font-size:16px;line-height:1.5;color:${isDark ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.7)'};margin-top:8px">${escapeHtml(body)}</div>`);
36
+ }
37
+ return {
38
+ contentHtml: parts.join(''),
39
+ styles: {
40
+ background: isDark ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)',
41
+ backdropFilter: 'blur(16px)',
42
+ WebkitBackdropFilter: 'blur(16px)',
43
+ padding: '24px 28px',
44
+ borderRadius: '16px',
45
+ maxWidth: '420px',
46
+ boxShadow: isDark ? '0 8px 32px rgba(0, 0, 0, 0.4)' : '0 8px 32px rgba(0, 0, 0, 0.1)',
47
+ },
48
+ };
49
+ }
50
+ function callout(text, theme) {
51
+ const isDark = theme === 'dark';
52
+ return {
53
+ contentHtml: `<span>${escapeHtml(text)}</span>`,
54
+ styles: {
55
+ background: isDark ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.9)',
56
+ color: isDark ? '#fff' : '#1a1a1a',
57
+ padding: '10px 18px',
58
+ borderRadius: '20px',
59
+ fontSize: '16px',
60
+ fontWeight: '500',
61
+ lineHeight: '1.3',
62
+ maxWidth: '300px',
63
+ boxShadow: isDark ? '0 2px 12px rgba(0, 0, 0, 0.3)' : '0 2px 12px rgba(0, 0, 0, 0.1)',
64
+ },
65
+ };
66
+ }
67
+ function imageCard(src, theme, title, body) {
68
+ const isDark = theme === 'dark';
69
+ const parts = [];
70
+ parts.push(`<img src="${escapeHtml(src)}" style="max-width:100%;border-radius:8px;display:block" />`);
71
+ if (title) {
72
+ parts.push(`<div style="font-size:18px;font-weight:600;color:${isDark ? '#fff' : '#1a1a1a'};margin-top:12px">${escapeHtml(title)}</div>`);
73
+ }
74
+ if (body) {
75
+ parts.push(`<div style="font-size:14px;color:${isDark ? 'rgba(255,255,255,0.8)' : 'rgba(0,0,0,0.7)'};margin-top:4px;line-height:1.4">${escapeHtml(body)}</div>`);
76
+ }
77
+ return {
78
+ contentHtml: parts.join(''),
79
+ styles: {
80
+ background: isDark ? 'rgba(0, 0, 0, 0.75)' : 'rgba(255, 255, 255, 0.85)',
81
+ backdropFilter: 'blur(12px)',
82
+ WebkitBackdropFilter: 'blur(12px)',
83
+ padding: '16px',
84
+ borderRadius: '14px',
85
+ maxWidth: '360px',
86
+ boxShadow: isDark ? '0 6px 24px rgba(0, 0, 0, 0.4)' : '0 6px 24px rgba(0, 0, 0, 0.1)',
87
+ },
88
+ };
89
+ }
90
+ export function renderTemplate(cue, theme = 'dark') {
91
+ switch (cue.type) {
92
+ case 'lower-third':
93
+ return lowerThird(cue.text, theme);
94
+ case 'headline-card':
95
+ return headlineCard(cue.title, theme, cue.kicker, cue.body);
96
+ case 'callout':
97
+ return callout(cue.text, theme);
98
+ case 'image-card':
99
+ return imageCard(cue.src, theme, cue.title, cue.body);
100
+ }
101
+ }
102
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/overlays/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const ZONES: readonly ["bottom-center", "top-left", "top-right", "bottom-left", "bottom-right", "center"];
2
+ export type Zone = (typeof ZONES)[number];
3
+ export declare const TEMPLATE_TYPES: readonly ["lower-third", "headline-card", "callout", "image-card"];
4
+ export type TemplateType = (typeof TEMPLATE_TYPES)[number];
5
+ export declare const MOTIONS: readonly ["none", "fade-in", "slide-in"];
6
+ export type MotionPreset = (typeof MOTIONS)[number];
7
+ export interface LowerThirdCue {
8
+ type: 'lower-third';
9
+ text: string;
10
+ placement?: Zone;
11
+ motion?: MotionPreset;
12
+ autoBackground?: boolean;
13
+ }
14
+ export interface HeadlineCardCue {
15
+ type: 'headline-card';
16
+ title: string;
17
+ kicker?: string;
18
+ body?: string;
19
+ placement?: Zone;
20
+ motion?: MotionPreset;
21
+ autoBackground?: boolean;
22
+ }
23
+ export interface CalloutCue {
24
+ type: 'callout';
25
+ text: string;
26
+ placement?: Zone;
27
+ motion?: MotionPreset;
28
+ autoBackground?: boolean;
29
+ }
30
+ export interface ImageCardCue {
31
+ type: 'image-card';
32
+ src: string;
33
+ title?: string;
34
+ body?: string;
35
+ placement?: Zone;
36
+ motion?: MotionPreset;
37
+ autoBackground?: boolean;
38
+ }
39
+ export type OverlayCue = LowerThirdCue | HeadlineCardCue | CalloutCue | ImageCardCue;
40
+ export type OverlayManifestEntry = OverlayCue & {
41
+ scene: string;
42
+ };
43
+ export declare function isValidZone(value: string): value is Zone;
44
+ export declare function isValidTemplateType(value: string): value is TemplateType;
45
+ export declare function isValidMotion(value: string): value is MotionPreset;
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/overlays/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,8FAOR,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C,eAAO,MAAM,cAAc,oEAKjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,OAAO,0CAA2C,CAAC;AAEhE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAErF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,CAExD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAExE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAElE"}