{
  "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/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(link.from, 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<void> => {\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<string, WardleyNode>();\n  private links: WardleyLink[] = [];\n  private trends = new Map<string, WardleyTrend>();\n  private pipelines = new Map<string, WardleyPipeline>();\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  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 Required<WardleyNode>);\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 { sanitizeText } from '../common/common.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 textSanitizer(text: string) {\n  const config = getGlobalConfig();\n  return sanitizeText(text.trim(), config);\n}\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: textSanitizer(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({ source: sourceId, target: targetId, dashed, label, flow });\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: text ? textSanitizer(text) : undefined,\n  });\n}\n\nfunction addNote(text: string, x: number, y: number) {\n  builder.addNote({\n    text: textSanitizer(text),\n    x,\n    y,\n  });\n}\n\nfunction addAccelerator(name: string, x: number, y: number) {\n  builder.addAccelerator({\n    name: textSanitizer(name),\n    x,\n    y,\n  });\n}\n\nfunction addDeaccelerator(name: string, x: number, y: number) {\n  builder.addDeaccelerator({\n    name: textSanitizer(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  const sanitized: WardleyAxesConfig = {};\n  if (partial.xLabel) {\n    sanitized.xLabel = textSanitizer(partial.xLabel);\n  }\n  if (partial.yLabel) {\n    sanitized.yLabel = textSanitizer(partial.yLabel);\n  }\n  if (partial.stages) {\n    sanitized.stages = partial.stages.map((stage) => textSanitizer(stage));\n  }\n  if (partial.stageBoundaries) {\n    sanitized.stageBoundaries = partial.stageBoundaries;\n  }\n  builder.setAxes(sanitized);\n}\n\nfunction getNode(id: string) {\n  return builder.getNode(id);\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  getWardleyData,\n  clear,\n  setAccTitle,\n  getAccTitle,\n  setDiagramTitle,\n  getDiagramTitle,\n  getAccDescription,\n  setAccDescription,\n};\n", "import { 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\nconst DEFAULT_STAGES = ['Genesis', 'Custom Built', 'Product', 'Commodity'];\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<string, { x: number; y: number; node: WardleyNode }>();\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<string, Set<string>>();\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: any[] = [];\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() as SVGTextElement;\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 { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './wardleyParser.js';\nimport db from './wardleyDb.js';\nimport renderer from './wardleyRenderer.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", "nodes", "builder", "WardleyBuilder", "textSanitizer", "text", "config", "getConfig", "sanitizeText", "__name", "addNode", "id", "label", "x", "y", "className", "labelOffsetX", "labelOffsetY", "inertia", "sourceStrategy", "addLink", "sourceId", "targetId", "dashed", "flow", "addTrend", "nodeId", "targetX", "targetY", "addAnnotation", "number", "coordinates", "addNote", "addAccelerator", "name", "addDeaccelerator", "setAnnotationsBox", "setSize", "width", "height", "startPipeline", "addPipelineComponent", "pipelineNodeId", "componentId", "updateAxes", "partial", "sanitized", "stage", "getNode", "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", "diagram", "parser", "wardleyDb_default", "wardleyRenderer_default", "__name"]
}
