{
  "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": ["getConfig", "clear", "id", "height", "text"]
}
