UNPKG

mermaid

Version:

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

8 lines 61.4 kB
{
  "version": 3,
  "sources": ["../../../src/rendering-util/rendering-elements/clusters/swimlane.js", "../../../src/rendering-util/rendering-elements/clusters.js"],
  "sourcesContent": ["import { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport { evaluate } from '../../../config.js';\nimport { log } from '../../../logger.js';\nimport { select } from 'd3';\nimport rough from 'roughjs';\nimport { createText } from '../../createText.ts';\nimport intersectRect from '../intersect/intersect-rect.js';\nimport { styles2String, userNodeOverrides } from '../shapes/handDrawnShapeStyles.js';\nimport { stampColorSlot } from '../../../diagrams/common/colorThemeGate.js';\n\n/**\n * Swimlane cluster shape (lane). Extracted from the shared clusters.js so the\n * swimlane-specific rendering lives on its own; registered in the clusters.js\n * shape dispatch table. Supports LR/TB and the handdrawn (rough) look.\n */\nexport const swimlane = async (parent, node) => {\n  const siteConfig = getConfig();\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const { clusterBkg, clusterBorder, borderColorArray } = themeVariables;\n  const laneStroke = clusterBorder;\n\n  const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node);\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster swimlane ' + (node.cssClasses || ''))\n    .attr('id', node.id)\n    .attr('data-id', node.id)\n    .attr('data-et', 'cluster')\n    .attr('data-look', node.look);\n\n  // Per-lane colour slot; a no-op unless the theme carries a palette. The matching\n  // `[data-color-id]` rules come from the flowchart stylesheet, which swimlanes reuses.\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels);\n\n  // Determine if this is a left-to-right layout (title on left, rotated)\n  const isLR = node.direction === 'LR';\n\n  // Create the label and insert it after the rects\n  const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label swimlane-label');\n\n  const text = await createText(labelEl, node.label, {\n    style: node.labelStyle,\n    useHtmlLabels,\n    isNode: true,\n    width: node.width,\n  });\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (useHtmlLabels) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const padding = node.padding ?? 0;\n  const width = node.width <= bbox.width + padding ? bbox.width + padding : node.width;\n  if (node.width <= bbox.width + padding) {\n    node.diff = (width - node.width) / 2 - padding;\n  } else {\n    node.diff = -padding;\n  }\n\n  const height = node.height;\n  const laneTop = node.y - height / 2;\n  const laneBottom = node.y + height / 2;\n  const laneLeft = node.x - width / 2;\n\n  // Top of the content area across all lanes, computed in the swimlanes\n  // layout write-back. This is the Y of the highest node in the pool.\n  const contentTop =\n    node.swimlaneContentTop !== undefined ? node.swimlaneContentTop : laneTop + height / 3;\n\n  // Title band sizing - for LR, the title is on the left; for TB, on top.\n  //\n  // NOTE: For TB we intentionally use a smaller internal padding so that\n  // the visible gap between the title band and the first row of nodes is\n  // larger. In LR, the original padding works well visually and is kept.\n  const titlePaddingY = isLR ? 4 : 0;\n  const desiredTitleSize = bbox.height + 2 * titlePaddingY;\n\n  let titleRect;\n  let bodyRect;\n\n  if (isLR) {\n    // LR layout: title band is a vertical strip on the left\n    // For rotated text, title width is based on label height (rotated)\n    const titleWidth = Math.max(desiredTitleSize, bbox.height + 2 * titlePaddingY);\n    const bodyX = laneLeft + titleWidth;\n    const bodyWidth = Math.max(0, width - titleWidth);\n\n    if (node.look === 'handDrawn') {\n      // @ts-ignore TODO: Fix rough typings\n      const rc = rough.svg(shapeSvg);\n      const titleOptions = userNodeOverrides(node, {\n        roughness: 0.7,\n        fill: clusterBkg,\n        stroke: laneStroke,\n        // fillWeight: 3,\n        seed: handDrawnSeed,\n      });\n      const bodyOptions = userNodeOverrides(node, {\n        roughness: 0.7,\n        fill: 'none',\n        stroke: laneStroke,\n        seed: handDrawnSeed,\n      });\n\n      const roughTitle = rc.rectangle(laneLeft, laneTop, titleWidth, height, titleOptions);\n      // Same classes as the classic look, so CSS can tell the two halves apart.\n      titleRect = shapeSvg.insert(() => roughTitle, ':first-child').attr('class', 'swimlane-title');\n      const roughBody = rc.rectangle(bodyX, laneTop, bodyWidth, height, bodyOptions);\n      bodyRect = shapeSvg.insert(() => roughBody, ':first-child').attr('class', 'swimlane-body');\n\n      titleRect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n      titleRect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n    } else {\n      titleRect = shapeSvg.insert('rect', ':first-child');\n      bodyRect = shapeSvg.insert('rect', ':first-child');\n\n      titleRect\n        .attr('class', 'swimlane-title')\n        .attr('style', nodeStyles)\n        .attr('x', laneLeft)\n        .attr('y', laneTop)\n        .attr('width', titleWidth)\n        .attr('height', height)\n        .attr('fill', clusterBkg)\n        .attr('stroke', laneStroke);\n\n      bodyRect\n        .attr('class', 'swimlane-body')\n        .attr('style', nodeStyles)\n        .attr('x', bodyX)\n        .attr('y', laneTop)\n        .attr('width', bodyWidth)\n        .attr('height', height)\n        .attr('fill', 'none')\n        .attr('stroke', laneStroke);\n    }\n\n    // Position the label: center it within the title band and rotate -90 degrees\n    // After rotation, the label reads bottom-to-top\n    const labelCenterX = laneLeft + titleWidth / 2;\n    const labelCenterY = node.y;\n    labelEl.attr(\n      'transform',\n      `translate(${labelCenterX}, ${labelCenterY}) rotate(-90) translate(${-bbox.width / 2}, ${-bbox.height / 2})`\n    );\n  } else {\n    // TB layout (default): title band is a horizontal strip on top\n    const headerMaxHeight = Math.max(0, contentTop - laneTop);\n    const titleHeight = Math.min(desiredTitleSize, headerMaxHeight);\n\n    // The lane body should visually start exactly where the title band ends\n    // so that their borders touch. The vertical gap between the title text\n    // and the first row of nodes is then controlled purely by the\n    // headerMaxHeight/titleHeight relationship (and thus by titlePaddingY).\n    const bodyY = laneTop + titleHeight;\n    const contentHeight = Math.max(0, laneBottom - bodyY);\n\n    const x = node.x - width / 2;\n\n    if (node.look === 'handDrawn') {\n      // @ts-ignore TODO: Fix rough typings\n      const rc = rough.svg(shapeSvg);\n      const titleOptions = userNodeOverrides(node, {\n        roughness: 0.7,\n        fill: clusterBkg,\n        stroke: laneStroke,\n        fillWeight: 3,\n        seed: handDrawnSeed,\n      });\n      const bodyOptions = userNodeOverrides(node, {\n        roughness: 0.7,\n        fill: 'none',\n        stroke: laneStroke,\n        seed: handDrawnSeed,\n      });\n\n      const roughTitle = rc.rectangle(x, laneTop, width, titleHeight, titleOptions);\n      titleRect = shapeSvg.insert(() => roughTitle, ':first-child').attr('class', 'swimlane-title');\n      const roughBody = rc.rectangle(x, bodyY, width, contentHeight, bodyOptions);\n      bodyRect = shapeSvg.insert(() => roughBody, ':first-child').attr('class', 'swimlane-body');\n\n      titleRect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n      titleRect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n    } else {\n      titleRect = shapeSvg.insert('rect', ':first-child');\n      bodyRect = shapeSvg.insert('rect', ':first-child');\n\n      titleRect\n        .attr('class', 'swimlane-title')\n        .attr('style', nodeStyles)\n        .attr('x', x)\n        .attr('y', laneTop)\n        .attr('width', width)\n        .attr('height', titleHeight)\n        .attr('fill', clusterBkg)\n        .attr('stroke', laneStroke);\n\n      bodyRect\n        .attr('class', 'swimlane-body')\n        .attr('style', nodeStyles)\n        .attr('x', x)\n        .attr('y', bodyY)\n        .attr('width', width)\n        .attr('height', contentHeight)\n        .attr('fill', 'none')\n        .attr('stroke', laneStroke);\n    }\n\n    // Place the label centered within the title band\n    const labelX = node.x - bbox.width / 2;\n    const labelY = laneTop + (titleHeight - bbox.height) / 2;\n    labelEl.attr('transform', `translate(${labelX}, ${labelY})`);\n  }\n\n  log.trace('Swimlane data ', node, JSON.stringify(node));\n\n  if (labelStyles) {\n    const span = labelEl.select('span');\n    if (span) {\n      span.attr('style', labelStyles);\n    }\n  }\n\n  node.offsetX = 0;\n  node.width = width;\n  node.height = height;\n  // Used by layout engine to position subgraph in parent\n  node.offsetY = bbox.height - padding / 2;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { getEffectiveHtmlLabels } from '../../config.js';\nimport { log } from '../../logger.js';\nimport { getSubGraphTitleMargins } from '../../utils/subGraphTitleMargins.js';\nimport { select } from 'd3';\nimport rough from 'roughjs';\nimport { createText } from '../createText.ts';\nimport intersectRect from '../rendering-elements/intersect/intersect-rect.js';\nimport createLabel from './createLabel.js';\nimport { createRoundedRectPathD } from './shapes/roundedRectPath.ts';\nimport { compileStyles, styles2String, userNodeOverrides } from './shapes/handDrawnShapeStyles.js';\nimport { swimlane } from './clusters/swimlane.js';\nimport { stampColorSlot } from '../../diagrams/common/colorThemeGate.js';\n\nconst rect = async (parent, node) => {\n  log.info('Creating subgraph rect for ', node.id, node);\n  const siteConfig = getConfig();\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const { clusterBkg, clusterBorder, borderColorArray } = themeVariables;\n\n  const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node);\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster ' + node.cssClasses)\n    .attr('id', node.domId)\n    .attr('data-look', node.look);\n\n  // Per-container colour slot. A no-op unless the active theme carries a palette, and\n  // painted only by diagrams whose stylesheet defines the matching `[data-color-id]`\n  // rules -- for state, block and class namespaces this is an inert attribute.\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  const useHtmlLabels = getEffectiveHtmlLabels(siteConfig);\n\n  // Create the label and insert it after the rect\n  const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label ');\n\n  let text;\n  if (node.labelType === 'markdown') {\n    text = await createText(labelEl, node.label, {\n      style: node.labelStyle,\n      useHtmlLabels,\n      isNode: true,\n      width: node.width,\n    });\n  } else {\n    text = await createLabel(labelEl, node.label, node.labelStyle || '', false, true);\n  }\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (getEffectiveHtmlLabels(siteConfig)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (width - node.width) / 2 - node.padding;\n  } else {\n    node.diff = -node.padding;\n  }\n\n  const height = node.height;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n\n  log.trace('Data ', node, JSON.stringify(node));\n  let rect;\n  if (node.look === 'handDrawn') {\n    // @ts-ignore TODO: Fix rough typings\n    const rc = rough.svg(shapeSvg);\n    const options = userNodeOverrides(node, {\n      roughness: 0.7,\n      fill: clusterBkg,\n      // fill: 'red',\n      stroke: clusterBorder,\n      fillWeight: 3,\n      seed: handDrawnSeed,\n    });\n    const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, 0), options);\n    rect = shapeSvg.insert(() => {\n      log.debug('Rough node insert CXC', roughNode);\n      return roughNode;\n    }, ':first-child');\n    // Should we affect the options instead of doing this?\n    rect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n    rect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n  } else {\n    // add the rect\n    rect = shapeSvg.insert('rect', ':first-child');\n    // center the rect around its coordinate\n    rect\n      .attr('style', nodeStyles)\n      .attr('rx', node.rx)\n      .attr('ry', node.ry)\n      .attr('x', x)\n      .attr('y', y)\n      .attr('width', width)\n      .attr('height', height);\n  }\n  const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n  labelEl.attr(\n    'transform',\n    // This puts the label on top of the box instead of inside it\n    `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n  );\n\n  if (labelStyles) {\n    const span = labelEl.select('span');\n    if (span) {\n      span.attr('style', labelStyles);\n    }\n  }\n  // Center the label\n\n  const rectBox = rect.node().getBBox();\n  node.offsetX = 0;\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n  // Used by layout engine to position subgraph in parent\n  node.offsetY = bbox.height - node.padding / 2;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\n\n/**\n * Non visible cluster where the note is group with its\n *\n * @param {any} parent\n * @param {any} node\n * @returns {any} ShapeSvg\n */\nconst noteGroup = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.domId);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  // center the rect around its coordinate\n  rect\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', node.x - node.width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', node.width + padding)\n    .attr('height', node.height + padding)\n    .attr('fill', 'none');\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: { width: 0, height: 0 } };\n};\n\nconst roundedWithTitle = async (parent, node) => {\n  const siteConfig = getConfig();\n\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const {\n    altBackground,\n    borderColorArray,\n    compositeBackground,\n    compositeTitleBackground,\n    nodeBorder,\n  } = themeVariables;\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', node.cssClasses)\n    .attr('id', node.domId)\n    .attr('data-id', node.id)\n    .attr('data-look', node.look);\n\n  // Per-composite colour slot, painted by the `[data-color-id]` rules in `state/styles.js`.\n  // A no-op unless the active theme carries a palette.\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  // add the rect\n  const outerRectG = shapeSvg.insert('g', ':first-child');\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n  let innerRect = shapeSvg.append('rect');\n\n  const text = await createLabel(label, node.label, node.labelStyle, undefined, true);\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (getEffectiveHtmlLabels(siteConfig)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  // Rounded With Title\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  const width =\n    (node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width) + padding;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (width - node.width) / 2 - node.padding;\n  } else {\n    node.diff = -node.padding;\n  }\n\n  const height = node.height + padding;\n  // const height = node.height + padding;\n  const innerHeight = node.height + padding - bbox.height - 6;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n  node.width = width;\n  const innerY = node.y - node.height / 2 - halfPadding + bbox.height + 2;\n\n  // add the rect\n  let rect;\n  if (node.look === 'handDrawn') {\n    const isAlt = node.cssClasses.includes('statediagram-cluster-alt');\n    const rc = rough.svg(shapeSvg);\n    const roughOuterNode =\n      node.rx || node.ry\n        ? rc.path(createRoundedRectPathD(x, y, width, height, 10), {\n            roughness: 0.7,\n            fill: compositeTitleBackground,\n            fillStyle: 'solid',\n            stroke: nodeBorder,\n            seed: handDrawnSeed,\n          })\n        : rc.rectangle(x, y, width, height, { seed: handDrawnSeed });\n\n    rect = shapeSvg.insert(() => roughOuterNode, ':first-child');\n    const roughInnerNode = rc.rectangle(x, innerY, width, innerHeight, {\n      fill: isAlt ? altBackground : compositeBackground,\n      fillStyle: isAlt ? 'hachure' : 'solid',\n      stroke: nodeBorder,\n      seed: handDrawnSeed,\n    });\n\n    rect = shapeSvg.insert(() => roughOuterNode, ':first-child');\n    innerRect = shapeSvg.insert(() => roughInnerNode);\n    // The classic branch below gives its two rects `outer` and `inner`; roughjs wraps each\n    // shape in a `g` with no class, so without the same names here a stylesheet cannot tell\n    // the title shape from the body and any `path` rule hits both.\n    rect.attr('class', 'outer');\n    innerRect.attr('class', 'inner');\n  } else {\n    rect = outerRectG.insert('rect', ':first-child');\n    const outerRectClass = 'outer';\n\n    // center the rect around its coordinate\n    rect\n      .attr('class', outerRectClass)\n      .attr('x', x)\n      .attr('y', y)\n      .attr('width', width)\n      .attr('height', height)\n      .attr('data-look', node.look);\n    innerRect\n      .attr('class', 'inner')\n      .attr('x', x)\n      .attr('y', innerY)\n      .attr('width', width)\n      .attr('height', innerHeight);\n  }\n\n  label.attr(\n    'transform',\n    `translate(${node.x - bbox.width / 2}, ${y + 1 - (getEffectiveHtmlLabels(siteConfig) ? 0 : 3)})`\n  );\n\n  const rectBox = rect.node().getBBox();\n  node.height = rectBox.height;\n  node.offsetX = 0;\n  // Used by layout engine to position subgraph in parent\n  node.offsetY = bbox.height - node.padding / 2;\n  node.labelBBox = bbox;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\nconst kanbanSection = async (parent, node) => {\n  log.info('Creating subgraph rect for ', node.id, node);\n  const siteConfig = getConfig();\n  const { themeVariables, handDrawnSeed } = siteConfig;\n  const { clusterBkg, clusterBorder } = themeVariables;\n\n  const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node);\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster ' + node.cssClasses)\n    .attr('id', node.domId)\n    .attr('data-look', node.look);\n\n  const useHtmlLabels = getEffectiveHtmlLabels(siteConfig);\n\n  // Create the label and insert it after the rect\n  const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label ');\n\n  const text = await createText(labelEl, node.label, {\n    style: node.labelStyle,\n    useHtmlLabels,\n    isNode: true,\n    width: node.width,\n  });\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (getEffectiveHtmlLabels(siteConfig)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (width - node.width) / 2 - node.padding;\n  } else {\n    node.diff = -node.padding;\n  }\n\n  const height = node.height;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n\n  log.trace('Data ', node, JSON.stringify(node));\n  let rect;\n  if (node.look === 'handDrawn') {\n    // @ts-ignore TODO: Fix rough typings\n    const rc = rough.svg(shapeSvg);\n    const options = userNodeOverrides(node, {\n      roughness: 0.7,\n      fill: clusterBkg,\n      // fill: 'red',\n      stroke: clusterBorder,\n      fillWeight: 4,\n      seed: handDrawnSeed,\n    });\n    const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, node.rx), options);\n    rect = shapeSvg.insert(() => {\n      log.debug('Rough node insert CXC', roughNode);\n      return roughNode;\n    }, ':first-child');\n    // Should we affect the options instead of doing this?\n    rect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n    rect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n  } else {\n    // add the rect\n    rect = shapeSvg.insert('rect', ':first-child');\n    // center the rect around its coordinate\n    rect\n      .attr('style', nodeStyles)\n      .attr('rx', node.rx)\n      .attr('ry', node.ry)\n      .attr('x', x)\n      .attr('y', y)\n      .attr('width', width)\n      .attr('height', height);\n  }\n  const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n  labelEl.attr(\n    'transform',\n    // This puts the label on top of the box instead of inside it\n    `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n  );\n\n  if (labelStyles) {\n    const span = labelEl.select('span');\n    if (span) {\n      span.attr('style', labelStyles);\n    }\n  }\n  // Center the label\n\n  const rectBox = rect.node().getBBox();\n  node.offsetX = 0;\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n  // Used by layout engine to position subgraph in parent\n  node.offsetY = bbox.height - node.padding / 2;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\nconst divider = (parent, node) => {\n  const siteConfig = getConfig();\n\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const { altBackground, nodeBorder, borderColorArray } = themeVariables;\n\n  // Sibling regions of one composite share a slot -- see `nextColorSlot` in the state\n  // diagram's `dataFetcher.ts`.\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', node.cssClasses)\n    .attr('id', node.domId)\n    .attr('data-look', node.look);\n\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  // add the rect\n  const outerRectG = shapeSvg.insert('g', ':first-child');\n\n  const padding = 0 * node.padding;\n\n  const width = node.width + padding;\n\n  node.diff = -node.padding;\n\n  const height = node.height + padding;\n  // const height = node.height + padding;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n  node.width = width;\n\n  // add the rect\n  let rect;\n  if (node.look === 'handDrawn') {\n    const rc = rough.svg(shapeSvg);\n    const roughOuterNode = rc.rectangle(x, y, width, height, {\n      // The theme's own value, matching what `rect.divider` gets from CSS under the other\n      // looks -- and the same fallback. It was hardcoded `lightgrey`, which no dark theme\n      // ever asked for; that stayed tolerable only while the fill was sparse hatching, and\n      // turns into a bright block on a dark canvas once it is solid.\n      fill: altBackground ?? '#efefef',\n      // Solid rather than roughjs's default hachure. A hachure fill is drawn as *stroked*\n      // lines, so both of the group's paths come out with `fill=\"none\"` and a stylesheet\n      // cannot tell the fill from the outline -- which is the same trap documented on\n      // `roundedWithTitle`'s inner shape in `state/styles.js`. Solid splits them the way\n      // the composite's outer shape already does, so a region can take the palette's tint\n      // and border without its hatching being repainted. `roundedWithTitle` fills solid\n      // too, except for its deliberately hatched alt variant.\n      fillStyle: 'solid',\n      roughness: 0.5,\n      strokeLineDash: [5],\n      stroke: nodeBorder,\n      seed: handDrawnSeed,\n    });\n\n    rect = shapeSvg.insert(() => roughOuterNode, ':first-child').attr('class', 'divider');\n  } else {\n    rect = outerRectG.insert('rect', ':first-child');\n    let outerRectClass = 'outer';\n    if (node.look === 'neo') {\n      outerRectClass = 'divider';\n    } else {\n      outerRectClass = 'divider';\n    }\n\n    // center the rect around its coordinate\n    rect\n      .attr('class', outerRectClass)\n      .attr('x', x)\n      .attr('y', y)\n      .attr('width', width)\n      .attr('height', height)\n      .attr('data-look', node.look);\n  }\n\n  const rectBox = rect.node().getBBox();\n  node.height = rectBox.height;\n  node.offsetX = 0;\n  // Used by layout engine to position subgraph in parent\n  node.offsetY = 0;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: {} };\n};\n\n/**\n * Shared helper for agentflow container cluster shapes.\n * Renders a labeled rounded-rect cluster with configurable visual style.\n *\n * Agentflow's grammar has a single container kind (`flow`), so `flowGroup`\n * below is the only caller today. The options object is kept so a second\n * container kind does not have to re-derive the label/rough/separator logic.\n *\n * @param {object} opts\n * @param {string} opts.cssClass    - CSS class suffix (e.g. 'agent-cluster')\n * @param {number} opts.rx          - Corner radius\n * @param {string} opts.fill        - Fill color (or 'none'/'transparent')\n * @param {string} opts.stroke      - Stroke color\n * @param {number} opts.strokeWidth - Stroke width in px\n * @param {number[]} [opts.strokeDash] - Optional dash array\n * @param {number} opts.roughness   - rough.js roughness\n */\nconst createContainerGroup = async (parent, node, opts) => {\n  log.info(`Creating ${opts.cssClass} for `, node.id, node);\n  const siteConfig = getConfig();\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const { borderColorArray } = themeVariables;\n\n  const { labelStyles, borderStyles } = styles2String(node);\n\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster ' + opts.cssClass + ' ' + node.cssClasses)\n    // `domId` is generated per render (render.ts prefixes it with the diagram's\n    // svg id). Using the raw, author-supplied `node.id` here collided across two\n    // diagrams on the same page, like every other cluster shape in this file.\n    .attr('id', node.domId ?? node.id)\n    .attr('data-look', node.look);\n\n  // Per-container colour slot, exactly as `rect` above does it. Every other cluster\n  // function stamps; this one did not, which left the containers drawn through it \u2014 only\n  // agentflow's `flowGroup` \u2014 unable to use the mechanism every other diagram's containers\n  // use. A no-op unless the theme carries a palette, and inert for any diagram whose\n  // stylesheet defines no matching `[data-color-id]` rules.\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  const useHtmlLabels = getEffectiveHtmlLabels(siteConfig);\n  const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label');\n\n  let bbox = { width: 0, height: 0 };\n  const hasLabel = node.label?.trim();\n  if (hasLabel) {\n    let text;\n    if (node.labelType === 'markdown') {\n      text = await createText(labelEl, node.label, {\n        style: node.labelStyle,\n        useHtmlLabels,\n        isNode: true,\n        width: node.width,\n      });\n    } else {\n      text = await createLabel(labelEl, node.label, node.labelStyle || '', false, true);\n    }\n    bbox = text.getBBox();\n    if (useHtmlLabels) {\n      const div = text.children[0];\n      const dv = select(text);\n      bbox = div.getBoundingClientRect();\n      dv.attr('width', bbox.width);\n      dv.attr('height', bbox.height);\n    }\n  }\n\n  const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (width - node.width) / 2 - node.padding;\n  } else {\n    node.diff = -node.padding;\n  }\n\n  const height = node.height;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n\n  let rectEl;\n  if (node.look === 'handDrawn') {\n    const rc = rough.svg(shapeSvg);\n    const roughOpts = userNodeOverrides(node, {\n      roughness: opts.roughness,\n      fill: opts.fill,\n      stroke: opts.stroke,\n      strokeWidth: opts.strokeWidth,\n      seed: handDrawnSeed,\n      ...(opts.fill === 'none' ? { fillWeight: 0 } : { fillStyle: 'solid' }),\n      ...(opts.strokeDash ? { strokeLineDash: opts.strokeDash } : {}),\n    });\n    const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, opts.rx), roughOpts);\n    rectEl = shapeSvg.insert(() => roughNode, ':first-child');\n    rectEl.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n  } else {\n    rectEl = shapeSvg.insert('rect', ':first-child');\n    rectEl\n      .attr('rx', opts.rx)\n      .attr('ry', opts.rx)\n      .attr('x', x)\n      .attr('y', y)\n      .attr('width', width)\n      .attr('height', height)\n      .attr('fill', opts.fill)\n      .attr('stroke', opts.stroke)\n      .attr('stroke-width', opts.strokeWidth + 'px');\n    if (opts.strokeDash) {\n      rectEl.attr('stroke-dasharray', opts.strokeDash.join(', '));\n    }\n  }\n\n  if (hasLabel) {\n    const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n    labelEl.attr(\n      'transform',\n      `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n    );\n    if (labelStyles) {\n      const span = labelEl.select('span');\n      if (span) {\n        span.attr('style', labelStyles);\n      }\n    }\n  }\n\n  const rectBox = rectEl.node().getBBox();\n  node.offsetX = 0;\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n  node.offsetY = bbox.height - node.padding / 2;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\n\n/** Flow group: organizational grouping. Transparent, solid 0.75px, rx=10. */\nconst flowGroup = async (parent, node) => {\n  const { themeVariables } = getConfig();\n  const stroke = themeVariables.flowContainerStroke || themeVariables.secondaryBorderColor;\n  return createContainerGroup(parent, node, {\n    cssClass: 'flow-cluster',\n    rx: 10,\n    fill: 'none',\n    stroke,\n    strokeWidth: 0.75,\n    roughness: 0.7,\n  });\n};\n\nexport const getUsecaseSystemBoundaryGeometry = (node, labelBBox) => {\n  const boundaryType = node.boundaryType || 'rect';\n  const horizontalLabelPadding = boundaryType === 'package' ? 20 : node.padding;\n  const tabHeight = boundaryType === 'package' ? labelBBox.height + 10 : 0;\n  const width = Math.max(node.width, labelBBox.width + horizontalLabelPadding);\n  const height =\n    boundaryType === 'package' ? Math.max(node.height, tabHeight + node.padding * 2) : node.height;\n  const x = node.x - width / 2;\n  const y = node.y - height / 2;\n\n  return {\n    boundaryType,\n    width,\n    height,\n    x,\n    y,\n    bodyY: y + tabHeight,\n    bodyHeight: height - tabHeight,\n    tabHeight,\n    tabWidth: boundaryType === 'package' ? Math.min(width, Math.max(80, labelBBox.width + 20)) : 0,\n  };\n};\n\n/**\n * Custom cluster shape for use-case system boundaries.\n * @param {any} parent\n * @param {any} node\n * @returns {any} ShapeSvg\n */\nconst usecaseSystemBoundary = async (parent, node) => {\n  log.info('Creating usecase system boundary for ', node.id, node);\n  const siteConfig = getConfig();\n  const { theme, themeVariables, handDrawnSeed } = siteConfig;\n  const { clusterBkg, clusterBorder, borderColorArray } = themeVariables;\n  const { labelStyles, nodeStyles } = styles2String(node);\n  const { stylesMap } = compileStyles(node);\n\n  const boundaryType = node.boundaryType || 'rect';\n  const shapeSvg = parent\n    .insert('g')\n    .attr(\n      'class',\n      `cluster usecase-system-boundary usecase-system-boundary-${boundaryType} ${node.cssClasses}`\n    )\n    .attr('id', typeof node.domId === 'string' ? node.domId : node.id)\n    .attr('data-boundary-type', boundaryType)\n    .attr('data-look', node.look);\n\n  // Per-container colour slot, as in `rect` above. A boundary is a container, but unlike a\n  // class namespace it is painted -- `usecase/styles.ts` defines the matching rules.\n  stampColorSlot(shapeSvg, node.colorIndex, theme, borderColorArray);\n\n  const useHtmlLabels = getEffectiveHtmlLabels(siteConfig);\n  const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label system-boundary-title');\n  const text = await createText(labelEl, node.label, {\n    style: labelStyles,\n    useHtmlLabels,\n    isNode: true,\n  });\n\n  let bbox = text.getBBox();\n  if (useHtmlLabels) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const geometry = getUsecaseSystemBoundaryGeometry(node, bbox);\n  const { width, height, x, y, bodyY, bodyHeight, tabHeight, tabWidth } = geometry;\n  node.diff =\n    node.width <= bbox.width + node.padding\n      ? (width - node.width) / 2 - node.padding\n      : -node.padding;\n\n  const roughOptions = userNodeOverrides(node, {\n    fill: stylesMap.get('fill') || clusterBkg,\n    stroke: stylesMap.get('stroke') || clusterBorder,\n    strokeWidth: stylesMap.get('stroke-width')?.replace('px', '') || 1,\n    seed: handDrawnSeed,\n  });\n\n  if (node.look === 'handDrawn') {\n    const rc = rough.svg(shapeSvg);\n    const roughBody = rc.rectangle(x, bodyY, width, bodyHeight, roughOptions);\n    shapeSvg.insert(() => roughBody, ':first-child').attr('class', 'boundary-body label-container');\n\n    if (boundaryType === 'package') {\n      const roughTab = rc.rectangle(x, y, tabWidth, tabHeight, roughOptions);\n      shapeSvg\n        .insert(() => roughTab, ':first-child')\n        .attr('class', 'boundary-tab system-boundary-package-tab label-container');\n    }\n  } else {\n    shapeSvg\n      .insert('rect', ':first-child')\n      .attr('class', 'boundary-body label-container')\n      .attr('style', nodeStyles)\n      .attr('x', x)\n      .attr('y', bodyY)\n      .attr('width', width)\n      .attr('height', bodyHeight);\n\n    if (boundaryType === 'package') {\n      shapeSvg\n        .insert('rect', ':first-child')\n        .attr('class', 'boundary-tab system-boundary-package-tab label-container')\n        .attr('style', nodeStyles)\n        .attr('x', x)\n        .attr('y', y)\n        .attr('width', tabWidth)\n        .attr('height', tabHeight);\n    }\n  }\n\n  const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n  if (boundaryType === 'package') {\n    labelEl.attr(\n      'transform',\n      `translate(${x + (tabWidth - bbox.width) / 2}, ${y + (tabHeight - bbox.height) / 2})`\n    );\n  } else {\n    labelEl.attr(\n      'transform',\n      `translate(${node.x - bbox.width / 2}, ${y + subGraphTitleTopMargin})`\n    );\n  }\n\n  if (labelStyles) {\n    labelEl.attr('style', labelStyles);\n    labelEl.select('span').attr('style', labelStyles);\n  }\n\n  node.offsetX = 0;\n  node.width = width;\n  node.height = height;\n  node.offsetY = bbox.height - node.padding / 2;\n  node.labelBBox = bbox;\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return { cluster: shapeSvg, labelBBox: bbox };\n};\n\nconst squareRect = rect;\nconst shapes = {\n  rect,\n  squareRect,\n  roundedWithTitle,\n  noteGroup,\n  divider,\n  kanbanSection,\n  flowGroup,\n  usecaseSystemBoundary,\n  swimlane,\n};\n\n/**\n * Cluster shapes that never paint their label as a title. A note group's label\n * is the note's text, painted by the note node inside it; the group itself is\n * an invisible frame. Layout must not reserve title space for these.\n */\nconst UNTITLED_CLUSTER_SHAPES = new Set(['noteGroup', 'divider']);\n\n/**\n * Whether a cluster shape paints its label as a title strip above its children.\n * @param {string | undefined} shape - Shape id; defaults to 'rect' like `insertCluster`\n * @returns {boolean}\n */\nexport const clusterPaintsTitle = (shape) => !UNTITLED_CLUSTER_SHAPES.has(shape ?? 'rect');\n\nlet clusterElems = new Map();\n\n/**\n * @typedef {keyof typeof shapes} ClusterShapeID\n */\n\n/**\n * @param {import('../types.js').ClusterNode} node - Shape defaults to 'rect'\n */\nexport const insertCluster = async (elem, node) => {\n  const shape = node.shape || 'rect';\n  const cluster = await shapes[shape](elem, node);\n  clusterElems.set(node.id, cluster);\n  return cluster;\n};\n\nexport const getClusterTitleWidth = (elem, node) => {\n  // TODO: Doesn't this need an `await`?\n  const label = createLabel(elem, node.label, node.labelStyle, undefined, true);\n  const width = label.getBBox().width;\n  elem.node().removeChild(label);\n  return width;\n};\n\nexport const clear = () => {\n  clusterElems = new Map();\n};\n\nexport const positionCluster = (node) => {\n  log.info(\n    'Position cluster (' +\n      node.id +\n      ', ' +\n      node.x +\n      ', ' +\n      node.y +\n      ') (' +\n      node?.width +\n      ', ' +\n      node?.height +\n      ')',\n    clusterElems.get(node.id)\n  );\n  const el = clusterElems.get(node.id);\n  el.cluster.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n};\n"],
  "mappings": "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",
  "names": ["swimlane", "__name", "parent", "node", "siteConfig", "getConfig", "theme", "themeVariables", "handDrawnSeed", "clusterBkg", "clusterBorder", "borderColorArray", "laneStroke", "labelStyles", "nodeStyles", "borderStyles", "backgroundStyles", "styles2String", "shapeSvg", "stampColorSlot", "useHtmlLabels", "evaluate", "isLR", "labelEl", "text", "createText", "bbox", "div", "dv", "select_default", "padding", "width", "height", "laneTop", "laneBottom", "laneLeft", "contentTop", "titlePaddingY", "desiredTitleSize", "titleRect", "bodyRect", "titleWidth", "bodyX", "bodyWidth", "rc", "at", "titleOptions", "userNodeOverrides", "bodyOptions", "roughTitle", "roughBody", "labelCenterX", "labelCenterY", "headerMaxHeight", "titleHeight", "bodyY", "contentHeight", "x", "labelX", "labelY", "log", "span", "point", "intersect_rect_default", "rect", "__name", "parent", "node", "log", "siteConfig", "getConfig", "theme", "themeVariables", "handDrawnSeed", "clusterBkg", "clusterBorder", "borderColorArray", "labelStyles", "nodeStyles", "borderStyles", "backgroundStyles", "styles2String", "shapeSvg", "stampColorSlot", "useHtmlLabels", "getEffectiveHtmlLabels", "labelEl", "text", "createText", "createLabel_default", "bbox", "div", "dv", "select_default", "width", "height", "x", "y", "rc", "at", "options", "userNodeOverrides", "roughNode", "createRoundedRectPathD", "subGraphTitleTopMargin", "getSubGraphTitleMargins", "span", "rectBox", "point", "intersect_rect_default", "noteGroup", "padding", "halfPadding", "roundedWithTitle", "altBackground", "compositeBackground", "compositeTitleBackground", "nodeBorder", "outerRectG", "label", "innerRect", "innerHeight", "innerY", "isAlt", "roughOuterNode", "roughInnerNode", "kanbanSection", "divider", "outerRectClass", "createContainerGroup", "opts", "hasLabel", "rectEl", "roughOpts", "flowGroup", "stroke", "getUsecaseSystemBoundaryGeometry", "labelBBox", "boundaryType", "horizontalLabelPadding", "tabHeight", "usecaseSystemBoundary", "stylesMap", "compileStyles", "geometry", "bodyY", "bodyHeight", "tabWidth", "roughOptions", "roughBody", "roughTab", "squareRect", "shapes", "swimlane", "UNTITLED_CLUSTER_SHAPES", "clusterPaintsTitle", "shape", "clusterElems", "insertCluster", "elem", "cluster", "clear", "__name", "clusterElems"]
}