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,10 +1,29 @@
1
1
  const DIAGRAM_ACTION_ICONS = {
2
+ copy: `
3
+ <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
4
+ <path d="M5.5 5.5h6.8v8h-6.8z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
5
+ <path d="M3.7 10.5H3a1 1 0 0 1-1-1v-6a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v.7" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
6
+ </svg>
7
+ `,
8
+ download: `
9
+ <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
10
+ <path d="M8 2.2v7.2" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
11
+ <path d="M5.3 7.2 8 10l2.7-2.8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
12
+ <path d="M3 12.8h10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
13
+ </svg>
14
+ `,
2
15
  edit: `
3
16
  <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
4
17
  <path d="M11.8 1.8a1.5 1.5 0 0 1 2.1 2.1l-7.2 7.2-3.2.9.9-3.2z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
5
18
  <path d="M10.7 2.9l2.4 2.4" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
6
19
  </svg>
7
20
  `,
21
+ fit: `
22
+ <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
23
+ <path d="M5.5 6.2V3H2.3M10.5 6.2V3h3.2M10.5 9.8V13h3.2M5.5 9.8V13H2.3" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
24
+ <path d="M5.5 6.2h5M5.5 9.8h5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
25
+ </svg>
26
+ `,
8
27
  maximize: `
9
28
  <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
10
29
  <path d="M6 2H2v4M10 2h4v4M14 10v4h-4M2 10v4h4" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
@@ -32,10 +51,12 @@ export function setDiagramActionButtonIcon(button, iconName) {
32
51
  const markup = DIAGRAM_ACTION_ICONS[iconName];
33
52
  if (!markup) {
34
53
  button.classList.remove('is-icon-only');
54
+ button.classList.remove('ui-preview-action--icon-only');
35
55
  return;
36
56
  }
37
57
 
38
58
  button.classList.add('is-icon-only');
59
+ button.classList.add('ui-preview-action--icon-only');
39
60
  button.dataset.icon = iconName;
40
61
  button.innerHTML = markup.trim();
41
62
  }
@@ -0,0 +1,70 @@
1
+ function normalizeBinaryFileVersion(value) {
2
+ return Number.isFinite(Number(value)) ? Number(value) : null;
3
+ }
4
+
5
+ function normalizeBinaryFileDataUrl(value) {
6
+ return typeof value === 'string' ? value : '';
7
+ }
8
+
9
+ export function hasBinaryFilePayloadConflict(currentFile, nextFile) {
10
+ return (
11
+ normalizeBinaryFileVersion(currentFile?.version) !== normalizeBinaryFileVersion(nextFile?.version)
12
+ || normalizeBinaryFileDataUrl(currentFile?.dataURL) !== normalizeBinaryFileDataUrl(nextFile?.dataURL)
13
+ );
14
+ }
15
+
16
+ export function buildExcalidrawFileSyncPlan(currentFiles = {}, nextFiles = {}) {
17
+ const missingFiles = [];
18
+ const conflictingFileIds = [];
19
+
20
+ Object.entries(nextFiles || {}).forEach(([fileId, nextFile]) => {
21
+ const currentFile = currentFiles?.[fileId];
22
+ if (!currentFile) {
23
+ missingFiles.push(nextFile);
24
+ return;
25
+ }
26
+
27
+ if (hasBinaryFilePayloadConflict(currentFile, nextFile)) {
28
+ conflictingFileIds.push(fileId);
29
+ }
30
+ });
31
+
32
+ return {
33
+ conflictingFileIds,
34
+ missingFiles,
35
+ requiresRemount: conflictingFileIds.length > 0,
36
+ };
37
+ }
38
+
39
+ export function applySceneUpdateWithFiles(api, {
40
+ captureUpdate,
41
+ files = {},
42
+ sceneUpdate,
43
+ } = {}, {
44
+ onFileConflict = () => {},
45
+ } = {}) {
46
+ const currentFiles = api?.getFiles?.() || {};
47
+ const syncPlan = buildExcalidrawFileSyncPlan(currentFiles, files);
48
+
49
+ if (syncPlan.requiresRemount) {
50
+ onFileConflict(syncPlan);
51
+ return {
52
+ ...syncPlan,
53
+ applied: false,
54
+ };
55
+ }
56
+
57
+ if (syncPlan.missingFiles.length > 0) {
58
+ api.addFiles(syncPlan.missingFiles);
59
+ }
60
+
61
+ api.updateScene({
62
+ ...sceneUpdate,
63
+ captureUpdate,
64
+ });
65
+
66
+ return {
67
+ ...syncPlan,
68
+ applied: true,
69
+ };
70
+ }
@@ -0,0 +1,8 @@
1
+ export function isPlainQuickSwitcherShortcut(event) {
2
+ if (!event || event.repeat || (!event.metaKey && !event.ctrlKey) || event.shiftKey || event.altKey) {
3
+ return false;
4
+ }
5
+
6
+ const key = String(event.key ?? '').toLowerCase();
7
+ return key === 'k' || event.code === 'KeyK';
8
+ }
@@ -2,6 +2,7 @@ import './styles/surfaces/embedded-editor-base.css';
2
2
  import './styles/surfaces/drawio-editor.css';
3
3
 
4
4
  import { ensureClientAuthenticated } from './infrastructure/auth-client.js';
5
+ import { isPlainQuickSwitcherShortcut } from './domain/keyboard-shortcuts.js';
5
6
  import { DrawioLeaseClient } from './infrastructure/drawio-lease-client.js';
6
7
  import { getRuntimeConfig } from './infrastructure/runtime-config.js';
7
8
  import { vaultApiClient } from './infrastructure/vault-api-client.js';
@@ -76,6 +77,16 @@ function postToParent(type, payload = {}) {
76
77
  window.parent.postMessage({ source: 'drawio-editor', instanceId, type, ...payload }, parentOrigin);
77
78
  }
78
79
 
80
+ function handleQuickSwitcherKeyDown(event) {
81
+ if (!isPlainQuickSwitcherShortcut(event)) {
82
+ return;
83
+ }
84
+
85
+ event.preventDefault();
86
+ event.stopPropagation();
87
+ postToParent('request-toggle-quick-switcher');
88
+ }
89
+
79
90
  function parseMessagePayload(rawValue) {
80
91
  if (typeof rawValue === 'string') {
81
92
  try {
@@ -418,6 +429,8 @@ async function claimEdit() {
418
429
  drawioLeaseClient.tryAcquireLease();
419
430
  }
420
431
 
432
+ window.addEventListener('keydown', handleQuickSwitcherKeyDown, { capture: true });
433
+
421
434
  async function init() {
422
435
  setBodyTheme(currentTheme);
423
436
 
@@ -16,6 +16,9 @@ import {
16
16
  } from './domain/excalidraw-collaboration.js';
17
17
  import './styles/surfaces/embedded-editor-base.css';
18
18
  import './styles/surfaces/excalidraw-editor.css';
19
+ import {
20
+ applySceneUpdateWithFiles,
21
+ } from './domain/excalidraw-api-scene-sync.js';
19
22
  import {
20
23
  normalizeScene,
21
24
  parseSceneJson,
@@ -24,6 +27,7 @@ import {
24
27
  import {
25
28
  normalizeDocumentMode,
26
29
  } from './domain/excalidraw-document-switch.js';
30
+ import { isPlainQuickSwitcherShortcut } from './domain/keyboard-shortcuts.js';
27
31
  import { ensureClientAuthenticated } from './infrastructure/auth-client.js';
28
32
  import { ExcalidrawRoomClient } from './infrastructure/excalidraw-room-client.js';
29
33
  import { vaultApiClient } from './infrastructure/vault-api-client.js';
@@ -63,6 +67,9 @@ let initialViewportFitPending = true;
63
67
  let roomClient = null;
64
68
  let roomClientGeneration = 0;
65
69
  let reactRoot = null;
70
+ let editorRenderKey = 0;
71
+ let skipRoomDisconnectOnUnmount = false;
72
+ const reportedFileConflictSignatures = new Set();
66
73
 
67
74
  function getDocumentViewState(mode = currentDocument.mode) {
68
75
  const normalizedMode = normalizeDocumentMode(mode);
@@ -113,7 +120,11 @@ function buildExcalidrawProps({ initialData } = {}) {
113
120
  },
114
121
  onUnmount: () => {
115
122
  clearEditorApiStateBindings();
116
- disconnectRealtimeRoom({ preserveEditorBindings: true });
123
+ if (skipRoomDisconnectOnUnmount) {
124
+ skipRoomDisconnectOnUnmount = false;
125
+ } else {
126
+ disconnectRealtimeRoom({ preserveEditorBindings: true });
127
+ }
117
128
  excalidrawAPI = null;
118
129
  collabReady = false;
119
130
  },
@@ -154,7 +165,10 @@ function renderExcalidrawApp({ initialData } = {}) {
154
165
  React.createElement(
155
166
  'div',
156
167
  { style: { height: '100vh', width: '100%' } },
157
- React.createElement(Excalidraw, buildExcalidrawProps({ initialData })),
168
+ React.createElement(Excalidraw, {
169
+ key: `editor-${editorRenderKey}`,
170
+ ...buildExcalidrawProps({ initialData }),
171
+ }),
158
172
  ),
159
173
  );
160
174
  }
@@ -224,6 +238,13 @@ if (isTestMode) {
224
238
  .map((element) => element.id)
225
239
  .sort() ?? []
226
240
  ),
241
+ getElementStatus: (elementId) => (
242
+ excalidrawAPI?.getSceneElementsIncludingDeleted?.()
243
+ ?.find((entry) => entry.id === elementId && !entry.isDeleted)?.status ?? null
244
+ ),
245
+ getFileIds: () => (
246
+ Object.keys(excalidrawAPI?.getFiles?.() || {}).sort()
247
+ ),
227
248
  getHistoryState: () => getNativeHistoryState(),
228
249
  getLocalUserName: () => localAwarenessUser?.name || '',
229
250
  getLocalPeerId: () => localAwarenessUser?.peerId || '',
@@ -321,7 +342,9 @@ function applySceneFromJson(rawJson) {
321
342
  return;
322
343
  }
323
344
 
324
- updateApiScene(scene);
345
+ updateApiScene(scene, {
346
+ replaceElements: true,
347
+ });
325
348
  }
326
349
 
327
350
  function releaseOnChangeSuppressionAfterPaint({ trackedSharedSnapshot = false } = {}) {
@@ -376,35 +399,100 @@ function buildApiSceneUpdate(scene, {
376
399
  ...appStateOverrides,
377
400
  },
378
401
  elements: reconciledElements,
379
- files: scene?.files || {},
380
402
  };
381
403
  }
382
404
 
383
- function updateApiScene(scene, {
405
+ function logFileConflictOnce(conflictingFileIds = []) {
406
+ const signature = `${currentDocument.filePath}::${[...conflictingFileIds].sort().join(',')}`;
407
+ if (reportedFileConflictSignatures.has(signature)) {
408
+ return;
409
+ }
410
+
411
+ reportedFileConflictSignatures.add(signature);
412
+ console.warn(
413
+ `[excalidraw:${currentDocument.filePath}] Remounting editor after receiving conflicting binary file payload(s) for existing file ids: ${conflictingFileIds.join(', ')}`,
414
+ );
415
+ }
416
+
417
+ function requestEditorRemount(scene) {
418
+ if (!reactRoot) {
419
+ return false;
420
+ }
421
+
422
+ const normalizedScene = normalizeScene(scene);
423
+ const normalizedJson = JSON.stringify(normalizedScene);
424
+ pendingRemoteSceneJson = normalizedJson;
425
+ appliedSceneJson = normalizedJson;
426
+ pendingCollaborators = activeCollaborators;
427
+ initialViewportFitPending = true;
428
+ clearEditorApiStateBindings();
429
+ skipRoomDisconnectOnUnmount = true;
430
+ editorRenderKey += 1;
431
+ renderExcalidrawApp({
432
+ initialData: sceneToInitialData(normalizedScene, { theme: currentTheme }),
433
+ });
434
+ return true;
435
+ }
436
+
437
+ function applySceneToMountedApi(scene, {
384
438
  appStateOverrides = {},
385
439
  captureUpdate = CaptureUpdateAction.NEVER,
386
440
  replaceElements = false,
387
- trackedSharedSnapshot = true,
441
+ trackedSharedSnapshot = false,
388
442
  } = {}) {
389
443
  const nextSceneUpdate = buildApiSceneUpdate(scene, {
390
444
  appStateOverrides,
391
445
  replaceElements,
392
446
  });
447
+ let applyResult = null;
393
448
 
394
449
  suppressOnChange = true;
395
450
  if (trackedSharedSnapshot) {
396
451
  roomClient?.beginApplyingSharedSnapshot();
397
452
  }
453
+
398
454
  try {
399
- excalidrawAPI.updateScene({
400
- ...nextSceneUpdate,
455
+ applyResult = applySceneUpdateWithFiles(excalidrawAPI, {
401
456
  captureUpdate,
457
+ files: scene?.files || {},
458
+ sceneUpdate: nextSceneUpdate,
459
+ }, {
460
+ onFileConflict: ({ conflictingFileIds }) => {
461
+ logFileConflictOnce(conflictingFileIds);
462
+ },
402
463
  });
403
464
  } finally {
404
- releaseOnChangeSuppressionAfterPaint({ trackedSharedSnapshot });
465
+ if (applyResult?.requiresRemount) {
466
+ if (trackedSharedSnapshot) {
467
+ roomClient?.endApplyingSharedSnapshot();
468
+ }
469
+ suppressOnChange = false;
470
+ } else {
471
+ releaseOnChangeSuppressionAfterPaint({ trackedSharedSnapshot });
472
+ }
473
+ }
474
+
475
+ if (applyResult?.requiresRemount) {
476
+ requestEditorRemount(scene);
477
+ return applyResult;
405
478
  }
406
479
 
407
480
  scheduleInitialViewportFit();
481
+ return applyResult;
482
+ }
483
+
484
+ function updateApiScene(scene, {
485
+ appStateOverrides = {},
486
+ captureUpdate = CaptureUpdateAction.NEVER,
487
+ replaceElements = false,
488
+ trackedSharedSnapshot = true,
489
+ } = {}) {
490
+ applySceneToMountedApi(scene, {
491
+ appStateOverrides,
492
+ captureUpdate,
493
+ replaceElements,
494
+ trackedSharedSnapshot,
495
+ });
408
496
  }
409
497
 
410
498
  function applyLocalScene(scene, {
@@ -420,16 +508,12 @@ function applyLocalScene(scene, {
420
508
  return;
421
509
  }
422
510
 
423
- excalidrawAPI.updateScene({
424
- ...buildApiSceneUpdate(normalizedScene),
511
+ applySceneToMountedApi(normalizedScene, {
425
512
  captureUpdate,
426
513
  });
427
-
428
- if (suppressOnChange) {
429
- roomClient?.commitSceneJson(normalizedJson, {
430
- origin: 'excalidraw-local-scene-apply',
431
- });
432
- }
514
+ roomClient?.commitSceneJson(normalizedJson, {
515
+ origin: 'excalidraw-local-scene-apply',
516
+ });
433
517
  }
434
518
 
435
519
  function onRoomTextUpdate() {
@@ -440,6 +524,16 @@ function postToParent(type, payload = {}) {
440
524
  window.parent.postMessage({ source: 'excalidraw-editor', type, ...payload }, parentOrigin);
441
525
  }
442
526
 
527
+ function handleQuickSwitcherKeyDown(event) {
528
+ if (!isPlainQuickSwitcherShortcut(event)) {
529
+ return;
530
+ }
531
+
532
+ event.preventDefault();
533
+ event.stopPropagation();
534
+ postToParent('request-toggle-quick-switcher');
535
+ }
536
+
443
537
  function getSceneElementsForPreviewFit() {
444
538
  return (
445
539
  excalidrawAPI?.getSceneElementsIncludingDeleted?.()
@@ -705,11 +799,16 @@ function scheduleSyncToRoom(elements, appState, files) {
705
799
  return;
706
800
  }
707
801
 
708
- appliedSceneJson = JSON.stringify(normalizeScene({
802
+ const nextSceneJson = JSON.stringify(normalizeScene({
709
803
  elements,
710
804
  appState,
711
805
  files,
712
806
  }));
807
+ if (nextSceneJson === appliedSceneJson) {
808
+ return;
809
+ }
810
+
811
+ appliedSceneJson = nextSceneJson;
713
812
  roomClient.scheduleSceneSync(elements, appState, files);
714
813
  }
715
814
 
@@ -757,6 +856,8 @@ function handleEditorMount({ excalidrawAPI: api }) {
757
856
  excalidrawAPI = api;
758
857
  }
759
858
 
859
+ window.addEventListener('keydown', handleQuickSwitcherKeyDown, { capture: true });
860
+
760
861
  async function init() {
761
862
  const loadingElement = document.getElementById('loadingState');
762
863
 
@@ -210,7 +210,7 @@ export class ExcalidrawRoomClient {
210
210
  let initialJson = this.getStructuredSceneJson();
211
211
  let usedApiFallback = false;
212
212
  if (!initialJson) {
213
- const sceneFromApi = await this.loadSceneFromApi();
213
+ const sceneFromApi = await this.loadSceneFromApi({ createIfMissing: false });
214
214
  const syncedJson = this.getStructuredSceneJson();
215
215
  if (syncedJson) {
216
216
  initialJson = syncedJson;
@@ -368,8 +368,31 @@ export class ExcalidrawRoomClient {
368
368
  replaceExcalidrawRoomScene(this.ydoc, nextScene);
369
369
  }
370
370
 
371
+ mergeLocallyChangedAppState(appState, baseSceneJson) {
372
+ const baseScene = parseSceneJson(baseSceneJson);
373
+ const roomScene = parseSceneJson(this.getStructuredSceneJson() || this.lastSceneJson);
374
+ const nextAppState = {
375
+ ...roomScene.appState,
376
+ };
377
+
378
+ ['gridSize', 'viewBackgroundColor'].forEach((key) => {
379
+ if (appState?.[key] === baseScene.appState?.[key]) {
380
+ return;
381
+ }
382
+
383
+ nextAppState[key] = appState?.[key];
384
+ });
385
+
386
+ return nextAppState;
387
+ }
388
+
371
389
  scheduleSceneSync(elements, appState, files) {
372
- this.pendingSceneSyncPayload = { appState, elements, files };
390
+ this.pendingSceneSyncPayload = {
391
+ appState,
392
+ baseSceneJson: this.lastSceneJson,
393
+ elements,
394
+ files,
395
+ };
373
396
  if (!this.canWriteToRoom) {
374
397
  return;
375
398
  }
@@ -395,13 +418,27 @@ export class ExcalidrawRoomClient {
395
418
  return;
396
419
  }
397
420
 
398
- const { elements, appState, files } = this.pendingSceneSyncPayload;
421
+ const {
422
+ appState,
423
+ baseSceneJson,
424
+ elements,
425
+ files,
426
+ } = this.pendingSceneSyncPayload;
399
427
  this.pendingSceneSyncPayload = null;
400
428
 
401
- const sceneData = buildLiveCollaborationScene(elements, appState, files);
429
+ const sceneData = buildLiveCollaborationScene(
430
+ elements,
431
+ this.mergeLocallyChangedAppState(appState, baseSceneJson),
432
+ files,
433
+ );
402
434
  const json = JSON.stringify(sceneData);
403
435
  if (this.shouldDelayEmptySceneCommit(json)) {
404
- this.pendingSceneSyncPayload = { appState, elements, files };
436
+ this.pendingSceneSyncPayload = {
437
+ appState,
438
+ baseSceneJson,
439
+ elements,
440
+ files,
441
+ };
405
442
  this.scheduleDelayedEmptySceneCommit();
406
443
  return;
407
444
  }
@@ -6,6 +6,29 @@ import { WORKSPACE_ROOM_NAME } from '../../domain/workspace-room.js';
6
6
  import { resolveWsBaseUrl } from '../domain/runtime-paths.js';
7
7
  import { stopReconnectOnControlledClose } from './yjs-provider-reset-guard.js';
8
8
 
9
+ function normalizeWorkspacePath(pathValue = '') {
10
+ return String(pathValue ?? '')
11
+ .trim()
12
+ .replace(/\\/g, '/')
13
+ .split('/')
14
+ .filter(Boolean)
15
+ .join('/');
16
+ }
17
+
18
+ function getParentDirectoryPath(pathValue = '') {
19
+ const normalizedPath = normalizeWorkspacePath(pathValue);
20
+ if (!normalizedPath) {
21
+ return '';
22
+ }
23
+
24
+ const separatorIndex = normalizedPath.lastIndexOf('/');
25
+ return separatorIndex >= 0 ? normalizedPath.slice(0, separatorIndex) : '';
26
+ }
27
+
28
+ function getEntryParentPath(entry = {}) {
29
+ return getParentDirectoryPath(entry?.path ?? '');
30
+ }
31
+
9
32
  function createNode(entry) {
10
33
  if (!entry?.path || !entry?.type) {
11
34
  return null;
@@ -87,7 +110,7 @@ class WorkspaceTreeModel {
87
110
  sortPathsByDepth(Array.from(this.nodesByPath.keys())).forEach((pathValue) => {
88
111
  const node = this.nodesByPath.get(pathValue);
89
112
  if (node) {
90
- this.attachNode(pathValue, node, this.entriesByPath.get(pathValue)?.parentPath || '');
113
+ this.attachNode(pathValue, node, getEntryParentPath(this.entriesByPath.get(pathValue)));
91
114
  }
92
115
  });
93
116
 
@@ -170,7 +193,7 @@ class WorkspaceTreeModel {
170
193
  }
171
194
 
172
195
  this.entriesByPath.set(pathValue, entry);
173
- this.attachNode(pathValue, node, entry.parentPath || '');
196
+ this.attachNode(pathValue, node, getEntryParentPath(entry));
174
197
 
175
198
  if (node.type === 'directory') {
176
199
  this.rehomeChildren(pathValue);
@@ -214,7 +237,7 @@ class WorkspaceTreeModel {
214
237
 
215
238
  rehomeChildren(parentPath) {
216
239
  this.entriesByPath.forEach((entry, pathValue) => {
217
- if (entry?.parentPath !== parentPath) {
240
+ if (getEntryParentPath(entry) !== parentPath) {
218
241
  return;
219
242
  }
220
243
 
@@ -107,7 +107,14 @@ export function appShellTemplate() {
107
107
  </button>
108
108
  <div class="toolbar-room-info">
109
109
  <span class="toolbar-room-name" id="activeFileName">CollabMD</span>
110
- <span class=${badgeClassNames({ tone: 'accent', extra: 'toolbar-badge' })} id="userCount"></span>
110
+ <button
111
+ type="button"
112
+ class=${badgeClassNames({ tone: 'accent', extra: ['toolbar-badge', 'toolbar-badge-button'] })}
113
+ id="userCount"
114
+ aria-controls="presencePanel"
115
+ aria-expanded="false"
116
+ data-presence-panel-trigger="true"
117
+ ></button>
111
118
  <span class=${badgeClassNames({ tone: 'accent', hidden: true, extra: 'toolbar-badge' })} id="toolbarDiffBadge">Diff</span>
112
119
  <span class=${badgeClassNames({ tone: 'accent', hidden: true, extra: 'toolbar-badge' })} id="gitOperationStatus" aria-live="polite" aria-atomic="true"></span>
113
120
  </div>
@@ -149,6 +156,16 @@ export function appShellTemplate() {
149
156
 
150
157
  <div class="user-avatars toolbar-presence-cluster" id="userAvatars"></div>
151
158
 
159
+ <section class="presence-panel hidden" id="presencePanel" aria-label="Online users" aria-hidden="true">
160
+ <div class="presence-panel-header">
161
+ <div>
162
+ <h2 class="presence-panel-title">Online now</h2>
163
+ <p class="presence-panel-status" id="presencePanelStatus">Click someone to follow.</p>
164
+ </div>
165
+ </div>
166
+ <div class="presence-panel-list" id="presencePanelList"></div>
167
+ </section>
168
+
152
169
  <div class="chat-container" id="chatContainer">
153
170
  <button class=${buttonClassNames({ variant: 'ghost', toolbar: true, extra: 'chat-toggle-btn' })} id="chatToggleBtn" aria-label="Open team chat" aria-expanded="false" title="Team chat">
154
171
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">