@t3lnet/sceneforge 1.0.20 → 1.0.22

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
@@ -119,15 +119,15 @@ npx sceneforge split --demo my-demo --crf 15
119
119
 
120
120
  ## Viewport Settings (Recording)
121
121
 
122
- Control browser viewport size and zoom level during recording:
122
+ Control output video resolution and content zoom:
123
123
 
124
124
  ```bash
125
- --viewport <WxH|preset> # Viewport size (default: 1440x900)
125
+ --viewport <WxH|preset> # Video resolution (default: 1440x900)
126
126
  # Presets: 720p, 1080p, 1440p, 4k
127
- --width <px> # Viewport width
128
- --height <px> # Viewport height
129
- --zoom <percent> # Browser zoom: 100, 150, 200 (default: 100)
130
- --device-scale-factor <n> # Device pixel ratio: 1, 1.5, 2
127
+ --width <px> # Video width
128
+ --height <px> # Video height
129
+ --zoom <percent> # Content zoom: 100, 150, 200 (default: 100)
130
+ # Makes UI elements appear larger
131
131
  ```
132
132
 
133
133
  **Examples:**
@@ -136,11 +136,13 @@ Control browser viewport size and zoom level during recording:
136
136
  # Record at 1080p
137
137
  npx sceneforge record --definition demo.yaml --base-url http://localhost:5173 --viewport 1080p
138
138
 
139
- # Record with zoom for extra detail
139
+ # Record at 1080p with zoomed content (UI appears 1.5x larger)
140
140
  npx sceneforge record --definition demo.yaml --base-url http://localhost:5173 \
141
- --viewport 1920x1080 --zoom 150
141
+ --viewport 1080p --zoom 150
142
142
  ```
143
143
 
144
+ **How zoom works:** `--viewport 1080p --zoom 150` records a 1920x1080 video where content appears 1.5x larger (browser viewport is actually 1280x720, scaled up to 1080p).
145
+
144
146
  ## Output Dimensions (Video Processing)
145
147
 
146
148
  Control final video resolution with support for different platforms and aspect ratios:
@@ -212,33 +212,19 @@ export async function runRecordDemoCommand(argv) {
212
212
  await ensureDir(outputPaths.outputDir);
213
213
  await ensureDir(outputPaths.videosDir);
214
214
 
215
- const requestedViewport = parseViewportArgs(args, getFlagValue);
215
+ const viewport = parseViewportArgs(args, getFlagValue);
216
216
  const zoomFactor = parseDeviceScaleFactor(args, getFlagValue);
217
217
 
218
- // To achieve "zoom", we use a smaller viewport but record at the requested resolution.
219
- // This makes content appear larger (zoomed in) in the final video.
220
- // Example: --viewport 1080p --zoom 150 means:
221
- // - User wants 1920x1080 output video
222
- // - Content should appear 1.5x larger (zoomed)
223
- // - So we set viewport to 1280x720 (1920/1.5 x 1080/1.5)
224
- // - Record at 1920x1080
225
- const viewport = zoomFactor !== 1
226
- ? {
227
- width: Math.round(requestedViewport.width / zoomFactor),
228
- height: Math.round(requestedViewport.height / zoomFactor),
229
- }
230
- : requestedViewport;
231
-
232
- // Recording size is the requested viewport (the final video dimensions)
233
- const recordVideoSize = {
234
- width: requestedViewport.width,
235
- height: requestedViewport.height,
236
- };
218
+ // To achieve "zoom", we use CSS zoom to make content appear larger.
219
+ // The viewport stays at the requested size, and we inject CSS zoom after page load.
220
+ // Example: --viewport 4k --zoom 200 means:
221
+ // - Viewport is 3840x2160 (4K)
222
+ // - CSS zoom: 2 makes content appear 2x larger
223
+ // - User sees the equivalent of 1920x1080 content filling the 4K frame
237
224
 
238
225
  // Log what's happening
239
226
  if (zoomFactor !== 1) {
240
- console.log(`[record] Viewport: ${viewport.width}x${viewport.height} (zoomed ${Math.round(zoomFactor * 100)}%)`);
241
- console.log(`[record] Output video: ${recordVideoSize.width}x${recordVideoSize.height}`);
227
+ console.log(`[record] Viewport: ${viewport.width}x${viewport.height} with ${Math.round(zoomFactor * 100)}% CSS zoom`);
242
228
  } else {
243
229
  console.log(`[record] Viewport: ${viewport.width}x${viewport.height}`);
244
230
  }
@@ -255,9 +241,7 @@ export async function runRecordDemoCommand(argv) {
255
241
 
256
242
  const context = await browser.newContext({
257
243
  viewport,
258
- // Note: we achieve "zoom" by using a smaller viewport, not deviceScaleFactor
259
- // deviceScaleFactor only affects pixel density, not content size
260
- recordVideo: noVideo ? undefined : { dir: recordDir, size: recordVideoSize },
244
+ recordVideo: noVideo ? undefined : { dir: recordDir, size: viewport },
261
245
  storageState: storageState ? toAbsolute(rootDir, storageState) : undefined,
262
246
  locale: locale || undefined,
263
247
  extraHTTPHeaders: locale
@@ -268,12 +252,32 @@ export async function runRecordDemoCommand(argv) {
268
252
  });
269
253
 
270
254
  const page = await context.newPage();
255
+
256
+ // Apply CSS zoom if requested (must be done before navigation to affect all content)
257
+ if (zoomFactor !== 1) {
258
+ await page.addInitScript((zoom) => {
259
+ document.addEventListener('DOMContentLoaded', () => {
260
+ document.documentElement.style.zoom = String(zoom);
261
+ });
262
+ // Also set immediately in case DOMContentLoaded already fired
263
+ if (document.documentElement) {
264
+ document.documentElement.style.zoom = String(zoom);
265
+ }
266
+ }, zoomFactor);
267
+ }
268
+
271
269
  const video = page.video();
272
270
  const videoRecordingStartTime = Date.now();
273
271
  const startUrl = resolveStartUrl(startPath, baseUrl);
274
272
 
275
273
  if (startUrl) {
276
274
  await page.goto(startUrl, { waitUntil: "networkidle" });
275
+ // Ensure zoom is applied after navigation
276
+ if (zoomFactor !== 1) {
277
+ await page.evaluate((zoom) => {
278
+ document.documentElement.style.zoom = String(zoom);
279
+ }, zoomFactor);
280
+ }
277
281
  }
278
282
  const result = await runDemo(
279
283
  definition,
@@ -25,11 +25,10 @@ sceneforge record --definition <path> [options]
25
25
  | `--storage` | Path to storage state JSON |
26
26
  | `--slowmo` | Slow down actions by ms |
27
27
  | `--env-file` | Path to .env file |
28
- | `--viewport` | Browser viewport size (preset or WxH, default: 1440x900) |
29
- | `--width` | Viewport width (overrides --viewport) |
30
- | `--height` | Viewport height (overrides --viewport) |
31
- | `--zoom` | Browser zoom level: 100, 150, 200 (default: 100) |
32
- | `--device-scale-factor` | Device pixel ratio: 1, 1.5, 2 |
28
+ | `--viewport` | Target video resolution (preset or WxH, default: 1440x900) |
29
+ | `--width` | Video width (overrides --viewport) |
30
+ | `--height` | Video height (overrides --viewport) |
31
+ | `--zoom` | Content zoom level: 100, 150, 200 (default: 100) - makes UI larger |
33
32
 
34
33
  **Viewport Presets:** 720p (1280x720), 1080p (1920x1080), 1440p (2560x1440), 4k (3840x2160)
35
34
 
@@ -44,11 +43,11 @@ sceneforge record -d demo.yaml -b http://localhost:3000 --headed
44
43
  # With auth state
45
44
  sceneforge record -d demo.yaml -b http://localhost:3000 --storage ./auth.json
46
45
 
47
- # Record at 1080p viewport
46
+ # Record at 1080p resolution
48
47
  sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p
49
48
 
50
- # Record with zoom for extra detail
51
- sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1920x1080 --zoom 150
49
+ # Record at 1080p with zoomed content (UI appears 1.5x larger)
50
+ sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p --zoom 150
52
51
  ```
53
52
 
54
53
  ### setup
@@ -94,9 +93,9 @@ sceneforge pipeline --definition <path> [options]
94
93
  | `--quality` | Quality preset: low, medium, high |
95
94
  | `--crf` | Override CRF value |
96
95
  | `--codec` | Video codec: libx264, libx265 |
97
- | `--viewport` | Browser viewport size (preset or WxH) |
98
- | `--zoom` | Browser zoom level: 100, 150, 200 |
99
- | `--output-size` | Output video dimensions (preset or WxH) |
96
+ | `--viewport` | Target video resolution (preset or WxH) |
97
+ | `--zoom` | Content zoom level: 100, 150, 200 (makes UI larger) |
98
+ | `--output-size` | Final output dimensions (preset or WxH) |
100
99
  | `--output-width` | Output width (-1 for auto) |
101
100
  | `--output-height` | Output height (-1 for auto) |
102
101
 
@@ -365,16 +364,15 @@ sceneforge split --demo my-demo --crf 15
365
364
 
366
365
  ## Viewport Settings
367
366
 
368
- Control browser viewport size and zoom during recording for high-DPI capture.
367
+ Control output video resolution and content zoom during recording.
369
368
 
370
369
  ### CLI Flags (record, pipeline)
371
370
 
372
371
  ```bash
373
- --viewport <WxH|preset> # Browser viewport size (default: 1440x900)
374
- --width <px> # Viewport width (overrides --viewport)
375
- --height <px> # Viewport height (overrides --viewport)
376
- --zoom <percent> # Browser zoom: 100, 150, 200 (default: 100)
377
- --device-scale-factor <n> # Device pixel ratio: 1, 1.5, 2
372
+ --viewport <WxH|preset> # Target video resolution (default: 1440x900)
373
+ --width <px> # Video width (overrides --viewport)
374
+ --height <px> # Video height (overrides --viewport)
375
+ --zoom <percent> # Content zoom: 100, 150, 200 (default: 100)
378
376
  ```
379
377
 
380
378
  ### Viewport Presets
@@ -386,12 +384,15 @@ Control browser viewport size and zoom during recording for high-DPI capture.
386
384
  | `1440p` | 2560x1440 |
387
385
  | `4k` | 3840x2160 |
388
386
 
389
- ### Why Viewport Settings Matter
387
+ ### How Zoom Works
390
388
 
391
- - Larger viewports capture more UI detail and clarity
392
- - Zoom (device scale factor) increases effective pixel density
393
- - A 1080p viewport at 150% zoom captures at 2880x1620 effective pixels
394
- - Useful for creating videos that look sharp on retina displays
389
+ - `--viewport` sets the output video resolution (e.g., 1920x1080 for 1080p)
390
+ - `--zoom` makes UI elements appear larger by using a smaller browser viewport
391
+ - Example: `--viewport 1080p --zoom 150` records a 1920x1080 video
392
+ - Actual browser viewport: 1280x720 (1920/1.5 x 1080/1.5)
393
+ - Output video: 1920x1080
394
+ - Result: Content appears 1.5x larger/zoomed
395
+ - Useful for demos where UI elements need to be more visible and readable
395
396
 
396
397
  ## Output Dimensions
397
398
 
@@ -25,11 +25,10 @@ sceneforge record --definition <path> [options]
25
25
  | `--storage` | Path to storage state JSON |
26
26
  | `--slowmo` | Slow down actions by ms |
27
27
  | `--env-file` | Path to .env file |
28
- | `--viewport` | Browser viewport size (preset or WxH, default: 1440x900) |
29
- | `--width` | Viewport width (overrides --viewport) |
30
- | `--height` | Viewport height (overrides --viewport) |
31
- | `--zoom` | Browser zoom level: 100, 150, 200 (default: 100) |
32
- | `--device-scale-factor` | Device pixel ratio: 1, 1.5, 2 |
28
+ | `--viewport` | Target video resolution (preset or WxH, default: 1440x900) |
29
+ | `--width` | Video width (overrides --viewport) |
30
+ | `--height` | Video height (overrides --viewport) |
31
+ | `--zoom` | Content zoom level: 100, 150, 200 (default: 100) - makes UI larger |
33
32
 
34
33
  **Viewport Presets:** 720p (1280x720), 1080p (1920x1080), 1440p (2560x1440), 4k (3840x2160)
35
34
 
@@ -44,11 +43,11 @@ sceneforge record -d demo.yaml -b http://localhost:3000 --headed
44
43
  # With auth state
45
44
  sceneforge record -d demo.yaml -b http://localhost:3000 --storage ./auth.json
46
45
 
47
- # Record at 1080p viewport
46
+ # Record at 1080p resolution
48
47
  sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p
49
48
 
50
- # Record with zoom for extra detail
51
- sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1920x1080 --zoom 150
49
+ # Record at 1080p with zoomed content (UI appears 1.5x larger)
50
+ sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p --zoom 150
52
51
  ```
53
52
 
54
53
  ### setup
@@ -94,9 +93,9 @@ sceneforge pipeline --definition <path> [options]
94
93
  | `--quality` | Quality preset: low, medium, high |
95
94
  | `--crf` | Override CRF value |
96
95
  | `--codec` | Video codec: libx264, libx265 |
97
- | `--viewport` | Browser viewport size (preset or WxH) |
98
- | `--zoom` | Browser zoom level: 100, 150, 200 |
99
- | `--output-size` | Output video dimensions (preset or WxH) |
96
+ | `--viewport` | Target video resolution (preset or WxH) |
97
+ | `--zoom` | Content zoom level: 100, 150, 200 (makes UI larger) |
98
+ | `--output-size` | Final output dimensions (preset or WxH) |
100
99
  | `--output-width` | Output width (-1 for auto) |
101
100
  | `--output-height` | Output height (-1 for auto) |
102
101
 
@@ -365,16 +364,15 @@ sceneforge split --demo my-demo --crf 15
365
364
 
366
365
  ## Viewport Settings
367
366
 
368
- Control browser viewport size and zoom during recording for high-DPI capture.
367
+ Control output video resolution and content zoom during recording.
369
368
 
370
369
  ### CLI Flags (record, pipeline)
371
370
 
372
371
  ```bash
373
- --viewport <WxH|preset> # Browser viewport size (default: 1440x900)
374
- --width <px> # Viewport width (overrides --viewport)
375
- --height <px> # Viewport height (overrides --viewport)
376
- --zoom <percent> # Browser zoom: 100, 150, 200 (default: 100)
377
- --device-scale-factor <n> # Device pixel ratio: 1, 1.5, 2
372
+ --viewport <WxH|preset> # Target video resolution (default: 1440x900)
373
+ --width <px> # Video width (overrides --viewport)
374
+ --height <px> # Video height (overrides --viewport)
375
+ --zoom <percent> # Content zoom: 100, 150, 200 (default: 100)
378
376
  ```
379
377
 
380
378
  ### Viewport Presets
@@ -386,12 +384,15 @@ Control browser viewport size and zoom during recording for high-DPI capture.
386
384
  | `1440p` | 2560x1440 |
387
385
  | `4k` | 3840x2160 |
388
386
 
389
- ### Why Viewport Settings Matter
387
+ ### How Zoom Works
390
388
 
391
- - Larger viewports capture more UI detail and clarity
392
- - Zoom (device scale factor) increases effective pixel density
393
- - A 1080p viewport at 150% zoom captures at 2880x1620 effective pixels
394
- - Useful for creating videos that look sharp on retina displays
389
+ - `--viewport` sets the output video resolution (e.g., 1920x1080 for 1080p)
390
+ - `--zoom` makes UI elements appear larger by using a smaller browser viewport
391
+ - Example: `--viewport 1080p --zoom 150` records a 1920x1080 video
392
+ - Actual browser viewport: 1280x720 (1920/1.5 x 1080/1.5)
393
+ - Output video: 1920x1080
394
+ - Result: Content appears 1.5x larger/zoomed
395
+ - Useful for demos where UI elements need to be more visible and readable
395
396
 
396
397
  ## Output Dimensions
397
398
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t3lnet/sceneforge",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "description": "SceneForge runner and generation utilities for YAML-driven demos",
5
5
  "license": "MIT",
6
6
  "author": "T3LNET",