collabmd 0.1.34 → 0.1.36

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 (375) hide show
  1. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-Bg0dawOb.js → CodeMirrorEditor-UCMRAMCV-DnBV8gCm.js} +1 -1
  2. package/dist/client/assets/_baseFor-BSErPbF2.js +1 -0
  3. package/dist/client/assets/{ar-SA-NXDWD63E-WivLHHDW.js → ar-SA-NXDWD63E-CTf_wpt3.js} +1 -1
  4. package/dist/client/assets/arc-DD8jaAGl.js +1 -0
  5. package/dist/client/assets/architecture-YZFGNWBL-DWWrde02.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-2XIMDMQ5-kYbOThe4.js → architectureDiagram-Q4EWVU46-BftXiJA8.js} +4 -4
  7. package/dist/client/assets/{az-AZ-MXSORGZV-DOdq1TKC.js → az-AZ-MXSORGZV-C_C9i9u3.js} +1 -1
  8. package/dist/client/assets/{bg-BG-O6MV2KSF-CYucKuDS.js → bg-BG-O6MV2KSF-YmfvQf63.js} +1 -1
  9. package/dist/client/assets/blockDiagram-DXYQGD6D-6UN-nR8-.js +132 -0
  10. package/dist/client/assets/{bn-IN-MMW2ORAC-DYr8kqNL.js → bn-BD-T2VJNT7N-BD0ob0JE.js} +1 -1
  11. package/dist/client/assets/{bn-BD-T2VJNT7N-2OKWLCYa.js → bn-IN-MMW2ORAC-BTEFR4Ed.js} +1 -1
  12. package/dist/client/assets/c4Diagram-AHTNJAMY-Gz7ZAK0d.js +10 -0
  13. package/dist/client/assets/{ca-ES-MKBCGNOG-B9Aeb43I.js → ca-ES-MKBCGNOG-aLX_cjA0.js} +1 -1
  14. package/dist/client/assets/channel-XGCkuPi6.js +1 -0
  15. package/dist/client/assets/chunk-2KRD3SAO-CFcF2aNP.js +1 -0
  16. package/dist/client/assets/chunk-336JU56O-DvrrHsJT.js +2 -0
  17. package/dist/client/assets/chunk-426QAEUC-CEbmCgux.js +1 -0
  18. package/dist/client/assets/{chunk-4BX2VUAB-2e7V-uuE.js → chunk-4BX2VUAB-D5YiFdu1.js} +1 -1
  19. package/dist/client/assets/chunk-4TB4RGXK-CoouNThi.js +206 -0
  20. package/dist/client/assets/{chunk-55IACEB6-CpncB3ru.js → chunk-55IACEB6-VHgZjidg.js} +1 -1
  21. package/dist/client/assets/chunk-5FUZZQ4R-CxIIxXPy.js +62 -0
  22. package/dist/client/assets/chunk-5PVQY5BW-ciE7eHID.js +2 -0
  23. package/dist/client/assets/chunk-67CJDMHE-CW-fbgQB.js +1 -0
  24. package/dist/client/assets/chunk-7N4EOEYR-DbAW6XnF.js +1 -0
  25. package/dist/client/assets/chunk-AA7GKIK3-ClDHDAza.js +1 -0
  26. package/dist/client/assets/chunk-BSJP7CBP-D2KkrA_B.js +1 -0
  27. package/dist/client/assets/chunk-CIAEETIT-BnB8a6HR.js +1 -0
  28. package/dist/client/assets/{chunk-KX2RTZJC-BTiOJb7N.js → chunk-EDXVE4YY-M4QxyGNt.js} +1 -1
  29. package/dist/client/assets/chunk-ENJZ2VHE-BQj_1YA_.js +10 -0
  30. package/dist/client/assets/{chunk-FMBD7UC4-CMahlBa_.js → chunk-FMBD7UC4-qQT7MtX2.js} +1 -1
  31. package/dist/client/assets/chunk-FOC6F5B3-Bw6XfKDP.js +1 -0
  32. package/dist/client/assets/chunk-ICPOFSXX-DqJi89rc.js +122 -0
  33. package/dist/client/assets/chunk-K5T4RW27-CQtjKF2g.js +94 -0
  34. package/dist/client/assets/chunk-KGLVRYIC-BWSPiKjp.js +1 -0
  35. package/dist/client/assets/chunk-LIHQZDEY-DtYrHuCi.js +1 -0
  36. package/dist/client/assets/{chunk-AXZTUZBK-DuMiJYO9.js → chunk-LOOWOR4L-C5BUwXgZ.js} +2 -2
  37. package/dist/client/assets/chunk-ORNJ4GCN-Csga44e5.js +1 -0
  38. package/dist/client/assets/{chunk-NQ4KR5QH-CMJKI6Oj.js → chunk-OYMX7WX6-DvtmCasj.js} +25 -14
  39. package/dist/client/assets/chunk-QZHKN3VN-CHVH9_3S.js +1 -0
  40. package/dist/client/assets/{chunk-SRAX5OIU-CLVBQRWC.js → chunk-SRAX5OIU-yDw8XRsi.js} +1 -1
  41. package/dist/client/assets/{chunk-PU5JKC2W-D_6N6t8f.js → chunk-U2HBQHQK-BBXgsocS.js} +6 -6
  42. package/dist/client/assets/{chunk-PQ6SQG4A-D1AbThjy.js → chunk-X2U36JSP-D3OEPG7k.js} +1 -1
  43. package/dist/client/assets/{chunk-XPW4576I-DJr4_4Yy.js → chunk-XPW4576I-BUfyrOtN.js} +2 -2
  44. package/dist/client/assets/chunk-YHkbxXgt.js +1 -0
  45. package/dist/client/assets/chunk-YKPWT25G-GISHuloq.js +35 -0
  46. package/dist/client/assets/{chunk-JSJVCQXG-DPQ9cPJt.js → chunk-YZCP3GAM-D1jf1WUI.js} +1 -1
  47. package/dist/client/assets/{chunk-Z5NKEFVG-HOkYqaKa.js → chunk-Z5NKEFVG-Vu8zBV4H.js} +1 -1
  48. package/dist/client/assets/chunk-ZZ45TVLE-DGIhE_ST.js +1 -0
  49. package/dist/client/assets/classDiagram-6PBFFD2Q-D1KhAUL3.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-HSJHXN6E-BSyyJpnR.js +1 -0
  51. package/dist/client/assets/clike-BFTLRaGS.js +1 -0
  52. package/dist/client/assets/clone-DI0bYZ1L.js +1 -0
  53. package/dist/client/assets/{coffeescript-B_7eyHAa.js → coffeescript-B7GZajzV.js} +1 -1
  54. package/dist/client/assets/{cose-bilkent-S5V4N54A-DASO2hrk.js → cose-bilkent-S5V4N54A-A8ssRFyt.js} +1 -1
  55. package/dist/client/assets/{cs-CZ-V77HGUP7-BDg-F0CJ.js → cs-CZ-V77HGUP7-Du3y53BB.js} +1 -1
  56. package/dist/client/assets/{cypher-DE6I2lIA.js → cypher-DEGl2llJ.js} +1 -1
  57. package/dist/client/assets/cytoscape.esm-BurByw8X.js +321 -0
  58. package/dist/client/assets/{d-BNkKjn0o.js → d-BspB0dox.js} +1 -1
  59. package/dist/client/assets/{da-DK-I5RFNTM4-wtSQ0Jxa.js → da-DK-I5RFNTM4-CDJtjf5s.js} +1 -1
  60. package/dist/client/assets/dagre-Dn6rkrte.js +1 -0
  61. package/dist/client/assets/dagre-KV5264BT-COzej2en.js +4 -0
  62. package/dist/client/assets/{de-CH-WLRDEVBV-C1swvmZy.js → de-CH-WLRDEVBV-CLV2tVw6.js} +1 -1
  63. package/dist/client/assets/{de-DE-DTI4WUSC-C0L6Nz8X.js → de-DE-DTI4WUSC-B53J0BQ8.js} +1 -1
  64. package/dist/client/assets/diagram-5BDNPKRD-BuK-UBuN.js +10 -0
  65. package/dist/client/assets/diagram-G4DWMVQ6-CbswIU9X.js +24 -0
  66. package/dist/client/assets/diagram-MMDJMWI5-BE-yOVGX.js +43 -0
  67. package/dist/client/assets/diagram-TYMM5635-CT8BdT4s.js +24 -0
  68. package/dist/client/assets/{dist-3uAMa5w5.js → dist-B98fHn5m.js} +1 -1
  69. package/dist/client/assets/{dist-BtnXjRx0.js → dist-BE8C_ouo.js} +1 -1
  70. package/dist/client/assets/{dist-rMhng5DK.js → dist-BEKQo64E.js} +1 -1
  71. package/dist/client/assets/{dist-DsL7sqZR.js → dist-BOP-dC-R.js} +1 -1
  72. package/dist/client/assets/{dist-DUvaQ-Bj.js → dist-BPEi1dEF.js} +1 -1
  73. package/dist/client/assets/{dist-B4uQVR_X.js → dist-BScEL4VP.js} +1 -1
  74. package/dist/client/assets/dist-BfVljg0L2.js +1 -0
  75. package/dist/client/assets/{dist-CGV1S_as.js → dist-BiCgLddE.js} +1 -1
  76. package/dist/client/assets/{dist-CxfohGIV.js → dist-Bn8WRPs1.js} +1 -1
  77. package/dist/client/assets/dist-Brrlevif.js +6 -0
  78. package/dist/client/assets/{dist-BLAlZer_.js → dist-CBEw2W2P.js} +1 -1
  79. package/dist/client/assets/{dist-B-02vKOA.js → dist-CJWCCWEW.js} +1 -1
  80. package/dist/client/assets/{dist-Dyt7n5Ui.js → dist-CQVTTk81.js} +1 -1
  81. package/dist/client/assets/dist-CaMl1R6P.js +13 -0
  82. package/dist/client/assets/dist-CcG3Y7Wp.js +1 -0
  83. package/dist/client/assets/dist-CghBwrO3.js +1 -0
  84. package/dist/client/assets/dist-Csbx9lQ-.js +1 -0
  85. package/dist/client/assets/dist-D34Xzrah.js +1 -0
  86. package/dist/client/assets/dist-DLyohOXi.js +1 -0
  87. package/dist/client/assets/{dist-Bc2ND6i3.js → dist-DPCUH5MO.js} +1 -1
  88. package/dist/client/assets/{dist-BzpfHRaE.js → dist-DQiph4qx.js} +1 -1
  89. package/dist/client/assets/{dist-CL-jjdvG.js → dist-DWRyOl2w.js} +1 -1
  90. package/dist/client/assets/{dist-CXpKYW9s.js → dist-DZ2t5lUX.js} +1 -1
  91. package/dist/client/assets/{dist-BzbYwa8m.js → dist-Dbg8P4C5.js} +1 -1
  92. package/dist/client/assets/{dist-k47-Io7D.js → dist-DdAqzGFU.js} +1 -1
  93. package/dist/client/assets/dist-DwvSvkOE.js +1 -0
  94. package/dist/client/assets/dist-WXLmfDGg.js +1 -0
  95. package/dist/client/assets/{dist-lDhnP-K1.js → dist-aE0_04fl.js} +1 -1
  96. package/dist/client/assets/{dist-E_jPb93e.js → dist-mPPUaHhq.js} +1 -1
  97. package/dist/client/assets/{dist-CjII8VDS.js → dist-v3i1ifes.js} +1 -1
  98. package/dist/client/assets/dist-wkd-N1L5.js +1 -0
  99. package/dist/client/assets/drawio-editor-D4Qoluwz.js +9 -0
  100. package/dist/client/assets/{drawioEditor-D6clB5OH.js → drawioEditor-B65FWq-b.js} +2 -2
  101. package/dist/client/assets/{ecl-M7Iek4lq.js → ecl-D9rhJ9-u.js} +1 -1
  102. package/dist/client/assets/editor-session-DV80PhYL.js +16 -0
  103. package/dist/client/assets/{el-GR-ZXDJ2OS4-BH0saXds.js → el-GR-ZXDJ2OS4-DFmRQv0o.js} +1 -1
  104. package/dist/client/assets/{en-IQZW2TQM-CzlcEpq3.js → en-CMP6EMR6-D9x8hVSu.js} +1 -1
  105. package/dist/client/assets/{erDiagram-INFDFZHY-DlIf-fb7.js → erDiagram-SMLLAGMA-6VFZA3Qb.js} +33 -18
  106. package/dist/client/assets/{es-ES-DYQHAD43-CyzL9Mni.js → es-ES-DYQHAD43-BiGWIrBG.js} +1 -1
  107. package/dist/client/assets/{eu-ES-QDSYU5Y3-D2-x316S.js → eu-ES-QDSYU5Y3-BjwS0kZi.js} +1 -1
  108. package/dist/client/assets/excalidraw-editor-BZCE9ydu.css +1 -0
  109. package/dist/client/assets/excalidraw-editor-hiJQt1cX.js +9 -0
  110. package/dist/client/assets/{excalidraw-mermaid-stub-Bwe-bKcT.js → excalidraw-mermaid-stub-Df0Q2qkW.js} +1 -1
  111. package/dist/client/assets/excalidraw-scene-MyNAJi2A.js +176 -0
  112. package/dist/client/assets/excalidrawEditor-BnbblxK4.js +2 -0
  113. package/dist/client/assets/{export-page-PeexH2QK.js → export-page-BKDarp9x.js} +3 -3
  114. package/dist/client/assets/exportDocument-CULEGKmb.js +2 -0
  115. package/dist/client/assets/{fa-IR-26LZG4PM-D8-trU2x.js → fa-IR-26LZG4PM-BgANg2TD.js} +1 -1
  116. package/dist/client/assets/{fcl-BWKK0S4-.js → fcl-CUXJFJn1.js} +1 -1
  117. package/dist/client/assets/{fi-FI-6YS4KDE4-CCdRVFDQ.js → fi-FI-6YS4KDE4-CBL5f3oN.js} +1 -1
  118. package/dist/client/assets/flatten-DjXjUsvv.js +1 -0
  119. package/dist/client/assets/flowDiagram-DWJPFMVM-DO9RH8YQ.js +162 -0
  120. package/dist/client/assets/{fr-FR-BRLLPTZC-Dqq-O5T_.js → fr-FR-BRLLPTZC-CRibNSLG.js} +1 -1
  121. package/dist/client/assets/ganttDiagram-T4ZO3ILL-B-NMvHWN.js +292 -0
  122. package/dist/client/assets/gitGraph-7Q5UKJZL-DWNinXu4.js +1 -0
  123. package/dist/client/assets/gitGraphDiagram-UUTBAWPF-B95qkCUx.js +106 -0
  124. package/dist/client/assets/{gl-ES-OKUZTLYG-BK7pbLbm.js → gl-ES-OKUZTLYG-DEDwa_xt.js} +1 -1
  125. package/dist/client/assets/graphlib-CAwOVCJc.js +1 -0
  126. package/dist/client/assets/{groovy-BEKazBrO.js → groovy-Di--Vb9Z.js} +1 -1
  127. package/dist/client/assets/{haxe-BY9d_5nB.js → haxe-CcPA1xnA.js} +1 -1
  128. package/dist/client/assets/{he-IL-26MGYIU7-C3BuYKyY.js → he-IL-26MGYIU7-47wxy70N.js} +1 -1
  129. package/dist/client/assets/{hi-IN-Q4ZOGTP2-BEvXWXnH.js → hi-IN-Q4ZOGTP2-bhV7c3dK.js} +1 -1
  130. package/dist/client/assets/{hu-HU-P2OXPSN5-BWWZeJNp.js → hu-HU-P2OXPSN5-xG-gBMzE.js} +1 -1
  131. package/dist/client/assets/{id-ID-2EIKXYN6-DxSKi_aJ.js → id-ID-2EIKXYN6-MQuYaNHo.js} +1 -1
  132. package/dist/client/assets/image-J2CAS7OM-DD4DaQTs.js +1 -0
  133. package/dist/client/assets/image-blob-reduce.esm-D8JQdTFk.js +2 -0
  134. package/dist/client/assets/{index-BLrtj9YM.js → index-BjdYZiBM.js} +2 -2
  135. package/dist/client/assets/{index-BIt5EZXz.css → index-BryqP9QY.css} +1 -1
  136. package/dist/client/assets/info-OMHHGYJF-DtYG_rX0.js +1 -0
  137. package/dist/client/assets/{infoDiagram-LFFYTUFH-DFTI0nfs.js → infoDiagram-42DDH7IO-C77Pt7T1.js} +1 -1
  138. package/dist/client/assets/isEmpty-CpfhGGBo.js +1 -0
  139. package/dist/client/assets/ishikawaDiagram-UXIWVN3A-Cy1fwvvg.js +70 -0
  140. package/dist/client/assets/{it-IT-4CFKVXI2-BmA8wW6q.js → it-IT-4CFKVXI2-v2kj-y7j.js} +1 -1
  141. package/dist/client/assets/{ja-JP-MAND2Z4V-CLS1jI9o.js → ja-JP-MAND2Z4V-BahXSQz-.js} +1 -1
  142. package/dist/client/assets/{javascript-CdiVhQeA.js → javascript-gTK9fxz6.js} +1 -1
  143. package/dist/client/assets/javascript-qUBHINSy.js +1 -0
  144. package/dist/client/assets/{journeyDiagram-4ABVD52K-DDur6iHm.js → journeyDiagram-VCZTEJTY-CYWaI6re.js} +2 -2
  145. package/dist/client/assets/{jsx-runtime-C2p7wRmT.js → jsx-runtime-1KUJVfx8.js} +1 -1
  146. package/dist/client/assets/{kaa-HQRTCXTJ-W15DEDPz.js → kaa-HQRTCXTJ-BF26ydFa.js} +1 -1
  147. package/dist/client/assets/{kab-KAB-JKIKKTGH-MLh1inqS.js → kab-KAB-JKIKKTGH-CEIH0F80.js} +1 -1
  148. package/dist/client/assets/{kanban-definition-K7BYSVSG-dA6NPLsg.js → kanban-definition-6JOO6SKY-DY1xE7tm.js} +2 -2
  149. package/dist/client/assets/{kk-KZ-HXQ63ZFC-BtFrPeLs.js → kk-KZ-HXQ63ZFC-CxWjc9Sf.js} +1 -1
  150. package/dist/client/assets/{km-KH-PKL3LSGX-xO5FyM9T.js → km-KH-PKL3LSGX-DJlCteEp.js} +1 -1
  151. package/dist/client/assets/{ko-KR-KXLREZX3-NZFoRybS.js → ko-KR-KXLREZX3-B1gtI_ci.js} +1 -1
  152. package/dist/client/assets/{ku-TR-MJ4IER3X-B5eVPIpK.js → ku-TR-MJ4IER3X-Bf41y2v2.js} +1 -1
  153. package/dist/client/assets/line-BCItEgq3.js +1 -0
  154. package/dist/client/assets/{linear-B2dOdA24.js → linear-dsIQT_iU.js} +1 -1
  155. package/dist/client/assets/{lt-LT-H6WFQ6FJ-D_7_OeJD.js → lt-LT-H6WFQ6FJ-DA1or-Eo.js} +1 -1
  156. package/dist/client/assets/{lua-kutgyRGY.js → lua-Cg0FqIlO.js} +1 -1
  157. package/dist/client/assets/{lv-LV-GOCK6SJW-CnpKr0oQ.js → lv-LV-GOCK6SJW-qa0BoYMm.js} +1 -1
  158. package/dist/client/assets/main-QJcxyvDa.js +1404 -0
  159. package/dist/client/assets/mermaid-parser.core-CsTVsPcD.js +4 -0
  160. package/dist/client/assets/mermaid-runtime-BGlnoUXY.js +11 -0
  161. package/dist/client/assets/{mindmap-definition-YRQLILUH-DjQcsPoe.js → mindmap-definition-QFDTVHPH-DB_M5r-j.js} +39 -11
  162. package/dist/client/assets/{mr-IN-IXVLDMEQ-Pht2X_GK.js → mr-IN-IXVLDMEQ-DXFRgvgb.js} +1 -1
  163. package/dist/client/assets/{my-MM-YG6MYTTD-Cgq4HhPO.js → my-MM-YG6MYTTD-BKDIfalJ.js} +1 -1
  164. package/dist/client/assets/{nb-NO-XGWJISD2-Bn_Bk2un.js → nb-NO-XGWJISD2-DbwbopH8.js} +1 -1
  165. package/dist/client/assets/{nl-NL-XVDVCPNC-YkWSJS94.js → nl-NL-XVDVCPNC-ChSneTSU.js} +1 -1
  166. package/dist/client/assets/{nn-NO-EMX5MJX5-DhP5eZJ7.js → nn-NO-EMX5MJX5-Cf7ZWKWZ.js} +1 -1
  167. package/dist/client/assets/{oc-FR-ROEINTVO-D3udMPnr.js → oc-FR-ROEINTVO-lM7Nl7hD.js} +1 -1
  168. package/dist/client/assets/{pa-IN-ZYN6SUDY-CR5YzFig.js → pa-IN-ZYN6SUDY-C9WNUTeR.js} +1 -1
  169. package/dist/client/assets/packet-4T2RLAQJ-CUVefhAv.js +1 -0
  170. package/dist/client/assets/percentages-5DKR754L-DuhOjTM2.js +1 -0
  171. package/dist/client/assets/pica-CgGaIJly.js +2 -0
  172. package/dist/client/assets/pie-ZZUOXDRM-BHBJ1dLX.js +1 -0
  173. package/dist/client/assets/pieDiagram-DEJITSTG-BOo-WzjZ.js +30 -0
  174. package/dist/client/assets/{pl-PL-6VTG7PHC-_wZuoIDM.js → pl-PL-6VTG7PHC-DqRVepnC.js} +1 -1
  175. package/dist/client/assets/{preview-diagram-utils-COt-IYMD.js → preview-diagram-utils-Nqpp4FNV.js} +1 -1
  176. package/dist/client/assets/preview-render-compiler-BCB8u6iM.js +1 -0
  177. package/dist/client/assets/{preview-render-compiler-BjLlHmiQ.js → preview-render-compiler-Tkc6JX1O.js} +2 -2
  178. package/dist/client/assets/{preview-render-profile-CR4dJZrp.js → preview-render-profile-Bf6R7v4w.js} +6 -6
  179. package/dist/client/assets/{preview-render-worker-B4dH2yxj.js → preview-render-worker-1LBLqgKu.js} +7 -7
  180. package/dist/client/assets/{pt-BR-5YFKRR5G-M7gIm2Hi.js → pt-BR-5YFKRR5G-CopLYEA6.js} +1 -1
  181. package/dist/client/assets/{pt-PT-GEIXXZ67-CcxWpkGj.js → pt-PT-GEIXXZ67-BjZ_Lphg.js} +1 -1
  182. package/dist/client/assets/{pug-DkUcLYWt.js → pug-lkTEco3G.js} +1 -1
  183. package/dist/client/assets/{python-CZtTmYkS.js → python-BUyhM0Ew.js} +1 -1
  184. package/dist/client/assets/{q-I27iQntV.js → q-Dls1OX0D.js} +1 -1
  185. package/dist/client/assets/{quadrantDiagram-337W2JSQ-CYKgdx7K.js → quadrantDiagram-34T5L4WZ-2vfo0l5S.js} +1 -1
  186. package/dist/client/assets/{quick-switcher-controller-DcyllYpm.js → quick-switcher-controller-B1erSgJ1.js} +1 -1
  187. package/dist/client/assets/{r-DN_EydfL.js → r-DeZ8Mdev.js} +1 -1
  188. package/dist/client/assets/radar-PYXPWWZC-2jR4qZNU.js +1 -0
  189. package/dist/client/assets/reduce-ChpYjEUB.js +1 -0
  190. package/dist/client/assets/requirementDiagram-MS252O5E-CtUIQnWa.js +84 -0
  191. package/dist/client/assets/{ro-RO-E2P6TFZI-qR9noVzP.js → ro-RO-E2P6TFZI-DakDz5Xu.js} +1 -1
  192. package/dist/client/assets/{room-yJaBAoEU.js → room-z2w9b96b.js} +1 -1
  193. package/dist/client/assets/{ru-RU-YBIIY43T-CE4S_RX8.js → ru-RU-YBIIY43T-BMvCT-XT.js} +1 -1
  194. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-CfHe3D6R.js → sankeyDiagram-XADWPNL6-tcSeuifE.js} +1 -1
  195. package/dist/client/assets/sequenceDiagram-FGHM5R23-DtF-1Kt2.js +157 -0
  196. package/dist/client/assets/{si-LK-673C2CI2-Bv6Avh3z.js → si-LK-673C2CI2-hGdH1S9E.js} +1 -1
  197. package/dist/client/assets/{sk-SK-CKZHQ4AP-Cnlpp55z.js → sk-SK-CKZHQ4AP-DiRA-fj8.js} +1 -1
  198. package/dist/client/assets/{sl-SI-557H2GWM-BfGq7AQF.js → sl-SI-557H2GWM-DN94n_1-.js} +1 -1
  199. package/dist/client/assets/{sparql-BOvq0dv7.js → sparql-vm8qNO8J.js} +1 -1
  200. package/dist/client/assets/sql-GL7dVWcd.js +1 -0
  201. package/dist/client/assets/src-BuiVcSz-.js +1 -0
  202. package/dist/client/assets/stateDiagram-FHFEXIEX-DKk7Sb0f.js +1 -0
  203. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-DJUaiADr.js +1 -0
  204. package/dist/client/assets/subset-shared.chunk-CWNYNLru.js +1 -0
  205. package/dist/client/assets/{subset-worker.chunk-BSCP6IiC.js → subset-worker.chunk-kj1e3wjW.js} +1 -1
  206. package/dist/client/assets/{sv-SE-XOPKKDWS-B2_Vk-sp.js → sv-SE-XOPKKDWS-CkHUNABj.js} +1 -1
  207. package/dist/client/assets/{swift-BCxe4-cw.js → swift-CKcKnWv9.js} +1 -1
  208. package/dist/client/assets/{ta-IN-XBH7DQI3-BXQMZZIx.js → ta-IN-XBH7DQI3-W-157oVK.js} +1 -1
  209. package/dist/client/assets/{th-TH-TOCWH3R4-C-ZIYMfH.js → th-TH-TOCWH3R4-BsU-Pydr.js} +1 -1
  210. package/dist/client/assets/timeline-definition-GMOUNBTQ-Bs6U53Mo.js +120 -0
  211. package/dist/client/assets/{tr-TR-GXW6CYY5-dl702PMA.js → tr-TR-GXW6CYY5-CTddyq89.js} +1 -1
  212. package/dist/client/assets/treeView-SZITEDCU-DN5dP2ol.js +1 -0
  213. package/dist/client/assets/treemap-W4RFUUIX-Dva7DBJR.js +1 -0
  214. package/dist/client/assets/{turtle-GBz_E4RG.js → turtle-BkP3ExOG.js} +1 -1
  215. package/dist/client/assets/{uk-UA-IJKTNUDG-CUYQvSSF.js → uk-UA-IJKTNUDG-1LzXkII3.js} +1 -1
  216. package/dist/client/assets/{uz-UZ-TBZZEA4V-B9qw0PXX.js → uz-UZ-TBZZEA4V-kqm-qcUj.js} +1 -1
  217. package/dist/client/assets/{vault-api-client-p7h7cXKM.js → vault-api-client-DSx3mWkH.js} +1 -1
  218. package/dist/client/assets/{vault-utils-5Xr0MXCb.js → vault-utils-CRpy8MQz.js} +1 -1
  219. package/dist/client/assets/vennDiagram-DHZGUBPP-DNnIjRae.js +34 -0
  220. package/dist/client/assets/{verilog-C4wTycyo.js → verilog-DSARZZPc.js} +1 -1
  221. package/dist/client/assets/{vhdl-Bwndeg44.js → vhdl-CnYyYTpa.js} +1 -1
  222. package/dist/client/assets/{vi-VN-MULSGNVB-DqxZ_sVc.js → vi-VN-MULSGNVB-C3H2AUhm.js} +1 -1
  223. package/dist/client/assets/wardley-RL74JXVD-CDZW5uzY.js +1 -0
  224. package/dist/client/assets/wardleyDiagram-NUSXRM2D-C-scJfPY.js +20 -0
  225. package/dist/client/assets/{xychartDiagram-JWTSCODW-C3vA70iJ.js → xychartDiagram-5P7HB3ND-D3nQoxhz.js} +6 -6
  226. package/dist/client/assets/yjs-provider-reset-guard-DSPzcvAO.js +4 -0
  227. package/dist/client/assets/{zh-CN-MVX3E32U-BM0aLuGc.js → zh-CN-MVX3E32U-BULPbsyl.js} +1 -1
  228. package/dist/client/assets/{zh-HK-JNU5RLIE-dmG_YD0d.js → zh-HK-JNU5RLIE-bNGmeSaW.js} +1 -1
  229. package/dist/client/assets/{zh-TW-LENVCA6T-LFgbiOi3.js → zh-TW-LENVCA6T-CQDp064P.js} +1 -1
  230. package/dist/client/drawio-editor.html +1 -1
  231. package/dist/client/excalidraw-editor.html +1 -1
  232. package/dist/client/export-document.html +1 -1
  233. package/dist/client/index.html +2 -2
  234. package/package.json +15 -15
  235. package/src/client/application/app-shell/presence-feature.js +265 -34
  236. package/src/client/application/app-shell/ui-feature-shell.js +31 -5
  237. package/src/client/application/app-shell/ui-feature-tab-activity.js +1 -0
  238. package/src/client/application/app-shell/workspace-feature.js +5 -2
  239. package/src/client/application/app-shell-elements.js +3 -0
  240. package/src/client/application/diagram-preview-export.js +304 -0
  241. package/src/client/application/mermaid-preview-hydrator.js +153 -23
  242. package/src/client/application/plantuml-preview-hydrator.js +155 -20
  243. package/src/client/application/preview-diagram-utils.js +48 -8
  244. package/src/client/application/preview-renderer.js +2 -0
  245. package/src/client/application/quick-switcher-loader.js +42 -0
  246. package/src/client/application/workspace-route-controller.js +35 -2
  247. package/src/client/application/workspace-state-store.js +1 -0
  248. package/src/client/bootstrap/collabmd-app-shell.js +25 -20
  249. package/src/client/domain/diagram-action-icons.js +21 -0
  250. package/src/client/domain/excalidraw-api-scene-sync.js +70 -0
  251. package/src/client/domain/keyboard-shortcuts.js +8 -0
  252. package/src/client/drawio-editor.js +13 -0
  253. package/src/client/excalidraw-editor.js +119 -18
  254. package/src/client/infrastructure/excalidraw-room-client.js +42 -5
  255. package/src/client/infrastructure/workspace-sync-client.js +26 -3
  256. package/src/client/presentation/app-shell-template.js +18 -1
  257. package/src/client/presentation/comment-ui/comment-ui-card.js +83 -3
  258. package/src/client/presentation/comment-ui/comment-ui-state.js +25 -2
  259. package/src/client/presentation/drawio-embed-controller.js +18 -0
  260. package/src/client/presentation/excalidraw-embed-controller.js +7 -0
  261. package/src/client/presentation/file-explorer-controller.js +10 -0
  262. package/src/client/presentation/file-explorer-view.js +6 -0
  263. package/src/client/presentation/git-panel-controller.js +2 -0
  264. package/src/client/presentation/image-lightbox-controller.js +290 -29
  265. package/src/client/styles/features/collaboration-presence.css +212 -0
  266. package/src/client/styles/features/diagram-preview.css +71 -4
  267. package/src/client/styles/features/embedded-preview.css +4 -6
  268. package/src/client/styles/features/media-lightbox.css +2 -0
  269. package/src/server/config/env.js +4 -0
  270. package/src/server/create-app-server.js +2 -0
  271. package/src/server/domain/backlink-index.js +33 -72
  272. package/src/server/domain/bases/base-index-snapshot-store.js +46 -62
  273. package/src/server/domain/bases/base-query-service.js +89 -7
  274. package/src/server/domain/collaboration/collaboration-room.js +10 -1
  275. package/src/server/domain/markdown-reference-extractor.js +233 -0
  276. package/src/server/infrastructure/http/create-request-handler.js +1 -0
  277. package/src/server/infrastructure/http/create-vault-api-handler.js +2 -0
  278. package/src/server/infrastructure/http/create-vault-api-query-handler.js +100 -26
  279. package/src/server/infrastructure/persistence/vault-file-store.js +175 -4
  280. package/src/server/infrastructure/workspace/file-system-sync-service.js +45 -21
  281. package/dist/client/assets/_basePickBy-Dv0sK1l7.js +0 -1
  282. package/dist/client/assets/_baseUniq-DKYX57ji.js +0 -1
  283. package/dist/client/assets/arc-DrfYGhWk.js +0 -1
  284. package/dist/client/assets/architecture-PBZL5I3N-DiglIZi9.js +0 -1
  285. package/dist/client/assets/blockDiagram-WCTKOSBZ-GIgTqnhk.js +0 -132
  286. package/dist/client/assets/c4Diagram-IC4MRINW-CkHO1i_L.js +0 -10
  287. package/dist/client/assets/channel-CgsU9TSN.js +0 -1
  288. package/dist/client/assets/chunk-7E7YKBS2-TdU92i9i.js +0 -1
  289. package/dist/client/assets/chunk-7R4GIKGN-mqd2GwMg.js +0 -80
  290. package/dist/client/assets/chunk-C72U2L5F-CJKQWBtz.js +0 -1
  291. package/dist/client/assets/chunk-DpHwWhuW.js +0 -1
  292. package/dist/client/assets/chunk-EGIJ26TM-C4nq20om.js +0 -1
  293. package/dist/client/assets/chunk-GEFDOKGD-Bs7FmFox.js +0 -2
  294. package/dist/client/assets/chunk-GLR3WWYH-qQe2O5VQ.js +0 -2
  295. package/dist/client/assets/chunk-HHEYEP7N-DlevL8bq.js +0 -1
  296. package/dist/client/assets/chunk-KYZI473N-CTSCuqRb.js +0 -53
  297. package/dist/client/assets/chunk-L3YUKLVL-CJZMBtKF.js +0 -1
  298. package/dist/client/assets/chunk-MX3YWQON-DQpSwRf6.js +0 -1
  299. package/dist/client/assets/chunk-NU2UP6EN-DlUENSHU.js +0 -35
  300. package/dist/client/assets/chunk-O4XLMI2P-CcVxZh41.js +0 -7
  301. package/dist/client/assets/chunk-OZEHJAEY-DjBZbgu0.js +0 -1
  302. package/dist/client/assets/chunk-QZHKN3VN-CgLPFSk5.js +0 -1
  303. package/dist/client/assets/chunk-R5LLSJPH-CkjKXM73.js +0 -1
  304. package/dist/client/assets/chunk-WL4C6EOR-axcuKSup.js +0 -189
  305. package/dist/client/assets/chunk-XIRO2GV7-4wqVHjs_.js +0 -1
  306. package/dist/client/assets/chunk-XZSTWKYB-C8Y_hIKZ.js +0 -94
  307. package/dist/client/assets/chunk-YBOYWFTD-CKg4ymFF.js +0 -1
  308. package/dist/client/assets/classDiagram-VBA2DB6C-BHZpvOxK.js +0 -1
  309. package/dist/client/assets/classDiagram-v2-RAHNMMFH-DA7HMUUs.js +0 -1
  310. package/dist/client/assets/clike-1_ZsiVV8.js +0 -1
  311. package/dist/client/assets/clone-Dgi8Z4IL.js +0 -1
  312. package/dist/client/assets/cytoscape.esm-Czjc507F.js +0 -321
  313. package/dist/client/assets/dagre-CfB3Fw33.js +0 -1
  314. package/dist/client/assets/dagre-KLK3FWXG-CC7tq2Ky.js +0 -4
  315. package/dist/client/assets/diagram-E7M64L7V-CMt7BN5M.js +0 -24
  316. package/dist/client/assets/diagram-IFDJBPK2-BFMBUGpd.js +0 -43
  317. package/dist/client/assets/diagram-P4PSJMXO-CviA1xXr.js +0 -24
  318. package/dist/client/assets/dist-3bQB_we3.js +0 -1
  319. package/dist/client/assets/dist-8Igu3Ee_2.js +0 -1
  320. package/dist/client/assets/dist-BU8uusJX.js +0 -1
  321. package/dist/client/assets/dist-BVB8rn7o.js +0 -1
  322. package/dist/client/assets/dist-D5QOYy7y.js +0 -6
  323. package/dist/client/assets/dist-DIi0uqLJ.js +0 -1
  324. package/dist/client/assets/dist-DJ16N7ol.js +0 -1
  325. package/dist/client/assets/dist-DWJL3_bF.js +0 -13
  326. package/dist/client/assets/dist-O1z0Ayg0.js +0 -1
  327. package/dist/client/assets/dist-OQE68wIX.js +0 -1
  328. package/dist/client/assets/dist-x7PIEmJu.js +0 -1
  329. package/dist/client/assets/drawio-editor-BMTwP5mD.js +0 -9
  330. package/dist/client/assets/editor-session-Dzy_85Wp.js +0 -16
  331. package/dist/client/assets/excalidraw-editor-CAP9F8CB.js +0 -9
  332. package/dist/client/assets/excalidraw-editor-Dj3i59LW.css +0 -1
  333. package/dist/client/assets/excalidraw-scene-BF_bT1OL.js +0 -176
  334. package/dist/client/assets/excalidrawEditor-DD4AvzYP.js +0 -2
  335. package/dist/client/assets/exportDocument-Zfwq1XVx.js +0 -2
  336. package/dist/client/assets/flowDiagram-PKNHOUZH-C_t-mkwb.js +0 -162
  337. package/dist/client/assets/ganttDiagram-A5KZAMGK-BtK9Tb--.js +0 -292
  338. package/dist/client/assets/gitGraph-HDMCJU4V-CT7YfbD3.js +0 -1
  339. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DULDLGiJ.js +0 -65
  340. package/dist/client/assets/graphlib-BgRST-Qg.js +0 -1
  341. package/dist/client/assets/image-XLNPCCAD-CFiKwiWK.js +0 -1
  342. package/dist/client/assets/image-blob-reduce.esm-DriR2zT9.js +0 -2
  343. package/dist/client/assets/info-3K5VOQVL-DUpNyDC-.js +0 -1
  344. package/dist/client/assets/isArrayLikeObject-BId_dPHM.js +0 -1
  345. package/dist/client/assets/isEmpty-CVvRj8fj.js +0 -1
  346. package/dist/client/assets/ishikawaDiagram-PHBUUO56-DpBuDpC6.js +0 -70
  347. package/dist/client/assets/javascript-UJe68_xi.js +0 -1
  348. package/dist/client/assets/line-B2GMovaI.js +0 -1
  349. package/dist/client/assets/main-CfSHaGes.js +0 -1368
  350. package/dist/client/assets/math-B-LMBwub.js +0 -1
  351. package/dist/client/assets/mermaid-parser.core-B1ogGcR8.js +0 -4
  352. package/dist/client/assets/mermaid-runtime-Bn8A6DGx.js +0 -11
  353. package/dist/client/assets/packet-RMMSAZCW-DEwNbIrA.js +0 -1
  354. package/dist/client/assets/percentages-5DKR754L-D7n4T776.js +0 -1
  355. package/dist/client/assets/pica-C1TdTz-C.js +0 -2
  356. package/dist/client/assets/pie-UPGHQEXC-D5M_lSjo.js +0 -1
  357. package/dist/client/assets/pieDiagram-SKSYHLDU-jhHouFpk.js +0 -30
  358. package/dist/client/assets/preview-render-compiler-Duy_3IcP.js +0 -1
  359. package/dist/client/assets/radar-KQ55EAFF-AU1qh3Bw.js +0 -1
  360. package/dist/client/assets/requirementDiagram-Z7DCOOCP-D9SHxoW7.js +0 -73
  361. package/dist/client/assets/sequenceDiagram-2WXFIKYE-CZsMMqAJ.js +0 -145
  362. package/dist/client/assets/sql-DDFeQNTK.js +0 -1
  363. package/dist/client/assets/src-Pgt9Gp65.js +0 -1
  364. package/dist/client/assets/stateDiagram-RAJIS63D-CoNZjTYV.js +0 -1
  365. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-1zOw6NmQ.js +0 -1
  366. package/dist/client/assets/subset-shared.chunk-C9HjwTXy.js +0 -1
  367. package/dist/client/assets/timeline-definition-YZTLITO2-DSe2mrG8.js +0 -61
  368. package/dist/client/assets/treemap-KZPCXAKY-C9UI2fwP.js +0 -1
  369. package/dist/client/assets/vennDiagram-LZ73GAT5-xSzaIpy1.js +0 -34
  370. package/dist/client/assets/yjs-provider-reset-guard-CtERLBID.js +0 -4
  371. /package/dist/client/assets/{drawio-room-DEivFyNV.js → drawio-room-1i6Nn0_Z.js} +0 -0
  372. /package/dist/client/assets/{excalidraw-mermaid-stub-BZPU4ZhU.js → excalidraw-mermaid-stub-DzxtBcQW.js} +0 -0
  373. /package/dist/client/assets/{file-kind-DBptLlF_.js → file-kind-DmKq2MvD.js} +0 -0
  374. /package/dist/client/assets/{rough.esm-DE_lJ5Ge.js → rough.esm-BU2knLt9.js} +0 -0
  375. /package/dist/client/assets/{runtime-config-CqhchMC4.js → runtime-config-DWTejofP.js} +0 -0
@@ -0,0 +1,304 @@
1
+ import {
2
+ isMermaidFilePath,
3
+ isPlantUmlFilePath,
4
+ stripVaultFileExtension,
5
+ } from '../../domain/file-kind.js';
6
+ import { sanitizeSvgMarkup, serializeSvgElement } from './preview-diagram-utils.js';
7
+
8
+ const LIGHT_EXPORT_MERMAID_CONFIG = Object.freeze({
9
+ htmlLabels: false,
10
+ flowchart: {
11
+ defaultRenderer: 'dagre-wrapper',
12
+ htmlLabels: false,
13
+ useMaxWidth: true,
14
+ },
15
+ class: {
16
+ defaultRenderer: 'dagre-wrapper',
17
+ htmlLabels: false,
18
+ useMaxWidth: true,
19
+ },
20
+ startOnLoad: false,
21
+ theme: 'default',
22
+ });
23
+ const MERMAID_INIT_DIRECTIVE_PATTERN = /^\s*%%\{\s*(?:init|initialize)\s*:[\s\S]*?\}%%\s*\n?/gim;
24
+
25
+ let mermaidExportCounter = 0;
26
+
27
+ function getPathLeaf(pathValue) {
28
+ return String(pathValue ?? '')
29
+ .replace(/\/+$/u, '')
30
+ .split('/')
31
+ .filter(Boolean)
32
+ .pop() || '';
33
+ }
34
+
35
+ function encodeSvgDataUrl(svgMarkup) {
36
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgMarkup)}`;
37
+ }
38
+
39
+ function createMermaidExportId() {
40
+ mermaidExportCounter += 1;
41
+ return `mermaid-export-${mermaidExportCounter.toString(36)}`;
42
+ }
43
+
44
+ function resolveSvgDimensions(svgElement) {
45
+ const widthAttr = Number.parseFloat(svgElement.getAttribute('width') || '');
46
+ const heightAttr = Number.parseFloat(svgElement.getAttribute('height') || '');
47
+ const viewBox = svgElement.getAttribute('viewBox') || '';
48
+ const viewBoxParts = viewBox.split(/\s+/u).map((value) => Number.parseFloat(value));
49
+
50
+ return {
51
+ height: Number.isFinite(heightAttr) && heightAttr > 0
52
+ ? heightAttr
53
+ : (Number.isFinite(viewBoxParts[3]) && viewBoxParts[3] > 0 ? viewBoxParts[3] : 800),
54
+ width: Number.isFinite(widthAttr) && widthAttr > 0
55
+ ? widthAttr
56
+ : (Number.isFinite(viewBoxParts[2]) && viewBoxParts[2] > 0 ? viewBoxParts[2] : 1200),
57
+ };
58
+ }
59
+
60
+ function loadImage(src) {
61
+ return new Promise((resolve, reject) => {
62
+ const image = new Image();
63
+ image.decoding = 'async';
64
+ image.addEventListener('load', () => resolve(image), { once: true });
65
+ image.addEventListener('error', () => reject(new Error(`Failed to load image: ${src}`)), { once: true });
66
+ image.src = src;
67
+ });
68
+ }
69
+
70
+ async function canvasToPngBlob(canvas) {
71
+ if (typeof canvas.toBlob === 'function') {
72
+ const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
73
+ if (blob instanceof Blob) {
74
+ return blob;
75
+ }
76
+ }
77
+
78
+ const dataUrl = canvas.toDataURL('image/png');
79
+ return dataUrlToBlob(dataUrl);
80
+ }
81
+
82
+ function dataUrlToBlob(dataUrl) {
83
+ const [header = '', payload = ''] = String(dataUrl).split(',', 2);
84
+ const mimeMatch = header.match(/^data:([^;,]+)?/u);
85
+ const mimeType = mimeMatch?.[1] || 'application/octet-stream';
86
+
87
+ if (header.includes(';base64')) {
88
+ const binary = atob(payload);
89
+ const bytes = new Uint8Array(binary.length);
90
+ for (let index = 0; index < binary.length; index += 1) {
91
+ bytes[index] = binary.charCodeAt(index);
92
+ }
93
+ return new Blob([bytes], { type: mimeType });
94
+ }
95
+
96
+ return new Blob([decodeURIComponent(payload)], { type: mimeType });
97
+ }
98
+
99
+ function cleanupExportSvg(svgElement) {
100
+ const clonedSvg = svgElement.cloneNode(true);
101
+ if (!(clonedSvg instanceof SVGSVGElement)) {
102
+ throw new Error('Renderer returned invalid SVG');
103
+ }
104
+
105
+ clonedSvg.style.removeProperty('display');
106
+ clonedSvg.style.removeProperty('margin');
107
+ clonedSvg.style.removeProperty('max-width');
108
+ clonedSvg.style.removeProperty('height');
109
+ clonedSvg.style.removeProperty('width');
110
+ clonedSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
111
+
112
+ const { width, height } = resolveSvgDimensions(clonedSvg);
113
+ clonedSvg.setAttribute('width', String(Math.max(1, Math.ceil(width))));
114
+ clonedSvg.setAttribute('height', String(Math.max(1, Math.ceil(height))));
115
+
116
+ return clonedSvg;
117
+ }
118
+
119
+ function trimExportSvgElement(svgElement, { padding = 16 } = {}) {
120
+ const cleanedSvg = cleanupExportSvg(svgElement);
121
+
122
+ if (typeof svgElement.getBBox !== 'function') {
123
+ return cleanedSvg;
124
+ }
125
+
126
+ try {
127
+ const bounds = svgElement.getBBox();
128
+ if (!bounds || bounds.width <= 0 || bounds.height <= 0) {
129
+ return cleanedSvg;
130
+ }
131
+
132
+ const inset = Math.max(0, Number(padding) || 0);
133
+ const width = Math.ceil(bounds.width + (inset * 2));
134
+ const height = Math.ceil(bounds.height + (inset * 2));
135
+ const viewBox = [
136
+ Math.floor(bounds.x - inset),
137
+ Math.floor(bounds.y - inset),
138
+ width,
139
+ height,
140
+ ];
141
+
142
+ cleanedSvg.setAttribute('viewBox', viewBox.join(' '));
143
+ cleanedSvg.setAttribute('width', String(width));
144
+ cleanedSvg.setAttribute('height', String(height));
145
+ cleanedSvg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
146
+ return cleanedSvg;
147
+ } catch {
148
+ return cleanedSvg;
149
+ }
150
+ }
151
+
152
+ export function createDiagramExportBaseName({
153
+ currentFilePath = '',
154
+ diagramKind = 'diagram',
155
+ sourceLine = '',
156
+ targetPath = '',
157
+ } = {}) {
158
+ const targetLeaf = getPathLeaf(targetPath);
159
+ if (targetLeaf) {
160
+ return stripVaultFileExtension(targetLeaf) || `${diagramKind}-diagram`;
161
+ }
162
+
163
+ const currentLeaf = getPathLeaf(currentFilePath);
164
+ const currentStem = stripVaultFileExtension(currentLeaf) || 'document';
165
+ const isStandaloneDiagram = (
166
+ (diagramKind === 'mermaid' && isMermaidFilePath(currentFilePath))
167
+ || (diagramKind === 'plantuml' && isPlantUmlFilePath(currentFilePath))
168
+ );
169
+
170
+ if (isStandaloneDiagram) {
171
+ return currentStem;
172
+ }
173
+
174
+ if (sourceLine) {
175
+ return `${currentStem}-${diagramKind}-L${sourceLine}`;
176
+ }
177
+
178
+ return `${currentStem}-${diagramKind}`;
179
+ }
180
+
181
+ export function createDiagramExportFileNames(options = {}) {
182
+ const baseName = createDiagramExportBaseName(options);
183
+ return {
184
+ baseName,
185
+ pngFileName: `${baseName}.png`,
186
+ svgFileName: `${baseName}.svg`,
187
+ };
188
+ }
189
+
190
+ export function exportSvgMarkupFromElement(svgElement) {
191
+ const cleanedSvg = cleanupExportSvg(svgElement);
192
+ return serializeSvgElement(cleanedSvg);
193
+ }
194
+
195
+ export function exportTrimmedSvgMarkupFromElement(svgElement, options = {}) {
196
+ return serializeSvgElement(trimExportSvgElement(svgElement, options));
197
+ }
198
+
199
+ function prepareMermaidExportSource(source) {
200
+ let text = String(source ?? '').replace(MERMAID_INIT_DIRECTIVE_PATTERN, '');
201
+
202
+ text = `%%{init: ${JSON.stringify(LIGHT_EXPORT_MERMAID_CONFIG)}}%%\n${text}`;
203
+
204
+ if (/^\s*gantt\b/m.test(text) && !/\btodayMarker\b/.test(text)) {
205
+ const lines = text.split('\n');
206
+ const ganttLineIndex = lines.findIndex((line) => /^\s*gantt\b/.test(line));
207
+ if (ganttLineIndex !== -1) {
208
+ lines.splice(ganttLineIndex + 1, 0, ' todayMarker off');
209
+ text = lines.join('\n');
210
+ }
211
+ }
212
+
213
+ return text;
214
+ }
215
+
216
+ export async function renderMermaidExportSvgMarkup(mermaid, source) {
217
+ if (!mermaid?.initialize || !mermaid?.run) {
218
+ throw new Error('Mermaid runtime is unavailable');
219
+ }
220
+
221
+ mermaid.initialize(LIGHT_EXPORT_MERMAID_CONFIG);
222
+
223
+ const renderHost = document.createElement('div');
224
+ renderHost.style.position = 'fixed';
225
+ renderHost.style.left = '-10000px';
226
+ renderHost.style.top = '0';
227
+ renderHost.style.width = '1200px';
228
+ renderHost.style.visibility = 'hidden';
229
+ renderHost.style.pointerEvents = 'none';
230
+ document.body.appendChild(renderHost);
231
+
232
+ try {
233
+ const diagram = document.createElement('div');
234
+ diagram.className = 'mermaid mermaid-export-node';
235
+ diagram.id = createMermaidExportId();
236
+ diagram.textContent = prepareMermaidExportSource(source);
237
+ renderHost.appendChild(diagram);
238
+
239
+ await mermaid.run({ nodes: [diagram] });
240
+ const svg = diagram.querySelector('svg');
241
+ if (!(svg instanceof SVGSVGElement)) {
242
+ throw new Error('Mermaid export returned no SVG');
243
+ }
244
+
245
+ return exportTrimmedSvgMarkupFromElement(svg, { padding: 24 });
246
+ } finally {
247
+ renderHost.remove();
248
+ }
249
+ }
250
+
251
+ export async function rasterizeSvgMarkupToPngBlob(svgMarkup) {
252
+ const safeSvgMarkup = sanitizeSvgMarkup(svgMarkup);
253
+ const image = await loadImage(encodeSvgDataUrl(safeSvgMarkup));
254
+
255
+ const probe = document.createElement('div');
256
+ probe.innerHTML = safeSvgMarkup;
257
+ const svgElement = probe.querySelector('svg');
258
+ const { width, height } = svgElement
259
+ ? resolveSvgDimensions(svgElement)
260
+ : {
261
+ height: image.naturalHeight || 800,
262
+ width: image.naturalWidth || 1200,
263
+ };
264
+
265
+ const canvas = document.createElement('canvas');
266
+ canvas.width = Math.max(1, Math.ceil(width));
267
+ canvas.height = Math.max(1, Math.ceil(height));
268
+
269
+ const context = canvas.getContext('2d');
270
+ if (!context) {
271
+ throw new Error('Canvas is unavailable');
272
+ }
273
+
274
+ context.fillStyle = '#ffffff';
275
+ context.fillRect(0, 0, canvas.width, canvas.height);
276
+ context.drawImage(image, 0, 0, canvas.width, canvas.height);
277
+ return canvasToPngBlob(canvas);
278
+ }
279
+
280
+ export function downloadBlob(blob, fileName) {
281
+ const downloadUrl = URL.createObjectURL(blob);
282
+ const anchor = document.createElement('a');
283
+ anchor.href = downloadUrl;
284
+ anchor.download = fileName;
285
+ anchor.style.display = 'none';
286
+ document.body.appendChild(anchor);
287
+ anchor.click();
288
+ window.setTimeout(() => {
289
+ anchor.remove();
290
+ URL.revokeObjectURL(downloadUrl);
291
+ }, 30_000);
292
+ }
293
+
294
+ export async function writeBlobToClipboard(blob) {
295
+ if (typeof ClipboardItem !== 'function' || !navigator.clipboard?.write) {
296
+ throw new Error('Clipboard image copy is unavailable');
297
+ }
298
+
299
+ await navigator.clipboard.write([
300
+ new ClipboardItem({
301
+ [blob.type || 'image/png']: blob,
302
+ }),
303
+ ]);
304
+ }
@@ -1,5 +1,12 @@
1
1
  import { clamp } from '../domain/vault-utils.js';
2
2
  import { setDiagramActionButtonIcon } from '../domain/diagram-action-icons.js';
3
+ import {
4
+ createDiagramExportFileNames,
5
+ downloadBlob,
6
+ rasterizeSvgMarkupToPngBlob,
7
+ renderMermaidExportSvgMarkup,
8
+ writeBlobToClipboard,
9
+ } from './diagram-preview-export.js';
3
10
  import { DiagramPreviewHydrator } from './diagram-preview-hydrator.js';
4
11
  import {
5
12
  createMermaidPlaceholderCard,
@@ -37,6 +44,8 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
37
44
  this.loader = null;
38
45
  this.runtime = null;
39
46
  this.shellRefits = new WeakMap();
47
+ this.shellResizeObservers = new WeakMap();
48
+ this.resizeObservers = new Set();
40
49
  this.activeMaximizedShell = null;
41
50
  this.maximizedRoot = null;
42
51
  }
@@ -45,6 +54,7 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
45
54
  this.cancelHydration();
46
55
  this.preservedShells.clear();
47
56
  this.clearActiveShell();
57
+ this.disconnectResizeObservers();
48
58
  this.maximizedRoot?.remove();
49
59
  this.maximizedRoot = null;
50
60
  }
@@ -70,6 +80,36 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
70
80
  }
71
81
  }
72
82
 
83
+ disconnectResizeObservers() {
84
+ this.resizeObservers.forEach((observer) => observer.disconnect());
85
+ this.resizeObservers.clear();
86
+ this.shellResizeObservers = new WeakMap();
87
+ }
88
+
89
+ disconnectShellResizeObserver(shell) {
90
+ const observer = this.shellResizeObservers.get(shell);
91
+ if (!observer) {
92
+ return;
93
+ }
94
+
95
+ observer.disconnect();
96
+ this.resizeObservers.delete(observer);
97
+ this.shellResizeObservers.delete(shell);
98
+ }
99
+
100
+ attachShellResizeObserver(shell, frame, onResize) {
101
+ this.disconnectShellResizeObserver(shell);
102
+ if (typeof ResizeObserver !== 'function' || !shell?.isConnected || !(frame instanceof HTMLElement)) {
103
+ return;
104
+ }
105
+
106
+ const observer = new ResizeObserver(() => onResize());
107
+ observer.observe(frame);
108
+ observer.observe(shell);
109
+ this.shellResizeObservers.set(shell, observer);
110
+ this.resizeObservers.add(observer);
111
+ }
112
+
73
113
  syncActiveShell() {
74
114
  if (
75
115
  this.activeMaximizedShell?.isConnected
@@ -347,6 +387,7 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
347
387
  }
348
388
 
349
389
  hydratedShells.forEach((shell) => {
390
+ this.disconnectShellResizeObserver(shell);
350
391
  this.shellRefits.delete(shell);
351
392
  shell.removeAttribute('data-mermaid-hydrated');
352
393
  shell.querySelector(':scope > .mermaid-toolbar')?.remove();
@@ -359,6 +400,43 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
359
400
  });
360
401
  }
361
402
 
403
+ async renderExportSvgMarkup(shell) {
404
+ const mermaid = await this.ensureMermaid();
405
+ try {
406
+ const source = shell.querySelector('.mermaid-source')?.textContent ?? '';
407
+ return await renderMermaidExportSvgMarkup(mermaid, source);
408
+ } finally {
409
+ this.configureMermaid(mermaid);
410
+ }
411
+ }
412
+
413
+ async copyExportImage(shell, exportFileNames) {
414
+ try {
415
+ const { pngFileName } = exportFileNames();
416
+ const pngBlob = await rasterizeSvgMarkupToPngBlob(await this.renderExportSvgMarkup(shell));
417
+ try {
418
+ await writeBlobToClipboard(pngBlob);
419
+ this.renderer.toastController?.show?.('Diagram copied');
420
+ } catch {
421
+ downloadBlob(pngBlob, pngFileName);
422
+ this.renderer.toastController?.show?.('Clipboard image copy is unavailable here. Downloaded PNG instead.');
423
+ }
424
+ } catch {
425
+ this.renderer.toastController?.show?.('Failed to copy diagram');
426
+ }
427
+ }
428
+
429
+ async downloadExportSvg(shell, exportFileNames) {
430
+ try {
431
+ const { svgFileName } = exportFileNames();
432
+ const svgBlob = new Blob([await this.renderExportSvgMarkup(shell)], { type: 'image/svg+xml;charset=utf-8' });
433
+ downloadBlob(svgBlob, svgFileName);
434
+ this.renderer.toastController?.show?.('Diagram download started');
435
+ } catch {
436
+ this.renderer.toastController?.show?.('Failed to download diagram');
437
+ }
438
+ }
439
+
362
440
  enhanceDiagram(shell, renderedDiagram) {
363
441
  const svg = renderedDiagram.querySelector('svg');
364
442
  if (!svg) {
@@ -368,18 +446,25 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
368
446
 
369
447
  const toolbar = document.createElement('div');
370
448
  toolbar.className = 'mermaid-toolbar diagram-preview-toolbar';
449
+ const leftGroup = document.createElement('div');
450
+ leftGroup.className = 'diagram-preview-toolbar-group diagram-preview-toolbar-group--zoom';
451
+ const rightGroup = document.createElement('div');
452
+ rightGroup.className = 'diagram-preview-toolbar-group diagram-preview-toolbar-group--actions';
371
453
 
372
454
  const decreaseButton = this.createZoomButton('−', 'Zoom out');
373
455
  const increaseButton = this.createZoomButton('+', 'Zoom in');
374
- const resetButton = this.createZoomButton('Reset', 'Reset zoom');
375
- const maximizeButton = this.createZoomButton('Max', 'Maximize diagram');
456
+ const resetButton = this.createZoomButton('', 'Reset zoom', { icon: 'fit' });
457
+ const copyButton = this.createZoomButton('', 'Copy image', { icon: 'copy' });
458
+ const downloadButton = this.createZoomButton('', 'Download SVG', { icon: 'download' });
459
+ const maximizeButton = this.createZoomButton('', 'Maximize diagram', { icon: 'maximize' });
376
460
  maximizeButton.classList.add('mermaid-maximize-btn');
377
- setDiagramActionButtonIcon(maximizeButton, 'maximize');
378
461
  const zoomLabel = document.createElement('span');
379
462
  zoomLabel.className = 'mermaid-zoom-label diagram-preview-zoom-label';
380
463
  zoomLabel.setAttribute('aria-live', 'polite');
381
464
 
382
- toolbar.append(decreaseButton, zoomLabel, resetButton, increaseButton, maximizeButton);
465
+ leftGroup.append(decreaseButton, zoomLabel, resetButton, increaseButton);
466
+ rightGroup.append(copyButton, downloadButton, maximizeButton);
467
+ toolbar.append(leftGroup, rightGroup);
383
468
 
384
469
  const frame = document.createElement('div');
385
470
  frame.className = 'mermaid-frame diagram-preview-frame';
@@ -389,6 +474,7 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
389
474
  let defaultZoom = 1;
390
475
  let zoomAnimationFrameId = null;
391
476
  let resetZoomFrameId = null;
477
+ let layoutFrameId = null;
392
478
  let hasManualZoom = false;
393
479
  let lastAutoFitViewportWidth = 0;
394
480
  let isPanning = false;
@@ -402,6 +488,13 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
402
488
  svg.style.margin = '0 auto';
403
489
  svg.style.maxWidth = 'none';
404
490
 
491
+ const exportFileNames = () => createDiagramExportFileNames({
492
+ currentFilePath: this.renderer.getSourceFilePath?.() ?? '',
493
+ diagramKind: 'mermaid',
494
+ sourceLine: shell.getAttribute('data-source-line') || '',
495
+ targetPath: shell.dataset.mermaidTarget || '',
496
+ });
497
+
405
498
  const calculateDefaultZoom = () => {
406
499
  const viewport = getFrameViewportSize(frame);
407
500
  if (!Number.isFinite(baseWidth) || baseWidth <= 0 || viewport.width <= 0) {
@@ -512,33 +605,44 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
512
605
  if (resetZoomFrameId) {
513
606
  cancelAnimationFrame(resetZoomFrameId);
514
607
  }
608
+ if (layoutFrameId) {
609
+ cancelAnimationFrame(layoutFrameId);
610
+ }
515
611
 
516
612
  resetZoomFrameId = requestAnimationFrame(() => {
517
- resetZoomFrameId = null;
518
- if (!shell.isConnected) {
519
- return;
520
- }
521
-
522
- const viewportWidth = getFrameViewportSize(frame).width;
523
- const viewportChanged = Math.abs(viewportWidth - lastAutoFitViewportWidth) > 1;
524
- if (!force && hasManualZoom) {
525
- return;
526
- }
527
- if (!force && lastAutoFitViewportWidth > 0 && !viewportChanged) {
528
- return;
529
- }
530
-
531
- resetZoomToFit();
613
+ layoutFrameId = requestAnimationFrame(() => {
614
+ layoutFrameId = requestAnimationFrame(() => {
615
+ layoutFrameId = null;
616
+ resetZoomFrameId = null;
617
+ if (!shell.isConnected) {
618
+ return;
619
+ }
620
+
621
+ const viewportWidth = getFrameViewportSize(frame).width;
622
+ const viewportChanged = Math.abs(viewportWidth - lastAutoFitViewportWidth) > 1;
623
+ if (!force && hasManualZoom) {
624
+ return;
625
+ }
626
+ if (!force && viewportWidth > 0 && lastAutoFitViewportWidth > 0 && !viewportChanged) {
627
+ return;
628
+ }
629
+
630
+ resetZoomToFit();
631
+ });
632
+ });
532
633
  });
533
634
  };
534
635
 
535
636
  this.shellRefits.set(shell, scheduleResetZoomToFit);
637
+ this.attachShellResizeObserver(shell, frame, () => scheduleResetZoomToFit());
536
638
 
537
639
  decreaseButton.addEventListener('click', () => zoomBy(-MERMAID_ZOOM.step));
538
640
  increaseButton.addEventListener('click', () => zoomBy(MERMAID_ZOOM.step));
539
641
  resetButton.addEventListener('click', () => {
540
- resetZoomToFit({ animate: true });
642
+ scheduleResetZoomToFit({ force: true });
541
643
  });
644
+ copyButton.addEventListener('click', () => this.copyExportImage(shell, exportFileNames));
645
+ downloadButton.addEventListener('click', () => this.downloadExportSvg(shell, exportFileNames));
542
646
 
543
647
  const syncMaximizeButtonState = () => {
544
648
  const isMaximized = shell.classList.contains('is-maximized');
@@ -598,6 +702,12 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
598
702
 
599
703
  isPanning = false;
600
704
  frame.classList.remove('is-dragging');
705
+ window.removeEventListener('pointerup', stopPanning, true);
706
+ window.removeEventListener('pointercancel', stopPanning, true);
707
+ window.removeEventListener('mouseup', stopPanning, true);
708
+ window.removeEventListener('touchend', stopPanning, true);
709
+ window.removeEventListener('touchcancel', stopPanning, true);
710
+ window.removeEventListener('blur', stopPanning, true);
601
711
 
602
712
  if (activePointerId !== null && typeof frame.releasePointerCapture === 'function') {
603
713
  try {
@@ -628,7 +738,19 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
628
738
  panStartScrollTop = frame.scrollTop;
629
739
 
630
740
  frame.classList.add('is-dragging');
631
- frame.setPointerCapture?.(event.pointerId);
741
+ window.addEventListener('pointerup', stopPanning, true);
742
+ window.addEventListener('pointercancel', stopPanning, true);
743
+ window.addEventListener('mouseup', stopPanning, true);
744
+ window.addEventListener('touchend', stopPanning, true);
745
+ window.addEventListener('touchcancel', stopPanning, true);
746
+ window.addEventListener('blur', stopPanning, true);
747
+ if (typeof frame.setPointerCapture === 'function') {
748
+ try {
749
+ frame.setPointerCapture(event.pointerId);
750
+ } catch {
751
+ // Safari can reject pointer capture during rapid layout transitions.
752
+ }
753
+ }
632
754
  event.preventDefault();
633
755
  });
634
756
 
@@ -644,6 +766,10 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
644
766
  frame.addEventListener('pointerup', stopPanning);
645
767
  frame.addEventListener('pointercancel', stopPanning);
646
768
  frame.addEventListener('lostpointercapture', stopPanning);
769
+ frame.addEventListener('mouseleave', stopPanning);
770
+ frame.addEventListener('mouseup', stopPanning);
771
+ frame.addEventListener('touchend', stopPanning);
772
+ frame.addEventListener('touchcancel', stopPanning);
647
773
 
648
774
  frame.appendChild(svg);
649
775
  const sourceNode = shell.querySelector('.mermaid-source');
@@ -675,13 +801,17 @@ export class MermaidPreviewHydrator extends DiagramPreviewHydrator {
675
801
  });
676
802
  }
677
803
 
678
- createZoomButton(label, ariaLabel) {
804
+ createZoomButton(label, ariaLabel, { icon = '' } = {}) {
679
805
  const button = document.createElement('button');
680
806
  button.type = 'button';
681
807
  button.className = 'mermaid-zoom-btn ui-preview-action';
682
808
  button.setAttribute('aria-label', ariaLabel);
683
809
  button.title = ariaLabel;
684
- button.textContent = label;
810
+ if (icon) {
811
+ setDiagramActionButtonIcon(button, icon);
812
+ } else {
813
+ button.textContent = label;
814
+ }
685
815
  return button;
686
816
  }
687
817
  }