screenwright 0.2.1 → 0.2.3
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/src/commands/compose.d.ts.map +1 -1
- package/dist/src/commands/compose.js +1 -0
- package/dist/src/commands/compose.js.map +1 -1
- package/dist/src/composition/frame-resolve.d.ts.map +1 -1
- package/dist/src/composition/frame-resolve.js +8 -9
- package/dist/src/composition/frame-resolve.js.map +1 -1
- package/dist/src/runtime/action-helpers.d.ts +6 -6
- package/dist/src/runtime/action-helpers.d.ts.map +1 -1
- package/dist/src/runtime/action-helpers.js +178 -145
- package/dist/src/runtime/action-helpers.js.map +1 -1
- package/dist/src/runtime/instrumented-page.d.ts +2 -0
- package/dist/src/runtime/instrumented-page.d.ts.map +1 -1
- package/dist/src/runtime/instrumented-page.js +35 -23
- package/dist/src/runtime/instrumented-page.js.map +1 -1
- package/dist/src/runtime/narration-preprocess.d.ts.map +1 -1
- package/dist/src/runtime/narration-preprocess.js +2 -0
- package/dist/src/runtime/narration-preprocess.js.map +1 -1
- package/dist/src/timeline/schema.d.ts +34 -7
- package/dist/src/timeline/schema.d.ts.map +1 -1
- package/dist/src/timeline/schema.js +4 -1
- package/dist/src/timeline/schema.js.map +1 -1
- package/dist/src/timeline/types.d.ts +12 -1
- package/dist/src/timeline/types.d.ts.map +1 -1
- package/dist/src/timeline/types.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/commands/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/commands/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAuLvB,CAAC"}
|
|
@@ -114,6 +114,7 @@ export const composeCommand = new Command('compose')
|
|
|
114
114
|
testFile: scenarioPath,
|
|
115
115
|
viewport: { width, height },
|
|
116
116
|
pregenerated: pregenerated.length > 0 ? pregenerated : undefined,
|
|
117
|
+
branding: config.branding,
|
|
117
118
|
});
|
|
118
119
|
timeline = result.timeline;
|
|
119
120
|
tempDir = result.tempDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/commands/compose.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/commands/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-resolve.d.ts","sourceRoot":"","sources":["../../../src/composition/frame-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI3G,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,qBAAqB,GAAG,yBAAyB,CAAC;AAEhF,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAMpE;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAQvF;AAsBD,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM,CASpG;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,gBAAgB,EAAE,GAC9B,eAAe,
|
|
1
|
+
{"version":3,"file":"frame-resolve.d.ts","sourceRoot":"","sources":["../../../src/composition/frame-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI3G,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,qBAAqB,GAAG,yBAAyB,CAAC;AAEhF,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAMpE;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAQvF;AAsBD,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM,CASpG;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,gBAAgB,EAAE,GAC9B,eAAe,CAsCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,aAAa,EAC1D,MAAM,EAAE,CAAC,EAAE,EACX,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,gBAAgB,EAAE,GAC9B,CAAC,EAAE,CAkBL"}
|
|
@@ -42,7 +42,7 @@ export function totalOutputFrames(manifest, transitions) {
|
|
|
42
42
|
let consumed = 0;
|
|
43
43
|
for (const t of transitions) {
|
|
44
44
|
inserted += t.durationFrames;
|
|
45
|
-
consumed += 1;
|
|
45
|
+
consumed += t.consumedFrames ?? 1;
|
|
46
46
|
}
|
|
47
47
|
return source + inserted - consumed;
|
|
48
48
|
}
|
|
@@ -72,17 +72,15 @@ export function resolveOutputFrame(outputFrame, manifest, transitions) {
|
|
|
72
72
|
}
|
|
73
73
|
if (outputFrame >= transStart && outputFrame <= transEnd) {
|
|
74
74
|
const progress = (outputFrame - transStart + 1) / t.durationFrames;
|
|
75
|
-
const beforeFile = sourceFrameImage(manifest, sourceS);
|
|
76
|
-
// "after" is the first frame of the next manifest entry
|
|
75
|
+
const beforeFile = t.beforeFile ?? sourceFrameImage(manifest, sourceS);
|
|
77
76
|
const afterEntryIdx = t.afterEntryIndex + 1;
|
|
78
|
-
const afterFile =
|
|
79
|
-
? manifest[afterEntryIdx].file
|
|
80
|
-
: manifest[manifest.length - 1].file;
|
|
77
|
+
const afterFile = t.afterFile
|
|
78
|
+
?? (afterEntryIdx < manifest.length ? manifest[afterEntryIdx].file : manifest[manifest.length - 1].file);
|
|
81
79
|
return { type: 'transition', beforeFile, afterFile, progress, transition: t.transition };
|
|
82
80
|
}
|
|
83
81
|
// Past this transition: update offset
|
|
84
|
-
|
|
85
|
-
offset += t.durationFrames -
|
|
82
|
+
const consumed = t.consumedFrames ?? 1;
|
|
83
|
+
offset += t.durationFrames - consumed;
|
|
86
84
|
}
|
|
87
85
|
// Map output frame back to source frame
|
|
88
86
|
const sourceFrame = outputFrame - offset;
|
|
@@ -103,7 +101,8 @@ export function remapEventsForOutput(events, manifest, transitions) {
|
|
|
103
101
|
const sourceS = lastSourceFrameOfEntry(manifest, t.afterEntryIndex);
|
|
104
102
|
const transitionSourceMs = sourceS * FRAME_MS;
|
|
105
103
|
if (event.timestampMs > transitionSourceMs) {
|
|
106
|
-
|
|
104
|
+
const consumed = t.consumedFrames ?? 1;
|
|
105
|
+
offsetMs += (t.durationFrames - consumed) * FRAME_MS;
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
if (offsetMs === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-resolve.js","sourceRoot":"","sources":["../../../src/composition/frame-resolve.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;AAiB3B,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,QAAyB,EAAE,WAAmB;IAC7E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,WAAW,GAAG,WAAW,GAAG,KAAK;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACzD,WAAW,IAAI,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAoB;IAC3C,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB,EAAE,UAAkB;IACvE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3D,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAyB,EAAE,UAAkB;IAC3E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE,WAA+B;IAC1F,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC;QAC7B,QAAQ,IAAI,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"frame-resolve.js","sourceRoot":"","sources":["../../../src/composition/frame-resolve.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;AAiB3B,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,QAAyB,EAAE,WAAmB;IAC7E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,WAAW,GAAG,WAAW,GAAG,KAAK;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACzD,WAAW,IAAI,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAoB;IAC3C,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB,EAAE,UAAkB;IACvE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3D,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAyB,EAAE,UAAkB;IAC3E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE,WAA+B;IAC1F,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC;QAC7B,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,QAAyB,EACzB,WAA+B;IAE/B,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAEtF,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,2DAA2D;IAE3E,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAEpE,kDAAkD;QAClD,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;QAEjC,qFAAqF;QACrF,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC;QAE5C,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC3B,4CAA4C;YAC5C,MAAM;QACR,CAAC;QAED,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,CAAC,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC;YACnE,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS;mBACxB,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3G,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3F,CAAC;QAED,sCAAsC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,CAAC,cAAc,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,wCAAwC;IACxC,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAW,EACX,QAAyB,EACzB,WAA+B;IAE/B,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAEtF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,6DAA6D;YAC7D,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;YACpE,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;YAE9C,IAAI,KAAK,CAAC,WAAW,GAAG,kBAAkB,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC;gBACvC,QAAQ,IAAI,CAAC,CAAC,CAAC,cAAc,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;YACvD,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,6 +2,7 @@ import type { Page } from 'playwright';
|
|
|
2
2
|
import type { TimelineCollector } from './timeline-collector.js';
|
|
3
3
|
import type { ManifestEntry, TransitionMarker, SceneSlideConfig, TransitionType } from '../timeline/types.js';
|
|
4
4
|
import type { PregeneratedNarration } from './narration-preprocess.js';
|
|
5
|
+
import type { BrandingConfig } from '../config/config-schema.js';
|
|
5
6
|
export interface ActionOptions {
|
|
6
7
|
narration?: string;
|
|
7
8
|
}
|
|
@@ -18,6 +19,7 @@ export interface ScreenwrightHelpers {
|
|
|
18
19
|
scene(title: string, descriptionOrOptions?: string | SceneOptions): Promise<void>;
|
|
19
20
|
navigate(url: string, opts?: ActionOptions): Promise<void>;
|
|
20
21
|
click(selector: string, opts?: ActionOptions): Promise<void>;
|
|
22
|
+
dblclick(selector: string, opts?: ActionOptions): Promise<void>;
|
|
21
23
|
fill(selector: string, value: string, opts?: ActionOptions): Promise<void>;
|
|
22
24
|
hover(selector: string, opts?: ActionOptions): Promise<void>;
|
|
23
25
|
press(key: string, opts?: ActionOptions): Promise<void>;
|
|
@@ -26,17 +28,15 @@ export interface ScreenwrightHelpers {
|
|
|
26
28
|
transition(opts?: TransitionOptions): Promise<void>;
|
|
27
29
|
}
|
|
28
30
|
export interface RecordingContext {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
addHold(file: string, count: number): void;
|
|
31
|
+
/** Take an explicit screenshot for transition before/after images.
|
|
32
|
+
* Does NOT push to the manifest or advance the virtual clock. */
|
|
33
|
+
captureTransitionFrame(): Promise<string>;
|
|
33
34
|
addTransitionMarker(marker: TransitionMarker): void;
|
|
34
35
|
popNarration(): PregeneratedNarration;
|
|
35
36
|
currentTimeMs(): number;
|
|
36
37
|
readonly manifest: ManifestEntry[];
|
|
37
38
|
transitionPending: boolean;
|
|
38
|
-
readonly narrationCount: number;
|
|
39
39
|
}
|
|
40
40
|
export declare function calculateMoveDuration(fromX: number, fromY: number, toX: number, toY: number): number;
|
|
41
|
-
export declare function createHelpers(page: Page, collector: TimelineCollector, ctx: RecordingContext): ScreenwrightHelpers;
|
|
41
|
+
export declare function createHelpers(page: Page, collector: TimelineCollector, ctx: RecordingContext, branding?: BrandingConfig): ScreenwrightHelpers;
|
|
42
42
|
//# sourceMappingURL=action-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B;sEACkE;IAClE,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpD,YAAY,IAAI,qBAAqB,CAAC;IACtC,aAAa,IAAI,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;IACnC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpG;AAwGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,mBAAmB,CAqV7I"}
|
|
@@ -14,30 +14,52 @@ const SLIDE_OVERLAY_ID = '__screenwright_slide_overlay__';
|
|
|
14
14
|
function escapeJs(s) {
|
|
15
15
|
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, '\\n');
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
const
|
|
17
|
+
/** Preload a Google Font so it's cached before the overlay becomes visible. */
|
|
18
|
+
async function preloadFont(page, fontFamily) {
|
|
19
|
+
const encoded = encodeURIComponent(fontFamily);
|
|
20
|
+
const escaped = escapeJs(fontFamily);
|
|
21
|
+
// Single evaluate: inject stylesheet, wait for it to load (so @font-face
|
|
22
|
+
// rules are registered), then wait for the actual font file to download.
|
|
23
|
+
await page.evaluate(`
|
|
24
|
+
(async () => {
|
|
25
|
+
try {
|
|
26
|
+
var link = document.getElementById('${SLIDE_OVERLAY_ID}_font');
|
|
27
|
+
if (!link) {
|
|
28
|
+
link = document.createElement('link');
|
|
29
|
+
link.id = '${SLIDE_OVERLAY_ID}_font';
|
|
30
|
+
link.rel = 'stylesheet';
|
|
31
|
+
link.href = 'https://fonts.googleapis.com/css2?family=${encoded}&display=swap';
|
|
32
|
+
document.head.appendChild(link);
|
|
33
|
+
}
|
|
34
|
+
if (!link.sheet) {
|
|
35
|
+
await Promise.race([
|
|
36
|
+
new Promise(function(ok, fail) { link.onload = ok; link.onerror = fail; }),
|
|
37
|
+
new Promise(function(r) { setTimeout(r, 3000); }),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
await Promise.race([
|
|
41
|
+
document.fonts.load('700 64px "${escaped}"'),
|
|
42
|
+
new Promise(function(r) { setTimeout(r, 3000); }),
|
|
43
|
+
]);
|
|
44
|
+
} catch {}
|
|
45
|
+
})()
|
|
46
|
+
`).catch(() => { });
|
|
47
|
+
}
|
|
48
|
+
async function injectSlideOverlay(page, title, description, config, branding) {
|
|
49
|
+
const brandColor = config.brandColor ?? branding?.brandColor ?? '#000000';
|
|
50
|
+
const textColor = config.textColor ?? branding?.textColor ?? '#FFFFFF';
|
|
51
|
+
const fontFamily = config.fontFamily ?? branding?.fontFamily;
|
|
21
52
|
const titleFontSize = config.titleFontSize ?? 64;
|
|
22
53
|
const descFontSize = Math.round(titleFontSize * 0.44);
|
|
23
54
|
const resolvedFont = fontFamily
|
|
24
55
|
? `"${fontFamily}", system-ui, -apple-system, sans-serif`
|
|
25
56
|
: 'system-ui, -apple-system, sans-serif';
|
|
26
|
-
//
|
|
27
|
-
|
|
57
|
+
// Preload font before showing the overlay so the capture loop
|
|
58
|
+
// never records frames with the fallback font.
|
|
28
59
|
if (fontFamily) {
|
|
29
|
-
|
|
30
|
-
script += `
|
|
31
|
-
if (!document.getElementById('${SLIDE_OVERLAY_ID}_font')) {
|
|
32
|
-
var link = document.createElement('link');
|
|
33
|
-
link.id = '${SLIDE_OVERLAY_ID}_font';
|
|
34
|
-
link.rel = 'stylesheet';
|
|
35
|
-
link.href = 'https://fonts.googleapis.com/css2?family=${encoded}&display=swap';
|
|
36
|
-
document.head.appendChild(link);
|
|
37
|
-
}
|
|
38
|
-
`;
|
|
60
|
+
await preloadFont(page, fontFamily);
|
|
39
61
|
}
|
|
40
|
-
script
|
|
62
|
+
let script = `
|
|
41
63
|
var overlay = document.createElement('div');
|
|
42
64
|
overlay.id = '${SLIDE_OVERLAY_ID}';
|
|
43
65
|
overlay.style.cssText = 'position:fixed;inset:0;z-index:999999;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:${escapeJs(brandColor)};font-family:${escapeJs(resolvedFont)};';
|
|
@@ -64,19 +86,6 @@ async function injectSlideOverlay(page, title, description, config) {
|
|
|
64
86
|
document.body.appendChild(overlay);
|
|
65
87
|
`;
|
|
66
88
|
await page.evaluate(script);
|
|
67
|
-
// Wait for font to load if specified, with 3s timeout
|
|
68
|
-
if (fontFamily) {
|
|
69
|
-
await page.evaluate(`
|
|
70
|
-
(async () => {
|
|
71
|
-
try {
|
|
72
|
-
await Promise.race([
|
|
73
|
-
document.fonts.load('700 64px "${escapeJs(fontFamily)}"'),
|
|
74
|
-
new Promise(r => setTimeout(r, 3000)),
|
|
75
|
-
]);
|
|
76
|
-
} catch {}
|
|
77
|
-
})()
|
|
78
|
-
`).catch(() => { });
|
|
79
|
-
}
|
|
80
89
|
}
|
|
81
90
|
async function removeSlideOverlay(page) {
|
|
82
91
|
await page.evaluate(`
|
|
@@ -86,16 +95,36 @@ async function removeSlideOverlay(page) {
|
|
|
86
95
|
if (fontLink) fontLink.remove();
|
|
87
96
|
`).catch(() => { });
|
|
88
97
|
}
|
|
89
|
-
export function createHelpers(page, collector, ctx) {
|
|
98
|
+
export function createHelpers(page, collector, ctx, branding) {
|
|
90
99
|
let lastX = 640;
|
|
91
100
|
let lastY = 360;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
// Capture loop runs continuously. These helpers never pause or resume it.
|
|
102
|
+
// When time needs to pass (narration, slide, wait), we sleep and let the
|
|
103
|
+
// capture loop record real frames throughout.
|
|
104
|
+
// Transition state: track the last slide frame for before/after images.
|
|
105
|
+
// These are cleared by any non-slide action so they're only used when
|
|
106
|
+
// sw.transition() is called directly after sw.scene({ slide }).
|
|
107
|
+
let lastSlideFile = null;
|
|
108
|
+
let lastSlideEntryIndex = -1;
|
|
109
|
+
let pendingTransitionMarker = null;
|
|
110
|
+
/** Clear slide tracking — called at the start of every non-slide action. */
|
|
111
|
+
function clearSlideState() {
|
|
112
|
+
lastSlideFile = null;
|
|
113
|
+
lastSlideEntryIndex = -1;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Resolve a pending transition marker by taking an explicit screenshot
|
|
117
|
+
* of the settled page state. Deterministic — no timing dependency on
|
|
118
|
+
* the capture loop.
|
|
119
|
+
*/
|
|
120
|
+
async function resolvePendingTransition() {
|
|
121
|
+
if (!pendingTransitionMarker || ctx.manifest.length === 0)
|
|
122
|
+
return;
|
|
123
|
+
pendingTransitionMarker.afterFile = await ctx.captureTransitionFrame();
|
|
124
|
+
pendingTransitionMarker = null;
|
|
125
|
+
ctx.transitionPending = false;
|
|
126
|
+
}
|
|
127
|
+
function emitNarrationEvent(narration) {
|
|
99
128
|
collector.emit({
|
|
100
129
|
type: 'narration',
|
|
101
130
|
timestampMs: ctx.currentTimeMs(),
|
|
@@ -103,7 +132,6 @@ export function createHelpers(page, collector, ctx) {
|
|
|
103
132
|
audioDurationMs: narration.durationMs,
|
|
104
133
|
audioFile: narration.audioFile,
|
|
105
134
|
});
|
|
106
|
-
ctx.resumeCapture();
|
|
107
135
|
}
|
|
108
136
|
async function moveCursorTo(toX, toY) {
|
|
109
137
|
const moveDurationMs = calculateMoveDuration(lastX, lastY, toX, toY);
|
|
@@ -134,16 +162,12 @@ export function createHelpers(page, collector, ctx) {
|
|
|
134
162
|
err.cause = cause;
|
|
135
163
|
return err;
|
|
136
164
|
}
|
|
137
|
-
/**
|
|
138
|
-
async function
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
ctx.transitionPending = false;
|
|
144
|
-
ctx.resumeCapture();
|
|
145
|
-
// We don't need the file reference; it's in the manifest at the correct position
|
|
146
|
-
void file;
|
|
165
|
+
/** Sleep for remaining narration time after an action settles. */
|
|
166
|
+
async function sleepRemainingNarration(startMs, durationMs) {
|
|
167
|
+
const elapsedMs = ctx.currentTimeMs() - startMs;
|
|
168
|
+
const remainingMs = durationMs - elapsedMs;
|
|
169
|
+
if (remainingMs > 0)
|
|
170
|
+
await page.waitForTimeout(remainingMs);
|
|
147
171
|
}
|
|
148
172
|
return {
|
|
149
173
|
page,
|
|
@@ -157,41 +181,39 @@ export function createHelpers(page, collector, ctx) {
|
|
|
157
181
|
description = descriptionOrOptions.description;
|
|
158
182
|
slide = descriptionOrOptions.slide;
|
|
159
183
|
}
|
|
184
|
+
collector.emit({ type: 'scene', timestampMs: ctx.currentTimeMs(), title, description, slide });
|
|
160
185
|
if (slide) {
|
|
161
|
-
// DOM injection slide
|
|
162
|
-
await ctx.pauseCapture();
|
|
163
186
|
const slideDurationMs = slide.duration ?? DEFAULT_SLIDE_DURATION_MS;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
187
|
+
const manifestLenBefore = ctx.manifest.length;
|
|
188
|
+
await injectSlideOverlay(page, title, description, slide, branding);
|
|
189
|
+
await page.waitForTimeout(slideDurationMs);
|
|
190
|
+
// Take an explicit screenshot of the slide for transition images.
|
|
191
|
+
// This is deterministic — no dependency on capture loop timing.
|
|
192
|
+
const slideFrame = await ctx.captureTransitionFrame();
|
|
193
|
+
// Resolve pending transition: this slide is the "after" image.
|
|
194
|
+
if (pendingTransitionMarker && ctx.manifest.length > 0) {
|
|
195
|
+
pendingTransitionMarker.afterFile = slideFrame;
|
|
196
|
+
// Skip junk frames between the previous slide removal and this overlay injection.
|
|
197
|
+
const junkFrames = manifestLenBefore - pendingTransitionMarker.afterEntryIndex;
|
|
198
|
+
if (junkFrames > 1) {
|
|
199
|
+
pendingTransitionMarker.consumedFrames = junkFrames;
|
|
200
|
+
}
|
|
201
|
+
pendingTransitionMarker = null;
|
|
177
202
|
ctx.transitionPending = false;
|
|
178
203
|
}
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
// No slide — just emit scene marker
|
|
185
|
-
collector.emit({ type: 'scene', timestampMs: ctx.currentTimeMs(), title, description });
|
|
204
|
+
// Save slide frame before removing overlay — used as
|
|
205
|
+
// "before" image if sw.transition() is called after this scene.
|
|
206
|
+
lastSlideFile = slideFrame;
|
|
207
|
+
lastSlideEntryIndex = ctx.manifest.length - 1;
|
|
208
|
+
await removeSlideOverlay(page);
|
|
186
209
|
}
|
|
187
210
|
},
|
|
188
211
|
async navigate(url, actionOpts) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
if (
|
|
193
|
-
|
|
194
|
-
}
|
|
212
|
+
clearSlideState();
|
|
213
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
214
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
215
|
+
if (narration)
|
|
216
|
+
emitNarrationEvent(narration);
|
|
195
217
|
const startMs = ctx.currentTimeMs();
|
|
196
218
|
try {
|
|
197
219
|
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
@@ -208,17 +230,16 @@ export function createHelpers(page, collector, ctx) {
|
|
|
208
230
|
catch (err) {
|
|
209
231
|
throw actionError('navigate', url, err);
|
|
210
232
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
else {
|
|
215
|
-
ctx.resumeCapture();
|
|
216
|
-
}
|
|
233
|
+
await resolvePendingTransition();
|
|
234
|
+
if (narration)
|
|
235
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
217
236
|
},
|
|
218
237
|
async click(selector, actionOpts) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
const
|
|
238
|
+
clearSlideState();
|
|
239
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
240
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
241
|
+
if (narration)
|
|
242
|
+
emitNarrationEvent(narration);
|
|
222
243
|
try {
|
|
223
244
|
const center = await resolveCenter(selector);
|
|
224
245
|
await moveCursorTo(center.x, center.y);
|
|
@@ -239,17 +260,46 @@ export function createHelpers(page, collector, ctx) {
|
|
|
239
260
|
catch (err) {
|
|
240
261
|
throw actionError('click', selector, err);
|
|
241
262
|
}
|
|
242
|
-
|
|
243
|
-
|
|
263
|
+
await resolvePendingTransition();
|
|
264
|
+
if (narration)
|
|
265
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
266
|
+
},
|
|
267
|
+
async dblclick(selector, actionOpts) {
|
|
268
|
+
clearSlideState();
|
|
269
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
270
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
271
|
+
if (narration)
|
|
272
|
+
emitNarrationEvent(narration);
|
|
273
|
+
try {
|
|
274
|
+
const center = await resolveCenter(selector);
|
|
275
|
+
await moveCursorTo(center.x, center.y);
|
|
276
|
+
const locator = page.locator(selector).first();
|
|
277
|
+
const box = await locator.boundingBox();
|
|
278
|
+
const startMs = ctx.currentTimeMs();
|
|
279
|
+
await locator.dblclick();
|
|
280
|
+
collector.emit({
|
|
281
|
+
type: 'action',
|
|
282
|
+
action: 'dblclick',
|
|
283
|
+
selector,
|
|
284
|
+
durationMs: 200,
|
|
285
|
+
boundingBox: box ? { x: Math.round(box.x), y: Math.round(box.y), width: Math.round(box.width), height: Math.round(box.height) } : null,
|
|
286
|
+
timestampMs: startMs,
|
|
287
|
+
settledAtMs: ctx.currentTimeMs(),
|
|
288
|
+
});
|
|
244
289
|
}
|
|
245
|
-
|
|
246
|
-
|
|
290
|
+
catch (err) {
|
|
291
|
+
throw actionError('dblclick', selector, err);
|
|
247
292
|
}
|
|
293
|
+
await resolvePendingTransition();
|
|
294
|
+
if (narration)
|
|
295
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
248
296
|
},
|
|
249
297
|
async fill(selector, value, actionOpts) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
const
|
|
298
|
+
clearSlideState();
|
|
299
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
300
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
301
|
+
if (narration)
|
|
302
|
+
emitNarrationEvent(narration);
|
|
253
303
|
try {
|
|
254
304
|
const center = await resolveCenter(selector);
|
|
255
305
|
await moveCursorTo(center.x, center.y);
|
|
@@ -274,17 +324,16 @@ export function createHelpers(page, collector, ctx) {
|
|
|
274
324
|
catch (err) {
|
|
275
325
|
throw actionError('fill', selector, err);
|
|
276
326
|
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
else {
|
|
281
|
-
ctx.resumeCapture();
|
|
282
|
-
}
|
|
327
|
+
await resolvePendingTransition();
|
|
328
|
+
if (narration)
|
|
329
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
283
330
|
},
|
|
284
331
|
async hover(selector, actionOpts) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const
|
|
332
|
+
clearSlideState();
|
|
333
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
334
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
335
|
+
if (narration)
|
|
336
|
+
emitNarrationEvent(narration);
|
|
288
337
|
try {
|
|
289
338
|
const center = await resolveCenter(selector);
|
|
290
339
|
await moveCursorTo(center.x, center.y);
|
|
@@ -305,17 +354,16 @@ export function createHelpers(page, collector, ctx) {
|
|
|
305
354
|
catch (err) {
|
|
306
355
|
throw actionError('hover', selector, err);
|
|
307
356
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
else {
|
|
312
|
-
ctx.resumeCapture();
|
|
313
|
-
}
|
|
357
|
+
await resolvePendingTransition();
|
|
358
|
+
if (narration)
|
|
359
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
314
360
|
},
|
|
315
361
|
async press(key, actionOpts) {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const
|
|
362
|
+
clearSlideState();
|
|
363
|
+
const narration = actionOpts?.narration ? ctx.popNarration() : null;
|
|
364
|
+
const narStartMs = narration ? ctx.currentTimeMs() : 0;
|
|
365
|
+
if (narration)
|
|
366
|
+
emitNarrationEvent(narration);
|
|
319
367
|
const startMs = ctx.currentTimeMs();
|
|
320
368
|
try {
|
|
321
369
|
await page.keyboard.press(key);
|
|
@@ -332,53 +380,38 @@ export function createHelpers(page, collector, ctx) {
|
|
|
332
380
|
catch (err) {
|
|
333
381
|
throw actionError('press', key, err);
|
|
334
382
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
else {
|
|
339
|
-
ctx.resumeCapture();
|
|
340
|
-
}
|
|
383
|
+
await resolvePendingTransition();
|
|
384
|
+
if (narration)
|
|
385
|
+
await sleepRemainingNarration(narStartMs, narration.durationMs);
|
|
341
386
|
},
|
|
342
387
|
async wait(ms) {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
const file = await ctx.captureOneFrame();
|
|
347
|
-
const holdFrames = msToFrames(ms);
|
|
348
|
-
if (holdFrames > 1)
|
|
349
|
-
ctx.addHold(file, holdFrames - 1);
|
|
350
|
-
collector.emit({ type: 'wait', timestampMs: ctx.currentTimeMs(), durationMs: ms, reason: 'pacing' });
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
// Ensure capture is running — captures real frames during the wait
|
|
354
|
-
ctx.resumeCapture();
|
|
355
|
-
collector.emit({ type: 'wait', timestampMs: ctx.currentTimeMs(), durationMs: ms, reason: 'pacing' });
|
|
356
|
-
await page.waitForTimeout(ms);
|
|
357
|
-
}
|
|
388
|
+
clearSlideState();
|
|
389
|
+
collector.emit({ type: 'wait', timestampMs: ctx.currentTimeMs(), durationMs: ms, reason: 'pacing' });
|
|
390
|
+
await page.waitForTimeout(ms);
|
|
358
391
|
},
|
|
359
392
|
async narrate(text) {
|
|
360
|
-
|
|
393
|
+
clearSlideState();
|
|
394
|
+
const narration = ctx.popNarration();
|
|
395
|
+
emitNarrationEvent(narration);
|
|
396
|
+
await page.waitForTimeout(narration.durationMs);
|
|
361
397
|
},
|
|
362
398
|
async transition(transitionOpts) {
|
|
363
399
|
const durationMs = transitionOpts?.duration ?? 500;
|
|
364
400
|
if (durationMs <= 0 || !Number.isFinite(durationMs)) {
|
|
365
401
|
throw new Error(`sw.transition() duration must be a positive number, got ${durationMs}`);
|
|
366
402
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
// Remove the last marker
|
|
370
|
-
const markers = ctx._transitionMarkers;
|
|
371
|
-
if (markers && markers.length > 0)
|
|
372
|
-
markers.pop();
|
|
373
|
-
}
|
|
374
|
-
await ctx.pauseCapture();
|
|
375
|
-
ctx.addTransitionMarker({
|
|
376
|
-
afterEntryIndex: ctx.manifest.length - 1,
|
|
403
|
+
const marker = {
|
|
404
|
+
afterEntryIndex: lastSlideEntryIndex >= 0 ? lastSlideEntryIndex : ctx.manifest.length - 1,
|
|
377
405
|
transition: transitionOpts?.type ?? 'fade',
|
|
378
406
|
durationFrames: msToFrames(durationMs),
|
|
379
|
-
}
|
|
407
|
+
};
|
|
408
|
+
// Use the saved slide frame as the explicit "before" image
|
|
409
|
+
if (lastSlideFile) {
|
|
410
|
+
marker.beforeFile = lastSlideFile;
|
|
411
|
+
}
|
|
412
|
+
ctx.addTransitionMarker(marker);
|
|
413
|
+
pendingTransitionMarker = marker;
|
|
380
414
|
ctx.transitionPending = true;
|
|
381
|
-
// Capture loop stays paused — next resolving action will resume it
|
|
382
415
|
},
|
|
383
416
|
};
|
|
384
417
|
}
|