@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.
- package/dist/commands/_shared/scene-audio-mux.d.ts +75 -0
- package/dist/commands/_shared/scene-audio-mux.d.ts.map +1 -0
- package/dist/commands/_shared/scene-audio-mux.js +159 -0
- package/dist/commands/_shared/scene-audio-mux.js.map +1 -0
- package/dist/commands/_shared/scene-audio-mux.test.d.ts +7 -0
- package/dist/commands/_shared/scene-audio-mux.test.d.ts.map +1 -0
- package/dist/commands/_shared/scene-audio-mux.test.js +94 -0
- package/dist/commands/_shared/scene-audio-mux.test.js.map +1 -0
- package/dist/commands/_shared/scene-audio-scan.d.ts +94 -0
- package/dist/commands/_shared/scene-audio-scan.d.ts.map +1 -0
- package/dist/commands/_shared/scene-audio-scan.js +144 -0
- package/dist/commands/_shared/scene-audio-scan.js.map +1 -0
- package/dist/commands/_shared/scene-audio-scan.test.d.ts +6 -0
- package/dist/commands/_shared/scene-audio-scan.test.d.ts.map +1 -0
- package/dist/commands/_shared/scene-audio-scan.test.js +190 -0
- package/dist/commands/_shared/scene-audio-scan.test.js.map +1 -0
- package/dist/commands/_shared/scene-html-emit.d.ts +35 -0
- package/dist/commands/_shared/scene-html-emit.d.ts.map +1 -1
- package/dist/commands/_shared/scene-html-emit.js +85 -16
- package/dist/commands/_shared/scene-html-emit.js.map +1 -1
- package/dist/commands/_shared/scene-html-emit.test.js +194 -1
- package/dist/commands/_shared/scene-html-emit.test.js.map +1 -1
- package/dist/commands/_shared/scene-project.d.ts +1 -1
- package/dist/commands/_shared/scene-project.d.ts.map +1 -1
- package/dist/commands/_shared/scene-render.d.ts +6 -0
- package/dist/commands/_shared/scene-render.d.ts.map +1 -1
- package/dist/commands/_shared/scene-render.js +41 -1
- package/dist/commands/_shared/scene-render.js.map +1 -1
- package/dist/commands/_shared/tts-resolve.d.ts +75 -0
- package/dist/commands/_shared/tts-resolve.d.ts.map +1 -0
- package/dist/commands/_shared/tts-resolve.js +89 -0
- package/dist/commands/_shared/tts-resolve.js.map +1 -0
- package/dist/commands/_shared/tts-resolve.test.d.ts +6 -0
- package/dist/commands/_shared/tts-resolve.test.d.ts.map +1 -0
- package/dist/commands/_shared/tts-resolve.test.js +147 -0
- package/dist/commands/_shared/tts-resolve.test.js.map +1 -0
- package/dist/commands/scene.d.ts +27 -1
- package/dist/commands/scene.d.ts.map +1 -1
- package/dist/commands/scene.js +120 -13
- package/dist/commands/scene.js.map +1 -1
- package/dist/commands/scene.test.js +87 -1
- package/dist/commands/scene.test.js.map +1 -1
- package/dist/utils/provider-resolver.d.ts.map +1 -1
- package/dist/utils/provider-resolver.js +6 -2
- package/dist/utils/provider-resolver.js.map +1 -1
- 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":"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"}
|
|
@@ -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;
|
|
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
|
|
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">${
|
|
95
|
-
timeline
|
|
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">${
|
|
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
|
-
${
|
|
218
|
+
${subtitleTween}`,
|
|
164
219
|
};
|
|
165
220
|
}
|
|
166
221
|
case "kinetic-type": {
|
|
167
|
-
const
|
|
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 =
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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":"AAwBA,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,QAAQ;IACR,cAAc;IACd,WAAW;IACX,cAAc;IACd,cAAc;CACN,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-html-emit.js","sourceRoot":"","sources":["../../../src/commands/_shared/scene-html-emit.ts"],"names":[],"mappings":"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"}
|