schematex 0.6.9 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/dendrogram.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","matchQuotedTitle","collectLeaves","estimateLabelWidth","TIP_SPACING","PADDING_LEFT","PADDING_RIGHT","PADDING_TOP","PADDING_BOTTOM","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-JAYJ2G4R.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n /**\n * Dendrogram (hierarchical-clustering) mode flag. Dendrogram is a phylo-local\n * mode layered on top of the cladogram base `mode`; it is carried in AST\n * metadata (not the shared `PhyloMode` union) so the dendrogram feature stays\n * isolated inside the phylo folder.\n */\n dendrogram?: boolean;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n } else if (val === \"dendrogram\") {\n // Dendrogram is a phylo-local mode (not in the shared PhyloMode\n // union). It reuses the cladogram base for any code that only knows\n // the standard modes, and is flagged separately for the dendrogram\n // layout/renderer.\n result.mode = \"cladogram\";\n result.dendrogram = true;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n const title: string | undefined = matchQuotedTitle(headerLine);\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n let cut: number | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Cut line (dendrogram threshold): \"cut 1.5\" or \"cut: 1.5\"\n if (/^cut\\b/i.test(trimmed)) {\n const cutStr = trimmed.replace(/^cut\\s*:?\\s*/i, \"\").trim();\n const cutVal = Number(cutStr);\n if (!Number.isNaN(cutVal)) cut = cutVal;\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n // Dendrogram mode + cut threshold are phylo-local concerns carried in\n // metadata so the dendrogram feature stays inside the phylo folder without\n // extending the shared PhyloMode union or PhyloTreeAST interface.\n const metadata: Record<string, string> = {};\n if (headerProps.dendrogram) metadata.dendrogram = \"true\";\n if (cut !== undefined) metadata.cut = String(cut);\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata,\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\nimport type { PhyloLayoutResult, PhyloBranch } from \"./layout\";\n\n// ─── Dendrogram (hierarchical-clustering tree) ───────────────\n//\n// A dendrogram differs from a cladogram in that internal nodes are positioned\n// at their *merge height* (the cluster distance at which two sub-clusters\n// join). Leaves all align at the baseline (height 0). Connectors are\n// rectangular \"elbow\" U-shapes. An optional `cut` threshold slices the tree\n// into flat clusters, each drawn in a distinct colour.\n//\n// Convention (matching the rest of the phylo engine — root on the left,\n// tips on the right):\n// - height 0 → rightmost (leaves)\n// - maxHeight → leftmost (root)\n// - x = PADDING_LEFT + (maxHeight - height) * scale\n//\n// This module is phylo-local: dendrogram mode is flagged via\n// `ast.metadata.dendrogram === \"true\"` rather than the shared PhyloMode union.\n\nconst TIP_SPACING = 24;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 24;\nconst PADDING_BOTTOM = 52;\n\n/** Is this AST a dendrogram (phylo-local mode carried in metadata)? */\nexport function isDendrogram(ast: PhyloTreeAST): boolean {\n return ast.metadata?.dendrogram === \"true\";\n}\n\n/** Parsed cut threshold, or undefined when no `cut` directive was given. */\nexport function getCut(ast: PhyloTreeAST): number | undefined {\n const raw = ast.metadata?.cut;\n if (raw === undefined) return undefined;\n const val = Number(raw);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n/**\n * Merge height of a node = the cophenetic height at which its sub-clusters\n * join, computed as the maximum branch-length distance from this node down to\n * any descendant tip. Leaves have height 0. This is the standard\n * hierarchical-clustering interpretation and is stable for arbitrary\n * branch-length inputs.\n */\nfunction computeHeights(node: PhyloNode, out: Map<string, number>): number {\n if (node.isLeaf) {\n out.set(node.id, 0);\n return 0;\n }\n let max = 0;\n for (const child of node.children) {\n const childHeight = computeHeights(child, out);\n const branch = child.branchLength ?? 0;\n const reach = childHeight + branch;\n if (reach > max) max = reach;\n }\n out.set(node.id, max);\n return max;\n}\n\n/**\n * Compute flat clusters produced by a horizontal/vertical cut at `cutValue`.\n * A cluster is the maximal subtree rooted at a node whose merge height is\n * <= cutValue but whose parent's merge height is > cutValue (i.e. the cut line\n * severs the edge above it). Returns one entry per cluster: the cluster's root\n * node and the set of leaf ids it contains.\n */\nexport interface DendrogramCluster {\n rootId: string;\n leafIds: string[];\n}\n\nexport function computeClusters(\n ast: PhyloTreeAST,\n heights: Map<string, number>,\n cutValue: number\n): DendrogramCluster[] {\n const clusters: DendrogramCluster[] = [];\n\n function visit(node: PhyloNode, parentHeight: number): void {\n const h = heights.get(node.id) ?? 0;\n // The edge entering `node` crosses the cut line when the parent merges\n // above the cut but this node merges at/below it. The root is treated as\n // having an infinite parent height.\n if (h <= cutValue && parentHeight > cutValue) {\n clusters.push({ rootId: node.id, leafIds: collectLeaves(node).map((l) => l.id) });\n return;\n }\n // Node merges above the cut — descend; its children may form clusters.\n if (h > cutValue) {\n for (const child of node.children) visit(child, h);\n } else {\n // h <= cut and parent <= cut: already inside a containing cluster — this\n // branch is unreachable for the root call but kept for completeness.\n clusters.push({ rootId: node.id, leafIds: collectLeaves(node).map((l) => l.id) });\n }\n }\n\n visit(ast.root, Number.POSITIVE_INFINITY);\n return clusters;\n}\n\nexport function layoutDendrogram(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n\n const heights = new Map<string, number>();\n const maxHeight = computeHeights(ast.root, heights);\n\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const availableWidth = Math.max(320, numLeaves * 36 + maxLabelWidth + 120);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n // Pixels per unit of merge height.\n const scale = maxHeight > 0 ? plotWidth / maxHeight : plotWidth;\n\n // Baseline (height 0) sits at the right edge of the plot; root at the left.\n const baselineX = PADDING_LEFT + plotWidth;\n const heightToX = (h: number): number => baselineX - h * scale;\n\n const nodeMap = new Map<string, PhyloLayoutNode>();\n\n // Step 1: leaf Y in-order, leaf X pinned to baseline.\n let leafIdx = 0;\n function assignLeaf(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * TIP_SPACING;\n nodeMap.set(node.id, { node, x: baselineX, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) assignLeaf(child);\n }\n assignLeaf(ast.root);\n\n // Step 2: internal Y = midpoint of children; X from merge height.\n function assignInternal(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternal);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n const x = heightToX(heights.get(node.id) ?? 0);\n if (existing) {\n existing.y = y;\n existing.x = x;\n } else {\n nodeMap.set(node.id, { node, x, y });\n }\n return y;\n }\n assignInternal(ast.root);\n\n // Optional cut → assign each leaf a cluster index for colouring.\n const cut = getCut(ast);\n const leafCluster = new Map<string, number>();\n let clusterCount = 0;\n if (cut !== undefined) {\n const clusters = computeClusters(ast, heights, cut);\n clusterCount = clusters.length;\n clusters.forEach((cluster, idx) => {\n for (const leafId of cluster.leafIds) leafCluster.set(leafId, idx);\n });\n }\n\n /** Cluster index for an internal node's outgoing edge, when its whole\n * subtree lies in a single cut cluster; otherwise undefined (above the cut). */\n function subtreeCluster(node: PhyloNode): number | undefined {\n const ids = collectLeaves(node).map((l) => l.id);\n const first = leafCluster.get(ids[0]);\n if (first === undefined) return undefined;\n for (const id of ids) {\n if (leafCluster.get(id) !== first) return undefined;\n }\n return first;\n }\n\n // Step 3: rectangular elbow connectors.\n const branches: PhyloBranch[] = [];\n\n function generate(node: PhyloNode): void {\n if (node.children.length === 0) return;\n const parent = nodeMap.get(node.id);\n if (!parent) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n if (childLayouts.length === 0) return;\n\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n // Vertical bar of the U at the node's merge-height X, spanning children.\n branches.push({\n path: `M ${parent.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n // Horizontal arm of the U out to each child's X.\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const cluster = subtreeCluster(child);\n branches.push({\n path: `M ${parent.x},${childLayout.y} H ${childLayout.x}`,\n fromId: node.id,\n toId: child.id,\n cladeId: cluster !== undefined ? `cut${cluster}` : undefined,\n isConnector: false,\n });\n }\n\n for (const child of node.children) generate(child);\n }\n generate(ast.root);\n\n const allNodes = Array.from(nodeMap.values());\n const maxX = Math.max(\n ...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0))\n );\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n // Dendrogram-specific extras stashed for the renderer (see types below).\n dendrogram: {\n maxHeight,\n baselineX,\n plotLeftX: PADDING_LEFT,\n scale,\n cut,\n clusterCount,\n leafCluster,\n heights,\n },\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\nimport { isDendrogram, layoutDendrogram } from \"./dendrogram\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n /** Present only for dendrogram mode — drives the height axis + cut line. */\n dendrogram?: DendrogramExtras;\n}\n\n/** Dendrogram-only layout metadata (phylo-local; see ./dendrogram.ts). */\nexport interface DendrogramExtras {\n /** Largest merge height in the tree (root's height). */\n maxHeight: number;\n /** X pixel of the height-0 baseline (where leaves align). */\n baselineX: number;\n /** X pixel of the plot's left edge (root / max height). */\n plotLeftX: number;\n /** Pixels per unit of merge height. */\n scale: number;\n /** Cut threshold value, when a `cut` directive was given. */\n cut?: number;\n /** Number of flat clusters produced by the cut (0 when no cut). */\n clusterCount: number;\n /** Leaf id → cluster index (empty when no cut). */\n leafCluster: Map<string, number>;\n /** Node id → merge height. */\n heights: Map<string, number>;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n if (isDendrogram(ast)) {\n return layoutDendrogram(ast);\n }\n\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n // Dendrogram cut-cluster colours. The cluster count is layout-dependent, so\n // emit one class per palette entry keyed off the biology clade palette; the\n // layout assigns each cluster an index `cut{i}` that maps to these.\n const cutColors: string[] = [];\n if (ast.metadata?.dendrogram === \"true\" && ast.metadata?.cut !== undefined) {\n for (let i = 0; i < t.cladeColors.length; i++) {\n cutColors.push(\n `.schematex-phylo-clade-cut${i} { stroke: ${t.cladeColors[i % t.cladeColors.length]}; }`\n );\n }\n }\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-dendro-axis line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-dendro-axis text { font-size: 10px; fill: ${t.textMuted}; text-anchor: middle; }\n.schematex-phylo-dendro-cut { stroke: ${t.supportBad}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 5 4; fill: none; }\n.schematex-phylo-dendro-cut-label { font-size: 10px; fill: ${t.supportBad}; text-anchor: start; }\n${cutColors.join(\"\\n\")}\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Dendrogram Height Axis + Cut Line ──────────────────────\n\n/** \"Nice\" step for the height axis so ticks land on round numbers. */\nfunction niceStep(maxHeight: number, targetTicks: number): number {\n if (maxHeight <= 0) return 1;\n const rough = maxHeight / targetTicks;\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const norm = rough / mag;\n let step: number;\n if (norm < 1.5) step = 1;\n else if (norm < 3) step = 2;\n else if (norm < 7) step = 5;\n else step = 10;\n return step * mag;\n}\n\nfunction formatTick(value: number): string {\n if (value === 0) return \"0\";\n if (Math.abs(value) < 0.01) return value.toExponential(0);\n return String(Math.round(value * 1000) / 1000);\n}\n\nfunction renderDendrogramAxis(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>\n): string {\n const d = layout.dendrogram;\n if (!d) return \"\";\n\n const axisY = layout.height - 28;\n const elements: string[] = [];\n\n // Axis baseline from root (left, max height) to tips (right, height 0).\n elements.push(\n line({ x1: d.plotLeftX, y1: axisY, x2: d.baselineX, y2: axisY })\n );\n\n const step = niceStep(d.maxHeight, 5);\n for (let h = 0; h <= d.maxHeight + step * 0.001; h += step) {\n const x = d.baselineX - h * d.scale;\n elements.push(line({ x1: x, y1: axisY, x2: x, y2: axisY + 4 }));\n elements.push(\n text({ x, y: axisY + 16, \"text-anchor\": \"middle\" }, formatTick(h))\n );\n }\n\n if (layout.ast.scaleLabel) {\n elements.push(\n text(\n {\n x: (d.plotLeftX + d.baselineX) / 2,\n y: axisY + 28,\n \"text-anchor\": \"middle\",\n \"font-size\": \"9\",\n fill: t.textMuted,\n },\n layout.ast.scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-dendro-axis\" }, elements);\n}\n\nfunction renderCutLine(layout: PhyloLayoutResult): string {\n const d = layout.dendrogram;\n if (!d || d.cut === undefined) return \"\";\n\n const x = d.baselineX - d.cut * d.scale;\n const topY = 8;\n const bottomY = layout.height - 32;\n\n return group({}, [\n line({\n x1: x,\n y1: topY,\n x2: x,\n y2: bottomY,\n class: \"schematex-phylo-dendro-cut\",\n }),\n text(\n { x: x + 4, y: topY + 4, class: \"schematex-phylo-dendro-cut-label\" },\n `cut = ${formatTick(d.cut)}`\n ),\n ]);\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar (phylogram/chronogram) OR dendrogram height axis + cut line.\n const isDendro = layout.dendrogram !== undefined;\n const scaleBarEl = isDendro ? \"\" : renderScaleBar(layout, t, ast.scaleLabel);\n const dendroAxisEl = isDendro ? renderDendrogramAxis(layout, t) : \"\";\n const cutLineEl = isDendro ? renderCutLine(layout) : \"\";\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const isDendrogramMode = layout.dendrogram !== undefined;\n const descMode = isDendrogramMode ? \"dendrogram\" : ast.mode;\n const descTitle = isDendrogramMode ? \"Dendrogram\" : \"Phylogenetic Tree\";\n const cutSuffix =\n isDendrogramMode && layout.dendrogram?.cut !== undefined\n ? `, cut at ${layout.dendrogram.cut} into ${layout.dendrogram.clusterCount} clusters`\n : \"\";\n const svgContent = [\n title(`${descTitle}${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(\n `${isDendrogramMode ? \"Dendrogram\" : \"Phylogenetic tree\"} with ${leafCount} taxa, ${descMode} mode, ${ast.layout} layout${cutSuffix}`\n ),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n if (dendroAxisEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [dendroAxisEl]\n )\n );\n }\n\n if (cutLineEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [cutLineEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkBL57NQKN_cjs = require('../../chunk-BL57NQKN.cjs');
3
+ var chunkJAYJ2G4R_cjs = require('../../chunk-JAYJ2G4R.cjs');
4
4
  require('../../chunk-NZT5P2XZ.cjs');
5
5
  require('../../chunk-NAGUZFXX.cjs');
6
6
  require('../../chunk-3WNW5Y7P.cjs');
@@ -9,23 +9,23 @@ require('../../chunk-3WNW5Y7P.cjs');
9
9
 
10
10
  Object.defineProperty(exports, "PhyloParseError", {
11
11
  enumerable: true,
12
- get: function () { return chunkBL57NQKN_cjs.PhyloParseError; }
12
+ get: function () { return chunkJAYJ2G4R_cjs.PhyloParseError; }
13
13
  });
14
14
  Object.defineProperty(exports, "layoutPhylo", {
15
15
  enumerable: true,
16
- get: function () { return chunkBL57NQKN_cjs.layoutPhylo; }
16
+ get: function () { return chunkJAYJ2G4R_cjs.layoutPhylo; }
17
17
  });
18
18
  Object.defineProperty(exports, "parsePhylo", {
19
19
  enumerable: true,
20
- get: function () { return chunkBL57NQKN_cjs.parsePhylo; }
20
+ get: function () { return chunkJAYJ2G4R_cjs.parsePhylo; }
21
21
  });
22
22
  Object.defineProperty(exports, "phylo", {
23
23
  enumerable: true,
24
- get: function () { return chunkBL57NQKN_cjs.phylo; }
24
+ get: function () { return chunkJAYJ2G4R_cjs.phylo; }
25
25
  });
26
26
  Object.defineProperty(exports, "renderPhylo", {
27
27
  enumerable: true,
28
- get: function () { return chunkBL57NQKN_cjs.renderPhylo; }
28
+ get: function () { return chunkJAYJ2G4R_cjs.renderPhylo; }
29
29
  });
30
30
  //# sourceMappingURL=index.cjs.map
31
31
  //# sourceMappingURL=index.cjs.map
@@ -13,6 +13,27 @@ interface PhyloLayoutResult {
13
13
  branches: PhyloBranch[];
14
14
  ast: PhyloTreeAST;
15
15
  scale: number;
16
+ /** Present only for dendrogram mode — drives the height axis + cut line. */
17
+ dendrogram?: DendrogramExtras;
18
+ }
19
+ /** Dendrogram-only layout metadata (phylo-local; see ./dendrogram.ts). */
20
+ interface DendrogramExtras {
21
+ /** Largest merge height in the tree (root's height). */
22
+ maxHeight: number;
23
+ /** X pixel of the height-0 baseline (where leaves align). */
24
+ baselineX: number;
25
+ /** X pixel of the plot's left edge (root / max height). */
26
+ plotLeftX: number;
27
+ /** Pixels per unit of merge height. */
28
+ scale: number;
29
+ /** Cut threshold value, when a `cut` directive was given. */
30
+ cut?: number;
31
+ /** Number of flat clusters produced by the cut (0 when no cut). */
32
+ clusterCount: number;
33
+ /** Leaf id → cluster index (empty when no cut). */
34
+ leafCluster: Map<string, number>;
35
+ /** Node id → merge height. */
36
+ heights: Map<string, number>;
16
37
  }
17
38
  interface PhyloBranch {
18
39
  path: string;
@@ -13,6 +13,27 @@ interface PhyloLayoutResult {
13
13
  branches: PhyloBranch[];
14
14
  ast: PhyloTreeAST;
15
15
  scale: number;
16
+ /** Present only for dendrogram mode — drives the height axis + cut line. */
17
+ dendrogram?: DendrogramExtras;
18
+ }
19
+ /** Dendrogram-only layout metadata (phylo-local; see ./dendrogram.ts). */
20
+ interface DendrogramExtras {
21
+ /** Largest merge height in the tree (root's height). */
22
+ maxHeight: number;
23
+ /** X pixel of the height-0 baseline (where leaves align). */
24
+ baselineX: number;
25
+ /** X pixel of the plot's left edge (root / max height). */
26
+ plotLeftX: number;
27
+ /** Pixels per unit of merge height. */
28
+ scale: number;
29
+ /** Cut threshold value, when a `cut` directive was given. */
30
+ cut?: number;
31
+ /** Number of flat clusters produced by the cut (0 when no cut). */
32
+ clusterCount: number;
33
+ /** Leaf id → cluster index (empty when no cut). */
34
+ leafCluster: Map<string, number>;
35
+ /** Node id → merge height. */
36
+ heights: Map<string, number>;
16
37
  }
17
38
  interface PhyloBranch {
18
39
  path: string;
@@ -1,4 +1,4 @@
1
- export { PhyloParseError, layoutPhylo, parsePhylo, phylo, renderPhylo } from '../../chunk-HL5PS6MG.js';
1
+ export { PhyloParseError, layoutPhylo, parsePhylo, phylo, renderPhylo } from '../../chunk-EENA7KNU.js';
2
2
  import '../../chunk-UK6HF6PE.js';
3
3
  import '../../chunk-5IKOLUWK.js';
4
4
  import '../../chunk-SYYBKDL7.js';
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5IZL57YJ_cjs = require('./chunk-5IZL57YJ.cjs');
3
+ var chunkHFATQXFN_cjs = require('./chunk-HFATQXFN.cjs');
4
4
  var chunkUHPGWO77_cjs = require('./chunk-UHPGWO77.cjs');
5
5
  var chunkJ3EPFZPX_cjs = require('./chunk-J3EPFZPX.cjs');
6
6
  var chunkSHMG7BVF_cjs = require('./chunk-SHMG7BVF.cjs');
@@ -14,7 +14,7 @@ var chunkNFZMNKOR_cjs = require('./chunk-NFZMNKOR.cjs');
14
14
  var chunk2SZJQVPN_cjs = require('./chunk-2SZJQVPN.cjs');
15
15
  var chunkKGOZBABH_cjs = require('./chunk-KGOZBABH.cjs');
16
16
  require('./chunk-3KRL2EGN.cjs');
17
- var chunkBL57NQKN_cjs = require('./chunk-BL57NQKN.cjs');
17
+ var chunkJAYJ2G4R_cjs = require('./chunk-JAYJ2G4R.cjs');
18
18
  var chunk5FYPSIGD_cjs = require('./chunk-5FYPSIGD.cjs');
19
19
  require('./chunk-5UCXMYE7.cjs');
20
20
  var chunk2F45Y2ON_cjs = require('./chunk-2F45Y2ON.cjs');
@@ -111,10 +111,10 @@ var PID_CSS = ".lt-pid-equip{fill:#ffffff;stroke:#1d1d1d;stroke-width:1.6}.lt-pi
111
111
  function pidCatalog() {
112
112
  const out = [];
113
113
  const pad = 12;
114
- for (const [id, g] of Object.entries(chunk5IZL57YJ_cjs.GEOMETRY)) {
114
+ for (const [id, g] of Object.entries(chunkHFATQXFN_cjs.GEOMETRY)) {
115
115
  let inner;
116
116
  try {
117
- inner = chunk5IZL57YJ_cjs.renderEquip(id, "");
117
+ inner = chunkHFATQXFN_cjs.renderEquip(id, "");
118
118
  } catch {
119
119
  continue;
120
120
  }
@@ -224,11 +224,11 @@ var NETWORK_KINDS = [
224
224
  function networkCatalog() {
225
225
  const out = [];
226
226
  for (const kind of NETWORK_KINDS) {
227
- const { w, h } = chunk5IZL57YJ_cjs.iconSize(kind);
227
+ const { w, h } = chunkHFATQXFN_cjs.iconSize(kind);
228
228
  const device = { id: kind, kind, label: humanize(kind), groups: [] };
229
229
  let inner;
230
230
  try {
231
- inner = chunk5IZL57YJ_cjs.drawDeviceIcon(device, { x: 0, y: 0, w, h });
231
+ inner = chunkHFATQXFN_cjs.drawDeviceIcon(device, { x: 0, y: 0, w, h });
232
232
  } catch {
233
233
  continue;
234
234
  }
@@ -286,75 +286,75 @@ function getSymbolCatalog(type) {
286
286
 
287
287
  Object.defineProperty(exports, "bowtie", {
288
288
  enumerable: true,
289
- get: function () { return chunk5IZL57YJ_cjs.bowtie; }
289
+ get: function () { return chunkHFATQXFN_cjs.bowtie; }
290
290
  });
291
291
  Object.defineProperty(exports, "decisiontree", {
292
292
  enumerable: true,
293
- get: function () { return chunk5IZL57YJ_cjs.decisiontree; }
293
+ get: function () { return chunkHFATQXFN_cjs.decisiontree; }
294
294
  });
295
295
  Object.defineProperty(exports, "faulttree", {
296
296
  enumerable: true,
297
- get: function () { return chunk5IZL57YJ_cjs.faulttree; }
297
+ get: function () { return chunkHFATQXFN_cjs.faulttree; }
298
298
  });
299
299
  Object.defineProperty(exports, "network", {
300
300
  enumerable: true,
301
- get: function () { return chunk5IZL57YJ_cjs.network; }
301
+ get: function () { return chunkHFATQXFN_cjs.network; }
302
302
  });
303
303
  Object.defineProperty(exports, "parse", {
304
304
  enumerable: true,
305
- get: function () { return chunk5IZL57YJ_cjs.parse; }
305
+ get: function () { return chunkHFATQXFN_cjs.parse; }
306
306
  });
307
307
  Object.defineProperty(exports, "parseResult", {
308
308
  enumerable: true,
309
- get: function () { return chunk5IZL57YJ_cjs.parseResult; }
309
+ get: function () { return chunkHFATQXFN_cjs.parseResult; }
310
310
  });
311
311
  Object.defineProperty(exports, "pert", {
312
312
  enumerable: true,
313
- get: function () { return chunk5IZL57YJ_cjs.pert; }
313
+ get: function () { return chunkHFATQXFN_cjs.pert; }
314
314
  });
315
315
  Object.defineProperty(exports, "petri", {
316
316
  enumerable: true,
317
- get: function () { return chunk5IZL57YJ_cjs.petri; }
317
+ get: function () { return chunkHFATQXFN_cjs.petri; }
318
318
  });
319
319
  Object.defineProperty(exports, "pid", {
320
320
  enumerable: true,
321
- get: function () { return chunk5IZL57YJ_cjs.pid; }
321
+ get: function () { return chunkHFATQXFN_cjs.pid; }
322
322
  });
323
323
  Object.defineProperty(exports, "prisma", {
324
324
  enumerable: true,
325
- get: function () { return chunk5IZL57YJ_cjs.prisma; }
325
+ get: function () { return chunkHFATQXFN_cjs.prisma; }
326
326
  });
327
327
  Object.defineProperty(exports, "render", {
328
328
  enumerable: true,
329
- get: function () { return chunk5IZL57YJ_cjs.render; }
329
+ get: function () { return chunkHFATQXFN_cjs.render; }
330
330
  });
331
331
  Object.defineProperty(exports, "renderPreview", {
332
332
  enumerable: true,
333
- get: function () { return chunk5IZL57YJ_cjs.renderPreview; }
333
+ get: function () { return chunkHFATQXFN_cjs.renderPreview; }
334
334
  });
335
335
  Object.defineProperty(exports, "renderResult", {
336
336
  enumerable: true,
337
- get: function () { return chunk5IZL57YJ_cjs.renderResult; }
337
+ get: function () { return chunkHFATQXFN_cjs.renderResult; }
338
338
  });
339
339
  Object.defineProperty(exports, "sequence", {
340
340
  enumerable: true,
341
- get: function () { return chunk5IZL57YJ_cjs.sequence; }
341
+ get: function () { return chunkHFATQXFN_cjs.sequence; }
342
342
  });
343
343
  Object.defineProperty(exports, "state", {
344
344
  enumerable: true,
345
- get: function () { return chunk5IZL57YJ_cjs.state; }
345
+ get: function () { return chunkHFATQXFN_cjs.state; }
346
346
  });
347
347
  Object.defineProperty(exports, "timeline", {
348
348
  enumerable: true,
349
- get: function () { return chunk5IZL57YJ_cjs.timeline; }
349
+ get: function () { return chunkHFATQXFN_cjs.timeline; }
350
350
  });
351
351
  Object.defineProperty(exports, "umlclass", {
352
352
  enumerable: true,
353
- get: function () { return chunk5IZL57YJ_cjs.umlclass; }
353
+ get: function () { return chunkHFATQXFN_cjs.umlclass; }
354
354
  });
355
355
  Object.defineProperty(exports, "usecase", {
356
356
  enumerable: true,
357
- get: function () { return chunk5IZL57YJ_cjs.usecase; }
357
+ get: function () { return chunkHFATQXFN_cjs.usecase; }
358
358
  });
359
359
  Object.defineProperty(exports, "orgchart", {
360
360
  enumerable: true,
@@ -406,7 +406,7 @@ Object.defineProperty(exports, "pedigree", {
406
406
  });
407
407
  Object.defineProperty(exports, "phylo", {
408
408
  enumerable: true,
409
- get: function () { return chunkBL57NQKN_cjs.phylo; }
409
+ get: function () { return chunkJAYJ2G4R_cjs.phylo; }
410
410
  });
411
411
  Object.defineProperty(exports, "sociogram", {
412
412
  enumerable: true,
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { iconSize, drawDeviceIcon, GEOMETRY, renderEquip } from './chunk-3DPWFWQU.js';
2
- export { bowtie, decisiontree, faulttree, network, parse, parseResult, pert, petri, pid, prisma, render, renderPreview, renderResult, sequence, state, timeline, umlclass, usecase } from './chunk-3DPWFWQU.js';
1
+ import { iconSize, drawDeviceIcon, GEOMETRY, renderEquip } from './chunk-IFNNV54X.js';
2
+ export { bowtie, decisiontree, faulttree, network, parse, parseResult, pert, petri, pid, prisma, render, renderPreview, renderResult, sequence, state, timeline, umlclass, usecase } from './chunk-IFNNV54X.js';
3
3
  export { orgchart } from './chunk-MPCSWRZC.js';
4
4
  import { EXTRA_SYMBOLS, SYMBOLS } from './chunk-2TUZ3QJA.js';
5
5
  export { circuit } from './chunk-2TUZ3QJA.js';
@@ -16,7 +16,7 @@ export { genogram } from './chunk-6NUAGU6O.js';
16
16
  export { ecomap } from './chunk-K2D6VFLP.js';
17
17
  export { pedigree } from './chunk-JN6FHUC6.js';
18
18
  import './chunk-2KTQ75LN.js';
19
- export { phylo } from './chunk-HL5PS6MG.js';
19
+ export { phylo } from './chunk-EENA7KNU.js';
20
20
  export { sociogram } from './chunk-OFKRELZK.js';
21
21
  import './chunk-FO7BLCEW.js';
22
22
  export { timing } from './chunk-P26FCZP3.js';
package/dist/react.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5IZL57YJ_cjs = require('./chunk-5IZL57YJ.cjs');
3
+ var chunkHFATQXFN_cjs = require('./chunk-HFATQXFN.cjs');
4
4
  require('./chunk-UHPGWO77.cjs');
5
5
  require('./chunk-J3EPFZPX.cjs');
6
6
  require('./chunk-SHMG7BVF.cjs');
@@ -14,7 +14,7 @@ require('./chunk-NFZMNKOR.cjs');
14
14
  require('./chunk-2SZJQVPN.cjs');
15
15
  require('./chunk-KGOZBABH.cjs');
16
16
  require('./chunk-3KRL2EGN.cjs');
17
- require('./chunk-BL57NQKN.cjs');
17
+ require('./chunk-JAYJ2G4R.cjs');
18
18
  require('./chunk-5FYPSIGD.cjs');
19
19
  require('./chunk-5UCXMYE7.cjs');
20
20
  require('./chunk-2F45Y2ON.cjs');
@@ -37,7 +37,7 @@ function SchematexDiagram({
37
37
  onError
38
38
  }) {
39
39
  const svg = react.useMemo(() => {
40
- const result = chunk5IZL57YJ_cjs.renderResult(dsl, { type, theme, fontFamily, padding });
40
+ const result = chunkHFATQXFN_cjs.renderResult(dsl, { type, theme, fontFamily, padding });
41
41
  if (!result.ok) {
42
42
  onError?.(new Error(result.diagnostics[0]?.message ?? "Schematex render failed"));
43
43
  }
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { renderResult } from './chunk-3DPWFWQU.js';
1
+ import { renderResult } from './chunk-IFNNV54X.js';
2
2
  import './chunk-MPCSWRZC.js';
3
3
  import './chunk-2TUZ3QJA.js';
4
4
  import './chunk-C7V57V6O.js';
@@ -12,7 +12,7 @@ import './chunk-6NUAGU6O.js';
12
12
  import './chunk-K2D6VFLP.js';
13
13
  import './chunk-JN6FHUC6.js';
14
14
  import './chunk-2KTQ75LN.js';
15
- import './chunk-HL5PS6MG.js';
15
+ import './chunk-EENA7KNU.js';
16
16
  import './chunk-OFKRELZK.js';
17
17
  import './chunk-FO7BLCEW.js';
18
18
  import './chunk-P26FCZP3.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schematex",
3
- "version": "0.6.9",
3
+ "version": "0.7.0",
4
4
  "description": "Every diagram a doctor, engineer, or lawyer would actually use. 36 industry-standard diagrams (genogram, pedigree, ladder logic, SLD, FBD, SFC, P&ID, UML class, UML use case, UML sequence, fault tree, bowtie, PRISMA, phylo, fishbone, entity structure, ...) from a text DSL. Free, fully open source, made for AI. Pure SVG, zero dependencies.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",