{"version":3,"file":"element-attributes.cjs","sources":["../../../src/presets/element-attributes.ts"],"sourcesContent":["import { util } from '@joint/core';\nimport { elementPorts } from './element-ports';\nimport type { dia } from '@joint/core';\nimport type { ElementPort } from './element-ports';\n\n/**\n * React-side declarative fields the preset adds on top of `dia.Element.Attributes`.\n * Composed orthogonally into both `ElementAttributes` (preset input) and\n * `ElementJSONInit` (record/mapper boundary).\n * @group Types\n */\nexport interface ElementPresetAttributes {\n  /** Ports keyed by id; each value is an {@link ElementPort} expanded into native `ports` by {@link elementPorts}, and its key becomes the port id. */\n  portMap?: Record<string, ElementPort>;\n  /** Shared {@link ElementPort} styling merged into every `portMap` entry before that entry's own values. */\n  portStyle?: Partial<ElementPort>;\n}\n\n/**\n * Loose preset input, no `type` required. `dia.Element.Attributes` plus the\n * React preset extras (`portMap`, `portStyle`).\n * @expand\n * @group Types\n */\nexport interface ElementAttributes extends dia.Element.Attributes, ElementPresetAttributes {}\n\n/**\n * Normalizes a declarative element description into JointJS cell attributes.\n * The `portMap` shorthand is expanded into native `ports` via {@link elementPorts}\n * (and kept on the result as `portMap`); a native `ports` value is passed through\n * untouched. Use it when feeding a {@link ElementModel} or building a model's\n * `defaults()`.\n * @param element - The declarative element description to convert.\n * @returns Attributes ready to pass to an element model.\n * @throws TypeError when `element` is not a plain object.\n * @throws Error when both `portMap` and `ports` are supplied.\n * @example\n * Feed an element model:\n * ```tsx\n * import { ElementModel, elementAttributes } from '@joint/react';\n *\n * const element = new ElementModel(\n *   elementAttributes({\n *     type: 'standard.Rectangle',\n *     position: { x: 10, y: 20 },\n *     size: { width: 120, height: 40 },\n *     portMap: { in: { color: '#fff', cx: 0, cy: 0.5 } }, // preset shorthand\n *   })\n * );\n * ```\n * @example\n * Build a custom model's defaults:\n * ```tsx\n * import { ElementModel, elementAttributes } from '@joint/react';\n *\n * class RectShape extends ElementModel {\n *   defaults() {\n *     return {\n *       ...super.defaults(),\n *       ...elementAttributes({\n *         type: 'standard.Rectangle',\n *         size: { width: 120, height: 40 },\n *       }),\n *     };\n *   }\n * }\n * ```\n * @group Presets\n */\nexport function elementAttributes(element: ElementAttributes): dia.Element.Attributes {\n  if (!util.isObject(element)) {\n    throw new TypeError('Invalid element format: expected an object.');\n  }\n\n  const { portMap, ports, ...attributes } = element;\n\n  if (portMap) {\n    if (ports) {\n      throw new Error('Cannot use both \"portMap\" and \"ports\" on the same element.');\n    }\n    attributes.ports = elementPorts(portMap, element.portStyle);\n    attributes.portMap = portMap;\n  } else if (ports) {\n    attributes.ports = ports;\n  }\n\n  return attributes;\n}\n"],"names":["util","elementPorts"],"mappings":";;;;;;;;;;;;AAqEO,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,CAAoD,CAAA;AACpF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAACA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAK,QAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAG,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,6CAA6C,CAAA,CAAA;AAAA,CAAA,CACnE,CAAA;AAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAW,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAA,CAAA,CAAS,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAA,CAAA,CAAO,CAAA;AACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,EAAM,4DAA4D,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAC9E,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CACvB,WAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CACrB,CAAA;AAEA,CAAA,CAAA,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACT,CAAA;;"}