playwright-recast 0.2.0 → 0.3.1

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/README.md CHANGED
@@ -45,7 +45,8 @@ await Recast
45
45
  - **Trace-based processing** — Parses Playwright trace.zip (actions, screenshots, network, cursor positions). No manual recording needed.
46
46
  - **Smart speed control** — Automatically speeds up idle time, network waits, and navigation while keeping user actions at normal speed.
47
47
  - **TTS voiceover** — Generate narration with OpenAI TTS or ElevenLabs. Properly timed with silence padding.
48
- - **Subtitle generation** — SRT and WebVTT output. Import external SRT or generate from trace BDD step titles.
48
+ - **Subtitle generation** — SRT, WebVTT, and ASS output. Import external SRT or generate from trace BDD step titles.
49
+ - **Styled subtitle burn-in** — Configurable font, size, color, background box with opacity, padding, position. Smart punctuation-based chunking for single-line display.
49
50
  - **playwright-bdd support** — First-class integration with playwright-bdd Gherkin steps. Doc strings become voiceover narration.
50
51
  - **Step helpers** — `narrate()`, `zoom()`, `pace()` — importable helpers for Playwright step definitions.
51
52
  - **CLI included** — `npx playwright-recast -i trace.zip -o demo.mp4` — no code needed.
@@ -117,7 +118,21 @@ await Recast
117
118
  speed: 1.2,
118
119
  instructions: 'Professional product demo narration.',
119
120
  }))
120
- .render({ format: 'mp4', resolution: '1080p', burnSubtitles: true })
121
+ .render({
122
+ format: 'mp4',
123
+ resolution: '1080p',
124
+ fps: 60,
125
+ burnSubtitles: true,
126
+ subtitleStyle: {
127
+ fontSize: 48,
128
+ primaryColor: '#1a1a1a',
129
+ backgroundColor: '#FFFFFF',
130
+ backgroundOpacity: 0.75,
131
+ padding: 20,
132
+ bold: true,
133
+ chunkOptions: { maxCharsPerLine: 55 },
134
+ },
135
+ })
121
136
  .toFile('demo.mp4')
122
137
  ```
123
138
 
@@ -172,12 +187,47 @@ Every stage is optional and composable:
172
187
  | `.subtitles(textFn)` | Generate subtitles from trace actions |
173
188
  | `.subtitlesFromSrt(path)` | Load subtitles from an external SRT file |
174
189
  | `.subtitlesFromTrace()` | Auto-generate subtitles from BDD step titles in trace |
190
+ | `.autoZoom(config)` | Auto-zoom to user interaction targets detected from trace |
191
+ | `.enrichZoomFromReport(steps)` | Apply zoom coordinates from external report data |
175
192
  | `.voiceover(provider)` | Generate TTS audio from subtitle text |
176
- | `.render(config)` | Render final video (format, resolution, burn subtitles) |
193
+ | `.render(config)` | Render final video (format, resolution, fps, styled subtitle burn-in) |
177
194
  | `.toFile(path)` | Execute pipeline and write output |
178
195
 
179
196
  ---
180
197
 
198
+ ## Subtitle Styling
199
+
200
+ Burn styled subtitles into the video with full control over appearance:
201
+
202
+ ```typescript
203
+ .render({
204
+ burnSubtitles: true,
205
+ subtitleStyle: {
206
+ fontFamily: 'Arial', // Any system font
207
+ fontSize: 48, // Pixels (relative to 1080p)
208
+ primaryColor: '#1a1a1a', // Text color (hex)
209
+ backgroundColor: '#FFFFFF', // Box background (hex)
210
+ backgroundOpacity: 0.75, // 0.0 transparent — 1.0 opaque
211
+ padding: 20, // Box padding in px
212
+ bold: true,
213
+ position: 'bottom', // 'bottom' or 'top'
214
+ marginVertical: 50, // Distance from edge
215
+ marginHorizontal: 100, // Side margins (text wraps within)
216
+ wrapStyle: 'smart', // 'smart', 'endOfLine', 'none'
217
+ chunkOptions: { // Split long text into single-line chunks
218
+ maxCharsPerLine: 55, // Split at punctuation when text exceeds this
219
+ minCharsPerChunk: 15, // Merge tiny fragments
220
+ },
221
+ },
222
+ })
223
+ ```
224
+
225
+ **Punctuation-based chunking** splits long subtitle text into shorter single-line entries. Time is distributed proportionally by character count. Splits at sentence boundaries (`. ! ?`) first, then clause boundaries (`, ; :`) if still too long.
226
+
227
+ Without `subtitleStyle`, `burnSubtitles: true` falls back to default ffmpeg SRT rendering.
228
+
229
+ ---
230
+
181
231
  ## TTS Providers
182
232
 
183
233
  ### OpenAI TTS
@@ -210,6 +260,77 @@ Requires `ELEVENLABS_API_KEY` environment variable or `apiKey` option.
210
260
 
211
261
  ---
212
262
 
263
+ ## Zoom
264
+
265
+ Zoom into specific areas of the video during steps — focus the viewer's attention on the relevant UI element.
266
+
267
+ ### Auto-zoom from trace
268
+
269
+ Automatically zoom into user interaction targets (clicks, fills) detected from the trace:
270
+
271
+ ```typescript
272
+ await Recast
273
+ .from('./traces')
274
+ .parse()
275
+ .subtitlesFromSrt('./narration.srt')
276
+ .autoZoom({ actionLevel: 1.5 }) // 1.5x zoom on detected actions
277
+ .render({ format: 'mp4' })
278
+ .toFile('demo.mp4')
279
+ ```
280
+
281
+ `autoZoom()` finds click/fill/type actions in the trace, extracts their cursor coordinates, and applies crop-and-scale zoom during the matching subtitle's time window.
282
+
283
+ ### Zoom from report data
284
+
285
+ Apply zoom coordinates from an external source (e.g., a demo report with per-step zoom data):
286
+
287
+ ```typescript
288
+ const reportSteps = [
289
+ { zoom: null }, // Step 1: no zoom
290
+ { zoom: { x: 0.5, y: 0.8, level: 1.4 } }, // Step 2: zoom to input area
291
+ { zoom: null }, // Step 3: no zoom
292
+ { zoom: { x: 0.78, y: 0.45, level: 1.3 }}, // Step 4: zoom to sidebar
293
+ ]
294
+
295
+ await Recast
296
+ .from('./traces')
297
+ .parse()
298
+ .subtitlesFromSrt('./narration.srt')
299
+ .enrichZoomFromReport(reportSteps)
300
+ .render({ format: 'mp4' })
301
+ .toFile('demo.mp4')
302
+ ```
303
+
304
+ ### Zoom from step helpers
305
+
306
+ Capture zoom coordinates during Playwright test execution using the `zoom()` helper:
307
+
308
+ ```typescript
309
+ import { zoom } from 'playwright-recast'
310
+
311
+ When('the user opens the sidebar', async ({ page }) => {
312
+ const sidebar = page.locator('.sidebar-panel')
313
+ await zoom(sidebar, 1.3) // Record zoom target for this step
314
+ await sidebar.click()
315
+ })
316
+ ```
317
+
318
+ The helper captures the element's bounding box as a Playwright annotation. Use `enrichZoomFromReport()` to apply these coordinates during video generation.
319
+
320
+ ### Zoom coordinates
321
+
322
+ All zoom coordinates use viewport-relative fractions (0.0–1.0):
323
+
324
+ | Field | Description | Default |
325
+ |-------|-------------|---------|
326
+ | `x` | Center X (0 = left, 1 = right) | 0.5 |
327
+ | `y` | Center Y (0 = top, 1 = bottom) | 0.5 |
328
+ | `level` | Zoom level (1.0 = no zoom, 2.0 = 2x) | 1.0 |
329
+
330
+ The renderer applies zoom by cropping the video to `(width/level × height/level)` centered at `(x, y)`, then scaling back to the output resolution.
331
+
332
+ ---
333
+
213
334
  ## Speed Processing
214
335
 
215
336
  The speed processor classifies every moment of the trace:
@@ -260,8 +381,7 @@ await base.subtitlesFromSrt('./cs.srt').render({ burnSubtitles: true }).toFile('
260
381
 
261
382
  ## Roadmap
262
383
 
263
- - [ ] **Burned-in subtitles** — Render styled subtitles directly into the video with customizable font, size, color, and position
264
- - [ ] **Smooth zoom transitions** — Animated crop-and-zoom on elements during specific steps
384
+ - [ ] **Smooth zoom transitions** — Animated easing between zoom states (currently hard-cut)
265
385
  - [ ] **Edge TTS provider** — Free TTS without API key using Microsoft Edge's online voices
266
386
  - [ ] **Playwright Reporter plugin** — Auto-generate demo videos as part of your test run
267
387
  - [ ] **Multi-language support** — Generate video variants from the same trace with different SRT/voiceover per language
package/dist/index.d.ts CHANGED
@@ -7,4 +7,8 @@ export type { SpeedConfig, SpeedSegment, SpeedRule, SpeedRuleContext, ActivityTy
7
7
  export type { SubtitleEntry, SubtitleFormat, SubtitleOptions, SubtitledTrace, } from './types/subtitle.js';
8
8
  export type { TtsProvider, TtsOptions, AudioSegment, VoiceoverEntry, VoiceoveredTrace, } from './types/voiceover.js';
9
9
  export type { RenderConfig, SubtitleStyle, ZoomKeyframe } from './types/render.js';
10
+ export { writeAss, hexToAss } from './subtitles/ass-writer.js';
11
+ export type { AssResolution } from './subtitles/ass-writer.js';
12
+ export { chunkSubtitles } from './subtitles/subtitle-chunker.js';
13
+ export type { ChunkOptions } from './subtitles/subtitle-chunker.js';
10
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAG3D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAGxE,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAE7B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAG3D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAGxE,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAE7B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGlF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA"}
package/dist/index.js CHANGED
@@ -5,4 +5,7 @@ export { setupRecast, narrate, zoom, pace } from './helpers.js';
5
5
  // Providers
6
6
  export { OpenAIProvider } from './voiceover/providers/openai.js';
7
7
  export { ElevenLabsProvider } from './voiceover/providers/elevenlabs.js';
8
+ // Subtitle writers & utilities
9
+ export { writeAss, hexToAss } from './subtitles/ass-writer.js';
10
+ export { chunkSubtitles } from './subtitles/subtitle-chunker.js';
8
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,qCAAqC;AACrC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAE/D,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,qCAAqC;AACrC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAE/D,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AA4CxE,+BAA+B;AAC/B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGpD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA+B3E;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;IAC3B,SAAS,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;CAC/B;AAiKD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CAgGN"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKpD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA+B3E;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;IAC3B,SAAS,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;CAC/B;AAiKD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CA6GN"}
@@ -3,6 +3,8 @@ import * as path from 'node:path';
3
3
  import { execFileSync } from 'node:child_process';
4
4
  import { resolveResolution } from '../types/render.js';
5
5
  import { writeSrt } from '../subtitles/srt-writer.js';
6
+ import { writeAss } from '../subtitles/ass-writer.js';
7
+ import { chunkSubtitles } from '../subtitles/subtitle-chunker.js';
6
8
  /**
7
9
  * Detect blank/white frames at the start of a video and return the timestamp
8
10
  * of the first non-blank frame. Blank frames are identified by file size —
@@ -218,10 +220,24 @@ export function renderVideo(trace, config, outputPath, tmpDir) {
218
220
  vFilters.push(`scale=${resolution.width}:${resolution.height}`);
219
221
  }
220
222
  if (config.burnSubtitles && trace.subtitles && trace.subtitles.length > 0) {
221
- const srtPath = path.join(tmpDir, 'burn-subtitles.srt');
222
- fs.writeFileSync(srtPath, writeSrt(trace.subtitles));
223
- const escapedPath = srtPath.replace(/'/g, "'\\''").replace(/:/g, '\\:');
224
- vFilters.push(`subtitles='${escapedPath}'`);
223
+ if (config.subtitleStyle) {
224
+ // Styled subtitles via ASS format (background box, custom font, etc.)
225
+ let burnEntries = trace.subtitles;
226
+ if (config.subtitleStyle.chunkOptions) {
227
+ burnEntries = chunkSubtitles(burnEntries, config.subtitleStyle.chunkOptions);
228
+ }
229
+ const assPath = path.join(tmpDir, 'burn-subtitles.ass');
230
+ fs.writeFileSync(assPath, writeAss(burnEntries, config.subtitleStyle, resolution));
231
+ const escapedPath = assPath.replace(/'/g, "'\\''").replace(/:/g, '\\:');
232
+ vFilters.push(`ass='${escapedPath}'`);
233
+ }
234
+ else {
235
+ // Plain SRT subtitles (default ffmpeg styling)
236
+ const srtPath = path.join(tmpDir, 'burn-subtitles.srt');
237
+ fs.writeFileSync(srtPath, writeSrt(trace.subtitles));
238
+ const escapedPath = srtPath.replace(/'/g, "'\\''").replace(/:/g, '\\:');
239
+ vFilters.push(`subtitles='${escapedPath}'`);
240
+ }
225
241
  }
226
242
  if (vFilters.length > 0) {
227
243
  ffmpegArgs.push('-vf', vFilters.join(','));
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SubtitleEntry } from '../types/subtitle.js';
2
+ import type { SubtitleStyle } from '../types/render.js';
3
+ /** Video resolution for ASS coordinate space */
4
+ export interface AssResolution {
5
+ width: number;
6
+ height: number;
7
+ }
8
+ /**
9
+ * Convert '#RRGGBB' hex color to ASS color format '&HAABBGGRR'.
10
+ * ASS uses reversed byte order (BGR) and alpha where 00=opaque, FF=transparent.
11
+ */
12
+ export declare function hexToAss(hex: string, opacity?: number): string;
13
+ /**
14
+ * Write subtitle entries to ASS (Advanced SubStation Alpha) format
15
+ * with configurable styling — background box, font, colors, positioning.
16
+ */
17
+ export declare function writeAss(entries: SubtitleEntry[], style?: SubtitleStyle, resolution?: AssResolution): string;
18
+ //# sourceMappingURL=ass-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ass-writer.d.ts","sourceRoot":"","sources":["../../src/subtitles/ass-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAY,GAAG,MAAM,CAQnE;AAqBD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,aAAa,EAAE,EACxB,KAAK,GAAE,aAAkB,EACzB,UAAU,GAAE,aAA6C,GACxD,MAAM,CAuFR"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Convert '#RRGGBB' hex color to ASS color format '&HAABBGGRR'.
3
+ * ASS uses reversed byte order (BGR) and alpha where 00=opaque, FF=transparent.
4
+ */
5
+ export function hexToAss(hex, opacity = 1.0) {
6
+ const clean = hex.replace('#', '');
7
+ const r = clean.slice(0, 2).toUpperCase();
8
+ const g = clean.slice(2, 4).toUpperCase();
9
+ const b = clean.slice(4, 6).toUpperCase();
10
+ const alpha = Math.round((1.0 - Math.max(0, Math.min(1, opacity))) * 255);
11
+ const alphaHex = alpha.toString(16).padStart(2, '0').toUpperCase();
12
+ return `&H${alphaHex}${b}${g}${r}`;
13
+ }
14
+ /** Format milliseconds as ASS time: H:MM:SS.CC (centiseconds) */
15
+ function formatAssTime(ms) {
16
+ const rounded = Math.max(0, Math.round(ms));
17
+ const h = Math.floor(rounded / 3600000);
18
+ const m = Math.floor((rounded % 3600000) / 60000);
19
+ const s = Math.floor((rounded % 60000) / 1000);
20
+ const cs = Math.floor((rounded % 1000) / 10);
21
+ return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}.${String(cs).padStart(2, '0')}`;
22
+ }
23
+ function resolveWrapStyle(ws) {
24
+ switch (ws) {
25
+ case 'endOfLine': return 1;
26
+ case 'none': return 2;
27
+ case 'smart':
28
+ default: return 0;
29
+ }
30
+ }
31
+ /**
32
+ * Write subtitle entries to ASS (Advanced SubStation Alpha) format
33
+ * with configurable styling — background box, font, colors, positioning.
34
+ */
35
+ export function writeAss(entries, style = {}, resolution = { width: 1920, height: 1080 }) {
36
+ if (entries.length === 0)
37
+ return '';
38
+ // Resolve style with defaults
39
+ const fontFamily = style.fontFamily ?? 'Arial';
40
+ const fontSize = style.fontSize ?? 52;
41
+ const primaryColor = style.primaryColor ?? style.color ?? '#1a1a1a';
42
+ const bgColor = style.backgroundColor ?? '#FFFFFF';
43
+ const bgOpacity = style.backgroundOpacity ?? 0.75;
44
+ const padding = style.padding ?? 18;
45
+ const shadow = style.shadow ?? 0;
46
+ const position = style.position ?? 'bottom';
47
+ const marginV = style.marginVertical ?? style.marginBottom ?? 50;
48
+ const marginH = style.marginHorizontal ?? 80;
49
+ const bold = style.bold !== false ? -1 : 0; // ASS: -1 = bold, 0 = normal
50
+ const wrapStyle = resolveWrapStyle(style.wrapStyle);
51
+ // ASS alignment: bottom-center=2, top-center=8
52
+ const alignment = position === 'top' ? 8 : 2;
53
+ // Convert colors to ASS format
54
+ const assPrimary = hexToAss(primaryColor, 1.0);
55
+ const assSecondary = hexToAss('#000000', 0.0); // unused
56
+ // OutlineColour = same as BackColour so outline acts as padding extension
57
+ const assOutline = hexToAss(bgColor, bgOpacity);
58
+ const assBack = hexToAss(bgColor, bgOpacity);
59
+ // Build style line
60
+ // Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour,
61
+ // OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut,
62
+ // ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow,
63
+ // Alignment, MarginL, MarginR, MarginV, Encoding
64
+ const styleLine = [
65
+ 'Default',
66
+ fontFamily,
67
+ fontSize,
68
+ assPrimary,
69
+ assSecondary,
70
+ assOutline,
71
+ assBack,
72
+ bold, // Bold
73
+ 0, // Italic
74
+ 0, // Underline
75
+ 0, // StrikeOut
76
+ 100, // ScaleX
77
+ 100, // ScaleY
78
+ 0, // Spacing
79
+ 0, // Angle
80
+ 3, // BorderStyle (3 = opaque box)
81
+ padding, // Outline (acts as box padding in BorderStyle=3)
82
+ shadow, // Shadow
83
+ alignment,
84
+ marginH, // MarginL
85
+ marginH, // MarginR
86
+ marginV, // MarginV
87
+ 1, // Encoding (1 = default)
88
+ ].join(',');
89
+ // Build dialogue lines
90
+ const dialogues = entries.map((entry) => {
91
+ const start = formatAssTime(entry.startMs);
92
+ const end = formatAssTime(entry.endMs);
93
+ // Escape special ASS characters and convert newlines
94
+ const text = entry.text
95
+ .replace(/\\/g, '\\\\')
96
+ .replace(/\{/g, '\\{')
97
+ .replace(/\}/g, '\\}')
98
+ .replace(/\n/g, '\\N');
99
+ return `Dialogue: 0,${start},${end},Default,,0,0,0,,${text}`;
100
+ });
101
+ return [
102
+ '[Script Info]',
103
+ 'ScriptType: v4.00+',
104
+ `PlayResX: ${resolution.width}`,
105
+ `PlayResY: ${resolution.height}`,
106
+ `WrapStyle: ${wrapStyle}`,
107
+ '',
108
+ '[V4+ Styles]',
109
+ 'Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding',
110
+ `Style: ${styleLine}`,
111
+ '',
112
+ '[Events]',
113
+ 'Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text',
114
+ ...dialogues,
115
+ '', // trailing newline
116
+ ].join('\n');
117
+ }
118
+ //# sourceMappingURL=ass-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ass-writer.js","sourceRoot":"","sources":["../../src/subtitles/ass-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SubtitleEntry } from '../types/subtitle.js';
2
+ export interface ChunkOptions {
3
+ /** Max characters per line before forcing a split (default: 60) */
4
+ maxCharsPerLine?: number;
5
+ /** Min characters — don't create tiny fragments (default: 15) */
6
+ minCharsPerChunk?: number;
7
+ }
8
+ /**
9
+ * Split subtitle entries into shorter, single-line chunks based on
10
+ * punctuation. Time is distributed proportionally by character count.
11
+ *
12
+ * Splitting priority:
13
+ * 1. Sentence boundaries: . ! ?
14
+ * 2. Clause boundaries: , ; : – —
15
+ * 3. Word boundary (fallback if still too long)
16
+ */
17
+ export declare function chunkSubtitles(entries: SubtitleEntry[], options?: ChunkOptions): SubtitleEntry[];
18
+ //# sourceMappingURL=subtitle-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitle-chunker.d.ts","sourceRoot":"","sources":["../../src/subtitles/subtitle-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,GACrB,aAAa,EAAE,CAuCjB"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Split subtitle entries into shorter, single-line chunks based on
3
+ * punctuation. Time is distributed proportionally by character count.
4
+ *
5
+ * Splitting priority:
6
+ * 1. Sentence boundaries: . ! ?
7
+ * 2. Clause boundaries: , ; : – —
8
+ * 3. Word boundary (fallback if still too long)
9
+ */
10
+ export function chunkSubtitles(entries, options) {
11
+ const maxChars = options?.maxCharsPerLine ?? 60;
12
+ const minChars = options?.minCharsPerChunk ?? 15;
13
+ const result = [];
14
+ let globalIndex = 1;
15
+ for (const entry of entries) {
16
+ const chunks = splitText(entry.text, maxChars, minChars);
17
+ if (chunks.length <= 1) {
18
+ result.push({ ...entry, index: globalIndex++ });
19
+ continue;
20
+ }
21
+ // Distribute time proportionally by character count
22
+ const totalChars = chunks.reduce((sum, c) => sum + c.length, 0);
23
+ const totalDuration = entry.endMs - entry.startMs;
24
+ let cursor = entry.startMs;
25
+ for (const chunk of chunks) {
26
+ const ratio = chunk.length / totalChars;
27
+ const duration = totalDuration * ratio;
28
+ const endMs = cursor + duration;
29
+ result.push({
30
+ index: globalIndex++,
31
+ startMs: Math.round(cursor),
32
+ endMs: Math.round(endMs),
33
+ text: chunk,
34
+ keyword: entry.keyword,
35
+ zoom: entry.zoom,
36
+ });
37
+ cursor = endMs;
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ /** Sentence-ending punctuation */
43
+ const SENTENCE_END = /([.!?])\s+/;
44
+ /** Clause-boundary punctuation */
45
+ const CLAUSE_BREAK = /([,;:–—])\s+/;
46
+ /**
47
+ * Split text into chunks respecting punctuation boundaries.
48
+ */
49
+ function splitText(text, maxChars, minChars) {
50
+ const trimmed = text.trim();
51
+ if (trimmed.length <= maxChars)
52
+ return [trimmed];
53
+ // Phase 1: Split on sentence boundaries
54
+ let segments = splitOnPattern(trimmed, SENTENCE_END);
55
+ // Phase 2: Further split long segments on clause boundaries
56
+ segments = segments.flatMap((seg) => seg.length > maxChars ? splitOnPattern(seg, CLAUSE_BREAK) : [seg]);
57
+ // Phase 3: Split remaining long segments at word boundaries
58
+ segments = segments.flatMap((seg) => seg.length > maxChars ? splitAtWordBoundary(seg, maxChars) : [seg]);
59
+ // Phase 4: Merge tiny fragments back into their neighbor
60
+ return mergeSmallChunks(segments, minChars);
61
+ }
62
+ /**
63
+ * Split text on a regex pattern, keeping the punctuation with the preceding chunk.
64
+ */
65
+ function splitOnPattern(text, pattern) {
66
+ const parts = [];
67
+ let remaining = text;
68
+ while (remaining.length > 0) {
69
+ const match = pattern.exec(remaining);
70
+ if (!match || match.index === undefined) {
71
+ parts.push(remaining.trim());
72
+ break;
73
+ }
74
+ // Include the punctuation mark with the preceding text
75
+ const splitAt = match.index + match[1].length;
76
+ const before = remaining.slice(0, splitAt).trim();
77
+ if (before)
78
+ parts.push(before);
79
+ remaining = remaining.slice(splitAt).trim();
80
+ }
81
+ return parts.filter((p) => p.length > 0);
82
+ }
83
+ /**
84
+ * Split a long segment at the word boundary closest to the target length.
85
+ */
86
+ function splitAtWordBoundary(text, maxChars) {
87
+ const results = [];
88
+ let remaining = text;
89
+ while (remaining.length > maxChars) {
90
+ let splitAt = -1;
91
+ for (let i = maxChars; i >= 1; i--) {
92
+ if (remaining[i] === ' ') {
93
+ splitAt = i;
94
+ break;
95
+ }
96
+ }
97
+ if (splitAt === -1) {
98
+ splitAt = maxChars;
99
+ }
100
+ results.push(remaining.slice(0, splitAt).trim());
101
+ remaining = remaining.slice(splitAt).trim();
102
+ }
103
+ if (remaining.length > 0) {
104
+ results.push(remaining);
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Merge chunks shorter than minChars FORWARD into the next chunk.
110
+ * Preserves sentence boundaries — small fragments get prepended
111
+ * to the next clause, not appended to the previous sentence.
112
+ */
113
+ function mergeSmallChunks(chunks, minChars) {
114
+ if (chunks.length <= 1)
115
+ return chunks;
116
+ const result = [];
117
+ let carry = '';
118
+ for (const chunk of chunks) {
119
+ if (carry) {
120
+ result.push(carry + ' ' + chunk);
121
+ carry = '';
122
+ }
123
+ else if (chunk.length < minChars) {
124
+ carry = chunk;
125
+ }
126
+ else {
127
+ result.push(chunk);
128
+ }
129
+ }
130
+ if (carry && result.length > 0) {
131
+ result[result.length - 1] += ' ' + carry;
132
+ }
133
+ else if (carry) {
134
+ result.push(carry);
135
+ }
136
+ return result;
137
+ }
138
+ //# sourceMappingURL=subtitle-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitle-chunker.js","sourceRoot":"","sources":["../../src/subtitles/subtitle-chunker.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAwB,EACxB,OAAsB;IAEtB,MAAM,QAAQ,GAAG,OAAO,EAAE,eAAe,IAAI,EAAE,CAAA;IAC/C,MAAM,QAAQ,GAAG,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAA;IAEhD,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,IAAI,WAAW,GAAG,CAAC,CAAA;IAEnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAExD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;YAC/C,SAAQ;QACV,CAAC;QAED,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC/D,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;QACjD,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;QAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU,CAAA;YACvC,MAAM,QAAQ,GAAG,aAAa,GAAG,KAAK,CAAA;YACtC,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;YAE/B,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,WAAW,EAAE;gBACpB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAA;YAEF,MAAM,GAAG,KAAK,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,kCAAkC;AAClC,MAAM,YAAY,GAAG,YAAY,CAAA;AAEjC,kCAAkC;AAClC,MAAM,YAAY,GAAG,cAAc,CAAA;AAEnC;;GAEG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAgB;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAEhD,wCAAwC;IACxC,IAAI,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAEpD,4DAA4D;IAC5D,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAClE,CAAA;IAED,4DAA4D;IAC5D,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CACnE,CAAA;IAED,yDAAyD;IACzD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;YAC5B,MAAK;QACP,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAA;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QACjD,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE9B,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,OAAO,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAA;QAChB,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,OAAO,GAAG,CAAC,CAAA;gBACX,MAAK;YACP,CAAC;QACH,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,QAAQ,CAAA;QACpB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAChD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,MAAgB,EAAE,QAAgB;IAC1D,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAA;IAErC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,CAAA;YAChC,KAAK,GAAG,EAAE,CAAA;QACZ,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACnC,KAAK,GAAG,KAAK,CAAA;QACf,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAA;IAC1C,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -26,11 +26,38 @@ export interface RenderConfig {
26
26
  crf?: number;
27
27
  }
28
28
  export interface SubtitleStyle {
29
+ /** Font family name (default: 'Arial') */
29
30
  fontFamily?: string;
31
+ /** Font size in script pixels relative to 1080p (default: 52) */
30
32
  fontSize?: number;
31
- color?: string;
33
+ /** Text color as hex '#RRGGBB' (default: '#1a1a1a') */
34
+ primaryColor?: string;
35
+ /** Background box color as hex '#RRGGBB' (default: '#FFFFFF') */
32
36
  backgroundColor?: string;
37
+ /** Background opacity 0.0 (transparent) to 1.0 (opaque) (default: 0.75) */
38
+ backgroundOpacity?: number;
39
+ /** Box padding in pixels — extends background around text (default: 18) */
40
+ padding?: number;
41
+ /** Shadow distance in pixels (default: 0) */
42
+ shadow?: number;
43
+ /** Vertical position: 'bottom' or 'top' (default: 'bottom') */
33
44
  position?: 'bottom' | 'top';
45
+ /** Bottom/top margin in pixels (default: 50) */
46
+ marginVertical?: number;
47
+ /** Left/right margin in pixels (default: 80) */
48
+ marginHorizontal?: number;
49
+ /** Bold text (default: true) */
50
+ bold?: boolean;
51
+ /** Word wrap: 'smart' (even lines), 'endOfLine', 'none' (default: 'smart') */
52
+ wrapStyle?: 'smart' | 'endOfLine' | 'none';
53
+ /** Split long subtitles into shorter single-line chunks (null = no chunking) */
54
+ chunkOptions?: {
55
+ maxCharsPerLine?: number;
56
+ minCharsPerChunk?: number;
57
+ } | null;
58
+ /** @deprecated Use primaryColor */
59
+ color?: string;
60
+ /** @deprecated Use marginVertical */
34
61
  marginBottom?: number;
35
62
  }
36
63
  /** Resolved resolution in pixels */
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/types/render.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,mEAAmE;IACnE,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,GACrC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/types/render.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,mEAAmE;IACnE,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;IAC3B,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gCAAgC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAA;IAC1C,gFAAgF;IAChF,YAAY,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAG7E,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,GACrC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/types/render.ts"],"names":[],"mappings":"AAmCA,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAC/B,UAAsC;IAEtC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACnE,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QACrC,KAAK,OAAO;YACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACtC,KAAK,IAAI;YACP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACtC,KAAK,OAAO,CAAC;QACb;YACE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/types/render.ts"],"names":[],"mappings":"AA6DA,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAC/B,UAAsC;IAEtC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACnE,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QACrC,KAAK,OAAO;YACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACtC,KAAK,IAAI;YACP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACtC,KAAK,OAAO,CAAC;QACb;YACE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACxC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playwright-recast",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "Fluent pipeline library for processing Playwright traces into polished demo videos — TTS voiceover, subtitles, speed control, and zoom.",
6
6
  "license": "MIT",