@react-three-dom/playwright 0.1.2 → 0.3.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.
- package/dist/index.cjs +2146 -204
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1022 -82
- package/dist/index.d.ts +1022 -82
- package/dist/index.js +2135 -205
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waiters.ts","../src/interactions.ts","../src/fixtures.ts","../src/assertions.ts"],"names":["base","baseExpect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Page } from '@playwright/test';\n\n// ---------------------------------------------------------------------------\n// waitForSceneReady — wait until the scene object count stabilises\n// ---------------------------------------------------------------------------\n\nexport interface WaitForSceneReadyOptions {\n /** How many consecutive stable polls are required. Default: 3 */\n stableChecks?: number;\n /** Interval between polls in ms. Default: 100 */\n pollIntervalMs?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available and the scene's object count\n * has stabilised (no additions or removals) over several consecutive checks.\n */\nexport async function waitForSceneReady(\n page: Page,\n options: WaitForSceneReadyOptions = {},\n): Promise<void> {\n const {\n stableChecks = 3,\n pollIntervalMs = 100,\n timeout = 10_000,\n } = options;\n\n const deadline = Date.now() + timeout;\n\n // First, wait for __R3F_DOM__ to exist\n await page.waitForFunction(() => typeof window.__R3F_DOM__ !== 'undefined', undefined, {\n timeout,\n });\n\n let lastCount = -1;\n let stableRuns = 0;\n\n while (Date.now() < deadline) {\n const count = await page.evaluate(() => window.__R3F_DOM__!.getCount());\n\n if (count === lastCount && count > 0) {\n stableRuns++;\n if (stableRuns >= stableChecks) return;\n } else {\n stableRuns = 0;\n }\n\n lastCount = count;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForSceneReady timed out after ${timeout}ms. Last count: ${lastCount}, stable runs: ${stableRuns}/${stableChecks}`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForObject — wait for bridge + a specific object (when count never stabilizes)\n// ---------------------------------------------------------------------------\n\nexport interface WaitForObjectOptions {\n /** Time to wait for the bridge to appear. Default: 30_000 */\n bridgeTimeout?: number;\n /** Time to wait for the object to appear after bridge is ready. Default: 40_000 */\n objectTimeout?: number;\n /** Poll interval in ms. Default: 200 */\n pollIntervalMs?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available and an object with the given\n * testId or uuid exists in the scene.\n *\n * Use this instead of `waitForSceneReady` when the scene object count never\n * stabilizes (e.g. continuous loading, animations adding/removing objects,\n * or GLTF/models loading asynchronously).\n */\nexport async function waitForObject(\n page: Page,\n idOrUuid: string,\n options: WaitForObjectOptions = {},\n): Promise<void> {\n const {\n bridgeTimeout = 30_000,\n objectTimeout = 40_000,\n pollIntervalMs = 200,\n } = options;\n\n await page.waitForFunction(() => typeof window.__R3F_DOM__ !== 'undefined', undefined, {\n timeout: bridgeTimeout,\n });\n\n const deadline = Date.now() + objectTimeout;\n while (Date.now() < deadline) {\n const found = await page.evaluate(\n (id) => {\n const api = window.__R3F_DOM__;\n if (!api) return false;\n return (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n },\n idOrUuid,\n );\n if (found) return;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForObject(\"${idOrUuid}\") timed out after ${objectTimeout}ms. Is the object rendered with userData.testId or this uuid?`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForIdle — wait until no property changes for N consecutive frames\n// ---------------------------------------------------------------------------\n\nexport interface WaitForIdleOptions {\n /** Number of consecutive idle frames required. Default: 10 */\n idleFrames?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering animations or interactions.\n *\n * This works by taking successive snapshots and comparing them. When the\n * JSON representation is unchanged for `idleFrames` consecutive rAF\n * callbacks, the scene is considered idle.\n */\nexport async function waitForIdle(\n page: Page,\n options: WaitForIdleOptions = {},\n): Promise<void> {\n const {\n idleFrames = 10,\n timeout = 10_000,\n } = options;\n\n const settled = await page.evaluate(\n ([frames, timeoutMs]) => {\n return new Promise<boolean>((resolve) => {\n const deadline = Date.now() + timeoutMs;\n let lastJson = '';\n let stableCount = 0;\n\n function check() {\n if (Date.now() > deadline) {\n resolve(false);\n return;\n }\n\n const snap = window.__R3F_DOM__?.snapshot();\n const json = snap ? JSON.stringify(snap.tree) : '';\n\n if (json === lastJson && json !== '') {\n stableCount++;\n if (stableCount >= frames) {\n resolve(true);\n return;\n }\n } else {\n stableCount = 0;\n }\n\n lastJson = json;\n requestAnimationFrame(check);\n }\n\n requestAnimationFrame(check);\n });\n },\n [idleFrames, timeout] as const,\n );\n\n if (!settled) {\n throw new Error(`waitForIdle timed out after ${timeout}ms`);\n }\n}\n","import type { Page } from '@playwright/test';\n\n// ---------------------------------------------------------------------------\n// Interaction helpers — thin wrappers around page.evaluate calls to\n// window.__R3F_DOM__ interaction methods.\n// ---------------------------------------------------------------------------\n\nfunction ensureBridge(page: Page): Page {\n // The bridge is guaranteed to exist after waitForSceneReady.\n // If users skip that, the evaluate calls will throw a clear error.\n return page;\n}\n\n/** Click a 3D object by its testId or uuid. */\nexport async function click(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.click(id);\n }, idOrUuid);\n}\n\n/** Double-click a 3D object by its testId or uuid. */\nexport async function doubleClick(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.doubleClick(id);\n }, idOrUuid);\n}\n\n/** Right-click / context-menu a 3D object by its testId or uuid. */\nexport async function contextMenu(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.contextMenu(id);\n }, idOrUuid);\n}\n\n/** Hover over a 3D object by its testId or uuid. */\nexport async function hover(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.hover(id);\n }, idOrUuid);\n}\n\n/** Drag a 3D object by its testId or uuid with a given world-space delta. */\nexport async function drag(\n page: Page,\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n): Promise<void> {\n ensureBridge(page);\n await page.evaluate(\n ([id, d]) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.drag(id, d);\n },\n [idOrUuid, delta] as const,\n );\n}\n\n/** Dispatch a wheel/scroll event on a 3D object. */\nexport async function wheel(\n page: Page,\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n): Promise<void> {\n ensureBridge(page);\n await page.evaluate(\n ([id, opts]) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.wheel(id, opts);\n },\n [idOrUuid, options] as const,\n );\n}\n\n/** Click empty space to trigger onPointerMissed handlers. */\nexport async function pointerMiss(page: Page): Promise<void> {\n ensureBridge(page);\n await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.pointerMiss();\n });\n}\n","import { test as base } from '@playwright/test';\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection, SceneSnapshot } from './types';\nimport { waitForSceneReady, waitForIdle, waitForObject } from './waiters';\nimport type {\n WaitForSceneReadyOptions,\n WaitForIdleOptions,\n WaitForObjectOptions,\n} from './waiters';\nimport * as interactions from './interactions';\n\n// ---------------------------------------------------------------------------\n// R3FFixture — the main API object provided to Playwright tests\n// ---------------------------------------------------------------------------\n\nexport class R3FFixture {\n constructor(private readonly _page: Page) {}\n\n /** The underlying Playwright Page. */\n get page(): Page {\n return this._page;\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /** Get object metadata by testId or uuid. Returns null if not found. */\n async getObject(idOrUuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(id) ?? api.getByUuid(id) ?? null;\n }, idOrUuid);\n }\n\n /** Get heavy inspection data (Tier 2) by testId or uuid. */\n async inspect(idOrUuid: string): Promise<ObjectInspection | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(id);\n }, idOrUuid);\n }\n\n /** Take a full scene snapshot. */\n async snapshot(): Promise<SceneSnapshot | null> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.snapshot() : null;\n });\n }\n\n /** Get the total number of tracked objects. */\n async getCount(): Promise<number> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n });\n }\n\n // -----------------------------------------------------------------------\n // Interactions\n // -----------------------------------------------------------------------\n\n /** Click a 3D object by testId or uuid. */\n async click(idOrUuid: string): Promise<void> {\n return interactions.click(this._page, idOrUuid);\n }\n\n /** Double-click a 3D object by testId or uuid. */\n async doubleClick(idOrUuid: string): Promise<void> {\n return interactions.doubleClick(this._page, idOrUuid);\n }\n\n /** Right-click / context-menu a 3D object by testId or uuid. */\n async contextMenu(idOrUuid: string): Promise<void> {\n return interactions.contextMenu(this._page, idOrUuid);\n }\n\n /** Hover over a 3D object by testId or uuid. */\n async hover(idOrUuid: string): Promise<void> {\n return interactions.hover(this._page, idOrUuid);\n }\n\n /** Drag a 3D object with a world-space delta vector. */\n async drag(\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n ): Promise<void> {\n return interactions.drag(this._page, idOrUuid, delta);\n }\n\n /** Dispatch a wheel/scroll event on a 3D object. */\n async wheel(\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n ): Promise<void> {\n return interactions.wheel(this._page, idOrUuid, options);\n }\n\n /** Click empty space to trigger onPointerMissed handlers. */\n async pointerMiss(): Promise<void> {\n return interactions.pointerMiss(this._page);\n }\n\n // -----------------------------------------------------------------------\n // Waiters\n // -----------------------------------------------------------------------\n\n /**\n * Wait until the scene is ready — `window.__R3F_DOM__` is available and\n * the object count has stabilised across several consecutive checks.\n */\n async waitForSceneReady(options?: WaitForSceneReadyOptions): Promise<void> {\n return waitForSceneReady(this._page, options);\n }\n\n /**\n * Wait until the bridge is available and an object with the given testId or\n * uuid exists. Use this instead of waitForSceneReady when the scene count\n * never stabilizes (e.g. async model loading, continuous animations).\n */\n async waitForObject(\n idOrUuid: string,\n options?: WaitForObjectOptions,\n ): Promise<void> {\n return waitForObject(this._page, idOrUuid, options);\n }\n\n /**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering interactions or animations.\n */\n async waitForIdle(options?: WaitForIdleOptions): Promise<void> {\n return waitForIdle(this._page, options);\n }\n\n // -----------------------------------------------------------------------\n // Selection (for inspector integration)\n // -----------------------------------------------------------------------\n\n /** Select a 3D object by testId or uuid (highlights in scene). */\n async select(idOrUuid: string): Promise<void> {\n await this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found');\n api.select(id);\n }, idOrUuid);\n }\n\n /** Clear the current selection. */\n async clearSelection(): Promise<void> {\n await this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (api) api.clearSelection();\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// test.extend — add the `r3f` fixture to Playwright's test runner\n// ---------------------------------------------------------------------------\n\nexport const test = base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page);\n await use(fixture);\n },\n});\n","import { expect as baseExpect } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection } from './types';\n\n// ---------------------------------------------------------------------------\n// Custom Playwright expect matchers for 3D scene testing\n// ---------------------------------------------------------------------------\n\n/**\n * Extend Playwright's `expect` with 3D-native matchers.\n *\n * Usage:\n * ```ts\n * import { test, expect } from '@react-three-dom/playwright';\n *\n * test('chair exists', async ({ page, r3f }) => {\n * await r3f.waitForSceneReady();\n * await expect(r3f).toExist('chair-primary');\n * });\n * ```\n */\nexport const expect = baseExpect.extend({\n // -----------------------------------------------------------------------\n // toExist — verify an object with the given testId/uuid exists in the scene\n // -----------------------------------------------------------------------\n async toExist(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const meta = await r3f.getObject(idOrUuid);\n const pass = meta !== null;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT exist in the scene, but it does`\n : `Expected object \"${idOrUuid}\" to exist in the scene, but it was not found`,\n name: 'toExist',\n expected: idOrUuid,\n actual: meta,\n };\n },\n\n // -----------------------------------------------------------------------\n // toBeVisible — verify an object is visible (object.visible === true)\n // -----------------------------------------------------------------------\n async toBeVisible(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () => `Expected object \"${idOrUuid}\" to be visible, but it was not found in the scene`,\n name: 'toBeVisible',\n };\n }\n\n const pass = meta.visible;\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be visible, but it is`\n : `Expected object \"${idOrUuid}\" to be visible, but visible=${meta.visible}`,\n name: 'toBeVisible',\n expected: true,\n actual: meta.visible,\n };\n },\n\n // -----------------------------------------------------------------------\n // toBeInFrustum — verify an object's bounding box intersects the camera\n // frustum (i.e. it is potentially on-screen). Uses inspect() for bounds.\n // -----------------------------------------------------------------------\n async toBeInFrustum(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const inspection = await r3f.inspect(idOrUuid);\n if (!inspection) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to be in frustum, but it was not found in the scene`,\n name: 'toBeInFrustum',\n };\n }\n\n // If the bridge can project it to screen, it's in the frustum.\n // We check by verifying bounds exist and are finite.\n const { bounds } = inspection;\n const isFinite = (v: number[]) => v.every(Number.isFinite);\n const pass = isFinite(bounds.min) && isFinite(bounds.max);\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be in the camera frustum`\n : `Expected object \"${idOrUuid}\" to be in the camera frustum, but its bounds are invalid`,\n name: 'toBeInFrustum',\n expected: 'finite bounds',\n actual: bounds,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHavePosition — verify object position within tolerance\n // -----------------------------------------------------------------------\n async toHavePosition(\n r3f: R3FMatcherReceiver,\n idOrUuid: string,\n expected: [number, number, number],\n tolerance = 0.01,\n ) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have position [${expected}], but it was not found`,\n name: 'toHavePosition',\n };\n }\n\n const [ex, ey, ez] = expected;\n const [ax, ay, az] = meta.position;\n const dx = Math.abs(ax - ex);\n const dy = Math.abs(ay - ey);\n const dz = Math.abs(az - ez);\n const pass = dx <= tolerance && dy <= tolerance && dz <= tolerance;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be at position [${expected}] (±${tolerance})`\n : `Expected object \"${idOrUuid}\" to be at position [${expected}] (±${tolerance}), but it is at [${meta.position}] (delta: [${dx.toFixed(4)}, ${dy.toFixed(4)}, ${dz.toFixed(4)}])`,\n name: 'toHavePosition',\n expected,\n actual: meta.position,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHaveBounds — verify object bounding box (world-space)\n // -----------------------------------------------------------------------\n async toHaveBounds(\n r3f: R3FMatcherReceiver,\n idOrUuid: string,\n expected: { min: [number, number, number]; max: [number, number, number] },\n tolerance = 0.1,\n ) {\n const inspection = await r3f.inspect(idOrUuid);\n if (!inspection) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have specific bounds, but it was not found`,\n name: 'toHaveBounds',\n };\n }\n\n const { bounds } = inspection;\n const withinTolerance = (a: number[], b: number[]) =>\n a.every((v, i) => Math.abs(v - b[i]) <= tolerance);\n const pass = withinTolerance(bounds.min, expected.min) && withinTolerance(bounds.max, expected.max);\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}`\n : `Expected object \"${idOrUuid}\" to have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}, but got min:${JSON.stringify(bounds.min)} max:${JSON.stringify(bounds.max)}`,\n name: 'toHaveBounds',\n expected,\n actual: bounds,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHaveInstanceCount — verify InstancedMesh instance count\n // -----------------------------------------------------------------------\n async toHaveInstanceCount(r3f: R3FMatcherReceiver, idOrUuid: string, expectedCount: number) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have instance count ${expectedCount}, but it was not found`,\n name: 'toHaveInstanceCount',\n };\n }\n\n const actual = meta.instanceCount ?? 0;\n const pass = actual === expectedCount;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT have instance count ${expectedCount}`\n : `Expected object \"${idOrUuid}\" to have instance count ${expectedCount}, but it has ${actual}`,\n name: 'toHaveInstanceCount',\n expected: expectedCount,\n actual,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Helper type — the R3FFixture object that matchers receive\n// ---------------------------------------------------------------------------\n\ninterface R3FMatcherReceiver {\n getObject(idOrUuid: string): Promise<ObjectMetadata | null>;\n inspect(idOrUuid: string): Promise<ObjectInspection | null>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/diffSnapshots.ts","../src/waiters.ts","../src/interactions.ts","../src/reporter.ts","../src/fixtures.ts","../src/assertions.ts","../src/pathGenerators.ts"],"names":["base","baseExpect"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @module diffSnapshots\n *\n * Pure scene-diff utility. Compares two {@link SceneSnapshot}s by UUID and\n * returns added nodes, removed nodes, and per-field property changes\n * (name, type, testId, visible, position, rotation, scale).\n *\n * Stateless and side-effect-free — safe to call from any context.\n */\n\nimport type { SceneSnapshot, SnapshotNode } from './types';\n\n/** Describes a single property change on an object that exists in both snapshots. */\nexport interface SceneDiffChange {\n uuid: string;\n field: string;\n from: unknown;\n to: unknown;\n}\n\n/** Result of diffing two scene snapshots. */\nexport interface SceneDiff {\n /** Nodes present in `after` but not in `before` (from `after` tree). */\n added: SnapshotNode[];\n /** Nodes present in `before` but not in `after` (from `before` tree). */\n removed: SnapshotNode[];\n /** Property changes for nodes that exist in both; each entry is one field that changed. */\n changed: SceneDiffChange[];\n}\n\nconst FIELDS_TO_COMPARE: (keyof SnapshotNode)[] = [\n 'name',\n 'type',\n 'testId',\n 'visible',\n 'position',\n 'rotation',\n 'scale',\n];\n\nfunction flattenTree(node: SnapshotNode): Map<string, SnapshotNode> {\n const map = new Map<string, SnapshotNode>();\n function walk(n: SnapshotNode) {\n map.set(n.uuid, n);\n n.children.forEach(walk);\n }\n walk(node);\n return map;\n}\n\nfunction valueEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((v, i) => valueEqual(v, b[i]));\n }\n return false;\n}\n\n/**\n * Compare two scene snapshots and return added nodes, removed nodes, and\n * property changes for nodes that exist in both.\n *\n * - **added**: nodes in `after` whose uuid was not in `before`.\n * - **removed**: nodes in `before` whose uuid was not in `after`.\n * - **changed**: for each uuid present in both, lists field-level changes\n * (name, type, testId, visible, position, rotation, scale).\n */\nexport function diffSnapshots(before: SceneSnapshot, after: SceneSnapshot): SceneDiff {\n const beforeMap = flattenTree(before.tree);\n const afterMap = flattenTree(after.tree);\n\n const added: SnapshotNode[] = [];\n const removed: SnapshotNode[] = [];\n const changed: SceneDiffChange[] = [];\n\n for (const [uuid, node] of afterMap) {\n if (!beforeMap.has(uuid)) added.push(node);\n }\n for (const [uuid, node] of beforeMap) {\n if (!afterMap.has(uuid)) removed.push(node);\n }\n\n for (const [uuid, afterNode] of afterMap) {\n const beforeNode = beforeMap.get(uuid);\n if (!beforeNode) continue;\n\n for (const field of FIELDS_TO_COMPARE) {\n const from = (beforeNode as unknown as Record<string, unknown>)[field];\n const to = (afterNode as unknown as Record<string, unknown>)[field];\n if (!valueEqual(from, to)) {\n changed.push({ uuid, field, from, to });\n }\n }\n }\n\n return { added, removed, changed };\n}\n","/**\n * @module waiters\n *\n * Polling-based wait utilities for Playwright tests. Each waiter polls the\n * `window.__R3F_DOM__` bridge until a condition is met or a timeout fires.\n *\n * - {@link waitForSceneReady} — bridge ready + object count stabilised\n * - {@link waitForObject} — bridge ready + specific object exists\n * - {@link waitForIdle} — no property changes for N consecutive frames\n * - {@link waitForNewObject} — new object(s) appear after a baseline snapshot\n * - {@link waitForObjectRemoved} — object no longer in the scene\n *\n * All waiters fail fast with a rich diagnostic if the bridge reports an\n * `_error` state, preventing silent timeouts.\n */\n\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata } from './types';\n\n// ---------------------------------------------------------------------------\n// Shared: waitForReadyBridge — wait until __R3F_DOM__._ready === true\n// ---------------------------------------------------------------------------\n\n/**\n * Wait until the `window.__R3F_DOM__` bridge exists AND `_ready === true`.\n *\n * Fails fast with a rich diagnostic if the bridge is present but\n * `_ready === false` and `_error` is set (i.e. ThreeDom setup crashed).\n * This prevents all waiters from silently timing out when the bridge is\n * in an error state — the developer gets an immediate, actionable message.\n *\n * @internal Used by all public waiter functions.\n */\nasync function waitForReadyBridge(page: Page, timeout: number, canvasId?: string): Promise<void> {\n const deadline = Date.now() + timeout;\n const pollMs = 100;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return { exists: false as const };\n return {\n exists: true as const,\n ready: api._ready,\n error: api._error ?? null,\n count: api.getCount(),\n };\n }, canvasId ?? null);\n\n if (state.exists && state.ready) {\n return;\n }\n\n if (state.exists && !state.ready && state.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}\\n` +\n `The <ThreeDom> component mounted but threw during setup. ` +\n `Check the browser console for the full stack trace.`,\n );\n }\n\n await page.waitForTimeout(pollMs);\n }\n\n const finalState = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return { exists: false, ready: false, error: null };\n return { exists: true, ready: api._ready, error: api._error ?? null };\n }, canvasId ?? null);\n\n if (finalState.exists && finalState.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${finalState.error}\\n` +\n `The <ThreeDom> component mounted but threw during setup.`,\n );\n }\n\n throw new Error(\n `[react-three-dom] Timed out after ${timeout}ms waiting for the bridge to be ready.\\n` +\n `Bridge exists: ${finalState.exists}, ready: ${finalState.ready}.\\n` +\n `Ensure <ThreeDom> is mounted inside your <Canvas> component.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForSceneReady — wait until the scene object count stabilises\n// ---------------------------------------------------------------------------\n\nexport interface WaitForSceneReadyOptions {\n /** How many consecutive stable polls are required. Default: 3 */\n stableChecks?: number;\n /** Interval between polls in ms. Default: 100 */\n pollIntervalMs?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available, `_ready === true`, and the\n * scene's object count has stabilised over several consecutive checks.\n *\n * If the bridge exists but `_ready` is false and `_error` is set, this\n * fails immediately with a rich diagnostic message instead of timing out.\n */\nexport async function waitForSceneReady(\n page: Page,\n options: WaitForSceneReadyOptions & { canvasId?: string } = {},\n): Promise<void> {\n const {\n stableChecks = 3,\n pollIntervalMs = 100,\n timeout = 10_000,\n canvasId,\n } = options;\n\n const deadline = Date.now() + timeout;\n\n await waitForReadyBridge(page, timeout, canvasId);\n\n let lastCount = -1;\n let stableRuns = 0;\n\n while (Date.now() < deadline) {\n const count = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api!.getCount();\n }, canvasId ?? null);\n\n if (count === lastCount && count > 0) {\n stableRuns++;\n if (stableRuns >= stableChecks) return;\n } else {\n stableRuns = 0;\n }\n\n lastCount = count;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n const state = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api)\n return { bridgeFound: false as const, ready: false, error: null, objectCount: 0 };\n return {\n bridgeFound: true as const,\n ready: api._ready,\n error: api._error ?? null,\n objectCount: api.getCount(),\n };\n }, canvasId ?? null);\n\n const stateLine = state.bridgeFound\n ? `Bridge found: yes, _ready: ${state.ready}, _error: ${state.error ?? 'none'}, objectCount: ${state.objectCount}`\n : 'Bridge found: no (ensure <ThreeDom /> is mounted inside <Canvas> and refresh)';\n\n throw new Error(\n `waitForSceneReady timed out after ${timeout}ms. ${stateLine}. Last count: ${lastCount}, stable runs: ${stableRuns}/${stableChecks}.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForObject — wait for bridge + a specific object (when count never stabilizes)\n// ---------------------------------------------------------------------------\n\nexport interface WaitForObjectOptions {\n /** Time to wait for the bridge to appear. Default: 30_000 */\n bridgeTimeout?: number;\n /** Time to wait for the object to appear after bridge is ready. Default: 40_000 */\n objectTimeout?: number;\n /** Poll interval in ms. Default: 200 */\n pollIntervalMs?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is ready and an object with the given\n * testId or uuid exists in the scene.\n *\n * Use this instead of `waitForSceneReady` when the scene object count never\n * stabilizes (e.g. continuous loading, animations adding/removing objects,\n * or GLTF/models loading asynchronously).\n *\n * Fails fast if the bridge reports `_ready: false` with an `_error`.\n */\nexport async function waitForObject(\n page: Page,\n idOrUuid: string,\n options: WaitForObjectOptions & { canvasId?: string } = {},\n): Promise<void> {\n const {\n bridgeTimeout = 30_000,\n objectTimeout = 40_000,\n pollIntervalMs = 200,\n canvasId,\n } = options;\n\n await waitForReadyBridge(page, bridgeTimeout, canvasId);\n\n const deadline = Date.now() + objectTimeout;\n while (Date.now() < deadline) {\n const found = await page.evaluate(\n ([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api || !api._ready) return false;\n return (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n },\n [idOrUuid, canvasId ?? null] as const,\n );\n if (found) return;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n const diagnostics = await page.evaluate(\n ([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return { bridgeExists: false, ready: false, count: 0, error: null, suggestions: [] as Array<{ testId?: string; name: string; uuid: string }> };\n const suggestions = typeof api.fuzzyFind === 'function'\n ? api.fuzzyFind(id, 5).map((m: { testId?: string; name: string; uuid: string }) => ({ testId: m.testId, name: m.name, uuid: m.uuid }))\n : [];\n return {\n bridgeExists: true,\n ready: api._ready,\n count: api.getCount(),\n error: api._error ?? null,\n suggestions,\n };\n },\n [idOrUuid, canvasId ?? null] as const,\n );\n\n let msg =\n `waitForObject(\"${idOrUuid}\") timed out after ${objectTimeout}ms. ` +\n `Bridge: ${diagnostics.bridgeExists ? 'exists' : 'missing'}, ` +\n `ready: ${diagnostics.ready}, ` +\n `objectCount: ${diagnostics.count}` +\n (diagnostics.error ? `, error: ${diagnostics.error}` : '') + '. ' +\n `Is the object rendered with userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\"?`;\n\n if (diagnostics.suggestions.length > 0) {\n msg += '\\nDid you mean:\\n' +\n diagnostics.suggestions.map((s: { testId?: string; name: string; uuid: string }) => {\n const id = s.testId ? `testId=\"${s.testId}\"` : `uuid=\"${s.uuid}\"`;\n return ` → ${s.name || '(unnamed)'} [${id}]`;\n }).join('\\n');\n }\n\n throw new Error(msg);\n}\n\n// ---------------------------------------------------------------------------\n// waitForIdle — wait until no property changes for N consecutive frames\n// ---------------------------------------------------------------------------\n\nexport interface WaitForIdleOptions {\n /** Number of consecutive idle frames required. Default: 10 */\n idleFrames?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering animations or interactions.\n *\n * This works by taking successive snapshots and comparing them. When the\n * JSON representation is unchanged for `idleFrames` consecutive rAF\n * callbacks, the scene is considered idle.\n *\n * Checks `_ready === true` before starting. Fails fast if `_error` is set.\n */\nexport async function waitForIdle(\n page: Page,\n options: WaitForIdleOptions & { canvasId?: string } = {},\n): Promise<void> {\n const {\n idleFrames = 10,\n timeout = 10_000,\n canvasId,\n } = options;\n\n await waitForReadyBridge(page, timeout, canvasId);\n\n const settled = await page.evaluate(\n ([frames, timeoutMs, cid]) => {\n return new Promise<boolean | string>((resolve) => {\n const deadline = Date.now() + timeoutMs;\n let lastJson = '';\n let stableCount = 0;\n\n function check() {\n if (Date.now() > deadline) {\n resolve(false);\n return;\n }\n\n const api = cid\n ? (window as unknown as { __R3F_DOM_INSTANCES__?: Record<string, { _ready: boolean; _error?: string; snapshot(): { tree: unknown } }> }).__R3F_DOM_INSTANCES__?.[cid]\n : (window as unknown as { __R3F_DOM__?: { _ready: boolean; _error?: string; snapshot(): { tree: unknown } } }).__R3F_DOM__;\n if (!api || !api._ready) {\n if (api && api._error) {\n resolve(`Bridge error: ${api._error}`);\n return;\n }\n requestAnimationFrame(check);\n return;\n }\n\n const snap = api.snapshot();\n const json = JSON.stringify(snap.tree);\n\n if (json === lastJson && json !== '') {\n stableCount++;\n if (stableCount >= frames) {\n resolve(true);\n return;\n }\n } else {\n stableCount = 0;\n }\n\n lastJson = json;\n requestAnimationFrame(check);\n }\n\n requestAnimationFrame(check);\n });\n },\n [idleFrames, timeout, canvasId ?? null] as const,\n );\n\n if (typeof settled === 'string') {\n throw new Error(`waitForIdle failed: ${settled}`);\n }\n if (!settled) {\n throw new Error(`waitForIdle timed out after ${timeout}ms`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// waitForNewObject — wait until a new object appears in the scene\n// ---------------------------------------------------------------------------\n\nexport interface WaitForNewObjectOptions {\n /**\n * Only consider new objects of this Three.js type (e.g. \"Mesh\", \"Line\").\n * If not set, any new object type qualifies.\n */\n type?: string;\n\n /**\n * If provided, the new object's name must contain this substring.\n * Useful for apps that name objects predictably (e.g. \"stroke-\", \"wall-\").\n */\n nameContains?: string;\n\n /**\n * Poll interval in ms. Default: 100\n */\n pollIntervalMs?: number;\n\n /**\n * Overall timeout in ms. Default: 10_000\n */\n timeout?: number;\n}\n\n/** Result returned when new objects are detected. */\nexport interface WaitForNewObjectResult {\n /** Metadata of all newly added objects (matching the filter). */\n newObjects: ObjectMetadata[];\n /** UUIDs of the newly added objects. */\n newUuids: string[];\n /** Total number of new objects detected. */\n count: number;\n}\n\n/**\n * Wait until one or more new objects appear in the scene that were not present\n * at the time this function was called.\n *\n * This is designed for drawing/annotation apps where user interactions\n * (like `drawPath`) create new Three.js objects asynchronously.\n *\n * @param page Playwright Page instance\n * @param options Filter and timing options\n * @returns Metadata of the newly added object(s)\n * @throws If no new objects appear within the timeout\n *\n * @example\n * ```typescript\n * // Draw a stroke, then wait for the new Line object\n * const before = await r3f.getCount();\n * await r3f.drawPath(points);\n * const result = await waitForNewObject(page, { type: 'Line' });\n * expect(result.count).toBe(1);\n * ```\n */\nexport async function waitForNewObject(\n page: Page,\n options: WaitForNewObjectOptions & { canvasId?: string } = {},\n): Promise<WaitForNewObjectResult> {\n const {\n type,\n nameContains,\n pollIntervalMs = 100,\n timeout = 10_000,\n canvasId,\n } = options;\n\n const baselineUuids: string[] = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return [];\n const snap = api.snapshot();\n const uuids: string[] = [];\n function collect(node: { uuid: string; children: Array<{ uuid: string; children: unknown[] }> }) {\n uuids.push(node.uuid);\n for (const child of node.children) {\n collect(child as typeof node);\n }\n }\n collect(snap.tree as unknown as { uuid: string; children: Array<{ uuid: string; children: unknown[] }> });\n return uuids;\n }, canvasId ?? null);\n\n const deadline = Date.now() + timeout;\n\n // 2. Poll until new objects appear\n while (Date.now() < deadline) {\n await page.waitForTimeout(pollIntervalMs);\n\n const result = await page.evaluate(\n ([filterType, filterName, knownUuids, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n\n const snap = api.snapshot();\n const known = new Set(knownUuids);\n const newObjects: Array<{\n uuid: string;\n name: string;\n type: string;\n visible: boolean;\n testId?: string;\n position: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n }> = [];\n\n function scan(node: {\n uuid: string;\n name: string;\n type: string;\n visible: boolean;\n testId?: string;\n position: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n children: unknown[];\n }) {\n if (!known.has(node.uuid)) {\n // New object — check filters\n const typeMatch = !filterType || node.type === filterType;\n const nameMatch = !filterName || node.name.includes(filterName);\n if (typeMatch && nameMatch) {\n newObjects.push({\n uuid: node.uuid,\n name: node.name,\n type: node.type,\n visible: node.visible,\n testId: node.testId,\n position: node.position,\n rotation: node.rotation,\n scale: node.scale,\n });\n }\n }\n for (const child of node.children) {\n scan(child as typeof node);\n }\n }\n\n scan(snap.tree as unknown as Parameters<typeof scan>[0]);\n\n if (newObjects.length === 0) return null;\n\n return {\n newObjects,\n newUuids: newObjects.map((o) => o.uuid),\n count: newObjects.length,\n };\n },\n [type ?? null, nameContains ?? null, baselineUuids, canvasId ?? null] as const,\n );\n\n if (result) {\n return result as WaitForNewObjectResult;\n }\n }\n\n // 3. Timeout — build a descriptive error\n const filterDesc = [\n type ? `type=\"${type}\"` : null,\n nameContains ? `nameContains=\"${nameContains}\"` : null,\n ].filter(Boolean).join(', ');\n\n throw new Error(\n `waitForNewObject timed out after ${timeout}ms. ` +\n `No new objects appeared${filterDesc ? ` matching ${filterDesc}` : ''}. ` +\n `Baseline had ${baselineUuids.length} objects.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForObjectRemoved — wait until an object is no longer in the scene\n// ---------------------------------------------------------------------------\n\nexport interface WaitForObjectRemovedOptions {\n /** Time to wait for the bridge to appear. Default: 30_000 */\n bridgeTimeout?: number;\n /** Poll interval in ms. Default: 100 */\n pollIntervalMs?: number;\n /** Overall timeout in ms (after bridge is ready). Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until the bridge is ready and an object with the given testId or uuid\n * is no longer in the scene. Use for delete flows (e.g. user deletes an object,\n * then you assert it's gone).\n *\n * @param page Playwright Page instance\n * @param idOrUuid testId or uuid of the object that should be removed\n * @param options Timing options\n * @throws If the object is still present after the timeout\n *\n * @example\n * ```ts\n * await r3f.click('delete-button');\n * await r3f.waitForObjectRemoved('item-to-delete');\n * await expect(r3f).not.toExist('item-to-delete');\n * ```\n */\nexport async function waitForObjectRemoved(\n page: Page,\n idOrUuid: string,\n options: WaitForObjectRemovedOptions & { canvasId?: string } = {},\n): Promise<void> {\n const {\n bridgeTimeout = 30_000,\n pollIntervalMs = 100,\n timeout = 10_000,\n canvasId,\n } = options;\n\n await waitForReadyBridge(page, bridgeTimeout, canvasId);\n\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const stillPresent = await page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return true;\n const meta = api.getByTestId(id) ?? api.getByUuid(id);\n return meta !== null;\n }, [idOrUuid, canvasId ?? null] as const);\n\n if (!stillPresent) return;\n\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForObjectRemoved timed out after ${timeout}ms. Object \"${idOrUuid}\" is still in the scene.`,\n );\n}\n","/**\n * @module interactions\n *\n * Playwright interaction helpers — thin wrappers around `page.evaluate` calls\n * to the `window.__R3F_DOM__` bridge interaction methods.\n *\n * All object-targeted interactions auto-wait for:\n * 1. The bridge to be ready (`_ready === true`)\n * 2. The target object to exist (by testId or uuid)\n *\n * This mirrors Playwright's built-in auto-waiting on locators.\n *\n * Multi-canvas: pass `canvasId` to target a specific canvas instance.\n * When undefined, uses the default `window.__R3F_DOM__`.\n */\n\nimport type { Page } from '@playwright/test';\nimport type { CameraState } from './types';\n\n/** Default timeout for auto-waiting (ms). */\nconst DEFAULT_AUTO_WAIT_TIMEOUT = 5_000;\nconst AUTO_WAIT_POLL_MS = 100;\n\n/**\n * Resolve the bridge API for a given canvasId.\n * Injected into page.evaluate as a string snippet.\n */\nexport function resolveApiFn(canvasId?: string): string {\n if (!canvasId) return 'window.__R3F_DOM__';\n return `(window.__R3F_DOM_INSTANCES__ && window.__R3F_DOM_INSTANCES__[${JSON.stringify(canvasId)}])`;\n}\n\n/**\n * Auto-wait for bridge readiness AND a specific object to exist.\n * Replaces the old no-op `ensureBridge`. Throws descriptive errors\n * if bridge initialization failed or the object never appears.\n */\nasync function autoWaitForObject(\n page: Page,\n idOrUuid: string,\n timeout = DEFAULT_AUTO_WAIT_TIMEOUT,\n canvasId?: string,\n): Promise<void> {\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate(\n ([id, cid]) => {\n const api = cid\n ? window.__R3F_DOM_INSTANCES__?.[cid]\n : window.__R3F_DOM__;\n if (!api) return { bridge: 'missing' as const };\n if (!api._ready) {\n return {\n bridge: 'not-ready' as const,\n error: api._error ?? null,\n };\n }\n const found = (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n return { bridge: 'ready' as const, found };\n },\n [idOrUuid, canvasId ?? null] as const,\n );\n\n if (state.bridge === 'ready' && state.found) {\n return;\n }\n\n if (state.bridge === 'not-ready' && state.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}\\n` +\n `Cannot perform interaction on \"${idOrUuid}\"${canvasId ? ` (canvas: \"${canvasId}\")` : ''}.`,\n );\n }\n\n await page.waitForTimeout(AUTO_WAIT_POLL_MS);\n }\n\n const finalState = await page.evaluate(\n ([id, cid]) => {\n const api = cid\n ? window.__R3F_DOM_INSTANCES__?.[cid]\n : window.__R3F_DOM__;\n if (!api) return { bridge: false, ready: false, count: 0, error: null, found: false, suggestions: [] as Array<{ testId?: string; name: string; uuid: string }> };\n const suggestions = typeof api.fuzzyFind === 'function'\n ? api.fuzzyFind(id, 5).map((m: { testId?: string; name: string; uuid: string }) => ({ testId: m.testId, name: m.name, uuid: m.uuid }))\n : [];\n return {\n bridge: true,\n ready: api._ready,\n count: api.getCount(),\n error: api._error ?? null,\n found: (api.getByTestId(id) ?? api.getByUuid(id)) !== null,\n suggestions,\n };\n },\n [idOrUuid, canvasId ?? null] as const,\n );\n\n if (!finalState.bridge) {\n throw new Error(\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: bridge not found${canvasId ? ` (canvas: \"${canvasId}\")` : ''}.\\n` +\n `Ensure <ThreeDom${canvasId ? ` canvasId=\"${canvasId}\"` : ''}> is mounted inside your <Canvas> component.`,\n );\n }\n\n let msg =\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: object \"${idOrUuid}\" not found${canvasId ? ` (canvas: \"${canvasId}\")` : ''}.\\n` +\n `Bridge: ready=${finalState.ready}, objectCount=${finalState.count}` +\n (finalState.error ? `, error=${finalState.error}` : '') + '.\\n' +\n `Ensure the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`;\n\n if (finalState.suggestions.length > 0) {\n msg += '\\nDid you mean:\\n' +\n finalState.suggestions.map((s: { testId?: string; name: string; uuid: string }) => {\n const id = s.testId ? `testId=\"${s.testId}\"` : `uuid=\"${s.uuid}\"`;\n return ` → ${s.name || '(unnamed)'} [${id}]`;\n }).join('\\n');\n }\n\n throw new Error(msg);\n}\n\n/**\n * Auto-wait for bridge readiness only (no specific object).\n * Used by non-object interactions like pointerMiss and drawPath.\n */\nasync function autoWaitForBridge(\n page: Page,\n timeout = DEFAULT_AUTO_WAIT_TIMEOUT,\n canvasId?: string,\n): Promise<void> {\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate((cid) => {\n const api = cid\n ? window.__R3F_DOM_INSTANCES__?.[cid]\n : window.__R3F_DOM__;\n if (!api) return { exists: false as const };\n return {\n exists: true as const,\n ready: api._ready,\n error: api._error ?? null,\n };\n }, canvasId ?? null);\n\n if (state.exists && state.ready) return;\n\n if (state.exists && !state.ready && state.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}`,\n );\n }\n\n await page.waitForTimeout(AUTO_WAIT_POLL_MS);\n }\n\n throw new Error(\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: bridge not ready${canvasId ? ` (canvas: \"${canvasId}\")` : ''}.\\n` +\n `Ensure <ThreeDom${canvasId ? ` canvasId=\"${canvasId}\"` : ''}> is mounted inside your <Canvas> component.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Object-targeted interactions (auto-wait for object)\n// ---------------------------------------------------------------------------\n\n/** Click a 3D object by its testId or uuid. Auto-waits for the object. */\nexport async function click(page: Page, idOrUuid: string, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.click(id);\n }, [idOrUuid, canvasId ?? null] as const);\n}\n\n/** Double-click a 3D object by its testId or uuid. Auto-waits for the object. */\nexport async function doubleClick(page: Page, idOrUuid: string, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.doubleClick(id);\n }, [idOrUuid, canvasId ?? null] as const);\n}\n\n/** Right-click / context-menu a 3D object. Auto-waits for the object. */\nexport async function contextMenu(page: Page, idOrUuid: string, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.contextMenu(id);\n }, [idOrUuid, canvasId ?? null] as const);\n}\n\n/** Hover over a 3D object. Auto-waits for the object. */\nexport async function hover(page: Page, idOrUuid: string, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.hover(id);\n }, [idOrUuid, canvasId ?? null] as const);\n}\n\n/** Unhover / pointer-leave — resets hover state by moving pointer off-canvas. Auto-waits for bridge. */\nexport async function unhover(page: Page, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForBridge(page, timeout, canvasId);\n await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.unhover();\n }, canvasId ?? null);\n}\n\n/** Drag a 3D object with a world-space delta. Auto-waits for the object. */\nexport async function drag(\n page: Page,\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n timeout?: number,\n canvasId?: string,\n): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(\n async ([id, d, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n await api.drag(id, d);\n },\n [idOrUuid, delta, canvasId ?? null] as const,\n );\n}\n\n/** Dispatch a wheel/scroll event on a 3D object. Auto-waits for the object. */\nexport async function wheel(\n page: Page,\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n timeout?: number,\n canvasId?: string,\n): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout, canvasId);\n await page.evaluate(\n ([id, opts, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.wheel(id, opts);\n },\n [idOrUuid, options, canvasId ?? null] as const,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Non-object interactions (auto-wait for bridge only)\n// ---------------------------------------------------------------------------\n\n/** Click empty space to trigger onPointerMissed handlers. Auto-waits for bridge. */\nexport async function pointerMiss(page: Page, timeout?: number, canvasId?: string): Promise<void> {\n await autoWaitForBridge(page, timeout, canvasId);\n await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n api.pointerMiss();\n }, canvasId ?? null);\n}\n\n/** Draw a freeform path on the canvas. Auto-waits for bridge. */\nexport async function drawPathOnCanvas(\n page: Page,\n points: Array<{ x: number; y: number; pressure?: number }>,\n options?: { stepDelayMs?: number; pointerType?: 'mouse' | 'pen' | 'touch'; clickAtEnd?: boolean },\n timeout?: number,\n canvasId?: string,\n): Promise<{ eventCount: number; pointCount: number }> {\n await autoWaitForBridge(page, timeout, canvasId);\n return page.evaluate(\n async ([pts, opts, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n return api.drawPath(pts, opts ?? undefined);\n },\n [points, options ?? null, canvasId ?? null] as const,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Camera state\n// ---------------------------------------------------------------------------\n\n/** Get the current camera state (position, rotation, fov, near, far, zoom). Auto-waits for bridge. */\nexport async function getCameraState(page: Page, timeout?: number, canvasId?: string): Promise<CameraState> {\n await autoWaitForBridge(page, timeout, canvasId);\n return page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__![cid] : window.__R3F_DOM__!;\n return api.getCameraState();\n }, canvasId ?? null);\n}\n","/**\n * @module reporter\n *\n * Rich terminal reporter for Playwright tests. Outputs ANSI-colored status\n * messages for bridge lifecycle events (waiting, connected, error), scene\n * readiness, object lookups (with fuzzy-match suggestions on miss),\n * interaction timings, assertion failures, and full bridge diagnostics.\n */\n\nimport type { Page } from '@playwright/test';\nimport type { BridgeDiagnostics } from './types';\n\nexport type { BridgeDiagnostics };\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst GREEN = '\\x1b[32m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst MAGENTA = '\\x1b[35m';\n\nconst TAG = `${CYAN}[r3f-dom]${RESET}`;\n\nfunction ok(msg: string): string { return `${TAG} ${GREEN}✓${RESET} ${msg}`; }\nfunction fail(msg: string): string { return `${TAG} ${RED}✗${RESET} ${msg}`; }\nfunction warn(msg: string): string { return `${TAG} ${YELLOW}⚠${RESET} ${msg}`; }\nfunction info(msg: string): string { return `${TAG} ${DIM}${msg}${RESET}`; }\nfunction heading(msg: string): string { return `\\n${TAG} ${BOLD}${MAGENTA}${msg}${RESET}`; }\n\n// ---------------------------------------------------------------------------\n// R3FReporter — formatted terminal output for test lifecycle\n// ---------------------------------------------------------------------------\n\n/**\n * Formatted terminal reporter for react-three-dom Playwright tests.\n * Logs bridge lifecycle, scene readiness, interaction timings, assertion\n * failures, and full diagnostics with ANSI colors.\n */\nexport class R3FReporter {\n private _enabled = true;\n private _canvasId?: string;\n\n constructor(private readonly _page: Page, enabled = true, canvasId?: string) {\n this._enabled = enabled;\n this._canvasId = canvasId;\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle events\n // -----------------------------------------------------------------------\n\n logBridgeWaiting(): void {\n if (!this._enabled) return;\n console.log(info('Waiting for bridge (window.__R3F_DOM__)...'));\n }\n\n logBridgeConnected(diag?: BridgeDiagnostics): void {\n if (!this._enabled) return;\n if (diag) {\n console.log(ok(`Bridge connected — v${diag.version}, ${diag.objectCount} objects, ${diag.meshCount} meshes`));\n console.log(info(` Canvas: ${diag.canvasWidth}×${diag.canvasHeight} GPU: ${diag.webglRenderer}`));\n console.log(info(` DOM nodes: ${diag.materializedDomNodes}/${diag.maxDomNodes} Dirty queue: ${diag.dirtyQueueSize}`));\n } else {\n console.log(ok('Bridge connected'));\n }\n }\n\n logBridgeError(error: string): void {\n if (!this._enabled) return;\n console.log(fail(`Bridge error: ${error}`));\n }\n\n logSceneReady(objectCount: number): void {\n if (!this._enabled) return;\n console.log(ok(`Scene ready — ${objectCount} objects stabilized`));\n }\n\n logObjectFound(idOrUuid: string, type: string, name?: string): void {\n if (!this._enabled) return;\n const label = name ? `\"${name}\" (${type})` : type;\n console.log(ok(`Object found: \"${idOrUuid}\" → ${label}`));\n }\n\n logObjectNotFound(idOrUuid: string, suggestions?: Array<{ testId?: string; name: string; uuid: string }>): void {\n if (!this._enabled) return;\n console.log(fail(`Object not found: \"${idOrUuid}\"`));\n if (suggestions && suggestions.length > 0) {\n console.log(warn('Did you mean:'));\n for (const s of suggestions.slice(0, 5)) {\n const id = s.testId ? `testId=\"${s.testId}\"` : `uuid=\"${s.uuid}\"`;\n console.log(info(` → ${s.name || '(unnamed)'} [${id}]`));\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Interaction events\n // -----------------------------------------------------------------------\n\n logInteraction(action: string, idOrUuid: string, extra?: string): void {\n if (!this._enabled) return;\n const suffix = extra ? ` ${DIM}${extra}${RESET}` : '';\n console.log(info(`${action}(\"${idOrUuid}\")${suffix}`));\n }\n\n logInteractionDone(action: string, idOrUuid: string, durationMs: number): void {\n if (!this._enabled) return;\n console.log(ok(`${action}(\"${idOrUuid}\") — ${durationMs}ms`));\n }\n\n // -----------------------------------------------------------------------\n // Assertion context\n // -----------------------------------------------------------------------\n\n logAssertionFailure(\n matcherName: string,\n id: string,\n detail: string,\n diag?: BridgeDiagnostics,\n ): void {\n if (!this._enabled) return;\n console.log(heading(`Assertion failed: ${matcherName}(\"${id}\")`));\n console.log(fail(detail));\n if (diag) {\n this._printDiagnosticsSummary(diag);\n }\n }\n\n // -----------------------------------------------------------------------\n // Full diagnostics dump\n // -----------------------------------------------------------------------\n\n async logDiagnostics(): Promise<void> {\n if (!this._enabled) return;\n const diag = await this.fetchDiagnostics();\n if (!diag) {\n console.log(fail('Cannot fetch diagnostics — bridge not available'));\n return;\n }\n console.log(heading('Bridge Diagnostics'));\n this._printDiagnosticsFull(diag);\n }\n\n async fetchDiagnostics(): Promise<BridgeDiagnostics | null> {\n return this._page.evaluate((cid) => {\n type ApiLike = { getDiagnostics?(): unknown };\n const api = cid\n ? (window as unknown as { __R3F_DOM_INSTANCES__?: Record<string, ApiLike> }).__R3F_DOM_INSTANCES__?.[cid]\n : (window as unknown as { __R3F_DOM__?: ApiLike }).__R3F_DOM__;\n if (!api || typeof api.getDiagnostics !== 'function') return null;\n return api.getDiagnostics() as BridgeDiagnostics;\n }, this._canvasId ?? null);\n }\n\n async fetchFuzzyMatches(query: string, limit = 5): Promise<Array<{ testId?: string; name: string; uuid: string }>> {\n return this._page.evaluate(\n ({ q, lim, cid }) => {\n type ApiLike = { fuzzyFind?(q: string, l: number): Array<{ testId?: string; name: string; uuid: string }> };\n const api = cid\n ? (window as unknown as { __R3F_DOM_INSTANCES__?: Record<string, ApiLike> }).__R3F_DOM_INSTANCES__?.[cid]\n : (window as unknown as { __R3F_DOM__?: ApiLike }).__R3F_DOM__;\n if (!api || typeof api.fuzzyFind !== 'function') return [];\n return api.fuzzyFind(q, lim);\n },\n { q: query, lim: limit, cid: this._canvasId ?? null },\n );\n }\n\n // -----------------------------------------------------------------------\n // Private formatting\n // -----------------------------------------------------------------------\n\n private _printDiagnosticsSummary(d: BridgeDiagnostics): void {\n console.log(info(` Bridge: v${d.version} ready=${d.ready}${d.error ? ` error=\"${d.error}\"` : ''}`));\n console.log(info(` Scene: ${d.objectCount} objects (${d.meshCount} meshes, ${d.groupCount} groups, ${d.lightCount} lights)`));\n console.log(info(` Canvas: ${d.canvasWidth}×${d.canvasHeight} GPU: ${d.webglRenderer}`));\n }\n\n private _printDiagnosticsFull(d: BridgeDiagnostics): void {\n const status = d.ready ? `${GREEN}READY${RESET}` : `${RED}NOT READY${RESET}`;\n console.log(` ${BOLD}Status:${RESET} ${status} v${d.version}`);\n if (d.error) console.log(` ${BOLD}Error:${RESET} ${RED}${d.error}${RESET}`);\n console.log(` ${BOLD}Objects:${RESET} ${d.objectCount} total`);\n console.log(` ${d.meshCount} meshes, ${d.groupCount} groups, ${d.lightCount} lights, ${d.cameraCount} cameras`);\n console.log(` ${BOLD}DOM:${RESET} ${d.materializedDomNodes}/${d.maxDomNodes} materialized`);\n console.log(` ${BOLD}Canvas:${RESET} ${d.canvasWidth}×${d.canvasHeight}`);\n console.log(` ${BOLD}GPU:${RESET} ${d.webglRenderer}`);\n console.log(` ${BOLD}Dirty:${RESET} ${d.dirtyQueueSize} queued updates`);\n }\n}\n","/**\n * @module fixtures\n *\n * Playwright test fixture for react-three-dom. Provides the `R3FFixture` class\n * that exposes queries, interactions, waiters, snapshot diffing, and diagnostic\n * reporting against a live Three.js scene via the `window.__R3F_DOM__` bridge.\n *\n * Usage: import `test` (or `createR3FTest`) and destructure `{ r3f }` in your\n * test callbacks to get a pre-configured fixture bound to the current page.\n */\n\nimport { test as base } from '@playwright/test';\nimport type { Locator, Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection, SceneSnapshot, SnapshotNode } from './types';\nimport { diffSnapshots as diffSnapshotsHelper } from './diffSnapshots';\nimport type { SceneDiff } from './diffSnapshots';\nimport { waitForSceneReady, waitForIdle, waitForObject, waitForNewObject, waitForObjectRemoved } from './waiters';\nimport type { WaitForNewObjectOptions, WaitForNewObjectResult } from './waiters';\nimport type {\n WaitForSceneReadyOptions,\n WaitForIdleOptions,\n WaitForObjectOptions,\n WaitForObjectRemovedOptions,\n} from './waiters';\nimport * as interactions from './interactions';\nimport { R3FReporter } from './reporter';\n\n// ---------------------------------------------------------------------------\n// R3FFixture — the main API object provided to Playwright tests\n// ---------------------------------------------------------------------------\n\n/** Options for R3FFixture constructor. */\nexport interface R3FFixtureOptions {\n /** Auto-enable debug logging (forwards browser [r3f-dom:*] logs to test terminal). */\n debug?: boolean;\n /**\n * Enable rich diagnostic reporting in the terminal.\n * Logs bridge status, scene readiness, interaction details, and\n * failure context automatically. Default: true.\n */\n report?: boolean;\n /** Target a specific canvas by its canvasId. When omitted, uses the default bridge. */\n canvasId?: string;\n}\n\n/**\n * Main API object provided to Playwright tests for interacting with a\n * react-three-dom scene. Wraps queries, interactions, waiters, snapshot\n * diffing, and rich terminal diagnostics. Supports multi-canvas apps\n * via {@link R3FFixture.forCanvas}.\n */\nexport class R3FFixture {\n private _debugListenerAttached = false;\n private readonly _reporter: R3FReporter;\n /** Canvas ID for multi-canvas apps. Undefined = default bridge. */\n readonly canvasId?: string;\n\n constructor(\n private readonly _page: Page,\n opts?: R3FFixtureOptions,\n ) {\n this.canvasId = opts?.canvasId;\n this._reporter = new R3FReporter(_page, opts?.report !== false, this.canvasId);\n if (opts?.debug) {\n this._attachDebugListener();\n }\n }\n\n /** The underlying Playwright Page. */\n get page(): Page {\n return this._page;\n }\n\n /** Access the reporter for custom diagnostic logging. */\n get reporter(): R3FReporter {\n return this._reporter;\n }\n\n /**\n * Create a scoped fixture targeting a specific canvas instance.\n * All queries, interactions, and assertions on the returned fixture\n * will use `window.__R3F_DOM_INSTANCES__[canvasId]` instead of\n * `window.__R3F_DOM__`.\n *\n * @example\n * ```typescript\n * const mainR3f = r3f.forCanvas('main-viewport');\n * const minimapR3f = r3f.forCanvas('minimap');\n * await mainR3f.click('building-42');\n * await expect(minimapR3f).toExist('building-42-marker');\n * ```\n */\n forCanvas(canvasId: string): R3FFixture {\n return new R3FFixture(this._page, {\n canvasId,\n report: this._reporter !== null,\n });\n }\n\n /**\n * List all active canvas IDs registered on the page.\n * Returns an empty array if only the default (unnamed) bridge is active.\n */\n async getCanvasIds(): Promise<string[]> {\n return this._page.evaluate(() => {\n const instances = window.__R3F_DOM_INSTANCES__;\n return instances ? Object.keys(instances) : [];\n });\n }\n\n // -----------------------------------------------------------------------\n // Debug logging\n // -----------------------------------------------------------------------\n\n /**\n * Enable debug logging. Turns on `window.__R3F_DOM_DEBUG__` in the browser\n * and forwards all `[r3f-dom:*]` console messages to the Node.js test terminal.\n *\n * Call before `page.goto()` to capture setup logs, or after to capture\n * interaction logs.\n */\n async enableDebug(): Promise<void> {\n this._attachDebugListener();\n await this._page.evaluate(() => {\n window.__R3F_DOM_DEBUG__ = true;\n });\n }\n\n private _attachDebugListener(): void {\n if (this._debugListenerAttached) return;\n this._debugListenerAttached = true;\n this._page.on('console', (msg) => {\n const text = msg.text();\n if (text.startsWith('[r3f-dom:')) {\n console.log(text);\n }\n });\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /** Get object metadata by testId or uuid. Returns null if not found. */\n async getObject(idOrUuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(id) ?? api.getByUuid(id) ?? null;\n }, [idOrUuid, this.canvasId ?? null] as const);\n }\n\n /** Get object metadata by testId (userData.testId). Returns null if not found. */\n async getByTestId(testId: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByTestId(id) : null;\n }, [testId, this.canvasId ?? null] as const);\n }\n\n /** Get object metadata by UUID. Returns null if not found. */\n async getByUuid(uuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate(([u, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByUuid(u) : null;\n }, [uuid, this.canvasId ?? null] as const);\n }\n\n /** Get all objects with the given name (names are not unique in Three.js). */\n async getByName(name: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate(([n, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByName(n) : [];\n }, [name, this.canvasId ?? null] as const);\n }\n\n /** Get direct children of an object by testId or uuid. */\n async getChildren(idOrUuid: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getChildren(id) : [];\n }, [idOrUuid, this.canvasId ?? null] as const);\n }\n\n /** Get parent of an object by testId or uuid. Returns null if root or not found. */\n async getParent(idOrUuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getParent(id) : null;\n }, [idOrUuid, this.canvasId ?? null] as const);\n }\n\n /** Get heavy inspection data (Tier 2) by testId or uuid. Pass { includeGeometryData: true } to include vertex positions and triangle indices. */\n async inspect(idOrUuid: string, options?: { includeGeometryData?: boolean }): Promise<ObjectInspection | null> {\n return this._page.evaluate(\n ({ id, opts, cid }: { id: string; opts?: { includeGeometryData?: boolean }; cid: string | null }) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(id, opts);\n },\n { id: idOrUuid, opts: options, cid: this.canvasId ?? null },\n );\n }\n\n /**\n * Get world-space position [x, y, z] of an object (from its world matrix).\n * Use for nested objects where local position differs from world position.\n */\n async getWorldPosition(idOrUuid: string): Promise<[number, number, number] | null> {\n return this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n const insp = api.inspect(id);\n if (!insp?.worldMatrix || insp.worldMatrix.length < 15) return null;\n const m = insp.worldMatrix;\n return [m[12], m[13], m[14]];\n }, [idOrUuid, this.canvasId ?? null] as const);\n }\n\n /** Take a full scene snapshot. */\n async snapshot(): Promise<SceneSnapshot | null> {\n return this._page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.snapshot() : null;\n }, this.canvasId ?? null);\n }\n\n /**\n * Compare two scene snapshots: returns added nodes, removed nodes, and\n * property changes (name, type, testId, visible, position, rotation, scale).\n * Use after taking snapshots before/after an action to assert on scene changes.\n */\n diffSnapshots(before: SceneSnapshot, after: SceneSnapshot): SceneDiff {\n return diffSnapshotsHelper(before, after);\n }\n\n /**\n * Run an async action and return how many objects were added and removed\n * compared to before the action. Uses snapshots before/after so add and\n * remove are both counted correctly when both happen.\n */\n async trackObjectCount(action: () => Promise<void>): Promise<{ added: number; removed: number }> {\n const before = await this.snapshot();\n if (!before) throw new Error('trackObjectCount: no snapshot before (bridge not ready?)');\n await action();\n const after = await this.snapshot();\n if (!after) throw new Error('trackObjectCount: no snapshot after (bridge not ready?)');\n const diff = diffSnapshotsHelper(before, after);\n return { added: diff.added.length, removed: diff.removed.length };\n }\n\n /** Get the total number of tracked objects. */\n async getCount(): Promise<number> {\n return this._page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n }, this.canvasId ?? null);\n }\n\n /**\n * Return a Playwright locator for the R3F canvas element the bridge is attached to.\n * The canvas has `data-r3f-canvas` set by the bridge (value is the canvasId or \"true\").\n */\n getCanvasLocator(): Locator {\n if (this.canvasId) {\n return this._page.locator(`[data-r3f-canvas=\"${this.canvasId}\"]`);\n }\n return this._page.locator('[data-r3f-canvas]');\n }\n\n /**\n * Get all objects of a given Three.js type (e.g. \"Mesh\", \"Group\", \"Line\").\n */\n async getByType(type: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate(([t, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByType(t) : [];\n }, [type, this.canvasId ?? null] as const);\n }\n\n /**\n * Get all objects with a given geometry type (e.g. \"BoxGeometry\", \"BufferGeometry\").\n */\n async getByGeometryType(type: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate(([t, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByGeometryType(t) : [];\n }, [type, this.canvasId ?? null] as const);\n }\n\n /**\n * Get all objects with a given material type (e.g. \"MeshStandardMaterial\").\n */\n async getByMaterialType(type: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate(([t, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByMaterialType(t) : [];\n }, [type, this.canvasId ?? null] as const);\n }\n\n /**\n * Get objects that have a specific userData key (and optionally matching value).\n */\n async getByUserData(key: string, value?: unknown): Promise<ObjectMetadata[]> {\n return this._page.evaluate(({ k, v, cid }) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getByUserData(k, v) : [];\n }, { k: key, v: value, cid: this.canvasId ?? null });\n }\n\n /**\n * Count objects of a given Three.js type.\n */\n async getCountByType(type: string): Promise<number> {\n return this._page.evaluate(([t, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getCountByType(t) : 0;\n }, [type, this.canvasId ?? null] as const);\n }\n\n /**\n * Batch lookup: get metadata for multiple objects by testId or uuid in a\n * single browser round-trip.\n */\n async getObjects(ids: string[]): Promise<Record<string, ObjectMetadata | null>> {\n return this._page.evaluate(([idList, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) {\n const result: Record<string, null> = {};\n for (const id of idList) result[id] = null;\n return result;\n }\n return api.getObjects(idList);\n }, [ids, this.canvasId ?? null] as const);\n }\n\n /**\n * Log the scene tree to the test terminal for debugging.\n *\n * Prints a human-readable tree like:\n * ```\n * Scene \"root\"\n * ├─ Mesh \"chair-primary\" [testId: chair-primary] visible\n * │ └─ BoxGeometry\n * ├─ DirectionalLight \"sun-light\" [testId: sun-light] visible\n * └─ Group \"furniture\"\n * ├─ Mesh \"table-top\" [testId: table-top] visible\n * └─ Mesh \"vase\" [testId: vase] visible\n * ```\n */\n async logScene(): Promise<void> {\n const snap = await this.snapshot();\n if (!snap) {\n console.log('[r3f-dom] logScene: no scene snapshot available (bridge not ready?)');\n return;\n }\n const lines = formatSceneTree(snap.tree);\n console.log(`\\n[r3f-dom] Scene tree (${snap.objectCount} objects):\\n${lines}\\n`);\n }\n\n // -----------------------------------------------------------------------\n // Interactions\n // -----------------------------------------------------------------------\n\n /**\n * Click a 3D object by testId or uuid.\n * Auto-waits for the bridge and the object to exist before clicking.\n * @param timeout Optional auto-wait timeout in ms. Default: 5000\n */\n async click(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.click(this._page, idOrUuid, timeout, this.canvasId);\n }\n\n /**\n * Double-click a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async doubleClick(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.doubleClick(this._page, idOrUuid, timeout, this.canvasId);\n }\n\n /**\n * Right-click / context-menu a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async contextMenu(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.contextMenu(this._page, idOrUuid, timeout, this.canvasId);\n }\n\n /**\n * Hover over a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async hover(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.hover(this._page, idOrUuid, timeout, this.canvasId);\n }\n\n /**\n * Unhover / pointer-leave — resets hover state by moving pointer off-canvas.\n * Auto-waits for the bridge to be ready.\n */\n async unhover(timeout?: number): Promise<void> {\n return interactions.unhover(this._page, timeout, this.canvasId);\n }\n\n /**\n * Drag a 3D object with a world-space delta vector.\n * Auto-waits for the object to exist.\n */\n async drag(\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n timeout?: number,\n ): Promise<void> {\n return interactions.drag(this._page, idOrUuid, delta, timeout, this.canvasId);\n }\n\n /**\n * Dispatch a wheel/scroll event on a 3D object.\n * Auto-waits for the object to exist.\n */\n async wheel(\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n timeout?: number,\n ): Promise<void> {\n return interactions.wheel(this._page, idOrUuid, options, timeout, this.canvasId);\n }\n\n /**\n * Click empty space to trigger onPointerMissed handlers.\n * Auto-waits for the bridge to be ready.\n */\n async pointerMiss(timeout?: number): Promise<void> {\n return interactions.pointerMiss(this._page, timeout, this.canvasId);\n }\n\n /**\n * Draw a freeform path on the canvas. Dispatches pointerdown → N × pointermove → pointerup.\n * Designed for canvas drawing/annotation/whiteboard apps.\n * Auto-waits for the bridge to be ready.\n *\n * @param points Array of screen-space points (min 2). { x, y } in CSS pixels relative to canvas.\n * @param options Drawing options (stepDelayMs, pointerType, clickAtEnd)\n * @param timeout Optional auto-wait timeout in ms. Default: 5000\n * @returns { eventCount, pointCount }\n */\n async drawPath(\n points: Array<{ x: number; y: number; pressure?: number }>,\n options?: { stepDelayMs?: number; pointerType?: 'mouse' | 'pen' | 'touch'; clickAtEnd?: boolean },\n timeout?: number,\n ): Promise<{ eventCount: number; pointCount: number }> {\n return interactions.drawPathOnCanvas(this._page, points, options, timeout, this.canvasId);\n }\n\n // -----------------------------------------------------------------------\n // Camera\n // -----------------------------------------------------------------------\n\n /**\n * Get the current camera state (position, rotation, fov, near, far, zoom, target).\n * Auto-waits for the bridge to be ready.\n */\n async getCameraState(timeout?: number) {\n return interactions.getCameraState(this._page, timeout, this.canvasId);\n }\n\n // -----------------------------------------------------------------------\n // Waiters\n // -----------------------------------------------------------------------\n\n /**\n * Wait until the scene is ready — `window.__R3F_DOM__` is available and\n * the object count has stabilised across several consecutive checks.\n * Logs bridge connection and scene readiness to the terminal.\n */\n async waitForSceneReady(options?: WaitForSceneReadyOptions): Promise<void> {\n this._reporter.logBridgeWaiting();\n try {\n await waitForSceneReady(this._page, { ...options, canvasId: this.canvasId });\n const diag = await this._reporter.fetchDiagnostics();\n if (diag) {\n this._reporter.logBridgeConnected(diag);\n this._reporter.logSceneReady(diag.objectCount);\n }\n } catch (e) {\n const diag = await this._reporter.fetchDiagnostics();\n if (diag?.error) this._reporter.logBridgeError(diag.error);\n throw e;\n }\n }\n\n /**\n * Wait until the bridge is available and an object with the given testId or\n * uuid exists. Use this instead of waitForSceneReady when the scene count\n * never stabilizes (e.g. async model loading, continuous animations).\n */\n async waitForObject(\n idOrUuid: string,\n options?: WaitForObjectOptions,\n ): Promise<void> {\n this._reporter.logBridgeWaiting();\n try {\n await waitForObject(this._page, idOrUuid, { ...options, canvasId: this.canvasId });\n const meta = await this.getObject(idOrUuid);\n if (meta) {\n this._reporter.logObjectFound(idOrUuid, meta.type, meta.name || undefined);\n }\n } catch (e) {\n const suggestions = await this._reporter.fetchFuzzyMatches(idOrUuid);\n this._reporter.logObjectNotFound(idOrUuid, suggestions);\n throw e;\n }\n }\n\n /**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering interactions or animations.\n */\n async waitForIdle(options?: WaitForIdleOptions): Promise<void> {\n return waitForIdle(this._page, { ...options, canvasId: this.canvasId });\n }\n\n /**\n * Wait until one or more new objects appear in the scene that were not\n * present when this call was made. Perfect for drawing apps where\n * `drawPath()` creates new geometry asynchronously.\n *\n * @param options Filter by type, nameContains, timeout, pollInterval\n * @returns Metadata of the newly added object(s)\n */\n async waitForNewObject(options?: WaitForNewObjectOptions): Promise<WaitForNewObjectResult> {\n return waitForNewObject(this._page, { ...options, canvasId: this.canvasId });\n }\n\n /**\n * Wait until an object (by testId or uuid) is no longer in the scene.\n * Use for delete flows: trigger removal, then wait until the object is gone.\n */\n async waitForObjectRemoved(\n idOrUuid: string,\n options?: WaitForObjectRemovedOptions,\n ): Promise<void> {\n return waitForObjectRemoved(this._page, idOrUuid, { ...options, canvasId: this.canvasId });\n }\n\n // -----------------------------------------------------------------------\n // Selection (for inspector integration)\n // -----------------------------------------------------------------------\n\n /** Select a 3D object by testId or uuid (highlights in scene). */\n async select(idOrUuid: string): Promise<void> {\n await this._page.evaluate(([id, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found');\n api.select(id);\n }, [idOrUuid, this.canvasId ?? null] as const);\n }\n\n /** Clear the current selection. */\n async clearSelection(): Promise<void> {\n await this._page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (api) api.clearSelection();\n }, this.canvasId ?? null);\n }\n\n // -----------------------------------------------------------------------\n // Diagnostics\n // -----------------------------------------------------------------------\n\n /**\n * Fetch full bridge diagnostics (version, object counts, GPU info, etc.).\n * Returns null if the bridge is not available.\n */\n async getDiagnostics(): Promise<import('./reporter').BridgeDiagnostics | null> {\n return this._reporter.fetchDiagnostics();\n }\n\n /**\n * Print a full diagnostics report to the terminal.\n * Useful at the start of a test suite or when debugging failures.\n */\n async logDiagnostics(): Promise<void> {\n return this._reporter.logDiagnostics();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scene tree formatter — used by logScene()\n// ---------------------------------------------------------------------------\n\nfunction formatSceneTree(node: SnapshotNode, prefix = '', isLast = true): string {\n const connector = prefix === '' ? '' : isLast ? '└─ ' : '├─ ';\n const childPrefix = prefix === '' ? '' : prefix + (isLast ? ' ' : '│ ');\n\n // Build the label: \"Type \"name\" [testId: x] visible/hidden\"\n let label = node.type;\n if (node.name) label += ` \"${node.name}\"`;\n if (node.testId) label += ` [testId: ${node.testId}]`;\n label += node.visible ? ' visible' : ' HIDDEN';\n\n let result = prefix + connector + label + '\\n';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const last = i === node.children.length - 1;\n result += formatSceneTree(child, childPrefix, last);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// test.extend — add the `r3f` fixture to Playwright's test runner\n// ---------------------------------------------------------------------------\n\nexport const test = base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page);\n await use(fixture);\n },\n});\n\n/**\n * Create a custom test.extend with debug enabled for all tests:\n *\n * ```typescript\n * import { createR3FTest } from '@react-three-dom/playwright';\n * export const test = createR3FTest({ debug: true });\n * ```\n */\nexport function createR3FTest(options?: R3FFixtureOptions) {\n return base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page, options);\n await use(fixture);\n },\n });\n}\n","/**\n * @module assertions\n *\n * Custom Playwright `expect` matchers for 3D scene testing via react-three-dom.\n *\n * Every matcher auto-retries until the assertion passes or the timeout\n * expires, matching Playwright's built-in assertion behaviour.\n *\n * **Tier 1 — Metadata:** toExist, toBeVisible, toHavePosition,\n * toHaveWorldPosition, toHaveRotation, toHaveScale, toHaveType, toHaveName,\n * toHaveGeometryType, toHaveMaterialType, toHaveChildCount, toHaveParent,\n * toHaveInstanceCount\n *\n * **Tier 2 — Inspection:** toBeInFrustum, toHaveBounds, toHaveColor,\n * toHaveOpacity, toBeTransparent, toHaveVertexCount, toHaveTriangleCount,\n * toHaveUserData, toHaveMapTexture\n *\n * **Scene-level:** toHaveObjectCount, toHaveObjectCountGreaterThan,\n * toHaveCountByType, toHaveTotalTriangleCount,\n * toHaveTotalTriangleCountLessThan\n *\n * **Camera:** toHaveCameraPosition, toHaveCameraFov, toHaveCameraNear,\n * toHaveCameraFar, toHaveCameraZoom\n *\n * **Batch:** toAllExist, toAllBeVisible, toNoneExist\n */\n\nimport { expect as baseExpect } from '@playwright/test';\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection } from './types';\n\nconst DEFAULT_TIMEOUT = 5_000;\nconst DEFAULT_INTERVAL = 100;\n\n// ---------------------------------------------------------------------------\n// Scene-level helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchSceneCount(page: Page, canvasId?: string): Promise<number> {\n return page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n }, canvasId ?? null);\n}\n\nasync function fetchCountByType(page: Page, type: string, canvasId?: string): Promise<number> {\n return page.evaluate(([t, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n return api ? api.getCountByType(t) : 0;\n }, [type, canvasId ?? null] as const);\n}\n\nasync function fetchTotalTriangles(page: Page, canvasId?: string): Promise<number> {\n return page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return 0;\n const bridge = api;\n const snap = bridge.snapshot();\n let total = 0;\n function walk(node: { uuid: string; children: unknown[] }) {\n const meta = bridge.getByUuid(node.uuid);\n if (meta && meta.triangleCount) total += meta.triangleCount;\n for (const child of node.children) {\n walk(child as typeof node);\n }\n }\n walk(snap.tree as unknown as { uuid: string; children: unknown[] });\n return total;\n }, canvasId ?? null);\n}\n\n// ---------------------------------------------------------------------------\n// Object-level helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchMeta(page: Page, id: string, canvasId?: string): Promise<ObjectMetadata | null> {\n return page.evaluate(([i, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(i) ?? api.getByUuid(i) ?? null;\n }, [id, canvasId ?? null] as const);\n}\n\nasync function fetchInsp(page: Page, id: string, canvasId?: string): Promise<ObjectInspection | null> {\n return page.evaluate(([i, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(i);\n }, [id, canvasId ?? null] as const);\n}\n\n/** World position from column-major 4x4 matrix (translation at indices 12, 13, 14). */\nasync function fetchWorldPosition(page: Page, id: string, canvasId?: string): Promise<[number, number, number] | null> {\n return page.evaluate(([i, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return null;\n const insp = api.inspect(i);\n if (!insp || !insp.worldMatrix || insp.worldMatrix.length < 15) return null;\n const m = insp.worldMatrix;\n return [m[12], m[13], m[14]];\n }, [id, canvasId ?? null] as const);\n}\n\ninterface R3FMatcherReceiver {\n page: Page;\n canvasId?: string;\n getObject(idOrUuid: string): Promise<ObjectMetadata | null>;\n inspect(idOrUuid: string): Promise<ObjectInspection | null>;\n}\n\n/** Context provided by Playwright when the matcher is invoked via expect().extend() */\ninterface ExpectMatcherContext {\n isNot?: boolean;\n}\n\ninterface MatcherOptions {\n timeout?: number;\n interval?: number;\n}\n\ntype Vec3Opts = MatcherOptions & { tolerance?: number };\n\nfunction parseTol(v: number | Vec3Opts | undefined, def: number) {\n const o = typeof v === 'number' ? { tolerance: v } : (v ?? {});\n return {\n timeout: o.timeout ?? DEFAULT_TIMEOUT,\n interval: o.interval ?? DEFAULT_INTERVAL,\n tolerance: o.tolerance ?? def,\n };\n}\n\nasync function fetchFuzzyHints(page: Page, query: string, canvasId?: string): Promise<string> {\n try {\n const suggestions = await page.evaluate(\n ({ q, cid }) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api || typeof api.fuzzyFind !== 'function') return [];\n return api.fuzzyFind(q, 5).map((m: { testId?: string; name: string; uuid: string }) => ({\n testId: m.testId, name: m.name, uuid: m.uuid,\n }));\n },\n { q: query, cid: canvasId ?? null },\n );\n if (suggestions.length === 0) return '';\n return '\\nDid you mean:\\n' + suggestions.map((s: { testId?: string; name: string; uuid: string }) => {\n const id = s.testId ? `testId=\"${s.testId}\"` : `uuid=\"${s.uuid}\"`;\n return ` → ${s.name || '(unnamed)'} [${id}]`;\n }).join('\\n');\n } catch {\n return '';\n }\n}\n\nasync function fetchDiagnosticHint(page: Page, canvasId?: string): Promise<string> {\n try {\n const diag = await page.evaluate((cid) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api || typeof api.getDiagnostics !== 'function') return null;\n return api.getDiagnostics();\n }, canvasId ?? null);\n if (!diag) return '';\n return `\\nBridge: v${diag.version} ready=${diag.ready}, ${diag.objectCount} objects (${diag.meshCount} meshes)`;\n } catch {\n return '';\n }\n}\n\nasync function notFoundAsync(page: Page, name: string, id: string, detail: string, timeout: number, canvasId?: string) {\n const [fuzzy, diag] = await Promise.all([\n fetchFuzzyHints(page, id, canvasId),\n fetchDiagnosticHint(page, canvasId),\n ]);\n return {\n pass: false,\n message: () => `Expected object \"${id}\" ${detail}, but it was not found (waited ${timeout}ms)${diag}${fuzzy}`,\n name,\n };\n}\n\n// ===========================================================================\n// Matchers — export as object so users extend Playwright's expect (see README).\n// This avoids replacing expect and breaking native assertions (e.g. timeout on toBeVisible).\n// ===========================================================================\n\nconst r3fMatchers = {\n\n // ========================= TIER 1 — Metadata ============================\n\n // --- toExist ---\n async toExist(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n return meta !== null;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n const pass = meta !== null;\n return {\n pass,\n message: () => pass\n ? `Expected object \"${id}\" to NOT exist, but it does`\n : `Expected object \"${id}\" to exist, but it was not found (waited ${timeout}ms)`,\n name: 'toExist', expected: id, actual: meta,\n };\n },\n\n // --- toBeVisible ---\n async toBeVisible(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n return meta?.visible ?? false;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toBeVisible', id, 'to be visible', timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass: m.visible,\n message: () => m.visible\n ? `Expected \"${id}\" to NOT be visible, but it is`\n : `Expected \"${id}\" to be visible, but visible=${m.visible} (waited ${timeout}ms)`,\n name: 'toBeVisible', expected: true, actual: m.visible,\n };\n },\n\n // --- toHavePosition ---\n async toHavePosition(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n delta = [Math.abs(meta.position[0] - expected[0]), Math.abs(meta.position[1] - expected[1]), Math.abs(meta.position[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHavePosition', id, `to have position [${expected}]`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be at [${expected}] (±${tolerance})`\n : `Expected \"${id}\" at [${expected}] (±${tolerance}), got [${m.position}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHavePosition', expected, actual: m.position,\n };\n },\n\n // --- toHaveWorldPosition ---\n async toHaveWorldPosition(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let worldPos: [number, number, number] | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n worldPos = await fetchWorldPosition(r3f.page, id, r3f.canvasId);\n if (!worldPos) return false;\n delta = [Math.abs(worldPos[0] - expected[0]), Math.abs(worldPos[1] - expected[1]), Math.abs(worldPos[2] - expected[2])];\n pass = delta.every((d) => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!worldPos) return notFoundAsync(r3f.page, 'toHaveWorldPosition', id, `to have world position [${expected}]`, timeout, r3f.canvasId);\n const actualWorldPos: [number, number, number] = worldPos;\n return {\n pass,\n message: () =>\n pass\n ? `Expected \"${id}\" to NOT have world position [${expected}] (±${tolerance})`\n : `Expected \"${id}\" world position [${expected}] (±${tolerance}), got [${actualWorldPos[0].toFixed(4)}, ${actualWorldPos[1].toFixed(4)}, ${actualWorldPos[2].toFixed(4)}] (Δ [${delta.map((d) => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHaveWorldPosition', expected, actual: actualWorldPos,\n };\n },\n\n // --- toHaveRotation ---\n async toHaveRotation(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n delta = [Math.abs(meta.rotation[0] - expected[0]), Math.abs(meta.rotation[1] - expected[1]), Math.abs(meta.rotation[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveRotation', id, `to have rotation [${expected}]`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have rotation [${expected}] (±${tolerance})`\n : `Expected \"${id}\" rotation [${expected}] (±${tolerance}), got [${m.rotation}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHaveRotation', expected, actual: m.rotation,\n };\n },\n\n // --- toHaveScale ---\n async toHaveScale(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n delta = [Math.abs(meta.scale[0] - expected[0]), Math.abs(meta.scale[1] - expected[1]), Math.abs(meta.scale[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveScale', id, `to have scale [${expected}]`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have scale [${expected}] (±${tolerance})`\n : `Expected \"${id}\" scale [${expected}] (±${tolerance}), got [${m.scale}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHaveScale', expected, actual: m.scale,\n };\n },\n\n // --- toHaveType ---\n async toHaveType(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedType: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n pass = meta.type === expectedType;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveType', id, `to have type \"${expectedType}\"`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have type \"${expectedType}\"`\n : `Expected \"${id}\" type \"${expectedType}\", got \"${m.type}\" (waited ${timeout}ms)`,\n name: 'toHaveType', expected: expectedType, actual: m.type,\n };\n },\n\n // --- toHaveName ---\n async toHaveName(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedName: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n pass = meta.name === expectedName;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveName', id, `to have name \"${expectedName}\"`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have name \"${expectedName}\"`\n : `Expected \"${id}\" name \"${expectedName}\", got \"${m.name}\" (waited ${timeout}ms)`,\n name: 'toHaveName', expected: expectedName, actual: m.name,\n };\n },\n\n // --- toHaveGeometryType ---\n async toHaveGeometryType(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedGeo: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n pass = meta.geometryType === expectedGeo;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveGeometryType', id, `to have geometry \"${expectedGeo}\"`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have geometry \"${expectedGeo}\"`\n : `Expected \"${id}\" geometry \"${expectedGeo}\", got \"${m.geometryType ?? 'none'}\" (waited ${timeout}ms)`,\n name: 'toHaveGeometryType', expected: expectedGeo, actual: m.geometryType,\n };\n },\n\n // --- toHaveMaterialType ---\n async toHaveMaterialType(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedMat: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n pass = meta.materialType === expectedMat;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveMaterialType', id, `to have material \"${expectedMat}\"`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have material \"${expectedMat}\"`\n : `Expected \"${id}\" material \"${expectedMat}\", got \"${m.materialType ?? 'none'}\" (waited ${timeout}ms)`,\n name: 'toHaveMaterialType', expected: expectedMat, actual: m.materialType,\n };\n },\n\n // --- toHaveChildCount ---\n async toHaveChildCount(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta) return false;\n actual = meta.childrenUuids.length;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveChildCount', id, `to have ${expectedCount} children`, timeout, r3f.canvasId);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} children`\n : `Expected \"${id}\" ${expectedCount} children, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveChildCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveParent ---\n async toHaveParent(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedParent: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let parentMeta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n if (!meta?.parentUuid) return false;\n parentMeta = await fetchMeta(r3f.page, meta.parentUuid, r3f.canvasId);\n if (!parentMeta) return false;\n pass = parentMeta.uuid === expectedParent || parentMeta.testId === expectedParent || parentMeta.name === expectedParent;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveParent', id, `to have parent \"${expectedParent}\"`, timeout, r3f.canvasId);\n const m = meta as ObjectMetadata;\n const pm = parentMeta as ObjectMetadata | null;\n const parentLabel = pm?.testId ?? pm?.name ?? m.parentUuid;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have parent \"${expectedParent}\"`\n : `Expected \"${id}\" parent \"${expectedParent}\", got \"${parentLabel}\" (waited ${timeout}ms)`,\n name: 'toHaveParent', expected: expectedParent, actual: parentLabel,\n };\n },\n\n // --- toHaveInstanceCount ---\n async toHaveInstanceCount(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n actual = meta?.instanceCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveInstanceCount', id, `to have instance count ${expectedCount}`, timeout, r3f.canvasId);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have instance count ${expectedCount}`\n : `Expected \"${id}\" instance count ${expectedCount}, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveInstanceCount', expected: expectedCount, actual,\n };\n },\n\n // ========================= TIER 2 — Inspection ==========================\n\n // --- toBeInFrustum ---\n async toBeInFrustum(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp) return false;\n const fin = (v: number[]) => v.every(Number.isFinite);\n pass = fin(insp.bounds.min) && fin(insp.bounds.max);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toBeInFrustum', id, 'to be in frustum', timeout, r3f.canvasId);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be in the camera frustum`\n : `Expected \"${id}\" in frustum, but bounds are invalid (waited ${timeout}ms)`,\n name: 'toBeInFrustum', expected: 'finite bounds', actual: i.bounds,\n };\n },\n\n // --- toHaveBounds ---\n async toHaveBounds(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string,\n expected: { min: [number, number, number]; max: [number, number, number] },\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.1);\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp) return false;\n const w = (a: number[], b: number[]) => a.every((v, j) => Math.abs(v - b[j]) <= tolerance);\n pass = w(insp.bounds.min, expected.min) && w(insp.bounds.max, expected.max);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toHaveBounds', id, 'to have specific bounds', timeout, r3f.canvasId);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}`\n : `Expected \"${id}\" bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}, got min:${JSON.stringify(i.bounds.min)} max:${JSON.stringify(i.bounds.max)} (waited ${timeout}ms)`,\n name: 'toHaveBounds', expected, actual: i.bounds,\n };\n },\n\n // --- toHaveColor ---\n async toHaveColor(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedColor: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n const norm = expectedColor.startsWith('#') ? expectedColor.toLowerCase() : `#${expectedColor.toLowerCase()}`;\n let insp: ObjectInspection | null = null;\n let actual: string | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp?.material?.color) return false;\n actual = insp.material.color.toLowerCase();\n pass = actual === norm;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toHaveColor', id, `to have color \"${norm}\"`, timeout, r3f.canvasId);\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have color \"${norm}\"`\n : `Expected \"${id}\" color \"${norm}\", got \"${actual ?? 'no color'}\" (waited ${timeout}ms)`,\n name: 'toHaveColor', expected: norm, actual,\n };\n },\n\n // --- toHaveOpacity ---\n async toHaveOpacity(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedOpacity: number, tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: number | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp?.material) return false;\n actual = insp.material.opacity;\n pass = actual !== undefined && Math.abs(actual - expectedOpacity) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toHaveOpacity', id, `to have opacity ${expectedOpacity}`, timeout, r3f.canvasId);\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have opacity ${expectedOpacity} (±${tolerance})`\n : `Expected \"${id}\" opacity ${expectedOpacity} (±${tolerance}), got ${actual ?? 'no material'} (waited ${timeout}ms)`,\n name: 'toHaveOpacity', expected: expectedOpacity, actual,\n };\n },\n\n // --- toBeTransparent ---\n async toBeTransparent(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp?.material) return false;\n pass = insp.material.transparent === true;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toBeTransparent', id, 'to be transparent', timeout, r3f.canvasId);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be transparent`\n : `Expected \"${id}\" transparent=true, got ${i.material?.transparent ?? 'no material'} (waited ${timeout}ms)`,\n name: 'toBeTransparent', expected: true, actual: i.material?.transparent,\n };\n },\n\n // --- toHaveVertexCount ---\n async toHaveVertexCount(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n actual = meta?.vertexCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveVertexCount', id, `to have ${expectedCount} vertices`, timeout, r3f.canvasId);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} vertices`\n : `Expected \"${id}\" ${expectedCount} vertices, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveVertexCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveTriangleCount ---\n async toHaveTriangleCount(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id, r3f.canvasId);\n actual = meta?.triangleCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFoundAsync(r3f.page, 'toHaveTriangleCount', id, `to have ${expectedCount} triangles`, timeout, r3f.canvasId);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} triangles`\n : `Expected \"${id}\" ${expectedCount} triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTriangleCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveUserData ---\n async toHaveUserData(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, key: string, expectedValue?: unknown, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: unknown;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp) return false;\n if (!(key in insp.userData)) return false;\n if (expectedValue === undefined) { pass = true; return true; }\n actual = insp.userData[key];\n pass = JSON.stringify(actual) === JSON.stringify(expectedValue);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toHaveUserData', id, `to have userData.${key}`, timeout, r3f.canvasId);\n return {\n pass,\n message: () => {\n if (expectedValue === undefined) {\n return pass\n ? `Expected \"${id}\" to NOT have userData key \"${key}\"`\n : `Expected \"${id}\" to have userData key \"${key}\", but missing (waited ${timeout}ms)`;\n }\n return pass\n ? `Expected \"${id}\" to NOT have userData.${key} = ${JSON.stringify(expectedValue)}`\n : `Expected \"${id}\" userData.${key} = ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)} (waited ${timeout}ms)`;\n },\n name: 'toHaveUserData', expected: expectedValue ?? `key \"${key}\"`, actual,\n };\n },\n\n // --- toHaveMapTexture ---\n async toHaveMapTexture(this: ExpectMatcherContext, r3f: R3FMatcherReceiver, id: string, expectedName?: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: string | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id, r3f.canvasId);\n if (!insp?.material?.map) return false;\n actual = insp.material.map;\n if (!expectedName) { pass = true; return true; }\n pass = actual === expectedName;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFoundAsync(r3f.page, 'toHaveMapTexture', id, 'to have a map texture', timeout, r3f.canvasId);\n return {\n pass,\n message: () => {\n if (!expectedName) {\n return pass\n ? `Expected \"${id}\" to NOT have a map texture`\n : `Expected \"${id}\" to have a map texture, but none found (waited ${timeout}ms)`;\n }\n return pass\n ? `Expected \"${id}\" to NOT have map \"${expectedName}\"`\n : `Expected \"${id}\" map \"${expectedName}\", got \"${actual ?? 'none'}\" (waited ${timeout}ms)`;\n },\n name: 'toHaveMapTexture', expected: expectedName ?? 'any map', actual,\n };\n },\n\n // =========================================================================\n // Scene-level matchers (no object ID — operate on the whole scene)\n // =========================================================================\n\n /**\n * Assert the total number of objects in the scene.\n * Auto-retries until the count matches or timeout.\n *\n * @example expect(r3f).toHaveObjectCount(42);\n * @example expect(r3f).toHaveObjectCount(42, { timeout: 10_000 });\n */\n async toHaveObjectCount(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchSceneCount(r3f.page, r3f.canvasId);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} objects, but it does`\n : `Expected scene to have ${expected} objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveObjectCount', expected, actual,\n };\n },\n\n /**\n * Assert the total number of objects is at least `min`.\n * Useful for BIM scenes where the exact count may vary slightly.\n *\n * @example expect(r3f).toHaveObjectCountGreaterThan(10);\n */\n async toHaveObjectCountGreaterThan(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n min: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchSceneCount(r3f.page, r3f.canvasId);\n pass = actual > min;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to have at most ${min} objects, but has ${actual}`\n : `Expected scene to have more than ${min} objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveObjectCountGreaterThan', expected: `> ${min}`, actual,\n };\n },\n\n /**\n * Assert the count of objects of a specific Three.js type.\n * Auto-retries until the count matches or timeout.\n *\n * @example expect(r3f).toHaveCountByType('Mesh', 5);\n * @example expect(r3f).toHaveCountByType('Line', 10, { timeout: 10_000 });\n */\n async toHaveCountByType(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n type: string,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchCountByType(r3f.page, type, r3f.canvasId);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} \"${type}\" objects, but it does`\n : `Expected ${expected} \"${type}\" objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveCountByType', expected, actual,\n };\n },\n\n /**\n * Assert the total triangle count across all meshes in the scene.\n * Use as a performance budget guard — fail if the scene exceeds a threshold.\n *\n * @example expect(r3f).toHaveTotalTriangleCount(50000);\n * @example expect(r3f).not.toHaveTotalTriangleCountGreaterThan(100000); // budget guard\n */\n async toHaveTotalTriangleCount(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchTotalTriangles(r3f.page, r3f.canvasId);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} total triangles, but it does`\n : `Expected ${expected} total triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTotalTriangleCount', expected, actual,\n };\n },\n\n /**\n * Assert the total triangle count is at most `max`.\n * Perfect as a performance budget guard to prevent scene bloat.\n *\n * @example expect(r3f).toHaveTotalTriangleCountLessThan(100_000);\n */\n async toHaveTotalTriangleCountLessThan(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n max: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchTotalTriangles(r3f.page, r3f.canvasId);\n pass = actual < max;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to have at least ${max} triangles, but has ${actual}`\n : `Expected scene to have fewer than ${max} triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTotalTriangleCountLessThan', expected: `< ${max}`, actual,\n };\n },\n // ===================== CAMERA STATE ASSERTIONS ===========================\n\n /**\n * Assert the camera position is close to the expected [x, y, z].\n *\n * @example expect(r3f).toHaveCameraPosition([0, 5, 10], 0.1);\n */\n async toHaveCameraPosition(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: [number, number, number],\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.1);\n const isNot = this.isNot;\n let actual: [number, number, number] = [0, 0, 0];\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const cam = await r3f.page.evaluate((cid) => { const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__; return api!.getCameraState(); }, r3f.canvasId ?? null);\n actual = cam.position;\n pass = Math.abs(actual[0] - expected[0]) <= tolerance\n && Math.abs(actual[1] - expected[1]) <= tolerance\n && Math.abs(actual[2] - expected[2]) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected camera NOT at [${expected}], but it is`\n : `Expected camera at [${expected}], got [${actual}] (tol=${tolerance}, waited ${timeout}ms)`,\n name: 'toHaveCameraPosition', expected, actual,\n };\n },\n\n /**\n * Assert the camera field of view (PerspectiveCamera only).\n *\n * @example expect(r3f).toHaveCameraFov(75);\n */\n async toHaveCameraFov(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.1);\n const isNot = this.isNot;\n let actual: number | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const cam = await r3f.page.evaluate((cid) => { const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__; return api!.getCameraState(); }, r3f.canvasId ?? null);\n actual = cam.fov;\n pass = actual !== undefined && Math.abs(actual - expected) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected camera NOT to have fov ${expected}, but it does`\n : `Expected camera fov ${expected}, got ${actual ?? 'N/A'} (tol=${tolerance}, waited ${timeout}ms)`,\n name: 'toHaveCameraFov', expected, actual,\n };\n },\n\n /**\n * Assert the camera near clipping plane.\n *\n * @example expect(r3f).toHaveCameraNear(0.1);\n */\n async toHaveCameraNear(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let actual = 0;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const cam = await r3f.page.evaluate((cid) => { const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__; return api!.getCameraState(); }, r3f.canvasId ?? null);\n actual = cam.near;\n pass = Math.abs(actual - expected) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected camera near NOT ${expected}, but it is`\n : `Expected camera near ${expected}, got ${actual} (tol=${tolerance}, waited ${timeout}ms)`,\n name: 'toHaveCameraNear', expected, actual,\n };\n },\n\n /**\n * Assert the camera far clipping plane.\n *\n * @example expect(r3f).toHaveCameraFar(1000);\n */\n async toHaveCameraFar(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 1);\n const isNot = this.isNot;\n let actual = 0;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const cam = await r3f.page.evaluate((cid) => { const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__; return api!.getCameraState(); }, r3f.canvasId ?? null);\n actual = cam.far;\n pass = Math.abs(actual - expected) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected camera far NOT ${expected}, but it is`\n : `Expected camera far ${expected}, got ${actual} (tol=${tolerance}, waited ${timeout}ms)`,\n name: 'toHaveCameraFar', expected, actual,\n };\n },\n\n /**\n * Assert the camera zoom level.\n *\n * @example expect(r3f).toHaveCameraZoom(1);\n */\n async toHaveCameraZoom(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n expected: number,\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let actual = 0;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const cam = await r3f.page.evaluate((cid) => { const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__; return api!.getCameraState(); }, r3f.canvasId ?? null);\n actual = cam.zoom;\n pass = Math.abs(actual - expected) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected camera zoom NOT ${expected}, but it is`\n : `Expected camera zoom ${expected}, got ${actual} (tol=${tolerance}, waited ${timeout}ms)`,\n name: 'toHaveCameraZoom', expected, actual,\n };\n },\n\n // ======================== BATCH ASSERTIONS ==============================\n\n /**\n * Assert that ALL given objects exist in the scene.\n * Accepts an array of testIds/uuids or a glob pattern (e.g. \"wall-*\").\n *\n * @example expect(r3f).toAllExist(['wall-1', 'wall-2', 'floor']);\n * @example expect(r3f).toAllExist('wall-*');\n */\n async toAllExist(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n idsOrPattern: string[] | string,\n opts?: MatcherOptions,\n ) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let missing: string[] = [];\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const ids = typeof idsOrPattern === 'string'\n ? await resolvePattern(r3f.page, idsOrPattern, r3f.canvasId)\n : idsOrPattern;\n missing = [];\n for (const id of ids) {\n const m = await r3f.getObject(id);\n if (!m) missing.push(id);\n }\n pass = missing.length === 0 && ids.length > 0;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected some objects to NOT exist, but all do`\n : `Objects not found: [${missing.join(', ')}] (waited ${timeout}ms)`,\n name: 'toAllExist', expected: idsOrPattern, actual: { missing },\n };\n },\n\n /**\n * Assert that ALL given objects are visible.\n *\n * @example expect(r3f).toAllBeVisible(['wall-1', 'wall-2', 'floor']);\n * @example expect(r3f).toAllBeVisible('wall-*');\n */\n async toAllBeVisible(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n idsOrPattern: string[] | string,\n opts?: MatcherOptions,\n ) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let hidden: string[] = [];\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const ids = typeof idsOrPattern === 'string'\n ? await resolvePattern(r3f.page, idsOrPattern, r3f.canvasId)\n : idsOrPattern;\n hidden = [];\n for (const id of ids) {\n const m = await r3f.getObject(id);\n if (!m || !m.visible) hidden.push(id);\n }\n pass = hidden.length === 0 && ids.length > 0;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected some objects to NOT be visible, but all are`\n : `Objects not visible: [${hidden.join(', ')}] (waited ${timeout}ms)`,\n name: 'toAllBeVisible', expected: idsOrPattern, actual: { hidden },\n };\n },\n\n /**\n * Assert that NONE of the given objects exist in the scene.\n *\n * @example expect(r3f).toNoneExist(['deleted-wall', 'old-floor']);\n * @example expect(r3f).toNoneExist('temp-*');\n */\n async toNoneExist(\n this: ExpectMatcherContext, r3f: R3FMatcherReceiver,\n idsOrPattern: string[] | string,\n opts?: MatcherOptions,\n ) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let found: string[] = [];\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n const ids = typeof idsOrPattern === 'string'\n ? await resolvePattern(r3f.page, idsOrPattern, r3f.canvasId)\n : idsOrPattern;\n found = [];\n for (const id of ids) {\n const m = await r3f.getObject(id);\n if (m) found.push(id);\n }\n pass = found.length === 0;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected some objects to exist, but none do`\n : `Objects still exist: [${found.join(', ')}] (waited ${timeout}ms)`,\n name: 'toNoneExist', expected: idsOrPattern, actual: { found },\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Batch helper — resolve glob/wildcard patterns to matching testIds\n// ---------------------------------------------------------------------------\n\nasync function resolvePattern(page: Page, pattern: string, canvasId?: string): Promise<string[]> {\n return page.evaluate(([p, cid]) => {\n const api = cid ? window.__R3F_DOM_INSTANCES__?.[cid] : window.__R3F_DOM__;\n if (!api) return [];\n const snap = api.snapshot();\n const ids: string[] = [];\n const regex = new RegExp('^' + p.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$');\n function walk(node: { uuid: string; name: string; type: string; testId?: string; children: unknown[] }) {\n const testId = (node as { testId?: string }).testId ?? node.name;\n if (regex.test(testId) || regex.test(node.uuid)) ids.push(testId || node.uuid);\n for (const child of (node.children ?? []) as typeof node[]) walk(child);\n }\n walk(snap.tree as Parameters<typeof walk>[0]);\n return ids;\n }, [pattern, canvasId ?? null] as const);\n}\n\nexport { r3fMatchers };\n","/**\n * @module pathGenerators\n *\n * Pure geometry utilities that generate arrays of screen-space points for\n * use with `r3f.drawPath()`. Provides line, quadratic bezier, rectangle,\n * and circle/ellipse path generators.\n *\n * Duplicated from `@react-three-dom/core` to avoid a runtime dependency.\n */\n\n/** A 2D screen-space point in CSS pixels, relative to the canvas top-left. */\nexport interface DrawPoint {\n /** X coordinate in CSS pixels from canvas left edge. */\n x: number;\n /** Y coordinate in CSS pixels from canvas top edge. */\n y: number;\n /** Optional pressure (0–1). Default: 0.5 */\n pressure?: number;\n}\n\n/**\n * Generate points along a straight line.\n *\n * @param start Start point\n * @param end End point\n * @param steps Intermediate points (excluding start/end). Default: 10\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function linePath(\n start: { x: number; y: number },\n end: { x: number; y: number },\n steps = 10,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n const totalSteps = steps + 1;\n for (let i = 0; i <= totalSteps; i++) {\n const t = i / totalSteps;\n points.push({\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n pressure,\n });\n }\n return points;\n}\n\n/**\n * Generate points along a quadratic bezier curve.\n *\n * @param start Start point\n * @param control Control point\n * @param end End point\n * @param steps Number of steps. Default: 20\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function curvePath(\n start: { x: number; y: number },\n control: { x: number; y: number },\n end: { x: number; y: number },\n steps = 20,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n points.push({\n x: invT * invT * start.x + 2 * invT * t * control.x + t * t * end.x,\n y: invT * invT * start.y + 2 * invT * t * control.y + t * t * end.y,\n pressure,\n });\n }\n return points;\n}\n\n/**\n * Generate points forming a rectangle.\n *\n * @param topLeft Top-left corner\n * @param bottomRight Bottom-right corner\n * @param pointsPerSide Points per side. Default: 5\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function rectPath(\n topLeft: { x: number; y: number },\n bottomRight: { x: number; y: number },\n pointsPerSide = 5,\n pressure = 0.5,\n): DrawPoint[] {\n const topRight = { x: bottomRight.x, y: topLeft.y };\n const bottomLeft = { x: topLeft.x, y: bottomRight.y };\n const sides = [\n [topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft],\n ] as const;\n\n const points: DrawPoint[] = [];\n for (const [from, to] of sides) {\n for (let i = 0; i < pointsPerSide; i++) {\n const t = i / pointsPerSide;\n points.push({\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n pressure,\n });\n }\n }\n points.push({ x: topLeft.x, y: topLeft.y, pressure });\n return points;\n}\n\n/**\n * Generate points forming a circle/ellipse.\n *\n * @param center Center point\n * @param radiusX Horizontal radius in CSS pixels\n * @param radiusY Vertical radius. Default: same as radiusX\n * @param steps Number of points. Default: 36\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function circlePath(\n center: { x: number; y: number },\n radiusX: number,\n radiusY?: number,\n steps = 36,\n pressure = 0.5,\n): DrawPoint[] {\n const ry = radiusY ?? radiusX;\n const points: DrawPoint[] = [];\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * Math.PI * 2;\n points.push({\n x: center.x + Math.cos(angle) * radiusX,\n y: center.y + Math.sin(angle) * ry,\n pressure,\n });\n }\n return points;\n}\n"]}
|