schematex 0.3.2 → 0.3.3

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 (171) hide show
  1. package/dist/ai/ai-sdk.cjs +25 -25
  2. package/dist/ai/ai-sdk.d.cts +1 -1
  3. package/dist/ai/ai-sdk.d.ts +1 -1
  4. package/dist/ai/ai-sdk.js +20 -20
  5. package/dist/ai/index.cjs +28 -28
  6. package/dist/ai/index.d.cts +1 -1
  7. package/dist/ai/index.d.ts +1 -1
  8. package/dist/ai/index.js +20 -20
  9. package/dist/browser.cjs +22 -22
  10. package/dist/browser.js +20 -20
  11. package/dist/{chunk-LFZZ4NCP.cjs → chunk-3WNW5Y7P.cjs} +48 -8
  12. package/dist/chunk-3WNW5Y7P.cjs.map +1 -0
  13. package/dist/{chunk-MKKFIPKU.cjs → chunk-55UEHL57.cjs} +46 -46
  14. package/dist/{chunk-MKKFIPKU.cjs.map → chunk-55UEHL57.cjs.map} +1 -1
  15. package/dist/{chunk-BJ65PKDU.js → chunk-5U2W3HQA.js} +3 -3
  16. package/dist/{chunk-BJ65PKDU.js.map → chunk-5U2W3HQA.js.map} +1 -1
  17. package/dist/{chunk-75BMFCP5.cjs → chunk-5UCXMYE7.cjs} +44 -44
  18. package/dist/{chunk-75BMFCP5.cjs.map → chunk-5UCXMYE7.cjs.map} +1 -1
  19. package/dist/{chunk-F6OROIHS.js → chunk-66XQBGX7.js} +3 -3
  20. package/dist/{chunk-F6OROIHS.js.map → chunk-66XQBGX7.js.map} +1 -1
  21. package/dist/{chunk-HIQPEAL7.js → chunk-6TIN33CA.js} +3 -3
  22. package/dist/{chunk-HIQPEAL7.js.map → chunk-6TIN33CA.js.map} +1 -1
  23. package/dist/{chunk-RNGYXGHS.js → chunk-6YUP3QMA.js} +19 -19
  24. package/dist/{chunk-RNGYXGHS.js.map → chunk-6YUP3QMA.js.map} +1 -1
  25. package/dist/{chunk-C3IVD7DI.cjs → chunk-7EWFVNYD.cjs} +25 -25
  26. package/dist/{chunk-C3IVD7DI.cjs.map → chunk-7EWFVNYD.cjs.map} +1 -1
  27. package/dist/{chunk-56LXBM45.js → chunk-AC3XH3LB.js} +4 -4
  28. package/dist/{chunk-56LXBM45.js.map → chunk-AC3XH3LB.js.map} +1 -1
  29. package/dist/{chunk-YTEEZV6J.cjs → chunk-APV4AWQ5.cjs} +422 -422
  30. package/dist/{chunk-YTEEZV6J.cjs.map → chunk-APV4AWQ5.cjs.map} +1 -1
  31. package/dist/{chunk-UK7JF5QB.cjs → chunk-AVIKQZSX.cjs} +37 -37
  32. package/dist/{chunk-UK7JF5QB.cjs.map → chunk-AVIKQZSX.cjs.map} +1 -1
  33. package/dist/{chunk-OK5RYX55.cjs → chunk-CWZKP3CJ.cjs} +26 -26
  34. package/dist/{chunk-OK5RYX55.cjs.map → chunk-CWZKP3CJ.cjs.map} +1 -1
  35. package/dist/{chunk-2J2QWNGI.js → chunk-FIVUMDLF.js} +26 -7
  36. package/dist/chunk-FIVUMDLF.js.map +1 -0
  37. package/dist/{chunk-ZTSO3S4P.js → chunk-FO7BLCEW.js} +3 -3
  38. package/dist/{chunk-ZTSO3S4P.js.map → chunk-FO7BLCEW.js.map} +1 -1
  39. package/dist/{chunk-6BKUD5EJ.js → chunk-GLFBHQSQ.js} +4 -4
  40. package/dist/{chunk-6BKUD5EJ.js.map → chunk-GLFBHQSQ.js.map} +1 -1
  41. package/dist/{chunk-ZNLEUL7T.js → chunk-GVCPFBAV.js} +4 -4
  42. package/dist/chunk-GVCPFBAV.js.map +1 -0
  43. package/dist/{chunk-KUXOHLGC.cjs → chunk-HOI6QKC6.cjs} +52 -52
  44. package/dist/{chunk-KUXOHLGC.cjs.map → chunk-HOI6QKC6.cjs.map} +1 -1
  45. package/dist/{chunk-L2KUGWFR.cjs → chunk-IAEABLIV.cjs} +46 -46
  46. package/dist/{chunk-L2KUGWFR.cjs.map → chunk-IAEABLIV.cjs.map} +1 -1
  47. package/dist/{chunk-M5ZC3LFJ.js → chunk-IQRRZPVZ.js} +3 -3
  48. package/dist/{chunk-M5ZC3LFJ.js.map → chunk-IQRRZPVZ.js.map} +1 -1
  49. package/dist/{chunk-H4CJTKEH.js → chunk-MNOO7STY.js} +5 -5
  50. package/dist/{chunk-H4CJTKEH.js.map → chunk-MNOO7STY.js.map} +1 -1
  51. package/dist/{chunk-XI6JOG76.cjs → chunk-N56YC75X.cjs} +45 -45
  52. package/dist/{chunk-XI6JOG76.cjs.map → chunk-N56YC75X.cjs.map} +1 -1
  53. package/dist/{chunk-X4F6VVEJ.js → chunk-PAG3BNIV.js} +3 -3
  54. package/dist/{chunk-X4F6VVEJ.js.map → chunk-PAG3BNIV.js.map} +1 -1
  55. package/dist/{chunk-W7GIQTJV.cjs → chunk-PG6TDGKI.cjs} +21 -21
  56. package/dist/{chunk-W7GIQTJV.cjs.map → chunk-PG6TDGKI.cjs.map} +1 -1
  57. package/dist/{chunk-7MVDN5UC.cjs → chunk-Q5OFA4I2.cjs} +35 -35
  58. package/dist/{chunk-7MVDN5UC.cjs.map → chunk-Q5OFA4I2.cjs.map} +1 -1
  59. package/dist/{chunk-BUN3CRMP.cjs → chunk-QOLBWCF5.cjs} +65 -65
  60. package/dist/{chunk-BUN3CRMP.cjs.map → chunk-QOLBWCF5.cjs.map} +1 -1
  61. package/dist/{chunk-2UJAVPA4.cjs → chunk-QXL7AY2H.cjs} +26 -26
  62. package/dist/{chunk-2UJAVPA4.cjs.map → chunk-QXL7AY2H.cjs.map} +1 -1
  63. package/dist/{chunk-WHJXRLFD.js → chunk-SYYBKDL7.js} +48 -8
  64. package/dist/chunk-SYYBKDL7.js.map +1 -0
  65. package/dist/{chunk-SE23X5OE.js → chunk-TQU44E46.js} +4 -4
  66. package/dist/{chunk-SE23X5OE.js.map → chunk-TQU44E46.js.map} +1 -1
  67. package/dist/{chunk-SFSZUOFT.js → chunk-U3KRKXF7.js} +3 -3
  68. package/dist/{chunk-SFSZUOFT.js.map → chunk-U3KRKXF7.js.map} +1 -1
  69. package/dist/{chunk-EYHD7LV3.cjs → chunk-UDGU73RL.cjs} +129 -129
  70. package/dist/{chunk-EYHD7LV3.cjs.map → chunk-UDGU73RL.cjs.map} +1 -1
  71. package/dist/{chunk-M3R6RCXY.js → chunk-UDJ2KN2A.js} +3 -3
  72. package/dist/{chunk-M3R6RCXY.js.map → chunk-UDJ2KN2A.js.map} +1 -1
  73. package/dist/{chunk-BJWMPPEA.js → chunk-UT4TIDAA.js} +3 -3
  74. package/dist/{chunk-BJWMPPEA.js.map → chunk-UT4TIDAA.js.map} +1 -1
  75. package/dist/{chunk-RODV6PC4.cjs → chunk-UWRTV6IV.cjs} +7 -7
  76. package/dist/{chunk-RODV6PC4.cjs.map → chunk-UWRTV6IV.cjs.map} +1 -1
  77. package/dist/{chunk-IT2TVXC7.js → chunk-WTF6JXHN.js} +4 -4
  78. package/dist/{chunk-IT2TVXC7.js.map → chunk-WTF6JXHN.js.map} +1 -1
  79. package/dist/{chunk-7BEJHG43.js → chunk-X5QJO4ZD.js} +3 -3
  80. package/dist/{chunk-7BEJHG43.js.map → chunk-X5QJO4ZD.js.map} +1 -1
  81. package/dist/{chunk-NFT6VW73.js → chunk-XV2DTN6G.js} +3 -3
  82. package/dist/{chunk-NFT6VW73.js.map → chunk-XV2DTN6G.js.map} +1 -1
  83. package/dist/{chunk-XUEROLSB.cjs → chunk-YUPG2M3I.cjs} +16 -16
  84. package/dist/chunk-YUPG2M3I.cjs.map +1 -0
  85. package/dist/{chunk-K5QG53GT.cjs → chunk-ZCW7YH3C.cjs} +26 -26
  86. package/dist/{chunk-K5QG53GT.cjs.map → chunk-ZCW7YH3C.cjs.map} +1 -1
  87. package/dist/{chunk-GYTWJ6VB.cjs → chunk-ZFNZ2FYI.cjs} +67 -48
  88. package/dist/chunk-ZFNZ2FYI.cjs.map +1 -0
  89. package/dist/{chunk-3YXXZ4LT.cjs → chunk-ZZJDGGC3.cjs} +33 -33
  90. package/dist/{chunk-3YXXZ4LT.cjs.map → chunk-ZZJDGGC3.cjs.map} +1 -1
  91. package/dist/diagrams/blockdiagram/index.cjs +6 -6
  92. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  93. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  94. package/dist/diagrams/blockdiagram/index.js +2 -2
  95. package/dist/diagrams/circuit/index.cjs +8 -8
  96. package/dist/diagrams/circuit/index.d.cts +1 -1
  97. package/dist/diagrams/circuit/index.d.ts +1 -1
  98. package/dist/diagrams/circuit/index.js +2 -2
  99. package/dist/diagrams/ecomap/index.cjs +8 -8
  100. package/dist/diagrams/ecomap/index.d.cts +1 -1
  101. package/dist/diagrams/ecomap/index.d.ts +1 -1
  102. package/dist/diagrams/ecomap/index.js +3 -3
  103. package/dist/diagrams/entity/index.cjs +6 -6
  104. package/dist/diagrams/entity/index.d.cts +1 -1
  105. package/dist/diagrams/entity/index.d.ts +1 -1
  106. package/dist/diagrams/entity/index.js +2 -2
  107. package/dist/diagrams/fishbone/index.cjs +8 -8
  108. package/dist/diagrams/fishbone/index.d.cts +1 -1
  109. package/dist/diagrams/fishbone/index.d.ts +1 -1
  110. package/dist/diagrams/fishbone/index.js +2 -2
  111. package/dist/diagrams/flowchart/index.cjs +8 -8
  112. package/dist/diagrams/flowchart/index.d.cts +2 -2
  113. package/dist/diagrams/flowchart/index.d.ts +2 -2
  114. package/dist/diagrams/flowchart/index.js +2 -2
  115. package/dist/diagrams/genogram/index.cjs +10 -10
  116. package/dist/diagrams/genogram/index.d.cts +1 -1
  117. package/dist/diagrams/genogram/index.d.ts +1 -1
  118. package/dist/diagrams/genogram/index.js +3 -3
  119. package/dist/diagrams/ladder/index.cjs +6 -6
  120. package/dist/diagrams/ladder/index.d.cts +1 -1
  121. package/dist/diagrams/ladder/index.d.ts +1 -1
  122. package/dist/diagrams/ladder/index.js +2 -2
  123. package/dist/diagrams/logic/index.cjs +6 -6
  124. package/dist/diagrams/logic/index.d.cts +1 -1
  125. package/dist/diagrams/logic/index.d.ts +1 -1
  126. package/dist/diagrams/logic/index.js +2 -2
  127. package/dist/diagrams/orgchart/index.cjs +7 -7
  128. package/dist/diagrams/orgchart/index.d.cts +1 -1
  129. package/dist/diagrams/orgchart/index.d.ts +1 -1
  130. package/dist/diagrams/orgchart/index.js +2 -2
  131. package/dist/diagrams/pedigree/index.cjs +8 -8
  132. package/dist/diagrams/pedigree/index.d.cts +1 -1
  133. package/dist/diagrams/pedigree/index.d.ts +1 -1
  134. package/dist/diagrams/pedigree/index.js +3 -3
  135. package/dist/diagrams/phylo/index.cjs +7 -7
  136. package/dist/diagrams/phylo/index.d.cts +1 -1
  137. package/dist/diagrams/phylo/index.d.ts +1 -1
  138. package/dist/diagrams/phylo/index.js +2 -2
  139. package/dist/diagrams/sld/index.cjs +6 -6
  140. package/dist/diagrams/sld/index.d.cts +1 -1
  141. package/dist/diagrams/sld/index.d.ts +1 -1
  142. package/dist/diagrams/sld/index.js +2 -2
  143. package/dist/diagrams/sociogram/index.cjs +7 -7
  144. package/dist/diagrams/sociogram/index.d.cts +1 -1
  145. package/dist/diagrams/sociogram/index.d.ts +1 -1
  146. package/dist/diagrams/sociogram/index.js +3 -3
  147. package/dist/diagrams/timing/index.cjs +5 -5
  148. package/dist/diagrams/timing/index.d.cts +1 -1
  149. package/dist/diagrams/timing/index.d.ts +1 -1
  150. package/dist/diagrams/timing/index.js +2 -2
  151. package/dist/diagrams/venn/index.cjs +9 -9
  152. package/dist/diagrams/venn/index.d.cts +1 -1
  153. package/dist/diagrams/venn/index.d.ts +1 -1
  154. package/dist/diagrams/venn/index.js +2 -2
  155. package/dist/{index-dWDwG6BW.d.ts → index-D3u6vcA4.d.ts} +1 -1
  156. package/dist/{index-BrLxEzSQ.d.cts → index-bdfj6FpQ.d.cts} +1 -1
  157. package/dist/index.cjs +41 -41
  158. package/dist/index.d.cts +2 -2
  159. package/dist/index.d.ts +2 -2
  160. package/dist/index.js +19 -19
  161. package/dist/react.cjs +20 -20
  162. package/dist/react.js +19 -19
  163. package/dist/{types-BtiUg7Gx.d.cts → types-DnU2UlWz.d.cts} +2 -0
  164. package/dist/{types-BtiUg7Gx.d.ts → types-DnU2UlWz.d.ts} +2 -0
  165. package/package.json +1 -1
  166. package/dist/chunk-2J2QWNGI.js.map +0 -1
  167. package/dist/chunk-GYTWJ6VB.cjs.map +0 -1
  168. package/dist/chunk-LFZZ4NCP.cjs.map +0 -1
  169. package/dist/chunk-WHJXRLFD.js.map +0 -1
  170. package/dist/chunk-XUEROLSB.cjs.map +0 -1
  171. package/dist/chunk-ZNLEUL7T.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
4
- var chunkLFZZ4NCP_cjs = require('./chunk-LFZZ4NCP.cjs');
4
+ var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
5
5
 
6
6
  // src/diagrams/phylo/parser.ts
7
7
  var PhyloParseError = class extends Error {
@@ -674,20 +674,20 @@ function renderScaleBar(layout, t, scaleLabel) {
674
674
  const x = 20;
675
675
  const y = layout.height - 20;
676
676
  const elements = [
677
- chunkLFZZ4NCP_cjs.line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: "schematex-phylo-scale-bar" }),
678
- chunkLFZZ4NCP_cjs.line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: "schematex-phylo-scale-tick" }),
679
- chunkLFZZ4NCP_cjs.line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: "schematex-phylo-scale-tick" }),
680
- chunkLFZZ4NCP_cjs.text({ x: x + bar.pxLength / 2, y: y + 16, "text-anchor": "middle", class: "schematex-phylo-scale-bar" }, bar.label)
677
+ chunk3WNW5Y7P_cjs.line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: "schematex-phylo-scale-bar" }),
678
+ chunk3WNW5Y7P_cjs.line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: "schematex-phylo-scale-tick" }),
679
+ chunk3WNW5Y7P_cjs.line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: "schematex-phylo-scale-tick" }),
680
+ chunk3WNW5Y7P_cjs.text({ x: x + bar.pxLength / 2, y: y + 16, "text-anchor": "middle", class: "schematex-phylo-scale-bar" }, bar.label)
681
681
  ];
682
682
  if (scaleLabel) {
683
683
  elements.push(
684
- chunkLFZZ4NCP_cjs.text(
684
+ chunk3WNW5Y7P_cjs.text(
685
685
  { x: x + bar.pxLength / 2, y: y + 28, "text-anchor": "middle", "font-size": "9", fill: t.textMuted },
686
686
  scaleLabel
687
687
  )
688
688
  );
689
689
  }
690
- return chunkLFZZ4NCP_cjs.group({ class: "schematex-phylo-scale-bar" }, elements);
690
+ return chunk3WNW5Y7P_cjs.group({ class: "schematex-phylo-scale-bar" }, elements);
691
691
  }
692
692
  function renderCladeBackgrounds(layout, t) {
693
693
  const elements = [];
@@ -708,7 +708,7 @@ function renderCladeBackgrounds(layout, t) {
708
708
  }));
709
709
  const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];
710
710
  elements.push(
711
- chunkLFZZ4NCP_cjs.rect({
711
+ chunk3WNW5Y7P_cjs.rect({
712
712
  x: minX,
713
713
  y: minY,
714
714
  width: maxX - minX,
@@ -721,7 +721,7 @@ function renderCladeBackgrounds(layout, t) {
721
721
  );
722
722
  if (clade.label) {
723
723
  elements.push(
724
- chunkLFZZ4NCP_cjs.text(
724
+ chunk3WNW5Y7P_cjs.text(
725
725
  {
726
726
  x: maxX + 4,
727
727
  y: (minY + maxY) / 2,
@@ -759,12 +759,12 @@ function renderPhylo(layout) {
759
759
  if (cladeColor && !branch.isConnector) {
760
760
  attrs.stroke = cladeColor;
761
761
  }
762
- branchElements.push(chunkLFZZ4NCP_cjs.path(attrs));
762
+ branchElements.push(chunk3WNW5Y7P_cjs.path(attrs));
763
763
  }
764
764
  const rootLayout = nodes.find((n) => n.node === ast.root);
765
765
  if (rootLayout && !ast.unrooted) {
766
766
  nodeElements.push(
767
- chunkLFZZ4NCP_cjs.circle({
767
+ chunk3WNW5Y7P_cjs.circle({
768
768
  cx: rootLayout.x,
769
769
  cy: rootLayout.y,
770
770
  r: 5,
@@ -779,7 +779,7 @@ function renderPhylo(layout) {
779
779
  if (support >= SUPPORT_THRESHOLD) {
780
780
  const color = getSupportColor(support, t);
781
781
  nodeElements.push(
782
- chunkLFZZ4NCP_cjs.circle({
782
+ chunk3WNW5Y7P_cjs.circle({
783
783
  cx: x,
784
784
  cy: y,
785
785
  r: 4,
@@ -788,7 +788,7 @@ function renderPhylo(layout) {
788
788
  })
789
789
  );
790
790
  labelElements.push(
791
- chunkLFZZ4NCP_cjs.text(
791
+ chunk3WNW5Y7P_cjs.text(
792
792
  { x, y: y - 8, class: "schematex-phylo-support-label" },
793
793
  String(Math.round(support))
794
794
  )
@@ -800,7 +800,7 @@ function renderPhylo(layout) {
800
800
  const italic = isSpeciesBinomial(label);
801
801
  const cls = `schematex-phylo-tip-label${italic ? " schematex-phylo-tip-label-italic" : ""}`;
802
802
  labelElements.push(
803
- chunkLFZZ4NCP_cjs.text(
803
+ chunk3WNW5Y7P_cjs.text(
804
804
  {
805
805
  x: x + TIP_LABEL_GAP,
806
806
  y,
@@ -815,53 +815,53 @@ function renderPhylo(layout) {
815
815
  }
816
816
  const cladeBgElements = renderCladeBackgrounds(layout, t);
817
817
  const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);
818
- const titleEl = ast.title ? chunkLFZZ4NCP_cjs.text(
818
+ const titleEl = ast.title ? chunk3WNW5Y7P_cjs.text(
819
819
  { x: totalWidth / 2, y: 20, class: "schematex-phylo-title" },
820
820
  ast.title
821
821
  ) : "";
822
822
  const leafCount = nodes.filter((n) => n.node.isLeaf).length;
823
823
  const svgContent = [
824
- chunkLFZZ4NCP_cjs.title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : ""}`),
825
- chunkLFZZ4NCP_cjs.desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),
826
- chunkLFZZ4NCP_cjs.el("style", {}, css)
824
+ chunk3WNW5Y7P_cjs.title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : ""}`),
825
+ chunk3WNW5Y7P_cjs.desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),
826
+ chunk3WNW5Y7P_cjs.el("style", {}, css)
827
827
  ];
828
828
  if (titleEl) svgContent.push(titleEl);
829
829
  const transformY = titleOffset;
830
830
  if (cladeBgElements.length > 0) {
831
831
  svgContent.push(
832
- chunkLFZZ4NCP_cjs.group(
832
+ chunk3WNW5Y7P_cjs.group(
833
833
  { class: "schematex-phylo-clade-highlights", transform: transformY ? `translate(0,${transformY})` : void 0 },
834
834
  cladeBgElements
835
835
  )
836
836
  );
837
837
  }
838
838
  svgContent.push(
839
- chunkLFZZ4NCP_cjs.group(
839
+ chunk3WNW5Y7P_cjs.group(
840
840
  { class: "schematex-phylo-branches", transform: transformY ? `translate(0,${transformY})` : void 0 },
841
841
  branchElements
842
842
  )
843
843
  );
844
844
  svgContent.push(
845
- chunkLFZZ4NCP_cjs.group(
845
+ chunk3WNW5Y7P_cjs.group(
846
846
  { class: "schematex-phylo-nodes", transform: transformY ? `translate(0,${transformY})` : void 0 },
847
847
  nodeElements
848
848
  )
849
849
  );
850
850
  svgContent.push(
851
- chunkLFZZ4NCP_cjs.group(
851
+ chunk3WNW5Y7P_cjs.group(
852
852
  { class: "schematex-phylo-labels", transform: transformY ? `translate(0,${transformY})` : void 0 },
853
853
  labelElements
854
854
  )
855
855
  );
856
856
  if (scaleBarEl) {
857
857
  svgContent.push(
858
- chunkLFZZ4NCP_cjs.group(
858
+ chunk3WNW5Y7P_cjs.group(
859
859
  { transform: transformY ? `translate(0,${transformY})` : void 0 },
860
860
  [scaleBarEl]
861
861
  )
862
862
  );
863
863
  }
864
- return chunkLFZZ4NCP_cjs.svgRoot(
864
+ return chunk3WNW5Y7P_cjs.svgRoot(
865
865
  {
866
866
  class: "schematex-diagram schematex-phylo",
867
867
  viewBox: `0 0 ${totalWidth} ${totalHeight}`,
@@ -892,5 +892,5 @@ exports.layoutPhylo = layoutPhylo;
892
892
  exports.parsePhylo = parsePhylo;
893
893
  exports.phylo = phylo;
894
894
  exports.renderPhylo = renderPhylo;
895
- //# sourceMappingURL=chunk-OK5RYX55.cjs.map
896
- //# sourceMappingURL=chunk-OK5RYX55.cjs.map
895
+ //# sourceMappingURL=chunk-CWZKP3CJ.cjs.map
896
+ //# sourceMappingURL=chunk-CWZKP3CJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-OK5RYX55.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n let title: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) title = titleMatch[1];\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n background: ${t.bg};\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
1
+ {"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-CWZKP3CJ.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n let title: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) title = titleMatch[1];\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n background: ${t.bg};\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
@@ -1,5 +1,5 @@
1
1
  import { resolveFlowchartTheme } from './chunk-2VNMKOUO.js';
2
- import { text, title, desc, el, defs, group, svgRoot, rect, multilineText, path, polygon, circle, line } from './chunk-WHJXRLFD.js';
2
+ import { text, title, desc, el, defs, group, svgRoot, rect, multilineText, path, polygon, circle, line } from './chunk-SYYBKDL7.js';
3
3
 
4
4
  // src/diagrams/flowchart/parser.ts
5
5
  var FlowchartParseError = class extends Error {
@@ -402,7 +402,18 @@ function parseFlowchart(source) {
402
402
  }
403
403
  continue;
404
404
  }
405
- if (/^linkStyle\s/.test(trimmed)) continue;
405
+ const linkStyleMatch = /^linkStyle\s+([\d,\s]+|default)\s+(.+)$/.exec(trimmed);
406
+ if (linkStyleMatch) {
407
+ const sel = linkStyleMatch[1].trim();
408
+ const props = parseCssProps(linkStyleMatch[2]);
409
+ if (sel !== "default") {
410
+ const indices = sel.split(/[,\s]+/).map((s) => s.trim()).filter((s) => s.length > 0).map((s) => parseInt(s, 10)).filter((n) => !isNaN(n));
411
+ for (const idx of indices) {
412
+ ast.linkStyles.set(idx, { ...ast.linkStyles.get(idx) ?? {}, ...props });
413
+ }
414
+ }
415
+ continue;
416
+ }
406
417
  let parsed;
407
418
  try {
408
419
  parsed = parseChainStatement(trimmed, i + 1);
@@ -1572,6 +1583,8 @@ function layoutFlowchart(ast) {
1572
1583
  if (flipX) c.x = outWidth - c.x;
1573
1584
  }
1574
1585
  }
1586
+ const edgeIndex = /* @__PURE__ */ new Map();
1587
+ ast.edges.forEach((e, i) => edgeIndex.set(e, i));
1575
1588
  const outEdges = updatedEdges.map((le) => {
1576
1589
  const chain = le.chain.length > 0 ? le.chain : [le.from, le.to];
1577
1590
  const points = [];
@@ -1586,7 +1599,7 @@ function layoutFlowchart(ast) {
1586
1599
  }
1587
1600
  }
1588
1601
  if (points.length < 2) {
1589
- return { edge: le.original, path: "" };
1602
+ return { edge: le.original, path: "", index: edgeIndex.get(le.original) };
1590
1603
  }
1591
1604
  const startNode = nodeCenter.get(chain[0]);
1592
1605
  const endNode = nodeCenter.get(chain[chain.length - 1]);
@@ -1611,7 +1624,8 @@ function layoutFlowchart(ast) {
1611
1624
  isReversed: le.isReversed
1612
1625
  },
1613
1626
  path: d,
1614
- labelAnchor
1627
+ labelAnchor,
1628
+ index: edgeIndex.get(le.original)
1615
1629
  };
1616
1630
  });
1617
1631
  function collectDescendantNodeIds(sgId) {
@@ -1927,6 +1941,7 @@ function renderEdge(le) {
1927
1941
  return group(
1928
1942
  {
1929
1943
  "data-edge-id": e.id ?? `${e.from}->${e.to}`,
1944
+ "data-edge-index": le.index,
1930
1945
  "data-kind": e.kind,
1931
1946
  "data-from": e.from,
1932
1947
  "data-to": e.to
@@ -1975,6 +1990,10 @@ function renderFlowchartAST(ast, themeName = "default") {
1975
1990
  const props = Object.entries(cd.props).map(([k, v]) => `${k}:${v}`).join(";");
1976
1991
  return `.sx-fc-class-${cd.id} > .sx-fc-node { ${props} }`;
1977
1992
  }).join("\n");
1993
+ const linkStyleOverrides = Array.from(ast.linkStyles.entries()).map(([idx, props]) => {
1994
+ const cssProps = Object.entries(props).map(([k, v]) => `${k}:${v}`).join(";");
1995
+ return `g[data-edge-index="${idx}"] path { ${cssProps} }`;
1996
+ }).join("\n");
1978
1997
  const titleBlock = ast.title ? text(
1979
1998
  {
1980
1999
  x: layout.width / 2,
@@ -1984,7 +2003,7 @@ function renderFlowchartAST(ast, themeName = "default") {
1984
2003
  },
1985
2004
  ast.title
1986
2005
  ) : "";
1987
- const cssOverrides = [nodeStyleOverrides, classDefOverrides].filter((s) => s.length > 0).join("\n");
2006
+ const cssOverrides = [nodeStyleOverrides, classDefOverrides, linkStyleOverrides].filter((s) => s.length > 0).join("\n");
1988
2007
  const headMeta = [
1989
2008
  title(ast.title ? `${ast.title} \u2014 Flowchart` : "Flowchart"),
1990
2009
  desc(
@@ -2044,5 +2063,5 @@ var flowchart = {
2044
2063
  };
2045
2064
 
2046
2065
  export { FC_CONST, flowchart, layoutFlowchart, parseFlowchart, renderFlowchart, renderFlowchartAST };
2047
- //# sourceMappingURL=chunk-2J2QWNGI.js.map
2048
- //# sourceMappingURL=chunk-2J2QWNGI.js.map
2066
+ //# sourceMappingURL=chunk-FIVUMDLF.js.map
2067
+ //# sourceMappingURL=chunk-FIVUMDLF.js.map