collabmd 0.1.52 → 0.1.55

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 (464) hide show
  1. package/bin/collabmd.js +22 -40
  2. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-cMeDxAEL.js +1 -0
  3. package/dist/client/assets/{abnfDiagram-VCTEODGH-DxNxad6-.js → abnfDiagram-VCTEODGH-D2UdmYvj.js} +1 -1
  4. package/dist/client/assets/{abnfDiagram-O67JEVCF-Dwt6a0Ds.js → abnfDiagram-YUKMZFIV-DbmU4Q-X.js} +1 -1
  5. package/dist/client/assets/api-client-utils-C5ESDKMG.js +1 -0
  6. package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -1
  7. package/dist/client/assets/architecture-WOLXFQ4H-C0NxYiG7.js +1 -0
  8. package/dist/client/assets/{architectureDiagram-NJMV4G6O-D5CGiX3G.js → architectureDiagram-47P4ROYG-C7OjXK9S.js} +3 -3
  9. package/dist/client/assets/{architectureDiagram-5GKGNRK7-C1uvg5id.js → architectureDiagram-5GKGNRK7-CSiUzzeN.js} +1 -1
  10. package/dist/client/assets/base-CaIEJUF9.css +1 -0
  11. package/dist/client/assets/{blockDiagram-BEXU5L5S-BgTM0var.js → blockDiagram-E7TT5TSB-DMG-YlZw.js} +3 -3
  12. package/dist/client/assets/{blockDiagram-I7D4REHJ-B2YonsoG.js → blockDiagram-I7D4REHJ-sXfAgK2w.js} +1 -1
  13. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-C0mP17s1.js → browser-BKLM0ThC-BCLQGPD6-CcMAHZXi.js} +1 -1
  14. package/dist/client/assets/{c4Diagram-7LVT6UL2-r4IwomZm.js → c4Diagram-7LVT6UL2-C88V_K-8.js} +1 -1
  15. package/dist/client/assets/{c4Diagram-YGBWAQC7-_xZPrNkB.js → c4Diagram-CRA5TL53-D3F9ElJv.js} +2 -2
  16. package/dist/client/assets/canvasEditor-BJkwGzO1.css +1 -0
  17. package/dist/client/assets/canvasEditor-sBK7KfrD.js +1 -0
  18. package/dist/client/assets/{chunk-6AZGARVD--pTGpDnx.js → chunk-24IY7LWP-flnn6SWX.js} +1 -1
  19. package/dist/client/assets/chunk-2BW5OAIV-CNFO1U_e.js +10 -0
  20. package/dist/client/assets/{chunk-2E4U76K2-CIQUuV9n.js → chunk-2E4U76K2-DEnS5IbF.js} +1 -1
  21. package/dist/client/assets/{chunk-5V3GS4D5-B5uC2oxu.js → chunk-3M4EKCLJ-D-sZGCtO.js} +1 -1
  22. package/dist/client/assets/chunk-3YJQHVM4-Ctp__8EK.js +2 -0
  23. package/dist/client/assets/{chunk-7PRAP22T-9uTvtc_-.js → chunk-4EA7E6EY-bU4wRJot.js} +1 -1
  24. package/dist/client/assets/{chunk-4HAMMTFA-q0ldNVvr.js → chunk-4HAMMTFA-CQy6Skzw.js} +1 -1
  25. package/dist/client/assets/{chunk-6K3QC6MW-JnuvEGV4.js → chunk-4S7OKTRW-BpUW13a3.js} +1 -1
  26. package/dist/client/assets/{chunk-ICYGCRZG-odvlDZyA.js → chunk-53FOQ5SW-5lPdGYP4.js} +1 -1
  27. package/dist/client/assets/{chunk-75Z2AOVW-DitkSoSG.js → chunk-75Z2AOVW-BRdhvVTZ.js} +1 -1
  28. package/dist/client/assets/{chunk-GWA4HPMP-CGmv2yIq.js → chunk-7TKQ45FW-rA2u-WUl.js} +1 -1
  29. package/dist/client/assets/{chunk-GTNCS2PH-ChgkzEIi.js → chunk-AW2ZBBNX-DL0KGAdi.js} +3 -3
  30. package/dist/client/assets/{chunk-747NJXEK-BjqqAsS9.js → chunk-BP2KR52E-DAQ1pzDV.js} +1 -1
  31. package/dist/client/assets/{chunk-CLGD4ZFX-BfYJtJm1.js → chunk-CLGD4ZFX-DJiSE0gD.js} +1 -1
  32. package/dist/client/assets/{chunk-5DYCD2WN-BKWCKnK-.js → chunk-DBDB3WZW-CXleNlok.js} +1 -1
  33. package/dist/client/assets/{chunk-DU6HZSFF-CWlP1Dk_.js → chunk-DU6HZSFF-C-18UZkS.js} +1 -1
  34. package/dist/client/assets/{chunk-MBY4JIJT-DTJ4UcAm.js → chunk-E2ZNV5FY-D_07zfWd.js} +3 -3
  35. package/dist/client/assets/chunk-EU5HNXII-CETVNUXF.js +213 -0
  36. package/dist/client/assets/{chunk-F27PBJKO-DPcsPcEs.js → chunk-F27PBJKO-_beIJos4.js} +1 -1
  37. package/dist/client/assets/{chunk-2ZTRR5NV-DcPRfelM.js → chunk-F6S3BTY2-DVWKCAHp.js} +1 -1
  38. package/dist/client/assets/{chunk-RUX4WMZV-BGnd3s_C.js → chunk-FLFP27SU-CydzbSsY.js} +2 -2
  39. package/dist/client/assets/chunk-FVRAUYC3-C7b9SJ81.js +1 -0
  40. package/dist/client/assets/{chunk-GMAD6QVW-Bgk8qnty.js → chunk-GMAD6QVW-DnZH7DxV.js} +1 -1
  41. package/dist/client/assets/{chunk-GVQU2GXP-CQ8cl-Uu.js → chunk-GVQU2GXP-B0Vm415C.js} +1 -1
  42. package/dist/client/assets/chunk-H5A3YXKD-ChP7mNJq.js +41 -0
  43. package/dist/client/assets/{chunk-742MDFTN-D1nh6vNv.js → chunk-HJ2JQQFS-DQX7RePR.js} +1 -1
  44. package/dist/client/assets/{chunk-NETBCI7D-CmUwDWUZ.js → chunk-HTAEGDNF-C0PA_N-c.js} +1 -1
  45. package/dist/client/assets/{chunk-IMKFNOWR-CBqxfpcP.js → chunk-IMKFNOWR-DoO8IHzF.js} +1 -1
  46. package/dist/client/assets/{chunk-IH6LHLGP-BNevEHZK.js → chunk-KPI5JJXK-B2ld5-w4.js} +1 -1
  47. package/dist/client/assets/{chunk-WEXAMYUT-DDlVNp8J.js → chunk-KQW6MTUR-OQ4MyMr_.js} +1 -1
  48. package/dist/client/assets/{chunk-L3NEJ4N5-BflzkdTI.js → chunk-L3NEJ4N5-CvHossEU.js} +1 -1
  49. package/dist/client/assets/chunk-NGNAAXSQ-DqoPQk1a.js +136 -0
  50. package/dist/client/assets/{chunk-UA2S7LBM-DicYDjDM.js → chunk-NTY3LDVX-CVWLK_fh.js} +1 -1
  51. package/dist/client/assets/{chunk-UY3FDG6J-QT-rkt0y.js → chunk-OD3NTWWA-Dz9nCUGX.js} +1 -1
  52. package/dist/client/assets/{chunk-OSK3NFVY-DqeKV_pg.js → chunk-OSK3NFVY-C3JOcBao.js} +1 -1
  53. package/dist/client/assets/{chunk-P2QGCYS3-BA--DhpW.js → chunk-P2QGCYS3-Bfo8qS8r.js} +1 -1
  54. package/dist/client/assets/{chunk-POPQ4Y6H-V_NEc45n.js → chunk-POPQ4Y6H-sv6rCftH.js} +1 -1
  55. package/dist/client/assets/{chunk-PWAF6VOD-D_kLse-N.js → chunk-PWAF6VOD-B-AT-L2H.js} +1 -1
  56. package/dist/client/assets/{chunk-3Z5EZCMW-BAnA6eQ7.js → chunk-QNH66VMT-Cb9xxTwQ.js} +1 -1
  57. package/dist/client/assets/{chunk-SHT3W25Y-YM3S-A_M.js → chunk-SHT3W25Y-C1lu518T.js} +1 -1
  58. package/dist/client/assets/{chunk-GNY47TPC-CTrH5O5R.js → chunk-SVEVUXB4-BnM-LXop.js} +1 -1
  59. package/dist/client/assets/{chunk-SVP7TREG-DdNhDOmW.js → chunk-SVP7TREG-CKqt0syj.js} +1 -1
  60. package/dist/client/assets/{chunk-TICWLB2K-BGGgCr4x.js → chunk-TICWLB2K-D2ZnWAfF.js} +1 -1
  61. package/dist/client/assets/{chunk-TLUHSLCS-DCZhIDYA.js → chunk-TLUHSLCS-BMIhqv1X.js} +1 -1
  62. package/dist/client/assets/{chunk-6EIED4P4-DBVWq7Tz.js → chunk-TPMEZKFX-DIPHIqGb.js} +1 -1
  63. package/dist/client/assets/{chunk-6TQVIW2G-BSj0l_pu.js → chunk-VPELOWWC-DXayM28-.js} +1 -1
  64. package/dist/client/assets/chunk-VPRB5NB3-BqaJfj_v.js +127 -0
  65. package/dist/client/assets/{chunk-I5DQTOEV-aBZooNp1.js → chunk-VTWWFHGB-SZnJiyWY.js} +1 -1
  66. package/dist/client/assets/{chunk-KI3K4JFJ-FTtDwx3-.js → chunk-VZTHESGH-eHyXmK8W.js} +1 -1
  67. package/dist/client/assets/{chunk-7INBJB4K-CDmiHbaX.js → chunk-XC4XBNZT-D9oehSn8.js} +20 -20
  68. package/dist/client/assets/{chunk-XHIXRSVI-DN_fEwws.js → chunk-YK26KJH5-DVy3MGMd.js} +1 -1
  69. package/dist/client/assets/{chunk-6AEJRKK7-DTVZj5bY.js → chunk-Z6ETV63D-DOcrnz-P.js} +1 -1
  70. package/dist/client/assets/{chunk-OUJLGHUK-75UXlPjl.js → chunk-ZO67DCNQ-BAOMIkLF.js} +1 -1
  71. package/dist/client/assets/classDiagram-ZZMXUADV-BmETdFmC.js +1 -0
  72. package/dist/client/assets/{classDiagram-v2-NBCMYWYE-3TQORq33.js → classDiagram-v2-K4WV4PDN-eaadfJDB.js} +3 -3
  73. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BmETdFmC.js +1 -0
  74. package/dist/client/assets/{comment-markdown-renderer-Bxi_JRSR.js → comment-markdown-renderer-CpBKaj7H.js} +1 -1
  75. package/dist/client/assets/comment-thread-store-DUQsWtnu.js +1 -0
  76. package/dist/client/assets/comment-threads-DnfkLVJA.js +4 -0
  77. package/dist/client/assets/comment-ui-shared-D_pgPUti.js +7 -0
  78. package/dist/client/assets/cynefin-EF2NZ3EQ-DVkJeZ8i.js +1 -0
  79. package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -1
  80. package/dist/client/assets/{cynefinDiagram-VND7K2PF-DwfMZ3vk.js → cynefinDiagram-3GCD6N5R-DjpAsBHC.js} +1 -1
  81. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DTnLZaO7.js → cynefinDiagram-5FMLGOSQ-D2rFQG67.js} +1 -1
  82. package/dist/client/assets/dagre-C-rnJpZF.js +1 -0
  83. package/dist/client/assets/{dagre-GXQ25YYZ-Vtyx08Qh.js → dagre-GXQ25YYZ-Cku9eia9.js} +2 -2
  84. package/dist/client/assets/{dagre-6A5THRUB-DewyAGK6.js → dagre-W4DXFKR2-DOMOIsPd.js} +2 -2
  85. package/dist/client/assets/deferred-collab-C9aa9cvT.css +1 -0
  86. package/dist/client/assets/deferred-git-BPQ-UgrN.css +1 -0
  87. package/dist/client/assets/deferred-preview-B-RebLry.css +1 -0
  88. package/dist/client/assets/{diagram-22UHCM2B-DbZirFfl.js → diagram-2UJZ2QOL-D8WvnEyx.js} +6 -6
  89. package/dist/client/assets/{diagram-3UASUU5V-DmhdYv6_.js → diagram-OVF4WLC6-D8_escYE.js} +2 -2
  90. package/dist/client/assets/{diagram-CDSNMT55-D_qyS11R.js → diagram-PFPMY2P6-B1izZfrN.js} +3 -3
  91. package/dist/client/assets/{diagram-S7CK7UJ4-CGTzfo2f.js → diagram-S7CK7UJ4-BzicH2t-.js} +1 -1
  92. package/dist/client/assets/{diagram-MLGK6HIB-DIBG6Ivu.js → diagram-UMYRVEAY-Djf7WDjZ.js} +1 -1
  93. package/dist/client/assets/{diagram-UQ7AKVKN-CWZS8QtB.js → diagram-UQ7AKVKN-DqX4zTtr.js} +1 -1
  94. package/dist/client/assets/{diagram-VSXAHHWV-DaO1nOZF.js → diagram-VSXAHHWV-DnVbfI4Y.js} +1 -1
  95. package/dist/client/assets/{diagram-VX7I27RA-B54P6Cyf.js → diagram-VX7I27RA-D-Dj0TQC.js} +1 -1
  96. package/dist/client/assets/{diagram-MPIPVDR6-D9XsALDV.js → diagram-YEKJPTXX-B40bP3Yr.js} +2 -2
  97. package/dist/client/assets/{diagram-Z3DM3KII-Cl2EXiXp.js → diagram-Z3DM3KII-_iT7Uz5p.js} +1 -1
  98. package/dist/client/assets/diagram-ZIFT7M5P-BUUK0oNw.js +3 -0
  99. package/dist/client/assets/{direct-engine-DdrQKpgq-4QysbH_V.js → direct-engine-DVLMOJWp-DWtWIifK.js} +1 -1
  100. package/dist/client/assets/dist-26Ce-5t4.js +1 -0
  101. package/dist/client/assets/dist-8MLNn-I6.js +1 -0
  102. package/dist/client/assets/dist-Amm5Pr1C.js +1 -0
  103. package/dist/client/assets/dist-BXXPaoUV.js +1 -0
  104. package/dist/client/assets/{dist-zHDLm1oE.js → dist-Bkb-_VdB.js} +1 -1
  105. package/dist/client/assets/dist-Bl4yuUS9.js +1 -0
  106. package/dist/client/assets/{dist-CKf7LlAo.js → dist-C2CGvCPd.js} +1 -1
  107. package/dist/client/assets/dist-C2niyEh0.js +1 -0
  108. package/dist/client/assets/{dist-Y6zYRI-A.js → dist-CFCSUmJk.js} +1 -1
  109. package/dist/client/assets/dist-CHUI56fT.js +6 -0
  110. package/dist/client/assets/dist-CJh3Qrid.js +13 -0
  111. package/dist/client/assets/{dist-Ch6Sr9KF.js → dist-CKxETpSC.js} +3 -3
  112. package/dist/client/assets/dist-CSHJthAI.js +2 -0
  113. package/dist/client/assets/dist-CbKnZGN4.js +1 -0
  114. package/dist/client/assets/{dist-BVCNc-Es.js → dist-Cik4RJXj.js} +1 -1
  115. package/dist/client/assets/{dist-DGa-2MNX.js → dist-CqkAY6Ot.js} +2 -2
  116. package/dist/client/assets/dist-D2ql2LCd.js +1 -0
  117. package/dist/client/assets/{dist-CvVoyTRF.js → dist-D47MOYFN.js} +1 -1
  118. package/dist/client/assets/dist-DBhUaexM.js +1 -0
  119. package/dist/client/assets/dist-DJux6Vc5.js +1 -0
  120. package/dist/client/assets/{dist-CXOUa90Q.js → dist-DLNdMWPH.js} +1 -1
  121. package/dist/client/assets/dist-DPJj-Y3l.js +1 -0
  122. package/dist/client/assets/{dist-DI6c02Da.js → dist-DRYFMufe.js} +6 -6
  123. package/dist/client/assets/{dist-CUsXdnU4.js → dist-DTGcVSU8.js} +1 -1
  124. package/dist/client/assets/dist-DlOxjzWi.js +9 -0
  125. package/dist/client/assets/{dist-BfpAc922.js → dist-DogjjM_B.js} +1 -1
  126. package/dist/client/assets/dist-Dyv_RvyB.js +23 -0
  127. package/dist/client/assets/dist-FUFeH5Cx.js +1 -0
  128. package/dist/client/assets/dist-It70ktCU.js +1 -0
  129. package/dist/client/assets/dist-QMvcnJHf.js +1 -0
  130. package/dist/client/assets/dist-QN1K2czv.js +11 -0
  131. package/dist/client/assets/dist-W8ilOKl3.js +1 -0
  132. package/dist/client/assets/dist-_17-t9qP.js +1 -0
  133. package/dist/client/assets/{dist-CsQTfQFi.js → dist-uE774WWs.js} +1 -1
  134. package/dist/client/assets/document-formatter-DtXmKZcy.js +1 -0
  135. package/dist/client/assets/drawioEditor-DO6IOaJ1.js +9 -0
  136. package/dist/client/assets/{ebnfDiagram-PWID7BFC-PfC84FyI.js → ebnfDiagram-PWID7BFC-IemGPf9X.js} +1 -1
  137. package/dist/client/assets/{ebnfDiagram-ZINNZB2B-DYvm_QtE.js → ebnfDiagram-VR2GEFS7-9fXqy1DI.js} +1 -1
  138. package/dist/client/assets/editor-session-CPsqXY_A.js +13 -0
  139. package/dist/client/assets/elk-IJKZMXRS-DsbrbBYg.js +27 -0
  140. package/dist/client/assets/embedded-editor-base-C44ZcCZv.css +1 -0
  141. package/dist/client/assets/{embedpdf-DyOonRvx.js → embedpdf-BfUI-3pv.js} +1 -1
  142. package/dist/client/assets/{embedpdf-DA4bA119-DsoNiPlQ.js → embedpdf-cl9qiF45-CLMxJTMP.js} +3 -3
  143. package/dist/client/assets/en-7ZVUCEYH-C_VXKxxb.js +1 -0
  144. package/dist/client/assets/{erDiagram-OPXOYQCR-o8GRv8A_.js → erDiagram-O2IAPWRE-Cdadm-HN.js} +2 -2
  145. package/dist/client/assets/{erDiagram-RLTQ6QDP-C9cJl5NB.js → erDiagram-RLTQ6QDP-CGGmjm8t.js} +1 -1
  146. package/dist/client/assets/{estree-DCT3Jm65.js → estree-DGmLqopC.js} +17 -17
  147. package/dist/client/assets/eventmodeling-K75KTNOO-BWBlZ5cR.js +1 -0
  148. package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -1
  149. package/dist/client/assets/excalidraw-element-link-NQnskRkm.js +1 -0
  150. package/dist/client/assets/excalidraw-scene-DLlw4jyc.js +1 -0
  151. package/dist/client/assets/excalidrawEditor-DiKOIudt.css +1 -0
  152. package/dist/client/assets/excalidrawEditor-W2lZ5Mej.js +9 -0
  153. package/dist/client/assets/export-page-Bomh9oEr.js +46 -0
  154. package/dist/client/assets/exportDocument-BFIOECJ3.js +2 -0
  155. package/dist/client/assets/exportDocument-D0mONgQ4.css +1 -0
  156. package/dist/client/assets/file-kind-BGxTVHan.js +1 -0
  157. package/dist/client/assets/{file-search-3hYF4cYa.js → file-search-Dk2O14Vw.js} +1 -1
  158. package/dist/client/assets/flowDiagram-HODETNUW-DcVVYJUZ.js +1 -0
  159. package/dist/client/assets/flowDiagram-OXPTDLAJ-Dy6y46oF.js +1 -0
  160. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-x40PW0Ah.js → ganttDiagram-EL5Y4UJY-Duu4KnsU.js} +1 -1
  161. package/dist/client/assets/ganttDiagram-R7TSEDQI-BWy52pjn.js +292 -0
  162. package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -1
  163. package/dist/client/assets/gitGraph-VSP46ZUC-1499lQAI.js +1 -0
  164. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-ahsNaZsp.js → gitGraphDiagram-WWUBYQGX-CaJ0vC1a.js} +1 -1
  165. package/dist/client/assets/gitGraphDiagram-XJZIOB7I-DJwp9ilx.js +106 -0
  166. package/dist/client/assets/graphlib-DS17s2tU.js +1 -0
  167. package/dist/client/assets/{html-CBXMuS97.js → html-BryNQ_yx.js} +6 -6
  168. package/dist/client/assets/image-6XY3GD3F-DCWbu6d4.js +1 -0
  169. package/dist/client/assets/image-lightbox-controller-DAcXEXxT.js +184 -0
  170. package/dist/client/assets/index-CglpXOg7.css +1 -0
  171. package/dist/client/assets/index-D3WGkxfI.js +960 -0
  172. package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -1
  173. package/dist/client/assets/info-OHQRW6UA-BDFQOo4H.js +1 -0
  174. package/dist/client/assets/{infoDiagram-27XIBGKW-MrZyptIy.js → infoDiagram-27XIBGKW-DBJh7QOu.js} +1 -1
  175. package/dist/client/assets/{infoDiagram-VRGFBTTK-KkUjDRAQ.js → infoDiagram-5W2HQ5XZ-DmWsqJ0w.js} +1 -1
  176. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bnt9yM0O.js → ishikawaDiagram-5VMMS53U-CeEbSJem.js} +1 -1
  177. package/dist/client/assets/{ishikawaDiagram-OU5B5YK6-Di9BcpOY.js → ishikawaDiagram-K3B6WC7H-DH1NI35G.js} +2 -2
  178. package/dist/client/assets/{journeyDiagram-3NMN7TZE-Bl0abK1r.js → journeyDiagram-3NMN7TZE-BoIEEr6U.js} +1 -1
  179. package/dist/client/assets/{journeyDiagram-ZHPQQLJL-J-sGrs9e.js → journeyDiagram-COXZFDF6-CnHV2f9V.js} +3 -3
  180. package/dist/client/assets/{kanban-definition-PNTS6WVX-5ZDV_yIa.js → kanban-definition-P3RFRI5V-Cxvn5ZAG.js} +4 -4
  181. package/dist/client/assets/{kanban-definition-UXKFOSKX-DMgUfNt0.js → kanban-definition-UXKFOSKX-BY16Tgbr.js} +1 -1
  182. package/dist/client/assets/keyboard-shortcuts-BWNCBJqw.js +1 -0
  183. package/dist/client/assets/lobby-presence-DNNXcuwR.js +1 -0
  184. package/dist/client/assets/{markdown-Bo71X2X2.js → markdown-DU84620G.js} +17 -17
  185. package/dist/client/assets/markdown-headings-zYEUahfW.js +41 -0
  186. package/dist/client/assets/{markdown-math-CyyBVuDO.js → markdown-math-B96cnrz1.js} +11 -11
  187. package/dist/client/assets/{mermaid-parser.core-Bpogunsh.js → mermaid-parser.core-R-uwU5kf.js} +3 -3
  188. package/dist/client/assets/{mermaid-parser.core-DBy--Jc0.js → mermaid-parser.core-mE6t1qEO.js} +1 -1
  189. package/dist/client/assets/mermaid.core-D8Z6LN7O.js +10 -0
  190. package/dist/client/assets/{mindmap-definition-NLK3R4M7-ByVb-0vj.js → mindmap-definition-LZFPQGKD-DVfFenfJ.js} +3 -3
  191. package/dist/client/assets/{mindmap-definition-YA3MSWOX-DBZN5_GH.js → mindmap-definition-YA3MSWOX-DtiE80UJ.js} +1 -1
  192. package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -1
  193. package/dist/client/assets/packet-JDAUHWVQ-DJ9K2MA4.js +1 -0
  194. package/dist/client/assets/{pdfium-RAgkpwfK.wasm → pdfium-BJ2Yip8Q.wasm} +0 -0
  195. package/dist/client/assets/{pegDiagram-GJSIUBJH-aost1sSO.js → pegDiagram-BGZESJAR-DxfvEcwv.js} +1 -1
  196. package/dist/client/assets/{pegDiagram-XKGWAZYB-DRo8CZu3.js → pegDiagram-XKGWAZYB-CyozY-Kt.js} +1 -1
  197. package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -1
  198. package/dist/client/assets/pie-XZMESJXO-CQIQasY-.js +1 -0
  199. package/dist/client/assets/{pieDiagram-5QR66LMP-BICdpEuz.js → pieDiagram-CAPJLFHJ-CRlMcrv3.js} +2 -2
  200. package/dist/client/assets/{pieDiagram-E7YTZNPT-CZThaHsc.js → pieDiagram-E7YTZNPT-BRdmTkDq.js} +1 -1
  201. package/dist/client/assets/preload-helper-CYtfOYgs.js +1 -0
  202. package/dist/client/assets/preview-render-compiler-D_aJv7Ew.js +3 -0
  203. package/dist/client/assets/{preview-render-worker-BI2bFVqM.js → preview-render-worker-dFNyrVyB.js} +47 -43
  204. package/dist/client/assets/prod-ItolaHmf.js +145 -0
  205. package/dist/client/assets/prod-rdly4JJQ.js +1 -0
  206. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-C5iowkl_.js → quadrantDiagram-AXDQQJYC-7QyPIXkF.js} +1 -1
  207. package/dist/client/assets/{quadrantDiagram-O4NWA36T-Bgx5bF97.js → quadrantDiagram-GDMTTRAM-DE30uqTl.js} +3 -3
  208. package/dist/client/assets/quick-switcher-controller-DsK70I7K.js +1 -0
  209. package/dist/client/assets/radar-ABXABTNO-ByfpCXh9.js +1 -0
  210. package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -1
  211. package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -1
  212. package/dist/client/assets/railroad-I3PHUGI6-CTUn9HhI.js +1 -0
  213. package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -1
  214. package/dist/client/assets/railroad-abnf-LNEFI6M7-Ct-b-y0F.js +1 -0
  215. package/dist/client/assets/railroad-ebnf-DWYD2UWJ-BZMYMWOe.js +1 -0
  216. package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -1
  217. package/dist/client/assets/railroad-peg-JR7BVNR7-Dj23PxYc.js +1 -0
  218. package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -1
  219. package/dist/client/assets/{railroadDiagram-O6MQD6OU-BTt_rKjT.js → railroadDiagram-O6MQD6OU-BPk3RS2D.js} +1 -1
  220. package/dist/client/assets/{railroadDiagram-XR7U4H2S-DbVoNgSz.js → railroadDiagram-SM67HX2B-CZRXJ647.js} +1 -1
  221. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BkvazG7r.js → requirementDiagram-BXWQKSXE-BRwfym6z.js} +1 -1
  222. package/dist/client/assets/{requirementDiagram-PLB6GJNP-BT0j9C40.js → requirementDiagram-X7JNWC4A-BofCuLJA.js} +4 -4
  223. package/dist/client/assets/runtime-config-CvrkHb0n.js +1 -0
  224. package/dist/client/assets/runtime-paths-qQGhzNx4.js +1 -0
  225. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-C_IemB9h.js → sankeyDiagram-P5KCCOFB-D4LcrKpW.js} +1 -1
  226. package/dist/client/assets/{sankeyDiagram-IPEJSGJF-X1BCUIrf.js → sankeyDiagram-UM26HJRW-CLKMDbej.js} +3 -3
  227. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CxFBgLGd.js → sequenceDiagram-WJ2MYXX4-DQjtv-Bs.js} +1 -1
  228. package/dist/client/assets/sequenceDiagram-ZO4K6R2Y-CDP_m6ma.js +169 -0
  229. package/dist/client/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  230. package/dist/client/assets/sizeCapture-INFHLROL-BMR1ovSU.js +1 -0
  231. package/dist/client/assets/src-D5mvpivG.js +2 -0
  232. package/dist/client/assets/{standalone-6z5x8CWe.js → standalone-D_lg5NC9.js} +1 -1
  233. package/dist/client/assets/{stateDiagram-D77RDMKH-BaSQ6Owj.js → stateDiagram-D77RDMKH-DSMvV-kF.js} +1 -1
  234. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-ClmOOUsT.js +1 -0
  235. package/dist/client/assets/{stateDiagram-v2-GCMORJYK-CsVcfwVp.js → stateDiagram-v2-TBUQTH76-Dc5-FKzd.js} +2 -2
  236. package/dist/client/assets/{swimlanes-42K2YHIH-CALFEmiS.js → swimlanes-42K2YHIH-BUz31lO3.js} +1 -1
  237. package/dist/client/assets/{swimlanes-2SLR337P-CnYTVqRX.js → swimlanes-N4OXWK64-Dd3dFdPD.js} +1 -1
  238. package/dist/client/assets/swimlanesDiagram-K3J5GTZL-Bz9gFdls.js +8 -0
  239. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DoDs3zod.js +8 -0
  240. package/dist/client/assets/{timeline-definition-24CTP7MA-zse-5Dbm.js → timeline-definition-24CTP7MA-BvqCvSjy.js} +1 -1
  241. package/dist/client/assets/{timeline-definition-EJHVYXUP-BhqPlKkN.js → timeline-definition-YOQAKGHF-D2XWPSLs.js} +3 -3
  242. package/dist/client/assets/treeView-D4JQ5SDB-DcX7Bx0H.js +1 -0
  243. package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -1
  244. package/dist/client/assets/treemap-SAJKECNS-BcCHmcAX.js +1 -0
  245. package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -1
  246. package/dist/client/assets/usecaseDiagram-VIAY4XPW-CDe-IMjS.js +328 -0
  247. package/dist/client/assets/vault-api-client-DrRW0QwO.js +7 -0
  248. package/dist/client/assets/{vennDiagram-4TSXK5OY-DgHr6cJD.js → vennDiagram-4TSXK5OY-BW6Qp12d.js} +1 -1
  249. package/dist/client/assets/{vennDiagram-UO4OBE2U-BRwLn2Q1.js → vennDiagram-BLWOH2XV-KxIPKpHi.js} +3 -3
  250. package/dist/client/assets/wardley-7MLQ67FV-DOahSwbZ.js +1 -0
  251. package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -1
  252. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-9A60XZis.js → wardleyDiagram-VM6X3IG4-BoCETVsK.js} +1 -1
  253. package/dist/client/assets/{wardleyDiagram-VNRHLVJA-B_tMcVFG.js → wardleyDiagram-YMQ3BMBF-BNYqEy7M.js} +4 -4
  254. package/dist/client/assets/{wiki-link-resolver-Dch88erO.js → wiki-link-resolver-BCdGUpdu.js} +1 -1
  255. package/dist/client/assets/{worker-engine-m0rlHn8R-5h66k403.js → worker-engine-BCCrxWYm-1fphds7O.js} +1 -1
  256. package/dist/client/assets/workspace-sync-client-C_P9wtjf.js +1 -0
  257. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-D00iy-wB.js → xychartDiagram-S5SC5T6Z-eB5Fu9P7.js} +1 -1
  258. package/dist/client/assets/xychartDiagram-TAQBALBS-Sv6aaptV.js +7 -0
  259. package/dist/client/assets/yjs-Jd9fna_Y.js +4 -0
  260. package/dist/client/assets/yjs-provider-reset-guard-Cqu0Z6xH.js +1 -0
  261. package/dist/client/canvas-editor.html +16 -0
  262. package/dist/client/drawio-editor.html +9 -8
  263. package/dist/client/excalidraw-editor.html +33 -32
  264. package/dist/client/export-document.html +4 -3
  265. package/dist/client/index.html +13 -2
  266. package/package.json +31 -33
  267. package/scripts/local-compose.mjs +101 -0
  268. package/src/client/app/canvas-editor.html +13 -0
  269. package/src/client/app/index.html +11 -0
  270. package/src/client/app/main-entry.js +30 -4
  271. package/src/client/application/app-shell/git-feature.js +3 -2
  272. package/src/client/application/app-shell/ui-feature-identity.js +1 -0
  273. package/src/client/application/app-shell/ui-feature-shell.js +2 -0
  274. package/src/client/application/app-shell/ui-feature-tab-activity.js +4 -0
  275. package/src/client/application/app-shell/workspace-feature.js +8 -34
  276. package/src/client/application/diagram-chrome.js +8 -11
  277. package/src/client/application/diagram-preview-hydrator.js +5 -5
  278. package/src/client/application/mermaid-preview-hydrator.js +3 -2
  279. package/src/client/application/plantuml-preview-hydrator.js +6 -0
  280. package/src/client/application/preview-render-compiler.js +34 -98
  281. package/src/client/application/preview-render-executor.js +3 -0
  282. package/src/client/application/preview-render-worker.js +2 -0
  283. package/src/client/application/preview-renderer.js +9 -5
  284. package/src/client/application/workspace-coordinator.js +18 -10
  285. package/src/client/application/workspace-preview-controller.js +105 -158
  286. package/src/client/application/workspace-route-controller.js +29 -54
  287. package/src/client/bootstrap/canvas-markdown-preview.js +87 -0
  288. package/src/client/bootstrap/collabmd-app-shell.js +31 -14
  289. package/src/client/browser-utils.js +21 -0
  290. package/src/client/canvas-editor.js +143 -0
  291. package/src/client/domain/canvas-view.js +50 -0
  292. package/src/client/domain/excalidraw-scene.js +4 -49
  293. package/src/client/domain/file-search.js +1 -1
  294. package/src/client/domain/highlight-runtime.js +0 -4
  295. package/src/client/domain/markdown-formatting.js +12 -94
  296. package/src/client/domain/markdown-headings.js +98 -0
  297. package/src/client/domain/runtime-paths.js +4 -0
  298. package/src/client/domain/wiki-link-completions.js +42 -10
  299. package/src/client/infrastructure/browser-preferences-port.js +27 -33
  300. package/src/client/infrastructure/canvas-room-client.js +210 -0
  301. package/src/client/infrastructure/canvas-text-editor.js +36 -0
  302. package/src/client/infrastructure/comment-thread-store.js +19 -77
  303. package/src/client/infrastructure/editor-view-adapter.js +0 -30
  304. package/src/client/infrastructure/excalidraw-room-client.js +22 -10
  305. package/src/client/infrastructure/hosted-api-client.js +4 -2
  306. package/src/client/infrastructure/runtime-config.js +14 -0
  307. package/src/client/infrastructure/vault-api-client.js +4 -4
  308. package/src/client/presentation/canvas-editor-view.js +1028 -0
  309. package/src/client/presentation/canvas-embed-controller.js +116 -0
  310. package/src/client/presentation/canvas-picker.js +111 -0
  311. package/src/client/presentation/drawio-embed-controller.js +4 -4
  312. package/src/client/presentation/excalidraw-embed-controller.js +13 -4
  313. package/src/client/presentation/file-action-controller.js +58 -1
  314. package/src/client/presentation/file-explorer-controller.js +1 -2
  315. package/src/client/presentation/file-explorer-view.js +31 -7
  316. package/src/client/presentation/file-icon-svg.js +1 -1
  317. package/src/client/presentation/file-tree-state.js +4 -1
  318. package/src/client/presentation/image-lightbox-controller.js +1 -5
  319. package/src/client/presentation/team-settings-controller.js +44 -10
  320. package/src/client/presentation/vault-dashboard.js +63 -0
  321. package/src/client/styles/components/actions.css +4 -16
  322. package/src/client/styles/components/surfaces.css +0 -7
  323. package/src/client/styles/features/comment-card.css +1 -2
  324. package/src/client/styles/features/comment-markdown.css +0 -18
  325. package/src/client/styles/features/diagram-preview.css +0 -18
  326. package/src/client/styles/features/git-branch.css +0 -4
  327. package/src/client/styles/foundation/themes.css +6 -0
  328. package/src/client/styles/foundation/utilities.css +3 -2
  329. package/src/client/styles/layout/editor-page.css +0 -13
  330. package/src/client/styles/layout/overlays.css +5 -0
  331. package/src/client/styles/layout/responsive.css +2 -7
  332. package/src/client/styles/layout/shell.css +165 -1
  333. package/src/client/styles/layout/view-modes.css +1 -0
  334. package/src/client/styles/surfaces/canvas-editor.css +239 -0
  335. package/src/domain/canvas-room-codec.js +359 -0
  336. package/src/domain/collabmd-content-capabilities.js +10 -1
  337. package/src/domain/comment-threads.js +49 -5
  338. package/src/domain/excalidraw-room-codec.js +23 -73
  339. package/src/domain/excalidraw-scene.js +48 -0
  340. package/src/domain/file-kind.js +13 -1
  341. package/src/server/application/workspace-reconciliation.js +0 -14
  342. package/src/server/config/env.js +39 -6
  343. package/src/server/domain/backlink-index.js +1 -36
  344. package/src/server/domain/bases/base-index-snapshot-store.js +41 -24
  345. package/src/server/domain/bases/base-query-service.js +1 -47
  346. package/src/server/domain/collaboration/collaboration-room.js +149 -15
  347. package/src/server/domain/collaboration/room-registry.js +7 -7
  348. package/src/server/domain/hosted-workspace.js +29 -2
  349. package/src/server/domain/plantuml-encoder.js +7 -43
  350. package/src/server/infrastructure/git/diff-service.js +1 -5
  351. package/src/server/infrastructure/git/history-service.js +18 -2
  352. package/src/server/infrastructure/git/untracked-files.js +1 -1
  353. package/src/server/infrastructure/http/create-git-api-command-handler.js +60 -149
  354. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -2
  355. package/src/server/infrastructure/http/create-static-handler.js +3 -1
  356. package/src/server/infrastructure/http/create-vault-api-query-handler.js +3 -3
  357. package/src/server/infrastructure/http/http-response.js +2 -36
  358. package/src/server/infrastructure/http/request-body.js +14 -49
  359. package/src/server/infrastructure/persistence/hosted-metadata-store.js +12 -3
  360. package/src/server/infrastructure/persistence/path-utils.js +8 -2
  361. package/src/server/infrastructure/persistence/vault-file-store.js +26 -60
  362. package/src/server/{infrastructure/git → shared}/image-mime.js +2 -2
  363. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BEz2BKN1.js +0 -1
  364. package/dist/client/assets/_basePickBy-QJXUw_pr.js +0 -1
  365. package/dist/client/assets/_baseUniq-DR4vVjyC.js +0 -1
  366. package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +0 -1
  367. package/dist/client/assets/browser-utils-vlHL9goC.js +0 -1
  368. package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +0 -1
  369. package/dist/client/assets/chunk-4SOEAONT-C3fufoVl.js +0 -40
  370. package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +0 -213
  371. package/dist/client/assets/chunk-FOHPRMQF-Dmmo5Kak.js +0 -161
  372. package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +0 -126
  373. package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +0 -10
  374. package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +0 -2
  375. package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +0 -1
  376. package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +0 -1
  377. package/dist/client/assets/comment-thread-store-CHvy8GF8.js +0 -1
  378. package/dist/client/assets/comment-threads-nJhK1yfc.js +0 -4
  379. package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +0 -1
  380. package/dist/client/assets/dagre-D7FiCLLP.js +0 -1
  381. package/dist/client/assets/deferred-collab-D4cxEdad.css +0 -1
  382. package/dist/client/assets/deferred-git-BHKtkFYi.css +0 -1
  383. package/dist/client/assets/deferred-preview-BAXYgf4T.css +0 -1
  384. package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +0 -3
  385. package/dist/client/assets/dist-B7fBbwrO.js +0 -1
  386. package/dist/client/assets/dist-BYBF4LtZ.js +0 -1
  387. package/dist/client/assets/dist-B_1hMrc6.js +0 -1
  388. package/dist/client/assets/dist-BnVaoRgZ.js +0 -1
  389. package/dist/client/assets/dist-Bog8M5U3.js +0 -13
  390. package/dist/client/assets/dist-CAG5sIOj.js +0 -1
  391. package/dist/client/assets/dist-CYMCikZo.js +0 -1
  392. package/dist/client/assets/dist-CYfPeupF.js +0 -1
  393. package/dist/client/assets/dist-Ck-B8onw.js +0 -2
  394. package/dist/client/assets/dist-CrkYYcOU.js +0 -1
  395. package/dist/client/assets/dist-Cu5Ze2cs.js +0 -6
  396. package/dist/client/assets/dist-D4kDR0g8.js +0 -1
  397. package/dist/client/assets/dist-D8LnhZzy.js +0 -1
  398. package/dist/client/assets/dist-DNONgI1P.js +0 -11
  399. package/dist/client/assets/dist-DVBYH83t.js +0 -1
  400. package/dist/client/assets/dist-DX6qtdxv.js +0 -1
  401. package/dist/client/assets/dist-Da-jLrCf.js +0 -1
  402. package/dist/client/assets/dist-DofvCYzJ.js +0 -1
  403. package/dist/client/assets/dist-Dx37MHWs.js +0 -1
  404. package/dist/client/assets/dist-GTGhtpyW.js +0 -9
  405. package/dist/client/assets/dist-W0FoeIxk.js +0 -23
  406. package/dist/client/assets/dist-jVKfryIL.js +0 -1
  407. package/dist/client/assets/document-formatter-gO8qM2qY.js +0 -1
  408. package/dist/client/assets/drawioEditor-DCkWweiy.js +0 -9
  409. package/dist/client/assets/editor-session-DxRyr4EM.js +0 -14
  410. package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +0 -27
  411. package/dist/client/assets/embedded-editor-base-elU0Avik.css +0 -1
  412. package/dist/client/assets/en-GNC3RJIS-CEy_oGTd.js +0 -1
  413. package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +0 -1
  414. package/dist/client/assets/excalidraw-element-link-CGZ5934B.js +0 -7
  415. package/dist/client/assets/excalidraw-scene-6uROebca.js +0 -1
  416. package/dist/client/assets/excalidrawEditor-BCTFp_CV.css +0 -1
  417. package/dist/client/assets/excalidrawEditor-BVfSxjSO.js +0 -9
  418. package/dist/client/assets/export-page-BCo_e15t.js +0 -46
  419. package/dist/client/assets/exportDocument-Ba-n1X4U.css +0 -1
  420. package/dist/client/assets/exportDocument-DP6oE_or.js +0 -2
  421. package/dist/client/assets/file-kind-BwMIcZbi.js +0 -1
  422. package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +0 -1
  423. package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +0 -1
  424. package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +0 -292
  425. package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +0 -1
  426. package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +0 -106
  427. package/dist/client/assets/graphlib-C9Tl7QrK.js +0 -1
  428. package/dist/client/assets/image-EJJKRVD3-BQfi5nWJ.js +0 -1
  429. package/dist/client/assets/index-BxAuGDoN.css +0 -1
  430. package/dist/client/assets/index-uw9O0z1c.js +0 -1112
  431. package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +0 -1
  432. package/dist/client/assets/lobby-presence-Cz5jGOPg.js +0 -1
  433. package/dist/client/assets/mermaid.core-BeOUPE3Q.js +0 -10
  434. package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +0 -1
  435. package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +0 -1
  436. package/dist/client/assets/preload-helper-BAlEavIC.js +0 -1
  437. package/dist/client/assets/preview-render-compiler-ktU0SXxY.js +0 -43
  438. package/dist/client/assets/prod-DU-0VfI7.js +0 -145
  439. package/dist/client/assets/prod-cXUNdmYV.js +0 -1
  440. package/dist/client/assets/quick-switcher-controller-DSlOwOsU.js +0 -1
  441. package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +0 -1
  442. package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +0 -1
  443. package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +0 -1
  444. package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +0 -1
  445. package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +0 -1
  446. package/dist/client/assets/runtime-config-BFVdhnJu.js +0 -1
  447. package/dist/client/assets/runtime-paths-Cn0snt_9.js +0 -1
  448. package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +0 -169
  449. package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
  450. package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +0 -1
  451. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +0 -1
  452. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +0 -8
  453. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +0 -8
  454. package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +0 -1
  455. package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +0 -1
  456. package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +0 -328
  457. package/dist/client/assets/vault-api-client-BQxLVPeF.js +0 -7
  458. package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +0 -1
  459. package/dist/client/assets/workspace-sync-client-C2pdaQUN.js +0 -1
  460. package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +0 -7
  461. package/dist/client/assets/yjs-B41tM6Sz.js +0 -4
  462. package/dist/client/assets/yjs-provider-reset-guard-DpntzUDR.js +0 -1
  463. package/scripts/local-plantuml-compose.mjs +0 -92
  464. package/scripts/local-structurizr-compose.mjs +0 -101
@@ -0,0 +1,116 @@
1
+ import {
2
+ getActiveVaultId,
3
+ resolveAppUrl,
4
+ resolveWsServerOverride,
5
+ } from '../domain/runtime-paths.js';
6
+
7
+ export class CanvasEmbedController {
8
+ constructor({ getLocalUser, getTheme, onAwarenessChange, onConnectionChange, onOpenFile, toastController }) {
9
+ this.getLocalUser = getLocalUser;
10
+ this.getTheme = getTheme;
11
+ this.onAwarenessChange = onAwarenessChange;
12
+ this.onConnectionChange = onConnectionChange;
13
+ this.onOpenFile = onOpenFile;
14
+ this.toastController = toastController;
15
+ this.iframe = null;
16
+ this.filePath = null;
17
+ this.ready = false;
18
+ this.pendingDisconnects = new Map();
19
+ this.handleMessage = (event) => this.onMessage(event);
20
+ }
21
+
22
+ mount(filePath, renderHost) {
23
+ if (!renderHost || (this.filePath === filePath && this.iframe?.isConnected)) return;
24
+ this.unmount();
25
+ const url = new URL(resolveAppUrl('/canvas-editor.html'));
26
+ url.searchParams.set('file', filePath);
27
+ url.searchParams.set('theme', this.getTheme?.() ?? 'dark');
28
+ const vaultId = getActiveVaultId();
29
+ if (vaultId) url.searchParams.set('vaultId', vaultId);
30
+ const server = resolveWsServerOverride();
31
+ if (server) url.searchParams.set('server', server);
32
+ const user = this.getLocalUser?.();
33
+ for (const [key, value] of Object.entries({
34
+ userName: user?.name,
35
+ userColor: user?.color,
36
+ userColorLight: user?.colorLight,
37
+ userPeerId: user?.peerId,
38
+ })) {
39
+ if (value) url.searchParams.set(key, value);
40
+ }
41
+
42
+ const iframe = document.createElement('iframe');
43
+ iframe.className = 'canvas-file-preview-frame';
44
+ iframe.title = `Canvas: ${filePath}`;
45
+ iframe.src = url.toString();
46
+ this.filePath = filePath;
47
+ this.iframe = iframe;
48
+ window.addEventListener('message', this.handleMessage);
49
+ renderHost.replaceChildren(iframe);
50
+ this.onConnectionChange?.({ status: 'connecting', unreachable: false });
51
+ }
52
+
53
+ unmount() {
54
+ window.removeEventListener('message', this.handleMessage);
55
+ this.pendingDisconnects.forEach((finish) => finish(false));
56
+ this.iframe?.remove();
57
+ this.iframe = null;
58
+ this.filePath = null;
59
+ this.ready = false;
60
+ }
61
+
62
+ postMessage(message) {
63
+ this.iframe?.contentWindow?.postMessage(message, window.location.origin);
64
+ }
65
+
66
+ updateTheme(theme) {
67
+ this.postMessage({ type: 'canvas-theme', theme });
68
+ }
69
+
70
+ updateLocalUser(user = this.getLocalUser?.()) {
71
+ if (user) this.postMessage({ type: 'canvas-user', user });
72
+ }
73
+
74
+ prepareFileDisconnect(filePath, { timeoutMs = 10000 } = {}) {
75
+ if (filePath !== this.filePath || !this.iframe || !this.ready) return Promise.resolve(true);
76
+ const requestId = crypto.randomUUID();
77
+ return new Promise((resolve) => {
78
+ const timeout = setTimeout(() => finish(false), timeoutMs);
79
+ const finish = (canLeave) => {
80
+ clearTimeout(timeout);
81
+ this.pendingDisconnects.delete(requestId);
82
+ if (!canLeave) this.toastController?.show('Waiting for the canvas to reconnect before leaving');
83
+ resolve(canLeave);
84
+ };
85
+ this.pendingDisconnects.set(requestId, finish);
86
+ this.postMessage({ type: 'canvas-prepare-disconnect', filePath, requestId });
87
+ });
88
+ }
89
+
90
+ onMessage(event) {
91
+ if (event.origin !== window.location.origin || !this.iframe || event.source !== this.iframe.contentWindow) return;
92
+ const message = event.data;
93
+ if (!message || typeof message !== 'object') return;
94
+ if (message.type === 'canvas-open-file') {
95
+ if (typeof message.filePath === 'string' && message.filePath) {
96
+ const anchor = typeof message.subpath === 'string' && message.subpath.startsWith('#')
97
+ ? message.subpath.slice(1)
98
+ : null;
99
+ this.onOpenFile?.(message.filePath, anchor ? { anchor } : {});
100
+ }
101
+ return;
102
+ }
103
+ if (message.filePath !== this.filePath) return;
104
+ if (message.type === 'canvas-ready') {
105
+ this.ready = true;
106
+ this.updateTheme(this.getTheme?.() ?? 'dark');
107
+ this.updateLocalUser();
108
+ } else if (message.type === 'canvas-awareness' && Array.isArray(message.users)) {
109
+ this.onAwarenessChange?.(message.users);
110
+ } else if (message.type === 'canvas-connection' && ['connected', 'connecting', 'disconnected'].includes(message.state?.status)) {
111
+ this.onConnectionChange?.(message.state);
112
+ } else if (message.type === 'canvas-disconnect-ready' || message.type === 'canvas-disconnect-blocked') {
113
+ this.pendingDisconnects.get(message.requestId)?.(message.type === 'canvas-disconnect-ready');
114
+ }
115
+ }
116
+ }
@@ -0,0 +1,111 @@
1
+ import { createFileSearchEntry, findFileSearchMatch } from '../domain/file-search.js';
2
+
3
+ export function openCanvasPicker({ root, title, loadChoices, onChoose, canChoose }) {
4
+ const previousFocus = document.activeElement;
5
+ const dialog = document.createElement('dialog');
6
+ dialog.className = 'canvas-picker';
7
+ const heading = document.createElement('h2');
8
+ heading.id = `canvas-picker-${crypto.randomUUID()}`;
9
+ heading.textContent = title;
10
+ dialog.setAttribute('aria-labelledby', heading.id);
11
+ const closeButton = document.createElement('button');
12
+ closeButton.type = 'button';
13
+ closeButton.className = 'canvas-button';
14
+ closeButton.textContent = 'Close';
15
+ const header = document.createElement('header');
16
+ header.append(heading, closeButton);
17
+ const input = document.createElement('input');
18
+ input.type = 'search';
19
+ input.placeholder = title;
20
+ input.setAttribute('aria-label', title);
21
+ input.setAttribute('role', 'combobox');
22
+ input.setAttribute('aria-autocomplete', 'list');
23
+ input.setAttribute('aria-expanded', 'true');
24
+ input.autocomplete = 'off';
25
+ const list = document.createElement('div');
26
+ list.id = `${heading.id}-results`;
27
+ list.className = 'canvas-picker-results';
28
+ list.setAttribute('role', 'listbox');
29
+ list.setAttribute('aria-label', 'Suggestions');
30
+ input.setAttribute('aria-controls', list.id);
31
+ const status = document.createElement('p');
32
+ status.className = 'canvas-picker-status';
33
+ status.setAttribute('role', 'status');
34
+ status.textContent = 'Loading…';
35
+ dialog.append(header, input, list, status);
36
+ root.append(dialog);
37
+ let choices = [];
38
+ let filtered = [];
39
+ let index = 0;
40
+ let closed = false;
41
+ const close = () => {
42
+ if (closed) return;
43
+ closed = true;
44
+ dialog.close();
45
+ dialog.remove();
46
+ if (previousFocus?.isConnected) previousFocus.focus({ preventScroll: true });
47
+ };
48
+ const choose = (choice) => {
49
+ if (!choice) return;
50
+ if (!canChoose()) { status.textContent = 'This selection is no longer available. Close and try again.'; return; }
51
+ close();
52
+ onChoose(choice.value);
53
+ };
54
+ const select = (next) => {
55
+ index = Math.max(0, Math.min(filtered.length - 1, next));
56
+ [...list.children].forEach((option, position) => option.setAttribute('aria-selected', String(position === index)));
57
+ const active = list.children[index];
58
+ if (active) {
59
+ input.setAttribute('aria-activedescendant', active.id);
60
+ active.scrollIntoView({ block: 'nearest' });
61
+ } else input.removeAttribute('aria-activedescendant');
62
+ };
63
+ const render = () => {
64
+ const query = input.value.trim().toLowerCase();
65
+ const matches = choices.map((choice) => ({ choice, score: query ? findFileSearchMatch(choice.search, query)?.score : 1 }))
66
+ .filter(({ score }) => score !== undefined).sort((a, b) => b.score - a.score);
67
+ filtered = matches.slice(0, 100).map(({ choice }) => choice);
68
+ list.replaceChildren(...filtered.map((choice, position) => {
69
+ const option = document.createElement('button');
70
+ option.type = 'button';
71
+ option.tabIndex = -1;
72
+ option.id = `${list.id}-${position}`;
73
+ option.setAttribute('role', 'option');
74
+ const label = document.createElement('span');
75
+ label.textContent = choice.label;
76
+ const detail = document.createElement('small');
77
+ detail.textContent = choice.detail || '';
78
+ option.append(label, detail);
79
+ option.addEventListener('click', () => choose(choice));
80
+ return option;
81
+ }));
82
+ status.textContent = matches.length > 100 ? 'Showing the first 100 matches. Type to narrow the list.'
83
+ : (matches.length ? '↑ ↓ to navigate · Enter to choose · Esc to close' : 'No matches.');
84
+ select(0);
85
+ };
86
+ closeButton.addEventListener('click', close);
87
+ dialog.addEventListener('cancel', (event) => { event.preventDefault(); close(); });
88
+ dialog.addEventListener('click', (event) => {
89
+ const bounds = dialog.getBoundingClientRect();
90
+ if (event.target === dialog && (event.clientX < bounds.left || event.clientX > bounds.right
91
+ || event.clientY < bounds.top || event.clientY > bounds.bottom)) close();
92
+ });
93
+ dialog.addEventListener('keydown', (event) => {
94
+ event.stopPropagation();
95
+ if (event.key === 'Escape') { event.preventDefault(); close(); return; }
96
+ if (event.target !== input) return;
97
+ if (['ArrowDown', 'ArrowUp', 'Enter'].includes(event.key)) event.preventDefault();
98
+ if (event.key === 'ArrowDown') select(index + 1);
99
+ if (event.key === 'ArrowUp') select(index - 1);
100
+ if (event.key === 'Enter') choose(filtered[index]);
101
+ });
102
+ input.addEventListener('input', render);
103
+ dialog.showModal();
104
+ input.focus();
105
+ Promise.resolve().then(loadChoices).then((loaded) => {
106
+ if (closed) return;
107
+ choices = loaded.map((choice) => ({ ...choice, search: createFileSearchEntry(choice.searchText || `${choice.label} ${choice.detail || ''}`) }));
108
+ render();
109
+ }).catch(() => { if (!closed) status.textContent = 'Suggestions unavailable. Close and try again.'; });
110
+ return { close };
111
+ }
@@ -1,6 +1,6 @@
1
1
  import { createDrawioLeaseRoomName } from '../../domain/drawio-room.js';
2
2
  import { setDiagramActionButtonIcon } from '../domain/diagram-action-icons.js';
3
- import { resolveAppUrl } from '../domain/runtime-paths.js';
3
+ import { getActiveVaultId, resolveAppUrl } from '../domain/runtime-paths.js';
4
4
  import { renderDrawioViewer } from './drawio-viewer.js';
5
5
  import {
6
6
  cancelIdleRender,
@@ -59,7 +59,6 @@ export class DrawioEmbedController {
59
59
  this.hydrationIdleId = null;
60
60
  this.hydrationQueue = [];
61
61
  this._exitMaximizedEntry();
62
- document.body.classList.remove('drawio-maximized-open');
63
62
  this.embedEntries.forEach((entry) => entry.wrapper?.remove());
64
63
  this.embedEntries.clear();
65
64
  this.overlayRoot?.remove();
@@ -363,6 +362,8 @@ export class DrawioEmbedController {
363
362
  buildIframeUrl(entry) {
364
363
  const url = new URL(resolveAppUrl('/drawio-editor.html'));
365
364
  const localUser = this.getLocalUser?.() ?? {};
365
+ const vaultId = getActiveVaultId();
366
+ if (vaultId) url.searchParams.set('vault', vaultId);
366
367
  url.searchParams.set('file', entry.filePath);
367
368
  url.searchParams.set('hostMode', entry.mode === 'edit' ? 'file-preview' : 'embed');
368
369
  url.searchParams.set('instanceId', entry.instanceId);
@@ -635,7 +636,6 @@ export class DrawioEmbedController {
635
636
  const entry = this.maximizedEntry;
636
637
  if (!entry?.wrapper) {
637
638
  this.maximizedEntry = null;
638
- document.body.classList.remove('drawio-maximized-open');
639
639
  return;
640
640
  }
641
641
 
@@ -654,7 +654,7 @@ export class DrawioEmbedController {
654
654
  entry.restoreParent = null;
655
655
  entry.restoreNextSibling = null;
656
656
  this.maximizedEntry = null;
657
- document.body.classList.remove('drawio-maximized-open');
657
+ document.body.classList.toggle('drawio-maximized-open', Boolean(document.body.querySelector('.drawio-embed.is-maximized')));
658
658
  this.overlayRoot?.classList.remove('has-maximized-entry');
659
659
  this.syncEntryLayout(entry);
660
660
  }
@@ -1,7 +1,7 @@
1
1
  import { setDiagramActionButtonIcon } from '../domain/diagram-action-icons.js';
2
2
  import { parseExcalidrawElementLink } from '../domain/excalidraw-element-link.js';
3
3
  import { reconcileEmbedEntries } from './excalidraw-embed-reconciler.js';
4
- import { resolveAppPath, resolveAppUrl, resolveWsServerOverride } from '../domain/runtime-paths.js';
4
+ import { getActiveVaultId, resolveAppPath, resolveAppUrl, resolveWsServerOverride } from '../domain/runtime-paths.js';
5
5
  import {
6
6
  cancelIdleRender,
7
7
  isNearViewport,
@@ -80,7 +80,6 @@ export class ExcalidrawEmbedController {
80
80
  this.hydrationIdleId = null;
81
81
  this.hydrationQueue = [];
82
82
  this._exitMaximizedEmbed();
83
- document.body.classList.remove('excalidraw-maximized-open');
84
83
 
85
84
  this.embedEntries.forEach((entry) => {
86
85
  this._clearEntryBootTimeout(entry);
@@ -762,6 +761,8 @@ export class ExcalidrawEmbedController {
762
761
  }
763
762
  const theme = this.getTheme?.() || 'dark';
764
763
 
764
+ const vaultId = getActiveVaultId();
765
+ if (vaultId) iframeUrl.searchParams.set('vault', vaultId);
765
766
  iframeUrl.searchParams.set('file', entry.filePath);
766
767
  iframeUrl.searchParams.set('theme', theme);
767
768
  iframeUrl.searchParams.set('boot', entry.instanceId || '');
@@ -878,7 +879,7 @@ export class ExcalidrawEmbedController {
878
879
  isMaximized = false;
879
880
  wrapper.classList.remove('is-maximized');
880
881
  syncMaximizeButtonState();
881
- document.body.classList.remove('excalidraw-maximized-open');
882
+ document.body.classList.toggle('excalidraw-maximized-open', Boolean(document.body.querySelector('.excalidraw-embed.is-maximized')));
882
883
  this._restoreMaximizedEntryLayout(entry);
883
884
  iframe.style.height = restoreHeight;
884
885
  if (this.maximizedEmbed?.wrapper === wrapper) {
@@ -1344,6 +1345,15 @@ export class ExcalidrawEmbedController {
1344
1345
  this._syncEntryFollowState(entry);
1345
1346
  this._postPendingCommentThread?.(entry);
1346
1347
  this._postPendingElement?.(entry);
1348
+ this.pendingDisconnectRequests?.forEach((request, requestId) => {
1349
+ if (request.entry === entry) {
1350
+ this._postMessageToEntry(entry, {
1351
+ source: 'collabmd-host',
1352
+ type: 'prepare-disconnect',
1353
+ requestId,
1354
+ });
1355
+ }
1356
+ });
1347
1357
  if (this._entryNeedsHardReload(entry)) {
1348
1358
  void this._hydrateEntry(entry);
1349
1359
  }
@@ -1434,7 +1444,6 @@ export class ExcalidrawEmbedController {
1434
1444
  this.maximizedEmbed.exit();
1435
1445
  }
1436
1446
  this.maximizedEmbed = null;
1437
- document.body.classList.remove('excalidraw-maximized-open');
1438
1447
  }
1439
1448
 
1440
1449
  _postMessageToEntry(entry, payload) {
@@ -3,7 +3,7 @@ import {
3
3
  isVaultFilePath,
4
4
  VAULT_FILE_EXTENSIONS,
5
5
  } from '../../domain/file-kind.js';
6
- import { pickFiles } from '../browser-utils.js';
6
+ import { copyTextToClipboard, pickFiles } from '../browser-utils.js';
7
7
  import {
8
8
  createBaseStarter,
9
9
  composeVaultChildPath,
@@ -17,6 +17,8 @@ import {
17
17
  getVaultPathParent,
18
18
  normalizeVaultPathInput,
19
19
  } from '../domain/vault-paths.js';
20
+ import { createFileRouteHash } from '../domain/hash-routes.js';
21
+ import { getActiveVaultId } from '../domain/runtime-paths.js';
20
22
  import { buttonClassNames } from './components/ui/button.js';
21
23
  import { CreateMenuPresenter } from './create-menu-presenter.js';
22
24
 
@@ -156,6 +158,16 @@ export class FileActionController {
156
158
  meta: '.base',
157
159
  onSelect: () => this.handleNewBase({ parentDir }),
158
160
  },
161
+ {
162
+ contextLabel: 'New canvas',
163
+ group: 'Diagram',
164
+ hint: 'JSON Canvas',
165
+ icon: this.getCreateActionIcon('canvas'),
166
+ id: 'canvas',
167
+ label: 'Canvas',
168
+ meta: '.canvas',
169
+ onSelect: () => this.handleNewCanvas({ parentDir }),
170
+ },
159
171
  {
160
172
  contextLabel: 'New Excalidraw drawing',
161
173
  group: 'Diagram',
@@ -258,6 +270,10 @@ export class FileActionController {
258
270
 
259
271
  getFileContextMenuItems(filePath) {
260
272
  return [
273
+ {
274
+ label: 'Copy as URL',
275
+ onSelect: () => this.copyFileUrl(filePath),
276
+ },
261
277
  {
262
278
  label: 'Rename / move',
263
279
  onSelect: () => this.handleRenameFile(filePath),
@@ -274,6 +290,20 @@ export class FileActionController {
274
290
  ];
275
291
  }
276
292
 
293
+ async copyFileUrl(filePath) {
294
+ const url = new URL(window.location.href);
295
+ url.search = '';
296
+ const vaultId = getActiveVaultId();
297
+ if (vaultId) url.searchParams.set('vault', vaultId);
298
+ url.hash = createFileRouteHash(filePath);
299
+ try {
300
+ await copyTextToClipboard(url.toString());
301
+ this.showToast('Link copied');
302
+ } catch {
303
+ this.showToast('Failed to copy link');
304
+ }
305
+ }
306
+
277
307
  showToast(message) {
278
308
  if (message) {
279
309
  this.toastController?.show(String(message));
@@ -286,6 +316,7 @@ export class FileActionController {
286
316
  return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 16V4"/><path d="m7 9 5-5 5 5"/><path d="M5 20h14"/></svg>';
287
317
  case 'base':
288
318
  return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/></svg>';
319
+ case 'canvas':
289
320
  case 'drawio':
290
321
  case 'plantuml':
291
322
  case 'structurizr':
@@ -918,6 +949,32 @@ export class FileActionController {
918
949
  });
919
950
  }
920
951
 
952
+ handleNewCanvas({ parentDir = '' } = {}) {
953
+ const context = this.getCreateContext(parentDir);
954
+ this.openActionDialog({
955
+ title: 'Create canvas',
956
+ copy: 'Create a canvas for connected notes, files, links, and groups.',
957
+ label: `Canvas ${context.inputLabelSuffix}`,
958
+ hint: `${context.hintPrefix} ".canvas" is added automatically.`,
959
+ note: context.note,
960
+ placeholder: context.normalizedParentDir ? 'ideas' : 'diagrams/ideas',
961
+ submitLabel: 'Create canvas',
962
+ emptyMessage: 'Canvas path is required',
963
+ onSubmit: (value) => {
964
+ const normalizedPath = normalizeVaultPathInput(value);
965
+ if (!normalizedPath) {
966
+ this.showToast('Canvas path is required');
967
+ return false;
968
+ }
969
+ const filePath = ensureVaultExtension(composeVaultChildPath(context.normalizedParentDir, normalizedPath), '.canvas');
970
+ return this.createVaultFile(filePath, '{"nodes":[],"edges":[]}\n', {
971
+ errorMessage: 'Failed to create canvas',
972
+ openAfterCreate: true,
973
+ });
974
+ },
975
+ });
976
+ }
977
+
921
978
  handleNewDrawing({ parentDir = '' } = {}) {
922
979
  const context = this.getCreateContext(parentDir);
923
980
 
@@ -1,4 +1,3 @@
1
- import { isImageAttachmentFilePath } from '../../domain/file-kind.js';
2
1
  import { FileActionController } from './file-action-controller.js';
3
2
  import { FileTreeState } from './file-tree-state.js';
4
3
  import { FileExplorerView } from './file-explorer-view.js';
@@ -143,7 +142,7 @@ export class FileExplorerController {
143
142
  }
144
143
 
145
144
  get flatDocumentFiles() {
146
- return this.state.flatFiles.filter((path) => !isImageAttachmentFilePath(path));
145
+ return this.state.flatDocumentFiles;
147
146
  }
148
147
 
149
148
  renderTree({
@@ -4,6 +4,8 @@ import {
4
4
  stripVaultFileExtension,
5
5
  } from '../../domain/file-kind.js';
6
6
  import { escapeHtml } from '../domain/vault-utils.js';
7
+ import { findFuzzyMatch } from '../domain/file-search.js';
8
+ import { getActiveVaultId } from '../domain/runtime-paths.js';
7
9
  import { getVaultPathLeaf, getVaultPathParent } from '../domain/vault-paths.js';
8
10
  import { buttonClassNames } from './components/ui/button.js';
9
11
 
@@ -43,9 +45,17 @@ function createMenuFilterInput({ container, itemSelector, placeholder, skipLabel
43
45
  if (skipLabels.includes(button.textContent)) {
44
46
  return;
45
47
  }
46
- button.hidden = query.length > 0 && !(button.textContent ?? '').toLowerCase().includes(query);
48
+ const text = (button.dataset.searchText ?? button.textContent ?? '').toLowerCase();
49
+ button.hidden = query.length > 0 && !text.includes(query) && !findFuzzyMatch(text, query);
47
50
  });
48
51
  });
52
+ searchInput.addEventListener('keydown', (event) => {
53
+ if (event.key === 'Enter') {
54
+ event.preventDefault();
55
+ Array.from(container.querySelectorAll(itemSelector))
56
+ .find((button) => !button.hidden && !skipLabels.includes(button.textContent))?.click();
57
+ }
58
+ });
49
59
  container.appendChild(searchInput);
50
60
  return searchInput;
51
61
  }
@@ -117,17 +127,17 @@ export class FileExplorerView {
117
127
  button.className = 'vault-switcher-button';
118
128
  button.id = 'vaultSwitcher';
119
129
  button.setAttribute('aria-haspopup', 'menu');
120
- button.setAttribute('aria-label', `Switch vault (current: ${active.id})`);
130
+ button.setAttribute('aria-label', `Switch vault (current: ${active.name || active.id})`);
121
131
  button.title = 'Switch vault';
122
- button.innerHTML = `<span class="vault-switcher-icon" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path></svg></span><span class="vault-switcher-name">${escapeHtml(active.id)}</span><span class="vault-switcher-chevron" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg></span>`;
132
+ button.innerHTML = `<span class="vault-switcher-icon" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path></svg></span><span class="vault-switcher-name">${escapeHtml(active.name || active.id)}</span><span class="vault-switcher-chevron" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg></span>`;
123
133
  button.addEventListener('click', (event) => {
124
134
  this.showContextMenu(event, entries.map((vault) => ({
125
- label: vault.id,
135
+ label: vault.name || vault.id,
136
+ searchText: `${vault.name || vault.id} ${vault.id}`,
126
137
  onSelect: () => (onVaultSelect ?? this.onVaultSelect)?.(vault.id),
127
138
  })), {
128
139
  alignToAnchor: true,
129
- // ponytail: filter only pays off for long vault lists
130
- searchPlaceholder: entries.length > 8 ? 'Filter vaults…' : '',
140
+ searchPlaceholder: 'Filter vaults…',
131
141
  });
132
142
  });
133
143
  wrapper.appendChild(button);
@@ -287,8 +297,13 @@ export class FileExplorerView {
287
297
  }
288
298
  item.classList.add('is-dragging');
289
299
  if (event.dataTransfer) {
290
- event.dataTransfer.effectAllowed = 'move';
300
+ event.dataTransfer.effectAllowed = this.dragSource.type === 'file' ? 'copyMove' : 'move';
291
301
  event.dataTransfer.setData('text/plain', item.dataset.path);
302
+ if (this.dragSource.type === 'file') {
303
+ event.dataTransfer.setData('application/x-collabmd-vault-file', JSON.stringify({
304
+ path: item.dataset.path, vaultId: getActiveVaultId() || '',
305
+ }));
306
+ }
292
307
  }
293
308
  }
294
309
 
@@ -1093,6 +1108,7 @@ export class FileExplorerView {
1093
1108
  button.className = `file-context-item${item.danger ? ' file-context-danger' : ''}`;
1094
1109
  button.setAttribute('role', 'menuitem');
1095
1110
  button.textContent = item.label;
1111
+ if (item.searchText) button.dataset.searchText = item.searchText;
1096
1112
  button.addEventListener('click', () => {
1097
1113
  this.removeContextMenu();
1098
1114
  item.onSelect?.({ anchor: contextAnchor });
@@ -1184,6 +1200,7 @@ export class FileExplorerView {
1184
1200
  extra: ['file-action-sheet-item', item.danger ? 'file-context-danger' : ''],
1185
1201
  });
1186
1202
  button.textContent = item.label;
1203
+ if (item.searchText) button.dataset.searchText = item.searchText;
1187
1204
  button.addEventListener('click', () => {
1188
1205
  this.removeContextMenu();
1189
1206
  item.onSelect?.();
@@ -1203,6 +1220,13 @@ export class FileExplorerView {
1203
1220
  });
1204
1221
  sheet.appendChild(cancelButton);
1205
1222
 
1223
+ sheet.addEventListener('keydown', (event) => {
1224
+ if (event.key === 'Escape') {
1225
+ // A search input otherwise consumes Escape before the dialog can cancel.
1226
+ event.preventDefault();
1227
+ this.removeContextMenu();
1228
+ }
1229
+ });
1206
1230
  sheet.addEventListener('cancel', (event) => {
1207
1231
  event.preventDefault();
1208
1232
  this.removeContextMenu();
@@ -16,7 +16,7 @@ export function getVaultFileIconSvg(filePath, {
16
16
  return createIcon(iconClass, '<path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/>');
17
17
  }
18
18
 
19
- if (kind === 'drawio' || kind === 'plantuml' || kind === 'structurizr') {
19
+ if (kind === 'canvas' || kind === 'drawio' || kind === 'plantuml' || kind === 'structurizr') {
20
20
  return createIcon(iconClass, '<rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/>');
21
21
  }
22
22
 
@@ -1,6 +1,7 @@
1
+ import { isImageAttachmentFilePath } from '../../domain/file-kind.js';
1
2
  import { normalizeVaultPathInput } from '../domain/vault-paths.js';
2
3
 
3
- function flattenTree(nodes, files = [], searchEntries = [], fileEntries = []) {
4
+ export function flattenTree(nodes, files = [], searchEntries = [], fileEntries = []) {
4
5
  for (const node of nodes) {
5
6
  if (!node?.path || !node?.type) {
6
7
  continue;
@@ -78,6 +79,7 @@ export class FileTreeState {
78
79
  constructor() {
79
80
  this.tree = [];
80
81
  this.flatFiles = [];
82
+ this.flatDocumentFiles = [];
81
83
  this.flatFileEntries = [];
82
84
  this.flatSearchEntries = [];
83
85
  this.activeFilePath = null;
@@ -89,6 +91,7 @@ export class FileTreeState {
89
91
  this.tree = Array.isArray(tree) ? tree : [];
90
92
  const flattened = flattenTree(this.tree, [], [], []);
91
93
  this.flatFiles = flattened.files;
94
+ this.flatDocumentFiles = flattened.files.filter((path) => !isImageAttachmentFilePath(path));
92
95
  this.flatFileEntries = flattened.fileEntries;
93
96
  this.flatSearchEntries = flattened.searchEntries;
94
97
  }
@@ -40,10 +40,6 @@ export function clampImageLightboxOffset(offset, {
40
40
  return Math.min(Math.max(numericOffset, -overflow), overflow);
41
41
  }
42
42
 
43
- export function isImageLightboxWheelZoomGesture(event) {
44
- return Boolean(event?.ctrlKey);
45
- }
46
-
47
43
  export class ImageLightboxController {
48
44
  constructor({
49
45
  previewElement,
@@ -508,7 +504,7 @@ export class ImageLightboxController {
508
504
  return;
509
505
  }
510
506
 
511
- if (isImageLightboxWheelZoomGesture(event)) {
507
+ if (event.ctrlKey) {
512
508
  event.preventDefault();
513
509
  this.zoomBy(event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP);
514
510
  return;