mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines • 178 kB
Source Map (JSON)
{
"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"]
}