@react-three-dom/core 0.1.0 → 0.2.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 +610 -193
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +272 -4
- package/dist/index.d.ts +272 -4
- package/dist/index.js +603 -194
- 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/version.ts","../src/store/ObjectStore.ts","../src/mirror/CustomElements.ts","../src/mirror/attributes.ts","../src/mirror/DomMirror.ts","../src/bridge/patchObject3D.ts","../src/snapshot/snapshot.ts","../src/interactions/projection.ts","../src/interactions/dispatch.ts","../src/interactions/raycastVerify.ts","../src/interactions/resolve.ts","../src/interactions/click.ts","../src/interactions/hover.ts","../src/interactions/drag.ts","../src/interactions/wheel.ts","../src/interactions/pointerMiss.ts","../src/highlight/SelectionManager.ts","../src/bridge/ThreeDom.tsx","../src/highlight/Highlighter.ts"],"names":["BufferGeometry","Material","InstancedMesh","Box3","Color","Object3D","Vector3","_box3","Frustum","Matrix4","Raycaster","Vector2","_store","getStore","useThree","useRef","useEffect","useFrame","objects","_box","_v","_corners","getObjectLabel"],"mappings":"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","file":"index.cjs","sourcesContent":["export const version = '0.1.0';\n","import {\n Object3D,\n Mesh,\n InstancedMesh,\n BufferGeometry,\n Material,\n Box3,\n Color,\n} from 'three';\nimport type {\n ObjectMetadata,\n ObjectInspection,\n GeometryInspection,\n MaterialInspection,\n StoreEvent,\n StoreListener,\n} from '../types';\n\n// ---------------------------------------------------------------------------\n// Helper: extract Tier 1 metadata from a live Three.js object\n// ---------------------------------------------------------------------------\n\nfunction extractMetadata(obj: Object3D): ObjectMetadata {\n const meta: ObjectMetadata = {\n uuid: obj.uuid,\n name: obj.name,\n type: obj.type,\n visible: obj.visible,\n testId: obj.userData?.testId as string | undefined,\n position: [obj.position.x, obj.position.y, obj.position.z],\n rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z],\n scale: [obj.scale.x, obj.scale.y, obj.scale.z],\n parentUuid: obj.parent?.uuid ?? null,\n childrenUuids: obj.children.map((c) => c.uuid),\n boundsDirty: true,\n };\n\n // Geometry info (Mesh, SkinnedMesh, InstancedMesh, Points, Line, etc.)\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n meta.geometryType = geom.type;\n const posAttr = geom.getAttribute('position');\n if (posAttr) {\n meta.vertexCount = posAttr.count;\n if (geom.index) {\n meta.triangleCount = Math.floor(geom.index.count / 3);\n } else {\n meta.triangleCount = Math.floor(posAttr.count / 3);\n }\n }\n }\n }\n\n // Material info\n if ('material' in obj) {\n const mat = (obj as Mesh).material;\n if (mat instanceof Material) {\n meta.materialType = mat.type;\n } else if (Array.isArray(mat) && mat.length > 0) {\n meta.materialType = mat[0].type + (mat.length > 1 ? ` (+${mat.length - 1})` : '');\n }\n }\n\n // InstancedMesh count\n if (obj instanceof InstancedMesh) {\n meta.instanceCount = obj.count;\n }\n\n return meta;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: compare two metadata objects for changes (Tier 1 only)\n// Returns true if any values differ\n// ---------------------------------------------------------------------------\n\nfunction hasChanged(prev: ObjectMetadata, curr: ObjectMetadata): boolean {\n return (\n prev.visible !== curr.visible ||\n prev.name !== curr.name ||\n prev.testId !== curr.testId ||\n prev.position[0] !== curr.position[0] ||\n prev.position[1] !== curr.position[1] ||\n prev.position[2] !== curr.position[2] ||\n prev.rotation[0] !== curr.rotation[0] ||\n prev.rotation[1] !== curr.rotation[1] ||\n prev.rotation[2] !== curr.rotation[2] ||\n prev.scale[0] !== curr.scale[0] ||\n prev.scale[1] !== curr.scale[1] ||\n prev.scale[2] !== curr.scale[2] ||\n prev.parentUuid !== curr.parentUuid ||\n prev.childrenUuids.length !== curr.childrenUuids.length ||\n prev.instanceCount !== curr.instanceCount\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Tier 2 on-demand inspection\n// ---------------------------------------------------------------------------\n\nconst _box3 = new Box3();\n\nfunction inspectObject(obj: Object3D, metadata: ObjectMetadata): ObjectInspection {\n // World matrix\n obj.updateWorldMatrix(true, false);\n const worldMatrix = Array.from(obj.matrixWorld.elements);\n\n // Bounds\n _box3.setFromObject(obj);\n const boundsMin: [number, number, number] = [_box3.min.x, _box3.min.y, _box3.min.z];\n const boundsMax: [number, number, number] = [_box3.max.x, _box3.max.y, _box3.max.z];\n\n const inspection: ObjectInspection = {\n metadata,\n worldMatrix,\n bounds: { min: boundsMin, max: boundsMax },\n userData: { ...obj.userData },\n };\n\n // Geometry details\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n const geoInspection: GeometryInspection = {\n type: geom.type,\n attributes: {},\n };\n\n for (const [name, attr] of Object.entries(geom.attributes)) {\n geoInspection.attributes[name] = {\n itemSize: attr.itemSize,\n count: attr.count,\n };\n }\n\n if (geom.index) {\n geoInspection.index = { count: geom.index.count };\n }\n\n geom.computeBoundingSphere();\n const sphere = geom.boundingSphere;\n if (sphere) {\n geoInspection.boundingSphere = {\n center: [sphere.center.x, sphere.center.y, sphere.center.z],\n radius: sphere.radius,\n };\n }\n\n inspection.geometry = geoInspection;\n }\n }\n\n // Material details\n if ('material' in obj) {\n const rawMat = (obj as Mesh).material;\n const mat = Array.isArray(rawMat) ? rawMat[0] : rawMat;\n if (mat instanceof Material) {\n const matInspection: MaterialInspection = {\n type: mat.type,\n transparent: mat.transparent,\n opacity: mat.opacity,\n side: mat.side,\n };\n\n // Color (most materials have it)\n if ('color' in mat && (mat as unknown as { color: Color }).color instanceof Color) {\n matInspection.color = '#' + (mat as unknown as { color: Color }).color.getHexString();\n }\n\n // Map texture\n if ('map' in mat) {\n const map = (mat as unknown as { map: { name?: string; uuid?: string } | null }).map;\n if (map) {\n matInspection.map = map.name || map.uuid || 'unnamed';\n }\n }\n\n // ShaderMaterial uniforms\n if ('uniforms' in mat) {\n const uniforms = (mat as unknown as { uniforms: Record<string, { value: unknown }> })\n .uniforms;\n matInspection.uniforms = {};\n for (const [key, uniform] of Object.entries(uniforms)) {\n // Store a safe representation of the value\n const val = uniform.value;\n if (val === null || val === undefined) {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'number' || typeof val === 'boolean' || typeof val === 'string') {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'object' && 'toArray' in val) {\n matInspection.uniforms[key] = (val as { toArray(): number[] }).toArray();\n } else {\n matInspection.uniforms[key] = `[${typeof val}]`;\n }\n }\n }\n\n inspection.material = matInspection;\n }\n }\n\n return inspection;\n}\n\n// ---------------------------------------------------------------------------\n// ObjectStore — the source of truth for all tracked Three.js objects\n// ---------------------------------------------------------------------------\n\nexport class ObjectStore {\n // Tier 1: metadata for every tracked object\n private _metaByObject = new WeakMap<Object3D, ObjectMetadata>();\n private _objectByUuid = new Map<string, Object3D>();\n private _objectsByTestId = new Map<string, Object3D>();\n private _objectsByName = new Map<string, Set<Object3D>>();\n\n // Flat list for amortized iteration\n private _flatList: Object3D[] = [];\n private _flatListDirty = true;\n\n // Priority dirty queue: objects that changed and need immediate sync\n private _dirtyQueue = new Set<Object3D>();\n\n // Event listeners\n private _listeners: StoreListener[] = [];\n\n // Track the root scene(s) for scoping\n private _trackedRoots = new WeakSet<Object3D>();\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a single object into the store.\n * Populates Tier 1 metadata and all indexes.\n */\n register(obj: Object3D): ObjectMetadata {\n // Skip internal highlight/label helpers created by Highlighter\n if (obj.userData?.__r3fdom_internal) {\n return extractMetadata(obj); // Return metadata but don't store it\n }\n\n // Skip if already registered\n const existing = this._metaByObject.get(obj);\n if (existing) return existing;\n\n const meta = extractMetadata(obj);\n this._metaByObject.set(obj, meta);\n this._objectByUuid.set(meta.uuid, obj);\n this._flatListDirty = true;\n\n // Index by testId\n if (meta.testId) {\n this._objectsByTestId.set(meta.testId, obj);\n }\n\n // Index by name\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n\n this._emit({ type: 'add', object: obj, metadata: meta });\n return meta;\n }\n\n /**\n * Register an entire subtree (object + all descendants).\n */\n registerTree(root: Object3D): void {\n this._trackedRoots.add(root);\n root.traverse((obj) => {\n this.register(obj);\n });\n }\n\n /**\n * Unregister a single object from the store.\n */\n unregister(obj: Object3D): void {\n const meta = this._metaByObject.get(obj);\n if (!meta) return;\n\n this._metaByObject.delete(obj);\n this._objectByUuid.delete(meta.uuid);\n this._dirtyQueue.delete(obj);\n this._flatListDirty = true;\n\n if (meta.testId) {\n this._objectsByTestId.delete(meta.testId);\n }\n\n if (meta.name) {\n const nameSet = this._objectsByName.get(meta.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) {\n this._objectsByName.delete(meta.name);\n }\n }\n }\n\n this._emit({ type: 'remove', object: obj, metadata: meta });\n }\n\n /**\n * Unregister an entire subtree (object + all descendants).\n */\n unregisterTree(root: Object3D): void {\n root.traverse((obj) => {\n this.unregister(obj);\n });\n this._trackedRoots.delete(root);\n }\n\n // -------------------------------------------------------------------------\n // Tier 1: Update (compare-and-set, returns true if changed)\n // -------------------------------------------------------------------------\n\n /**\n * Refresh Tier 1 metadata from the live Three.js object.\n * Returns true if any values changed.\n */\n update(obj: Object3D): boolean {\n const prev = this._metaByObject.get(obj);\n if (!prev) return false;\n\n const curr = extractMetadata(obj);\n\n if (hasChanged(prev, curr)) {\n // Update indexes if testId or name changed\n if (prev.testId !== curr.testId) {\n if (prev.testId) this._objectsByTestId.delete(prev.testId);\n if (curr.testId) this._objectsByTestId.set(curr.testId, obj);\n }\n if (prev.name !== curr.name) {\n if (prev.name) {\n const nameSet = this._objectsByName.get(prev.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) this._objectsByName.delete(prev.name);\n }\n }\n if (curr.name) {\n let nameSet = this._objectsByName.get(curr.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(curr.name, nameSet);\n }\n nameSet.add(obj);\n }\n }\n\n this._metaByObject.set(obj, curr);\n this._emit({ type: 'update', object: obj, metadata: curr });\n return true;\n }\n\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand inspection (never cached)\n // -------------------------------------------------------------------------\n\n /**\n * Compute full inspection data from a live Three.js object.\n * This reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(idOrUuid: string): ObjectInspection | null {\n const obj = this.getObject3D(idOrUuid);\n if (!obj) return null;\n\n const meta = this._metaByObject.get(obj);\n if (!meta) return null;\n\n return inspectObject(obj, meta);\n }\n\n // -------------------------------------------------------------------------\n // Lookups (O(1))\n // -------------------------------------------------------------------------\n\n /** Get metadata by testId. O(1). */\n getByTestId(testId: string): ObjectMetadata | null {\n const obj = this._objectsByTestId.get(testId);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by uuid. O(1). */\n getByUuid(uuid: string): ObjectMetadata | null {\n const obj = this._objectByUuid.get(uuid);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by name (returns array since names aren't unique). O(1). */\n getByName(name: string): ObjectMetadata[] {\n const objs = this._objectsByName.get(name);\n if (!objs) return [];\n const results: ObjectMetadata[] = [];\n for (const obj of objs) {\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /** Get the raw Three.js Object3D by testId or uuid. */\n getObject3D(idOrUuid: string): Object3D | null {\n // Try testId first, then uuid\n return this._objectsByTestId.get(idOrUuid)\n ?? this._objectByUuid.get(idOrUuid)\n ?? null;\n }\n\n /** Get metadata for a known Object3D reference. */\n getMetadata(obj: Object3D): ObjectMetadata | null {\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Check if an object is registered. */\n has(obj: Object3D): boolean {\n return this._metaByObject.has(obj);\n }\n\n /** Total number of tracked objects. */\n getCount(): number {\n return this._objectByUuid.size;\n }\n\n /** Check if a root scene is tracked. */\n isTrackedRoot(obj: Object3D): boolean {\n return this._trackedRoots.has(obj);\n }\n\n /**\n * Walk up from `obj` to see if any ancestor is a tracked root.\n * Used by Object3D.add/remove patch to determine if an object\n * belongs to a monitored scene.\n */\n isInTrackedScene(obj: Object3D): boolean {\n let current: Object3D | null = obj;\n while (current) {\n if (this._trackedRoots.has(current)) return true;\n current = current.parent;\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Flat list for amortized iteration\n // -------------------------------------------------------------------------\n\n /**\n * Get a flat array of all tracked objects for amortized batch processing.\n * Rebuilds lazily when the list is dirty (objects added/removed).\n */\n getFlatList(): Object3D[] {\n if (this._flatListDirty) {\n this._flatList = Array.from(this._objectByUuid.values());\n this._flatListDirty = false;\n }\n return this._flatList;\n }\n\n // -------------------------------------------------------------------------\n // Priority dirty queue\n // -------------------------------------------------------------------------\n\n /** Mark an object as dirty (needs priority sync next frame). */\n markDirty(obj: Object3D): void {\n if (this._metaByObject.has(obj)) {\n this._dirtyQueue.add(obj);\n }\n }\n\n /**\n * Drain the dirty queue, returning all objects that need priority sync.\n * Clears the queue after draining.\n */\n drainDirtyQueue(): Object3D[] {\n if (this._dirtyQueue.size === 0) return [];\n const objects = Array.from(this._dirtyQueue);\n this._dirtyQueue.clear();\n return objects;\n }\n\n /** Number of objects currently in the dirty queue. */\n getDirtyCount(): number {\n return this._dirtyQueue.size;\n }\n\n // -------------------------------------------------------------------------\n // Event system\n // -------------------------------------------------------------------------\n\n /** Subscribe to store events (add, remove, update). */\n subscribe(listener: StoreListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _emit(event: StoreEvent): void {\n for (const listener of this._listeners) {\n listener(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Remove all tracked objects and reset state. */\n dispose(): void {\n this._objectByUuid.clear();\n this._objectsByTestId.clear();\n this._objectsByName.clear();\n this._flatList = [];\n this._flatListDirty = true;\n this._dirtyQueue.clear();\n this._listeners = [];\n // WeakMap and WeakSet entries will be GC'd automatically\n }\n}\n","import type { Object3D } from 'three';\nimport type { ObjectMetadata, ObjectInspection } from '../types';\nimport type { ObjectStore } from '../store/ObjectStore';\n\n// ---------------------------------------------------------------------------\n// Tag mapping: Three.js type → custom element tag name\n// ---------------------------------------------------------------------------\n\n/**\n * Maps Three.js object types to custom element tag names.\n * Multiple Three.js types can map to the same tag.\n */\nexport const TAG_MAP: Record<string, string> = {\n // Scenes\n Scene: 'three-scene',\n\n // Groups / containers\n Group: 'three-group',\n LOD: 'three-group',\n Bone: 'three-group',\n\n // Meshes\n Mesh: 'three-mesh',\n SkinnedMesh: 'three-mesh',\n InstancedMesh: 'three-mesh',\n LineSegments: 'three-mesh',\n Line: 'three-mesh',\n LineLoop: 'three-mesh',\n Points: 'three-mesh',\n Sprite: 'three-mesh',\n\n // Lights\n AmbientLight: 'three-light',\n DirectionalLight: 'three-light',\n HemisphereLight: 'three-light',\n PointLight: 'three-light',\n RectAreaLight: 'three-light',\n SpotLight: 'three-light',\n LightProbe: 'three-light',\n\n // Cameras\n PerspectiveCamera: 'three-camera',\n OrthographicCamera: 'three-camera',\n ArrayCamera: 'three-camera',\n CubeCamera: 'three-camera',\n\n // Helpers (map to object as fallback)\n BoxHelper: 'three-object',\n ArrowHelper: 'three-object',\n AxesHelper: 'three-object',\n GridHelper: 'three-object',\n SkeletonHelper: 'three-object',\n};\n\n/** All unique tag names that need to be registered. */\nconst ALL_TAGS = [\n 'three-scene',\n 'three-group',\n 'three-mesh',\n 'three-light',\n 'three-camera',\n 'three-object',\n] as const;\n\nexport type ThreeTagName = (typeof ALL_TAGS)[number];\n\n/** Default fallback tag for any Object3D type not in TAG_MAP. */\nconst DEFAULT_TAG: ThreeTagName = 'three-object';\n\n/**\n * Get the custom element tag name for a Three.js object type.\n */\nexport function getTagForType(type: string): ThreeTagName {\n return (TAG_MAP[type] as ThreeTagName) ?? DEFAULT_TAG;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: reference to the store (set once during ensureCustomElements)\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\n\n/**\n * Set the ObjectStore reference that custom elements use for lookups.\n * Must be called before any custom element properties/methods are used.\n */\nexport function setElementStore(store: ObjectStore): void {\n _store = store;\n}\n\n// ---------------------------------------------------------------------------\n// ThreeElement: base class for all custom elements\n// ---------------------------------------------------------------------------\n\n/**\n * Base custom element class for the DOM mirror.\n * Provides interactive properties and methods accessible via DevTools console.\n *\n * Usage in DevTools after selecting a <three-mesh> in the Elements panel:\n * $0.metadata → Tier 1 cached metadata (instant)\n * $0.inspect() → Tier 2 heavy inspection (reads live Three.js object)\n * $0.object3D → raw THREE.Object3D reference\n * $0.position → [x, y, z] shortcut\n * $0.bounds → { min, max } shortcut\n * $0.click() → trigger deterministic click\n * $0.hover() → trigger deterministic hover\n */\nexport class ThreeElement extends HTMLElement {\n // -------------------------------------------------------------------------\n // Tier 1: Lightweight cached metadata (always available)\n // -------------------------------------------------------------------------\n\n /**\n * Returns the Tier 1 cached metadata for this object.\n * Instant, no computation. Returns null if the element is not linked.\n */\n get metadata(): ObjectMetadata | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getByUuid(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand heavy inspection (reads live Three.js object)\n // -------------------------------------------------------------------------\n\n /**\n * Performs a full inspection of the linked Three.js object.\n * Reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(): ObjectInspection | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.inspect(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Raw Three.js object reference\n // -------------------------------------------------------------------------\n\n /**\n * Returns the raw Three.js Object3D linked to this DOM element.\n * Allows direct access to any Three.js property or method.\n */\n get object3D(): Object3D | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getObject3D(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Convenience shortcuts (read from Tier 1 metadata)\n // -------------------------------------------------------------------------\n\n /**\n * Local position as [x, y, z].\n */\n get position(): [number, number, number] | null {\n return this.metadata?.position ?? null;\n }\n\n /**\n * Local euler rotation as [x, y, z] in radians.\n */\n get rotation(): [number, number, number] | null {\n return this.metadata?.rotation ?? null;\n }\n\n /**\n * Local scale as [x, y, z].\n */\n get scale(): [number, number, number] | null {\n return this.metadata?.scale ?? null;\n }\n\n /**\n * Whether the object is visible (does not check parent chain).\n */\n get visible(): boolean {\n return this.metadata?.visible ?? false;\n }\n\n /**\n * The testId from userData.testId, if set.\n */\n get testId(): string | undefined {\n return this.metadata?.testId;\n }\n\n /**\n * World-space bounding box. Computed on-demand (Tier 2).\n */\n get bounds(): { min: [number, number, number]; max: [number, number, number] } | null {\n const inspection = this.inspect();\n return inspection?.bounds ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Interaction methods\n // -------------------------------------------------------------------------\n\n /**\n * Trigger a deterministic click on the linked 3D object.\n * Projects the object center to screen coordinates and dispatches pointer events.\n */\n click(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot click: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.click === 'function') {\n window.__R3F_DOM__.click(uuid);\n } else {\n console.warn('[react-three-dom] Cannot click: bridge API not initialized');\n }\n }\n\n /**\n * Trigger a deterministic hover on the linked 3D object.\n */\n hover(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot hover: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.hover === 'function') {\n window.__R3F_DOM__.hover(uuid);\n } else {\n console.warn('[react-three-dom] Cannot hover: bridge API not initialized');\n }\n }\n\n // -------------------------------------------------------------------------\n // Console-friendly output\n // -------------------------------------------------------------------------\n\n /**\n * Returns a readable string representation for console output.\n */\n override toString(): string {\n const tag = this.tagName.toLowerCase();\n const name = this.dataset.name ? ` name=\"${this.dataset.name}\"` : '';\n const testId = this.dataset.testId ? ` testId=\"${this.dataset.testId}\"` : '';\n const type = this.dataset.type ? ` type=\"${this.dataset.type}\"` : '';\n return `<${tag}${name}${testId}${type}>`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nlet _registered = false;\n\n/**\n * Register all custom elements (<three-scene>, <three-mesh>, etc.).\n * Safe to call multiple times — only registers once.\n *\n * @param store - The ObjectStore instance for element property lookups\n */\nexport function ensureCustomElements(store: ObjectStore): void {\n if (_registered) return;\n\n // Check if we're in a browser environment\n if (typeof customElements === 'undefined') return;\n\n _store = store;\n\n for (const tag of ALL_TAGS) {\n if (!customElements.get(tag)) {\n // Each tag gets its own class so instanceof checks work\n // and DevTools shows distinct element types\n const elementClass = class extends ThreeElement {};\n // Set displayName for debugging\n Object.defineProperty(elementClass, 'name', { value: `ThreeElement_${tag}` });\n customElements.define(tag, elementClass);\n }\n }\n\n _registered = true;\n}\n\n/**\n * Check if custom elements have been registered.\n */\nexport function isRegistered(): boolean {\n return _registered;\n}\n","import type { ObjectMetadata } from '../types';\n\n// ---------------------------------------------------------------------------\n// Attribute serialization: converts Tier 1 metadata to DOM attribute strings\n// ---------------------------------------------------------------------------\n\n/**\n * Attribute definitions: maps data-attribute names to extractor functions.\n * Each extractor takes metadata and returns a string value, or undefined\n * to skip setting the attribute (avoids empty attributes in DOM).\n */\nconst ATTRIBUTE_MAP: Record<string, (meta: ObjectMetadata) => string | undefined> = {\n 'data-uuid': (m) => m.uuid,\n 'data-name': (m) => m.name || undefined,\n 'data-type': (m) => m.type,\n 'data-visible': (m) => String(m.visible),\n 'data-test-id': (m) => m.testId,\n 'data-geometry': (m) => m.geometryType,\n 'data-material': (m) => m.materialType,\n 'data-position': (m) => serializeTuple(m.position),\n 'data-rotation': (m) => serializeTuple(m.rotation),\n 'data-scale': (m) => serializeTuple(m.scale),\n 'data-vertex-count': (m) => m.vertexCount !== undefined ? String(m.vertexCount) : undefined,\n 'data-triangle-count': (m) => m.triangleCount !== undefined ? String(m.triangleCount) : undefined,\n 'data-instance-count': (m) => m.instanceCount !== undefined ? String(m.instanceCount) : undefined,\n};\n\n/** All attribute names we manage (for diffing). */\nexport const MANAGED_ATTRIBUTES = Object.keys(ATTRIBUTE_MAP);\n\n// ---------------------------------------------------------------------------\n// Serialization helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a 3-element tuple to a compact string: \"1.23,4.56,7.89\"\n * Uses 2 decimal places for readability without excessive precision.\n */\nfunction serializeTuple(tuple: [number, number, number]): string {\n return `${round(tuple[0])},${round(tuple[1])},${round(tuple[2])}`;\n}\n\n/**\n * Round to 4 decimal places to avoid floating point noise\n * while preserving meaningful precision.\n */\nfunction round(n: number): string {\n // Avoid -0 display\n const rounded = Math.round(n * 10000) / 10000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute all attribute key-value pairs for a metadata object.\n * Returns a map of attribute name → value.\n * Attributes with undefined values are excluded.\n */\nexport function computeAttributes(meta: ObjectMetadata): Map<string, string> {\n const attrs = new Map<string, string>();\n for (const [key, extractor] of Object.entries(ATTRIBUTE_MAP)) {\n const value = extractor(meta);\n if (value !== undefined) {\n attrs.set(key, value);\n }\n }\n return attrs;\n}\n\n/**\n * Apply attributes to a DOM element, only writing those that changed.\n * Returns the number of attributes that were actually written (for perf tracking).\n *\n * @param element - The custom element to update\n * @param meta - Current Tier 1 metadata\n * @param prevAttrs - Previous attribute values (mutated in-place to reflect new state)\n * @returns Number of DOM setAttribute calls made\n */\nexport function applyAttributes(\n element: HTMLElement,\n meta: ObjectMetadata,\n prevAttrs: Map<string, string>,\n): number {\n let writeCount = 0;\n const newAttrs = computeAttributes(meta);\n\n // Set or update attributes that changed\n for (const [key, value] of newAttrs) {\n const prev = prevAttrs.get(key);\n if (prev !== value) {\n element.setAttribute(key, value);\n prevAttrs.set(key, value);\n writeCount++;\n }\n }\n\n // Remove attributes that no longer exist\n for (const key of prevAttrs.keys()) {\n if (!newAttrs.has(key)) {\n element.removeAttribute(key);\n prevAttrs.delete(key);\n writeCount++;\n }\n }\n\n return writeCount;\n}\n","import type { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { getTagForType } from './CustomElements';\nimport { applyAttributes } from './attributes';\n\n// ---------------------------------------------------------------------------\n// LRU tracking node (doubly-linked list for O(1) eviction)\n// ---------------------------------------------------------------------------\n\ninterface LRUNode {\n uuid: string;\n prev: LRUNode | null;\n next: LRUNode | null;\n}\n\n// ---------------------------------------------------------------------------\n// Materialized node record — tracks a DOM element and its cached attributes\n// ---------------------------------------------------------------------------\n\ninterface MaterializedNode {\n element: HTMLElement;\n /** Previously applied attribute values for diffing */\n prevAttrs: Map<string, string>;\n /** LRU tracking node */\n lruNode: LRUNode;\n}\n\n// ---------------------------------------------------------------------------\n// DomMirror — lazy DOM tree builder with LRU eviction\n// ---------------------------------------------------------------------------\n\n/**\n * Manages the parallel DOM tree that mirrors the Three.js scene graph.\n *\n * Key design for 100k-scale:\n * - ObjectStore holds Tier 1 metadata for ALL objects (cheap, ~120 bytes each)\n * - DomMirror only materializes DOM nodes for actively viewed/queried objects\n * - Max materialized DOM nodes capped (default 2,000) with LRU eviction\n * - DOM writes only happen for materialized nodes where values actually differ\n */\nexport class DomMirror {\n private _store: ObjectStore;\n private _rootElement: HTMLElement | null = null;\n\n // Materialized nodes indexed by uuid\n private _nodes = new Map<string, MaterializedNode>();\n\n // LRU doubly-linked list for eviction (head = most recently used, tail = least)\n private _lruHead: LRUNode | null = null;\n private _lruTail: LRUNode | null = null;\n private _lruSize = 0;\n\n // Max materialized DOM nodes\n private _maxNodes: number;\n\n // UUID → parent UUID mapping for DOM tree structure\n private _parentMap = new Map<string, string | null>();\n\n constructor(store: ObjectStore, maxNodes = 2000) {\n this._store = store;\n this._maxNodes = maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n /**\n * Set the root DOM element where the mirror tree will be appended.\n * Typically a hidden div: <div id=\"three-dom-root\" style=\"display:none\">\n */\n setRoot(rootElement: HTMLElement): void {\n this._rootElement = rootElement;\n }\n\n /**\n * Build the initial DOM tree from the scene.\n * Materializes the top 2 levels of the scene hierarchy.\n */\n buildInitialTree(scene: Object3D): void {\n if (!this._rootElement) return;\n this.materializeSubtree(scene.uuid, 2);\n }\n\n // -------------------------------------------------------------------------\n // Materialization\n // -------------------------------------------------------------------------\n\n /**\n * Create a DOM node for a single object.\n * If already materialized, touches the LRU and returns the existing element.\n */\n materialize(uuid: string): HTMLElement | null {\n // Already materialized — touch LRU and return\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n // Get metadata from the store\n const meta = this._store.getByUuid(uuid);\n if (!meta) return null;\n\n // Evict if at capacity\n if (this._lruSize >= this._maxNodes) {\n this._evictLRU();\n }\n\n // Create the custom element\n const tag = getTagForType(meta.type);\n const element = document.createElement(tag);\n\n // Style as positioned block so Chrome DevTools can highlight it.\n // Position/dimensions are updated per-frame by ThreeDom's projection sync.\n element.style.cssText = 'display:block;position:absolute;pointer-events:none;box-sizing:border-box;';\n\n // Apply all Tier 1 attributes\n const prevAttrs = new Map<string, string>();\n applyAttributes(element, meta, prevAttrs);\n\n // Create LRU node\n const lruNode: LRUNode = { uuid, prev: null, next: null };\n this._lruPush(lruNode);\n\n // Store the materialized node\n const node: MaterializedNode = { element, prevAttrs, lruNode };\n this._nodes.set(uuid, node);\n\n // Track parent for DOM structure\n this._parentMap.set(uuid, meta.parentUuid);\n\n // Insert into DOM tree\n this._insertIntoDom(uuid, meta.parentUuid, element);\n\n return element;\n }\n\n /**\n * Materialize a subtree starting from the given uuid, up to the specified depth.\n * depth=0 materializes just the node, depth=1 includes direct children, etc.\n */\n materializeSubtree(uuid: string, depth: number): void {\n this.materialize(uuid);\n\n if (depth <= 0) return;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return;\n\n for (const childUuid of meta.childrenUuids) {\n this.materializeSubtree(childUuid, depth - 1);\n }\n }\n\n /**\n * Remove a DOM node but keep JS metadata in the ObjectStore.\n * Called by LRU eviction or when an object is removed from the scene.\n */\n dematerialize(uuid: string): void {\n const node = this._nodes.get(uuid);\n if (!node) return;\n\n // Remove from DOM\n node.element.remove();\n\n // Remove from LRU\n this._lruRemove(node.lruNode);\n\n // Clean up\n this._nodes.delete(uuid);\n this._parentMap.delete(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Structural updates (called by Object3D.add/remove patch)\n // -------------------------------------------------------------------------\n\n /**\n * Called when a new object is added to the tracked scene.\n * Only materializes if the parent is already materialized (lazy expansion).\n */\n onObjectAdded(obj: Object3D): void {\n const parentUuid = obj.parent?.uuid;\n if (!parentUuid) return;\n\n // Only materialize if parent is already visible in the DOM tree\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n this.materialize(obj.uuid);\n }\n\n // Update parent's children in DOM (add the new child)\n if (parentNode) {\n const parentMeta = this._store.getByUuid(parentUuid);\n if (parentMeta) {\n applyAttributes(parentNode.element, parentMeta, parentNode.prevAttrs);\n }\n }\n }\n\n /**\n * Called when an object is removed from the tracked scene.\n * Dematerializes the object and all its descendants.\n */\n onObjectRemoved(obj: Object3D): void {\n // Dematerialize entire subtree\n obj.traverse((child) => {\n this.dematerialize(child.uuid);\n });\n }\n\n // -------------------------------------------------------------------------\n // Attribute sync (called per-frame by ThreeDom)\n // -------------------------------------------------------------------------\n\n /**\n * Sync Tier 1 attributes for an object if it's materialized.\n * No-op if the object has no materialized DOM node.\n * Returns the number of DOM writes performed.\n */\n syncAttributes(obj: Object3D): number {\n const node = this._nodes.get(obj.uuid);\n if (!node) return 0;\n\n const meta = this._store.getMetadata(obj);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n /**\n * Sync attributes by uuid (when you don't have the Object3D ref).\n */\n syncAttributesByUuid(uuid: string): number {\n const node = this._nodes.get(uuid);\n if (!node) return 0;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n // -------------------------------------------------------------------------\n // Querying\n // -------------------------------------------------------------------------\n\n /**\n * Get the root DOM element.\n */\n getRootElement(): HTMLElement | null {\n return this._rootElement;\n }\n\n /**\n * Get the materialized DOM element for an object, if it exists.\n */\n getElement(uuid: string): HTMLElement | null {\n const node = this._nodes.get(uuid);\n if (node) {\n this._lruTouch(node.lruNode);\n return node.element;\n }\n return null;\n }\n\n /**\n * Check if an object has a materialized DOM node.\n */\n isMaterialized(uuid: string): boolean {\n return this._nodes.has(uuid);\n }\n\n /**\n * Query the mirror DOM using a CSS selector.\n * Falls back to searching the ObjectStore if no materialized nodes match,\n * then materializes the matching objects.\n */\n querySelector(selector: string): HTMLElement | null {\n if (!this._rootElement) return null;\n\n // First try the already-materialized DOM\n const existing = this._rootElement.querySelector<HTMLElement>(selector);\n if (existing) return existing;\n\n // If not found, search by common patterns against the store\n const uuid = this._findUuidBySelector(selector);\n if (uuid) {\n return this.materialize(uuid);\n }\n\n return null;\n }\n\n /**\n * Query all matching elements in the mirror DOM.\n */\n querySelectorAll(selector: string): HTMLElement[] {\n if (!this._rootElement) return [];\n\n // Find all matching UUIDs from the store\n const uuids = this._findAllUuidsBySelector(selector);\n\n // Materialize each and collect elements\n const elements: HTMLElement[] = [];\n for (const uuid of uuids) {\n const el = this.materialize(uuid);\n if (el) elements.push(el);\n }\n\n return elements;\n }\n\n // -------------------------------------------------------------------------\n // Configuration\n // -------------------------------------------------------------------------\n\n /**\n * Set the maximum number of materialized DOM nodes.\n * If current count exceeds the new max, excess nodes are evicted immediately.\n */\n setMaxNodes(max: number): void {\n this._maxNodes = max;\n while (this._lruSize > this._maxNodes) {\n this._evictLRU();\n }\n }\n\n /** Current number of materialized DOM nodes. */\n getMaterializedCount(): number {\n return this._nodes.size;\n }\n\n /** Maximum allowed materialized DOM nodes. */\n getMaxNodes(): number {\n return this._maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /**\n * Remove all materialized DOM nodes and reset state.\n */\n dispose(): void {\n for (const [, node] of this._nodes) {\n node.element.remove();\n }\n this._nodes.clear();\n this._parentMap.clear();\n this._lruHead = null;\n this._lruTail = null;\n this._lruSize = 0;\n if (this._rootElement) {\n this._rootElement.innerHTML = '';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: DOM insertion\n // -------------------------------------------------------------------------\n\n /**\n * Insert a newly created element into the correct position in the DOM tree.\n */\n private _insertIntoDom(\n _uuid: string,\n parentUuid: string | null,\n element: HTMLElement,\n ): void {\n if (!this._rootElement) return;\n\n if (!parentUuid) {\n // Root-level object (scene) — append to mirror root\n this._rootElement.appendChild(element);\n return;\n }\n\n // Try to find materialized parent\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n parentNode.element.appendChild(element);\n } else {\n // Parent not materialized — append to mirror root as orphan\n // (will be reparented when parent is materialized)\n this._rootElement.appendChild(element);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Selector → UUID resolution\n // -------------------------------------------------------------------------\n\n /**\n * Parse common CSS selector patterns and resolve to a uuid from the store.\n * Supports:\n * [data-test-id=\"value\"]\n * [data-name=\"value\"]\n * [data-uuid=\"value\"]\n * three-mesh, three-light, etc. (by tag/type)\n */\n private _findUuidBySelector(selector: string): string | null {\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-uuid=\"value\"]\n const uuidMatch = selector.match(/\\[data-uuid=[\"']([^\"']+)[\"']\\]/);\n if (uuidMatch) {\n const meta = this._store.getByUuid(uuidMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n return metas.length > 0 ? metas[0].uuid : null;\n }\n\n return null;\n }\n\n /**\n * Find all UUIDs matching a selector pattern.\n */\n private _findAllUuidsBySelector(selector: string): string[] {\n const uuids: string[] = [];\n\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n if (meta) uuids.push(meta.uuid);\n return uuids;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n for (const m of metas) uuids.push(m.uuid);\n return uuids;\n }\n\n // Tag-based: three-mesh, three-light, etc.\n // Resolve by iterating all objects and filtering by type\n const tagMatch = selector.match(/^(three-(?:scene|group|mesh|light|camera|object))$/);\n if (tagMatch) {\n const targetTag = tagMatch[1];\n const allObjects = this._store.getFlatList();\n for (const obj of allObjects) {\n const meta = this._store.getMetadata(obj);\n if (meta && getTagForType(meta.type) === targetTag) {\n uuids.push(meta.uuid);\n }\n }\n return uuids;\n }\n\n return uuids;\n }\n\n // -------------------------------------------------------------------------\n // Private: LRU doubly-linked list operations\n // -------------------------------------------------------------------------\n\n /** Add a node to the front (most recently used). */\n private _lruPush(node: LRUNode): void {\n node.prev = null;\n node.next = this._lruHead;\n if (this._lruHead) {\n this._lruHead.prev = node;\n }\n this._lruHead = node;\n if (!this._lruTail) {\n this._lruTail = node;\n }\n this._lruSize++;\n }\n\n /** Remove a node from the list. */\n private _lruRemove(node: LRUNode): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this._lruHead = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this._lruTail = node.prev;\n }\n node.prev = null;\n node.next = null;\n this._lruSize--;\n }\n\n /** Move a node to the front (most recently used). */\n private _lruTouch(node: LRUNode): void {\n if (this._lruHead === node) return; // already at front\n this._lruRemove(node);\n this._lruPush(node);\n }\n\n /** Evict the least recently used node. */\n private _evictLRU(): void {\n if (!this._lruTail) return;\n const uuid = this._lruTail.uuid;\n this.dematerialize(uuid);\n }\n}\n","import { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { DomMirror } from '../mirror/DomMirror';\n\n// ---------------------------------------------------------------------------\n// Object3D.add / Object3D.remove monkey-patch\n//\n// Intercepts structural changes (add/remove children) on Object3D so the\n// ObjectStore and DomMirror are updated instantly (event-driven, O(1) per\n// change) without requiring per-frame traversal.\n//\n// Scoping: only fires for objects that belong to a tracked scene.\n// This avoids interfering with other Three.js scenes on the same page.\n// ---------------------------------------------------------------------------\n\n/** Tracks whether the patch has been applied. */\nlet _patched = false;\n\n/** Original methods saved for restoration. */\nlet _originalAdd: typeof Object3D.prototype.add | null = null;\nlet _originalRemove: typeof Object3D.prototype.remove | null = null;\n\n/** Active store/mirror pairs (supports multiple tracked scenes). */\nconst _activePairs: Array<{ store: ObjectStore; mirror: DomMirror }> = [];\n\n/**\n * Find the store/mirror pair that tracks the scene containing this object.\n * Walks up the parent chain to check each ancestor against tracked roots.\n */\nfunction findTrackingPair(\n obj: Object3D,\n): { store: ObjectStore; mirror: DomMirror } | null {\n for (const pair of _activePairs) {\n if (pair.store.isInTrackedScene(obj)) {\n return pair;\n }\n }\n return null;\n}\n\n/**\n * Register an object and all its descendants into the store and mirror.\n */\nfunction registerSubtree(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n): void {\n obj.traverse((child) => {\n if (!store.has(child)) {\n store.register(child);\n mirror.onObjectAdded(child);\n }\n });\n}\n\n/**\n * Patch Object3D.prototype.add and Object3D.prototype.remove to intercept\n * structural changes for tracked scenes.\n *\n * @param store - The ObjectStore managing scene metadata\n * @param mirror - The DomMirror managing the parallel DOM tree\n * @returns A cleanup function that unregisters this store/mirror pair\n */\nexport function patchObject3D(\n store: ObjectStore,\n mirror: DomMirror,\n): () => void {\n // Register this store/mirror pair\n _activePairs.push({ store, mirror });\n\n // Only patch the prototype once (supports multiple store/mirror pairs)\n if (!_patched) {\n _originalAdd = Object3D.prototype.add;\n _originalRemove = Object3D.prototype.remove;\n\n Object3D.prototype.add = function patchedAdd(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Call the original add first\n _originalAdd!.call(this, ...objects);\n\n // Check if this parent belongs to a tracked scene\n const pair = findTrackingPair(this);\n if (pair) {\n for (const obj of objects) {\n // Skip if it's the object adding itself (Three.js guard)\n if (obj === this) continue;\n registerSubtree(obj, pair.store, pair.mirror);\n }\n }\n\n return this;\n };\n\n Object3D.prototype.remove = function patchedRemove(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Check tracking BEFORE removal (parent is still set)\n const pair = findTrackingPair(this);\n\n // Notify store/mirror before actual removal\n if (pair) {\n for (const obj of objects) {\n if (obj === this) continue;\n\n // Notify mirror first (it needs to traverse for DOM cleanup)\n pair.mirror.onObjectRemoved(obj);\n\n // Then unregister from store (traverses descendants)\n obj.traverse((child) => {\n pair.store.unregister(child);\n });\n }\n }\n\n // Call the original remove\n _originalRemove!.call(this, ...objects);\n\n return this;\n };\n\n _patched = true;\n }\n\n // Return cleanup function\n return () => {\n const idx = _activePairs.findIndex(\n (p) => p.store === store && p.mirror === mirror,\n );\n if (idx !== -1) {\n _activePairs.splice(idx, 1);\n }\n\n // If no more active pairs, restore original methods\n if (_activePairs.length === 0 && _patched) {\n restoreObject3D();\n }\n };\n}\n\n/**\n * Restore the original Object3D.prototype.add and remove methods.\n * Called automatically when the last store/mirror pair is removed.\n * Can also be called manually for testing.\n */\nexport function restoreObject3D(): void {\n if (!_patched) return;\n\n if (_originalAdd) {\n Object3D.prototype.add = _originalAdd;\n _originalAdd = null;\n }\n if (_originalRemove) {\n Object3D.prototype.remove = _originalRemove;\n _originalRemove = null;\n }\n\n _patched = false;\n}\n\n/**\n * Check if Object3D prototype is currently patched.\n */\nexport function isPatched(): boolean {\n return _patched;\n}\n","import type { ObjectStore } from '../store/ObjectStore';\nimport type { ObjectMetadata, SceneSnapshot, SnapshotNode } from '../types';\n\n// ---------------------------------------------------------------------------\n// Snapshot: builds a structured JSON tree from the ObjectStore\n//\n// Reads exclusively from Tier 1 metadata — no Three.js object access,\n// no DOM reads. Cost scales linearly with object count but is cheap\n// since it's just Map lookups and object construction.\n// ---------------------------------------------------------------------------\n\n/**\n * Build a recursive SnapshotNode tree from a metadata entry.\n */\nfunction buildNodeTree(store: ObjectStore, meta: ObjectMetadata): SnapshotNode {\n const children: SnapshotNode[] = [];\n\n for (const childUuid of meta.childrenUuids) {\n const childMeta = store.getByUuid(childUuid);\n if (childMeta) {\n children.push(buildNodeTree(store, childMeta));\n }\n }\n\n return {\n uuid: meta.uuid,\n name: meta.name,\n type: meta.type,\n testId: meta.testId,\n visible: meta.visible,\n position: [...meta.position],\n rotation: [...meta.rotation],\n scale: [...meta.scale],\n children,\n };\n}\n\n/**\n * Find the root node (scene) in the store.\n * The root is the object whose parentUuid is null.\n */\nfunction findRoot(store: ObjectStore): ObjectMetadata | null {\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta && meta.parentUuid === null) {\n return meta;\n }\n }\n return null;\n}\n\n/**\n * Create a full scene snapshot from the ObjectStore.\n *\n * Returns a structured JSON tree built entirely from Tier 1 cached metadata.\n * No Three.js objects or DOM nodes are accessed.\n *\n * @example\n * ```ts\n * const snap = createSnapshot(store);\n * console.log(snap.objectCount); // 1234\n * console.log(snap.tree.children[0].name); // \"Furniture\"\n * ```\n */\nexport function createSnapshot(store: ObjectStore): SceneSnapshot {\n const rootMeta = findRoot(store);\n\n const tree: SnapshotNode = rootMeta\n ? buildNodeTree(store, rootMeta)\n : {\n uuid: '',\n name: 'empty',\n type: 'Scene',\n visible: true,\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n children: [],\n };\n\n return {\n timestamp: Date.now(),\n objectCount: store.getCount(),\n tree,\n };\n}\n\n/**\n * Create a flat snapshot — an array of all object metadata without tree structure.\n * Useful for searching/filtering without recursion.\n *\n * @example\n * ```ts\n * const flat = createFlatSnapshot(store);\n * const meshes = flat.objects.filter(m => m.type === 'Mesh');\n * ```\n */\nexport function createFlatSnapshot(store: ObjectStore): {\n timestamp: number;\n objectCount: number;\n objects: ObjectMetadata[];\n} {\n const objects: ObjectMetadata[] = [];\n const allObjects = store.getFlatList();\n\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta) {\n objects.push({ ...meta });\n }\n }\n\n return {\n timestamp: Date.now(),\n objectCount: objects.length,\n objects,\n };\n}\n","import {\n Object3D,\n Camera,\n Vector3,\n Box3,\n Frustum,\n Matrix4,\n} from 'three';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Screen-space coordinates in CSS pixels relative to the canvas. */\nexport interface ScreenPoint {\n /** X coordinate in CSS pixels, left = 0. */\n x: number;\n /** Y coordinate in CSS pixels, top = 0. */\n y: number;\n}\n\n/** Canvas dimensions in CSS pixels. */\nexport interface CanvasSize {\n width: number;\n height: number;\n}\n\n/** Result of a projection attempt. */\nexport interface ProjectionResult {\n /** The screen-space point (CSS pixels relative to the canvas element). */\n point: ScreenPoint;\n /** Which strategy produced the result. */\n strategy: 'center' | 'corner' | 'face-center' | 'fallback-origin';\n /** NDC coordinates (-1..+1 range) for the projected point. */\n ndc: { x: number; y: number };\n}\n\n// ---------------------------------------------------------------------------\n// Reusable temporaries (avoids GC pressure in hot paths)\n// ---------------------------------------------------------------------------\n\nconst _vec3 = /* @__PURE__ */ new Vector3();\nconst _vec3B = /* @__PURE__ */ new Vector3();\nconst _box3 = /* @__PURE__ */ new Box3();\nconst _frustum = /* @__PURE__ */ new Frustum();\nconst _projMatrix = /* @__PURE__ */ new Matrix4();\n\n// ---------------------------------------------------------------------------\n// NDC → screen helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a Vector3 in NDC (after `vector.project(camera)`) to CSS-pixel\n * coordinates relative to the canvas.\n *\n * NDC convention: x ∈ [-1, +1], y ∈ [-1, +1], z ∈ [-1, +1]\n * Screen convention: x ∈ [0, width], y ∈ [0, height] (top-left origin)\n */\nfunction ndcToScreen(ndc: Vector3, size: CanvasSize): ScreenPoint {\n return {\n x: ((ndc.x + 1) / 2) * size.width,\n y: ((-ndc.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Returns true if the NDC coordinate is within the visible viewport.\n * Z check: z ∈ (-1, 1) means in front of camera and within far plane.\n */\nfunction isNdcOnScreen(ndc: Vector3): boolean {\n return (\n ndc.x >= -1 && ndc.x <= 1 &&\n ndc.y >= -1 && ndc.y <= 1 &&\n ndc.z >= -1 && ndc.z <= 1\n );\n}\n\n/**\n * Returns true if the NDC coordinate is in front of the camera.\n * After `vector.project(camera)`, z < 1 means in front of the camera.\n * A point behind the camera gets z > 1.\n */\nfunction isInFrontOfCamera(ndc: Vector3): boolean {\n return ndc.z >= -1 && ndc.z <= 1;\n}\n\n// ---------------------------------------------------------------------------\n// Candidate point generators\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the world-space bounding box center of an Object3D.\n * Falls back to the object's world position if the bbox is empty.\n */\nfunction getWorldCenter(obj: Object3D): Vector3 {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _vec3;\n }\n _box3.getCenter(_vec3);\n return _vec3;\n}\n\n/**\n * Get the 8 corners of the world-space bounding box.\n * Returns an empty array if the bbox is degenerate.\n */\nfunction getBboxCorners(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const { min, max } = _box3;\n return [\n new Vector3(min.x, min.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(max.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(max.x, max.y, max.z),\n ];\n}\n\n/**\n * Get the 6 face centers of the world-space bounding box.\n * These are better click targets than corners for many geometries.\n */\nfunction getBboxFaceCenters(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const center = _box3.getCenter(new Vector3());\n const { min, max } = _box3;\n\n return [\n new Vector3(min.x, center.y, center.z), // -X face\n new Vector3(max.x, center.y, center.z), // +X face\n new Vector3(center.x, min.y, center.z), // -Y face\n new Vector3(center.x, max.y, center.z), // +Y face\n new Vector3(center.x, center.y, min.z), // -Z face\n new Vector3(center.x, center.y, max.z), // +Z face\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Core projection\n// ---------------------------------------------------------------------------\n\n/**\n * Try to project a single world-space point to screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction tryProjectPoint(\n worldPoint: Vector3,\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number }; ndcZ: number; onScreen: boolean } | null {\n // Clone to avoid mutating the input\n _vec3B.copy(worldPoint).project(camera);\n\n if (!isInFrontOfCamera(_vec3B)) return null;\n\n const screen = ndcToScreen(_vec3B, size);\n return {\n screen,\n ndc: { x: _vec3B.x, y: _vec3B.y },\n ndcZ: _vec3B.z,\n onScreen: isNdcOnScreen(_vec3B),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Project a 3D object to screen coordinates using a multi-strategy approach:\n *\n * 1. **Center**: Try the bounding box center (most natural click target).\n * 2. **Face centers**: Try the 6 face centers (better for large/flat objects).\n * 3. **Corners**: Try the 8 bbox corners (catches partially visible objects).\n * 4. **Fallback origin**: Try the object's world position (lights, empty groups).\n *\n * For each strategy, we prefer points that are both on-screen AND closest to\n * the viewport center (most reliable for event dispatch).\n *\n * Returns `null` if no part of the object is visible on screen.\n */\nexport function projectToScreen(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ProjectionResult | null {\n // Ensure world matrices are up to date\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n // Strategy 1: Bounding box center\n const center = getWorldCenter(obj);\n const centerResult = tryProjectPoint(center, camera, size);\n\n if (centerResult && centerResult.onScreen) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Strategy 2: Face centers — better fallback for large objects\n const faceCenters = getBboxFaceCenters(obj);\n const faceResult = findBestOnScreenPoint(faceCenters, camera, size);\n if (faceResult) {\n return {\n point: faceResult.screen,\n strategy: 'face-center',\n ndc: faceResult.ndc,\n };\n }\n\n // Strategy 3: Bbox corners — catches partially visible objects\n const corners = getBboxCorners(obj);\n const cornerResult = findBestOnScreenPoint(corners, camera, size);\n if (cornerResult) {\n return {\n point: cornerResult.screen,\n strategy: 'corner',\n ndc: cornerResult.ndc,\n };\n }\n\n // Strategy 4: Fallback to world position (lights, helpers, empty groups)\n obj.getWorldPosition(_vec3);\n const originResult = tryProjectPoint(_vec3.clone(), camera, size);\n if (originResult && originResult.onScreen) {\n return {\n point: originResult.screen,\n strategy: 'fallback-origin',\n ndc: originResult.ndc,\n };\n }\n\n // If center projected but was off-screen, still return it as a best-effort\n // (useful for drag targets that are partially off-screen)\n if (centerResult) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Object is entirely behind the camera or degenerate\n return null;\n}\n\n/**\n * From a list of candidate world-space points, find the one that projects\n * on-screen and is closest to the viewport center (most reliable dispatch).\n */\nfunction findBestOnScreenPoint(\n candidates: Vector3[],\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number } } | null {\n let bestResult: { screen: ScreenPoint; ndc: { x: number; y: number } } | null = null;\n let bestDistSq = Infinity;\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n for (const point of candidates) {\n const result = tryProjectPoint(point, camera, size);\n if (!result || !result.onScreen) continue;\n\n // Distance from viewport center — prefer more central points\n const dx = result.screen.x - halfW;\n const dy = result.screen.y - halfH;\n const distSq = dx * dx + dy * dy;\n\n if (distSq < bestDistSq) {\n bestDistSq = distSq;\n bestResult = { screen: result.screen, ndc: result.ndc };\n }\n }\n\n return bestResult;\n}\n\n// ---------------------------------------------------------------------------\n// Frustum visibility check\n// ---------------------------------------------------------------------------\n\n/**\n * Check whether any part of an Object3D is within the camera frustum.\n * Uses the bounding box intersection test (fast, conservative).\n */\nexport function isInFrustum(obj: Object3D, camera: Camera): boolean {\n camera.updateWorldMatrix(true, false);\n obj.updateWorldMatrix(true, false);\n\n _projMatrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n _frustum.setFromProjectionMatrix(_projMatrix);\n\n _box3.setFromObject(obj);\n\n // Empty bbox (lights, empties) — fall back to position check\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _frustum.containsPoint(_vec3);\n }\n\n return _frustum.intersectsBox(_box3);\n}\n\n// ---------------------------------------------------------------------------\n// Screen-to-world projection (for drag deltas)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a screen-space delta (CSS pixels) to a world-space displacement\n * vector on the plane perpendicular to the camera at the given depth.\n *\n * Used by drag3D to convert pixel movements to 3D movements that feel\n * natural regardless of camera position/zoom.\n */\nexport function screenDeltaToWorld(\n dx: number,\n dy: number,\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): Vector3 {\n // Get the object's depth in NDC\n obj.getWorldPosition(_vec3);\n _vec3.project(camera);\n const depth = _vec3.z;\n\n // Unproject two points at the same depth to get world-space scale\n const start = new Vector3(0, 0, depth).unproject(camera);\n const right = new Vector3(2 / size.width, 0, depth).unproject(camera);\n const up = new Vector3(0, -2 / size.height, depth).unproject(camera);\n\n // World-space pixels per CSS pixel\n const rightDir = right.sub(start);\n const upDir = up.sub(start);\n\n return new Vector3()\n .addScaledVector(rightDir, dx)\n .addScaledVector(upDir, dy);\n}\n\n// ---------------------------------------------------------------------------\n// Multi-point projection (for assertions / testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Project multiple sample points of an object to screen space.\n * Returns all on-screen points, useful for assertions like\n * \"object covers at least 50px² of screen area\".\n */\nexport function projectAllSamplePoints(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint[] {\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n const points: ScreenPoint[] = [];\n\n // Collect all candidate world-space points\n const candidates: Vector3[] = [];\n\n // Center\n candidates.push(getWorldCenter(obj).clone());\n\n // Face centers\n candidates.push(...getBboxFaceCenters(obj));\n\n // Corners\n candidates.push(...getBboxCorners(obj));\n\n // Project each\n for (const wsPt of candidates) {\n const result = tryProjectPoint(wsPt, camera, size);\n if (result && result.onScreen) {\n points.push(result.screen);\n }\n }\n\n return points;\n}\n","import type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// Synthetic PointerEvent dispatch\n//\n// Dispatches DOM events on the canvas element at the projected screen\n// coordinates, matching the exact sequence that a real browser interaction\n// would produce. R3F's event system listens on the canvas, so these\n// synthetic events flow through the full pointer → raycaster pipeline.\n// ---------------------------------------------------------------------------\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextPointerId = 1000;\n\n/** Get a fresh pointerId for each interaction sequence. */\nfunction allocPointerId(): number {\n return _nextPointerId++;\n}\n\n/**\n * Compute clientX/clientY from a canvas-relative ScreenPoint.\n * Events need clientX/clientY (relative to viewport), not the canvas.\n */\nfunction toClientCoords(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): { clientX: number; clientY: number } {\n const rect = canvas.getBoundingClientRect();\n return {\n clientX: rect.left + point.x,\n clientY: rect.top + point.y,\n };\n}\n\n/**\n * Build a PointerEvent init object with correct coordinates and metadata.\n */\nfunction makePointerInit(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n pointerId: number,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const { clientX, clientY } = toClientCoords(canvas, point);\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType: 'mouse',\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: 0.5,\n ...overrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click\n *\n * This matches what R3F's event system expects. The canvas is the event\n * target because R3F attaches its listeners to the canvas element.\n */\nexport function dispatchClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 0,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Hover sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a hover sequence on the canvas at the given screen point.\n *\n * Sequence: pointermove → pointerover → pointerenter\n *\n * R3F translates pointermove into onPointerMove/onPointerOver/onPointerEnter\n * via its internal raycaster. We dispatch the raw DOM events and let R3F\n * do the rest.\n */\nexport function dispatchHover(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n const pointerId = allocPointerId();\n const init = makePointerInit(canvas, point, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerover', init));\n canvas.dispatchEvent(new PointerEvent('pointerenter', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Drag sequence\n// ---------------------------------------------------------------------------\n\n/** Options for a drag interaction. */\nexport interface DragOptions {\n /** Number of intermediate pointermove steps. Default: 10 */\n steps?: number;\n /** Delay between steps in ms (for requestAnimationFrame pacing). Default: 0 */\n stepDelayMs?: number;\n}\n\n/**\n * Dispatch a full drag sequence from `start` to `end` on the canvas.\n *\n * Sequence: pointerdown → N × pointermove (interpolated) → pointerup\n *\n * Returns a Promise that resolves when the drag is complete.\n * The async nature allows optional frame-pacing via stepDelayMs.\n */\nexport async function dispatchDrag(\n canvas: HTMLCanvasElement,\n start: ScreenPoint,\n end: ScreenPoint,\n options: DragOptions = {},\n): Promise<void> {\n const { steps = 10, stepDelayMs = 0 } = options;\n const pointerId = allocPointerId();\n\n // Pointer down at start\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, start, pointerId)),\n );\n });\n\n // Interpolate intermediate moves\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const intermediate: ScreenPoint = {\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n };\n\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makePointerInit(canvas, intermediate, pointerId),\n ),\n );\n }\n\n // Pointer up at end\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, end, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Double-click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full double-click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * R3F translates the `dblclick` DOM event into `onDoubleClick` on the hit object.\n */\nexport function dispatchDoubleClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n const coords = toClientCoords(canvas, point);\n\n // First click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 1,\n }),\n );\n\n // Second click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n\n // dblclick\n canvas.dispatchEvent(\n new MouseEvent('dblclick', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Context menu (right-click) sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a right-click / context menu sequence on the canvas.\n *\n * Sequence: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * R3F translates the `contextmenu` DOM event into `onContextMenu`.\n */\nexport function dispatchContextMenu(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerdown',\n makePointerInit(canvas, point, pointerId, { button: 2, buttons: 2 }),\n ),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, {\n button: 2,\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('contextmenu', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Wheel event\n// ---------------------------------------------------------------------------\n\n/** Options for a wheel dispatch. */\nexport interface WheelOptions {\n /** Vertical scroll delta (positive = scroll down). Default: 100 */\n deltaY?: number;\n /** Horizontal scroll delta. Default: 0 */\n deltaX?: number;\n /** DOM_DELTA_PIXEL (0), DOM_DELTA_LINE (1), or DOM_DELTA_PAGE (2). Default: 0 */\n deltaMode?: number;\n}\n\n/**\n * Dispatch a wheel event on the canvas at the given screen point.\n *\n * R3F translates the `wheel` DOM event into `onWheel` on the hit object.\n */\nexport function dispatchWheel(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n options: WheelOptions = {},\n): void {\n const { deltaY = 100, deltaX = 0, deltaMode = 0 } = options;\n const coords = toClientCoords(canvas, point);\n\n canvas.dispatchEvent(\n new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n ...coords,\n deltaX,\n deltaY,\n deltaZ: 0,\n deltaMode,\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pointer miss (click on empty space)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a click on the canvas at a point where no meshes are present.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler when\n * a click lands on empty space. This dispatches a click at a configurable\n * point (default: top-left corner, which is very unlikely to hit a mesh).\n *\n * @param canvas The canvas element\n * @param point Optional specific screen point. Default: { x: 1, y: 1 }\n */\nexport function dispatchPointerMiss(\n canvas: HTMLCanvasElement,\n point: ScreenPoint = { x: 1, y: 1 },\n): void {\n dispatchClick(canvas, point);\n}\n\n// ---------------------------------------------------------------------------\n// Unhover (pointer leave)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch an unhover sequence — moves the pointer off-canvas.\n * Useful for cleaning up hover state between interactions.\n */\nexport function dispatchUnhover(canvas: HTMLCanvasElement): void {\n const pointerId = allocPointerId();\n const offScreen: ScreenPoint = { x: -9999, y: -9999 };\n const init = makePointerInit(canvas, offScreen, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerout', init));\n canvas.dispatchEvent(new PointerEvent('pointerleave', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Guard against `releasePointerCapture` throwing when no pointer capture\n * is active. Libraries like @react-three/drei register global pointerup\n * handlers that call `releasePointerCapture`, which throws a `NotFoundError`\n * when the pointer was never captured (as with our synthetic events).\n *\n * This wrapper patches `Element.prototype.releasePointerCapture` for the\n * duration of `fn()` so that the `NotFoundError` is silently swallowed.\n */\nfunction withSafePointerCapture<T>(fn: () => T): T {\n const original = Element.prototype.releasePointerCapture;\n Element.prototype.releasePointerCapture = function safeRelease(\n this: Element,\n pointerId: number,\n ) {\n try {\n original.call(this, pointerId);\n } catch {\n // Swallow NotFoundError — no active pointer with the given id\n }\n };\n try {\n return fn();\n } finally {\n Element.prototype.releasePointerCapture = original;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Scene,\n} from 'three';\nimport type { ScreenPoint, CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Raycast hit verification\n//\n// After dispatching a synthetic event at projected screen coordinates,\n// cast a ray to verify the intended object is actually the first hit.\n// This catches occlusion and provides clear error messages.\n// ---------------------------------------------------------------------------\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _ndc = /* @__PURE__ */ new Vector2();\n\n/** Result of a raycast verification. */\nexport interface RaycastResult {\n /** Whether the intended object was hit. */\n hit: boolean;\n /** If not hit, the object that was hit instead (occluder). */\n occluder?: Object3D;\n /** Name or testId of the occluder, for error messages. */\n occluderLabel?: string;\n}\n\n/**\n * Convert a screen-space point to NDC coordinates for raycasting.\n */\nfunction screenToNdc(point: ScreenPoint, size: CanvasSize): Vector2 {\n _ndc.set(\n (point.x / size.width) * 2 - 1,\n -(point.y / size.height) * 2 + 1,\n );\n return _ndc;\n}\n\n/**\n * Get a human-readable label for an Object3D (for error messages).\n */\nfunction getObjectLabel(obj: Object3D): string {\n const testId = obj.userData?.testId;\n if (testId) return `testId=\"${testId}\"`;\n if (obj.name) return `name=\"${obj.name}\"`;\n return `uuid=\"${obj.uuid.slice(0, 8)}…\"`;\n}\n\n/**\n * Walk up the parent chain to check if `candidate` is the target or\n * a descendant of the target. This is needed because raycaster returns\n * the specific sub-mesh (e.g. a merged geometry child) rather than\n * the logical parent group.\n */\nfunction isTargetOrDescendant(candidate: Object3D, target: Object3D): boolean {\n let current: Object3D | null = candidate;\n while (current) {\n if (current === target) return true;\n current = current.parent;\n }\n return false;\n}\n\n/**\n * Find the scene root by walking up the parent chain.\n */\nfunction findScene(obj: Object3D): Scene | null {\n let current: Object3D | null = obj;\n while (current) {\n if ((current as Scene).isScene) return current as Scene;\n current = current.parent;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Verify that a raycast from the given screen point hits the intended object.\n *\n * Returns a RaycastResult indicating success or failure with details about\n * what was hit instead (for useful error messages).\n *\n * @param point Screen-space coordinates (CSS pixels relative to canvas)\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHit(\n point: ScreenPoint,\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n const scene = findScene(target);\n if (!scene) {\n return { hit: false, occluderLabel: 'object not in scene' };\n }\n\n const ndc = screenToNdc(point, size);\n _raycaster.setFromCamera(ndc, camera);\n\n // Raycast against the entire scene\n const intersections = _raycaster.intersectObjects(scene.children, true);\n\n if (intersections.length === 0) {\n // No hits at all — object might be transparent, or a light/helper\n // For non-mesh objects (lights, cameras), this is expected\n return { hit: true };\n }\n\n // Check if the first hit is our target (or a child of our target)\n const firstHit = intersections[0].object;\n if (isTargetOrDescendant(firstHit, target)) {\n return { hit: true };\n }\n\n // Check if our target appears anywhere in the intersections\n // (it might be behind something but still hit)\n const targetHit = intersections.find((i) =>\n isTargetOrDescendant(i.object, target),\n );\n\n if (targetHit) {\n // Target was hit but is behind another object\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n }\n\n // Target was not hit at all at this point\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n}\n\n/**\n * Verify a hit, trying multiple sample points if the first fails.\n * This is more robust than single-point verification for objects\n * that are partially occluded.\n *\n * @param points Array of screen-space points to try\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHitMultiPoint(\n points: ScreenPoint[],\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n let lastResult: RaycastResult = { hit: false };\n\n for (const point of points) {\n const result = verifyRaycastHit(point, target, camera, size);\n if (result.hit) return result;\n lastResult = result;\n }\n\n return lastResult;\n}\n","import type { Object3D, Camera, WebGLRenderer } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Shared resolution helpers for interaction modules\n// ---------------------------------------------------------------------------\n\n/** Cached references to the current R3F state (set by ThreeDom). */\nlet _store: ObjectStore | null = null;\nlet _camera: Camera | null = null;\nlet _gl: WebGLRenderer | null = null;\nlet _size: CanvasSize | null = null;\n\n/**\n * Set the current R3F state references. Called by ThreeDom during setup\n * and on every frame to keep camera/size current.\n */\nexport function setInteractionState(\n store: ObjectStore,\n camera: Camera,\n gl: WebGLRenderer,\n size: CanvasSize,\n): void {\n _store = store;\n _camera = camera;\n _gl = gl;\n _size = size;\n}\n\n/** Clear all interaction state (called on cleanup). */\nexport function clearInteractionState(): void {\n _store = null;\n _camera = null;\n _gl = null;\n _size = null;\n}\n\n/** Get the current store, or throw if not initialized. */\nexport function getStore(): ObjectStore {\n if (!_store) {\n throw new Error(\n '[react-three-dom] Interaction state not initialized. Is <ThreeDom> mounted?',\n );\n }\n return _store;\n}\n\n/** Get the current camera, or throw. */\nexport function getCamera(): Camera {\n if (!_camera) {\n throw new Error(\n '[react-three-dom] Camera not available. Is <ThreeDom> mounted?',\n );\n }\n return _camera;\n}\n\n/** Get the current WebGL renderer, or throw. */\nexport function getRenderer(): WebGLRenderer {\n if (!_gl) {\n throw new Error(\n '[react-three-dom] Renderer not available. Is <ThreeDom> mounted?',\n );\n }\n return _gl;\n}\n\n/** Get the current canvas size, or throw. */\nexport function getCanvasSize(): CanvasSize {\n if (!_size) {\n throw new Error(\n '[react-three-dom] Canvas size not available. Is <ThreeDom> mounted?',\n );\n }\n return _size;\n}\n\n/**\n * Resolve a testId or uuid to a live Object3D reference.\n * Throws a descriptive error if the object is not found.\n */\nexport function resolveObject(idOrUuid: string): Object3D {\n const store = getStore();\n const obj = store.getObject3D(idOrUuid);\n if (!obj) {\n throw new Error(\n `[react-three-dom] Object \"${idOrUuid}\" not found. ` +\n `Check that the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`,\n );\n }\n return obj;\n}\n","import { projectToScreen } from './projection';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\n\n// ---------------------------------------------------------------------------\n// click3D — deterministic click on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointerdown → pointerup → click on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for click3D. */\nexport interface Click3DOptions {\n /**\n * Whether to verify the click hit via raycast.\n * Set to false for non-mesh objects (lights, cameras, groups).\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a click3D operation. */\nexport interface Click3DResult {\n /** Whether the click was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the click was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically click a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic click event\n * on the canvas at the projected coordinates, and optionally verifies\n * the click hit the intended object via raycasting.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Click options\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // From the global API\n * window.__R3F_DOM__.click('chair-primary');\n *\n * // With verification disabled (for lights, cameras)\n * click3D('sun-light', { verify: false });\n * ```\n */\nexport function click3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] click3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch click on canvas\n const canvas = gl.domElement;\n dispatchClick(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] click3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead. ` +\n `The object may be occluded.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// doubleClick3D — deterministic double-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically double-click a 3D object by its testId or uuid.\n *\n * Dispatches the full double-click sequence:\n * pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * Triggers R3F's `onDoubleClick` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function doubleClick3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchDoubleClick(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// contextMenu3D — deterministic right-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically right-click a 3D object by its testId or uuid.\n *\n * Dispatches: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * Triggers R3F's `onContextMenu` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function contextMenu3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchContextMenu(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","import { projectToScreen } from './projection';\nimport { dispatchHover, dispatchUnhover } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\n\n// ---------------------------------------------------------------------------\n// hover3D — deterministic hover on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointermove → pointerover → pointerenter on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for hover3D. */\nexport interface Hover3DOptions {\n /**\n * Whether to verify the hover hit via raycast.\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a hover3D operation. */\nexport interface Hover3DResult {\n /** Whether the hover was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the hover was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically hover over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic hover event\n * sequence on the canvas, and optionally verifies the hit.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Hover options\n * @returns Hover result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * window.__R3F_DOM__.hover('chair-primary');\n * ```\n */\nexport function hover3D(\n idOrUuid: string,\n options: Hover3DOptions = {},\n): Hover3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] hover3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch hover on canvas\n const canvas = gl.domElement;\n dispatchHover(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] hover3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Clear hover state by moving the pointer off-canvas.\n * Call between hover/click interactions to reset R3F's internal pointer state.\n */\nexport function unhover3D(): void {\n const gl = getRenderer();\n dispatchUnhover(gl.domElement);\n}\n","import { Vector3 } from 'three';\nimport { projectToScreen, screenDeltaToWorld } from './projection';\nimport { dispatchDrag, type DragOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\n\n// ---------------------------------------------------------------------------\n// drag3D — deterministic drag on a 3D object\n//\n// Supports two modes:\n// 1. World-space delta: drag by { x, y, z } in world units\n// 2. Screen-space delta: drag by { dx, dy } in CSS pixels\n//\n// Both modes dispatch a pointerdown → N × pointermove → pointerup sequence.\n// ---------------------------------------------------------------------------\n\n/** World-space drag delta. */\nexport interface WorldDelta {\n x: number;\n y: number;\n z: number;\n}\n\n/** Screen-space drag delta (CSS pixels). */\nexport interface ScreenDelta {\n dx: number;\n dy: number;\n}\n\n/** Options for drag3D. */\nexport interface Drag3DOptions extends DragOptions {\n /**\n * If 'world', the delta is interpreted as world units.\n * If 'screen', the delta is interpreted as CSS pixels.\n * Default: 'world'\n */\n mode?: 'world' | 'screen';\n}\n\n/** Result of a drag3D operation. */\nexport interface Drag3DResult {\n /** Whether the drag was dispatched. */\n dispatched: true;\n /** Start screen point. */\n startPoint: { x: number; y: number };\n /** End screen point. */\n endPoint: { x: number; y: number };\n /** Which projection strategy was used for the start point. */\n strategy: string;\n}\n\n/**\n * Programmatically drag a 3D object by its testId or uuid.\n *\n * Projects the object to screen space for the start point, then computes\n * the end point based on the delta (world-space or screen-space), and\n * dispatches a full drag sequence on the canvas.\n *\n * @param idOrUuid The object's testId or uuid\n * @param delta Drag delta (world-space { x, y, z } or screen-space { dx, dy })\n * @param options Drag options (steps, delay, mode)\n * @returns Drag result with start/end points\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // World-space drag: move 2 units on X axis\n * window.__R3F_DOM__.drag('chair-primary', { x: 2, y: 0, z: 0 });\n *\n * // Screen-space drag: move 100px right, 50px down\n * drag3D('chair-primary', { dx: 100, dy: 50 }, { mode: 'screen' });\n * ```\n */\nexport async function drag3D(\n idOrUuid: string,\n delta: WorldDelta | ScreenDelta,\n options: Drag3DOptions = {},\n): Promise<Drag3DResult> {\n const { mode = 'world', ...dragOptions } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n // 2. Project start point\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] drag3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n const startPoint = projection.point;\n let endPoint: { x: number; y: number };\n\n if (mode === 'screen' && 'dx' in delta) {\n // Screen-space mode: directly add pixel delta\n const screenDelta = delta as ScreenDelta;\n endPoint = {\n x: startPoint.x + screenDelta.dx,\n y: startPoint.y + screenDelta.dy,\n };\n } else {\n // World-space mode: convert world delta to screen delta\n const worldDelta = delta as WorldDelta;\n\n // Get the object's current world position\n const worldPos = new Vector3();\n obj.getWorldPosition(worldPos);\n\n // Compute the target world position\n const targetPos = worldPos.clone().add(new Vector3(worldDelta.x, worldDelta.y, worldDelta.z));\n\n // Project target position to screen space\n targetPos.project(camera);\n endPoint = {\n x: ((targetPos.x + 1) / 2) * size.width,\n y: ((-targetPos.y + 1) / 2) * size.height,\n };\n }\n\n // 3. Dispatch drag sequence\n const canvas = gl.domElement;\n await dispatchDrag(canvas, startPoint, endPoint, dragOptions);\n\n return {\n dispatched: true,\n startPoint,\n endPoint,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Compute what world-space displacement a screen-space drag would produce.\n * Useful for previewing drag effects before committing.\n */\nexport function previewDragWorldDelta(\n idOrUuid: string,\n screenDx: number,\n screenDy: number,\n): Vector3 {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const size = getCanvasSize();\n return screenDeltaToWorld(screenDx, screenDy, obj, camera, size);\n}\n","import { projectToScreen } from './projection';\nimport { dispatchWheel, type WheelOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\n\n// ---------------------------------------------------------------------------\n// wheel3D — deterministic wheel/scroll on a 3D object\n//\n// Projects the object to screen space and dispatches a WheelEvent on the\n// canvas at the projected coordinates. Triggers R3F's onWheel handler.\n// ---------------------------------------------------------------------------\n\n/** Options for wheel3D. */\nexport interface Wheel3DOptions extends WheelOptions {}\n\n/** Result of a wheel3D operation. */\nexport interface Wheel3DResult {\n /** Whether the wheel event was dispatched. */\n dispatched: true;\n /** The screen point where the wheel was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically scroll the wheel over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space and dispatches a synthetic WheelEvent\n * on the canvas. Triggers R3F's `onWheel` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Wheel options (deltaY, deltaX, deltaMode)\n * @returns Wheel result with screen point info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // Scroll down 200 units over the chair\n * wheel3D('chair-primary', { deltaY: 200 });\n *\n * // Scroll up\n * wheel3D('chair-primary', { deltaY: -100 });\n * ```\n */\nexport function wheel3D(\n idOrUuid: string,\n options: Wheel3DOptions = {},\n): Wheel3DResult {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] wheel3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchWheel(canvas, projection.point, options);\n\n return {\n dispatched: true,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","import { dispatchPointerMiss } from './dispatch';\nimport { getRenderer } from './resolve';\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// pointerMiss3D — click on empty canvas space\n//\n// Dispatches a click at a point unlikely to hit any mesh, causing R3F\n// to fire onPointerMissed on all objects that have that handler.\n// Commonly used for deselection in editor-type applications.\n// ---------------------------------------------------------------------------\n\n/** Options for pointerMiss3D. */\nexport interface PointerMiss3DOptions {\n /**\n * Specific screen point to click. If not provided, clicks at (1, 1)\n * which is the top-left corner — very unlikely to hit any mesh.\n */\n point?: ScreenPoint;\n}\n\n/**\n * Dispatch a click on empty canvas space, triggering `onPointerMissed`.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler\n * when a click doesn't hit any mesh. This is commonly used for\n * deselection workflows.\n *\n * @param options Optional point to click at\n *\n * @example\n * ```typescript\n * // Click empty space to deselect\n * pointerMiss3D();\n *\n * // Click at a specific empty spot\n * pointerMiss3D({ point: { x: 10, y: 10 } });\n * ```\n */\nexport function pointerMiss3D(options: PointerMiss3DOptions = {}): void {\n const gl = getRenderer();\n const canvas = gl.domElement;\n dispatchPointerMiss(canvas, options.point);\n}\n","import type { Object3D } from 'three';\n\n// ---------------------------------------------------------------------------\n// SelectionManager\n//\n// Manages the currently selected/highlighted object(s) in the scene.\n// Supports single selection (click to select) and multi-selection.\n// Notifies listeners when the selection changes so the Highlighter\n// can update visuals and the Inspector can update its UI.\n// ---------------------------------------------------------------------------\n\nexport type SelectionListener = (selected: Object3D[]) => void;\n\nexport class SelectionManager {\n /** Currently selected objects (ordered by selection time). */\n private _selected: Object3D[] = [];\n\n /** Listeners notified on selection change. */\n private _listeners: SelectionListener[] = [];\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n /** Select a single object (clears previous selection). */\n select(obj: Object3D): void {\n if (this._selected.length === 1 && this._selected[0] === obj) return;\n this._selected = [obj];\n this._notify();\n }\n\n /** Add an object to the current selection (multi-select). */\n addToSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) return;\n this._selected.push(obj);\n this._notify();\n }\n\n /** Remove an object from the selection. */\n removeFromSelection(obj: Object3D): void {\n const idx = this._selected.indexOf(obj);\n if (idx === -1) return;\n this._selected.splice(idx, 1);\n this._notify();\n }\n\n /** Toggle an object in/out of the selection. */\n toggleSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) {\n this.removeFromSelection(obj);\n } else {\n this.addToSelection(obj);\n }\n }\n\n /** Clear all selections. */\n clearSelection(): void {\n if (this._selected.length === 0) return;\n this._selected = [];\n this._notify();\n }\n\n /** Get the currently selected objects. */\n getSelected(): readonly Object3D[] {\n return this._selected;\n }\n\n /** Get the primary (first) selected object, or null. */\n getPrimary(): Object3D | null {\n return this._selected[0] ?? null;\n }\n\n /** Check if an object is selected. */\n isSelected(obj: Object3D): boolean {\n return this._selected.includes(obj);\n }\n\n /** Number of selected objects. */\n get count(): number {\n return this._selected.length;\n }\n\n // -----------------------------------------------------------------------\n // Event system\n // -----------------------------------------------------------------------\n\n /** Subscribe to selection changes. Returns unsubscribe function. */\n subscribe(listener: SelectionListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _notify(): void {\n const snapshot = [...this._selected];\n for (const listener of this._listeners) {\n listener(snapshot);\n }\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this._selected = [];\n this._listeners = [];\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useThree, useFrame } from '@react-three/fiber';\nimport { Box3, Vector3 } from 'three';\nimport type { Object3D, Camera } from 'three';\nimport { ObjectStore } from '../store/ObjectStore';\nimport { DomMirror } from '../mirror/DomMirror';\nimport { ensureCustomElements } from '../mirror/CustomElements';\nimport { patchObject3D } from './patchObject3D';\nimport { createSnapshot } from '../snapshot/snapshot';\nimport { click3D, doubleClick3D, contextMenu3D } from '../interactions/click';\nimport { hover3D } from '../interactions/hover';\nimport { drag3D } from '../interactions/drag';\nimport { wheel3D } from '../interactions/wheel';\nimport { pointerMiss3D } from '../interactions/pointerMiss';\nimport { setInteractionState, clearInteractionState } from '../interactions/resolve';\nimport { SelectionManager } from '../highlight/SelectionManager';\nimport { Highlighter } from '../highlight/Highlighter';\nimport { version } from '../version';\nimport type { R3FDOM } from '../types';\n\n// ---------------------------------------------------------------------------\n// ThreeDom Props\n// ---------------------------------------------------------------------------\n\nexport interface ThreeDomProps {\n /** CSS selector or HTMLElement for the mirror DOM root. Default: \"#three-dom-root\" */\n root?: string | HTMLElement;\n /** Objects to process per amortized batch per frame. Default: 500 */\n batchSize?: number;\n /** Max time budget (ms) for sync work per frame. Default: 0.5 */\n timeBudgetMs?: number;\n /** Max materialized DOM nodes (LRU eviction). Default: 2000 */\n maxDomNodes?: number;\n /** Initial DOM tree materialization depth. Default: 3 */\n initialDepth?: number;\n /** Disable all sync. Default: true */\n enabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Singleton instances\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\nlet _mirror: DomMirror | null = null;\nlet _selectionManager: SelectionManager | null = null;\nlet _highlighter: Highlighter | null = null;\n\nexport function getStore(): ObjectStore | null { return _store; }\nexport function getMirror(): DomMirror | null { return _mirror; }\nexport function getSelectionManager(): SelectionManager | null { return _selectionManager; }\nexport function getHighlighter(): Highlighter | null { return _highlighter; }\n\n// ---------------------------------------------------------------------------\n// 3D → Screen projection for DOM element positioning\n// ---------------------------------------------------------------------------\n\nconst _box = /* @__PURE__ */ new Box3();\nconst _v = /* @__PURE__ */ new Vector3();\nconst _corners: Vector3[] = Array.from({ length: 8 }, () => new Vector3());\n\n/**\n * Project a 3D object's bounding box to screen-space pixel coordinates\n * relative to the canvas element.\n */\nfunction projectToScreenRect(\n obj: Object3D,\n camera: Camera,\n canvasRect: { width: number; height: number },\n): { left: number; top: number; width: number; height: number } | null {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return null;\n\n const { min, max } = _box;\n _corners[0].set(min.x, min.y, min.z);\n _corners[1].set(min.x, min.y, max.z);\n _corners[2].set(min.x, max.y, min.z);\n _corners[3].set(min.x, max.y, max.z);\n _corners[4].set(max.x, min.y, min.z);\n _corners[5].set(max.x, min.y, max.z);\n _corners[6].set(max.x, max.y, min.z);\n _corners[7].set(max.x, max.y, max.z);\n\n let sxMin = Infinity, syMin = Infinity;\n let sxMax = -Infinity, syMax = -Infinity;\n let anyInFront = false;\n let anyBehind = false;\n\n for (const corner of _corners) {\n _v.copy(corner).project(camera);\n\n if (_v.z >= 1) {\n anyBehind = true;\n continue;\n }\n\n anyInFront = true;\n const sx = ((_v.x + 1) / 2) * canvasRect.width;\n const sy = ((1 - _v.y) / 2) * canvasRect.height;\n sxMin = Math.min(sxMin, sx);\n syMin = Math.min(syMin, sy);\n sxMax = Math.max(sxMax, sx);\n syMax = Math.max(syMax, sy);\n }\n\n if (!anyInFront) return null;\n\n if (anyBehind) {\n sxMin = Math.min(sxMin, 0);\n syMin = Math.min(syMin, 0);\n sxMax = Math.max(sxMax, canvasRect.width);\n syMax = Math.max(syMax, canvasRect.height);\n }\n\n sxMin = Math.max(0, sxMin);\n syMin = Math.max(0, syMin);\n sxMax = Math.min(canvasRect.width, sxMax);\n syMax = Math.min(canvasRect.height, syMax);\n\n const w = sxMax - sxMin;\n const h = syMax - syMin;\n if (w < 1 || h < 1) return null;\n\n return { left: sxMin, top: syMin, width: w, height: h };\n}\n\n// ---------------------------------------------------------------------------\n// Global API exposure (window.__R3F_DOM__)\n// ---------------------------------------------------------------------------\n\nfunction exposeGlobalAPI(store: ObjectStore): void {\n const api: R3FDOM = {\n getByTestId: (id: string) => store.getByTestId(id),\n getByUuid: (uuid: string) => store.getByUuid(uuid),\n getByName: (name: string) => store.getByName(name),\n getCount: () => store.getCount(),\n snapshot: () => createSnapshot(store),\n inspect: (idOrUuid: string) => store.inspect(idOrUuid),\n click: (idOrUuid: string) => { click3D(idOrUuid); },\n doubleClick: (idOrUuid: string) => { doubleClick3D(idOrUuid); },\n contextMenu: (idOrUuid: string) => { contextMenu3D(idOrUuid); },\n hover: (idOrUuid: string) => { hover3D(idOrUuid); },\n drag: (idOrUuid: string, delta: { x: number; y: number; z: number }) => { void drag3D(idOrUuid, delta); },\n wheel: (idOrUuid: string, options?: { deltaY?: number; deltaX?: number }) => { wheel3D(idOrUuid, options); },\n pointerMiss: () => { pointerMiss3D(); },\n select: (idOrUuid: string) => {\n const obj = store.getObject3D(idOrUuid);\n if (obj && _selectionManager) _selectionManager.select(obj);\n },\n clearSelection: () => { _selectionManager?.clearSelection(); },\n getObject3D: (idOrUuid: string) => store.getObject3D(idOrUuid),\n version,\n };\n window.__R3F_DOM__ = api;\n}\n\nfunction removeGlobalAPI(): void {\n delete window.__R3F_DOM__;\n}\n\n/** Set element position/size, only writing if values changed. */\nfunction setElementRect(el: HTMLElement, l: number, t: number, w: number, h: number): void {\n const d = el.dataset;\n if (d._l !== String(l) || d._t !== String(t) || d._w !== String(w) || d._h !== String(h)) {\n el.style.left = `${l}px`;\n el.style.top = `${t}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n d._l = String(l);\n d._t = String(t);\n d._w = String(w);\n d._h = String(h);\n }\n}\n\n// ---------------------------------------------------------------------------\n// ThreeDom Component\n// ---------------------------------------------------------------------------\n\nexport function ThreeDom({\n root = '#three-dom-root',\n batchSize = 500,\n timeBudgetMs = 0.5,\n maxDomNodes = 2000,\n initialDepth = 3,\n enabled = true,\n}: ThreeDomProps = {}) {\n const scene = useThree((s) => s.scene);\n const camera = useThree((s) => s.camera);\n const gl = useThree((s) => s.gl);\n const size = useThree((s) => s.size);\n const cursorRef = useRef(0);\n const positionCursorRef = useRef(0);\n\n // -----------------------------------------------------------------------\n // Setup\n // -----------------------------------------------------------------------\n\n useEffect(() => {\n if (!enabled) return;\n\n const canvas = gl.domElement;\n const canvasParent = canvas.parentElement!;\n\n // ---- Create / resolve root element ----\n let rootElement: HTMLElement | null = null;\n let createdRoot = false;\n\n if (typeof root === 'string') {\n rootElement = document.querySelector<HTMLElement>(root);\n } else {\n rootElement = root;\n }\n\n if (!rootElement) {\n rootElement = document.createElement('div');\n rootElement.id = typeof root === 'string' ? root.replace(/^#/, '') : 'three-dom-root';\n createdRoot = true;\n }\n\n // Place the mirror root INSIDE the Canvas wrapper as a sibling of the\n // <canvas>. With position:absolute and z-index:10, Chrome DevTools will\n // natively highlight our mirror elements when hovering in the Elements tab.\n canvasParent.style.position = canvasParent.style.position || 'relative';\n canvasParent.appendChild(rootElement);\n\n rootElement.style.cssText = [\n 'position: absolute',\n 'top: 0',\n 'left: 0',\n 'width: 100%',\n 'height: 100%',\n 'pointer-events: none',\n 'overflow: hidden',\n 'z-index: 10',\n ].join(';');\n\n // ---- Create store and mirror ----\n const store = new ObjectStore();\n const mirror = new DomMirror(store, maxDomNodes);\n mirror.setRoot(rootElement);\n\n ensureCustomElements(store);\n store.registerTree(scene);\n mirror.materializeSubtree(scene.uuid, initialDepth);\n\n const unpatch = patchObject3D(store, mirror);\n setInteractionState(store, camera, gl, size);\n\n // Keep SelectionManager available for the global API and Inspector\n const selectionManager = new SelectionManager();\n _selectionManager = selectionManager;\n _highlighter = null;\n\n exposeGlobalAPI(store);\n _store = store;\n _mirror = mirror;\n\n // ---- Initial full position sync ----\n const initialCanvasRect = canvas.getBoundingClientRect();\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n if (obj.userData?.__r3fdom_internal) continue;\n const el = mirror.getElement(obj.uuid);\n if (!el) continue;\n\n if (obj.type === 'Scene') {\n setElementRect(el, 0, 0, Math.round(initialCanvasRect.width), Math.round(initialCanvasRect.height));\n continue;\n }\n\n const rect = projectToScreenRect(obj, camera, initialCanvasRect);\n if (rect) {\n let parentLeft = 0;\n let parentTop = 0;\n if (obj.parent && obj.parent.type !== 'Scene') {\n const parentRect = projectToScreenRect(obj.parent, camera, initialCanvasRect);\n if (parentRect) {\n parentLeft = Math.round(parentRect.left);\n parentTop = Math.round(parentRect.top);\n }\n }\n setElementRect(\n el,\n Math.round(rect.left) - parentLeft,\n Math.round(rect.top) - parentTop,\n Math.round(rect.width),\n Math.round(rect.height),\n );\n }\n }\n\n // ---- Cleanup ----\n return () => {\n unpatch();\n removeGlobalAPI();\n clearInteractionState();\n selectionManager.dispose();\n mirror.dispose();\n store.dispose();\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n _store = null;\n _mirror = null;\n _selectionManager = null;\n _highlighter = null;\n };\n }, [scene, camera, gl, size, enabled, root, maxDomNodes, initialDepth]);\n\n // -----------------------------------------------------------------------\n // Per-frame sync\n // -----------------------------------------------------------------------\n\n useFrame(() => {\n if (!enabled || !_store || !_mirror) return;\n\n setInteractionState(_store, camera, gl, size);\n\n const store = _store;\n const mirror = _mirror;\n const canvas = gl.domElement;\n const canvasRect = canvas.getBoundingClientRect();\n const start = performance.now();\n\n // Layer 3: Sync priority (dirty) objects first\n const dirtyObjects = store.drainDirtyQueue();\n for (const obj of dirtyObjects) {\n store.update(obj);\n mirror.syncAttributes(obj);\n }\n\n // Layer 2: Amortized attribute sync\n const budgetRemaining = timeBudgetMs - (performance.now() - start);\n if (budgetRemaining > 0.1) {\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const end = Math.min(cursorRef.current + batchSize, objects.length);\n for (let i = cursorRef.current; i < end; i++) {\n if (performance.now() - start > timeBudgetMs) break;\n const obj = objects[i];\n const changed = store.update(obj);\n if (changed) mirror.syncAttributes(obj);\n }\n cursorRef.current = end >= objects.length ? 0 : end;\n }\n }\n\n // Layer 1: Amortized DOM position sync — project 3D bounds to screen.\n // Coordinates are parent-relative since elements are nested.\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const posEnd = Math.min(positionCursorRef.current + 50, objects.length);\n for (let i = positionCursorRef.current; i < posEnd; i++) {\n const obj = objects[i];\n if (obj.userData?.__r3fdom_internal) continue;\n const el = mirror.getElement(obj.uuid);\n if (!el) continue;\n\n if (obj.type === 'Scene') {\n setElementRect(el, 0, 0, Math.round(canvasRect.width), Math.round(canvasRect.height));\n continue;\n }\n\n const rect = projectToScreenRect(obj, camera, canvasRect);\n if (rect) {\n let parentLeft = 0;\n let parentTop = 0;\n if (obj.parent && obj.parent.type !== 'Scene') {\n const parentRect = projectToScreenRect(obj.parent, camera, canvasRect);\n if (parentRect) {\n parentLeft = Math.round(parentRect.left);\n parentTop = Math.round(parentRect.top);\n }\n }\n\n const l = Math.round(rect.left) - parentLeft;\n const t = Math.round(rect.top) - parentTop;\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n\n setElementRect(el, l, t, w, h);\n if (el.style.display === 'none') el.style.display = 'block';\n } else {\n if (el.style.display !== 'none') el.style.display = 'none';\n }\n }\n positionCursorRef.current = posEnd >= objects.length ? 0 : posEnd;\n }\n });\n\n return null;\n}\n","import {\n Object3D,\n Box3,\n Vector3,\n Camera,\n WebGLRenderer,\n} from 'three';\nimport type { SelectionManager } from './SelectionManager';\n\n// ---------------------------------------------------------------------------\n// Highlighter\n//\n// Renders DevTools-style 2D overlay highlights over 3D objects by projecting\n// their world-space bounding boxes onto screen coordinates. Matches the\n// Chrome DevTools visual style:\n// - Blue semi-transparent overlay for content area\n// - Tooltip showing element tag name + dimensions\n// - Hover highlight (temporary) vs selected highlight (persistent)\n// - Parent selection cascades to all children\n// ---------------------------------------------------------------------------\n\n/** Chrome DevTools highlight colors */\nconst COLORS = {\n /** Content area — same blue as Chrome DevTools element highlight */\n content: 'rgba(111, 168, 220, 0.66)',\n /** Slightly dimmer for children of a selected parent */\n contentChild: 'rgba(111, 168, 220, 0.33)',\n /** Hover highlight — lighter blue */\n hover: 'rgba(111, 168, 220, 0.4)',\n /** Tooltip background */\n tooltipBg: 'rgba(36, 36, 36, 0.9)',\n /** Tooltip text */\n tooltipText: '#fff',\n /** Tooltip tag color */\n tooltipTag: '#e776e0',\n /** Tooltip dimensions color */\n tooltipDim: '#c5c5c5',\n /** Border for selected elements */\n border: 'rgba(111, 168, 220, 0.9)',\n} as const;\n\nexport interface HighlighterOptions {\n /** Whether to show a tooltip above highlighted objects. Default: true */\n showTooltip?: boolean;\n}\n\n/** A 2D rectangle in screen pixels */\ninterface ScreenRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: project 3D bounding box to 2D screen rect\n// ---------------------------------------------------------------------------\n\nconst _box = /* @__PURE__ */ new Box3();\nconst _v = /* @__PURE__ */ new Vector3();\nconst _corners: Vector3[] = Array.from({ length: 8 }, () => new Vector3());\n\nfunction projectBoundsToScreen(\n obj: Object3D,\n camera: Camera,\n canvas: HTMLCanvasElement,\n): ScreenRect | null {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return null;\n\n const { min, max } = _box;\n\n // Get all 8 corners of the AABB\n _corners[0].set(min.x, min.y, min.z);\n _corners[1].set(min.x, min.y, max.z);\n _corners[2].set(min.x, max.y, min.z);\n _corners[3].set(min.x, max.y, max.z);\n _corners[4].set(max.x, min.y, min.z);\n _corners[5].set(max.x, min.y, max.z);\n _corners[6].set(max.x, max.y, min.z);\n _corners[7].set(max.x, max.y, max.z);\n\n const rect = canvas.getBoundingClientRect();\n let screenMinX = Infinity;\n let screenMinY = Infinity;\n let screenMaxX = -Infinity;\n let screenMaxY = -Infinity;\n let allBehind = true;\n\n for (const corner of _corners) {\n _v.copy(corner).project(camera);\n\n // Check if point is in front of camera (z < 1 in NDC)\n if (_v.z < 1) allBehind = false;\n\n // Convert NDC to screen pixels\n const sx = ((_v.x + 1) / 2) * rect.width;\n const sy = ((1 - _v.y) / 2) * rect.height;\n\n screenMinX = Math.min(screenMinX, sx);\n screenMinY = Math.min(screenMinY, sy);\n screenMaxX = Math.max(screenMaxX, sx);\n screenMaxY = Math.max(screenMaxY, sy);\n }\n\n if (allBehind) return null;\n\n // Clamp to canvas bounds\n screenMinX = Math.max(0, screenMinX);\n screenMinY = Math.max(0, screenMinY);\n screenMaxX = Math.min(rect.width, screenMaxX);\n screenMaxY = Math.min(rect.height, screenMaxY);\n\n const width = screenMaxX - screenMinX;\n const height = screenMaxY - screenMinY;\n\n if (width < 1 || height < 1) return null;\n\n return {\n left: rect.left + screenMinX,\n top: rect.top + screenMinY,\n width,\n height,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helper: get a display label for an object (like DevTools tag name)\n// ---------------------------------------------------------------------------\n\nfunction getObjectLabel(obj: Object3D): string {\n const tag = `three-${obj.type.toLowerCase()}`;\n const parts: string[] = [tag];\n\n if (obj.name) {\n parts.push(`.${obj.name}`);\n }\n\n const testId = obj.userData?.testId;\n if (testId) {\n parts.push(`[testId=\"${testId}\"]`);\n }\n\n return parts.join('');\n}\n\nfunction getObjectDimensions(obj: Object3D): string {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return '';\n const size = _box.getSize(new Vector3());\n return `${size.x.toFixed(1)} × ${size.y.toFixed(1)} × ${size.z.toFixed(1)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Overlay element management\n// ---------------------------------------------------------------------------\n\ninterface OverlayEntry {\n /** The container div for the highlight overlay */\n overlayEl: HTMLDivElement;\n /** The tooltip element */\n tooltipEl: HTMLDivElement;\n /** Target object being highlighted */\n target: Object3D;\n /** Whether this is a child-of-parent highlight (dimmer) */\n isChild: boolean;\n}\n\nfunction createOverlayElement(color: string, showBorder: boolean): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 99998;\n background: ${color};\n ${showBorder ? `border: 1px solid ${COLORS.border};` : ''}\n transition: all 0.05s ease-out;\n box-sizing: border-box;\n `;\n return el;\n}\n\nfunction createTooltipElement(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 99999;\n background: ${COLORS.tooltipBg};\n color: ${COLORS.tooltipText};\n font-family: 'SF Mono', Monaco, monospace;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 3px;\n white-space: nowrap;\n line-height: 1.4;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n `;\n return el;\n}\n\nfunction positionOverlay(entry: OverlayEntry, rect: ScreenRect): void {\n const { overlayEl, tooltipEl } = entry;\n overlayEl.style.left = `${rect.left}px`;\n overlayEl.style.top = `${rect.top}px`;\n overlayEl.style.width = `${rect.width}px`;\n overlayEl.style.height = `${rect.height}px`;\n overlayEl.style.display = 'block';\n\n // Position tooltip above the overlay\n tooltipEl.style.left = `${rect.left}px`;\n tooltipEl.style.top = `${Math.max(0, rect.top - 28)}px`;\n tooltipEl.style.display = 'block';\n}\n\nfunction hideOverlay(entry: OverlayEntry): void {\n entry.overlayEl.style.display = 'none';\n entry.tooltipEl.style.display = 'none';\n}\n\n// ---------------------------------------------------------------------------\n// Highlighter class\n// ---------------------------------------------------------------------------\n\nexport class Highlighter {\n /** Selected object overlays (persistent until deselected) */\n private _selectedEntries: Map<Object3D, OverlayEntry> = new Map();\n /** Hover overlay (temporary, single object at a time) */\n private _hoverEntries: Map<Object3D, OverlayEntry> = new Map();\n\n private _camera: Camera | null = null;\n private _renderer: WebGLRenderer | null = null;\n private _unsubscribe: (() => void) | null = null;\n private _showTooltip: boolean;\n\n /** DevTools hover polling interval */\n private _hoverPollId: ReturnType<typeof setInterval> | null = null;\n private _lastHoveredElement: HTMLElement | null = null;\n\n /** Store reference for resolving objects */\n private _store: { getObject3D(uuid: string): Object3D | null } | null = null;\n\n constructor(options: HighlighterOptions = {}) {\n this._showTooltip = options.showTooltip ?? true;\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n attach(\n _scene: Object3D,\n selectionManager: SelectionManager,\n camera: Camera,\n renderer: WebGLRenderer,\n store: { getObject3D(uuid: string): Object3D | null },\n ): void {\n this.detach();\n // scene parameter kept for API compatibility but not used for 2D overlays\n void _scene;\n this._camera = camera;\n this._renderer = renderer;\n this._store = store;\n\n // Subscribe to selection changes\n this._unsubscribe = selectionManager.subscribe((selected) => {\n this._syncSelectedHighlights(selected);\n });\n\n // Apply initial selection\n this._syncSelectedHighlights([...selectionManager.getSelected()]);\n\n // Start polling for DevTools hover\n this._startHoverPolling();\n }\n\n detach(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._stopHoverPolling();\n this._clearAllOverlays(this._selectedEntries);\n this._clearAllOverlays(this._hoverEntries);\n this._camera = null;\n this._renderer = null;\n this._store = null;\n }\n\n // -----------------------------------------------------------------------\n // Per-frame update — reposition all overlays to follow camera/objects\n // -----------------------------------------------------------------------\n\n update(): void {\n if (!this._camera || !this._renderer) return;\n const canvas = this._renderer.domElement;\n\n // Update selected overlays\n for (const entry of this._selectedEntries.values()) {\n const rect = projectBoundsToScreen(entry.target, this._camera, canvas);\n if (rect) {\n positionOverlay(entry, rect);\n } else {\n hideOverlay(entry);\n }\n }\n\n // Update hover overlays\n for (const entry of this._hoverEntries.values()) {\n const rect = projectBoundsToScreen(entry.target, this._camera, canvas);\n if (rect) {\n positionOverlay(entry, rect);\n } else {\n hideOverlay(entry);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n highlight(obj: Object3D): void {\n this._addSelectedHighlight(obj, false);\n }\n\n unhighlight(obj: Object3D): void {\n this._removeOverlay(obj, this._selectedEntries);\n }\n\n clearAll(): void {\n this._clearAllOverlays(this._selectedEntries);\n this._clearAllOverlays(this._hoverEntries);\n }\n\n isHighlighted(obj: Object3D): boolean {\n return this._selectedEntries.has(obj);\n }\n\n /** Show a temporary hover highlight for an object and its children */\n showHoverHighlight(obj: Object3D): void {\n this._clearAllOverlays(this._hoverEntries);\n this._addHoverHighlightRecursive(obj);\n }\n\n /** Clear the hover highlight */\n clearHoverHighlight(): void {\n this._clearAllOverlays(this._hoverEntries);\n this._lastHoveredElement = null;\n }\n\n // -----------------------------------------------------------------------\n // Internal: selection highlights\n // -----------------------------------------------------------------------\n\n private _syncSelectedHighlights(selected: Object3D[]): void {\n // Collect all objects that should be highlighted\n const targetSet = new Set<Object3D>();\n const primarySet = new Set<Object3D>(selected);\n\n for (const obj of selected) {\n targetSet.add(obj);\n // If the selected object has children, cascade highlights\n obj.traverse((child) => {\n targetSet.add(child);\n });\n }\n\n // Remove overlays for objects no longer in the target set\n for (const [obj] of this._selectedEntries) {\n if (!targetSet.has(obj)) {\n this._removeOverlay(obj, this._selectedEntries);\n }\n }\n\n // Add overlays for newly targeted objects\n for (const obj of targetSet) {\n if (obj.userData?.__r3fdom_internal) continue;\n if (!this._selectedEntries.has(obj)) {\n const isChild = !primarySet.has(obj);\n this._addSelectedHighlight(obj, isChild);\n }\n }\n }\n\n private _addSelectedHighlight(obj: Object3D, isChild: boolean): void {\n if (this._selectedEntries.has(obj)) return;\n\n const color = isChild ? COLORS.contentChild : COLORS.content;\n const overlayEl = createOverlayElement(color, !isChild);\n const tooltipEl = createTooltipElement();\n\n // Only show tooltip for the primary (non-child) selection\n if (isChild || !this._showTooltip) {\n tooltipEl.style.display = 'none';\n }\n\n // Set tooltip content\n const label = getObjectLabel(obj);\n const dims = getObjectDimensions(obj);\n tooltipEl.innerHTML = `<span style=\"color:${COLORS.tooltipTag}\">${label}</span>` +\n (dims ? ` <span style=\"color:${COLORS.tooltipDim}\">${dims}</span>` : '');\n\n document.body.appendChild(overlayEl);\n document.body.appendChild(tooltipEl);\n\n const entry: OverlayEntry = { overlayEl, tooltipEl, target: obj, isChild };\n this._selectedEntries.set(obj, entry);\n }\n\n // -----------------------------------------------------------------------\n // Internal: hover highlights\n // -----------------------------------------------------------------------\n\n private _addHoverHighlightRecursive(obj: Object3D): void {\n if (obj.userData?.__r3fdom_internal) return;\n\n const overlayEl = createOverlayElement(COLORS.hover, false);\n const tooltipEl = createTooltipElement();\n\n // Tooltip only for the root hovered object\n if (this._hoverEntries.size === 0 && this._showTooltip) {\n const label = getObjectLabel(obj);\n const dims = getObjectDimensions(obj);\n tooltipEl.innerHTML = `<span style=\"color:${COLORS.tooltipTag}\">${label}</span>` +\n (dims ? ` <span style=\"color:${COLORS.tooltipDim}\">${dims}</span>` : '');\n } else {\n tooltipEl.style.display = 'none';\n }\n\n document.body.appendChild(overlayEl);\n document.body.appendChild(tooltipEl);\n\n this._hoverEntries.set(obj, { overlayEl, tooltipEl, target: obj, isChild: false });\n\n // Recurse into children\n for (const child of obj.children) {\n if (!child.userData?.__r3fdom_internal) {\n this._addHoverHighlightRecursive(child);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: DevTools hover polling\n // -----------------------------------------------------------------------\n\n private _startHoverPolling(): void {\n this._hoverPollId = setInterval(() => {\n this._pollDevToolsHover();\n }, 100);\n }\n\n private _stopHoverPolling(): void {\n if (this._hoverPollId) {\n clearInterval(this._hoverPollId);\n this._hoverPollId = null;\n }\n }\n\n private _pollDevToolsHover(): void {\n if (!this._store) return;\n\n try {\n // Chrome DevTools exposes $0 for the currently selected element.\n // We also check for a custom __r3fdom_hovered__ property that\n // we set via a MutationObserver on the mirror root.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hoveredEl = (globalThis as any).__r3fdom_hovered__ as HTMLElement | undefined;\n if (hoveredEl === this._lastHoveredElement) return;\n this._lastHoveredElement = hoveredEl ?? null;\n\n if (!hoveredEl) {\n this._clearAllOverlays(this._hoverEntries);\n return;\n }\n\n const uuid = hoveredEl.getAttribute?.('data-uuid');\n if (!uuid) {\n this._clearAllOverlays(this._hoverEntries);\n return;\n }\n\n const obj = this._store.getObject3D(uuid);\n if (obj) {\n this.showHoverHighlight(obj);\n } else {\n this._clearAllOverlays(this._hoverEntries);\n }\n } catch {\n // Ignore errors from DevTools API\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: overlay cleanup\n // -----------------------------------------------------------------------\n\n private _removeOverlay(obj: Object3D, map: Map<Object3D, OverlayEntry>): void {\n const entry = map.get(obj);\n if (!entry) return;\n entry.overlayEl.remove();\n entry.tooltipEl.remove();\n map.delete(obj);\n }\n\n private _clearAllOverlays(map: Map<Object3D, OverlayEntry>): void {\n for (const entry of map.values()) {\n entry.overlayEl.remove();\n entry.tooltipEl.remove();\n }\n map.clear();\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this.detach();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/debug.ts","../src/store/ObjectStore.ts","../src/mirror/CustomElements.ts","../src/mirror/attributes.ts","../src/mirror/DomMirror.ts","../src/bridge/patchObject3D.ts","../src/snapshot/snapshot.ts","../src/interactions/projection.ts","../src/interactions/dispatch.ts","../src/interactions/raycastVerify.ts","../src/interactions/resolve.ts","../src/interactions/click.ts","../src/interactions/hover.ts","../src/interactions/drag.ts","../src/interactions/wheel.ts","../src/interactions/pointerMiss.ts","../src/interactions/drawPath.ts","../src/highlight/SelectionManager.ts","../src/bridge/ThreeDom.tsx","../src/highlight/Highlighter.ts"],"names":["BufferGeometry","Material","InstancedMesh","Box3","Color","Object3D","Vector3","_box3","Frustum","Matrix4","Raycaster","Vector2","_store","sleep","getStore","useThree","useRef","useEffect","useFrame","objects","_box","_v","_corners","getObjectLabel"],"mappings":"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","file":"index.cjs","sourcesContent":["export const version = '0.1.0';\n","// ---------------------------------------------------------------------------\n// Debug logging for react-three-dom\n//\n// Three-layer system:\n// Layer 1 (this file): r3fLog() writes to browser console.log\n// Layer 2 (Playwright): r3f.enableDebug() forwards browser logs to test terminal\n// Layer 3 (Cypress): cy.r3fEnableDebug() mirrors to Cypress command log\n//\n// Enable via:\n// - <ThreeDom debug /> prop\n// - enableDebug(true) programmatically\n// - window.__R3F_DOM_DEBUG__ = true (from test code or DevTools console)\n// ---------------------------------------------------------------------------\n\nlet _enabled = false;\n\n/**\n * Enable or disable debug logging globally.\n * When enabled, all r3fLog calls will output to console.log.\n */\nexport function enableDebug(on = true): void {\n _enabled = on;\n}\n\n/**\n * Check if debug logging is currently enabled.\n */\nexport function isDebugEnabled(): boolean {\n return (\n _enabled ||\n (typeof window !== 'undefined' && !!window.__R3F_DOM_DEBUG__)\n );\n}\n\n/**\n * Log a debug message. Only outputs when debug is enabled via:\n * - enableDebug(true)\n * - window.__R3F_DOM_DEBUG__ = true\n * - <ThreeDom debug /> prop\n *\n * @param area - Module area (e.g. 'setup', 'store', 'patch', 'click', 'drag')\n * @param msg - Human-readable message\n * @param data - Optional data payload (object, error, etc.)\n */\nexport function r3fLog(area: string, msg: string, data?: unknown): void {\n if (\n !_enabled &&\n !(typeof window !== 'undefined' && window.__R3F_DOM_DEBUG__)\n ) {\n return;\n }\n if (data !== undefined) {\n console.log(`[r3f-dom:${area}]`, msg, data);\n } else {\n console.log(`[r3f-dom:${area}]`, msg);\n }\n}\n","import {\n Object3D,\n Mesh,\n InstancedMesh,\n BufferGeometry,\n Material,\n Box3,\n Color,\n} from 'three';\nimport type {\n ObjectMetadata,\n ObjectInspection,\n GeometryInspection,\n MaterialInspection,\n StoreEvent,\n StoreListener,\n} from '../types';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// Helper: extract Tier 1 metadata from a live Three.js object\n// ---------------------------------------------------------------------------\n\nfunction extractMetadata(obj: Object3D): ObjectMetadata {\n const meta: ObjectMetadata = {\n uuid: obj.uuid,\n name: obj.name,\n type: obj.type,\n visible: obj.visible,\n testId: obj.userData?.testId as string | undefined,\n position: [obj.position.x, obj.position.y, obj.position.z],\n rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z],\n scale: [obj.scale.x, obj.scale.y, obj.scale.z],\n parentUuid: obj.parent?.uuid ?? null,\n childrenUuids: obj.children.map((c) => c.uuid),\n boundsDirty: true,\n };\n\n // Geometry info (Mesh, SkinnedMesh, InstancedMesh, Points, Line, etc.)\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n meta.geometryType = geom.type;\n const posAttr = geom.getAttribute('position');\n if (posAttr) {\n meta.vertexCount = posAttr.count;\n if (geom.index) {\n meta.triangleCount = Math.floor(geom.index.count / 3);\n } else {\n meta.triangleCount = Math.floor(posAttr.count / 3);\n }\n }\n }\n }\n } catch {\n // Skip geometry fields if access fails (corrupted or disposed geometry)\n r3fLog('store', `extractMetadata: geometry access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Material info\n try {\n if ('material' in obj) {\n const mat = (obj as Mesh).material;\n if (mat instanceof Material) {\n meta.materialType = mat.type;\n } else if (Array.isArray(mat) && mat.length > 0) {\n meta.materialType = mat[0].type + (mat.length > 1 ? ` (+${mat.length - 1})` : '');\n }\n }\n } catch {\n // Skip material fields if access fails (disposed material)\n r3fLog('store', `extractMetadata: material access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // InstancedMesh count\n try {\n if (obj instanceof InstancedMesh) {\n meta.instanceCount = obj.count;\n }\n } catch {\n // Skip instance count if access fails\n }\n\n return meta;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: compare two metadata objects for changes (Tier 1 only)\n// Returns true if any values differ\n// ---------------------------------------------------------------------------\n\nfunction hasChanged(prev: ObjectMetadata, curr: ObjectMetadata): boolean {\n return (\n prev.visible !== curr.visible ||\n prev.name !== curr.name ||\n prev.testId !== curr.testId ||\n prev.position[0] !== curr.position[0] ||\n prev.position[1] !== curr.position[1] ||\n prev.position[2] !== curr.position[2] ||\n prev.rotation[0] !== curr.rotation[0] ||\n prev.rotation[1] !== curr.rotation[1] ||\n prev.rotation[2] !== curr.rotation[2] ||\n prev.scale[0] !== curr.scale[0] ||\n prev.scale[1] !== curr.scale[1] ||\n prev.scale[2] !== curr.scale[2] ||\n prev.parentUuid !== curr.parentUuid ||\n prev.childrenUuids.length !== curr.childrenUuids.length ||\n prev.instanceCount !== curr.instanceCount\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Tier 2 on-demand inspection\n// ---------------------------------------------------------------------------\n\nconst _box3 = new Box3();\n\nfunction inspectObject(obj: Object3D, metadata: ObjectMetadata): ObjectInspection {\n // Start with a minimal valid inspection — each section fills in details\n // and is wrapped in try/catch so a failure in one area (e.g. disposed\n // geometry) doesn't prevent the rest from being returned.\n let worldMatrix: number[] = Array(16).fill(0);\n let boundsMin: [number, number, number] = [0, 0, 0];\n let boundsMax: [number, number, number] = [0, 0, 0];\n\n // World matrix + bounds\n try {\n obj.updateWorldMatrix(true, false);\n worldMatrix = Array.from(obj.matrixWorld.elements);\n _box3.setFromObject(obj);\n boundsMin = [_box3.min.x, _box3.min.y, _box3.min.z];\n boundsMax = [_box3.max.x, _box3.max.y, _box3.max.z];\n } catch {\n r3fLog('store', `inspectObject: world matrix / bounds failed for \"${obj.name || obj.uuid}\"`);\n }\n\n const inspection: ObjectInspection = {\n metadata,\n worldMatrix,\n bounds: { min: boundsMin, max: boundsMax },\n userData: {},\n };\n\n // userData (shallow copy, may contain non-serializable values)\n try {\n inspection.userData = { ...obj.userData };\n } catch {\n r3fLog('store', `inspectObject: userData copy failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Geometry details\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n const geoInspection: GeometryInspection = {\n type: geom.type,\n attributes: {},\n };\n\n for (const [name, attr] of Object.entries(geom.attributes)) {\n geoInspection.attributes[name] = {\n itemSize: attr.itemSize,\n count: attr.count,\n };\n }\n\n if (geom.index) {\n geoInspection.index = { count: geom.index.count };\n }\n\n geom.computeBoundingSphere();\n const sphere = geom.boundingSphere;\n if (sphere) {\n geoInspection.boundingSphere = {\n center: [sphere.center.x, sphere.center.y, sphere.center.z],\n radius: sphere.radius,\n };\n }\n\n inspection.geometry = geoInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: geometry inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Material details\n try {\n if ('material' in obj) {\n const rawMat = (obj as Mesh).material;\n const mat = Array.isArray(rawMat) ? rawMat[0] : rawMat;\n if (mat instanceof Material) {\n const matInspection: MaterialInspection = {\n type: mat.type,\n transparent: mat.transparent,\n opacity: mat.opacity,\n side: mat.side,\n };\n\n // Color (most materials have it)\n if ('color' in mat && (mat as unknown as { color: Color }).color instanceof Color) {\n matInspection.color = '#' + (mat as unknown as { color: Color }).color.getHexString();\n }\n\n // Map texture\n if ('map' in mat) {\n const map = (mat as unknown as { map: { name?: string; uuid?: string } | null }).map;\n if (map) {\n matInspection.map = map.name || map.uuid || 'unnamed';\n }\n }\n\n // ShaderMaterial uniforms\n if ('uniforms' in mat) {\n const uniforms = (mat as unknown as { uniforms: Record<string, { value: unknown }> })\n .uniforms;\n matInspection.uniforms = {};\n for (const [key, uniform] of Object.entries(uniforms)) {\n const val = uniform.value;\n if (val === null || val === undefined) {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'number' || typeof val === 'boolean' || typeof val === 'string') {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'object' && 'toArray' in val) {\n matInspection.uniforms[key] = (val as { toArray(): number[] }).toArray();\n } else {\n matInspection.uniforms[key] = `[${typeof val}]`;\n }\n }\n }\n\n inspection.material = matInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: material inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n return inspection;\n}\n\n// ---------------------------------------------------------------------------\n// ObjectStore — the source of truth for all tracked Three.js objects\n// ---------------------------------------------------------------------------\n\nexport class ObjectStore {\n // Tier 1: metadata for every tracked object\n private _metaByObject = new WeakMap<Object3D, ObjectMetadata>();\n private _objectByUuid = new Map<string, Object3D>();\n private _objectsByTestId = new Map<string, Object3D>();\n private _objectsByName = new Map<string, Set<Object3D>>();\n\n // Flat list for amortized iteration\n private _flatList: Object3D[] = [];\n private _flatListDirty = true;\n\n // Priority dirty queue: objects that changed and need immediate sync\n private _dirtyQueue = new Set<Object3D>();\n\n // Event listeners\n private _listeners: StoreListener[] = [];\n\n // Track the root scene(s) for scoping\n private _trackedRoots = new WeakSet<Object3D>();\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a single object into the store.\n * Populates Tier 1 metadata and all indexes.\n */\n register(obj: Object3D): ObjectMetadata {\n // Skip internal highlight/label helpers created by Highlighter\n if (obj.userData?.__r3fdom_internal) {\n return extractMetadata(obj); // Return metadata but don't store it\n }\n\n // Skip if already registered\n const existing = this._metaByObject.get(obj);\n if (existing) return existing;\n\n const meta = extractMetadata(obj);\n this._metaByObject.set(obj, meta);\n this._objectByUuid.set(meta.uuid, obj);\n this._flatListDirty = true;\n\n // Index by testId\n if (meta.testId) {\n this._objectsByTestId.set(meta.testId, obj);\n }\n\n // Index by name\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n\n this._emit({ type: 'add', object: obj, metadata: meta });\n if (meta.testId) {\n r3fLog('store', `Registered \"${meta.testId}\" (${meta.type})`);\n }\n return meta;\n }\n\n /**\n * Register an entire subtree (object + all descendants).\n * Individual objects that fail to register are skipped (logged when debug\n * is enabled) so that one bad object doesn't prevent the rest from being\n * tracked.\n */\n registerTree(root: Object3D): void {\n this._trackedRoots.add(root);\n root.traverse((obj) => {\n try {\n this.register(obj);\n } catch (err) {\n r3fLog('store', `registerTree: failed to register \"${obj.name || obj.uuid}\"`, err);\n }\n });\n }\n\n /**\n * Unregister a single object from the store.\n */\n unregister(obj: Object3D): void {\n const meta = this._metaByObject.get(obj);\n if (!meta) return;\n\n this._metaByObject.delete(obj);\n this._objectByUuid.delete(meta.uuid);\n this._dirtyQueue.delete(obj);\n this._flatListDirty = true;\n\n if (meta.testId) {\n this._objectsByTestId.delete(meta.testId);\n }\n\n if (meta.name) {\n const nameSet = this._objectsByName.get(meta.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) {\n this._objectsByName.delete(meta.name);\n }\n }\n }\n\n if (meta.testId) {\n r3fLog('store', `Unregistered \"${meta.testId}\" (${meta.type})`);\n }\n this._emit({ type: 'remove', object: obj, metadata: meta });\n }\n\n /**\n * Unregister an entire subtree (object + all descendants).\n */\n unregisterTree(root: Object3D): void {\n root.traverse((obj) => {\n this.unregister(obj);\n });\n this._trackedRoots.delete(root);\n }\n\n // -------------------------------------------------------------------------\n // Tier 1: Update (compare-and-set, returns true if changed)\n // -------------------------------------------------------------------------\n\n /**\n * Refresh Tier 1 metadata from the live Three.js object.\n * Returns true if any values changed.\n * Returns false (no change) if extracting metadata throws so that the\n * previous metadata is preserved.\n */\n update(obj: Object3D): boolean {\n const prev = this._metaByObject.get(obj);\n if (!prev) return false;\n\n let curr: ObjectMetadata;\n try {\n curr = extractMetadata(obj);\n } catch (err) {\n r3fLog('store', `update: extractMetadata failed for \"${obj.name || obj.uuid}\"`, err);\n return false;\n }\n\n if (hasChanged(prev, curr)) {\n // Update indexes if testId or name changed\n if (prev.testId !== curr.testId) {\n r3fLog('store', `testId changed: \"${prev.testId}\" → \"${curr.testId}\" (${curr.type})`);\n if (prev.testId) this._objectsByTestId.delete(prev.testId);\n if (curr.testId) this._objectsByTestId.set(curr.testId, obj);\n }\n if (prev.name !== curr.name) {\n if (prev.name) {\n const nameSet = this._objectsByName.get(prev.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) this._objectsByName.delete(prev.name);\n }\n }\n if (curr.name) {\n let nameSet = this._objectsByName.get(curr.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(curr.name, nameSet);\n }\n nameSet.add(obj);\n }\n }\n\n this._metaByObject.set(obj, curr);\n this._emit({ type: 'update', object: obj, metadata: curr });\n return true;\n }\n\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand inspection (never cached)\n // -------------------------------------------------------------------------\n\n /**\n * Compute full inspection data from a live Three.js object.\n * This reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(idOrUuid: string): ObjectInspection | null {\n const obj = this.getObject3D(idOrUuid);\n if (!obj) return null;\n\n const meta = this._metaByObject.get(obj);\n if (!meta) return null;\n\n return inspectObject(obj, meta);\n }\n\n // -------------------------------------------------------------------------\n // Lookups (O(1))\n // -------------------------------------------------------------------------\n\n /** Get metadata by testId. O(1). */\n getByTestId(testId: string): ObjectMetadata | null {\n const obj = this._objectsByTestId.get(testId);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by uuid. O(1). */\n getByUuid(uuid: string): ObjectMetadata | null {\n const obj = this._objectByUuid.get(uuid);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by name (returns array since names aren't unique). O(1). */\n getByName(name: string): ObjectMetadata[] {\n const objs = this._objectsByName.get(name);\n if (!objs) return [];\n const results: ObjectMetadata[] = [];\n for (const obj of objs) {\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /**\n * Batch lookup: get metadata for multiple objects by testId or uuid.\n * Returns a Map from the requested id to its metadata (or null if not found).\n * Single round-trip — much more efficient than calling getByTestId/getByUuid\n * in a loop for BIM/CAD scenes with many objects.\n * O(k) where k is the number of requested ids.\n */\n getObjects(ids: string[]): Map<string, ObjectMetadata | null> {\n const results = new Map<string, ObjectMetadata | null>();\n for (const id of ids) {\n const meta = this.getByTestId(id) ?? this.getByUuid(id);\n results.set(id, meta);\n }\n return results;\n }\n\n /**\n * Get all objects of a given Three.js type (e.g. \"Mesh\", \"Group\", \"Line\").\n * Linear scan — O(n) where n is total tracked objects.\n */\n getByType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects that have a specific userData key.\n * If `value` is provided, only returns objects where `userData[key]` matches.\n * Uses JSON.stringify for deep equality on complex values.\n * Linear scan — O(n).\n */\n getByUserData(key: string, value?: unknown): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n const checkValue = value !== undefined;\n const valueJson = checkValue ? JSON.stringify(value) : '';\n for (const obj of this.getFlatList()) {\n if (!(key in obj.userData)) continue;\n if (checkValue && JSON.stringify(obj.userData[key]) !== valueJson) continue;\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /**\n * Count objects of a given Three.js type.\n * More efficient than getByType().length — no array allocation.\n * Linear scan — O(n).\n */\n getCountByType(type: string): number {\n let count = 0;\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) count++;\n }\n return count;\n }\n\n /** Get the raw Three.js Object3D by testId or uuid. */\n getObject3D(idOrUuid: string): Object3D | null {\n // Try testId first, then uuid\n return this._objectsByTestId.get(idOrUuid)\n ?? this._objectByUuid.get(idOrUuid)\n ?? null;\n }\n\n /** Get metadata for a known Object3D reference. */\n getMetadata(obj: Object3D): ObjectMetadata | null {\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Check if an object is registered. */\n has(obj: Object3D): boolean {\n return this._metaByObject.has(obj);\n }\n\n /** Total number of tracked objects. */\n getCount(): number {\n return this._objectByUuid.size;\n }\n\n /** Check if a root scene is tracked. */\n isTrackedRoot(obj: Object3D): boolean {\n return this._trackedRoots.has(obj);\n }\n\n /**\n * Walk up from `obj` to see if any ancestor is a tracked root.\n * Used by Object3D.add/remove patch to determine if an object\n * belongs to a monitored scene.\n */\n isInTrackedScene(obj: Object3D): boolean {\n let current: Object3D | null = obj;\n while (current) {\n if (this._trackedRoots.has(current)) return true;\n current = current.parent;\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Flat list for amortized iteration\n // -------------------------------------------------------------------------\n\n /**\n * Get a flat array of all tracked objects for amortized batch processing.\n * Rebuilds lazily when the list is dirty (objects added/removed).\n */\n getFlatList(): Object3D[] {\n if (this._flatListDirty) {\n this._flatList = Array.from(this._objectByUuid.values());\n this._flatListDirty = false;\n }\n return this._flatList;\n }\n\n // -------------------------------------------------------------------------\n // Priority dirty queue\n // -------------------------------------------------------------------------\n\n /** Mark an object as dirty (needs priority sync next frame). */\n markDirty(obj: Object3D): void {\n if (this._metaByObject.has(obj)) {\n this._dirtyQueue.add(obj);\n }\n }\n\n /**\n * Drain the dirty queue, returning all objects that need priority sync.\n * Clears the queue after draining.\n */\n drainDirtyQueue(): Object3D[] {\n if (this._dirtyQueue.size === 0) return [];\n const objects = Array.from(this._dirtyQueue);\n this._dirtyQueue.clear();\n return objects;\n }\n\n /** Number of objects currently in the dirty queue. */\n getDirtyCount(): number {\n return this._dirtyQueue.size;\n }\n\n // -------------------------------------------------------------------------\n // Event system\n // -------------------------------------------------------------------------\n\n /** Subscribe to store events (add, remove, update). */\n subscribe(listener: StoreListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _emit(event: StoreEvent): void {\n for (const listener of this._listeners) {\n listener(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Remove all tracked objects and reset state. */\n dispose(): void {\n this._objectByUuid.clear();\n this._objectsByTestId.clear();\n this._objectsByName.clear();\n this._flatList = [];\n this._flatListDirty = true;\n this._dirtyQueue.clear();\n this._listeners = [];\n // WeakMap and WeakSet entries will be GC'd automatically\n }\n}\n","import type { Object3D } from 'three';\nimport type { ObjectMetadata, ObjectInspection } from '../types';\nimport type { ObjectStore } from '../store/ObjectStore';\n\n// ---------------------------------------------------------------------------\n// Tag mapping: Three.js type → custom element tag name\n// ---------------------------------------------------------------------------\n\n/**\n * Maps Three.js object types to custom element tag names.\n * Multiple Three.js types can map to the same tag.\n */\nexport const TAG_MAP: Record<string, string> = {\n // Scenes\n Scene: 'three-scene',\n\n // Groups / containers\n Group: 'three-group',\n LOD: 'three-group',\n Bone: 'three-group',\n\n // Meshes\n Mesh: 'three-mesh',\n SkinnedMesh: 'three-mesh',\n InstancedMesh: 'three-mesh',\n LineSegments: 'three-mesh',\n Line: 'three-mesh',\n LineLoop: 'three-mesh',\n Points: 'three-mesh',\n Sprite: 'three-mesh',\n\n // Lights\n AmbientLight: 'three-light',\n DirectionalLight: 'three-light',\n HemisphereLight: 'three-light',\n PointLight: 'three-light',\n RectAreaLight: 'three-light',\n SpotLight: 'three-light',\n LightProbe: 'three-light',\n\n // Cameras\n PerspectiveCamera: 'three-camera',\n OrthographicCamera: 'three-camera',\n ArrayCamera: 'three-camera',\n CubeCamera: 'three-camera',\n\n // Helpers (map to object as fallback)\n BoxHelper: 'three-object',\n ArrowHelper: 'three-object',\n AxesHelper: 'three-object',\n GridHelper: 'three-object',\n SkeletonHelper: 'three-object',\n};\n\n/** All unique tag names that need to be registered. */\nconst ALL_TAGS = [\n 'three-scene',\n 'three-group',\n 'three-mesh',\n 'three-light',\n 'three-camera',\n 'three-object',\n] as const;\n\nexport type ThreeTagName = (typeof ALL_TAGS)[number];\n\n/** Default fallback tag for any Object3D type not in TAG_MAP. */\nconst DEFAULT_TAG: ThreeTagName = 'three-object';\n\n/**\n * Get the custom element tag name for a Three.js object type.\n */\nexport function getTagForType(type: string): ThreeTagName {\n return (TAG_MAP[type] as ThreeTagName) ?? DEFAULT_TAG;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: reference to the store (set once during ensureCustomElements)\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\n\n/**\n * Set the ObjectStore reference that custom elements use for lookups.\n * Must be called before any custom element properties/methods are used.\n */\nexport function setElementStore(store: ObjectStore): void {\n _store = store;\n}\n\n// ---------------------------------------------------------------------------\n// ThreeElement: base class for all custom elements\n// ---------------------------------------------------------------------------\n\n/**\n * Base custom element class for the DOM mirror.\n * Provides interactive properties and methods accessible via DevTools console.\n *\n * Usage in DevTools after selecting a <three-mesh> in the Elements panel:\n * $0.metadata → Tier 1 cached metadata (instant)\n * $0.inspect() → Tier 2 heavy inspection (reads live Three.js object)\n * $0.object3D → raw THREE.Object3D reference\n * $0.position → [x, y, z] shortcut\n * $0.bounds → { min, max } shortcut\n * $0.click() → trigger deterministic click\n * $0.hover() → trigger deterministic hover\n */\nexport class ThreeElement extends HTMLElement {\n // -------------------------------------------------------------------------\n // Tier 1: Lightweight cached metadata (always available)\n // -------------------------------------------------------------------------\n\n /**\n * Returns the Tier 1 cached metadata for this object.\n * Instant, no computation. Returns null if the element is not linked.\n */\n get metadata(): ObjectMetadata | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getByUuid(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand heavy inspection (reads live Three.js object)\n // -------------------------------------------------------------------------\n\n /**\n * Performs a full inspection of the linked Three.js object.\n * Reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(): ObjectInspection | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.inspect(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Raw Three.js object reference\n // -------------------------------------------------------------------------\n\n /**\n * Returns the raw Three.js Object3D linked to this DOM element.\n * Allows direct access to any Three.js property or method.\n */\n get object3D(): Object3D | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getObject3D(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Convenience shortcuts (read from Tier 1 metadata)\n // -------------------------------------------------------------------------\n\n /**\n * Local position as [x, y, z].\n */\n get position(): [number, number, number] | null {\n return this.metadata?.position ?? null;\n }\n\n /**\n * Local euler rotation as [x, y, z] in radians.\n */\n get rotation(): [number, number, number] | null {\n return this.metadata?.rotation ?? null;\n }\n\n /**\n * Local scale as [x, y, z].\n */\n get scale(): [number, number, number] | null {\n return this.metadata?.scale ?? null;\n }\n\n /**\n * Whether the object is visible (does not check parent chain).\n */\n get visible(): boolean {\n return this.metadata?.visible ?? false;\n }\n\n /**\n * The testId from userData.testId, if set.\n */\n get testId(): string | undefined {\n return this.metadata?.testId;\n }\n\n /**\n * World-space bounding box. Computed on-demand (Tier 2).\n */\n get bounds(): { min: [number, number, number]; max: [number, number, number] } | null {\n const inspection = this.inspect();\n return inspection?.bounds ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Interaction methods\n // -------------------------------------------------------------------------\n\n /**\n * Trigger a deterministic click on the linked 3D object.\n * Projects the object center to screen coordinates and dispatches pointer events.\n */\n click(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot click: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.click === 'function') {\n window.__R3F_DOM__.click(uuid);\n } else {\n console.warn('[react-three-dom] Cannot click: bridge API not initialized');\n }\n }\n\n /**\n * Trigger a deterministic hover on the linked 3D object.\n */\n hover(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot hover: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.hover === 'function') {\n window.__R3F_DOM__.hover(uuid);\n } else {\n console.warn('[react-three-dom] Cannot hover: bridge API not initialized');\n }\n }\n\n // -------------------------------------------------------------------------\n // Console-friendly output\n // -------------------------------------------------------------------------\n\n /**\n * Returns a readable string representation for console output.\n */\n override toString(): string {\n const tag = this.tagName.toLowerCase();\n const name = this.dataset.name ? ` name=\"${this.dataset.name}\"` : '';\n const testId = this.dataset.testId ? ` testId=\"${this.dataset.testId}\"` : '';\n const type = this.dataset.type ? ` type=\"${this.dataset.type}\"` : '';\n return `<${tag}${name}${testId}${type}>`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nlet _registered = false;\n\n/**\n * Register all custom elements (<three-scene>, <three-mesh>, etc.).\n * Safe to call multiple times — only registers once.\n *\n * @param store - The ObjectStore instance for element property lookups\n */\nexport function ensureCustomElements(store: ObjectStore): void {\n if (_registered) return;\n\n // Check if we're in a browser environment\n if (typeof customElements === 'undefined') return;\n\n _store = store;\n\n for (const tag of ALL_TAGS) {\n if (!customElements.get(tag)) {\n // Each tag gets its own class so instanceof checks work\n // and DevTools shows distinct element types\n const elementClass = class extends ThreeElement {};\n // Set displayName for debugging\n Object.defineProperty(elementClass, 'name', { value: `ThreeElement_${tag}` });\n customElements.define(tag, elementClass);\n }\n }\n\n _registered = true;\n}\n\n/**\n * Check if custom elements have been registered.\n */\nexport function isRegistered(): boolean {\n return _registered;\n}\n","import type { ObjectMetadata } from '../types';\n\n// ---------------------------------------------------------------------------\n// Attribute serialization: converts Tier 1 metadata to DOM attribute strings\n// ---------------------------------------------------------------------------\n\n/**\n * Attribute definitions: maps data-attribute names to extractor functions.\n * Each extractor takes metadata and returns a string value, or undefined\n * to skip setting the attribute (avoids empty attributes in DOM).\n */\nconst ATTRIBUTE_MAP: Record<string, (meta: ObjectMetadata) => string | undefined> = {\n 'data-uuid': (m) => m.uuid,\n 'data-name': (m) => m.name || undefined,\n 'data-type': (m) => m.type,\n 'data-visible': (m) => String(m.visible),\n 'data-test-id': (m) => m.testId,\n 'data-geometry': (m) => m.geometryType,\n 'data-material': (m) => m.materialType,\n 'data-position': (m) => serializeTuple(m.position),\n 'data-rotation': (m) => serializeTuple(m.rotation),\n 'data-scale': (m) => serializeTuple(m.scale),\n 'data-vertex-count': (m) => m.vertexCount !== undefined ? String(m.vertexCount) : undefined,\n 'data-triangle-count': (m) => m.triangleCount !== undefined ? String(m.triangleCount) : undefined,\n 'data-instance-count': (m) => m.instanceCount !== undefined ? String(m.instanceCount) : undefined,\n};\n\n/** All attribute names we manage (for diffing). */\nexport const MANAGED_ATTRIBUTES = Object.keys(ATTRIBUTE_MAP);\n\n// ---------------------------------------------------------------------------\n// Serialization helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a 3-element tuple to a compact string: \"1.23,4.56,7.89\"\n * Uses 2 decimal places for readability without excessive precision.\n */\nfunction serializeTuple(tuple: [number, number, number]): string {\n return `${round(tuple[0])},${round(tuple[1])},${round(tuple[2])}`;\n}\n\n/**\n * Round to 4 decimal places to avoid floating point noise\n * while preserving meaningful precision.\n */\nfunction round(n: number): string {\n // Avoid -0 display\n const rounded = Math.round(n * 10000) / 10000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute all attribute key-value pairs for a metadata object.\n * Returns a map of attribute name → value.\n * Attributes with undefined values are excluded.\n */\nexport function computeAttributes(meta: ObjectMetadata): Map<string, string> {\n const attrs = new Map<string, string>();\n for (const [key, extractor] of Object.entries(ATTRIBUTE_MAP)) {\n const value = extractor(meta);\n if (value !== undefined) {\n attrs.set(key, value);\n }\n }\n return attrs;\n}\n\n/**\n * Apply attributes to a DOM element, only writing those that changed.\n * Returns the number of attributes that were actually written (for perf tracking).\n *\n * @param element - The custom element to update\n * @param meta - Current Tier 1 metadata\n * @param prevAttrs - Previous attribute values (mutated in-place to reflect new state)\n * @returns Number of DOM setAttribute calls made\n */\nexport function applyAttributes(\n element: HTMLElement,\n meta: ObjectMetadata,\n prevAttrs: Map<string, string>,\n): number {\n let writeCount = 0;\n const newAttrs = computeAttributes(meta);\n\n // Set or update attributes that changed\n for (const [key, value] of newAttrs) {\n const prev = prevAttrs.get(key);\n if (prev !== value) {\n element.setAttribute(key, value);\n prevAttrs.set(key, value);\n writeCount++;\n }\n }\n\n // Remove attributes that no longer exist\n for (const key of prevAttrs.keys()) {\n if (!newAttrs.has(key)) {\n element.removeAttribute(key);\n prevAttrs.delete(key);\n writeCount++;\n }\n }\n\n return writeCount;\n}\n","import type { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { getTagForType } from './CustomElements';\nimport { applyAttributes } from './attributes';\n\n// ---------------------------------------------------------------------------\n// LRU tracking node (doubly-linked list for O(1) eviction)\n// ---------------------------------------------------------------------------\n\ninterface LRUNode {\n uuid: string;\n prev: LRUNode | null;\n next: LRUNode | null;\n}\n\n// ---------------------------------------------------------------------------\n// Materialized node record — tracks a DOM element and its cached attributes\n// ---------------------------------------------------------------------------\n\ninterface MaterializedNode {\n element: HTMLElement;\n /** Previously applied attribute values for diffing */\n prevAttrs: Map<string, string>;\n /** LRU tracking node */\n lruNode: LRUNode;\n}\n\n// ---------------------------------------------------------------------------\n// DomMirror — lazy DOM tree builder with LRU eviction\n// ---------------------------------------------------------------------------\n\n/**\n * Manages the parallel DOM tree that mirrors the Three.js scene graph.\n *\n * Key design for 100k-scale:\n * - ObjectStore holds Tier 1 metadata for ALL objects (cheap, ~120 bytes each)\n * - DomMirror only materializes DOM nodes for actively viewed/queried objects\n * - Max materialized DOM nodes capped (default 2,000) with LRU eviction\n * - DOM writes only happen for materialized nodes where values actually differ\n */\nexport class DomMirror {\n private _store: ObjectStore;\n private _rootElement: HTMLElement | null = null;\n\n // Materialized nodes indexed by uuid\n private _nodes = new Map<string, MaterializedNode>();\n\n // LRU doubly-linked list for eviction (head = most recently used, tail = least)\n private _lruHead: LRUNode | null = null;\n private _lruTail: LRUNode | null = null;\n private _lruSize = 0;\n\n // Max materialized DOM nodes\n private _maxNodes: number;\n\n // UUID → parent UUID mapping for DOM tree structure\n private _parentMap = new Map<string, string | null>();\n\n constructor(store: ObjectStore, maxNodes = 2000) {\n this._store = store;\n this._maxNodes = maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n /**\n * Set the root DOM element where the mirror tree will be appended.\n * Typically a hidden div: <div id=\"three-dom-root\" style=\"display:none\">\n */\n setRoot(rootElement: HTMLElement): void {\n this._rootElement = rootElement;\n }\n\n /**\n * Build the initial DOM tree from the scene.\n * Materializes the top 2 levels of the scene hierarchy.\n */\n buildInitialTree(scene: Object3D): void {\n if (!this._rootElement) return;\n this.materializeSubtree(scene.uuid, 2);\n }\n\n // -------------------------------------------------------------------------\n // Materialization\n // -------------------------------------------------------------------------\n\n /**\n * Create a DOM node for a single object.\n * If already materialized, touches the LRU and returns the existing element.\n */\n materialize(uuid: string): HTMLElement | null {\n // Already materialized — touch LRU and return\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n // Get metadata from the store\n const meta = this._store.getByUuid(uuid);\n if (!meta) return null;\n\n // Evict if at capacity\n if (this._lruSize >= this._maxNodes) {\n this._evictLRU();\n }\n\n // Create the custom element\n const tag = getTagForType(meta.type);\n const element = document.createElement(tag);\n\n // Style as positioned block so Chrome DevTools can highlight it.\n // Position/dimensions are updated per-frame by ThreeDom's projection sync.\n element.style.cssText = 'display:block;position:absolute;pointer-events:none;box-sizing:border-box;';\n\n // Apply all Tier 1 attributes\n const prevAttrs = new Map<string, string>();\n applyAttributes(element, meta, prevAttrs);\n\n // Create LRU node\n const lruNode: LRUNode = { uuid, prev: null, next: null };\n this._lruPush(lruNode);\n\n // Store the materialized node\n const node: MaterializedNode = { element, prevAttrs, lruNode };\n this._nodes.set(uuid, node);\n\n // Track parent for DOM structure\n this._parentMap.set(uuid, meta.parentUuid);\n\n // Insert into DOM tree\n this._insertIntoDom(uuid, meta.parentUuid, element);\n\n return element;\n }\n\n /**\n * Materialize a subtree starting from the given uuid, up to the specified depth.\n * depth=0 materializes just the node, depth=1 includes direct children, etc.\n */\n materializeSubtree(uuid: string, depth: number): void {\n this.materialize(uuid);\n\n if (depth <= 0) return;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return;\n\n for (const childUuid of meta.childrenUuids) {\n this.materializeSubtree(childUuid, depth - 1);\n }\n }\n\n /**\n * Remove a DOM node but keep JS metadata in the ObjectStore.\n * Called by LRU eviction or when an object is removed from the scene.\n */\n dematerialize(uuid: string): void {\n const node = this._nodes.get(uuid);\n if (!node) return;\n\n // Remove from DOM\n node.element.remove();\n\n // Remove from LRU\n this._lruRemove(node.lruNode);\n\n // Clean up\n this._nodes.delete(uuid);\n this._parentMap.delete(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Structural updates (called by Object3D.add/remove patch)\n // -------------------------------------------------------------------------\n\n /**\n * Called when a new object is added to the tracked scene.\n * Only materializes if the parent is already materialized (lazy expansion).\n */\n onObjectAdded(obj: Object3D): void {\n const parentUuid = obj.parent?.uuid;\n if (!parentUuid) return;\n\n // Only materialize if parent is already visible in the DOM tree\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n this.materialize(obj.uuid);\n }\n\n // Update parent's children in DOM (add the new child)\n if (parentNode) {\n const parentMeta = this._store.getByUuid(parentUuid);\n if (parentMeta) {\n applyAttributes(parentNode.element, parentMeta, parentNode.prevAttrs);\n }\n }\n }\n\n /**\n * Called when an object is removed from the tracked scene.\n * Dematerializes the object and all its descendants.\n */\n onObjectRemoved(obj: Object3D): void {\n // Dematerialize entire subtree\n obj.traverse((child) => {\n this.dematerialize(child.uuid);\n });\n }\n\n // -------------------------------------------------------------------------\n // Attribute sync (called per-frame by ThreeDom)\n // -------------------------------------------------------------------------\n\n /**\n * Sync Tier 1 attributes for an object if it's materialized.\n * No-op if the object has no materialized DOM node.\n * Returns the number of DOM writes performed.\n */\n syncAttributes(obj: Object3D): number {\n const node = this._nodes.get(obj.uuid);\n if (!node) return 0;\n\n const meta = this._store.getMetadata(obj);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n /**\n * Sync attributes by uuid (when you don't have the Object3D ref).\n */\n syncAttributesByUuid(uuid: string): number {\n const node = this._nodes.get(uuid);\n if (!node) return 0;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n // -------------------------------------------------------------------------\n // Querying\n // -------------------------------------------------------------------------\n\n /**\n * Get the root DOM element.\n */\n getRootElement(): HTMLElement | null {\n return this._rootElement;\n }\n\n /**\n * Get the materialized DOM element for an object, if it exists.\n */\n getElement(uuid: string): HTMLElement | null {\n const node = this._nodes.get(uuid);\n if (node) {\n this._lruTouch(node.lruNode);\n return node.element;\n }\n return null;\n }\n\n /**\n * Check if an object has a materialized DOM node.\n */\n isMaterialized(uuid: string): boolean {\n return this._nodes.has(uuid);\n }\n\n /**\n * Query the mirror DOM using a CSS selector.\n * Falls back to searching the ObjectStore if no materialized nodes match,\n * then materializes the matching objects.\n */\n querySelector(selector: string): HTMLElement | null {\n if (!this._rootElement) return null;\n\n // First try the already-materialized DOM\n const existing = this._rootElement.querySelector<HTMLElement>(selector);\n if (existing) return existing;\n\n // If not found, search by common patterns against the store\n const uuid = this._findUuidBySelector(selector);\n if (uuid) {\n return this.materialize(uuid);\n }\n\n return null;\n }\n\n /**\n * Query all matching elements in the mirror DOM.\n */\n querySelectorAll(selector: string): HTMLElement[] {\n if (!this._rootElement) return [];\n\n // Find all matching UUIDs from the store\n const uuids = this._findAllUuidsBySelector(selector);\n\n // Materialize each and collect elements\n const elements: HTMLElement[] = [];\n for (const uuid of uuids) {\n const el = this.materialize(uuid);\n if (el) elements.push(el);\n }\n\n return elements;\n }\n\n // -------------------------------------------------------------------------\n // Configuration\n // -------------------------------------------------------------------------\n\n /**\n * Set the maximum number of materialized DOM nodes.\n * If current count exceeds the new max, excess nodes are evicted immediately.\n */\n setMaxNodes(max: number): void {\n this._maxNodes = max;\n while (this._lruSize > this._maxNodes) {\n this._evictLRU();\n }\n }\n\n /** Current number of materialized DOM nodes. */\n getMaterializedCount(): number {\n return this._nodes.size;\n }\n\n /** Maximum allowed materialized DOM nodes. */\n getMaxNodes(): number {\n return this._maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /**\n * Remove all materialized DOM nodes and reset state.\n */\n dispose(): void {\n for (const [, node] of this._nodes) {\n node.element.remove();\n }\n this._nodes.clear();\n this._parentMap.clear();\n this._lruHead = null;\n this._lruTail = null;\n this._lruSize = 0;\n if (this._rootElement) {\n this._rootElement.innerHTML = '';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: DOM insertion\n // -------------------------------------------------------------------------\n\n /**\n * Insert a newly created element into the correct position in the DOM tree.\n */\n private _insertIntoDom(\n _uuid: string,\n parentUuid: string | null,\n element: HTMLElement,\n ): void {\n if (!this._rootElement) return;\n\n if (!parentUuid) {\n // Root-level object (scene) — append to mirror root\n this._rootElement.appendChild(element);\n return;\n }\n\n // Try to find materialized parent\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n parentNode.element.appendChild(element);\n } else {\n // Parent not materialized — append to mirror root as orphan\n // (will be reparented when parent is materialized)\n this._rootElement.appendChild(element);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Selector → UUID resolution\n // -------------------------------------------------------------------------\n\n /**\n * Parse common CSS selector patterns and resolve to a uuid from the store.\n * Supports:\n * [data-test-id=\"value\"]\n * [data-name=\"value\"]\n * [data-uuid=\"value\"]\n * three-mesh, three-light, etc. (by tag/type)\n */\n private _findUuidBySelector(selector: string): string | null {\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-uuid=\"value\"]\n const uuidMatch = selector.match(/\\[data-uuid=[\"']([^\"']+)[\"']\\]/);\n if (uuidMatch) {\n const meta = this._store.getByUuid(uuidMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n return metas.length > 0 ? metas[0].uuid : null;\n }\n\n return null;\n }\n\n /**\n * Find all UUIDs matching a selector pattern.\n */\n private _findAllUuidsBySelector(selector: string): string[] {\n const uuids: string[] = [];\n\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n if (meta) uuids.push(meta.uuid);\n return uuids;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n for (const m of metas) uuids.push(m.uuid);\n return uuids;\n }\n\n // Tag-based: three-mesh, three-light, etc.\n // Resolve by iterating all objects and filtering by type\n const tagMatch = selector.match(/^(three-(?:scene|group|mesh|light|camera|object))$/);\n if (tagMatch) {\n const targetTag = tagMatch[1];\n const allObjects = this._store.getFlatList();\n for (const obj of allObjects) {\n const meta = this._store.getMetadata(obj);\n if (meta && getTagForType(meta.type) === targetTag) {\n uuids.push(meta.uuid);\n }\n }\n return uuids;\n }\n\n return uuids;\n }\n\n // -------------------------------------------------------------------------\n // Private: LRU doubly-linked list operations\n // -------------------------------------------------------------------------\n\n /** Add a node to the front (most recently used). */\n private _lruPush(node: LRUNode): void {\n node.prev = null;\n node.next = this._lruHead;\n if (this._lruHead) {\n this._lruHead.prev = node;\n }\n this._lruHead = node;\n if (!this._lruTail) {\n this._lruTail = node;\n }\n this._lruSize++;\n }\n\n /** Remove a node from the list. */\n private _lruRemove(node: LRUNode): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this._lruHead = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this._lruTail = node.prev;\n }\n node.prev = null;\n node.next = null;\n this._lruSize--;\n }\n\n /** Move a node to the front (most recently used). */\n private _lruTouch(node: LRUNode): void {\n if (this._lruHead === node) return; // already at front\n this._lruRemove(node);\n this._lruPush(node);\n }\n\n /** Evict the least recently used node. */\n private _evictLRU(): void {\n if (!this._lruTail) return;\n const uuid = this._lruTail.uuid;\n this.dematerialize(uuid);\n }\n}\n","import { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { DomMirror } from '../mirror/DomMirror';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// Object3D.add / Object3D.remove monkey-patch\n//\n// Intercepts structural changes (add/remove children) on Object3D so the\n// ObjectStore and DomMirror are updated instantly (event-driven, O(1) per\n// change) without requiring per-frame traversal.\n//\n// Scoping: only fires for objects that belong to a tracked scene.\n// This avoids interfering with other Three.js scenes on the same page.\n// ---------------------------------------------------------------------------\n\n/** Tracks whether the patch has been applied. */\nlet _patched = false;\n\n/** Original methods saved for restoration. */\nlet _originalAdd: typeof Object3D.prototype.add | null = null;\nlet _originalRemove: typeof Object3D.prototype.remove | null = null;\n\n/** Active store/mirror pairs (supports multiple tracked scenes). */\nconst _activePairs: Array<{ store: ObjectStore; mirror: DomMirror }> = [];\n\n/**\n * Find the store/mirror pair that tracks the scene containing this object.\n * Walks up the parent chain to check each ancestor against tracked roots.\n */\nfunction findTrackingPair(\n obj: Object3D,\n): { store: ObjectStore; mirror: DomMirror } | null {\n for (const pair of _activePairs) {\n if (pair.store.isInTrackedScene(obj)) {\n return pair;\n }\n }\n return null;\n}\n\n/**\n * Register an object and all its descendants into the store and mirror.\n */\nfunction registerSubtree(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n): void {\n obj.traverse((child) => {\n if (!store.has(child)) {\n store.register(child);\n mirror.onObjectAdded(child);\n }\n });\n}\n\n/**\n * Patch Object3D.prototype.add and Object3D.prototype.remove to intercept\n * structural changes for tracked scenes.\n *\n * @param store - The ObjectStore managing scene metadata\n * @param mirror - The DomMirror managing the parallel DOM tree\n * @returns A cleanup function that unregisters this store/mirror pair\n */\nexport function patchObject3D(\n store: ObjectStore,\n mirror: DomMirror,\n): () => void {\n // Register this store/mirror pair\n _activePairs.push({ store, mirror });\n\n // Only patch the prototype once (supports multiple store/mirror pairs)\n if (!_patched) {\n r3fLog('patch', 'Patching Object3D.prototype.add and .remove');\n _originalAdd = Object3D.prototype.add;\n _originalRemove = Object3D.prototype.remove;\n\n Object3D.prototype.add = function patchedAdd(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Call the original add first\n _originalAdd!.call(this, ...objects);\n\n // Check if this parent belongs to a tracked scene\n const pair = findTrackingPair(this);\n if (pair) {\n for (const obj of objects) {\n // Skip if it's the object adding itself (Three.js guard)\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedAdd: \"${obj.name || obj.type}\" added to \"${this.name || this.type}\"`);\n registerSubtree(obj, pair.store, pair.mirror);\n } catch (err) {\n r3fLog('patch', `patchedAdd: failed to register \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n return this;\n };\n\n Object3D.prototype.remove = function patchedRemove(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Check tracking BEFORE removal (parent is still set)\n const pair = findTrackingPair(this);\n\n // Notify store/mirror before actual removal\n if (pair) {\n for (const obj of objects) {\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedRemove: \"${obj.name || obj.type}\" removed from \"${this.name || this.type}\"`);\n\n // Notify mirror first (it needs to traverse for DOM cleanup)\n pair.mirror.onObjectRemoved(obj);\n\n // Then unregister from store (traverses descendants)\n obj.traverse((child) => {\n pair.store.unregister(child);\n });\n } catch (err) {\n r3fLog('patch', `patchedRemove: failed to unregister \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n // Call the original remove\n _originalRemove!.call(this, ...objects);\n\n return this;\n };\n\n _patched = true;\n }\n\n // Return cleanup function\n return () => {\n const idx = _activePairs.findIndex(\n (p) => p.store === store && p.mirror === mirror,\n );\n if (idx !== -1) {\n _activePairs.splice(idx, 1);\n }\n\n // If no more active pairs, restore original methods\n if (_activePairs.length === 0 && _patched) {\n restoreObject3D();\n }\n };\n}\n\n/**\n * Restore the original Object3D.prototype.add and remove methods.\n * Called automatically when the last store/mirror pair is removed.\n * Can also be called manually for testing.\n */\nexport function restoreObject3D(): void {\n if (!_patched) return;\n r3fLog('patch', 'Restoring original Object3D.prototype.add and .remove');\n\n if (_originalAdd) {\n Object3D.prototype.add = _originalAdd;\n _originalAdd = null;\n }\n if (_originalRemove) {\n Object3D.prototype.remove = _originalRemove;\n _originalRemove = null;\n }\n\n _patched = false;\n}\n\n/**\n * Check if Object3D prototype is currently patched.\n */\nexport function isPatched(): boolean {\n return _patched;\n}\n","import type { ObjectStore } from '../store/ObjectStore';\nimport type { ObjectMetadata, SceneSnapshot, SnapshotNode } from '../types';\n\n// ---------------------------------------------------------------------------\n// Snapshot: builds a structured JSON tree from the ObjectStore\n//\n// Reads exclusively from Tier 1 metadata — no Three.js object access,\n// no DOM reads. Cost scales linearly with object count but is cheap\n// since it's just Map lookups and object construction.\n// ---------------------------------------------------------------------------\n\n/**\n * Build a recursive SnapshotNode tree from a metadata entry.\n */\nfunction buildNodeTree(store: ObjectStore, meta: ObjectMetadata): SnapshotNode {\n const children: SnapshotNode[] = [];\n\n for (const childUuid of meta.childrenUuids) {\n const childMeta = store.getByUuid(childUuid);\n if (childMeta) {\n children.push(buildNodeTree(store, childMeta));\n }\n }\n\n const node: SnapshotNode = {\n uuid: meta.uuid,\n name: meta.name,\n type: meta.type,\n testId: meta.testId,\n visible: meta.visible,\n position: [...meta.position],\n rotation: [...meta.rotation],\n scale: [...meta.scale],\n children,\n };\n\n if (meta.geometryType) node.geometryType = meta.geometryType;\n if (meta.materialType) node.materialType = meta.materialType;\n if (meta.vertexCount != null) node.vertexCount = meta.vertexCount;\n if (meta.triangleCount != null) node.triangleCount = meta.triangleCount;\n if (meta.instanceCount != null) node.instanceCount = meta.instanceCount;\n\n return node;\n}\n\n/**\n * Find the root node (scene) in the store.\n * The root is the object whose parentUuid is null.\n */\nfunction findRoot(store: ObjectStore): ObjectMetadata | null {\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta && meta.parentUuid === null) {\n return meta;\n }\n }\n return null;\n}\n\n/**\n * Create a full scene snapshot from the ObjectStore.\n *\n * Returns a structured JSON tree built entirely from Tier 1 cached metadata.\n * No Three.js objects or DOM nodes are accessed.\n *\n * @example\n * ```ts\n * const snap = createSnapshot(store);\n * console.log(snap.objectCount); // 1234\n * console.log(snap.tree.children[0].name); // \"Furniture\"\n * ```\n */\nexport function createSnapshot(store: ObjectStore): SceneSnapshot {\n const rootMeta = findRoot(store);\n\n const tree: SnapshotNode = rootMeta\n ? buildNodeTree(store, rootMeta)\n : {\n uuid: '',\n name: 'empty',\n type: 'Scene',\n visible: true,\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n children: [],\n };\n\n return {\n timestamp: Date.now(),\n objectCount: store.getCount(),\n tree,\n };\n}\n\n/**\n * Create a flat snapshot — an array of all object metadata without tree structure.\n * Useful for searching/filtering without recursion.\n *\n * @example\n * ```ts\n * const flat = createFlatSnapshot(store);\n * const meshes = flat.objects.filter(m => m.type === 'Mesh');\n * ```\n */\nexport function createFlatSnapshot(store: ObjectStore): {\n timestamp: number;\n objectCount: number;\n objects: ObjectMetadata[];\n} {\n const objects: ObjectMetadata[] = [];\n const allObjects = store.getFlatList();\n\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta) {\n objects.push({ ...meta });\n }\n }\n\n return {\n timestamp: Date.now(),\n objectCount: objects.length,\n objects,\n };\n}\n","import {\n Object3D,\n Camera,\n Vector3,\n Box3,\n Frustum,\n Matrix4,\n} from 'three';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Screen-space coordinates in CSS pixels relative to the canvas. */\nexport interface ScreenPoint {\n /** X coordinate in CSS pixels, left = 0. */\n x: number;\n /** Y coordinate in CSS pixels, top = 0. */\n y: number;\n}\n\n/** Canvas dimensions in CSS pixels. */\nexport interface CanvasSize {\n width: number;\n height: number;\n}\n\n/** Result of a projection attempt. */\nexport interface ProjectionResult {\n /** The screen-space point (CSS pixels relative to the canvas element). */\n point: ScreenPoint;\n /** Which strategy produced the result. */\n strategy: 'center' | 'corner' | 'face-center' | 'fallback-origin';\n /** NDC coordinates (-1..+1 range) for the projected point. */\n ndc: { x: number; y: number };\n}\n\n// ---------------------------------------------------------------------------\n// Reusable temporaries (avoids GC pressure in hot paths)\n// ---------------------------------------------------------------------------\n\nconst _vec3 = /* @__PURE__ */ new Vector3();\nconst _vec3B = /* @__PURE__ */ new Vector3();\nconst _box3 = /* @__PURE__ */ new Box3();\nconst _frustum = /* @__PURE__ */ new Frustum();\nconst _projMatrix = /* @__PURE__ */ new Matrix4();\n\n// ---------------------------------------------------------------------------\n// NDC → screen helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a Vector3 in NDC (after `vector.project(camera)`) to CSS-pixel\n * coordinates relative to the canvas.\n *\n * NDC convention: x ∈ [-1, +1], y ∈ [-1, +1], z ∈ [-1, +1]\n * Screen convention: x ∈ [0, width], y ∈ [0, height] (top-left origin)\n */\nfunction ndcToScreen(ndc: Vector3, size: CanvasSize): ScreenPoint {\n return {\n x: ((ndc.x + 1) / 2) * size.width,\n y: ((-ndc.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Returns true if the NDC coordinate is within the visible viewport.\n * Z check: z ∈ (-1, 1) means in front of camera and within far plane.\n */\nfunction isNdcOnScreen(ndc: Vector3): boolean {\n return (\n ndc.x >= -1 && ndc.x <= 1 &&\n ndc.y >= -1 && ndc.y <= 1 &&\n ndc.z >= -1 && ndc.z <= 1\n );\n}\n\n/**\n * Returns true if the NDC coordinate is in front of the camera.\n * After `vector.project(camera)`, z < 1 means in front of the camera.\n * A point behind the camera gets z > 1.\n */\nfunction isInFrontOfCamera(ndc: Vector3): boolean {\n return ndc.z >= -1 && ndc.z <= 1;\n}\n\n// ---------------------------------------------------------------------------\n// Candidate point generators\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the world-space bounding box center of an Object3D.\n * Falls back to the object's world position if the bbox is empty.\n */\nfunction getWorldCenter(obj: Object3D): Vector3 {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _vec3;\n }\n _box3.getCenter(_vec3);\n return _vec3;\n}\n\n/**\n * Get the 8 corners of the world-space bounding box.\n * Returns an empty array if the bbox is degenerate.\n */\nfunction getBboxCorners(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const { min, max } = _box3;\n return [\n new Vector3(min.x, min.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(max.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(max.x, max.y, max.z),\n ];\n}\n\n/**\n * Get the 6 face centers of the world-space bounding box.\n * These are better click targets than corners for many geometries.\n */\nfunction getBboxFaceCenters(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const center = _box3.getCenter(new Vector3());\n const { min, max } = _box3;\n\n return [\n new Vector3(min.x, center.y, center.z), // -X face\n new Vector3(max.x, center.y, center.z), // +X face\n new Vector3(center.x, min.y, center.z), // -Y face\n new Vector3(center.x, max.y, center.z), // +Y face\n new Vector3(center.x, center.y, min.z), // -Z face\n new Vector3(center.x, center.y, max.z), // +Z face\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Core projection\n// ---------------------------------------------------------------------------\n\n/**\n * Try to project a single world-space point to screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction tryProjectPoint(\n worldPoint: Vector3,\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number }; ndcZ: number; onScreen: boolean } | null {\n // Clone to avoid mutating the input\n _vec3B.copy(worldPoint).project(camera);\n\n if (!isInFrontOfCamera(_vec3B)) return null;\n\n const screen = ndcToScreen(_vec3B, size);\n return {\n screen,\n ndc: { x: _vec3B.x, y: _vec3B.y },\n ndcZ: _vec3B.z,\n onScreen: isNdcOnScreen(_vec3B),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Project a 3D object to screen coordinates using a multi-strategy approach:\n *\n * 1. **Center**: Try the bounding box center (most natural click target).\n * 2. **Face centers**: Try the 6 face centers (better for large/flat objects).\n * 3. **Corners**: Try the 8 bbox corners (catches partially visible objects).\n * 4. **Fallback origin**: Try the object's world position (lights, empty groups).\n *\n * For each strategy, we prefer points that are both on-screen AND closest to\n * the viewport center (most reliable for event dispatch).\n *\n * Returns `null` if no part of the object is visible on screen.\n */\nexport function projectToScreen(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ProjectionResult | null {\n // Ensure world matrices are up to date\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n // Strategy 1: Bounding box center\n const center = getWorldCenter(obj);\n const centerResult = tryProjectPoint(center, camera, size);\n\n if (centerResult && centerResult.onScreen) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Strategy 2: Face centers — better fallback for large objects\n const faceCenters = getBboxFaceCenters(obj);\n const faceResult = findBestOnScreenPoint(faceCenters, camera, size);\n if (faceResult) {\n return {\n point: faceResult.screen,\n strategy: 'face-center',\n ndc: faceResult.ndc,\n };\n }\n\n // Strategy 3: Bbox corners — catches partially visible objects\n const corners = getBboxCorners(obj);\n const cornerResult = findBestOnScreenPoint(corners, camera, size);\n if (cornerResult) {\n return {\n point: cornerResult.screen,\n strategy: 'corner',\n ndc: cornerResult.ndc,\n };\n }\n\n // Strategy 4: Fallback to world position (lights, helpers, empty groups)\n obj.getWorldPosition(_vec3);\n const originResult = tryProjectPoint(_vec3.clone(), camera, size);\n if (originResult && originResult.onScreen) {\n return {\n point: originResult.screen,\n strategy: 'fallback-origin',\n ndc: originResult.ndc,\n };\n }\n\n // If center projected but was off-screen, still return it as a best-effort\n // (useful for drag targets that are partially off-screen)\n if (centerResult) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Object is entirely behind the camera or degenerate\n return null;\n}\n\n/**\n * From a list of candidate world-space points, find the one that projects\n * on-screen and is closest to the viewport center (most reliable dispatch).\n */\nfunction findBestOnScreenPoint(\n candidates: Vector3[],\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number } } | null {\n let bestResult: { screen: ScreenPoint; ndc: { x: number; y: number } } | null = null;\n let bestDistSq = Infinity;\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n for (const point of candidates) {\n const result = tryProjectPoint(point, camera, size);\n if (!result || !result.onScreen) continue;\n\n // Distance from viewport center — prefer more central points\n const dx = result.screen.x - halfW;\n const dy = result.screen.y - halfH;\n const distSq = dx * dx + dy * dy;\n\n if (distSq < bestDistSq) {\n bestDistSq = distSq;\n bestResult = { screen: result.screen, ndc: result.ndc };\n }\n }\n\n return bestResult;\n}\n\n// ---------------------------------------------------------------------------\n// Frustum visibility check\n// ---------------------------------------------------------------------------\n\n/**\n * Check whether any part of an Object3D is within the camera frustum.\n * Uses the bounding box intersection test (fast, conservative).\n */\nexport function isInFrustum(obj: Object3D, camera: Camera): boolean {\n camera.updateWorldMatrix(true, false);\n obj.updateWorldMatrix(true, false);\n\n _projMatrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n _frustum.setFromProjectionMatrix(_projMatrix);\n\n _box3.setFromObject(obj);\n\n // Empty bbox (lights, empties) — fall back to position check\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _frustum.containsPoint(_vec3);\n }\n\n return _frustum.intersectsBox(_box3);\n}\n\n// ---------------------------------------------------------------------------\n// Screen-to-world projection (for drag deltas)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a screen-space delta (CSS pixels) to a world-space displacement\n * vector on the plane perpendicular to the camera at the given depth.\n *\n * Used by drag3D to convert pixel movements to 3D movements that feel\n * natural regardless of camera position/zoom.\n */\nexport function screenDeltaToWorld(\n dx: number,\n dy: number,\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): Vector3 {\n // Get the object's depth in NDC\n obj.getWorldPosition(_vec3);\n _vec3.project(camera);\n const depth = _vec3.z;\n\n // Unproject two points at the same depth to get world-space scale\n const start = new Vector3(0, 0, depth).unproject(camera);\n const right = new Vector3(2 / size.width, 0, depth).unproject(camera);\n const up = new Vector3(0, -2 / size.height, depth).unproject(camera);\n\n // World-space pixels per CSS pixel\n const rightDir = right.sub(start);\n const upDir = up.sub(start);\n\n return new Vector3()\n .addScaledVector(rightDir, dx)\n .addScaledVector(upDir, dy);\n}\n\n// ---------------------------------------------------------------------------\n// Multi-point projection (for assertions / testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Project multiple sample points of an object to screen space.\n * Returns all on-screen points, useful for assertions like\n * \"object covers at least 50px² of screen area\".\n */\nexport function projectAllSamplePoints(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint[] {\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n const points: ScreenPoint[] = [];\n\n // Collect all candidate world-space points\n const candidates: Vector3[] = [];\n\n // Center\n candidates.push(getWorldCenter(obj).clone());\n\n // Face centers\n candidates.push(...getBboxFaceCenters(obj));\n\n // Corners\n candidates.push(...getBboxCorners(obj));\n\n // Project each\n for (const wsPt of candidates) {\n const result = tryProjectPoint(wsPt, camera, size);\n if (result && result.onScreen) {\n points.push(result.screen);\n }\n }\n\n return points;\n}\n","import type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// Synthetic PointerEvent dispatch\n//\n// Dispatches DOM events on the canvas element at the projected screen\n// coordinates, matching the exact sequence that a real browser interaction\n// would produce. R3F's event system listens on the canvas, so these\n// synthetic events flow through the full pointer → raycaster pipeline.\n// ---------------------------------------------------------------------------\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextPointerId = 1000;\n\n/** Get a fresh pointerId for each interaction sequence. */\nfunction allocPointerId(): number {\n return _nextPointerId++;\n}\n\n/**\n * Compute clientX/clientY from a canvas-relative ScreenPoint.\n * Events need clientX/clientY (relative to viewport), not the canvas.\n */\nfunction toClientCoords(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): { clientX: number; clientY: number } {\n const rect = canvas.getBoundingClientRect();\n return {\n clientX: rect.left + point.x,\n clientY: rect.top + point.y,\n };\n}\n\n/**\n * Build a PointerEvent init object with correct coordinates and metadata.\n */\nfunction makePointerInit(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n pointerId: number,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const { clientX, clientY } = toClientCoords(canvas, point);\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType: 'mouse',\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: 0.5,\n ...overrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click\n *\n * This matches what R3F's event system expects. The canvas is the event\n * target because R3F attaches its listeners to the canvas element.\n */\nexport function dispatchClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 0,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Hover sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a hover sequence on the canvas at the given screen point.\n *\n * Sequence: pointermove → pointerover → pointerenter\n *\n * R3F translates pointermove into onPointerMove/onPointerOver/onPointerEnter\n * via its internal raycaster. We dispatch the raw DOM events and let R3F\n * do the rest.\n */\nexport function dispatchHover(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n const pointerId = allocPointerId();\n const init = makePointerInit(canvas, point, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerover', init));\n canvas.dispatchEvent(new PointerEvent('pointerenter', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Drag sequence\n// ---------------------------------------------------------------------------\n\n/** Options for a drag interaction. */\nexport interface DragOptions {\n /** Number of intermediate pointermove steps. Default: 10 */\n steps?: number;\n /** Delay between steps in ms (for requestAnimationFrame pacing). Default: 0 */\n stepDelayMs?: number;\n}\n\n/**\n * Dispatch a full drag sequence from `start` to `end` on the canvas.\n *\n * Sequence: pointerdown → N × pointermove (interpolated) → pointerup\n *\n * Returns a Promise that resolves when the drag is complete.\n * The async nature allows optional frame-pacing via stepDelayMs.\n */\nexport async function dispatchDrag(\n canvas: HTMLCanvasElement,\n start: ScreenPoint,\n end: ScreenPoint,\n options: DragOptions = {},\n): Promise<void> {\n const { steps = 10, stepDelayMs = 0 } = options;\n const pointerId = allocPointerId();\n\n // Pointer down at start\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, start, pointerId)),\n );\n });\n\n // Interpolate intermediate moves\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const intermediate: ScreenPoint = {\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n };\n\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makePointerInit(canvas, intermediate, pointerId),\n ),\n );\n }\n\n // Pointer up at end\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, end, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Double-click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full double-click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * R3F translates the `dblclick` DOM event into `onDoubleClick` on the hit object.\n */\nexport function dispatchDoubleClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n const coords = toClientCoords(canvas, point);\n\n // First click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 1,\n }),\n );\n\n // Second click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n\n // dblclick\n canvas.dispatchEvent(\n new MouseEvent('dblclick', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Context menu (right-click) sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a right-click / context menu sequence on the canvas.\n *\n * Sequence: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * R3F translates the `contextmenu` DOM event into `onContextMenu`.\n */\nexport function dispatchContextMenu(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerdown',\n makePointerInit(canvas, point, pointerId, { button: 2, buttons: 2 }),\n ),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, {\n button: 2,\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('contextmenu', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Wheel event\n// ---------------------------------------------------------------------------\n\n/** Options for a wheel dispatch. */\nexport interface WheelOptions {\n /** Vertical scroll delta (positive = scroll down). Default: 100 */\n deltaY?: number;\n /** Horizontal scroll delta. Default: 0 */\n deltaX?: number;\n /** DOM_DELTA_PIXEL (0), DOM_DELTA_LINE (1), or DOM_DELTA_PAGE (2). Default: 0 */\n deltaMode?: number;\n}\n\n/**\n * Dispatch a wheel event on the canvas at the given screen point.\n *\n * R3F translates the `wheel` DOM event into `onWheel` on the hit object.\n */\nexport function dispatchWheel(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n options: WheelOptions = {},\n): void {\n const { deltaY = 100, deltaX = 0, deltaMode = 0 } = options;\n const coords = toClientCoords(canvas, point);\n\n canvas.dispatchEvent(\n new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n ...coords,\n deltaX,\n deltaY,\n deltaZ: 0,\n deltaMode,\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pointer miss (click on empty space)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a click on the canvas at a point where no meshes are present.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler when\n * a click lands on empty space. This dispatches a click at a configurable\n * point (default: top-left corner, which is very unlikely to hit a mesh).\n *\n * @param canvas The canvas element\n * @param point Optional specific screen point. Default: { x: 1, y: 1 }\n */\nexport function dispatchPointerMiss(\n canvas: HTMLCanvasElement,\n point: ScreenPoint = { x: 1, y: 1 },\n): void {\n dispatchClick(canvas, point);\n}\n\n// ---------------------------------------------------------------------------\n// Unhover (pointer leave)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch an unhover sequence — moves the pointer off-canvas.\n * Useful for cleaning up hover state between interactions.\n */\nexport function dispatchUnhover(canvas: HTMLCanvasElement): void {\n const pointerId = allocPointerId();\n const offScreen: ScreenPoint = { x: -9999, y: -9999 };\n const init = makePointerInit(canvas, offScreen, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerout', init));\n canvas.dispatchEvent(new PointerEvent('pointerleave', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Guard against `releasePointerCapture` throwing when no pointer capture\n * is active. Libraries like @react-three/drei register global pointerup\n * handlers that call `releasePointerCapture`, which throws a `NotFoundError`\n * when the pointer was never captured (as with our synthetic events).\n *\n * This wrapper patches `Element.prototype.releasePointerCapture` for the\n * duration of `fn()` so that the `NotFoundError` is silently swallowed.\n */\nfunction withSafePointerCapture<T>(fn: () => T): T {\n const original = Element.prototype.releasePointerCapture;\n Element.prototype.releasePointerCapture = function safeRelease(\n this: Element,\n pointerId: number,\n ) {\n try {\n original.call(this, pointerId);\n } catch {\n // Swallow NotFoundError — no active pointer with the given id\n }\n };\n try {\n return fn();\n } finally {\n Element.prototype.releasePointerCapture = original;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Scene,\n} from 'three';\nimport type { ScreenPoint, CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Raycast hit verification\n//\n// After dispatching a synthetic event at projected screen coordinates,\n// cast a ray to verify the intended object is actually the first hit.\n// This catches occlusion and provides clear error messages.\n// ---------------------------------------------------------------------------\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _ndc = /* @__PURE__ */ new Vector2();\n\n/** Result of a raycast verification. */\nexport interface RaycastResult {\n /** Whether the intended object was hit. */\n hit: boolean;\n /** If not hit, the object that was hit instead (occluder). */\n occluder?: Object3D;\n /** Name or testId of the occluder, for error messages. */\n occluderLabel?: string;\n}\n\n/**\n * Convert a screen-space point to NDC coordinates for raycasting.\n */\nfunction screenToNdc(point: ScreenPoint, size: CanvasSize): Vector2 {\n _ndc.set(\n (point.x / size.width) * 2 - 1,\n -(point.y / size.height) * 2 + 1,\n );\n return _ndc;\n}\n\n/**\n * Get a human-readable label for an Object3D (for error messages).\n */\nfunction getObjectLabel(obj: Object3D): string {\n const testId = obj.userData?.testId;\n if (testId) return `testId=\"${testId}\"`;\n if (obj.name) return `name=\"${obj.name}\"`;\n return `uuid=\"${obj.uuid.slice(0, 8)}…\"`;\n}\n\n/**\n * Walk up the parent chain to check if `candidate` is the target or\n * a descendant of the target. This is needed because raycaster returns\n * the specific sub-mesh (e.g. a merged geometry child) rather than\n * the logical parent group.\n */\nfunction isTargetOrDescendant(candidate: Object3D, target: Object3D): boolean {\n let current: Object3D | null = candidate;\n while (current) {\n if (current === target) return true;\n current = current.parent;\n }\n return false;\n}\n\n/**\n * Find the scene root by walking up the parent chain.\n */\nfunction findScene(obj: Object3D): Scene | null {\n let current: Object3D | null = obj;\n while (current) {\n if ((current as Scene).isScene) return current as Scene;\n current = current.parent;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Verify that a raycast from the given screen point hits the intended object.\n *\n * Returns a RaycastResult indicating success or failure with details about\n * what was hit instead (for useful error messages).\n *\n * @param point Screen-space coordinates (CSS pixels relative to canvas)\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHit(\n point: ScreenPoint,\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n const scene = findScene(target);\n if (!scene) {\n return { hit: false, occluderLabel: 'object not in scene' };\n }\n\n const ndc = screenToNdc(point, size);\n _raycaster.setFromCamera(ndc, camera);\n\n // Raycast against the entire scene\n const intersections = _raycaster.intersectObjects(scene.children, true);\n\n if (intersections.length === 0) {\n // No hits at all — object might be transparent, or a light/helper\n // For non-mesh objects (lights, cameras), this is expected\n return { hit: true };\n }\n\n // Check if the first hit is our target (or a child of our target)\n const firstHit = intersections[0].object;\n if (isTargetOrDescendant(firstHit, target)) {\n return { hit: true };\n }\n\n // Check if our target appears anywhere in the intersections\n // (it might be behind something but still hit)\n const targetHit = intersections.find((i) =>\n isTargetOrDescendant(i.object, target),\n );\n\n if (targetHit) {\n // Target was hit but is behind another object\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n }\n\n // Target was not hit at all at this point\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n}\n\n/**\n * Verify a hit, trying multiple sample points if the first fails.\n * This is more robust than single-point verification for objects\n * that are partially occluded.\n *\n * @param points Array of screen-space points to try\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHitMultiPoint(\n points: ScreenPoint[],\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n let lastResult: RaycastResult = { hit: false };\n\n for (const point of points) {\n const result = verifyRaycastHit(point, target, camera, size);\n if (result.hit) return result;\n lastResult = result;\n }\n\n return lastResult;\n}\n","import type { Object3D, Camera, WebGLRenderer } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Shared resolution helpers for interaction modules\n// ---------------------------------------------------------------------------\n\n/** Cached references to the current R3F state (set by ThreeDom). */\nlet _store: ObjectStore | null = null;\nlet _camera: Camera | null = null;\nlet _gl: WebGLRenderer | null = null;\nlet _size: CanvasSize | null = null;\n\n/**\n * Set the current R3F state references. Called by ThreeDom during setup\n * and on every frame to keep camera/size current.\n */\nexport function setInteractionState(\n store: ObjectStore,\n camera: Camera,\n gl: WebGLRenderer,\n size: CanvasSize,\n): void {\n _store = store;\n _camera = camera;\n _gl = gl;\n _size = size;\n}\n\n/** Clear all interaction state (called on cleanup). */\nexport function clearInteractionState(): void {\n _store = null;\n _camera = null;\n _gl = null;\n _size = null;\n}\n\n/** Get the current store, or throw if not initialized. */\nexport function getStore(): ObjectStore {\n if (!_store) {\n throw new Error(\n '[react-three-dom] Interaction state not initialized. Is <ThreeDom> mounted?',\n );\n }\n return _store;\n}\n\n/** Get the current camera, or throw. */\nexport function getCamera(): Camera {\n if (!_camera) {\n throw new Error(\n '[react-three-dom] Camera not available. Is <ThreeDom> mounted?',\n );\n }\n return _camera;\n}\n\n/** Get the current WebGL renderer, or throw. */\nexport function getRenderer(): WebGLRenderer {\n if (!_gl) {\n throw new Error(\n '[react-three-dom] Renderer not available. Is <ThreeDom> mounted?',\n );\n }\n return _gl;\n}\n\n/** Get the current canvas size, or throw. */\nexport function getCanvasSize(): CanvasSize {\n if (!_size) {\n throw new Error(\n '[react-three-dom] Canvas size not available. Is <ThreeDom> mounted?',\n );\n }\n return _size;\n}\n\n/**\n * Resolve a testId or uuid to a live Object3D reference.\n * Throws a descriptive error if the object is not found.\n */\nexport function resolveObject(idOrUuid: string): Object3D {\n const store = getStore();\n const obj = store.getObject3D(idOrUuid);\n if (!obj) {\n throw new Error(\n `[react-three-dom] Object \"${idOrUuid}\" not found. ` +\n `Check that the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`,\n );\n }\n return obj;\n}\n","import { projectToScreen } from './projection';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// click3D — deterministic click on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointerdown → pointerup → click on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for click3D. */\nexport interface Click3DOptions {\n /**\n * Whether to verify the click hit via raycast.\n * Set to false for non-mesh objects (lights, cameras, groups).\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a click3D operation. */\nexport interface Click3DResult {\n /** Whether the click was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the click was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically click a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic click event\n * on the canvas at the projected coordinates, and optionally verifies\n * the click hit the intended object via raycasting.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Click options\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // From the global API\n * window.__R3F_DOM__.click('chair-primary');\n *\n * // With verification disabled (for lights, cameras)\n * click3D('sun-light', { verify: false });\n * ```\n */\nexport function click3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('click', `click3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] click3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch click on canvas\n const canvas = gl.domElement;\n dispatchClick(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] click3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead. ` +\n `The object may be occluded.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// doubleClick3D — deterministic double-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically double-click a 3D object by its testId or uuid.\n *\n * Dispatches the full double-click sequence:\n * pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * Triggers R3F's `onDoubleClick` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function doubleClick3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchDoubleClick(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// contextMenu3D — deterministic right-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically right-click a 3D object by its testId or uuid.\n *\n * Dispatches: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * Triggers R3F's `onContextMenu` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function contextMenu3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchContextMenu(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","import { projectToScreen } from './projection';\nimport { dispatchHover, dispatchUnhover } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// hover3D — deterministic hover on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointermove → pointerover → pointerenter on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for hover3D. */\nexport interface Hover3DOptions {\n /**\n * Whether to verify the hover hit via raycast.\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a hover3D operation. */\nexport interface Hover3DResult {\n /** Whether the hover was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the hover was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically hover over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic hover event\n * sequence on the canvas, and optionally verifies the hit.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Hover options\n * @returns Hover result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * window.__R3F_DOM__.hover('chair-primary');\n * ```\n */\nexport function hover3D(\n idOrUuid: string,\n options: Hover3DOptions = {},\n): Hover3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('hover', `hover3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] hover3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch hover on canvas\n const canvas = gl.domElement;\n dispatchHover(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] hover3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Clear hover state by moving the pointer off-canvas.\n * Call between hover/click interactions to reset R3F's internal pointer state.\n */\nexport function unhover3D(): void {\n const gl = getRenderer();\n dispatchUnhover(gl.domElement);\n}\n","import { Vector3 } from 'three';\nimport { projectToScreen, screenDeltaToWorld } from './projection';\nimport { dispatchDrag, type DragOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// drag3D — deterministic drag on a 3D object\n//\n// Supports two modes:\n// 1. World-space delta: drag by { x, y, z } in world units\n// 2. Screen-space delta: drag by { dx, dy } in CSS pixels\n//\n// Both modes dispatch a pointerdown → N × pointermove → pointerup sequence.\n// ---------------------------------------------------------------------------\n\n/** World-space drag delta. */\nexport interface WorldDelta {\n x: number;\n y: number;\n z: number;\n}\n\n/** Screen-space drag delta (CSS pixels). */\nexport interface ScreenDelta {\n dx: number;\n dy: number;\n}\n\n/** Options for drag3D. */\nexport interface Drag3DOptions extends DragOptions {\n /**\n * If 'world', the delta is interpreted as world units.\n * If 'screen', the delta is interpreted as CSS pixels.\n * Default: 'world'\n */\n mode?: 'world' | 'screen';\n}\n\n/** Result of a drag3D operation. */\nexport interface Drag3DResult {\n /** Whether the drag was dispatched. */\n dispatched: true;\n /** Start screen point. */\n startPoint: { x: number; y: number };\n /** End screen point. */\n endPoint: { x: number; y: number };\n /** Which projection strategy was used for the start point. */\n strategy: string;\n}\n\n/**\n * Programmatically drag a 3D object by its testId or uuid.\n *\n * Projects the object to screen space for the start point, then computes\n * the end point based on the delta (world-space or screen-space), and\n * dispatches a full drag sequence on the canvas.\n *\n * @param idOrUuid The object's testId or uuid\n * @param delta Drag delta (world-space { x, y, z } or screen-space { dx, dy })\n * @param options Drag options (steps, delay, mode)\n * @returns Drag result with start/end points\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // World-space drag: move 2 units on X axis\n * window.__R3F_DOM__.drag('chair-primary', { x: 2, y: 0, z: 0 });\n *\n * // Screen-space drag: move 100px right, 50px down\n * drag3D('chair-primary', { dx: 100, dy: 50 }, { mode: 'screen' });\n * ```\n */\nexport async function drag3D(\n idOrUuid: string,\n delta: WorldDelta | ScreenDelta,\n options: Drag3DOptions = {},\n): Promise<Drag3DResult> {\n const { mode = 'world', ...dragOptions } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('drag', `drag3D(\"${idOrUuid}\") mode=${mode}`, delta);\n\n // 2. Project start point\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] drag3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n const startPoint = projection.point;\n let endPoint: { x: number; y: number };\n\n if (mode === 'screen' && 'dx' in delta) {\n // Screen-space mode: directly add pixel delta\n const screenDelta = delta as ScreenDelta;\n endPoint = {\n x: startPoint.x + screenDelta.dx,\n y: startPoint.y + screenDelta.dy,\n };\n } else {\n // World-space mode: convert world delta to screen delta\n const worldDelta = delta as WorldDelta;\n\n // Get the object's current world position\n const worldPos = new Vector3();\n obj.getWorldPosition(worldPos);\n\n // Compute the target world position\n const targetPos = worldPos.clone().add(new Vector3(worldDelta.x, worldDelta.y, worldDelta.z));\n\n // Project target position to screen space\n targetPos.project(camera);\n endPoint = {\n x: ((targetPos.x + 1) / 2) * size.width,\n y: ((-targetPos.y + 1) / 2) * size.height,\n };\n }\n\n // 3. Dispatch drag sequence\n const canvas = gl.domElement;\n await dispatchDrag(canvas, startPoint, endPoint, dragOptions);\n\n return {\n dispatched: true,\n startPoint,\n endPoint,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Compute what world-space displacement a screen-space drag would produce.\n * Useful for previewing drag effects before committing.\n */\nexport function previewDragWorldDelta(\n idOrUuid: string,\n screenDx: number,\n screenDy: number,\n): Vector3 {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const size = getCanvasSize();\n return screenDeltaToWorld(screenDx, screenDy, obj, camera, size);\n}\n","import { projectToScreen } from './projection';\nimport { dispatchWheel, type WheelOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\n\n// ---------------------------------------------------------------------------\n// wheel3D — deterministic wheel/scroll on a 3D object\n//\n// Projects the object to screen space and dispatches a WheelEvent on the\n// canvas at the projected coordinates. Triggers R3F's onWheel handler.\n// ---------------------------------------------------------------------------\n\n/** Options for wheel3D. */\nexport interface Wheel3DOptions extends WheelOptions {}\n\n/** Result of a wheel3D operation. */\nexport interface Wheel3DResult {\n /** Whether the wheel event was dispatched. */\n dispatched: true;\n /** The screen point where the wheel was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically scroll the wheel over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space and dispatches a synthetic WheelEvent\n * on the canvas. Triggers R3F's `onWheel` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Wheel options (deltaY, deltaX, deltaMode)\n * @returns Wheel result with screen point info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // Scroll down 200 units over the chair\n * wheel3D('chair-primary', { deltaY: 200 });\n *\n * // Scroll up\n * wheel3D('chair-primary', { deltaY: -100 });\n * ```\n */\nexport function wheel3D(\n idOrUuid: string,\n options: Wheel3DOptions = {},\n): Wheel3DResult {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] wheel3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchWheel(canvas, projection.point, options);\n\n return {\n dispatched: true,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","import { dispatchPointerMiss } from './dispatch';\nimport { getRenderer } from './resolve';\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// pointerMiss3D — click on empty canvas space\n//\n// Dispatches a click at a point unlikely to hit any mesh, causing R3F\n// to fire onPointerMissed on all objects that have that handler.\n// Commonly used for deselection in editor-type applications.\n// ---------------------------------------------------------------------------\n\n/** Options for pointerMiss3D. */\nexport interface PointerMiss3DOptions {\n /**\n * Specific screen point to click. If not provided, clicks at (1, 1)\n * which is the top-left corner — very unlikely to hit any mesh.\n */\n point?: ScreenPoint;\n}\n\n/**\n * Dispatch a click on empty canvas space, triggering `onPointerMissed`.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler\n * when a click doesn't hit any mesh. This is commonly used for\n * deselection workflows.\n *\n * @param options Optional point to click at\n *\n * @example\n * ```typescript\n * // Click empty space to deselect\n * pointerMiss3D();\n *\n * // Click at a specific empty spot\n * pointerMiss3D({ point: { x: 10, y: 10 } });\n * ```\n */\nexport function pointerMiss3D(options: PointerMiss3DOptions = {}): void {\n const gl = getRenderer();\n const canvas = gl.domElement;\n dispatchPointerMiss(canvas, options.point);\n}\n","import { r3fLog } from '../debug';\nimport { getRenderer } from './resolve';\n\n// ---------------------------------------------------------------------------\n// drawPath — simulate a freeform drawing stroke on the canvas\n//\n// Dispatches a full pointer sequence:\n// pointerdown (at first point) → N × pointermove → pointerup (at last point)\n//\n// Designed for canvas drawing apps that listen to pointer events on the\n// R3F canvas to create lines, paths, or annotations.\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/** Options for drawPath. */\nexport interface DrawPathOptions {\n /**\n * Delay in milliseconds between successive pointermove events.\n * Useful for apps that sample pointer events per-frame.\n * Default: 0 (dispatch all moves synchronously, which is fastest)\n */\n stepDelayMs?: number;\n\n /**\n * Pointer type. Some drawing apps differentiate between mouse and pen.\n * Default: 'mouse'\n */\n pointerType?: 'mouse' | 'pen' | 'touch';\n\n /**\n * If true, also dispatches a 'click' event at the end of the path.\n * Useful if the app interprets short strokes as clicks.\n * Default: false\n */\n clickAtEnd?: boolean;\n\n /**\n * If provided, draws on a specific canvas element.\n * Default: the R3F canvas (from the current renderer).\n */\n canvas?: HTMLCanvasElement;\n}\n\n/** Result of a drawPath operation. */\nexport interface DrawPathResult {\n /** Total number of pointer events dispatched. */\n eventCount: number;\n /** The number of points in the path. */\n pointCount: number;\n /** First point of the path. */\n startPoint: DrawPoint;\n /** Last point of the path. */\n endPoint: DrawPoint;\n}\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextDrawPointerId = 5000;\n\n/**\n * Build a PointerEvent init object for drawing.\n */\nfunction makeDrawPointerInit(\n canvas: HTMLCanvasElement,\n point: DrawPoint,\n pointerId: number,\n pointerType: string,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const rect = canvas.getBoundingClientRect();\n const clientX = rect.left + point.x;\n const clientY = rect.top + point.y;\n\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType,\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: point.pressure ?? 0.5,\n ...overrides,\n };\n}\n\n/**\n * Simulate a freeform drawing stroke on the canvas.\n *\n * Dispatches a full pointer sequence through the provided path of points:\n * `pointerdown` at the first point, `pointermove` at each subsequent point,\n * and `pointerup` at the last point.\n *\n * This is designed for canvas drawing applications (e.g. whiteboard, annotation\n * tools, CAD sketch mode) that respond to pointer events to create geometry.\n *\n * @param points Array of screen-space points (min 2 required)\n * @param options Drawing options\n * @returns Result with event counts and start/end points\n * @throws If fewer than 2 points are provided\n *\n * @example\n * ```typescript\n * // Draw a simple line from (100, 100) to (300, 200)\n * await drawPath([\n * { x: 100, y: 100 },\n * { x: 200, y: 150 },\n * { x: 300, y: 200 },\n * ]);\n *\n * // Draw with pen pressure simulation\n * await drawPath([\n * { x: 50, y: 50, pressure: 0.2 },\n * { x: 100, y: 80, pressure: 0.6 },\n * { x: 150, y: 70, pressure: 0.9 },\n * { x: 200, y: 60, pressure: 0.4 },\n * ], { pointerType: 'pen', stepDelayMs: 16 });\n * ```\n */\nexport async function drawPath(\n points: DrawPoint[],\n options: DrawPathOptions = {},\n): Promise<DrawPathResult> {\n if (points.length < 2) {\n throw new Error(\n `[react-three-dom] drawPath requires at least 2 points, got ${points.length}.`,\n );\n }\n\n const {\n stepDelayMs = 0,\n pointerType = 'mouse',\n clickAtEnd = false,\n canvas: explicitCanvas,\n } = options;\n\n // Resolve the canvas\n const canvas = explicitCanvas ?? getRenderer().domElement;\n const pointerId = _nextDrawPointerId++;\n let eventCount = 0;\n\n r3fLog('draw', `drawPath — ${points.length} points, delay=${stepDelayMs}ms, pointerType=${pointerType}`);\n\n // 1. Pointer down at first point\n const first = points[0];\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makeDrawPointerInit(canvas, first, pointerId, pointerType)),\n );\n eventCount++;\n\n // 2. Pointer moves through all intermediate points (including last)\n for (let i = 1; i < points.length; i++) {\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makeDrawPointerInit(canvas, points[i], pointerId, pointerType),\n ),\n );\n eventCount++;\n }\n\n // 3. Pointer up at last point\n const last = points[points.length - 1];\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makeDrawPointerInit(canvas, last, pointerId, pointerType, {\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n eventCount++;\n\n // 4. Optional click at end\n if (clickAtEnd) {\n const rect = canvas.getBoundingClientRect();\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n clientX: rect.left + last.x,\n clientY: rect.top + last.y,\n button: 0,\n }),\n );\n eventCount++;\n }\n\n r3fLog('draw', `drawPath complete — ${eventCount} events dispatched`);\n\n return {\n eventCount,\n pointCount: points.length,\n startPoint: first,\n endPoint: last,\n };\n}\n\n/**\n * Generate an array of DrawPoints along a straight line.\n * Useful for creating uniform stroke paths programmatically.\n *\n * @param start Start point (screen-space CSS pixels)\n * @param end End point (screen-space CSS pixels)\n * @param steps Number of intermediate points (excluding start/end). Default: 10\n * @param pressure Uniform pressure for all points. Default: 0.5\n * @returns Array of DrawPoints including start and end\n *\n * @example\n * ```typescript\n * const points = linePath({ x: 0, y: 0 }, { x: 200, y: 200 }, 20);\n * await drawPath(points);\n * ```\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; // +1 because we include start and end\n\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\n return points;\n}\n\n/**\n * Generate an array of DrawPoints along a quadratic bezier curve.\n * Great for simulating smooth freehand drawing strokes.\n *\n * @param start Start point\n * @param control Control point (determines curve shape)\n * @param end End point\n * @param steps Number of steps. Default: 20\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints along the curve\n *\n * @example\n * ```typescript\n * const points = curvePath(\n * { x: 50, y: 200 }, // start\n * { x: 150, y: 50 }, // control (peak of the curve)\n * { x: 250, y: 200 }, // end\n * 30,\n * );\n * await drawPath(points);\n * ```\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\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n // Quadratic bezier: B(t) = (1-t)²·P0 + 2·(1-t)·t·P1 + t²·P2\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\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a rectangle.\n * Useful for drawing rectangular selections or bounding boxes.\n *\n * @param topLeft Top-left corner\n * @param bottomRight Bottom-right corner\n * @param pointsPerSide Number of points per side. Default: 5\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints tracing the rectangle\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\n const sides = [\n [topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft],\n ] as const;\n\n const points: DrawPoint[] = [];\n\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\n // Close the path by returning to start\n points.push({ x: topLeft.x, y: topLeft.y, pressure });\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a circle/ellipse.\n *\n * @param center Center of the circle (screen-space)\n * @param radiusX Horizontal radius in CSS pixels\n * @param radiusY Vertical radius in CSS pixels. Default: same as radiusX (circle)\n * @param steps Number of points. Default: 36 (10° increments)\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints forming the circle\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\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\n return points;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { Object3D } from 'three';\n\n// ---------------------------------------------------------------------------\n// SelectionManager\n//\n// Manages the currently selected/highlighted object(s) in the scene.\n// Supports single selection (click to select) and multi-selection.\n// Notifies listeners when the selection changes so the Highlighter\n// can update visuals and the Inspector can update its UI.\n// ---------------------------------------------------------------------------\n\nexport type SelectionListener = (selected: Object3D[]) => void;\n\nexport class SelectionManager {\n /** Currently selected objects (ordered by selection time). */\n private _selected: Object3D[] = [];\n\n /** Listeners notified on selection change. */\n private _listeners: SelectionListener[] = [];\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n /** Select a single object (clears previous selection). */\n select(obj: Object3D): void {\n if (this._selected.length === 1 && this._selected[0] === obj) return;\n this._selected = [obj];\n this._notify();\n }\n\n /** Add an object to the current selection (multi-select). */\n addToSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) return;\n this._selected.push(obj);\n this._notify();\n }\n\n /** Remove an object from the selection. */\n removeFromSelection(obj: Object3D): void {\n const idx = this._selected.indexOf(obj);\n if (idx === -1) return;\n this._selected.splice(idx, 1);\n this._notify();\n }\n\n /** Toggle an object in/out of the selection. */\n toggleSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) {\n this.removeFromSelection(obj);\n } else {\n this.addToSelection(obj);\n }\n }\n\n /** Clear all selections. */\n clearSelection(): void {\n if (this._selected.length === 0) return;\n this._selected = [];\n this._notify();\n }\n\n /** Get the currently selected objects. */\n getSelected(): readonly Object3D[] {\n return this._selected;\n }\n\n /** Get the primary (first) selected object, or null. */\n getPrimary(): Object3D | null {\n return this._selected[0] ?? null;\n }\n\n /** Check if an object is selected. */\n isSelected(obj: Object3D): boolean {\n return this._selected.includes(obj);\n }\n\n /** Number of selected objects. */\n get count(): number {\n return this._selected.length;\n }\n\n // -----------------------------------------------------------------------\n // Event system\n // -----------------------------------------------------------------------\n\n /** Subscribe to selection changes. Returns unsubscribe function. */\n subscribe(listener: SelectionListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _notify(): void {\n const snapshot = [...this._selected];\n for (const listener of this._listeners) {\n listener(snapshot);\n }\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this._selected = [];\n this._listeners = [];\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useThree, useFrame } from '@react-three/fiber';\nimport { Box3, Vector3 } from 'three';\nimport type { Object3D, Camera } from 'three';\nimport { ObjectStore } from '../store/ObjectStore';\nimport { DomMirror } from '../mirror/DomMirror';\nimport { ensureCustomElements } from '../mirror/CustomElements';\nimport { patchObject3D } from './patchObject3D';\nimport { createSnapshot } from '../snapshot/snapshot';\nimport { click3D, doubleClick3D, contextMenu3D } from '../interactions/click';\nimport { hover3D } from '../interactions/hover';\nimport { drag3D } from '../interactions/drag';\nimport { wheel3D } from '../interactions/wheel';\nimport { pointerMiss3D } from '../interactions/pointerMiss';\nimport { drawPath as drawPathFn } from '../interactions/drawPath';\nimport { setInteractionState, clearInteractionState } from '../interactions/resolve';\nimport { SelectionManager } from '../highlight/SelectionManager';\nimport { Highlighter } from '../highlight/Highlighter';\nimport { version } from '../version';\nimport { r3fLog, enableDebug } from '../debug';\nimport type { R3FDOM, ObjectMetadata } from '../types';\n\n// ---------------------------------------------------------------------------\n// ThreeDom Props\n// ---------------------------------------------------------------------------\n\nexport interface ThreeDomProps {\n /** CSS selector or HTMLElement for the mirror DOM root. Default: \"#three-dom-root\" */\n root?: string | HTMLElement;\n /** Objects to process per amortized batch per frame. Default: 500 */\n batchSize?: number;\n /** Max time budget (ms) for sync work per frame. Default: 0.5 */\n timeBudgetMs?: number;\n /** Max materialized DOM nodes (LRU eviction). Default: 2000 */\n maxDomNodes?: number;\n /** Initial DOM tree materialization depth. Default: 3 */\n initialDepth?: number;\n /** Disable all sync. Default: true */\n enabled?: boolean;\n /** Enable debug logging to browser console. Default: false */\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Singleton instances\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\nlet _mirror: DomMirror | null = null;\nlet _selectionManager: SelectionManager | null = null;\nlet _highlighter: Highlighter | null = null;\n\nexport function getStore(): ObjectStore | null { return _store; }\nexport function getMirror(): DomMirror | null { return _mirror; }\nexport function getSelectionManager(): SelectionManager | null { return _selectionManager; }\nexport function getHighlighter(): Highlighter | null { return _highlighter; }\n\n// ---------------------------------------------------------------------------\n// 3D → Screen projection for DOM element positioning\n// ---------------------------------------------------------------------------\n\nconst _box = /* @__PURE__ */ new Box3();\nconst _v = /* @__PURE__ */ new Vector3();\nconst _corners: Vector3[] = Array.from({ length: 8 }, () => new Vector3());\n\n/**\n * Project a 3D object's bounding box to screen-space pixel coordinates\n * relative to the canvas element.\n */\nfunction projectToScreenRect(\n obj: Object3D,\n camera: Camera,\n canvasRect: { width: number; height: number },\n): { left: number; top: number; width: number; height: number } | null {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return null;\n\n const { min, max } = _box;\n _corners[0].set(min.x, min.y, min.z);\n _corners[1].set(min.x, min.y, max.z);\n _corners[2].set(min.x, max.y, min.z);\n _corners[3].set(min.x, max.y, max.z);\n _corners[4].set(max.x, min.y, min.z);\n _corners[5].set(max.x, min.y, max.z);\n _corners[6].set(max.x, max.y, min.z);\n _corners[7].set(max.x, max.y, max.z);\n\n let sxMin = Infinity, syMin = Infinity;\n let sxMax = -Infinity, syMax = -Infinity;\n let anyInFront = false;\n let anyBehind = false;\n\n for (const corner of _corners) {\n _v.copy(corner).project(camera);\n\n if (_v.z >= 1) {\n anyBehind = true;\n continue;\n }\n\n anyInFront = true;\n const sx = ((_v.x + 1) / 2) * canvasRect.width;\n const sy = ((1 - _v.y) / 2) * canvasRect.height;\n sxMin = Math.min(sxMin, sx);\n syMin = Math.min(syMin, sy);\n sxMax = Math.max(sxMax, sx);\n syMax = Math.max(syMax, sy);\n }\n\n if (!anyInFront) return null;\n\n if (anyBehind) {\n sxMin = Math.min(sxMin, 0);\n syMin = Math.min(syMin, 0);\n sxMax = Math.max(sxMax, canvasRect.width);\n syMax = Math.max(syMax, canvasRect.height);\n }\n\n sxMin = Math.max(0, sxMin);\n syMin = Math.max(0, syMin);\n sxMax = Math.min(canvasRect.width, sxMax);\n syMax = Math.min(canvasRect.height, syMax);\n\n const w = sxMax - sxMin;\n const h = syMax - syMin;\n if (w < 1 || h < 1) return null;\n\n return { left: sxMin, top: syMin, width: w, height: h };\n}\n\n// ---------------------------------------------------------------------------\n// Global API exposure (window.__R3F_DOM__)\n// ---------------------------------------------------------------------------\n\nfunction exposeGlobalAPI(store: ObjectStore): void {\n const api: R3FDOM = {\n _ready: true,\n getByTestId: (id: string) => store.getByTestId(id),\n getByUuid: (uuid: string) => store.getByUuid(uuid),\n getByName: (name: string) => store.getByName(name),\n getCount: () => store.getCount(),\n getByType: (type: string) => store.getByType(type),\n getByUserData: (key: string, value?: unknown) => store.getByUserData(key, value),\n getCountByType: (type: string) => store.getCountByType(type),\n getObjects: (ids: string[]) => {\n const map = store.getObjects(ids);\n const result: Record<string, ObjectMetadata | null> = {};\n for (const [id, meta] of map) {\n result[id] = meta;\n }\n return result;\n },\n snapshot: () => createSnapshot(store),\n inspect: (idOrUuid: string) => store.inspect(idOrUuid),\n click: (idOrUuid: string) => { click3D(idOrUuid); },\n doubleClick: (idOrUuid: string) => { doubleClick3D(idOrUuid); },\n contextMenu: (idOrUuid: string) => { contextMenu3D(idOrUuid); },\n hover: (idOrUuid: string) => { hover3D(idOrUuid); },\n drag: async (idOrUuid: string, delta: { x: number; y: number; z: number }) => { await drag3D(idOrUuid, delta); },\n wheel: (idOrUuid: string, options?: { deltaY?: number; deltaX?: number }) => { wheel3D(idOrUuid, options); },\n pointerMiss: () => { pointerMiss3D(); },\n drawPath: async (points, options) => {\n const result = await drawPathFn(points, options);\n return { eventCount: result.eventCount, pointCount: result.pointCount };\n },\n select: (idOrUuid: string) => {\n const obj = store.getObject3D(idOrUuid);\n if (obj && _selectionManager) _selectionManager.select(obj);\n },\n clearSelection: () => { _selectionManager?.clearSelection(); },\n getSelection: () =>\n _selectionManager\n ? _selectionManager.getSelected().map((o) => o.uuid)\n : [],\n getObject3D: (idOrUuid: string) => store.getObject3D(idOrUuid),\n version,\n };\n window.__R3F_DOM__ = api;\n}\n\n/**\n * Remove the global API. In React Strict Mode the component unmounts then\n * remounts; if we delete synchronously, the next effect has not run yet and\n * tests waiting for __R3F_DOM__ can miss it. Defer deletion so that a\n * remounted instance can set the bridge first; we only delete if it's still ours.\n */\nfunction removeGlobalAPI(onlyIfEquals?: R3FDOM): void {\n r3fLog('bridge', 'removeGlobalAPI called (deferred)');\n if (onlyIfEquals !== undefined) {\n const ref = onlyIfEquals;\n queueMicrotask(() => {\n if ((window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__ === ref) {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n r3fLog('bridge', 'Global API removed');\n } else {\n r3fLog('bridge', 'Global API not removed — replaced by new instance (Strict Mode remount)');\n }\n });\n } else {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n r3fLog('bridge', 'Global API removed (immediate)');\n }\n}\n\n/** Set element position/size, only writing if values changed. */\nfunction setElementRect(el: HTMLElement, l: number, t: number, w: number, h: number): void {\n const d = el.dataset;\n if (d._l !== String(l) || d._t !== String(t) || d._w !== String(w) || d._h !== String(h)) {\n el.style.left = `${l}px`;\n el.style.top = `${t}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n d._l = String(l);\n d._t = String(t);\n d._w = String(w);\n d._h = String(h);\n }\n}\n\n// ---------------------------------------------------------------------------\n// ThreeDom Component\n// ---------------------------------------------------------------------------\n\nexport function ThreeDom({\n root = '#three-dom-root',\n batchSize = 500,\n timeBudgetMs = 0.5,\n maxDomNodes = 2000,\n initialDepth = 3,\n enabled = true,\n debug = false,\n}: ThreeDomProps = {}) {\n const scene = useThree((s) => s.scene);\n const camera = useThree((s) => s.camera);\n const gl = useThree((s) => s.gl);\n const size = useThree((s) => s.size);\n const cursorRef = useRef(0);\n const positionCursorRef = useRef(0);\n\n // -----------------------------------------------------------------------\n // Setup\n // -----------------------------------------------------------------------\n\n useEffect(() => {\n if (!enabled) return;\n\n if (debug) enableDebug(true);\n r3fLog('setup', 'ThreeDom effect started', { enabled, debug, root, maxDomNodes });\n\n const canvas = gl.domElement;\n const canvasParent = canvas.parentElement!;\n\n // ---- Create / resolve root element ----\n let rootElement: HTMLElement | null = null;\n let createdRoot = false;\n\n if (typeof root === 'string') {\n rootElement = document.querySelector<HTMLElement>(root);\n } else {\n rootElement = root;\n }\n\n if (!rootElement) {\n rootElement = document.createElement('div');\n rootElement.id = typeof root === 'string' ? root.replace(/^#/, '') : 'three-dom-root';\n createdRoot = true;\n }\n\n // Place the mirror root INSIDE the Canvas wrapper as a sibling of the\n // <canvas>. With position:absolute and z-index:10, Chrome DevTools will\n // natively highlight our mirror elements when hovering in the Elements tab.\n canvasParent.style.position = canvasParent.style.position || 'relative';\n canvasParent.appendChild(rootElement);\n\n rootElement.style.cssText = [\n 'position: absolute',\n 'top: 0',\n 'left: 0',\n 'width: 100%',\n 'height: 100%',\n 'pointer-events: none',\n 'overflow: hidden',\n 'z-index: 10',\n ].join(';');\n\n // Variables declared outside try so cleanup can access them\n let store: ObjectStore | null = null;\n let mirror: DomMirror | null = null;\n let unpatch: (() => void) | null = null;\n let selectionManager: SelectionManager | null = null;\n let currentApi: R3FDOM | undefined;\n\n try {\n // ---- Create store and mirror ----\n store = new ObjectStore();\n mirror = new DomMirror(store, maxDomNodes);\n mirror.setRoot(rootElement);\n r3fLog('setup', 'Store and mirror created');\n\n ensureCustomElements(store);\n store.registerTree(scene);\n r3fLog('setup', `Registered scene tree: ${store.getCount()} objects`);\n\n mirror.materializeSubtree(scene.uuid, initialDepth);\n\n unpatch = patchObject3D(store, mirror);\n setInteractionState(store, camera, gl, size);\n r3fLog('setup', 'Object3D patched, interaction state set');\n\n // Keep SelectionManager available for the global API and Inspector\n selectionManager = new SelectionManager();\n _selectionManager = selectionManager;\n _highlighter = null;\n\n exposeGlobalAPI(store);\n r3fLog('bridge', 'exposeGlobalAPI called — bridge is live, _ready=true');\n currentApi = window.__R3F_DOM__;\n _store = store;\n _mirror = mirror;\n\n // ---- Initial full position sync ----\n const initialCanvasRect = canvas.getBoundingClientRect();\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n if (obj.userData?.__r3fdom_internal) continue;\n const el = mirror.getElement(obj.uuid);\n if (!el) continue;\n\n if (obj.type === 'Scene') {\n setElementRect(el, 0, 0, Math.round(initialCanvasRect.width), Math.round(initialCanvasRect.height));\n continue;\n }\n\n const rect = projectToScreenRect(obj, camera, initialCanvasRect);\n if (rect) {\n let parentLeft = 0;\n let parentTop = 0;\n if (obj.parent && obj.parent.type !== 'Scene') {\n const parentRect = projectToScreenRect(obj.parent, camera, initialCanvasRect);\n if (parentRect) {\n parentLeft = Math.round(parentRect.left);\n parentTop = Math.round(parentRect.top);\n }\n }\n setElementRect(\n el,\n Math.round(rect.left) - parentLeft,\n Math.round(rect.top) - parentTop,\n Math.round(rect.width),\n Math.round(rect.height),\n );\n }\n }\n } catch (err) {\n // Setup failed — expose a non-ready bridge so tests get a clear error\n // instead of a timeout with no diagnostics.\n const errorMsg = err instanceof Error ? err.message : String(err);\n r3fLog('setup', 'ThreeDom setup failed', err);\n console.error('[react-three-dom] Setup failed:', err);\n window.__R3F_DOM__ = {\n _ready: false,\n _error: errorMsg,\n getByTestId: () => null,\n getByUuid: () => null,\n getByName: () => [],\n getCount: () => 0,\n getByType: () => [],\n getByUserData: () => [],\n getCountByType: () => 0,\n getObjects: (ids: string[]) => {\n const result: Record<string, null> = {};\n for (const id of ids) result[id] = null;\n return result;\n },\n snapshot: () => ({ timestamp: 0, objectCount: 0, tree: { uuid: '', name: '', type: 'Scene', visible: true, position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1], children: [] } }),\n inspect: () => null,\n click: () => {},\n doubleClick: () => {},\n contextMenu: () => {},\n hover: () => {},\n drag: async () => {},\n wheel: () => {},\n pointerMiss: () => {},\n drawPath: async () => ({ eventCount: 0, pointCount: 0 }),\n select: () => {},\n clearSelection: () => {},\n getSelection: () => [],\n getObject3D: () => null,\n version,\n };\n currentApi = window.__R3F_DOM__;\n }\n\n // ---- Cleanup ----\n return () => {\n r3fLog('setup', 'ThreeDom cleanup started');\n if (unpatch) unpatch();\n removeGlobalAPI(currentApi);\n clearInteractionState();\n if (selectionManager) selectionManager.dispose();\n if (mirror) mirror.dispose();\n if (store) store.dispose();\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n _store = null;\n _mirror = null;\n _selectionManager = null;\n _highlighter = null;\n if (debug) enableDebug(false);\n r3fLog('setup', 'ThreeDom cleanup complete');\n };\n }, [scene, camera, gl, size, enabled, root, maxDomNodes, initialDepth, debug]);\n\n // -----------------------------------------------------------------------\n // Per-frame sync\n // -----------------------------------------------------------------------\n\n useFrame(() => {\n if (!enabled || !_store || !_mirror) return;\n\n try {\n setInteractionState(_store, camera, gl, size);\n\n const store = _store;\n const mirror = _mirror;\n const canvas = gl.domElement;\n const canvasRect = canvas.getBoundingClientRect();\n const start = performance.now();\n\n // Layer 3: Sync priority (dirty) objects first\n const dirtyObjects = store.drainDirtyQueue();\n for (const obj of dirtyObjects) {\n store.update(obj);\n mirror.syncAttributes(obj);\n }\n\n // Layer 2: Amortized attribute sync\n const budgetRemaining = timeBudgetMs - (performance.now() - start);\n if (budgetRemaining > 0.1) {\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const end = Math.min(cursorRef.current + batchSize, objects.length);\n for (let i = cursorRef.current; i < end; i++) {\n if (performance.now() - start > timeBudgetMs) break;\n const obj = objects[i];\n const changed = store.update(obj);\n if (changed) mirror.syncAttributes(obj);\n }\n cursorRef.current = end >= objects.length ? 0 : end;\n }\n }\n\n // Layer 1: Amortized DOM position sync — project 3D bounds to screen.\n // Coordinates are parent-relative since elements are nested.\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const posEnd = Math.min(positionCursorRef.current + 50, objects.length);\n for (let i = positionCursorRef.current; i < posEnd; i++) {\n const obj = objects[i];\n if (obj.userData?.__r3fdom_internal) continue;\n const el = mirror.getElement(obj.uuid);\n if (!el) continue;\n\n if (obj.type === 'Scene') {\n setElementRect(el, 0, 0, Math.round(canvasRect.width), Math.round(canvasRect.height));\n continue;\n }\n\n const rect = projectToScreenRect(obj, camera, canvasRect);\n if (rect) {\n let parentLeft = 0;\n let parentTop = 0;\n if (obj.parent && obj.parent.type !== 'Scene') {\n const parentRect = projectToScreenRect(obj.parent, camera, canvasRect);\n if (parentRect) {\n parentLeft = Math.round(parentRect.left);\n parentTop = Math.round(parentRect.top);\n }\n }\n\n const l = Math.round(rect.left) - parentLeft;\n const t = Math.round(rect.top) - parentTop;\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n\n setElementRect(el, l, t, w, h);\n if (el.style.display === 'none') el.style.display = 'block';\n } else {\n if (el.style.display !== 'none') el.style.display = 'none';\n }\n }\n positionCursorRef.current = posEnd >= objects.length ? 0 : posEnd;\n }\n } catch (err) {\n // Per-frame sync failure should not crash the render loop.\n // Log once and continue — the next frame will retry.\n r3fLog('sync', 'Per-frame sync error', err);\n }\n });\n\n return null;\n}\n","import {\n Object3D,\n Box3,\n Vector3,\n Camera,\n WebGLRenderer,\n} from 'three';\nimport type { SelectionManager } from './SelectionManager';\n\n// ---------------------------------------------------------------------------\n// Highlighter\n//\n// Renders DevTools-style 2D overlay highlights over 3D objects by projecting\n// their world-space bounding boxes onto screen coordinates. Matches the\n// Chrome DevTools visual style:\n// - Blue semi-transparent overlay for content area\n// - Tooltip showing element tag name + dimensions\n// - Hover highlight (temporary) vs selected highlight (persistent)\n// - Parent selection cascades to all children\n// ---------------------------------------------------------------------------\n\n/** Chrome DevTools highlight colors */\nconst COLORS = {\n /** Content area — same blue as Chrome DevTools element highlight */\n content: 'rgba(111, 168, 220, 0.66)',\n /** Slightly dimmer for children of a selected parent */\n contentChild: 'rgba(111, 168, 220, 0.33)',\n /** Hover highlight — lighter blue */\n hover: 'rgba(111, 168, 220, 0.4)',\n /** Tooltip background */\n tooltipBg: 'rgba(36, 36, 36, 0.9)',\n /** Tooltip text */\n tooltipText: '#fff',\n /** Tooltip tag color */\n tooltipTag: '#e776e0',\n /** Tooltip dimensions color */\n tooltipDim: '#c5c5c5',\n /** Border for selected elements */\n border: 'rgba(111, 168, 220, 0.9)',\n} as const;\n\nexport interface HighlighterOptions {\n /** Whether to show a tooltip above highlighted objects. Default: true */\n showTooltip?: boolean;\n}\n\n/** A 2D rectangle in screen pixels */\ninterface ScreenRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: project 3D bounding box to 2D screen rect\n// ---------------------------------------------------------------------------\n\nconst _box = /* @__PURE__ */ new Box3();\nconst _v = /* @__PURE__ */ new Vector3();\nconst _corners: Vector3[] = Array.from({ length: 8 }, () => new Vector3());\n\nfunction projectBoundsToScreen(\n obj: Object3D,\n camera: Camera,\n canvas: HTMLCanvasElement,\n): ScreenRect | null {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return null;\n\n const { min, max } = _box;\n\n // Get all 8 corners of the AABB\n _corners[0].set(min.x, min.y, min.z);\n _corners[1].set(min.x, min.y, max.z);\n _corners[2].set(min.x, max.y, min.z);\n _corners[3].set(min.x, max.y, max.z);\n _corners[4].set(max.x, min.y, min.z);\n _corners[5].set(max.x, min.y, max.z);\n _corners[6].set(max.x, max.y, min.z);\n _corners[7].set(max.x, max.y, max.z);\n\n const rect = canvas.getBoundingClientRect();\n let screenMinX = Infinity;\n let screenMinY = Infinity;\n let screenMaxX = -Infinity;\n let screenMaxY = -Infinity;\n let allBehind = true;\n\n for (const corner of _corners) {\n _v.copy(corner).project(camera);\n\n // Check if point is in front of camera (z < 1 in NDC)\n if (_v.z < 1) allBehind = false;\n\n // Convert NDC to screen pixels\n const sx = ((_v.x + 1) / 2) * rect.width;\n const sy = ((1 - _v.y) / 2) * rect.height;\n\n screenMinX = Math.min(screenMinX, sx);\n screenMinY = Math.min(screenMinY, sy);\n screenMaxX = Math.max(screenMaxX, sx);\n screenMaxY = Math.max(screenMaxY, sy);\n }\n\n if (allBehind) return null;\n\n // Clamp to canvas bounds\n screenMinX = Math.max(0, screenMinX);\n screenMinY = Math.max(0, screenMinY);\n screenMaxX = Math.min(rect.width, screenMaxX);\n screenMaxY = Math.min(rect.height, screenMaxY);\n\n const width = screenMaxX - screenMinX;\n const height = screenMaxY - screenMinY;\n\n if (width < 1 || height < 1) return null;\n\n return {\n left: rect.left + screenMinX,\n top: rect.top + screenMinY,\n width,\n height,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helper: get a display label for an object (like DevTools tag name)\n// ---------------------------------------------------------------------------\n\nfunction getObjectLabel(obj: Object3D): string {\n const tag = `three-${obj.type.toLowerCase()}`;\n const parts: string[] = [tag];\n\n if (obj.name) {\n parts.push(`.${obj.name}`);\n }\n\n const testId = obj.userData?.testId;\n if (testId) {\n parts.push(`[testId=\"${testId}\"]`);\n }\n\n return parts.join('');\n}\n\nfunction getObjectDimensions(obj: Object3D): string {\n _box.setFromObject(obj);\n if (_box.isEmpty()) return '';\n const size = _box.getSize(new Vector3());\n return `${size.x.toFixed(1)} × ${size.y.toFixed(1)} × ${size.z.toFixed(1)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Overlay element management\n// ---------------------------------------------------------------------------\n\ninterface OverlayEntry {\n /** The container div for the highlight overlay */\n overlayEl: HTMLDivElement;\n /** The tooltip element */\n tooltipEl: HTMLDivElement;\n /** Target object being highlighted */\n target: Object3D;\n /** Whether this is a child-of-parent highlight (dimmer) */\n isChild: boolean;\n}\n\nfunction createOverlayElement(color: string, showBorder: boolean): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 99998;\n background: ${color};\n ${showBorder ? `border: 1px solid ${COLORS.border};` : ''}\n transition: all 0.05s ease-out;\n box-sizing: border-box;\n `;\n return el;\n}\n\nfunction createTooltipElement(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 99999;\n background: ${COLORS.tooltipBg};\n color: ${COLORS.tooltipText};\n font-family: 'SF Mono', Monaco, monospace;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 3px;\n white-space: nowrap;\n line-height: 1.4;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n `;\n return el;\n}\n\nfunction positionOverlay(entry: OverlayEntry, rect: ScreenRect): void {\n const { overlayEl, tooltipEl } = entry;\n overlayEl.style.left = `${rect.left}px`;\n overlayEl.style.top = `${rect.top}px`;\n overlayEl.style.width = `${rect.width}px`;\n overlayEl.style.height = `${rect.height}px`;\n overlayEl.style.display = 'block';\n\n // Position tooltip above the overlay\n tooltipEl.style.left = `${rect.left}px`;\n tooltipEl.style.top = `${Math.max(0, rect.top - 28)}px`;\n tooltipEl.style.display = 'block';\n}\n\nfunction hideOverlay(entry: OverlayEntry): void {\n entry.overlayEl.style.display = 'none';\n entry.tooltipEl.style.display = 'none';\n}\n\n// ---------------------------------------------------------------------------\n// Highlighter class\n// ---------------------------------------------------------------------------\n\nexport class Highlighter {\n /** Selected object overlays (persistent until deselected) */\n private _selectedEntries: Map<Object3D, OverlayEntry> = new Map();\n /** Hover overlay (temporary, single object at a time) */\n private _hoverEntries: Map<Object3D, OverlayEntry> = new Map();\n\n private _camera: Camera | null = null;\n private _renderer: WebGLRenderer | null = null;\n private _unsubscribe: (() => void) | null = null;\n private _showTooltip: boolean;\n\n /** DevTools hover polling interval */\n private _hoverPollId: ReturnType<typeof setInterval> | null = null;\n private _lastHoveredElement: HTMLElement | null = null;\n\n /** Store reference for resolving objects */\n private _store: { getObject3D(uuid: string): Object3D | null } | null = null;\n\n constructor(options: HighlighterOptions = {}) {\n this._showTooltip = options.showTooltip ?? true;\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n attach(\n _scene: Object3D,\n selectionManager: SelectionManager,\n camera: Camera,\n renderer: WebGLRenderer,\n store: { getObject3D(uuid: string): Object3D | null },\n ): void {\n this.detach();\n // scene parameter kept for API compatibility but not used for 2D overlays\n void _scene;\n this._camera = camera;\n this._renderer = renderer;\n this._store = store;\n\n // Subscribe to selection changes\n this._unsubscribe = selectionManager.subscribe((selected) => {\n this._syncSelectedHighlights(selected);\n });\n\n // Apply initial selection\n this._syncSelectedHighlights([...selectionManager.getSelected()]);\n\n // Start polling for DevTools hover\n this._startHoverPolling();\n }\n\n detach(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._stopHoverPolling();\n this._clearAllOverlays(this._selectedEntries);\n this._clearAllOverlays(this._hoverEntries);\n this._camera = null;\n this._renderer = null;\n this._store = null;\n }\n\n // -----------------------------------------------------------------------\n // Per-frame update — reposition all overlays to follow camera/objects\n // -----------------------------------------------------------------------\n\n update(): void {\n if (!this._camera || !this._renderer) return;\n const canvas = this._renderer.domElement;\n\n // Update selected overlays\n for (const entry of this._selectedEntries.values()) {\n const rect = projectBoundsToScreen(entry.target, this._camera, canvas);\n if (rect) {\n positionOverlay(entry, rect);\n } else {\n hideOverlay(entry);\n }\n }\n\n // Update hover overlays\n for (const entry of this._hoverEntries.values()) {\n const rect = projectBoundsToScreen(entry.target, this._camera, canvas);\n if (rect) {\n positionOverlay(entry, rect);\n } else {\n hideOverlay(entry);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n highlight(obj: Object3D): void {\n this._addSelectedHighlight(obj, false);\n }\n\n unhighlight(obj: Object3D): void {\n this._removeOverlay(obj, this._selectedEntries);\n }\n\n clearAll(): void {\n this._clearAllOverlays(this._selectedEntries);\n this._clearAllOverlays(this._hoverEntries);\n }\n\n isHighlighted(obj: Object3D): boolean {\n return this._selectedEntries.has(obj);\n }\n\n /** Show a temporary hover highlight for an object and its children */\n showHoverHighlight(obj: Object3D): void {\n this._clearAllOverlays(this._hoverEntries);\n this._addHoverHighlightRecursive(obj);\n }\n\n /** Clear the hover highlight */\n clearHoverHighlight(): void {\n this._clearAllOverlays(this._hoverEntries);\n this._lastHoveredElement = null;\n }\n\n // -----------------------------------------------------------------------\n // Internal: selection highlights\n // -----------------------------------------------------------------------\n\n private _syncSelectedHighlights(selected: Object3D[]): void {\n // Collect all objects that should be highlighted\n const targetSet = new Set<Object3D>();\n const primarySet = new Set<Object3D>(selected);\n\n for (const obj of selected) {\n targetSet.add(obj);\n // If the selected object has children, cascade highlights\n obj.traverse((child) => {\n targetSet.add(child);\n });\n }\n\n // Remove overlays for objects no longer in the target set\n for (const [obj] of this._selectedEntries) {\n if (!targetSet.has(obj)) {\n this._removeOverlay(obj, this._selectedEntries);\n }\n }\n\n // Add overlays for newly targeted objects\n for (const obj of targetSet) {\n if (obj.userData?.__r3fdom_internal) continue;\n if (!this._selectedEntries.has(obj)) {\n const isChild = !primarySet.has(obj);\n this._addSelectedHighlight(obj, isChild);\n }\n }\n }\n\n private _addSelectedHighlight(obj: Object3D, isChild: boolean): void {\n if (this._selectedEntries.has(obj)) return;\n\n const color = isChild ? COLORS.contentChild : COLORS.content;\n const overlayEl = createOverlayElement(color, !isChild);\n const tooltipEl = createTooltipElement();\n\n // Only show tooltip for the primary (non-child) selection\n if (isChild || !this._showTooltip) {\n tooltipEl.style.display = 'none';\n }\n\n // Set tooltip content\n const label = getObjectLabel(obj);\n const dims = getObjectDimensions(obj);\n tooltipEl.innerHTML = `<span style=\"color:${COLORS.tooltipTag}\">${label}</span>` +\n (dims ? ` <span style=\"color:${COLORS.tooltipDim}\">${dims}</span>` : '');\n\n document.body.appendChild(overlayEl);\n document.body.appendChild(tooltipEl);\n\n const entry: OverlayEntry = { overlayEl, tooltipEl, target: obj, isChild };\n this._selectedEntries.set(obj, entry);\n }\n\n // -----------------------------------------------------------------------\n // Internal: hover highlights\n // -----------------------------------------------------------------------\n\n private _addHoverHighlightRecursive(obj: Object3D): void {\n if (obj.userData?.__r3fdom_internal) return;\n\n const overlayEl = createOverlayElement(COLORS.hover, false);\n const tooltipEl = createTooltipElement();\n\n // Tooltip only for the root hovered object\n if (this._hoverEntries.size === 0 && this._showTooltip) {\n const label = getObjectLabel(obj);\n const dims = getObjectDimensions(obj);\n tooltipEl.innerHTML = `<span style=\"color:${COLORS.tooltipTag}\">${label}</span>` +\n (dims ? ` <span style=\"color:${COLORS.tooltipDim}\">${dims}</span>` : '');\n } else {\n tooltipEl.style.display = 'none';\n }\n\n document.body.appendChild(overlayEl);\n document.body.appendChild(tooltipEl);\n\n this._hoverEntries.set(obj, { overlayEl, tooltipEl, target: obj, isChild: false });\n\n // Recurse into children\n for (const child of obj.children) {\n if (!child.userData?.__r3fdom_internal) {\n this._addHoverHighlightRecursive(child);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: DevTools hover polling\n // -----------------------------------------------------------------------\n\n private _startHoverPolling(): void {\n this._hoverPollId = setInterval(() => {\n this._pollDevToolsHover();\n }, 100);\n }\n\n private _stopHoverPolling(): void {\n if (this._hoverPollId) {\n clearInterval(this._hoverPollId);\n this._hoverPollId = null;\n }\n }\n\n private _pollDevToolsHover(): void {\n if (!this._store) return;\n\n try {\n // Chrome DevTools exposes $0 for the currently selected element.\n // We also check for a custom __r3fdom_hovered__ property that\n // we set via a MutationObserver on the mirror root.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hoveredEl = (globalThis as any).__r3fdom_hovered__ as HTMLElement | undefined;\n if (hoveredEl === this._lastHoveredElement) return;\n this._lastHoveredElement = hoveredEl ?? null;\n\n if (!hoveredEl) {\n this._clearAllOverlays(this._hoverEntries);\n return;\n }\n\n const uuid = hoveredEl.getAttribute?.('data-uuid');\n if (!uuid) {\n this._clearAllOverlays(this._hoverEntries);\n return;\n }\n\n const obj = this._store.getObject3D(uuid);\n if (obj) {\n this.showHoverHighlight(obj);\n } else {\n this._clearAllOverlays(this._hoverEntries);\n }\n } catch {\n // Ignore errors from DevTools API\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: overlay cleanup\n // -----------------------------------------------------------------------\n\n private _removeOverlay(obj: Object3D, map: Map<Object3D, OverlayEntry>): void {\n const entry = map.get(obj);\n if (!entry) return;\n entry.overlayEl.remove();\n entry.tooltipEl.remove();\n map.delete(obj);\n }\n\n private _clearAllOverlays(map: Map<Object3D, OverlayEntry>): void {\n for (const entry of map.values()) {\n entry.overlayEl.remove();\n entry.tooltipEl.remove();\n }\n map.clear();\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this.detach();\n }\n}\n"]}
|