collabmd 0.1.25 → 0.1.26

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 (385) hide show
  1. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-BHWNpLuY.js → CodeMirrorEditor-UCMRAMCV-C5yVpm45.js} +1 -1
  2. package/dist/client/assets/{_basePickBy-CJWegqog.js → _basePickBy-Dr0N-hVE.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-CFKN1k1n.js → _baseUniq-BddJc3B1.js} +1 -1
  4. package/dist/client/assets/{ar-SA-NXDWD63E-DND5MLpM.js → ar-SA-NXDWD63E-C3GLfrYV.js} +1 -1
  5. package/dist/client/assets/{arc-D1SV2GW0.js → arc-fx_D7wYg.js} +1 -1
  6. package/dist/client/assets/architecture-PBZL5I3N-C1Yv7agI.js +1 -0
  7. package/dist/client/assets/{architectureDiagram-2XIMDMQ5-DXpDe6lq.js → architectureDiagram-2XIMDMQ5-T__yxKk2.js} +1 -1
  8. package/dist/client/assets/{az-AZ-MXSORGZV-ILYw2sYr.js → az-AZ-MXSORGZV-BJ2t-y-C.js} +1 -1
  9. package/dist/client/assets/{bg-BG-O6MV2KSF-DmfoZHM8.js → bg-BG-O6MV2KSF-Cd3kEZI-.js} +1 -1
  10. package/dist/client/assets/{blockDiagram-WCTKOSBZ-DlJn0Rs1.js → blockDiagram-WCTKOSBZ-BivLpsk_.js} +1 -1
  11. package/dist/client/assets/{bn-IN-MMW2ORAC-CmlBLY7g.js → bn-BD-T2VJNT7N-BFCx9nbZ.js} +1 -1
  12. package/dist/client/assets/{bn-BD-T2VJNT7N-uYQx1Wph.js → bn-IN-MMW2ORAC-Dn9W9dUT.js} +1 -1
  13. package/dist/client/assets/{c4Diagram-IC4MRINW-C6S9MOEW.js → c4Diagram-IC4MRINW-nVzPTZmV.js} +1 -1
  14. package/dist/client/assets/{ca-ES-MKBCGNOG-DWiYvMvF.js → ca-ES-MKBCGNOG-D_BNlrmg.js} +1 -1
  15. package/dist/client/assets/channel-DBZin7O0.js +1 -0
  16. package/dist/client/assets/{chunk-27N2SPOM-RxZ2_zJJ.js → chunk-27N2SPOM-CyIruM79.js} +4 -4
  17. package/dist/client/assets/{chunk-4BX2VUAB-LBTVcC6-.js → chunk-4BX2VUAB-n_yl-toC.js} +1 -1
  18. package/dist/client/assets/{chunk-55IACEB6-T5nuDI6U.js → chunk-55IACEB6-CJ9i_5Da.js} +1 -1
  19. package/dist/client/assets/{chunk-7E7YKBS2-CBNUsbS7.js → chunk-7E7YKBS2-CebEBDsj.js} +1 -1
  20. package/dist/client/assets/{chunk-7R4GIKGN-Dh9p1sbP.js → chunk-7R4GIKGN-BXNhzFkP.js} +2 -2
  21. package/dist/client/assets/{chunk-C72U2L5F-DLNOvzEI.js → chunk-C72U2L5F-Cck8MvGP.js} +1 -1
  22. package/dist/client/assets/{chunk-EGIJ26TM-BkBsHEWn.js → chunk-EGIJ26TM-BDQ7tRV-.js} +1 -1
  23. package/dist/client/assets/{chunk-FMBD7UC4-BoiIqhkb.js → chunk-FMBD7UC4-DAcjCJR-.js} +1 -1
  24. package/dist/client/assets/{chunk-GEFDOKGD-CIg-LRSp.js → chunk-GEFDOKGD-CYSNVsp-.js} +1 -1
  25. package/dist/client/assets/chunk-GLR3WWYH-FplqAopN.js +2 -0
  26. package/dist/client/assets/chunk-HHEYEP7N-Bv_FKHmu.js +1 -0
  27. package/dist/client/assets/{chunk-JSJVCQXG-C6-G93S3.js → chunk-JSJVCQXG-CLgStmEI.js} +1 -1
  28. package/dist/client/assets/{chunk-KX2RTZJC-CJlt0Rne.js → chunk-KX2RTZJC-B__vUl1o.js} +1 -1
  29. package/dist/client/assets/{chunk-KYZI473N-C-ObF5L3.js → chunk-KYZI473N-BpfobHkp.js} +1 -1
  30. package/dist/client/assets/{chunk-L3YUKLVL-BzkNNFii.js → chunk-L3YUKLVL-B7jdwbRL.js} +1 -1
  31. package/dist/client/assets/{chunk-MX3YWQON-bjcMtEei.js → chunk-MX3YWQON-DNcuP5dS.js} +1 -1
  32. package/dist/client/assets/{chunk-NQ4KR5QH-DY9oh8PD.js → chunk-NQ4KR5QH-oaq5iS2W.js} +1 -1
  33. package/dist/client/assets/{chunk-O4XLMI2P-CVfnFXq8.js → chunk-O4XLMI2P-NI4OcSZ6.js} +1 -1
  34. package/dist/client/assets/{chunk-OZEHJAEY-DyD-ywvu.js → chunk-OZEHJAEY-BevHLeQ0.js} +1 -1
  35. package/dist/client/assets/{chunk-PQ6SQG4A-BOJs3QbF.js → chunk-PQ6SQG4A-fQ_Oml5n.js} +1 -1
  36. package/dist/client/assets/{chunk-PU5JKC2W-1nkyDxBh.js → chunk-PU5JKC2W-Bp4H-mwZ.js} +1 -1
  37. package/dist/client/assets/chunk-QZHKN3VN-Blawx8vd.js +1 -0
  38. package/dist/client/assets/{chunk-R5LLSJPH-D9t4mFiL.js → chunk-R5LLSJPH-CZzZlfdI.js} +1 -1
  39. package/dist/client/assets/{chunk-SRAX5OIU-B-Zdxy2r.js → chunk-SRAX5OIU-CtUYAya6.js} +1 -1
  40. package/dist/client/assets/{chunk-WL4C6EOR-Bs95uEnp.js → chunk-WL4C6EOR-DnV9nMco.js} +1 -1
  41. package/dist/client/assets/{chunk-XIRO2GV7-CtwY16Jh.js → chunk-XIRO2GV7-BnkmoLpc.js} +1 -1
  42. package/dist/client/assets/{chunk-XPW4576I-CvxG514V.js → chunk-XPW4576I-DOk6pMat.js} +1 -1
  43. package/dist/client/assets/{chunk-XZSTWKYB-BNB3Mgw3.js → chunk-XZSTWKYB-DZzfqgVn.js} +1 -1
  44. package/dist/client/assets/{chunk-YBOYWFTD-MIDp82ug.js → chunk-YBOYWFTD-CrI5WFnC.js} +1 -1
  45. package/dist/client/assets/{chunk-Z5NKEFVG-CIMf1Se5.js → chunk-Z5NKEFVG-EGvolisB.js} +1 -1
  46. package/dist/client/assets/classDiagram-VBA2DB6C-CreQafQu.js +1 -0
  47. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BIYHzbiv.js +1 -0
  48. package/dist/client/assets/clone-C3ajWNce.js +1 -0
  49. package/dist/client/assets/{cose-bilkent-S5V4N54A-BKEY00wk.js → cose-bilkent-S5V4N54A-PcMOD_rX.js} +1 -1
  50. package/dist/client/assets/{cs-CZ-V77HGUP7-sLBAF2Iw.js → cs-CZ-V77HGUP7-gpioT6mv.js} +1 -1
  51. package/dist/client/assets/{da-DK-I5RFNTM4-B__PLwca.js → da-DK-I5RFNTM4-CVv-_qu9.js} +1 -1
  52. package/dist/client/assets/{dagre-Cm2w_QpZ.js → dagre-BD9xHP_z.js} +1 -1
  53. package/dist/client/assets/{dagre-KLK3FWXG-BddfhbwG.js → dagre-KLK3FWXG-Ct1xwvCC.js} +1 -1
  54. package/dist/client/assets/{de-DE-DTI4WUSC-Ba3fBYEU.js → de-CH-WLRDEVBV-CL0gsFEp.js} +1 -1
  55. package/dist/client/assets/{de-CH-WLRDEVBV-D61DKw_9.js → de-DE-DTI4WUSC-BQO1SHIK.js} +1 -1
  56. package/dist/client/assets/{diagram-E7M64L7V-BoyJ8kpo.js → diagram-E7M64L7V-DkHzt94k.js} +1 -1
  57. package/dist/client/assets/{diagram-IFDJBPK2-DLWembLL.js → diagram-IFDJBPK2-D4g8afpU.js} +1 -1
  58. package/dist/client/assets/{diagram-P4PSJMXO-CPmPa0OC.js → diagram-P4PSJMXO-DVwwx6ED.js} +1 -1
  59. package/dist/client/assets/{dist-gCWIHDgw.js → dist-2HWwyMLA.js} +1 -1
  60. package/dist/client/assets/{dist-Dy9oGocr.js → dist-60g3bzYH.js} +1 -1
  61. package/dist/client/assets/{dist-Czv7DXcw.js → dist-B2pRSR5A.js} +1 -1
  62. package/dist/client/assets/{dist-BpEcA20b.js → dist-BQhICHxD.js} +1 -1
  63. package/dist/client/assets/dist-BS6yAJ9F.js +1 -0
  64. package/dist/client/assets/dist-BUnp4fHW.js +1 -0
  65. package/dist/client/assets/dist-BWEDjv8G.js +1 -0
  66. package/dist/client/assets/{dist-DnpxzfoU.js → dist-BZc5d15t.js} +1 -1
  67. package/dist/client/assets/{dist-D7S1mzwR.js → dist-BdtPRC1F.js} +1 -1
  68. package/dist/client/assets/{dist-CKdaLumK.js → dist-BiFbHWxc.js} +1 -1
  69. package/dist/client/assets/{dist-DFIisyRk.js → dist-BlhsMbAl.js} +1 -1
  70. package/dist/client/assets/{dist-DGbPPlZ8.js → dist-CLsz2DCg.js} +1 -1
  71. package/dist/client/assets/{dist-tyxqXzyB.js → dist-Ciw3BJA2.js} +1 -1
  72. package/dist/client/assets/{dist-BtROnx4-.js → dist-CvMToPSN.js} +1 -1
  73. package/dist/client/assets/{dist-D4ebIlQB.js → dist-D2m8lD1h.js} +1 -1
  74. package/dist/client/assets/{dist-BATDm5JF.js → dist-DAwSRqIJ.js} +1 -1
  75. package/dist/client/assets/{dist-StJm6K24.js → dist-DZD5y4h6.js} +1 -1
  76. package/dist/client/assets/{dist-Cje3pdZH.js → dist-DhzldYic.js} +1 -1
  77. package/dist/client/assets/{dist-BiNL3fhN.js → dist-DrNF924C.js} +1 -1
  78. package/dist/client/assets/{dist-CPzoLjNz.js → dist-DzArd_Bk.js} +1 -1
  79. package/dist/client/assets/{dist-Le-AVwIk.js → dist-EPRNBXHp.js} +1 -1
  80. package/dist/client/assets/{dist-BDDCA7hC.js → dist-Q6uG0wie.js} +1 -1
  81. package/dist/client/assets/{dist-CQzPpOiH.js → dist-U9MIFRLF.js} +1 -1
  82. package/dist/client/assets/{dist-CxPc5kI6.js → dist-WrbPKwPQ.js} +1 -1
  83. package/dist/client/assets/{dist-BEs40fGb.js → dist-_L_gn5XE.js} +1 -1
  84. package/dist/client/assets/{dist-DhkKj77m.js → dist-a6bFAbQd.js} +1 -1
  85. package/dist/client/assets/{dist-vL71uaef.js → dist-fkQ6urpt.js} +1 -1
  86. package/dist/client/assets/{dist-BPyPcaZr.js → dist-lbtQBzLu.js} +1 -1
  87. package/dist/client/assets/dist-naAaVPPS.js +1 -0
  88. package/dist/client/assets/{dockerfile-BmylqEVx.js → dockerfile-Ci0-ApQC.js} +1 -1
  89. package/dist/client/assets/drawio-editor-BW2z4NH2.js +9 -0
  90. package/dist/client/assets/drawio-room-D6352KkV.js +1 -0
  91. package/dist/client/assets/drawioEditor-DgoA4Zqi.js +2 -0
  92. package/dist/client/assets/{editor-session-DsM3VgQv.js → editor-session-xPvmulmt.js} +2 -2
  93. package/dist/client/assets/{el-GR-ZXDJ2OS4-CpEbk42T.js → el-GR-ZXDJ2OS4-DGa9DqWI.js} +1 -1
  94. package/dist/client/assets/{en-CTDJDZ6K-C36Iqh9O.js → en-CTDJDZ6K-DC-4I8h8.js} +1 -1
  95. package/dist/client/assets/{erDiagram-INFDFZHY-Dwg_AhU2.js → erDiagram-INFDFZHY-Dnub3poK.js} +1 -1
  96. package/dist/client/assets/{es-ES-DYQHAD43-Ba-6t0Wr.js → es-ES-DYQHAD43-Cox3GUnj.js} +1 -1
  97. package/dist/client/assets/{eu-ES-QDSYU5Y3-CYzUKQ2_.js → eu-ES-QDSYU5Y3-DrPM2uSX.js} +1 -1
  98. package/dist/client/assets/{excalidraw-editor-Cs5p0lBn.js → excalidraw-editor-BAYca95w.js} +9 -9
  99. package/dist/client/assets/{excalidraw-mermaid-stub-C1ZaaI05.js → excalidraw-mermaid-stub-LpuTrLnr.js} +1 -1
  100. package/dist/client/assets/excalidrawEditor-BY5rq_Bn.js +2 -0
  101. package/dist/client/assets/{fa-IR-26LZG4PM-CxLc7ohL.js → fa-IR-26LZG4PM-ViTdxAWX.js} +1 -1
  102. package/dist/client/assets/{factor-Cc9mS1OI.js → factor-DMvifS-k.js} +1 -1
  103. package/dist/client/assets/{fi-FI-6YS4KDE4-DtYLOEJY.js → fi-FI-6YS4KDE4-BTBRGd69.js} +1 -1
  104. package/dist/client/assets/{flowDiagram-PKNHOUZH-BIJd4wAz.js → flowDiagram-PKNHOUZH-DF4dDV_8.js} +1 -1
  105. package/dist/client/assets/{fr-FR-BRLLPTZC-9O_U5gdi.js → fr-FR-BRLLPTZC-z-POHcHJ.js} +1 -1
  106. package/dist/client/assets/{ganttDiagram-A5KZAMGK-BiMwicnp.js → ganttDiagram-A5KZAMGK-CwrN53Gu.js} +1 -1
  107. package/dist/client/assets/gitGraph-HDMCJU4V-DbS2XnWK.js +1 -0
  108. package/dist/client/assets/{gitGraphDiagram-K3NZZRJ6-lk_paRel.js → gitGraphDiagram-K3NZZRJ6-BV9w0K-N.js} +1 -1
  109. package/dist/client/assets/{gl-ES-OKUZTLYG-Bb7TO64O.js → gl-ES-OKUZTLYG-BQtfDFNk.js} +1 -1
  110. package/dist/client/assets/{graphlib-B2nPo9Z4.js → graphlib-B7v-yqry.js} +1 -1
  111. package/dist/client/assets/{he-IL-26MGYIU7-CQW1igm9.js → he-IL-26MGYIU7-Dyw-xS4W.js} +1 -1
  112. package/dist/client/assets/{hi-IN-Q4ZOGTP2-BM91ENLs.js → hi-IN-Q4ZOGTP2-BqENUkZA.js} +1 -1
  113. package/dist/client/assets/{hu-HU-P2OXPSN5-HiGbsUwM.js → hu-HU-P2OXPSN5-D1HGK0_M.js} +1 -1
  114. package/dist/client/assets/{id-ID-2EIKXYN6-DEG8vRZ2.js → id-ID-2EIKXYN6-BEjyfllL.js} +1 -1
  115. package/dist/client/assets/image-32MOCVDX-BBXPyAeU.js +1 -0
  116. package/dist/client/assets/index-C95nV7Tl.css +1 -0
  117. package/dist/client/assets/index-GE56R5t4.js +2 -0
  118. package/dist/client/assets/info-3K5VOQVL-Bre4VStM.js +1 -0
  119. package/dist/client/assets/infoDiagram-LFFYTUFH-CuUbZqrG.js +2 -0
  120. package/dist/client/assets/{isEmpty-DGNCKhlT.js → isEmpty-CLDc0Kt_.js} +1 -1
  121. package/dist/client/assets/{ishikawaDiagram-PHBUUO56-CE3HierS.js → ishikawaDiagram-PHBUUO56-CmO_FyHY.js} +1 -1
  122. package/dist/client/assets/{it-IT-4CFKVXI2-DSrGqCKD.js → it-IT-4CFKVXI2-C24G-VcQ.js} +1 -1
  123. package/dist/client/assets/{ja-JP-MAND2Z4V-OFpEymIv.js → ja-JP-MAND2Z4V-DLhvsdYk.js} +1 -1
  124. package/dist/client/assets/javascript-DdEc60Aj.js +1 -0
  125. package/dist/client/assets/{journeyDiagram-4ABVD52K-CzoczPjW.js → journeyDiagram-4ABVD52K-DF4HAYLk.js} +1 -1
  126. package/dist/client/assets/{jsx-runtime-DRYOYO9I.js → jsx-runtime-DJkgQklN.js} +1 -1
  127. package/dist/client/assets/{kaa-HQRTCXTJ-CpOJ_vn4.js → kaa-HQRTCXTJ-DC8l3BuJ.js} +1 -1
  128. package/dist/client/assets/{kab-KAB-JKIKKTGH-CNPzzJH6.js → kab-KAB-JKIKKTGH-DVFog4hd.js} +1 -1
  129. package/dist/client/assets/{kanban-definition-K7BYSVSG-Cr6iNYl4.js → kanban-definition-K7BYSVSG-nQoJJABn.js} +1 -1
  130. package/dist/client/assets/{kk-KZ-HXQ63ZFC-CgtjU5JI.js → kk-KZ-HXQ63ZFC-CULUfwMg.js} +1 -1
  131. package/dist/client/assets/{km-KH-PKL3LSGX-BAJh8UnF.js → km-KH-PKL3LSGX-CnLlEv7i.js} +1 -1
  132. package/dist/client/assets/{ko-KR-KXLREZX3-BshOksBX.js → ko-KR-KXLREZX3-DNKXAYCx.js} +1 -1
  133. package/dist/client/assets/{ku-TR-MJ4IER3X-Bi3YtiD-.js → ku-TR-MJ4IER3X-DLUiMa4h.js} +1 -1
  134. package/dist/client/assets/{line-D2NTyhqv.js → line-DvLjT0Gv.js} +1 -1
  135. package/dist/client/assets/{linear-DntNI0Uj.js → linear-CEb8O7zv.js} +1 -1
  136. package/dist/client/assets/{lt-LT-H6WFQ6FJ-DQ2W0g7h.js → lt-LT-H6WFQ6FJ-CoFiurzb.js} +1 -1
  137. package/dist/client/assets/{lv-LV-GOCK6SJW-DeqTo8T7.js → lv-LV-GOCK6SJW-DzeEvHxX.js} +1 -1
  138. package/dist/client/assets/main-AejRWvom.js +600 -0
  139. package/dist/client/assets/{mermaid-parser.core-Bh2Ta9ou.js → mermaid-parser.core-DllATXd7.js} +2 -2
  140. package/dist/client/assets/{mermaid-runtime-CLtta79D.js → mermaid-runtime-DbCLD8Ih.js} +3 -3
  141. package/dist/client/assets/{mindmap-definition-YRQLILUH-DufPyQO8.js → mindmap-definition-YRQLILUH-DaMULsE9.js} +1 -1
  142. package/dist/client/assets/{mr-IN-IXVLDMEQ-CnH5Wjc7.js → mr-IN-IXVLDMEQ-C5i5R9H5.js} +1 -1
  143. package/dist/client/assets/{my-MM-YG6MYTTD-BefEpouO.js → my-MM-YG6MYTTD-DvwceqO-.js} +1 -1
  144. package/dist/client/assets/{nb-NO-XGWJISD2-CNRrlrPY.js → nb-NO-XGWJISD2-BUhX8hX0.js} +1 -1
  145. package/dist/client/assets/{nl-NL-XVDVCPNC-CuLTw3kL.js → nl-NL-XVDVCPNC-BV6Y0-Q0.js} +1 -1
  146. package/dist/client/assets/{nn-NO-EMX5MJX5-NHFRnQkl.js → nn-NO-EMX5MJX5-CF_bB9Jq.js} +1 -1
  147. package/dist/client/assets/{nsis-YyYYKQIB.js → nsis-42hkxqLx.js} +1 -1
  148. package/dist/client/assets/{oc-FR-ROEINTVO-8kCbAtcr.js → oc-FR-ROEINTVO-CiNI8fg8.js} +1 -1
  149. package/dist/client/assets/{ordinal-BuNU9EgZ.js → ordinal-fW5lWpNM.js} +1 -1
  150. package/dist/client/assets/{pa-IN-ZYN6SUDY-Dh8USSIe.js → pa-IN-ZYN6SUDY-CsbIU150.js} +1 -1
  151. package/dist/client/assets/packet-RMMSAZCW-B7lnOkip.js +1 -0
  152. package/dist/client/assets/percentages-5DKR754L-Dp1vwDEq.js +1 -0
  153. package/dist/client/assets/{pica-BG8AR4mo.js → pica-BbcTjVoI.js} +1 -1
  154. package/dist/client/assets/{clone-CMmi3x0H.js → pie-UPGHQEXC-D0gHdMgb.js} +1 -1
  155. package/dist/client/assets/{pieDiagram-SKSYHLDU--YidSJxi.js → pieDiagram-SKSYHLDU-BPFp1WBd.js} +1 -1
  156. package/dist/client/assets/{pl-PL-6VTG7PHC-BMbgP62B.js → pl-PL-6VTG7PHC-D1Nnx7R3.js} +1 -1
  157. package/dist/client/assets/preview-render-compiler-BYiRMsPq.js +1 -0
  158. package/dist/client/assets/{preview-render-profile-BjrQVCWD.js → preview-render-profile-DQsam_Ol.js} +2 -2
  159. package/dist/client/assets/{preview-render-worker-DbMTa0Y6.js → preview-render-worker-CcASh3y3.js} +1 -1
  160. package/dist/client/assets/{pt-BR-5YFKRR5G-CyrwFw_N.js → pt-BR-5YFKRR5G-DEDTeWEP.js} +1 -1
  161. package/dist/client/assets/{pt-PT-GEIXXZ67-SpK5vaGR.js → pt-PT-GEIXXZ67-BpqPVZom.js} +1 -1
  162. package/dist/client/assets/{pug-CM36H1hd.js → pug-BANqyQJ9.js} +1 -1
  163. package/dist/client/assets/{quadrantDiagram-337W2JSQ-n7EIFT_f.js → quadrantDiagram-337W2JSQ-DjPGrcJM.js} +1 -1
  164. package/dist/client/assets/{quick-switcher-controller-CKrGBgcl.js → quick-switcher-controller-n6Jhu3Z9.js} +1 -1
  165. package/dist/client/assets/radar-KQ55EAFF-D48du2CB.js +1 -0
  166. package/dist/client/assets/{requirementDiagram-Z7DCOOCP-BrquJATD.js → requirementDiagram-Z7DCOOCP-BmiYAMKV.js} +1 -1
  167. package/dist/client/assets/{ro-RO-E2P6TFZI-90dn2iUp.js → ro-RO-E2P6TFZI-4vRM1jVT.js} +1 -1
  168. package/dist/client/assets/{room-zaSnuMv5.js → room-DyhEnogt.js} +1 -1
  169. package/dist/client/assets/{ru-RU-YBIIY43T-Cl52NZnQ.js → ru-RU-YBIIY43T-Cfbhz4Ew.js} +1 -1
  170. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-IpD6lgfO.js → sankeyDiagram-WA2Y5GQK-BEoPAlcC.js} +1 -1
  171. package/dist/client/assets/{sequenceDiagram-2WXFIKYE-DxZ6glIZ.js → sequenceDiagram-2WXFIKYE-BXqojuDS.js} +1 -1
  172. package/dist/client/assets/{si-LK-673C2CI2-DMSUxT-y.js → si-LK-673C2CI2-0muNkOEn.js} +1 -1
  173. package/dist/client/assets/{sk-SK-CKZHQ4AP-DUDai5Oe.js → sk-SK-CKZHQ4AP-EnLgxyJL.js} +1 -1
  174. package/dist/client/assets/{sl-SI-557H2GWM-BbLeATfl.js → sl-SI-557H2GWM-BN6npqVj.js} +1 -1
  175. package/dist/client/assets/{src-H0-aBY9y.js → src-DUDi_GeV.js} +1 -1
  176. package/dist/client/assets/{stateDiagram-RAJIS63D-A-rbDcdL.js → stateDiagram-RAJIS63D-DTR2sQs8.js} +1 -1
  177. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-BwVII-kJ.js +1 -0
  178. package/dist/client/assets/subset-shared.chunk-C6pUl_Oh.js +1 -0
  179. package/dist/client/assets/{subset-worker.chunk-B7pmUG1o.js → subset-worker.chunk-1FoL7eL0.js} +1 -1
  180. package/dist/client/assets/{sv-SE-XOPKKDWS-BBa-AcMf.js → sv-SE-XOPKKDWS-D3VSs2SQ.js} +1 -1
  181. package/dist/client/assets/{ta-IN-XBH7DQI3-9uR7ADzx.js → ta-IN-XBH7DQI3-BKR1mqfo.js} +1 -1
  182. package/dist/client/assets/{th-TH-TOCWH3R4-Box9U3ny.js → th-TH-TOCWH3R4-Bek1dQcW.js} +1 -1
  183. package/dist/client/assets/{timeline-definition-YZTLITO2-DuTppHot.js → timeline-definition-YZTLITO2-BP09qqIh.js} +1 -1
  184. package/dist/client/assets/{tr-TR-GXW6CYY5-BA8pS3C5.js → tr-TR-GXW6CYY5-xdLb7Dgi.js} +1 -1
  185. package/dist/client/assets/treemap-KZPCXAKY-BBRObSiT.js +1 -0
  186. package/dist/client/assets/{uk-UA-IJKTNUDG-B6hoHqzM.js → uk-UA-IJKTNUDG-Cd0AhTti.js} +1 -1
  187. package/dist/client/assets/{uz-UZ-TBZZEA4V-CPuftH33.js → uz-UZ-TBZZEA4V-DQH4e-QC.js} +1 -1
  188. package/dist/client/assets/{vault-api-client-D7C_m9eq.js → vault-api-client-fFJfUVXM.js} +2 -2
  189. package/dist/client/assets/vault-utils-BM4i-Ofm.js +1 -0
  190. package/dist/client/assets/{vennDiagram-LZ73GAT5-J0SBkXj8.js → vennDiagram-LZ73GAT5-BvSlhnT0.js} +1 -1
  191. package/dist/client/assets/{vi-VN-MULSGNVB-yRFd9OXl.js → vi-VN-MULSGNVB-BYDcPrAo.js} +1 -1
  192. package/dist/client/assets/{xychartDiagram-JWTSCODW-Dn9dSYxn.js → xychartDiagram-JWTSCODW-BvZ78F0j.js} +1 -1
  193. package/dist/client/assets/{yjs-provider-reset-guard-BcnBGrS9.js → yjs-provider-reset-guard-Cj00kgyM.js} +1 -1
  194. package/dist/client/assets/{zh-CN-MVX3E32U-VzUIXB4K.js → zh-CN-MVX3E32U-BqZQ-18-.js} +1 -1
  195. package/dist/client/assets/{zh-HK-JNU5RLIE-i0G2jHO_.js → zh-HK-JNU5RLIE-CbF8Agwa.js} +1 -1
  196. package/dist/client/assets/{zh-TW-LENVCA6T-BkHZg3jv.js → zh-TW-LENVCA6T-CepoVycx.js} +1 -1
  197. package/dist/client/drawio-editor.html +38 -0
  198. package/dist/client/excalidraw-editor.html +3 -3
  199. package/dist/client/index.html +16 -22
  200. package/package.json +1 -1
  201. package/src/client/app/drawio-editor-entry.js +4 -0
  202. package/src/client/app/drawio-editor.html +36 -0
  203. package/src/client/app/index.html +12 -18
  204. package/src/client/application/app-shell/ui-feature-identity.js +5 -2
  205. package/src/client/application/app-shell/ui-feature-shell.js +28 -2
  206. package/src/client/application/app-shell/workspace-feature.js +9 -0
  207. package/src/client/application/preview-render-compiler.js +18 -1
  208. package/src/client/application/preview-render-profile.js +5 -1
  209. package/src/client/application/workspace-chrome-controller.js +6 -0
  210. package/src/client/application/workspace-coordinator.js +12 -4
  211. package/src/client/application/workspace-preview-controller.js +65 -3
  212. package/src/client/application/workspace-route-controller.js +6 -3
  213. package/src/client/bootstrap/collabmd-app-shell.js +20 -0
  214. package/src/client/domain/runtime-paths.js +1 -0
  215. package/src/client/domain/vault-paths.js +24 -0
  216. package/src/client/drawio-editor.js +479 -0
  217. package/src/client/infrastructure/browser-navigation-port.js +2 -2
  218. package/src/client/infrastructure/drawio-lease-client.js +345 -0
  219. package/src/client/infrastructure/runtime-config.js +5 -1
  220. package/src/client/infrastructure/vault-api-client.js +9 -0
  221. package/src/client/presentation/comments-panel.js +2 -2
  222. package/src/client/presentation/create-menu-presenter.js +274 -0
  223. package/src/client/presentation/drawio-embed-controller.js +500 -0
  224. package/src/client/presentation/file-action-controller.js +126 -16
  225. package/src/client/presentation/file-explorer-controller.js +1 -0
  226. package/src/client/presentation/file-explorer-view.js +10 -2
  227. package/src/client/presentation/file-tree-state.js +1 -0
  228. package/src/client/presentation/theme-controller.js +21 -4
  229. package/src/client/styles/components/navigation.css +24 -0
  230. package/src/client/styles/features/diagram-preview.css +119 -1
  231. package/src/client/styles/layout/responsive.css +76 -7
  232. package/src/client/styles/layout/shell.css +41 -0
  233. package/src/client/styles/layout/sidebar.css +194 -3
  234. package/src/client/styles/layout/view-modes.css +1 -0
  235. package/src/domain/drawio-room.js +47 -0
  236. package/src/domain/file-kind.js +13 -2
  237. package/src/server/config/env.js +5 -0
  238. package/src/server/create-app-server.js +4 -2
  239. package/src/server/domain/collaboration/collaboration-document-store.js +11 -0
  240. package/src/server/domain/collaboration/collaboration-room.js +5 -0
  241. package/src/server/infrastructure/http/create-static-handler.js +2 -0
  242. package/src/server/infrastructure/http/create-vault-api-command-handler.js +5 -0
  243. package/src/server/infrastructure/http/create-vault-api-query-handler.js +5 -0
  244. package/src/server/infrastructure/persistence/path-utils.js +1 -1
  245. package/src/server/infrastructure/persistence/vault-content-adapter.js +6 -0
  246. package/src/server/infrastructure/persistence/vault-file-store.js +8 -0
  247. package/dist/client/assets/architecture-PBZL5I3N-0dui3p7-.js +0 -1
  248. package/dist/client/assets/channel-CVwYcdlk.js +0 -1
  249. package/dist/client/assets/chunk-GLR3WWYH-CqGMuOti.js +0 -2
  250. package/dist/client/assets/chunk-HHEYEP7N-Czb3OX2v.js +0 -1
  251. package/dist/client/assets/chunk-QZHKN3VN-DU7fMcaP.js +0 -1
  252. package/dist/client/assets/classDiagram-VBA2DB6C-CBSmkOe7.js +0 -1
  253. package/dist/client/assets/classDiagram-v2-RAHNMMFH-CJarRy94.js +0 -1
  254. package/dist/client/assets/dist-CNcGnl0T.js +0 -1
  255. package/dist/client/assets/dist-CnKD4Y92.js +0 -1
  256. package/dist/client/assets/dist-DL-EaOiC.js +0 -1
  257. package/dist/client/assets/dist-mDBaykBY.js +0 -1
  258. package/dist/client/assets/excalidrawEditor-wgJb2hmP.js +0 -2
  259. package/dist/client/assets/gitGraph-HDMCJU4V-iPo6Lz4k.js +0 -1
  260. package/dist/client/assets/image-32MOCVDX-viHDtJGM.js +0 -1
  261. package/dist/client/assets/index-B6m_KATZ.css +0 -1
  262. package/dist/client/assets/index-D20GlrKF.js +0 -2
  263. package/dist/client/assets/info-3K5VOQVL-DePZHLA4.js +0 -1
  264. package/dist/client/assets/infoDiagram-LFFYTUFH-CiAT_kJZ.js +0 -2
  265. package/dist/client/assets/javascript-DcX_cm1u.js +0 -1
  266. package/dist/client/assets/main-DONXLDrC.js +0 -599
  267. package/dist/client/assets/packet-RMMSAZCW-BVw0pEk-.js +0 -1
  268. package/dist/client/assets/percentages-5DKR754L-RQFE76Sg.js +0 -1
  269. package/dist/client/assets/pie-UPGHQEXC-ChUWa5qF.js +0 -1
  270. package/dist/client/assets/preview-render-compiler-CWBdv5tw.js +0 -1
  271. package/dist/client/assets/radar-KQ55EAFF-B4gMcoDX.js +0 -1
  272. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-CKhOHHLe.js +0 -1
  273. package/dist/client/assets/subset-shared.chunk-93a-Md8B.js +0 -1
  274. package/dist/client/assets/treemap-KZPCXAKY-on28XbV_.js +0 -1
  275. package/dist/client/assets/vault-utils-Js2T-e-h.js +0 -1
  276. /package/dist/client/assets/{apl-khHl8vBy.js → apl-CJPt5sW7.js} +0 -0
  277. /package/dist/client/assets/{array-BTHl6o_K.js → array-e43ctQmx.js} +0 -0
  278. /package/dist/client/assets/{asciiarmor-7xnRhA8w.js → asciiarmor-D0oCypDs.js} +0 -0
  279. /package/dist/client/assets/{asn1-_x-T1mFB.js → asn1-8xgVfRoq.js} +0 -0
  280. /package/dist/client/assets/{asterisk-Ct2NwVUw.js → asterisk-B5kv5AQp.js} +0 -0
  281. /package/dist/client/assets/{brainfuck-CAmdgqDN.js → brainfuck-Dh7M1Ucz.js} +0 -0
  282. /package/dist/client/assets/{chunk-3PELD44J-BvOh9EJp.js → chunk-3PELD44J-D4qJ8fq7.js} +0 -0
  283. /package/dist/client/assets/{chunk-A66AFZZU-D0IDIehU.js → chunk-A66AFZZU-CJuwmF1m.js} +0 -0
  284. /package/dist/client/assets/{chunk-Cq_f4orQ.js → chunk-D-fkvfCP.js} +0 -0
  285. /package/dist/client/assets/{chunk-ETSVUAFD-BnK5BhxL.js → chunk-ETSVUAFD-C8C1JDu2.js} +0 -0
  286. /package/dist/client/assets/{clike-BJcwKCE7.js → clike-zYz_LEkw.js} +0 -0
  287. /package/dist/client/assets/{clojure-uSRILJfc.js → clojure-CdWlIeQh.js} +0 -0
  288. /package/dist/client/assets/{cmake-j5-7WxMz.js → cmake-wWuF5ifR.js} +0 -0
  289. /package/dist/client/assets/{cobol-cnURuZ43.js → cobol-D3WLbLVy.js} +0 -0
  290. /package/dist/client/assets/{coffeescript-iQD116iO.js → coffeescript-DRtt-5a2.js} +0 -0
  291. /package/dist/client/assets/{commonlisp-DGzExN9H.js → commonlisp-DJV75lsU.js} +0 -0
  292. /package/dist/client/assets/{crystal-CnjkM1-q.js → crystal-C7mEw92C.js} +0 -0
  293. /package/dist/client/assets/{css-C-Nv0c9S.js → css-_6KgQwpu.js} +0 -0
  294. /package/dist/client/assets/{cypher-hxitpny2.js → cypher-B3uWx7jm.js} +0 -0
  295. /package/dist/client/assets/{cytoscape.esm-0xzpJ66h.js → cytoscape.esm-BbbuX1pV.js} +0 -0
  296. /package/dist/client/assets/{d-BtdAWoTB.js → d-D3kOh3JF.js} +0 -0
  297. /package/dist/client/assets/{defaultLocale-PG3Gbk8q.js → defaultLocale-DTn6RiRA.js} +0 -0
  298. /package/dist/client/assets/{diff-f_ZkWiYS.js → diff-CoamybWh.js} +0 -0
  299. /package/dist/client/assets/{dist-CCxn5Mk-.js → dist-yRVuIDKu.js} +0 -0
  300. /package/dist/client/assets/{dtd-B6xdyNDx.js → dtd-BjGQwMWL.js} +0 -0
  301. /package/dist/client/assets/{dylan-BzUoKQTn.js → dylan-B9W3X2GI.js} +0 -0
  302. /package/dist/client/assets/{ebnf-BlTaNq16.js → ebnf-d5D0otVn.js} +0 -0
  303. /package/dist/client/assets/{ecl-CffPaRqR.js → ecl-C5Q_IBPt.js} +0 -0
  304. /package/dist/client/assets/{eiffel-B66P6crR.js → eiffel-BQA_6I3b.js} +0 -0
  305. /package/dist/client/assets/{elm-DIwllOLv.js → elm-unPS17vB.js} +0 -0
  306. /package/dist/client/assets/{erlang-DwYA67QU.js → erlang-R8nOsUTx.js} +0 -0
  307. /package/dist/client/assets/{excalidraw-mermaid-stub-BtCKxPxK.js → excalidraw-mermaid-stub-BJq3n7pR.js} +0 -0
  308. /package/dist/client/assets/{fcl-DD6dBrvI.js → fcl-CVAfW9wK.js} +0 -0
  309. /package/dist/client/assets/{forth-DFLLMv-i.js → forth-DHbsK8X8.js} +0 -0
  310. /package/dist/client/assets/{fortran-CNZVMQdQ.js → fortran-4jMwxW9-.js} +0 -0
  311. /package/dist/client/assets/{gas-DyiCLKEJ.js → gas-zC_XGrQT.js} +0 -0
  312. /package/dist/client/assets/{gherkin-CHgE7bAJ.js → gherkin-CPBQou3u.js} +0 -0
  313. /package/dist/client/assets/{groovy-BZc3It91.js → groovy-Cqopym0q.js} +0 -0
  314. /package/dist/client/assets/{haskell-DJ4hTi3A.js → haskell-imzbNPgF.js} +0 -0
  315. /package/dist/client/assets/{haxe-sJjg_lHN.js → haxe-Doh225Ku.js} +0 -0
  316. /package/dist/client/assets/{http-DwAi3Ho1.js → http-j4R5uEso.js} +0 -0
  317. /package/dist/client/assets/{idl-CCIDRFwr.js → idl-l9d1__Hj.js} +0 -0
  318. /package/dist/client/assets/{image-blob-reduce.esm-D4wBfumB.js → image-blob-reduce.esm-CQfEe3_g.js} +0 -0
  319. /package/dist/client/assets/{init-Bb7Vx0CW.js → init-207s1ipc.js} +0 -0
  320. /package/dist/client/assets/{isArrayLikeObject-DxEG9mY7.js → isArrayLikeObject-ZCMZRndo.js} +0 -0
  321. /package/dist/client/assets/{javascript-BlUxwA0O.js → javascript-9dQYqEHJ.js} +0 -0
  322. /package/dist/client/assets/{julia-BU0qBb1w.js → julia-ByGjwiLn.js} +0 -0
  323. /package/dist/client/assets/{katex-DoaSnJ5T.js → katex-XOVNa2d9.js} +0 -0
  324. /package/dist/client/assets/{livescript-uk34VDGK.js → livescript-B8l2m7xO.js} +0 -0
  325. /package/dist/client/assets/{lua-ClQGOv84.js → lua-DrfAKnQQ.js} +0 -0
  326. /package/dist/client/assets/{math-DQo53qzt.js → math-BlD6rf4Z.js} +0 -0
  327. /package/dist/client/assets/{mathematica-BDmKpvRN.js → mathematica-DYk_2Ik_.js} +0 -0
  328. /package/dist/client/assets/{mbox-T5kA6jAQ.js → mbox-BOzVHzVt.js} +0 -0
  329. /package/dist/client/assets/{mirc-DRRKKkcJ.js → mirc-DStbUCmv.js} +0 -0
  330. /package/dist/client/assets/{mllike-iZXopbca.js → mllike-BmhQglqS.js} +0 -0
  331. /package/dist/client/assets/{modelica-DP8T2DKM.js → modelica-ZElxtbqD.js} +0 -0
  332. /package/dist/client/assets/{mscgen-DXIRw2qg.js → mscgen-f-YxHPr0.js} +0 -0
  333. /package/dist/client/assets/{mumps-BKUS05-y.js → mumps-B79RJJhR.js} +0 -0
  334. /package/dist/client/assets/{nginx-CzYOtr2G.js → nginx-c--axfuP.js} +0 -0
  335. /package/dist/client/assets/{ntriples-ZgZuaYbW.js → ntriples-CgD4YZZC.js} +0 -0
  336. /package/dist/client/assets/{octave-CnOndUN3.js → octave-BQk-bCrp.js} +0 -0
  337. /package/dist/client/assets/{oz-DjW322Rn.js → oz-DPCSPrx5.js} +0 -0
  338. /package/dist/client/assets/{pascal-BdeW5uRX.js → pascal-C1iGzZ53.js} +0 -0
  339. /package/dist/client/assets/{path-BxyPWlyM.js → path-CDSE7Nw0.js} +0 -0
  340. /package/dist/client/assets/{perl-_CDvIe1D.js → perl-DQ3L8ffg.js} +0 -0
  341. /package/dist/client/assets/{pig-inWo_B4W.js → pig-B4S8acys.js} +0 -0
  342. /package/dist/client/assets/{powershell-CO5KWJsy.js → powershell-BhSVdaeY.js} +0 -0
  343. /package/dist/client/assets/{preload-helper-Chd9yIcd.js → preload-helper-I1wKxk_B.js} +0 -0
  344. /package/dist/client/assets/{properties-CjVp4a6M.js → properties-B2nfdtxE.js} +0 -0
  345. /package/dist/client/assets/{protobuf-DybFT2KT.js → protobuf-BFW_iwVN.js} +0 -0
  346. /package/dist/client/assets/{puppet-Dw_NDgko.js → puppet-C1-CkyhQ.js} +0 -0
  347. /package/dist/client/assets/{python-2pwcWoy7.js → python-CYXPDD4I.js} +0 -0
  348. /package/dist/client/assets/{q-C47l8kdS.js → q-Bub5Xmxm.js} +0 -0
  349. /package/dist/client/assets/{r-BmcXGVZ5.js → r-C59ONZO2.js} +0 -0
  350. /package/dist/client/assets/{rough.esm-C7Rbwqik.js → rough.esm-xhKrnp4d.js} +0 -0
  351. /package/dist/client/assets/{roundRect-CDlbNkEg.js → roundRect-CTz-kxJH.js} +0 -0
  352. /package/dist/client/assets/{rpm-Cm0x5xT_.js → rpm-DiM-R-wd.js} +0 -0
  353. /package/dist/client/assets/{ruby-Dl-I4pxG.js → ruby-DTqG95KX.js} +0 -0
  354. /package/dist/client/assets/{runtime-config-loader--hxFvh23.js → runtime-config-loader-DwWsKc1-.js} +0 -0
  355. /package/dist/client/assets/{sas-Bxkg4GVX.js → sas-BjdhmGHX.js} +0 -0
  356. /package/dist/client/assets/{scheme-CO3zogua.js → scheme-CWNdoI17.js} +0 -0
  357. /package/dist/client/assets/{shell-gYrTvBTP.js → shell-iaorleRB.js} +0 -0
  358. /package/dist/client/assets/{sieve-COX4Kn1X.js → sieve-D8m9Etmd.js} +0 -0
  359. /package/dist/client/assets/{simple-mode-BY9UFVy7.js → simple-mode-kdHrpFjq.js} +0 -0
  360. /package/dist/client/assets/{smalltalk-Dma1z5eE.js → smalltalk-28WS1mUj.js} +0 -0
  361. /package/dist/client/assets/{solr-BvhcdkNH.js → solr-x8qQ6eAP.js} +0 -0
  362. /package/dist/client/assets/{sparql-gX7W9xeh.js → sparql-BvLmi7B6.js} +0 -0
  363. /package/dist/client/assets/{spreadsheet-BnlQRxWz.js → spreadsheet-BuqSwScP.js} +0 -0
  364. /package/dist/client/assets/{sql-CwA10oIk.js → sql-B8tBavZM.js} +0 -0
  365. /package/dist/client/assets/{stex-DhLUylSV.js → stex-Bx4bLPxI.js} +0 -0
  366. /package/dist/client/assets/{stylus-9ZGSp3KB.js → stylus-CMEhEjuV.js} +0 -0
  367. /package/dist/client/assets/{swift-CurfpLXH.js → swift-wY9II8hY.js} +0 -0
  368. /package/dist/client/assets/{tcl-BPvzXR-t.js → tcl-BGywDEsi.js} +0 -0
  369. /package/dist/client/assets/{textile-BUq3vgBH.js → textile-K_mvsehZ.js} +0 -0
  370. /package/dist/client/assets/{tiddlywiki-DRR6E4hS.js → tiddlywiki-BrpeQ34q.js} +0 -0
  371. /package/dist/client/assets/{tiki-C1XMixgx.js → tiki-z2eQQPgI.js} +0 -0
  372. /package/dist/client/assets/{toml-BQjoWSzq.js → toml-Dcu7S7XA.js} +0 -0
  373. /package/dist/client/assets/{troff-DbgTp3Cj.js → troff-Djlumm7T.js} +0 -0
  374. /package/dist/client/assets/{ttcn-1OxchGWH.js → ttcn-XqU6tthJ.js} +0 -0
  375. /package/dist/client/assets/{ttcn-cfg-CC8OhyHu.js → ttcn-cfg-BzD0wr3i.js} +0 -0
  376. /package/dist/client/assets/{turtle-D1WjVU4-.js → turtle-DcjXkx6M.js} +0 -0
  377. /package/dist/client/assets/{vb-Bf-XXYNJ.js → vb-DV4y2QrD.js} +0 -0
  378. /package/dist/client/assets/{vbscript-HeSyWuOi.js → vbscript-BS8DsYJ_.js} +0 -0
  379. /package/dist/client/assets/{velocity-CUkiDsJQ.js → velocity-CS6Ly2yV.js} +0 -0
  380. /package/dist/client/assets/{verilog-BFxB5RAN.js → verilog-DbEC7ose.js} +0 -0
  381. /package/dist/client/assets/{vhdl-BJUXQE-6.js → vhdl-DBLrW9bF.js} +0 -0
  382. /package/dist/client/assets/{webidl-advQMGTP.js → webidl-CnE8KY-y.js} +0 -0
  383. /package/dist/client/assets/{xquery-CNzoFgd7.js → xquery--K5Za5EW.js} +0 -0
  384. /package/dist/client/assets/{yacas-BsmlDKac.js → yacas-ClQfYBmX.js} +0 -0
  385. /package/dist/client/assets/{z80-Bnez4vZ_.js → z80-Dr2oR3X2.js} +0 -0
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>draw.io — CollabMD</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ html, body { width: 100%; height: 100%; margin: 0; overflow: hidden; background: #0f172a; color: #e2e8f0; font: 13px/1.4 system-ui, -apple-system, sans-serif; }
10
+ body[data-theme="light"] { background: #f8fafc; color: #0f172a; }
11
+ #root { display: flex; flex-direction: column; width: 100%; height: 100%; }
12
+ .drawio-shell { display: flex; flex-direction: column; width: 100%; height: 100%; }
13
+ .drawio-banner { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 40px; padding: 8px 12px; border-bottom: 1px solid rgba(148, 163, 184, 0.2); background: rgba(15, 23, 42, 0.9); }
14
+ body[data-theme="light"] .drawio-banner { background: rgba(255, 255, 255, 0.9); }
15
+ .drawio-banner-status { display: flex; align-items: center; gap: 8px; min-width: 0; }
16
+ .drawio-banner-pill { display: inline-flex; align-items: center; justify-content: center; min-height: 24px; padding: 0 8px; border-radius: 999px; background: rgba(59, 130, 246, 0.18); color: #bfdbfe; font-weight: 600; white-space: nowrap; }
17
+ body[data-theme="light"] .drawio-banner-pill { background: rgba(59, 130, 246, 0.12); color: #1d4ed8; }
18
+ .drawio-banner-copy { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19
+ .drawio-banner-actions { display: flex; align-items: center; gap: 8px; }
20
+ .drawio-btn { min-height: 30px; padding: 0 10px; border: 1px solid rgba(148, 163, 184, 0.28); border-radius: 999px; background: transparent; color: inherit; font: inherit; cursor: pointer; }
21
+ .drawio-btn[hidden] { display: none !important; }
22
+ .drawio-btn:disabled { opacity: 0.6; cursor: default; }
23
+ .drawio-frame-shell { position: relative; flex: 1; min-height: 0; }
24
+ .drawio-frame { width: 100%; height: 100%; border: 0; background: transparent; }
25
+ .drawio-frame.is-read-only { pointer-events: none; }
26
+ .drawio-loading, .drawio-error { display: flex; align-items: center; justify-content: center; flex: 1; padding: 24px; text-align: center; }
27
+ .drawio-error { color: #fca5a5; }
28
+ </style>
29
+ </head>
30
+ <body>
31
+ <div id="root">
32
+ <div class="drawio-loading" id="loadingState">Loading draw.io…</div>
33
+ </div>
34
+ <script type="module" src="./drawio-editor-entry.js"></script>
35
+ </body>
36
+ </html>
@@ -39,21 +39,12 @@
39
39
  <line x1="6" y1="6" x2="18" y2="18"/>
40
40
  </svg>
41
41
  </button>
42
- <button class="ui-icon-button" id="newFileBtn" aria-label="New file" title="New file">
43
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
44
- </button>
45
- <button class="ui-icon-button" id="newDrawingBtn" aria-label="New drawing" title="New Excalidraw drawing">
46
- <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 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>
47
- </button>
48
- <button class="ui-icon-button" id="newMermaidBtn" aria-label="New Mermaid diagram" title="New Mermaid diagram">
49
- <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="M5 7.5c0-1.38 1.12-2.5 2.5-2.5 1.04 0 1.93.64 2.3 1.56A2.5 2.5 0 0 1 14 8.5v1"/><path d="M19 16.5c0 1.38-1.12 2.5-2.5 2.5-1.04 0-1.93-.64-2.3-1.56A2.5 2.5 0 0 1 10 15.5v-1"/><path d="M8 10.5h8"/><path d="M8 13.5h8"/><path d="M10 8.5v7"/><path d="M14 8.5v7"/></svg>
50
- </button>
51
- <button class="ui-icon-button" id="newPlantumlBtn" aria-label="New PlantUML diagram" title="New PlantUML diagram">
52
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><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"/></svg>
53
- </button>
54
- <button class="ui-icon-button" id="newFolderBtn" aria-label="New folder" title="New folder">
55
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="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"/><line x1="12" y1="11" x2="12" y2="17"/><line x1="9" y1="14" x2="15" y2="14"/></svg>
56
- </button>
42
+ <div class="sidebar-create-shell">
43
+ <button class="ui-button btn btn-secondary btn-compact sidebar-create-btn" id="sidebarCreateBtn" aria-label="Create" aria-expanded="false" aria-haspopup="menu" title="Create file or folder">
44
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
45
+ <span class="sidebar-create-btn-label">Create</span>
46
+ </button>
47
+ </div>
57
48
  <button class="ui-icon-button" id="refreshFilesBtn" aria-label="Refresh" title="Refresh file list">
58
49
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg>
59
50
  </button>
@@ -173,9 +164,12 @@
173
164
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>
174
165
  <span class="ui-toolbar-button-label">Share</span>
175
166
  </button>
176
- <button class="ui-button btn btn-ghost ui-toolbar-button" id="themeToggleBtn" data-theme-toggle aria-label="Toggle theme" title="Toggle theme">
177
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
167
+ <button class="ui-button btn btn-ghost ui-toolbar-button toolbar-theme-button" id="themeToggleBtn" data-theme-toggle aria-label="Toggle theme" title="Toggle theme">
168
+ <span class="toolbar-theme-icon" data-theme-toggle-icon aria-hidden="true">
169
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
170
+ </span>
178
171
  <span class="ui-toolbar-button-label">Theme</span>
172
+ <span class="ui-pill-badge ui-pill-badge--muted toolbar-theme-state" data-theme-toggle-state>Dark</span>
179
173
  </button>
180
174
  </div>
181
175
  </div>
@@ -197,7 +191,7 @@
197
191
  <div class="empty-state-actions">
198
192
  <button class="ui-button btn btn-secondary empty-state-btn" id="emptyStateNewFileBtn">
199
193
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
200
- New File
194
+ Create
201
195
  </button>
202
196
  <button class="ui-button btn btn-secondary empty-state-btn" id="emptyStateSearchBtn">
203
197
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
@@ -8,7 +8,8 @@ import { USER_NAME_MAX_LENGTH, normalizeUserName } from '../../domain/room.js';
8
8
  * @property {{ getUserName(): string, setUserName(name: string): void }} preferences
9
9
  * @property {{ getLocalUser(): { name?: string } | null, setUserName(name: string): void }} lobby
10
10
  * @property {{ getLocalUser(): { name?: string } | null, setUserName(name: string): string } | null} session
11
- * @property {{ updateLocalUser(user: unknown): void }} excalidrawEmbed
11
+ * @property {{ updateLocalUser(user: unknown): void } | null | undefined} drawioEmbed
12
+ * @property {{ updateLocalUser(user: unknown): void } | null | undefined} excalidrawEmbed
12
13
  * @property {{ show(message: string): void }} toastController
13
14
  * @property {() => boolean} isIdentityManagedByAuth
14
15
  * @property {() => { name?: string } | null} getCurrentUser
@@ -108,7 +109,9 @@ function handleDisplayNameSubmit() {
108
109
 
109
110
  this.preferences.setUserName(normalizedName);
110
111
  this.lobby.setUserName(normalizedName);
111
- this.excalidrawEmbed.updateLocalUser(this.lobby.getLocalUser());
112
+ const localUser = this.lobby.getLocalUser();
113
+ this.drawioEmbed?.updateLocalUser(localUser);
114
+ this.excalidrawEmbed?.updateLocalUser(localUser);
112
115
  this.syncCurrentUserName();
113
116
  this.renderChat();
114
117
  dialog.close();
@@ -46,6 +46,7 @@ function initialize() {
46
46
  this.syncIdentityManagementUi();
47
47
  this.syncCurrentUserName();
48
48
  this.syncWrapToggle();
49
+ this.syncToolbarOverflowVisibility?.();
49
50
  this.syncChatNotificationButton();
50
51
  this.syncFileHistoryButton({ mode: 'empty' });
51
52
  this.renderChat();
@@ -58,7 +59,11 @@ function initialize() {
58
59
  this.tabActivityLock.tryActivate();
59
60
 
60
61
  window.addEventListener('hashchange', () => this.handleHashChange());
61
- window.addEventListener('resize', this.createResizeHandler());
62
+ const handleResize = this.createResizeHandler();
63
+ window.addEventListener('resize', () => {
64
+ handleResize();
65
+ this.syncToolbarOverflowVisibility?.();
66
+ });
62
67
 
63
68
  this.fileExplorerReadyPromise = this.fileExplorer.refresh().then(() => {
64
69
  this.fileExplorerReady = true;
@@ -97,7 +102,9 @@ function promptForVersionReload(payload = null) {
97
102
  /** @this {UiShellContext} */
98
103
  function bindEvents() {
99
104
  this.elements.emptyStateNewFileBtn?.addEventListener('click', () => {
100
- this.fileExplorer.actionController.handleNewFile();
105
+ this.fileExplorer.actionController.openRootCreateMenu({
106
+ anchor: this.elements.emptyStateNewFileBtn,
107
+ });
101
108
  });
102
109
 
103
110
  this.elements.emptyStateSearchBtn?.addEventListener('click', () => {
@@ -290,6 +297,23 @@ function setToolbarOverflowOpen(nextState) {
290
297
  this.elements.toolbarOverflowToggle?.closest('.toolbar-right')?.classList.toggle('is-overflow-open', this.toolbarOverflowOpen);
291
298
  }
292
299
 
300
+ /** @this {UiShellContext} */
301
+ function syncToolbarOverflowVisibility() {
302
+ const toggle = this.elements.toolbarOverflowToggle;
303
+ if (!toggle) {
304
+ return;
305
+ }
306
+
307
+ const isMobile = this.isMobileViewport?.();
308
+ if (!isMobile) {
309
+ this.setToolbarOverflowOpen(false);
310
+ }
311
+
312
+ toggle.classList.toggle('hidden', !isMobile);
313
+ toggle.hidden = !isMobile;
314
+ toggle.setAttribute('aria-hidden', String(!isMobile));
315
+ }
316
+
293
317
  /** @this {UiShellContext} */
294
318
  function closeToolbarOverflowMenu() {
295
319
  this.setToolbarOverflowOpen(false);
@@ -308,6 +332,7 @@ function handleThemeChange(theme) {
308
332
  }
309
333
  this.session?.applyTheme(theme);
310
334
  this.excalidrawEmbed.updateTheme(theme);
335
+ this.drawioEmbed.updateTheme(theme);
311
336
  }
312
337
 
313
338
  /** @this {UiShellContext} */
@@ -413,6 +438,7 @@ export const uiFeatureShellMethods = {
413
438
  scheduleBacklinkRefresh,
414
439
  showEditorLoadError,
415
440
  showEditorLoading,
441
+ syncToolbarOverflowVisibility,
416
442
  syncWrapToggle,
417
443
  toggleToolbarOverflowMenu,
418
444
  toggleLineWrapping,
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  getVaultFileKind,
3
+ isDrawioFilePath,
3
4
  isExcalidrawFilePath,
4
5
  isImageAttachmentFilePath,
5
6
  isMermaidFilePath,
@@ -12,6 +13,10 @@ export const workspaceFeature = {
12
13
  return isExcalidrawFilePath(filePath);
13
14
  },
14
15
 
16
+ isDrawioFile(filePath) {
17
+ return isDrawioFilePath(filePath);
18
+ },
19
+
15
20
  isImageFile(filePath) {
16
21
  return isImageAttachmentFilePath(filePath);
17
22
  },
@@ -91,6 +96,10 @@ export const workspaceFeature = {
91
96
  this.workspacePreviewController.renderExcalidrawFilePreview(filePath);
92
97
  },
93
98
 
99
+ renderDrawioFilePreview(filePath) {
100
+ this.workspacePreviewController.renderDrawioFilePreview(filePath);
101
+ },
102
+
94
103
  renderImageFilePreview(filePath) {
95
104
  this.workspacePreviewController.renderImageFilePreview(filePath);
96
105
  },
@@ -79,6 +79,10 @@ function createExcalidrawPlaceholder({ embedKey, label, target }) {
79
79
  return `<span class="excalidraw-embed-placeholder diagram-preview-shell" data-embed-key="${escapeHtml(embedKey)}" data-embed-target="${escapeHtml(target)}" data-embed-label="${escapeHtml(label)}"><span class="excalidraw-embed-placeholder-card diagram-preview-placeholder-card"><span class="excalidraw-embed-placeholder-copy diagram-preview-placeholder-copy"><strong>${escapeHtml(label)}</strong><span>Loads when visible</span></span><button type="button" class="excalidraw-embed-placeholder-btn diagram-preview-placeholder-btn" data-embed-key="${escapeHtml(embedKey)}">Load diagram</button></span></span>`;
80
80
  }
81
81
 
82
+ function createDrawioPlaceholder({ embedKey, label, target }) {
83
+ return `<span class="drawio-embed-placeholder diagram-preview-shell" data-drawio-key="${escapeHtml(embedKey)}" data-drawio-target="${escapeHtml(target)}" data-drawio-label="${escapeHtml(label)}" data-drawio-mode="view"><span class="drawio-embed-placeholder-card diagram-preview-placeholder-card"><span class="drawio-embed-placeholder-copy diagram-preview-placeholder-copy"><strong>${escapeHtml(label)}</strong><span>Loads when visible</span></span><button type="button" class="drawio-embed-placeholder-btn diagram-preview-placeholder-btn" data-drawio-key="${escapeHtml(embedKey)}">Load diagram</button></span></span>`;
84
+ }
85
+
82
86
  function getDirectVideoMimeType(pathname = '') {
83
87
  const match = pathname.toLowerCase().match(/\.(mp4|ogg|webm)$/i);
84
88
  if (!match) {
@@ -220,12 +224,13 @@ function resolveLocalAttachmentUrl(source = '', {
220
224
  }
221
225
 
222
226
  function renderInlineWikiText(content, {
227
+ drawioEmbedCounts,
223
228
  excalidrawEmbedCounts,
224
229
  fileList,
225
230
  mermaidEmbedCounts,
226
231
  plantUmlEmbedCounts,
227
232
  }) {
228
- const regex = /!\[\[([^\]|]+\.(?:excalidraw|mmd|mermaid|puml|plantuml))(?:\|([^\]]+))?\]\]|\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/gi;
233
+ const regex = /!\[\[([^\]|]+\.(?:excalidraw|drawio|mmd|mermaid|puml|plantuml))(?:\|([^\]]+))?\]\]|\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/gi;
229
234
  let lastIndex = 0;
230
235
  let html = '';
231
236
  let match;
@@ -247,6 +252,14 @@ function renderInlineWikiText(content, {
247
252
  label: normalizePreviewTypography(label.replace(/\.excalidraw$/i, '')),
248
253
  target,
249
254
  });
255
+ } else if (/\.drawio$/i.test(target)) {
256
+ const occurrenceIndex = drawioEmbedCounts.get(target) ?? 0;
257
+ drawioEmbedCounts.set(target, occurrenceIndex + 1);
258
+ html += createDrawioPlaceholder({
259
+ embedKey: `${target}#${occurrenceIndex}`,
260
+ label: normalizePreviewTypography(label.replace(/\.drawio$/i, '')),
261
+ target,
262
+ });
250
263
  } else if (/\.(?:mmd|mermaid)$/i.test(target)) {
251
264
  const occurrenceIndex = mermaidEmbedCounts.get(target) ?? 0;
252
265
  mermaidEmbedCounts.set(target, occurrenceIndex + 1);
@@ -325,6 +338,7 @@ function createMarkdownRenderer(fileList = [], {
325
338
  });
326
339
  });
327
340
 
341
+ const drawioEmbedCounts = new Map();
328
342
  const excalidrawEmbedCounts = new Map();
329
343
  const mermaidCounts = new Map();
330
344
  const mermaidEmbedCounts = new Map();
@@ -398,6 +412,7 @@ function createMarkdownRenderer(fileList = [], {
398
412
 
399
413
  if (content.startsWith('[x] ') || content.startsWith('[X] ')) {
400
414
  return `<input type="checkbox" checked disabled> ${renderInlineWikiText(content.slice(4), {
415
+ drawioEmbedCounts,
401
416
  excalidrawEmbedCounts,
402
417
  fileList,
403
418
  mermaidEmbedCounts,
@@ -407,6 +422,7 @@ function createMarkdownRenderer(fileList = [], {
407
422
 
408
423
  if (content.startsWith('[ ] ')) {
409
424
  return `<input type="checkbox" disabled> ${renderInlineWikiText(content.slice(4), {
425
+ drawioEmbedCounts,
410
426
  excalidrawEmbedCounts,
411
427
  fileList,
412
428
  mermaidEmbedCounts,
@@ -415,6 +431,7 @@ function createMarkdownRenderer(fileList = [], {
415
431
  }
416
432
 
417
433
  return renderInlineWikiText(content, {
434
+ drawioEmbedCounts,
418
435
  excalidrawEmbedCounts,
419
436
  fileList,
420
437
  mermaidEmbedCounts,
@@ -1,6 +1,7 @@
1
1
  export const LARGE_DOCUMENT_CHAR_THRESHOLD = 150000;
2
2
  export const LARGE_DOCUMENT_MERMAID_THRESHOLD = 20;
3
3
  export const LARGE_DOCUMENT_EXCALIDRAW_THRESHOLD = 8;
4
+ export const LARGE_DOCUMENT_DRAWIO_THRESHOLD = 8;
4
5
  export const LARGE_DOCUMENT_PLANTUML_THRESHOLD = 12;
5
6
 
6
7
  function countMatches(source, pattern) {
@@ -15,6 +16,7 @@ export function analyzeMarkdownComplexity(markdownText = '') {
15
16
 
16
17
  return {
17
18
  chars: source.length,
19
+ drawioEmbeds: countMatches(source, /!\[\[[^\]]+\.drawio(?:\|[^\]]+)?\]\]/gi),
18
20
  excalidrawEmbeds: countMatches(source, /!\[\[[^\]]+\.excalidraw(?:\|[^\]]+)?\]\]/gi),
19
21
  mermaidBlocks: countMatches(source, /(^|\n)```mermaid\b/gi) + mermaidEmbeds,
20
22
  plantumlBlocks: plantUmlFences + plantUmlEmbeds,
@@ -27,6 +29,7 @@ export function isLargeDocumentStats(stats) {
27
29
  && (
28
30
  stats.chars >= LARGE_DOCUMENT_CHAR_THRESHOLD
29
31
  || stats.mermaidBlocks >= LARGE_DOCUMENT_MERMAID_THRESHOLD
32
+ || stats.drawioEmbeds >= LARGE_DOCUMENT_DRAWIO_THRESHOLD
30
33
  || stats.excalidrawEmbeds >= LARGE_DOCUMENT_EXCALIDRAW_THRESHOLD
31
34
  || stats.plantumlBlocks >= LARGE_DOCUMENT_PLANTUML_THRESHOLD
32
35
  )
@@ -37,6 +40,7 @@ export function getRenderProfile(markdownText = '') {
37
40
  const source = String(markdownText);
38
41
  const hasMermaid = /(^|\n)```mermaid\b/i.test(source)
39
42
  || /!\[\[[^\]]+\.(?:mmd|mermaid)(?:\|[^\]]+)?\]\]/i.test(source);
43
+ const hasDrawioEmbed = /!\[\[[^\]]+\.drawio(?:\|[^\]]+)?\]\]/i.test(source);
40
44
  const hasExcalidrawEmbed = /!\[\[[^\]]+\.excalidraw(?:\|[^\]]+)?\]\]/i.test(source);
41
45
  const hasPlantUml = /(^|\n)```(?:plantuml|puml)\b/i.test(source)
42
46
  || /!\[\[[^\]]+\.(?:puml|plantuml)(?:\|[^\]]+)?\]\]/i.test(source);
@@ -49,7 +53,7 @@ export function getRenderProfile(markdownText = '') {
49
53
  };
50
54
  }
51
55
 
52
- if (hasMermaid || hasExcalidrawEmbed || hasPlantUml) {
56
+ if (hasMermaid || hasDrawioEmbed || hasExcalidrawEmbed || hasPlantUml) {
53
57
  return {
54
58
  debounceMs: 0,
55
59
  deferUntilIdle: false,
@@ -9,6 +9,7 @@ export class WorkspaceChromeController {
9
9
  getDisplayName,
10
10
  loadBacklinks,
11
11
  onBeforeFileOpen,
12
+ onRenderDrawioPreview,
12
13
  onFileOpenError,
13
14
  onFileOpenReady,
14
15
  onRenderExcalidrawPreview,
@@ -27,6 +28,7 @@ export class WorkspaceChromeController {
27
28
  this.getDisplayName = getDisplayName;
28
29
  this.loadBacklinks = loadBacklinks;
29
30
  this.onBeforeFileOpen = onBeforeFileOpen;
31
+ this.onRenderDrawioPreview = onRenderDrawioPreview;
30
32
  this.onFileOpenError = onFileOpenError;
31
33
  this.onFileOpenReady = onFileOpenReady;
32
34
  this.onRenderExcalidrawPreview = onRenderExcalidrawPreview;
@@ -71,6 +73,7 @@ export class WorkspaceChromeController {
71
73
  }
72
74
 
73
75
  finalizeFileOpen({
76
+ isDrawio = false,
74
77
  filePath,
75
78
  isExcalidraw = false,
76
79
  isImage = false,
@@ -80,6 +83,9 @@ export class WorkspaceChromeController {
80
83
  if (isExcalidraw) {
81
84
  this.onRenderExcalidrawPreview(filePath);
82
85
  }
86
+ if (isDrawio) {
87
+ this.onRenderDrawioPreview(filePath);
88
+ }
83
89
  if (isImage) {
84
90
  this.onRenderImagePreview(filePath);
85
91
  }
@@ -21,6 +21,7 @@ export class WorkspaceCoordinator {
21
21
  getLocalUser,
22
22
  getStoredUserName,
23
23
  getTheme,
24
+ isDrawioFile,
24
25
  isExcalidrawFile,
25
26
  isImageFile,
26
27
  isMermaidFile,
@@ -41,6 +42,7 @@ export class WorkspaceCoordinator {
41
42
  onSessionAssigned = null,
42
43
  onFileOpenMetric = null,
43
44
  onRenderExcalidrawPreview,
45
+ onRenderDrawioPreview,
44
46
  onRenderImagePreview,
45
47
  onSyncWrapToggle,
46
48
  onUpdateActiveFile,
@@ -50,6 +52,7 @@ export class WorkspaceCoordinator {
50
52
  onViewModeReset,
51
53
  renderPresence,
52
54
  scrollContainerForSession,
55
+ shouldUseDrawioPreview = null,
53
56
  showEditorLoading,
54
57
  stateStore,
55
58
  }) {
@@ -63,6 +66,7 @@ export class WorkspaceCoordinator {
63
66
  this.getLocalUser = getLocalUser;
64
67
  this.getStoredUserName = getStoredUserName;
65
68
  this.getTheme = getTheme;
69
+ this.isDrawioFile = isDrawioFile ?? (() => false);
66
70
  this.isExcalidrawFile = isExcalidrawFile ?? (() => false);
67
71
  this.isImageFile = isImageFile ?? (() => false);
68
72
  this.isMermaidFile = isMermaidFile ?? (() => false);
@@ -89,6 +93,7 @@ export class WorkspaceCoordinator {
89
93
  this.onUpdateLobbyCurrentFile = onUpdateLobbyCurrentFile;
90
94
  this.onUpdateVisibleChrome = onUpdateVisibleChrome;
91
95
  this.renderPresence = renderPresence;
96
+ this.shouldUseDrawioPreview = shouldUseDrawioPreview ?? (() => true);
92
97
  this.stateStore = stateStore;
93
98
  this.session = null;
94
99
  this.lifecycle = new FileOpenLifecycle({
@@ -102,6 +107,7 @@ export class WorkspaceCoordinator {
102
107
  getDisplayName,
103
108
  loadBacklinks,
104
109
  onBeforeFileOpen,
110
+ onRenderDrawioPreview,
105
111
  onFileOpenError,
106
112
  onFileOpenReady,
107
113
  onRenderExcalidrawPreview,
@@ -149,17 +155,18 @@ export class WorkspaceCoordinator {
149
155
  this.cleanupAfterSessionDestroy();
150
156
  }
151
157
 
152
- async openFile(filePath) {
158
+ async openFile(filePath, { drawioMode = null } = {}) {
153
159
  if (!this.isTabActive()) {
154
160
  return;
155
161
  }
156
162
 
163
+ const isDrawio = this.isDrawioFile(filePath) && drawioMode !== 'text' && this.shouldUseDrawioPreview(filePath);
157
164
  const isExcalidraw = this.isExcalidrawFile(filePath);
158
165
  const isImage = this.isImageFile(filePath);
159
166
  const isMermaid = this.isMermaidFile(filePath);
160
167
  const isPlantUml = this.isPlantUmlFile(filePath);
161
168
 
162
- if (filePath === this.stateStore.get('currentFilePath') && (this.session || isExcalidraw || isImage)) {
169
+ if (filePath === this.stateStore.get('currentFilePath') && (this.session || isDrawio || isExcalidraw || isImage)) {
163
170
  this.onUpdateActiveFile(filePath);
164
171
  this.onUpdateLobbyCurrentFile(filePath);
165
172
  return;
@@ -170,11 +177,11 @@ export class WorkspaceCoordinator {
170
177
 
171
178
  this.cleanupSession();
172
179
  const chromeState = this.chromeController.prepareForFileOpen(filePath, {
173
- resetConnectionState: !isExcalidraw && !isImage,
180
+ resetConnectionState: !isDrawio && !isExcalidraw && !isImage,
174
181
  });
175
182
  this.reportFileOpenMetric('open_started', loadToken, { filePath });
176
183
 
177
- if (isExcalidraw || isImage) {
184
+ if (isDrawio || isExcalidraw || isImage) {
178
185
  this.onSessionAssigned?.(null);
179
186
 
180
187
  if (loadToken !== this.stateStore.get('sessionLoadToken')) {
@@ -184,6 +191,7 @@ export class WorkspaceCoordinator {
184
191
  this.chromeController.markFileOpenReady(null);
185
192
  this.chromeController.finalizeFileOpen({
186
193
  filePath,
194
+ isDrawio,
187
195
  isExcalidraw,
188
196
  isImage,
189
197
  session: null,
@@ -7,10 +7,12 @@ import { resolveApiUrl } from '../domain/runtime-paths.js';
7
7
  export class WorkspacePreviewController {
8
8
  constructor({
9
9
  backlinksPanel,
10
+ drawioEmbed,
10
11
  elements,
11
12
  excalidrawEmbed,
12
13
  getDisplayName,
13
14
  getSession,
15
+ isDrawioFile,
14
16
  isExcalidrawFile,
15
17
  isImageFile,
16
18
  isMermaidFile,
@@ -23,10 +25,20 @@ export class WorkspacePreviewController {
23
25
  videoEmbed,
24
26
  }) {
25
27
  this.backlinksPanel = backlinksPanel;
28
+ this.drawioEmbed = drawioEmbed ?? {
29
+ detachForCommit() {},
30
+ hydrateVisibleEmbeds() {},
31
+ reconcileEmbeds() {},
32
+ setHydrationPaused() {},
33
+ syncLayout() {},
34
+ updateLocalUser() {},
35
+ updateTheme() {},
36
+ };
26
37
  this.elements = elements;
27
38
  this.excalidrawEmbed = excalidrawEmbed;
28
39
  this.getDisplayName = getDisplayName;
29
40
  this.getSession = getSession;
41
+ this.isDrawioFile = isDrawioFile ?? (() => false);
30
42
  this.isExcalidrawFile = isExcalidrawFile ?? (() => false);
31
43
  this.isImageFile = isImageFile ?? (() => false);
32
44
  this.isMermaidFile = isMermaidFile ?? (() => false);
@@ -60,6 +72,7 @@ export class WorkspacePreviewController {
60
72
  }
61
73
 
62
74
  resetPreviewMode() {
75
+ this.elements.previewContent?.classList.remove('is-drawio-file-preview');
63
76
  this.elements.previewContent?.classList.remove('is-excalidraw-file-preview');
64
77
  this.elements.previewContent?.classList.remove('is-image-file-preview');
65
78
  this.elements.previewContent?.classList.remove('is-mermaid-file-preview');
@@ -67,6 +80,7 @@ export class WorkspacePreviewController {
67
80
  }
68
81
 
69
82
  syncFileChrome(filePath) {
83
+ const isDrawio = this.isDrawioFile(filePath);
70
84
  const isExcalidraw = this.isExcalidrawFile(filePath);
71
85
  const isImage = this.isImageFile(filePath);
72
86
  const isMarkdown = isMarkdownFilePath(filePath);
@@ -79,7 +93,7 @@ export class WorkspacePreviewController {
79
93
  this.elements.previewContent?.classList.toggle('is-mermaid-file-preview', isMermaid);
80
94
  this.elements.previewContent?.classList.toggle('is-plantuml-file-preview', isPlantUml);
81
95
 
82
- if (isExcalidraw || isImage) {
96
+ if (isDrawio || isExcalidraw || isImage) {
83
97
  this.layoutController.setView('preview', { persist: false });
84
98
  this.outlineController.close();
85
99
  this.backlinksPanel.clear();
@@ -99,6 +113,7 @@ export class WorkspacePreviewController {
99
113
  }
100
114
 
101
115
  this.videoEmbed?.detachForCommit();
116
+ this.drawioEmbed.detachForCommit();
102
117
  this.excalidrawEmbed.detachForCommit();
103
118
  this.resetPreviewMode();
104
119
  previewElement.classList.add('is-excalidraw-file-preview');
@@ -124,11 +139,53 @@ export class WorkspacePreviewController {
124
139
  this.scrollSyncController.setLargeDocumentMode(false);
125
140
  this.scrollSyncController.invalidatePreviewBlocks();
126
141
  this.videoEmbed?.reconcileEmbeds(previewElement);
142
+ this.drawioEmbed.reconcileEmbeds(previewElement);
127
143
  this.excalidrawEmbed.reconcileEmbeds(previewElement, { isLargeDocument: false });
144
+ this.drawioEmbed.hydrateVisibleEmbeds();
128
145
  this.excalidrawEmbed.hydrateVisibleEmbeds();
129
146
  this.schedulePreviewLayoutSyncCallback({ delayMs: 0 });
130
147
  }
131
148
 
149
+ renderDrawioFilePreview(filePath) {
150
+ const previewElement = this.elements.previewContent;
151
+ if (!previewElement) {
152
+ return;
153
+ }
154
+
155
+ this.videoEmbed?.detachForCommit();
156
+ this.drawioEmbed.detachForCommit();
157
+ this.excalidrawEmbed.detachForCommit();
158
+ this.resetPreviewMode();
159
+ previewElement.classList.add('is-drawio-file-preview');
160
+ const renderHost = this.previewRenderer.ensureRenderHost();
161
+ this.previewRenderer.normalizePreviewChildren(renderHost);
162
+
163
+ const placeholder = document.createElement('div');
164
+ placeholder.className = 'drawio-embed-placeholder';
165
+ placeholder.dataset.drawioKey = `${filePath}#file-preview`;
166
+ placeholder.dataset.drawioLabel = this.getDisplayName(filePath);
167
+ placeholder.dataset.drawioMode = 'edit';
168
+ placeholder.dataset.drawioTarget = filePath;
169
+ const loadingShell = document.createElement('div');
170
+ loadingShell.className = 'preview-shell';
171
+ loadingShell.textContent = 'Loading draw.io preview…';
172
+ placeholder.appendChild(loadingShell);
173
+
174
+ if (renderHost) {
175
+ renderHost.replaceChildren(placeholder);
176
+ renderHost.style.minHeight = '';
177
+ }
178
+
179
+ previewElement.dataset.renderPhase = 'ready';
180
+ this.outlineController.refresh();
181
+ this.scrollSyncController.setLargeDocumentMode(false);
182
+ this.scrollSyncController.invalidatePreviewBlocks();
183
+ this.videoEmbed?.reconcileEmbeds(previewElement);
184
+ this.drawioEmbed.reconcileEmbeds(previewElement);
185
+ this.drawioEmbed.hydrateVisibleEmbeds();
186
+ this.schedulePreviewLayoutSyncCallback({ delayMs: 0 });
187
+ }
188
+
132
189
  renderImageFilePreview(filePath) {
133
190
  const previewElement = this.elements.previewContent;
134
191
  if (!previewElement) {
@@ -136,6 +193,7 @@ export class WorkspacePreviewController {
136
193
  }
137
194
 
138
195
  this.videoEmbed?.detachForCommit();
196
+ this.drawioEmbed.detachForCommit();
139
197
  this.excalidrawEmbed.detachForCommit();
140
198
  this.resetPreviewMode();
141
199
  previewElement.classList.add('is-image-file-preview');
@@ -171,6 +229,7 @@ export class WorkspacePreviewController {
171
229
  }
172
230
 
173
231
  this.videoEmbed?.detachForCommit();
232
+ this.drawioEmbed.detachForCommit();
174
233
  this.excalidrawEmbed.detachForCommit();
175
234
  this.resetPreviewMode();
176
235
  const renderHost = this.previewRenderer.ensureRenderHost();
@@ -239,8 +298,9 @@ export class WorkspacePreviewController {
239
298
  setPreviewLayoutSyncTimer(null);
240
299
 
241
300
  const hasSession = Boolean(this.getSession());
301
+ const isDrawioPreview = this.elements.previewContent?.classList?.contains?.('is-drawio-file-preview') ?? false;
242
302
  const isExcalidrawPreview = this.elements.previewContent?.classList?.contains?.('is-excalidraw-file-preview') ?? false;
243
- if ((!hasSession && !isExcalidrawPreview) || !this.elements.previewContent) {
303
+ if ((!hasSession && !isDrawioPreview && !isExcalidrawPreview) || !this.elements.previewContent) {
244
304
  return;
245
305
  }
246
306
 
@@ -256,8 +316,9 @@ export class WorkspacePreviewController {
256
316
  this.previewRenderer.scheduleActiveMermaidRefit();
257
317
  this.previewRenderer.scheduleActivePlantUmlRefit();
258
318
  this.videoEmbed?.syncLayout();
319
+ this.drawioEmbed.syncLayout();
259
320
  this.excalidrawEmbed.syncLayout();
260
- if (isExcalidrawPreview && !hasSession) {
321
+ if ((isDrawioPreview || isExcalidrawPreview) && !hasSession) {
261
322
  return;
262
323
  }
263
324
 
@@ -288,6 +349,7 @@ export class WorkspacePreviewController {
288
349
  const nextPaused = Boolean(isActive);
289
350
  setHydrationPaused(nextPaused);
290
351
  this.previewRenderer.setHydrationPaused(nextPaused);
352
+ this.drawioEmbed.setHydrationPaused(nextPaused);
291
353
  this.excalidrawEmbed.setHydrationPaused(nextPaused);
292
354
 
293
355
  if (nextPaused) {
@@ -4,6 +4,7 @@ export class WorkspaceRouteController {
4
4
  clearInitialFileBootstrap,
5
5
  clearStaticPreviewDocument = null,
6
6
  closeSidebarOnMobile,
7
+ drawioEmbed,
7
8
  elements,
8
9
  excalidrawEmbed,
9
10
  fileHistoryView = null,
@@ -38,6 +39,7 @@ export class WorkspaceRouteController {
38
39
  this.clearInitialFileBootstrap = clearInitialFileBootstrap;
39
40
  this.clearStaticPreviewDocument = clearStaticPreviewDocument;
40
41
  this.closeSidebarOnMobile = closeSidebarOnMobile;
42
+ this.drawioEmbed = drawioEmbed ?? { setHydrationPaused() {} };
41
43
  this.elements = elements;
42
44
  this.excalidrawEmbed = excalidrawEmbed;
43
45
  this.fileHistoryView = fileHistoryView;
@@ -113,7 +115,7 @@ export class WorkspaceRouteController {
113
115
  }
114
116
 
115
117
  this.setSidebarTab('files');
116
- await this.openFile(route.filePath);
118
+ await this.openFile(route.filePath, { drawioMode: route.drawioMode || null });
117
119
  }
118
120
 
119
121
  showEmptyState() {
@@ -243,14 +245,14 @@ export class WorkspaceRouteController {
243
245
  this.backlinksPanel.clear();
244
246
  }
245
247
 
246
- async openFile(filePath) {
248
+ async openFile(filePath, options = {}) {
247
249
  this.imageLightbox?.close?.();
248
250
  this.gitPanel.setSelection();
249
251
  this.gitDiffView.hide();
250
252
  this.fileHistoryView?.hide?.();
251
253
  this.clearStaticPreviewDocument?.();
252
254
  this.syncMainChrome({ mode: 'editor' });
253
- await this.workspaceCoordinator.openFile(filePath);
255
+ await this.workspaceCoordinator.openFile(filePath, options);
254
256
  this.setSession(this.workspaceCoordinator.getSession());
255
257
  }
256
258
 
@@ -270,6 +272,7 @@ export class WorkspaceRouteController {
270
272
  resetPreviewSurface() {
271
273
  this.imageLightbox?.close?.();
272
274
  this.previewRenderer.setHydrationPaused(false);
275
+ this.drawioEmbed.setHydrationPaused(false);
273
276
  this.excalidrawEmbed.setHydrationPaused(false);
274
277
  this.videoEmbed?.detachForCommit();
275
278
  this.scrollSyncController.setLargeDocumentMode(false);