{"version":3,"file":"use-on-paper-events.cjs","sources":["../../../src/hooks/use-on-paper-events.ts"],"sourcesContent":["import { usePaperStore, useResolvePaperId } from './use-paper';\nimport type { PaperStore } from '../store';\nimport type { PaperTarget } from '../types';\nimport { isPaperTarget } from '../utils/resolve-paper-target';\nimport { addPaperEventListeners, type PaperEventMap } from '../presets/paper-events';\nimport { useOnEvents } from './use-on-events';\n\nconst EMPTY_HANDLERS: PaperEventMap = {};\n\n/**\n * Subscribes all handlers to a paper, delegating runtime wiring to the\n * `addPaperEventListeners` runtime.\n * @param paperStore - Paper store to subscribe on.\n * @param handlers - Event handlers map.\n * @returns Cleanup callback that stops all listeners.\n * @internal\n */\nexport function subscribeToPaperEvents(\n  paperStore: PaperStore,\n  handlers: PaperEventMap\n): () => void {\n  return addPaperEventListeners(paperStore.paper, handlers);\n}\n\n/**\n * Subscribes to `dia.Paper` events, pointer clicks, hovers, drags, link\n * connections, zoom/pan, and more, so you can respond to user interaction on the\n * canvas. When no paper argument is given, the hook targets the paper from the\n * surrounding {@link Paper} context (or the single default paper). Mount it\n * inside a `<GraphProvider>`. Unlike {@link useOnGraphEvents}, it tolerates a\n * paper that has not mounted yet — it does not throw while waiting and\n * subscribes once a paper becomes available.\n *\n * Two key forms can be mixed in the same handlers map:\n *\n * **CamelCase form**: `on<Category><Event>` keys deliver a single params\n * object with named properties.\n * ```tsx\n * useOnPaperEvents({\n *   onElementPointerClick: ({ id, model, paper, graph, event, x, y }) => {},\n *   onBlankPointerClick: ({ paper, graph, event, x, y }) => {},\n * });\n * ```\n *\n * **Raw form**: native JointJS event names with positional arguments. Use\n * for events without an `on*` counterpart (`'render:done'`,\n * `'cell:highlight'`, …).\n * ```tsx\n * useOnPaperEvents(paperId, {\n *   'element:pointerclick': (view, evt, x, y) => {},\n *   'render:done': (stats) => {},\n * });\n * ```\n *\n * Handlers are **always-latest**: the subscription is established once and\n * each event reads the current handler, so inline maps and closures need no\n * `useCallback`. Re-subscription happens only when the paper or the set of\n * event names changes.\n *\n * The `on*` params object omits the React-store `record`, to read the\n * record shape, call `useCell(id, selector)` from your own\n * component (the handler closure has access to the `id` it emits).\n *\n * See {@link PaperEventMap} for every accepted key, and {@link PaperEventHandler}\n * for typing an individual handler.\n * @title On the current paper\n * @param handlers - Map of paper events to callbacks (camelCase `on*` and/or raw).\n * @group Hooks\n * @example\n * ```tsx\n * import { GraphProvider, Paper, useOnPaperEvents } from '@joint/react';\n *\n * function SelectionLogger() {\n *   useOnPaperEvents({\n *     onElementPointerClick: ({ id }) => console.log('clicked element', id),\n *     onBlankPointerClick: ({ x, y }) => console.log('clicked blank at', x, y),\n *   });\n *   return null;\n * }\n *\n * <GraphProvider>\n *   <Paper renderElement={() => <rect width={80} height={40} fill=\"#3498db\" />} />\n *   <SelectionLogger />\n * </GraphProvider>\n * ```\n */\nexport function useOnPaperEvents(handlers: PaperEventMap): void;\n/**\n * Subscribes to paper events on a specific paper you name, by registered id,\n * `dia.Paper` instance, or React ref. Use this to target one paper when several\n * are mounted (e.g. a main canvas plus a minimap). Same camelCase/raw handler\n * forms and always-latest semantics as the context form.\n * @title On a specific paper\n * @param paperTarget - The paper to listen on, see {@link PaperTarget}.\n * @param handlers - Map of paper events to callbacks (camelCase `on*` and/or raw).\n * @group Hooks\n * @example\n * ```tsx\n * import { useOnPaperEvents } from '@joint/react';\n *\n * // Target a paper by its registered id.\n * function MinimapLogger() {\n *   useOnPaperEvents('minimap', {\n *     onBlankPointerClick: ({ x, y }) => console.log('minimap click', x, y),\n *   });\n *   return null;\n * }\n * ```\n */\nexport function useOnPaperEvents(paperTarget: PaperTarget, handlers: PaperEventMap): void;\nexport function useOnPaperEvents(\n  paperTargetOrHandlers: PaperTarget | PaperEventMap,\n  handlersArgument?: PaperEventMap\n): void {\n  const isTargetForm = isPaperTarget(paperTargetOrHandlers);\n  const paperTarget = isTargetForm ? paperTargetOrHandlers : undefined;\n  const handlers = isTargetForm ? handlersArgument ?? EMPTY_HANDLERS : paperTargetOrHandlers;\n\n  const paperId = useResolvePaperId(paperTarget);\n  const paperStore = usePaperStore(paperId);\n\n  useOnEvents(paperStore, handlers, subscribeToPaperEvents);\n}\n"],"names":["addPaperEventListeners","isPaperTarget","useResolvePaperId","usePaperStore","useOnEvents"],"mappings":"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"}