mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines (7 loc) • 40.4 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/diagrams/cynefin/cynefinParser.ts", "../../../src/diagrams/cynefin/cynefinDb.ts", "../../../src/diagrams/cynefin/cynefinBoundaries.ts", "../../../src/diagrams/cynefin/cynefinRenderer.ts", "../../../src/diagrams/cynefin/styles.ts", "../../../src/diagrams/cynefin/cynefinDiagram.ts"],
"sourcesContent": ["import type { Cynefin } 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 { db } from './cynefinDb.js';\n\nconst populate = (ast: Cynefin) => {\n populateCommonDb(ast, db);\n db.setDomains(ast.domains);\n db.setTransitions(ast.transitions);\n};\n\nexport const parser: ParserDefinition = {\n parse: async (input: string): Promise<void> => {\n const ast: Cynefin = await parse('cynefin', input);\n log.debug(ast);\n populate(ast);\n },\n};\n", "import type { DomainBlock, Transition } from '@mermaid-js/parser';\nimport { getConfig as commonGetConfig } from '../../config.js';\nimport type { CynefinDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport { log } from '../../logger.js';\nimport { cleanAndMerge } from '../../utils.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 { CynefinDB, CynefinDomain, CynefinTransition, DomainName } from './types.js';\n\ninterface CynefinData {\n domains: Map<DomainName, CynefinDomain>;\n transitions: CynefinTransition[];\n}\n\nconst createDefaultData = (): CynefinData => ({\n domains: new Map(),\n transitions: [],\n});\n\nlet data: CynefinData = createDefaultData();\n\nconst getDomains = (): Map<DomainName, CynefinDomain> => data.domains;\n\nconst getTransitions = (): CynefinTransition[] => data.transitions;\n\nconst setDomains = (blocks: DomainBlock[]) => {\n if (!blocks) {\n return;\n }\n for (const block of blocks) {\n const domainName = block.domain as DomainName;\n const items = (block.items ?? []).map((item) => ({\n label: item.label,\n }));\n data.domains.set(domainName, {\n name: domainName,\n items,\n });\n }\n};\n\nconst setTransitions = (transitions: Transition[]) => {\n if (!transitions) {\n return;\n }\n data.transitions = transitions\n .filter((t) => {\n if (t.from === t.to) {\n log.warn(\n `Cynefin: self-loop transition on domain \"${t.from}\" is not meaningful and will be skipped.`\n );\n return false;\n }\n return true;\n })\n .map((t) => ({\n from: t.from as DomainName,\n to: t.to as DomainName,\n label: t.label || undefined,\n }));\n};\n\nconst getConfig = (): Required<CynefinDiagramConfig> => {\n return cleanAndMerge({\n ...DEFAULT_CONFIG.cynefin,\n ...commonGetConfig().cynefin,\n });\n};\n\nconst clear = () => {\n commonClear();\n data = createDefaultData();\n};\n\nexport const db: CynefinDB = {\n getDomains,\n getTransitions,\n setDomains,\n setTransitions,\n getConfig,\n clear,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n};\n", "/**\n * Deterministic pseudo-random number generator (mulberry32).\n * Returns a function that produces values in [0, 1).\n */\nexport function seededRandom(seed: number): number {\n let t = (seed + 0x6d2b79f5) | 0;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n}\n\n/**\n * Simple string hash for seeding the PRNG.\n */\nexport function hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n hash = (hash << 5) - hash + ch;\n hash |= 0;\n }\n return hash;\n}\n\n/**\n * Resolve the boundary-waviness seed. A non-zero configured seed takes\n * precedence so renders are reproducible (visual regression tests). When the\n * configured seed is 0 or absent we fall back to hashing the SVG element id,\n * which gives each rendered diagram its own waviness pattern at the cost of\n * being unstable across renders.\n */\nexport function resolveSeed(configuredSeed: number | undefined, id: string): number {\n if (\n typeof configuredSeed === 'number' &&\n Number.isFinite(configuredSeed) &&\n configuredSeed !== 0\n ) {\n return configuredSeed;\n }\n return hashString(id);\n}\n\n/**\n * Generate a vertical wavy line (the \"fold\") through the center of the diagram.\n * Uses cubic bezier segments with alternating control point offsets.\n * @param width - diagram width\n * @param height - diagram height\n * @param seed - deterministic seed for variation\n * @param amplitudeOverride - optional amplitude in pixels; falls back to 1.5% of width\n * @returns SVG path d attribute string\n */\nexport function generateFoldPath(\n width: number,\n height: number,\n seed: number,\n amplitudeOverride?: number\n): string {\n const cx = width / 2;\n const amplitude = amplitudeOverride ?? width * 0.015;\n const segments = 7;\n const segHeight = height / segments;\n const points: { x: number; y: number }[] = [];\n\n for (let i = 0; i <= segments; i++) {\n const jitter = seededRandom(seed + i * 17) * amplitude * 2 - amplitude;\n points.push({ x: cx + jitter, y: i * segHeight });\n }\n\n let d = `M${points[0].x},${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midY = (p0.y + p1.y) / 2;\n const dir = i % 2 === 0 ? 1 : -1;\n const offset = amplitude * 1.5 * dir * seededRandom(seed + i * 31 + 7);\n const cp1x = p0.x + offset;\n const cp1y = midY;\n const cp2x = p1.x - offset;\n const cp2y = midY;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p1.x},${p1.y}`;\n }\n\n return d;\n}\n\n/**\n * Generate a horizontal wavy line through the center of the diagram.\n * @param width - diagram width\n * @param height - diagram height\n * @param seed - deterministic seed for variation\n * @param amplitudeOverride - optional amplitude in pixels; falls back to 1.5% of height\n * @returns SVG path d attribute string\n */\nexport function generateHorizontalBoundary(\n width: number,\n height: number,\n seed: number,\n amplitudeOverride?: number\n): string {\n const cy = height / 2;\n const amplitude = amplitudeOverride ?? height * 0.015;\n const segments = 7;\n const segWidth = width / segments;\n const points: { x: number; y: number }[] = [];\n\n for (let i = 0; i <= segments; i++) {\n const jitter = seededRandom(seed + i * 23) * amplitude * 2 - amplitude;\n points.push({ x: i * segWidth, y: cy + jitter });\n }\n\n let d = `M${points[0].x},${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midX = (p0.x + p1.x) / 2;\n const dir = i % 2 === 0 ? 1 : -1;\n const offset = amplitude * 1.5 * dir * seededRandom(seed + i * 37 + 11);\n const cp1x = midX;\n const cp1y = p0.y + offset;\n const cp2x = midX;\n const cp2y = p1.y - offset;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p1.x},${p1.y}`;\n }\n\n return d;\n}\n\n/**\n * Generate the \"cliff\" path between Clear (bottom-right) and Chaotic (bottom-left).\n * This is a thicker, more abrupt boundary near the bottom center.\n * @param width - diagram width\n * @param height - diagram height\n * @returns SVG path d attribute string\n */\nexport function generateCliffPath(width: number, height: number): string {\n const cx = width / 2;\n const topY = height * 0.5;\n const bottomY = height;\n const amplitude = width * 0.03;\n\n // A steep S-curve from the center downward\n return [\n `M${cx},${topY}`,\n `C${cx + amplitude},${topY + (bottomY - topY) * 0.2}`,\n `${cx - amplitude * 1.5},${topY + (bottomY - topY) * 0.55}`,\n `${cx + amplitude * 0.5},${topY + (bottomY - topY) * 0.75}`,\n `C${cx - amplitude},${topY + (bottomY - topY) * 0.85}`,\n `${cx + amplitude * 0.3},${topY + (bottomY - topY) * 0.95}`,\n `${cx},${bottomY}`,\n ].join(' ');\n}\n\n/**\n * Generate an ellipse SVG path for the confusion/disorder region at the center.\n * @param cx - center x\n * @param cy - center y\n * @param rx - horizontal radius\n * @param ry - vertical radius\n * @returns SVG path d attribute string for an ellipse\n */\nexport function generateConfusionPath(cx: number, cy: number, rx: number, ry: number): string {\n // Draw an ellipse using two arc commands\n return [\n `M${cx - rx},${cy}`,\n `A${rx},${ry} 0 1,1 ${cx + rx},${cy}`,\n `A${rx},${ry} 0 1,1 ${cx - rx},${cy}`,\n 'Z',\n ].join(' ');\n}\n", "import type { Diagram } from '../../Diagram.js';\nimport type { DiagramRenderer, DrawDefinition, SVG } from '../../diagram-api/types.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport { log } from '../../logger.js';\nimport { getConfig as getConfigAPI } from '../../config.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport type { CynefinDB, CynefinDomain, CynefinTransition, DomainName } from './types.js';\nimport {\n generateFoldPath,\n generateHorizontalBoundary,\n generateCliffPath,\n generateConfusionPath,\n resolveSeed,\n} from './cynefinBoundaries.js';\n\ninterface DomainMeta {\n model: string;\n practice: string;\n}\n\nconst DOMAIN_META: Record<DomainName, DomainMeta> = {\n complex: { model: 'Probe \\u2192 Sense \\u2192 Respond', practice: 'Emergent Practices' },\n complicated: { model: 'Sense \\u2192 Analyse \\u2192 Respond', practice: 'Good Practices' },\n clear: { model: 'Sense \\u2192 Categorise \\u2192 Respond', practice: 'Best Practices' },\n chaotic: { model: 'Act \\u2192 Sense \\u2192 Respond', practice: 'Novel Practices' },\n confusion: { model: '', practice: 'Disorder' },\n};\n\ninterface DomainLayout {\n cx: number;\n cy: number;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst getDomainLayouts = (width: number, height: number): Record<DomainName, DomainLayout> => {\n const hw = width / 2;\n const hh = height / 2;\n return {\n complex: { cx: hw / 2, cy: hh / 2, x: 0, y: 0, w: hw, h: hh },\n complicated: { cx: hw + hw / 2, cy: hh / 2, x: hw, y: 0, w: hw, h: hh },\n chaotic: { cx: hw / 2, cy: hh + hh / 2, x: 0, y: hh, w: hw, h: hh },\n clear: { cx: hw + hw / 2, cy: hh + hh / 2, x: hw, y: hh, w: hw, h: hh },\n confusion: { cx: hw, cy: hh, x: hw * 0.7, y: hh * 0.7, w: hw * 0.6, h: hh * 0.6 },\n };\n};\n\ninterface CynefinDomainColors {\n complexBg: string;\n complicatedBg: string;\n chaoticBg: string;\n clearBg: string;\n confusionBg: string;\n}\n\n/** Resolve only the domain background colors from the cynefin theme block. */\nconst getCynefinDomainColors = (): CynefinDomainColors => {\n const defaultThemeVariables = getThemeVariables();\n const currentConfig = getConfigAPI();\n const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables);\n return themeVariables.cynefin as CynefinDomainColors;\n};\n\n/** Maximum items rendered inside the confusion ellipse before overflow badge is shown. */\nconst MAX_CONFUSION_ITEMS = 3;\n\nconst draw: DrawDefinition = (_text, id, _version, diagram: Diagram) => {\n const db = diagram.db as CynefinDB;\n const domains = db.getDomains();\n const transitions = db.getTransitions();\n const title = db.getDiagramTitle();\n const accTitle = db.getAccTitle();\n const accDescription = db.getAccDescription();\n const config = db.getConfig();\n const domainColors = getCynefinDomainColors();\n\n log.debug('Rendering Cynefin diagram');\n\n const width = config.width;\n const height = config.height;\n const padding = config.padding;\n const showDomainDescriptions = config.showDomainDescriptions;\n const boundaryAmplitude = config.boundaryAmplitude;\n const totalWidth = width + padding * 2;\n const totalHeight = height + padding * 2;\n\n const domainBg: Record<DomainName, string> = {\n complex: domainColors.complexBg,\n complicated: domainColors.complicatedBg,\n clear: domainColors.clearBg,\n chaotic: domainColors.chaoticBg,\n confusion: domainColors.confusionBg,\n };\n\n const svg: SVG = selectSvgElement(id);\n\n configureSvgSize(svg, totalHeight, totalWidth, config.useMaxWidth ?? true);\n svg.attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`);\n\n // Accessibility: use <title> element (W3C recommendation for SVG)\n if (accTitle) {\n svg.append('title').text(accTitle);\n }\n if (accDescription) {\n svg.append('desc').text(accDescription);\n }\n\n const root = svg.append('g').attr('transform', `translate(${padding}, ${padding})`);\n\n const layouts = getDomainLayouts(width, height);\n const seed = resolveSeed(config.seed, id);\n\n // 1. Domain background rectangles\n const bgGroup = root.append('g').attr('class', 'cynefin-backgrounds');\n const quadrantDomains: DomainName[] = ['complex', 'complicated', 'chaotic', 'clear'];\n for (const domainName of quadrantDomains) {\n const layout = layouts[domainName];\n bgGroup\n .append('rect')\n .attr('class', 'cynefinDomain')\n .attr('x', layout.x)\n .attr('y', layout.y)\n .attr('width', layout.w)\n .attr('height', layout.h)\n .attr('fill', domainBg[domainName])\n .attr('fill-opacity', 0.4)\n .attr('stroke', 'none');\n }\n\n // 2. Wavy boundaries \u2014 stroke handled by .cynefinBoundary CSS class\n const boundaryGroup = root.append('g').attr('class', 'cynefin-boundaries');\n\n boundaryGroup\n .append('path')\n .attr('class', 'cynefinBoundary')\n .attr('d', generateFoldPath(width, height, seed, boundaryAmplitude))\n .attr('fill', 'none');\n\n boundaryGroup\n .append('path')\n .attr('class', 'cynefinBoundary')\n .attr('d', generateHorizontalBoundary(width, height, seed + 100, boundaryAmplitude))\n .attr('fill', 'none');\n\n // 3. The cliff (thicker, between Clear and Chaotic) \u2014 stroke handled by .cynefinCliff CSS class\n boundaryGroup\n .append('path')\n .attr('class', 'cynefinCliff')\n .attr('d', generateCliffPath(width, height))\n .attr('fill', 'none');\n\n // 4. Confusion ellipse (center overlay) \u2014 stroke handled by .cynefinConfusion CSS class\n // Using width*0.15 and height*0.15 gives enough room for up to ~3 item badges\n const confusionRx = width * 0.15;\n const confusionRy = height * 0.15;\n root\n .append('path')\n .attr('class', 'cynefinConfusion')\n .attr('d', generateConfusionPath(width / 2, height / 2, confusionRx, confusionRy))\n .attr('fill', domainBg.confusion)\n .attr('fill-opacity', 0.5);\n\n // 5. Domain name labels \u2014 text styling handled by .cynefinDomainLabel CSS class\n const labelGroup = root.append('g').attr('class', 'cynefin-labels');\n for (const domainName of quadrantDomains) {\n const layout = layouts[domainName];\n labelGroup\n .append('text')\n .attr('class', 'cynefinDomainLabel')\n .attr('x', layout.cx)\n .attr('y', showDomainDescriptions ? layout.cy - 30 : layout.cy)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(domainName.charAt(0).toUpperCase() + domainName.slice(1));\n }\n\n // Confusion label\n labelGroup\n .append('text')\n .attr('class', 'cynefinDomainLabel')\n .attr('x', width / 2)\n .attr('y', showDomainDescriptions ? height / 2 - 10 : height / 2)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text('Confusion');\n\n // 6. Domain description subtitles \u2014 text styling handled by .cynefinSubtitle CSS class\n if (showDomainDescriptions) {\n const subtitleGroup = root.append('g').attr('class', 'cynefin-subtitles');\n for (const domainName of quadrantDomains) {\n const layout = layouts[domainName];\n const meta = DOMAIN_META[domainName];\n\n subtitleGroup\n .append('text')\n .attr('class', 'cynefinSubtitle')\n .attr('x', layout.cx)\n .attr('y', layout.cy - 10)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(meta.model);\n\n subtitleGroup\n .append('text')\n .attr('class', 'cynefinSubtitle')\n .attr('x', layout.cx)\n .attr('y', layout.cy + 5)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(meta.practice);\n }\n\n // Confusion subtitle\n subtitleGroup\n .append('text')\n .attr('class', 'cynefinSubtitle')\n .attr('x', width / 2)\n .attr('y', height / 2 + 8)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(DOMAIN_META.confusion.practice);\n }\n\n // 7. Items as text badges within each domain\n const itemGroup = root.append('g').attr('class', 'cynefin-items');\n const itemHeight = 26;\n const itemPaddingX = 10;\n\n const allDomains: DomainName[] = ['complex', 'complicated', 'chaotic', 'clear', 'confusion'];\n for (const domainName of allDomains) {\n const domain: CynefinDomain | undefined = domains.get(domainName);\n if (!domain || domain.items.length === 0) {\n continue;\n }\n\n const layout = layouts[domainName];\n const isConfusion = domainName === 'confusion';\n\n // For confusion: cap items and center the block around the ellipse center.\n // For quadrant domains: start below the label/subtitle area.\n let itemsToRender = domain.items;\n let overflowCount = 0;\n if (isConfusion && domain.items.length > MAX_CONFUSION_ITEMS) {\n overflowCount = domain.items.length - MAX_CONFUSION_ITEMS;\n itemsToRender = domain.items.slice(0, MAX_CONFUSION_ITEMS);\n }\n\n let startY: number;\n if (isConfusion) {\n // Center the item block below the label within the ellipse\n const labelOffset = showDomainDescriptions ? 22 : 14;\n startY = layout.cy + labelOffset;\n } else {\n startY = layout.cy + (showDomainDescriptions ? 25 : 15);\n }\n\n // Render item badges using getBBox() for accurate width measurement\n [...itemsToRender].forEach((item, idx) => {\n const itemY = startY + idx * (itemHeight + 4);\n const g = itemGroup.append('g');\n\n // Append text first to measure actual rendered width\n const textEl = g\n .append('text')\n .attr('class', 'cynefinItemText')\n .attr('x', 0)\n .attr('y', itemHeight / 2)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'central')\n .text(item.label);\n\n // Measure rendered text width; fall back to character-count heuristic if unavailable\n let measuredWidth = item.label.length * 7;\n const textNode = textEl.node();\n if (textNode && typeof textNode.getBBox === 'function') {\n const bbox = textNode.getBBox();\n if (bbox.width > 0) {\n measuredWidth = bbox.width;\n }\n }\n\n const badgeWidth = measuredWidth + itemPaddingX * 2;\n const itemX = layout.cx - badgeWidth / 2;\n\n g.attr('transform', `translate(${itemX}, ${itemY})`);\n\n // Insert rect behind the text, sized to measured badge width\n g.insert('rect', 'text')\n .attr('class', 'cynefinItem')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', badgeWidth)\n .attr('height', itemHeight)\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('fill', domainBg[domainName])\n .attr('fill-opacity', 0.95);\n\n // Centre text within badge\n textEl.attr('x', badgeWidth / 2).attr('y', itemHeight / 2);\n });\n\n // Overflow badge: \"+N more\" when confusion has more items than MAX_CONFUSION_ITEMS\n if (overflowCount > 0) {\n const overflowY = startY + itemsToRender.length * (itemHeight + 4);\n const overflowLabel = `+${overflowCount} more`;\n const g = itemGroup.append('g');\n\n const textEl = g\n .append('text')\n .attr('class', 'cynefinItemText')\n .attr('x', 0)\n .attr('y', itemHeight / 2)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'central')\n .text(overflowLabel);\n\n let measuredWidth = overflowLabel.length * 7;\n const textNode = textEl.node();\n if (textNode && typeof textNode.getBBox === 'function') {\n const bbox = textNode.getBBox();\n if (bbox.width > 0) {\n measuredWidth = bbox.width;\n }\n }\n\n const badgeWidth = measuredWidth + itemPaddingX * 2;\n const itemX = layout.cx - badgeWidth / 2;\n\n g.attr('transform', `translate(${itemX}, ${overflowY})`);\n\n g.insert('rect', 'text')\n .attr('class', 'cynefinItemOverflow')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', badgeWidth)\n .attr('height', itemHeight)\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('fill', domainBg[domainName])\n .attr('fill-opacity', 0.6);\n\n textEl.attr('x', badgeWidth / 2).attr('y', itemHeight / 2);\n }\n }\n\n // 8. Transition arrows between domain centers\n if (transitions.length > 0) {\n const defs = svg.select('defs').empty() ? svg.append('defs') : svg.select('defs');\n const markerId = `cynefin-arrow-${id}`;\n\n defs\n .append('marker')\n .attr('id', markerId)\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('class', 'cynefinArrowHead');\n\n const arrowGroup = root.append('g').attr('class', 'cynefin-arrows');\n\n transitions.forEach((transition: CynefinTransition) => {\n const fromLayout = layouts[transition.from];\n const toLayout = layouts[transition.to];\n if (!fromLayout || !toLayout) {\n return;\n }\n\n // Self-loops are filtered at the DB level; guard here handles any edge case\n if (transition.from === transition.to) {\n log.warn(`Cynefin renderer: skipping self-loop on domain \"${transition.from}\"`);\n return;\n }\n\n // All math in root-local (unpadded) coordinates to match the <g> transform.\n const x1 = fromLayout.cx;\n const y1 = fromLayout.cy;\n const x2 = toLayout.cx;\n const y2 = toLayout.cy;\n\n // Quadratic bezier with perpendicular offset\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n const offsetAmount = len * 0.15;\n const nx = -dy / len;\n const ny = dx / len;\n const cpx = mx + nx * offsetAmount;\n const cpy = my + ny * offsetAmount;\n\n arrowGroup\n .append('path')\n .attr('class', 'cynefinArrowLine')\n .attr('d', `M${x1},${y1} Q${cpx},${cpy} ${x2},${y2}`)\n .attr('fill', 'none')\n .attr('marker-end', `url(#${markerId})`);\n\n // Optional label \u2014 text styling handled by .cynefinArrowLabel CSS class\n if (transition.label) {\n arrowGroup\n .append('text')\n .attr('class', 'cynefinArrowLabel')\n .attr('x', cpx)\n .attr('y', cpy - 6)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'auto')\n .text(transition.label);\n }\n });\n }\n\n // Title \u2014 text styling handled by .cynefinTitle CSS class\n if (title) {\n root\n .append('text')\n .attr('class', 'cynefinTitle')\n .attr('x', width / 2)\n .attr('y', -padding / 2)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(title);\n }\n};\n\nexport const renderer: DiagramRenderer = { draw };\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport { getConfig as getConfigAPI } from '../../config.js';\n\n/**\n * Resolve the cynefin-specific theme block from the current mermaid theme.\n * All presentation values (colors, font sizes, stroke widths) are sourced from\n * here rather than duplicated as inline SVG attributes in the renderer.\n */\nconst getCynefinTheme = () => {\n const defaultThemeVariables = getThemeVariables();\n const currentConfig = getConfigAPI();\n const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables);\n return themeVariables.cynefin as {\n domainFontSize: number;\n itemFontSize: number;\n boundaryColor: string;\n boundaryWidth: number;\n cliffColor: string;\n cliffWidth: number;\n arrowColor: string;\n arrowWidth: number;\n textColor: string;\n labelColor: string;\n };\n};\n\nexport const styles: DiagramStylesProvider = () => {\n const t = getCynefinTheme();\n return `\n\t.cynefinDomain {\n\t\tstroke: none;\n\t}\n\t.cynefinDomainLabel {\n\t\tfont-size: ${t.domainFontSize}px;\n\t\tfont-weight: bold;\n\t\tfill: ${t.labelColor};\n\t}\n\t.cynefinSubtitle {\n\t\tfont-size: ${t.itemFontSize - 1}px;\n\t\tfill: ${t.textColor};\n\t\tfont-style: italic;\n\t}\n\t.cynefinItem {\n\t\tfill-opacity: 0.95;\n\t\tstroke: ${t.boundaryColor};\n\t\tstroke-width: 1;\n\t}\n\t.cynefinItemText {\n\t\tfont-size: ${t.itemFontSize}px;\n\t\tfill: ${t.textColor};\n\t}\n\t.cynefinItemOverflow {\n\t\tfill-opacity: 0.6;\n\t\tstroke: ${t.boundaryColor};\n\t\tstroke-width: 1;\n\t\tstroke-dasharray: 3 2;\n\t}\n\t.cynefinBoundary {\n\t\tstroke: ${t.boundaryColor};\n\t\tstroke-width: ${t.boundaryWidth};\n\t\tstroke-dasharray: 6 3;\n\t}\n\t.cynefinCliff {\n\t\tstroke: ${t.cliffColor};\n\t\tstroke-width: ${t.cliffWidth};\n\t}\n\t.cynefinConfusion {\n\t\tstroke: ${t.boundaryColor};\n\t\tstroke-width: 1.5;\n\t\tstroke-dasharray: 4 2;\n\t}\n\t.cynefinArrowLine {\n\t\tstroke: ${t.arrowColor};\n\t\tstroke-width: ${t.arrowWidth};\n\t\tfill: none;\n\t}\n\t.cynefinArrowHead {\n\t\tfill: ${t.arrowColor};\n\t\tstroke: none;\n\t}\n\t.cynefinArrowLabel {\n\t\tfont-size: ${t.itemFontSize - 1}px;\n\t\tfill: ${t.textColor};\n\t}\n\t.cynefinTitle {\n\t\tfont-size: ${t.domainFontSize + 2}px;\n\t\tfont-weight: bold;\n\t\tfill: ${t.labelColor};\n\t}\n\t`;\n};\n\nexport default styles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './cynefinParser.js';\nimport { db } from './cynefinDb.js';\nimport { renderer } from './cynefinRenderer.js';\nimport styles from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n};\n"],
"mappings": "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",
"names": ["getConfig", "clear", "diagram", "db"]
}