"use client" type Point = { x: number; y: number } const listeners = new Set<() => void>() let latest: Point = { x: 0, y: 0 } let rafId: number | null = null function emit() { rafId = null for (const cb of listeners) cb() } /** Throttle pointer notifications to at most once per animation frame. */ export function notifyDragPointerMove(x: number, y: number) { latest = { x, y } if (rafId !== null) return rafId = globalThis.requestAnimationFrame(emit) } export function getDragPointerSnapshot(): Point { return latest } export function subscribeDragPointer(cb: () => void) { listeners.add(cb) return () => { listeners.delete(cb) } } export function resetDragPointer(x: number, y: number) { if (rafId !== null) { globalThis.cancelAnimationFrame(rafId) rafId = null } latest = { x, y } for (const cb of listeners) cb() }