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.
@@ -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,SAsLvB,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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAmB,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,qCAAqC,CAAC;KAClD,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;KACnD,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,UAAU,CAAC;KAC5D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;KAC/C,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAI,EAAE,EAAE;IACvC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE/D,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG;QACzB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACnB,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/D,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,IAAI,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9C,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kDAAkD;IAClD,IAAI,YAAY,GAA8D,EAAE,CAAC;IACjF,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAClD,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;YAE5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,uCAAuC;gBACvC,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;oBACnE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;oBACrF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,uDAAuD;gBACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;gBAC/D,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEnD,OAAO,GAAG,GAAG,CAAC,yBAAyB,KAAK,CAAC,MAAM,iBAAiB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;gBACnG,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,KAAK,OAAO;wBAC9C,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;wBACpD,CAAC,CAAC,SAAS,CAAC;oBACd,YAAY,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE;wBAChD,OAAO,EAAE,gBAAgB;wBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,SAAS;wBACT,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;qBACpD,CAAC,CAAC;oBACH,OAAO,CAAC,OAAO,CAAC,aAAa,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;gBAClE,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;oBACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBACtC,YAAY,GAAG,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5C,IAAI,QAAQ,EAAE,OAAe,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC3C,YAAY,EAAE,YAAY;YAC1B,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;YAC3B,YAAY,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACjE,CAAC,CAAC;QACH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAEzB,8CAA8C;QAC9C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,sBAAsB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvE,OAAO,CAAC,OAAO,CAAC,YAAY,QAAQ,CAAC,MAAM,CAAC,MAAM,YAAY,UAAU,SAAS,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACpG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qFAAqF;IACrF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,eAAe,CAAC;YACpB,QAAQ;YACR,UAAU;YACV,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,aAAa;IACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,YAAY;IACZ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,MAAM,KAAK,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
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,CAwCjB;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,CAiBL"}
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; // each transition consumes the first expanded frame of the next entry
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 = afterEntryIdx < manifest.length
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
- // We inserted durationFrames and consumed 1 source frame
85
- offset += t.durationFrames - 1;
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
- offsetMs += (t.durationFrames - 1) * FRAME_MS;
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":"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"}
1
+ {"version":3,"file":"frame-resolve.js","sourceRoot":"","sources":["../../../src/composition/frame-resolve.ts"],"names":[],"mappings":"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"}
@@ -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
- pauseCapture(): Promise<void>;
30
- resumeCapture(): void;
31
- captureOneFrame(): Promise<string>;
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;AAEvE,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,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,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,aAAa,IAAI,IAAI,CAAC;IACtB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,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;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpG;AA6FD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,CAsTlH"}
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
- async function injectSlideOverlay(page, title, description, config) {
18
- const brandColor = config.brandColor ?? '#000000';
19
- const textColor = config.textColor ?? '#FFFFFF';
20
- const fontFamily = config.fontFamily;
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
- // Use string-based evaluate to avoid TypeScript checking browser globals
27
- let script = '';
57
+ // Preload font before showing the overlay so the capture loop
58
+ // never records frames with the fallback font.
28
59
  if (fontFamily) {
29
- const encoded = encodeURIComponent(fontFamily);
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
- async function emitNarration(text) {
93
- await ctx.pauseCapture();
94
- const narration = ctx.popNarration();
95
- const file = await ctx.captureOneFrame();
96
- const holdFrames = msToFrames(narration.durationMs);
97
- if (holdFrames > 1)
98
- ctx.addHold(file, holdFrames - 1); // captureOneFrame already added 1
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
- /** Resolve a pending transition after an action settles. */
138
- async function resolveTransition() {
139
- if (!ctx.transitionPending)
140
- return;
141
- const file = await ctx.captureOneFrame();
142
- // The "after" frame is now in the manifest — resume capture
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
- await injectSlideOverlay(page, title, description, slide);
165
- try {
166
- const file = await ctx.captureOneFrame();
167
- const holdFrames = msToFrames(slideDurationMs);
168
- if (holdFrames > 1)
169
- ctx.addHold(file, holdFrames - 1);
170
- }
171
- finally {
172
- await removeSlideOverlay(page);
173
- }
174
- collector.emit({ type: 'scene', timestampMs: ctx.currentTimeMs(), title, description, slide });
175
- // If transition was pending, the slide resolves it
176
- if (ctx.transitionPending) {
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
- // Do NOT resume capture herethe slide is self-contained.
180
- // Resuming would capture blank-page frames that corrupt subsequent
181
- // transition markers. The next real action resumes capture.
182
- }
183
- else {
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
- if (actionOpts?.narration)
190
- await emitNarration(actionOpts.narration);
191
- const wasPending = ctx.transitionPending;
192
- if (wasPending) {
193
- // Capture loop is already paused from transition()
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
- if (wasPending) {
212
- await resolveTransition();
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
- if (actionOpts?.narration)
220
- await emitNarration(actionOpts.narration);
221
- const wasPending = ctx.transitionPending;
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
- if (wasPending) {
243
- await resolveTransition();
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
- else {
246
- ctx.resumeCapture();
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
- if (actionOpts?.narration)
251
- await emitNarration(actionOpts.narration);
252
- const wasPending = ctx.transitionPending;
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
- if (wasPending) {
278
- await resolveTransition();
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
- if (actionOpts?.narration)
286
- await emitNarration(actionOpts.narration);
287
- const wasPending = ctx.transitionPending;
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
- if (wasPending) {
309
- await resolveTransition();
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
- if (actionOpts?.narration)
317
- await emitNarration(actionOpts.narration);
318
- const wasPending = ctx.transitionPending;
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
- if (wasPending) {
336
- await resolveTransition();
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
- if (ctx.transitionPending) {
344
- // Capture loop is already paused. Wait for real settling, then hold.
345
- await page.waitForTimeout(ms);
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
- await emitNarration(text);
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
- if (ctx.transitionPending) {
368
- console.warn('sw.transition() called twice with no action between them replacing previous transition marker.');
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
  }