collabmd 0.1.45 → 0.1.47

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 (356) hide show
  1. package/README.md +40 -19
  2. package/bin/collabmd.js +27 -1
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +1 -0
  4. package/dist/client/assets/{abnfDiagram-N423BO3Z-CUMTFJhI.js → abnfDiagram-VCTEODGH-BNDLzJ7L.js} +1 -1
  5. package/dist/client/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-T3A2C74G-w25m71oV.js → architectureDiagram-5GKGNRK7-I39sYjHI.js} +1 -1
  7. package/dist/client/assets/base-BYODPHdS.js +1 -0
  8. package/dist/client/assets/blockDiagram-NRAW4CY4-C6DtJy5Y.js +129 -0
  9. package/dist/client/assets/browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js +1 -0
  10. package/dist/client/assets/browser-utils--H_DkyEF.js +1 -0
  11. package/dist/client/assets/c4Diagram-UCG6FXSJ-CtWtxS9_.js +38 -0
  12. package/dist/client/assets/channel-CaoKA_We.js +1 -0
  13. package/dist/client/assets/{chunk-U6XO7XAA-BFxjP5U3.js → chunk-2ZTRR5NV-C2qZJila.js} +1 -1
  14. package/dist/client/assets/{chunk-YOTPTUD7-D0vRKqYp.js → chunk-3Z5EZCMW-DMniOlPd.js} +1 -1
  15. package/dist/client/assets/{chunk-BIQX33UG-DZEsGuSn.js → chunk-5V3GS4D5-i-ZDOEnP.js} +1 -1
  16. package/dist/client/assets/{chunk-MOZMSUNE-XVucA-n6.js → chunk-6AZGARVD-BB6FqMl-.js} +1 -1
  17. package/dist/client/assets/{chunk-5JV3BV7I-Cy5pj3QY.js → chunk-6EIED4P4-DdUJkP0f.js} +1 -1
  18. package/dist/client/assets/{chunk-R7FJI6CG-Cnn3gE-Y.js → chunk-6K3QC6MW-CqVsVn-y.js} +1 -1
  19. package/dist/client/assets/{chunk-OSBZ3O6U-CrKZOUOr.js → chunk-6TQVIW2G-DKlLbNIP.js} +1 -1
  20. package/dist/client/assets/{chunk-JG7HCLWE-BYfiSaVt.js → chunk-747NJXEK-BFkZPlab.js} +1 -1
  21. package/dist/client/assets/{chunk-NSK5VX7P-TLH37VXI.js → chunk-75Z2AOVW-CdFSaPjz.js} +1 -1
  22. package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +2 -0
  23. package/dist/client/assets/{chunk-3NCLNEKW-Y2Jf_LI-.js → chunk-CLGD4ZFX-DQLgbQrv.js} +1 -1
  24. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +2 -0
  25. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +127 -0
  26. package/dist/client/assets/{chunk-2GRJ4B5K-DhnlUv3F.js → chunk-F27PBJKO-CNHIFhjo.js} +1 -1
  27. package/dist/client/assets/{chunk-YGJVY4SA-CjSe7Bx7.js → chunk-FLYJHZSQ-Be7lKF17.js} +1 -1
  28. package/dist/client/assets/{chunk-KEIR6QF5-BICK3FdT.js → chunk-FOHPRMQF-DHwB1DNv.js} +2 -2
  29. package/dist/client/assets/{chunk-5RXB4S5H-BWrwFqMI.js → chunk-G27WJ6UU-D9-eg537.js} +2 -2
  30. package/dist/client/assets/chunk-GMAD6QVW-CbcBqPM5.js +72 -0
  31. package/dist/client/assets/{chunk-QBLGF6JB-CxAyS2mW.js → chunk-I5DQTOEV-Hm2LfiYI.js} +1 -1
  32. package/dist/client/assets/{chunk-5FCAYU7R-Dh5nylU8.js → chunk-ICYGCRZG-749o-pGJ.js} +1 -1
  33. package/dist/client/assets/{chunk-CQNSW5MT-B8S09OIh.js → chunk-IH6LHLGP-CC6I9F3i.js} +1 -1
  34. package/dist/client/assets/chunk-JQ64N6SF-DSFNH4bh.js +1 -0
  35. package/dist/client/assets/{chunk-CYSBUYHQ-C1Rf4art.js → chunk-KI3K4JFJ-Rma-0k_M.js} +1 -1
  36. package/dist/client/assets/{chunk-GF5L2VYU-DkJpO7ff.js → chunk-LCL6LL3I-DmDkVukh.js} +1 -1
  37. package/dist/client/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
  38. package/dist/client/assets/chunk-OBVCFTLP-BJR7u1jh.js +1 -0
  39. package/dist/client/assets/{chunk-5TONJI2A-DQOY3q1H.js → chunk-OUJLGHUK-D0j2JRSg.js} +1 -1
  40. package/dist/client/assets/chunk-P2QGCYS3-BRpqY32H.js +1 -0
  41. package/dist/client/assets/{chunk-KBJHAD2P-CB_3zWUf.js → chunk-POPQ4Y6H-Cb4SlVZF.js} +1 -1
  42. package/dist/client/assets/{chunk-4I5QYGJK-CCB2YcIH.js → chunk-PWAF6VOD-Cz8IwBB5.js} +1 -1
  43. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +10 -0
  44. package/dist/client/assets/chunk-RHFEMEQ7-CWY8cf4H.js +168 -0
  45. package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +41 -0
  46. package/dist/client/assets/{chunk-6Q2QTUOP-CPlWzBtc.js → chunk-SVP7TREG-CyHOmcac.js} +1 -1
  47. package/dist/client/assets/chunk-TEH6E4GO-DVayPj-q.js +62 -0
  48. package/dist/client/assets/{chunk-EMLP6XTP-RLD4nXpI.js → chunk-UY3FDG6J-CnmaAkG5.js} +1 -1
  49. package/dist/client/assets/{chunk-5HE753X5-Bw-yg4kO.js → chunk-XHIXRSVI-BFQ6B8BE.js} +1 -1
  50. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +1 -0
  51. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +1 -0
  52. package/dist/client/assets/comment-thread-store-CdcwrObc.js +1 -0
  53. package/dist/client/assets/comment-threads-9J6Em-_y.js +4 -0
  54. package/dist/client/assets/comment-ui-shared-DWkk9Vh3.js +7 -0
  55. package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  56. package/dist/client/assets/{cynefinDiagram-MW4NZA55-CJxXfJek.js → cynefinDiagram-5FMLGOSQ-CdTPi2yO.js} +1 -1
  57. package/dist/client/assets/dagre-3AP2YEHR-5gtJtd0O.js +4 -0
  58. package/dist/client/assets/dagre-PrKaheQc.js +1 -0
  59. package/dist/client/assets/{diagram-7IWD3JNH-B2d2Bm15.js → diagram-S7CK7UJ4-BudWz9WU.js} +4 -4
  60. package/dist/client/assets/{diagram-UB23O5K3-DJcKCwv9.js → diagram-UQ7AKVKN-3v4rbH-s.js} +1 -1
  61. package/dist/client/assets/{diagram-B4RE2ZJO-NP4UAwjR.js → diagram-VSXAHHWV-CQRVEZR7.js} +1 -1
  62. package/dist/client/assets/{diagram-Q27KOJAE-DylDuwor.js → diagram-VX7I27RA-C_-rj0sw.js} +1 -1
  63. package/dist/client/assets/{diagram-LBJQPF4R-D1FJQV8t.js → diagram-Z3DM3KII-B4yxavgj.js} +1 -1
  64. package/dist/client/assets/direct-engine-DdrQKpgq-CtKfQzCt.js +5 -0
  65. package/dist/client/assets/dist-73RPdcyU.js +1 -0
  66. package/dist/client/assets/dist-BJ1bJs33.js +1 -0
  67. package/dist/client/assets/{dist-CYZmbokb.js → dist-BK9QvQrc.js} +9 -9
  68. package/dist/client/assets/dist-BPHLJ09L.js +11 -0
  69. package/dist/client/assets/dist-B_yQaEv_.js +6 -0
  70. package/dist/client/assets/dist-BeajGMhO.js +1 -0
  71. package/dist/client/assets/{dist-JYEDRrPT.js → dist-Bw3VIE_v.js} +1 -1
  72. package/dist/client/assets/dist-ByrG2qBA.js +1 -0
  73. package/dist/client/assets/dist-C5NgpdG5.js +1 -0
  74. package/dist/client/assets/dist-CH-sQu3r.js +1 -0
  75. package/dist/client/assets/dist-CKS_-are.js +1 -0
  76. package/dist/client/assets/{dist-MvcV4190.js → dist-CdmKGRGr.js} +1 -1
  77. package/dist/client/assets/{dist-DGb27Dl6.js → dist-CietwTVS.js} +1 -1
  78. package/dist/client/assets/dist-D37Hyu3h.js +9 -0
  79. package/dist/client/assets/dist-D3fehAZ2.js +2 -0
  80. package/dist/client/assets/dist-D5wCC32z.js +1 -0
  81. package/dist/client/assets/{dist-DCzuX1AF.js → dist-DDUn5zTz.js} +1 -1
  82. package/dist/client/assets/dist-DGEbEfw4.js +1 -0
  83. package/dist/client/assets/dist-DVy5woUy.js +1 -0
  84. package/dist/client/assets/{dist-3bgCp7iY.js → dist-DZAAWTG-.js} +1 -1
  85. package/dist/client/assets/{dist-Drp8uu5J.js → dist-Dir5dDKZ.js} +1 -1
  86. package/dist/client/assets/dist-Dl_tpDSr.js +1 -0
  87. package/dist/client/assets/dist-DuH3ZrHo.js +1 -0
  88. package/dist/client/assets/dist-DutPuFmC.js +1 -0
  89. package/dist/client/assets/{dist-D2AQ-76g.js → dist-LQ4kDCKz.js} +1 -1
  90. package/dist/client/assets/{dist-C11hHqv_.js → dist-RKBTaQMb.js} +12 -12
  91. package/dist/client/assets/dist-Tw-Fxpeb.js +1 -0
  92. package/dist/client/assets/dist-eBx8q6Sy.js +1 -0
  93. package/dist/client/assets/{dist-DK5Gs2wa.js → dist-mj2Ht75J.js} +1 -1
  94. package/dist/client/assets/{dist-CnL7Y2sM.js → dist-netZOQtD.js} +1 -1
  95. package/dist/client/assets/{drawio-editor-ClE8jpoG.js → drawio-editor-BjrxTe3l.js} +1 -1
  96. package/dist/client/assets/drawioEditor-DUVZjSSr.js +2 -0
  97. package/dist/client/assets/{ebnfDiagram-BXEA7PRR-nw0wmA6y.js → ebnfDiagram-PWID7BFC-OXa8VEp1.js} +1 -1
  98. package/dist/client/assets/editor-session-DfZuRgB_.js +54 -0
  99. package/dist/client/assets/embedded-editor-base-DvMynhKu.css +1 -0
  100. package/dist/client/assets/embedpdf-BmE13ZZ0.js +1 -0
  101. package/dist/client/assets/embedpdf-DA4bA119-BPqZxwjc.js +2363 -0
  102. package/dist/client/assets/{en-7NFCYGKX-BrgYZAEe.js → en-SJ2YIMFF-CJBL3nkq.js} +1 -1
  103. package/dist/client/assets/erDiagram-SSCWMZ5O-C-iy6VkX.js +99 -0
  104. package/dist/client/assets/es-CAsWR6hG.js +22 -0
  105. package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  106. package/dist/client/assets/excalidraw-editor-BlcN6umJ.css +1 -0
  107. package/dist/client/assets/excalidraw-editor-D7pnUCLH.js +9 -0
  108. package/dist/client/assets/excalidraw-scene-BOben2gr.js +1 -0
  109. package/dist/client/assets/excalidrawEditor-B0jOK3lv.js +2 -0
  110. package/dist/client/assets/export-page-Bs3xE1fg.js +57 -0
  111. package/dist/client/assets/exportDocument-Dg9MjkIk.js +2 -0
  112. package/dist/client/assets/exportDocument-PnYU3v1s.css +1 -0
  113. package/dist/client/assets/file-icon-svg-CQAjlWjK.js +1 -0
  114. package/dist/client/assets/file-kind-BbqgGzpc.js +1 -0
  115. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +1 -0
  116. package/dist/client/assets/{ganttDiagram-PKOTCBZU-BnM97BCT.js → ganttDiagram-EL5Y4UJY-DtKHAbez.js} +1 -1
  117. package/dist/client/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
  118. package/dist/client/assets/{gitGraphDiagram-DS77QQ5N-BQpQhjuN.js → gitGraphDiagram-WWUBYQGX-oue8fQ5o.js} +1 -1
  119. package/dist/client/assets/github-dark.min-BV82VuKq.css +1 -0
  120. package/dist/client/assets/github.min-v3dd8CNH.css +1 -0
  121. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +1 -0
  122. package/dist/client/assets/index-BIpgxyGZ.css +1 -0
  123. package/dist/client/assets/index-Z5sI0Bj-.js +2 -0
  124. package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  125. package/dist/client/assets/{infoDiagram-6WML65LV-DYB8HCDQ.js → infoDiagram-RXCK75RN-BMzo6KIn.js} +1 -1
  126. package/dist/client/assets/{ishikawaDiagram-WSZJBQD7-Coz_P3t6.js → ishikawaDiagram-5VMMS53U-BIM3h287.js} +1 -1
  127. package/dist/client/assets/{journeyDiagram-NVQOT4AX-B6edChce.js → journeyDiagram-EYS64GPL-mF6Lh8O-.js} +1 -1
  128. package/dist/client/assets/{kanban-definition-27J2QSJJ-BFd9-cLc.js → kanban-definition-3QL26DDD-DLN2NyoR.js} +2 -2
  129. package/dist/client/assets/{line-B_S_S8kV.js → line-BfTWJmgf.js} +1 -1
  130. package/dist/client/assets/main-Dwnj9Gaq.js +903 -0
  131. package/dist/client/assets/{mermaid-parser.core-CUVdebAV.js → mermaid-parser.core-Bl0efOMt.js} +2 -2
  132. package/dist/client/assets/mermaid.core-CLZBlpIW.js +11 -0
  133. package/dist/client/assets/{mindmap-definition-FAOFIHXS-C9PQ38Al.js → mindmap-definition-FBJOCRG2-CRyHaHTk.js} +1 -1
  134. package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  135. package/dist/client/assets/pdfium-RAgkpwfK.wasm +0 -0
  136. package/dist/client/assets/{pegDiagram-VL7TDLO6-BMZUrSaU.js → pegDiagram-XKGWAZYB-B31fKPR2.js} +1 -1
  137. package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  138. package/dist/client/assets/{pieDiagram-7S7Q4E2Y-h8kbCL9o.js → pieDiagram-E7YTZNPT-B5OZPb88.js} +1 -1
  139. package/dist/client/assets/preview-render-compiler-BApvlLLo.js +35 -0
  140. package/dist/client/assets/preview-render-compiler-BQ_3h9vD.js +1 -0
  141. package/dist/client/assets/preview-render-profile-CE-5rVTC.js +1 -0
  142. package/dist/client/assets/preview-render-worker-BmN79bVc.js +60 -0
  143. package/dist/client/assets/prod-BiYPMR1i.js +177 -0
  144. package/dist/client/assets/prod-VxdGZ5Ly.js +1 -0
  145. package/dist/client/assets/{quadrantDiagram-CIZ2JOQS-CkElyfMi.js → quadrantDiagram-AXDQQJYC-Drrw14YH.js} +1 -1
  146. package/dist/client/assets/quick-switcher-controller-ButWPmCI.js +12 -0
  147. package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  148. package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  149. package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  150. package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  151. package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  152. package/dist/client/assets/{railroadDiagram-AXF67PYL-c75gnikD.js → railroadDiagram-O6MQD6OU-BPifP0MB.js} +1 -1
  153. package/dist/client/assets/{requirementDiagram-LRYGKXZP-mNxKLuHS.js → requirementDiagram-EFPCY7ZU-CRZG6mRB.js} +2 -2
  154. package/dist/client/assets/runtime-config-BLrEKVO1.js +1 -0
  155. package/dist/client/assets/{sankeyDiagram-W5VNT64P-0OhplksI.js → sankeyDiagram-P5KCCOFB-DvarEJpo.js} +1 -1
  156. package/dist/client/assets/{sequenceDiagram-SI44F4Z6-BJ_yAocC.js → sequenceDiagram-WJ2MYXX4-B4oWlb-w.js} +1 -1
  157. package/dist/client/assets/{stateDiagram-OKZ733FA-Cc83O86s.js → stateDiagram-HBIQ2CUA-qbHIIqRZ.js} +1 -1
  158. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +1 -0
  159. package/dist/client/assets/swimlanes-XN3QIQJK-xB6CtUGj.js +1 -0
  160. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +8 -0
  161. package/dist/client/assets/{timeline-definition-Z64GVDOM-BWDAGTHz.js → timeline-definition-24CTP7MA-Lj_yTNlY.js} +1 -1
  162. package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  163. package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  164. package/dist/client/assets/vault-api-client-_LpV1aIn.js +6 -0
  165. package/dist/client/assets/{vennDiagram-T6HMQDX7-LOSsnlMB.js → vennDiagram-4TSXK5OY-BekRp5Y0.js} +1 -1
  166. package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  167. package/dist/client/assets/{wardleyDiagram-T6FBY63Y-BxII3foY.js → wardleyDiagram-VM6X3IG4-kdnV_Hdm.js} +1 -1
  168. package/dist/client/assets/worker-engine-m0rlHn8R-S8mpn_O0.js +17369 -0
  169. package/dist/client/assets/{xychartDiagram-ELKLHX3M-B-pTEjju.js → xychartDiagram-S5SC5T6Z-DufGwNSB.js} +3 -3
  170. package/dist/client/drawio-editor.html +1 -1
  171. package/dist/client/excalidraw-editor.html +1 -1
  172. package/dist/client/export-document.html +3 -3
  173. package/dist/client/index.html +30 -8
  174. package/docker-compose.yml +42 -0
  175. package/package.json +32 -18
  176. package/scripts/local-structurizr-compose.mjs +101 -0
  177. package/src/client/app/index.html +27 -5
  178. package/src/client/application/app-shell/comments-feature.js +21 -13
  179. package/src/client/application/app-shell/git-feature.js +14 -2
  180. package/src/client/application/app-shell/presence-feature.js +4 -3
  181. package/src/client/application/app-shell/ui-feature-shell.js +109 -2
  182. package/src/client/application/app-shell/ui-feature-toolbar.js +2 -52
  183. package/src/client/application/app-shell/workspace-feature.js +5 -1
  184. package/src/client/application/app-shell-elements.js +3 -0
  185. package/src/client/application/pdf-preview-controller.js +75 -0
  186. package/src/client/application/preview-render-compiler.js +3 -0
  187. package/src/client/application/quick-switcher-loader.js +1 -1
  188. package/src/client/application/structurizr-preview-controller.js +395 -0
  189. package/src/client/application/workspace-coordinator.js +25 -3
  190. package/src/client/application/workspace-preview-controller.js +88 -2
  191. package/src/client/assets/vendor/highlight/github-dark.min.css +2 -10
  192. package/src/client/assets/vendor/highlight/github.min.css +2 -10
  193. package/src/client/bootstrap/collabmd-app-shell.js +39 -6
  194. package/src/client/browser-utils.js +44 -0
  195. package/src/client/domain/runtime-paths.js +26 -5
  196. package/src/client/domain/structurizr-language.js +99 -0
  197. package/src/client/domain/vault-paths.js +48 -0
  198. package/src/client/excalidraw-editor.js +844 -51
  199. package/src/client/export/export-host.js +1 -1
  200. package/src/client/export/export-page.js +6 -2
  201. package/src/client/export/export-pipeline.js +60 -1
  202. package/src/client/infrastructure/browser-preferences-port.js +10 -0
  203. package/src/client/infrastructure/comment-thread-store.js +34 -13
  204. package/src/client/infrastructure/editor-session.js +10 -0
  205. package/src/client/infrastructure/editor-view-adapter.js +46 -2
  206. package/src/client/infrastructure/excalidraw-room-client.js +103 -14
  207. package/src/client/infrastructure/git-api-client.js +5 -0
  208. package/src/client/infrastructure/vault-api-client.js +26 -0
  209. package/src/client/presentation/comment-ui/comment-ui-render.js +4 -0
  210. package/src/client/presentation/comment-ui/comment-ui-shared.js +4 -0
  211. package/src/client/presentation/comment-ui-controller.js +2 -0
  212. package/src/client/presentation/drawio-embed-controller.js +9 -102
  213. package/src/client/presentation/drawio-viewer.js +118 -0
  214. package/src/client/presentation/excalidraw-embed-controller.js +81 -8
  215. package/src/client/presentation/file-action-controller.js +102 -0
  216. package/src/client/presentation/file-explorer-controller.js +0 -5
  217. package/src/client/presentation/file-explorer-view.js +51 -73
  218. package/src/client/presentation/file-icon-svg.js +40 -0
  219. package/src/client/presentation/file-tree-state.js +6 -3
  220. package/src/client/presentation/git-diff-view-controller.js +731 -3
  221. package/src/client/presentation/git-panel-controller.js +2 -2
  222. package/src/client/presentation/outline-controller.js +86 -0
  223. package/src/client/presentation/quick-switcher-controller.js +73 -22
  224. package/src/client/presentation/quick-switcher-text-search.js +1 -1
  225. package/src/client/styles/components/navigation.css +11 -1
  226. package/src/client/styles/features/diagram-preview.css +76 -0
  227. package/src/client/styles/features/diff-special.css +309 -0
  228. package/src/client/styles/features/preview-markdown.css +25 -0
  229. package/src/client/styles/features/quick-switcher.css +8 -0
  230. package/src/client/styles/foundation/themes.css +7 -0
  231. package/src/client/styles/layout/shell.css +40 -1
  232. package/src/client/styles/layout/sidebar.css +42 -4
  233. package/src/client/styles/layout/view-modes.css +1 -0
  234. package/src/client/styles/overrides/highlightjs.css +20 -4
  235. package/src/client/styles/style.css +1 -0
  236. package/src/client/styles/surfaces/excalidraw-editor.css +294 -0
  237. package/src/domain/comment-threads.js +63 -5
  238. package/src/domain/excalidraw-room-codec.js +6 -4
  239. package/src/domain/file-kind.js +35 -3
  240. package/src/server/config/env.js +79 -0
  241. package/src/server/create-app-server.js +12 -0
  242. package/src/server/domain/bases/base-definition.js +1 -1
  243. package/src/server/domain/bases/base-expression-runtime.js +1 -4
  244. package/src/server/domain/bases/base-index-snapshot-store.js +1 -4
  245. package/src/server/domain/bases/base-transform.js +1 -4
  246. package/src/server/domain/collaboration/collaboration-room.js +55 -21
  247. package/src/server/domain/comment-overview.js +15 -5
  248. package/src/server/domain/ripgrep-search-service.js +4 -0
  249. package/src/server/infrastructure/git/diff-service.js +5 -0
  250. package/src/server/infrastructure/git/git-service.js +44 -11
  251. package/src/server/infrastructure/git/history-service.js +54 -0
  252. package/src/server/infrastructure/git/image-mime.js +14 -0
  253. package/src/server/infrastructure/git/untracked-files.js +28 -1
  254. package/src/server/infrastructure/http/create-git-api-command-handler.js +3 -1
  255. package/src/server/infrastructure/http/create-git-api-query-handler.js +31 -1
  256. package/src/server/infrastructure/http/create-request-handler.js +16 -23
  257. package/src/server/infrastructure/http/create-static-handler.js +5 -2
  258. package/src/server/infrastructure/http/create-structurizr-api-handler.js +147 -0
  259. package/src/server/infrastructure/http/create-vault-api-command-handler.js +66 -4
  260. package/src/server/infrastructure/http/create-vault-api-query-handler.js +51 -3
  261. package/src/server/infrastructure/http/http-request-helpers.js +22 -0
  262. package/src/server/infrastructure/persistence/path-utils.js +1 -1
  263. package/src/server/infrastructure/persistence/vault-file-store.js +3 -0
  264. package/src/server/infrastructure/structurizr/structurizr-embed.css +43 -0
  265. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +400 -0
  266. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +4 -22
  267. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CbSISC1w.js +0 -1
  268. package/dist/client/assets/architecture-TIHT7OUA-CsHfPErM.js +0 -1
  269. package/dist/client/assets/base-CxPEiHuy.js +0 -1
  270. package/dist/client/assets/blockDiagram-VBNYF7ZC-CipJt9Jl.js +0 -132
  271. package/dist/client/assets/browser-utils-CKtI_rZl.js +0 -1
  272. package/dist/client/assets/c4Diagram-5PPSVZJV-B5ktVx6g.js +0 -10
  273. package/dist/client/assets/channel-4Jkmq93I.js +0 -1
  274. package/dist/client/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  275. package/dist/client/assets/chunk-7Z6QIM7H-BP9Pdsm9.js +0 -10
  276. package/dist/client/assets/chunk-ERSWUTIN-ME9RVNel.js +0 -41
  277. package/dist/client/assets/chunk-I66GZJ75-CVFiiffQ.js +0 -127
  278. package/dist/client/assets/chunk-J7OUQ5F2-4CEb7pvH.js +0 -2
  279. package/dist/client/assets/chunk-JQJVKLGR-cx8X_24v.js +0 -156
  280. package/dist/client/assets/chunk-QR6OTTB3-CDAA_5Ib.js +0 -62
  281. package/dist/client/assets/chunk-RYQCIY6F-D-a0zH8K.js +0 -1
  282. package/dist/client/assets/chunk-UBXNYLIW-Bhk-PbFK.js +0 -1
  283. package/dist/client/assets/chunk-W5SLKNZC-BdNSCxZ9.js +0 -1
  284. package/dist/client/assets/chunk-WRU74C26-h6_XkD3_.js +0 -70
  285. package/dist/client/assets/chunk-ZIRB5QZD-O39ZBUk3.js +0 -32
  286. package/dist/client/assets/classDiagram-JCYQIIEL-L7lsyW_w.js +0 -1
  287. package/dist/client/assets/classDiagram-v2-OCEON4UE-L7lsyW_w.js +0 -1
  288. package/dist/client/assets/comment-threads-DDegmaFO.js +0 -4
  289. package/dist/client/assets/cynefin-VYW2F7L2-Ds2Fw2Y0.js +0 -1
  290. package/dist/client/assets/dagre-Buvkdvvj.js +0 -1
  291. package/dist/client/assets/dagre-VZM6K2ZE-L1xArOGs.js +0 -4
  292. package/dist/client/assets/dist-BH87JoHx.js +0 -11
  293. package/dist/client/assets/dist-BIkPRZO7.js +0 -6
  294. package/dist/client/assets/dist-BqCsFpx4.js +0 -1
  295. package/dist/client/assets/dist-C2JHCt8U.js +0 -1
  296. package/dist/client/assets/dist-CZjTtmTu.js +0 -1
  297. package/dist/client/assets/dist-Cig4Ov_X.js +0 -1
  298. package/dist/client/assets/dist-CqQEC8gR.js +0 -1
  299. package/dist/client/assets/dist-D4Rzqod1.js +0 -1
  300. package/dist/client/assets/dist-D5sn-mwk.js +0 -9
  301. package/dist/client/assets/dist-D7G-n87v.js +0 -1
  302. package/dist/client/assets/dist-DRqOrNgN.js +0 -1
  303. package/dist/client/assets/dist-DetkMS_4.js +0 -1
  304. package/dist/client/assets/dist-DhLvC8DS.js +0 -2
  305. package/dist/client/assets/dist-Dp6FVkQ1.js +0 -1
  306. package/dist/client/assets/dist-DtbjNB28.js +0 -1
  307. package/dist/client/assets/dist-DyrYcvpo2.js +0 -1
  308. package/dist/client/assets/dist-GrygD2zE.js +0 -1
  309. package/dist/client/assets/dist-HmEpWUow.js +0 -1
  310. package/dist/client/assets/dist-RTa81Km7.js +0 -1
  311. package/dist/client/assets/drawioEditor-CXaTM9Ds.js +0 -2
  312. package/dist/client/assets/editor-session-GTwZS6Df.js +0 -16
  313. package/dist/client/assets/embedded-editor-base-CiNEc8vy.css +0 -1
  314. package/dist/client/assets/erDiagram-JOGREHBK-cYUpEKpf.js +0 -85
  315. package/dist/client/assets/eventmodeling-45OFAUF4-CLEiVx5s.js +0 -1
  316. package/dist/client/assets/excalidraw-editor-BZVM81BO.js +0 -9
  317. package/dist/client/assets/excalidraw-editor-CyGwOhLz.css +0 -1
  318. package/dist/client/assets/excalidraw-scene-C8n9CHsK.js +0 -176
  319. package/dist/client/assets/excalidrawEditor-DxJanCze.js +0 -2
  320. package/dist/client/assets/export-page-CUfws2T-.js +0 -39
  321. package/dist/client/assets/exportDocument-BCuxqXDY.js +0 -2
  322. package/dist/client/assets/exportDocument-DV-OX74E.css +0 -1
  323. package/dist/client/assets/file-kind-BKPOIRPE.js +0 -1
  324. package/dist/client/assets/flowDiagram-UKHOOZJN-D0ypP0Ez.js +0 -1
  325. package/dist/client/assets/gitGraph-TEB2WS4Q-CZFBqwW-.js +0 -1
  326. package/dist/client/assets/github-dark.min-Z5exjX_n.css +0 -1
  327. package/dist/client/assets/github.min-D2BCvnWf.css +0 -1
  328. package/dist/client/assets/image-QXRYHUNP-lfTHE3bb.js +0 -1
  329. package/dist/client/assets/index-C3YnUgMD.css +0 -1
  330. package/dist/client/assets/index-D2wXraJ1.js +0 -2
  331. package/dist/client/assets/info-DKCQHKI2--1InqQeT.js +0 -1
  332. package/dist/client/assets/main-DtiGz7uI.js +0 -795
  333. package/dist/client/assets/map-BaFkSB1l.js +0 -1
  334. package/dist/client/assets/mermaid.core-DN-lF51U.js +0 -11
  335. package/dist/client/assets/packet-7NZHBO7P-BGMXB0XL.js +0 -1
  336. package/dist/client/assets/pie-RZYD4A2V-DgYg3tCt.js +0 -1
  337. package/dist/client/assets/preview-render-compiler-BSaQO_p3.js +0 -35
  338. package/dist/client/assets/preview-render-compiler-csGM5ZFz.js +0 -1
  339. package/dist/client/assets/preview-render-profile-BZzGSg6K.js +0 -22
  340. package/dist/client/assets/preview-render-worker-B42LWvrD.js +0 -60
  341. package/dist/client/assets/quick-switcher-controller-shW_6vPY.js +0 -12
  342. package/dist/client/assets/radar-I7S5WNFK-Ag-zp_Rq.js +0 -1
  343. package/dist/client/assets/railroad-3IZDKUUU-aibJDIDV.js +0 -1
  344. package/dist/client/assets/railroad-abnf-AHOZXSZD-BBMEuvIl.js +0 -1
  345. package/dist/client/assets/railroad-ebnf-EBAXGLYW-Be1nseej.js +0 -1
  346. package/dist/client/assets/railroad-peg-LSFZ7HO6-DIvD-Eyb.js +0 -1
  347. package/dist/client/assets/room-CQLoqtMo.js +0 -1
  348. package/dist/client/assets/runtime-config-DSGmGE9V.js +0 -1
  349. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-B1-BufUk.js +0 -1
  350. package/dist/client/assets/swimlanes-SLNWSIFB-oVTWEJIj.js +0 -2
  351. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-C5OTVwEu.js +0 -8
  352. package/dist/client/assets/treeView-QDETBFTQ-uHZ-3Fz8.js +0 -1
  353. package/dist/client/assets/treemap-6X3UGDF4-BnUKyy3l.js +0 -1
  354. package/dist/client/assets/vault-api-client-C6bcGwy-.js +0 -5
  355. package/dist/client/assets/wardley-OPB4EBWU-Da7TLC2F.js +0 -1
  356. package/src/server/domain/collaboration/room-persistence-controller.js +0 -80
@@ -1,10 +1,2 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
- Theme: GitHub Dark
3
- Description: Dark theme as seen on github.com
4
- Author: github.com
5
- Maintainer: @Hirse
6
- Updated: 2021-05-15
7
-
8
- Outdated base version: https://github.com/primer/github-syntax-dark
9
- Current colors taken from GitHub's CSS
10
- */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
1
+ /* Highlight.js tokens mapped to CodeMirror's oneDarkHighlightStyle. */
2
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword{color:#c678dd}.hljs-attr,.hljs-attribute,.hljs-property,.hljs-variable{color:#e06c75}.hljs-title.function_,.hljs-title.function_.invoke__{color:#61afef}.hljs-name,.hljs-selector-tag,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-type{color:#e5c07b}.hljs-atom,.hljs-built_in,.hljs-bullet,.hljs-literal,.hljs-symbol,.hljs-variable.language_{color:#d19a66}.hljs-number{color:#e5c07b}.hljs-meta .hljs-string,.hljs-string{color:#98c379}.hljs-link,.hljs-operator,.hljs-regexp{color:#56b6c2}.hljs-code,.hljs-comment,.hljs-formula,.hljs-meta,.hljs-quote{color:#7d8799}.hljs-subst{color:#abb2bf}.hljs-section{color:#e06c75;font-weight:700}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-addition{color:#98c379}.hljs-deletion{color:#e06c75}
@@ -1,10 +1,2 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
- Theme: GitHub
3
- Description: Light theme as seen on github.com
4
- Author: github.com
5
- Maintainer: @Hirse
6
- Updated: 2021-05-15
7
-
8
- Outdated base version: https://github.com/primer/github-syntax-light
9
- Current colors taken from GitHub's CSS
10
- */.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}
1
+ /* Highlight.js tokens mapped to CodeMirror's defaultHighlightStyle. */
2
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#404740;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-selector-tag{color:#708}.hljs-atom,.hljs-bullet,.hljs-literal,.hljs-symbol,.hljs-variable.language_{color:#219}.hljs-number{color:#164}.hljs-meta .hljs-string,.hljs-regexp{color:#e40}.hljs-string{color:#a11}.hljs-title.function_,.hljs-title.function_.invoke__{color:#00f}.hljs-title.class_,.hljs-title.class_.inherited__{color:#167}.hljs-built_in,.hljs-name,.hljs-type{color:#085}.hljs-attr,.hljs-attribute,.hljs-property{color:#00c}.hljs-code,.hljs-comment,.hljs-formula,.hljs-quote{color:#940}.hljs-meta,.hljs-operator,.hljs-subst,.hljs-variable{color:#404740}.hljs-section{color:#00f;font-weight:700}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-addition{color:#164}.hljs-deletion{color:#a11}
@@ -1,8 +1,10 @@
1
+ import { PdfPreviewController } from '../application/pdf-preview-controller.js';
1
2
  import { PreviewRenderer } from '../application/preview-renderer.js';
2
3
  import { ensureQuickSwitcherInstance, toggleQuickSwitcherInstance } from '../application/quick-switcher-loader.js';
3
4
  import { WorkspaceRouteController } from '../application/workspace-route-controller.js';
4
5
  import { WikiLinkFileController } from '../application/wiki-link-file-controller.js';
5
6
  import { WorkspacePreviewController } from '../application/workspace-preview-controller.js';
7
+ import { StructurizrPreviewController } from '../application/structurizr-preview-controller.js';
6
8
  import { WorkspaceCoordinator } from '../application/workspace-coordinator.js';
7
9
  import { bindAppShellElements } from '../application/app-shell-elements.js';
8
10
  import { chatFeature } from '../application/app-shell/chat-feature.js';
@@ -97,7 +99,13 @@ export class CollabMdAppShell {
97
99
  this.sessionLoadToken = 0;
98
100
  this.navigation = {
99
101
  getHashRoute,
100
- navigateToFile,
102
+ navigateToFile: (filePath, options = {}) => {
103
+ const { preserveFollow = false, ...routeOptions } = options;
104
+ if (!preserveFollow && filePath !== this.currentFilePath) {
105
+ this.stopFollowingUser();
106
+ }
107
+ navigateToFile(filePath, routeOptions);
108
+ },
101
109
  navigateToGitCommit,
102
110
  navigateToGitDiff,
103
111
  navigateToGitFileHistory,
@@ -108,6 +116,7 @@ export class CollabMdAppShell {
108
116
  fileTreeShowExtensionsKey: 'collabmd-file-tree-show-extensions',
109
117
  lineWrappingKey: 'collabmd-editor-line-wrap',
110
118
  recentFilesKey: 'collabmd-recent-files',
119
+ vimModeKey: 'collabmd-editor-vim-mode',
111
120
  sidebarVisibleKey: 'collabmd-sidebar-visible',
112
121
  userNameKey: 'collabmd-user-name',
113
122
  });
@@ -146,13 +155,9 @@ export class CollabMdAppShell {
146
155
  });
147
156
  this.workspaceSync = new WorkspaceSyncClient({
148
157
  onTreeChange: (tree, metadata = {}) => {
149
- const wasReady = this.fileExplorerReady;
150
158
  this.fileExplorer.setTree(tree, metadata);
151
159
  this.handleCommentOverviewWorkspaceTreeChange?.();
152
160
  this.fileExplorerReady = true;
153
- if (!wasReady && this.isTabActive) {
154
- void this.workspaceRouteController.handleHashChange();
155
- }
156
161
  },
157
162
  onWorkspaceEvent: (event) => {
158
163
  void this.handleIncomingWorkspaceEvent(event);
@@ -248,6 +253,7 @@ export class CollabMdAppShell {
248
253
  this.drawioEmbed.reconcileEmbeds(this.elements.previewContent);
249
254
  this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent, { isLargeDocument: stats.isLargeDocument });
250
255
  this.scrollSyncController.setLargeDocumentMode(stats.isLargeDocument);
256
+ this.syncPreviewCodeCopyButtons();
251
257
  this.syncPreviewHeadingLinkButtons();
252
258
  this.applyPendingPreviewRouteAnchor({ behavior: 'auto', clearMissing: true });
253
259
  this.schedulePreviewLayoutSync({ delayMs: 0 });
@@ -288,6 +294,9 @@ export class CollabMdAppShell {
288
294
  previewElement: this.elements.previewContent,
289
295
  scrollEditorToLine: (lineNumber, viewportRatio) => this.session?.scrollToLine(lineNumber, viewportRatio),
290
296
  });
297
+ this.pdfPreview = new PdfPreviewController({
298
+ getTheme: () => this.themeController.getTheme(),
299
+ });
291
300
  this.backlinksPanel = new BacklinksPanel({
292
301
  headerPanelElement: this.elements.backlinksHeaderPanel,
293
302
  inlinePanelElement: this.elements.backlinksInlinePanel,
@@ -301,6 +310,7 @@ export class CollabMdAppShell {
301
310
  getLocalUser: () => this.lobby.getLocalUser(),
302
311
  getTheme: () => this.themeController.getTheme(),
303
312
  onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
313
+ onStopFollowing: () => this.stopFollowingUser(),
304
314
  onToggleQuickSwitcher: () => {
305
315
  void this.toggleQuickSwitcher();
306
316
  },
@@ -351,6 +361,10 @@ export class CollabMdAppShell {
351
361
  onToggleReaction: (threadId, messageId, emoji) => this.session?.toggleCommentReaction(threadId, messageId, emoji),
352
362
  onResolveThread: (threadId) => this.resolveCommentThread(threadId),
353
363
  });
364
+ this.structurizrPreview = new StructurizrPreviewController({
365
+ enabled: this.runtimeConfig.structurizrEnabled === true,
366
+ syncWorkspace: (payload) => this.vaultApiClient.syncStructurizrWorkspace(payload),
367
+ });
354
368
  this.workspacePreviewController = new WorkspacePreviewController({
355
369
  backlinksPanel: this.backlinksPanel,
356
370
  basesPreview: this.basesPreview,
@@ -363,10 +377,13 @@ export class CollabMdAppShell {
363
377
  isDrawioFile: (filePath) => this.isDrawioFile(filePath),
364
378
  isExcalidrawFile: (filePath) => this.isExcalidrawFile(filePath),
365
379
  isImageFile: (filePath) => this.isImageFile(filePath),
380
+ isPdfFile: (filePath) => this.isPdfFile(filePath),
366
381
  isMermaidFile: (filePath) => this.isMermaidFile(filePath),
367
382
  isPlantUmlFile: (filePath) => this.isPlantUmlFile(filePath),
368
383
  layoutController: this.layoutController,
384
+ structurizrPreview: this.structurizrPreview,
369
385
  outlineController: this.outlineController,
386
+ pdfPreview: this.pdfPreview,
370
387
  previewRenderer: this.previewRenderer,
371
388
  schedulePreviewLayoutSync: (options) => this.schedulePreviewLayoutSync(options),
372
389
  scrollSyncController: this.scrollSyncController,
@@ -381,6 +398,7 @@ export class CollabMdAppShell {
381
398
  wikiLinkAutoCreate: this.runtimeConfig.wikiLinkAutoCreate !== false,
382
399
  });
383
400
  this.gitDiffView = new GitDiffViewController({
401
+ getTheme: () => this.themeController.getTheme(),
384
402
  gitApiClient: this.gitApiClient,
385
403
  onBackToHistory: ({ historyFilePath } = {}) => {
386
404
  if (historyFilePath) {
@@ -394,6 +412,7 @@ export class CollabMdAppShell {
394
412
  onStageFile: (filePath, { scope }) => this.stageGitFile(filePath, { scope }),
395
413
  onUnstageFile: (filePath, { scope }) => this.unstageGitFile(filePath, { scope }),
396
414
  toastController: this.toastController,
415
+ vaultApiClient: this.vaultApiClient,
397
416
  });
398
417
  this.fileHistoryView = new FileHistoryViewController({
399
418
  diffRenderer: this.gitDiffView,
@@ -437,6 +456,7 @@ export class CollabMdAppShell {
437
456
  lineInfoElement: this.elements.lineInfo,
438
457
  lineWrappingEnabled: options.lineWrappingEnabled,
439
458
  localUser: options.localUser,
459
+ vimModeEnabled: options.vimModeEnabled,
440
460
  onImagePaste: options.onImagePaste,
441
461
  onAwarenessChange: options.onAwarenessChange,
442
462
  onCommentsChange: options.onCommentsChange,
@@ -448,6 +468,7 @@ export class CollabMdAppShell {
448
468
  getDisplayName: (filePath) => this.getDisplayName(filePath),
449
469
  getFileList: () => this.fileExplorer.flatDocumentFiles,
450
470
  getLineWrappingEnabled: () => this.getStoredLineWrapping(),
471
+ getVimModeEnabled: () => this.getStoredVimMode(),
451
472
  getLocalUser: () => this.lobby.getLocalUser(),
452
473
  getStoredUserName: () => this.getStoredUserName(),
453
474
  getTheme: () => this.themeController.getTheme(),
@@ -455,8 +476,10 @@ export class CollabMdAppShell {
455
476
  isDrawioFile: (filePath) => this.isDrawioFile(filePath),
456
477
  isExcalidrawFile: (filePath) => this.isExcalidrawFile(filePath),
457
478
  isImageFile: (filePath) => this.isImageFile(filePath),
479
+ isPdfFile: (filePath) => this.isPdfFile(filePath),
458
480
  isMermaidFile: (filePath) => this.isMermaidFile(filePath),
459
481
  isPlantUmlFile: (filePath) => this.isPlantUmlFile(filePath),
482
+ isStructurizrWorkspaceFile: (filePath) => this.isStructurizrWorkspaceFile(filePath),
460
483
  isTabActive: () => this.isTabActive,
461
484
  loadBootstrapContent: async (filePath) => {
462
485
  const response = await this.vaultApiClient.readFile(filePath);
@@ -477,7 +500,7 @@ export class CollabMdAppShell {
477
500
  this.clearInitialFileBootstrap();
478
501
  },
479
502
  onConnectionChange: (state) => this.handleConnectionChange(state),
480
- onContentChange: ({ isBase, isMermaid, isPlantUml }) => {
503
+ onContentChange: ({ isBase, isMermaid, isPlantUml, isStructurizrWorkspace }) => {
481
504
  this.handleCommentEditorContentChange();
482
505
  if (isBase) {
483
506
  this.scheduleBaseFilePreview(this.currentFilePath, {
@@ -486,6 +509,14 @@ export class CollabMdAppShell {
486
509
  return;
487
510
  }
488
511
 
512
+ if (isStructurizrWorkspace) {
513
+ this.structurizrPreview.queueSync({
514
+ filePath: this.currentFilePath,
515
+ source: this.session?.getText?.() ?? '',
516
+ });
517
+ return;
518
+ }
519
+
489
520
  this.previewRenderer.queueRender();
490
521
  if (!isMermaid && !isPlantUml) {
491
522
  this.scheduleBacklinkRefresh();
@@ -515,6 +546,8 @@ export class CollabMdAppShell {
515
546
  onRenderBasePreview: (filePath) => this.renderBaseFilePreview(filePath),
516
547
  onRenderExcalidrawPreview: (filePath) => this.workspacePreviewController.renderExcalidrawFilePreview(filePath),
517
548
  onRenderImagePreview: (filePath) => this.workspacePreviewController.renderImageFilePreview(filePath),
549
+ onRenderPdfPreview: (filePath) => this.workspacePreviewController.renderPdfFilePreview(filePath),
550
+ onRenderStructurizrPreview: (filePath, options) => this.workspacePreviewController.renderStructurizrFilePreview(filePath, options),
518
551
  onSyncWrapToggle: () => this.syncWrapToggle(),
519
552
  onUpdateActiveFile: (filePath) => this.fileExplorer.setActiveFile(filePath),
520
553
  onUpdateCurrentFile: (filePath) => {
@@ -2,6 +2,50 @@ function getWindowRef() {
2
2
  return typeof window === 'undefined' ? globalThis : window;
3
3
  }
4
4
 
5
+ export function pickFiles({ accept = '', multiple = false } = {}) {
6
+ return new Promise((resolve) => {
7
+ const input = document.createElement('input');
8
+ const windowRef = getWindowRef();
9
+ input.type = 'file';
10
+ input.accept = accept;
11
+ input.multiple = multiple;
12
+ input.style.position = 'fixed';
13
+ input.style.left = '-9999px';
14
+ document.body.appendChild(input);
15
+ let settled = false;
16
+ let focusTimer = null;
17
+
18
+ const cleanup = (files = []) => {
19
+ if (settled) {
20
+ return;
21
+ }
22
+
23
+ settled = true;
24
+ if (focusTimer) {
25
+ windowRef.clearTimeout(focusTimer);
26
+ }
27
+ windowRef.removeEventListener('focus', handleWindowFocus);
28
+ input.remove();
29
+ resolve(Array.from(files ?? []));
30
+ };
31
+
32
+ const handleWindowFocus = () => {
33
+ focusTimer = windowRef.setTimeout(() => {
34
+ if (settled || input.files?.length) {
35
+ return;
36
+ }
37
+
38
+ cleanup();
39
+ }, 250);
40
+ };
41
+
42
+ input.addEventListener('change', () => cleanup(input.files), { once: true });
43
+ input.addEventListener('cancel', () => cleanup(), { once: true });
44
+ windowRef.addEventListener('focus', handleWindowFocus, { once: true });
45
+ input.click();
46
+ });
47
+ }
48
+
5
49
  export function requestIdleRender(callback, timeout) {
6
50
  const windowRef = getWindowRef();
7
51
  if (typeof windowRef.requestIdleCallback === 'function') {
@@ -86,6 +86,7 @@ export function getClientRuntimeConfig() {
86
86
  unavailableReason: 'ripgrep search is unavailable',
87
87
  version: '',
88
88
  },
89
+ structurizrEnabled: false,
89
90
  wikiLinkAutoCreate: true,
90
91
  wsBasePath: '/ws',
91
92
  ...(window.__COLLABMD_CONFIG__ ?? {}),
@@ -143,12 +144,32 @@ export function resolveApiUrl(pathValue = '/', config = getClientRuntimeConfig()
143
144
  return resolveAppPath(`/api${normalizedPath.startsWith('/') ? normalizedPath : `/${normalizedPath}`}`, config);
144
145
  }
145
146
 
146
- export function resolveWsBaseUrl(config = getClientRuntimeConfig()) {
147
- const params = new URLSearchParams(window.location.search);
148
- const customServerUrl = params.get('server');
147
+ export function resolveWsServerOverride(config = getClientRuntimeConfig()) {
148
+ if (!['development', 'test'].includes(config.environment)) {
149
+ return '';
150
+ }
151
+
152
+ const customServerUrl = new URLSearchParams(window.location.search).get('server');
153
+ if (!customServerUrl) {
154
+ return '';
155
+ }
156
+
157
+ try {
158
+ const parsedUrl = new URL(customServerUrl, window.location.origin);
159
+ if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsedUrl.protocol)) {
160
+ return '';
161
+ }
149
162
 
150
- if (customServerUrl) {
151
- return trimTrailingSlash(customServerUrl);
163
+ return trimTrailingSlash(parsedUrl.toString());
164
+ } catch {
165
+ return '';
166
+ }
167
+ }
168
+
169
+ export function resolveWsBaseUrl(config = getClientRuntimeConfig()) {
170
+ const serverOverride = resolveWsServerOverride(config);
171
+ if (serverOverride) {
172
+ return serverOverride;
152
173
  }
153
174
 
154
175
  if (config.publicWsBaseUrl) {
@@ -0,0 +1,99 @@
1
+ import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';
2
+
3
+ const KEYWORDS = new Set([
4
+ 'animation',
5
+ 'autoLayout',
6
+ 'component',
7
+ 'configuration',
8
+ 'container',
9
+ 'custom',
10
+ 'decisions',
11
+ 'deployment',
12
+ 'description',
13
+ 'dynamic',
14
+ 'element',
15
+ 'filtered',
16
+ 'group',
17
+ 'include',
18
+ 'image',
19
+ 'model',
20
+ 'person',
21
+ 'perspectives',
22
+ 'properties',
23
+ 'relationship',
24
+ 'relationships',
25
+ 'styles',
26
+ 'systemContext',
27
+ 'systemLandscape',
28
+ 'system',
29
+ 'theme',
30
+ 'views',
31
+ 'workspace',
32
+ ]);
33
+
34
+ function readWord(stream) {
35
+ const match = stream.match(/[A-Za-z_][\w.-]*/u, false);
36
+ if (!match) {
37
+ return '';
38
+ }
39
+
40
+ stream.match(/[A-Za-z_][\w.-]*/u);
41
+ return match[0];
42
+ }
43
+
44
+ const structurizrStreamLanguage = StreamLanguage.define({
45
+ languageData: {
46
+ commentTokens: { line: '//' },
47
+ },
48
+ token(stream) {
49
+ if (stream.eatSpace()) {
50
+ return null;
51
+ }
52
+
53
+ if (stream.match('//')) {
54
+ stream.skipToEnd();
55
+ return 'comment';
56
+ }
57
+
58
+ if (stream.match(/!\w+/u)) {
59
+ return 'meta';
60
+ }
61
+
62
+ if (stream.match(/"(?:[^"\\]|\\.)*"?/u)) {
63
+ return 'string';
64
+ }
65
+
66
+ if (stream.match(/\b\d+(?:\.\d+)?\b/u)) {
67
+ return 'number';
68
+ }
69
+
70
+ if (stream.match(/[-=]?>|[{}[\]():,=]/u)) {
71
+ return 'operator';
72
+ }
73
+
74
+ const word = readWord(stream);
75
+ if (word) {
76
+ if (KEYWORDS.has(word)) {
77
+ return 'keyword';
78
+ }
79
+
80
+ if (/^[A-Z][A-Z0-9_]*$/u.test(word)) {
81
+ return 'typeName';
82
+ }
83
+
84
+ return 'variableName';
85
+ }
86
+
87
+ stream.next();
88
+ return null;
89
+ },
90
+ });
91
+
92
+ export const structurizrLanguage = new LanguageSupport(structurizrStreamLanguage);
93
+
94
+ export const structurizrLanguageDescription = LanguageDescription.of({
95
+ alias: ['structurizr', 'structurizr-dsl'],
96
+ extensions: ['dsl'],
97
+ name: 'Structurizr DSL',
98
+ support: structurizrLanguage,
99
+ });
@@ -3,6 +3,7 @@ import {
3
3
  isDrawioFilePath,
4
4
  isMermaidFilePath,
5
5
  isPlantUmlFilePath,
6
+ isStructurizrFilePath,
6
7
  stripVaultFileExtension,
7
8
  } from '../../domain/file-kind.js';
8
9
 
@@ -135,3 +136,50 @@ export function createPlantUmlStarter(filePath) {
135
136
  path: nextPath,
136
137
  };
137
138
  }
139
+
140
+ export function createStructurizrStarter(filePath) {
141
+ const normalizedPath = normalizeVaultPathInput(filePath);
142
+ const nextPath = isStructurizrFilePath(normalizedPath)
143
+ ? normalizedPath
144
+ : `${normalizedPath}.dsl`;
145
+ return {
146
+ content: [
147
+ 'workspace "CollabMD Example" "A small Structurizr workspace" {',
148
+ ' model {',
149
+ ' user = person "User" "Uses the system"',
150
+ ' system = softwareSystem "Example System" "The system being documented" {',
151
+ ' web = container "Web Application" "Serves the user interface" "JavaScript" {',
152
+ ' home = component "Home Page" "Shows the landing page" "React"',
153
+ ' editor = component "Editor" "Edits workspace content" "React"',
154
+ ' }',
155
+ ' api = container "API" "Handles requests" "Node.js"',
156
+ ' }',
157
+ ' user -> system "Uses"',
158
+ ' web -> api "Calls" "HTTPS/JSON"',
159
+ ' home -> editor "Links to"',
160
+ ' }',
161
+ ' views {',
162
+ ' systemContext system "Context" {',
163
+ ' include *',
164
+ ' autoLayout',
165
+ ' }',
166
+ ' container system "Containers" {',
167
+ ' include *',
168
+ ' autoLayout',
169
+ ' }',
170
+ ' component web "Components" {',
171
+ ' include *',
172
+ ' autoLayout',
173
+ ' }',
174
+ ' styles {',
175
+ ' element "Person" {',
176
+ ' shape person',
177
+ ' }',
178
+ ' }',
179
+ ' }',
180
+ '}',
181
+ '',
182
+ ].join('\n'),
183
+ path: nextPath,
184
+ };
185
+ }