screenci 0.0.75 → 0.0.78

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.
Files changed (226) hide show
  1. package/dist/cli.d.ts +62 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +699 -229
  4. package/dist/cli.js.map +1 -1
  5. package/dist/docs/manifest.d.ts +277 -91
  6. package/dist/docs/manifest.d.ts.map +1 -1
  7. package/dist/docs/manifest.js +101 -30
  8. package/dist/docs/manifest.js.map +1 -1
  9. package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts +2 -0
  10. package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts.map +1 -0
  11. package/dist/docs/video-sources/camera-and-zooming.screenci.js +57 -0
  12. package/dist/docs/video-sources/camera-and-zooming.screenci.js.map +1 -0
  13. package/dist/docs/video-sources/installation.screenci.js +19 -10
  14. package/dist/docs/video-sources/installation.screenci.js.map +1 -1
  15. package/dist/docs/video-sources/landing.screenci.js +6 -8
  16. package/dist/docs/video-sources/landing.screenci.js.map +1 -1
  17. package/dist/docs/video-sources/languages.screenci.d.ts +2 -0
  18. package/dist/docs/video-sources/languages.screenci.d.ts.map +1 -0
  19. package/dist/docs/video-sources/languages.screenci.js +68 -0
  20. package/dist/docs/video-sources/languages.screenci.js.map +1 -0
  21. package/dist/docs/video-sources/locator-highlight-animated.screenci.js +4 -5
  22. package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
  23. package/dist/docs/video-sources/locator-highlight-still.screenci.js +3 -4
  24. package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
  25. package/dist/docs/video-sources/narration.screenci.d.ts +2 -0
  26. package/dist/docs/video-sources/narration.screenci.d.ts.map +1 -0
  27. package/dist/docs/video-sources/narration.screenci.js +71 -0
  28. package/dist/docs/video-sources/narration.screenci.js.map +1 -0
  29. package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts +2 -0
  30. package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts.map +1 -0
  31. package/dist/docs/video-sources/public-urls-and-embeds.screenci.js +60 -0
  32. package/dist/docs/video-sources/public-urls-and-embeds.screenci.js.map +1 -0
  33. package/dist/docs/video-sources/speaking-style.screenci.d.ts +2 -0
  34. package/dist/docs/video-sources/speaking-style.screenci.d.ts.map +1 -0
  35. package/dist/docs/video-sources/speaking-style.screenci.js +76 -0
  36. package/dist/docs/video-sources/speaking-style.screenci.js.map +1 -0
  37. package/dist/docs/video-sources/studio.screenci.js +8 -10
  38. package/dist/docs/video-sources/studio.screenci.js.map +1 -1
  39. package/dist/docs/video-sources/vertical-video.screenci.d.ts +2 -0
  40. package/dist/docs/video-sources/vertical-video.screenci.d.ts.map +1 -0
  41. package/dist/docs/video-sources/vertical-video.screenci.js +58 -0
  42. package/dist/docs/video-sources/vertical-video.screenci.js.map +1 -0
  43. package/dist/docs/videos.d.ts +20 -0
  44. package/dist/docs/videos.d.ts.map +1 -1
  45. package/dist/docs/videos.js +25 -0
  46. package/dist/docs/videos.js.map +1 -1
  47. package/dist/e2e/instrument.e2e.js +60 -1
  48. package/dist/e2e/instrument.e2e.js.map +1 -1
  49. package/dist/e2e/redact.e2e.d.ts +2 -0
  50. package/dist/e2e/redact.e2e.d.ts.map +1 -0
  51. package/dist/e2e/redact.e2e.js +161 -0
  52. package/dist/e2e/redact.e2e.js.map +1 -0
  53. package/dist/index.d.ts +12 -6
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +8 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/src/asset.d.ts +174 -14
  58. package/dist/src/asset.d.ts.map +1 -1
  59. package/dist/src/asset.js +320 -39
  60. package/dist/src/asset.js.map +1 -1
  61. package/dist/src/assetHash.d.ts +27 -0
  62. package/dist/src/assetHash.d.ts.map +1 -0
  63. package/dist/src/assetHash.js +0 -0
  64. package/dist/src/assetHash.js.map +1 -0
  65. package/dist/src/audio.d.ts +20 -1
  66. package/dist/src/audio.d.ts.map +1 -1
  67. package/dist/src/audio.js +126 -24
  68. package/dist/src/audio.js.map +1 -1
  69. package/dist/src/autoZoom.d.ts.map +1 -1
  70. package/dist/src/autoZoom.js +3 -1
  71. package/dist/src/autoZoom.js.map +1 -1
  72. package/dist/src/browserLaunchOptions.d.ts +24 -2
  73. package/dist/src/browserLaunchOptions.d.ts.map +1 -1
  74. package/dist/src/browserLaunchOptions.js +57 -3
  75. package/dist/src/browserLaunchOptions.js.map +1 -1
  76. package/dist/src/builder.d.ts +229 -136
  77. package/dist/src/builder.d.ts.map +1 -1
  78. package/dist/src/builder.js +264 -77
  79. package/dist/src/builder.js.map +1 -1
  80. package/dist/src/callerFile.d.ts +12 -0
  81. package/dist/src/callerFile.d.ts.map +1 -0
  82. package/dist/src/callerFile.js +46 -0
  83. package/dist/src/callerFile.js.map +1 -0
  84. package/dist/src/changeFocus.d.ts.map +1 -1
  85. package/dist/src/changeFocus.js +109 -36
  86. package/dist/src/changeFocus.js.map +1 -1
  87. package/dist/src/config.d.ts.map +1 -1
  88. package/dist/src/config.js +15 -0
  89. package/dist/src/config.js.map +1 -1
  90. package/dist/src/cue.d.ts +29 -17
  91. package/dist/src/cue.d.ts.map +1 -1
  92. package/dist/src/cue.js +138 -61
  93. package/dist/src/cue.js.map +1 -1
  94. package/dist/src/declare.d.ts +63 -0
  95. package/dist/src/declare.d.ts.map +1 -0
  96. package/dist/src/declare.js +111 -0
  97. package/dist/src/declare.js.map +1 -0
  98. package/dist/src/defaults.d.ts +23 -0
  99. package/dist/src/defaults.d.ts.map +1 -1
  100. package/dist/src/defaults.js +27 -3
  101. package/dist/src/defaults.js.map +1 -1
  102. package/dist/src/events.d.ts +339 -25
  103. package/dist/src/events.d.ts.map +1 -1
  104. package/dist/src/events.js +250 -26
  105. package/dist/src/events.js.map +1 -1
  106. package/dist/src/htmlRasterizer.d.ts +10 -0
  107. package/dist/src/htmlRasterizer.d.ts.map +1 -1
  108. package/dist/src/htmlRasterizer.js +12 -2
  109. package/dist/src/htmlRasterizer.js.map +1 -1
  110. package/dist/src/init.d.ts +2 -0
  111. package/dist/src/init.d.ts.map +1 -1
  112. package/dist/src/init.js +81 -33
  113. package/dist/src/init.js.map +1 -1
  114. package/dist/src/instrument.d.ts.map +1 -1
  115. package/dist/src/instrument.js +164 -8
  116. package/dist/src/instrument.js.map +1 -1
  117. package/dist/src/locales.d.ts.map +1 -1
  118. package/dist/src/locales.js +1 -0
  119. package/dist/src/locales.js.map +1 -1
  120. package/dist/src/localize.d.ts +26 -17
  121. package/dist/src/localize.d.ts.map +1 -1
  122. package/dist/src/localize.js +19 -11
  123. package/dist/src/localize.js.map +1 -1
  124. package/dist/src/localizeRuntime.d.ts +29 -33
  125. package/dist/src/localizeRuntime.d.ts.map +1 -1
  126. package/dist/src/localizeRuntime.js +74 -49
  127. package/dist/src/localizeRuntime.js.map +1 -1
  128. package/dist/src/logger.d.ts +5 -0
  129. package/dist/src/logger.d.ts.map +1 -1
  130. package/dist/src/logger.js +7 -0
  131. package/dist/src/logger.js.map +1 -1
  132. package/dist/src/manualZoom.d.ts.map +1 -1
  133. package/dist/src/manualZoom.js +8 -5
  134. package/dist/src/manualZoom.js.map +1 -1
  135. package/dist/src/narrationVisibility.d.ts +19 -0
  136. package/dist/src/narrationVisibility.d.ts.map +1 -0
  137. package/dist/src/narrationVisibility.js +26 -0
  138. package/dist/src/narrationVisibility.js.map +1 -0
  139. package/dist/src/openBrowser.d.ts +34 -0
  140. package/dist/src/openBrowser.d.ts.map +1 -0
  141. package/dist/src/openBrowser.js +62 -0
  142. package/dist/src/openBrowser.js.map +1 -0
  143. package/dist/src/recordingData.d.ts +27 -0
  144. package/dist/src/recordingData.d.ts.map +1 -1
  145. package/dist/src/recordingSize.d.ts +32 -0
  146. package/dist/src/recordingSize.d.ts.map +1 -0
  147. package/dist/src/recordingSize.js +54 -0
  148. package/dist/src/recordingSize.js.map +1 -0
  149. package/dist/src/redact.d.ts +68 -0
  150. package/dist/src/redact.d.ts.map +1 -0
  151. package/dist/src/redact.js +138 -0
  152. package/dist/src/redact.js.map +1 -0
  153. package/dist/src/redactController.d.ts +61 -0
  154. package/dist/src/redactController.d.ts.map +1 -0
  155. package/dist/src/redactController.js +232 -0
  156. package/dist/src/redactController.js.map +1 -0
  157. package/dist/src/runtimeContext.d.ts +32 -0
  158. package/dist/src/runtimeContext.d.ts.map +1 -1
  159. package/dist/src/runtimeContext.js +21 -0
  160. package/dist/src/runtimeContext.js.map +1 -1
  161. package/dist/src/runtimeMode.d.ts +15 -7
  162. package/dist/src/runtimeMode.d.ts.map +1 -1
  163. package/dist/src/runtimeMode.js +17 -6
  164. package/dist/src/runtimeMode.js.map +1 -1
  165. package/dist/src/screenAudio.d.ts +88 -0
  166. package/dist/src/screenAudio.d.ts.map +1 -0
  167. package/dist/src/screenAudio.js +0 -0
  168. package/dist/src/screenAudio.js.map +1 -0
  169. package/dist/src/screenAudioSink.d.ts +46 -0
  170. package/dist/src/screenAudioSink.d.ts.map +1 -0
  171. package/dist/src/screenAudioSink.js +77 -0
  172. package/dist/src/screenAudioSink.js.map +1 -0
  173. package/dist/src/screenshot.d.ts +27 -29
  174. package/dist/src/screenshot.d.ts.map +1 -1
  175. package/dist/src/screenshot.js +39 -24
  176. package/dist/src/screenshot.js.map +1 -1
  177. package/dist/src/sourceTrim.d.ts +29 -0
  178. package/dist/src/sourceTrim.d.ts.map +1 -0
  179. package/dist/src/sourceTrim.js +76 -0
  180. package/dist/src/sourceTrim.js.map +1 -0
  181. package/dist/src/stillCapture.d.ts +5 -0
  182. package/dist/src/stillCapture.d.ts.map +1 -1
  183. package/dist/src/stillCapture.js +11 -1
  184. package/dist/src/stillCapture.js.map +1 -1
  185. package/dist/src/studio.d.ts +69 -57
  186. package/dist/src/studio.d.ts.map +1 -1
  187. package/dist/src/studio.js +16 -38
  188. package/dist/src/studio.js.map +1 -1
  189. package/dist/src/timelineOffset.d.ts +46 -0
  190. package/dist/src/timelineOffset.d.ts.map +1 -0
  191. package/dist/src/timelineOffset.js +66 -0
  192. package/dist/src/timelineOffset.js.map +1 -0
  193. package/dist/src/titleValidation.d.ts +38 -0
  194. package/dist/src/titleValidation.d.ts.map +1 -1
  195. package/dist/src/titleValidation.js +42 -0
  196. package/dist/src/titleValidation.js.map +1 -1
  197. package/dist/src/types.d.ts +218 -2
  198. package/dist/src/types.d.ts.map +1 -1
  199. package/dist/src/types.js +1 -1
  200. package/dist/src/types.js.map +1 -1
  201. package/dist/src/video.d.ts +74 -60
  202. package/dist/src/video.d.ts.map +1 -1
  203. package/dist/src/video.js +201 -39
  204. package/dist/src/video.js.map +1 -1
  205. package/dist/src/voiceSampleAudio.d.ts +34 -0
  206. package/dist/src/voiceSampleAudio.d.ts.map +1 -0
  207. package/dist/src/voiceSampleAudio.js +105 -0
  208. package/dist/src/voiceSampleAudio.js.map +1 -0
  209. package/dist/src/voices.d.ts +2 -2
  210. package/dist/src/voices.d.ts.map +1 -1
  211. package/dist/src/voices.js +8 -3
  212. package/dist/src/voices.js.map +1 -1
  213. package/dist/src/zoom.d.ts +1 -0
  214. package/dist/src/zoom.d.ts.map +1 -1
  215. package/dist/src/zoom.js +3 -0
  216. package/dist/src/zoom.js.map +1 -1
  217. package/dist/tsconfig.tsbuildinfo +1 -1
  218. package/package.json +3 -2
  219. package/skills/screenci/SKILL.md +2 -2
  220. package/skills/screenci/references/init.md +4 -3
  221. package/skills/screenci/references/record.md +1 -1
  222. package/templates/recordings/assets/logo.png +0 -0
  223. package/dist/docs/video-sources/public-urls.screenci.d.ts +0 -2
  224. package/dist/docs/video-sources/public-urls.screenci.d.ts.map +0 -1
  225. package/dist/docs/video-sources/public-urls.screenci.js +0 -41
  226. package/dist/docs/video-sources/public-urls.screenci.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-urls-and-embeds.screenci.d.ts","sourceRoot":"","sources":["../../../docs/video-sources/public-urls-and-embeds.screenci.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { hide, resetZoom, video, voices, zoomTo } from 'screenci';
2
+ video.use({
3
+ renderOptions: {
4
+ narration: {
5
+ voice: { name: voices.Sophie, style: 'Friendly product guide' },
6
+ },
7
+ },
8
+ });
9
+ const appUrl = process.env.SCREENCI_APP_URL ?? 'https://app.screenci.com/';
10
+ // Public URLs walkthrough recorded against the ScreenCI app (app.screenci.com) for
11
+ // the Public URLs and Embeds guide. It opens a finished video and highlights the
12
+ // Enable public URL switch that mints stable, language-specific delivery URLs.
13
+ // Recording needs a logged-in session: set SCREENCI_APP_STORAGE_STATE (see
14
+ // screenci.config.ts). The navigation mirrors studio.screenci.ts up to the video
15
+ // page.
16
+ //
17
+ // The logo intro (assets/logo.png) is gitignored: it is uploaded on the first
18
+ // record and reused on later runs (CI included).
19
+ video
20
+ .overlays({
21
+ logo: { path: './assets/logo.png', fill: 'recording', duration: '2s' },
22
+ })
23
+ .narration({
24
+ en: {
25
+ intro: 'Public URLs give a finished video a stable delivery surface.',
26
+ enable: 'Turn on Enable public URL to mint a route for each language.',
27
+ auto: 'Auto-select keeps every language on its latest finished render.',
28
+ outro: 'Embed the URL in docs, changelogs, or release pages.',
29
+ },
30
+ })('Public URLs and embeds', async ({ page, narration, overlays }) => {
31
+ // The public-delivery switch lives behind auth (SCREENCI_APP_STORAGE_STATE).
32
+ video.skip(!process.env.SCREENCI_APP_STORAGE_STATE, 'Requires SCREENCI_APP_STORAGE_STATE (a logged-in app session).');
33
+ // Open a finished video page without showing the navigation.
34
+ await hide(async () => {
35
+ await page.goto(appUrl);
36
+ await page.waitForLoadState('networkidle');
37
+ await page
38
+ .getByRole('heading', { name: 'Projects' })
39
+ .waitFor({ timeout: 30000 });
40
+ await page.getByTestId('projects-list').getByRole('link').first().click();
41
+ await page.locator('a[href*="/video/"]').first().click();
42
+ await page
43
+ .getByRole('heading', { name: /language versions/i })
44
+ .waitFor({ timeout: 15000 });
45
+ });
46
+ await overlays.logo.for('2s');
47
+ await narration.intro();
48
+ // Frame the public-delivery control, identified by its label text.
49
+ await narration.enable.start();
50
+ const enableControl = page.getByText(/enable public url/i).first();
51
+ if (await enableControl.isVisible().catch(() => false)) {
52
+ await zoomTo(enableControl);
53
+ await page.waitForTimeout(900);
54
+ await resetZoom();
55
+ }
56
+ await narration.enable.end();
57
+ await narration.auto();
58
+ await narration.outro();
59
+ });
60
+ //# sourceMappingURL=public-urls-and-embeds.screenci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-urls-and-embeds.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/public-urls-and-embeds.screenci.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjE,KAAK,CAAC,GAAG,CAAC;IACR,aAAa,EAAE;QACb,SAAS,EAAE;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE;SAChE;KACF;CACF,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,2BAA2B,CAAA;AAE1E,mFAAmF;AACnF,iFAAiF;AACjF,+EAA+E;AAC/E,2EAA2E;AAC3E,iFAAiF;AACjF,QAAQ;AACR,EAAE;AACF,8EAA8E;AAC9E,iDAAiD;AACjD,KAAK;KACF,QAAQ,CAAC;IACR,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;CACvE,CAAC;KACD,SAAS,CAAC;IACT,EAAE,EAAE;QACF,KAAK,EAAE,8DAA8D;QACrE,MAAM,EAAE,8DAA8D;QACtE,IAAI,EAAE,iEAAiE;QACvE,KAAK,EAAE,sDAAsD;KAC9D;CACF,CAAC,CAAC,wBAAwB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrE,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CACR,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EACvC,gEAAgE,CACjE,CAAA;IAED,6DAA6D;IAC7D,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAA;QAE1C,MAAM,IAAI;aACP,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAC1C,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9B,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAA;QACzE,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAA;QACxD,MAAM,IAAI;aACP,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;aACpD,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;IAEvB,mEAAmE;IACnE,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAA;IAClE,IAAI,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;QAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,SAAS,EAAE,CAAA;IACnB,CAAC;IACD,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;IAE5B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IACtB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;AACzB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=speaking-style.screenci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speaking-style.screenci.d.ts","sourceRoot":"","sources":["../../../docs/video-sources/speaking-style.screenci.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { hide, video, voices } from 'screenci';
2
+ video.use({
3
+ renderOptions: {
4
+ recording: {
5
+ size: 0.85,
6
+ shape: 'rounded',
7
+ roundness: 0.05,
8
+ dropShadow: 'drop-shadow(0 22px 49px rgba(0,0,0,0.28)) drop-shadow(0 6px 15px rgba(0,0,0,0.17))',
9
+ },
10
+ narration: {
11
+ voice: {
12
+ name: voices.Nora,
13
+ style: 'Clear and professional product narrator.',
14
+ },
15
+ size: 0.3,
16
+ shape: 'rounded',
17
+ roundness: 0,
18
+ corner: 'bottom-right',
19
+ padding: 0.04,
20
+ dropShadow: 1,
21
+ },
22
+ output: {
23
+ aspectRatio: '16:9',
24
+ quality: '1080p',
25
+ background: {
26
+ backgroundCss: 'linear-gradient(313deg, #ffffff 0%, #d6d6d6 100%)',
27
+ },
28
+ },
29
+ },
30
+ });
31
+ // Each cue carries its own style prompt, so the voice adapts its delivery per
32
+ // line without any audio editing.
33
+ video.narration({
34
+ en: {
35
+ hook: {
36
+ cue: 'Every narration line can have its own speaking style.',
37
+ voice: {
38
+ name: voices.Nora,
39
+ style: 'Warm and intriguing, drawing the viewer in.',
40
+ },
41
+ },
42
+ explain: {
43
+ cue: 'You write a style prompt alongside the text. The same voice reads the line, but the delivery follows the prompt you wrote.',
44
+ voice: {
45
+ name: voices.Nora,
46
+ style: 'Measured and instructional, making a point clearly.',
47
+ },
48
+ },
49
+ reveal: {
50
+ cue: 'One script can have a calm explainer, then shift to an excited reveal, all in the same render.',
51
+ voice: {
52
+ name: voices.Nora,
53
+ style: 'Energetic and enthusiastic, building into a reveal.',
54
+ },
55
+ },
56
+ outro: {
57
+ cue: 'Write the style in plain English. The voice does the rest.',
58
+ voice: {
59
+ name: voices.Nora,
60
+ style: 'Confident and conclusive, landing the final thought.',
61
+ },
62
+ },
63
+ },
64
+ })('Per-cue speaking style', async ({ page, narration }) => {
65
+ await hide(async () => {
66
+ await page.goto('https://screenci.com/docs/guides/narration');
67
+ await page.waitForLoadState('networkidle');
68
+ });
69
+ await narration.hook();
70
+ await narration.explain();
71
+ await page.evaluate(() => window.scrollBy({ top: 400, behavior: 'smooth' }));
72
+ await page.waitForTimeout(1200);
73
+ await narration.reveal();
74
+ await narration.outro();
75
+ });
76
+ //# sourceMappingURL=speaking-style.screenci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speaking-style.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/speaking-style.screenci.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAE9C,KAAK,CAAC,GAAG,CAAC;IACR,aAAa,EAAE;QACb,SAAS,EAAE;YACT,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI;YACf,UAAU,EACR,oFAAoF;SACvF;QACD,SAAS,EAAE;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,0CAA0C;aAClD;YACD,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;SACd;QACD,MAAM,EAAE;YACN,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE;gBACV,aAAa,EAAE,mDAAmD;aACnE;SACF;KACF;CACF,CAAC,CAAA;AAEF,8EAA8E;AAC9E,kCAAkC;AAClC,KAAK,CAAC,SAAS,CAAC;IACd,EAAE,EAAE;QACF,IAAI,EAAE;YACJ,GAAG,EAAE,uDAAuD;YAC5D,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,6CAA6C;aACrD;SACF;QACD,OAAO,EAAE;YACP,GAAG,EAAE,4HAA4H;YACjI,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,qDAAqD;aAC7D;SACF;QACD,MAAM,EAAE;YACN,GAAG,EAAE,gGAAgG;YACrG,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,qDAAqD;aAC7D;SACF;QACD,KAAK,EAAE;YACL,GAAG,EAAE,4DAA4D;YACjE,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,sDAAsD;aAC9D;SACF;KACF;CACF,CAAC,CAAC,wBAAwB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;IACzD,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;QAC7D,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IACtB,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;IAEzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAE/B,MAAM,SAAS,CAAC,MAAM,EAAE,CAAA;IACxB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;AACzB,CAAC,CAAC,CAAA"}
@@ -12,16 +12,14 @@ const appUrl = process.env.SCREENCI_APP_URL ?? 'https://app.screenci.com/';
12
12
  // auth, so recording this needs a logged-in session: set SCREENCI_APP_STORAGE_STATE
13
13
  // to a Playwright storageState JSON (see screenci.config.ts). The walkthrough is
14
14
  // self-contained: it opens the first project and video, then enters Studio.
15
- video.localize({
16
- narration: {
17
- en: {
18
- intro: 'Open any finished video in Studio to edit it right in the browser.',
19
- edit: 'Review render options in the Studio panel, then render a new version. No code, no re-recording.',
20
- },
21
- es: {
22
- intro: 'Abre cualquier video terminado en Studio para editarlo directamente en el navegador.',
23
- edit: 'Revisa las opciones de render en el panel de Studio y genera una nueva version. Sin codigo y sin volver a grabar.',
24
- },
15
+ video.narration({
16
+ en: {
17
+ intro: 'Open any finished video in Studio to edit it right in the browser.',
18
+ edit: 'Review render options in the Studio panel, then render a new version. No code, no re-recording.',
19
+ },
20
+ es: {
21
+ intro: 'Abre cualquier video terminado en Studio para editarlo directamente en el navegador.',
22
+ edit: 'Revisa las opciones de render en el panel de Studio y genera una nueva version. Sin codigo y sin volver a grabar.',
25
23
  },
26
24
  })('Studio web editing', async ({ page, narration }) => {
27
25
  // Studio lives behind auth, so this recording only works with a logged-in
@@ -1 +1 @@
1
- {"version":3,"file":"studio.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/studio.screenci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"studio.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/studio.screenci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vertical-video.screenci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-video.screenci.d.ts","sourceRoot":"","sources":["../../../docs/video-sources/vertical-video.screenci.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { hide, video, voices } from 'screenci';
2
+ video.use({
3
+ renderOptions: {
4
+ recording: {
5
+ size: 0.82,
6
+ shape: 'rounded',
7
+ roundness: 0.05,
8
+ dropShadow: 'drop-shadow(0 20px 44px rgba(0,0,0,0.30)) drop-shadow(0 5px 12px rgba(0,0,0,0.16))',
9
+ },
10
+ narration: {
11
+ voice: {
12
+ name: voices.Sophie,
13
+ style: 'Calm and direct, presenting a product feature to developers.',
14
+ },
15
+ size: 0.26,
16
+ shape: 'rounded',
17
+ roundness: 0,
18
+ corner: 'bottom-right',
19
+ padding: 0.04,
20
+ dropShadow: 1,
21
+ },
22
+ output: {
23
+ aspectRatio: '9:16',
24
+ quality: '1080p',
25
+ background: {
26
+ backgroundCss: 'linear-gradient(170deg, #0f0c1e 0%, #1b1040 55%, #0d0b1a 100%)',
27
+ },
28
+ },
29
+ },
30
+ recordOptions: {
31
+ aspectRatio: '9:16',
32
+ // 720px wide viewport triggers mobile/responsive layout on the site.
33
+ // The render output stays at 1080p (1080x1920) via renderOptions.output.
34
+ quality: '720p',
35
+ },
36
+ });
37
+ video.narration({
38
+ en: {
39
+ hook: 'Most product videos are built for landscape. But social, ads, and mobile all need vertical.',
40
+ config: 'ScreenCI handles vertical natively. Set the aspect ratio to nine-sixteen and the recorder opens a portrait viewport automatically.',
41
+ demo: 'No cropping, no reframing. The whole walkthrough was captured vertically from frame one.',
42
+ outro: 'Same script, same narration, new format. One config change, re-render, done.',
43
+ },
44
+ })('Vertical video output', async ({ page, narration }) => {
45
+ await hide(async () => {
46
+ await page.goto('https://screenci.com/');
47
+ await page.waitForLoadState('networkidle');
48
+ });
49
+ await narration.hook();
50
+ await narration.config();
51
+ await page.evaluate(() => window.scrollBy({ top: 320, behavior: 'smooth' }));
52
+ await page.waitForTimeout(1600);
53
+ await narration.demo();
54
+ await page.evaluate(() => window.scrollBy({ top: 280, behavior: 'smooth' }));
55
+ await page.waitForTimeout(1400);
56
+ await narration.outro();
57
+ });
58
+ //# sourceMappingURL=vertical-video.screenci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-video.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/vertical-video.screenci.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAE9C,KAAK,CAAC,GAAG,CAAC;IACR,aAAa,EAAE;QACb,SAAS,EAAE;YACT,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI;YACf,UAAU,EACR,oFAAoF;SACvF;QACD,SAAS,EAAE;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,KAAK,EAAE,8DAA8D;aACtE;YACD,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;SACd;QACD,MAAM,EAAE;YACN,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE;gBACV,aAAa,EACX,gEAAgE;aACnE;SACF;KACF;IACD,aAAa,EAAE;QACb,WAAW,EAAE,MAAM;QACnB,qEAAqE;QACrE,yEAAyE;QACzE,OAAO,EAAE,MAAM;KAChB;CACF,CAAC,CAAA;AAEF,KAAK,CAAC,SAAS,CAAC;IACd,EAAE,EAAE;QACF,IAAI,EAAE,6FAA6F;QACnG,MAAM,EACJ,oIAAoI;QACtI,IAAI,EAAE,0FAA0F;QAChG,KAAK,EACH,8EAA8E;KACjF;CACF,CAAC,CAAC,uBAAuB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;IACxD,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IACtB,MAAM,SAAS,CAAC,MAAM,EAAE,CAAA;IAExB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAE/B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IAEtB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAE/B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;AACzB,CAAC,CAAC,CAAA"}
@@ -34,6 +34,26 @@ export declare const docsVideoRegistry: {
34
34
  readonly alt: "A marketing-site link highlighted by a pink ring with margin around it, framed as a branded still";
35
35
  readonly sourcePath: "screenci/docs/video-sources/locator-highlight-still.screenci.ts";
36
36
  };
37
+ readonly 'docs/guides/narration': {
38
+ readonly sourcePath: "screenci/docs/video-sources/narration.screenci.ts";
39
+ readonly showSource: false;
40
+ };
41
+ readonly 'docs/guides/camera-and-zooming': {
42
+ readonly sourcePath: "screenci/docs/video-sources/camera-and-zooming.screenci.ts";
43
+ readonly showSource: false;
44
+ };
45
+ readonly 'docs/guides/languages': {
46
+ readonly sourcePath: "screenci/docs/video-sources/languages.screenci.ts";
47
+ readonly showSource: false;
48
+ };
49
+ readonly 'docs/guides/studio': {
50
+ readonly sourcePath: "screenci/docs/video-sources/studio.screenci.ts";
51
+ readonly showSource: false;
52
+ };
53
+ readonly 'docs/guides/public-urls-and-embeds': {
54
+ readonly sourcePath: "screenci/docs/video-sources/public-urls-and-embeds.screenci.ts";
55
+ readonly showSource: false;
56
+ };
37
57
  };
38
58
  export declare function getDocVideo(slug: string): DocVideo | null;
39
59
  export declare function hasPublicId(video: DocVideo): video is PublishedDocVideo;
@@ -1 +1 @@
1
- {"version":3,"file":"videos.d.ts","sourceRoot":"","sources":["../../docs/videos.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,YAAY,CAAA;AAEjD,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAE9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAqBe,CAAA;AAE7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEzD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,IAAI,iBAAiB,CAEvE"}
1
+ {"version":3,"file":"videos.d.ts","sourceRoot":"","sources":["../../docs/videos.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,YAAY,CAAA;AAEjD,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAE9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Ce,CAAA;AAE7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEzD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,IAAI,iBAAiB,CAEvE"}
@@ -17,6 +17,31 @@ export const docsVideoRegistry = {
17
17
  alt: 'A marketing-site link highlighted by a pink ring with margin around it, framed as a branded still',
18
18
  sourcePath: 'screenci/docs/video-sources/locator-highlight-still.screenci.ts',
19
19
  },
20
+ // The narrated walkthroughs below are authored but not yet recorded: they have
21
+ // no publicId, so the page injects an invisible placeholder until the video is
22
+ // recorded and published, then a publicId is added here (see videos.ts docs).
23
+ // The four app demos record the authenticated app via shared auth
24
+ // (SCREENCI_APP_STORAGE_STATE); camera-and-zooming records the public site.
25
+ 'docs/guides/narration': {
26
+ sourcePath: 'screenci/docs/video-sources/narration.screenci.ts',
27
+ showSource: false,
28
+ },
29
+ 'docs/guides/camera-and-zooming': {
30
+ sourcePath: 'screenci/docs/video-sources/camera-and-zooming.screenci.ts',
31
+ showSource: false,
32
+ },
33
+ 'docs/guides/languages': {
34
+ sourcePath: 'screenci/docs/video-sources/languages.screenci.ts',
35
+ showSource: false,
36
+ },
37
+ 'docs/guides/studio': {
38
+ sourcePath: 'screenci/docs/video-sources/studio.screenci.ts',
39
+ showSource: false,
40
+ },
41
+ 'docs/guides/public-urls-and-embeds': {
42
+ sourcePath: 'screenci/docs/video-sources/public-urls-and-embeds.screenci.ts',
43
+ showSource: false,
44
+ },
20
45
  };
21
46
  export function getDocVideo(slug) {
22
47
  return docsVideoRegistry[slug] ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"videos.js","sourceRoot":"","sources":["../../docs/videos.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB,EAAE;QACnB,QAAQ,EAAE,kCAAkC;QAC5C,UAAU,EAAE,sDAAsD;QAClE,UAAU,EAAE,KAAK;KAClB;IACD,gEAAgE;IAChE,sBAAsB,EAAE;QACtB,QAAQ,EAAE,kCAAkC;QAC5C,UAAU,EACR,oEAAoE;KACvE;IACD,uEAAuE;IACvE,wBAAwB;IACxB,yBAAyB,EAAE;QACzB,QAAQ,EAAE,kCAAkC;QAC5C,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,mGAAmG;QACxG,UAAU,EACR,iEAAiE;KACpE;CAC0C,CAAA;AAE7C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,iBAAiB,CAAC,IAAsC,CAAC,IAAI,IAAI,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,OAAO,UAAU,IAAI,KAAK,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"videos.js","sourceRoot":"","sources":["../../docs/videos.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB,EAAE;QACnB,QAAQ,EAAE,kCAAkC;QAC5C,UAAU,EAAE,sDAAsD;QAClE,UAAU,EAAE,KAAK;KAClB;IACD,gEAAgE;IAChE,sBAAsB,EAAE;QACtB,QAAQ,EAAE,kCAAkC;QAC5C,UAAU,EACR,oEAAoE;KACvE;IACD,uEAAuE;IACvE,wBAAwB;IACxB,yBAAyB,EAAE;QACzB,QAAQ,EAAE,kCAAkC;QAC5C,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,mGAAmG;QACxG,UAAU,EACR,iEAAiE;KACpE;IACD,+EAA+E;IAC/E,+EAA+E;IAC/E,8EAA8E;IAC9E,kEAAkE;IAClE,4EAA4E;IAC5E,uBAAuB,EAAE;QACvB,UAAU,EAAE,mDAAmD;QAC/D,UAAU,EAAE,KAAK;KAClB;IACD,gCAAgC,EAAE;QAChC,UAAU,EAAE,4DAA4D;QACxE,UAAU,EAAE,KAAK;KAClB;IACD,uBAAuB,EAAE;QACvB,UAAU,EAAE,mDAAmD;QAC/D,UAAU,EAAE,KAAK;KAClB;IACD,oBAAoB,EAAE;QACpB,UAAU,EAAE,gDAAgD;QAC5D,UAAU,EAAE,KAAK;KAClB;IACD,oCAAoC,EAAE;QACpC,UAAU,EACR,gEAAgE;QAClE,UAAU,EAAE,KAAK;KAClB;CAC0C,CAAA;AAE7C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,iBAAiB,CAAC,IAAsC,CAAC,IAAI,IAAI,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,OAAO,UAAU,IAAI,KAAK,CAAA;AAC5B,CAAC"}
@@ -122,6 +122,14 @@ test.describe('click instrumentation', () => {
122
122
  });
123
123
  expect(await scrollY(page)).toBeGreaterThan(0);
124
124
  });
125
+ test('does not scroll when clicking an already-visible element', async ({ page, }) => {
126
+ expect(await scrollY(page)).toBe(0);
127
+ await clickableLocator(page.locator('#click-button')).click({
128
+ moveDuration: 50,
129
+ });
130
+ // The button is already on screen, so a plain click must not move the page.
131
+ expect(await scrollY(page)).toBe(0);
132
+ });
125
133
  test('actually clicks an off-screen button after scrolling', async ({ page, }) => {
126
134
  await clickableLocator(page.locator('#offscreen-click-button')).click({
127
135
  moveDuration: 50,
@@ -641,12 +649,25 @@ test.describe('mouse.move instrumentation', () => {
641
649
  ? events[0].easing
642
650
  : events[0].mouse?.easing).toBe('ease-out');
643
651
  });
644
- test('records mouseMove without easing for instant move', async ({ page, }) => {
652
+ test('a bare move animates by default with default easing', async ({ page, }) => {
645
653
  await page.mouse.move(100, 150);
646
654
  const events = mouseMoveEvents();
647
655
  expect(events).toHaveLength(1);
648
656
  expect(events[0].x).toBe(100);
649
657
  expect(events[0].y).toBe(150);
658
+ expect(moveEndMs(events[0]) - moveStartMs(events[0])).toBeGreaterThan(0);
659
+ expect(events[0].type === 'mouseMove'
660
+ ? events[0].easing
661
+ : events[0].mouse?.easing).toBe('ease-in-out');
662
+ });
663
+ test('records mouseMove without easing for an explicit instant move', async ({ page, }) => {
664
+ await page.mouse.move(100, 150, {
665
+ duration: 0,
666
+ });
667
+ const events = mouseMoveEvents();
668
+ expect(events).toHaveLength(1);
669
+ expect(events[0].x).toBe(100);
670
+ expect(events[0].y).toBe(150);
650
671
  expect(events[0].type === 'mouseMove'
651
672
  ? events[0].easing
652
673
  : events[0].mouse?.easing).toBeUndefined();
@@ -670,6 +691,44 @@ test.describe('mouse.move instrumentation', () => {
670
691
  });
671
692
  });
672
693
  // ---------------------------------------------------------------------------
694
+ // page.mouse press methods (down / up / click / dblclick)
695
+ // ---------------------------------------------------------------------------
696
+ test.describe('mouse press instrumentation', () => {
697
+ async function clickButtonCenter(page) {
698
+ const bb = await page.locator('#click-button').boundingBox();
699
+ return { x: bb.x + bb.width / 2, y: bb.y + bb.height / 2 };
700
+ }
701
+ test('records page.mouse.down and page.mouse.up as their own input events', async ({ page, }) => {
702
+ const mouse = page.mouse;
703
+ await mouse.down();
704
+ await mouse.up();
705
+ const subTypes = inputEvents().map((e) => e.subType);
706
+ expect(subTypes).toEqual(['mouseDown', 'mouseUp']);
707
+ });
708
+ test('page.mouse.click actually clicks at the coordinates', async ({ page, }) => {
709
+ const { x, y } = await clickButtonCenter(page);
710
+ await page.mouse.click(x, y, {
711
+ moveDuration: 50,
712
+ });
713
+ await expect(page.locator('#click-status')).not.toHaveText('Not clicked');
714
+ expect(clickEvents()).toHaveLength(1);
715
+ });
716
+ test('fake page.mouse.click records a click but does not click the page', async ({ page, }) => {
717
+ const { x, y } = await clickButtonCenter(page);
718
+ await page.mouse.click(x, y, {
719
+ moveDuration: 50,
720
+ fake: true,
721
+ });
722
+ // The page was never actually clicked...
723
+ await expect(page.locator('#click-status')).toHaveText('Not clicked');
724
+ // ...but the click is still recorded for the video.
725
+ const events = clickEvents();
726
+ expect(events).toHaveLength(1);
727
+ expect(events[0].events.some((e) => e.type === 'mouseDown')).toBe(true);
728
+ expect(events[0].events.some((e) => e.type === 'mouseUp')).toBe(true);
729
+ });
730
+ });
731
+ // ---------------------------------------------------------------------------
673
732
  // hover
674
733
  // ---------------------------------------------------------------------------
675
734
  function hoverableLocator(locator) {