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
@@ -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
+ exportSvgMarkupFromElement,
7
+ rasterizeSvgMarkupToPngBlob,
8
+ writeBlobToClipboard,
9
+ } from './diagram-preview-export.js';
3
10
  import { DiagramPreviewHydrator } from './diagram-preview-hydrator.js';
4
11
  import {
5
12
  createPlantUmlPlaceholderCard,
@@ -36,6 +43,8 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
36
43
  this.svgCache = new Map();
37
44
  this.svgInflightRequests = new Map();
38
45
  this.shellRefits = new WeakMap();
46
+ this.shellResizeObservers = new WeakMap();
47
+ this.resizeObservers = new Set();
39
48
  this.activeMaximizedShell = null;
40
49
  this.maximizedRoot = null;
41
50
  this.resizeFrameId = null;
@@ -49,10 +58,41 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
49
58
  cancelAnimationFrame(this.resizeFrameId);
50
59
  this.resizeFrameId = null;
51
60
  }
61
+ this.disconnectResizeObservers();
52
62
  this.maximizedRoot?.remove();
53
63
  this.maximizedRoot = null;
54
64
  }
55
65
 
66
+ disconnectResizeObservers() {
67
+ this.resizeObservers.forEach((observer) => observer.disconnect());
68
+ this.resizeObservers.clear();
69
+ this.shellResizeObservers = new WeakMap();
70
+ }
71
+
72
+ disconnectShellResizeObserver(shell) {
73
+ const observer = this.shellResizeObservers.get(shell);
74
+ if (!observer) {
75
+ return;
76
+ }
77
+
78
+ observer.disconnect();
79
+ this.resizeObservers.delete(observer);
80
+ this.shellResizeObservers.delete(shell);
81
+ }
82
+
83
+ attachShellResizeObserver(shell, frame, onResize) {
84
+ this.disconnectShellResizeObserver(shell);
85
+ if (typeof ResizeObserver !== 'function' || !shell?.isConnected || !(frame instanceof HTMLElement)) {
86
+ return;
87
+ }
88
+
89
+ const observer = new ResizeObserver(() => onResize());
90
+ observer.observe(frame);
91
+ observer.observe(shell);
92
+ this.shellResizeObservers.set(shell, observer);
93
+ this.resizeObservers.add(observer);
94
+ }
95
+
56
96
  clearActiveShell() {
57
97
  this.activeMaximizedShell = null;
58
98
  if (this.maximizedRoot && this.maximizedRoot.childElementCount === 0) {
@@ -228,6 +268,7 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
228
268
  this.svgInflightRequests.delete(source);
229
269
  }
230
270
 
271
+ this.disconnectShellResizeObserver(shell);
231
272
  this.shellRefits.delete(shell);
232
273
  if (this.activeMaximizedShell === shell) {
233
274
  this.restoreShellMount(shell);
@@ -261,27 +302,38 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
261
302
 
262
303
  const toolbar = document.createElement('div');
263
304
  toolbar.className = 'plantuml-toolbar diagram-preview-toolbar';
305
+ const leftGroup = document.createElement('div');
306
+ leftGroup.className = 'diagram-preview-toolbar-group diagram-preview-toolbar-group--zoom';
307
+ const rightGroup = document.createElement('div');
308
+ rightGroup.className = 'diagram-preview-toolbar-group diagram-preview-toolbar-group--actions';
264
309
 
265
310
  const frame = document.createElement('div');
266
311
  frame.className = 'plantuml-frame diagram-preview-frame';
267
312
  const decreaseButton = this.createToolButton('−', 'Zoom out');
268
313
  const increaseButton = this.createToolButton('+', 'Zoom in');
269
- const resetButton = this.createToolButton('Reset', 'Reset zoom');
270
- const reloadButton = this.createToolButton('Reload', 'Reload diagram');
271
- const maximizeButton = this.createToolButton('Max', 'Maximize diagram');
314
+ const resetButton = this.createToolButton('', 'Reset zoom', { icon: 'fit' });
315
+ const copyButton = this.createToolButton('', 'Copy image', { icon: 'copy' });
316
+ const downloadButton = this.createToolButton('', 'Download SVG', { icon: 'download' });
317
+ const reloadButton = this.createToolButton('', 'Reload diagram', { icon: 'refresh' });
318
+ const maximizeButton = this.createToolButton('', 'Maximize diagram', { icon: 'maximize' });
272
319
  maximizeButton.classList.add('plantuml-maximize-btn');
273
- setDiagramActionButtonIcon(reloadButton, 'refresh');
274
- setDiagramActionButtonIcon(maximizeButton, 'maximize');
275
320
  const zoomLabel = document.createElement('span');
276
321
  zoomLabel.className = 'plantuml-zoom-label diagram-preview-zoom-label';
277
322
  zoomLabel.setAttribute('aria-live', 'polite');
278
323
 
279
- toolbar.append(decreaseButton, zoomLabel, resetButton, increaseButton, reloadButton, maximizeButton);
324
+ leftGroup.append(decreaseButton, zoomLabel, resetButton, increaseButton);
325
+ rightGroup.append(copyButton, downloadButton, reloadButton, maximizeButton);
326
+ toolbar.append(leftGroup, rightGroup);
280
327
 
281
328
  const { width: baseWidth, height: baseHeight } = getSvgSize(svg);
282
329
  let currentZoom = PLANTUML_ZOOM.default;
283
330
  let defaultZoom = 1;
284
331
  let zoomAnimationFrameId = null;
332
+ let resetZoomFrameId = null;
333
+ let layoutFrameId = null;
334
+ let hasManualZoom = false;
335
+ let lastAutoFitViewportWidth = 0;
336
+ let shouldForceScheduledReset = false;
285
337
  let isPanning = false;
286
338
  let activePointerId = null;
287
339
  let panStartX = 0;
@@ -293,6 +345,15 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
293
345
  svg.style.margin = '0 auto';
294
346
  svg.style.maxWidth = 'none';
295
347
 
348
+ const exportSvgMarkup = () => exportSvgMarkupFromElement(svg);
349
+
350
+ const exportFileNames = () => createDiagramExportFileNames({
351
+ currentFilePath: this.renderer.getSourceFilePath?.() ?? '',
352
+ diagramKind: 'plantuml',
353
+ sourceLine: shell.getAttribute('data-source-line') || '',
354
+ targetPath: shell.dataset.plantumlTarget || '',
355
+ });
356
+
296
357
  const calculateDefaultZoom = () => {
297
358
  const viewport = getFrameViewportSize(frame);
298
359
  if (!Number.isFinite(baseWidth) || baseWidth <= 0 || viewport.width <= 0) {
@@ -369,11 +430,14 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
369
430
  };
370
431
 
371
432
  const zoomBy = (delta) => {
433
+ hasManualZoom = true;
372
434
  animateZoomTo(currentZoom + delta);
373
435
  };
374
436
 
375
437
  const resetZoomToFit = ({ animate = false } = {}) => {
376
438
  defaultZoom = calculateDefaultZoom();
439
+ hasManualZoom = false;
440
+ lastAutoFitViewportWidth = getFrameViewportSize(frame).width;
377
441
 
378
442
  if (animate && Math.abs(defaultZoom - currentZoom) > 0.001) {
379
443
  animateZoomTo(defaultZoom);
@@ -390,28 +454,73 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
390
454
  frame.scrollTop = 0;
391
455
  };
392
456
 
393
- let resetZoomFrameId = null;
394
- const scheduleResetZoomToFit = () => {
457
+ const scheduleResetZoomToFit = ({ force = false } = {}) => {
458
+ shouldForceScheduledReset = shouldForceScheduledReset || force;
395
459
  if (resetZoomFrameId) {
396
460
  cancelAnimationFrame(resetZoomFrameId);
397
461
  }
462
+ if (layoutFrameId) {
463
+ cancelAnimationFrame(layoutFrameId);
464
+ }
398
465
 
399
466
  resetZoomFrameId = requestAnimationFrame(() => {
400
- resetZoomFrameId = null;
401
- if (!shell.isConnected) {
402
- return;
403
- }
404
-
405
- resetZoomToFit();
467
+ layoutFrameId = requestAnimationFrame(() => {
468
+ layoutFrameId = requestAnimationFrame(() => {
469
+ layoutFrameId = null;
470
+ resetZoomFrameId = null;
471
+ if (!shell.isConnected) {
472
+ return;
473
+ }
474
+
475
+ const shouldForce = shouldForceScheduledReset;
476
+ shouldForceScheduledReset = false;
477
+ const viewportWidth = getFrameViewportSize(frame).width;
478
+ const viewportChanged = Math.abs(viewportWidth - lastAutoFitViewportWidth) > 1;
479
+ if (!shouldForce && hasManualZoom) {
480
+ return;
481
+ }
482
+ if (!shouldForce && viewportWidth > 0 && lastAutoFitViewportWidth > 0 && !viewportChanged) {
483
+ return;
484
+ }
485
+
486
+ resetZoomToFit();
487
+ });
488
+ });
406
489
  });
407
490
  };
408
491
 
409
492
  this.shellRefits.set(shell, scheduleResetZoomToFit);
493
+ this.attachShellResizeObserver(shell, frame, () => scheduleResetZoomToFit());
410
494
 
411
495
  decreaseButton.addEventListener('click', () => zoomBy(-PLANTUML_ZOOM.step));
412
496
  increaseButton.addEventListener('click', () => zoomBy(PLANTUML_ZOOM.step));
413
497
  resetButton.addEventListener('click', () => {
414
- resetZoomToFit({ animate: true });
498
+ scheduleResetZoomToFit({ force: true });
499
+ });
500
+ copyButton.addEventListener('click', async () => {
501
+ try {
502
+ const { pngFileName } = exportFileNames();
503
+ const pngBlob = await rasterizeSvgMarkupToPngBlob(exportSvgMarkup());
504
+ try {
505
+ await writeBlobToClipboard(pngBlob);
506
+ this.renderer.toastController?.show?.('Diagram copied');
507
+ } catch {
508
+ downloadBlob(pngBlob, pngFileName);
509
+ this.renderer.toastController?.show?.('Clipboard image copy is unavailable here. Downloaded PNG instead.');
510
+ }
511
+ } catch {
512
+ this.renderer.toastController?.show?.('Failed to copy diagram');
513
+ }
514
+ });
515
+ downloadButton.addEventListener('click', () => {
516
+ try {
517
+ const { svgFileName } = exportFileNames();
518
+ const svgBlob = new Blob([exportSvgMarkup()], { type: 'image/svg+xml;charset=utf-8' });
519
+ downloadBlob(svgBlob, svgFileName);
520
+ this.renderer.toastController?.show?.('Diagram download started');
521
+ } catch {
522
+ this.renderer.toastController?.show?.('Failed to download diagram');
523
+ }
415
524
  });
416
525
 
417
526
  const syncMaximizeButtonState = () => {
@@ -445,7 +554,7 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
445
554
  this.activeMaximizedShell = shell;
446
555
  document.body.classList.add('plantuml-maximized-open');
447
556
  syncMaximizeButtonState();
448
- scheduleResetZoomToFit();
557
+ scheduleResetZoomToFit({ force: true });
449
558
  return;
450
559
  }
451
560
 
@@ -458,7 +567,7 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
458
567
  document.body.classList.remove('plantuml-maximized-open');
459
568
  }
460
569
  syncMaximizeButtonState();
461
- scheduleResetZoomToFit();
570
+ scheduleResetZoomToFit({ force: true });
462
571
  };
463
572
 
464
573
  reloadButton.addEventListener('click', () => {
@@ -481,6 +590,12 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
481
590
 
482
591
  isPanning = false;
483
592
  frame.classList.remove('is-dragging');
593
+ window.removeEventListener('pointerup', stopPanning, true);
594
+ window.removeEventListener('pointercancel', stopPanning, true);
595
+ window.removeEventListener('mouseup', stopPanning, true);
596
+ window.removeEventListener('touchend', stopPanning, true);
597
+ window.removeEventListener('touchcancel', stopPanning, true);
598
+ window.removeEventListener('blur', stopPanning, true);
484
599
 
485
600
  if (activePointerId !== null && typeof frame.releasePointerCapture === 'function') {
486
601
  try {
@@ -511,7 +626,19 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
511
626
  panStartScrollTop = frame.scrollTop;
512
627
 
513
628
  frame.classList.add('is-dragging');
514
- frame.setPointerCapture?.(event.pointerId);
629
+ window.addEventListener('pointerup', stopPanning, true);
630
+ window.addEventListener('pointercancel', stopPanning, true);
631
+ window.addEventListener('mouseup', stopPanning, true);
632
+ window.addEventListener('touchend', stopPanning, true);
633
+ window.addEventListener('touchcancel', stopPanning, true);
634
+ window.addEventListener('blur', stopPanning, true);
635
+ if (typeof frame.setPointerCapture === 'function') {
636
+ try {
637
+ frame.setPointerCapture(event.pointerId);
638
+ } catch {
639
+ // Safari can reject pointer capture during rapid layout transitions.
640
+ }
641
+ }
515
642
  event.preventDefault();
516
643
  });
517
644
 
@@ -527,6 +654,10 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
527
654
  frame.addEventListener('pointerup', stopPanning);
528
655
  frame.addEventListener('pointercancel', stopPanning);
529
656
  frame.addEventListener('lostpointercapture', stopPanning);
657
+ frame.addEventListener('mouseleave', stopPanning);
658
+ frame.addEventListener('mouseup', stopPanning);
659
+ frame.addEventListener('touchend', stopPanning);
660
+ frame.addEventListener('touchcancel', stopPanning);
530
661
 
531
662
  frame.appendChild(svg);
532
663
  const sourceNode = shell.querySelector('.plantuml-source');
@@ -541,13 +672,17 @@ export class PlantUmlPreviewHydrator extends DiagramPreviewHydrator {
541
672
  applyZoom(defaultZoom);
542
673
  }
543
674
 
544
- createToolButton(label, ariaLabel) {
675
+ createToolButton(label, ariaLabel, { icon = '' } = {}) {
545
676
  const button = document.createElement('button');
546
677
  button.type = 'button';
547
678
  button.className = 'plantuml-tool-btn ui-preview-action';
548
679
  button.setAttribute('aria-label', ariaLabel);
549
680
  button.title = ariaLabel;
550
- button.textContent = label;
681
+ if (icon) {
682
+ setDiagramActionButtonIcon(button, icon);
683
+ } else {
684
+ button.textContent = label;
685
+ }
551
686
  return button;
552
687
  }
553
688
  }
@@ -165,20 +165,30 @@ export function createPlantUmlPlaceholderCard(key, message = 'Renders server-sid
165
165
  return card;
166
166
  }
167
167
 
168
- export function sanitizeSvgMarkup(svgMarkup) {
169
- const parser = new DOMParser();
170
- const documentNode = parser.parseFromString(svgMarkup, 'image/svg+xml');
171
- const svg = documentNode.documentElement;
168
+ const SHOW_COMMENT_NODE = 128;
169
+
170
+ function removeSvgComments(rootElement) {
171
+ const walker = rootElement.ownerDocument.createTreeWalker(rootElement, SHOW_COMMENT_NODE);
172
+ const comments = [];
173
+
174
+ while (walker.nextNode()) {
175
+ comments.push(walker.currentNode);
176
+ }
172
177
 
173
- if (!svg || svg.nodeName.toLowerCase() !== 'svg') {
178
+ comments.forEach((comment) => comment.remove());
179
+ }
180
+
181
+ export function sanitizeSvgElement(svgElement) {
182
+ if (!(svgElement instanceof SVGSVGElement)) {
174
183
  throw new Error('Renderer returned invalid SVG');
175
184
  }
176
185
 
177
- documentNode.querySelectorAll('script, foreignObject').forEach((node) => {
186
+ removeSvgComments(svgElement);
187
+ svgElement.querySelectorAll('script, foreignObject').forEach((node) => {
178
188
  node.remove();
179
189
  });
180
190
 
181
- Array.from(documentNode.querySelectorAll('*')).forEach((element) => {
191
+ [svgElement, ...Array.from(svgElement.querySelectorAll('*'))].forEach((element) => {
182
192
  Array.from(element.attributes).forEach((attribute) => {
183
193
  const name = attribute.name.toLowerCase();
184
194
  const value = attribute.value || '';
@@ -193,7 +203,37 @@ export function sanitizeSvgMarkup(svgMarkup) {
193
203
  });
194
204
  });
195
205
 
196
- return svg.outerHTML;
206
+ return svgElement;
207
+ }
208
+
209
+ export function serializeSvgElement(svgElement) {
210
+ const sanitizedSvg = sanitizeSvgElement(svgElement);
211
+ return new XMLSerializer().serializeToString(sanitizedSvg);
212
+ }
213
+
214
+ function parseSvgMarkup(svgMarkup) {
215
+ const normalizedMarkup = String(svgMarkup ?? '')
216
+ .replace(/<!--[\s\S]*?-->/gu, '')
217
+ .replace(/&nbsp;/giu, '&#160;');
218
+
219
+ const parser = new DOMParser();
220
+ const documentNode = parser.parseFromString(normalizedMarkup, 'image/svg+xml');
221
+ const svg = documentNode.documentElement;
222
+ if (svg?.nodeName.toLowerCase() === 'svg' && !documentNode.querySelector('parsererror')) {
223
+ return svg;
224
+ }
225
+
226
+ const fallbackDocument = parser.parseFromString(normalizedMarkup, 'text/html');
227
+ return fallbackDocument.querySelector('svg');
228
+ }
229
+
230
+ export function sanitizeSvgMarkup(svgMarkup) {
231
+ const svg = parseSvgMarkup(svgMarkup);
232
+ if (!(svg instanceof SVGSVGElement)) {
233
+ throw new Error('Renderer returned invalid SVG');
234
+ }
235
+
236
+ return serializeSvgElement(svg);
197
237
  }
198
238
 
199
239
  export function shouldPreserveHydratedDiagram({ nextSource = '', nextTarget = '', preservedSource = '', preservedTarget = '' } = {}) {
@@ -20,6 +20,7 @@ export class PreviewRenderer {
20
20
  plantUmlRenderClient = null,
21
21
  previewContainer,
22
22
  previewElement,
23
+ toastController = null,
23
24
  }) {
24
25
  this.getContent = getContent;
25
26
  this.getFileList = getFileList;
@@ -33,6 +34,7 @@ export class PreviewRenderer {
33
34
  this.plantUmlRenderClient = plantUmlRenderClient;
34
35
  this.previewContainer = previewContainer;
35
36
  this.previewElement = previewElement;
37
+ this.toastController = toastController;
36
38
  this.renderHost = null;
37
39
 
38
40
  this.pendingRenderVersion = 0;
@@ -0,0 +1,42 @@
1
+ export async function ensureQuickSwitcherInstance(host) {
2
+ if (host.quickSwitcher) {
3
+ return host.quickSwitcher;
4
+ }
5
+
6
+ if (!host.quickSwitcherModulePromise) {
7
+ host.quickSwitcherModulePromise = host.loadQuickSwitcherController();
8
+ }
9
+
10
+ let QuickSwitcherController;
11
+ try {
12
+ QuickSwitcherController = await host.quickSwitcherModulePromise;
13
+ } catch (error) {
14
+ host.quickSwitcherModulePromise = null;
15
+ console.error('[quick-switcher] Failed to load file search.', error);
16
+ host.toastController?.show?.('Failed to load file search. Try again.', {
17
+ dismissible: true,
18
+ });
19
+ throw error;
20
+ }
21
+
22
+ if (!host.quickSwitcher) {
23
+ host.quickSwitcher = new QuickSwitcherController({
24
+ getFileList: () => host.fileExplorer.flatFiles,
25
+ onFileSelect: (filePath) => host.handleFileSelection(filePath, {
26
+ closeSidebarOnMobile: true,
27
+ revealInTree: true,
28
+ }),
29
+ });
30
+ }
31
+
32
+ return host.quickSwitcher;
33
+ }
34
+
35
+ export async function toggleQuickSwitcherInstance(host) {
36
+ try {
37
+ const quickSwitcher = await ensureQuickSwitcherInstance(host);
38
+ quickSwitcher.toggle();
39
+ } catch {
40
+ // ensureQuickSwitcherInstance reports the load failure and resets the cached import.
41
+ }
42
+ }
@@ -24,6 +24,7 @@ export class WorkspaceRouteController {
24
24
  setSession,
25
25
  setSessionLoadToken,
26
26
  setSidebarTab,
27
+ setSidebarVisibility,
27
28
  setCurrentFilePath,
28
29
  showGitCommit,
29
30
  showGitDiff,
@@ -59,6 +60,7 @@ export class WorkspaceRouteController {
59
60
  this.setSession = setSession;
60
61
  this.setSessionLoadToken = setSessionLoadToken;
61
62
  this.setSidebarTab = setSidebarTab;
63
+ this.setSidebarVisibility = setSidebarVisibility ?? (() => {});
62
64
  this.setCurrentFilePath = setCurrentFilePath;
63
65
  this.showGitCommit = showGitCommit;
64
66
  this.showGitDiff = showGitDiff;
@@ -69,6 +71,7 @@ export class WorkspaceRouteController {
69
71
  this.videoEmbed = videoEmbed;
70
72
  this.workspaceCoordinator = workspaceCoordinator;
71
73
  this.layoutController = layoutController;
74
+ this.pendingTreeRevealPath = null;
72
75
  }
73
76
 
74
77
  async handleHashChange() {
@@ -246,6 +249,11 @@ export class WorkspaceRouteController {
246
249
  }
247
250
 
248
251
  async openFile(filePath, options = {}) {
252
+ const shouldRevealInTree = this.pendingTreeRevealPath === filePath;
253
+ if (shouldRevealInTree) {
254
+ this.pendingTreeRevealPath = null;
255
+ }
256
+
249
257
  this.imageLightbox?.close?.();
250
258
  this.gitPanel.setSelection();
251
259
  this.gitDiffView.hide();
@@ -254,6 +262,10 @@ export class WorkspaceRouteController {
254
262
  this.syncMainChrome({ mode: 'editor' });
255
263
  await this.workspaceCoordinator.openFile(filePath, options);
256
264
  this.setSession(this.workspaceCoordinator.getSession());
265
+
266
+ if (shouldRevealInTree) {
267
+ this.revealFileInTree(filePath, { clearSearch: true });
268
+ }
257
269
  }
258
270
 
259
271
  cleanupSession() {
@@ -261,14 +273,35 @@ export class WorkspaceRouteController {
261
273
  this.setSession(this.workspaceCoordinator.getSession());
262
274
  }
263
275
 
264
- handleFileSelection(filePath, { closeSidebarOnMobile = false } = {}) {
265
- if (closeSidebarOnMobile) {
276
+ handleFileSelection(filePath, { closeSidebarOnMobile = false, revealInTree = false } = {}) {
277
+ const currentRoute = this.navigation.getHashRoute?.() ?? null;
278
+ const isCanonicalCurrentFileRoute = (
279
+ currentRoute?.type === 'file'
280
+ && currentRoute.filePath === filePath
281
+ && !currentRoute.drawioMode
282
+ );
283
+ if (revealInTree) {
284
+ this.pendingTreeRevealPath = filePath;
285
+ if (isCanonicalCurrentFileRoute) {
286
+ this.pendingTreeRevealPath = null;
287
+ this.revealFileInTree(filePath, { clearSearch: true });
288
+ return;
289
+ }
290
+ }
291
+
292
+ if (closeSidebarOnMobile && !revealInTree) {
266
293
  this.closeSidebarOnMobile();
267
294
  }
268
295
 
269
296
  this.navigation.navigateToFile(filePath);
270
297
  }
271
298
 
299
+ revealFileInTree(filePath, { clearSearch = false } = {}) {
300
+ this.setSidebarTab('files');
301
+ this.setSidebarVisibility(true);
302
+ this.fileExplorer.revealFile?.(filePath, { clearSearch });
303
+ }
304
+
272
305
  resetPreviewSurface() {
273
306
  this.imageLightbox?.close?.();
274
307
  this.previewRenderer.setHydrationPaused(false);
@@ -17,6 +17,7 @@ export class WorkspaceStateStore {
17
17
  gitRepoAvailable: false,
18
18
  globalUsers: [],
19
19
  isTabActive: false,
20
+ presencePanelOpen: false,
20
21
  sessionLoadToken: 0,
21
22
  ...initialState,
22
23
  };
@@ -1,4 +1,5 @@
1
1
  import { PreviewRenderer } from '../application/preview-renderer.js';
2
+ import { ensureQuickSwitcherInstance, toggleQuickSwitcherInstance } from '../application/quick-switcher-loader.js';
2
3
  import { WorkspaceRouteController } from '../application/workspace-route-controller.js';
3
4
  import { WikiLinkFileController } from '../application/wiki-link-file-controller.js';
4
5
  import { WorkspacePreviewController } from '../application/workspace-preview-controller.js';
@@ -99,9 +100,14 @@ export class CollabMdAppShell {
99
100
  handleGitCommitSubmit(...args) { return gitFeature.handleGitCommitSubmit.apply(this, args); }
100
101
  updateGlobalUsers(...args) { return presenceFeature.updateGlobalUsers.apply(this, args); }
101
102
  updateFileAwareness(...args) { return presenceFeature.updateFileAwareness.apply(this, args); }
103
+ closePresencePanel(...args) { return presenceFeature.closePresencePanel.apply(this, args); }
104
+ openPresencePanel(...args) { return presenceFeature.openPresencePanel.apply(this, args); }
102
105
  renderPresence(...args) { return presenceFeature.renderPresence.apply(this, args); }
103
106
  renderAvatars(...args) { return presenceFeature.renderAvatars.apply(this, args); }
107
+ renderPresencePanel(...args) { return presenceFeature.renderPresencePanel.apply(this, args); }
108
+ startFollowingUser(...args) { return presenceFeature.startFollowingUser.apply(this, args); }
104
109
  toggleFollowUser(...args) { return presenceFeature.toggleFollowUser.apply(this, args); }
110
+ togglePresencePanel(...args) { return presenceFeature.togglePresencePanel.apply(this, args); }
105
111
  stopFollowingUser(...args) { return presenceFeature.stopFollowingUser.apply(this, args); }
106
112
  syncFollowedUser(...args) { return presenceFeature.syncFollowedUser.apply(this, args); }
107
113
  followUserCursor(...args) { return presenceFeature.followUserCursor.apply(this, args); }
@@ -112,6 +118,8 @@ export class CollabMdAppShell {
112
118
  closeToolbarOverflowMenu(...args) { return uiFeature.closeToolbarOverflowMenu.apply(this, args); }
113
119
  getStoredLineWrapping(...args) { return uiFeature.getStoredLineWrapping.apply(this, args); }
114
120
  handleConnectionChange(...args) { return uiFeature.handleConnectionChange.apply(this, args); }
121
+ handleDocumentKeydown(...args) { return uiFeature.handleDocumentKeydown.apply(this, args); }
122
+ handleDocumentPointerDown(...args) { return uiFeature.handleDocumentPointerDown.apply(this, args); }
115
123
  handlePreviewContentClick(...args) { return uiFeature.handlePreviewContentClick.apply(this, args); }
116
124
  handleThemeChange(...args) { return uiFeature.handleThemeChange.apply(this, args); }
117
125
  hideEditorLoading(...args) { return uiFeature.hideEditorLoading.apply(this, args); }
@@ -365,6 +373,7 @@ export class CollabMdAppShell {
365
373
  plantUmlRenderClient: this.plantUmlApiClient,
366
374
  previewContainer: this.elements.previewContainer,
367
375
  previewElement: this.elements.previewContent,
376
+ toastController: this.toastController,
368
377
  });
369
378
  this.themeController = new ThemeController({ onChange: (theme) => this.handleThemeChange(theme) });
370
379
  this.layoutController = new LayoutController({
@@ -390,6 +399,9 @@ export class CollabMdAppShell {
390
399
  getLocalUser: () => this.lobby.getLocalUser(),
391
400
  getTheme: () => this.themeController.getTheme(),
392
401
  onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
402
+ onToggleQuickSwitcher: () => {
403
+ void this.toggleQuickSwitcher();
404
+ },
393
405
  previewContainer: this.elements.previewContainer,
394
406
  previewElement: this.elements.previewContent,
395
407
  toastController: this.toastController,
@@ -399,6 +411,9 @@ export class CollabMdAppShell {
399
411
  getTheme: () => this.themeController.getTheme(),
400
412
  onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
401
413
  onOpenTextFile: (filePath) => filePath && this.navigation.navigateToFile(filePath, { drawioMode: 'text' }),
414
+ onToggleQuickSwitcher: () => {
415
+ void this.toggleQuickSwitcher();
416
+ },
402
417
  previewContainer: this.elements.previewContainer,
403
418
  previewElement: this.elements.previewContent,
404
419
  toastController: this.toastController,
@@ -640,6 +655,7 @@ export class CollabMdAppShell {
640
655
  this.sessionLoadToken = value;
641
656
  },
642
657
  setSidebarTab: (value) => this.setSidebarTab(value),
658
+ setSidebarVisibility: (showSidebar) => this.setSidebarVisibility(showSidebar),
643
659
  showGitCommit: (route) => this.showGitCommit(route),
644
660
  showGitDiff: (route) => this.showGitDiff(route),
645
661
  showGitFileHistory: (route) => this.showGitFileHistory(route),
@@ -687,6 +703,8 @@ export class CollabMdAppShell {
687
703
  set gitRepoAvailable(value) { this.stateStore.set('gitRepoAvailable', value); }
688
704
  get activeSidebarTab() { return this.stateStore.get('activeSidebarTab'); }
689
705
  set activeSidebarTab(value) { this.stateStore.set('activeSidebarTab', value); }
706
+ get presencePanelOpen() { return this.stateStore.get('presencePanelOpen'); }
707
+ set presencePanelOpen(value) { this.stateStore.set('presencePanelOpen', value); }
690
708
  get followedUserClientId() { return this.stateStore.get('followedUserClientId'); }
691
709
  set followedUserClientId(value) { this.stateStore.set('followedUserClientId', value); }
692
710
  get followedCursorSignature() { return this.stateStore.get('followedCursorSignature'); }
@@ -771,29 +789,16 @@ export class CollabMdAppShell {
771
789
  this._editorSessionPrewarmHandle = window.setTimeout(runPrewarm, 0);
772
790
  }
773
791
 
774
- async ensureQuickSwitcher() {
775
- if (this.quickSwitcher) {
776
- return this.quickSwitcher;
777
- }
778
-
779
- if (!this.quickSwitcherModulePromise) {
780
- this.quickSwitcherModulePromise = import('../presentation/quick-switcher-controller.js')
781
- .then((module) => module.QuickSwitcherController);
782
- }
783
-
784
- const QuickSwitcherController = await this.quickSwitcherModulePromise;
785
- if (!this.quickSwitcher) {
786
- this.quickSwitcher = new QuickSwitcherController({
787
- getFileList: () => this.fileExplorer.flatFiles,
788
- onFileSelect: (filePath) => this.handleFileSelection(filePath, { closeSidebarOnMobile: true }),
789
- });
790
- }
792
+ loadQuickSwitcherController() {
793
+ return import('../presentation/quick-switcher-controller.js')
794
+ .then((module) => module.QuickSwitcherController);
795
+ }
791
796
 
792
- return this.quickSwitcher;
797
+ async ensureQuickSwitcher() {
798
+ return ensureQuickSwitcherInstance(this);
793
799
  }
794
800
 
795
801
  async toggleQuickSwitcher() {
796
- const quickSwitcher = await this.ensureQuickSwitcher();
797
- quickSwitcher.toggle();
802
+ return toggleQuickSwitcherInstance(this);
798
803
  }
799
804
  }