collabmd 0.1.46 → 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 (267) hide show
  1. package/README.md +1 -0
  2. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-CYM5nxUi.js → CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js} +1 -1
  3. package/dist/client/assets/{abnfDiagram-N423BO3Z-CUMTFJhI.js → abnfDiagram-VCTEODGH-BNDLzJ7L.js} +1 -1
  4. package/dist/client/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
  5. package/dist/client/assets/{architectureDiagram-T3A2C74G-w25m71oV.js → architectureDiagram-5GKGNRK7-I39sYjHI.js} +1 -1
  6. package/dist/client/assets/base-BYODPHdS.js +1 -0
  7. package/dist/client/assets/blockDiagram-NRAW4CY4-C6DtJy5Y.js +129 -0
  8. package/dist/client/assets/browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js +1 -0
  9. package/dist/client/assets/c4Diagram-UCG6FXSJ-CtWtxS9_.js +38 -0
  10. package/dist/client/assets/channel-CaoKA_We.js +1 -0
  11. package/dist/client/assets/{chunk-U6XO7XAA-BFxjP5U3.js → chunk-2ZTRR5NV-C2qZJila.js} +1 -1
  12. package/dist/client/assets/{chunk-YOTPTUD7-D0vRKqYp.js → chunk-3Z5EZCMW-DMniOlPd.js} +1 -1
  13. package/dist/client/assets/{chunk-BIQX33UG-DZEsGuSn.js → chunk-5V3GS4D5-i-ZDOEnP.js} +1 -1
  14. package/dist/client/assets/{chunk-MOZMSUNE-XVucA-n6.js → chunk-6AZGARVD-BB6FqMl-.js} +1 -1
  15. package/dist/client/assets/{chunk-5JV3BV7I-Cy5pj3QY.js → chunk-6EIED4P4-DdUJkP0f.js} +1 -1
  16. package/dist/client/assets/{chunk-R7FJI6CG-Cnn3gE-Y.js → chunk-6K3QC6MW-CqVsVn-y.js} +1 -1
  17. package/dist/client/assets/{chunk-OSBZ3O6U-CrKZOUOr.js → chunk-6TQVIW2G-DKlLbNIP.js} +1 -1
  18. package/dist/client/assets/{chunk-JG7HCLWE-BYfiSaVt.js → chunk-747NJXEK-BFkZPlab.js} +1 -1
  19. package/dist/client/assets/{chunk-NSK5VX7P-TLH37VXI.js → chunk-75Z2AOVW-CdFSaPjz.js} +1 -1
  20. package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +2 -0
  21. package/dist/client/assets/{chunk-3NCLNEKW-Y2Jf_LI-.js → chunk-CLGD4ZFX-DQLgbQrv.js} +1 -1
  22. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +2 -0
  23. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +127 -0
  24. package/dist/client/assets/{chunk-2GRJ4B5K-DhnlUv3F.js → chunk-F27PBJKO-CNHIFhjo.js} +1 -1
  25. package/dist/client/assets/{chunk-YGJVY4SA-CjSe7Bx7.js → chunk-FLYJHZSQ-Be7lKF17.js} +1 -1
  26. package/dist/client/assets/{chunk-KEIR6QF5-BICK3FdT.js → chunk-FOHPRMQF-DHwB1DNv.js} +2 -2
  27. package/dist/client/assets/{chunk-5RXB4S5H-BWrwFqMI.js → chunk-G27WJ6UU-D9-eg537.js} +2 -2
  28. package/dist/client/assets/chunk-GMAD6QVW-CbcBqPM5.js +72 -0
  29. package/dist/client/assets/{chunk-QBLGF6JB-CxAyS2mW.js → chunk-I5DQTOEV-Hm2LfiYI.js} +1 -1
  30. package/dist/client/assets/{chunk-5FCAYU7R-Dh5nylU8.js → chunk-ICYGCRZG-749o-pGJ.js} +1 -1
  31. package/dist/client/assets/{chunk-CQNSW5MT-B8S09OIh.js → chunk-IH6LHLGP-CC6I9F3i.js} +1 -1
  32. package/dist/client/assets/chunk-JQ64N6SF-DSFNH4bh.js +1 -0
  33. package/dist/client/assets/{chunk-CYSBUYHQ-C1Rf4art.js → chunk-KI3K4JFJ-Rma-0k_M.js} +1 -1
  34. package/dist/client/assets/{chunk-GF5L2VYU-DkJpO7ff.js → chunk-LCL6LL3I-DmDkVukh.js} +1 -1
  35. package/dist/client/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
  36. package/dist/client/assets/chunk-OBVCFTLP-BJR7u1jh.js +1 -0
  37. package/dist/client/assets/{chunk-5TONJI2A-DQOY3q1H.js → chunk-OUJLGHUK-D0j2JRSg.js} +1 -1
  38. package/dist/client/assets/chunk-P2QGCYS3-BRpqY32H.js +1 -0
  39. package/dist/client/assets/{chunk-KBJHAD2P-CB_3zWUf.js → chunk-POPQ4Y6H-Cb4SlVZF.js} +1 -1
  40. package/dist/client/assets/{chunk-4I5QYGJK-CCB2YcIH.js → chunk-PWAF6VOD-Cz8IwBB5.js} +1 -1
  41. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +10 -0
  42. package/dist/client/assets/chunk-RHFEMEQ7-CWY8cf4H.js +168 -0
  43. package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +41 -0
  44. package/dist/client/assets/{chunk-6Q2QTUOP-CPlWzBtc.js → chunk-SVP7TREG-CyHOmcac.js} +1 -1
  45. package/dist/client/assets/chunk-TEH6E4GO-DVayPj-q.js +62 -0
  46. package/dist/client/assets/{chunk-EMLP6XTP-RLD4nXpI.js → chunk-UY3FDG6J-CnmaAkG5.js} +1 -1
  47. package/dist/client/assets/{chunk-5HE753X5-Bw-yg4kO.js → chunk-XHIXRSVI-BFQ6B8BE.js} +1 -1
  48. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +1 -0
  49. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +1 -0
  50. package/dist/client/assets/{comment-ui-shared-BC4pt4w8.js → comment-ui-shared-DWkk9Vh3.js} +1 -1
  51. package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  52. package/dist/client/assets/{cynefinDiagram-MW4NZA55-CJxXfJek.js → cynefinDiagram-5FMLGOSQ-CdTPi2yO.js} +1 -1
  53. package/dist/client/assets/dagre-3AP2YEHR-5gtJtd0O.js +4 -0
  54. package/dist/client/assets/dagre-PrKaheQc.js +1 -0
  55. package/dist/client/assets/{diagram-7IWD3JNH-B2d2Bm15.js → diagram-S7CK7UJ4-BudWz9WU.js} +4 -4
  56. package/dist/client/assets/{diagram-UB23O5K3-DJcKCwv9.js → diagram-UQ7AKVKN-3v4rbH-s.js} +1 -1
  57. package/dist/client/assets/{diagram-B4RE2ZJO-NP4UAwjR.js → diagram-VSXAHHWV-CQRVEZR7.js} +1 -1
  58. package/dist/client/assets/{diagram-Q27KOJAE-DylDuwor.js → diagram-VX7I27RA-C_-rj0sw.js} +1 -1
  59. package/dist/client/assets/{diagram-LBJQPF4R-D1FJQV8t.js → diagram-Z3DM3KII-B4yxavgj.js} +1 -1
  60. package/dist/client/assets/direct-engine-DdrQKpgq-CtKfQzCt.js +5 -0
  61. package/dist/client/assets/dist-73RPdcyU.js +1 -0
  62. package/dist/client/assets/{dist-Bm6pf9Bl.js → dist-BJ1bJs33.js} +1 -1
  63. package/dist/client/assets/{dist-BalScOwZ.js → dist-BK9QvQrc.js} +1 -1
  64. package/dist/client/assets/{dist-DLMiIsNC.js → dist-BPHLJ09L.js} +1 -1
  65. package/dist/client/assets/{dist-Bf8f4HmM.js → dist-B_yQaEv_.js} +1 -1
  66. package/dist/client/assets/{dist-CC5IrQMG.js → dist-BeajGMhO.js} +1 -1
  67. package/dist/client/assets/{dist-PDZ3bSqm.js → dist-Bw3VIE_v.js} +1 -1
  68. package/dist/client/assets/{dist-xElaxbia.js → dist-ByrG2qBA.js} +1 -1
  69. package/dist/client/assets/{dist-ule2n6ak.js → dist-C5NgpdG5.js} +1 -1
  70. package/dist/client/assets/dist-CH-sQu3r.js +1 -0
  71. package/dist/client/assets/dist-CKS_-are.js +1 -0
  72. package/dist/client/assets/{dist-D-Z6FLem.js → dist-CdmKGRGr.js} +1 -1
  73. package/dist/client/assets/{dist-dtAdgL39.js → dist-CietwTVS.js} +1 -1
  74. package/dist/client/assets/{dist-jv4WdPnK.js → dist-D37Hyu3h.js} +1 -1
  75. package/dist/client/assets/dist-D3fehAZ2.js +2 -0
  76. package/dist/client/assets/{dist-BEwK4csK.js → dist-D5wCC32z.js} +1 -1
  77. package/dist/client/assets/{dist-shrl6K_0.js → dist-DDUn5zTz.js} +1 -1
  78. package/dist/client/assets/{dist-CZgOmxK6.js → dist-DGEbEfw4.js} +1 -1
  79. package/dist/client/assets/{dist-B5HTH2BO.js → dist-DVy5woUy.js} +1 -1
  80. package/dist/client/assets/{dist-DZKu9Cs8.js → dist-DZAAWTG-.js} +1 -1
  81. package/dist/client/assets/{dist-TjMh8n1u.js → dist-Dir5dDKZ.js} +1 -1
  82. package/dist/client/assets/dist-Dl_tpDSr.js +1 -0
  83. package/dist/client/assets/{dist-FWJsgGYI.js → dist-DuH3ZrHo.js} +1 -1
  84. package/dist/client/assets/{dist-BjHJDtyU.js → dist-DutPuFmC.js} +1 -1
  85. package/dist/client/assets/{dist-Cqhv5LAk.js → dist-LQ4kDCKz.js} +1 -1
  86. package/dist/client/assets/{dist-CCP_AKPG.js → dist-RKBTaQMb.js} +1 -1
  87. package/dist/client/assets/{dist-BoVBdSjk.js → dist-Tw-Fxpeb.js} +1 -1
  88. package/dist/client/assets/dist-eBx8q6Sy.js +1 -0
  89. package/dist/client/assets/{dist-rGBmqxC7.js → dist-mj2Ht75J.js} +1 -1
  90. package/dist/client/assets/{dist-BDt3rz7l.js → dist-netZOQtD.js} +1 -1
  91. package/dist/client/assets/{drawioEditor-BjiKJqlc.js → drawioEditor-DUVZjSSr.js} +2 -2
  92. package/dist/client/assets/{ebnfDiagram-BXEA7PRR-nw0wmA6y.js → ebnfDiagram-PWID7BFC-OXa8VEp1.js} +1 -1
  93. package/dist/client/assets/editor-session-DfZuRgB_.js +54 -0
  94. package/dist/client/assets/embedded-editor-base-DvMynhKu.css +1 -0
  95. package/dist/client/assets/embedpdf-BmE13ZZ0.js +1 -0
  96. package/dist/client/assets/embedpdf-DA4bA119-BPqZxwjc.js +2363 -0
  97. package/dist/client/assets/{en-7NFCYGKX-BrgYZAEe.js → en-SJ2YIMFF-CJBL3nkq.js} +1 -1
  98. package/dist/client/assets/erDiagram-SSCWMZ5O-C-iy6VkX.js +99 -0
  99. package/dist/client/assets/es-CAsWR6hG.js +22 -0
  100. package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  101. package/dist/client/assets/excalidraw-editor-BlcN6umJ.css +1 -0
  102. package/dist/client/assets/{excalidraw-editor-B46zsTFI.js → excalidraw-editor-D7pnUCLH.js} +2 -2
  103. package/dist/client/assets/{excalidrawEditor-CT2pHq7e.js → excalidrawEditor-B0jOK3lv.js} +2 -2
  104. package/dist/client/assets/export-page-Bs3xE1fg.js +57 -0
  105. package/dist/client/assets/{exportDocument-BaqcOAAW.js → exportDocument-Dg9MjkIk.js} +2 -2
  106. package/dist/client/assets/exportDocument-PnYU3v1s.css +1 -0
  107. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +1 -0
  108. package/dist/client/assets/{ganttDiagram-PKOTCBZU-BnM97BCT.js → ganttDiagram-EL5Y4UJY-DtKHAbez.js} +1 -1
  109. package/dist/client/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
  110. package/dist/client/assets/{gitGraphDiagram-DS77QQ5N-BQpQhjuN.js → gitGraphDiagram-WWUBYQGX-oue8fQ5o.js} +1 -1
  111. package/dist/client/assets/github-dark.min-BV82VuKq.css +1 -0
  112. package/dist/client/assets/github.min-v3dd8CNH.css +1 -0
  113. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +1 -0
  114. package/dist/client/assets/index-BIpgxyGZ.css +1 -0
  115. package/dist/client/assets/{index-ClbjMBVt.js → index-Z5sI0Bj-.js} +2 -2
  116. package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  117. package/dist/client/assets/{infoDiagram-6WML65LV-DYB8HCDQ.js → infoDiagram-RXCK75RN-BMzo6KIn.js} +1 -1
  118. package/dist/client/assets/{ishikawaDiagram-WSZJBQD7-Coz_P3t6.js → ishikawaDiagram-5VMMS53U-BIM3h287.js} +1 -1
  119. package/dist/client/assets/{journeyDiagram-NVQOT4AX-B6edChce.js → journeyDiagram-EYS64GPL-mF6Lh8O-.js} +1 -1
  120. package/dist/client/assets/{kanban-definition-27J2QSJJ-BFd9-cLc.js → kanban-definition-3QL26DDD-DLN2NyoR.js} +2 -2
  121. package/dist/client/assets/{line-B_S_S8kV.js → line-BfTWJmgf.js} +1 -1
  122. package/dist/client/assets/main-Dwnj9Gaq.js +903 -0
  123. package/dist/client/assets/{mermaid-parser.core-CUVdebAV.js → mermaid-parser.core-Bl0efOMt.js} +2 -2
  124. package/dist/client/assets/mermaid.core-CLZBlpIW.js +11 -0
  125. package/dist/client/assets/{mindmap-definition-FAOFIHXS-C9PQ38Al.js → mindmap-definition-FBJOCRG2-CRyHaHTk.js} +1 -1
  126. package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  127. package/dist/client/assets/pdfium-RAgkpwfK.wasm +0 -0
  128. package/dist/client/assets/{pegDiagram-VL7TDLO6-BMZUrSaU.js → pegDiagram-XKGWAZYB-B31fKPR2.js} +1 -1
  129. package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  130. package/dist/client/assets/{pieDiagram-7S7Q4E2Y-h8kbCL9o.js → pieDiagram-E7YTZNPT-B5OZPb88.js} +1 -1
  131. package/dist/client/assets/preview-render-compiler-BApvlLLo.js +35 -0
  132. package/dist/client/assets/preview-render-compiler-BQ_3h9vD.js +1 -0
  133. package/dist/client/assets/preview-render-worker-BmN79bVc.js +60 -0
  134. package/dist/client/assets/prod-BiYPMR1i.js +177 -0
  135. package/dist/client/assets/prod-VxdGZ5Ly.js +1 -0
  136. package/dist/client/assets/{quadrantDiagram-CIZ2JOQS-CkElyfMi.js → quadrantDiagram-AXDQQJYC-Drrw14YH.js} +1 -1
  137. package/dist/client/assets/quick-switcher-controller-ButWPmCI.js +12 -0
  138. package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  139. package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  140. package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  141. package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  142. package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  143. package/dist/client/assets/{railroadDiagram-AXF67PYL-c75gnikD.js → railroadDiagram-O6MQD6OU-BPifP0MB.js} +1 -1
  144. package/dist/client/assets/{requirementDiagram-LRYGKXZP-mNxKLuHS.js → requirementDiagram-EFPCY7ZU-CRZG6mRB.js} +2 -2
  145. package/dist/client/assets/{sankeyDiagram-W5VNT64P-0OhplksI.js → sankeyDiagram-P5KCCOFB-DvarEJpo.js} +1 -1
  146. package/dist/client/assets/{sequenceDiagram-SI44F4Z6-BJ_yAocC.js → sequenceDiagram-WJ2MYXX4-B4oWlb-w.js} +1 -1
  147. package/dist/client/assets/{stateDiagram-OKZ733FA-Cc83O86s.js → stateDiagram-HBIQ2CUA-qbHIIqRZ.js} +1 -1
  148. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +1 -0
  149. package/dist/client/assets/swimlanes-XN3QIQJK-xB6CtUGj.js +1 -0
  150. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +8 -0
  151. package/dist/client/assets/{timeline-definition-Z64GVDOM-BWDAGTHz.js → timeline-definition-24CTP7MA-Lj_yTNlY.js} +1 -1
  152. package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  153. package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  154. package/dist/client/assets/{vennDiagram-T6HMQDX7-LOSsnlMB.js → vennDiagram-4TSXK5OY-BekRp5Y0.js} +1 -1
  155. package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  156. package/dist/client/assets/{wardleyDiagram-T6FBY63Y-BxII3foY.js → wardleyDiagram-VM6X3IG4-kdnV_Hdm.js} +1 -1
  157. package/dist/client/assets/worker-engine-m0rlHn8R-S8mpn_O0.js +17369 -0
  158. package/dist/client/assets/{xychartDiagram-ELKLHX3M-B-pTEjju.js → xychartDiagram-S5SC5T6Z-DufGwNSB.js} +3 -3
  159. package/dist/client/drawio-editor.html +1 -1
  160. package/dist/client/excalidraw-editor.html +1 -1
  161. package/dist/client/export-document.html +3 -3
  162. package/dist/client/index.html +17 -7
  163. package/package.json +19 -18
  164. package/src/client/app/index.html +14 -4
  165. package/src/client/application/app-shell/comments-feature.js +2 -3
  166. package/src/client/application/app-shell/git-feature.js +2 -2
  167. package/src/client/application/app-shell/presence-feature.js +2 -2
  168. package/src/client/application/app-shell/ui-feature-shell.js +64 -0
  169. package/src/client/application/app-shell-elements.js +1 -0
  170. package/src/client/application/pdf-preview-controller.js +53 -970
  171. package/src/client/application/preview-render-compiler.js +3 -0
  172. package/src/client/application/quick-switcher-loader.js +1 -1
  173. package/src/client/application/workspace-preview-controller.js +0 -3
  174. package/src/client/assets/vendor/highlight/github-dark.min.css +2 -10
  175. package/src/client/assets/vendor/highlight/github.min.css +2 -10
  176. package/src/client/bootstrap/collabmd-app-shell.js +10 -3
  177. package/src/client/excalidraw-editor.js +11 -0
  178. package/src/client/export/export-host.js +1 -1
  179. package/src/client/export/export-page.js +6 -2
  180. package/src/client/export/export-pipeline.js +60 -1
  181. package/src/client/presentation/comment-ui/comment-ui-render.js +4 -0
  182. package/src/client/presentation/comment-ui-controller.js +2 -0
  183. package/src/client/presentation/excalidraw-embed-controller.js +7 -0
  184. package/src/client/presentation/file-explorer-controller.js +0 -5
  185. package/src/client/presentation/file-explorer-view.js +41 -44
  186. package/src/client/presentation/file-tree-state.js +4 -3
  187. package/src/client/presentation/git-panel-controller.js +2 -2
  188. package/src/client/presentation/quick-switcher-controller.js +48 -9
  189. package/src/client/styles/features/preview-markdown.css +25 -0
  190. package/src/client/styles/features/quick-switcher.css +8 -0
  191. package/src/client/styles/foundation/themes.css +1 -0
  192. package/src/client/styles/layout/shell.css +7 -325
  193. package/src/client/styles/layout/sidebar.css +42 -4
  194. package/src/client/styles/overrides/highlightjs.css +20 -4
  195. package/src/server/infrastructure/git/git-service.js +23 -11
  196. package/src/server/infrastructure/http/create-git-api-command-handler.js +3 -1
  197. package/src/server/infrastructure/http/create-structurizr-api-handler.js +4 -2
  198. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +33 -7
  199. package/dist/client/assets/architecture-TIHT7OUA-CsHfPErM.js +0 -1
  200. package/dist/client/assets/base-CxPEiHuy.js +0 -1
  201. package/dist/client/assets/blockDiagram-VBNYF7ZC-CipJt9Jl.js +0 -132
  202. package/dist/client/assets/c4Diagram-5PPSVZJV-B5ktVx6g.js +0 -10
  203. package/dist/client/assets/channel-4Jkmq93I.js +0 -1
  204. package/dist/client/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  205. package/dist/client/assets/chunk-7Z6QIM7H-BP9Pdsm9.js +0 -10
  206. package/dist/client/assets/chunk-ERSWUTIN-hHdvnhaY.js +0 -41
  207. package/dist/client/assets/chunk-I66GZJ75-CVFiiffQ.js +0 -127
  208. package/dist/client/assets/chunk-J7OUQ5F2-4CEb7pvH.js +0 -2
  209. package/dist/client/assets/chunk-JQJVKLGR-cx8X_24v.js +0 -156
  210. package/dist/client/assets/chunk-QR6OTTB3-CDAA_5Ib.js +0 -62
  211. package/dist/client/assets/chunk-RYQCIY6F-D-a0zH8K.js +0 -1
  212. package/dist/client/assets/chunk-UBXNYLIW-Bhk-PbFK.js +0 -1
  213. package/dist/client/assets/chunk-W5SLKNZC-BdNSCxZ9.js +0 -1
  214. package/dist/client/assets/chunk-WRU74C26-h6_XkD3_.js +0 -70
  215. package/dist/client/assets/chunk-ZIRB5QZD-O39ZBUk3.js +0 -32
  216. package/dist/client/assets/classDiagram-JCYQIIEL-L7lsyW_w.js +0 -1
  217. package/dist/client/assets/classDiagram-v2-OCEON4UE-L7lsyW_w.js +0 -1
  218. package/dist/client/assets/cynefin-VYW2F7L2-Ds2Fw2Y0.js +0 -1
  219. package/dist/client/assets/dagre-Buvkdvvj.js +0 -1
  220. package/dist/client/assets/dagre-VZM6K2ZE-L1xArOGs.js +0 -4
  221. package/dist/client/assets/dist-B5Jf1SLZ.js +0 -2
  222. package/dist/client/assets/dist-BKW4PALF.js +0 -1
  223. package/dist/client/assets/dist-BWcHHOx-.js +0 -1
  224. package/dist/client/assets/dist-DaYdhcVs.js +0 -1
  225. package/dist/client/assets/dist-Kh2COra_.js +0 -1
  226. package/dist/client/assets/dist-tOaegDYS2.js +0 -1
  227. package/dist/client/assets/editor-session-Cm9ekeNo.js +0 -54
  228. package/dist/client/assets/embedded-editor-base-CwTkk911.css +0 -1
  229. package/dist/client/assets/erDiagram-JOGREHBK-cYUpEKpf.js +0 -85
  230. package/dist/client/assets/es-DXGV3RHd.js +0 -22
  231. package/dist/client/assets/eventmodeling-45OFAUF4-CLEiVx5s.js +0 -1
  232. package/dist/client/assets/excalidraw-editor-Bt7gMSoh.css +0 -1
  233. package/dist/client/assets/export-page-A7NHawJY.js +0 -39
  234. package/dist/client/assets/exportDocument-B2L8fe34.css +0 -1
  235. package/dist/client/assets/flowDiagram-UKHOOZJN-D0ypP0Ez.js +0 -1
  236. package/dist/client/assets/gitGraph-TEB2WS4Q-CZFBqwW-.js +0 -1
  237. package/dist/client/assets/github-dark.min-Z5exjX_n.css +0 -1
  238. package/dist/client/assets/github.min-D2BCvnWf.css +0 -1
  239. package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +0 -1
  240. package/dist/client/assets/index-Pum8ET-5.css +0 -1
  241. package/dist/client/assets/info-DKCQHKI2--1InqQeT.js +0 -1
  242. package/dist/client/assets/main-B3uPyqic.js +0 -893
  243. package/dist/client/assets/map-BaFkSB1l.js +0 -1
  244. package/dist/client/assets/mermaid.core-DN-lF51U.js +0 -11
  245. package/dist/client/assets/packet-7NZHBO7P-BGMXB0XL.js +0 -1
  246. package/dist/client/assets/pdf-BL9Pr2D5.js +0 -54
  247. package/dist/client/assets/pdf.worker-CLesOks4.mjs +0 -64857
  248. package/dist/client/assets/pdf_viewer-FVkkThnz.js +0 -551
  249. package/dist/client/assets/pie-RZYD4A2V-DgYg3tCt.js +0 -1
  250. package/dist/client/assets/preview-render-compiler-BD-XhkS2.js +0 -35
  251. package/dist/client/assets/preview-render-compiler-BKedaMxx.js +0 -1
  252. package/dist/client/assets/preview-render-worker-CiPqc9n6.js +0 -60
  253. package/dist/client/assets/prod-Dy20X7eT.js +0 -1
  254. package/dist/client/assets/prod-hnwh7wRM.js +0 -177
  255. package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +0 -12
  256. package/dist/client/assets/radar-I7S5WNFK-Ag-zp_Rq.js +0 -1
  257. package/dist/client/assets/railroad-3IZDKUUU-aibJDIDV.js +0 -1
  258. package/dist/client/assets/railroad-abnf-AHOZXSZD-BBMEuvIl.js +0 -1
  259. package/dist/client/assets/railroad-ebnf-EBAXGLYW-Be1nseej.js +0 -1
  260. package/dist/client/assets/railroad-peg-LSFZ7HO6-DIvD-Eyb.js +0 -1
  261. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-B1-BufUk.js +0 -1
  262. package/dist/client/assets/swimlanes-SLNWSIFB-oVTWEJIj.js +0 -2
  263. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-C5OTVwEu.js +0 -8
  264. package/dist/client/assets/treeView-QDETBFTQ-uHZ-3Fz8.js +0 -1
  265. package/dist/client/assets/treemap-6X3UGDF4-BnUKyy3l.js +0 -1
  266. package/dist/client/assets/wardley-OPB4EBWU-Da7TLC2F.js +0 -1
  267. /package/dist/client/assets/{drawio-editor-FzY1cVw8.js → drawio-editor-BjrxTe3l.js} +0 -0
@@ -9,6 +9,9 @@ import { extractYamlFrontmatter } from '../../domain/yaml-frontmatter.js';
9
9
  import { renderFrontmatterBlock } from './markdown-frontmatter.js';
10
10
  import { analyzeMarkdownComplexity } from './preview-render-profile.js';
11
11
 
12
+ hljs.registerAliases(['cql', 'mariadb', 'mssql', 'mysql', 'plsql', 'sqlite'], { languageName: 'sql' });
13
+ hljs.registerAliases(['ecmascript', 'node'], { languageName: 'javascript' });
14
+
12
15
  const DIRECT_VIDEO_MIME_TYPES = Object.freeze({
13
16
  '.mp4': 'video/mp4',
14
17
  '.ogg': 'video/ogg',
@@ -27,7 +27,7 @@ export async function ensureQuickSwitcherInstance(host) {
27
27
  getSearchConfig: () => host.runtimeConfig.search ?? {},
28
28
  onFileSelect: (filePath) => host.workspaceRouteController.handleFileSelection(filePath, {
29
29
  closeSidebarOnMobile: true,
30
- revealInTree: true,
30
+ revealInTree: !host.isMobileViewport(),
31
31
  }),
32
32
  onTextMatchSelect: (match) => {
33
33
  if (!match?.file) {
@@ -93,7 +93,6 @@ export class WorkspacePreviewController {
93
93
 
94
94
  resetPreviewMode() {
95
95
  this.pdfPreview.cancel();
96
- this.elements.previewContainer?.classList?.remove('is-pdf-file-preview');
97
96
  this.elements.previewContent?.classList.remove('is-drawio-file-preview');
98
97
  this.elements.previewContent?.classList.remove('is-excalidraw-file-preview');
99
98
  this.elements.previewContent?.classList.remove('is-base-file-preview');
@@ -272,14 +271,12 @@ export class WorkspacePreviewController {
272
271
  this.drawioEmbed.detachForCommit();
273
272
  this.excalidrawEmbed.detachForCommit();
274
273
  this.resetPreviewMode();
275
- this.elements.previewContainer?.classList?.add('is-pdf-file-preview');
276
274
  previewElement.classList.add('is-pdf-file-preview');
277
275
  const renderHost = this.previewRenderer.ensureRenderHost();
278
276
  this.previewRenderer.normalizePreviewChildren(renderHost);
279
277
 
280
278
  if (renderHost) {
281
279
  this.pdfPreview.render({
282
- displayName: this.getDisplayName(filePath),
283
280
  filePath,
284
281
  renderHost,
285
282
  });
@@ -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}
@@ -99,7 +99,13 @@ export class CollabMdAppShell {
99
99
  this.sessionLoadToken = 0;
100
100
  this.navigation = {
101
101
  getHashRoute,
102
- 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
+ },
103
109
  navigateToGitCommit,
104
110
  navigateToGitDiff,
105
111
  navigateToGitFileHistory,
@@ -247,6 +253,7 @@ export class CollabMdAppShell {
247
253
  this.drawioEmbed.reconcileEmbeds(this.elements.previewContent);
248
254
  this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent, { isLargeDocument: stats.isLargeDocument });
249
255
  this.scrollSyncController.setLargeDocumentMode(stats.isLargeDocument);
256
+ this.syncPreviewCodeCopyButtons();
250
257
  this.syncPreviewHeadingLinkButtons();
251
258
  this.applyPendingPreviewRouteAnchor({ behavior: 'auto', clearMissing: true });
252
259
  this.schedulePreviewLayoutSync({ delayMs: 0 });
@@ -288,8 +295,7 @@ export class CollabMdAppShell {
288
295
  scrollEditorToLine: (lineNumber, viewportRatio) => this.session?.scrollToLine(lineNumber, viewportRatio),
289
296
  });
290
297
  this.pdfPreview = new PdfPreviewController({
291
- outlineController: this.outlineController,
292
- previewContainer: this.elements.previewContainer,
298
+ getTheme: () => this.themeController.getTheme(),
293
299
  });
294
300
  this.backlinksPanel = new BacklinksPanel({
295
301
  headerPanelElement: this.elements.backlinksHeaderPanel,
@@ -304,6 +310,7 @@ export class CollabMdAppShell {
304
310
  getLocalUser: () => this.lobby.getLocalUser(),
305
311
  getTheme: () => this.themeController.getTheme(),
306
312
  onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
313
+ onStopFollowing: () => this.stopFollowingUser(),
307
314
  onToggleQuickSwitcher: () => {
308
315
  void this.toggleQuickSwitcher();
309
316
  },
@@ -441,6 +441,7 @@ function buildExcalidrawProps({ initialData, renderTopRightUI, viewModeEnabled }
441
441
  },
442
442
  onPointerDown: () => {
443
443
  initialViewportFitPending = false;
444
+ stopFollowingFromLocalInteraction();
444
445
  },
445
446
  renderTopRightUI,
446
447
  historyOptions: {
@@ -1379,7 +1380,17 @@ function postToParent(type, payload = {}) {
1379
1380
  window.parent.postMessage({ source: 'excalidraw-editor', type, ...payload }, parentOrigin);
1380
1381
  }
1381
1382
 
1383
+ function stopFollowingFromLocalInteraction() {
1384
+ if (!pendingHostFollowPeerId && !followedSocketId) {
1385
+ return;
1386
+ }
1387
+
1388
+ applyHostFollowRequest(null);
1389
+ postToParent('stop-following');
1390
+ }
1391
+
1382
1392
  function handleQuickSwitcherKeyDown(event) {
1393
+ stopFollowingFromLocalInteraction();
1383
1394
  if (!isPlainQuickSwitcherShortcut(event)) {
1384
1395
  return;
1385
1396
  }
@@ -12,7 +12,7 @@ function createJobId() {
12
12
  }
13
13
 
14
14
  function normalizeFormat(format) {
15
- return format === 'pdf' ? 'pdf' : 'docx';
15
+ return ['html', 'pdf'].includes(format) ? format : 'docx';
16
16
  }
17
17
 
18
18
  function buildExportUrl({ filePath, format, jobId }) {
@@ -51,9 +51,13 @@ async function bootstrap() {
51
51
  const snapshot = await prepareExportSnapshot(payload);
52
52
  const mount = renderSnapshot(snapshot);
53
53
  snapshot.html = await waitForRenderedExportContent(mount);
54
- setStatus(payload.action === 'pdf' ? 'Opening print dialog…' : 'Preparing DOCX download…');
54
+ setStatus(payload.action === 'pdf'
55
+ ? 'Opening print dialog…'
56
+ : `Preparing ${payload.action.toUpperCase()} download…`);
55
57
  await runExportAdapter(snapshot, payload.action);
56
- setStatus(payload.action === 'pdf' ? 'Print dialog opened.' : 'DOCX download started.');
58
+ setStatus(payload.action === 'pdf'
59
+ ? 'Print dialog opened.'
60
+ : `${payload.action.toUpperCase()} download started.`);
57
61
  postExportPageMessage('complete', { jobId: new URL(window.location.href).searchParams.get('job') || '' });
58
62
  } catch (error) {
59
63
  const message = error instanceof Error ? error.message : 'Export failed';
@@ -1,5 +1,12 @@
1
1
  import { exportToSvg as exportExcalidrawToSvg } from '@excalidraw/excalidraw';
2
2
 
3
+ import baseStyles from '../styles/base.css?inline';
4
+ import tokenStyles from '../styles/foundation/tokens.css?inline';
5
+ import themeStyles from '../styles/foundation/themes.css?inline';
6
+ import previewStyles from '../styles/features/preview-markdown.css?inline';
7
+ import highlightOverrideStyles from '../styles/overrides/highlightjs.css?inline';
8
+ import exportStyles from '../styles/export-document.css?inline';
9
+ import highlightStyles from '../assets/vendor/highlight/github.min.css?inline';
3
10
  import {
4
11
  encodeSvgDataUrl,
5
12
  loadImage,
@@ -9,6 +16,7 @@ import {
9
16
  import { compilePreviewDocument } from '../application/preview-render-compiler.js';
10
17
  import { stripVaultFileExtension } from '../../domain/file-kind.js';
11
18
  import { parseSceneJson, sceneToInitialData } from '../domain/excalidraw-scene.js';
19
+ import { escapeHtml } from '../domain/vault-utils.js';
12
20
  import { downloadBlob } from '../browser-utils.js';
13
21
  import { resolveApiUrl, resolveAppUrl } from '../infrastructure/runtime-config.js';
14
22
 
@@ -46,6 +54,20 @@ const DOCX_IMAGE_TYPE_LABELS = new Map([
46
54
  ['image/gif', 'GIF'],
47
55
  ['image/webp', 'WebP'],
48
56
  ]);
57
+ const HTML_EXPORT_STYLES = [
58
+ baseStyles,
59
+ tokenStyles,
60
+ themeStyles,
61
+ previewStyles,
62
+ highlightOverrideStyles,
63
+ exportStyles,
64
+ highlightStyles,
65
+ `html, body {
66
+ height: auto;
67
+ min-height: 100%;
68
+ overflow: visible;
69
+ }`,
70
+ ].join('\n');
49
71
 
50
72
  let mermaidLoaderPromise = null;
51
73
  let assetCounter = 0;
@@ -1387,6 +1409,37 @@ export function buildDocxHtmlDocument(snapshot) {
1387
1409
  </html>`;
1388
1410
  }
1389
1411
 
1412
+ export function buildHtmlDocument(snapshot) {
1413
+ const template = document.createElement('template');
1414
+ template.innerHTML = snapshot.html;
1415
+ Array.from(template.content.querySelectorAll('[data-export-docx-src]')).forEach((element) => {
1416
+ element.removeAttribute('data-export-docx-src');
1417
+ });
1418
+
1419
+ return `<!DOCTYPE html>
1420
+ <html lang="en" data-theme="light">
1421
+ <head>
1422
+ <meta charset="UTF-8">
1423
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
1424
+ <title>${escapeHtml(snapshot.title)}</title>
1425
+ <style>${HTML_EXPORT_STYLES.replace(/<\/style/giu, '<\\/style')}</style>
1426
+ </head>
1427
+ <body data-theme="light">
1428
+ <main class="export-page-shell">
1429
+ <article class="preview-content export-content">${template.innerHTML}</article>
1430
+ </main>
1431
+ </body>
1432
+ </html>`;
1433
+ }
1434
+
1435
+ export function htmlAdapter(snapshot) {
1436
+ downloadBlob(
1437
+ new Blob([buildHtmlDocument(snapshot)], { type: 'text/html;charset=utf-8' }),
1438
+ `${createDocumentTitle(snapshot.filePath, snapshot.title)}.html`,
1439
+ { removeDelayMs: 0, revokeDelayMs: 1000 },
1440
+ );
1441
+ }
1442
+
1390
1443
  export async function docxAdapter(snapshot) {
1391
1444
  const response = await fetch(resolveApiUrl('/export/docx'), {
1392
1445
  body: JSON.stringify({
@@ -1461,6 +1514,11 @@ export async function runExportAdapter(snapshot, format) {
1461
1514
  return;
1462
1515
  }
1463
1516
 
1517
+ if (format === 'html') {
1518
+ await htmlAdapter(snapshot);
1519
+ return;
1520
+ }
1521
+
1464
1522
  await docxAdapter(snapshot);
1465
1523
  }
1466
1524
 
@@ -1478,7 +1536,8 @@ export function postExportPageMessage(type, payload = {}) {
1478
1536
 
1479
1537
  export async function waitForBootstrapPayload() {
1480
1538
  const requestUrl = new URL(window.location.href);
1481
- const action = requestUrl.searchParams.get('action') === 'pdf' ? 'pdf' : 'docx';
1539
+ const requestedAction = requestUrl.searchParams.get('action');
1540
+ const action = ['html', 'pdf'].includes(requestedAction) ? requestedAction : 'docx';
1482
1541
  const filePath = requestUrl.searchParams.get('file') || '';
1483
1542
  const jobId = requestUrl.searchParams.get('job') || '';
1484
1543
 
@@ -17,6 +17,7 @@ import {
17
17
  * @property {HTMLElement | null} commentsDrawerList
18
18
  * @property {HTMLElement | null} commentsDrawerEmpty
19
19
  * @property {HTMLElement | null} cardRoot
20
+ * @property {{ matches: boolean }} mobileBreakpointQuery
20
21
  * @property {HTMLElement | null} pendingCardFocusElement
21
22
  * @property {any} reactionPicker
22
23
  * @property {() => Array<any>} getThreadGroups
@@ -103,6 +104,9 @@ function renderDrawer() {
103
104
  });
104
105
  button.addEventListener('click', () => {
105
106
  this.onNavigateToLine?.(group.anchor?.startLine ?? 1);
107
+ if (this.mobileBreakpointQuery?.matches) {
108
+ this.setDrawerOpen(false);
109
+ }
106
110
  this.openThreadGroup(group, {
107
111
  anchor: group.anchor,
108
112
  origin: 'editor',
@@ -12,6 +12,7 @@ export class CommentUiController {
12
12
  commentsDrawerList,
13
13
  commentsToggleButton,
14
14
  editorContainer,
15
+ mobileBreakpointQuery = window.matchMedia('(max-width: 768px)'),
15
16
  onWillOpenDrawer,
16
17
  onCreateThread,
17
18
  onNavigateToLine,
@@ -27,6 +28,7 @@ export class CommentUiController {
27
28
  this.commentsDrawerList = commentsDrawerList;
28
29
  this.commentsToggleButton = commentsToggleButton;
29
30
  this.editorContainer = editorContainer;
31
+ this.mobileBreakpointQuery = mobileBreakpointQuery;
30
32
  this.onWillOpenDrawer = onWillOpenDrawer;
31
33
  this.onCreateThread = onCreateThread;
32
34
  this.onNavigateToLine = onNavigateToLine;
@@ -27,6 +27,7 @@ export class ExcalidrawEmbedController {
27
27
  getTheme,
28
28
  getLocalUser,
29
29
  onOpenFile = null,
30
+ onStopFollowing = null,
30
31
  onToggleQuickSwitcher = null,
31
32
  previewContainer,
32
33
  previewElement,
@@ -35,6 +36,7 @@ export class ExcalidrawEmbedController {
35
36
  this.getTheme = getTheme;
36
37
  this.getLocalUser = getLocalUser;
37
38
  this.onOpenFile = onOpenFile;
39
+ this.onStopFollowing = onStopFollowing;
38
40
  this.onToggleQuickSwitcher = onToggleQuickSwitcher;
39
41
  this.previewContainer = previewContainer;
40
42
  this.previewElement = previewElement;
@@ -1227,6 +1229,11 @@ export class ExcalidrawEmbedController {
1227
1229
  return;
1228
1230
  }
1229
1231
 
1232
+ if (msg.type === 'stop-following') {
1233
+ this.onStopFollowing?.();
1234
+ return;
1235
+ }
1236
+
1230
1237
  if (msg.type === 'error') {
1231
1238
  if (entry.isParked) {
1232
1239
  return;
@@ -24,11 +24,6 @@ export class FileExplorerController {
24
24
  this.threadCounts = new Map();
25
25
  this.view = new FileExplorerView({
26
26
  mobileBreakpointQuery,
27
- onDirectorySelect: (pathValue) => {
28
- this.state.expandDirectoryPath(pathValue);
29
- this.state.setSearchQuery('');
30
- this.renderTree({ reset: true });
31
- },
32
27
  onDirectoryToggle: (pathValue) => {
33
28
  this.state.toggleDirectory(pathValue);
34
29
  if (!this.view.rerenderDirectoryBranch(pathValue, this.state.tree, {
@@ -32,7 +32,6 @@ export class FileExplorerView {
32
32
  constructor({
33
33
  mobileBreakpointQuery = window.matchMedia('(max-width: 768px)'),
34
34
  onEntryDrop,
35
- onDirectorySelect,
36
35
  onDirectoryToggle,
37
36
  onFileContextMenu,
38
37
  onFileSelect,
@@ -41,7 +40,6 @@ export class FileExplorerView {
41
40
  onValidateDrop,
42
41
  }) {
43
42
  this.onEntryDrop = onEntryDrop;
44
- this.onDirectorySelect = onDirectorySelect;
45
43
  this.onDirectoryToggle = onDirectoryToggle;
46
44
  this.onFileContextMenu = onFileContextMenu;
47
45
  this.onFileSelect = onFileSelect;
@@ -51,6 +49,7 @@ export class FileExplorerView {
51
49
  this.mobileBreakpointQuery = mobileBreakpointQuery;
52
50
  this.treeContainer = document.getElementById('fileTree');
53
51
  this.searchInput = document.getElementById('fileSearchInput');
52
+ this.searchStatus = document.getElementById('fileSearchStatus');
54
53
  this.renderedDirectoryWrappers = new Map();
55
54
  this.renderedChildContainers = new Map();
56
55
  this.renderedFileItems = new Map();
@@ -122,6 +121,18 @@ export class FileExplorerView {
122
121
  });
123
122
  }
124
123
 
124
+ updateSearchStatus(query, matchCount = null) {
125
+ if (!this.searchStatus) {
126
+ return;
127
+ }
128
+
129
+ const status = String(query ?? '').trim() && Number.isInteger(matchCount)
130
+ ? `${matchCount} match${matchCount === 1 ? '' : 'es'}`
131
+ : '';
132
+ this.searchStatus.textContent = status;
133
+ this.searchStatus.classList.toggle('hidden', !status);
134
+ }
135
+
125
136
  revealFile(filePath) {
126
137
  this.renderedFileItems.get(filePath)?.scrollIntoView({ block: 'nearest' });
127
138
  }
@@ -143,6 +154,10 @@ export class FileExplorerView {
143
154
  const threadCount = Number(this.threadCounts.get(filePath) ?? 0) || 0;
144
155
  let badge = button.querySelector('.file-tree-comment-count');
145
156
  button.classList.toggle('has-comments', threadCount > 0);
157
+ button.setAttribute(
158
+ 'aria-label',
159
+ `${filePath}${threadCount > 0 ? `, ${threadCount} open comment thread${threadCount === 1 ? '' : 's'}` : ''}`,
160
+ );
146
161
 
147
162
  if (threadCount <= 0) {
148
163
  delete button.dataset.threadCount;
@@ -157,7 +172,7 @@ export class FileExplorerView {
157
172
  button.appendChild(badge);
158
173
  }
159
174
  badge.textContent = String(threadCount);
160
- badge.setAttribute('aria-label', `${threadCount} open comment thread${threadCount === 1 ? '' : 's'}`);
175
+ badge.setAttribute('aria-hidden', 'true');
161
176
  });
162
177
  }
163
178
 
@@ -168,7 +183,7 @@ export class FileExplorerView {
168
183
 
169
184
  this.threadCounts = threadCounts instanceof Map ? threadCounts : new Map();
170
185
  this.showFileExtensions = Boolean(showFileExtensions);
171
- this.currentSearchQuery = String(searchQuery ?? '');
186
+ this.currentSearchQuery = String(searchQuery ?? '').trim();
172
187
  if (this.currentSearchQuery) {
173
188
  this.clearDragFeedback();
174
189
  }
@@ -176,8 +191,9 @@ export class FileExplorerView {
176
191
  if (this.searchInput && this.searchInput.value !== searchQuery) {
177
192
  this.searchInput.value = searchQuery;
178
193
  }
194
+ this.updateSearchStatus(searchQuery, this.currentSearchQuery ? searchMatches.length : null);
179
195
 
180
- if (searchQuery) {
196
+ if (this.currentSearchQuery) {
181
197
  this.lastRenderMode = 'search';
182
198
  this.renderSearchResults(searchMatches, activeFilePath);
183
199
  return;
@@ -246,17 +262,13 @@ export class FileExplorerView {
246
262
 
247
263
  const fragment = document.createDocumentFragment();
248
264
  for (const match of matches) {
249
- if (match.type === 'directory') {
250
- fragment.appendChild(this.createSearchDirectoryItem(match));
251
- continue;
252
- }
253
-
254
265
  fragment.appendChild(this.createFileItem({
255
266
  activeFilePath,
256
267
  depth: 0,
257
268
  filePath: match.path,
258
269
  fileType: match.type || (getVaultTreeNodeType(match.path) ?? 'file'),
259
270
  name: match.name || getVaultPathLeaf(match.path),
271
+ searchResult: true,
260
272
  }));
261
273
  }
262
274
  this.treeContainer.appendChild(fragment);
@@ -315,6 +327,8 @@ export class FileExplorerView {
315
327
 
316
328
  const button = document.createElement('button');
317
329
  button.className = 'file-tree-item file-tree-dir';
330
+ button.title = node.path;
331
+ button.setAttribute('aria-label', node.path);
318
332
  button.style.setProperty('--depth', depth);
319
333
  button.dataset.depth = depth;
320
334
 
@@ -364,35 +378,6 @@ export class FileExplorerView {
364
378
  return wrapper;
365
379
  }
366
380
 
367
- createSearchDirectoryItem(node) {
368
- const button = document.createElement('button');
369
- button.className = 'file-tree-item file-tree-dir';
370
- button.style.setProperty('--depth', 0);
371
- button.dataset.depth = 0;
372
- button.dataset.path = node.path;
373
- button.dataset.entryType = 'directory';
374
- button.innerHTML = `
375
- <svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><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"/></svg>
376
- <span class="file-tree-name">${escapeHtml(node.name || getVaultPathLeaf(node.path))}</span>
377
- `;
378
-
379
- button.addEventListener('click', (event) => {
380
- if (this.consumeSuppressedActivation(button, event)) {
381
- return;
382
- }
383
- this.onDirectorySelect?.(node.path);
384
- });
385
- button.addEventListener('contextmenu', (event) => {
386
- event.preventDefault();
387
- this.onFileContextMenu?.(event, { directoryPath: node.path, type: 'directory' });
388
- });
389
- this.bindLongPress(button, () => {
390
- this.onFileContextMenu?.(this.createLongPressEvent(button), { directoryPath: node.path, type: 'directory' });
391
- });
392
-
393
- return button;
394
- }
395
-
396
381
  rerenderDirectoryBranch(parentPath, tree, { activeFilePath, expandedDirs }) {
397
382
  const wrapper = this.renderedDirectoryWrappers.get(parentPath);
398
383
  const parentNode = findNodeByPath(tree, parentPath);
@@ -453,10 +438,16 @@ export class FileExplorerView {
453
438
  });
454
439
  }
455
440
 
456
- createFileItem({ activeFilePath, depth, filePath, fileType = 'file', name }) {
441
+ createFileItem({ activeFilePath, depth, filePath, fileType = 'file', name, searchResult = false }) {
457
442
  const button = document.createElement('button');
458
- button.className = 'file-tree-item file-tree-file';
443
+ const parentPath = getVaultPathParent(filePath);
444
+ button.className = `file-tree-item file-tree-file${searchResult ? ' file-tree-search-result' : ''}`;
445
+ button.title = filePath;
459
446
  const threadCount = Number(this.threadCounts.get(filePath) ?? 0);
447
+ button.setAttribute(
448
+ 'aria-label',
449
+ `${filePath}${threadCount > 0 ? `, ${threadCount} open comment thread${threadCount === 1 ? '' : 's'}` : ''}`,
450
+ );
460
451
  const isDrawio = fileType === 'drawio';
461
452
  const isExcalidraw = fileType === 'excalidraw';
462
453
  const isBase = fileType === 'base';
@@ -504,11 +495,17 @@ export class FileExplorerView {
504
495
  if (threadCount > 0) {
505
496
  button.dataset.threadCount = String(threadCount);
506
497
  }
507
- const displayName = this.showFileExtensions ? String(name ?? '') : stripVaultFileExtension(name);
498
+ const displayName = this.showFileExtensions || searchResult ? String(name ?? '') : stripVaultFileExtension(name);
499
+ const nameMarkup = searchResult
500
+ ? `<span class="file-tree-search-copy">
501
+ <span class="file-tree-name">${escapeHtml(displayName)}</span>
502
+ ${parentPath ? `<span class="file-tree-search-path">${escapeHtml(parentPath)}</span>` : ''}
503
+ </span>`
504
+ : `<span class="file-tree-name">${escapeHtml(displayName)}</span>`;
508
505
  button.innerHTML = `
509
506
  ${getVaultFileIconSvg(filePath)}
510
- <span class="file-tree-name">${escapeHtml(displayName)}</span>
511
- ${threadCount > 0 ? `<span class="file-tree-comment-count" aria-label="${threadCount} open comment thread${threadCount === 1 ? '' : 's'}">${threadCount}</span>` : ''}
507
+ ${nameMarkup}
508
+ ${threadCount > 0 ? `<span class="file-tree-comment-count" aria-hidden="true">${threadCount}</span>` : ''}
512
509
  `;
513
510
  this.configureDragSource(button, { path: filePath, type: 'file' });
514
511
 
@@ -104,16 +104,17 @@ export class FileTreeState {
104
104
  }
105
105
 
106
106
  setSearchQuery(value) {
107
- this.searchQuery = String(value ?? '').trim().toLowerCase();
107
+ this.searchQuery = String(value ?? '');
108
108
  }
109
109
 
110
110
  getSearchMatches() {
111
- if (!this.searchQuery) {
111
+ const normalizedQuery = this.searchQuery.trim().toLowerCase();
112
+ if (!normalizedQuery) {
112
113
  return [];
113
114
  }
114
115
 
115
116
  return this.flatSearchEntries
116
- .filter((entry) => entry.lowerPath.includes(this.searchQuery))
117
+ .filter((entry) => entry.type !== 'directory' && entry.lowerPath.includes(normalizedQuery))
117
118
  .map((entry) => ({
118
119
  name: entry.name,
119
120
  path: entry.path,
@@ -879,7 +879,7 @@ export class GitPanelController {
879
879
 
880
880
  return `
881
881
  ${pullBackupsMarkup}
882
- ${sectionMarkup || '<div class="git-panel-empty">No local changes</div>'}
882
+ ${sectionMarkup || `<div class="git-panel-empty">${this.searchQuery && hasChanges ? 'No changes match your filter.' : 'No local changes'}</div>`}
883
883
  ${hasChanges ? `
884
884
  <div class="git-panel-footer">
885
885
  <div class="git-panel-footer-actions">
@@ -947,7 +947,7 @@ export class GitPanelController {
947
947
  class="${buttonClassNames({ variant: 'secondary', size: 'compact', pill: true, surface: true, extra: 'ui-action-pill' })}"
948
948
  type="button"
949
949
  data-git-sync-action="pull"
950
- title="${hasUpstream ? 'Pull remote changes (fast-forward only)' : 'No upstream branch configured'}"
950
+ title="${hasUpstream ? 'Pull remote changes' : 'No upstream branch configured'}"
951
951
  aria-label="Pull branch"
952
952
  ${!hasUpstream || isPullPending ? 'disabled' : ''}
953
953
  >