mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines • 174 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/rendering-util/labelTransform.ts", "../../../src/utils/lineWithOffset.ts", "../../../src/rendering-util/rendering-elements/edgeStepAnimation.ts", "../../../src/rendering-util/edgeStep.ts", "../../../src/rendering-util/rendering-elements/edges.js", "../../../src/rendering-util/rendering-elements/edgeMarker.ts", "../../../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 { 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 { 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 { 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", "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", "/** 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": ["point", "select", "getConfig", "select", "point", "calculateDeltaAndAngle"]
}