{"version":3,"file":"graph-provider.cjs","sources":["../../../../src/components/graph/graph-provider.tsx"],"sourcesContent":["import type { dia } from '@joint/core';\nimport React, { useLayoutEffect } from 'react';\nimport { useImperativeApi } from '../../hooks/use-imperative-api';\nimport { GraphStoreContext } from '../../context';\nimport { GraphStore } from '../../store';\nimport type { AutoSizeOrigin } from '../../store/graph-store';\nimport type { OnIncrementalCellsChange } from '../../store/graph-projection';\nimport type { ElementJSONInit, LinkJSONInit, CellInput } from '../../types/cell.types';\n\n/** Cells array accepted by GraphProvider. */\ntype ProviderCells<Element extends ElementJSONInit, Link extends LinkJSONInit> = ReadonlyArray<\n  Element | Link\n>;\n\n/**\n * Props for {@link GraphProvider} — pick the graph source (existing\n * instance, initial cells, or a controlled cells array) and subscribe to changes.\n * @template Element - Shape of the element cells stored in the graph.\n * @template Link - Shape of the link cells stored in the graph.\n * @expand\n * @group Types\n */\nexport interface GraphProviderProps<\n  Element extends ElementJSONInit = ElementJSONInit,\n  Link extends LinkJSONInit = LinkJSONInit,\n> {\n  /**\n   * Pre-existing JointJS graph instance to use. If omitted, GraphProvider\n   * creates a fresh `new dia.Graph(...)`.\n   * @see [`dia.Graph`](https://docs.jointjs.com/api/dia/Graph)\n   */\n  readonly graph?: dia.Graph;\n  /** React children rendered inside the provider, typically a `<Paper />`. */\n  readonly children?: React.ReactNode;\n  /**\n   * Cell namespace passed to `new dia.Graph`. Your entries are merged on top of\n   * the built-ins, so JointJS shapes and the `@joint/react` {@link ElementModel}\n   * / {@link LinkModel} stay available even when you register custom shapes.\n   * @default JointJS `shapes` plus the `@joint/react` cell models\n   */\n  readonly cellNamespace?: unknown;\n  /**\n   * Base model class used for every cell the graph constructs from JSON. Maps to\n   * the (deprecated) `cellModel` option of `dia.Graph`; prefer `cellNamespace`,\n   * which registers shapes by `type` and supports per-type model classes.\n   * @see [`dia.Graph`](https://docs.jointjs.com/api/dia/Graph)\n   */\n  readonly cellModel?: typeof dia.Cell;\n  /**\n   * Reference point that stays fixed when an auto-sized element's measured\n   * size changes (via {@link useMeasureElement}). Mirrors CSS `transform-origin` semantics.\n   * - `'top-left'` (default): element grows right/down.\n   * - `'center'`: element grows symmetrically, its geometric center stays put.\n   *\n   * Only affects measurement-driven writes. Manual `cell.resize()`, interactive\n   * resize tools, and direct `cell.set('size', ...)` calls are unaffected.\n   * @default 'top-left'\n   */\n  readonly autoSizeOrigin?: AutoSizeOrigin;\n  /**\n   * Pre-built `GraphStore` instance. When provided, GraphProvider does not own its lifecycle.\n   * @hidden\n   */\n  readonly store?: GraphStore<Element, Link>;\n\n  /**\n   * Cells used to seed the graph once, at mount, for uncontrolled mode. Later\n   * changes to this array are not applied. Ignored when `cells` is provided.\n   * @see {@link CellInput}\n   */\n  readonly initialCells?: ReadonlyArray<CellInput<Element, Link>>;\n  /**\n   * Controlled cells array. Whenever this array changes, the graph is re-synced\n   * to match it (and `initialCells` is ignored); passing the same reference on a\n   * re-render does not re-sync. Pair it with `onCellsChange` to mirror user edits\n   * back into your own state.\n   */\n  readonly cells?: ProviderCells<Element, Link>;\n  /**\n   * Fires after each graph change with the full, updated cells array. Use it to\n   * keep external React state in sync with the graph; it is notification only\n   * and does not itself write anything back into the graph.\n   */\n  readonly onCellsChange?: (newCells: ProviderCells<Element, Link>) => void;\n  /**\n   * Fires after each commit with the granular `added` / `changed` / `removed`\n   * delta, so you can apply just the change to an external store (Redux, Zustand,\n   * etc.). Works in both controlled and uncontrolled mode.\n   * @see {@link IncrementalCellsChange}\n   */\n  readonly onIncrementalCellsChange?: OnIncrementalCellsChange<Element, Link>;\n}\n\n/**\n * Provider props normalised to the unparameterised base shape.\n *\n * Internally GraphProvider stores the `GraphStore` with default generics\n * (`ElementAttributes` / `LinkAttributes`). Each `useGraphStore<E, L>()` call\n * re-binds the generics on read, the runtime instance is the same.\n */\ntype GraphProviderBaseInternalProps = GraphProviderProps<ElementJSONInit, LinkJSONInit>;\n\n/**\n * Internal base component for GraphProvider.\n *\n * Operates exclusively on the base record shape so the runtime instance can\n * flow into the unparameterised `GraphStoreContext` without a variance cast.\n * The exported {@link GraphProvider} re-types this base to the caller's `<Element,\n * Link>` parameters.\n * @param props - GraphProvider props.\n * @returns The rendered graph context provider or null while loading.\n */\nfunction GraphBase(props: Readonly<GraphProviderBaseInternalProps>): React.ReactNode {\n  const {\n    children,\n    store,\n    onIncrementalCellsChange,\n    onCellsChange,\n    graph,\n    cellNamespace,\n    cellModel,\n    autoSizeOrigin,\n    initialCells,\n    cells,\n  } = props;\n\n  const isControlled = !!cells;\n\n  const { isReady, ref } = useImperativeApi<GraphStore<ElementJSONInit, LinkJSONInit>>(\n    {\n      onLoad() {\n        const graphStore =\n          store ??\n          new GraphStore<ElementJSONInit, LinkJSONInit>({\n            graph,\n            cellNamespace,\n            cellModel,\n            initialCells: cells ?? initialCells ?? [],\n            autoSizeOrigin,\n          });\n        return {\n          cleanup() {\n            if (store) return;\n            graphStore.destroy(!!graph);\n          },\n          instance: graphStore,\n        };\n      },\n    },\n    []\n  );\n\n  useLayoutEffect(() => {\n    if (!isReady) return;\n    ref.current.setOnIncrementalCellsChange((changeSet) => {\n      onIncrementalCellsChange?.(changeSet);\n      if (onCellsChange) {\n        onCellsChange([...ref.current.graphProjection.cells.getAll()]);\n        return;\n      }\n      if (isControlled) {\n        ref.current.applyControlled(cells);\n      }\n    });\n    if (isControlled) {\n      ref.current.applyControlled(cells ?? []);\n    }\n  }, [isReady, onIncrementalCellsChange, onCellsChange, ref, isControlled, cells]);\n\n  if (!isReady) {\n    return null;\n  }\n\n  return <GraphStoreContext.Provider value={ref.current}>{children}</GraphStoreContext.Provider>;\n}\n\n/**\n * Creates (or adopts) a JointJS graph and shares it with every `<Paper>` and\n * graph hook rendered inside it. Mount it near the root of your diagram: hooks\n * like {@link useGraph}, {@link useCells}, and {@link useCell} read the graph\n * from its context and throw when used outside a provider.\n *\n * It works in three modes, depending on which props you pass: pass\n * `initialCells` to let JointJS own the graph after mount (uncontrolled), pass\n * `cells` + `onCellsChange` to drive the graph from React state (controlled), or\n * pass `onIncrementalCellsChange` to forward deltas to an external store.\n * @example Uncontrolled — seed once, JointJS owns the graph\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n *\n * // `renderElement` receives the element's `data` slice only — not its\n * // geometry. Read position/size with the context hooks (e.g. useCell) when\n * // you need them.\n * <GraphProvider\n *   initialCells={[{ id: '1', type: 'element', position: { x: 20, y: 20 }, size: { width: 80, height: 40 }, data: { label: 'A' } }]}\n * >\n *   <Paper renderElement={(data) => <rect width={80} height={40} rx={4} fill=\"#4763ff\" />} />\n * </GraphProvider>\n * ```\n * @example Controlled — React state owns the cells\n * ```tsx\n * import { useState } from 'react';\n * import { GraphProvider, Paper, type CellRecord } from '@joint/react';\n *\n * const [cells, setCells] = useState<readonly CellRecord[]>([]);\n * <GraphProvider cells={cells} onCellsChange={setCells}>\n *   <Paper />\n * </GraphProvider>\n * ```\n * @example Incremental — forward deltas to an external store\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n *\n * <GraphProvider\n *   onIncrementalCellsChange={(delta) => {\n *     // forward the { added, changed, removed } delta to your external store\n *     store.apply(delta);\n *   }}\n * >\n *   <Paper />\n * </GraphProvider>\n * ```\n * @see {@link GraphProviderProps} for the full list of props.\n * @group Components\n */\nexport const GraphProvider = GraphBase as <\n  Element extends ElementJSONInit = ElementJSONInit,\n  Link extends LinkJSONInit = LinkJSONInit,\n>(\n  props: GraphProviderProps<Element, Link>\n) => ReturnType<typeof GraphBase>;\n"],"names":["useImperativeApi","graphStore","GraphStore","useLayoutEffect","GraphStoreContext"],"mappings":"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"}