UNPKG

mermaid

Version:

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

8 lines • 178 kB
{
  "version": 3,
  "sources": ["../../../src/rendering-util/labelTransform.ts", "../../../src/utils/lineWithOffset.ts", "../../../src/rendering-util/edgeStep.ts", "../../../src/rendering-util/rendering-elements/edgeStepAnimation.ts", "../../../src/rendering-util/rendering-elements/edgeMarker.ts", "../../../src/rendering-util/rendering-elements/edges.js", "../../../src/rendering-util/rendering-elements/markers.js"],
  "sourcesContent": ["/**\n * Bounding box used for label transform computation.\n * For SVG getBBox(), x/y may be present; for HTML getBoundingClientRect(), only width/height are used.\n */\nexport interface LabelBBox {\n  x?: number;\n  y?: number;\n  width: number;\n  height: number;\n}\n\n/**\n * Compute the SVG translate transform needed to center a label element at the origin.\n *\n * For HTML labels, getBoundingClientRect() is used and its x/y are viewport-absolute,\n * so only width/height are relevant for centering within the SVG group.\n *\n * For SVG labels, getBBox() returns coordinates in the element's local coordinate system.\n * When addSvgBackground is true, the background <rect> extends beyond the text (making\n * bbox.x/y negative), so we include those offsets to correctly center the visual\n * content at the origin.\n *\n * @param bbox - The bounding box of the label element\n * @param useHtmlLabels - Whether HTML labels are in use\n * @returns SVG transform string, e.g. \"translate(-20, -10)\"\n */\nexport const computeLabelTransform = (bbox: LabelBBox, useHtmlLabels: boolean): string => {\n  if (useHtmlLabels) {\n    return 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')';\n  }\n  const x = bbox.x ?? 0;\n  const y = bbox.y ?? 0;\n  return 'translate(' + -(x + bbox.width / 2) + ', ' + -(y + bbox.height / 2) + ')';\n};\n", "import type { EdgeData, Point } from '../types.js';\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets = {\n  aggregation: 17.25,\n  extension: 17.25,\n  composition: 17.25,\n  dependency: 6,\n  lollipop: 13.5,\n  arrow_point: 4,\n  arrow_barb: 0,\n  arrow_barb_neo: 5.5,\n  //arrow_cross: 24,\n} as const;\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets2 = {\n  arrow_point: 4,\n  arrow_cross: 12.5,\n  arrow_circle: 12.5,\n  arrow_open_head: 4,\n  arrow_hollow_circle: 8,\n} as const;\n\n/**\n * Calculate the deltas and angle between two points\n * @param point1 - First point\n * @param point2 - Second point\n * @returns The angle, deltaX and deltaY\n */\nfunction calculateDeltaAndAngle(\n  point1?: Point | [number, number],\n  point2?: Point | [number, number]\n): { angle: number; deltaX: number; deltaY: number } {\n  if (point1 === undefined || point2 === undefined) {\n    return { angle: 0, deltaX: 0, deltaY: 0 };\n  }\n  point1 = pointTransformer(point1);\n  point2 = pointTransformer(point2);\n  const [x1, y1] = [point1.x, point1.y];\n  const [x2, y2] = [point2.x, point2.y];\n  const deltaX = x2 - x1;\n  const deltaY = y2 - y1;\n  return { angle: Math.atan(deltaY / deltaX), deltaX, deltaY };\n}\n\nconst pointTransformer = (data: Point | [number, number]) => {\n  if (Array.isArray(data)) {\n    return { x: data[0], y: data[1] };\n  }\n  return data;\n};\n\nexport const getLineFunctionsWithOffset = (\n  edge: Pick<EdgeData, 'arrowTypeStart' | 'arrowTypeEnd'>\n) => {\n  return {\n    x: function (\n      this: void,\n      d: Point | [number, number],\n      i: number,\n      data: (Point | [number, number])[]\n    ) {\n      let offset = 0;\n      const DIRECTION =\n        pointTransformer(data[0]).x < pointTransformer(data[data.length - 1]).x ? 'left' : 'right';\n      if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n        const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]);\n        offset =\n          markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n          Math.cos(angle) *\n          (deltaX >= 0 ? 1 : -1);\n      } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n        const { angle, deltaX } = calculateDeltaAndAngle(\n          data[data.length - 1],\n          data[data.length - 2]\n        );\n        offset =\n          markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n          Math.cos(angle) *\n          (deltaX >= 0 ? 1 : -1);\n      }\n\n      const differenceToEnd = Math.abs(\n        pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n      );\n      const differenceInYEnd = Math.abs(\n        pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n      );\n      const differenceToStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n      const differenceInYStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n      const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n      const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n      const extraRoom = 1;\n\n      // Adjust the offset if the difference is smaller than the marker height\n      if (\n        differenceToEnd < endMarkerHeight &&\n        differenceToEnd > 0 &&\n        differenceInYEnd < endMarkerHeight\n      ) {\n        let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n        adjustment *= DIRECTION === 'right' ? -1 : 1;\n        // Adjust the offset by the amount needed to fit the marker\n        offset -= adjustment;\n      }\n\n      if (\n        differenceToStart < startMarkerHeight &&\n        differenceToStart > 0 &&\n        differenceInYStart < startMarkerHeight\n      ) {\n        let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n        adjustment *= DIRECTION === 'right' ? -1 : 1;\n        offset += adjustment;\n      }\n\n      return pointTransformer(d).x + offset;\n    },\n    y: function (\n      this: void,\n      d: Point | [number, number],\n      i: number,\n      data: (Point | [number, number])[]\n    ) {\n      let offset = 0;\n      const DIRECTION =\n        pointTransformer(data[0]).y < pointTransformer(data[data.length - 1]).y ? 'down' : 'up';\n      if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n        const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]);\n        offset =\n          markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n          Math.abs(Math.sin(angle)) *\n          (deltaY >= 0 ? 1 : -1);\n      } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n        const { angle, deltaY } = calculateDeltaAndAngle(\n          data[data.length - 1],\n          data[data.length - 2]\n        );\n        offset =\n          markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n          Math.abs(Math.sin(angle)) *\n          (deltaY >= 0 ? 1 : -1);\n      }\n\n      const differenceToEnd = Math.abs(\n        pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n      );\n      const differenceInXEnd = Math.abs(\n        pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n      );\n      const differenceToStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n      const differenceInXStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n      const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n      const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n      const extraRoom = 1;\n\n      // Adjust the offset if the difference is smaller than the marker height\n      if (\n        differenceToEnd < endMarkerHeight &&\n        differenceToEnd > 0 &&\n        differenceInXEnd < endMarkerHeight\n      ) {\n        let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n        adjustment *= DIRECTION === 'up' ? -1 : 1;\n        // Adjust the offset by the amount needed to fit the marker\n        offset -= adjustment;\n      }\n\n      if (\n        differenceToStart < startMarkerHeight &&\n        differenceToStart > 0 &&\n        differenceInXStart < startMarkerHeight\n      ) {\n        let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n        adjustment *= DIRECTION === 'up' ? -1 : 1;\n        offset += adjustment;\n      }\n      return pointTransformer(d).y + offset;\n    },\n  };\n};\n\nif (import.meta.vitest) {\n  const { it, expect, describe } = import.meta.vitest;\n  describe('calculateDeltaAndAngle', () => {\n    it('should calculate the angle and deltas between two points', () => {\n      expect(calculateDeltaAndAngle([0, 0], [0, 1])).toStrictEqual({\n        angle: 1.5707963267948966,\n        deltaX: 0,\n        deltaY: 1,\n      });\n      expect(calculateDeltaAndAngle([1, 0], [0, -1])).toStrictEqual({\n        angle: 0.7853981633974483,\n        deltaX: -1,\n        deltaY: -1,\n      });\n      expect(calculateDeltaAndAngle({ x: 1, y: 0 }, [0, -1])).toStrictEqual({\n        angle: 0.7853981633974483,\n        deltaX: -1,\n        deltaY: -1,\n      });\n      expect(calculateDeltaAndAngle({ x: 1, y: 0 }, { x: 1, y: 0 })).toStrictEqual({\n        angle: NaN,\n        deltaX: 0,\n        deltaY: 0,\n      });\n    });\n\n    it('should calculate the angle and deltas if one point in undefined', () => {\n      expect(calculateDeltaAndAngle(undefined, [0, 1])).toStrictEqual({\n        angle: 0,\n        deltaX: 0,\n        deltaY: 0,\n      });\n      expect(calculateDeltaAndAngle([0, 1], undefined)).toStrictEqual({\n        angle: 0,\n        deltaX: 0,\n        deltaY: 0,\n      });\n    });\n  });\n}\n", "import type { Edge } from './types.js';\n\n/** Seconds the travelling dot spends on one step when `flowchart.stepDuration` is not set. */\nexport const EDGE_STEP_DURATION = 1;\n\n/** The configured step length in seconds, or the default when it is not a positive number. */\nexport const getStepDuration = (value: unknown): number =>\n  typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : EDGE_STEP_DURATION;\n\n/** True when the edge takes part in the step animation (a positive integer `step`). */\nexport const isStepEdge = (\n  edge: Pick<Edge, 'step'>\n): edge is Pick<Edge, 'step'> & { step: number } =>\n  typeof edge.step === 'number' && Number.isInteger(edge.step) && edge.step > 0;\n", "import { select } from 'd3';\nimport type { Selection } from 'd3';\n// @ts-expect-error Incorrect khroma types\nimport { channel } from 'khroma';\nimport { EDGE_STEP_DURATION, getStepDuration, isStepEdge } from '../edgeStep.js';\nimport type { Edge } from '../types.js';\nimport type { SVGGroup } from '../../diagram-api/types.js';\nimport utils from '../../utils.js';\n\n/** Where along an edge the step badge may sit, as fractions of its length, in order of preference. */\nexport const STEP_BADGE_FRACTIONS = [0.25, 0.35, 0.15, 0.65, 0.75, 0.5, 0.85, 0.1, 0.9];\n\n/** Badge radius in diagram units; the badge keeps this size whatever the edge length. */\nexport const STEP_BADGE_RADIUS = 9;\n/** Badge text size in diagram units. */\nexport const STEP_BADGE_FONT_SIZE = 11;\n\nconst STEP_BADGE_GAP = 2;\nconst STEP_BADGE_FALLBACK_FILL = '#333333';\nconst STEP_ARROWHEAD_LENGTH = 12;\nconst STEP_ARROWHEAD_HALF_WIDTH = 6;\nconst STEP_BADGE_OFFSET = 14;\nconst STEP_TANGENT_STEP = 0.01;\nconst MIN_TEXT_CONTRAST = 4.5;\nconst TRANSLATE = /translate\\(\\s*(-?[\\d.e]+)[\\s,]+(-?[\\d.e]+)/i;\n\ninterface PathPoint {\n  x: number;\n  y: number;\n}\n\n/** Something on the diagram the badge must not cover: a box around a centre. */\nexport interface BadgeObstacle extends PathPoint {\n  halfWidth: number;\n  halfHeight: number;\n}\n\ninterface PathGeometry {\n  getTotalLength?: () => number;\n  getPointAtLength?: (distance: number) => PathPoint;\n}\n\nexport interface StepBadgeOptions {\n  points: PathPoint[];\n  pathNode?: PathGeometry | null;\n  color?: string;\n  textColors?: (string | undefined)[];\n}\n\n/** Stroke width of the highlight drawn over the edge while its step plays. */\nexport const STEP_HIGHLIGHT_STROKE_WIDTH = 4;\n/** Stroke opacity of the step highlight, so the edge line stays visible under it. */\nexport const STEP_HIGHLIGHT_STROKE_OPACITY = 0.6;\n/** Radius of the dot that travels along a step edge. */\nexport const STEP_DOT_RADIUS = 4;\n\nexport interface EdgeStepTiming {\n  begin: number;\n  dur: number;\n  gap: number;\n}\n\n/** When the dot for `step` starts, how long it runs, and how long it waits before the next loop. */\nexport const getEdgeStepTiming = (\n  step: number,\n  stepCount: number,\n  stepDuration = EDGE_STEP_DURATION\n): EdgeStepTiming => {\n  const count = Math.max(stepCount, step);\n  return {\n    begin: (step - 1) * stepDuration,\n    dur: stepDuration,\n    gap: (count - 1) * stepDuration,\n  };\n};\n\n/** A distinct id safe in animation `begin` references: starts with a letter, keeps letters and digits, encodes every other character as `_hex_`. */\nexport const toAnimationId = (value: string) =>\n  `step_${Array.from(value, (char) =>\n    /[\\dA-Za-z]/.test(char) ? char : `_${(char.codePointAt(0) ?? 0).toString(16)}_`\n  ).join('')}`;\n\nconst pathStartTranslate = (pathData: string) => {\n  const start = /^m\\s*(-?[\\d.e]+)[\\s,]+(-?[\\d.e]+)/i.exec(pathData.trim());\n  return start ? `translate(${start[1]},${start[2]}) ` : '';\n};\n\nconst escapeCssIdentifierFallback = (value: string) =>\n  Array.from(value, (char, index) => {\n    const code = char.codePointAt(0) ?? 0;\n    if (code === 0) {\n      return '\\uFFFD';\n    }\n    const isControl = code <= 0x1f || code === 0x7f;\n    const isLeadingDigit =\n      /\\d/.test(char) && (index === 0 || (index === 1 && value.startsWith('-')));\n    if (isControl || isLeadingDigit) {\n      return `\\\\${code.toString(16)} `;\n    }\n    if (value === '-') {\n      return '\\\\-';\n    }\n    return code >= 0x80 || /[\\w-]/.test(char) ? char : `\\\\${char}`;\n  }).join('');\n\n/** Escapes a string for use as a CSS identifier, using `CSS.escape` when the environment has it. */\nexport const escapeCssIdentifier = (value: string) =>\n  typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n    ? CSS.escape(value)\n    : escapeCssIdentifierFallback(value);\n\nconst ensureReducedMotionStyle = (elem: SVGGroup, diagramId: string) => {\n  const node = elem.node();\n  const svg = node?.ownerSVGElement ?? node?.closest?.('svg') ?? node;\n  const scopeId = diagramId || svg?.getAttribute('id');\n  // Never emit an unscoped rule: it would hide the dots of every other diagram on the page.\n  if (!svg || !scopeId || svg.querySelector('style.edge-step-style')) {\n    return;\n  }\n  const scope = `#${escapeCssIdentifier(scopeId)} `;\n  // Appended as a raw <style>, outside compileCSS/stylis, so it must carry the diagram id scope itself.\n  const style = svg.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'style');\n  style.setAttribute('class', 'edge-step-style');\n  style.textContent = `@media (prefers-reduced-motion: reduce) { ${scope}.edge-step-dot, ${scope}.edge-step-highlight { display: none; } }`;\n  svg.appendChild(style);\n};\n\n/** The point `fraction` of the way along the polyline through `points`, by length. */\nexport const pointAlongPolyline = (\n  points: PathPoint[],\n  fraction: number\n): PathPoint | undefined => {\n  const valid = points.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n  if (valid.length === 0) {\n    return undefined;\n  }\n  const lengths = valid\n    .slice(1)\n    .map((point, index) => Math.hypot(point.x - valid[index].x, point.y - valid[index].y));\n  let remaining = lengths.reduce((total, length) => total + length, 0) * fraction;\n  for (const [index, length] of lengths.entries()) {\n    if (remaining <= length && length > 0) {\n      const ratio = remaining / length;\n      const from = valid[index];\n      const to = valid[index + 1];\n      return { x: from.x + (to.x - from.x) * ratio, y: from.y + (to.y - from.y) * ratio };\n    }\n    remaining -= length;\n  }\n  return valid[valid.length - 1];\n};\n\n/** Samples the rendered path by length, falling back to the routed points when it has no geometry. */\nexport const createPathSampler = (points: PathPoint[], pathNode?: PathGeometry | null) => {\n  const length = typeof pathNode?.getTotalLength === 'function' ? pathNode.getTotalLength() : 0;\n  const getPoint = pathNode?.getPointAtLength?.bind(pathNode);\n  if (length > 0 && getPoint) {\n    return (fraction: number): PathPoint | undefined => {\n      const { x, y } = getPoint(length * fraction);\n      return { x, y };\n    };\n  }\n  return (fraction: number) => pointAlongPolyline(points, fraction);\n};\n\nconst roomAround = (point: PathPoint, obstacles: BadgeObstacle[]) =>\n  Math.min(\n    Number.POSITIVE_INFINITY,\n    ...obstacles.map((obstacle) => {\n      const dx = Math.max(Math.abs(point.x - obstacle.x) - obstacle.halfWidth, 0);\n      const dy = Math.max(Math.abs(point.y - obstacle.y) - obstacle.halfHeight, 0);\n      return Math.hypot(dx, dy) - STEP_BADGE_RADIUS;\n    })\n  );\n\nconst besideThePath = (\n  sample: (fraction: number) => PathPoint | undefined,\n  fraction: number\n): PathPoint[] => {\n  const point = sample(fraction);\n  const before = sample(Math.max(fraction - STEP_TANGENT_STEP, 0));\n  const after = sample(Math.min(fraction + STEP_TANGENT_STEP, 1));\n  if (!point || !before || !after) {\n    return [];\n  }\n  const length = Math.hypot(after.x - before.x, after.y - before.y);\n  if (length === 0) {\n    return [];\n  }\n  const normal = { x: -(after.y - before.y) / length, y: (after.x - before.x) / length };\n  return [1, -1].map((side) => ({\n    x: point.x + normal.x * STEP_BADGE_OFFSET * side,\n    y: point.y + normal.y * STEP_BADGE_OFFSET * side,\n  }));\n};\n\n/** The first preferred spot on the edge clear of every obstacle, then beside it, else the roomiest. */\nexport const chooseBadgePosition = (\n  sample: (fraction: number) => PathPoint | undefined,\n  obstacles: BadgeObstacle[]\n): PathPoint | undefined => {\n  const candidates = [\n    ...STEP_BADGE_FRACTIONS.map(sample),\n    ...STEP_BADGE_FRACTIONS.flatMap((fraction) => besideThePath(sample, fraction)),\n  ];\n  let best: PathPoint | undefined;\n  let bestRoom = Number.NEGATIVE_INFINITY;\n  for (const point of candidates) {\n    if (!point || !Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n      continue;\n    }\n    const room = roomAround(point, obstacles);\n    if (room >= STEP_BADGE_GAP) {\n      return point;\n    }\n    if (room > bestRoom) {\n      best = point;\n      bestRoom = room;\n    }\n  }\n  return best;\n};\n\nconst square = (point: PathPoint, half: number): BadgeObstacle => ({\n  ...point,\n  halfWidth: half,\n  halfHeight: half,\n});\n\nconst translationOf = (node: Element): PathPoint => {\n  const match = TRANSLATE.exec(node.getAttribute('transform') ?? '');\n  return match ? { x: Number(match[1]), y: Number(match[2]) } : { x: 0, y: 0 };\n};\n\n/** The summed `translate(...)` of `node` and its ancestors up to the SVG: its offset in SVG coordinates. */\nconst offsetInSvg = (node: Element | null | undefined): PathPoint => {\n  const offset = { x: 0, y: 0 };\n  for (\n    let current = node;\n    current && current.localName !== 'svg';\n    current = current.parentElement\n  ) {\n    const { x, y } = translationOf(current);\n    offset.x += x;\n    offset.y += y;\n  }\n  return offset;\n};\n\nconst boxedObstacle = (node: Element, origin: PathPoint): BadgeObstacle | undefined => {\n  if (!TRANSLATE.test(node.getAttribute('transform') ?? '')) {\n    return undefined;\n  }\n  const offset = offsetInSvg(node);\n  const x = offset.x - origin.x;\n  const y = offset.y - origin.y;\n  const box = (node as SVGGraphicsElement).getBBox?.();\n  if (!box) {\n    return undefined;\n  }\n  return {\n    x: x + box.x + box.width / 2,\n    y: y + box.y + box.height / 2,\n    halfWidth: box.width / 2,\n    halfHeight: box.height / 2,\n  };\n};\n\nconst readPoints = (path: Element): PathPoint[] => {\n  try {\n    const points: unknown = JSON.parse(atob(path.getAttribute('data-points') ?? ''));\n    return Array.isArray(points) ? (points as PathPoint[]) : [];\n  } catch {\n    return [];\n  }\n};\n\n/** The box an arrowhead covers: from `tip` back towards `from` for the arrowhead's length. */\nexport const arrowheadObstacle = (tip: PathPoint, from: PathPoint): BadgeObstacle => {\n  const length = Math.hypot(tip.x - from.x, tip.y - from.y);\n  if (length === 0) {\n    return square(tip, STEP_ARROWHEAD_LENGTH);\n  }\n  const along = { x: (tip.x - from.x) / length, y: (tip.y - from.y) / length };\n  const half = STEP_ARROWHEAD_LENGTH / 2;\n  return {\n    x: tip.x - along.x * half,\n    y: tip.y - along.y * half,\n    halfWidth: Math.abs(along.x) * half + Math.abs(along.y) * STEP_ARROWHEAD_HALF_WIDTH,\n    halfHeight: Math.abs(along.y) * half + Math.abs(along.x) * STEP_ARROWHEAD_HALF_WIDTH,\n  };\n};\n\nconst hasMarker = (path: Element, attribute: 'marker-start' | 'marker-end') => {\n  const value = path.getAttribute(attribute);\n  return !!value && value !== 'none';\n};\n\nconst arrowheadObstacles = (path: Element, origin: PathPoint): BadgeObstacle[] => {\n  const points = readPoints(path).filter(\n    (point) => Number.isFinite(point?.x) && Number.isFinite(point?.y)\n  );\n  if (points.length === 0) {\n    return [];\n  }\n  const offset = offsetInSvg(path);\n  const toSvg = (point: PathPoint) => ({\n    x: point.x + offset.x - origin.x,\n    y: point.y + offset.y - origin.y,\n  });\n  const last = points.length - 1;\n  const obstacles: BadgeObstacle[] = [];\n  if (hasMarker(path, 'marker-start')) {\n    obstacles.push(arrowheadObstacle(toSvg(points[0]), toSvg(points[Math.min(1, last)])));\n  }\n  if (hasMarker(path, 'marker-end')) {\n    obstacles.push(arrowheadObstacle(toSvg(points[last]), toSvg(points[Math.max(last - 1, 0)])));\n  }\n  return obstacles;\n};\n\n/** What no badge may cover, in SVG coordinates: labels, nodes and the arrowheads at every edge's marked ends. */\nexport const collectBadgeObstacles = (root: Element | null | undefined): BadgeObstacle[] => {\n  const origin = { x: 0, y: 0 };\n  const boxed = [...(root?.querySelectorAll('.edgeLabel, .node') ?? [])]\n    .map((obstacle) => boxedObstacle(obstacle, origin))\n    .filter((obstacle): obstacle is BadgeObstacle => obstacle !== undefined);\n  const arrowheads = [...(root?.querySelectorAll('path[data-edge=\"true\"]') ?? [])].flatMap((path) =>\n    arrowheadObstacles(path, origin)\n  );\n  return [...boxed, ...arrowheads];\n};\n\nconst edgeLabelObstacles = (edge: Edge, points: PathPoint[]): BadgeObstacle[] => {\n  if (!edge.label || points.length === 0) {\n    return [];\n  }\n  const { x, y } = utils.calcLabelPosition(points);\n  return [{ x, y, halfWidth: (edge.width ?? 0) / 2, halfHeight: (edge.height ?? 0) / 2 }];\n};\n\nconst linearChannel = (value: number) => {\n  const srgb = value / 255;\n  return srgb <= 0.03928 ? srgb / 12.92 : ((srgb + 0.055) / 1.055) ** 2.4;\n};\n\nconst relativeLuminance = (color: string): number | undefined => {\n  try {\n    const [r, g, b] = (['r', 'g', 'b'] as const).map((part) => linearChannel(channel(color, part)));\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  } catch {\n    return undefined;\n  }\n};\n\n/** The WCAG contrast ratio of two colours, or 0 when either cannot be read. */\nexport const contrastRatio = (first: string, second: string): number => {\n  const a = relativeLuminance(first);\n  const b = relativeLuminance(second);\n  if (a === undefined || b === undefined) {\n    return 0;\n  }\n  return (Math.max(a, b) + 0.05) / (Math.min(a, b) + 0.05);\n};\n\n/** The first candidate readable on `fill` (4.5:1), else the one with the most contrast. */\nexport const pickBadgeTextColor = (fill: string, candidates: (string | undefined)[]): string => {\n  const options = [...candidates.filter((color): color is string => !!color), '#ffffff', '#000000'];\n  const scored = options.map((color) => ({ color, ratio: contrastRatio(fill, color) }));\n  const readable = scored.find(({ ratio }) => ratio >= MIN_TEXT_CONTRAST);\n  return (readable ?? scored.reduce((best, next) => (next.ratio > best.ratio ? next : best))).color;\n};\n\nconst bareColor = (color?: string) => {\n  const bare = color?.replace(/^stroke:\\s*/, '').trim();\n  return bare === '' ? undefined : bare;\n};\n\n/**\n * Appends a badge with the step number on a step edge when `flowchart.stepNumbers` is on, clear of\n * `obstacles` (SVG coordinates). Returns the badge's own box in SVG coordinates.\n */\nexport const insertEdgeStepBadge = (\n  elem: SVGGroup,\n  edge: Edge,\n  options: StepBadgeOptions,\n  obstacles: BadgeObstacle[] = collectBadgeObstacles(elem.node()?.closest('svg'))\n): BadgeObstacle | undefined => {\n  if (!isStepEdge(edge) || !edge.showStepNumber) {\n    return undefined;\n  }\n  const origin = offsetInSvg(elem.node());\n  const local = obstacles.map((obstacle) => ({\n    ...obstacle,\n    x: obstacle.x - origin.x,\n    y: obstacle.y - origin.y,\n  }));\n  const position = chooseBadgePosition(createPathSampler(options.points, options.pathNode), [\n    ...local,\n    ...edgeLabelObstacles(edge, options.points),\n  ]);\n  if (!position) {\n    return undefined;\n  }\n  // A resolved colour, not currentColor, so the text contrast check below can read it.\n  const fill = bareColor(options.color) ?? STEP_BADGE_FALLBACK_FILL;\n  const badge = elem\n    .append('g')\n    .attr('class', 'edge-step-badge')\n    .attr('transform', `translate(${position.x},${position.y})`)\n    .attr('pointer-events', 'none')\n    .attr('data-step', edge.step);\n  badge.append('circle').attr('r', STEP_BADGE_RADIUS).attr('fill', fill);\n  badge\n    .append('text')\n    .attr('text-anchor', 'middle')\n    .attr('dominant-baseline', 'central')\n    .attr('font-size', STEP_BADGE_FONT_SIZE)\n    .attr('fill', pickBadgeTextColor(fill, options.textColors ?? []))\n    .text(String(edge.step));\n  return square({ x: position.x + origin.x, y: position.y + origin.y }, STEP_BADGE_RADIUS);\n};\n\n/** Shows `target` only while the step's dot is moving, by lifting its parked `scale(0)`. */\nconst showWhileStepPlays = <E extends SVGElement>(\n  target: Selection<E, unknown, Element | null, unknown>,\n  motionId: string,\n  dur: number\n) => {\n  // The parked transform keeps the target (the dot or the highlight) hidden at the path start. While\n  // the step plays, this animateTransform replaces it with scale(1) (it is not additive), dropping\n  // the translate so the highlight lies on its own path and animateMotion alone positions the dot;\n  // fill=\"remove\" restores the parked transform after.\n  target\n    .append('animateTransform')\n    .attr('attributeName', 'transform')\n    .attr('type', 'scale')\n    .attr('values', '1;1')\n    .attr('dur', `${dur}s`)\n    .attr('begin', `${motionId}.begin`)\n    .attr('fill', 'remove');\n};\n\n/**\n * Appends the dot that travels along a step edge and a highlight stroke shown while it travels,\n * plus the reduced-motion rule once per SVG.\n */\nexport const insertEdgeStepDot = (\n  elem: SVGGroup,\n  edge: Edge,\n  pathData: string,\n  diagramId: string,\n  color?: string\n) => {\n  if (!isStepEdge(edge) || !pathData) {\n    return;\n  }\n  const { begin, dur, gap } = getEdgeStepTiming(\n    edge.step,\n    edge.stepCount ?? edge.step,\n    getStepDuration(edge.stepDuration)\n  );\n  const motionId = toAnimationId(`${diagramId}-${edge.id}-step`);\n  const parked = `${pathStartTranslate(pathData)}scale(0)`;\n  const fill = color?.replace(/^stroke:\\s*/, '');\n  const highlight = elem\n    .append('path')\n    .attr('class', 'edge-step-highlight')\n    .attr('aria-hidden', 'true')\n    .attr('d', pathData)\n    .attr('fill', 'none')\n    .attr('stroke', fill ?? 'currentColor')\n    .attr('stroke-width', STEP_HIGHLIGHT_STROKE_WIDTH)\n    .attr('stroke-linecap', 'round')\n    .attr('stroke-opacity', STEP_HIGHLIGHT_STROKE_OPACITY)\n    .attr('pointer-events', 'none')\n    .attr('transform', parked)\n    .attr('data-step', edge.step);\n  showWhileStepPlays(highlight, motionId, dur);\n  const dot = elem\n    .append('circle')\n    .attr('class', 'edge-step-dot')\n    .attr('r', STEP_DOT_RADIUS)\n    .attr('aria-hidden', 'true')\n    .attr('transform', parked)\n    .attr('data-step', edge.step);\n  if (fill) {\n    dot.attr('fill', fill).attr('stroke', 'none');\n  }\n  dot\n    .append('animateMotion')\n    .attr('id', motionId)\n    .attr('path', pathData)\n    .attr('dur', `${dur}s`)\n    .attr('begin', `${begin}s;${motionId}.end+${gap}s`)\n    .attr('fill', 'remove');\n  showWhileStepPlays(dot, motionId, dur);\n  ensureReducedMotionStyle(elem, diagramId);\n};\n\ninterface QueuedBadge {\n  elem: SVGGroup;\n  edge: Edge;\n  options: StepBadgeOptions;\n}\n\nconst queuedBadges = new WeakMap<Element, QueuedBadge[]>();\n\nconst badgeLayer = (root: Element) => {\n  const existing = root.querySelector(':scope > g.edge-step-badges');\n  if (existing) {\n    return existing;\n  }\n  const layer = root.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'g');\n  layer.setAttribute('class', 'edge-step-badges');\n  return root.appendChild(layer);\n};\n\n/** Draws the badges queued for `svg` in a layer above everything else, once the whole diagram is in place. */\nexport const placeQueuedStepBadges = (svg: Element | null | undefined) => {\n  const queued = svg ? queuedBadges.get(svg) : undefined;\n  if (!svg || !queued) {\n    return;\n  }\n  queuedBadges.delete(svg);\n  const obstacles = collectBadgeObstacles(svg);\n  for (const { elem, edge, options } of queued) {\n    const root = elem.node()?.parentElement;\n    if (!root) {\n      continue;\n    }\n    const layer = select(badgeLayer(root) as SVGGElement) as unknown as SVGGroup;\n    const placed = insertEdgeStepBadge(layer, edge, options, obstacles);\n    if (placed) {\n      obstacles.push(placed);\n    }\n  }\n};\n\n/** Draws a step edge's dot and highlight now and queues its badge for `placeQueuedStepBadges`. */\nexport const insertEdgeStepMarks = (\n  elem: SVGGroup,\n  edge: Edge,\n  pathData: string,\n  diagramId: string,\n  badge: StepBadgeOptions\n) => {\n  insertEdgeStepDot(elem, edge, pathData, diagramId, badge.color);\n  const node = elem.node();\n  const svg = node?.ownerSVGElement ?? node;\n  if (!svg || !isStepEdge(edge) || !edge.showStepNumber) {\n    return;\n  }\n  queuedBadges.set(svg, [...(queuedBadges.get(svg) ?? []), { elem, edge, options: badge }]);\n};\n", "import type { SVG } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport type { EdgeData } from '../../types.js';\n/**\n * Adds SVG markers to a path element based on the arrow types specified in the edge.\n *\n * @param svgPath - The SVG path element to add markers to.\n * @param edge - The edge data object containing the arrow types.\n * @param url - The URL of the SVG marker definitions.\n * @param id - The ID prefix for the SVG marker definitions.\n * @param diagramType - The type of diagram being rendered.\n */\nexport const addEdgeMarkers = (\n  svgPath: SVG,\n  edge: Pick<EdgeData, 'arrowTypeStart' | 'arrowTypeEnd'>,\n  url: string,\n  id: string,\n  diagramType: string,\n  useMargin = false,\n  strokeColor?: string\n) => {\n  if (edge.arrowTypeStart) {\n    addEdgeMarker(\n      svgPath,\n      'start',\n      edge.arrowTypeStart,\n      url,\n      id,\n      diagramType,\n      useMargin,\n      strokeColor\n    );\n  }\n  if (edge.arrowTypeEnd) {\n    addEdgeMarker(svgPath, 'end', edge.arrowTypeEnd, url, id, diagramType, useMargin, strokeColor);\n  }\n};\n\nconst arrowTypesMap = {\n  arrow_cross: { type: 'cross', fill: false },\n  arrow_point: { type: 'point', fill: true },\n  arrow_barb: { type: 'barb', fill: true },\n  arrow_barb_neo: { type: 'barb', fill: true },\n  arrow_circle: { type: 'circle', fill: false },\n  arrow_open_head: { type: 'openArrow', fill: false },\n  arrow_hollow_circle: { type: 'hollowCircle', fill: false },\n  arrow_hierarchy: { type: 'hierarchy', fill: false },\n  aggregation: { type: 'aggregation', fill: false },\n  extension: { type: 'extension', fill: false },\n  composition: { type: 'composition', fill: true },\n  dependency: { type: 'dependency', fill: true },\n  lollipop: { type: 'lollipop', fill: false },\n  only_one: { type: 'onlyOne', fill: false },\n  zero_or_one: { type: 'zeroOrOne', fill: false },\n  one_or_more: { type: 'oneOrMore', fill: false },\n  zero_or_more: { type: 'zeroOrMore', fill: false },\n  requirement_arrow: { type: 'requirement_arrow', fill: false },\n  requirement_contains: { type: 'requirement_contains', fill: false },\n} as const;\n\nconst arrowTypesWithMarginSupport = [\n  'cross',\n  'point',\n  'circle',\n  'lollipop',\n  'aggregation',\n  'extension',\n  'composition',\n  'dependency',\n  'barb',\n];\n\nconst addEdgeMarker = (\n  svgPath: SVG,\n  position: 'start' | 'end',\n  arrowType: string,\n  url: string,\n  id: string,\n  diagramType: string,\n  useMargin = false,\n  strokeColor?: string\n) => {\n  // 'none' (and empty) are valid \"no arrowhead\" values, not unknown types. Flowchart\n  // edges without an arrow pass 'none', so warning here fires once per such edge \u2014\n  // thousands of times on large diagrams. Skip silently; only genuinely unknown types warn.\n  if (!arrowType || arrowType === 'none') {\n    return;\n  }\n\n  const arrowTypeInfo = arrowTypesMap[arrowType as keyof typeof arrowTypesMap];\n  const marginSupport = arrowTypeInfo && arrowTypesWithMarginSupport.includes(arrowTypeInfo.type);\n\n  if (!arrowTypeInfo) {\n    log.warn(`Unknown arrow type: ${arrowType}`);\n    return; // unknown arrow type, ignore\n  }\n\n  const endMarkerType = arrowTypeInfo.type;\n  const suffix = position === 'start' ? 'Start' : 'End';\n\n  const offset = useMargin && marginSupport ? '-margin' : '';\n  const originalMarkerId = `${id}_${diagramType}-${endMarkerType}${suffix}${offset}`;\n\n  // If stroke color is specified and non-empty, create or use a colored variant of the marker\n  if (strokeColor && strokeColor.trim() !== '') {\n    // Create a sanitized color value for use in IDs\n    const colorId = strokeColor.replace(/[^\\dA-Za-z]/g, '_');\n    const coloredMarkerId = `${originalMarkerId}_${colorId}`;\n\n    // Check if the colored marker already exists\n    if (!document.getElementById(coloredMarkerId)) {\n      // Get the original marker\n      const originalMarker = document.getElementById(originalMarkerId);\n      if (originalMarker) {\n        // Clone the marker and create colored version\n        const coloredMarker = originalMarker.cloneNode(true) as Element;\n        coloredMarker.id = coloredMarkerId;\n\n        // Apply colors to the paths inside the marker\n        const paths = coloredMarker.querySelectorAll('path, circle, line');\n        paths.forEach((path) => {\n          path.setAttribute('stroke', strokeColor);\n\n          // Apply fill only to markers that should be filled\n          if (arrowTypeInfo.fill) {\n            path.setAttribute('fill', strokeColor);\n          }\n        });\n\n        // Add the new colored marker to the defs section\n        originalMarker.parentNode?.appendChild(coloredMarker);\n      }\n    }\n\n    // Use the colored marker\n    svgPath.attr(`marker-${position}`, `url(${url}#${coloredMarkerId})`);\n  } else {\n    // Always use the original marker for unstyled edges\n    svgPath.attr(`marker-${position}`, `url(${url}#${originalMarkerId})`);\n  }\n};\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { getEffectiveHtmlLabels } from '../../config.js';\nimport { log } from '../../logger.js';\nimport { createText } from '../createText.js';\nimport fastdom from '../fastdom.js';\nimport { computeLabelTransform } from '../labelTransform.js';\nimport utils, { handleUndefinedAttr } from '../../utils.js';\nimport {\n  getLineFunctionsWithOffset,\n  markerOffsets,\n  markerOffsets2,\n} from '../../utils/lineWithOffset.js';\nimport { insertEdgeStepMarks } from './edgeStepAnimation.js';\nimport { getSubGraphTitleMargins } from '../../utils/subGraphTitleMargins.js';\n\nimport {\n  curveBasis,\n  curveLinear,\n  curveCardinal,\n  curveBumpX,\n  curveBumpY,\n  curveCatmullRom,\n  curveMonotoneX,\n  curveMonotoneY,\n  curveNatural,\n  curveStep,\n  curveStepAfter,\n  curveStepBefore,\n  line,\n  select,\n} from 'd3';\nimport rough from 'roughjs';\nimport createLabel from './createLabel.js';\nimport { addEdgeMarkers } from './edgeMarker.ts';\nimport { isLabelStyle, styles2String } from './shapes/handDrawnShapeStyles.js';\n\n/**\n * Resolve the effective curve type for an edge.\n * If edge.curve is a string (e.g. 'rounded', 'linear'), use it directly.\n * Otherwise (undefined, null, or a D3 CurveFactory function), fall back to config.\n * @param {*} edgeCurve - The edge.curve value (string, function, or undefined/null)\n * @returns {string|undefined} - The resolved curve type string\n */\nexport const resolveEdgeCurveType = (edgeCurve) => {\n  return typeof edgeCurve === 'string' ? edgeCurve : getConfig()?.flowchart?.curve;\n};\n\nexport const edgeLabels = new Map();\nexport const terminalLabels = new Map();\n\nexport const clear = () => {\n  edgeLabels.clear();\n  terminalLabels.clear();\n};\n\nexport const hasEdgeLabel = (edge) =>\n  Boolean(\n    edge.label ||\n      edge.startLabelLeft ||\n      edge.startLabelRight ||\n      edge.endLabelLeft ||\n      edge.endLabelRight\n  );\n\nexport const getLabelStyles = (styleArray) => {\n  if (!styleArray) {\n    return '';\n  }\n  if (typeof styleArray === 'string') {\n    return styleArray;\n  }\n  return styleArray.reduce((acc, style) => acc + ';' + style, '');\n};\n\nexport const insertEdgeLabel = async (elem, edge) => {\n  const config = getConfig();\n  let useHtmlLabels = getEffectiveHtmlLabels(config);\n  const { labelStyles } = styles2String(edge);\n  edge.labelStyle = labelStyles;\n\n  // Create outer g, edgeLabel, this will be positioned after graph layout\n  const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n  // Create inner g, label, this will be positioned now for centering the text\n  const label = edgeLabel.insert('g').attr('class', 'label').attr('data-id', edge.id);\n\n  const isMarkdown = edge.labelType === 'markdown';\n  const markdownWidth = undefined; // Use default width for markdown labels\n  const labelElement = await createText(\n    elem,\n    edge.label,\n    {\n      style: getLabelStyles(edge.labelStyle),\n      useHtmlLabels,\n      addSvgBackground: true,\n      isNode: false,\n      markdown: isMarkdown,\n      // Plain text edge labels should auto-wrap, markdown edge labels respect markdownAutoWrap config\n      width: isMarkdown ? markdownWidth : undefined,\n    },\n    config\n  );\n\n  label.node().appendChild(labelElement);\n  log.info('abc82', edge, edge.labelType);\n\n  // Center the label\n  /** @type {DOMRect} */\n  let bbox;\n  /** @type {DOMRect} */\n  let transformBbox;\n  if (useHtmlLabels) {\n    const div = labelElement.children[0];\n    const dv = select(labelElement);\n    bbox = await fastdom.measure(() => div.getBoundingClientRect());\n    transformBbox = bbox;\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  } else {\n    // For SVG labels, use text element's bbox so the text is centered on the edge\n    const textEl = select(labelElement).select('text').node();\n    await fastdom.measure(() => {\n      bbox = labelElement.getBBox();\n      if (textEl && typeof textEl.getBBox === 'function') {\n        transformBbox = textEl.getBBox();\n      } else {\n        transformBbox = bbox;\n      }\n    });\n  }\n  label.attr('transform', computeLabelTransform(transformBbox, useHtmlLabels));\n\n  // Make element accessible by id for positioning\n  edgeLabels.set(edge.id, edgeLabel);\n\n  // Update the abstract data of the edge with the new information about its width and height\n  edge.width = bbox.width;\n  edge.height = bbox.height;\n\n  let fo;\n  if (edge.startLabelLeft) {\n    // Create the actual text element\n    const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n    const startLabelElement = await createLabel(\n      inner,\n      edge.startLabelLeft,\n      getLabelStyles(edge.labelStyle) || '',\n      false,\n      false\n    );\n    fo = startLabelElement;\n    let slBox = startLabelElement.getBBox();\n    if (useHtmlLabels) {\n      const div = startLabelElement.children[0];\n      const dv = select(startLabelElement);\n      slBox = div.getBoundingClientRect();\n      dv.attr('width', slBox.width);\n      dv.attr('height', slBox.height);\n    }\n    inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n    if (!terminalLabels.get(edge.id)) {\n      terminalLabels.set(edge.id, {});\n    }\n    terminalLabels.get(edge.id).startLeft = startEdgeLabelLeft;\n    setTerminalWidth(fo, edge.startLabelLeft, slBox);\n    recordTerminalLabelSize(edge, 'startLeft', slBox);\n  }\n  if (edge.startLabelRight) {\n    const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n    const startLabelElement = await createLabel(\n      inner,\n      edge.startLabelRight,\n      getLabelStyles(edge.labelStyle) || '',\n      false,\n      false\n    );\n    fo = startLabelElement;\n    let slBox = startLabelElement.getBBox();\n    if (useHtmlLabels) {\n      const div = startLabelElement.children[0];\n      const dv = select(startLabelElement);\n      slBox = div.getBoundingClientRect();\n      dv.attr('width', slBox.width);\n      dv.attr('height', slBox.height);\n    }\n    inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n    if (!terminalLabels.get(edge.id)) {\n      terminalLabels.set(edge.id, {});\n    }\n    terminalLabels.get(edge.id).startRight = startEdgeLabelRight;\n    setTerminalWidth(fo, edge.startLabelRight, slBox);\n    recordTerminalLabelSize(edge, 'startRight', slBox);\n  }\n  if (edge.endLabelLeft) {\n    const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n    const endLabelElement = await createLabel(\n      inner,\n      edge.endLabelLeft,\n      getLabelStyles(edge.labelStyle) || '',\n      false,\n      false\n    );\n    fo = endLabelElement;\n    let slBox = endLabelElement.getBBox();\n    if (useHtmlLabels) {\n      const div = endLabelElement.children[0];\n      const dv = select(endLabelElement);\n      slBox = div.getBoundingClientRect();\n      dv.attr('width', slBox.width);\n      dv.attr('height', slBox.height);\n    }\n    inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n    if (!terminalLabels.get(edge.id)) {\n      terminalLabels.set(edge.id, {});\n    }\n    terminalLabels.get(edge.id).endLeft = endEdgeLabelLeft;\n    setTerminalWidth(fo, edge.endLabelLeft, slBox);\n    recordTerminalLabelSize(edge, 'endLeft', slBox);\n  }\n  if (edge.endLabelRight) {\n    const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n    const endLabelElement = await createLabel(\n      inner,\n      edge.endLabelRight,\n      getLabelStyles(edge.labelStyle) || '',\n      false,\n      false\n    );\n    fo = endLabelElement;\n    let slBox = endLabelElement.getBBox();\n    if (useHtmlLabels) {\n      const div = endLabelElement.children[0];\n      const dv = select(endLabelElement);\n      slBox = div.getBoundingClientRect();\n      dv.attr('width', slBox.width);\n      dv.attr('height', slBox.height);\n    }\n    inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n    if (!terminalLabels.get(edge.id)) {\n      terminalLabels.set(edge.id, {});\n    }\n    terminalLabels.get(edge.id).endRight = endEdgeLabelRight;\n    setTerminalWidth(fo, edge.endLabelRight, slBox);\n    recordTerminalLabelSize(edge, 'endRight', slBox);\n  }\n  return labelElement;\n};\n\n/**\n * Record a terminal label's measured size so a layout can reserve room for it.\n * Every terminal label is centred on its group's origin.\n *\n * @param {any} edge\n * @param {import('../types.js').TerminalLabelKey} key\n * @param {{ width: number, height: number }} box\n */\nfunction recordTerminalLabelSize(edge, key, box) {\n  edge.terminalLabelSizes ??= {};\n  edge.terminalLabelSizes[key] = { width: box.width, height: box.height };\n}\n\n/**\n * @param {any} fo\n * @param {any} value\n * @param {{ width: number, height: number }} box - the measured label\n */\nexport function setTerminalWidth(fo, value, box) {\n  if (getEffectiveHtmlLabels(getConfig()) && fo) {\n    // Never smaller than the measured text; a fixed 12px height clipped it (#8329).\n    fo.style.width = Math.max(value.length * 9, box.width) + 'px';\n    fo.style.height = box.height + 'px';\n  }\n}\n\n/**\n * Where to put an edge's label along its drawn path.\n */\nexport const resolveEdgeLabelPosition = (edge, paths) => {\n  let x = edge.x;\n  let y = edge.y;\n  if (paths?.updatedPath) {\n    const updatedMid = utils.calcLabelPosition(paths.updatedPath);\n    if (paths.originalPath) {\n      const originalMid = utils.calcLabelPosition(paths.originalPath);\n      x = edge.x + (updatedMid.x - originalMid.x);\n      y = edge.y + (updatedMid.y - originalMid.y);\n    } else {\n      x = updatedMid.x;\n      y = updatedMid.y;\n    }\n  }\n  return { x, y };\n};\n\nexport const positionEdgeLabel = (edge, paths) => {\n  log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels.get(edge.id), paths);\n  const siteConfig = getConfig();\n  const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n  if (edge.label) {\n    const el = edgeLabels.get(edge.id);\n    const { x, y } = resolveEdgeLabelPosition(edge, paths);\n    log.debug(\n      'Moving label ' + edge.label + ' from (',\n      edge.x,\n      ',',\n      edge.y,\n      ') to (',\n      x,\n      ',',\n      y,\n      ') abc88'\n    );\n    el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n  }\n\n  // `path` is still needed below for the terminal-label branches, which only read from it\n  // (they do not themselves reposition the main label).\n  const path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n\n  if (edge.startLabelLeft) {\n    const el = terminalLabels.get(edge.id).startLeft;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, 'start_left', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', `translate(${x}, ${y})`);\n  }\n  if (edge.startLabelRight) {\n    const el = terminalLabels.get(edge.id).startRight;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      const pos = utils.calcTerminalLabelPosition(\n        edge.arrowTypeStart ? 10 : 0,\n        'start_right',\n        path\n      );\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', `translate(${x}, ${y})`);\n  }\n  if (edge.endLabelLeft) {\n    const el = terminalLabels.get(edge.id).endLeft;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_left', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', `translate(${x}, ${y})`);\n  }\n  if (edge.endLabelRight) {\n    const el = terminalLabels.get(edge.id).endRight;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_right', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', `translate(${x}, ${y})`);\n  }\n};\n\n/** Distance below which two coordinates count as the same row or column. */\nconst AXIS_TOLERANCE = 0.5;\nconst sharesColumn = (a, b) => Math.abs(a.x - b.x) < AXIS_TOLERANCE;\nconst sharesRow = (a, b) => Math.abs(a.y - b.y) < AXIS_TOLERANCE;\nconst coincides = (a, b) => sharesColumn(a, b) && sharesRow(a, b);\n\n/** Whether the shape intersection stays on the axis the layout's final segment ran along. */\nfunction keepsArrivalAxis(originalLast, lastInner, candidate) {\n  if (sharesColumn(originalLast, lastInner) && !sharesRow(originalLast, lastInner)) {\n    return sharesColumn(candidate, lastInner);\n  }\n  if (sharesRow(originalLast, lastInner) && !sharesColumn(originalLast, lastInner)) {\n    return sharesRow(candidate, lastInner);\n  }\n  return sharesColumn(candidate, lastInner) || sharesRow(candidate, lastInner);\n}\n\n/** The last segment the layout drew into the node, as the point it heads for and where it left. */\nfunction arrivalSegment(originalLast, lastInner, before) {\n  return coincides(originalLast, lastInner)\n    ? { heading: lastInner, from: before }\n    : { heading: originalLast, from: lastInner };\n}\n\n/** Whether the segment to the candidate points against the direction the edge was travelling. */\nfunction runsAgainstHeading({ heading, from }, lastInner, candidate) {\n  return (\n    (heading.x - from.x) * (candidate.x - lastInner.x) +\n      (heading.y - from.y) * (candidate.y - lastInner.y) <\n    0\n  );\n}\n\n/** Moves the candidate onto the row or column the arriving segment ran along. */\nfunction snapToArrivalAxis({ heading, from }, lastInner, candidate) {\n  if (sharesRow(heading, from) && !sharesColumn(heading, from)) {\n    return { x: candidate.x, y: lastInner.y };\n  }\n  if (sharesColumn(heading, from) && !sharesRow(heading, from)) {\n    return { x: lastInner.x, y: candidate.y };\n  }\n  return candidate;\n}\n\n/** Picks the point where a swimlane edge docks on its head shape, on the axis it arrived on. */\nfunction dockFinalPoint(originalLast, lastInner, before, candidate) {\n  const wasOrthogonal = sharesColumn(originalLast, lastInner) || sharesRow(originalLast, lastInner);\n  if (wasOrthogonal && !keepsArrivalAxis(originalLast, lastInner, candidate)) {\n    return originalLast;\n  }\n  const arrival = arrivalSegment(originalLast, lastInner, before);\n  if (runsAgainstHeading(arrival, lastInner, candidate)) {\n    return lastInner;\n  }\n  return snapToArrivalAxis(arrival, lastInner, candidate);\n}\n\n/** The arrowhead's pull-back for a marker type; a type the table does not own pulls back nothing. */\nfunction markerPullBack(arrowType) {\n  const offset = Object.hasOwn(markerOffsets, arrowType) ? markerOffsets[arrowType] : 0;\n  return Number.isFinite(offset) ? offset : 0;\n}\n\n/**\n * The point a swimlane edge ends on after its last bend, or `undefined` when it ends on the bend.\n * A final segment that continues straight on and is shorter than the arrowhead's pull-back\n * would be drawn backwards, so it is dropped. A stub that turns into the node keeps the layout's\n * end, because the arrowhead must point at the node it enters.\n */\nfunction finalDockPoint({ originalLast, lastInner, newLast, minLength }) {\n  const turned = !coincides(originalLast, lastInner);\n  const length = Math.hypot(newLast.x - lastInner.x, newLast.y - lastInner.y);\n  if (length >= Math.max(AXIS_TOLERANCE, minLength)) {\n    return newLast;\n  }\n  return turned && length >= AXIS_TOLERANCE ? originalLast : undefined;\n}\n\n// Swimlanes-only helper, kept module-private: it self-gates to `-to-label` edges\n// (the swimlanes edge-label waypoint mechanism) and is called only from insertEdge's\n// `layout === 'swimlane'` branch, so it is a no-op for every other layout.\nconst orthogonalizeToLabelClippedPoints = (edge, points) => {\n  if (!edge?.isLabelEdge || !edge?.id?.endsWith('-to-label') || !Array.isArray(points)) {\n    return points;\n  }\n\n  if (points.length !== 2) {\n    return points;\n  }\n\n  const [start, end] = points;\n  const dx = Math.abs(end.x - start.x);\n  const dy = Math.abs(end.y - start.y);\n\n  if (dx < 1e-3 || dy < 1e-3) {\n    return points;\n  }\n\n  if (dy >= dx) {\n    return [start, { x: start.x, y: end.y }, end];\n  }\n\n  return [start, { x: end.x, y: start.y }, end];\n};\n\nconst outsideNode = (node, point) => {\n  const x = node.x;\n  const y = node.y;\n  const dx = Math.abs(point.x - x);\n  const dy = Math.abs(point.y - y);\n  const w = node.width / 2;\n  const h = node.height / 2;\n  return dx >= w || dy >= h;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n  log.debug(`intersection calc abc89:\n  outsidePoint: ${JSON.stringify(outsidePoint)}\n  insidePoint : ${JSON.stringify(insidePoint)}\n  node        : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n  const x = node.x;\n  const y = node.y;\n\n  const dx = Math.abs(x - insidePoint.x);\n  const w = node.width / 2;\n  let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n  const h = node.height / 2;\n\n  const Q = Math.abs(outsidePoint.y - insidePoint.y);\n  const R = Math.abs(outsidePoint.x - insidePoint.x);\n\n  if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n    // Intersection is top or bottom of rect.\n    let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n    r = (R * q) / Q;\n    const res = {\n      x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n      y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n    };\n\n    if (r === 0) {\n      res.x = outsidePoint.x;\n      res.y = outsidePoint.y;\n    }\n    if (R === 0) {\n      res.x = outsidePoint.x;\n    }\n    if (Q === 0) {\n      res.y = outsidePoint.y;\n    }\n\n    log.debug(`abc89 top/bottom calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res);\n\n    return res;\n  } else {\n    // Intersection on sides of rect\n    if (insidePoint.x < outsidePoint.x) {\n      r = outsidePoint.x - w - x;\n    } else {\n      r = x - w - outsidePoint.x;\n    }\n    let q = (Q * r) / R;\n    let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n    let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n    log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n    if (r === 0) {\n      _x = outsidePoint.x;\n      _y = outsidePoint.y;\n    }\n    if (R === 0) {\n      _x = outsidePoint.x;\n    }\n    if (Q === 0) {\n      _y = outsidePoint.y;\n    }\n\n    return { x: _x, y: _y };\n  }\n};\n\nconst cutPathAtIntersect = (_points, boundaryNode) => {\n  log.warn('abc88 cutPathAtIntersect', _points, boundaryNode);\n  let points = [];\n  let lastPointOutside = _points[0];\n  let isInside = false;\n  _points.forEach((point) => {\n    log.info('abc88 checking point', point, boundaryNode);\n\n    if (!outsideNode(boundaryNode, point) && !isInside) {\n      const inter = intersection(boundaryNode, lastPointOutside, point);\n      log.debug('abc88 inside', point, lastPointOutside, inter);\n      log.debug('abc88 intersection', inter, boundaryNode);\n\n      let pointPresent = false;\n      points.forEach((p) => {\n        pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n      });\n\n      if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n        points.push(inter);\n      } else {\n        log.warn('abc88 no intersect', inter, points);\n      }\n      isInside = true;\n    } else {\n      log.warn('abc88 outside', point, lastPointOutside);\n      lastPointOutside = point;\n      if (!isInside) {\n        points.push(point);\n      }\n    }\n  });\n  log.debug('returning points', points);\n  return points;\n};\n\nfunction extractCornerPoints(points) {\n  const cornerPoints = [];\n  const cornerPointPositions = [];\n  for (let i = 1; i < points.length - 1; i++) {\n    const prev = points[i - 1];\n    const curr = points[i];\n    const next = points[i + 1];\n    if (\n      prev.x === curr.x &&\n      curr.y === next.y &&\n      Math.abs(curr.x - next.x) > 5 &&\n      Math.abs(curr.y - prev.y) > 5\n    ) {\n      cornerPoints.push(curr);\n      cornerPointPositions.push(i);\n    } else if (\n      prev.y === curr.y &&\n      curr.x === next.x &&\n      Math.abs(curr.x - prev.x) > 5 &&\n      Math.abs(curr.y - next.y) > 5\n    ) {\n      cornerPoints.push(curr);\n      cornerPointPositions.push(i);\n    }\n  }\n  return { cornerPoints, cornerPointPositions };\n}\n\nconst findAdjacentPoint = function (pointA, pointB, distance) {\n  const xDiff = pointB.x - pointA.x;\n  const yDiff = pointB.y - pointA.y;\n  const length = Math.sqrt(xDiff * xDiff + yDiff * yDiff);\n  const ratio = distance / length;\n  return { x: pointB.x - ratio * xDiff, y: pointB.y - ratio * yDiff };\n};\n\nconst fixCorners = function (lineData) {\n  const { cornerPointPositions } = extractCornerPoints(lineData);\n  const newLineData = [];\n  for (let i = 0; i < lineData.length; i++) {\n    if (cornerPointPositions.includes(i)) {\n      const prevPoint = lineData[i - 1];\n      const nextPoint = lineData[i + 1];\n      const cornerPoint = lineData[i];\n\n      const newPrevPoint = findAdjacentPoint(prevPoint, cornerPoint, 5);\n      const newNextPoint = findAdjacentPoint(nextPoint, cornerPoint, 5);\n\n      const xDiff = newNextPoint.x - newPrevPoint.x;\n      const yDiff = newNextPoint.y - newPrevPoint.y;\n      newLineData.push(newPrevPoint);\n\n      const a = Math.sqrt(2) * 2;\n      let newCornerPoint = { x: cornerPoint.x, y: cornerPoint.y };\n      if (Math.abs(nextPoint.x - prevPoint.x) > 10 && Math.abs(nextPoint.y - prevPoint.y) >= 10) {\n        log.debug(\n          'Corner point fixing',\n          Math.abs(nextPoint.x - prevPoint.x),\n          Math.abs(nextPoint.y - prevPoint.y)\n        );\n        const r = 5;\n        if (cornerPoint.x === newPrevPoint.x) {\n          newCornerPoint = {\n            x: xDiff < 0 ? newPrevPoint.x - r + a : newPrevPoint.x + r - a,\n            y: yDiff < 0 ? newPrevPoint.y - a : newPrevPoint.y + a,\n          };\n        } else {\n          newCornerPoint = {\n            x: xDiff < 0 ? newPrevPoint.x - a : newPrevPoint.x + a,\n            y: yDiff < 0 ? newPrevPoint.y - r + a : newPrevPoint.y + r - a,\n          };\n        }\n      } else {\n        log.debug(\n          'Corner point skipping fixing',\n          Math.abs(nextPoint.x - prevPoint.x),\n          Math.abs(nextPoint.y - prevPoint.y)\n        );\n      }\n      newLineData.push(newCornerPoint, newNextPoint);\n    } else {\n      newLineData.push(lineData[i]);\n    }\n  }\n  return newLineData;\n};\n\nconst generateDashArray = (len, oValueS, oValueE) => {\n  const middleLength = len - oValueS - oValueE;\n  const dashLength = 2; // Length of each dash\n  const gapLength = 2; // Length of each gap\n  const dashGapPairLength = dashLength + gapLength;\n\n  // Calculate number of complete dash-gap pairs that can fit.\n  // Clamp to a non-negative, finite integer: a short edge (len < the combined\n  // marker offsets) makes this negative, and a degenerate path makes\n  // getTotalLength() return NaN \u2014 either would throw \"RangeError: Invalid array\n  // length\" from Array(numberOfPairs) below.\n  const rawPairs = Math.floor(middleLength / dashGapPairLength);\n  const numberOfPairs = Number.isFinite(rawPairs) ? Math.max(0, rawPairs) : 0;\n\n  // Generate the middle pattern array\n  const middlePattern = Array(numberOfPairs).fill(`${dashLength} ${gapLength}`).join(' ');\n\n  // Combine all parts\n  const dashArray = `0 ${oValueS} ${middlePattern} ${oValueE}`;\n\n  return dashArray;\n};\n\nexport const insertEdge = function (\n  elem,\n  edge,\n  clusterDb,\n  diagramType,\n  startNode,\n  endNode,\n  diagramId,\n  skipIntersect = false,\n  layoutAlgorithm = undefined\n) {\n  if (!diagramId) {\n    throw new Error(\n      `insertEdge: missing diagramId for edge \"${edge.id}\" \u2014 edge IDs require a diagram prefix for uniqueness`\n    );\n  }\n  const { handDrawnSeed, layout: configuredLayout } = getConfig();\n  const layout = layoutAlgorithm ?? configuredLayout;\n  let points = edge.points;\n  let pointsHasChanged = false;\n  const tail = startNode;\n  var head = endNode;\n  const edgeClassStyles = [];\n  for (const key in edge.cssCompiledStyles) {\n    if (isLabelStyle(key)) {\n      continue;\n    }\n    edgeClassStyles.push(edge.cssCompiledStyles[key]);\n  }\n\n  // Edge endpoint clipping. The swimlanes layout produces orthogonal edges whose\n  // axis-aligned entry/exit segments must be preserved, so it uses a dedicated\n  // boundary-clipping path. Every other layout (dagre, ELK, \u2026) keeps the original\n  // clipping below, so their edge ports are unaffected by swimlanes.\n  if (layout === 'swimlane') {\n    if (\n      !skipIntersect &&\n      head.intersect &&\n      tail.intersect &&\n      Array.isArray(points) &&\n      points.length >= 2\n    ) {\n      if (points.length === 2) {\n        // A straight edge clips each end against the shape it leaves or enters. An\n        // axis-aligned one is a port, possibly offset from the node centre: each shape is\n        // asked about its own end so sibling ports stay parallel. A slanted one has no\n        // port, so each shape is asked about the far end to pick the face it faces.\n        const [first, last] = points;\n        points =\n          sharesColumn(first, last) || sharesRow(first, last)\n            ? [tail.intersect(first), head.intersect(last)]\n            : [tail.intersect(last), head.intersect(first)];\n      } else {\n        // For multi-segment paths, keep the inner bend points and just adjust the entry/exit\n        // segments near the nodes.\n        const innerPoints = points.slice(1, -1);\n        const firstInner = innerPoints[0];\n        const lastInner = innerPoints[innerPoints.length - 1];\n        const newFirst = tail.intersect(firstInner);\n\n        const originalLast = points[points.length - 1];\n        const candidateLast = head.intersect(lastInner);\n        const before = innerPoints.at(-2) ?? points[0];\n        const newLast = dockFinalPoint(originalLast, lastInner, before, candidateLast);\n\n        const finalPoint = finalDockPoint({\n          originalLast,\n          lastInner,\n          newLast,\n          minLength: markerPullBack(edge.arrowTypeEnd),\n        });\n        const firstIsDuplicate =\n          Math.abs(newFirst.x - firstInner.x) < AXIS_TOLERANCE &&\n          Math.abs(newFirst.y - firstInner.y) < AXIS_TOLERANCE;\n\n        const startPoints = firstIsDuplicate ? [] : [newFirst];\n        const endPoints = finalPoint ? [finalPoint] : [];\n\n        points = [...startPoints, ...innerPoints, ...endPoints];\n      }\n    }\n    points = orthogonalizeToLabelClippedPoints(edge, points);\n  } else if (head.intersect && tail.intersect && !skipIntersect) {\n    // Original clipping \u2014 unchanged for dagre / ELK / every non-swimlanes layout.\n    points = points.slice(1, edge.points.length - 1);\n    points.unshift(tail.intersect(points[0]));\n    points.push(head.intersect(points[points.length - 1]));\n  }\n  const pointsStr = btoa(JSON.stringify(points));\n  if (edge.toCluster) {\n    log.info('to cluster abc88', clusterDb.get(edge.toCluster));\n    points = cutPathAtIntersect(edge.points, clusterDb.get(edge.toCluster).node);\n\n    pointsHasChanged = true;\n  }\n\n  if (edge.fromCluster) {\n    log.debug(\n      'from cluster abc88',\n      clusterDb.get(edge.fromCluster),\n      JSON.stringify(points, null, 2)\n    );\n    points = cutPathAtIntersect(points.reverse(), clusterDb.get(edge.fromCluster).node).reverse();\n\n    pointsHasChanged = true;\n  }\n\n  let lineData = points.filter((p) => !Number.isNaN(p.y));\n  // Resolve curve type: use edge.curve if it's a string, otherwise fall back to config default\n  const edgeCurveType = resolveEdgeCurveType(edge.curve);\n  // Apply fixCorners for non-rounded curves to pre-round right-angle corners\n  // (rounded curve type uses generateRoundedPath instead)\n  if (edgeCurveType !== 'rounded') {\n    lineData = fixCorners(lineData);\n  }\n  let curve = curveLinear;\n  switch (edgeCurveType) {\n    case 'linear':\n      curve = curveLinear;\n      break;\n    case 'basis':\n      curve = curveBasis;\n      break;\n    case 'cardinal':\n      curve = curveCardinal;\n      break;\n    case 'bumpX':\n      curve = curveBumpX;\n      break;\n    case 'bumpY':\n      curve = curveBumpY;\n      break;\n    case 'catmullRom':\n      curve = curveCatmullRom;\n      break;\n    case 'monotoneX':\n      curve = curveMonotoneX;\n      break;\n    case 'monotoneY':\n      curve = curveMonotoneY;\n      break;\n    case 'natural':\n      curve = curveNatural;\n      break;\n    case 'step':\n      curve = curveStep;\n      break;\n    case 'stepAfter':\n      curve = curveStepAfter;\n      break;\n    case 'stepBefore':\n      curve = curveStepBefore;\n      break;\n    case 'rounded':\n      curve = curveLinear;\n      break;\n    default:\n      curve = curveBasis;\n  }\n\n  const { x, y } = getLineFunctionsWithOffset(edge);\n  const lineFunction = line().x(x).y(y).curve(curve);\n\n  let strokeClasses;\n  switch (edge.thickness) {\n    case 'normal':\n      strokeClasses = 'edge-thickness-normal';\n      break;\n    case 'thick':\n      strokeClasses = 'edge-thickness-thick';\n      break;\n    case 'invisible':\n      strokeClasses = 'edge-thickness-invisible';\n      break;\n    default:\n      strokeClasses = 'edge-thickness-normal';\n  }\n  switch (edge.pattern) {\n    case 'solid':\n      strokeClasses += ' edge-pattern-solid';\n      break;\n    case 'dotted':\n      strokeClasses += ' edge-pattern-dotted';\n      break;\n    case 'dashed':\n      strokeClasses += ' edge-pattern-dashed';\n      break;\n    default:\n      strokeClasses += ' edge-pattern-solid';\n  }\n  let svgPath;\n  let linePath =\n    edgeCurveType === 'rounded'\n      ? generateRoundedPath(applyMarkerOffsetsToPoints(lineData, edge), 5)\n      : lineFunction(lineData);\n  const edgeStyles = Array.isArray(edge.style) ? edge.style : [edge.style];\n  let strokeColor = edgeStyles.find((style) => style?.startsWith('stroke:'));\n\n  let animationClass = '';\n  if (edge.animate) {\n    animationClass = 'edge-animation-fast';\n  }\n  if (edge.animation) {\n    animationClass = 'edge-animation-' + edge.animation;\n  }\n\n  let animatedEdge = false;\n  if (edge.look === 'handDrawn') {\n    const rc = rough.svg(elem);\n    Object.assign([], lineData);\n\n    const svgPathNode = rc.path(linePath, {\n      roughness: 0.3,\n      seed: handDrawnSeed,\n    });\n\n    strokeClasses += ' transition';\n\n    svgPath = select(svgPathNode)\n      .select('path')\n      .attr('id', `${diagramId}-${edge.id}`)\n      .attr(\n        'class',\n        ' ' +\n          strokeClasses +\n          (edge.classes ? ' ' + edge.classes : '') +\n          (animationClass ? ' ' + animationClass : '')\n      )\n      .attr('style', edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n    let d = svgPath.attr('d');\n    svgPath.attr('d', d);\n    elem.node().appendChild(svgPath.node());\n  } else {\n    const stylesFromClasses = edgeClassStyles.join(';');\n    const styles = edgeStyles ? edgeStyles.reduce((acc, style) => acc + style + ';', '') : '';\n\n    const pathStyle =\n      (stylesFromClasses ? stylesFromClasses + ';' + styles + ';' : styles) +\n      ';' +\n      (edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n    svgPath = elem\n      .append('path')\n      .attr('d', linePath)\n      .attr('id', `${diagramId}-${edge.id}`)\n      .attr(\n        'class',\n        ' ' +\n          strokeClasses +\n          (edge.classes ? ' ' + edge.classes : '') +\n          (animationClass ? ' ' + animationClass : '')\n      )\n      .attr('style', pathStyle);\n\n    //eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n    strokeColor = pathStyle.match(/stroke:([^;]+)/)?.[1];\n\n    // Possible fix to remove eslint-disable-next-line\n    //strokeColor = /stroke:([^;]+)/.exec(pathStyle)?.[1];\n\n    animatedEdge =\n      edge.animate === true || !!edge.animation || stylesFromClasses.includes('animation');\n    const pathNode = svgPath.node();\n    const len = typeof pathNode.getTotalLength === 'function' ? pathNode.getTotalLength() : 0;\n    const oValueS = markerOffsets2[edge.arrowTypeStart] || 0;\n    const oValueE = markerOffsets2[edge.arrowTypeEnd] || 0;\n\n    if (edge.look === 'neo' && !animatedEdge) {\n      const dashArray =\n        edge.pattern === 'dotted' || edge.pattern === 'dashed'\n          ? generateDashArray(len, oValueS, oValueE)\n          : `0 ${oValueS} ${len - oValueS - oValueE} ${oValueE}`;\n\n      // No offset needed because we already start with a zero-length dash that effectively sets us up for a gap at the start.\n      const mOffset = `stroke-dasharray: ${dashArray}; stroke-dashoffset: 0;`;\n      svgPath.attr('style', mOffset + svgPath.attr('style'));\n    }\n  }\n\n  // MC Special\n  svgPath.attr('data-edge', true);\n  svgPath.attr('data-et', 'edge');\n  svgPath.attr('data-id', edge.id);\n  svgPath.attr('data-points', pointsStr);\n  // Add data attributes for neo look support\n  svgPath.attr('data-look', handleUndefinedAttr(edge.look));\n  if (edge.step !== undefined) {\n    const { themeVariables } = getConfig();\n    const stepColor = strokeColor ?? themeVariables?.lineColor;\n    insertEdgeStepMarks(elem, edge, linePath, diagramId, {\n      points: lineData,\n      pathNode: svgPath.node(),\n      color: stepColor,\n      textColors: [themeVariables?.background, themeVariables?.primaryTextColor],\n    });\n  }\n  // DEBUG code, adds a red circle at each edge coordinate\n  // cornerPoints.forEach((point) => {\n  //   elem\n  //     .append('circle')\n  //     .style('stroke', 'blue')\n  //     .style('fill', 'blue')\n  //     .attr('r', 3)\n  //     .attr('cx', point.x)\n  //     .attr('cy', point.y);\n  // });\n  if (edge.showPoints) {\n    lineData.forEach((point) => {\n      elem\n        .append('circle')\n        .style('stroke', 'red')\n        .style('fill', 'red')\n        .attr('r', 1)\n        .attr('cx', point.x)\n        .attr('cy', point.y);\n    });\n  }\n  // lineData.forEach((point) => {\n  //   elem\n  //     .append('circle')\n  //     .style('stroke', 'red')\n  //     .style('fill', 'red')\n  //     .attr('r', 1)\n  //     .attr('cx', point.x)\n  //     .attr('cy', point.y);\n  // });\n\n  let url = '';\n  if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) {\n    url =\n      window.location.protocol +\n      '//' +\n      window.location.host +\n      window.location.pathname +\n      window.location.search;\n    url = url.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n  }\n  log.info('arrowTypeStart', edge.arrowTypeStart);\n  log.info('arrowTypeEnd', edge.arrowTypeEnd);\n\n  const useMargin = !animatedEdge && edge?.look === 'neo';\n  addEdgeMarkers(svgPath, edge, url, diagramId, diagramType, useMargin, strokeColor);\n  const midIndex = Math.floor(points.length / 2);\n  const point = points[midIndex];\n  if (!utils.isLabelCoordinateInPath(point, svgPath.attr('d'))) {\n    pointsHasChanged = true;\n  }\n\n  let paths = {};\n  if (pointsHasChanged) {\n    paths.updatedPath = points;\n  }\n  paths.originalPath = edge.points;\n  return paths;\n};\n\n/**\n * Generates SVG path data with rounded corners from an array of points.\n * @param {Array} points - Array of points in the format [{x: Number, y: Number}, ...]\n * @param {Number} radius - The radius of the rounded corners\n * @returns {String} - SVG path data string\n */\nexport function generateRoundedPath(points, radius) {\n  if (points.length < 2) {\n    return '';\n  }\n\n  let path = '';\n  const size = points.length;\n  const epsilon = 1e-5;\n\n  for (let i = 0; i < size; i++) {\n    const currPoint = points[i];\n    const prevPoint = points[i - 1];\n    const nextPoint = points[i + 1];\n\n    if (i === 0) {\n      // Move to the first point\n      path += `M${currPoint.x},${currPoint.y}`;\n    } else if (i === size - 1) {\n      // Last point, draw a straight line to the final point\n      path += `L${currPoint.x},${currPoint.y}`;\n    } else {\n      // Calculate vectors for incoming and outgoing segments\n      const dx1 = currPoint.x - prevPoint.x;\n      const dy1 = currPoint.y - prevPoint.y;\n      const dx2 = nextPoint.x - currPoint.x;\n      const dy2 = nextPoint.y - currPoint.y;\n\n      const len1 = Math.hypot(dx1, dy1);\n      const len2 = Math.hypot(dx2, dy2);\n\n      // Prevent division by zero\n      if (len1 < epsilon || len2 < epsilon) {\n        path += `L${currPoint.x},${currPoint.y}`;\n        continue;\n      }\n\n      // Normalize the vectors\n      const nx1 = dx1 / len1;\n      const ny1 = dy1 / len1;\n      const nx2 = dx2 / len2;\n      const ny2 = dy2 / len2;\n\n      // Calculate the angle between the vectors\n      const dot = nx1 * nx2 + ny1 * ny2;\n      // Clamp the dot product to avoid numerical issues with acos\n      const clampedDot = Math.max(-1, Math.min(1, dot));\n      const angle = Math.acos(clampedDot);\n\n      // Skip rounding if the angle is too small or too close to 180 degrees\n      if (angle < epsilon || Math.abs(Math.PI - angle) < epsilon) {\n        path += `L${currPoint.x},${currPoint.y}`;\n        continue;\n      }\n\n      // Calculate the distance to offset the control point\n      const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n\n      // Calculate the start and end points of the curve\n      const startX = currPoint.x - nx1 * cutLen;\n      const startY = currPoint.y - ny1 * cutLen;\n      const endX = currPoint.x + nx2 * cutLen;\n      const endY = currPoint.y + ny2 * cutLen;\n\n      // Draw the line to the start of the curve\n      path += `L${startX},${startY}`;\n\n      // Draw the quadratic Bezier curve\n      path += `Q${currPoint.x},${currPoint.y} ${endX},${endY}`;\n    }\n  }\n\n  return path;\n}\n// Helper function to calculate delta and angle between two points\nfunction calculateDeltaAndAngle(point1, point2) {\n  if (!point1 || !point2) {\n    return { angle: 0, deltaX: 0, deltaY: 0 };\n  }\n  const deltaX = point2.x - point1.x;\n  const deltaY = point2.y - point1.y;\n  const angle = Math.atan2(deltaY, deltaX);\n  return { angle, deltaX, deltaY };\n}\n\n// Function to adjust the first and last points of the points array\nexport function applyMarkerOffsetsToPoints(points, edge) {\n  // Copy the points array to avoid mutating the original data\n  const newPoints = points.map((point) => ({ ...point }));\n\n  // Handle the first point (start of the edge)\n  if (points.length >= 2 && markerOffsets[edge.arrowTypeStart]) {\n    const offsetValue = markerOffsets[edge.arrowTypeStart];\n\n    const point1 = points[0];\n    const point2 = points[1];\n\n    const { angle } = calculateDeltaAndAngle(point1, point2);\n\n    const offsetX = offsetValue * Math.cos(angle);\n    const offsetY = offsetValue * Math.sin(angle);\n\n    newPoints[0].x = point1.x + offsetX;\n    newPoints[0].y = point1.y + offsetY;\n  }\n\n  // Handle the last point (end of the edge)\n  const n = points.length;\n  if (n >= 2 && markerOffsets[edge.arrowTypeEnd]) {\n    const offsetValue = markerOffsets[edge.arrowTypeEnd];\n\n    const point1 = points[n - 1];\n    const point2 = points[n - 2];\n\n    const { angle } = calculateDeltaAndAngle(point2, point1);\n\n    const offsetX = offsetValue * Math.cos(angle);\n    const offsetY = offsetValue * Math.sin(angle);\n\n    newPoints[n - 1].x = point1.x - offsetX;\n    newPoints[n - 1].y = point1.y - offsetY;\n  }\n\n  return newPoints;\n}\n", "/** Setup arrow head and define the marker. The result is appended to the svg. */\nimport { log } from '../../logger.js';\nimport * as configApi from '../../config.js';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n  markerArray.forEach((markerName) => {\n    markers[markerName](elem, type, id);\n  });\n};\n\nconst extension = (elem, type, id) => {\n  log.trace('Making markers for ', id);\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-extensionStart')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 18)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-extensionEnd')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-extensionStart-margin')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 18)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('viewBox', '0 0 20 14')\n    .append('polygon')\n    .attr('points', '10,7 18,13 18,1')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '0');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-extensionEnd-margin')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 9)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('viewBox', '0 0 20 14')\n    .append('polygon')\n    .attr('points', '10,1 10,13 18,7')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '0');\n};\n\nconst composition = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-compositionStart')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 18)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-compositionEnd')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-compositionStart-margin')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 15)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 0)\n    .attr('viewBox', '0 0 15 15')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-compositionEnd-margin')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 3.5)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 0)\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-aggregationStart')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 18)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-aggregationEnd')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-aggregationStart-margin')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 15)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 2)\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-aggregationEnd-margin')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 2)\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-dependencyStart')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 6)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-dependencyEnd')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 13)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-dependencyStart-margin')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 4)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 0)\n    .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-dependencyEnd-margin')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 16)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .style('stroke-width', 0)\n    .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-lollipopStart')\n    .attr('class', 'marker lollipop ' + type)\n    .attr('refX', 13)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('circle')\n    .attr('fill', 'transparent')\n    .attr('cx', 7)\n    .attr('cy', 7)\n    .attr('r', 6);\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-lollipopEnd')\n    .attr('class', 'marker lollipop ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('circle')\n    .attr('fill', 'transparent')\n    .attr('cx', 7)\n    .attr('cy', 7)\n    .attr('r', 6);\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-lollipopStart-margin')\n    .attr('class', 'marker lollipop ' + type)\n    .attr('refX', 13)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('circle')\n    .attr('fill', 'transparent')\n    .attr('cx', 7)\n    .attr('cy', 7)\n    .attr('r', 6)\n    .attr('stroke-width', 2);\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-lollipopEnd-margin')\n    .attr('class', 'marker lollipop ' + type)\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('circle')\n    .attr('fill', 'transparent')\n    .attr('cx', 7)\n    .attr('cy', 7)\n    .attr('r', 6)\n    .attr('stroke-width', 2);\n};\nconst point = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-pointEnd')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 5)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 8)\n    .attr('markerHeight', 8)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-pointStart')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 4.5)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 8)\n    .attr('markerHeight', 8)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-pointEnd-margin') //arrows with gap(offset)\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 11.5 14')\n    .attr('refX', 11.5) // Adjust to position the arrowhead relative to the line\n    .attr('refY', 7) // Half of 14 for vertical center\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 10.5)\n    .attr('markerHeight', 14)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 0 L 11.5 7 L 0 14 z')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 0)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-pointStart-margin')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 11.5 14')\n    .attr('refX', 1)\n    .attr('refY', 7)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11.5)\n    .attr('markerHeight', 14)\n    .attr('orient', 'auto')\n    .append('polygon')\n    .attr('points', '0,7 11.5,14 11.5,0')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 0)\n    .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-circleEnd')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 11)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-circleStart')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', -1)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-circleEnd-margin')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refY', 5) // Vertical center of viewBox (0 0 10 10)\n    .attr('refX', 12.25)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 14)\n    .attr('markerHeight', 14)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 0)\n    .style('stroke-dasharray', '1,0');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-circleStart-margin')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', -2)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 14)\n    .attr('markerHeight', 14)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 0)\n    .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-crossEnd')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 11 11')\n    .attr('refX', 12)\n    .attr('refY', 5.2)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('path')\n    // .attr('stroke', 'black')\n    .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '1,0');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-crossStart')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 11 11')\n    .attr('refX', -1)\n    .attr('refY', 5.2)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('path')\n    // .attr('stroke', 'black')\n    .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-crossEnd-margin')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 15 15')\n    .attr('refX', 17.7)\n    .attr('refY', 7.5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 1,1 L 14,14 M 1,14 L 14,1')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2.5);\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-crossStart-margin')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 15 15')\n    .attr('refX', -3.5)\n    .attr('refY', 7.5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 1,1 L 14,14 M 1,14 L 14,1')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2.5)\n    .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-barbEnd')\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 14)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\nconst barbNeo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { transitionColor } = themeVariables;\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-barbEnd')\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 14)\n    .attr('markerUnits', 'strokeWidth')\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 19,7 L11,14 L13,7 L11,0 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-barbEnd-margin')\n    .attr('refX', 17)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 14)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 19,7 L11,14 L13,7 L11,0 Z')\n    .attr('fill', `${transitionColor}`);\n};\n// erDiagram specific markers\nconst only_one = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-onlyOneStart')\n    .attr('class', 'marker onlyOne ' + type)\n    .attr('refX', 0)\n    .attr('refY', 9)\n    .attr('markerWidth', 18)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M9,0 L9,18 M15,0 L15,18');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-onlyOneEnd')\n    .attr('class', 'marker onlyOne ' + type)\n    .attr('refX', 18)\n    .attr('refY', 9)\n    .attr('markerWidth', 18)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M3,0 L3,18 M9,0 L9,18');\n};\n\nconst zero_or_one = (elem, type, id) => {\n  const startMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrOneStart')\n    .attr('class', 'marker zeroOrOne ' + type)\n    .attr('refX', 0)\n    .attr('refY', 9)\n    .attr('markerWidth', 30)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto');\n  startMarker\n    .append('circle')\n    .attr('fill', 'white') // Fill white for now?\n    .attr('cx', 21)\n    .attr('cy', 9)\n    .attr('r', 6);\n  startMarker.append('path').attr('d', 'M9,0 L9,18');\n\n  const endMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrOneEnd')\n    .attr('class', 'marker zeroOrOne ' + type)\n    .attr('refX', 30)\n    .attr('refY', 9)\n    .attr('markerWidth', 30)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto');\n  endMarker\n    .append('circle')\n    .attr('fill', 'white') // Fill white for now?\n    .attr('cx', 9)\n    .attr('cy', 9)\n    .attr('r', 6);\n  endMarker.append('path').attr('d', 'M21,0 L21,18');\n};\n\nconst one_or_more = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-oneOrMoreStart')\n    .attr('class', 'marker oneOrMore ' + type)\n    .attr('refX', 18)\n    .attr('refY', 18)\n    .attr('markerWidth', 45)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-oneOrMoreEnd')\n    .attr('class', 'marker oneOrMore ' + type)\n    .attr('refX', 27)\n    .attr('refY', 18)\n    .attr('markerWidth', 45)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');\n};\n\nconst zero_or_more = (elem, type, id) => {\n  const startMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrMoreStart')\n    .attr('class', 'marker zeroOrMore ' + type)\n    .attr('refX', 18)\n    .attr('refY', 18)\n    .attr('markerWidth', 57)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto');\n  startMarker.append('circle').attr('fill', 'white').attr('cx', 48).attr('cy', 18).attr('r', 6);\n  startMarker.append('path').attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');\n\n  const endMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrMoreEnd')\n    .attr('class', 'marker zeroOrMore ' + type)\n    .attr('refX', 39)\n    .attr('refY', 18)\n    .attr('markerWidth', 57)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto');\n  endMarker.append('circle').attr('fill', 'white').attr('cx', 9).attr('cy', 18).attr('r', 6);\n  endMarker.append('path').attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');\n};\n\nconst only_one_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth } = themeVariables;\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-onlyOneStart')\n    .attr('class', 'marker onlyOne ' + type)\n    .attr('refX', 0)\n    .attr('refY', 9)\n    .attr('markerWidth', 18)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M9,0 L9,18 M15,0 L15,18')\n    .attr('stroke-width', `${strokeWidth}`);\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-onlyOneEnd')\n    .attr('class', 'marker onlyOne ' + type)\n    .attr('refX', 18)\n    .attr('refY', 9)\n    .attr('markerWidth', 18)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M3,0 L3,18 M9,0 L9,18')\n    .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst zero_or_one_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth, mainBkg } = themeVariables;\n  const startMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrOneStart')\n    .attr('class', 'marker zeroOrOne ' + type)\n    .attr('refX', 0)\n    .attr('refY', 9)\n    .attr('markerWidth', 30)\n    .attr('markerHeight', 18)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse');\n  startMarker\n    .append('circle')\n    .attr('fill', mainBkg ?? 'white')\n    .attr('cx', 21)\n    .attr('cy', 9)\n    .attr('stroke-width', `${strokeWidth}`)\n    .attr('r', 6);\n  startMarker.append('path').attr('d', 'M9,0 L9,18').attr('stroke-width', `${strokeWidth}`);\n\n  const endMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrOneEnd')\n    .attr('class', 'marker zeroOrOne ' + type)\n    .attr('refX', 30)\n    .attr('refY', 9)\n    .attr('markerWidth', 30)\n    .attr('markerHeight', 18)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('orient', 'auto');\n  endMarker\n    .append('circle')\n    .attr('fill', mainBkg ?? 'white')\n    .attr('cx', 9)\n    .attr('cy', 9)\n    .attr('stroke-width', `${strokeWidth}`)\n    .attr('r', 6);\n  endMarker.append('path').attr('d', 'M21,0 L21,18').attr('stroke-width', `${strokeWidth}`);\n};\n\nconst one_or_more_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth } = themeVariables;\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-oneOrMoreStart')\n    .attr('class', 'marker oneOrMore ' + type)\n    .attr('refX', 18)\n    .attr('refY', 18)\n    .attr('markerWidth', 45)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('path')\n    .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27')\n    .attr('stroke-width', `${strokeWidth}`);\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-oneOrMoreEnd')\n    .attr('class', 'marker oneOrMore ' + type)\n    .attr('refX', 27)\n    .attr('refY', 18)\n    .attr('markerWidth', 45)\n    .attr('markerHeight', 36)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18')\n    .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst zero_or_more_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth, mainBkg } = themeVariables;\n  const startMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrMoreStart')\n    .attr('class', 'marker zeroOrMore ' + type)\n    .attr('refX', 18)\n    .attr('refY', 18)\n    .attr('markerWidth', 57)\n    .attr('markerHeight', 36)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('orient', 'auto');\n  startMarker\n    .append('circle')\n    .attr('fill', mainBkg ?? 'white')\n    .attr('cx', 45.5)\n    .attr('cy', 18)\n    .attr('r', 6)\n    .attr('stroke-width', `${strokeWidth}`);\n  startMarker\n    .append('path')\n    .attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18')\n    .attr('stroke-width', `${strokeWidth}`);\n\n  const endMarker = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-zeroOrMoreEnd')\n    .attr('class', 'marker zeroOrMore ' + type)\n    .attr('refX', 39)\n    .attr('refY', 18)\n    .attr('markerWidth', 57)\n    .attr('markerHeight', 36)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse');\n  endMarker\n    .append('circle')\n    .attr('fill', mainBkg ?? 'white')\n    .attr('cx', 11)\n    .attr('cy', 18)\n    .attr('r', 6)\n    .attr('stroke-width', `${strokeWidth}`);\n  endMarker\n    .append('path')\n    .attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18')\n    .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst requirement_arrow = (elem, type, id) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-requirement_arrowEnd')\n    .attr('refX', 20)\n    .attr('refY', 10)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 20)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr(\n      'd',\n      `M0,0\n      L20,10\n      M20,10\n      L0,20`\n    );\n};\n\nconst requirement_arrow_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth } = themeVariables;\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-requirement_arrowEnd')\n    .attr('refX', 20)\n    .attr('refY', 10)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 20)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('stroke-width', `${strokeWidth}`)\n    .attr('viewBox', '0 0 25 20')\n    .append('path')\n    .attr(\n      'd',\n      `M0,0\n      L20,10\n      M20,10\n      L0,20`\n    )\n    .attr('stroke-linejoin', 'miter');\n};\n\nconst requirement_contains = (elem, type, id) => {\n  const containsNode = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-requirement_containsStart')\n    .attr('refX', 0)\n    .attr('refY', 10)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 20)\n    .attr('orient', 'auto')\n    .append('g');\n\n  containsNode.append('circle').attr('cx', 10).attr('cy', 10).attr('r', 9).attr('fill', 'none');\n\n  containsNode.append('line').attr('x1', 1).attr('x2', 19).attr('y1', 10).attr('y2', 10);\n\n  containsNode.append('line').attr('y1', 1).attr('y2', 19).attr('x1', 10).attr('x2', 10);\n};\n\nconst requirement_contains_neo = (elem, type, id) => {\n  const config = configApi.getConfig();\n  const { themeVariables } = config;\n  const { strokeWidth } = themeVariables;\n  const containsNode = elem\n    .append('defs')\n    .append('marker')\n    .attr('id', id + '_' + type + '-requirement_containsStart')\n    .attr('refX', 0)\n    .attr('refY', 10)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 20)\n    .attr('orient', 'auto')\n    .attr('markerUnits', 'userSpaceOnUse')\n    .append('g');\n\n  containsNode.append('circle').attr('cx', 10).attr('cy', 10).attr('r', 9).attr('fill', 'none');\n\n  containsNode.append('line').attr('x1', 1).attr('x2', 19).attr('y1', 10).attr('y2', 10);\n\n  containsNode.append('line').attr('y1', 1).attr('y2', 19).attr('x1', 10).attr('x2', 10);\n  containsNode.selectAll('*').attr('stroke-width', `${strokeWidth}`);\n};\nconst hierarchy = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hierarchyEnd')\n    .attr('class', 'marker hierarchy ' + type)\n    .attr('viewBox', '0 0 12 10')\n    .attr('refX', 10)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 0 L 6 5 L 0 10 M 4 0 L 10 5 L 4 10')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hierarchyStart')\n    .attr('class', 'marker hierarchy ' + type)\n    .attr('viewBox', '0 0 12 10')\n    .attr('refX', 2)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 12 0 L 6 5 L 12 10 M 8 0 L 2 5 L 8 10')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n};\n\nconst openArrow = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-openArrowEnd')\n    .attr('class', 'marker openArrow ' + type)\n    .attr('viewBox', '0 0 12 12')\n    .attr('refX', 11)\n    .attr('refY', 6)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 1 1 L 11 6 L 1 11')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-linecap', 'round')\n    .style('stroke-linejoin', 'round')\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-openArrowStart')\n    .attr('class', 'marker openArrow ' + type)\n    .attr('viewBox', '0 0 12 12')\n    .attr('refX', 1)\n    .attr('refY', 6)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 11 1 L 1 6 L 11 11')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-linecap', 'round')\n    .style('stroke-linejoin', 'round')\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n};\n\nconst hollowCircle = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hollowCircleStart')\n    .attr('class', 'marker hollowCircle ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 0)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 10)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', 5)\n    .attr('cy', 5)\n    .attr('r', 3.6)\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hollowCircleEnd')\n    .attr('class', 'marker hollowCircle ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 10)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 10)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', 5)\n    .attr('cy', 5)\n    .attr('r', 3.6)\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n  extension,\n  composition,\n  aggregation,\n  dependency,\n  lollipop,\n  point,\n  circle,\n  cross,\n  barb,\n  barbNeo,\n  hierarchy,\n  only_one,\n  zero_or_one,\n  one_or_more,\n  zero_or_more,\n  only_one_neo,\n  zero_or_one_neo,\n  one_or_more_neo,\n  zero_or_more_neo,\n  requirement_arrow,\n  requirement_contains,\n  requirement_arrow_neo,\n  requirement_contains_neo,\n  openArrow,\n  hollowCircle,\n};\nexport default insertMarkers;\n"],
  "mappings": "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",
  "names": ["computeLabelTransform", "__name", "bbox", "useHtmlLabels", "x", "y", "markerOffsets", "markerOffsets2", "calculateDeltaAndAngle", "point1", "point2", "pointTransformer", "x1", "y1", "x2", "y2", "deltaX", "deltaY", "__name", "data", "getLineFunctionsWithOffset", "edge", "d", "i", "offset", "DIRECTION", "angle", "differenceToEnd", "differenceInYEnd", "differenceToStart", "differenceInYStart", "startMarkerHeight", "endMarkerHeight", "extraRoom", "adjustment", "differenceInXEnd", "differenceInXStart", "getStepDuration", "__name", "value", "isStepEdge", "edge", "STEP_BADGE_FRACTIONS", "STEP_BADGE_RADIUS", "STEP_BADGE_FONT_SIZE", "STEP_BADGE_GAP", "STEP_BADGE_FALLBACK_FILL", "STEP_ARROWHEAD_LENGTH", "STEP_ARROWHEAD_HALF_WIDTH", "STEP_BADGE_OFFSET", "STEP_TANGENT_STEP", "MIN_TEXT_CONTRAST", "TRANSLATE", "STEP_HIGHLIGHT_STROKE_WIDTH", "STEP_HIGHLIGHT_STROKE_OPACITY", "STEP_DOT_RADIUS", "getEdgeStepTiming", "__name", "step", "stepCount", "stepDuration", "count", "toAnimationId", "value", "char", "pathStartTranslate", "pathData", "start", "escapeCssIdentifierFallback", "index", "code", "isControl", "isLeadingDigit", "escapeCssIdentifier", "ensureReducedMotionStyle", "elem", "diagramId", "node", "svg", "scopeId", "scope", "style", "pointAlongPolyline", "points", "fraction", "valid", "point", "lengths", "remaining", "total", "length", "ratio", "from", "to", "createPathSampler", "pathNode", "getPoint", "x", "y", "roomAround", "obstacles", "obstacle", "dx", "dy", "besideThePath", "sample", "before", "after", "normal", "side", "chooseBadgePosition", "candidates", "best", "bestRoom", "room", "square", "half", "translationOf", "match", "offsetInSvg", "offset", "current", "boxedObstacle", "origin", "box", "readPoints", "path", "arrowheadObstacle", "tip", "along", "hasMarker", "attribute", "arrowheadObstacles", "toSvg", "last", "collectBadgeObstacles", "root", "boxed", "arrowheads", "edgeLabelObstacles", "edge", "utils_default", "linearChannel", "srgb", "relativeLuminance", "color", "r", "g", "b", "part", "channel_default", "contrastRatio", "first", "second", "a", "pickBadgeTextColor", "fill", "scored", "next", "bareColor", "bare", "insertEdgeStepBadge", "options", "isStepEdge", "local", "position", "badge", "showWhileStepPlays", "target", "motionId", "dur", "insertEdgeStepDot", "begin", "gap", "getStepDuration", "parked", "highlight", "dot", "queuedBadges", "badgeLayer", "existing", "layer", "placeQueuedStepBadges", "queued", "select_default", "placed", "insertEdgeStepMarks", "addEdgeMarkers", "__name", "svgPath", "edge", "url", "id", "diagramType", "useMargin", "strokeColor", "addEdgeMarker", "arrowTypesMap", "arrowTypesWithMarginSupport", "position", "arrowType", "arrowTypeInfo", "marginSupport", "log", "endMarkerType", "originalMarkerId", "colorId", "coloredMarkerId", "originalMarker", "coloredMarker", "path", "resolveEdgeCurveType", "__name", "edgeCurve", "getConfig", "edgeLabels", "terminalLabels", "clear", "hasEdgeLabel", "edge", "getLabelStyles", "styleArray", "acc", "style", "insertEdgeLabel", "elem", "config", "useHtmlLabels", "getEffectiveHtmlLabels", "labelStyles", "styles2String", "edgeLabel", "label", "isMarkdown", "labelElement", "createText", "log", "bbox", "transformBbox", "div", "dv", "select_default", "fastdom_default", "textEl", "computeLabelTransform", "fo", "startEdgeLabelLeft", "inner", "startLabelElement", "createLabel_default", "slBox", "setTerminalWidth", "recordTerminalLabelSize", "startEdgeLabelRight", "endEdgeLabelLeft", "endLabelElement", "endEdgeLabelRight", "key", "box", "value", "resolveEdgeLabelPosition", "paths", "x", "y", "updatedMid", "utils_default", "originalMid", "positionEdgeLabel", "siteConfig", "subGraphTitleTotalMargin", "getSubGraphTitleMargins", "el", "path", "pos", "AXIS_TOLERANCE", "sharesColumn", "a", "b", "sharesRow", "coincides", "keepsArrivalAxis", "originalLast", "lastInner", "candidate", "arrivalSegment", "before", "runsAgainstHeading", "heading", "from", "snapToArrivalAxis", "dockFinalPoint", "arrival", "markerPullBack", "arrowType", "offset", "markerOffsets", "finalDockPoint", "newLast", "minLength", "turned", "length", "orthogonalizeToLabelClippedPoints", "points", "start", "end", "dx", "dy", "outsideNode", "node", "point", "w", "h", "intersection", "outsidePoint", "insidePoint", "r", "Q", "R", "q", "res", "_x", "_y", "cutPathAtIntersect", "_points", "boundaryNode", "lastPointOutside", "isInside", "inter", "pointPresent", "p", "e", "extractCornerPoints", "cornerPoints", "cornerPointPositions", "i", "prev", "curr", "next", "findAdjacentPoint", "pointA", "pointB", "distance", "xDiff", "yDiff", "ratio", "fixCorners", "lineData", "newLineData", "prevPoint", "nextPoint", "cornerPoint", "newPrevPoint", "newNextPoint", "newCornerPoint", "generateDashArray", "len", "oValueS", "oValueE", "middleLength", "dashLength", "gapLength", "dashGapPairLength", "rawPairs", "numberOfPairs", "middlePattern", "insertEdge", "clusterDb", "diagramType", "startNode", "endNode", "diagramId", "skipIntersect", "layoutAlgorithm", "handDrawnSeed", "configuredLayout", "layout", "pointsHasChanged", "tail", "head", "edgeClassStyles", "isLabelStyle", "first", "last", "innerPoints", "firstInner", "newFirst", "candidateLast", "finalPoint", "startPoints", "endPoints", "pointsStr", "edgeCurveType", "curve", "linear_default", "basis_default", "cardinal_default", "bumpX", "bumpY", "catmullRom_default", "monotoneX", "monotoneY", "natural_default", "step_default", "stepAfter", "stepBefore", "getLineFunctionsWithOffset", "lineFunction", "line_default", "strokeClasses", "svgPath", "linePath", "generateRoundedPath", "applyMarkerOffsetsToPoints", "edgeStyles", "strokeColor", "animationClass", "animatedEdge", "rc", "at", "svgPathNode", "d", "stylesFromClasses", "styles", "pathStyle", "pathNode", "markerOffsets2", "mOffset", "handleUndefinedAttr", "themeVariables", "stepColor", "insertEdgeStepMarks", "url", "useMargin", "addEdgeMarkers", "midIndex", "radius", "size", "epsilon", "currPoint", "dx1", "dy1", "dx2", "dy2", "len1", "len2", "nx1", "ny1", "nx2", "ny2", "dot", "clampedDot", "angle", "cutLen", "startX", "startY", "endX", "endY", "calculateDeltaAndAngle", "point1", "point2", "deltaX", "deltaY", "newPoints", "offsetValue", "offsetX", "offsetY", "n", "insertMarkers", "__name", "elem", "markerArray", "type", "id", "markerName", "markers", "extension", "log", "composition", "aggregation", "dependency", "lollipop", "point", "circle", "cross", "barb", "barbNeo", "config", "getConfig", "themeVariables", "transitionColor", "only_one", "zero_or_one", "startMarker", "endMarker", "one_or_more", "zero_or_more", "only_one_neo", "strokeWidth", "zero_or_one_neo", "mainBkg", "one_or_more_neo", "zero_or_more_neo", "requirement_arrow", "requirement_arrow_neo", "requirement_contains", "containsNode", "requirement_contains_neo", "hierarchy", "openArrow", "hollowCircle", "markers_default"]
}