{"version":3,"file":"can-embed.cjs","sources":["../../../src/presets/can-embed.ts"],"sourcesContent":["import type { dia } from '@joint/core';\n\n/**\n * Context handed to a {@link ValidateEmbedding} callback while an element is\n * dragged over a candidate parent. Use it to compare the dragged `child` against\n * the `parent` it would drop into.\n * @group Types\n * @expand\n */\nexport interface ValidateEmbeddingParams {\n  /** The element being dragged (the would-be child). */\n  readonly child: { readonly id: dia.Cell.ID; readonly model: dia.Element };\n  /** The element it would be embedded into (the would-be parent). */\n  readonly parent: { readonly id: dia.Cell.ID; readonly model: dia.Element };\n  /** The paper the elements live on. */\n  readonly paper: dia.Paper;\n  /** The graph the elements belong to. */\n  readonly graph: dia.Graph;\n}\n\n/**\n * Context handed to a {@link ValidateUnembedding} callback when an embedded\n * element is dragged out of its parent.\n * @group Types\n * @expand\n */\nexport interface ValidateUnembeddingParams {\n  /** The embedded element being dragged out of its parent. */\n  readonly child: { readonly id: dia.Cell.ID; readonly model: dia.Element };\n  /** The paper the element lives on. */\n  readonly paper: dia.Paper;\n  /** The graph the element belongs to. */\n  readonly graph: dia.Graph;\n}\n\n/**\n * Decides whether a dragged element may be embedded into a parent element.\n * Return `true` to allow the drop, `false` to reject it. Pass it to the\n * `validateEmbedding` prop of `<Paper>`; the callback receives a structured\n * {@link ValidateEmbeddingParams} context.\n * @group Types\n * @example\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n * import type { ValidateEmbedding } from '@joint/react';\n *\n * // Only \"container\" elements may accept children.\n * const validate: ValidateEmbedding = ({ parent }) => parent.model.get('type') === 'container';\n *\n * <GraphProvider>\n *   <Paper validateEmbedding={validate} renderElement={() => <rect width={80} height={40} />} />\n * </GraphProvider>;\n * ```\n */\nexport type ValidateEmbedding = (context: ValidateEmbeddingParams) => boolean;\n\n/**\n * Decides whether an embedded element may be detached from its parent. Return\n * `true` to allow detaching, `false` to keep it embedded. Pass it to the\n * `validateUnembedding` prop of `<Paper>`; the callback receives a structured\n * {@link ValidateUnembeddingParams} context.\n * @group Types\n * @example\n * ```tsx\n * import { GraphProvider, Paper } from '@joint/react';\n * import type { ValidateUnembedding } from '@joint/react';\n *\n * // Keep \"locked\" elements embedded; everything else can be dragged out.\n * const validate: ValidateUnembedding = ({ child }) => !child.model.get('locked');\n *\n * <GraphProvider>\n *   <Paper validateUnembedding={validate} renderElement={() => <rect width={80} height={40} />} />\n * </GraphProvider>;\n * ```\n */\nexport type ValidateUnembedding = (context: ValidateUnembeddingParams) => boolean;\n\n/**\n * Converts a `dia.ElementView` into a structured `{ id, model }` info record.\n * @param view\n */\nfunction toEmbeddingInfo(view: dia.ElementView) {\n  return { id: view.model.id, model: view.model } as const;\n}\n\n/**\n * Creates a JointJS-native `validateEmbedding` function.\n * Converts positional `(childView, parentView)` args into a structured\n * `{ child, parent, paper, graph }` context for the validate callback.\n * @param validate - Optional custom validation. Defaults to `() => true`.\n * @returns A JointJS-compatible `validateEmbedding` function.\n */\nexport function canEmbed(validate?: (context: ValidateEmbeddingParams) => boolean) {\n  if (!validate) return () => true;\n  return (childView: dia.ElementView, parentView: dia.ElementView): boolean => {\n    const paper = childView.paper!;\n    return validate({\n      child: toEmbeddingInfo(childView),\n      parent: toEmbeddingInfo(parentView),\n      paper,\n      graph: paper.model,\n    });\n  };\n}\n\n/**\n * Creates a JointJS-native `validateUnembedding` function.\n * Converts the positional `(childView)` arg into a structured\n * `{ child, paper, graph }` context for the validate callback.\n * @param validate - Optional custom validation. Defaults to `() => true`.\n * @returns A JointJS-compatible `validateUnembedding` function.\n */\nexport function canUnembed(validate?: (context: ValidateUnembeddingParams) => boolean) {\n  if (!validate) return () => true;\n  return (childView: dia.ElementView): boolean => {\n    const paper = childView.paper!;\n    return validate({\n      child: toEmbeddingInfo(childView),\n      paper,\n      graph: paper.model,\n    });\n  };\n}\n"],"names":[],"mappings":";;;;;;;;;AAiFA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAE,CAAA,CAAA,CAAA,CAAI,IAAA,CAAK,CAAA,CAAA,CAAA,CAAA,EAAM,CAAA,CAAA,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,EAAK,KAAA,CAAA,CAAM,CAAA;AAChD,CAAA;AASO,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,CAAA,CAA0D,CAAA;AACjF,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAA4B,UAAA,CAAA,CAAA,CAAA,CAAA,CAAyC,CAAA;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,IAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,QAAA,CAAS,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAgB,SAAS,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAgB,UAAU,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CAAA,CAAA,CAAA,CAAA,GAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CACd,CAAA,CAAA;AAAA,CAAA,CACH,CAAA,CAAA;AACF,CAAA;AASO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA4D,CAAA;AACrF,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwC,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,IAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,QAAA,CAAS,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAgB,SAAS,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CAAA,CAAA,CAAA,CAAA,GAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CACd,CAAA,CAAA;AAAA,CAAA,CACH,CAAA,CAAA;AACF,CAAA;;;"}