schematex 0.1.0 → 0.2.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.
- package/README.md +229 -40
- package/dist/api-bQZ98gkJ.d.cts +22 -0
- package/dist/api-bQZ98gkJ.d.ts +22 -0
- package/dist/browser.cjs +46 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +27 -0
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +40 -0
- package/dist/browser.js.map +1 -0
- package/dist/{chunk-XXU36667.js → chunk-2OIW3MAE.js} +4 -3
- package/dist/chunk-2OIW3MAE.js.map +1 -0
- package/dist/{chunk-3FTUWAXK.cjs → chunk-3M7QWADF.cjs} +5 -4
- package/dist/chunk-3M7QWADF.cjs.map +1 -0
- package/dist/{chunk-BE5HNDA5.cjs → chunk-4HPT4BOI.cjs} +5 -4
- package/dist/{chunk-BE5HNDA5.cjs.map → chunk-4HPT4BOI.cjs.map} +1 -1
- package/dist/{chunk-CZRM7LT7.js → chunk-4TS5NB7L.js} +4 -3
- package/dist/chunk-4TS5NB7L.js.map +1 -0
- package/dist/{chunk-4G7ZIBHN.js → chunk-5SH5NUDW.js} +3 -2
- package/dist/{chunk-4G7ZIBHN.js.map → chunk-5SH5NUDW.js.map} +1 -1
- package/dist/{chunk-47ZC6EMJ.js → chunk-7WXAAVR3.js} +4 -3
- package/dist/{chunk-47ZC6EMJ.js.map → chunk-7WXAAVR3.js.map} +1 -1
- package/dist/{chunk-5C7DPDHQ.js → chunk-A74ZCP5I.js} +4 -3
- package/dist/{chunk-5C7DPDHQ.js.map → chunk-A74ZCP5I.js.map} +1 -1
- package/dist/{chunk-DS47NTWZ.cjs → chunk-AMP2FFES.cjs} +11 -10
- package/dist/chunk-AMP2FFES.cjs.map +1 -0
- package/dist/{chunk-2UKC6ZCY.cjs → chunk-CEV3GZA3.cjs} +12 -11
- package/dist/chunk-CEV3GZA3.cjs.map +1 -0
- package/dist/{chunk-NYCIK4SU.cjs → chunk-DTMCQXXC.cjs} +13 -12
- package/dist/chunk-DTMCQXXC.cjs.map +1 -0
- package/dist/{chunk-FDLZEKEB.js → chunk-GEPBET4L.js} +3 -2
- package/dist/chunk-GEPBET4L.js.map +1 -0
- package/dist/chunk-HAIBAF6J.cjs +1880 -0
- package/dist/chunk-HAIBAF6J.cjs.map +1 -0
- package/dist/{chunk-FGPTCDUT.cjs → chunk-HKRYKEOV.cjs} +5 -4
- package/dist/chunk-HKRYKEOV.cjs.map +1 -0
- package/dist/{chunk-D4JTSPOL.js → chunk-HLYA4QBB.js} +4 -3
- package/dist/chunk-HLYA4QBB.js.map +1 -0
- package/dist/{chunk-URSKIHSY.cjs → chunk-IMHR3S5H.cjs} +6 -5
- package/dist/chunk-IMHR3S5H.cjs.map +1 -0
- package/dist/{chunk-U4I37IBN.js → chunk-IQIJ6WW6.js} +4 -3
- package/dist/chunk-IQIJ6WW6.js.map +1 -0
- package/dist/{chunk-UHLYS3W5.cjs → chunk-IY52OWPG.cjs} +5 -4
- package/dist/{chunk-UHLYS3W5.cjs.map → chunk-IY52OWPG.cjs.map} +1 -1
- package/dist/chunk-JZGFSRVT.js +1873 -0
- package/dist/chunk-JZGFSRVT.js.map +1 -0
- package/dist/{chunk-3J7TFUOC.js → chunk-L6IHSTPP.js} +4 -3
- package/dist/{chunk-3J7TFUOC.js.map → chunk-L6IHSTPP.js.map} +1 -1
- package/dist/{chunk-4DBRNOPA.cjs → chunk-LKHWBDWZ.cjs} +5 -4
- package/dist/{chunk-4DBRNOPA.cjs.map → chunk-LKHWBDWZ.cjs.map} +1 -1
- package/dist/{chunk-34X3ZJ6E.cjs → chunk-LXNFVHDT.cjs} +3 -2
- package/dist/{chunk-34X3ZJ6E.cjs.map → chunk-LXNFVHDT.cjs.map} +1 -1
- package/dist/chunk-M6AMNXQ7.js +4539 -0
- package/dist/chunk-M6AMNXQ7.js.map +1 -0
- package/dist/{chunk-XX4BKS7Y.js → chunk-MRGS54WN.js} +4 -3
- package/dist/chunk-MRGS54WN.js.map +1 -0
- package/dist/{chunk-ROFLJ74T.js → chunk-MXJ6FHSY.js} +4 -3
- package/dist/chunk-MXJ6FHSY.js.map +1 -0
- package/dist/{chunk-V6WO7RK7.cjs → chunk-PIQG2Z5N.cjs} +5 -4
- package/dist/chunk-PIQG2Z5N.cjs.map +1 -0
- package/dist/{chunk-U5GGE6PJ.js → chunk-RQX53J6M.js} +4 -3
- package/dist/chunk-RQX53J6M.js.map +1 -0
- package/dist/{chunk-N7KOXOMX.cjs → chunk-S6VPECM3.cjs} +72 -2
- package/dist/chunk-S6VPECM3.cjs.map +1 -0
- package/dist/{chunk-VFQCTXOX.js → chunk-SPIW4VWP.js} +4 -3
- package/dist/chunk-SPIW4VWP.js.map +1 -0
- package/dist/{chunk-IX554O5K.js → chunk-TIGP2OEJ.js} +72 -3
- package/dist/chunk-TIGP2OEJ.js.map +1 -0
- package/dist/{chunk-LMFSHK45.js → chunk-TPA36ULU.js} +4 -3
- package/dist/{chunk-LMFSHK45.js.map → chunk-TPA36ULU.js.map} +1 -1
- package/dist/{chunk-ZX7QKZK2.cjs → chunk-ULERCTGS.cjs} +5 -4
- package/dist/{chunk-ZX7QKZK2.cjs.map → chunk-ULERCTGS.cjs.map} +1 -1
- package/dist/chunk-VP54YPOX.cjs +4544 -0
- package/dist/chunk-VP54YPOX.cjs.map +1 -0
- package/dist/{chunk-XQ52ICHU.cjs → chunk-YKO7DY2F.cjs} +14 -13
- package/dist/chunk-YKO7DY2F.cjs.map +1 -0
- package/dist/{chunk-PDPHRZZT.js → chunk-YO4GU6JX.js} +4 -3
- package/dist/chunk-YO4GU6JX.js.map +1 -0
- package/dist/{chunk-S6BK5DB6.cjs → chunk-ZGKEFVJQ.cjs} +13 -12
- package/dist/chunk-ZGKEFVJQ.cjs.map +1 -0
- package/dist/{chunk-2MQWZ2XY.cjs → chunk-ZO77FHBF.cjs} +3 -2
- package/dist/chunk-ZO77FHBF.cjs.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +9 -9
- package/dist/diagrams/fishbone/index.d.ts +9 -9
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/export.cjs +87 -0
- package/dist/export.cjs.map +1 -0
- package/dist/export.d.cts +38 -0
- package/dist/export.d.ts +38 -0
- package/dist/export.js +83 -0
- package/dist/export.js.map +1 -0
- package/dist/{index-BXefHVce.d.cts → index-SSGpCggE.d.cts} +52 -3
- package/dist/{index-BSlza1YY.d.ts → index-ga04CTBI.d.ts} +52 -3
- package/dist/index.cjs +65 -1948
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -12
- package/dist/index.d.ts +7 -12
- package/dist/index.js +19 -1942
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +56 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +24 -0
- package/dist/react.d.ts +24 -0
- package/dist/react.js +54 -0
- package/dist/react.js.map +1 -0
- package/dist/{types-DqfcYkcY.d.ts → types-BcPhMdHd.d.cts} +6 -2
- package/dist/{types-DqfcYkcY.d.cts → types-BcPhMdHd.d.ts} +6 -2
- package/package.json +31 -2
- package/dist/chunk-2MQWZ2XY.cjs.map +0 -1
- package/dist/chunk-2UKC6ZCY.cjs.map +0 -1
- package/dist/chunk-3FTUWAXK.cjs.map +0 -1
- package/dist/chunk-ADOXGKAK.js +0 -1251
- package/dist/chunk-ADOXGKAK.js.map +0 -1
- package/dist/chunk-CZRM7LT7.js.map +0 -1
- package/dist/chunk-D4JTSPOL.js.map +0 -1
- package/dist/chunk-DS47NTWZ.cjs.map +0 -1
- package/dist/chunk-FDLZEKEB.js.map +0 -1
- package/dist/chunk-FGPTCDUT.cjs.map +0 -1
- package/dist/chunk-IX554O5K.js.map +0 -1
- package/dist/chunk-MDICUK6F.cjs +0 -1258
- package/dist/chunk-MDICUK6F.cjs.map +0 -1
- package/dist/chunk-N7KOXOMX.cjs.map +0 -1
- package/dist/chunk-NYCIK4SU.cjs.map +0 -1
- package/dist/chunk-PDPHRZZT.js.map +0 -1
- package/dist/chunk-ROFLJ74T.js.map +0 -1
- package/dist/chunk-S6BK5DB6.cjs.map +0 -1
- package/dist/chunk-U4I37IBN.js.map +0 -1
- package/dist/chunk-U5GGE6PJ.js.map +0 -1
- package/dist/chunk-URSKIHSY.cjs.map +0 -1
- package/dist/chunk-V6WO7RK7.cjs.map +0 -1
- package/dist/chunk-VFQCTXOX.js.map +0 -1
- package/dist/chunk-XQ52ICHU.cjs.map +0 -1
- package/dist/chunk-XX4BKS7Y.js.map +0 -1
- package/dist/chunk-XXU36667.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/fishbone/parser.ts","../src/diagrams/fishbone/layout.ts","../src/diagrams/fishbone/renderer.ts","../src/diagrams/fishbone/index.ts"],"names":["text","title","line"],"mappings":"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","file":"chunk-U4I37IBN.js","sourcesContent":["import type {\n FishboneAST,\n FishboneCauseSide,\n FishboneDensity,\n FishboneNode,\n FishboneOrientation,\n FishboneSides,\n} from \"../../core/types\";\n\nexport class FishboneParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FishboneParseError\";\n }\n}\n\ninterface CategoryDef {\n id: string;\n label: string;\n color?: string;\n side?: \"top\" | \"bottom\";\n order?: number;\n}\n\nconst SLOPE_PRESETS: Record<string, number> = {\n gentle: 0.45,\n normal: 0.6,\n steep: 0.75,\n};\n\n/**\n * Fishbone DSL parser.\n *\n * Supports two syntactic styles, mixable in one document:\n *\n * Style A — structured (per 13-FISHBONE-STANDARD §11)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category content \"内容 Content\"\n * category tech \"技术 Technical\"\n * content : \"更新频率下降\"\n * content : \"关键词未覆盖\"\n * - \"长尾词无内容\"\n * - \"竞品占位 H1\"\n *\n * Style B — compact shorthand (convenient for quick authoring, AI output)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category Content: 更新频率下降; 同质化严重; 关键词未覆盖\n * category Technical: Core Web Vitals 差; 索引覆盖率下降\n *\n * Config directives:\n *\n * config direction = left|right # head orientation (default right)\n * config width = 900\n * config height = 620\n *\n * Lines starting with `#` are comments. Leading whitespace is indentation; a\n * line that begins with `-` (after ≥2 spaces of indent) is a Level-2 sub-cause\n * for the most-recent Level-1 cause.\n */\nexport function parseFishboneDSL(text: string): FishboneAST {\n const rawLines = text.split(/\\r?\\n/);\n\n let title: string | undefined;\n let effect = \"\";\n let orientation: FishboneOrientation = \"ltr\";\n let width: number | undefined;\n let height: number | undefined;\n let sides: FishboneSides | undefined;\n let ribSlope: number | undefined;\n let density: FishboneDensity | undefined;\n let causeSide: FishboneCauseSide | undefined;\n\n const categories: CategoryDef[] = [];\n const causesByCategory = new Map<string, FishboneNode[]>();\n let lastLevel1: FishboneNode | null = null;\n\n let headerSeen = false;\n\n const getCat = (id: string): CategoryDef | undefined =>\n categories.find((c) => c.id === id || c.label === id);\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i] ?? \"\";\n const line = stripComment(raw).trimEnd();\n if (!line.trim()) continue;\n\n const indent = countIndent(raw);\n const trimmed = line.trim();\n\n // Header: fishbone \"Title\" OR fishbone: \"Title\"\n if (!headerSeen && /^fishbone\\b/i.test(trimmed)) {\n const m = trimmed.match(/^fishbone\\s*:?\\s*(.*)$/i);\n if (m && m[1]) title = stripQuotes(m[1]);\n headerSeen = true;\n continue;\n }\n\n // Sub-cause (Level 2+): starts with \"-\" after indent\n if (indent >= 2 && trimmed.startsWith(\"-\")) {\n if (!lastLevel1) {\n throw new FishboneParseError(\n `Sub-cause at line ${i + 1} has no preceding Level-1 cause: \"${trimmed}\"`\n );\n }\n const subText = stripQuotes(trimmed.slice(1).trim());\n if (!subText) continue;\n lastLevel1.children.push({ label: subText, children: [] });\n continue;\n }\n\n // effect \"...\"\n if (/^effect\\b/i.test(trimmed)) {\n const m = trimmed.match(/^effect\\s*:?\\s*(.*)$/i);\n if (m) effect = stripQuotes(m[1] ?? \"\");\n continue;\n }\n\n // config key = value\n if (/^config\\b/i.test(trimmed)) {\n const m = trimmed.match(/^config\\s+([a-zA-Z]+)\\s*=\\s*(.+)$/i);\n if (m) {\n const key = m[1]!.toLowerCase();\n const val = stripQuotes(m[2]!.trim());\n if (key === \"direction\") {\n orientation = val === \"left\" || val === \"rtl\" ? \"rtl\" : \"ltr\";\n } else if (key === \"width\") {\n const n = Number(val);\n if (Number.isFinite(n)) width = n;\n } else if (key === \"height\") {\n const n = Number(val);\n if (Number.isFinite(n)) height = n;\n } else if (key === \"sides\") {\n const v = val.toLowerCase();\n if (v === \"both\" || v === \"top\" || v === \"bottom\") sides = v;\n } else if (key === \"slope\" || key === \"ribslope\") {\n const preset = SLOPE_PRESETS[val.toLowerCase()];\n if (preset !== undefined) ribSlope = preset;\n else {\n const n = Number(val);\n if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;\n }\n } else if (key === \"density\") {\n const v = val.toLowerCase();\n if (v === \"compact\" || v === \"normal\" || v === \"spacious\") density = v;\n } else if (key === \"causeside\" || key === \"cause-side\") {\n const v = val.toLowerCase();\n if (v === \"head\" || v === \"tail\" || v === \"both\") causeSide = v;\n }\n }\n continue;\n }\n\n // category <id> \"<display>\" [color: <hex>]\n if (/^category\\b/i.test(trimmed)) {\n const compact = trimmed.match(/^category\\s+([^:]+?)\\s*:\\s*(.+)$/i);\n const structured = trimmed.match(\n /^category\\s+([a-zA-Z][\\w-]*)\\s+(\"[^\"]*\"|[^\\s[]+)(?:\\s*(\\[.*\\]))?\\s*$/i\n );\n\n if (structured) {\n const id = structured[1]!;\n const label = stripQuotes(structured[2]!);\n const props = parseProps(structured[3] ?? \"\");\n if (!getCat(id)) {\n const sideProp = props[\"side\"]?.toLowerCase();\n const side =\n sideProp === \"top\" || sideProp === \"bottom\" ? sideProp : undefined;\n const orderProp = props[\"order\"];\n const orderNum = orderProp !== undefined ? Number(orderProp) : NaN;\n const order = Number.isFinite(orderNum) ? orderNum : undefined;\n categories.push({ id, label, color: props[\"color\"], side, order });\n causesByCategory.set(id, []);\n }\n lastLevel1 = null;\n continue;\n }\n\n if (compact) {\n const label = stripQuotes(compact[1]!.trim());\n const id = slugify(label);\n const rest = compact[2]!.trim();\n if (!getCat(id)) {\n categories.push({ id, label });\n causesByCategory.set(id, []);\n }\n // split by `;` for compact style causes\n const bucket = causesByCategory.get(id)!;\n for (const part of rest.split(/[;,]/)) {\n const txt = stripQuotes(part.trim());\n if (txt) {\n const node: FishboneNode = { label: txt, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n }\n }\n continue;\n }\n }\n\n // <categoryId> : \"cause\"\n const causeMatch = trimmed.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (causeMatch) {\n const catId = causeMatch[1]!;\n const cat = getCat(catId);\n if (!cat) {\n throw new FishboneParseError(\n `Unknown category \"${catId}\" at line ${i + 1}. Declare with \\`category ${catId} \"...\"\\` first.`\n );\n }\n const bucket = causesByCategory.get(cat.id)!;\n const rest = causeMatch[2]!.trim();\n // `cause_text [prop: value]`\n const { text: causeText } = splitTrailingProps(rest);\n const label = stripQuotes(causeText);\n if (!label) continue;\n const node: FishboneNode = { label, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n continue;\n }\n\n // Unknown line — ignore silently to tolerate alien syntax blends\n }\n\n if (!effect) {\n // Fallback: use title as effect\n effect = title ?? \"\";\n }\n\n if (categories.length === 0) {\n throw new FishboneParseError(\n \"Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md.\"\n );\n }\n\n const majors: FishboneNode[] = categories.map((c) => ({\n label: c.label,\n color: c.color,\n children: causesByCategory.get(c.id) ?? [],\n side: c.side,\n order: c.order,\n }));\n\n return {\n type: \"fishbone\",\n title,\n effect,\n majors,\n orientation,\n width,\n height,\n sides,\n ribSlope,\n density,\n causeSide,\n };\n}\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction countIndent(raw: string): number {\n let n = 0;\n for (const ch of raw) {\n if (ch === \" \") n += 1;\n else if (ch === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^\\w\\u4e00-\\u9fff]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"cat\"\n );\n}\n\nfunction splitTrailingProps(s: string): { text: string; props: Record<string, string> } {\n const idx = s.lastIndexOf(\"[\");\n if (idx < 0 || !s.trimEnd().endsWith(\"]\")) return { text: s, props: {} };\n const text = s.slice(0, idx).trim();\n const props = parseProps(s.slice(idx));\n return { text, props };\n}\n\nfunction parseProps(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n const m = raw.match(/^\\[(.*)\\]$/s);\n if (!m) return out;\n const inside = m[1]!;\n for (const part of splitTopLevelCommas(inside)) {\n const [k, ...rest] = part.split(\":\");\n if (!k || rest.length === 0) continue;\n out[k.trim()] = stripQuotes(rest.join(\":\").trim());\n }\n return out;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth += 1;\n else if (ch === \"]\") depth -= 1;\n else if (ch === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n","import type { FishboneAST, FishboneCauseSide, FishboneNode } from \"../../core/types\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\n/**\n * Fishbone layout engine.\n *\n * Geometric contract (see 13-FISHBONE-STANDARD §5, §9):\n * - Horizontal spine at `spineY`\n * - Effect polygon at right (ltr) or left (rtl) end\n * - Category ribs slant AWAY from the fish head (signature of Ishikawa form)\n * - Ribs are paired top/bottom on the same X column for visual rhythm\n * - Each rib hosts Level-1 causes as short horizontal branches toward the head\n * - Rib length adapts to (max) cause count in its half so headers align\n *\n * This is an optimized v2 layout that improves on the naive fixed-slope design:\n * 1. Dynamic row heights — a Level-1 cause with N sub-causes reserves\n * (baseRow + N·subRow) of vertical space so nothing overlaps.\n * 2. Per-half aligned headers — ribs in the same half share the same outer Y\n * so category pills form a clean visual row.\n * 3. Column-pairing — top and bottom ribs share the same spine X.\n * 4. Smart canvas sizing — derives width/height from content, respecting\n * optional user overrides from `config width = …` / `config height = …`.\n * 5. Label-aware extents — long cause labels extend the canvas rather than\n * clipping, so multi-lingual / verbose content is first-class.\n * 6. Label bboxes exposed for the renderer to build a text-gap mask.\n */\n\n// ─── Public Types ─────────────────────────────────────────────\n\nexport interface FishboneLayoutCause {\n label: string;\n /** Rib index (0 = first category) */\n ribIndex: number;\n /** Slot index on the rib (0 = closest to spine) */\n slotIndex: number;\n /** Cause start point on the rib */\n ribX: number;\n ribY: number;\n /** Horizontal branch end point (label starts just beyond) */\n branchX: number;\n branchY: number;\n /** Label anchor (x where text starts, y baseline) */\n labelX: number;\n labelY: number;\n labelAnchor: \"start\" | \"end\";\n /** Direction this cause branch sticks out: \"head\" = toward head, \"tail\" = toward tail. */\n causeSide: \"head\" | \"tail\";\n /** Sub-causes (Level 2) stacked below the main label */\n subCauses: FishboneLayoutSubCause[];\n}\n\nexport interface FishboneLayoutSubCause {\n label: string;\n x: number;\n y: number;\n tickX1: number;\n tickX2: number;\n tickY: number;\n anchor: \"start\" | \"end\";\n}\n\nexport interface FishboneLayoutRib {\n index: number;\n half: \"top\" | \"bottom\";\n label: string;\n color: string;\n /** Where rib meets spine */\n spineX: number;\n spineY: number;\n /** Far end of rib (where header pill sits) */\n endX: number;\n endY: number;\n /** Header pill geometry */\n headerX: number;\n headerY: number;\n headerW: number;\n headerH: number;\n causes: FishboneLayoutCause[];\n}\n\nexport interface FishboneBBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FishboneLayoutResult {\n width: number;\n height: number;\n orientation: \"ltr\" | \"rtl\";\n spineY: number;\n spineStartX: number;\n spineEndX: number;\n tailForkTipTop: { x: number; y: number };\n tailForkTipBot: { x: number; y: number };\n head: {\n x: number; // spine-attached x\n y: number; // spine-attached y (= spineY)\n tipX: number; // pointy tip\n tipY: number;\n w: number;\n h: number;\n label: string;\n };\n ribs: FishboneLayoutRib[];\n /** Label bounding boxes (for text-gap mask) */\n textBBoxes: FishboneBBox[];\n title?: string;\n}\n\n// ─── Geometry constants (tunable, exported for renderer parity) ──\n\nexport const FB_CONST = {\n PADDING: 40,\n HEAD_W: 90,\n HEAD_H: 80,\n TAIL_LEN: 40,\n SPINE_OFFSET_FROM_TAIL: 40, // distance from canvas left to spine start\n RIB_SLOPE: 0.6, // dx/dy — consistent across all ribs\n RIB_BASE_EXTENT_Y: 30, // vertical distance of first slot from spine\n ROW_HEIGHT: 30, // vertical gap between Level-1 slots\n SUB_ROW_HEIGHT: 17,\n BRANCH_LEN: 30, // horizontal Level-1 branch length\n SUB_TICK_LEN: 10,\n HEADER_W: 132,\n HEADER_H: 34,\n HEADER_GAP: 12, // gap between rib endpoint and header pill\n COL_STEP: 130, // spine x gap between adjacent ribs\n COL_FIRST_OFFSET: 170, // first rib's distance from spine start\n LABEL_FONT: 12,\n HEADER_FONT: 14,\n SUB_FONT: 11,\n EFFECT_FONT: 14,\n LABEL_GAP: 6, // gap from branch end to label\n MIN_ROWS_PER_HALF: 4, // aesthetic minimum rib length\n COL_GAP_BETWEEN_LABELS: 18, // min horizontal breathing between adjacent ribs' label columns\n HEAD_PAD_X: 44, // total horizontal padding around effect text inside head\n HEAD_PAD_Y: 20, // min vertical padding around effect text inside head\n TITLE_CLEARANCE: 24, // extra gap between title baseline and top header pill\n} as const;\n\n// ─── Default palette (13-FISHBONE-STANDARD §5.4) ─────────────\n\n\n// ─── Text measurement (CJK-aware approximation) ───────────────\n\nexport function estimateTextWidth(s: string, fontSize: number): number {\n let w = 0;\n for (const ch of s) {\n const cp = ch.codePointAt(0) ?? 0;\n // CJK unified ideographs + kana + Hangul + fullwidth\n const isWide =\n (cp >= 0x3000 && cp <= 0x30ff) ||\n (cp >= 0x3400 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7af) ||\n (cp >= 0xff00 && cp <= 0xffef);\n w += fontSize * (isWide ? 1.0 : 0.56);\n }\n return w;\n}\n\n// ─── Density presets ──────────────────────────────────────────\n\ninterface DensityTunables {\n rowHeight: number;\n subRowHeight: number;\n colStep: number;\n headerW: number;\n headerH: number;\n headerGap: number;\n minRowsPerHalf: number;\n colFirstOffset: number;\n}\n\nconst DENSITY: Record<\"compact\" | \"normal\" | \"spacious\", DensityTunables> = {\n compact: {\n rowHeight: 24,\n subRowHeight: 15,\n colStep: 110,\n headerW: 118,\n headerH: 30,\n headerGap: 8,\n minRowsPerHalf: 3,\n colFirstOffset: 140,\n },\n normal: {\n rowHeight: 30,\n subRowHeight: 17,\n colStep: 130,\n headerW: 132,\n headerH: 34,\n headerGap: 12,\n minRowsPerHalf: 4,\n colFirstOffset: 170,\n },\n spacious: {\n rowHeight: 36,\n subRowHeight: 19,\n colStep: 150,\n headerW: 148,\n headerH: 38,\n headerGap: 16,\n minRowsPerHalf: 5,\n colFirstOffset: 200,\n },\n};\n\n// ─── Public API ───────────────────────────────────────────────\n\nexport function layoutFishbone(ast: FishboneAST, opts?: { palette?: readonly string[] }): FishboneLayoutResult {\n const majors = ast.majors.length > 0 ? ast.majors : [];\n const nRibs = majors.length;\n\n const density = ast.density ?? \"normal\";\n const D = DENSITY[density];\n const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;\n const causeSideSetting: FishboneCauseSide = ast.causeSide ?? \"head\";\n const sides = ast.sides ?? \"both\";\n\n // Partition ribs into top/bottom halves honoring per-category `side` overrides\n // and the `sides` setting. If a category has an explicit side, use it;\n // otherwise fall back to the global `sides` default (single-sided layouts\n // pin everything to that half; \"both\" alternates declaration order across\n // the two halves as before).\n const topMajors: FishboneNode[] = [];\n const botMajors: FishboneNode[] = [];\n if (sides === \"top\" || sides === \"bottom\") {\n const bucket = sides === \"top\" ? topMajors : botMajors;\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else bucket.push(m);\n }\n } else {\n const autoPool: FishboneNode[] = [];\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else autoPool.push(m);\n }\n // Greedy balance — push into whichever half currently has fewer ribs,\n // ties → top (matches the prior \"top gets the extra\" rule).\n for (const m of autoPool) {\n if (topMajors.length <= botMajors.length) topMajors.push(m);\n else botMajors.push(m);\n }\n }\n\n // Respect per-rib `order` (lower = closer to tail). Stable sort within half.\n const byOrder = (a: FishboneNode, b: FishboneNode): number => {\n const ao = a.order ?? Number.POSITIVE_INFINITY;\n const bo = b.order ?? Number.POSITIVE_INFINITY;\n return ao - bo;\n };\n topMajors.sort(byOrder);\n botMajors.sort(byOrder);\n\n const nTop = topMajors.length;\n const nBot = botMajors.length;\n // Keep legacy var names alive\n void nRibs;\n\n // Row count per rib = max(subCauses) for that rib's Level-1 list.\n // Extent per rib = sum of rowHeights for slots 0..n-1.\n const ribRowHeights = (m: FishboneNode): number[] => {\n if (m.children.length === 0) return [];\n return m.children.map(\n (c) => D.rowHeight + c.children.length * D.subRowHeight\n );\n };\n\n const topExtents = topMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n const botExtents = botMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n\n // ── Head sizing (computed early so it can influence half-extent padding) ──\n const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);\n // Grow H proportionally with W to maintain ≈2:1 W:H ratio (avoids flat sliver).\n const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;\n const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));\n // At y ± font/2, available width = W * (1 − font/H) due to triangle taper.\n const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;\n const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));\n\n // Head extends ±headEffectiveH/2 from spine — guarantee half extents cover it.\n const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;\n\n const topHalfExtent =\n nTop > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(topExtents.length ? topExtents : [0])\n )\n : sides === \"bottom\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n const botHalfExtent =\n nBot > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(botExtents.length ? botExtents : [0])\n )\n : sides === \"top\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n\n const nCols = Math.max(nTop, nBot, 1);\n\n // ── Adaptive column step: widest Level-1 label + branch + gap + breathing ──\n let maxCauseLabelW = 0;\n let maxSubLabelW = 0;\n for (const m of majors) {\n for (const c of m.children) {\n maxCauseLabelW = Math.max(\n maxCauseLabelW,\n estimateTextWidth(c.label, FB_CONST.LABEL_FONT)\n );\n for (const sc of c.children) {\n maxSubLabelW = Math.max(\n maxSubLabelW,\n estimateTextWidth(sc.label, FB_CONST.SUB_FONT)\n );\n }\n }\n }\n // Label column needs to fit the widest Level-1 label AND any Level-2 tick+label\n // that sits under it (sub causes are indented by SUB_TICK_LEN + 4 from labelX).\n const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;\n const labelColW = Math.max(maxCauseLabelW, subExtent);\n // When causes can sit on both sides, each column must reserve label space on both sides.\n const labelExtentsPerCol = causeSideSetting === \"both\" ? 2 : 1;\n const minColStep =\n FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;\n const colStep = Math.max(\n D.colStep,\n Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))\n );\n\n // ── Canvas sizing ───────────────────────────────────────────\n const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;\n const firstRibX = spineStartX + D.colFirstOffset;\n const lastRibX = firstRibX + (nCols - 1) * colStep;\n // Reserve room for the last rib's label column before the head begins.\n const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);\n\n const headX = spineEndX;\n const headTipXAdj = headX + headEffectiveW;\n\n const width =\n ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);\n\n const title = ast.title;\n const titleReserve = title ? FB_CONST.TITLE_CLEARANCE + 20 : 0;\n\n const spineY =\n FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;\n\n const height =\n ast.height ??\n Math.ceil(\n spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING\n );\n\n // ── Ribs ────────────────────────────────────────────────────\n const ribs: FishboneLayoutRib[] = [];\n const palette = opts?.palette ?? resolveFishboneTheme(\"default\").palette;\n const textBBoxes: FishboneBBox[] = [];\n\n const buildHalfRibs = (\n halfMajors: FishboneNode[],\n startIndex: number,\n half: \"top\" | \"bottom\",\n halfExtent: number\n ): void => {\n for (let i = 0; i < halfMajors.length; i++) {\n const major = halfMajors[i]!;\n const globalIdx = startIndex + i;\n const color = major.color ?? palette[globalIdx % palette.length]!;\n const spineX = firstRibX + i * colStep;\n\n // Aligned rib endpoint Y → same for all ribs in half.\n const endY = half === \"top\" ? spineY - halfExtent : spineY + halfExtent;\n const endX = spineX - halfExtent * ribSlope;\n\n // Header pill positioned along the rib's slope extension.\n // The rib direction: for every 1 unit of Y away from spine, X moves -ribSlope.\n const extraDist = D.headerGap + D.headerH / 2;\n const headerCenterY =\n half === \"top\" ? endY - extraDist : endY + extraDist;\n // Continue the slope: pill center X follows the same dx/dy as the rib.\n const headerCenterX = endX - extraDist * ribSlope;\n const headerW = Math.max(\n D.headerW,\n estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28\n );\n const headerX = headerCenterX - headerW / 2;\n const headerY = headerCenterY - D.headerH / 2;\n\n textBBoxes.push({\n x: headerX,\n y: headerY,\n w: headerW,\n h: D.headerH,\n });\n\n // Cause slots — cumulative along rib from spine outward.\n const causes: FishboneLayoutCause[] = [];\n let accum = FB_CONST.RIB_BASE_EXTENT_Y; // distance from spine to first slot center\n for (let s = 0; s < major.children.length; s++) {\n const child = major.children[s]!;\n const rowH =\n D.rowHeight + child.children.length * D.subRowHeight;\n // vertical offset for this slot (center of row)\n const slotOffset = accum + rowH / 2 - D.rowHeight / 2;\n const ribY =\n half === \"top\" ? spineY - slotOffset : spineY + slotOffset;\n const ribX = spineX - slotOffset * ribSlope;\n\n // Resolve cause direction for this slot.\n const causeDir: \"head\" | \"tail\" =\n causeSideSetting === \"tail\"\n ? \"tail\"\n : causeSideSetting === \"both\"\n ? s % 2 === 0\n ? \"head\"\n : \"tail\"\n : \"head\";\n\n const branchY = ribY;\n const branchX =\n causeDir === \"head\"\n ? ribX + FB_CONST.BRANCH_LEN\n : ribX - FB_CONST.BRANCH_LEN;\n const labelX =\n causeDir === \"head\"\n ? branchX + FB_CONST.LABEL_GAP\n : branchX - FB_CONST.LABEL_GAP;\n const labelY = branchY;\n const labelAnchor: \"start\" | \"end\" =\n causeDir === \"head\" ? \"start\" : \"end\";\n\n // Text bbox for mask\n const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? labelX - 2 : labelX - labelW - 2,\n y: labelY - FB_CONST.LABEL_FONT / 2 - 2,\n w: labelW + 4,\n h: FB_CONST.LABEL_FONT + 4,\n });\n\n // Sub-causes stack below the main label\n const subCauses: FishboneLayoutSubCause[] = [];\n for (let si = 0; si < child.children.length; si++) {\n const sub = child.children[si]!;\n const subY = labelY + (si + 1) * D.subRowHeight;\n const tickX1 =\n causeDir === \"head\" ? labelX + 2 : labelX - 2;\n const tickX2 =\n causeDir === \"head\"\n ? tickX1 + FB_CONST.SUB_TICK_LEN\n : tickX1 - FB_CONST.SUB_TICK_LEN;\n const subX =\n causeDir === \"head\" ? tickX2 + 4 : tickX2 - 4;\n subCauses.push({\n label: sub.label,\n x: subX,\n y: subY,\n tickX1,\n tickX2,\n tickY: subY,\n anchor: causeDir === \"head\" ? \"start\" : \"end\",\n });\n const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? subX - 2 : subX - subW - 2,\n y: subY - FB_CONST.SUB_FONT / 2 - 2,\n w: subW + 4,\n h: FB_CONST.SUB_FONT + 4,\n });\n }\n\n causes.push({\n label: child.label,\n ribIndex: globalIdx,\n slotIndex: s,\n ribX,\n ribY,\n branchX,\n branchY,\n labelX,\n labelY,\n labelAnchor,\n causeSide: causeDir,\n subCauses,\n });\n\n accum += rowH;\n }\n\n ribs.push({\n index: globalIdx,\n half,\n label: major.label,\n color,\n spineX,\n spineY,\n endX,\n endY,\n headerX,\n headerY,\n headerW,\n headerH: D.headerH,\n causes,\n });\n }\n };\n\n buildHalfRibs(topMajors, 0, \"top\", topHalfExtent);\n buildHalfRibs(botMajors, nTop, \"bottom\", botHalfExtent);\n\n // ── Head polygon (right-facing default) ─────────────────────\n const head = {\n x: headX,\n y: spineY,\n tipX: headTipXAdj,\n tipY: spineY,\n w: headEffectiveW,\n h: headEffectiveH,\n label: ast.effect,\n };\n\n // Effect label bbox (for mask around it — though usually effect sits in head\n // which has its own fill, we still add it so any crossing line punches out).\n textBBoxes.push({\n x: headX + 4,\n y: spineY - headEffectiveH / 2 + 4,\n w: headEffectiveW - 8,\n h: headEffectiveH - 8,\n });\n\n // Note: rtl (head-on-left) support: mirror transform applied in renderer\n // rather than recomputing coordinates — simpler and visually identical.\n\n return {\n width,\n height,\n orientation: ast.orientation,\n spineY,\n spineStartX,\n spineEndX,\n tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },\n tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },\n head,\n ribs,\n textBBoxes,\n title,\n };\n}\n\nfunction sumOrMin(arr: number[], min: number): number {\n if (arr.length === 0) return min;\n const s = arr.reduce((a, b) => a + b, 0);\n return Math.max(s, min);\n}\n","import type { FishboneAST } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n line as lineEl,\n rect,\n text as textEl,\n polygon,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { layoutFishbone, type FishboneLayoutResult, type FishboneBBox } from \"./layout\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\nconst CSS = `\n.sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fb-title { font: 600 16px sans-serif; fill: #111; }\n.sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }\n.sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }\n.sx-fb-head { stroke-width: 0.5; }\n.sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-rib { stroke-width: 1.5; fill: none; }\n.sx-fb-header-pill { stroke-width: 0.6; }\n.sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }\n.sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }\n.sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }\n.sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }\n`.trim();\n\nfunction lighten(hex: string, amount: number): string {\n // amount in [0, 1]; shifts toward white\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r + (255 - r) * amount);\n const gg = Math.round(g + (255 - g) * amount);\n const bb = Math.round(b + (255 - b) * amount);\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction darken(hex: string, amount: number): string {\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r * (1 - amount));\n const gg = Math.round(g * (1 - amount));\n const bb = Math.round(b * (1 - amount));\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\nfunction buildMask(id: string, w: number, h: number, bboxes: FishboneBBox[]): string {\n const base = rect({ x: 0, y: 0, width: w, height: h, fill: \"white\" });\n const holes = bboxes\n .map((b) =>\n rect({\n x: b.x,\n y: b.y,\n width: b.w,\n height: b.h,\n fill: \"black\",\n rx: 2,\n })\n )\n .join(\"\\n\");\n return el(\"mask\", { id, maskUnits: \"userSpaceOnUse\" }, [base, holes]);\n}\n\nfunction renderHead(layout: FishboneLayoutResult, ltr: boolean): string {\n const h = layout.head;\n const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);\n const leftX = ltr ? h.x : h.x;\n const rightX = ltr ? h.tipX : tipX;\n // Polygon pointing toward head direction\n const points = ltr\n ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}`\n : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;\n const fill = \"#faece7\";\n const stroke = \"#993c1d\";\n // Bias text toward the wide base (35% from base, 65% from tip) so it reads\n // balanced inside the tapering triangle rather than shifted toward the tip.\n const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;\n return group({ class: \"sx-fb-head-g\" }, [\n polygon({\n points,\n class: \"sx-fb-head\",\n fill,\n stroke,\n }),\n textEl(\n {\n x: textX,\n y: h.y,\n class: \"sx-fb-head-text\",\n fill: darken(stroke, 0.3),\n },\n h.label\n ),\n ]);\n}\n\nfunction renderRibs(layout: FishboneLayoutResult, maskUrl: string): string {\n const parts: string[] = [];\n for (const rib of layout.ribs) {\n const pillFill = lighten(rib.color, 0.82);\n const pillStroke = rib.color;\n const headerTextFill = darken(rib.color, 0.3);\n\n // Rib line (with mask to punch out text overlaps)\n parts.push(\n lineEl({\n x1: rib.spineX,\n y1: rib.spineY,\n x2: rib.endX,\n y2: rib.endY,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n\n // Extend the rib line to the pill center along the same slope.\n parts.push(\n lineEl({\n x1: rib.endX,\n y1: rib.endY,\n x2: rib.headerX + rib.headerW / 2,\n y2: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n })\n );\n\n // Header pill\n parts.push(\n rect({\n x: rib.headerX,\n y: rib.headerY,\n width: rib.headerW,\n height: rib.headerH,\n rx: 8,\n class: \"sx-fb-header-pill\",\n fill: pillFill,\n stroke: pillStroke,\n })\n );\n parts.push(\n textEl(\n {\n x: rib.headerX + rib.headerW / 2,\n y: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-header-text\",\n fill: headerTextFill,\n },\n rib.label\n )\n );\n\n // Branches + labels\n for (const cause of rib.causes) {\n parts.push(\n lineEl({\n x1: cause.ribX,\n y1: cause.ribY,\n x2: cause.branchX,\n y2: cause.branchY,\n class: \"sx-fb-branch\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n parts.push(\n textEl(\n {\n x: cause.labelX,\n y: cause.labelY,\n class: \"sx-fb-cause-label\",\n \"text-anchor\": cause.labelAnchor,\n },\n cause.label\n )\n );\n\n // Sub-causes (Level 2)\n for (const sub of cause.subCauses) {\n parts.push(\n lineEl({\n x1: sub.tickX1,\n y1: sub.tickY,\n x2: sub.tickX2,\n y2: sub.tickY,\n class: \"sx-fb-sub-tick\",\n stroke: rib.color,\n })\n );\n parts.push(\n textEl(\n {\n x: sub.x,\n y: sub.y,\n class: \"sx-fb-sub-label\",\n \"text-anchor\": sub.anchor,\n },\n sub.label\n )\n );\n }\n }\n }\n return group({ class: \"sx-fb-ribs\" }, parts);\n}\n\nexport function renderFishboneAST(ast: FishboneAST, options: { theme?: string } = {}): string {\n const themeName = options.theme ?? ast.metadata?.[\"theme\"] ?? \"default\";\n const tokens = resolveFishboneTheme(themeName);\n const layout = layoutFishbone(ast, { palette: tokens.palette });\n const ltr = layout.orientation !== \"rtl\";\n const maskId = `sx-fb-mask-${randomId()}`;\n const maskUrl = `url(#${maskId})`;\n\n const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);\n\n const spine = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.spineEndX,\n y2: layout.spineY,\n class: \"sx-fb-spine\",\n });\n\n const tailTop = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipTop.x,\n y2: layout.tailForkTipTop.y,\n class: \"sx-fb-tail\",\n });\n const tailBot = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipBot.x,\n y2: layout.tailForkTipBot.y,\n class: \"sx-fb-tail\",\n });\n\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 28,\n class: \"sx-fb-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title\n )\n : \"\";\n\n const head = renderHead(layout, ltr);\n const ribs = renderRibs(layout, maskUrl);\n\n const inner = [\n titleEl(layout.title ? `${layout.title} — Fishbone diagram` : \"Fishbone diagram\"),\n descEl(\n `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`\n ),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n tailTop,\n tailBot,\n spine,\n head,\n ribs,\n ];\n\n // For RTL (head on left), mirror horizontally via transform.\n if (!ltr) {\n const mirrored = group(\n {\n transform: `translate(${layout.width} 0) scale(-1 1)`,\n },\n [tailTop, tailBot, spine, head, ribs]\n );\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n [\n titleEl(layout.title ?? \"Fishbone\"),\n descEl(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n mirrored,\n ]\n );\n }\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n inner\n );\n}\n\nexport function renderFishbone(text: string, options: { theme?: string } = {}): string {\n const ast = parseFishboneDSL(text);\n return renderFishboneAST(ast, options);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { renderFishbone } from \"./renderer\";\n\nexport const fishbone: DiagramPlugin = {\n type: \"fishbone\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fishbone\");\n },\n render(text: string): string {\n return renderFishbone(text);\n },\n};\n\nexport { parseFishboneDSL } from \"./parser\";\nexport { renderFishbone, renderFishboneAST } from \"./renderer\";\nexport { layoutFishbone, FB_CONST } from \"./layout\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/ecomap/parser.ts","../src/diagrams/ecomap/layout.ts","../src/diagrams/ecomap/renderer.ts","../src/diagrams/ecomap/index.ts"],"names":["text"],"mappings":"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","file":"chunk-U5GGE6PJ.js","sourcesContent":["import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n Sex,\n} from \"../../core/types\";\n\n// ─── Error ─────────────────────────────────────────────────\n\nexport class EcomapParseError extends Error {\n constructor(message: string, public line: number) {\n super(`Line ${line}: ${message}`);\n this.name = \"EcomapParseError\";\n }\n}\n\n// ─── Connection operator table ─────────────────────────────\n\ninterface ConnectionOpInfo {\n relType: RelationshipType;\n energyFlow?: \"from\" | \"to\" | \"mutual\";\n}\n\nconst CONNECTION_OPS: Record<string, ConnectionOpInfo> = {\n \"===\": { relType: \"strong\" },\n \"==\": { relType: \"moderate\" },\n \"---\": { relType: \"normal\" },\n \"- -\": { relType: \"weak\" },\n \"~~~\": { relType: \"stressful\" },\n \"~=~\": { relType: \"stressful-strong\" },\n \"~x~\": { relType: \"conflictual\" },\n \"-/-\": { relType: \"broken\" },\n \"===>\": { relType: \"strong\", energyFlow: \"from\" },\n \"<===\": { relType: \"strong\", energyFlow: \"to\" },\n \"<=>\": { relType: \"moderate\", energyFlow: \"mutual\" },\n \"==>\": { relType: \"moderate\", energyFlow: \"from\" },\n \"<==\": { relType: \"moderate\", energyFlow: \"to\" },\n \"-->\": { relType: \"normal\", energyFlow: \"from\" },\n \"<--\": { relType: \"normal\", energyFlow: \"to\" },\n \"<->\": { relType: \"normal\", energyFlow: \"mutual\" },\n};\n\nconst OP_PATTERN =\n \"===>|<===|===|<=>|==>|<==|<->|-->|<--|~=~|~x~|~~~|-\\\\/-|---|==|- -\";\nconst CONNECTION_RE = new RegExp(\n `^([a-zA-Z][a-zA-Z0-9_-]*)\\\\s+(${OP_PATTERN})\\\\s+([a-zA-Z][a-zA-Z0-9_-]*)(.*)$`\n);\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function parseEcomap(text: string): DiagramAST {\n const lines = text.split(\"\\n\");\n const individuals: Individual[] = [];\n const knownIds = new Set<string>();\n const relationships: Relationship[] = [];\n const metadata: Record<string, string> = {};\n let centerId: string | null = null;\n\n let i = 0;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) throw new EcomapParseError(\"Empty input\", 1);\n\n const header = lines[i].trim();\n const headerMatch = header.match(/^ecomap\\s*(?:\"([^\"]*)\")?$/i);\n if (!headerMatch)\n throw new EcomapParseError(\"Expected 'ecomap' header\", i + 1);\n if (headerMatch[1]) metadata.title = headerMatch[1];\n i++;\n\n while (i < lines.length) {\n const raw = lines[i];\n const trimmed = raw.trim();\n if (\n trimmed === \"\" ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"//\")\n ) {\n i++;\n continue;\n }\n\n // Center definition\n const centerMatch = trimmed.match(\n /^center:\\s*([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (centerMatch) {\n const id = centerMatch[1].toLowerCase();\n centerId = id;\n const props = centerMatch[2] ? parseProps(centerMatch[2]) : {};\n individuals.push(buildIndividual(id, props, true));\n knownIds.add(id);\n i++;\n // Skip indented family content under center\n const baseIndent = leadingSpaces(raw);\n while (i < lines.length) {\n if (lines[i].trim() === \"\") {\n i++;\n continue;\n }\n if (leadingSpaces(lines[i]) > baseIndent + 2) {\n i++;\n } else {\n break;\n }\n }\n continue;\n }\n\n // Connection\n const connMatch = trimmed.match(CONNECTION_RE);\n if (connMatch) {\n const fromRaw = connMatch[1].toLowerCase();\n const op = connMatch[2];\n const toRaw = connMatch[3].toLowerCase();\n const rest = connMatch[4]?.trim() ?? \"\";\n\n const opInfo = CONNECTION_OPS[op];\n if (!opInfo)\n throw new EcomapParseError(`Unknown operator '${op}'`, i + 1);\n\n let label: string | undefined;\n const lblMatch = rest.match(/\\[\\s*label:\\s*\"([^\"]*)\"\\s*\\]/);\n if (lblMatch) label = lblMatch[1];\n\n let from = fromRaw;\n let to = toRaw;\n let flow = opInfo.energyFlow;\n\n if (to === centerId && from !== centerId) {\n [from, to] = [to, from];\n if (flow === \"from\") flow = \"to\";\n else if (flow === \"to\") flow = \"from\";\n }\n\n relationships.push({\n type: opInfo.relType,\n from,\n to,\n label,\n energyFlow: flow,\n });\n i++;\n continue;\n }\n\n // System definition\n const sysMatch = trimmed.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (sysMatch) {\n const id = sysMatch[1].toLowerCase();\n if (!knownIds.has(id)) {\n const props = sysMatch[2] ? parseProps(sysMatch[2]) : {};\n individuals.push(buildIndividual(id, props, false));\n knownIds.add(id);\n }\n i++;\n continue;\n }\n\n throw new EcomapParseError(`Unexpected: ${trimmed}`, i + 1);\n }\n\n return { type: \"ecomap\", individuals, relationships, metadata };\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction leadingSpaces(line: string): number {\n const m = line.match(/^(\\s*)/);\n return m ? m[1].length : 0;\n}\n\nfunction parseProps(bracketStr: string): Record<string, string> {\n const inner = bracketStr.slice(1, -1).trim();\n if (!inner) return {};\n const props: Record<string, string> = {};\n\n for (const part of splitCommas(inner)) {\n const t = part.trim();\n if (!t) continue;\n\n const kv = t.match(/^([\\w][\\w-]*)\\s*:\\s*(?:\"([^\"]*)\"|(\\S+))$/);\n if (kv) {\n props[kv[1]] = kv[2] ?? kv[3];\n continue;\n }\n\n if (t === \"male\" || t === \"female\" || t === \"unknown\") {\n props.sex = t;\n continue;\n }\n\n props[t] = \"true\";\n }\n return props;\n}\n\nfunction splitCommas(s: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQ = false;\n for (const ch of s) {\n if (ch === '\"') {\n inQ = !inQ;\n cur += ch;\n } else if (ch === \",\" && !inQ) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur) parts.push(cur);\n return parts;\n}\n\nfunction parseSex(s?: string): Sex {\n switch (s) {\n case \"male\":\n case \"female\":\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return s;\n default:\n return \"unknown\";\n }\n}\n\nfunction buildIndividual(\n id: string,\n props: Record<string, string>,\n isCenter: boolean\n): Individual {\n const properties: Record<string, string> = {};\n if (isCenter) properties.center = \"true\";\n if (props.category) properties.category = props.category;\n if (props.size) properties.size = props.size;\n if (props.importance) properties.importance = props.importance;\n if (props.sector) properties.sector = props.sector;\n\n return {\n id,\n label: props.label ?? id,\n sex: parseSex(props.sex),\n status: \"alive\",\n age: props.age ? parseInt(props.age, 10) : undefined,\n properties,\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Constants ─────────────────────────────────────────────\n\nconst CENTER_R = 50;\nconst SYS_R = 30;\nconst SYS_R_LARGE = 40;\nconst SYS_R_SMALL = 20;\nconst PADDING = 40;\nconst LABEL_CLEARANCE = 60;\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function layoutEcomap(\n ast: DiagramAST,\n _config: LayoutConfig\n): LayoutResult {\n const center = ast.individuals.find(\n (ind) => ind.properties?.center === \"true\"\n );\n if (!center) throw new Error(\"Ecomap requires a center element\");\n\n const systems = ast.individuals.filter(\n (ind) => ind.properties?.center !== \"true\"\n );\n const n = systems.length;\n\n if (n === 0) {\n const size = (CENTER_R + PADDING + LABEL_CLEARANCE) * 2;\n return {\n width: size,\n height: size,\n nodes: [\n {\n id: center.id,\n x: size / 2 - CENTER_R,\n y: size / 2 - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n },\n ],\n edges: [],\n };\n }\n\n const ringRadii = getRingRadii(n);\n const ringAssignment = assignToRings(\n center.id,\n systems,\n ast.relationships,\n ringRadii.length\n );\n const systemPositions = placeOnRings(systems, ringAssignment, ringRadii);\n\n const maxRing = ringRadii[ringRadii.length - 1] ?? 180;\n const canvasSize = (maxRing + SYS_R_LARGE + LABEL_CLEARANCE + PADDING) * 2;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n const nodes: LayoutNode[] = [];\n\n nodes.push({\n id: center.id,\n x: cx - CENTER_R,\n y: cy - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n });\n\n for (const sys of systems) {\n const pos = systemPositions.get(sys.id);\n if (!pos) continue;\n const r = getSystemRadius(sys);\n nodes.push({\n id: sys.id,\n x: cx + pos.x - r,\n y: cy + pos.y - r,\n width: r * 2,\n height: r * 2,\n generation: pos.ring + 1,\n individual: sys,\n });\n }\n\n const edges = computeEdges(nodes, ast.relationships);\n\n return { width: canvasSize, height: canvasSize, nodes, edges };\n}\n\n// ─── Ring configuration ────────────────────────────────────\n\nfunction getRingRadii(n: number): number[] {\n if (n === 0) return [];\n if (n <= 6) return [180];\n if (n <= 12) return [150, 270];\n return [140, 230, 320];\n}\n\nfunction assignToRings(\n _centerId: string,\n systems: Individual[],\n rels: Relationship[],\n ringCount: number\n): Map<string, number> {\n const relBySys = new Map<string, Relationship>();\n for (const r of rels) {\n const sysId =\n r.from === _centerId ? r.to : r.from === _centerId ? r.to : r.to;\n if (!relBySys.has(sysId)) relBySys.set(sysId, r);\n const otherId = r.from === _centerId ? r.to : r.from;\n if (!relBySys.has(otherId)) relBySys.set(otherId, r);\n }\n\n const result = new Map<string, number>();\n\n if (ringCount <= 1) {\n for (const s of systems) result.set(s.id, 0);\n return result;\n }\n\n for (const s of systems) {\n const rel = relBySys.get(s.id);\n if (!rel) {\n result.set(s.id, ringCount - 1);\n continue;\n }\n\n if (rel.type === \"strong\" || rel.type === \"stressful-strong\") {\n result.set(s.id, 0);\n } else if (rel.type === \"weak\" || rel.type === \"broken\") {\n result.set(s.id, ringCount - 1);\n } else {\n result.set(s.id, Math.min(1, ringCount - 1));\n }\n }\n\n return result;\n}\n\n// ─── Placement ─────────────────────────────────────────────\n\ninterface SysPos {\n x: number;\n y: number;\n ring: number;\n}\n\nfunction placeOnRings(\n systems: Individual[],\n ringAssignment: Map<string, number>,\n ringRadii: number[]\n): Map<string, SysPos> {\n const ringGroups = new Map<number, Individual[]>();\n for (const s of systems) {\n const ring = ringAssignment.get(s.id) ?? 0;\n const grp = ringGroups.get(ring) ?? [];\n grp.push(s);\n ringGroups.set(ring, grp);\n }\n\n const positions = new Map<string, SysPos>();\n\n for (const [ring, grp] of ringGroups) {\n const radius = ringRadii[ring] ?? ringRadii[ringRadii.length - 1] ?? 180;\n const n = grp.length;\n const startAngle = -Math.PI / 2;\n\n for (let idx = 0; idx < n; idx++) {\n const angle = startAngle + (2 * Math.PI * idx) / n;\n positions.set(grp[idx].id, {\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n ring,\n });\n }\n }\n\n return positions;\n}\n\n// ─── Edges ─────────────────────────────────────────────────\n\nfunction computeEdges(\n nodes: LayoutNode[],\n rels: Relationship[]\n): LayoutEdge[] {\n const nodeMap = new Map<string, LayoutNode>();\n for (const n of nodes) nodeMap.set(n.id, n);\n\n const edges: LayoutEdge[] = [];\n\n for (const rel of rels) {\n const fromNode = nodeMap.get(rel.from);\n const toNode = nodeMap.get(rel.to);\n if (!fromNode || !toNode) continue;\n\n const fcx = fromNode.x + fromNode.width / 2;\n const fcy = fromNode.y + fromNode.height / 2;\n const tcx = toNode.x + toNode.width / 2;\n const tcy = toNode.y + toNode.height / 2;\n\n const dx = tcx - fcx;\n const dy = tcy - fcy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 1) continue;\n\n const ux = dx / dist;\n const uy = dy / dist;\n const fromR = fromNode.width / 2;\n const toR = toNode.width / 2;\n\n const x1 = fcx + ux * fromR;\n const y1 = fcy + uy * fromR;\n const x2 = tcx - ux * toR;\n const y2 = tcy - uy * toR;\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path: `M ${x1} ${y1} L ${x2} ${y2}`,\n });\n }\n\n return edges;\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction getSystemRadius(ind: Individual): number {\n const imp = ind.properties?.importance ?? ind.properties?.size;\n switch (imp) {\n case \"major\":\n case \"large\":\n return SYS_R_LARGE;\n case \"minor\":\n case \"small\":\n return SYS_R_SMALL;\n default:\n return SYS_R;\n }\n}\n","import type {\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n RenderConfig,\n} from \"../../core/types\";\nimport { svgRoot, el, group, text, title, desc } from \"../../core/svg\";\nimport { cssCustomProperties, resolveBaseTheme, STROKE_WIDTH, type BaseTheme } from \"../../core/theme\";\n\n// ─── Category colors (Hartman standard) ────────────────────\n\nconst CATEGORY_COLORS: Record<string, string> = {\n family: \"#8D6E63\",\n friends: \"#42A5F5\",\n work: \"#66BB6A\",\n education: \"#FFA726\",\n health: \"#EF5350\",\n \"mental-health\": \"#AB47BC\",\n religion: \"#CCBB33\",\n recreation: \"#26C6DA\",\n legal: \"#78909C\",\n government: \"#8D6E63\",\n financial: \"#66BB6A\",\n community: \"#29B6F6\",\n cultural: \"#FFA726\",\n substance: \"#EF5350\",\n technology: \"#42A5F5\",\n pet: \"#8D6E63\",\n};\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function renderEcomap(\n layout: LayoutResult,\n config: RenderConfig\n): string {\n const centerNode = layout.nodes.find(\n (n) => n.individual.properties?.center === \"true\"\n );\n const systemNodes = layout.nodes.filter(\n (n) => n.individual.properties?.center !== \"true\"\n );\n\n const t = resolveBaseTheme(config.theme);\n const defsStr = buildDefs(t);\n const styleStr = buildStyles(config, t);\n const connectionsStr = renderConnections(layout.edges);\n const centerStr = centerNode ? renderCenter(centerNode, config) : \"\";\n const systemsStr = renderSystems(systemNodes, config);\n const labelsStr = renderConnectionLabels(layout.edges, t);\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n class: \"schematex-diagram schematex-ecomap\",\n width: layout.width,\n height: layout.height,\n },\n [\n title(\"Ecomap\"),\n desc(\n `Ecomap diagram with ${systemNodes.length} external systems`\n ),\n defsStr,\n styleStr,\n connectionsStr,\n centerStr,\n systemsStr,\n labelsStr,\n ]\n );\n}\n\n// ─── Defs ──────────────────────────────────────────────────\n\nfunction buildDefs(t: BaseTheme): string {\n const arrowMarker = el(\n \"marker\",\n {\n id: \"schematex-ecomap-eco-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"10\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: t.neutral })]\n );\n\n return el(\"defs\", {}, [arrowMarker]);\n}\n\n// ─── Styles ────────────────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig, t: BaseTheme): string {\n let css = `\n.schematex-ecomap {${cssCustomProperties(t)}\n background: ${t.bg};\n}\n.schematex-ecomap-center-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.thick}; }\n.schematex-ecomap-center-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize + 2}px; text-anchor: middle; dominant-baseline: central; fill: ${t.text}; font-weight: 600; }\n.schematex-ecomap-system-shape { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-ecomap-system-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 1}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-ecomap-eco-line { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-parallel { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-weak { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 6,4; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-broken { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 3,8; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-conn-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 2}px; text-anchor: middle; fill: ${t.textMuted}; }\n.schematex-ecomap-eco-arrow { fill: ${t.neutral}; }\n`;\n\n for (const [cat, color] of Object.entries(CATEGORY_COLORS)) {\n css += `.schematex-ecomap-system-${cat} .schematex-ecomap-system-shape { fill: ${color}18; stroke: ${color}; }\\n`;\n }\n\n return el(\"style\", {}, css);\n}\n\n// ─── Center ────────────────────────────────────────────────\n\nfunction renderCenter(node: LayoutNode, config: RenderConfig): string {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const r = node.width / 2;\n const ind = node.individual;\n\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n const elements: string[] = [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-center-shape\",\n }),\n text(\n {\n x: cx,\n y: cy,\n class: \"schematex-ecomap-center-label\",\n },\n label\n ),\n ];\n\n if (ind.age) {\n elements.push(\n text(\n {\n x: cx,\n y: cy + config.fontSize + 4,\n class: \"schematex-ecomap-center-label\",\n \"font-size\": `${config.fontSize}px`,\n \"font-weight\": \"normal\",\n },\n `Age ${ind.age}`\n )\n );\n }\n\n return group(\n { class: \"schematex-ecomap-center\", \"data-id\": ind.id },\n elements\n );\n}\n\n// ─── Systems ───────────────────────────────────────────────\n\nfunction renderSystems(\n nodes: LayoutNode[],\n config: RenderConfig\n): string {\n const elements: string[] = [];\n\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const r = node.width / 2;\n const ind = node.individual;\n const cat = ind.properties?.category ?? \"other\";\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n\n const labelLines = wrapLabel(label, 12);\n const labelElements: string[] = [];\n const labelStartY = cy + r + config.fontSize + 2;\n\n for (let li = 0; li < labelLines.length; li++) {\n labelElements.push(\n text(\n {\n x: cx,\n y: labelStartY + li * (config.fontSize + 1),\n class: \"schematex-ecomap-system-label\",\n },\n labelLines[li]\n )\n );\n }\n\n elements.push(\n group(\n {\n class: `schematex-ecomap-system schematex-ecomap-system-${cat}`,\n \"data-system-id\": ind.id,\n },\n [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-system-shape\",\n }),\n ...labelElements,\n ]\n )\n );\n }\n\n return group({ class: \"schematex-ecomap-systems\" }, elements);\n}\n\n// ─── Connections ───────────────────────────────────────────\n\nfunction renderConnections(edges: LayoutEdge[]): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const relType = edge.relationship.type;\n const flow = edge.relationship.energyFlow;\n const lineElements: string[] = [];\n\n const arrowAttrs = getArrowAttrs(flow);\n\n switch (relType) {\n case \"strong\":\n lineElements.push(\n ...parallelLines(coords, 3, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"moderate\":\n lineElements.push(\n ...parallelLines(coords, 2, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"weak\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-weak\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"stressful\":\n case \"stressful-strong\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n \"stroke-width\": relType === \"stressful-strong\" ? \"3\" : \"2\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"conflictual\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n ...arrowAttrs,\n })\n );\n lineElements.push(\n ...conflictMarks(coords)\n );\n break;\n\n case \"broken\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-broken\",\n ...arrowAttrs,\n })\n );\n break;\n\n default:\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line\",\n ...arrowAttrs,\n })\n );\n break;\n }\n\n elements.push(\n group(\n {\n class: `schematex-ecomap-connection schematex-ecomap-connection-${relType}`,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n },\n lineElements\n )\n );\n }\n\n return group({ class: \"schematex-ecomap-connections\" }, elements);\n}\n\n// ─── Connection labels ─────────────────────────────────────\n\nfunction renderConnectionLabels(edges: LayoutEdge[], t: BaseTheme): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n if (!edge.relationship.label) continue;\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n\n elements.push(\n group({ class: \"schematex-ecomap-conn-label-group\" }, [\n el(\"rect\", {\n x: mx - 40,\n y: my - 8,\n width: 80,\n height: 16,\n rx: 3,\n fill: t.bg,\n \"fill-opacity\": \"0.85\",\n }),\n text(\n { x: mx, y: my + 4, class: \"schematex-ecomap-eco-conn-label\" },\n edge.relationship.label\n ),\n ])\n );\n }\n\n return group({ class: \"schematex-ecomap-connection-labels\" }, elements);\n}\n\n// ─── Line type helpers ─────────────────────────────────────\n\ninterface LineCoords {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nfunction extractLineCoords(pathData: string): LineCoords | null {\n const m = pathData.match(\n /M\\s*([\\d.-]+)\\s+([\\d.-]+)\\s*L\\s*([\\d.-]+)\\s+([\\d.-]+)/\n );\n if (!m) return null;\n return { x1: +m[1], y1: +m[2], x2: +m[3], y2: +m[4] };\n}\n\nfunction parallelLines(\n coords: LineCoords,\n count: number,\n gap: number,\n attrs: Record<string, string | number | undefined>\n): string[] {\n const { x1, y1, x2, y2 } = coords;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n\n const lines: string[] = [];\n const offsets =\n count === 2\n ? [-gap / 2, gap / 2]\n : count === 3\n ? [-gap, 0, gap]\n : [0];\n\n for (const off of offsets) {\n lines.push(\n el(\"line\", {\n x1: x1 + nx * off,\n y1: y1 + ny * off,\n x2: x2 + nx * off,\n y2: y2 + ny * off,\n ...attrs,\n })\n );\n }\n\n return lines;\n}\n\nfunction wavyPath(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n amplitude: number,\n wavelength: number\n): string {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segments = Math.max(4, Math.round(len / wavelength));\n\n const ux = dx / len;\n const uy = dy / len;\n const nx = -uy;\n const ny = ux;\n\n let d = `M ${x1} ${y1}`;\n for (let i = 0; i < segments; i++) {\n const t1 = (i + 0.5) / segments;\n const t2 = (i + 1) / segments;\n const sign = i % 2 === 0 ? 1 : -1;\n const cpx = x1 + dx * t1 + nx * amplitude * sign;\n const cpy = y1 + dy * t1 + ny * amplitude * sign;\n const ex = x1 + dx * t2;\n const ey = y1 + dy * t2;\n d += ` Q ${cpx} ${cpy} ${ex} ${ey}`;\n }\n\n return d;\n}\n\nfunction conflictMarks(coords: LineCoords): string[] {\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n const dx = coords.x2 - coords.x1;\n const dy = coords.y2 - coords.y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n const markLen = 6;\n\n return [\n el(\"line\", {\n x1: mx - 3 + nx * markLen,\n y1: my - 3 + ny * markLen,\n x2: mx - 3 - nx * markLen,\n y2: my - 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n el(\"line\", {\n x1: mx + 3 + nx * markLen,\n y1: my + 3 + ny * markLen,\n x2: mx + 3 - nx * markLen,\n y2: my + 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n ];\n}\n\nfunction getArrowAttrs(\n flow?: \"from\" | \"to\" | \"mutual\" | \"none\"\n): Record<string, string> {\n if (!flow || flow === \"none\") return {};\n switch (flow) {\n case \"from\":\n return { \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"to\":\n return { \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"mutual\":\n return {\n \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\",\n \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\",\n };\n default:\n return {};\n }\n}\n\n// ─── Text helpers ──────────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction wrapLabel(label: string, maxChars: number): string[] {\n if (label.length <= maxChars) return [label];\n const words = label.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n if (current && current.length + word.length + 1 > maxChars) {\n lines.push(current);\n current = word;\n } else {\n current = current ? current + \" \" + word : word;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseEcomap } from \"./parser\";\nimport { layoutEcomap } from \"./layout\";\nimport { renderEcomap } from \"./renderer\";\n\nexport { parseEcomap, EcomapParseError } from \"./parser\";\nexport { layoutEcomap } from \"./layout\";\nexport { renderEcomap } from \"./renderer\";\n\nexport const ecomap: DiagramPlugin = {\n type: \"ecomap\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"ecomap\" || firstLine.startsWith(\"ecomap \");\n },\n\n render(text: string, config?: RenderConfig): string {\n const ast = parseEcomap(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutEcomap(ast, layoutConfig);\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: config?.fontSize ?? 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return renderEcomap(layout, renderConfig);\n },\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/fishbone/parser.ts","../src/diagrams/fishbone/layout.ts","../src/diagrams/fishbone/renderer.ts","../src/diagrams/fishbone/index.ts"],"names":["text","title","line","resolveFishboneTheme","rect","el","group","polygon","desc","defs","svgRoot"],"mappings":"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","file":"chunk-URSKIHSY.cjs","sourcesContent":["import type {\n FishboneAST,\n FishboneCauseSide,\n FishboneDensity,\n FishboneNode,\n FishboneOrientation,\n FishboneSides,\n} from \"../../core/types\";\n\nexport class FishboneParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FishboneParseError\";\n }\n}\n\ninterface CategoryDef {\n id: string;\n label: string;\n color?: string;\n side?: \"top\" | \"bottom\";\n order?: number;\n}\n\nconst SLOPE_PRESETS: Record<string, number> = {\n gentle: 0.45,\n normal: 0.6,\n steep: 0.75,\n};\n\n/**\n * Fishbone DSL parser.\n *\n * Supports two syntactic styles, mixable in one document:\n *\n * Style A — structured (per 13-FISHBONE-STANDARD §11)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category content \"内容 Content\"\n * category tech \"技术 Technical\"\n * content : \"更新频率下降\"\n * content : \"关键词未覆盖\"\n * - \"长尾词无内容\"\n * - \"竞品占位 H1\"\n *\n * Style B — compact shorthand (convenient for quick authoring, AI output)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category Content: 更新频率下降; 同质化严重; 关键词未覆盖\n * category Technical: Core Web Vitals 差; 索引覆盖率下降\n *\n * Config directives:\n *\n * config direction = left|right # head orientation (default right)\n * config width = 900\n * config height = 620\n *\n * Lines starting with `#` are comments. Leading whitespace is indentation; a\n * line that begins with `-` (after ≥2 spaces of indent) is a Level-2 sub-cause\n * for the most-recent Level-1 cause.\n */\nexport function parseFishboneDSL(text: string): FishboneAST {\n const rawLines = text.split(/\\r?\\n/);\n\n let title: string | undefined;\n let effect = \"\";\n let orientation: FishboneOrientation = \"ltr\";\n let width: number | undefined;\n let height: number | undefined;\n let sides: FishboneSides | undefined;\n let ribSlope: number | undefined;\n let density: FishboneDensity | undefined;\n let causeSide: FishboneCauseSide | undefined;\n\n const categories: CategoryDef[] = [];\n const causesByCategory = new Map<string, FishboneNode[]>();\n let lastLevel1: FishboneNode | null = null;\n\n let headerSeen = false;\n\n const getCat = (id: string): CategoryDef | undefined =>\n categories.find((c) => c.id === id || c.label === id);\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i] ?? \"\";\n const line = stripComment(raw).trimEnd();\n if (!line.trim()) continue;\n\n const indent = countIndent(raw);\n const trimmed = line.trim();\n\n // Header: fishbone \"Title\" OR fishbone: \"Title\"\n if (!headerSeen && /^fishbone\\b/i.test(trimmed)) {\n const m = trimmed.match(/^fishbone\\s*:?\\s*(.*)$/i);\n if (m && m[1]) title = stripQuotes(m[1]);\n headerSeen = true;\n continue;\n }\n\n // Sub-cause (Level 2+): starts with \"-\" after indent\n if (indent >= 2 && trimmed.startsWith(\"-\")) {\n if (!lastLevel1) {\n throw new FishboneParseError(\n `Sub-cause at line ${i + 1} has no preceding Level-1 cause: \"${trimmed}\"`\n );\n }\n const subText = stripQuotes(trimmed.slice(1).trim());\n if (!subText) continue;\n lastLevel1.children.push({ label: subText, children: [] });\n continue;\n }\n\n // effect \"...\"\n if (/^effect\\b/i.test(trimmed)) {\n const m = trimmed.match(/^effect\\s*:?\\s*(.*)$/i);\n if (m) effect = stripQuotes(m[1] ?? \"\");\n continue;\n }\n\n // config key = value\n if (/^config\\b/i.test(trimmed)) {\n const m = trimmed.match(/^config\\s+([a-zA-Z]+)\\s*=\\s*(.+)$/i);\n if (m) {\n const key = m[1]!.toLowerCase();\n const val = stripQuotes(m[2]!.trim());\n if (key === \"direction\") {\n orientation = val === \"left\" || val === \"rtl\" ? \"rtl\" : \"ltr\";\n } else if (key === \"width\") {\n const n = Number(val);\n if (Number.isFinite(n)) width = n;\n } else if (key === \"height\") {\n const n = Number(val);\n if (Number.isFinite(n)) height = n;\n } else if (key === \"sides\") {\n const v = val.toLowerCase();\n if (v === \"both\" || v === \"top\" || v === \"bottom\") sides = v;\n } else if (key === \"slope\" || key === \"ribslope\") {\n const preset = SLOPE_PRESETS[val.toLowerCase()];\n if (preset !== undefined) ribSlope = preset;\n else {\n const n = Number(val);\n if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;\n }\n } else if (key === \"density\") {\n const v = val.toLowerCase();\n if (v === \"compact\" || v === \"normal\" || v === \"spacious\") density = v;\n } else if (key === \"causeside\" || key === \"cause-side\") {\n const v = val.toLowerCase();\n if (v === \"head\" || v === \"tail\" || v === \"both\") causeSide = v;\n }\n }\n continue;\n }\n\n // category <id> \"<display>\" [color: <hex>]\n if (/^category\\b/i.test(trimmed)) {\n const compact = trimmed.match(/^category\\s+([^:]+?)\\s*:\\s*(.+)$/i);\n const structured = trimmed.match(\n /^category\\s+([a-zA-Z][\\w-]*)\\s+(\"[^\"]*\"|[^\\s[]+)(?:\\s*(\\[.*\\]))?\\s*$/i\n );\n\n if (structured) {\n const id = structured[1]!;\n const label = stripQuotes(structured[2]!);\n const props = parseProps(structured[3] ?? \"\");\n if (!getCat(id)) {\n const sideProp = props[\"side\"]?.toLowerCase();\n const side =\n sideProp === \"top\" || sideProp === \"bottom\" ? sideProp : undefined;\n const orderProp = props[\"order\"];\n const orderNum = orderProp !== undefined ? Number(orderProp) : NaN;\n const order = Number.isFinite(orderNum) ? orderNum : undefined;\n categories.push({ id, label, color: props[\"color\"], side, order });\n causesByCategory.set(id, []);\n }\n lastLevel1 = null;\n continue;\n }\n\n if (compact) {\n const label = stripQuotes(compact[1]!.trim());\n const id = slugify(label);\n const rest = compact[2]!.trim();\n if (!getCat(id)) {\n categories.push({ id, label });\n causesByCategory.set(id, []);\n }\n // split by `;` for compact style causes\n const bucket = causesByCategory.get(id)!;\n for (const part of rest.split(/[;,]/)) {\n const txt = stripQuotes(part.trim());\n if (txt) {\n const node: FishboneNode = { label: txt, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n }\n }\n continue;\n }\n }\n\n // <categoryId> : \"cause\"\n const causeMatch = trimmed.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (causeMatch) {\n const catId = causeMatch[1]!;\n const cat = getCat(catId);\n if (!cat) {\n throw new FishboneParseError(\n `Unknown category \"${catId}\" at line ${i + 1}. Declare with \\`category ${catId} \"...\"\\` first.`\n );\n }\n const bucket = causesByCategory.get(cat.id)!;\n const rest = causeMatch[2]!.trim();\n // `cause_text [prop: value]`\n const { text: causeText } = splitTrailingProps(rest);\n const label = stripQuotes(causeText);\n if (!label) continue;\n const node: FishboneNode = { label, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n continue;\n }\n\n // Unknown line — ignore silently to tolerate alien syntax blends\n }\n\n if (!effect) {\n // Fallback: use title as effect\n effect = title ?? \"\";\n }\n\n if (categories.length === 0) {\n throw new FishboneParseError(\n \"Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md.\"\n );\n }\n\n const majors: FishboneNode[] = categories.map((c) => ({\n label: c.label,\n color: c.color,\n children: causesByCategory.get(c.id) ?? [],\n side: c.side,\n order: c.order,\n }));\n\n return {\n type: \"fishbone\",\n title,\n effect,\n majors,\n orientation,\n width,\n height,\n sides,\n ribSlope,\n density,\n causeSide,\n };\n}\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction countIndent(raw: string): number {\n let n = 0;\n for (const ch of raw) {\n if (ch === \" \") n += 1;\n else if (ch === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^\\w\\u4e00-\\u9fff]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"cat\"\n );\n}\n\nfunction splitTrailingProps(s: string): { text: string; props: Record<string, string> } {\n const idx = s.lastIndexOf(\"[\");\n if (idx < 0 || !s.trimEnd().endsWith(\"]\")) return { text: s, props: {} };\n const text = s.slice(0, idx).trim();\n const props = parseProps(s.slice(idx));\n return { text, props };\n}\n\nfunction parseProps(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n const m = raw.match(/^\\[(.*)\\]$/s);\n if (!m) return out;\n const inside = m[1]!;\n for (const part of splitTopLevelCommas(inside)) {\n const [k, ...rest] = part.split(\":\");\n if (!k || rest.length === 0) continue;\n out[k.trim()] = stripQuotes(rest.join(\":\").trim());\n }\n return out;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth += 1;\n else if (ch === \"]\") depth -= 1;\n else if (ch === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n","import type { FishboneAST, FishboneCauseSide, FishboneNode } from \"../../core/types\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\n/**\n * Fishbone layout engine.\n *\n * Geometric contract (see 13-FISHBONE-STANDARD §5, §9):\n * - Horizontal spine at `spineY`\n * - Effect polygon at right (ltr) or left (rtl) end\n * - Category ribs slant AWAY from the fish head (signature of Ishikawa form)\n * - Ribs are paired top/bottom on the same X column for visual rhythm\n * - Each rib hosts Level-1 causes as short horizontal branches toward the head\n * - Rib length adapts to (max) cause count in its half so headers align\n *\n * This is an optimized v2 layout that improves on the naive fixed-slope design:\n * 1. Dynamic row heights — a Level-1 cause with N sub-causes reserves\n * (baseRow + N·subRow) of vertical space so nothing overlaps.\n * 2. Per-half aligned headers — ribs in the same half share the same outer Y\n * so category pills form a clean visual row.\n * 3. Column-pairing — top and bottom ribs share the same spine X.\n * 4. Smart canvas sizing — derives width/height from content, respecting\n * optional user overrides from `config width = …` / `config height = …`.\n * 5. Label-aware extents — long cause labels extend the canvas rather than\n * clipping, so multi-lingual / verbose content is first-class.\n * 6. Label bboxes exposed for the renderer to build a text-gap mask.\n */\n\n// ─── Public Types ─────────────────────────────────────────────\n\nexport interface FishboneLayoutCause {\n label: string;\n /** Rib index (0 = first category) */\n ribIndex: number;\n /** Slot index on the rib (0 = closest to spine) */\n slotIndex: number;\n /** Cause start point on the rib */\n ribX: number;\n ribY: number;\n /** Horizontal branch end point (label starts just beyond) */\n branchX: number;\n branchY: number;\n /** Label anchor (x where text starts, y baseline) */\n labelX: number;\n labelY: number;\n labelAnchor: \"start\" | \"end\";\n /** Direction this cause branch sticks out: \"head\" = toward head, \"tail\" = toward tail. */\n causeSide: \"head\" | \"tail\";\n /** Sub-causes (Level 2) stacked below the main label */\n subCauses: FishboneLayoutSubCause[];\n}\n\nexport interface FishboneLayoutSubCause {\n label: string;\n x: number;\n y: number;\n tickX1: number;\n tickX2: number;\n tickY: number;\n anchor: \"start\" | \"end\";\n}\n\nexport interface FishboneLayoutRib {\n index: number;\n half: \"top\" | \"bottom\";\n label: string;\n color: string;\n /** Where rib meets spine */\n spineX: number;\n spineY: number;\n /** Far end of rib (where header pill sits) */\n endX: number;\n endY: number;\n /** Header pill geometry */\n headerX: number;\n headerY: number;\n headerW: number;\n headerH: number;\n causes: FishboneLayoutCause[];\n}\n\nexport interface FishboneBBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FishboneLayoutResult {\n width: number;\n height: number;\n orientation: \"ltr\" | \"rtl\";\n spineY: number;\n spineStartX: number;\n spineEndX: number;\n tailForkTipTop: { x: number; y: number };\n tailForkTipBot: { x: number; y: number };\n head: {\n x: number; // spine-attached x\n y: number; // spine-attached y (= spineY)\n tipX: number; // pointy tip\n tipY: number;\n w: number;\n h: number;\n label: string;\n };\n ribs: FishboneLayoutRib[];\n /** Label bounding boxes (for text-gap mask) */\n textBBoxes: FishboneBBox[];\n title?: string;\n}\n\n// ─── Geometry constants (tunable, exported for renderer parity) ──\n\nexport const FB_CONST = {\n PADDING: 40,\n HEAD_W: 90,\n HEAD_H: 80,\n TAIL_LEN: 40,\n SPINE_OFFSET_FROM_TAIL: 40, // distance from canvas left to spine start\n RIB_SLOPE: 0.6, // dx/dy — consistent across all ribs\n RIB_BASE_EXTENT_Y: 30, // vertical distance of first slot from spine\n ROW_HEIGHT: 30, // vertical gap between Level-1 slots\n SUB_ROW_HEIGHT: 17,\n BRANCH_LEN: 30, // horizontal Level-1 branch length\n SUB_TICK_LEN: 10,\n HEADER_W: 132,\n HEADER_H: 34,\n HEADER_GAP: 12, // gap between rib endpoint and header pill\n COL_STEP: 130, // spine x gap between adjacent ribs\n COL_FIRST_OFFSET: 170, // first rib's distance from spine start\n LABEL_FONT: 12,\n HEADER_FONT: 14,\n SUB_FONT: 11,\n EFFECT_FONT: 14,\n LABEL_GAP: 6, // gap from branch end to label\n MIN_ROWS_PER_HALF: 4, // aesthetic minimum rib length\n COL_GAP_BETWEEN_LABELS: 18, // min horizontal breathing between adjacent ribs' label columns\n HEAD_PAD_X: 44, // total horizontal padding around effect text inside head\n HEAD_PAD_Y: 20, // min vertical padding around effect text inside head\n TITLE_CLEARANCE: 24, // extra gap between title baseline and top header pill\n} as const;\n\n// ─── Default palette (13-FISHBONE-STANDARD §5.4) ─────────────\n\n\n// ─── Text measurement (CJK-aware approximation) ───────────────\n\nexport function estimateTextWidth(s: string, fontSize: number): number {\n let w = 0;\n for (const ch of s) {\n const cp = ch.codePointAt(0) ?? 0;\n // CJK unified ideographs + kana + Hangul + fullwidth\n const isWide =\n (cp >= 0x3000 && cp <= 0x30ff) ||\n (cp >= 0x3400 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7af) ||\n (cp >= 0xff00 && cp <= 0xffef);\n w += fontSize * (isWide ? 1.0 : 0.56);\n }\n return w;\n}\n\n// ─── Density presets ──────────────────────────────────────────\n\ninterface DensityTunables {\n rowHeight: number;\n subRowHeight: number;\n colStep: number;\n headerW: number;\n headerH: number;\n headerGap: number;\n minRowsPerHalf: number;\n colFirstOffset: number;\n}\n\nconst DENSITY: Record<\"compact\" | \"normal\" | \"spacious\", DensityTunables> = {\n compact: {\n rowHeight: 24,\n subRowHeight: 15,\n colStep: 110,\n headerW: 118,\n headerH: 30,\n headerGap: 8,\n minRowsPerHalf: 3,\n colFirstOffset: 140,\n },\n normal: {\n rowHeight: 30,\n subRowHeight: 17,\n colStep: 130,\n headerW: 132,\n headerH: 34,\n headerGap: 12,\n minRowsPerHalf: 4,\n colFirstOffset: 170,\n },\n spacious: {\n rowHeight: 36,\n subRowHeight: 19,\n colStep: 150,\n headerW: 148,\n headerH: 38,\n headerGap: 16,\n minRowsPerHalf: 5,\n colFirstOffset: 200,\n },\n};\n\n// ─── Public API ───────────────────────────────────────────────\n\nexport function layoutFishbone(ast: FishboneAST, opts?: { palette?: readonly string[] }): FishboneLayoutResult {\n const majors = ast.majors.length > 0 ? ast.majors : [];\n const nRibs = majors.length;\n\n const density = ast.density ?? \"normal\";\n const D = DENSITY[density];\n const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;\n const causeSideSetting: FishboneCauseSide = ast.causeSide ?? \"head\";\n const sides = ast.sides ?? \"both\";\n\n // Partition ribs into top/bottom halves honoring per-category `side` overrides\n // and the `sides` setting. If a category has an explicit side, use it;\n // otherwise fall back to the global `sides` default (single-sided layouts\n // pin everything to that half; \"both\" alternates declaration order across\n // the two halves as before).\n const topMajors: FishboneNode[] = [];\n const botMajors: FishboneNode[] = [];\n if (sides === \"top\" || sides === \"bottom\") {\n const bucket = sides === \"top\" ? topMajors : botMajors;\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else bucket.push(m);\n }\n } else {\n const autoPool: FishboneNode[] = [];\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else autoPool.push(m);\n }\n // Greedy balance — push into whichever half currently has fewer ribs,\n // ties → top (matches the prior \"top gets the extra\" rule).\n for (const m of autoPool) {\n if (topMajors.length <= botMajors.length) topMajors.push(m);\n else botMajors.push(m);\n }\n }\n\n // Respect per-rib `order` (lower = closer to tail). Stable sort within half.\n const byOrder = (a: FishboneNode, b: FishboneNode): number => {\n const ao = a.order ?? Number.POSITIVE_INFINITY;\n const bo = b.order ?? Number.POSITIVE_INFINITY;\n return ao - bo;\n };\n topMajors.sort(byOrder);\n botMajors.sort(byOrder);\n\n const nTop = topMajors.length;\n const nBot = botMajors.length;\n // Keep legacy var names alive\n void nRibs;\n\n // Row count per rib = max(subCauses) for that rib's Level-1 list.\n // Extent per rib = sum of rowHeights for slots 0..n-1.\n const ribRowHeights = (m: FishboneNode): number[] => {\n if (m.children.length === 0) return [];\n return m.children.map(\n (c) => D.rowHeight + c.children.length * D.subRowHeight\n );\n };\n\n const topExtents = topMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n const botExtents = botMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n\n // ── Head sizing (computed early so it can influence half-extent padding) ──\n const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);\n // Grow H proportionally with W to maintain ≈2:1 W:H ratio (avoids flat sliver).\n const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;\n const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));\n // At y ± font/2, available width = W * (1 − font/H) due to triangle taper.\n const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;\n const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));\n\n // Head extends ±headEffectiveH/2 from spine — guarantee half extents cover it.\n const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;\n\n const topHalfExtent =\n nTop > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(topExtents.length ? topExtents : [0])\n )\n : sides === \"bottom\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n const botHalfExtent =\n nBot > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(botExtents.length ? botExtents : [0])\n )\n : sides === \"top\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n\n const nCols = Math.max(nTop, nBot, 1);\n\n // ── Adaptive column step: widest Level-1 label + branch + gap + breathing ──\n let maxCauseLabelW = 0;\n let maxSubLabelW = 0;\n for (const m of majors) {\n for (const c of m.children) {\n maxCauseLabelW = Math.max(\n maxCauseLabelW,\n estimateTextWidth(c.label, FB_CONST.LABEL_FONT)\n );\n for (const sc of c.children) {\n maxSubLabelW = Math.max(\n maxSubLabelW,\n estimateTextWidth(sc.label, FB_CONST.SUB_FONT)\n );\n }\n }\n }\n // Label column needs to fit the widest Level-1 label AND any Level-2 tick+label\n // that sits under it (sub causes are indented by SUB_TICK_LEN + 4 from labelX).\n const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;\n const labelColW = Math.max(maxCauseLabelW, subExtent);\n // When causes can sit on both sides, each column must reserve label space on both sides.\n const labelExtentsPerCol = causeSideSetting === \"both\" ? 2 : 1;\n const minColStep =\n FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;\n const colStep = Math.max(\n D.colStep,\n Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))\n );\n\n // ── Canvas sizing ───────────────────────────────────────────\n const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;\n const firstRibX = spineStartX + D.colFirstOffset;\n const lastRibX = firstRibX + (nCols - 1) * colStep;\n // Reserve room for the last rib's label column before the head begins.\n const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);\n\n const headX = spineEndX;\n const headTipXAdj = headX + headEffectiveW;\n\n const width =\n ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);\n\n const title = ast.title;\n const titleReserve = title ? FB_CONST.TITLE_CLEARANCE + 20 : 0;\n\n const spineY =\n FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;\n\n const height =\n ast.height ??\n Math.ceil(\n spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING\n );\n\n // ── Ribs ────────────────────────────────────────────────────\n const ribs: FishboneLayoutRib[] = [];\n const palette = opts?.palette ?? resolveFishboneTheme(\"default\").palette;\n const textBBoxes: FishboneBBox[] = [];\n\n const buildHalfRibs = (\n halfMajors: FishboneNode[],\n startIndex: number,\n half: \"top\" | \"bottom\",\n halfExtent: number\n ): void => {\n for (let i = 0; i < halfMajors.length; i++) {\n const major = halfMajors[i]!;\n const globalIdx = startIndex + i;\n const color = major.color ?? palette[globalIdx % palette.length]!;\n const spineX = firstRibX + i * colStep;\n\n // Aligned rib endpoint Y → same for all ribs in half.\n const endY = half === \"top\" ? spineY - halfExtent : spineY + halfExtent;\n const endX = spineX - halfExtent * ribSlope;\n\n // Header pill positioned along the rib's slope extension.\n // The rib direction: for every 1 unit of Y away from spine, X moves -ribSlope.\n const extraDist = D.headerGap + D.headerH / 2;\n const headerCenterY =\n half === \"top\" ? endY - extraDist : endY + extraDist;\n // Continue the slope: pill center X follows the same dx/dy as the rib.\n const headerCenterX = endX - extraDist * ribSlope;\n const headerW = Math.max(\n D.headerW,\n estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28\n );\n const headerX = headerCenterX - headerW / 2;\n const headerY = headerCenterY - D.headerH / 2;\n\n textBBoxes.push({\n x: headerX,\n y: headerY,\n w: headerW,\n h: D.headerH,\n });\n\n // Cause slots — cumulative along rib from spine outward.\n const causes: FishboneLayoutCause[] = [];\n let accum = FB_CONST.RIB_BASE_EXTENT_Y; // distance from spine to first slot center\n for (let s = 0; s < major.children.length; s++) {\n const child = major.children[s]!;\n const rowH =\n D.rowHeight + child.children.length * D.subRowHeight;\n // vertical offset for this slot (center of row)\n const slotOffset = accum + rowH / 2 - D.rowHeight / 2;\n const ribY =\n half === \"top\" ? spineY - slotOffset : spineY + slotOffset;\n const ribX = spineX - slotOffset * ribSlope;\n\n // Resolve cause direction for this slot.\n const causeDir: \"head\" | \"tail\" =\n causeSideSetting === \"tail\"\n ? \"tail\"\n : causeSideSetting === \"both\"\n ? s % 2 === 0\n ? \"head\"\n : \"tail\"\n : \"head\";\n\n const branchY = ribY;\n const branchX =\n causeDir === \"head\"\n ? ribX + FB_CONST.BRANCH_LEN\n : ribX - FB_CONST.BRANCH_LEN;\n const labelX =\n causeDir === \"head\"\n ? branchX + FB_CONST.LABEL_GAP\n : branchX - FB_CONST.LABEL_GAP;\n const labelY = branchY;\n const labelAnchor: \"start\" | \"end\" =\n causeDir === \"head\" ? \"start\" : \"end\";\n\n // Text bbox for mask\n const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? labelX - 2 : labelX - labelW - 2,\n y: labelY - FB_CONST.LABEL_FONT / 2 - 2,\n w: labelW + 4,\n h: FB_CONST.LABEL_FONT + 4,\n });\n\n // Sub-causes stack below the main label\n const subCauses: FishboneLayoutSubCause[] = [];\n for (let si = 0; si < child.children.length; si++) {\n const sub = child.children[si]!;\n const subY = labelY + (si + 1) * D.subRowHeight;\n const tickX1 =\n causeDir === \"head\" ? labelX + 2 : labelX - 2;\n const tickX2 =\n causeDir === \"head\"\n ? tickX1 + FB_CONST.SUB_TICK_LEN\n : tickX1 - FB_CONST.SUB_TICK_LEN;\n const subX =\n causeDir === \"head\" ? tickX2 + 4 : tickX2 - 4;\n subCauses.push({\n label: sub.label,\n x: subX,\n y: subY,\n tickX1,\n tickX2,\n tickY: subY,\n anchor: causeDir === \"head\" ? \"start\" : \"end\",\n });\n const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? subX - 2 : subX - subW - 2,\n y: subY - FB_CONST.SUB_FONT / 2 - 2,\n w: subW + 4,\n h: FB_CONST.SUB_FONT + 4,\n });\n }\n\n causes.push({\n label: child.label,\n ribIndex: globalIdx,\n slotIndex: s,\n ribX,\n ribY,\n branchX,\n branchY,\n labelX,\n labelY,\n labelAnchor,\n causeSide: causeDir,\n subCauses,\n });\n\n accum += rowH;\n }\n\n ribs.push({\n index: globalIdx,\n half,\n label: major.label,\n color,\n spineX,\n spineY,\n endX,\n endY,\n headerX,\n headerY,\n headerW,\n headerH: D.headerH,\n causes,\n });\n }\n };\n\n buildHalfRibs(topMajors, 0, \"top\", topHalfExtent);\n buildHalfRibs(botMajors, nTop, \"bottom\", botHalfExtent);\n\n // ── Head polygon (right-facing default) ─────────────────────\n const head = {\n x: headX,\n y: spineY,\n tipX: headTipXAdj,\n tipY: spineY,\n w: headEffectiveW,\n h: headEffectiveH,\n label: ast.effect,\n };\n\n // Effect label bbox (for mask around it — though usually effect sits in head\n // which has its own fill, we still add it so any crossing line punches out).\n textBBoxes.push({\n x: headX + 4,\n y: spineY - headEffectiveH / 2 + 4,\n w: headEffectiveW - 8,\n h: headEffectiveH - 8,\n });\n\n // Note: rtl (head-on-left) support: mirror transform applied in renderer\n // rather than recomputing coordinates — simpler and visually identical.\n\n return {\n width,\n height,\n orientation: ast.orientation,\n spineY,\n spineStartX,\n spineEndX,\n tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },\n tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },\n head,\n ribs,\n textBBoxes,\n title,\n };\n}\n\nfunction sumOrMin(arr: number[], min: number): number {\n if (arr.length === 0) return min;\n const s = arr.reduce((a, b) => a + b, 0);\n return Math.max(s, min);\n}\n","import type { FishboneAST } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n line as lineEl,\n rect,\n text as textEl,\n polygon,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { layoutFishbone, type FishboneLayoutResult, type FishboneBBox } from \"./layout\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\nconst CSS = `\n.sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fb-title { font: 600 16px sans-serif; fill: #111; }\n.sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }\n.sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }\n.sx-fb-head { stroke-width: 0.5; }\n.sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-rib { stroke-width: 1.5; fill: none; }\n.sx-fb-header-pill { stroke-width: 0.6; }\n.sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }\n.sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }\n.sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }\n.sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }\n`.trim();\n\nfunction lighten(hex: string, amount: number): string {\n // amount in [0, 1]; shifts toward white\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r + (255 - r) * amount);\n const gg = Math.round(g + (255 - g) * amount);\n const bb = Math.round(b + (255 - b) * amount);\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction darken(hex: string, amount: number): string {\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r * (1 - amount));\n const gg = Math.round(g * (1 - amount));\n const bb = Math.round(b * (1 - amount));\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\nfunction buildMask(id: string, w: number, h: number, bboxes: FishboneBBox[]): string {\n const base = rect({ x: 0, y: 0, width: w, height: h, fill: \"white\" });\n const holes = bboxes\n .map((b) =>\n rect({\n x: b.x,\n y: b.y,\n width: b.w,\n height: b.h,\n fill: \"black\",\n rx: 2,\n })\n )\n .join(\"\\n\");\n return el(\"mask\", { id, maskUnits: \"userSpaceOnUse\" }, [base, holes]);\n}\n\nfunction renderHead(layout: FishboneLayoutResult, ltr: boolean): string {\n const h = layout.head;\n const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);\n const leftX = ltr ? h.x : h.x;\n const rightX = ltr ? h.tipX : tipX;\n // Polygon pointing toward head direction\n const points = ltr\n ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}`\n : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;\n const fill = \"#faece7\";\n const stroke = \"#993c1d\";\n // Bias text toward the wide base (35% from base, 65% from tip) so it reads\n // balanced inside the tapering triangle rather than shifted toward the tip.\n const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;\n return group({ class: \"sx-fb-head-g\" }, [\n polygon({\n points,\n class: \"sx-fb-head\",\n fill,\n stroke,\n }),\n textEl(\n {\n x: textX,\n y: h.y,\n class: \"sx-fb-head-text\",\n fill: darken(stroke, 0.3),\n },\n h.label\n ),\n ]);\n}\n\nfunction renderRibs(layout: FishboneLayoutResult, maskUrl: string): string {\n const parts: string[] = [];\n for (const rib of layout.ribs) {\n const pillFill = lighten(rib.color, 0.82);\n const pillStroke = rib.color;\n const headerTextFill = darken(rib.color, 0.3);\n\n // Rib line (with mask to punch out text overlaps)\n parts.push(\n lineEl({\n x1: rib.spineX,\n y1: rib.spineY,\n x2: rib.endX,\n y2: rib.endY,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n\n // Extend the rib line to the pill center along the same slope.\n parts.push(\n lineEl({\n x1: rib.endX,\n y1: rib.endY,\n x2: rib.headerX + rib.headerW / 2,\n y2: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n })\n );\n\n // Header pill\n parts.push(\n rect({\n x: rib.headerX,\n y: rib.headerY,\n width: rib.headerW,\n height: rib.headerH,\n rx: 8,\n class: \"sx-fb-header-pill\",\n fill: pillFill,\n stroke: pillStroke,\n })\n );\n parts.push(\n textEl(\n {\n x: rib.headerX + rib.headerW / 2,\n y: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-header-text\",\n fill: headerTextFill,\n },\n rib.label\n )\n );\n\n // Branches + labels\n for (const cause of rib.causes) {\n parts.push(\n lineEl({\n x1: cause.ribX,\n y1: cause.ribY,\n x2: cause.branchX,\n y2: cause.branchY,\n class: \"sx-fb-branch\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n parts.push(\n textEl(\n {\n x: cause.labelX,\n y: cause.labelY,\n class: \"sx-fb-cause-label\",\n \"text-anchor\": cause.labelAnchor,\n },\n cause.label\n )\n );\n\n // Sub-causes (Level 2)\n for (const sub of cause.subCauses) {\n parts.push(\n lineEl({\n x1: sub.tickX1,\n y1: sub.tickY,\n x2: sub.tickX2,\n y2: sub.tickY,\n class: \"sx-fb-sub-tick\",\n stroke: rib.color,\n })\n );\n parts.push(\n textEl(\n {\n x: sub.x,\n y: sub.y,\n class: \"sx-fb-sub-label\",\n \"text-anchor\": sub.anchor,\n },\n sub.label\n )\n );\n }\n }\n }\n return group({ class: \"sx-fb-ribs\" }, parts);\n}\n\nexport function renderFishboneAST(ast: FishboneAST, options: { theme?: string } = {}): string {\n const themeName = options.theme ?? ast.metadata?.[\"theme\"] ?? \"default\";\n const tokens = resolveFishboneTheme(themeName);\n const layout = layoutFishbone(ast, { palette: tokens.palette });\n const ltr = layout.orientation !== \"rtl\";\n const maskId = `sx-fb-mask-${randomId()}`;\n const maskUrl = `url(#${maskId})`;\n\n const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);\n\n const spine = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.spineEndX,\n y2: layout.spineY,\n class: \"sx-fb-spine\",\n });\n\n const tailTop = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipTop.x,\n y2: layout.tailForkTipTop.y,\n class: \"sx-fb-tail\",\n });\n const tailBot = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipBot.x,\n y2: layout.tailForkTipBot.y,\n class: \"sx-fb-tail\",\n });\n\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 28,\n class: \"sx-fb-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title\n )\n : \"\";\n\n const head = renderHead(layout, ltr);\n const ribs = renderRibs(layout, maskUrl);\n\n const inner = [\n titleEl(layout.title ? `${layout.title} — Fishbone diagram` : \"Fishbone diagram\"),\n descEl(\n `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`\n ),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n tailTop,\n tailBot,\n spine,\n head,\n ribs,\n ];\n\n // For RTL (head on left), mirror horizontally via transform.\n if (!ltr) {\n const mirrored = group(\n {\n transform: `translate(${layout.width} 0) scale(-1 1)`,\n },\n [tailTop, tailBot, spine, head, ribs]\n );\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n [\n titleEl(layout.title ?? \"Fishbone\"),\n descEl(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n mirrored,\n ]\n );\n }\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n inner\n );\n}\n\nexport function renderFishbone(text: string, options: { theme?: string } = {}): string {\n const ast = parseFishboneDSL(text);\n return renderFishboneAST(ast, options);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { renderFishbone } from \"./renderer\";\n\nexport const fishbone: DiagramPlugin = {\n type: \"fishbone\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fishbone\");\n },\n render(text: string): string {\n return renderFishbone(text);\n },\n};\n\nexport { parseFishboneDSL } from \"./parser\";\nexport { renderFishbone, renderFishboneAST } from \"./renderer\";\nexport { layoutFishbone, FB_CONST } from \"./layout\";\n"]}
|