screenci 0.0.89 → 0.0.91
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/cli.d.ts +39 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +357 -75
- package/dist/cli.js.map +1 -1
- package/dist/docs/manifest.d.ts +29 -29
- package/dist/docs/manifest.js +9 -9
- package/dist/docs/manifest.js.map +1 -1
- package/dist/docs/video-sources/assets/StyleCard.d.ts +4 -0
- package/dist/docs/video-sources/assets/StyleCard.d.ts.map +1 -0
- package/dist/docs/video-sources/assets/StyleCard.js +27 -0
- package/dist/docs/video-sources/assets/StyleCard.js.map +1 -0
- package/dist/docs/video-sources/camera-and-zooming.screenci.js +2 -9
- package/dist/docs/video-sources/camera-and-zooming.screenci.js.map +1 -1
- package/dist/docs/video-sources/editor.screenci.d.ts +2 -0
- package/dist/docs/video-sources/editor.screenci.d.ts.map +1 -0
- package/dist/docs/video-sources/{studio.screenci.js → editor.screenci.js} +18 -19
- package/dist/docs/video-sources/editor.screenci.js.map +1 -0
- package/dist/docs/video-sources/languages.screenci.js +12 -12
- package/dist/docs/video-sources/languages.screenci.js.map +1 -1
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js +2 -15
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
- package/dist/docs/video-sources/locator-highlight-still.screenci.js +2 -1
- package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
- package/dist/docs/video-sources/narration.screenci.js +11 -11
- package/dist/docs/video-sources/narration.screenci.js.map +1 -1
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.js +2 -2
- package/dist/docs/video-sources/public-urls-and-embeds.screenci.js.map +1 -1
- package/dist/docs/video-sources/speaking-style.screenci.js +4 -28
- package/dist/docs/video-sources/speaking-style.screenci.js.map +1 -1
- package/dist/docs/videos.d.ts +2 -2
- package/dist/docs/videos.js +2 -2
- package/dist/e2e/fixtures/ClientCounter.d.ts +5 -0
- package/dist/e2e/fixtures/ClientCounter.d.ts.map +1 -0
- package/dist/e2e/fixtures/ClientCounter.js +29 -0
- package/dist/e2e/fixtures/ClientCounter.js.map +1 -0
- package/dist/e2e/htmlRasterizer.e2e.js +104 -23
- package/dist/e2e/htmlRasterizer.e2e.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/src/anonSession.d.ts +20 -6
- package/dist/src/anonSession.d.ts.map +1 -1
- package/dist/src/anonSession.js +60 -13
- package/dist/src/anonSession.js.map +1 -1
- package/dist/src/asset.d.ts +68 -100
- package/dist/src/asset.d.ts.map +1 -1
- package/dist/src/asset.js +134 -289
- package/dist/src/asset.js.map +1 -1
- package/dist/src/audio.d.ts +1 -1
- package/dist/src/audio.js +1 -1
- package/dist/src/builder.d.ts +25 -25
- package/dist/src/builder.d.ts.map +1 -1
- package/dist/src/builder.js +8 -8
- package/dist/src/builder.js.map +1 -1
- package/dist/src/clientOverlay.d.ts +29 -0
- package/dist/src/clientOverlay.d.ts.map +1 -0
- package/dist/src/clientOverlay.js +83 -0
- package/dist/src/clientOverlay.js.map +1 -0
- package/dist/src/cue.d.ts +9 -9
- package/dist/src/cue.d.ts.map +1 -1
- package/dist/src/cue.js +6 -6
- package/dist/src/cue.js.map +1 -1
- package/dist/src/declare.d.ts +6 -6
- package/dist/src/declare.d.ts.map +1 -1
- package/dist/src/declare.js +9 -9
- package/dist/src/declare.js.map +1 -1
- package/dist/src/events.d.ts +14 -46
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +14 -24
- package/dist/src/events.js.map +1 -1
- package/dist/src/htmlRasterizer.d.ts +21 -42
- package/dist/src/htmlRasterizer.d.ts.map +1 -1
- package/dist/src/htmlRasterizer.js +47 -66
- package/dist/src/htmlRasterizer.js.map +1 -1
- package/dist/src/init.d.ts +2 -1
- package/dist/src/init.d.ts.map +1 -1
- package/dist/src/init.js +131 -137
- package/dist/src/init.js.map +1 -1
- package/dist/src/instrument.d.ts.map +1 -1
- package/dist/src/instrument.js +146 -0
- package/dist/src/instrument.js.map +1 -1
- package/dist/src/localize.d.ts +17 -11
- package/dist/src/localize.d.ts.map +1 -1
- package/dist/src/localize.js +1 -1
- package/dist/src/localize.js.map +1 -1
- package/dist/src/localizeRuntime.d.ts +8 -8
- package/dist/src/localizeRuntime.d.ts.map +1 -1
- package/dist/src/localizeRuntime.js +4 -4
- package/dist/src/localizeRuntime.js.map +1 -1
- package/dist/src/manualZoom.d.ts.map +1 -1
- package/dist/src/manualZoom.js +8 -3
- package/dist/src/manualZoom.js.map +1 -1
- package/dist/src/overlayFlush.js +6 -6
- package/dist/src/overlayFlush.js.map +1 -1
- package/dist/src/recordingData.d.ts +2 -2
- package/dist/src/runtimeContext.d.ts +0 -11
- package/dist/src/runtimeContext.d.ts.map +1 -1
- package/dist/src/runtimeContext.js +0 -7
- package/dist/src/runtimeContext.js.map +1 -1
- package/dist/src/screenshot.d.ts +7 -7
- package/dist/src/screenshot.d.ts.map +1 -1
- package/dist/src/studio.d.ts +41 -38
- package/dist/src/studio.d.ts.map +1 -1
- package/dist/src/studio.js +9 -9
- package/dist/src/studio.js.map +1 -1
- package/dist/src/types.d.ts +19 -10
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/video.d.ts +15 -15
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +10 -10
- package/dist/src/video.js.map +1 -1
- package/dist/src/voiceConfig.d.ts +26 -7
- package/dist/src/voiceConfig.d.ts.map +1 -1
- package/dist/src/voices.d.ts +22 -2
- package/dist/src/voices.d.ts.map +1 -1
- package/dist/src/voices.js +18 -0
- package/dist/src/voices.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -1
- package/skills/screenci/SKILL.md +1 -1
- package/skills/screenci/references/init.md +8 -1
- package/skills/screenci/references/record.md +1 -1
- package/dist/docs/video-sources/studio.screenci.d.ts +0 -2
- package/dist/docs/video-sources/studio.screenci.d.ts.map +0 -1
- package/dist/docs/video-sources/studio.screenci.js.map +0 -1
- package/dist/src/recordingSize.d.ts +0 -32
- package/dist/src/recordingSize.d.ts.map +0 -1
- package/dist/src/recordingSize.js +0 -54
- package/dist/src/recordingSize.js.map +0 -1
package/dist/src/anonSession.js
CHANGED
|
@@ -15,6 +15,7 @@ import { getDevBackendUrl } from './linkSession.js';
|
|
|
15
15
|
export const ANON_SESSION_FILE = 'anon-session.json';
|
|
16
16
|
export const ANON_TOKEN_HEADER = 'X-ScreenCI-Anon-Token';
|
|
17
17
|
export const SECRET_HEADER = 'X-ScreenCI-Secret';
|
|
18
|
+
export const ANON_MAX_VIDEOS_PER_RECORDING = 3;
|
|
18
19
|
// Canonical Terms of Service URL. Hardcoded like the docs links elsewhere in
|
|
19
20
|
// the CLI (the legal pages are not environment-specific). Anonymous trial
|
|
20
21
|
// recordings upload to our servers without an account, so the CLI surfaces this
|
|
@@ -42,15 +43,22 @@ async function readAnonSessionFile(screenciDir) {
|
|
|
42
43
|
try {
|
|
43
44
|
const raw = await readFile(getAnonSessionFilePath(screenciDir), 'utf-8');
|
|
44
45
|
const parsed = JSON.parse(raw);
|
|
45
|
-
|
|
46
|
+
if (typeof parsed.token !== 'string')
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
token: parsed.token,
|
|
50
|
+
...(typeof parsed.recordUrl === 'string'
|
|
51
|
+
? { recordUrl: parsed.recordUrl }
|
|
52
|
+
: {}),
|
|
53
|
+
};
|
|
46
54
|
}
|
|
47
55
|
catch {
|
|
48
56
|
return null;
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
|
-
async function writeAnonSessionFile(screenciDir,
|
|
59
|
+
async function writeAnonSessionFile(screenciDir, session) {
|
|
52
60
|
mkdirSync(screenciDir, { recursive: true });
|
|
53
|
-
await writeFile(getAnonSessionFilePath(screenciDir), `${JSON.stringify(
|
|
61
|
+
await writeFile(getAnonSessionFilePath(screenciDir), `${JSON.stringify(session, null, 2)}\n`);
|
|
54
62
|
}
|
|
55
63
|
export async function deleteAnonSessionFile(screenciDir) {
|
|
56
64
|
const path = getAnonSessionFilePath(screenciDir);
|
|
@@ -72,11 +80,45 @@ export async function deleteAnonSessionFile(screenciDir) {
|
|
|
72
80
|
export async function getOrCreateAnonToken(screenciDir) {
|
|
73
81
|
const existing = await readAnonSessionFile(screenciDir);
|
|
74
82
|
if (existing)
|
|
75
|
-
return existing;
|
|
83
|
+
return existing.token;
|
|
76
84
|
const token = randomUUID();
|
|
77
|
-
await writeAnonSessionFile(screenciDir, token);
|
|
85
|
+
await writeAnonSessionFile(screenciDir, { token });
|
|
78
86
|
return token;
|
|
79
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Remembers the successful anonymous recording URL locally so a second
|
|
90
|
+
* anonymous `record` attempt can point back to the trial recording instead of
|
|
91
|
+
* only showing the sign-up URL.
|
|
92
|
+
*/
|
|
93
|
+
export async function saveAnonSessionRecordUrl(screenciDir, token, recordUrl) {
|
|
94
|
+
const existing = await readAnonSessionFile(screenciDir);
|
|
95
|
+
await writeAnonSessionFile(screenciDir, {
|
|
96
|
+
...(existing?.token === token ? existing : {}),
|
|
97
|
+
token,
|
|
98
|
+
recordUrl,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export async function readAnonSessionRecordUrl(screenciDir) {
|
|
102
|
+
const existing = await readAnonSessionFile(screenciDir);
|
|
103
|
+
return existing?.recordUrl ?? null;
|
|
104
|
+
}
|
|
105
|
+
// How many separate `screenci record` runs an anonymous trial may upload before
|
|
106
|
+
// it must sign up. Kept in sync with ANON_MAX_RECORDINGS server-side.
|
|
107
|
+
export const ANON_MAX_RECORDINGS = 3;
|
|
108
|
+
/** A short "N recordings left" phrase for the anonymous trial. */
|
|
109
|
+
export function formatAnonRecordingsLeft(remaining) {
|
|
110
|
+
if (remaining <= 0) {
|
|
111
|
+
return 'That was your last free trial recording. Sign up to record more.';
|
|
112
|
+
}
|
|
113
|
+
return `${remaining} free trial recording${remaining === 1 ? '' : 's'} left. Sign up to record without limits.`;
|
|
114
|
+
}
|
|
115
|
+
/** A single-line notice shown after an anonymous recording succeeds. */
|
|
116
|
+
export function formatAnonPostRecordNotice(remaining) {
|
|
117
|
+
if (remaining <= 0) {
|
|
118
|
+
return 'Recorded without an account. That was your last free trial recording. Sign up to keep it and record more.';
|
|
119
|
+
}
|
|
120
|
+
return `Recorded without an account. ${remaining} free trial recording${remaining === 1 ? '' : 's'} left. Sign up to keep it and record without limits.`;
|
|
121
|
+
}
|
|
80
122
|
/**
|
|
81
123
|
* Checks the server-side status of a locally stored anon token: still pending
|
|
82
124
|
* (with `used` telling whether the one free trial recording is already spent),
|
|
@@ -101,21 +143,26 @@ export async function checkAnonSessionStatus(token, options = {}) {
|
|
|
101
143
|
return { status: 'expired' };
|
|
102
144
|
if (body.status === 'not_found')
|
|
103
145
|
return { status: 'not_found' };
|
|
104
|
-
|
|
146
|
+
const remaining = typeof body.remaining === 'number'
|
|
147
|
+
? body.remaining
|
|
148
|
+
: body.used === true
|
|
149
|
+
? 0
|
|
150
|
+
: ANON_MAX_RECORDINGS;
|
|
151
|
+
return { status: 'pending', used: remaining <= 0, remaining };
|
|
105
152
|
}
|
|
106
153
|
catch {
|
|
107
|
-
return { status: 'pending', used: false };
|
|
154
|
+
return { status: 'pending', used: false, remaining: ANON_MAX_RECORDINGS };
|
|
108
155
|
}
|
|
109
156
|
}
|
|
110
157
|
/**
|
|
111
158
|
* Decides whether a fresh anonymous `record` is allowed to START, given the
|
|
112
|
-
* session's current status. An anonymous trial gets
|
|
113
|
-
* once
|
|
114
|
-
* session has expired, a
|
|
115
|
-
* told to sign up before anything renders, rather than silently minting a new
|
|
159
|
+
* session's current status. An anonymous trial gets up to ANON_MAX_RECORDINGS
|
|
160
|
+
* recordings: once all are used (a pending session that has spent its trial) or
|
|
161
|
+
* the session has expired, a further recording is refused up front so the user
|
|
162
|
+
* is told to sign up before anything renders, rather than silently minting a new
|
|
116
163
|
* trial or only failing after the whole recording ran. A first-run token the
|
|
117
|
-
* server has not seen yet (`not_found`), a pending
|
|
118
|
-
* `claimed` session (the upload path self-upgrades to the real secret) all
|
|
164
|
+
* server has not seen yet (`not_found`), a pending session with recordings left,
|
|
165
|
+
* and a `claimed` session (the upload path self-upgrades to the real secret) all
|
|
119
166
|
* proceed.
|
|
120
167
|
*/
|
|
121
168
|
export function evaluateAnonRecordingGate(status) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonSession.js","sourceRoot":"","sources":["../../src/anonSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,sEAAsE;AAEtE,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAA;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AACxD,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"anonSession.js","sourceRoot":"","sources":["../../src/anonSession.ts"],"names":[],"mappings":"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"}
|
package/dist/src/asset.d.ts
CHANGED
|
@@ -2,20 +2,9 @@ import type { Locator } from '@playwright/test';
|
|
|
2
2
|
import type { NormalizedFeature } from './declare.js';
|
|
3
3
|
import { type IEventRecorder, type OverlayCrop } from './events.js';
|
|
4
4
|
import { type TimelineOffset } from './timelineOffset.js';
|
|
5
|
-
export { setOverlayCss } from './htmlRasterizer.js';
|
|
6
5
|
export type { OverlayPlacement, OverlayCrop } from './events.js';
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
* never has to depend on `@types/react`: any JSX element is assignable to this,
|
|
10
|
-
* while a plain {@link OverlayConfig} object is not (it has no `type`/`props`).
|
|
11
|
-
* React itself is detected structurally at runtime and rendered lazily, so it
|
|
12
|
-
* stays an optional peer dependency.
|
|
13
|
-
*/
|
|
14
|
-
export type ReactElementLike = {
|
|
15
|
-
type: unknown;
|
|
16
|
-
props: unknown;
|
|
17
|
-
key?: string | null;
|
|
18
|
-
};
|
|
6
|
+
/** A relative overlay length: a time string (`'2s'`, `'0:02'`) or milliseconds. */
|
|
7
|
+
export type OverlayDuration = TimelineOffset | number;
|
|
19
8
|
/**
|
|
20
9
|
* Placement and capture fields shared by every overlay variant. Placement is
|
|
21
10
|
* flat (not nested) and uses CSS pixels in the recording viewport (the same
|
|
@@ -64,37 +53,27 @@ type OverlayCommon = {
|
|
|
64
53
|
*/
|
|
65
54
|
margin?: number;
|
|
66
55
|
/**
|
|
67
|
-
* Default visible length, as a relative time string (`'2s'`, `'0:02'`)
|
|
68
|
-
* when the overlay is shown with a bare call
|
|
69
|
-
* `.for()` without its own length.
|
|
70
|
-
* Omit when driving with
|
|
56
|
+
* Default visible length, as a relative time string (`'2s'`, `'0:02'`) or a
|
|
57
|
+
* number of milliseconds, used when the overlay is shown with a bare call
|
|
58
|
+
* (`await overlays.logo()`) or `.for()` without its own length.
|
|
59
|
+
* Seconds/timecode only (no percentage). Omit when driving with
|
|
60
|
+
* `start()`/`end()`. Image/HTML/React overlays only.
|
|
71
61
|
*
|
|
72
62
|
* For animated overlays (`animate: true`) this is also the capture length: it
|
|
73
63
|
* is required when driving with `start()`/`end()` (the capture length is
|
|
74
64
|
* otherwise unknown).
|
|
75
65
|
*/
|
|
76
|
-
duration?:
|
|
66
|
+
duration?: OverlayDuration;
|
|
77
67
|
/**
|
|
78
68
|
* Capture the overlay as an animation so its CSS/JS animation plays back in
|
|
79
|
-
* the video (
|
|
80
|
-
*
|
|
69
|
+
* the video (`.html`/`.tsx` page overlays only). The animation is sampled over
|
|
70
|
+
* the resolved duration with a transparent background preserved. The page's own
|
|
71
|
+
* `<script>` / React effects are advanced by a deterministic virtual clock, so
|
|
72
|
+
* `setTimeout`/`requestAnimationFrame`-driven animation is reproducible.
|
|
81
73
|
*/
|
|
82
74
|
animate?: boolean;
|
|
83
75
|
/** Animation capture frame rate. Only valid with `animate`. Defaults to `30`. */
|
|
84
76
|
fps?: number;
|
|
85
|
-
/**
|
|
86
|
-
* Extra CSS injected into the overlay document so it can be styled with
|
|
87
|
-
* `className` (for example a compiled Tailwind stylesheet). Merged on top of
|
|
88
|
-
* any global CSS set via `setOverlayCss`. HTML files and React elements only.
|
|
89
|
-
*/
|
|
90
|
-
css?: string;
|
|
91
|
-
/**
|
|
92
|
-
* Transparent padding (CSS px) added around the overlay content. Lets an
|
|
93
|
-
* animation move, scale, or rotate beyond its box without being clipped (an
|
|
94
|
-
* automatic "stage"), at the cost of the placement sizing the padded box.
|
|
95
|
-
* HTML files and React elements only.
|
|
96
|
-
*/
|
|
97
|
-
capturePadding?: number;
|
|
98
77
|
/**
|
|
99
78
|
* Crop a rectangle of the SOURCE file before it is placed/scaled, in the
|
|
100
79
|
* source's own pixels (top-left origin), like Playwright's
|
|
@@ -162,64 +141,55 @@ type OverlayVideoFields = {
|
|
|
162
141
|
end?: TimelineOffset;
|
|
163
142
|
};
|
|
164
143
|
/**
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
144
|
+
* A full React page overlay: `path` ends in `.tsx`. The module default-exports a
|
|
145
|
+
* React component that screenci bundles (with esbuild, an optional peer
|
|
146
|
+
* dependency) and renders CLIENT-SIDE in the browser during capture, so the full
|
|
147
|
+
* React runtime runs: function components with hooks and effects, class
|
|
148
|
+
* components with lifecycle and state, inline styles, and `className`. With
|
|
149
|
+
* `animate: true` the mounted app is advanced by the deterministic virtual clock
|
|
150
|
+
* that samples each frame, so effect timers / `requestAnimationFrame` / state
|
|
151
|
+
* updates drive the captured frames reproducibly.
|
|
152
|
+
*
|
|
153
|
+
* `props` are passed to the component. They are the ONLY overlay variant that
|
|
154
|
+
* accepts `props`, enforced at the type level by the `.tsx` path suffix.
|
|
169
155
|
*/
|
|
170
|
-
export type
|
|
171
|
-
/**
|
|
172
|
-
path: string
|
|
173
|
-
|
|
174
|
-
|
|
156
|
+
export type TsxOverlayConfig = OverlayCommon & {
|
|
157
|
+
/** Path to a `.tsx` module that default-exports a React component, resolved relative to the recording file. */
|
|
158
|
+
path: `${string}.tsx`;
|
|
159
|
+
/** Serializable props passed to the component (a `.tsx` overlay only). */
|
|
160
|
+
props?: Record<string, unknown>;
|
|
175
161
|
};
|
|
176
162
|
/**
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
163
|
+
* A full HTML page overlay: `path` ends in `.html`. The file is loaded as a
|
|
164
|
+
* complete standalone document, so its own `<style>` and `<script>` run (the
|
|
165
|
+
* script is advanced by the virtual clock when `animate: true`). Author the page
|
|
166
|
+
* with a transparent background (`html,body{background:transparent}`) and, for
|
|
167
|
+
* tight sizing, wrap the content in `<div id="screenci-overlay-root">`. No
|
|
168
|
+
* `props` (a full page owns its own content).
|
|
180
169
|
*/
|
|
181
|
-
export type
|
|
182
|
-
/**
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
html?: never;
|
|
186
|
-
volume?: never;
|
|
187
|
-
speed?: never;
|
|
188
|
-
time?: never;
|
|
189
|
-
start?: never;
|
|
190
|
-
end?: never;
|
|
191
|
-
crop?: never;
|
|
170
|
+
export type HtmlPageOverlayConfig = OverlayCommon & {
|
|
171
|
+
/** Path to a full `.html` document, resolved relative to the recording file. */
|
|
172
|
+
path: `${string}.html`;
|
|
173
|
+
props?: never;
|
|
192
174
|
};
|
|
193
175
|
/**
|
|
194
|
-
* An
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* contain exactly one top-level element, and `<!doctype>`, `<html>`, `<head>`,
|
|
199
|
-
* and `<body>` tags are rejected because screenci wraps the markup in its own
|
|
200
|
-
* document. Video-only fields (`volume`/`speed`/`time`) do not apply.
|
|
176
|
+
* An image (`.svg`/`.png`) or video (`.mp4`) file overlay. Only this variant
|
|
177
|
+
* accepts the {@link OverlayVideoFields} (`volume`/`speed`/`time`/`start`/`end`),
|
|
178
|
+
* which apply to `.mp4` files and are rejected at recording time for images. No
|
|
179
|
+
* `props`.
|
|
201
180
|
*/
|
|
202
|
-
export type
|
|
203
|
-
/**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
element?: never;
|
|
207
|
-
volume?: never;
|
|
208
|
-
speed?: never;
|
|
209
|
-
time?: never;
|
|
210
|
-
start?: never;
|
|
211
|
-
end?: never;
|
|
212
|
-
crop?: never;
|
|
181
|
+
export type MediaOverlayConfig = OverlayCommon & OverlayVideoFields & {
|
|
182
|
+
/** File path: `.svg`/`.png` (image) or `.mp4` (video). */
|
|
183
|
+
path: string;
|
|
184
|
+
props?: never;
|
|
213
185
|
};
|
|
214
186
|
/**
|
|
215
|
-
* Display options for an overlay.
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
* accepts the video-only `volume`/`speed`/`time` fields (for `.mp4` files); the
|
|
220
|
-
* others reject them at compile time.
|
|
187
|
+
* Display options for an overlay. Content always comes from a file `path`; the
|
|
188
|
+
* extension selects the variant: `.tsx` (a client-rendered React page, the only
|
|
189
|
+
* variant accepting `props`), `.html` (a full HTML document), or `.svg`/`.png`/
|
|
190
|
+
* `.mp4` (image/video, the only variant accepting the video-only fields).
|
|
221
191
|
*/
|
|
222
|
-
export type OverlayConfig =
|
|
192
|
+
export type OverlayConfig = TsxOverlayConfig | HtmlPageOverlayConfig | MediaOverlayConfig;
|
|
223
193
|
/**
|
|
224
194
|
* Upper bound for an audio level (linear gain). `4` is +12 dB, plenty of
|
|
225
195
|
* headroom for a boost while guarding against accidental extreme distortion.
|
|
@@ -321,25 +291,23 @@ export declare function selected(name: string, options?: DependencyOverlayOption
|
|
|
321
291
|
/**
|
|
322
292
|
* A value accepted by {@link createOverlays} for each key:
|
|
323
293
|
*
|
|
324
|
-
* - a `string` file path (`.html`/`.svg`/`.png`/`.mp4`),
|
|
325
|
-
* - a React element,
|
|
294
|
+
* - a `string` file path (`.tsx`/`.html`/`.svg`/`.png`/`.mp4`),
|
|
326
295
|
* - an {@link OverlayConfig} object, or
|
|
327
296
|
* - a {@link selected} render dependency.
|
|
328
297
|
*/
|
|
329
|
-
export type OverlayInput = string |
|
|
298
|
+
export type OverlayInput = string | OverlayConfig | DependencyOverlayInput;
|
|
330
299
|
/**
|
|
331
300
|
* A factory that builds an {@link OverlayConfig} from caller-supplied props.
|
|
332
|
-
* Use this to make an overlay programmatic: the returned config (its
|
|
333
|
-
*
|
|
334
|
-
* locator's position captured with {@link overlayRect}.
|
|
335
|
-
* content and the placement may vary per call.
|
|
301
|
+
* Use this to make an overlay programmatic: the returned config (its `path`,
|
|
302
|
+
* `props`, and placement) can depend on values only known at runtime, for
|
|
303
|
+
* example a locator's position captured with {@link overlayRect}.
|
|
336
304
|
*
|
|
337
305
|
* @example
|
|
338
306
|
* ```tsx
|
|
339
307
|
* const overlays = createOverlays({
|
|
340
|
-
*
|
|
308
|
+
* ring: (t: Locator) => ({ path: './ring.html', over: t, margin: 6 }),
|
|
341
309
|
* })
|
|
342
|
-
* await overlays.
|
|
310
|
+
* await overlays.ring(saveButton).for('1.2s')
|
|
343
311
|
* ```
|
|
344
312
|
*/
|
|
345
313
|
export type OverlayConfigFactory<P = unknown> = (props: P) => OverlayConfig;
|
|
@@ -413,12 +381,12 @@ export type OverlayController = {
|
|
|
413
381
|
*/
|
|
414
382
|
(): Promise<void>;
|
|
415
383
|
/**
|
|
416
|
-
* Hold the overlay for a relative length, e.g. `.for('2s')
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
* length is fixed.
|
|
384
|
+
* Hold the overlay for a relative length, e.g. `.for('2s')`, `.for('0:02')`,
|
|
385
|
+
* or `.for(2000)`. String seconds/timecodes and numeric milliseconds are
|
|
386
|
+
* accepted; a percentage is rejected (a relative length has nothing to take a
|
|
387
|
+
* percentage of). Not for `.mp4`/animated overlays, whose length is fixed.
|
|
420
388
|
*/
|
|
421
|
-
for(duration:
|
|
389
|
+
for(duration: OverlayDuration): Promise<void>;
|
|
422
390
|
/**
|
|
423
391
|
* Keep the overlay visible until this absolute point in the final video (a
|
|
424
392
|
* `'<n>s'`/timecode position, or a `'<n>%'` fraction). Supported for image,
|
|
@@ -457,8 +425,8 @@ export type Overlays<T extends Record<string, OverlayInputOrFactory>> = {
|
|
|
457
425
|
* `element`, or an inline `html` fragment.
|
|
458
426
|
*
|
|
459
427
|
* Calling a controller shows the overlay in the recording timeline. Image
|
|
460
|
-
* (`.svg`/`.png`), HTML, and React overlays need a `
|
|
461
|
-
* or passed to
|
|
428
|
+
* (`.svg`/`.png`), HTML, and React overlays need a `duration` (in the config
|
|
429
|
+
* or passed to `.for(...)`) unless driven with `start()`/`end()`; `.mp4`
|
|
462
430
|
* overlays use their natural duration and default `audio` to `1` (natural level).
|
|
463
431
|
*
|
|
464
432
|
* Placement defaults to the full recording area (`relativeTo: 'recording'`);
|
|
@@ -478,20 +446,20 @@ export type Overlays<T extends Record<string, OverlayInputOrFactory>> = {
|
|
|
478
446
|
* video('Product demo', async ({ page }) => {
|
|
479
447
|
* await overlays.intro()
|
|
480
448
|
* await page.goto('/dashboard')
|
|
481
|
-
* await overlays.logo(1200)
|
|
449
|
+
* await overlays.logo.for(1200)
|
|
482
450
|
* })
|
|
483
451
|
* ```
|
|
484
452
|
*
|
|
485
453
|
* A value can also be an {@link OverlayConfigFactory} `(props) => OverlayConfig`,
|
|
486
454
|
* making the overlay programmatic. Calling `overlays.name(props)` builds and
|
|
487
|
-
* returns a controller you then drive with
|
|
455
|
+
* returns a controller you then drive with `.for(...)`, `start()`, or
|
|
488
456
|
* `end()`. The factory runs (and its config is validated) on each call, so
|
|
489
457
|
* content and placement can depend on runtime values.
|
|
490
458
|
*/
|
|
491
459
|
export declare function createOverlays<const T extends Record<string, OverlayInputOrFactory>>(overlays: T): Overlays<T>;
|
|
492
460
|
/**
|
|
493
461
|
* Builds overlay controllers for Studio-managed overlays declared via
|
|
494
|
-
* `video.
|
|
462
|
+
* `video.overlays(editable([...]))`. Their file (`.svg`, `.png`, or `.mp4`),
|
|
495
463
|
* placement, image duration, and video audio level are configured on the
|
|
496
464
|
* ScreenCI Studio page instead of in code. Each name becomes a callable overlay
|
|
497
465
|
* controller with the same timeline behavior as a {@link createOverlays}
|
package/dist/src/asset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../src/asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../src/asset.ts"],"names":[],"mappings":"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"}
|