@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 +10 -8
- package/cli/commands/record-demo.js +29 -25
- package/context/templates/base/cli-reference.md +23 -22
- package/dist/templates/base/cli-reference.md +23 -22
- package/package.json +1 -1
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
|
|
122
|
+
Control output video resolution and content zoom:
|
|
123
123
|
|
|
124
124
|
```bash
|
|
125
|
-
--viewport <WxH|preset> #
|
|
125
|
+
--viewport <WxH|preset> # Video resolution (default: 1440x900)
|
|
126
126
|
# Presets: 720p, 1080p, 1440p, 4k
|
|
127
|
-
--width <px> #
|
|
128
|
-
--height <px> #
|
|
129
|
-
--zoom <percent> #
|
|
130
|
-
|
|
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
|
|
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
|
|
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
|
|
215
|
+
const viewport = parseViewportArgs(args, getFlagValue);
|
|
216
216
|
const zoomFactor = parseDeviceScaleFactor(args, getFlagValue);
|
|
217
217
|
|
|
218
|
-
// To achieve "zoom", we use
|
|
219
|
-
//
|
|
220
|
-
// Example: --viewport
|
|
221
|
-
// -
|
|
222
|
-
// -
|
|
223
|
-
// -
|
|
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}
|
|
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
|
-
|
|
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` |
|
|
29
|
-
| `--width` |
|
|
30
|
-
| `--height` |
|
|
31
|
-
| `--zoom` |
|
|
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
|
|
46
|
+
# Record at 1080p resolution
|
|
48
47
|
sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p
|
|
49
48
|
|
|
50
|
-
# Record with
|
|
51
|
-
sceneforge record -d demo.yaml -b http://localhost:3000 --viewport
|
|
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` |
|
|
98
|
-
| `--zoom` |
|
|
99
|
-
| `--output-size` |
|
|
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
|
|
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> #
|
|
374
|
-
--width <px> #
|
|
375
|
-
--height <px> #
|
|
376
|
-
--zoom <percent> #
|
|
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
|
-
###
|
|
387
|
+
### How Zoom Works
|
|
390
388
|
|
|
391
|
-
-
|
|
392
|
-
-
|
|
393
|
-
-
|
|
394
|
-
-
|
|
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` |
|
|
29
|
-
| `--width` |
|
|
30
|
-
| `--height` |
|
|
31
|
-
| `--zoom` |
|
|
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
|
|
46
|
+
# Record at 1080p resolution
|
|
48
47
|
sceneforge record -d demo.yaml -b http://localhost:3000 --viewport 1080p
|
|
49
48
|
|
|
50
|
-
# Record with
|
|
51
|
-
sceneforge record -d demo.yaml -b http://localhost:3000 --viewport
|
|
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` |
|
|
98
|
-
| `--zoom` |
|
|
99
|
-
| `--output-size` |
|
|
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
|
|
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> #
|
|
374
|
-
--width <px> #
|
|
375
|
-
--height <px> #
|
|
376
|
-
--zoom <percent> #
|
|
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
|
-
###
|
|
387
|
+
### How Zoom Works
|
|
390
388
|
|
|
391
|
-
-
|
|
392
|
-
-
|
|
393
|
-
-
|
|
394
|
-
-
|
|
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
|
|