{ "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": ["toPercent", "__name", "value", "context", "normalized", "toCoordinates", "visibility", "evolution", "getFlowFromPort", "port", "extractFlowFromArrow", "arrow", "flowLabel", "populateDb", "ast", "db", "populateCommonDb", "stages", "stage", "stageBoundaries", "anchor", "coords", "component", "labelOffsetX", "labelOffsetY", "sourceStrategy", "note", "pipeline", "parentNode", "parentY", "componentId", "x", "link", "isDashed", "flow", "arrowFlow", "annotation", "label", "evolve", "node", "target", "annotationsBox", "accelerator", "deaccelerator", "parser", "input", "parse", "log", "WardleyBuilder", "__name", "node", "existing", "merged", "link", "trend", "nodeId", "pipelineNodeId", "componentId", "pipeline", "annotation", "note", "accelerator", "deaccelerator", "x", "y", "partial", "width", "height", "id", "name", "nodes", "builder", "WardleyBuilder", "getConfig", "__name", "addNode", "id", "label", "x", "y", "className", "labelOffsetX", "labelOffsetY", "inertia", "sourceStrategy", "addLink", "sourceId", "targetId", "dashed", "flow", "addTrend", "nodeId", "targetX", "targetY", "addAnnotation", "number", "coordinates", "text", "addNote", "addAccelerator", "name", "addDeaccelerator", "setAnnotationsBox", "setSize", "width", "height", "startPipeline", "addPipelineComponent", "pipelineNodeId", "componentId", "updateAxes", "partial", "getNode", "resolveNodeId", "getWardleyData", "clear", "wardleyDb_default", "setAccTitle", "getAccTitle", "setDiagramTitle", "getDiagramTitle", "getAccDescription", "setAccDescription", "DEFAULT_STAGES", "getTheme", "__name", "themeVariables", "getConfig", "getConfigValues", "wardleyConfig", "draw", "text", "id", "_version", "diagObj", "log", "configValues", "theme", "squareSize", "db", "data", "title", "width", "height", "svg", "selectSvgElement", "configureSvgSize", "root", "defs", "chartWidth", "chartHeight", "projectX", "value", "projectY", "axisGroup", "xLabel", "yLabel", "stages", "stageGroup", "boundaries", "stagePositions", "prevBoundary", "boundary", "stageWidth", "_", "index", "stage", "pos", "startX", "endX", "centerX", "gridGroup", "i", "ratio", "x", "positions", "node", "pipelineGroup", "pipelineLinksGroup", "pipeline", "sortedComponents", "n", "c", "a", "b", "current", "next", "minX", "maxX", "y", "componentId", "boxTop", "parentPos", "linksGroup", "pipelineMap", "validLinks", "link", "sourcePos", "targetPos", "radius", "dx", "dy", "distance", "midX", "offset", "perpX", "midY", "perpY", "labelX", "labelY", "angle", "trendGroup", "trendsWithPositions", "trend", "origin", "targetX", "targetY", "shortenBy", "adjustedX2", "adjustedY2", "nodeEnter", "marketNodes", "smallCircleRadius", "triangleRadius", "lineHeight", "defaultOffset", "customOffset", "annotationsGroup", "annotation", "projectedCoords", "coord", "annotationNode", "boxX", "boxY", "padding", "fontSize", "textBoxGroup", "sortedAnnotations", "textElements", "idx", "maxWidth", "maxHeight", "textNode", "textWidth", "bbox", "boxWidth", "boxHeight", "minY", "maxY", "notesGroup", "note", "noteX", "noteY", "acceleratorsGroup", "accelerator", "accX", "accY", "arrowWidth", "arrowHeight", "arrowHeadWidth", "arrowPath", "deacceleratorsGroup", "deaccelerator", "decX", "decY", "wardleyRenderer_default", "styles", "__name", "wardley", "defaultThemeVariables", "getThemeVariables", "currentConfig", "getConfig", "themeVariables", "cleanAndMerge", "w", "diagram", "parser", "wardleyDb_default", "wardleyRenderer_default", "styles"] }