collabmd 0.1.46 → 0.1.48

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 (317) hide show
  1. package/README.md +9 -5
  2. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-CYM5nxUi.js → CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js} +1 -1
  3. package/dist/client/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -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/babel-CY5KOv-I.js +16 -0
  8. package/dist/client/assets/base-BYODPHdS.js +1 -0
  9. package/dist/client/assets/blockDiagram-NRAW4CY4-C6DtJy5Y.js +129 -0
  10. package/dist/client/assets/browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.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-ui-shared-DuoyznXW.js +7 -0
  53. package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  54. package/dist/client/assets/{cynefinDiagram-MW4NZA55-CJxXfJek.js → cynefinDiagram-5FMLGOSQ-CdTPi2yO.js} +1 -1
  55. package/dist/client/assets/dagre-3AP2YEHR-5gtJtd0O.js +4 -0
  56. package/dist/client/assets/dagre-PrKaheQc.js +1 -0
  57. package/dist/client/assets/{diagram-7IWD3JNH-B2d2Bm15.js → diagram-S7CK7UJ4-BudWz9WU.js} +4 -4
  58. package/dist/client/assets/{diagram-UB23O5K3-DJcKCwv9.js → diagram-UQ7AKVKN-3v4rbH-s.js} +1 -1
  59. package/dist/client/assets/{diagram-B4RE2ZJO-NP4UAwjR.js → diagram-VSXAHHWV-CQRVEZR7.js} +1 -1
  60. package/dist/client/assets/{diagram-Q27KOJAE-DylDuwor.js → diagram-VX7I27RA-C_-rj0sw.js} +1 -1
  61. package/dist/client/assets/{diagram-LBJQPF4R-D1FJQV8t.js → diagram-Z3DM3KII-B4yxavgj.js} +1 -1
  62. package/dist/client/assets/direct-engine-DdrQKpgq-CtKfQzCt.js +5 -0
  63. package/dist/client/assets/dist-73RPdcyU.js +1 -0
  64. package/dist/client/assets/{dist-Bm6pf9Bl.js → dist-BJ1bJs33.js} +1 -1
  65. package/dist/client/assets/{dist-BalScOwZ.js → dist-BK9QvQrc.js} +1 -1
  66. package/dist/client/assets/{dist-DLMiIsNC.js → dist-BPHLJ09L.js} +1 -1
  67. package/dist/client/assets/{dist-Bf8f4HmM.js → dist-B_yQaEv_.js} +1 -1
  68. package/dist/client/assets/{dist-CC5IrQMG.js → dist-BeajGMhO.js} +1 -1
  69. package/dist/client/assets/{dist-PDZ3bSqm.js → dist-Bw3VIE_v.js} +1 -1
  70. package/dist/client/assets/{dist-xElaxbia.js → dist-ByrG2qBA.js} +1 -1
  71. package/dist/client/assets/{dist-ule2n6ak.js → dist-C5NgpdG5.js} +1 -1
  72. package/dist/client/assets/dist-CH-sQu3r.js +1 -0
  73. package/dist/client/assets/dist-CKS_-are.js +1 -0
  74. package/dist/client/assets/{dist-D-Z6FLem.js → dist-CdmKGRGr.js} +1 -1
  75. package/dist/client/assets/dist-ChRoo3IB.js +9 -0
  76. package/dist/client/assets/{dist-dtAdgL39.js → dist-CietwTVS.js} +1 -1
  77. package/dist/client/assets/{dist-jv4WdPnK.js → dist-D37Hyu3h.js} +1 -1
  78. package/dist/client/assets/dist-D3fehAZ2.js +2 -0
  79. package/dist/client/assets/{dist-BEwK4csK.js → dist-D5wCC32z.js} +1 -1
  80. package/dist/client/assets/{dist-shrl6K_0.js → dist-DDUn5zTz.js} +1 -1
  81. package/dist/client/assets/{dist-CZgOmxK6.js → dist-DGEbEfw4.js} +1 -1
  82. package/dist/client/assets/{dist-B5HTH2BO.js → dist-DVy5woUy.js} +1 -1
  83. package/dist/client/assets/{dist-DZKu9Cs8.js → dist-DZAAWTG-.js} +1 -1
  84. package/dist/client/assets/{dist-TjMh8n1u.js → dist-Dir5dDKZ.js} +1 -1
  85. package/dist/client/assets/dist-Dl_tpDSr.js +1 -0
  86. package/dist/client/assets/{dist-FWJsgGYI.js → dist-DuH3ZrHo.js} +1 -1
  87. package/dist/client/assets/{dist-BjHJDtyU.js → dist-DutPuFmC.js} +1 -1
  88. package/dist/client/assets/{dist-Cqhv5LAk.js → dist-LQ4kDCKz.js} +1 -1
  89. package/dist/client/assets/{dist-CCP_AKPG.js → dist-RKBTaQMb.js} +1 -1
  90. package/dist/client/assets/{dist-BoVBdSjk.js → dist-Tw-Fxpeb.js} +1 -1
  91. package/dist/client/assets/dist-eBx8q6Sy.js +1 -0
  92. package/dist/client/assets/{dist-rGBmqxC7.js → dist-mj2Ht75J.js} +1 -1
  93. package/dist/client/assets/{dist-BDt3rz7l.js → dist-netZOQtD.js} +1 -1
  94. package/dist/client/assets/document-formatter-Dxl_a8XO.js +2 -0
  95. package/dist/client/assets/{drawio-editor-FzY1cVw8.js → drawio-editor-BVaNNtYp.js} +2 -2
  96. package/dist/client/assets/{drawioEditor-BjiKJqlc.js → drawioEditor-BkIBlXx0.js} +2 -2
  97. package/dist/client/assets/{ebnfDiagram-BXEA7PRR-nw0wmA6y.js → ebnfDiagram-PWID7BFC-OXa8VEp1.js} +1 -1
  98. package/dist/client/assets/editor-session-DMyVdHLj.js +54 -0
  99. package/dist/client/assets/embedded-editor-base-B3l6Xy65.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/estree-CuT_pB8K.js +44 -0
  105. package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  106. package/dist/client/assets/excalidraw-editor-BbSbI80a.css +1 -0
  107. package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +9 -0
  108. package/dist/client/assets/excalidrawEditor-ChqF_d82.js +2 -0
  109. package/dist/client/assets/export-page-Dyu0XCbu.js +57 -0
  110. package/dist/client/assets/exportDocument-CJBx4Xjx.css +1 -0
  111. package/dist/client/assets/exportDocument-Dgvfa2Sd.js +2 -0
  112. package/dist/client/assets/{file-icon-svg-CQAjlWjK.js → file-icon-svg-Y_kpF957.js} +1 -1
  113. package/dist/client/assets/file-kind-BwMIcZbi.js +1 -0
  114. package/dist/client/assets/file-search-DDLyyLDU.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/html-Cdnr2qzU.js +25 -0
  122. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +1 -0
  123. package/dist/client/assets/index-CSNIMyOP.css +1 -0
  124. package/dist/client/assets/index-DG3N2Ps-.js +2 -0
  125. package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  126. package/dist/client/assets/{infoDiagram-6WML65LV-DYB8HCDQ.js → infoDiagram-RXCK75RN-BMzo6KIn.js} +1 -1
  127. package/dist/client/assets/{ishikawaDiagram-WSZJBQD7-Coz_P3t6.js → ishikawaDiagram-5VMMS53U-BIM3h287.js} +1 -1
  128. package/dist/client/assets/{journeyDiagram-NVQOT4AX-B6edChce.js → journeyDiagram-EYS64GPL-mF6Lh8O-.js} +1 -1
  129. package/dist/client/assets/{kanban-definition-27J2QSJJ-BFd9-cLc.js → kanban-definition-3QL26DDD-DLN2NyoR.js} +2 -2
  130. package/dist/client/assets/{line-B_S_S8kV.js → line-BfTWJmgf.js} +1 -1
  131. package/dist/client/assets/main-D0wCxpVn.js +903 -0
  132. package/dist/client/assets/markdown-CByV-4CU.js +70 -0
  133. package/dist/client/assets/{mermaid-parser.core-CUVdebAV.js → mermaid-parser.core-Bl0efOMt.js} +2 -2
  134. package/dist/client/assets/mermaid.core-BJRLUQZE.js +11 -0
  135. package/dist/client/assets/{mindmap-definition-FAOFIHXS-C9PQ38Al.js → mindmap-definition-FBJOCRG2-CRyHaHTk.js} +1 -1
  136. package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  137. package/dist/client/assets/pdfium-RAgkpwfK.wasm +0 -0
  138. package/dist/client/assets/{pegDiagram-VL7TDLO6-BMZUrSaU.js → pegDiagram-XKGWAZYB-B31fKPR2.js} +1 -1
  139. package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  140. package/dist/client/assets/{pieDiagram-7S7Q4E2Y-h8kbCL9o.js → pieDiagram-E7YTZNPT-B5OZPb88.js} +1 -1
  141. package/dist/client/assets/preview-render-compiler-CrJIooVD.js +35 -0
  142. package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +1 -0
  143. package/dist/client/assets/{preview-render-profile-CE-5rVTC.js → preview-render-profile-B4RWYWHt.js} +1 -1
  144. package/dist/client/assets/preview-render-worker-_QTxqKvP.js +60 -0
  145. package/dist/client/assets/prod-BiYPMR1i.js +177 -0
  146. package/dist/client/assets/prod-VxdGZ5Ly.js +1 -0
  147. package/dist/client/assets/{quadrantDiagram-CIZ2JOQS-CkElyfMi.js → quadrantDiagram-AXDQQJYC-Drrw14YH.js} +1 -1
  148. package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +1 -0
  149. package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  150. package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  151. package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  152. package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  153. package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  154. package/dist/client/assets/{railroadDiagram-AXF67PYL-c75gnikD.js → railroadDiagram-O6MQD6OU-BPifP0MB.js} +1 -1
  155. package/dist/client/assets/{requirementDiagram-LRYGKXZP-mNxKLuHS.js → requirementDiagram-EFPCY7ZU-CRZG6mRB.js} +2 -2
  156. package/dist/client/assets/{sankeyDiagram-W5VNT64P-0OhplksI.js → sankeyDiagram-P5KCCOFB-DvarEJpo.js} +1 -1
  157. package/dist/client/assets/{sequenceDiagram-SI44F4Z6-BJ_yAocC.js → sequenceDiagram-WJ2MYXX4-B4oWlb-w.js} +1 -1
  158. package/dist/client/assets/standalone-6z5x8CWe.js +29 -0
  159. package/dist/client/assets/{stateDiagram-OKZ733FA-Cc83O86s.js → stateDiagram-HBIQ2CUA-qbHIIqRZ.js} +1 -1
  160. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +1 -0
  161. package/dist/client/assets/swimlanes-XN3QIQJK-xB6CtUGj.js +1 -0
  162. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +8 -0
  163. package/dist/client/assets/{timeline-definition-Z64GVDOM-BWDAGTHz.js → timeline-definition-24CTP7MA-Lj_yTNlY.js} +1 -1
  164. package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  165. package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  166. package/dist/client/assets/{vault-api-client-_LpV1aIn.js → vault-api-client-BkwdFjx0.js} +2 -2
  167. package/dist/client/assets/vault-utils-DvoSftJT.js +22 -0
  168. package/dist/client/assets/{vennDiagram-T6HMQDX7-LOSsnlMB.js → vennDiagram-4TSXK5OY-BekRp5Y0.js} +1 -1
  169. package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  170. package/dist/client/assets/{wardleyDiagram-T6FBY63Y-BxII3foY.js → wardleyDiagram-VM6X3IG4-kdnV_Hdm.js} +1 -1
  171. package/dist/client/assets/worker-engine-m0rlHn8R-S8mpn_O0.js +17369 -0
  172. package/dist/client/assets/{xychartDiagram-ELKLHX3M-B-pTEjju.js → xychartDiagram-S5SC5T6Z-DufGwNSB.js} +3 -3
  173. package/dist/client/assets/yaml-9ltHPDNO.js +154 -0
  174. package/dist/client/drawio-editor.html +1 -1
  175. package/dist/client/excalidraw-editor.html +1 -1
  176. package/dist/client/export-document.html +3 -3
  177. package/dist/client/index.html +56 -24
  178. package/package.json +22 -18
  179. package/src/client/app/index.html +53 -21
  180. package/src/client/application/app-shell/comments-feature.js +2 -3
  181. package/src/client/application/app-shell/export-feature.js +17 -1
  182. package/src/client/application/app-shell/git-feature.js +30 -11
  183. package/src/client/application/app-shell/presence-feature.js +2 -2
  184. package/src/client/application/app-shell/ui-feature-identity.js +13 -0
  185. package/src/client/application/app-shell/ui-feature-shell.js +228 -9
  186. package/src/client/application/app-shell-elements.js +5 -0
  187. package/src/client/application/pdf-preview-controller.js +53 -970
  188. package/src/client/application/preview-render-compiler.js +3 -0
  189. package/src/client/application/quick-switcher-loader.js +1 -1
  190. package/src/client/application/workspace-coordinator.js +21 -4
  191. package/src/client/application/workspace-preview-controller.js +120 -5
  192. package/src/client/application/workspace-route-controller.js +4 -1
  193. package/src/client/assets/vendor/highlight/github-dark.min.css +2 -10
  194. package/src/client/assets/vendor/highlight/github.min.css +2 -10
  195. package/src/client/assets/vendor/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  196. package/src/client/assets/vendor/jetbrains-mono/OFL.txt +93 -0
  197. package/src/client/bootstrap/collabmd-app-shell.js +31 -8
  198. package/src/client/domain/document-formatter.js +193 -0
  199. package/src/client/domain/file-search.js +73 -0
  200. package/src/client/domain/git-labels.js +5 -0
  201. package/src/client/domain/vault-paths.js +6 -4
  202. package/src/client/domain/wiki-link-completions.js +20 -20
  203. package/src/client/drawio-editor.js +8 -3
  204. package/src/client/excalidraw-editor.js +163 -6
  205. package/src/client/export/export-host.js +57 -36
  206. package/src/client/export/export-page.js +20 -6
  207. package/src/client/export/export-pipeline.js +322 -22
  208. package/src/client/infrastructure/editor-session.js +4 -0
  209. package/src/client/infrastructure/editor-view-adapter.js +60 -14
  210. package/src/client/presentation/bases-preview-controller.js +35 -11
  211. package/src/client/presentation/comment-ui/comment-ui-render.js +4 -0
  212. package/src/client/presentation/comment-ui-controller.js +2 -0
  213. package/src/client/presentation/excalidraw-embed-controller.js +7 -0
  214. package/src/client/presentation/file-action-controller.js +15 -2
  215. package/src/client/presentation/file-explorer-controller.js +3 -5
  216. package/src/client/presentation/file-explorer-view.js +43 -45
  217. package/src/client/presentation/file-history-view-controller.js +6 -1
  218. package/src/client/presentation/file-tree-state.js +5 -14
  219. package/src/client/presentation/git-diff-view-controller.js +36 -11
  220. package/src/client/presentation/git-panel-controller.js +12 -8
  221. package/src/client/presentation/quick-switcher-controller.js +92 -153
  222. package/src/client/styles/components/scrollbars.css +10 -0
  223. package/src/client/styles/export-document.css +44 -29
  224. package/src/client/styles/features/collaboration-presence.css +13 -1
  225. package/src/client/styles/features/preview-markdown.css +79 -0
  226. package/src/client/styles/features/quick-switcher.css +8 -0
  227. package/src/client/styles/foundation/themes.css +1 -0
  228. package/src/client/styles/foundation/tokens.css +8 -0
  229. package/src/client/styles/layout/shell.css +73 -339
  230. package/src/client/styles/layout/sidebar.css +42 -4
  231. package/src/client/styles/layout/view-modes.css +2 -0
  232. package/src/client/styles/overrides/codemirror.css +31 -19
  233. package/src/client/styles/overrides/highlightjs.css +20 -4
  234. package/src/client/styles/surfaces/excalidraw-editor.css +42 -0
  235. package/src/domain/file-kind.js +12 -1
  236. package/src/server/domain/ripgrep-search-service.js +110 -37
  237. package/src/server/infrastructure/git/git-service.js +23 -11
  238. package/src/server/infrastructure/http/create-git-api-command-handler.js +3 -1
  239. package/src/server/infrastructure/http/create-structurizr-api-handler.js +4 -2
  240. package/src/server/infrastructure/persistence/path-utils.js +10 -4
  241. package/src/server/infrastructure/persistence/vault-file-store.js +2 -0
  242. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +33 -7
  243. package/dist/client/assets/architecture-TIHT7OUA-CsHfPErM.js +0 -1
  244. package/dist/client/assets/base-CxPEiHuy.js +0 -1
  245. package/dist/client/assets/blockDiagram-VBNYF7ZC-CipJt9Jl.js +0 -132
  246. package/dist/client/assets/c4Diagram-5PPSVZJV-B5ktVx6g.js +0 -10
  247. package/dist/client/assets/channel-4Jkmq93I.js +0 -1
  248. package/dist/client/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  249. package/dist/client/assets/chunk-7Z6QIM7H-BP9Pdsm9.js +0 -10
  250. package/dist/client/assets/chunk-ERSWUTIN-hHdvnhaY.js +0 -41
  251. package/dist/client/assets/chunk-I66GZJ75-CVFiiffQ.js +0 -127
  252. package/dist/client/assets/chunk-J7OUQ5F2-4CEb7pvH.js +0 -2
  253. package/dist/client/assets/chunk-JQJVKLGR-cx8X_24v.js +0 -156
  254. package/dist/client/assets/chunk-QR6OTTB3-CDAA_5Ib.js +0 -62
  255. package/dist/client/assets/chunk-RYQCIY6F-D-a0zH8K.js +0 -1
  256. package/dist/client/assets/chunk-UBXNYLIW-Bhk-PbFK.js +0 -1
  257. package/dist/client/assets/chunk-W5SLKNZC-BdNSCxZ9.js +0 -1
  258. package/dist/client/assets/chunk-WRU74C26-h6_XkD3_.js +0 -70
  259. package/dist/client/assets/chunk-ZIRB5QZD-O39ZBUk3.js +0 -32
  260. package/dist/client/assets/classDiagram-JCYQIIEL-L7lsyW_w.js +0 -1
  261. package/dist/client/assets/classDiagram-v2-OCEON4UE-L7lsyW_w.js +0 -1
  262. package/dist/client/assets/comment-ui-shared-BC4pt4w8.js +0 -7
  263. package/dist/client/assets/cynefin-VYW2F7L2-Ds2Fw2Y0.js +0 -1
  264. package/dist/client/assets/dagre-Buvkdvvj.js +0 -1
  265. package/dist/client/assets/dagre-VZM6K2ZE-L1xArOGs.js +0 -4
  266. package/dist/client/assets/dist-B5Jf1SLZ.js +0 -2
  267. package/dist/client/assets/dist-BKW4PALF.js +0 -1
  268. package/dist/client/assets/dist-BWcHHOx-.js +0 -1
  269. package/dist/client/assets/dist-DaYdhcVs.js +0 -1
  270. package/dist/client/assets/dist-Kh2COra_.js +0 -1
  271. package/dist/client/assets/dist-tOaegDYS2.js +0 -1
  272. package/dist/client/assets/editor-session-Cm9ekeNo.js +0 -54
  273. package/dist/client/assets/embedded-editor-base-CwTkk911.css +0 -1
  274. package/dist/client/assets/erDiagram-JOGREHBK-cYUpEKpf.js +0 -85
  275. package/dist/client/assets/es-DXGV3RHd.js +0 -22
  276. package/dist/client/assets/eventmodeling-45OFAUF4-CLEiVx5s.js +0 -1
  277. package/dist/client/assets/excalidraw-editor-B46zsTFI.js +0 -9
  278. package/dist/client/assets/excalidraw-editor-Bt7gMSoh.css +0 -1
  279. package/dist/client/assets/excalidrawEditor-CT2pHq7e.js +0 -2
  280. package/dist/client/assets/export-page-A7NHawJY.js +0 -39
  281. package/dist/client/assets/exportDocument-B2L8fe34.css +0 -1
  282. package/dist/client/assets/exportDocument-BaqcOAAW.js +0 -2
  283. package/dist/client/assets/file-kind-BbqgGzpc.js +0 -1
  284. package/dist/client/assets/flowDiagram-UKHOOZJN-D0ypP0Ez.js +0 -1
  285. package/dist/client/assets/gitGraph-TEB2WS4Q-CZFBqwW-.js +0 -1
  286. package/dist/client/assets/github-dark.min-Z5exjX_n.css +0 -1
  287. package/dist/client/assets/github.min-D2BCvnWf.css +0 -1
  288. package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +0 -1
  289. package/dist/client/assets/index-ClbjMBVt.js +0 -2
  290. package/dist/client/assets/index-Pum8ET-5.css +0 -1
  291. package/dist/client/assets/info-DKCQHKI2--1InqQeT.js +0 -1
  292. package/dist/client/assets/main-B3uPyqic.js +0 -893
  293. package/dist/client/assets/map-BaFkSB1l.js +0 -1
  294. package/dist/client/assets/mermaid.core-DN-lF51U.js +0 -11
  295. package/dist/client/assets/packet-7NZHBO7P-BGMXB0XL.js +0 -1
  296. package/dist/client/assets/pdf-BL9Pr2D5.js +0 -54
  297. package/dist/client/assets/pdf.worker-CLesOks4.mjs +0 -64857
  298. package/dist/client/assets/pdf_viewer-FVkkThnz.js +0 -551
  299. package/dist/client/assets/pie-RZYD4A2V-DgYg3tCt.js +0 -1
  300. package/dist/client/assets/preview-render-compiler-BD-XhkS2.js +0 -35
  301. package/dist/client/assets/preview-render-compiler-BKedaMxx.js +0 -1
  302. package/dist/client/assets/preview-render-worker-CiPqc9n6.js +0 -60
  303. package/dist/client/assets/prod-Dy20X7eT.js +0 -1
  304. package/dist/client/assets/prod-hnwh7wRM.js +0 -177
  305. package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +0 -12
  306. package/dist/client/assets/radar-I7S5WNFK-Ag-zp_Rq.js +0 -1
  307. package/dist/client/assets/railroad-3IZDKUUU-aibJDIDV.js +0 -1
  308. package/dist/client/assets/railroad-abnf-AHOZXSZD-BBMEuvIl.js +0 -1
  309. package/dist/client/assets/railroad-ebnf-EBAXGLYW-Be1nseej.js +0 -1
  310. package/dist/client/assets/railroad-peg-LSFZ7HO6-DIvD-Eyb.js +0 -1
  311. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-B1-BufUk.js +0 -1
  312. package/dist/client/assets/swimlanes-SLNWSIFB-oVTWEJIj.js +0 -2
  313. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-C5OTVwEu.js +0 -8
  314. package/dist/client/assets/treeView-QDETBFTQ-uHZ-3Fz8.js +0 -1
  315. package/dist/client/assets/treemap-6X3UGDF4-BnUKyy3l.js +0 -1
  316. package/dist/client/assets/vault-utils-wdQ0RNR9.js +0 -1
  317. package/dist/client/assets/wardley-OPB4EBWU-Da7TLC2F.js +0 -1
@@ -15,16 +15,16 @@
15
15
  document.documentElement.setAttribute('data-initial-file-requested', 'true');
16
16
  }
17
17
  </script>
18
- <script type="module" crossorigin src="./assets/index-ClbjMBVt.js"></script>
18
+ <script type="module" crossorigin src="./assets/index-DG3N2Ps-.js"></script>
19
19
  <link rel="modulepreload" crossorigin href="./assets/modulepreload-polyfill-P2Xu9kJm.js">
20
20
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-HclGiUj8.js">
21
- <link rel="modulepreload" crossorigin href="./assets/base-CxPEiHuy.js">
21
+ <link rel="modulepreload" crossorigin href="./assets/base-BYODPHdS.js">
22
22
  <link rel="stylesheet" crossorigin href="./assets/base-CaIEJUF9.css">
23
- <link rel="stylesheet" crossorigin href="./assets/index-Pum8ET-5.css">
23
+ <link rel="stylesheet" crossorigin href="./assets/index-CSNIMyOP.css">
24
24
  </head>
25
25
  <body>
26
26
 
27
- <a href="#editorContainer" class="sr-only skip-link">Skip to editor</a>
27
+ <a href="#editorContainer" class="sr-only skip-link" id="skipToEditor">Skip to editor</a>
28
28
 
29
29
  <div class="app-shell">
30
30
  <aside id="sidebar" class="sidebar">
@@ -109,14 +109,16 @@
109
109
  </div>
110
110
  <div class="sidebar-search" id="fileSearch">
111
111
  <input
112
- type="text"
112
+ type="search"
113
113
  class="ui-input sidebar-search-input"
114
114
  id="fileSearchInput"
115
- placeholder="Search files..."
115
+ placeholder="Filter files by name or path…"
116
116
  autocomplete="off"
117
117
  spellcheck="false"
118
- aria-label="Search files"
118
+ aria-label="Filter files by name or path"
119
+ aria-describedby="fileSearchStatus"
119
120
  >
121
+ <div class="sidebar-search-status hidden" id="fileSearchStatus" role="status" aria-live="polite"></div>
120
122
  </div>
121
123
  <div class="sidebar-search hidden" id="gitSearch">
122
124
  <input
@@ -214,6 +216,16 @@
214
216
  </div>
215
217
 
216
218
  <div class="toolbar-right">
219
+ <button class="ui-button ui-button--ghost ui-button--compact hidden" id="reviewFileChangesBtn" type="button" aria-label="Review changes to this file" title="Review changes to this file">
220
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
221
+ <line x1="6" y1="3" x2="6" y2="15"></line>
222
+ <circle cx="18" cy="6" r="3"></circle>
223
+ <circle cx="6" cy="18" r="3"></circle>
224
+ <path d="M18 9a9 9 0 0 1-9 9"></path>
225
+ </svg>
226
+ <span class="ui-toolbar-button-label">Review changes</span>
227
+ </button>
228
+
217
229
  <button class="ui-button ui-button--ghost ui-button--toolbar mobile-view-toggle" id="mobileViewToggle" aria-label="Toggle editor/preview" title="Toggle view">
218
230
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
219
231
  <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
@@ -225,9 +237,13 @@
225
237
  <div class="toolbar-status-cluster" aria-label="Workspace status">
226
238
  <span class="ui-pill-badge ui-pill-badge--accent hidden toolbar-badge" id="toolbarDiffBadge">Diff</span>
227
239
  <span class="ui-pill-badge ui-pill-badge--muted hidden toolbar-badge" id="gitOperationStatus" aria-live="polite" aria-atomic="true"></span>
240
+ </div>
241
+
242
+ <div class="toolbar-presence-cluster">
243
+ <div class="user-avatars" id="userAvatars"></div>
228
244
  <button
229
245
  type="button"
230
- class="ui-pill-badge ui-pill-badge--muted toolbar-badge toolbar-badge-button"
246
+ class="ui-pill-badge ui-pill-badge--muted toolbar-badge toolbar-badge-button toolbar-presence-count"
231
247
  id="userCount"
232
248
  aria-controls="presencePanel"
233
249
  aria-expanded="false"
@@ -235,8 +251,6 @@
235
251
  ></button>
236
252
  </div>
237
253
 
238
- <div class="user-avatars toolbar-presence-cluster" id="userAvatars"></div>
239
-
240
254
  <section class="collaboration-popover presence-panel hidden" id="presencePanel" aria-label="Online users" aria-hidden="true">
241
255
  <div class="presence-panel-header">
242
256
  <div>
@@ -386,6 +400,14 @@
386
400
  <span class="ui-toolbar-button-label">Export</span>
387
401
  </summary>
388
402
  <div class="toolbar-overflow-submenu">
403
+ <button class="ui-button ui-button--ghost ui-button--toolbar" id="exportHtmlBtn" aria-label="Export HTML" title="Export HTML">
404
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
405
+ <path d="m8 9-3 3 3 3"></path>
406
+ <path d="m16 9 3 3-3 3"></path>
407
+ <path d="m14 5-4 14"></path>
408
+ </svg>
409
+ <span class="ui-toolbar-button-label">Export HTML</span>
410
+ </button>
389
411
  <button class="ui-button ui-button--ghost ui-button--toolbar" id="exportDocxBtn" aria-label="Export DOCX" title="Export DOCX">
390
412
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
391
413
  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
@@ -473,6 +495,14 @@
473
495
  </svg>
474
496
  <span class="ui-action-label">Comment</span>
475
497
  </button>
498
+ <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle" id="editorFormatBtn" aria-label="Format document" title="Format document">
499
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
500
+ <path d="M4 7h10"></path>
501
+ <path d="M4 12h16"></path>
502
+ <path d="M4 17h10"></path>
503
+ </svg>
504
+ <span class="ui-action-label">Format</span>
505
+ </button>
476
506
  <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle" id="toggleWrapBtn" aria-label="Disable line wrap" title="Disable line wrap">
477
507
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
478
508
  <path d="M3 6h14a4 4 0 1 1 0 8H9"></path>
@@ -503,6 +533,7 @@
503
533
  <div class="pane-header">
504
534
  <span class="pane-label">Preview</span>
505
535
  <div class="pane-header-actions">
536
+ <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle hidden" id="htmlPreviewMaximize" aria-label="Maximize HTML preview" title="Maximize HTML preview"></button>
506
537
  <div id="backlinksHeaderPanel" class="backlinks-panel backlinks-panel-header hidden" data-backlinks-variant="header">
507
538
  <button type="button" class="backlinks-header" aria-expanded="false">
508
539
  <svg class="backlinks-chevron" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
@@ -609,16 +640,10 @@
609
640
  </button>
610
641
  <div class="diff-toolbar-actions-group diff-toolbar-actions-group-git" id="diffGitActionsGroup" role="group" aria-label="Git file actions">
611
642
  <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface" id="diffPrimaryActionBtn" type="button" disabled>
612
- Stage
643
+ Include in commit
613
644
  </button>
614
645
  <button class="ui-button ui-button--primary ui-button--action ui-button--wide" id="diffCommitBtn" type="button" disabled>
615
- Commit Staged
616
- </button>
617
- </div>
618
- <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
619
- <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
620
- <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface diff-open-editor-btn" id="diffOpenEditorBtn" type="button" disabled>
621
- Open in Editor
646
+ Commit included files
622
647
  </button>
623
648
  </div>
624
649
  </div>
@@ -636,6 +661,12 @@
636
661
  <button class="ui-segmented-btn active view-btn diff-mode-btn" data-diff-mode="unified" type="button">Unified</button>
637
662
  <button class="ui-segmented-btn view-btn diff-mode-btn" data-diff-mode="split" type="button">Split</button>
638
663
  </div>
664
+ <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
665
+ <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
666
+ <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface diff-open-editor-btn" id="diffOpenEditorBtn" type="button" disabled>
667
+ Open in editor
668
+ </button>
669
+ </div>
639
670
  </div>
640
671
  </div>
641
672
  <div class="diff-scroll" id="diffScroll">
@@ -684,16 +715,17 @@
684
715
  <dialog class="app-dialog" id="gitCommitDialog">
685
716
  <form class="app-dialog-form" id="gitCommitForm" method="dialog">
686
717
  <div class="app-dialog-header">
687
- <h2 class="app-dialog-title" id="gitCommitTitle">Commit staged changes</h2>
688
- <p class="app-dialog-copy" id="gitCommitCopy">All staged changes will be included.</p>
718
+ <h2 class="app-dialog-title" id="gitCommitTitle">Commit included files</h2>
719
+ <p class="app-dialog-copy" id="gitCommitCopy">All included changes will be committed.</p>
689
720
  </div>
690
721
  <label class="app-dialog-field" for="gitCommitInput">
691
- <span class="app-dialog-label">Commit message</span>
692
- <input type="text" class="ui-input" id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" required>
722
+ <span class="app-dialog-label">What changed?</span>
723
+ <input type="text" class="ui-input" id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" aria-describedby="gitCommitHint" required>
724
+ <span class="app-dialog-hint" id="gitCommitHint">This becomes the Git commit message.</span>
693
725
  </label>
694
726
  <div class="app-dialog-actions">
695
727
  <button type="button" class="ui-button ui-button--secondary" id="gitCommitCancel">Cancel</button>
696
- <button type="submit" class="ui-button ui-button--primary" id="gitCommitSubmit">Commit staged changes</button>
728
+ <button type="submit" class="ui-button ui-button--primary" id="gitCommitSubmit">Commit included files</button>
697
729
  </div>
698
730
  </form>
699
731
  </dialog>
@@ -743,7 +775,7 @@
743
775
  <circle cx="11" cy="11" r="8"></circle>
744
776
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
745
777
  </svg>
746
- <input type="text" class="qs-input" id="quickSwitcherInput" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" autocomplete="off" spellcheck="false">
778
+ <input type="text" class="qs-input" id="quickSwitcherInput" role="combobox" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" aria-autocomplete="list" aria-expanded="false" autocomplete="off" spellcheck="false">
747
779
  <kbd class="qs-kbd">esc</kbd>
748
780
  </div>
749
781
  <div class="qs-scope hidden" id="quickSwitcherScope" role="note" aria-hidden="true">Exact, case-insensitive text in Markdown, Base, Mermaid, PlantUML, Draw.io, and Excalidraw files. Images are excluded.</div>
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "collabmd",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "type": "module",
5
- "description": "Collaborative markdown vault \u2014 like Obsidian, but online. Serve any directory of markdown files for realtime collaborative editing.",
5
+ "description": "Collaborative markdown vault like Obsidian, but online. Serve any directory of markdown files for realtime collaborative editing.",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/andes90/collabmd.git"
@@ -63,12 +63,13 @@
63
63
  "cli"
64
64
  ],
65
65
  "engines": {
66
- "node": ">=24"
66
+ "node": ">=26"
67
67
  },
68
68
  "license": "MIT",
69
69
  "dependencies": {
70
70
  "@codemirror/autocomplete": "^6.20.3",
71
- "@codemirror/commands": "^6.10.4",
71
+ "@codemirror/commands": "^6.11.0",
72
+ "@codemirror/lang-html": "^6.4.11",
72
73
  "@codemirror/lang-markdown": "^6.5.2",
73
74
  "@codemirror/lang-yaml": "^6.1.3",
74
75
  "@codemirror/language": "^6.12.4",
@@ -76,23 +77,25 @@
76
77
  "@codemirror/search": "^6.7.1",
77
78
  "@codemirror/state": "^6.7.1",
78
79
  "@codemirror/theme-one-dark": "^6.1.3",
79
- "@codemirror/view": "^6.43.8",
80
- "@excalidraw/excalidraw": "0.18.0-4872083",
80
+ "@codemirror/view": "^6.43.9",
81
+ "@embedpdf/snippet": "2.15.0",
82
+ "@excalidraw/excalidraw": "0.18.0-abeeaeb",
81
83
  "@replit/codemirror-vim": "^6.4.0",
82
84
  "@turbodocx/html-to-docx": "^1.22.0",
83
85
  "archiver": "^8.0.0",
84
- "highlight.js": "^11.11.1",
85
- "js-yaml": "^5.2.3",
86
+ "highlight.js": "^11.12.0",
87
+ "js-yaml": "^5.3.0",
86
88
  "lib0": "^0.2.117",
87
89
  "markdown-it": "^15.0.0",
88
- "mermaid": "^11.16.1",
89
- "openid-client": "^6.8.4",
90
- "pdfjs-dist": "6.2.108",
90
+ "mermaid": "^11.17.0",
91
+ "mermaid-formatter": "^0.3.0",
92
+ "openid-client": "^6.8.7",
93
+ "prettier": "^3.9.6",
91
94
  "react": "^19.2.8",
92
95
  "react-dom": "^19.2.8",
93
96
  "sharp": "^0.35.3",
94
97
  "ws": "^8.21.3",
95
- "y-codemirror.next": "^0.3.5",
98
+ "y-codemirror.next": "^0.3.6",
96
99
  "y-protocols": "^1.0.7",
97
100
  "y-websocket": "^3.1.0",
98
101
  "yjs": "^13.6.32"
@@ -112,11 +115,12 @@
112
115
  "devDependencies": {
113
116
  "@eslint/js": "^10.0.1",
114
117
  "@playwright/test": "^1.62.1",
115
- "@vitest/browser": "^4.1.10",
116
- "@vitest/browser-playwright": "^4.1.10",
118
+ "@vitest/browser": "^4.1.11",
119
+ "@vitest/browser-playwright": "^4.1.11",
117
120
  "eslint": "^10.8.1",
118
- "globals": "^17.9.0",
119
- "vite": "^8.2.1",
120
- "vitest": "^4.1.10"
121
- }
121
+ "globals": "^17.11.0",
122
+ "vite": "^8.2.2",
123
+ "vitest": "^4.1.11"
124
+ },
125
+ "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621"
122
126
  }
@@ -18,7 +18,7 @@
18
18
  </head>
19
19
  <body>
20
20
 
21
- <a href="#editorContainer" class="sr-only skip-link">Skip to editor</a>
21
+ <a href="#editorContainer" class="sr-only skip-link" id="skipToEditor">Skip to editor</a>
22
22
 
23
23
  <div class="app-shell">
24
24
  <aside id="sidebar" class="sidebar">
@@ -103,14 +103,16 @@
103
103
  </div>
104
104
  <div class="sidebar-search" id="fileSearch">
105
105
  <input
106
- type="text"
106
+ type="search"
107
107
  class="ui-input sidebar-search-input"
108
108
  id="fileSearchInput"
109
- placeholder="Search files..."
109
+ placeholder="Filter files by name or path…"
110
110
  autocomplete="off"
111
111
  spellcheck="false"
112
- aria-label="Search files"
112
+ aria-label="Filter files by name or path"
113
+ aria-describedby="fileSearchStatus"
113
114
  >
115
+ <div class="sidebar-search-status hidden" id="fileSearchStatus" role="status" aria-live="polite"></div>
114
116
  </div>
115
117
  <div class="sidebar-search hidden" id="gitSearch">
116
118
  <input
@@ -208,6 +210,16 @@
208
210
  </div>
209
211
 
210
212
  <div class="toolbar-right">
213
+ <button class="ui-button ui-button--ghost ui-button--compact hidden" id="reviewFileChangesBtn" type="button" aria-label="Review changes to this file" title="Review changes to this file">
214
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
215
+ <line x1="6" y1="3" x2="6" y2="15"></line>
216
+ <circle cx="18" cy="6" r="3"></circle>
217
+ <circle cx="6" cy="18" r="3"></circle>
218
+ <path d="M18 9a9 9 0 0 1-9 9"></path>
219
+ </svg>
220
+ <span class="ui-toolbar-button-label">Review changes</span>
221
+ </button>
222
+
211
223
  <button class="ui-button ui-button--ghost ui-button--toolbar mobile-view-toggle" id="mobileViewToggle" aria-label="Toggle editor/preview" title="Toggle view">
212
224
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
213
225
  <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
@@ -219,9 +231,13 @@
219
231
  <div class="toolbar-status-cluster" aria-label="Workspace status">
220
232
  <span class="ui-pill-badge ui-pill-badge--accent hidden toolbar-badge" id="toolbarDiffBadge">Diff</span>
221
233
  <span class="ui-pill-badge ui-pill-badge--muted hidden toolbar-badge" id="gitOperationStatus" aria-live="polite" aria-atomic="true"></span>
234
+ </div>
235
+
236
+ <div class="toolbar-presence-cluster">
237
+ <div class="user-avatars" id="userAvatars"></div>
222
238
  <button
223
239
  type="button"
224
- class="ui-pill-badge ui-pill-badge--muted toolbar-badge toolbar-badge-button"
240
+ class="ui-pill-badge ui-pill-badge--muted toolbar-badge toolbar-badge-button toolbar-presence-count"
225
241
  id="userCount"
226
242
  aria-controls="presencePanel"
227
243
  aria-expanded="false"
@@ -229,8 +245,6 @@
229
245
  ></button>
230
246
  </div>
231
247
 
232
- <div class="user-avatars toolbar-presence-cluster" id="userAvatars"></div>
233
-
234
248
  <section class="collaboration-popover presence-panel hidden" id="presencePanel" aria-label="Online users" aria-hidden="true">
235
249
  <div class="presence-panel-header">
236
250
  <div>
@@ -380,6 +394,14 @@
380
394
  <span class="ui-toolbar-button-label">Export</span>
381
395
  </summary>
382
396
  <div class="toolbar-overflow-submenu">
397
+ <button class="ui-button ui-button--ghost ui-button--toolbar" id="exportHtmlBtn" aria-label="Export HTML" title="Export HTML">
398
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
399
+ <path d="m8 9-3 3 3 3"></path>
400
+ <path d="m16 9 3 3-3 3"></path>
401
+ <path d="m14 5-4 14"></path>
402
+ </svg>
403
+ <span class="ui-toolbar-button-label">Export HTML</span>
404
+ </button>
383
405
  <button class="ui-button ui-button--ghost ui-button--toolbar" id="exportDocxBtn" aria-label="Export DOCX" title="Export DOCX">
384
406
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
385
407
  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
@@ -467,6 +489,14 @@
467
489
  </svg>
468
490
  <span class="ui-action-label">Comment</span>
469
491
  </button>
492
+ <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle" id="editorFormatBtn" aria-label="Format document" title="Format document">
493
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
494
+ <path d="M4 7h10"></path>
495
+ <path d="M4 12h16"></path>
496
+ <path d="M4 17h10"></path>
497
+ </svg>
498
+ <span class="ui-action-label">Format</span>
499
+ </button>
470
500
  <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle" id="toggleWrapBtn" aria-label="Disable line wrap" title="Disable line wrap">
471
501
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
472
502
  <path d="M3 6h14a4 4 0 1 1 0 8H9"></path>
@@ -497,6 +527,7 @@
497
527
  <div class="pane-header">
498
528
  <span class="pane-label">Preview</span>
499
529
  <div class="pane-header-actions">
530
+ <button class="ui-button ui-button--ghost ui-button--compact ui-button--toggle hidden" id="htmlPreviewMaximize" aria-label="Maximize HTML preview" title="Maximize HTML preview"></button>
500
531
  <div id="backlinksHeaderPanel" class="backlinks-panel backlinks-panel-header hidden" data-backlinks-variant="header">
501
532
  <button type="button" class="backlinks-header" aria-expanded="false">
502
533
  <svg class="backlinks-chevron" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
@@ -603,16 +634,10 @@
603
634
  </button>
604
635
  <div class="diff-toolbar-actions-group diff-toolbar-actions-group-git" id="diffGitActionsGroup" role="group" aria-label="Git file actions">
605
636
  <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface" id="diffPrimaryActionBtn" type="button" disabled>
606
- Stage
637
+ Include in commit
607
638
  </button>
608
639
  <button class="ui-button ui-button--primary ui-button--action ui-button--wide" id="diffCommitBtn" type="button" disabled>
609
- Commit Staged
610
- </button>
611
- </div>
612
- <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
613
- <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
614
- <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface diff-open-editor-btn" id="diffOpenEditorBtn" type="button" disabled>
615
- Open in Editor
640
+ Commit included files
616
641
  </button>
617
642
  </div>
618
643
  </div>
@@ -630,6 +655,12 @@
630
655
  <button class="ui-segmented-btn active view-btn diff-mode-btn" data-diff-mode="unified" type="button">Unified</button>
631
656
  <button class="ui-segmented-btn view-btn diff-mode-btn" data-diff-mode="split" type="button">Split</button>
632
657
  </div>
658
+ <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
659
+ <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
660
+ <button class="ui-button ui-button--secondary ui-button--action ui-button--wide ui-button--surface diff-open-editor-btn" id="diffOpenEditorBtn" type="button" disabled>
661
+ Open in editor
662
+ </button>
663
+ </div>
633
664
  </div>
634
665
  </div>
635
666
  <div class="diff-scroll" id="diffScroll">
@@ -678,16 +709,17 @@
678
709
  <dialog class="app-dialog" id="gitCommitDialog">
679
710
  <form class="app-dialog-form" id="gitCommitForm" method="dialog">
680
711
  <div class="app-dialog-header">
681
- <h2 class="app-dialog-title" id="gitCommitTitle">Commit staged changes</h2>
682
- <p class="app-dialog-copy" id="gitCommitCopy">All staged changes will be included.</p>
712
+ <h2 class="app-dialog-title" id="gitCommitTitle">Commit included files</h2>
713
+ <p class="app-dialog-copy" id="gitCommitCopy">All included changes will be committed.</p>
683
714
  </div>
684
715
  <label class="app-dialog-field" for="gitCommitInput">
685
- <span class="app-dialog-label">Commit message</span>
686
- <input type="text" class="ui-input" id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" required>
716
+ <span class="app-dialog-label">What changed?</span>
717
+ <input type="text" class="ui-input" id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" aria-describedby="gitCommitHint" required>
718
+ <span class="app-dialog-hint" id="gitCommitHint">This becomes the Git commit message.</span>
687
719
  </label>
688
720
  <div class="app-dialog-actions">
689
721
  <button type="button" class="ui-button ui-button--secondary" id="gitCommitCancel">Cancel</button>
690
- <button type="submit" class="ui-button ui-button--primary" id="gitCommitSubmit">Commit staged changes</button>
722
+ <button type="submit" class="ui-button ui-button--primary" id="gitCommitSubmit">Commit included files</button>
691
723
  </div>
692
724
  </form>
693
725
  </dialog>
@@ -737,7 +769,7 @@
737
769
  <circle cx="11" cy="11" r="8"></circle>
738
770
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
739
771
  </svg>
740
- <input type="text" class="qs-input" id="quickSwitcherInput" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" autocomplete="off" spellcheck="false">
772
+ <input type="text" class="qs-input" id="quickSwitcherInput" role="combobox" placeholder="Search files..." aria-label="Search files" aria-controls="quickSwitcherResults" aria-describedby="quickSwitcherHint quickSwitcherScope" aria-autocomplete="list" aria-expanded="false" autocomplete="off" spellcheck="false">
741
773
  <kbd class="qs-kbd">esc</kbd>
742
774
  </div>
743
775
  <div class="qs-scope hidden" id="quickSwitcherScope" role="note" aria-hidden="true">Exact, case-insensitive text in Markdown, Base, Mermaid, PlantUML, Draw.io, and Excalidraw files. Images are excluded.</div>
@@ -108,10 +108,12 @@ export const commentsFeature = {
108
108
  this.setSidebarVisibility(true);
109
109
  if (isDiagram) {
110
110
  this.excalidrawEmbed?.openCommentThread?.(filePath, threadId);
111
+ this.closeSidebarOnMobile?.();
111
112
  return;
112
113
  }
113
114
 
114
115
  this.focusPendingCommentOverviewThread();
116
+ this.closeSidebarOnMobile?.();
115
117
  },
116
118
 
117
119
  focusPendingCommentOverviewThread() {
@@ -128,14 +130,11 @@ export const commentsFeature = {
128
130
  if (didFocus) {
129
131
  this._pendingCommentOverviewFocus = null;
130
132
  this.setSidebarTab('comments');
131
- this.setSidebarVisibility(true);
132
133
  return true;
133
134
  }
134
135
 
135
136
  if (pending.attempts >= 8) {
136
137
  this._pendingCommentOverviewFocus = null;
137
- this.setSidebarTab('comments');
138
- this.setSidebarVisibility(true);
139
138
  return false;
140
139
  }
141
140
 
@@ -1,5 +1,5 @@
1
1
  import { isMarkdownFilePath } from '../../../domain/file-kind.js';
2
- import { exportDocument, initializeExportBridge } from '../../export/export-host.js';
2
+ import { exportDirectory, exportDocument, initializeExportBridge } from '../../export/export-host.js';
3
3
 
4
4
  export const exportFeature = {
5
5
  initializeExportBridge() {
@@ -15,6 +15,22 @@ export const exportFeature = {
15
15
  this._exportBridgeInitialized = true;
16
16
  },
17
17
 
18
+ async handleDirectoryExportRequest(directoryPath, format) {
19
+ try {
20
+ await exportDirectory({
21
+ currentFilePath: this.currentFilePath,
22
+ currentMarkdownText: this.session?.getText?.() ?? '',
23
+ directoryPath,
24
+ fileList: this.fileExplorer?.flatDocumentFiles ?? [],
25
+ format,
26
+ });
27
+ return true;
28
+ } catch (error) {
29
+ this.toastController?.show(error instanceof Error ? error.message : 'Failed to start folder export');
30
+ return false;
31
+ }
32
+ },
33
+
18
34
  async handleExportRequest(format) {
19
35
  const filePath = String(this.currentFilePath ?? '').trim();
20
36
  if (!isMarkdownFilePath(filePath)) {
@@ -1,3 +1,4 @@
1
+ import { commitButtonLabel } from '../../domain/git-labels.js';
1
2
  import { createWorkspaceChange } from '../../../domain/workspace-change.js';
2
3
 
3
4
  export const gitFeature = {
@@ -89,6 +90,7 @@ export const gitFeature = {
89
90
  this.elements.gitSidebarTab?.classList.toggle('has-changes', hasChanges);
90
91
 
91
92
  this.gitDiffView.setRepoStatus(this.gitRepoAvailable ? status : null);
93
+ this.syncReviewFileChangesButton();
92
94
 
93
95
  if (!this.gitRepoAvailable && this.activeSidebarTab === 'git') {
94
96
  this.syncFileHistoryButton({ mode: this.navigation.getHashRoute().type === 'git-file-preview' ? 'history-preview' : 'editor' });
@@ -146,6 +148,21 @@ export const gitFeature = {
146
148
  button.title = 'View file history';
147
149
  },
148
150
 
151
+ syncReviewFileChangesButton({
152
+ filePath = this.currentFilePath,
153
+ mode = 'editor',
154
+ } = {}) {
155
+ const button = this.elements.reviewFileChangesButton;
156
+ if (!button) {
157
+ return;
158
+ }
159
+
160
+ button.classList.toggle(
161
+ 'hidden',
162
+ !this.gitRepoAvailable || mode !== 'editor' || !filePath,
163
+ );
164
+ },
165
+
149
166
  syncMainChrome({ badgeLabel = '', mode, title = null } = {}) {
150
167
  const isSpecialMode = mode === 'diff' || mode === 'history' || mode === 'history-preview';
151
168
  this.elements.toolbarViewToggle?.classList.toggle('hidden', isSpecialMode);
@@ -161,6 +178,7 @@ export const gitFeature = {
161
178
  }
162
179
 
163
180
  this.syncFileHistoryButton({ filePath: this.currentFilePath, mode });
181
+ this.syncReviewFileChangesButton({ filePath: this.currentFilePath, mode });
164
182
  },
165
183
 
166
184
  async showGitDiff({ filePath = null, scope = 'all' } = {}) {
@@ -543,8 +561,8 @@ export const gitFeature = {
543
561
  this.toastController.show(this.formatPullBackupToast(result.pullBackup), 5000);
544
562
  }
545
563
  } catch (error) {
546
- if (error?.code === 'pull_diverged_ff_only') {
547
- this.toastController.show('Cannot pull because local and remote commits have diverged. Fast-forward only pull is not possible.', 5000);
564
+ if (error?.code === 'pull_conflicted_commits') {
565
+ this.toastController.show('Cannot pull automatically because local and remote commits conflict.', 5000);
548
566
  return;
549
567
  }
550
568
 
@@ -635,17 +653,18 @@ export const gitFeature = {
635
653
  return;
636
654
  }
637
655
 
656
+ const includedFileCount = Number(this.gitPanel.status?.summary?.staged || 0);
657
+ const commitLabel = commitButtonLabel(includedFileCount);
638
658
  if (this.elements.gitCommitTitle) {
639
- this.elements.gitCommitTitle.textContent = 'Commit staged changes';
659
+ this.elements.gitCommitTitle.textContent = commitLabel;
640
660
  }
641
661
  if (this.elements.gitCommitCopy) {
642
- const stagedCount = Number(this.gitPanel.status?.summary?.staged || 0);
643
- this.elements.gitCommitCopy.textContent = stagedCount > 0
644
- ? `${stagedCount} staged file${stagedCount === 1 ? '' : 's'} will be included.`
645
- : 'All staged changes will be included.';
662
+ this.elements.gitCommitCopy.textContent = includedFileCount > 0
663
+ ? `This commit will include ${includedFileCount} file${includedFileCount === 1 ? '' : 's'}.`
664
+ : 'All included changes will be committed.';
646
665
  }
647
666
  if (this.elements.gitCommitSubmit) {
648
- this.elements.gitCommitSubmit.textContent = 'Commit staged changes';
667
+ this.elements.gitCommitSubmit.textContent = commitLabel;
649
668
  }
650
669
  input.value = '';
651
670
 
@@ -673,7 +692,7 @@ export const gitFeature = {
673
692
  }
674
693
  if (!message) {
675
694
  input.focus();
676
- this.toastController.show('Commit message cannot be empty');
695
+ this.toastController.show('Describe what changed before committing');
677
696
  return;
678
697
  }
679
698
 
@@ -693,10 +712,10 @@ export const gitFeature = {
693
712
  });
694
713
  dialog.close();
695
714
  } catch (error) {
696
- this.toastController.show(error.message || 'Failed to commit staged changes');
715
+ this.toastController.show(error.message || 'Failed to commit included changes');
697
716
  } finally {
698
717
  if (submit) {
699
- submit.textContent = 'Commit staged changes';
718
+ submit.textContent = 'Commit included files';
700
719
  }
701
720
  submit?.toggleAttribute('disabled', false);
702
721
  }
@@ -358,7 +358,7 @@ export const presenceFeature = {
358
358
  }
359
359
 
360
360
  if (user.currentFile && user.currentFile !== this.currentFilePath) {
361
- this.navigation.navigateToFile(user.currentFile);
361
+ this.navigation.navigateToFile(user.currentFile, { preserveFollow: true });
362
362
  return;
363
363
  }
364
364
 
@@ -404,7 +404,7 @@ export const presenceFeature = {
404
404
  }
405
405
 
406
406
  if (user.currentFile && user.currentFile !== this.currentFilePath) {
407
- this.navigation.navigateToFile(user.currentFile);
407
+ this.navigation.navigateToFile(user.currentFile, { preserveFollow: true });
408
408
  return;
409
409
  }
410
410