recordable 0.3.0 → 0.5.0

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 (102) hide show
  1. package/README.md +198 -44
  2. package/dist/actions.d.ts +8 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +11 -5
  5. package/dist/actions.js.map +1 -1
  6. package/dist/audio/track.d.ts +10 -0
  7. package/dist/audio/track.d.ts.map +1 -1
  8. package/dist/audio/track.js +19 -0
  9. package/dist/audio/track.js.map +1 -1
  10. package/dist/browser/cursor.d.ts +8 -6
  11. package/dist/browser/cursor.d.ts.map +1 -1
  12. package/dist/browser/cursor.js +32 -21
  13. package/dist/browser/cursor.js.map +1 -1
  14. package/dist/browser/dom.d.ts +33 -13
  15. package/dist/browser/dom.d.ts.map +1 -1
  16. package/dist/browser/dom.js +158 -56
  17. package/dist/browser/dom.js.map +1 -1
  18. package/dist/browser/page-zoom.d.ts +11 -0
  19. package/dist/browser/page-zoom.d.ts.map +1 -0
  20. package/dist/browser/page-zoom.js +37 -0
  21. package/dist/browser/page-zoom.js.map +1 -0
  22. package/dist/browser/play-button.d.ts.map +1 -1
  23. package/dist/browser/play-button.js.map +1 -1
  24. package/dist/browser/runtime.d.ts +1 -0
  25. package/dist/browser/runtime.d.ts.map +1 -1
  26. package/dist/browser/runtime.js +22 -14
  27. package/dist/browser/runtime.js.map +1 -1
  28. package/dist/browser/targets.d.ts.map +1 -0
  29. package/dist/{targets.js → browser/targets.js} +3 -2
  30. package/dist/browser/targets.js.map +1 -0
  31. package/dist/compose/boundaries.d.ts +13 -0
  32. package/dist/compose/boundaries.d.ts.map +1 -0
  33. package/dist/compose/boundaries.js +49 -0
  34. package/dist/compose/boundaries.js.map +1 -0
  35. package/dist/compose/mix.d.ts +3 -2
  36. package/dist/compose/mix.d.ts.map +1 -1
  37. package/dist/compose/mix.js +9 -4
  38. package/dist/compose/mix.js.map +1 -1
  39. package/dist/compose/recordable.d.ts +28 -3
  40. package/dist/compose/recordable.d.ts.map +1 -1
  41. package/dist/compose/recordable.js +75 -18
  42. package/dist/compose/recordable.js.map +1 -1
  43. package/dist/compose/session.d.ts +20 -8
  44. package/dist/compose/session.d.ts.map +1 -1
  45. package/dist/compose/session.js +120 -38
  46. package/dist/compose/session.js.map +1 -1
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +4 -3
  49. package/dist/config.js.map +1 -1
  50. package/dist/errors.d.ts +1 -1
  51. package/dist/errors.d.ts.map +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/ffmpeg.d.ts +3 -0
  54. package/dist/ffmpeg.d.ts.map +1 -1
  55. package/dist/ffmpeg.js +22 -4
  56. package/dist/ffmpeg.js.map +1 -1
  57. package/dist/formats/json.d.ts +2 -1
  58. package/dist/formats/json.d.ts.map +1 -1
  59. package/dist/formats/json.js.map +1 -1
  60. package/dist/formats/markdown/method.d.ts.map +1 -1
  61. package/dist/formats/markdown/method.js +4 -3
  62. package/dist/formats/markdown/method.js.map +1 -1
  63. package/dist/fs.d.ts +16 -0
  64. package/dist/fs.d.ts.map +1 -1
  65. package/dist/fs.js +33 -4
  66. package/dist/fs.js.map +1 -1
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/logger.d.ts.map +1 -1
  70. package/dist/logger.js +3 -1
  71. package/dist/logger.js.map +1 -1
  72. package/dist/result.d.ts +30 -0
  73. package/dist/result.d.ts.map +1 -0
  74. package/dist/result.js +8 -0
  75. package/dist/result.js.map +1 -0
  76. package/dist/timing.d.ts +2 -0
  77. package/dist/timing.d.ts.map +1 -1
  78. package/dist/timing.js +10 -4
  79. package/dist/timing.js.map +1 -1
  80. package/dist/validate.d.ts.map +1 -1
  81. package/dist/validate.js +11 -10
  82. package/dist/validate.js.map +1 -1
  83. package/dist/video/recorder.d.ts +26 -3
  84. package/dist/video/recorder.d.ts.map +1 -1
  85. package/dist/video/recorder.js +50 -32
  86. package/dist/video/recorder.js.map +1 -1
  87. package/dist/video/stitch.js +3 -17
  88. package/dist/video/stitch.js.map +1 -1
  89. package/dist/voiceover/compile.d.ts.map +1 -1
  90. package/dist/voiceover/compile.js +42 -24
  91. package/dist/voiceover/compile.js.map +1 -1
  92. package/dist/voiceover/elevenlabs.d.ts.map +1 -1
  93. package/dist/voiceover/elevenlabs.js +41 -11
  94. package/dist/voiceover/elevenlabs.js.map +1 -1
  95. package/dist/voiceover/mock.d.ts.map +1 -1
  96. package/dist/voiceover/mock.js +38 -15
  97. package/dist/voiceover/mock.js.map +1 -1
  98. package/package.json +20 -6
  99. package/recordable.schema.json +81 -0
  100. package/dist/targets.d.ts.map +0 -1
  101. package/dist/targets.js.map +0 -1
  102. /package/dist/{targets.d.ts → browser/targets.d.ts} +0 -0
@@ -1,7 +1,11 @@
1
1
  import { sleep } from "../utils.js";
2
- import { cursorMoveMs, PRESS_DOWN_MS, PRESS_SETTLE_MS } from "../timing.js";
2
+ import { cursorMoveMs, PRESS_DOWN_MS, PRESS_SETTLE_MS, PRESS_TRANSITION_MS, } from "../timing.js";
3
3
  const CURSOR_ID = "__recordable_cursor__";
4
4
  const CURSOR_STYLE_ID = "__recordable_cursor_style__";
5
+ /** Press-dip scale — presentation only. */
6
+ const CURSOR_PRESS_SCALE = 0.88;
7
+ /** Base move transition (ms) — presentation only. */
8
+ const CURSOR_MOVE_TRANSITION_MS = 150;
5
9
  /**
6
10
  * An animated cursor overlay drawn into the page. Tracks its own position so
7
11
  * each move can ease from where it last was, and dips on click for a tactile
@@ -22,12 +26,12 @@ export class Cursor {
22
26
  }
23
27
  /** Restore the parked position (if any) and re-inject — called on resume so the
24
28
  * new segment opens with the cursor where the previous one ended. */
25
- async unpark(page, zoom = { tx: 0, ty: 0, s: 1 }, pageZoom = 1) {
29
+ async unpark(page, zoom = { tx: 0, ty: 0, s: 1 }) {
26
30
  if (this.parked) {
27
31
  this.pos = this.parked;
28
32
  this.parked = null;
29
33
  }
30
- await this.inject(page, zoom, pageZoom);
34
+ await this.inject(page, zoom);
31
35
  }
32
36
  /**
33
37
  * Ensure the cursor overlay exists and sits at the carried position, then sync
@@ -36,15 +40,15 @@ export class Cursor {
36
40
  * repositions it — so a resume() can restore the cursor even when the overlay
37
41
  * survived the off-camera gap.
38
42
  */
39
- async inject(page, zoom = { tx: 0, ty: 0, s: 1 }, pageZoom = 1) {
43
+ async inject(page, zoom = { tx: 0, ty: 0, s: 1 }) {
40
44
  // Can't draw into an iframe or before the document's <body> has parsed. A
41
45
  // too-early call (e.g. from a navigation event) is a no-op; the next moveTo
42
46
  // re-injects when ready.
43
47
  const ready = await page.evaluate(() => window === window.parent && !!document.body);
44
48
  if (!ready)
45
49
  return;
46
- const { cx, cy } = await this._toDocCoords(page, this.pos.x, this.pos.y, zoom, pageZoom);
47
- await page.evaluate(({ id, styleId, cx, cy }) => {
50
+ const { cx, cy } = await this._toDocCoords(page, this.pos.x, this.pos.y, zoom);
51
+ await page.evaluate(({ id, styleId, cx, cy, moveMs, pressScale, pressMs }) => {
48
52
  // Note: we intentionally do NOT hide the native pointer. The screencast
49
53
  // doesn't capture the OS cursor, so it never reaches the video; hiding it
50
54
  // only blanked the real pointer in the live headful window (incl. during
@@ -60,12 +64,12 @@ export class Cursor {
60
64
  z-index: 2147483647;
61
65
  pointer-events: none;
62
66
  will-change: transform;
63
- transition: transform 0.15s;
67
+ transition: transform ${moveMs}ms;
64
68
  filter: drop-shadow(0 1px 2px rgba(0,0,0,0.4));
65
69
  }
66
70
  #${id}.pressing {
67
- transform: var(--recordable-pos) scale(0.88) !important;
68
- transition: transform 0.08s !important;
71
+ transform: var(--recordable-pos) scale(${pressScale}) !important;
72
+ transition: transform ${pressMs}ms !important;
69
73
  }
70
74
  `;
71
75
  document.head.appendChild(style);
@@ -85,20 +89,28 @@ export class Cursor {
85
89
  cursor.style.transition = "none";
86
90
  cursor.style.setProperty("--recordable-pos", `translate(${cx}px, ${cy}px)`);
87
91
  cursor.style.transform = `translate(${cx}px, ${cy}px)`;
88
- }, { id: CURSOR_ID, styleId: CURSOR_STYLE_ID, cx, cy });
92
+ }, {
93
+ id: CURSOR_ID,
94
+ styleId: CURSOR_STYLE_ID,
95
+ cx,
96
+ cy,
97
+ moveMs: CURSOR_MOVE_TRANSITION_MS,
98
+ pressScale: CURSOR_PRESS_SCALE,
99
+ pressMs: PRESS_TRANSITION_MS,
100
+ });
89
101
  await page.mouse.move(this.pos.x, this.pos.y);
90
102
  }
91
103
  /** Ease the overlay (and the real mouse) to viewport coords `toX,toY`. */
92
- async moveTo(page, toX, toY, zoom, pageZoom = 1) {
104
+ async moveTo(page, toX, toY, zoom) {
93
105
  // Self-heal: a navigation (incl. click-triggered ones with no following
94
106
  // visit/waitFor) wipes the overlay. Re-inject at the carried position before
95
107
  // animating, so the move is always visible — never an instant, cursor-less jump.
96
- await this.inject(page, zoom, pageZoom);
108
+ await this.inject(page, zoom);
97
109
  const dx = toX - this.pos.x;
98
110
  const dy = toY - this.pos.y;
99
111
  const dist = Math.sqrt(dx * dx + dy * dy);
100
112
  const dur = cursorMoveMs(dist);
101
- const { cx, cy } = await this._toDocCoords(page, toX, toY, zoom, pageZoom);
113
+ const { cx, cy } = await this._toDocCoords(page, toX, toY, zoom);
102
114
  await page.evaluate(({ id, cx, cy, dur }) => new Promise((resolve) => {
103
115
  const cursor = document.getElementById(id);
104
116
  if (!cursor) {
@@ -119,19 +131,18 @@ export class Cursor {
119
131
  * are positioned relative to that ancestor (not the viewport) and scroll with
120
132
  * the page, so we add scroll and apply the inverse zoom transform.
121
133
  *
122
- * `pageZoom` is the static CSS `zoom` on documentElement (the pageZoom config).
123
- * The overlay inherits that zoom, so its translate renders `pageZoom`× larger
124
- * divide it out so the cursor still lands on the target's visual position.
134
+ * Note: the `pageZoom` config (genuine browser zoom via chrome.tabs.setZoom)
135
+ * needs no handling here. Page zoom rescales the CSS pixel itself, so the
136
+ * overlay, the content, and Puppeteer's `boundingBox()`/`mouse` coords all share
137
+ * one post-zoom coordinate space — feeding the overlay those raw coords keeps it
138
+ * aligned with the target automatically.
125
139
  */
126
- async _toDocCoords(page, x, y, { tx, ty, s }, pageZoom = 1) {
140
+ async _toDocCoords(page, x, y, { tx, ty, s }) {
127
141
  const hasTransform = s !== 1 || tx !== 0 || ty !== 0;
128
142
  const scroll = hasTransform
129
143
  ? await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }))
130
144
  : { x: 0, y: 0 };
131
- return {
132
- cx: (x + scroll.x - tx) / s / pageZoom,
133
- cy: (y + scroll.y - ty) / s / pageZoom,
134
- };
145
+ return { cx: (x + scroll.x - tx) / s, cy: (y + scroll.y - ty) / s };
135
146
  }
136
147
  /** Briefly scale the cursor down to signal a press. */
137
148
  async clickEffect(page) {
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/browser/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/browser/cursor.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,24 @@
1
- import { type Page } from "puppeteer";
1
+ import { type ElementHandle, type Page } from "puppeteer";
2
2
  /** Coordinates in viewport pixels. */
3
3
  export interface Point {
4
4
  x: number;
5
5
  y: number;
6
6
  }
7
- /** Resolve a target and wait for the element to exist in the DOM, then return its handle. */
8
- export declare function getHandle(page: Page, target: string): Promise<import("puppeteer").ElementHandle<Element>>;
7
+ /** Resolve a target and wait for the element to be *visible* in any frame, then
8
+ * return its handle.
9
+ *
10
+ * Two reasons this is more than a bare `page.locator(...).waitHandle()`:
11
+ * - Visibility (not mere existence): callers immediately read `boundingBox()`
12
+ * to click/scroll, but Puppeteer's default locator resolves the instant the
13
+ * node enters the DOM (`waitForSelector(..., {visible:false})`) — so an
14
+ * element inserted-but-not-yet-laid-out yields a null box. `setVisibility`
15
+ * makes it wait for a real layout box.
16
+ * - Frames: modal dialogs (e.g. APEX `apex.navigation.dialog`) render their
17
+ * content in an `<iframe>`. The top frame can hold a hidden placeholder with
18
+ * the same id, so we race every frame and take the first *visible* match.
19
+ * An iframe element's `boundingBox()` is reported in main-frame coordinates,
20
+ * so the coordinate-based click still lands correctly. */
21
+ export declare function getHandle(page: Page, target: string): Promise<ElementHandle<Element>>;
9
22
  /** Centre coords of a target element, jittered up to 20% of each dimension. */
10
23
  export declare function getElementCenter(page: Page, target: string): Promise<Point>;
11
24
  /**
@@ -13,19 +26,26 @@ export declare function getElementCenter(page: Page, target: string): Promise<Po
13
26
  * Accepts CSS position keywords/percentages or an element selector.
14
27
  */
15
28
  export declare function originToCoords(page: Page, origin: string): Promise<Point>;
16
- /** Animate the page's scroll position to `targetY` over `duration` ms with an ease curve. */
17
- export declare function smoothScroll(page: Page, targetY: number, duration: number): Promise<void>;
18
29
  /**
19
- * Smooth-scroll to an element or position:
20
- * - `"top"` / `"bottom"` page extremes
21
- * - number absolute Y pixel position
22
- * - CSS selector or `text:` prefix → element centred in the viewport
30
+ * Animate a scroller's vertical position to `targetTop` over `duration` ms with an
31
+ * ease curve. `container` null scrolls the window; a handle scrolls that element's
32
+ * `scrollTop`. The target is clamped to the scroller's range.
23
33
  */
24
- export declare function smoothScrollToTarget(page: Page, target: string | number, duration: number): Promise<void>;
34
+ export declare function smoothScroll(page: Page, targetTop: number, duration: number, container?: ElementHandle<Element> | null): Promise<void>;
25
35
  /**
26
- * Scroll `target` into view if it lies outside the visible viewport (keeping
27
- * `margin` px clear on each side). No-op when the element is already fully
28
- * visible. `speed` (px/s) sets the scroll duration.
36
+ * Smooth-scroll to an element or position. Without `container` the window scrolls;
37
+ * with one, `target` is resolved against that scroll container instead:
38
+ * - `"top"` / `"bottom"` scroller extremes
39
+ * - number → absolute scrollTop (px)
40
+ * - CSS selector or `text:` prefix → element centred within the scroller
41
+ */
42
+ export declare function smoothScrollToTarget(page: Page, target: string | number, duration: number, container?: string): Promise<void>;
43
+ /**
44
+ * Scroll `target` into view if it lies outside the visible area (keeping `margin`
45
+ * px clear on each side). No-op when already comfortably visible. `speed` (px/s)
46
+ * sets the scroll duration. Scrolls the target's nearest scrollable container
47
+ * first (so it's revealed inside a modal / sidebar / pane), then the window so the
48
+ * container itself is on screen.
29
49
  */
30
50
  export declare function scrollIntoView(page: Page, target: string, margin: number, speed: number): Promise<void>;
31
51
  //# sourceMappingURL=dom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/browser/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,sCAAsC;AACtC,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,6FAA6F;AAC7F,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,uDAMzD;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CAShB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CA4BhB;AAED,6FAA6F;AAC7F,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiCf"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/browser/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAW1D,sCAAsC;AACtC,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;;;;;;6DAa6D;AAC7D,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mCAczD;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CAchB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CA4BhB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAW,GAC9C,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAqFD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -1,11 +1,34 @@
1
- import { isPositionValue, resolveTarget } from "../targets.js";
2
- /** Resolve a target and wait for the element to exist in the DOM, then return its handle. */
1
+ import { isPositionValue, resolveTarget } from "./targets.js";
2
+ import { RecordableError } from "../errors.js";
3
+ /** Jitter spread as a fraction of an element's dimension (±20% of each side). */
4
+ const JITTER_FRACTION = 0.4;
5
+ /** Frame interval in ms (≈ one 60fps frame). */
6
+ const FRAME_MS = 16;
7
+ /** Default viewport height (px) when the page has no viewport set. */
8
+ const DEFAULT_VIEWPORT_HEIGHT = 900;
9
+ /** Resolve a target and wait for the element to be *visible* in any frame, then
10
+ * return its handle.
11
+ *
12
+ * Two reasons this is more than a bare `page.locator(...).waitHandle()`:
13
+ * - Visibility (not mere existence): callers immediately read `boundingBox()`
14
+ * to click/scroll, but Puppeteer's default locator resolves the instant the
15
+ * node enters the DOM (`waitForSelector(..., {visible:false})`) — so an
16
+ * element inserted-but-not-yet-laid-out yields a null box. `setVisibility`
17
+ * makes it wait for a real layout box.
18
+ * - Frames: modal dialogs (e.g. APEX `apex.navigation.dialog`) render their
19
+ * content in an `<iframe>`. The top frame can hold a hidden placeholder with
20
+ * the same id, so we race every frame and take the first *visible* match.
21
+ * An iframe element's `boundingBox()` is reported in main-frame coordinates,
22
+ * so the coordinate-based click still lands correctly. */
3
23
  export async function getHandle(page, target) {
24
+ const selector = resolveTarget(target);
4
25
  try {
5
- return await page.locator(resolveTarget(target)).waitHandle();
26
+ return await Promise.any(page
27
+ .frames()
28
+ .map((f) => f.locator(selector).setVisibility("visible").waitHandle()));
6
29
  }
7
30
  catch {
8
- throw new Error(`Could not find target: "${target}"`);
31
+ throw new RecordableError("TARGET_NOT_FOUND", `Could not find target: "${target}"`);
9
32
  }
10
33
  }
11
34
  /** Centre coords of a target element, jittered up to 20% of each dimension. */
@@ -13,8 +36,8 @@ export async function getElementCenter(page, target) {
13
36
  const handle = await getHandle(page, target);
14
37
  const box = await handle.boundingBox();
15
38
  if (!box)
16
- throw new Error(`No bounding box for "${target}"`);
17
- const offset = (range) => (Math.random() - 0.5) * range * 0.4;
39
+ throw new RecordableError("TARGET_NOT_FOUND", `No bounding box for "${target}"`);
40
+ const offset = (range) => (Math.random() - 0.5) * range * JITTER_FRACTION;
18
41
  return {
19
42
  x: box.x + box.width / 2 + offset(box.width),
20
43
  y: box.y + box.height / 2 + offset(box.height),
@@ -54,81 +77,160 @@ export async function originToCoords(page, origin) {
54
77
  return { x: (vw * px) / 100, y: (vh * py) / 100 };
55
78
  }, origin);
56
79
  }
57
- /** Animate the page's scroll position to `targetY` over `duration` ms with an ease curve. */
58
- export async function smoothScroll(page, targetY, duration) {
59
- await page.evaluate(({ targetY, duration }) => {
80
+ /**
81
+ * Animate a scroller's vertical position to `targetTop` over `duration` ms with an
82
+ * ease curve. `container` null scrolls the window; a handle scrolls that element's
83
+ * `scrollTop`. The target is clamped to the scroller's range.
84
+ */
85
+ export async function smoothScroll(page, targetTop, duration, container = null) {
86
+ await page.evaluate(
87
+ // frameMs is passed in: a module-level const isn't visible inside this
88
+ // browser-context closure.
89
+ (el, { targetTop, duration, frameMs }) => {
60
90
  return new Promise((resolve) => {
61
- const startY = window.scrollY;
62
- const dist = targetY - startY;
63
- const frames = Math.ceil(duration / 16);
91
+ const max = el
92
+ ? el.scrollHeight - el.clientHeight
93
+ : document.documentElement.scrollHeight - window.innerHeight;
94
+ const end = Math.max(0, Math.min(targetTop, max));
95
+ const startY = el ? el.scrollTop : window.scrollY;
96
+ const dist = end - startY;
97
+ const frames = Math.ceil(duration / frameMs);
64
98
  let i = 0;
65
99
  const id = setInterval(() => {
66
100
  i++;
67
101
  const p = Math.min(i / frames, 1);
68
102
  const e = p < 0.5 ? 4 * p * p * p : (p - 1) * (2 * p - 2) * (2 * p - 2) + 1;
69
- window.scrollTo(0, startY + dist * e);
103
+ const y = startY + dist * e;
104
+ if (el)
105
+ el.scrollTop = y;
106
+ else
107
+ window.scrollTo(0, y);
70
108
  if (p >= 1) {
71
109
  clearInterval(id);
72
110
  resolve();
73
111
  }
74
- }, 16);
112
+ }, frameMs);
75
113
  });
76
- }, { targetY, duration });
114
+ }, container, { targetTop, duration, frameMs: FRAME_MS });
77
115
  }
78
116
  /**
79
- * Smooth-scroll to an element or position:
80
- * - `"top"` / `"bottom"` page extremes
81
- * - number absolute Y pixel position
82
- * - CSS selector or `text:` prefix element centred in the viewport
117
+ * Smooth-scroll to an element or position. Without `container` the window scrolls;
118
+ * with one, `target` is resolved against that scroll container instead:
119
+ * - `"top"` / `"bottom"` scroller extremes
120
+ * - numberabsolute scrollTop (px)
121
+ * - CSS selector or `text:` prefix → element centred within the scroller
83
122
  */
84
- export async function smoothScrollToTarget(page, target, duration) {
123
+ export async function smoothScrollToTarget(page, target, duration, container) {
124
+ const scroller = container ? await getHandle(page, container) : null;
85
125
  if (typeof target === "number")
86
- return smoothScroll(page, target, duration);
126
+ return smoothScroll(page, target, duration, scroller);
87
127
  if (target === "top")
88
- return smoothScroll(page, 0, duration);
128
+ return smoothScroll(page, 0, duration, scroller);
89
129
  if (target === "bottom") {
90
- const bottom = await page.evaluate(() => document.body.scrollHeight);
91
- return smoothScroll(page, bottom, duration);
130
+ const bottom = await page.evaluate((el) => (el ? el.scrollHeight : document.body.scrollHeight), scroller);
131
+ return smoothScroll(page, bottom, duration, scroller);
92
132
  }
93
133
  const handle = await getHandle(page, target);
94
- const y = await page.evaluate((el, vh) => {
134
+ const top = await page.evaluate((el, scrollEl, vh) => {
95
135
  const rect = el.getBoundingClientRect();
136
+ if (scrollEl) {
137
+ // Centre the child within the container's visible area.
138
+ const box = scrollEl.getBoundingClientRect();
139
+ return (scrollEl.scrollTop +
140
+ (rect.top - box.top) +
141
+ rect.height / 2 -
142
+ scrollEl.clientHeight / 2);
143
+ }
96
144
  return window.scrollY + rect.top + rect.height / 2 - vh / 2;
97
- }, handle, page.viewport()?.height ?? 900);
98
- return smoothScroll(page, y, duration);
145
+ }, handle, scroller, page.viewport()?.height ?? DEFAULT_VIEWPORT_HEIGHT);
146
+ return smoothScroll(page, top, duration, scroller);
147
+ }
148
+ /** The scrollTop that brings the element comfortably into the scroller's view, or
149
+ * null when it's already comfortably visible. Pure geometry, shared by the window
150
+ * and container passes so both reveal an element the same way. */
151
+ function comfortTarget(m, margin) {
152
+ const { relTop, height, vh, scrollTop } = m;
153
+ const relBottom = relTop + height;
154
+ const comfort = margin * 2;
155
+ if (relTop >= comfort && relBottom <= vh - comfort)
156
+ return null;
157
+ // Tall element: top-align with margin.
158
+ if (height > vh - margin * 2)
159
+ return scrollTop + relTop - margin;
160
+ // Below the bottom comfort zone: scroll just enough to show it fully (centring
161
+ // would often overshoot the scroller's max and leave it pinned to the edge).
162
+ if (relBottom > vh - margin)
163
+ return scrollTop + relBottom - (vh - margin);
164
+ // Above the top comfort zone: scroll to show the top.
165
+ if (relTop < margin)
166
+ return scrollTop + relTop - margin;
167
+ // Within the comfort band but not comfortable: centre it.
168
+ return scrollTop + relTop + height / 2 - vh / 2;
169
+ }
170
+ /** Read the target's position within `container` (an element scroller) or, when
171
+ * null, within the window. */
172
+ function readMetrics(page, handle, container) {
173
+ return page.evaluate((el, c) => {
174
+ const r = el.getBoundingClientRect();
175
+ if (c) {
176
+ const b = c.getBoundingClientRect();
177
+ return {
178
+ relTop: r.top - b.top,
179
+ height: r.height,
180
+ vh: c.clientHeight,
181
+ scrollTop: c.scrollTop,
182
+ };
183
+ }
184
+ return {
185
+ relTop: r.top,
186
+ height: r.height,
187
+ vh: window.innerHeight,
188
+ scrollTop: window.scrollY,
189
+ };
190
+ }, handle, container);
191
+ }
192
+ /** The nearest ancestor that actually scrolls vertically (overflow auto/scroll +
193
+ * overflowing content), or null if none short of the document — in which case the
194
+ * window is the scroller. */
195
+ async function nearestScrollableAncestor(handle) {
196
+ const h = await handle.evaluateHandle((el) => {
197
+ let p = el.parentElement;
198
+ while (p && p !== document.body && p !== document.documentElement) {
199
+ const oy = getComputedStyle(p).overflowY;
200
+ if ((oy === "auto" || oy === "scroll" || oy === "overlay") &&
201
+ p.scrollHeight > p.clientHeight)
202
+ return p;
203
+ p = p.parentElement;
204
+ }
205
+ return null;
206
+ });
207
+ const el = h.asElement();
208
+ if (!el)
209
+ await h.dispose();
210
+ return el;
99
211
  }
100
212
  /**
101
- * Scroll `target` into view if it lies outside the visible viewport (keeping
102
- * `margin` px clear on each side). No-op when the element is already fully
103
- * visible. `speed` (px/s) sets the scroll duration.
213
+ * Scroll `target` into view if it lies outside the visible area (keeping `margin`
214
+ * px clear on each side). No-op when already comfortably visible. `speed` (px/s)
215
+ * sets the scroll duration. Scrolls the target's nearest scrollable container
216
+ * first (so it's revealed inside a modal / sidebar / pane), then the window so the
217
+ * container itself is on screen.
104
218
  */
105
219
  export async function scrollIntoView(page, target, margin, speed) {
106
220
  const handle = await getHandle(page, target);
107
- const scrollY = await page.evaluate((el, margin) => {
108
- const rect = el.getBoundingClientRect();
109
- const vh = window.innerHeight;
110
- const comfort = margin * 2;
111
- if (rect.top >= comfort && rect.bottom <= vh - comfort)
112
- return null;
113
- // Tall element: top-align with margin
114
- if (rect.height > vh - margin * 2)
115
- return window.scrollY + rect.top - margin;
116
- // Element extends below the bottom comfort zone: scroll just enough to
117
- // show it fully, rather than trying to centre it (which often overshoots
118
- // the page's max scroll and leaves the element at the viewport edge).
119
- if (rect.bottom > vh - margin)
120
- return window.scrollY + rect.bottom - (vh - margin);
121
- // Element extends above the top comfort zone: scroll to show top
122
- if (rect.top < margin)
123
- return window.scrollY + rect.top - margin;
124
- // In view but within the comfort band: centre it
125
- return window.scrollY + rect.top + rect.height / 2 - vh / 2;
126
- }, handle, margin);
127
- if (scrollY === null)
128
- return;
129
- const currentY = await page.evaluate(() => window.scrollY);
130
- const dist = Math.abs(scrollY - currentY);
131
- const duration = Math.max(200, (dist / speed) * 1000);
132
- await smoothScroll(page, scrollY, duration);
221
+ const container = await nearestScrollableAncestor(handle);
222
+ const reveal = async (scroller) => {
223
+ const metrics = await readMetrics(page, handle, scroller);
224
+ const top = comfortTarget(metrics, margin);
225
+ if (top === null)
226
+ return;
227
+ const dist = Math.abs(top - metrics.scrollTop);
228
+ const duration = Math.max(200, (dist / speed) * 1000);
229
+ await smoothScroll(page, top, duration, scroller);
230
+ };
231
+ if (container)
232
+ await reveal(container);
233
+ await reveal(null);
234
+ await container?.dispose();
133
235
  }
134
236
  //# sourceMappingURL=dom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/browser/dom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQ/D,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,MAAc;IACxD,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAU,EACV,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;IACtE,OAAO;QACL,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5C,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,MAAc;IAEd,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAAE,OAAO,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;SACZ,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,QAAQ;gBAC/B,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO;gBAC/B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;IACpD,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,OAAe,EACf,QAAgB;IAEhB,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC1B,CAAC,EAAE,CAAC;gBACJ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;gBAClC,MAAM,CAAC,GACL,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACX,aAAa,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,CACtB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,MAAuB,EACvB,QAAgB;IAEhB,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5E,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC3B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC,EACD,MAAM,EACN,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,GAAG,CAC/B,CAAC;IACF,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,MAAc,EACd,MAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CACjC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO;YAAE,OAAO,IAAI,CAAC;QAEpE,sCAAsC;QACtC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC;YAC/B,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAE5C,uEAAuE;QACvE,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM;YAC3B,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;QAEtD,iEAAiE;QACjE,IAAI,IAAI,CAAC,GAAG,GAAG,MAAM;YAAE,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAEjE,iDAAiD;QACjD,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC,EACD,MAAM,EACN,MAAM,CACP,CAAC;IACF,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/browser/dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ZoomExtension {
2
+ /** Launch args that load the extension. */
3
+ args: string[];
4
+ /** Remove the generated temp directory. */
5
+ cleanup: () => void;
6
+ }
7
+ /** Generate the bundled page-zoom extension for `zoom` and return its launch args
8
+ * plus a cleanup. Caller adds `args` to `puppeteer.launch` and calls `cleanup`
9
+ * once the browser has closed. */
10
+ export declare function createZoomExtension(zoom: number): ZoomExtension;
11
+ //# sourceMappingURL=page-zoom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-zoom.d.ts","sourceRoot":"","sources":["../../src/browser/page-zoom.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2CAA2C;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiBD;;mCAEmC;AACnC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAkB/D"}
@@ -0,0 +1,37 @@
1
+ import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ // Registers its listeners synchronously at top level (MV3 requirement) and
5
+ // re-applies on create + every load — page zoom is per-origin persistent, so this
6
+ // covers same-origin navigations and any `followNewTab` tabs.
7
+ const background = (zoom) => `
8
+ const ZOOM = ${zoom};
9
+ const apply = (id) => chrome.tabs.setZoom(id, ZOOM).catch(() => {});
10
+ chrome.tabs.onCreated.addListener((t) => apply(t.id));
11
+ chrome.tabs.onUpdated.addListener((id, info) => {
12
+ if (info.status === "loading" || info.status === "complete") apply(id);
13
+ });
14
+ chrome.runtime.onInstalled.addListener(() =>
15
+ chrome.tabs.query({}, (tabs) => tabs.forEach((t) => apply(t.id))),
16
+ );
17
+ `;
18
+ /** Generate the bundled page-zoom extension for `zoom` and return its launch args
19
+ * plus a cleanup. Caller adds `args` to `puppeteer.launch` and calls `cleanup`
20
+ * once the browser has closed. */
21
+ export function createZoomExtension(zoom) {
22
+ const dir = mkdtempSync(join(tmpdir(), "recordable-zoom-"));
23
+ writeFileSync(join(dir, "manifest.json"), JSON.stringify({
24
+ manifest_version: 3,
25
+ name: "recordable-page-zoom",
26
+ version: "1.0",
27
+ permissions: ["tabs"],
28
+ host_permissions: ["<all_urls>"],
29
+ background: { service_worker: "bg.js" },
30
+ }));
31
+ writeFileSync(join(dir, "bg.js"), background(zoom));
32
+ return {
33
+ args: [`--disable-extensions-except=${dir}`, `--load-extension=${dir}`],
34
+ cleanup: () => rmSync(dir, { recursive: true, force: true }),
35
+ };
36
+ }
37
+ //# sourceMappingURL=page-zoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-zoom.js","sourceRoot":"","sources":["../../src/browser/page-zoom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAwBjC,2EAA2E;AAC3E,kFAAkF;AAClF,8DAA8D;AAC9D,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;eACtB,IAAI;;;;;;;;;CASlB,CAAC;AAEF;;mCAEmC;AACnC,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC5D,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC1B,IAAI,CAAC,SAAS,CAAC;QACb,gBAAgB,EAAE,CAAC;QACnB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,CAAC,MAAM,CAAC;QACrB,gBAAgB,EAAE,CAAC,YAAY,CAAC;QAChC,UAAU,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;KACxC,CAAC,CACH,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,OAAO;QACL,IAAI,EAAE,CAAC,+BAA+B,GAAG,EAAE,EAAE,oBAAoB,GAAG,EAAE,CAAC;QACvE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"play-button.d.ts","sourceRoot":"","sources":["../../src/browser/play-button.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,YAAY,uBAAuB,CAAC;AA0EjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,MAAM,CAGR"}
1
+ {"version":3,"file":"play-button.d.ts","sourceRoot":"","sources":["../../src/browser/play-button.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,YAAY,uBAAuB,CAAC;AAsEjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,MAAM,CAGR"}
@@ -1 +1 @@
1
- {"version":3,"file":"play-button.js","sourceRoot":"","sources":["../../src/browser/play-button.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,SAAS,gBAAgB,CACvB,OAAe,EACf,EAAU,EACV,OAAe;IAEf,wDAAwD;IACxD,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO;IACrC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAAE,OAAO;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;YACnB,gBAAgB;YAChB,UAAU;YACV,2EAA2E;YAC3E,iEAAiE;YACjE,UAAU;YACV,4BAA4B;YAC5B,oBAAoB;YACpB,qBAAqB;YACrB,cAAc;YACd,oBAAoB;YACpB,UAAU;YACV,6BAA6B;YAC7B,gCAAgC;YAChC,YAAY;YACZ,qBAAqB;YACrB,uCAAuC;YACvC,yDAAyD;SAC1D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG;YAClB,WAAW;YACX,gBAAgB;YAChB,qBAAqB;YACrB,oBAAoB;YACpB,wBAAwB;YACxB,YAAY;YACZ,aAAa;YACb,mBAAmB;YACnB,oBAAoB;YACpB,YAAY;YACZ,gBAAgB;SACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;QACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;QAC5B,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,gEAAgE,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,EAAE,GAAI,MAAgD,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,OAAO,EAAE,KAAK,UAAU;gBAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC;QACF,sEAAsE;QACtE,iEAAiE;QACjE,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI;QAAE,KAAK,EAAE,CAAC;;QACtB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,EAAU,EACV,OAAe;IAEf,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,sCAAsC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC;AAC7F,CAAC"}
1
+ {"version":3,"file":"play-button.js","sourceRoot":"","sources":["../../src/browser/play-button.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,EAAU,EAAE,OAAe;IACpE,wDAAwD;IACxD,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO;IACrC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAAE,OAAO;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;YACnB,gBAAgB;YAChB,UAAU;YACV,2EAA2E;YAC3E,iEAAiE;YACjE,UAAU;YACV,4BAA4B;YAC5B,oBAAoB;YACpB,qBAAqB;YACrB,cAAc;YACd,oBAAoB;YACpB,UAAU;YACV,6BAA6B;YAC7B,gCAAgC;YAChC,YAAY;YACZ,qBAAqB;YACrB,uCAAuC;YACvC,yDAAyD;SAC1D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG;YAClB,WAAW;YACX,gBAAgB;YAChB,qBAAqB;YACrB,oBAAoB;YACpB,wBAAwB;YACxB,YAAY;YACZ,aAAa;YACb,mBAAmB;YACnB,oBAAoB;YACpB,YAAY;YACZ,gBAAgB;SACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;QACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;QAC5B,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,gEAAgE,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,EAAE,GAAI,MAAgD,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,OAAO,EAAE,KAAK,UAAU;gBAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC;QACF,sEAAsE;QACtE,iEAAiE;QACjE,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI;QAAE,KAAK,EAAE,CAAC;;QACtB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,EAAU,EACV,OAAe;IAEf,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,sCAAsC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC;AAC7F,CAAC"}
@@ -52,6 +52,7 @@ export declare class Runtime {
52
52
  y: number;
53
53
  }): Promise<void>;
54
54
  scroll(page: Page, target: string | number, options?: {
55
+ container?: string;
55
56
  duration?: number;
56
57
  }): Promise<void>;
57
58
  zoomTo(page: Page, level: number, options?: {