{ "version": 3, "sources": ["../../../src/diagrams/wardley/wardleyParser.ts", "../../../src/diagrams/wardley/wardleyBuilder.ts", "../../../src/diagrams/wardley/wardleyDb.ts", "../../../src/diagrams/wardley/wardleyRenderer.ts", "../../../src/diagrams/wardley/styles.ts", "../../../src/diagrams/wardley/wardleyDiagram.ts"], "sourcesContent": ["import type { Wardley } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport type { WardleyDB } from './wardleyTypes.js';\n\nconst toPercent = (value: number, context: string): number => {\n // Accept values in 0-1 range (converted to percentage) or 0-100 range (used as-is)\n const normalized = value <= 1 ? value * 100 : value;\n if (normalized < 0 || normalized > 100) {\n throw new Error(\n `${context} must be between 0-1 (decimal) or 0-100 (percentage). Received: ${value}`\n );\n }\n return normalized;\n};\n\nconst toCoordinates = (\n visibility: number,\n evolution: number,\n context: string\n): { x: number; y: number } => {\n return {\n x: toPercent(evolution, `${context} evolution`),\n y: toPercent(visibility, `${context} visibility`),\n };\n};\n\nconst getFlowFromPort = (port?: string): 'forward' | 'backward' | 'bidirectional' | undefined => {\n if (!port) {\n return undefined;\n }\n if (port === '+<>') {\n return 'bidirectional';\n }\n if (port === '+<') {\n return 'backward';\n }\n if (port === '+>') {\n return 'forward';\n }\n return undefined;\n};\n\nconst extractFlowFromArrow = (\n arrow?: string\n): { flow?: 'forward' | 'backward' | 'bidirectional'; label?: string } => {\n if (!arrow?.startsWith('+')) {\n return {};\n }\n\n const labelMatch = /^\\+'([^']*)'/.exec(arrow);\n const flowLabel = labelMatch?.[1];\n\n if (arrow.includes('<>')) {\n return { flow: 'bidirectional', label: flowLabel };\n }\n if (arrow.includes('<')) {\n return { flow: 'backward', label: flowLabel };\n }\n if (arrow.includes('>')) {\n return { flow: 'forward', label: flowLabel };\n }\n return { label: flowLabel };\n};\n\nconst populateDb = (ast: Wardley, db: WardleyDB) => {\n populateCommonDb(ast, db);\n\n // Set size if provided\n if (ast.size) {\n db.setSize(ast.size.width, ast.size.height);\n }\n\n // Process evolution stages\n if (ast.evolution) {\n const stages = ast.evolution.stages.map((stage) => {\n // Handle dual-label stages like \"Genesis / Concept\"\n if (stage.secondName) {\n return `${stage.name.trim()} / ${stage.secondName.trim()}`;\n }\n return stage.name.trim();\n });\n const stageBoundaries = ast.evolution.stages\n .filter((stage) => stage.boundary !== undefined)\n .map((stage) => stage.boundary!);\n\n db.updateAxes({ stages, stageBoundaries });\n }\n\n // Add anchors as nodes with className 'anchor'\n ast.anchors.forEach((anchor) => {\n const coords = toCoordinates(anchor.visibility, anchor.evolution, `Anchor \"${anchor.name}\"`);\n db.addNode(anchor.name, anchor.name, coords.x, coords.y, 'anchor');\n });\n\n // Add components\n ast.components.forEach((component) => {\n const coords = toCoordinates(\n component.visibility,\n component.evolution,\n `Component \"${component.name}\"`\n );\n const labelOffsetX = component.label\n ? (component.label.negX ? -1 : 1) * component.label.offsetX\n : undefined;\n const labelOffsetY = component.label\n ? (component.label.negY ? -1 : 1) * component.label.offsetY\n : undefined;\n const sourceStrategy = component.decorator?.strategy as\n | 'build'\n | 'buy'\n | 'outsource'\n | 'market'\n | undefined;\n\n db.addNode(\n component.name,\n component.name,\n coords.x,\n coords.y,\n 'component',\n labelOffsetX,\n labelOffsetY,\n component.inertia,\n sourceStrategy\n );\n });\n\n // Add notes\n ast.notes.forEach((note) => {\n const coords = toCoordinates(note.visibility, note.evolution, `Note \"${note.text}\"`);\n db.addNote(note.text, coords.x, coords.y);\n });\n\n // Process pipelines\n ast.pipelines.forEach((pipeline) => {\n const parentNode = db.getNode(pipeline.parent);\n if (!parentNode || typeof parentNode.y !== 'number') {\n throw new Error(\n `Pipeline \"${pipeline.parent}\" must reference an existing component with coordinates.`\n );\n }\n const parentY = parentNode.y; // Extract to ensure type narrowing\n\n db.startPipeline(pipeline.parent);\n pipeline.components.forEach((component) => {\n // Create a synthetic ID for pipeline components\n const componentId = `${pipeline.parent}_${component.name}`;\n const labelOffsetX = component.label\n ? (component.label.negX ? -1 : 1) * component.label.offsetX\n : undefined;\n const labelOffsetY = component.label\n ? (component.label.negY ? -1 : 1) * component.label.offsetY\n : undefined;\n const x = toPercent(component.evolution, `Pipeline component \"${component.name}\" evolution`);\n\n // Add pipeline component node (it will be associated with the parent)\n db.addNode(\n componentId,\n component.name,\n x,\n parentY,\n 'pipeline-component',\n labelOffsetX,\n labelOffsetY\n );\n db.addPipelineComponent(pipeline.parent, componentId);\n });\n });\n\n // Add links\n ast.links.forEach((link) => {\n const isDashed = !!link.arrow && (link.arrow.includes('-.->') || link.arrow.includes('.-.'));\n\n let flow = getFlowFromPort(link.fromPort) ?? getFlowFromPort(link.toPort);\n const { flow: arrowFlow, label: flowLabel } = extractFlowFromArrow(link.arrow);\n if (!flow && arrowFlow) {\n flow = arrowFlow;\n }\n\n const annotation = link.linkLabel;\n const label = flowLabel ?? annotation;\n\n db.addLink(db.resolveNodeId(link.from), db.resolveNodeId(link.to), isDashed, label, flow);\n });\n\n // Add evolves (trends)\n ast.evolves.forEach((evolve) => {\n // Get the component to find its current position\n const node = db.getNode(evolve.component);\n if (node?.y !== undefined) {\n const target = toPercent(evolve.target, `Evolve target for \"${evolve.component}\"`);\n db.addTrend(evolve.component, target, node.y);\n }\n });\n\n // Set annotations box\n if (ast.annotations.length > 0) {\n const annotationsBox = ast.annotations[0];\n const coords = toCoordinates(annotationsBox.x, annotationsBox.y, 'Annotations box');\n db.setAnnotationsBox(coords.x, coords.y);\n }\n\n // Add individual annotations\n ast.annotation.forEach((annotation) => {\n const coords = toCoordinates(annotation.x, annotation.y, `Annotation ${annotation.number}`);\n db.addAnnotation(annotation.number, [{ x: coords.x, y: coords.y }], annotation.text);\n });\n\n // Add accelerators\n ast.accelerators.forEach((accelerator) => {\n const coords = toCoordinates(accelerator.x, accelerator.y, `Accelerator \"${accelerator.name}\"`);\n db.addAccelerator(accelerator.name, coords.x, coords.y);\n });\n\n // Add deaccelerators\n ast.deaccelerators.forEach((deaccelerator) => {\n const coords = toCoordinates(\n deaccelerator.x,\n deaccelerator.y,\n `Deaccelerator \"${deaccelerator.name}\"`\n );\n db.addDeaccelerator(deaccelerator.name, coords.x, coords.y);\n });\n};\n\nexport const parser: ParserDefinition = {\n parser: {\n // @ts-expect-error - WardleyDB is not assignable to DiagramDB\n yy: undefined,\n },\n parse: async (input: string): Promise => {\n const ast: Wardley = await parse('wardley', input);\n log.debug(ast);\n const db = parser.parser?.yy as WardleyDB;\n if (!db || typeof db.addNode !== 'function') {\n throw new Error(\n 'parser.parser?.yy was not a WardleyDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'\n );\n }\n populateDb(ast, db);\n },\n};\n", "export interface WardleyNode {\n id: string;\n label: string;\n x?: number;\n y?: number;\n className?: string;\n labelOffsetX?: number;\n labelOffsetY?: number;\n inPipeline?: boolean;\n isPipelineParent?: boolean;\n inertia?: boolean;\n sourceStrategy?: 'build' | 'buy' | 'outsource' | 'market';\n}\n\nexport interface WardleyLink {\n source: string;\n target: string;\n dashed?: boolean;\n label?: string;\n flow?: 'forward' | 'backward' | 'bidirectional';\n}\n\nexport interface WardleyTrend {\n nodeId: string;\n targetX: number;\n targetY: number;\n}\n\nexport interface WardleyPipeline {\n nodeId: string;\n componentIds: string[];\n}\n\nexport interface WardleyAnnotation {\n number: number;\n coordinates: { x: number; y: number }[];\n text?: string;\n}\n\nexport interface WardleyNote {\n text: string;\n x: number;\n y: number;\n}\n\nexport interface WardleyAccelerator {\n name: string;\n x: number;\n y: number;\n}\n\nexport interface WardleyDeaccelerator {\n name: string;\n x: number;\n y: number;\n}\n\nexport interface WardleyAxesConfig {\n xLabel?: string;\n yLabel?: string;\n stages?: string[];\n stageBoundaries?: number[]; // Optional custom boundaries for stages (0.0 to 1.0)\n}\n\nexport interface WardleyBuildResult {\n nodes: WardleyNode[];\n links: WardleyLink[];\n trends: WardleyTrend[];\n pipelines: WardleyPipeline[];\n annotations: WardleyAnnotation[];\n notes: WardleyNote[];\n accelerators: WardleyAccelerator[];\n deaccelerators: WardleyDeaccelerator[];\n annotationsBox?: { x: number; y: number };\n axes: WardleyAxesConfig;\n size?: { width: number; height: number };\n}\n\nexport class WardleyBuilder {\n private nodes = new Map();\n private links: WardleyLink[] = [];\n private trends = new Map();\n private pipelines = new Map();\n private annotations: WardleyAnnotation[] = [];\n private notes: WardleyNote[] = [];\n private accelerators: WardleyAccelerator[] = [];\n private deaccelerators: WardleyDeaccelerator[] = [];\n private annotationsBox?: { x: number; y: number };\n private axes: WardleyAxesConfig = {};\n private size?: { width: number; height: number };\n\n public addNode(node: WardleyNode) {\n const existing = this.nodes.get(node.id) ?? { id: node.id, label: node.label };\n const merged: WardleyNode = {\n ...existing,\n ...node,\n className: node.className ?? existing.className,\n labelOffsetX: node.labelOffsetX ?? existing.labelOffsetX,\n labelOffsetY: node.labelOffsetY ?? existing.labelOffsetY,\n };\n this.nodes.set(node.id, merged);\n }\n\n public addLink(link: WardleyLink) {\n this.links.push(link);\n }\n\n public addTrend(trend: WardleyTrend) {\n this.trends.set(trend.nodeId, trend);\n }\n\n public startPipeline(nodeId: string) {\n this.pipelines.set(nodeId, { nodeId, componentIds: [] });\n\n // Mark the parent node as a pipeline parent\n const node = this.nodes.get(nodeId);\n if (node) {\n node.isPipelineParent = true;\n }\n }\n\n public addPipelineComponent(pipelineNodeId: string, componentId: string) {\n const pipeline = this.pipelines.get(pipelineNodeId);\n if (pipeline) {\n pipeline.componentIds.push(componentId);\n }\n\n // Mark the node as being in a pipeline\n const node = this.nodes.get(componentId);\n if (node) {\n node.inPipeline = true;\n }\n }\n\n public addAnnotation(annotation: WardleyAnnotation) {\n this.annotations.push(annotation);\n }\n\n public addNote(note: WardleyNote) {\n this.notes.push(note);\n }\n\n public addAccelerator(accelerator: WardleyAccelerator) {\n this.accelerators.push(accelerator);\n }\n\n public addDeaccelerator(deaccelerator: WardleyDeaccelerator) {\n this.deaccelerators.push(deaccelerator);\n }\n\n public setAnnotationsBox(x: number, y: number) {\n this.annotationsBox = { x, y };\n }\n\n public setAxes(partial: WardleyAxesConfig) {\n this.axes = {\n ...this.axes,\n ...partial,\n };\n }\n\n public setSize(width: number, height: number) {\n this.size = { width, height };\n }\n\n public getNode(id: string): WardleyNode | undefined {\n return this.nodes.get(id);\n }\n\n /**\n * Resolve a name to a node ID. Tries exact ID match first,\n * then falls back to finding a node whose label matches the name\n * (handles pipeline components which have synthetic IDs like \"Parent_Child\").\n */\n public resolveNodeId(name: string): string {\n if (this.nodes.has(name)) {\n return name;\n }\n for (const [id, node] of this.nodes) {\n if (node.label === name) {\n return id;\n }\n }\n return name;\n }\n\n public build(): WardleyBuildResult {\n const nodes: WardleyNode[] = [];\n for (const node of this.nodes.values()) {\n if (typeof node.x !== 'number' || typeof node.y !== 'number') {\n throw new Error(`Node \"${node.label}\" is missing coordinates`);\n }\n nodes.push(node as WardleyNode & { x: number; y: number });\n }\n return {\n nodes,\n links: [...this.links],\n trends: [...this.trends.values()],\n pipelines: [...this.pipelines.values()],\n annotations: [...this.annotations],\n notes: [...this.notes],\n accelerators: [...this.accelerators],\n deaccelerators: [...this.deaccelerators],\n annotationsBox: this.annotationsBox,\n axes: { ...this.axes },\n size: this.size,\n };\n }\n\n public clear() {\n this.nodes.clear();\n this.links = [];\n this.trends.clear();\n this.pipelines.clear();\n this.annotations = [];\n this.notes = [];\n this.accelerators = [];\n this.deaccelerators = [];\n this.annotationsBox = undefined;\n this.axes = {};\n this.size = undefined;\n }\n}\n", "import { getConfig as getGlobalConfig } from '../../diagram-api/diagramAPI.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type { WardleyAxesConfig } from './wardleyBuilder.js';\nimport { WardleyBuilder } from './wardleyBuilder.js';\n\nconst builder = new WardleyBuilder();\n\nfunction getConfig() {\n return getGlobalConfig()['wardley-beta'];\n}\n\nfunction addNode(\n id: string,\n label: string,\n x: number,\n y: number,\n className?: string,\n labelOffsetX?: number,\n labelOffsetY?: number,\n inertia?: boolean,\n sourceStrategy?: 'build' | 'buy' | 'outsource' | 'market'\n) {\n builder.addNode({\n id,\n label,\n x,\n y,\n className,\n labelOffsetX,\n labelOffsetY,\n inertia,\n sourceStrategy,\n });\n}\n\nfunction addLink(\n sourceId: string,\n targetId: string,\n dashed = false,\n label?: string,\n flow?: 'forward' | 'backward' | 'bidirectional'\n) {\n builder.addLink({\n source: sourceId,\n target: targetId,\n dashed,\n label,\n flow,\n });\n}\n\nfunction addTrend(nodeId: string, targetX: number, targetY: number) {\n builder.addTrend({ nodeId, targetX, targetY });\n}\n\nfunction addAnnotation(number: number, coordinates: { x: number; y: number }[], text?: string) {\n builder.addAnnotation({\n number,\n coordinates,\n text,\n });\n}\n\nfunction addNote(text: string, x: number, y: number) {\n builder.addNote({\n text,\n x,\n y,\n });\n}\n\nfunction addAccelerator(name: string, x: number, y: number) {\n builder.addAccelerator({\n name,\n x,\n y,\n });\n}\n\nfunction addDeaccelerator(name: string, x: number, y: number) {\n builder.addDeaccelerator({\n name,\n x,\n y,\n });\n}\n\nfunction setAnnotationsBox(x: number, y: number) {\n builder.setAnnotationsBox(x, y);\n}\n\nfunction setSize(width: number, height: number) {\n builder.setSize(width, height);\n}\n\nfunction startPipeline(nodeId: string) {\n builder.startPipeline(nodeId);\n}\n\nfunction addPipelineComponent(pipelineNodeId: string, componentId: string) {\n builder.addPipelineComponent(pipelineNodeId, componentId);\n}\n\nfunction updateAxes(partial: WardleyAxesConfig) {\n builder.setAxes(partial);\n}\n\nfunction getNode(id: string) {\n return builder.getNode(id);\n}\n\nfunction resolveNodeId(name: string) {\n return builder.resolveNodeId(name);\n}\n\nfunction getWardleyData() {\n return builder.build();\n}\n\nfunction clear() {\n builder.clear();\n commonClear();\n}\n\nexport default {\n getConfig,\n addNode,\n addLink,\n addTrend,\n addAnnotation,\n addNote,\n addAccelerator,\n addDeaccelerator,\n setAnnotationsBox,\n setSize,\n startPipeline,\n addPipelineComponent,\n updateAxes,\n getNode,\n resolveNodeId,\n getWardleyData,\n clear,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n};\n", "import type * as d3 from 'd3';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { Diagram } from '../../Diagram.js';\nimport { log } from '../../logger.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { WardleyBuildResult, WardleyNode } from './wardleyBuilder.js';\n\n// Wardley DB does not sanitize text, so we can only use `.text()` for labels.\n/* eslint no-restricted-properties: [\"error\", {\"property\": \"html\"}] */\n\nconst DEFAULT_STAGES = ['Genesis', 'Custom Built', 'Product', 'Commodity'];\n\ntype WardleyText = d3.Selection;\n\ninterface WardleyTheme {\n backgroundColor: string;\n axisColor: string;\n axisTextColor: string;\n gridColor: string;\n componentFill: string;\n componentStroke: string;\n componentLabelColor: string;\n linkStroke: string;\n evolutionStroke: string;\n annotationStroke: string;\n annotationTextColor: string;\n annotationFill: string;\n}\n\nconst getTheme = (): WardleyTheme => {\n const { themeVariables } = getConfig();\n return {\n backgroundColor: themeVariables.wardley?.backgroundColor ?? themeVariables.background ?? '#fff',\n axisColor: themeVariables.wardley?.axisColor ?? '#000',\n axisTextColor:\n themeVariables.wardley?.axisTextColor ?? themeVariables.primaryTextColor ?? '#222',\n gridColor: themeVariables.wardley?.gridColor ?? 'rgba(100, 100, 100, 0.2)',\n componentFill: themeVariables.wardley?.componentFill ?? '#fff',\n componentStroke: themeVariables.wardley?.componentStroke ?? '#000',\n componentLabelColor:\n themeVariables.wardley?.componentLabelColor ?? themeVariables.primaryTextColor ?? '#222',\n linkStroke: themeVariables.wardley?.linkStroke ?? '#000',\n evolutionStroke: themeVariables.wardley?.evolutionStroke ?? '#dc3545',\n annotationStroke: themeVariables.wardley?.annotationStroke ?? '#000',\n annotationTextColor:\n themeVariables.wardley?.annotationTextColor ?? themeVariables.primaryTextColor ?? '#222',\n annotationFill: themeVariables.wardley?.annotationFill ?? themeVariables.background ?? '#fff',\n };\n};\n\nconst getConfigValues = () => {\n const wardleyConfig = getConfig()['wardley-beta'];\n return {\n width: wardleyConfig?.width ?? 900,\n height: wardleyConfig?.height ?? 600,\n padding: wardleyConfig?.padding ?? 48,\n nodeRadius: wardleyConfig?.nodeRadius ?? 6,\n nodeLabelOffset: wardleyConfig?.nodeLabelOffset ?? 8,\n axisFontSize: wardleyConfig?.axisFontSize ?? 12,\n labelFontSize: wardleyConfig?.labelFontSize ?? 10,\n showGrid: wardleyConfig?.showGrid ?? false,\n useMaxWidth: wardleyConfig?.useMaxWidth ?? true,\n };\n};\n\nexport const draw = (text: string, id: string, _version: string, diagObj: Diagram) => {\n log.debug('Rendering Wardley map\\n' + text);\n\n const configValues = getConfigValues();\n const theme = getTheme();\n const squareSize = configValues.nodeRadius * 1.6; // Size of pipeline parent square nodes\n const db = diagObj.db as {\n getWardleyData: () => WardleyBuildResult;\n getDiagramTitle: () => string;\n };\n const data = db.getWardleyData();\n const title = db.getDiagramTitle();\n\n // Override size if specified in diagram\n const width = data.size?.width ?? configValues.width;\n const height = data.size?.height ?? configValues.height;\n\n const svg = selectSvgElement(id);\n svg.selectAll('*').remove();\n\n configureSvgSize(svg, height, width, configValues.useMaxWidth);\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n\n const root = svg.append('g').attr('class', 'wardley-map');\n\n // Define arrow markers\n const defs = svg.append('defs');\n\n // Evolution trend arrow (red)\n defs\n .append('marker')\n .attr('id', `arrow-${id}`)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerWidth', 6)\n .attr('markerHeight', 6)\n .attr('orient', 'auto-start-reverse')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('fill', theme.evolutionStroke)\n .attr('stroke', 'none');\n\n // Link flow arrow (theme color)\n defs\n .append('marker')\n .attr('id', `link-arrow-end-${id}`)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerWidth', 5)\n .attr('markerHeight', 5)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('fill', theme.linkStroke)\n .attr('stroke', 'none');\n\n // Link flow arrow start (for backward/bidirectional)\n defs\n .append('marker')\n .attr('id', `link-arrow-start-${id}`)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 1)\n .attr('refY', 5)\n .attr('markerWidth', 5)\n .attr('markerHeight', 5)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 10 0 L 0 5 L 10 10 z')\n .attr('fill', theme.linkStroke)\n .attr('stroke', 'none');\n\n root\n .append('rect')\n .attr('class', 'wardley-background')\n .attr('width', width)\n .attr('height', height)\n .attr('fill', theme.backgroundColor);\n\n const chartWidth = width - configValues.padding * 2;\n const chartHeight = height - configValues.padding * 2;\n\n // Render title if present\n if (title) {\n root\n .append('text')\n .attr('class', 'wardley-title')\n .attr('x', width / 2)\n .attr('y', configValues.padding / 2)\n .attr('fill', theme.axisTextColor)\n .attr('font-size', configValues.axisFontSize * 1.05)\n .attr('font-weight', 'bold')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(title);\n }\n\n const projectX = (value: number) => configValues.padding + (value / 100) * chartWidth;\n const projectY = (value: number) => height - configValues.padding - (value / 100) * chartHeight;\n\n const axisGroup = root.append('g').attr('class', 'wardley-axes');\n axisGroup\n .append('line')\n .attr('x1', configValues.padding)\n .attr('x2', width - configValues.padding)\n .attr('y1', height - configValues.padding)\n .attr('y2', height - configValues.padding)\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1);\n axisGroup\n .append('line')\n .attr('x1', configValues.padding)\n .attr('x2', configValues.padding)\n .attr('y1', configValues.padding)\n .attr('y2', height - configValues.padding)\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1);\n\n const xLabel = data.axes.xLabel ?? 'Evolution';\n const yLabel = data.axes.yLabel ?? 'Visibility';\n\n axisGroup\n .append('text')\n .attr('class', 'wardley-axis-label wardley-axis-label-x')\n .attr('x', configValues.padding + chartWidth / 2)\n .attr('y', height - configValues.padding / 4)\n .attr('fill', theme.axisTextColor)\n .attr('font-size', configValues.axisFontSize)\n .attr('font-weight', 'bold')\n .attr('text-anchor', 'middle')\n .text(xLabel);\n axisGroup\n .append('text')\n .attr('class', 'wardley-axis-label wardley-axis-label-y')\n .attr('x', configValues.padding / 3)\n .attr('y', configValues.padding + chartHeight / 2)\n .attr('fill', theme.axisTextColor)\n .attr('font-size', configValues.axisFontSize)\n .attr('font-weight', 'bold')\n .attr('text-anchor', 'middle')\n .attr(\n 'transform',\n `rotate(-90 ${configValues.padding / 3} ${configValues.padding + chartHeight / 2})`\n )\n .text(yLabel);\n\n const stages =\n data.axes.stages && data.axes.stages.length > 0 ? data.axes.stages : DEFAULT_STAGES;\n if (stages.length > 0) {\n const stageGroup = root.append('g').attr('class', 'wardley-stages');\n const boundaries = data.axes.stageBoundaries;\n\n // Calculate stage positions\n const stagePositions: { start: number; end: number }[] = [];\n if (boundaries && boundaries.length === stages.length) {\n // Use custom boundaries\n let prevBoundary = 0;\n boundaries.forEach((boundary) => {\n stagePositions.push({ start: prevBoundary, end: boundary });\n prevBoundary = boundary;\n });\n } else {\n // Use equal distribution\n const stageWidth = 1.0 / stages.length;\n stages.forEach((_, index) => {\n stagePositions.push({\n start: index * stageWidth,\n end: (index + 1) * stageWidth,\n });\n });\n }\n\n stages.forEach((stage, index) => {\n const pos = stagePositions[index];\n const startX = configValues.padding + pos.start * chartWidth;\n const endX = configValues.padding + pos.end * chartWidth;\n const centerX = (startX + endX) / 2;\n\n // Draw dividing line (except before first stage)\n if (index > 0) {\n stageGroup\n .append('line')\n .attr('x1', startX)\n .attr('x2', startX)\n .attr('y1', configValues.padding)\n .attr('y2', height - configValues.padding)\n .attr('stroke', '#000')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '5 5')\n .attr('opacity', 0.8);\n }\n\n // Draw stage label\n stageGroup\n .append('text')\n .attr('class', 'wardley-stage-label')\n .attr('x', centerX)\n .attr('y', height - configValues.padding / 1.5)\n .attr('fill', theme.axisTextColor)\n .attr('font-size', configValues.axisFontSize - 2)\n .attr('text-anchor', 'middle')\n .text(stage);\n });\n }\n\n if (configValues.showGrid) {\n const gridGroup = root.append('g').attr('class', 'wardley-grid');\n for (let i = 1; i < 4; i++) {\n const ratio = i / 4;\n const x = configValues.padding + chartWidth * ratio;\n gridGroup\n .append('line')\n .attr('x1', x)\n .attr('x2', x)\n .attr('y1', configValues.padding)\n .attr('y2', height - configValues.padding)\n .attr('stroke', theme.gridColor)\n .attr('stroke-dasharray', '2 6');\n gridGroup\n .append('line')\n .attr('x1', configValues.padding)\n .attr('x2', width - configValues.padding)\n .attr('y1', height - configValues.padding - chartHeight * ratio)\n .attr('y2', height - configValues.padding - chartHeight * ratio)\n .attr('stroke', theme.gridColor)\n .attr('stroke-dasharray', '2 6');\n }\n }\n\n const positions = new Map();\n data.nodes.forEach((node) => {\n positions.set(node.id, {\n x: projectX(node.x!),\n y: projectY(node.y!),\n node,\n });\n });\n\n // Render pipeline boxes and evolution links\n if (data.pipelines.length > 0) {\n const pipelineGroup = root.append('g').attr('class', 'wardley-pipelines');\n const pipelineLinksGroup = root.append('g').attr('class', 'wardley-pipeline-links');\n\n data.pipelines.forEach((pipeline) => {\n if (pipeline.componentIds.length === 0) {\n return;\n }\n\n // Sort components by X coordinate (evolution) to draw links in order\n const sortedComponents = pipeline.componentIds\n .map((id) => ({ id, pos: positions.get(id), node: data.nodes.find((n) => n.id === id) }))\n .filter((c) => c.pos && c.node)\n .sort((a, b) => a.node!.x! - b.node!.x!);\n\n // Draw dotted links between consecutive pipeline components\n for (let i = 0; i < sortedComponents.length - 1; i++) {\n const current = sortedComponents[i];\n const next = sortedComponents[i + 1];\n\n pipelineLinksGroup\n .append('line')\n .attr('class', 'wardley-pipeline-evolution-link')\n .attr('x1', current.pos!.x)\n .attr('y1', current.pos!.y)\n .attr('x2', next.pos!.x)\n .attr('y2', next.pos!.y)\n .attr('stroke', theme.linkStroke)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4 4');\n }\n\n // Find min and max X coordinates of pipeline components\n let minX = Infinity;\n let maxX = -Infinity;\n let y = 0;\n\n pipeline.componentIds.forEach((componentId) => {\n const pos = positions.get(componentId);\n if (pos) {\n minX = Math.min(minX, pos.x);\n maxX = Math.max(maxX, pos.x);\n y = pos.y;\n }\n });\n\n if (minX !== Infinity && maxX !== -Infinity) {\n const padding = 15; // Padding around the box\n const height = configValues.nodeRadius * 4; // Height of the pipeline box\n const boxTop = y - height / 2;\n\n // Position the parent node at the top of the pipeline box, 2/3 outside, 1/3 inside\n const parentPos = positions.get(pipeline.nodeId);\n if (parentPos) {\n const centerX = (minX + maxX) / 2;\n parentPos.x = centerX;\n parentPos.y = boxTop - squareSize / 6; // Position so 2/3 is outside, 1/3 inside\n }\n\n pipelineGroup\n .append('rect')\n .attr('class', 'wardley-pipeline-box')\n .attr('x', minX - padding)\n .attr('y', boxTop)\n .attr('width', maxX - minX + padding * 2)\n .attr('height', height)\n .attr('fill', 'none')\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1.5)\n .attr('rx', 4)\n .attr('ry', 4);\n }\n });\n }\n\n const linksGroup = root.append('g').attr('class', 'wardley-links');\n\n // Build a map of pipeline parent -> component IDs for filtering\n const pipelineMap = new Map>();\n data.pipelines.forEach((pipeline) => {\n pipelineMap.set(pipeline.nodeId, new Set(pipeline.componentIds));\n });\n\n const validLinks = data.links.filter((link) => {\n // Check if link has valid positions\n if (!positions.has(link.source) || !positions.has(link.target)) {\n return false;\n }\n\n // Filter out links from pipeline components to their parent\n const pipelineComponents = pipelineMap.get(link.target);\n if (pipelineComponents?.has(link.source)) {\n return false;\n }\n\n return true;\n });\n linksGroup\n .selectAll('line')\n .data(validLinks)\n .enter()\n .append('line')\n .attr('class', (link) => `wardley-link${link.dashed ? ' wardley-link--dashed' : ''}`)\n .attr('x1', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const sourceNode = data.nodes.find((n) => n.id === link.source)!;\n const radius = sourceNode.isPipelineParent\n ? squareSize / Math.sqrt(2)\n : configValues.nodeRadius;\n const dx = targetPos.x - sourcePos.x;\n const dy = targetPos.y - sourcePos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n return sourcePos.x + (dx / distance) * radius;\n })\n .attr('y1', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const sourceNode = data.nodes.find((n) => n.id === link.source)!;\n const radius = sourceNode.isPipelineParent\n ? squareSize / Math.sqrt(2)\n : configValues.nodeRadius;\n const dx = targetPos.x - sourcePos.x;\n const dy = targetPos.y - sourcePos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n return sourcePos.y + (dy / distance) * radius;\n })\n .attr('x2', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const targetNode = data.nodes.find((n) => n.id === link.target)!;\n const radius = targetNode.isPipelineParent\n ? squareSize / Math.sqrt(2)\n : configValues.nodeRadius;\n const dx = sourcePos.x - targetPos.x;\n const dy = sourcePos.y - targetPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n return targetPos.x + (dx / distance) * radius;\n })\n .attr('y2', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const targetNode = data.nodes.find((n) => n.id === link.target)!;\n const radius = targetNode.isPipelineParent\n ? squareSize / Math.sqrt(2)\n : configValues.nodeRadius;\n const dx = sourcePos.x - targetPos.x;\n const dy = sourcePos.y - targetPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n return targetPos.y + (dy / distance) * radius;\n })\n .attr('stroke', theme.linkStroke)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', (link) => (link.dashed ? '6 6' : null))\n .attr('marker-end', (link) => {\n if (link.flow === 'forward' || link.flow === 'bidirectional') {\n return `url(#link-arrow-end-${id})`;\n }\n return null;\n })\n .attr('marker-start', (link) => {\n if (link.flow === 'backward' || link.flow === 'bidirectional') {\n return `url(#link-arrow-start-${id})`;\n }\n return null;\n });\n\n // Add link labels\n linksGroup\n .selectAll('text')\n .data(validLinks.filter((link) => link.label))\n .enter()\n .append('text')\n .attr('class', 'wardley-link-label')\n .attr('x', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const midX = (sourcePos.x + targetPos.x) / 2;\n const dy = targetPos.y - sourcePos.y;\n const dx = targetPos.x - sourcePos.x;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const offset = 8; // Distance above the line\n // Perpendicular x component (for offsetting horizontally)\n const perpX = dy / distance;\n return midX + perpX * offset;\n })\n .attr('y', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const midY = (sourcePos.y + targetPos.y) / 2;\n const dx = targetPos.x - sourcePos.x;\n const dy = targetPos.y - sourcePos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const offset = 8; // Distance above the line\n // Perpendicular y component (for offsetting vertically)\n const perpY = -dx / distance;\n return midY + perpY * offset;\n })\n .attr('fill', theme.axisTextColor)\n .attr('font-size', configValues.labelFontSize)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', (link) => {\n const sourcePos = positions.get(link.source)!;\n const targetPos = positions.get(link.target)!;\n const midX = (sourcePos.x + targetPos.x) / 2;\n const midY = (sourcePos.y + targetPos.y) / 2;\n const dx = targetPos.x - sourcePos.x;\n const dy = targetPos.y - sourcePos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const offset = 8; // Distance above the line\n // Perpendicular vector pointing \"up\" relative to line direction\n const perpX = dy / distance;\n const perpY = -dx / distance;\n const labelX = midX + perpX * offset;\n const labelY = midY + perpY * offset;\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI;\n // Flip text if it would be upside down\n if (angle > 90 || angle < -90) {\n angle += 180;\n }\n return `rotate(${angle} ${labelX} ${labelY})`;\n })\n .text((link) => link.label!);\n\n const trendGroup = root.append('g').attr('class', 'wardley-trends');\n interface TrendWithPositions {\n origin: { x: number; y: number; node: WardleyNode };\n targetX: number;\n targetY: number;\n adjustedX2: number;\n adjustedY2: number;\n }\n const trendsWithPositions: TrendWithPositions[] = data.trends\n .map((trend) => {\n const origin = positions.get(trend.nodeId);\n if (!origin) {\n return null;\n }\n const targetX = projectX(trend.targetX);\n const targetY = projectY(trend.targetY);\n\n // Calculate the vector from origin to target\n const dx = targetX - origin.x;\n const dy = targetY - origin.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n // Shorten the line by nodeRadius so arrow stops at circle edge\n const shortenBy = configValues.nodeRadius + 2; // +2 for small gap\n const adjustedX2 = distance > shortenBy ? targetX - (dx / distance) * shortenBy : targetX;\n const adjustedY2 = distance > shortenBy ? targetY - (dy / distance) * shortenBy : targetY;\n\n return {\n origin,\n targetX,\n targetY,\n adjustedX2,\n adjustedY2,\n };\n })\n .filter((trend): trend is TrendWithPositions => trend !== null);\n\n trendGroup\n .selectAll('line')\n .data(trendsWithPositions)\n .enter()\n .append('line')\n .attr('class', 'wardley-trend')\n .attr('x1', (trend) => trend.origin.x)\n .attr('y1', (trend) => trend.origin.y)\n .attr('x2', (trend) => trend.adjustedX2)\n .attr('y2', (trend) => trend.adjustedY2)\n .attr('stroke', theme.evolutionStroke)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4 4')\n .attr('marker-end', `url(#arrow-${id})`);\n\n const nodesGroup = root.append('g').attr('class', 'wardley-nodes');\n const nodeEnter = nodesGroup\n .selectAll('g')\n .data(data.nodes)\n .enter()\n .append('g')\n .attr('class', (node) =>\n ['wardley-node', node.className ? `wardley-node--${node.className}` : '']\n .filter(Boolean)\n .join(' ')\n );\n\n // Render outsource overlay circles first (larger dark circle for outsourced components - behind main circle)\n nodeEnter\n .filter((node) => node.sourceStrategy === 'outsource')\n .append('circle')\n .attr('class', 'wardley-outsource-overlay')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y)\n .attr('r', configValues.nodeRadius * 2)\n .attr('fill', '#666')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Render buy overlay circles (larger light grey circle for bought components - behind main circle)\n nodeEnter\n .filter((node) => node.sourceStrategy === 'buy')\n .append('circle')\n .attr('class', 'wardley-buy-overlay')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y)\n .attr('r', configValues.nodeRadius * 2)\n .attr('fill', '#ccc')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Render build overlay circles (larger very light grey circle with black border for built components - behind main circle)\n nodeEnter\n .filter((node) => node.sourceStrategy === 'build')\n .append('circle')\n .attr('class', 'wardley-build-overlay')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y)\n .attr('r', configValues.nodeRadius * 2)\n .attr('fill', '#eee')\n .attr('stroke', '#000')\n .attr('stroke-width', 1);\n\n // Render market overlay (larger circle with three small circles in triangle pattern)\n const marketNodes = nodeEnter.filter((node) => node.sourceStrategy === 'market');\n\n // Outer circle for market\n marketNodes\n .append('circle')\n .attr('class', 'wardley-market-overlay')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y)\n .attr('r', configValues.nodeRadius * 2)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Render circles for normal nodes and pipeline child components (exclude market components and anchors)\n nodeEnter\n .filter(\n (node) =>\n !node.isPipelineParent && node.sourceStrategy !== 'market' && node.className !== 'anchor'\n )\n .append('circle')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y)\n .attr('r', configValues.nodeRadius)\n .attr('fill', theme.componentFill)\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Render three small circles in triangle pattern for market components (on top of main circle)\n const smallCircleRadius = configValues.nodeRadius * 0.7;\n const triangleRadius = configValues.nodeRadius * 1.2; // Position so inner circle edges are near outer circle\n\n // Draw lines connecting the three circles to form a triangle (render first so circles appear on top)\n // Top to bottom-left\n marketNodes\n .append('line')\n .attr('class', 'wardley-market-line')\n .attr('x1', (node) => positions.get(node.id)!.x)\n .attr('y1', (node) => positions.get(node.id)!.y - triangleRadius)\n .attr('x2', (node) => positions.get(node.id)!.x - triangleRadius * Math.cos(Math.PI / 6))\n .attr('y2', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Line from bottom-left to bottom-right\n marketNodes\n .append('line')\n .attr('class', 'wardley-market-line')\n .attr('x1', (node) => positions.get(node.id)!.x - triangleRadius * Math.cos(Math.PI / 6))\n .attr('y1', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('x2', (node) => positions.get(node.id)!.x + triangleRadius * Math.cos(Math.PI / 6))\n .attr('y2', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Line from bottom-right to top\n marketNodes\n .append('line')\n .attr('class', 'wardley-market-line')\n .attr('x1', (node) => positions.get(node.id)!.x + triangleRadius * Math.cos(Math.PI / 6))\n .attr('y1', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('x2', (node) => positions.get(node.id)!.x)\n .attr('y2', (node) => positions.get(node.id)!.y - triangleRadius)\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Top circle (white fill so it covers the lines)\n marketNodes\n .append('circle')\n .attr('class', 'wardley-market-dot')\n .attr('cx', (node) => positions.get(node.id)!.x)\n .attr('cy', (node) => positions.get(node.id)!.y - triangleRadius)\n .attr('r', smallCircleRadius)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 2);\n\n // Bottom-left circle (white fill so it covers the lines)\n marketNodes\n .append('circle')\n .attr('class', 'wardley-market-dot')\n .attr('cx', (node) => positions.get(node.id)!.x - triangleRadius * Math.cos(Math.PI / 6))\n .attr('cy', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('r', smallCircleRadius)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 2);\n\n // Bottom-right circle (white fill so it covers the lines)\n marketNodes\n .append('circle')\n .attr('class', 'wardley-market-dot')\n .attr('cx', (node) => positions.get(node.id)!.x + triangleRadius * Math.cos(Math.PI / 6))\n .attr('cy', (node) => positions.get(node.id)!.y + triangleRadius * Math.sin(Math.PI / 6))\n .attr('r', smallCircleRadius)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 2);\n\n // Render squares for pipeline parent nodes\n nodeEnter\n .filter((node) => node.isPipelineParent === true)\n .append('rect')\n .attr('x', (node) => positions.get(node.id)!.x - squareSize / 2)\n .attr('y', (node) => positions.get(node.id)!.y - squareSize / 2)\n .attr('width', squareSize)\n .attr('height', squareSize)\n .attr('fill', theme.componentFill)\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Render inertia indicators (vertical lines to the right of components)\n nodeEnter\n .filter((node) => node.inertia === true)\n .append('line')\n .attr('class', 'wardley-inertia')\n .attr('x1', (node) => {\n const pos = positions.get(node.id)!;\n let offset = node.isPipelineParent ? squareSize / 2 + 15 : configValues.nodeRadius + 15;\n // Add extra offset if component has source strategy overlay\n if (node.sourceStrategy) {\n offset += configValues.nodeRadius + 10;\n }\n return pos.x + offset;\n })\n .attr('y1', (node) => {\n const pos = positions.get(node.id)!;\n const lineHeight = node.isPipelineParent ? squareSize : configValues.nodeRadius * 2;\n return pos.y - lineHeight / 2;\n })\n .attr('x2', (node) => {\n const pos = positions.get(node.id)!;\n let offset = node.isPipelineParent ? squareSize / 2 + 15 : configValues.nodeRadius + 15;\n // Add extra offset if component has source strategy overlay\n if (node.sourceStrategy) {\n offset += configValues.nodeRadius + 10;\n }\n return pos.x + offset;\n })\n .attr('y2', (node) => {\n const pos = positions.get(node.id)!;\n const lineHeight = node.isPipelineParent ? squareSize : configValues.nodeRadius * 2;\n return pos.y + lineHeight / 2;\n })\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 6);\n\n nodeEnter\n .append('text')\n .attr('x', (node) => {\n const pos = positions.get(node.id)!;\n // Anchors have no offset, centered on position\n if (node.className === 'anchor') {\n return node.labelOffsetX !== undefined ? pos.x + node.labelOffsetX : pos.x;\n }\n let defaultOffset = configValues.nodeLabelOffset;\n // Apply automatic spacing for components with source strategy\n if (node.sourceStrategy && node.labelOffsetX === undefined) {\n defaultOffset += 10;\n }\n const customOffset = node.labelOffsetX ?? defaultOffset;\n return pos.x + customOffset;\n })\n .attr('y', (node) => {\n const pos = positions.get(node.id)!;\n // Anchors have small upward offset, centered on position\n if (node.className === 'anchor') {\n return node.labelOffsetY !== undefined ? pos.y + node.labelOffsetY : pos.y - 3;\n }\n let defaultOffset = -configValues.nodeLabelOffset;\n // Apply automatic spacing for components with source strategy\n if (node.sourceStrategy && node.labelOffsetY === undefined) {\n defaultOffset -= 10;\n }\n const customOffset = node.labelOffsetY ?? defaultOffset;\n return pos.y + customOffset;\n })\n .attr('class', 'wardley-node-label')\n .attr('fill', (node) => {\n if (node.className === 'evolved') {\n return theme.evolutionStroke;\n }\n if (node.className === 'anchor') {\n return '#000';\n }\n return theme.componentLabelColor;\n })\n .attr('font-size', configValues.labelFontSize)\n .attr('font-weight', (node) => (node.className === 'anchor' ? 'bold' : 'normal'))\n .attr('text-anchor', (node) => (node.className === 'anchor' ? 'middle' : 'start'))\n .attr('dominant-baseline', (node) => (node.className === 'anchor' ? 'middle' : 'auto'))\n .text((node) => node.label);\n\n // Render annotations\n if (data.annotations.length > 0) {\n const annotationsGroup = root.append('g').attr('class', 'wardley-annotations');\n\n data.annotations.forEach((annotation) => {\n // Project all coordinates\n const projectedCoords = annotation.coordinates.map((coord) => ({\n x: projectX(coord.x),\n y: projectY(coord.y),\n }));\n\n // If there are multiple coordinates, draw lines connecting them\n if (projectedCoords.length > 1) {\n for (let i = 0; i < projectedCoords.length - 1; i++) {\n annotationsGroup\n .append('line')\n .attr('class', 'wardley-annotation-line')\n .attr('x1', projectedCoords[i].x)\n .attr('y1', projectedCoords[i].y)\n .attr('x2', projectedCoords[i + 1].x)\n .attr('y2', projectedCoords[i + 1].y)\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1.5)\n .attr('stroke-dasharray', '4 4');\n }\n }\n\n // Draw circles and numbers at each coordinate\n projectedCoords.forEach((coord) => {\n const annotationNode = annotationsGroup.append('g').attr('class', 'wardley-annotation');\n\n // Draw circle\n annotationNode\n .append('circle')\n .attr('cx', coord.x)\n .attr('cy', coord.y)\n .attr('r', 10)\n .attr('fill', 'white')\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1.5);\n\n // Draw number\n annotationNode\n .append('text')\n .attr('x', coord.x)\n .attr('y', coord.y)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'central')\n .attr('font-size', 10)\n .attr('fill', theme.axisTextColor)\n .attr('font-weight', 'bold')\n .text(annotation.number);\n });\n });\n\n // Draw annotations text box if position is defined\n if (data.annotationsBox) {\n let boxX = projectX(data.annotationsBox.x);\n let boxY = projectY(data.annotationsBox.y);\n const padding = 10;\n const lineHeight = 16;\n const fontSize = 11;\n\n // Create text box group\n const textBoxGroup = annotationsGroup.append('g').attr('class', 'wardley-annotations-box');\n\n // Sort annotations by number\n const sortedAnnotations = [...data.annotations]\n .filter((a) => a.text)\n .sort((a, b) => a.number - b.number);\n\n // Draw text lines (temporarily to measure)\n const textElements: WardleyText[] = [];\n sortedAnnotations.forEach((annotation, idx) => {\n const text = textBoxGroup\n .append('text')\n .attr('x', boxX + padding)\n .attr('y', boxY + padding + (idx + 1) * lineHeight)\n .attr('font-size', fontSize)\n .attr('fill', theme.axisTextColor)\n .attr('text-anchor', 'start')\n .attr('dominant-baseline', 'middle')\n .text(`${annotation.number}. ${annotation.text}`);\n textElements.push(text);\n });\n\n // Calculate box dimensions based on text\n if (textElements.length > 0) {\n let maxWidth = 0;\n let maxHeight = 0;\n textElements.forEach((text) => {\n const textNode = text.node()!;\n // Use getComputedTextLength for more accurate width measurement\n const textWidth = textNode.getComputedTextLength();\n maxWidth = Math.max(maxWidth, textWidth);\n const bbox = textNode.getBBox();\n maxHeight = Math.max(maxHeight, bbox.height);\n });\n\n // Add extra buffer to padding to ensure text fits comfortably\n const boxWidth = maxWidth + padding * 2 + 105; // Extra 105px buffer for safety\n const boxHeight = sortedAnnotations.length * lineHeight + padding * 2 + maxHeight / 2;\n\n // Constrain box to stay within map boundaries\n const minX = configValues.padding;\n const maxX = width - configValues.padding - boxWidth;\n const minY = configValues.padding;\n const maxY = height - configValues.padding - boxHeight;\n\n boxX = Math.max(minX, Math.min(boxX, maxX));\n boxY = Math.max(minY, Math.min(boxY, maxY));\n\n // Update text positions after clamping\n textElements.forEach((text, idx) => {\n text.attr('x', boxX + padding).attr('y', boxY + padding + (idx + 1) * lineHeight);\n });\n\n // Draw box background (insert before text)\n textBoxGroup\n .insert('rect', 'text')\n .attr('x', boxX)\n .attr('y', boxY)\n .attr('width', boxWidth)\n .attr('height', boxHeight)\n .attr('fill', 'white')\n .attr('stroke', theme.axisColor)\n .attr('stroke-width', 1.5)\n .attr('rx', 4)\n .attr('ry', 4);\n }\n }\n }\n\n // Render notes\n if (data.notes.length > 0) {\n const notesGroup = root.append('g').attr('class', 'wardley-notes');\n\n data.notes.forEach((note) => {\n const noteX = projectX(note.x);\n const noteY = projectY(note.y);\n\n notesGroup\n .append('text')\n .attr('x', noteX)\n .attr('y', noteY)\n .attr('text-anchor', 'start')\n .attr('font-size', 11)\n .attr('fill', theme.axisTextColor)\n .attr('font-weight', 'bold')\n .text(note.text);\n });\n }\n\n // Render accelerators (large right-pointing arrows)\n if (data.accelerators.length > 0) {\n const acceleratorsGroup = root.append('g').attr('class', 'wardley-accelerators');\n\n data.accelerators.forEach((accelerator) => {\n const accX = projectX(accelerator.x);\n const accY = projectY(accelerator.y);\n\n // Arrow dimensions\n const arrowWidth = 60;\n const arrowHeight = 30;\n const arrowHeadWidth = 20;\n\n // Draw arrow shape: shaft + arrowhead pointing right\n const arrowPath = `\n M ${accX} ${accY - arrowHeight / 2}\n L ${accX + arrowWidth - arrowHeadWidth} ${accY - arrowHeight / 2}\n L ${accX + arrowWidth - arrowHeadWidth} ${accY - arrowHeight / 2 - 8}\n L ${accX + arrowWidth} ${accY}\n L ${accX + arrowWidth - arrowHeadWidth} ${accY + arrowHeight / 2 + 8}\n L ${accX + arrowWidth - arrowHeadWidth} ${accY + arrowHeight / 2}\n L ${accX} ${accY + arrowHeight / 2}\n Z\n `;\n\n acceleratorsGroup\n .append('path')\n .attr('d', arrowPath)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Add label below the arrow\n acceleratorsGroup\n .append('text')\n .attr('x', accX + arrowWidth / 2)\n .attr('y', accY + arrowHeight / 2 + 15)\n .attr('text-anchor', 'middle')\n .attr('font-size', 10)\n .attr('fill', theme.axisTextColor)\n .attr('font-weight', 'bold')\n .text(accelerator.name);\n });\n }\n\n // Render deaccelerators (large left-pointing arrows)\n if (data.deaccelerators.length > 0) {\n const deacceleratorsGroup = root.append('g').attr('class', 'wardley-deaccelerators');\n\n data.deaccelerators.forEach((deaccelerator) => {\n const decX = projectX(deaccelerator.x);\n const decY = projectY(deaccelerator.y);\n\n // Arrow dimensions\n const arrowWidth = 60;\n const arrowHeight = 30;\n const arrowHeadWidth = 20;\n\n // Draw arrow shape pointing left: shaft + arrowhead pointing left\n const arrowPath = `\n M ${decX + arrowWidth} ${decY - arrowHeight / 2}\n L ${decX + arrowHeadWidth} ${decY - arrowHeight / 2}\n L ${decX + arrowHeadWidth} ${decY - arrowHeight / 2 - 8}\n L ${decX} ${decY}\n L ${decX + arrowHeadWidth} ${decY + arrowHeight / 2 + 8}\n L ${decX + arrowHeadWidth} ${decY + arrowHeight / 2}\n L ${decX + arrowWidth} ${decY + arrowHeight / 2}\n Z\n `;\n\n deacceleratorsGroup\n .append('path')\n .attr('d', arrowPath)\n .attr('fill', 'white')\n .attr('stroke', theme.componentStroke)\n .attr('stroke-width', 1);\n\n // Add label below the arrow\n deacceleratorsGroup\n .append('text')\n .attr('x', decX + arrowWidth / 2)\n .attr('y', decY + arrowHeight / 2 + 15)\n .attr('text-anchor', 'middle')\n .attr('font-size', 10)\n .attr('fill', theme.axisTextColor)\n .attr('font-weight', 'bold')\n .text(deaccelerator.name);\n });\n }\n};\n\nexport default {\n draw,\n};\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport { getConfig as getConfigAPI } from '../../config.js';\n\nexport interface WardleyStyleOptions {\n backgroundColor?: string;\n axisColor?: string;\n axisTextColor?: string;\n gridColor?: string;\n componentFill?: string;\n componentStroke?: string;\n componentLabelColor?: string;\n linkStroke?: string;\n evolutionStroke?: string;\n annotationStroke?: string;\n annotationTextColor?: string;\n annotationFill?: string;\n}\n\nexport const styles: DiagramStylesProvider = ({\n wardley,\n}: { wardley?: WardleyStyleOptions } = {}) => {\n const defaultThemeVariables = getThemeVariables();\n const currentConfig = getConfigAPI();\n const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables);\n const w: WardleyStyleOptions = cleanAndMerge(themeVariables.wardley, wardley);\n\n return `\n .wardley-background {\n fill: ${w.backgroundColor};\n }\n .wardley-axes line, .wardley-axes path {\n stroke: ${w.axisColor};\n }\n .wardley-axis-label {\n fill: ${w.axisTextColor};\n }\n .wardley-stage-label {\n fill: ${w.axisTextColor};\n }\n .wardley-grid line {\n stroke: ${w.gridColor};\n }\n .wardley-node circle {\n fill: ${w.componentFill};\n stroke: ${w.componentStroke};\n }\n .wardley-node-label {\n fill: ${w.componentLabelColor};\n }\n .wardley-link {\n stroke: ${w.linkStroke};\n }\n .wardley-link--dashed {\n stroke-dasharray: 4 4;\n }\n .wardley-link-label {\n fill: ${w.axisTextColor};\n }\n .wardley-trend line {\n stroke: ${w.evolutionStroke};\n }\n .wardley-annotation-line {\n stroke: ${w.annotationStroke};\n }\n .wardley-annotation circle {\n fill: ${w.annotationFill};\n stroke: ${w.annotationStroke};\n }\n .wardley-annotation text {\n fill: ${w.annotationTextColor};\n }\n .wardley-annotations-box rect {\n fill: ${w.annotationFill};\n stroke: ${w.annotationStroke};\n }\n .wardley-annotations-box text {\n fill: ${w.annotationTextColor};\n }\n .wardley-pipeline-box {\n stroke: ${w.componentStroke};\n }\n .wardley-notes text {\n fill: ${w.axisTextColor};\n }\n `;\n};\n\nexport default styles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './wardleyParser.js';\nimport db from './wardleyDb.js';\nimport renderer from './wardleyRenderer.js';\nimport { styles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n};\n"], "mappings": "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", "names": ["getConfig", "clear", "getConfig", "id", "height", "text"] }