{"version":3,"file":"connection-strategy.cjs","sources":["../../../src/presets/connection-strategy.ts"],"sourcesContent":["import type { dia, connectionStrategies } from '@joint/core';\nimport { connectionStrategies as strategies } from '@joint/core';\n\n/**\n * Context handed to a {@link ConnectionStrategy} `customize` callback after a\n * link end is dropped. Describes where the end landed (cell, magnet, drop point)\n * so the callback can return the final end definition.\n * @group Types\n * @expand\n */\nexport interface ConnectionStrategyParams {\n  /** The end definition to return, pre-filled by the selected pin mode (or the dropped end when pinning is off). */\n  readonly end: dia.Link.EndJSON;\n  /** The cell the end was dropped on. */\n  readonly model: dia.Cell;\n  /** The magnet element the end was dropped on. */\n  readonly magnet: Element;\n  /** Paper-space point where the end was dropped. */\n  readonly dropPoint: dia.Point;\n  /** Which end was dropped: `'source'` or `'target'`. */\n  readonly endType: dia.LinkEnd;\n  /** The link being reconnected. */\n  readonly link: dia.Link;\n  /** The paper the link is drawn on. */\n  readonly paper: dia.Paper;\n  /** The graph the link belongs to. */\n  readonly graph: dia.Graph;\n}\n\n/**\n * How a dropped link end is anchored to its target:\n * - `'none'` — keep the JointJS defaults (attach to the cell/port, no fixed anchor).\n * - `'absolute'` — pin the end at a fixed pixel offset within the target.\n * - `'relative'` — pin the end at an offset given as a percentage of the target's size, so it tracks resizing.\n * @group Types\n */\nexport type ConnectionStrategyPin = 'none' | 'absolute' | 'relative';\n\n/**\n * Options for the `connectionStrategy` prop of `<Paper>`: pick how a dropped link\n * end is pinned and, optionally, post-process the resulting end definition.\n * @group Types\n * @expand\n * @example\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n *\n * // Pin dropped ends at a relative (%) offset of their target.\n * <GraphProvider>\n *   <Paper connectionStrategy={{ pin: 'relative' }} renderElement={() => <rect width={80} height={40} />} />\n * </GraphProvider>;\n * ```\n */\nexport interface ConnectionStrategyOptions {\n  /** How to anchor the dropped end, see {@link ConnectionStrategyPin}. @default 'none' */\n  readonly pin?: ConnectionStrategyPin;\n  /** Runs after pinning; receives the already-pinned end (or the original when `pin` is `'none'`) and returns the final end definition. */\n  readonly customize?: ConnectionStrategy;\n}\n\n/**\n * Computes the final end definition stored on a link after one of its ends is\n * dropped. Pass it (or a {@link ConnectionStrategyOptions} object) to the\n * `connectionStrategy` prop of `<Paper>`; the callback receives a structured\n * {@link ConnectionStrategyParams} context and returns the end JSON to save.\n * @group Types\n * @example\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n * import type { ConnectionStrategy } from '@joint/react';\n *\n * // Snap the dropped end exactly to the pointer position.\n * const strategy: ConnectionStrategy = ({ end, dropPoint }) => ({ ...end, x: dropPoint.x, y: dropPoint.y });\n *\n * <GraphProvider>\n *   <Paper connectionStrategy={strategy} renderElement={() => <rect width={80} height={40} />} />\n * </GraphProvider>;\n * ```\n */\nexport type ConnectionStrategy = (context: ConnectionStrategyParams) => dia.Link.EndJSON;\n\nconst PIN_STRATEGIES: Record<ConnectionStrategyPin, connectionStrategies.ConnectionStrategy> = {\n  none: strategies.useDefaults,\n  absolute: strategies.pinAbsolute,\n  relative: strategies.pinRelative,\n};\n\n/**\n * Creates a JointJS-native `connectionStrategy` function with a structured API.\n *\n * The returned callback runs the selected `pin` strategy first, then passes the\n * pinned `EndJSON` into the optional `customize` callback as a structured context.\n * @param options - Pin preset and/or a custom post-processor.\n * @returns A JointJS-compatible `connectionStrategy` callback.\n */\nexport function connectionStrategy(\n  options: ConnectionStrategyOptions = {},\n): connectionStrategies.ConnectionStrategy {\n  const { pin = 'none', customize } = options;\n  const pinStrategy = PIN_STRATEGIES[pin];\n  if (!pinStrategy) {\n    throw new Error(\n      `connectionStrategy: unknown pin '${pin}'. Expected 'none', 'absolute', or 'relative'.`,\n    );\n  }\n\n  return function(endDefinition, endView, magnet, coords, link, endType) {\n    const paper = endView.paper!;\n    // Base strategies may return undefined (e.g. useDefaults) — fall back to the incoming endDefinition.\n    const defaultEnd = pinStrategy.call(paper, endDefinition, endView, magnet, coords, link, endType) ?? endDefinition;\n    if (!customize) return defaultEnd;\n    return customize({\n      end: defaultEnd,\n      model: endView.model,\n      magnet,\n      dropPoint: coords,\n      endType,\n      link,\n      paper,\n      graph: paper.model,\n    });\n  };\n}\n"],"names":["strategies"],"mappings":"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"}