schematex 0.1.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.
Files changed (181) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +379 -0
  3. package/dist/chunk-2MQWZ2XY.cjs +453 -0
  4. package/dist/chunk-2MQWZ2XY.cjs.map +1 -0
  5. package/dist/chunk-2UKC6ZCY.cjs +1803 -0
  6. package/dist/chunk-2UKC6ZCY.cjs.map +1 -0
  7. package/dist/chunk-34X3ZJ6E.cjs +783 -0
  8. package/dist/chunk-34X3ZJ6E.cjs.map +1 -0
  9. package/dist/chunk-3FTUWAXK.cjs +1220 -0
  10. package/dist/chunk-3FTUWAXK.cjs.map +1 -0
  11. package/dist/chunk-3J7TFUOC.js +745 -0
  12. package/dist/chunk-3J7TFUOC.js.map +1 -0
  13. package/dist/chunk-47ZC6EMJ.js +1009 -0
  14. package/dist/chunk-47ZC6EMJ.js.map +1 -0
  15. package/dist/chunk-4DBRNOPA.cjs +750 -0
  16. package/dist/chunk-4DBRNOPA.cjs.map +1 -0
  17. package/dist/chunk-4G7ZIBHN.js +778 -0
  18. package/dist/chunk-4G7ZIBHN.js.map +1 -0
  19. package/dist/chunk-5C7DPDHQ.js +1321 -0
  20. package/dist/chunk-5C7DPDHQ.js.map +1 -0
  21. package/dist/chunk-ADOXGKAK.js +1251 -0
  22. package/dist/chunk-ADOXGKAK.js.map +1 -0
  23. package/dist/chunk-BE5HNDA5.cjs +874 -0
  24. package/dist/chunk-BE5HNDA5.cjs.map +1 -0
  25. package/dist/chunk-CZRM7LT7.js +889 -0
  26. package/dist/chunk-CZRM7LT7.js.map +1 -0
  27. package/dist/chunk-D4JTSPOL.js +1795 -0
  28. package/dist/chunk-D4JTSPOL.js.map +1 -0
  29. package/dist/chunk-DS47NTWZ.cjs +1034 -0
  30. package/dist/chunk-DS47NTWZ.cjs.map +1 -0
  31. package/dist/chunk-FDLZEKEB.js +449 -0
  32. package/dist/chunk-FDLZEKEB.js.map +1 -0
  33. package/dist/chunk-FGPTCDUT.cjs +1851 -0
  34. package/dist/chunk-FGPTCDUT.cjs.map +1 -0
  35. package/dist/chunk-HDKDQAEQ.cjs +86 -0
  36. package/dist/chunk-HDKDQAEQ.cjs.map +1 -0
  37. package/dist/chunk-IX554O5K.js +346 -0
  38. package/dist/chunk-IX554O5K.js.map +1 -0
  39. package/dist/chunk-KLJEK547.js +71 -0
  40. package/dist/chunk-KLJEK547.js.map +1 -0
  41. package/dist/chunk-LMFSHK45.js +1028 -0
  42. package/dist/chunk-LMFSHK45.js.map +1 -0
  43. package/dist/chunk-MDICUK6F.cjs +1258 -0
  44. package/dist/chunk-MDICUK6F.cjs.map +1 -0
  45. package/dist/chunk-N7KOXOMX.cjs +363 -0
  46. package/dist/chunk-N7KOXOMX.cjs.map +1 -0
  47. package/dist/chunk-NYCIK4SU.cjs +775 -0
  48. package/dist/chunk-NYCIK4SU.cjs.map +1 -0
  49. package/dist/chunk-PDPHRZZT.js +770 -0
  50. package/dist/chunk-PDPHRZZT.js.map +1 -0
  51. package/dist/chunk-ROFLJ74T.js +1212 -0
  52. package/dist/chunk-ROFLJ74T.js.map +1 -0
  53. package/dist/chunk-S6BK5DB6.cjs +845 -0
  54. package/dist/chunk-S6BK5DB6.cjs.map +1 -0
  55. package/dist/chunk-U4I37IBN.js +874 -0
  56. package/dist/chunk-U4I37IBN.js.map +1 -0
  57. package/dist/chunk-U5GGE6PJ.js +839 -0
  58. package/dist/chunk-U5GGE6PJ.js.map +1 -0
  59. package/dist/chunk-UHLYS3W5.cjs +1015 -0
  60. package/dist/chunk-UHLYS3W5.cjs.map +1 -0
  61. package/dist/chunk-URSKIHSY.cjs +881 -0
  62. package/dist/chunk-URSKIHSY.cjs.map +1 -0
  63. package/dist/chunk-V6WO7RK7.cjs +1056 -0
  64. package/dist/chunk-V6WO7RK7.cjs.map +1 -0
  65. package/dist/chunk-VFQCTXOX.js +869 -0
  66. package/dist/chunk-VFQCTXOX.js.map +1 -0
  67. package/dist/chunk-XQ52ICHU.cjs +895 -0
  68. package/dist/chunk-XQ52ICHU.cjs.map +1 -0
  69. package/dist/chunk-XX4BKS7Y.js +1051 -0
  70. package/dist/chunk-XX4BKS7Y.js.map +1 -0
  71. package/dist/chunk-XXU36667.js +1844 -0
  72. package/dist/chunk-XXU36667.js.map +1 -0
  73. package/dist/chunk-ZX7QKZK2.cjs +1326 -0
  74. package/dist/chunk-ZX7QKZK2.cjs.map +1 -0
  75. package/dist/diagrams/blockdiagram/index.cjs +25 -0
  76. package/dist/diagrams/blockdiagram/index.cjs.map +1 -0
  77. package/dist/diagrams/blockdiagram/index.d.cts +67 -0
  78. package/dist/diagrams/blockdiagram/index.d.ts +67 -0
  79. package/dist/diagrams/blockdiagram/index.js +4 -0
  80. package/dist/diagrams/blockdiagram/index.js.map +1 -0
  81. package/dist/diagrams/circuit/index.cjs +34 -0
  82. package/dist/diagrams/circuit/index.cjs.map +1 -0
  83. package/dist/diagrams/circuit/index.d.cts +138 -0
  84. package/dist/diagrams/circuit/index.d.ts +138 -0
  85. package/dist/diagrams/circuit/index.js +5 -0
  86. package/dist/diagrams/circuit/index.js.map +1 -0
  87. package/dist/diagrams/ecomap/index.cjs +30 -0
  88. package/dist/diagrams/ecomap/index.cjs.map +1 -0
  89. package/dist/diagrams/ecomap/index.d.cts +15 -0
  90. package/dist/diagrams/ecomap/index.d.ts +15 -0
  91. package/dist/diagrams/ecomap/index.js +5 -0
  92. package/dist/diagrams/ecomap/index.js.map +1 -0
  93. package/dist/diagrams/entity/index.cjs +26 -0
  94. package/dist/diagrams/entity/index.cjs.map +1 -0
  95. package/dist/diagrams/entity/index.d.cts +54 -0
  96. package/dist/diagrams/entity/index.d.ts +54 -0
  97. package/dist/diagrams/entity/index.js +5 -0
  98. package/dist/diagrams/entity/index.js.map +1 -0
  99. package/dist/diagrams/fishbone/index.cjs +34 -0
  100. package/dist/diagrams/fishbone/index.cjs.map +1 -0
  101. package/dist/diagrams/fishbone/index.d.cts +185 -0
  102. package/dist/diagrams/fishbone/index.d.ts +185 -0
  103. package/dist/diagrams/fishbone/index.js +5 -0
  104. package/dist/diagrams/fishbone/index.js.map +1 -0
  105. package/dist/diagrams/flowchart/index.cjs +34 -0
  106. package/dist/diagrams/flowchart/index.cjs.map +1 -0
  107. package/dist/diagrams/flowchart/index.d.cts +2 -0
  108. package/dist/diagrams/flowchart/index.d.ts +2 -0
  109. package/dist/diagrams/flowchart/index.js +5 -0
  110. package/dist/diagrams/flowchart/index.js.map +1 -0
  111. package/dist/diagrams/genogram/index.cjs +38 -0
  112. package/dist/diagrams/genogram/index.cjs.map +1 -0
  113. package/dist/diagrams/genogram/index.d.cts +20 -0
  114. package/dist/diagrams/genogram/index.d.ts +20 -0
  115. package/dist/diagrams/genogram/index.js +5 -0
  116. package/dist/diagrams/genogram/index.js.map +1 -0
  117. package/dist/diagrams/ladder/index.cjs +26 -0
  118. package/dist/diagrams/ladder/index.cjs.map +1 -0
  119. package/dist/diagrams/ladder/index.d.cts +49 -0
  120. package/dist/diagrams/ladder/index.d.ts +49 -0
  121. package/dist/diagrams/ladder/index.js +5 -0
  122. package/dist/diagrams/ladder/index.js.map +1 -0
  123. package/dist/diagrams/logic/index.cjs +26 -0
  124. package/dist/diagrams/logic/index.cjs.map +1 -0
  125. package/dist/diagrams/logic/index.d.cts +73 -0
  126. package/dist/diagrams/logic/index.d.ts +73 -0
  127. package/dist/diagrams/logic/index.js +5 -0
  128. package/dist/diagrams/logic/index.js.map +1 -0
  129. package/dist/diagrams/orgchart/index.cjs +30 -0
  130. package/dist/diagrams/orgchart/index.cjs.map +1 -0
  131. package/dist/diagrams/orgchart/index.d.cts +100 -0
  132. package/dist/diagrams/orgchart/index.d.ts +100 -0
  133. package/dist/diagrams/orgchart/index.js +5 -0
  134. package/dist/diagrams/orgchart/index.js.map +1 -0
  135. package/dist/diagrams/pedigree/index.cjs +30 -0
  136. package/dist/diagrams/pedigree/index.cjs.map +1 -0
  137. package/dist/diagrams/pedigree/index.d.cts +15 -0
  138. package/dist/diagrams/pedigree/index.d.ts +15 -0
  139. package/dist/diagrams/pedigree/index.js +5 -0
  140. package/dist/diagrams/pedigree/index.js.map +1 -0
  141. package/dist/diagrams/phylo/index.cjs +30 -0
  142. package/dist/diagrams/phylo/index.cjs.map +1 -0
  143. package/dist/diagrams/phylo/index.d.cts +32 -0
  144. package/dist/diagrams/phylo/index.d.ts +32 -0
  145. package/dist/diagrams/phylo/index.js +5 -0
  146. package/dist/diagrams/phylo/index.js.map +1 -0
  147. package/dist/diagrams/sld/index.cjs +26 -0
  148. package/dist/diagrams/sld/index.cjs.map +1 -0
  149. package/dist/diagrams/sld/index.d.cts +58 -0
  150. package/dist/diagrams/sld/index.d.ts +58 -0
  151. package/dist/diagrams/sld/index.js +5 -0
  152. package/dist/diagrams/sld/index.js.map +1 -0
  153. package/dist/diagrams/sociogram/index.cjs +26 -0
  154. package/dist/diagrams/sociogram/index.cjs.map +1 -0
  155. package/dist/diagrams/sociogram/index.d.cts +76 -0
  156. package/dist/diagrams/sociogram/index.d.ts +76 -0
  157. package/dist/diagrams/sociogram/index.js +5 -0
  158. package/dist/diagrams/sociogram/index.js.map +1 -0
  159. package/dist/diagrams/timing/index.cjs +21 -0
  160. package/dist/diagrams/timing/index.cjs.map +1 -0
  161. package/dist/diagrams/timing/index.d.cts +9 -0
  162. package/dist/diagrams/timing/index.d.ts +9 -0
  163. package/dist/diagrams/timing/index.js +4 -0
  164. package/dist/diagrams/timing/index.js.map +1 -0
  165. package/dist/diagrams/venn/index.cjs +38 -0
  166. package/dist/diagrams/venn/index.cjs.map +1 -0
  167. package/dist/diagrams/venn/index.d.cts +69 -0
  168. package/dist/diagrams/venn/index.d.ts +69 -0
  169. package/dist/diagrams/venn/index.js +5 -0
  170. package/dist/diagrams/venn/index.js.map +1 -0
  171. package/dist/index-BSlza1YY.d.ts +150 -0
  172. package/dist/index-BXefHVce.d.cts +150 -0
  173. package/dist/index.cjs +2033 -0
  174. package/dist/index.cjs.map +1 -0
  175. package/dist/index.d.cts +29 -0
  176. package/dist/index.d.ts +29 -0
  177. package/dist/index.js +1944 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/types-DqfcYkcY.d.cts +741 -0
  180. package/dist/types-DqfcYkcY.d.ts +741 -0
  181. package/package.json +163 -0
@@ -0,0 +1,881 @@
1
+ 'use strict';
2
+
3
+ var chunkN7KOXOMX_cjs = require('./chunk-N7KOXOMX.cjs');
4
+ var chunkHDKDQAEQ_cjs = require('./chunk-HDKDQAEQ.cjs');
5
+
6
+ // src/diagrams/fishbone/parser.ts
7
+ var FishboneParseError = class extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "FishboneParseError";
11
+ }
12
+ };
13
+ var SLOPE_PRESETS = {
14
+ gentle: 0.45,
15
+ normal: 0.6,
16
+ steep: 0.75
17
+ };
18
+ function parseFishboneDSL(text2) {
19
+ const rawLines = text2.split(/\r?\n/);
20
+ let title2;
21
+ let effect = "";
22
+ let orientation = "ltr";
23
+ let width;
24
+ let height;
25
+ let sides;
26
+ let ribSlope;
27
+ let density;
28
+ let causeSide;
29
+ const categories = [];
30
+ const causesByCategory = /* @__PURE__ */ new Map();
31
+ let lastLevel1 = null;
32
+ let headerSeen = false;
33
+ const getCat = (id) => categories.find((c) => c.id === id || c.label === id);
34
+ for (let i = 0; i < rawLines.length; i++) {
35
+ const raw = rawLines[i] ?? "";
36
+ const line2 = stripComment(raw).trimEnd();
37
+ if (!line2.trim()) continue;
38
+ const indent = countIndent(raw);
39
+ const trimmed = line2.trim();
40
+ if (!headerSeen && /^fishbone\b/i.test(trimmed)) {
41
+ const m = trimmed.match(/^fishbone\s*:?\s*(.*)$/i);
42
+ if (m && m[1]) title2 = stripQuotes(m[1]);
43
+ headerSeen = true;
44
+ continue;
45
+ }
46
+ if (indent >= 2 && trimmed.startsWith("-")) {
47
+ if (!lastLevel1) {
48
+ throw new FishboneParseError(
49
+ `Sub-cause at line ${i + 1} has no preceding Level-1 cause: "${trimmed}"`
50
+ );
51
+ }
52
+ const subText = stripQuotes(trimmed.slice(1).trim());
53
+ if (!subText) continue;
54
+ lastLevel1.children.push({ label: subText, children: [] });
55
+ continue;
56
+ }
57
+ if (/^effect\b/i.test(trimmed)) {
58
+ const m = trimmed.match(/^effect\s*:?\s*(.*)$/i);
59
+ if (m) effect = stripQuotes(m[1] ?? "");
60
+ continue;
61
+ }
62
+ if (/^config\b/i.test(trimmed)) {
63
+ const m = trimmed.match(/^config\s+([a-zA-Z]+)\s*=\s*(.+)$/i);
64
+ if (m) {
65
+ const key = m[1].toLowerCase();
66
+ const val = stripQuotes(m[2].trim());
67
+ if (key === "direction") {
68
+ orientation = val === "left" || val === "rtl" ? "rtl" : "ltr";
69
+ } else if (key === "width") {
70
+ const n = Number(val);
71
+ if (Number.isFinite(n)) width = n;
72
+ } else if (key === "height") {
73
+ const n = Number(val);
74
+ if (Number.isFinite(n)) height = n;
75
+ } else if (key === "sides") {
76
+ const v = val.toLowerCase();
77
+ if (v === "both" || v === "top" || v === "bottom") sides = v;
78
+ } else if (key === "slope" || key === "ribslope") {
79
+ const preset = SLOPE_PRESETS[val.toLowerCase()];
80
+ if (preset !== void 0) ribSlope = preset;
81
+ else {
82
+ const n = Number(val);
83
+ if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;
84
+ }
85
+ } else if (key === "density") {
86
+ const v = val.toLowerCase();
87
+ if (v === "compact" || v === "normal" || v === "spacious") density = v;
88
+ } else if (key === "causeside" || key === "cause-side") {
89
+ const v = val.toLowerCase();
90
+ if (v === "head" || v === "tail" || v === "both") causeSide = v;
91
+ }
92
+ }
93
+ continue;
94
+ }
95
+ if (/^category\b/i.test(trimmed)) {
96
+ const compact = trimmed.match(/^category\s+([^:]+?)\s*:\s*(.+)$/i);
97
+ const structured = trimmed.match(
98
+ /^category\s+([a-zA-Z][\w-]*)\s+("[^"]*"|[^\s[]+)(?:\s*(\[.*\]))?\s*$/i
99
+ );
100
+ if (structured) {
101
+ const id = structured[1];
102
+ const label = stripQuotes(structured[2]);
103
+ const props = parseProps(structured[3] ?? "");
104
+ if (!getCat(id)) {
105
+ const sideProp = props["side"]?.toLowerCase();
106
+ const side = sideProp === "top" || sideProp === "bottom" ? sideProp : void 0;
107
+ const orderProp = props["order"];
108
+ const orderNum = orderProp !== void 0 ? Number(orderProp) : NaN;
109
+ const order = Number.isFinite(orderNum) ? orderNum : void 0;
110
+ categories.push({ id, label, color: props["color"], side, order });
111
+ causesByCategory.set(id, []);
112
+ }
113
+ lastLevel1 = null;
114
+ continue;
115
+ }
116
+ if (compact) {
117
+ const label = stripQuotes(compact[1].trim());
118
+ const id = slugify(label);
119
+ const rest = compact[2].trim();
120
+ if (!getCat(id)) {
121
+ categories.push({ id, label });
122
+ causesByCategory.set(id, []);
123
+ }
124
+ const bucket = causesByCategory.get(id);
125
+ for (const part of rest.split(/[;,]/)) {
126
+ const txt = stripQuotes(part.trim());
127
+ if (txt) {
128
+ const node = { label: txt, children: [] };
129
+ bucket.push(node);
130
+ lastLevel1 = node;
131
+ }
132
+ }
133
+ continue;
134
+ }
135
+ }
136
+ const causeMatch = trimmed.match(/^([a-zA-Z][\w-]*)\s*:\s*(.+)$/);
137
+ if (causeMatch) {
138
+ const catId = causeMatch[1];
139
+ const cat = getCat(catId);
140
+ if (!cat) {
141
+ throw new FishboneParseError(
142
+ `Unknown category "${catId}" at line ${i + 1}. Declare with \`category ${catId} "..."\` first.`
143
+ );
144
+ }
145
+ const bucket = causesByCategory.get(cat.id);
146
+ const rest = causeMatch[2].trim();
147
+ const { text: causeText } = splitTrailingProps(rest);
148
+ const label = stripQuotes(causeText);
149
+ if (!label) continue;
150
+ const node = { label, children: [] };
151
+ bucket.push(node);
152
+ lastLevel1 = node;
153
+ continue;
154
+ }
155
+ }
156
+ if (!effect) {
157
+ effect = title2 ?? "";
158
+ }
159
+ if (categories.length === 0) {
160
+ throw new FishboneParseError(
161
+ "Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md."
162
+ );
163
+ }
164
+ const majors = categories.map((c) => ({
165
+ label: c.label,
166
+ color: c.color,
167
+ children: causesByCategory.get(c.id) ?? [],
168
+ side: c.side,
169
+ order: c.order
170
+ }));
171
+ return {
172
+ type: "fishbone",
173
+ title: title2,
174
+ effect,
175
+ majors,
176
+ orientation,
177
+ width,
178
+ height,
179
+ sides,
180
+ ribSlope,
181
+ density,
182
+ causeSide
183
+ };
184
+ }
185
+ function stripComment(s) {
186
+ let out = "";
187
+ let inQuote = false;
188
+ for (const ch of s) {
189
+ if (ch === '"') inQuote = !inQuote;
190
+ if (ch === "#" && !inQuote) break;
191
+ out += ch;
192
+ }
193
+ return out;
194
+ }
195
+ function stripQuotes(v) {
196
+ const t = v.trim();
197
+ if (t.length >= 2 && t.startsWith('"') && t.endsWith('"')) return t.slice(1, -1);
198
+ return t;
199
+ }
200
+ function countIndent(raw) {
201
+ let n = 0;
202
+ for (const ch of raw) {
203
+ if (ch === " ") n += 1;
204
+ else if (ch === " ") n += 2;
205
+ else break;
206
+ }
207
+ return n;
208
+ }
209
+ function slugify(s) {
210
+ return s.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g, "-").replace(/^-+|-+$/g, "") || "cat";
211
+ }
212
+ function splitTrailingProps(s) {
213
+ const idx = s.lastIndexOf("[");
214
+ if (idx < 0 || !s.trimEnd().endsWith("]")) return { text: s, props: {} };
215
+ const text2 = s.slice(0, idx).trim();
216
+ const props = parseProps(s.slice(idx));
217
+ return { text: text2, props };
218
+ }
219
+ function parseProps(raw) {
220
+ const out = {};
221
+ const m = raw.match(/^\[(.*)\]$/s);
222
+ if (!m) return out;
223
+ const inside = m[1];
224
+ for (const part of splitTopLevelCommas(inside)) {
225
+ const [k, ...rest] = part.split(":");
226
+ if (!k || rest.length === 0) continue;
227
+ out[k.trim()] = stripQuotes(rest.join(":").trim());
228
+ }
229
+ return out;
230
+ }
231
+ function splitTopLevelCommas(inside) {
232
+ const parts = [];
233
+ let depth = 0;
234
+ let buf = "";
235
+ let inQuote = false;
236
+ for (const ch of inside) {
237
+ if (ch === '"') inQuote = !inQuote;
238
+ if (!inQuote) {
239
+ if (ch === "[") depth += 1;
240
+ else if (ch === "]") depth -= 1;
241
+ else if (ch === "," && depth === 0) {
242
+ parts.push(buf);
243
+ buf = "";
244
+ continue;
245
+ }
246
+ }
247
+ buf += ch;
248
+ }
249
+ if (buf.trim()) parts.push(buf);
250
+ return parts;
251
+ }
252
+
253
+ // src/diagrams/fishbone/layout.ts
254
+ var FB_CONST = {
255
+ PADDING: 40,
256
+ HEAD_W: 90,
257
+ HEAD_H: 80,
258
+ TAIL_LEN: 40,
259
+ SPINE_OFFSET_FROM_TAIL: 40,
260
+ // distance from canvas left to spine start
261
+ RIB_SLOPE: 0.6,
262
+ // dx/dy — consistent across all ribs
263
+ RIB_BASE_EXTENT_Y: 30,
264
+ // vertical distance of first slot from spine
265
+ ROW_HEIGHT: 30,
266
+ // vertical gap between Level-1 slots
267
+ SUB_ROW_HEIGHT: 17,
268
+ BRANCH_LEN: 30,
269
+ // horizontal Level-1 branch length
270
+ SUB_TICK_LEN: 10,
271
+ HEADER_W: 132,
272
+ HEADER_H: 34,
273
+ HEADER_GAP: 12,
274
+ // gap between rib endpoint and header pill
275
+ COL_STEP: 130,
276
+ // spine x gap between adjacent ribs
277
+ COL_FIRST_OFFSET: 170,
278
+ // first rib's distance from spine start
279
+ LABEL_FONT: 12,
280
+ HEADER_FONT: 14,
281
+ SUB_FONT: 11,
282
+ EFFECT_FONT: 14,
283
+ LABEL_GAP: 6,
284
+ // gap from branch end to label
285
+ MIN_ROWS_PER_HALF: 4,
286
+ // aesthetic minimum rib length
287
+ COL_GAP_BETWEEN_LABELS: 18,
288
+ // min horizontal breathing between adjacent ribs' label columns
289
+ HEAD_PAD_X: 44,
290
+ // total horizontal padding around effect text inside head
291
+ HEAD_PAD_Y: 20,
292
+ // min vertical padding around effect text inside head
293
+ TITLE_CLEARANCE: 24
294
+ // extra gap between title baseline and top header pill
295
+ };
296
+ function estimateTextWidth(s, fontSize) {
297
+ let w = 0;
298
+ for (const ch of s) {
299
+ const cp = ch.codePointAt(0) ?? 0;
300
+ const isWide = cp >= 12288 && cp <= 12543 || cp >= 13312 && cp <= 40959 || cp >= 44032 && cp <= 55215 || cp >= 65280 && cp <= 65519;
301
+ w += fontSize * (isWide ? 1 : 0.56);
302
+ }
303
+ return w;
304
+ }
305
+ var DENSITY = {
306
+ compact: {
307
+ rowHeight: 24,
308
+ subRowHeight: 15,
309
+ colStep: 110,
310
+ headerW: 118,
311
+ headerH: 30,
312
+ headerGap: 8,
313
+ minRowsPerHalf: 3,
314
+ colFirstOffset: 140
315
+ },
316
+ normal: {
317
+ rowHeight: 30,
318
+ subRowHeight: 17,
319
+ colStep: 130,
320
+ headerW: 132,
321
+ headerH: 34,
322
+ headerGap: 12,
323
+ minRowsPerHalf: 4,
324
+ colFirstOffset: 170
325
+ },
326
+ spacious: {
327
+ rowHeight: 36,
328
+ subRowHeight: 19,
329
+ colStep: 150,
330
+ headerW: 148,
331
+ headerH: 38,
332
+ headerGap: 16,
333
+ minRowsPerHalf: 5,
334
+ colFirstOffset: 200
335
+ }
336
+ };
337
+ function layoutFishbone(ast, opts) {
338
+ const majors = ast.majors.length > 0 ? ast.majors : [];
339
+ majors.length;
340
+ const density = ast.density ?? "normal";
341
+ const D = DENSITY[density];
342
+ const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;
343
+ const causeSideSetting = ast.causeSide ?? "head";
344
+ const sides = ast.sides ?? "both";
345
+ const topMajors = [];
346
+ const botMajors = [];
347
+ if (sides === "top" || sides === "bottom") {
348
+ const bucket = sides === "top" ? topMajors : botMajors;
349
+ for (const m of majors) {
350
+ if (m.side === "top") topMajors.push(m);
351
+ else if (m.side === "bottom") botMajors.push(m);
352
+ else bucket.push(m);
353
+ }
354
+ } else {
355
+ const autoPool = [];
356
+ for (const m of majors) {
357
+ if (m.side === "top") topMajors.push(m);
358
+ else if (m.side === "bottom") botMajors.push(m);
359
+ else autoPool.push(m);
360
+ }
361
+ for (const m of autoPool) {
362
+ if (topMajors.length <= botMajors.length) topMajors.push(m);
363
+ else botMajors.push(m);
364
+ }
365
+ }
366
+ const byOrder = (a, b) => {
367
+ const ao = a.order ?? Number.POSITIVE_INFINITY;
368
+ const bo = b.order ?? Number.POSITIVE_INFINITY;
369
+ return ao - bo;
370
+ };
371
+ topMajors.sort(byOrder);
372
+ botMajors.sort(byOrder);
373
+ const nTop = topMajors.length;
374
+ const nBot = botMajors.length;
375
+ const ribRowHeights = (m) => {
376
+ if (m.children.length === 0) return [];
377
+ return m.children.map(
378
+ (c) => D.rowHeight + c.children.length * D.subRowHeight
379
+ );
380
+ };
381
+ const topExtents = topMajors.map(
382
+ (m) => sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)
383
+ );
384
+ const botExtents = botMajors.map(
385
+ (m) => sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)
386
+ );
387
+ const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);
388
+ const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;
389
+ const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));
390
+ const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;
391
+ const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));
392
+ const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;
393
+ const topHalfExtent = nTop > 0 ? Math.max(
394
+ minHalfFromHead,
395
+ D.minRowsPerHalf * D.rowHeight,
396
+ ...topExtents.length ? topExtents : [0]
397
+ ) : sides === "bottom" ? Math.max(minHalfFromHead, 0) : 0;
398
+ const botHalfExtent = nBot > 0 ? Math.max(
399
+ minHalfFromHead,
400
+ D.minRowsPerHalf * D.rowHeight,
401
+ ...botExtents.length ? botExtents : [0]
402
+ ) : sides === "top" ? Math.max(minHalfFromHead, 0) : 0;
403
+ const nCols = Math.max(nTop, nBot, 1);
404
+ let maxCauseLabelW = 0;
405
+ let maxSubLabelW = 0;
406
+ for (const m of majors) {
407
+ for (const c of m.children) {
408
+ maxCauseLabelW = Math.max(
409
+ maxCauseLabelW,
410
+ estimateTextWidth(c.label, FB_CONST.LABEL_FONT)
411
+ );
412
+ for (const sc of c.children) {
413
+ maxSubLabelW = Math.max(
414
+ maxSubLabelW,
415
+ estimateTextWidth(sc.label, FB_CONST.SUB_FONT)
416
+ );
417
+ }
418
+ }
419
+ }
420
+ const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;
421
+ const labelColW = Math.max(maxCauseLabelW, subExtent);
422
+ const labelExtentsPerCol = causeSideSetting === "both" ? 2 : 1;
423
+ const minColStep = FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;
424
+ const colStep = Math.max(
425
+ D.colStep,
426
+ Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))
427
+ );
428
+ const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;
429
+ const firstRibX = spineStartX + D.colFirstOffset;
430
+ const lastRibX = firstRibX + (nCols - 1) * colStep;
431
+ const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);
432
+ const headX = spineEndX;
433
+ const headTipXAdj = headX + headEffectiveW;
434
+ const width = ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);
435
+ const title2 = ast.title;
436
+ const titleReserve = title2 ? FB_CONST.TITLE_CLEARANCE + 20 : 0;
437
+ const spineY = FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;
438
+ const height = ast.height ?? Math.ceil(
439
+ spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING
440
+ );
441
+ const ribs = [];
442
+ const palette = opts?.palette ?? chunkN7KOXOMX_cjs.resolveFishboneTheme("default").palette;
443
+ const textBBoxes = [];
444
+ const buildHalfRibs = (halfMajors, startIndex, half, halfExtent) => {
445
+ for (let i = 0; i < halfMajors.length; i++) {
446
+ const major = halfMajors[i];
447
+ const globalIdx = startIndex + i;
448
+ const color = major.color ?? palette[globalIdx % palette.length];
449
+ const spineX = firstRibX + i * colStep;
450
+ const endY = half === "top" ? spineY - halfExtent : spineY + halfExtent;
451
+ const endX = spineX - halfExtent * ribSlope;
452
+ const extraDist = D.headerGap + D.headerH / 2;
453
+ const headerCenterY = half === "top" ? endY - extraDist : endY + extraDist;
454
+ const headerCenterX = endX - extraDist * ribSlope;
455
+ const headerW = Math.max(
456
+ D.headerW,
457
+ estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28
458
+ );
459
+ const headerX = headerCenterX - headerW / 2;
460
+ const headerY = headerCenterY - D.headerH / 2;
461
+ textBBoxes.push({
462
+ x: headerX,
463
+ y: headerY,
464
+ w: headerW,
465
+ h: D.headerH
466
+ });
467
+ const causes = [];
468
+ let accum = FB_CONST.RIB_BASE_EXTENT_Y;
469
+ for (let s = 0; s < major.children.length; s++) {
470
+ const child = major.children[s];
471
+ const rowH = D.rowHeight + child.children.length * D.subRowHeight;
472
+ const slotOffset = accum + rowH / 2 - D.rowHeight / 2;
473
+ const ribY = half === "top" ? spineY - slotOffset : spineY + slotOffset;
474
+ const ribX = spineX - slotOffset * ribSlope;
475
+ const causeDir = causeSideSetting === "tail" ? "tail" : causeSideSetting === "both" ? s % 2 === 0 ? "head" : "tail" : "head";
476
+ const branchY = ribY;
477
+ const branchX = causeDir === "head" ? ribX + FB_CONST.BRANCH_LEN : ribX - FB_CONST.BRANCH_LEN;
478
+ const labelX = causeDir === "head" ? branchX + FB_CONST.LABEL_GAP : branchX - FB_CONST.LABEL_GAP;
479
+ const labelY = branchY;
480
+ const labelAnchor = causeDir === "head" ? "start" : "end";
481
+ const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);
482
+ textBBoxes.push({
483
+ x: causeDir === "head" ? labelX - 2 : labelX - labelW - 2,
484
+ y: labelY - FB_CONST.LABEL_FONT / 2 - 2,
485
+ w: labelW + 4,
486
+ h: FB_CONST.LABEL_FONT + 4
487
+ });
488
+ const subCauses = [];
489
+ for (let si = 0; si < child.children.length; si++) {
490
+ const sub = child.children[si];
491
+ const subY = labelY + (si + 1) * D.subRowHeight;
492
+ const tickX1 = causeDir === "head" ? labelX + 2 : labelX - 2;
493
+ const tickX2 = causeDir === "head" ? tickX1 + FB_CONST.SUB_TICK_LEN : tickX1 - FB_CONST.SUB_TICK_LEN;
494
+ const subX = causeDir === "head" ? tickX2 + 4 : tickX2 - 4;
495
+ subCauses.push({
496
+ label: sub.label,
497
+ x: subX,
498
+ y: subY,
499
+ tickX1,
500
+ tickX2,
501
+ tickY: subY,
502
+ anchor: causeDir === "head" ? "start" : "end"
503
+ });
504
+ const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);
505
+ textBBoxes.push({
506
+ x: causeDir === "head" ? subX - 2 : subX - subW - 2,
507
+ y: subY - FB_CONST.SUB_FONT / 2 - 2,
508
+ w: subW + 4,
509
+ h: FB_CONST.SUB_FONT + 4
510
+ });
511
+ }
512
+ causes.push({
513
+ label: child.label,
514
+ ribIndex: globalIdx,
515
+ slotIndex: s,
516
+ ribX,
517
+ ribY,
518
+ branchX,
519
+ branchY,
520
+ labelX,
521
+ labelY,
522
+ labelAnchor,
523
+ causeSide: causeDir,
524
+ subCauses
525
+ });
526
+ accum += rowH;
527
+ }
528
+ ribs.push({
529
+ index: globalIdx,
530
+ half,
531
+ label: major.label,
532
+ color,
533
+ spineX,
534
+ spineY,
535
+ endX,
536
+ endY,
537
+ headerX,
538
+ headerY,
539
+ headerW,
540
+ headerH: D.headerH,
541
+ causes
542
+ });
543
+ }
544
+ };
545
+ buildHalfRibs(topMajors, 0, "top", topHalfExtent);
546
+ buildHalfRibs(botMajors, nTop, "bottom", botHalfExtent);
547
+ const head = {
548
+ x: headX,
549
+ y: spineY,
550
+ tipX: headTipXAdj,
551
+ tipY: spineY,
552
+ w: headEffectiveW,
553
+ h: headEffectiveH,
554
+ label: ast.effect
555
+ };
556
+ textBBoxes.push({
557
+ x: headX + 4,
558
+ y: spineY - headEffectiveH / 2 + 4,
559
+ w: headEffectiveW - 8,
560
+ h: headEffectiveH - 8
561
+ });
562
+ return {
563
+ width,
564
+ height,
565
+ orientation: ast.orientation,
566
+ spineY,
567
+ spineStartX,
568
+ spineEndX,
569
+ tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },
570
+ tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },
571
+ head,
572
+ ribs,
573
+ textBBoxes,
574
+ title: title2
575
+ };
576
+ }
577
+ function sumOrMin(arr, min) {
578
+ if (arr.length === 0) return min;
579
+ const s = arr.reduce((a, b) => a + b, 0);
580
+ return Math.max(s, min);
581
+ }
582
+
583
+ // src/diagrams/fishbone/renderer.ts
584
+ var CSS = `
585
+ .sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
586
+ .sx-fb-title { font: 600 16px sans-serif; fill: #111; }
587
+ .sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }
588
+ .sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }
589
+ .sx-fb-head { stroke-width: 0.5; }
590
+ .sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }
591
+ .sx-fb-rib { stroke-width: 1.5; fill: none; }
592
+ .sx-fb-header-pill { stroke-width: 0.6; }
593
+ .sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }
594
+ .sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }
595
+ .sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }
596
+ .sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }
597
+ .sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }
598
+ `.trim();
599
+ function lighten(hex, amount) {
600
+ const m = hex.match(/^#?([0-9a-f]{6})$/i);
601
+ if (!m) return hex;
602
+ const n = parseInt(m[1], 16);
603
+ const r = n >> 16 & 255;
604
+ const g = n >> 8 & 255;
605
+ const b = n & 255;
606
+ const rr = Math.round(r + (255 - r) * amount);
607
+ const gg = Math.round(g + (255 - g) * amount);
608
+ const bb = Math.round(b + (255 - b) * amount);
609
+ return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
610
+ }
611
+ function darken(hex, amount) {
612
+ const m = hex.match(/^#?([0-9a-f]{6})$/i);
613
+ if (!m) return hex;
614
+ const n = parseInt(m[1], 16);
615
+ const r = n >> 16 & 255;
616
+ const g = n >> 8 & 255;
617
+ const b = n & 255;
618
+ const rr = Math.round(r * (1 - amount));
619
+ const gg = Math.round(g * (1 - amount));
620
+ const bb = Math.round(b * (1 - amount));
621
+ return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
622
+ }
623
+ function randomId() {
624
+ return Math.random().toString(36).slice(2, 8);
625
+ }
626
+ function buildMask(id, w, h, bboxes) {
627
+ const base = chunkHDKDQAEQ_cjs.rect({ x: 0, y: 0, width: w, height: h, fill: "white" });
628
+ const holes = bboxes.map(
629
+ (b) => chunkHDKDQAEQ_cjs.rect({
630
+ x: b.x,
631
+ y: b.y,
632
+ width: b.w,
633
+ height: b.h,
634
+ fill: "black",
635
+ rx: 2
636
+ })
637
+ ).join("\n");
638
+ return chunkHDKDQAEQ_cjs.el("mask", { id, maskUnits: "userSpaceOnUse" }, [base, holes]);
639
+ }
640
+ function renderHead(layout, ltr) {
641
+ const h = layout.head;
642
+ const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);
643
+ const leftX = ltr ? h.x : h.x;
644
+ const rightX = ltr ? h.tipX : tipX;
645
+ const points = ltr ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}` : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;
646
+ const fill = "#faece7";
647
+ const stroke = "#993c1d";
648
+ const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;
649
+ return chunkHDKDQAEQ_cjs.group({ class: "sx-fb-head-g" }, [
650
+ chunkHDKDQAEQ_cjs.polygon({
651
+ points,
652
+ class: "sx-fb-head",
653
+ fill,
654
+ stroke
655
+ }),
656
+ chunkHDKDQAEQ_cjs.text(
657
+ {
658
+ x: textX,
659
+ y: h.y,
660
+ class: "sx-fb-head-text",
661
+ fill: darken(stroke, 0.3)
662
+ },
663
+ h.label
664
+ )
665
+ ]);
666
+ }
667
+ function renderRibs(layout, maskUrl) {
668
+ const parts = [];
669
+ for (const rib of layout.ribs) {
670
+ const pillFill = lighten(rib.color, 0.82);
671
+ const pillStroke = rib.color;
672
+ const headerTextFill = darken(rib.color, 0.3);
673
+ parts.push(
674
+ chunkHDKDQAEQ_cjs.line({
675
+ x1: rib.spineX,
676
+ y1: rib.spineY,
677
+ x2: rib.endX,
678
+ y2: rib.endY,
679
+ class: "sx-fb-rib",
680
+ stroke: rib.color,
681
+ mask: maskUrl
682
+ })
683
+ );
684
+ parts.push(
685
+ chunkHDKDQAEQ_cjs.line({
686
+ x1: rib.endX,
687
+ y1: rib.endY,
688
+ x2: rib.headerX + rib.headerW / 2,
689
+ y2: rib.headerY + rib.headerH / 2,
690
+ class: "sx-fb-rib",
691
+ stroke: rib.color
692
+ })
693
+ );
694
+ parts.push(
695
+ chunkHDKDQAEQ_cjs.rect({
696
+ x: rib.headerX,
697
+ y: rib.headerY,
698
+ width: rib.headerW,
699
+ height: rib.headerH,
700
+ rx: 8,
701
+ class: "sx-fb-header-pill",
702
+ fill: pillFill,
703
+ stroke: pillStroke
704
+ })
705
+ );
706
+ parts.push(
707
+ chunkHDKDQAEQ_cjs.text(
708
+ {
709
+ x: rib.headerX + rib.headerW / 2,
710
+ y: rib.headerY + rib.headerH / 2,
711
+ class: "sx-fb-header-text",
712
+ fill: headerTextFill
713
+ },
714
+ rib.label
715
+ )
716
+ );
717
+ for (const cause of rib.causes) {
718
+ parts.push(
719
+ chunkHDKDQAEQ_cjs.line({
720
+ x1: cause.ribX,
721
+ y1: cause.ribY,
722
+ x2: cause.branchX,
723
+ y2: cause.branchY,
724
+ class: "sx-fb-branch",
725
+ stroke: rib.color,
726
+ mask: maskUrl
727
+ })
728
+ );
729
+ parts.push(
730
+ chunkHDKDQAEQ_cjs.text(
731
+ {
732
+ x: cause.labelX,
733
+ y: cause.labelY,
734
+ class: "sx-fb-cause-label",
735
+ "text-anchor": cause.labelAnchor
736
+ },
737
+ cause.label
738
+ )
739
+ );
740
+ for (const sub of cause.subCauses) {
741
+ parts.push(
742
+ chunkHDKDQAEQ_cjs.line({
743
+ x1: sub.tickX1,
744
+ y1: sub.tickY,
745
+ x2: sub.tickX2,
746
+ y2: sub.tickY,
747
+ class: "sx-fb-sub-tick",
748
+ stroke: rib.color
749
+ })
750
+ );
751
+ parts.push(
752
+ chunkHDKDQAEQ_cjs.text(
753
+ {
754
+ x: sub.x,
755
+ y: sub.y,
756
+ class: "sx-fb-sub-label",
757
+ "text-anchor": sub.anchor
758
+ },
759
+ sub.label
760
+ )
761
+ );
762
+ }
763
+ }
764
+ }
765
+ return chunkHDKDQAEQ_cjs.group({ class: "sx-fb-ribs" }, parts);
766
+ }
767
+ function renderFishboneAST(ast, options = {}) {
768
+ const themeName = options.theme ?? ast.metadata?.["theme"] ?? "default";
769
+ const tokens = chunkN7KOXOMX_cjs.resolveFishboneTheme(themeName);
770
+ const layout = layoutFishbone(ast, { palette: tokens.palette });
771
+ const ltr = layout.orientation !== "rtl";
772
+ const maskId = `sx-fb-mask-${randomId()}`;
773
+ const maskUrl = `url(#${maskId})`;
774
+ const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);
775
+ const spine = chunkHDKDQAEQ_cjs.line({
776
+ x1: layout.spineStartX,
777
+ y1: layout.spineY,
778
+ x2: layout.spineEndX,
779
+ y2: layout.spineY,
780
+ class: "sx-fb-spine"
781
+ });
782
+ const tailTop = chunkHDKDQAEQ_cjs.line({
783
+ x1: layout.spineStartX,
784
+ y1: layout.spineY,
785
+ x2: layout.tailForkTipTop.x,
786
+ y2: layout.tailForkTipTop.y,
787
+ class: "sx-fb-tail"
788
+ });
789
+ const tailBot = chunkHDKDQAEQ_cjs.line({
790
+ x1: layout.spineStartX,
791
+ y1: layout.spineY,
792
+ x2: layout.tailForkTipBot.x,
793
+ y2: layout.tailForkTipBot.y,
794
+ class: "sx-fb-tail"
795
+ });
796
+ const titleBlock = layout.title ? chunkHDKDQAEQ_cjs.text(
797
+ {
798
+ x: layout.width / 2,
799
+ y: 28,
800
+ class: "sx-fb-title",
801
+ "text-anchor": "middle"
802
+ },
803
+ layout.title
804
+ ) : "";
805
+ const head = renderHead(layout, ltr);
806
+ const ribs = renderRibs(layout, maskUrl);
807
+ const inner = [
808
+ chunkHDKDQAEQ_cjs.title(layout.title ? `${layout.title} \u2014 Fishbone diagram` : "Fishbone diagram"),
809
+ chunkHDKDQAEQ_cjs.desc(
810
+ `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`
811
+ ),
812
+ chunkHDKDQAEQ_cjs.el("style", {}, CSS),
813
+ chunkHDKDQAEQ_cjs.defs([mask]),
814
+ titleBlock,
815
+ tailTop,
816
+ tailBot,
817
+ spine,
818
+ head,
819
+ ribs
820
+ ];
821
+ if (!ltr) {
822
+ const mirrored = chunkHDKDQAEQ_cjs.group(
823
+ {
824
+ transform: `translate(${layout.width} 0) scale(-1 1)`
825
+ },
826
+ [tailTop, tailBot, spine, head, ribs]
827
+ );
828
+ return chunkHDKDQAEQ_cjs.svgRoot(
829
+ {
830
+ viewBox: `0 0 ${layout.width} ${layout.height}`,
831
+ width: layout.width,
832
+ height: layout.height,
833
+ class: "sx-fb",
834
+ role: "img"
835
+ },
836
+ [
837
+ chunkHDKDQAEQ_cjs.title(layout.title ?? "Fishbone"),
838
+ chunkHDKDQAEQ_cjs.desc(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),
839
+ chunkHDKDQAEQ_cjs.el("style", {}, CSS),
840
+ chunkHDKDQAEQ_cjs.defs([mask]),
841
+ titleBlock,
842
+ mirrored
843
+ ]
844
+ );
845
+ }
846
+ return chunkHDKDQAEQ_cjs.svgRoot(
847
+ {
848
+ viewBox: `0 0 ${layout.width} ${layout.height}`,
849
+ width: layout.width,
850
+ height: layout.height,
851
+ class: "sx-fb",
852
+ role: "img"
853
+ },
854
+ inner
855
+ );
856
+ }
857
+ function renderFishbone(text2, options = {}) {
858
+ const ast = parseFishboneDSL(text2);
859
+ return renderFishboneAST(ast, options);
860
+ }
861
+
862
+ // src/diagrams/fishbone/index.ts
863
+ var fishbone = {
864
+ type: "fishbone",
865
+ detect(text2) {
866
+ const first = text2.trim().split("\n")[0]?.trim().toLowerCase() ?? "";
867
+ return first.startsWith("fishbone");
868
+ },
869
+ render(text2) {
870
+ return renderFishbone(text2);
871
+ }
872
+ };
873
+
874
+ exports.FB_CONST = FB_CONST;
875
+ exports.fishbone = fishbone;
876
+ exports.layoutFishbone = layoutFishbone;
877
+ exports.parseFishboneDSL = parseFishboneDSL;
878
+ exports.renderFishbone = renderFishbone;
879
+ exports.renderFishboneAST = renderFishboneAST;
880
+ //# sourceMappingURL=chunk-URSKIHSY.cjs.map
881
+ //# sourceMappingURL=chunk-URSKIHSY.cjs.map