{"version":3,"file":"use-paper.cjs","sources":["../../../src/hooks/use-paper.ts"],"sourcesContent":["import { useContext, useMemo, useReducer, useLayoutEffect, useRef } from 'react';\nimport { PaperStoreContext } from '../context';\nimport type { PaperStore } from '../store';\nimport { useGraphStore } from './use-graph-store';\nimport { useInternalData } from './use-stores';\nimport type { PaperView } from '../mvc/paper';\nimport { DEFAULT_PAPER_ID } from '../mvc/paper';\nimport type { PaperTarget } from '../types';\nimport { resolvePaperId } from '../utils/resolve-paper-target';\nimport { isRef } from '../utils/is';\n\n/**\n * Resolves a paper ID from any {@link PaperTarget}, handling the ref-timing problem.\n * For string IDs and `dia.Paper` instances resolution is synchronous. For\n * `RefObject<dia.Paper>` targets, a layout effect re-resolves the ID once\n * `useImperativeHandle` has set the ref.\n * @param paperTarget - The paper target to resolve.\n * @returns The paper ID string, or `undefined` when not yet available.\n * @internal\n */\nexport function useResolvePaperId(paperTarget: PaperTarget | undefined): string | undefined {\n  const isRefTarget = isRef(paperTarget);\n  const paperId = resolvePaperId(paperTarget);\n  const [, forceRender] = useReducer((c: number) => c + 1, 0);\n  const resolvedIdRef = useRef<string | null>(paperId);\n  resolvedIdRef.current = paperId;\n\n  useLayoutEffect(() => {\n    if (!isRefTarget || resolvedIdRef.current) return;\n    const resolvedId = resolvePaperId(paperTarget);\n    if (resolvedId) {\n      resolvedIdRef.current = resolvedId;\n      forceRender();\n    }\n  });\n\n  return resolvedIdRef.current ?? undefined;\n}\n\n/**\n * Returns the active paper store from context, by ID, or via the default paper.\n *\n * A paper store is view-access: it exists only once a `<Paper>` has mounted, so\n * the result is `PaperStore | undefined` and this hook never throws.\n *\n * Resolution order (no explicit id):\n * 1. `PaperStoreContext` (when called inside a `<Paper>` subtree)\n * 2. `DEFAULT_PAPER_ID` lookup (when a single `<Paper>` exists without an explicit `id`)\n * @param paperId - An explicit paper id, or omitted for the context/default paper.\n * @returns The resolved paper store, or `undefined` when no paper is mounted yet.\n * @internal\n */\nexport function usePaperStore(paperId?: string): PaperStore | undefined {\n  const contextStore = useContext(PaperStoreContext);\n  const { getPaperStore } = useGraphStore();\n\n  const paperStoreById = useInternalData((snapshot) => {\n    if (paperId) {\n      return snapshot.papers[paperId] ? (getPaperStore(paperId) ?? null) : null;\n    }\n    if (!contextStore && snapshot.papers[DEFAULT_PAPER_ID]) {\n      return getPaperStore(DEFAULT_PAPER_ID) ?? null;\n    }\n    return null;\n  });\n\n  if (paperId) return paperStoreById ?? undefined;\n  if (contextStore) return contextStore;\n  return paperStoreById ?? undefined;\n}\n\n/**\n * Result of {@link usePaper}, the paper instance and imperative actions.\n * @expand\n * @group Types\n */\nexport interface PaperApi {\n  /** Resolved JointJS paper instance, or `null` until a `<Paper>` has mounted. */\n  readonly paper: PaperView | null;\n  /**\n   * Trigger a render pass on the paper. Forwards to `paper.wakeUp()`.\n   * No-op when the paper isn't resolved yet.\n   * @see [`paper.wakeUp()`](https://docs.jointjs.com/api/dia/Paper#wakeup)\n   */\n  readonly wakeUp: () => void;\n  /**\n   * Suspend view updates so edits don't repaint until {@link PaperApi.unfreeze}.\n   * Forwards to `paper.freeze()`. No-op when the paper isn't resolved yet.\n   * @see [`paper.freeze()`](https://docs.jointjs.com/api/dia/Paper#freeze)\n   */\n  readonly freeze: () => void;\n  /**\n   * Resume view updates and flush everything queued while frozen. Forwards to\n   * `paper.unfreeze()`. No-op when the paper isn't resolved yet.\n   * @see [`paper.unfreeze()`](https://docs.jointjs.com/api/dia/Paper#unfreeze)\n   */\n  readonly unfreeze: () => void;\n}\n\n/**\n * Access the JointJS paper (`dia.Paper`) instance for the surrounding `<Paper>`,\n * a specific paper by id, or the default paper. Use it to drive the paper\n * imperatively, scale, fit content, or wake it up, from anywhere under a\n * {@link GraphProvider}.\n *\n * The returned object is referentially stable for a given resolved paper; its\n * `paper` is `null` until the `<Paper>` view has mounted, so guard calls with\n * `paper?.`.\n * @param paperId - An explicit paper id, or omitted for the context/default paper.\n * @returns The {@link PaperApi}: the resolved `paper` (or `null`) plus `wakeUp`,\n *          `freeze`, and `unfreeze` actions.\n * @see [Paper quickstart](https://docs.jointjs.com/learn/quickstart/paper)\n * @group Hooks\n * @example\n * ```tsx\n * import { GraphProvider, Paper, usePaper } from '@joint/react';\n *\n * function FitButton() {\n *   const { paper } = usePaper();\n *   // `paper` is null until the <Paper> view has mounted.\n *   return <button onClick={() => paper?.transformToFitContent({ padding: 20 })}>Fit</button>;\n * }\n *\n * function App() {\n *   return (\n *     <GraphProvider>\n *       <Paper />\n *       <FitButton />\n *     </GraphProvider>\n *   );\n * }\n * ```\n */\nexport function usePaper(paperId?: string): PaperApi {\n  const paperStore = usePaperStore(paperId);\n  const paper = paperStore?.paper ?? null;\n  // The memo already recomputes only when `paper` changes, so the actions are\n  // stable without separate useCallbacks — define them inline.\n  return useMemo(\n    () => ({\n      paper,\n      wakeUp: () => paper?.wakeUp(),\n      freeze: () => paper?.freeze(),\n      unfreeze: () => paper?.unfreeze(),\n    }),\n    [paper]\n  );\n}\n"],"names":["isRef","resolvePaperId","useReducer","useRef","useLayoutEffect","useContext","PaperStoreContext","useGraphStore","useInternalData","DEFAULT_PAPER_ID","useMemo"],"mappings":";;;;;;;;;;;;;;;;;AAoBO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA0D,CAAA;AAC1F,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAcA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAM,WAAW,CAAA,CAAA;AACrC,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAUC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAe,WAAW,CAAA,CAAA;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,GAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAW,CAAC,CAAA,KAAc,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA;AAC1D,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAsB,OAAO,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAExB,CAAA,CAAAC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,OAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC3C,CAAA,CAAA,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAaH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAe,WAAW,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,UAAA,CAAA,CAAY,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAA;AAAA,CAAA,CAAA,CAAA,CACd,CAAA;AAAA,CAAA,CACF,CAAC,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAClC,CAAA;AAeO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA0C,CAAA;AACtE,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAeI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAWC,uBAAiB,CAAA,CAAA;AACjD,CAAA,CAAA,MAAM,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAIC,2BAAA,CAAA,CAAc,CAAA;AAExC,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiBC,yBAAA,CAAgB,CAAC,QAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAA,CAAA,CAAS,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACvE,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB,CAAA,CAAA,CAAG,CAAA;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAcA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB,CAAA,IAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAC5C,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CACT,CAAC,CAAA,CAAA;AAED,CAAA,CAAA,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC3B,CAAA;AAgEO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA4B,CAAA;AACnD,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAc,OAAO,CAAA,CAAA;AACxC,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,YAAY,CAAA,CAAA,CAAA,CAAA,CAAA,IAAS,CAAA,CAAA,CAAA,CAAA,CAAA;AAGnC,CAAA,CAAA,OAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,MAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAA,CAAA,CAAO,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC5B,MAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAA,CAAA,CAAO,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAS,CAAA,CAAA,CAAA,CAAA,CAClC,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA;AAAA,CAAA,CAAA,CACR,CAAA;AACF,CAAA;;;;"}