@vibeframe/cli 0.53.0 → 0.55.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 (46) hide show
  1. package/dist/commands/_shared/scene-audio-mux.d.ts +75 -0
  2. package/dist/commands/_shared/scene-audio-mux.d.ts.map +1 -0
  3. package/dist/commands/_shared/scene-audio-mux.js +159 -0
  4. package/dist/commands/_shared/scene-audio-mux.js.map +1 -0
  5. package/dist/commands/_shared/scene-audio-mux.test.d.ts +7 -0
  6. package/dist/commands/_shared/scene-audio-mux.test.d.ts.map +1 -0
  7. package/dist/commands/_shared/scene-audio-mux.test.js +94 -0
  8. package/dist/commands/_shared/scene-audio-mux.test.js.map +1 -0
  9. package/dist/commands/_shared/scene-audio-scan.d.ts +94 -0
  10. package/dist/commands/_shared/scene-audio-scan.d.ts.map +1 -0
  11. package/dist/commands/_shared/scene-audio-scan.js +144 -0
  12. package/dist/commands/_shared/scene-audio-scan.js.map +1 -0
  13. package/dist/commands/_shared/scene-audio-scan.test.d.ts +6 -0
  14. package/dist/commands/_shared/scene-audio-scan.test.d.ts.map +1 -0
  15. package/dist/commands/_shared/scene-audio-scan.test.js +190 -0
  16. package/dist/commands/_shared/scene-audio-scan.test.js.map +1 -0
  17. package/dist/commands/_shared/scene-html-emit.d.ts +35 -0
  18. package/dist/commands/_shared/scene-html-emit.d.ts.map +1 -1
  19. package/dist/commands/_shared/scene-html-emit.js +85 -16
  20. package/dist/commands/_shared/scene-html-emit.js.map +1 -1
  21. package/dist/commands/_shared/scene-html-emit.test.js +194 -1
  22. package/dist/commands/_shared/scene-html-emit.test.js.map +1 -1
  23. package/dist/commands/_shared/scene-project.d.ts +1 -1
  24. package/dist/commands/_shared/scene-project.d.ts.map +1 -1
  25. package/dist/commands/_shared/scene-render.d.ts +6 -0
  26. package/dist/commands/_shared/scene-render.d.ts.map +1 -1
  27. package/dist/commands/_shared/scene-render.js +41 -1
  28. package/dist/commands/_shared/scene-render.js.map +1 -1
  29. package/dist/commands/_shared/tts-resolve.d.ts +75 -0
  30. package/dist/commands/_shared/tts-resolve.d.ts.map +1 -0
  31. package/dist/commands/_shared/tts-resolve.js +89 -0
  32. package/dist/commands/_shared/tts-resolve.js.map +1 -0
  33. package/dist/commands/_shared/tts-resolve.test.d.ts +6 -0
  34. package/dist/commands/_shared/tts-resolve.test.d.ts.map +1 -0
  35. package/dist/commands/_shared/tts-resolve.test.js +147 -0
  36. package/dist/commands/_shared/tts-resolve.test.js.map +1 -0
  37. package/dist/commands/scene.d.ts +27 -1
  38. package/dist/commands/scene.d.ts.map +1 -1
  39. package/dist/commands/scene.js +120 -13
  40. package/dist/commands/scene.js.map +1 -1
  41. package/dist/commands/scene.test.js +87 -1
  42. package/dist/commands/scene.test.js.map +1 -1
  43. package/dist/utils/provider-resolver.d.ts.map +1 -1
  44. package/dist/utils/provider-resolver.js +6 -2
  45. package/dist/utils/provider-resolver.js.map +1 -1
  46. package/package.json +3 -3
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Unit tests for scene-audio-scan. Pure parsing — no fs touches via the
3
+ * injected `readComposition` reader.
4
+ */
5
+ import { describe, expect, it } from "vitest";
6
+ import { parseRootClips, parseSceneAudios, scanSceneAudio, } from "./scene-audio-scan.js";
7
+ describe("parseRootClips", () => {
8
+ it("returns one entry per <div class=\"clip\"> with all four attrs", () => {
9
+ const html = `
10
+ <div id="root" data-composition-id="main" data-start="0" data-duration="10">
11
+ <div class="clip" data-composition-id="intro" data-composition-src="compositions/scene-intro.html" data-start="0" data-duration="3" data-track-index="1"></div>
12
+ <div class="clip" data-composition-id="outro" data-composition-src="compositions/scene-outro.html" data-start="3" data-duration="4" data-track-index="1"></div>
13
+ </div>`;
14
+ const clips = parseRootClips(html);
15
+ expect(clips).toEqual([
16
+ {
17
+ compositionId: "intro",
18
+ compositionSrc: "compositions/scene-intro.html",
19
+ start: 0,
20
+ duration: 3,
21
+ trackIndex: 1,
22
+ },
23
+ {
24
+ compositionId: "outro",
25
+ compositionSrc: "compositions/scene-outro.html",
26
+ start: 3,
27
+ duration: 4,
28
+ trackIndex: 1,
29
+ },
30
+ ]);
31
+ });
32
+ it("ignores divs without class=\"clip\"", () => {
33
+ const html = `<div class="backdrop" data-composition-id="x" data-start="0" data-duration="1"></div>`;
34
+ expect(parseRootClips(html)).toEqual([]);
35
+ });
36
+ it("skips clips missing required attributes", () => {
37
+ const html = `<div class="clip" data-start="0" data-duration="3"></div>`; // no composition-id/src
38
+ expect(parseRootClips(html)).toEqual([]);
39
+ });
40
+ it("defaults trackIndex to 1 when absent", () => {
41
+ const html = `<div class="clip" data-composition-id="x" data-composition-src="x.html" data-start="0" data-duration="2"></div>`;
42
+ expect(parseRootClips(html)[0].trackIndex).toBe(1);
43
+ });
44
+ it("tolerates attribute order and whitespace", () => {
45
+ const html = `<div data-start="2" class="clip"
46
+ data-duration="5"
47
+ data-composition-id="mid"
48
+ data-composition-src="compositions/mid.html"></div>`;
49
+ expect(parseRootClips(html)).toHaveLength(1);
50
+ expect(parseRootClips(html)[0]).toMatchObject({
51
+ compositionId: "mid",
52
+ start: 2,
53
+ duration: 5,
54
+ });
55
+ });
56
+ });
57
+ describe("parseSceneAudios", () => {
58
+ it("extracts narration audio with all attributes", () => {
59
+ const html = `
60
+ <template id="scene-intro-template">
61
+ <div data-composition-id="intro" data-start="0" data-duration="5">
62
+ <audio
63
+ id="narration"
64
+ data-start="0"
65
+ data-duration="auto"
66
+ data-track-index="2"
67
+ src="assets/narration-intro.wav"
68
+ data-volume="1"
69
+ ></audio>
70
+ </div>
71
+ </template>`;
72
+ const audios = parseSceneAudios(html);
73
+ expect(audios).toEqual([
74
+ {
75
+ srcRel: "assets/narration-intro.wav",
76
+ localStart: 0,
77
+ durationHint: "auto",
78
+ volume: 1,
79
+ trackIndex: 2,
80
+ },
81
+ ]);
82
+ });
83
+ it("treats numeric data-duration as a hard duration", () => {
84
+ const html = `<audio src="x.mp3" data-start="1.5" data-duration="3.2" data-volume="0.6"></audio>`;
85
+ expect(parseSceneAudios(html)[0]).toMatchObject({
86
+ localStart: 1.5,
87
+ durationHint: 3.2,
88
+ volume: 0.6,
89
+ });
90
+ });
91
+ it("defaults volume to 1 and trackIndex to 2 when absent", () => {
92
+ const html = `<audio src="x.wav" data-start="0"></audio>`;
93
+ const audios = parseSceneAudios(html);
94
+ expect(audios[0]).toMatchObject({ volume: 1, trackIndex: 2, durationHint: "auto" });
95
+ });
96
+ it("ignores audio without src", () => {
97
+ const html = `<audio data-start="0" data-duration="auto"></audio>`;
98
+ expect(parseSceneAudios(html)).toEqual([]);
99
+ });
100
+ it("supports multiple audios in one composition (narration + music)", () => {
101
+ const html = `
102
+ <audio src="assets/narration-1.wav" data-start="0" data-duration="auto" data-track-index="2"></audio>
103
+ <audio src="assets/music.mp3" data-start="0" data-duration="auto" data-track-index="3" data-volume="0.4"></audio>`;
104
+ const audios = parseSceneAudios(html);
105
+ expect(audios).toHaveLength(2);
106
+ expect(audios[0].trackIndex).toBe(2);
107
+ expect(audios[1]).toMatchObject({ trackIndex: 3, volume: 0.4 });
108
+ });
109
+ });
110
+ describe("scanSceneAudio (top-level)", () => {
111
+ const rootHtml = `
112
+ <div id="root">
113
+ <div class="clip" data-composition-id="intro" data-composition-src="compositions/scene-intro.html" data-start="0" data-duration="3" data-track-index="1"></div>
114
+ <div class="clip" data-composition-id="outro" data-composition-src="compositions/scene-outro.html" data-start="3" data-duration="4" data-track-index="1"></div>
115
+ </div>`;
116
+ const introHtml = `
117
+ <audio src="assets/narration-intro.wav" data-start="0" data-duration="auto" data-track-index="2"></audio>`;
118
+ const outroHtml = `
119
+ <audio src="assets/narration-outro.wav" data-start="0.5" data-duration="auto" data-track-index="2" data-volume="0.8"></audio>`;
120
+ const reader = async (path) => {
121
+ if (path === "compositions/scene-intro.html")
122
+ return introHtml;
123
+ if (path === "compositions/scene-outro.html")
124
+ return outroHtml;
125
+ return null;
126
+ };
127
+ it("walks every clip and resolves absolute timing", async () => {
128
+ const result = await scanSceneAudio({
129
+ projectDir: "/tmp/proj",
130
+ rootHtml,
131
+ readComposition: reader,
132
+ });
133
+ expect(result).toEqual([
134
+ {
135
+ srcRel: "assets/narration-intro.wav",
136
+ srcAbs: "/tmp/proj/assets/narration-intro.wav",
137
+ absoluteStart: 0,
138
+ durationHint: "auto",
139
+ clipDurationCap: 3,
140
+ volume: 1,
141
+ trackIndex: 2,
142
+ compositionSrc: "compositions/scene-intro.html",
143
+ },
144
+ {
145
+ srcRel: "assets/narration-outro.wav",
146
+ srcAbs: "/tmp/proj/assets/narration-outro.wav",
147
+ absoluteStart: 3.5,
148
+ durationHint: "auto",
149
+ clipDurationCap: 3.5, // 4 - 0.5 (audio.localStart)
150
+ volume: 0.8,
151
+ trackIndex: 2,
152
+ compositionSrc: "compositions/scene-outro.html",
153
+ },
154
+ ]);
155
+ });
156
+ it("skips clips whose composition file is missing", async () => {
157
+ const sparseReader = async (p) => p === "compositions/scene-intro.html" ? introHtml : null;
158
+ const result = await scanSceneAudio({
159
+ projectDir: "/tmp/proj",
160
+ rootHtml,
161
+ readComposition: sparseReader,
162
+ });
163
+ expect(result).toHaveLength(1);
164
+ expect(result[0].srcRel).toBe("assets/narration-intro.wav");
165
+ });
166
+ it("skips clips with no <audio> elements", async () => {
167
+ const silentReader = async () => `<div data-composition-id="x"></div>`;
168
+ const result = await scanSceneAudio({
169
+ projectDir: "/tmp/proj",
170
+ rootHtml,
171
+ readComposition: silentReader,
172
+ });
173
+ expect(result).toEqual([]);
174
+ });
175
+ it("returns audios sorted by absolute start", async () => {
176
+ const reorderedRoot = `
177
+ <div class="clip" data-composition-id="b" data-composition-src="b.html" data-start="5" data-duration="2"></div>
178
+ <div class="clip" data-composition-id="a" data-composition-src="a.html" data-start="0" data-duration="3"></div>`;
179
+ const r = async (p) => p === "a.html" || p === "b.html"
180
+ ? `<audio src="x.wav" data-start="0"></audio>`
181
+ : null;
182
+ const result = await scanSceneAudio({
183
+ projectDir: "/p",
184
+ rootHtml: reorderedRoot,
185
+ readComposition: r,
186
+ });
187
+ expect(result.map((r) => r.absoluteStart)).toEqual([0, 5]);
188
+ });
189
+ });
190
+ //# sourceMappingURL=scene-audio-scan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-audio-scan.test.js","sourceRoot":"","sources":["../../../src/commands/_shared/scene-audio-scan.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG;;;;OAIV,CAAC;QACJ,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB;gBACE,aAAa,EAAE,OAAO;gBACtB,cAAc,EAAE,+BAA+B;gBAC/C,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;aACd;YACD;gBACE,aAAa,EAAE,OAAO;gBACtB,cAAc,EAAE,+BAA+B;gBAC/C,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;aACd;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,uFAAuF,CAAC;QACrG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,2DAA2D,CAAC,CAAC,wBAAwB;QAClG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,iHAAiH,CAAC;QAC/H,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG;;;4DAG2C,CAAC;QACzD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC5C,aAAa,EAAE,KAAK;YACpB,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG;;;;;;;;;;;;YAYL,CAAC;QACT,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB;gBACE,MAAM,EAAE,4BAA4B;gBACpC,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,MAAM;gBACpB,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;aACd;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,oFAAoF,CAAC;QAClG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9C,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,GAAG;YACjB,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,4CAA4C,CAAC;QAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,qDAAqD,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG;;kHAEiG,CAAC;QAC/G,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,MAAM,QAAQ,GAAG;;;;OAIZ,CAAC;IAEN,MAAM,SAAS,GAAG;0GACsF,CAAC;IACzG,MAAM,SAAS,GAAG;8HAC0G,CAAC;IAE7H,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;QAC5D,IAAI,IAAI,KAAK,+BAA+B;YAAE,OAAO,SAAS,CAAC;QAC/D,IAAI,IAAI,KAAK,+BAA+B;YAAE,OAAO,SAAS,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,UAAU,EAAE,WAAW;YACvB,QAAQ;YACR,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB;gBACE,MAAM,EAAE,4BAA4B;gBACpC,MAAM,EAAE,sCAAsC;gBAC9C,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,MAAM;gBACpB,eAAe,EAAE,CAAC;gBAClB,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,+BAA+B;aAChD;YACD;gBACE,MAAM,EAAE,4BAA4B;gBACpC,MAAM,EAAE,sCAAsC;gBAC9C,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,MAAM;gBACpB,eAAe,EAAE,GAAG,EAAE,6BAA6B;gBACnD,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,+BAA+B;aAChD;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,YAAY,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE,CACvC,CAAC,KAAK,+BAA+B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,UAAU,EAAE,WAAW;YACvB,QAAQ;YACR,eAAe,EAAE,YAAY;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE,CAC9B,qCAAqC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,UAAU,EAAE,WAAW;YACvB,QAAQ;YACR,eAAe,EAAE,YAAY;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,aAAa,GAAG;;gHAEsF,CAAC;QAC7G,MAAM,CAAC,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE,CAC5B,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;YAC9B,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,aAAa;YACvB,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -17,6 +17,16 @@
17
17
  */
18
18
  export type ScenePreset = "simple" | "announcement" | "explainer" | "kinetic-type" | "product-shot";
19
19
  export declare const SCENE_PRESETS: readonly ScenePreset[];
20
+ /**
21
+ * One word from a Whisper word-level transcript. Mirrors
22
+ * {@link import("@vibeframe/ai-providers").TranscriptWord} but is duplicated
23
+ * here so this module stays pure (no provider package import).
24
+ */
25
+ export interface SceneTranscriptWord {
26
+ text: string;
27
+ start: number;
28
+ end: number;
29
+ }
20
30
  export interface EmitSceneInput {
21
31
  /** Kebab-case scene id; appears in `data-composition-id` and template id. */
22
32
  id: string;
@@ -37,12 +47,37 @@ export interface EmitSceneInput {
37
47
  imagePath?: string;
38
48
  /** Project-relative narration audio path (e.g. "assets/narration-intro.mp3"). */
39
49
  audioPath?: string;
50
+ /**
51
+ * Word-level timings (Whisper output) for narration sync. When supplied, the
52
+ * `simple`, `explainer`, and `kinetic-type` presets render each word as its
53
+ * own `<span class="word">` and animate them at their absolute audio start
54
+ * times via GSAP. `announcement` and `product-shot` ignore this field —
55
+ * their headlines are intentionally static.
56
+ */
57
+ transcript?: SceneTranscriptWord[];
40
58
  }
41
59
  /**
42
60
  * Slugify a free-form scene name to a kebab-case id usable in HTML attributes
43
61
  * and filenames. Strips diacritics, collapses whitespace, lowercases.
44
62
  */
45
63
  export declare function slugifySceneName(name: string): string;
64
+ /**
65
+ * Render a transcript as `<span class="word" data-i="N">…</span>` markup,
66
+ * separated by literal whitespace so kerning and wrapping behave naturally.
67
+ * Returns the empty string when there's nothing to render.
68
+ */
69
+ export declare function renderTranscriptSpans(transcript: SceneTranscriptWord[]): string;
70
+ /**
71
+ * Build absolute-timing GSAP tweens that fade each transcript word in at its
72
+ * narration `start` time. The `targetSelector` parametrises the scope so the
73
+ * same routine can drive `simple` (`.caption .word`), `explainer`
74
+ * (`#subtitle .word`), or `kinetic-type` (`.kinetic .word`).
75
+ *
76
+ * Each tween is `tl.fromTo(sel, {opacity:0,y:10}, {opacity:1,y:0,duration:0.18}, start)`
77
+ * — short enough to feel responsive at any speech rate, long enough to avoid
78
+ * popping at 30fps. Words clamp to non-negative starts.
79
+ */
80
+ export declare function buildTranscriptTweens(transcript: SceneTranscriptWord[], targetSelector: string): string;
46
81
  /**
47
82
  * Emit the full per-scene HTML. Returns a complete `<template>`-wrapped
48
83
  * composition ready to write to `compositions/scene-<id>.html`.
@@ -1 +1 @@
1
- {"version":3,"file":"scene-html-emit.d.ts","sourceRoot":"","sources":["../../../src/commands/_shared/scene-html-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,cAAc,GACd,WAAW,GACX,cAAc,GACd,cAAc,CAAC;AAEnB,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAMtC,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAmND;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2C3D;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAiCrF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvF"}
1
+ {"version":3,"file":"scene-html-emit.d.ts","sourceRoot":"","sources":["../../../src/commands/_shared/scene-html-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,cAAc,GACd,WAAW,GACX,cAAc,GACd,cAAc,CAAC;AAEnB,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAMtC,CAAC;AAEX;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACpC;AA4BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAI/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,mBAAmB,EAAE,EACjC,cAAc,EAAE,MAAM,GACrB,MAAM,CAQR;AAwPD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2C3D;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAiCrF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvF"}
@@ -41,6 +41,38 @@ export function slugifySceneName(name) {
41
41
  .replace(/^-+|-+$/g, "");
42
42
  return slug || "scene";
43
43
  }
44
+ // ---------------------------------------------------------------------------
45
+ // Word-sync helpers
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * Render a transcript as `<span class="word" data-i="N">…</span>` markup,
49
+ * separated by literal whitespace so kerning and wrapping behave naturally.
50
+ * Returns the empty string when there's nothing to render.
51
+ */
52
+ export function renderTranscriptSpans(transcript) {
53
+ return transcript
54
+ .map((w, i) => `<span class="word" data-i="${i}">${esc(w.text)}</span>`)
55
+ .join(" ");
56
+ }
57
+ /**
58
+ * Build absolute-timing GSAP tweens that fade each transcript word in at its
59
+ * narration `start` time. The `targetSelector` parametrises the scope so the
60
+ * same routine can drive `simple` (`.caption .word`), `explainer`
61
+ * (`#subtitle .word`), or `kinetic-type` (`.kinetic .word`).
62
+ *
63
+ * Each tween is `tl.fromTo(sel, {opacity:0,y:10}, {opacity:1,y:0,duration:0.18}, start)`
64
+ * — short enough to feel responsive at any speech rate, long enough to avoid
65
+ * popping at 30fps. Words clamp to non-negative starts.
66
+ */
67
+ export function buildTranscriptTweens(transcript, targetSelector) {
68
+ return transcript
69
+ .map((w, i) => {
70
+ const start = Math.max(0, Number(w.start.toFixed(3)));
71
+ const sel = `${targetSelector}[data-i="${i}"]`;
72
+ return `tl.fromTo('${sel}', { opacity: 0, y: 10 }, { opacity: 1, y: 0, duration: 0.18, ease: 'power2.out' }, ${start});`;
73
+ })
74
+ .join("\n ");
75
+ }
44
76
  function buildPreset(input) {
45
77
  const id = input.id;
46
78
  const scope = `[data-composition-id="${id}"]`;
@@ -73,7 +105,20 @@ function buildPreset(input) {
73
105
  const backdropMarkup = `<div class="backdrop"></div>`;
74
106
  switch (input.preset) {
75
107
  case "simple": {
76
- const caption = subhead || headline;
108
+ const transcript = input.transcript;
109
+ const useWordSync = !!(transcript && transcript.length > 0);
110
+ const captionText = subhead || headline;
111
+ const captionInner = useWordSync
112
+ ? renderTranscriptSpans(transcript)
113
+ : esc(captionText);
114
+ const wordCss = useWordSync
115
+ ? `\n ${scope} .caption .word { display: inline-block; opacity: 0; }`
116
+ : "";
117
+ const timeline = useWordSync
118
+ ? `${buildTranscriptTweens(transcript, `${scope} .caption .word`)}
119
+ tl.to('${scope} .caption', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});`
120
+ : `tl.from('${scope} .caption', { opacity: 0, y: 28, duration: 0.6, ease: 'power2.out' }, 0.1);
121
+ tl.to('${scope} .caption', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});`;
77
122
  return {
78
123
  css: `${scope} {
79
124
  position: absolute; inset: 0; width: 100%; height: 100%;
@@ -89,11 +134,10 @@ function buildPreset(input) {
89
134
  font-weight: 700;
90
135
  line-height: 1.2;
91
136
  text-shadow: 0 4px 20px rgba(0,0,0,0.65);
92
- }`,
137
+ }${wordCss}`,
93
138
  body: `${backdropMarkup}
94
- <div class="caption" id="caption">${esc(caption)}</div>`,
95
- timeline: `tl.from('${scope} .caption', { opacity: 0, y: 28, duration: 0.6, ease: 'power2.out' }, 0.1);
96
- tl.to('${scope} .caption', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});`,
139
+ <div class="caption" id="caption">${captionInner}</div>`,
140
+ timeline,
97
141
  };
98
142
  }
99
143
  case "announcement": {
@@ -129,6 +173,17 @@ function buildPreset(input) {
129
173
  case "explainer": {
130
174
  const k = kicker || humanise(id).toUpperCase();
131
175
  const sub = subhead || "";
176
+ const transcript = input.transcript;
177
+ const useWordSync = !!(transcript && transcript.length > 0 && sub);
178
+ const subtitleInner = useWordSync ? renderTranscriptSpans(transcript) : esc(sub);
179
+ const wordCss = useWordSync
180
+ ? `\n ${scope} #subtitle .word { display: inline-block; opacity: 0; }`
181
+ : "";
182
+ const subtitleTween = useWordSync
183
+ ? buildTranscriptTweens(transcript, `${scope} #subtitle .word`)
184
+ : sub
185
+ ? `tl.from('${scope} #subtitle', { opacity: 0, y: 30, duration: 0.55, ease: 'power3.out' }, 0.55);`
186
+ : "";
132
187
  return {
133
188
  css: `${scope} {
134
189
  position: absolute; inset: 0; width: 100%; height: 100%;
@@ -151,30 +206,44 @@ function buildPreset(input) {
151
206
  }
152
207
  ${scope} .subtitle {
153
208
  font-size: 38px; font-weight: 300; color: #c0c0d0; max-width: 80%;
154
- }`,
209
+ }${wordCss}`,
155
210
  body: `${backdropMarkup}
156
211
  <div class="stage">
157
212
  <div class="kicker" id="kicker">${esc(k)}</div>
158
213
  <h1 class="title" id="title">${esc(headline)}</h1>${sub ? `
159
- <div class="subtitle" id="subtitle">${esc(sub)}</div>` : ""}
214
+ <div class="subtitle" id="subtitle">${subtitleInner}</div>` : ""}
160
215
  </div>`,
161
216
  timeline: `tl.from('${scope} #kicker', { opacity: 0, y: 16, duration: 0.4, ease: 'power2.out' }, 0.1);
162
217
  tl.from('${scope} #title', { opacity: 0, y: 60, duration: 0.7, ease: 'power3.out' }, 0.25);
163
- ${sub ? `tl.from('${scope} #subtitle', { opacity: 0, y: 30, duration: 0.55, ease: 'power3.out' }, 0.55);` : ""}`,
218
+ ${subtitleTween}`,
164
219
  };
165
220
  }
166
221
  case "kinetic-type": {
167
- const words = headline.split(/\s+/).filter(Boolean);
222
+ const transcript = input.transcript;
223
+ const useWordSync = !!(transcript && transcript.length > 0);
224
+ // When transcript is supplied, drive word entries from it (narration is
225
+ // the ground truth — what's spoken is what's shown). Otherwise fall back
226
+ // to splitting the headline.
227
+ const words = useWordSync
228
+ ? transcript.map((w) => w.text)
229
+ : headline.split(/\s+/).filter(Boolean);
168
230
  const wordSpans = words
169
- .map((w, i) => `<span class="word" id="w-${i}">${esc(w)}</span>`)
231
+ .map((w, i) => `<span class="word" data-i="${i}" id="w-${i}">${esc(w)}</span>`)
170
232
  .join(" ");
171
233
  const stagger = Math.max(0.08, Math.min(0.3, (dur - 0.6) / Math.max(words.length, 1)));
172
- const tweens = words
173
- .map((_, i) => {
174
- const start = (0.05 + i * stagger).toFixed(2);
175
- return `tl.from('${scope} #w-${i}', { opacity: 0, y: 80, scale: 0.8, duration: 0.45, ease: 'back.out(1.8)' }, ${start});`;
176
- })
177
- .join("\n ");
234
+ const tweens = useWordSync
235
+ ? transcript
236
+ .map((w, i) => {
237
+ const start = Math.max(0, Number(w.start.toFixed(3)));
238
+ return `tl.from('${scope} #w-${i}', { opacity: 0, y: 80, scale: 0.8, duration: 0.35, ease: 'back.out(1.8)' }, ${start});`;
239
+ })
240
+ .join("\n ")
241
+ : words
242
+ .map((_, i) => {
243
+ const start = (0.05 + i * stagger).toFixed(2);
244
+ return `tl.from('${scope} #w-${i}', { opacity: 0, y: 80, scale: 0.8, duration: 0.45, ease: 'back.out(1.8)' }, ${start});`;
245
+ })
246
+ .join("\n ");
178
247
  return {
179
248
  css: `${scope} {
180
249
  position: absolute; inset: 0; width: 100%; height: 100%;
@@ -1 +1 @@
1
- {"version":3,"file":"scene-html-emit.js","sourceRoot":"","sources":["../../../src/commands/_shared/scene-html-emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene-html-emit.js","sourceRoot":"","sources":["../../../src/commands/_shared/scene-html-emit.ts"],"names":[],"mappings":"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"}