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
@@ -44,6 +44,7 @@ function openDisplayNameDialog({ mode = 'edit' } = {}) {
44
44
  if (!dialog || !input) return;
45
45
 
46
46
  const isOnboarding = mode === 'onboarding';
47
+ this._displayNameDialogMode = mode;
47
48
  if (title) {
48
49
  title.textContent = isOnboarding ? 'Choose your display name' : 'Update display name';
49
50
  }
@@ -88,6 +89,17 @@ function promptForDisplayNameIfNeeded() {
88
89
  });
89
90
  }
90
91
 
92
+ /** @this {UiIdentityContext} */
93
+ function handleDisplayNameCancel() {
94
+ if (this._displayNameDialogMode === 'onboarding' && !this.getStoredUserName()) {
95
+ const guestName = this.getCurrentUserName();
96
+ if (guestName) {
97
+ this.preferences.setUserName(guestName);
98
+ }
99
+ }
100
+ this.elements.displayNameDialog?.close();
101
+ }
102
+
91
103
  /** @this {UiIdentityContext} */
92
104
  function handleDisplayNameSubmit() {
93
105
  if (this.isIdentityManagedByAuth()) {
@@ -164,6 +176,7 @@ export const uiFeatureIdentityMethods = {
164
176
  getCurrentUser,
165
177
  getCurrentUserName,
166
178
  getStoredUserName,
179
+ handleDisplayNameCancel,
167
180
  handleDisplayNameSubmit,
168
181
  isIdentityManagedByAuth,
169
182
  openDisplayNameDialog,
@@ -1,10 +1,16 @@
1
- import { supportsBacklinksForFilePath } from '../../../domain/file-kind.js';
1
+ import { getVaultFileKind, supportsBacklinksForFilePath } from '../../../domain/file-kind.js';
2
2
  import { isPlainQuickSwitcherShortcut } from '../../domain/keyboard-shortcuts.js';
3
3
  import { createFileRouteHash, isCollabMdHashRoute } from '../../domain/hash-routes.js';
4
4
 
5
5
  const VERSION_RELOAD_TOAST_DURATION_MS = 0;
6
6
  const PREVIEW_ROUTE_ANCHOR_STABILIZE_MS = 2000;
7
7
  const PREVIEW_ROUTE_ANCHOR_MAX_APPLICATIONS = 8;
8
+ const PREVIEW_CODE_COPY_ICON = `
9
+ <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true" focusable="false">
10
+ <rect x="8" y="8" width="11" height="11" rx="2" fill="none" stroke="currentColor" stroke-width="2"/>
11
+ <path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
12
+ </svg>
13
+ `;
8
14
  const PREVIEW_HEADING_LINK_ICON = `
9
15
  <svg viewBox="0 0 24 24" width="15" height="15" aria-hidden="true" focusable="false">
10
16
  <path d="M10 13.5 14 9.5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
@@ -168,6 +174,11 @@ function bindToolbarEvents() {
168
174
  this.elements.toolbarSearchButton?.addEventListener('click', openQuickSwitcher);
169
175
  this.elements.searchFilesButton?.addEventListener('click', openQuickSwitcher);
170
176
 
177
+ this.elements.exportHtmlButton?.addEventListener('click', () => {
178
+ void this.handleExportRequest?.('html');
179
+ this.closeToolbarOverflowMenu?.();
180
+ });
181
+
171
182
  this.elements.exportDocxButton?.addEventListener('click', () => {
172
183
  void this.handleExportRequest?.('docx');
173
184
  this.closeToolbarOverflowMenu?.();
@@ -178,6 +189,13 @@ function bindToolbarEvents() {
178
189
  this.closeToolbarOverflowMenu?.();
179
190
  });
180
191
 
192
+ this.elements.reviewFileChangesButton?.addEventListener('click', () => {
193
+ this.handleGitDiffSelection(this.currentFilePath, {
194
+ closeSidebarOnMobile: true,
195
+ scope: 'all',
196
+ });
197
+ });
198
+
181
199
  this.elements.fileHistoryButton?.addEventListener('click', () => {
182
200
  const route = this.navigation.getHashRoute();
183
201
  if (route.type === 'git-file-preview') {
@@ -199,7 +217,7 @@ function bindToolbarEvents() {
199
217
  /** @this {UiShellContext} */
200
218
  function bindDialogEvents() {
201
219
  this.elements.displayNameCancel?.addEventListener('click', () => {
202
- this.elements.displayNameDialog?.close();
220
+ this.handleDisplayNameCancel();
203
221
  });
204
222
 
205
223
  this.elements.gitCommitCancel?.addEventListener('click', () => {
@@ -219,7 +237,7 @@ function bindDialogEvents() {
219
237
  this.elements.gitCommitInput.value = '';
220
238
  }
221
239
  if (this.elements.gitCommitSubmit) {
222
- this.elements.gitCommitSubmit.textContent = 'Commit staged changes';
240
+ this.elements.gitCommitSubmit.textContent = 'Commit included files';
223
241
  }
224
242
  });
225
243
 
@@ -244,8 +262,29 @@ function bindDialogEvents() {
244
262
  });
245
263
  }
246
264
 
265
+ /** @this {UiShellContext} */
266
+ function focusEditor(event) {
267
+ event?.preventDefault?.();
268
+ const container = this.elements.editorContainer;
269
+ if (!container) return;
270
+
271
+ const target = container.querySelector('.cm-content, iframe, [contenteditable="true"]') ?? container;
272
+ if (target === container && !container.hasAttribute('tabindex')) {
273
+ container.setAttribute('tabindex', '-1');
274
+ }
275
+ target.focus();
276
+ }
277
+
247
278
  /** @this {UiShellContext} */
248
279
  function bindEvents() {
280
+ const stopFollowing = () => this.stopFollowingUser?.();
281
+ this.elements.editorContainer?.addEventListener('pointerdown', stopFollowing);
282
+ this.elements.editorContainer?.addEventListener('keydown', stopFollowing);
283
+ this.elements.editorContainer?.addEventListener('wheel', stopFollowing, { passive: true });
284
+ this.elements.previewContainer?.addEventListener('pointerdown', stopFollowing);
285
+ this.elements.previewContainer?.addEventListener('wheel', stopFollowing, { passive: true });
286
+ this.elements.skipToEditor?.addEventListener('click', (event) => this.focusEditor(event));
287
+
249
288
  this.elements.emptyStateNewFileBtn?.addEventListener('click', () => {
250
289
  this.fileExplorer.actionController.openRootCreateMenu({
251
290
  anchor: this.elements.emptyStateNewFileBtn,
@@ -311,6 +350,10 @@ function bindEvents() {
311
350
  this.runEditorCommand?.('openSearch');
312
351
  });
313
352
 
353
+ this.elements.editorFormatButton?.addEventListener('click', () => {
354
+ void this.formatCurrentDocument();
355
+ });
356
+
314
357
  this.elements.toolbarOverflowToggle?.addEventListener('click', (event) => {
315
358
  event.preventDefault();
316
359
  this.closePresencePanel?.();
@@ -400,6 +443,10 @@ function handleDocumentPointerDown(event) {
400
443
 
401
444
  /** @this {UiShellContext} */
402
445
  function handleDocumentKeydown(event) {
446
+ if (event.key === 'Escape') {
447
+ this.stopFollowingUser?.();
448
+ }
449
+
403
450
  if (event.key === 'Escape' && this.toolbarOverflowOpen) {
404
451
  this.closeToolbarOverflowMenu();
405
452
  return;
@@ -486,7 +533,7 @@ function getHeadingLinkLabel(heading) {
486
533
  return heading.textContent.trim();
487
534
  }
488
535
 
489
- headingClone.querySelectorAll('.preview-heading-link-button').forEach((button) => button.remove());
536
+ headingClone.querySelectorAll('.preview-heading-fold-button, .preview-heading-link-button').forEach((button) => button.remove());
490
537
  return headingClone.textContent.replace(/\s+/g, ' ').trim();
491
538
  }
492
539
 
@@ -527,6 +574,7 @@ function createPreviewHeadingLinkUrl(anchorId) {
527
574
  return '';
528
575
  }
529
576
 
577
+ // pi-lens-ignore: unchecked-throwing-call-js
530
578
  const url = new URL(window.location.href);
531
579
  url.hash = createFileRouteHash(this.currentFilePath, {
532
580
  anchor: anchorId,
@@ -551,6 +599,123 @@ async function copyPreviewHeadingLink(anchorId) {
551
599
  }
552
600
  }
553
601
 
602
+ /** @this {UiShellContext} */
603
+ async function copyPreviewCodeBlock(button) {
604
+ const code = button?.closest('.preview-code-block')?.querySelector(':scope > pre > code');
605
+ if (!(code instanceof HTMLElement)) {
606
+ return;
607
+ }
608
+
609
+ try {
610
+ await copyTextToClipboard(code.textContent);
611
+ this.toastController.show('Code copied');
612
+ } catch {
613
+ this.toastController.show('Failed to copy code');
614
+ }
615
+ }
616
+
617
+ /** @this {UiShellContext} */
618
+ function syncPreviewCodeCopyButtons() {
619
+ this.elements.previewContent?.querySelectorAll('pre > code').forEach((code) => {
620
+ const pre = code.parentElement;
621
+ const wrapper = document.createElement('div');
622
+ wrapper.className = 'preview-code-block';
623
+ // pi-lens-ignore: no-inner-html-js
624
+ wrapper.innerHTML = `
625
+ <div class="preview-code-actions">
626
+ <button type="button" class="ui-button ui-button--secondary ui-button--compact preview-code-copy-button" aria-label="Copy code" title="Copy code">
627
+ ${PREVIEW_CODE_COPY_ICON}<span data-preview-code-copy-label>Copy</span>
628
+ </button>
629
+ </div>`;
630
+ pre.replaceWith(wrapper);
631
+ wrapper.append(pre);
632
+ });
633
+ }
634
+
635
+ function applyPreviewHeadingFolds(previewContent) {
636
+ const parents = new Set(Array.from(previewContent?.querySelectorAll?.('.preview-heading-fold-button') ?? [])
637
+ .map((button) => button.closest('h1, h2, h3, h4, h5, h6')?.parentElement)
638
+ .filter(Boolean));
639
+
640
+ parents.forEach((parent) => {
641
+ const collapsedLevels = [];
642
+ Array.from(parent.children).forEach((child) => {
643
+ const level = /^H([1-6])$/.exec(child.tagName)?.[1];
644
+ if (level) {
645
+ const headingLevel = Number(level);
646
+ while (collapsedLevels.at(-1) >= headingLevel) {
647
+ collapsedLevels.pop();
648
+ }
649
+ child.hidden = collapsedLevels.length > 0;
650
+ if (child.dataset.previewHeadingCollapsed === 'true') {
651
+ collapsedLevels.push(headingLevel);
652
+ }
653
+ } else {
654
+ child.hidden = collapsedLevels.length > 0;
655
+ }
656
+ });
657
+ });
658
+ }
659
+
660
+ /** @this {UiShellContext} */
661
+ function unfoldPreviewHeading(target) {
662
+ if (!(target instanceof HTMLElement) || !/^H[1-6]$/.test(target.tagName)) {
663
+ return false;
664
+ }
665
+
666
+ const collapsedHeadings = [];
667
+ let ancestorLevel = Number(target.tagName[1]) + 1;
668
+ for (let heading = target; heading; heading = heading.previousElementSibling) {
669
+ const level = Number(/^H([1-6])$/.exec(heading.tagName)?.[1]);
670
+ if (!level || level >= ancestorLevel) {
671
+ continue;
672
+ }
673
+
674
+ ancestorLevel = level;
675
+ if (heading.dataset.previewHeadingCollapsed === 'true') {
676
+ collapsedHeadings.push(heading);
677
+ }
678
+ }
679
+
680
+ if (collapsedHeadings.length === 0) {
681
+ return false;
682
+ }
683
+
684
+ collapsedHeadings.forEach((heading) => delete heading.dataset.previewHeadingCollapsed);
685
+ this.syncPreviewHeadingFoldButtons();
686
+ this.scrollSyncController?.invalidatePreviewBlocks?.();
687
+ this.schedulePreviewLayoutSync?.({ delayMs: 0 });
688
+ this.refreshCommentUiLayout?.();
689
+ return true;
690
+ }
691
+
692
+ /** @this {UiShellContext} */
693
+ function syncPreviewHeadingFoldButtons() {
694
+ const headings = this.elements.previewContent?.querySelectorAll?.('h1, h2, h3, h4, h5, h6') ?? [];
695
+
696
+ Array.from(headings).forEach((heading) => {
697
+ if (!(heading instanceof HTMLElement)) {
698
+ return;
699
+ }
700
+
701
+ const headingLabel = getHeadingLinkLabel(heading);
702
+ let button = heading.querySelector(':scope > .preview-heading-fold-button');
703
+ if (!(button instanceof HTMLButtonElement)) {
704
+ button = document.createElement('button');
705
+ button.type = 'button';
706
+ button.className = 'ui-icon-button preview-heading-fold-button';
707
+ heading.prepend(button);
708
+ }
709
+
710
+ const collapsed = heading.dataset.previewHeadingCollapsed === 'true';
711
+ button.setAttribute('aria-expanded', String(!collapsed));
712
+ button.setAttribute('aria-label', `${collapsed ? 'Expand' : 'Collapse'} ${headingLabel}`);
713
+ button.setAttribute('title', `${collapsed ? 'Expand' : 'Collapse'} section`);
714
+ });
715
+
716
+ applyPreviewHeadingFolds(this.elements.previewContent);
717
+ }
718
+
554
719
  /** @this {UiShellContext} */
555
720
  function syncPreviewHeadingLinkButtons() {
556
721
  const headings = this.elements.previewContent?.querySelectorAll?.('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]') ?? [];
@@ -566,6 +731,7 @@ function syncPreviewHeadingLinkButtons() {
566
731
  button = document.createElement('button');
567
732
  button.type = 'button';
568
733
  button.className = 'ui-icon-button preview-heading-link-button';
734
+ // pi-lens-ignore: no-inner-html-js
569
735
  button.innerHTML = PREVIEW_HEADING_LINK_ICON;
570
736
  heading.appendChild(button);
571
737
  }
@@ -639,6 +805,25 @@ function handlePreviewContentClick(event) {
639
805
  return;
640
806
  }
641
807
 
808
+ const foldButton = event.target.closest('button.preview-heading-fold-button');
809
+ const heading = foldButton?.closest('h1, h2, h3, h4, h5, h6');
810
+ if (foldButton instanceof HTMLButtonElement && heading instanceof HTMLElement) {
811
+ event.preventDefault();
812
+ heading.dataset.previewHeadingCollapsed = String(heading.dataset.previewHeadingCollapsed !== 'true');
813
+ this.syncPreviewHeadingFoldButtons();
814
+ this.scrollSyncController?.invalidatePreviewBlocks?.();
815
+ this.schedulePreviewLayoutSync?.({ delayMs: 0 });
816
+ this.refreshCommentUiLayout?.();
817
+ return;
818
+ }
819
+
820
+ const codeCopyButton = event.target.closest('button.preview-code-copy-button');
821
+ if (codeCopyButton instanceof HTMLButtonElement) {
822
+ event.preventDefault();
823
+ void this.copyPreviewCodeBlock(codeCopyButton);
824
+ return;
825
+ }
826
+
642
827
  const headingLinkButton = event.target.closest('button.preview-heading-link-button[data-preview-heading-anchor]');
643
828
  if (headingLinkButton instanceof HTMLButtonElement) {
644
829
  event.preventDefault();
@@ -748,6 +933,7 @@ function handleThemeChange(theme) {
748
933
  this.session?.applyTheme(theme);
749
934
  this.excalidrawEmbed.updateTheme(theme);
750
935
  this.drawioEmbed.updateTheme(theme);
936
+ this.pdfPreview?.setTheme(theme);
751
937
  }
752
938
 
753
939
  /** @this {UiShellContext} */
@@ -784,6 +970,29 @@ function getStoredLineWrapping() {
784
970
  return this.preferences.getLineWrappingEnabled();
785
971
  }
786
972
 
973
+ /** @this {UiShellContext} */
974
+ async function formatCurrentDocument() {
975
+ const button = this.elements.editorFormatButton;
976
+ button?.setAttribute('disabled', '');
977
+
978
+ try {
979
+ const result = await this.session?.formatDocument?.(this.currentFilePath);
980
+ const messages = {
981
+ changed: 'Document changed while formatting. Try again.',
982
+ formatted: getVaultFileKind(this.currentFilePath) === 'plantuml'
983
+ ? 'PlantUML indentation applied'
984
+ : 'Document formatted',
985
+ unchanged: 'Document is already formatted',
986
+ unsupported: 'Formatting is unavailable for this file type',
987
+ };
988
+ this.toastController.show(messages[result] ?? messages.unsupported);
989
+ } catch (error) {
990
+ this.toastController.show(`Formatting failed: ${error?.message || 'Unknown error'}`, 5000);
991
+ } finally {
992
+ button?.removeAttribute('disabled');
993
+ }
994
+ }
995
+
787
996
  /** @this {UiShellContext} */
788
997
  function toggleVimMode() {
789
998
  const currentState = this.session?.isVimModeEnabled?.() ?? this.getStoredVimMode();
@@ -854,13 +1063,17 @@ function hideEditorLoading() {
854
1063
  }
855
1064
 
856
1065
  /** @this {UiShellContext} */
857
- function showEditorLoadError() {
1066
+ function showEditorLoadError(message = 'Failed to load file') {
858
1067
  if (!this.elements.editorContainer) return;
1068
+ const loading = document.createElement('div');
1069
+ const text = document.createElement('span');
1070
+ loading.className = 'editor-loading';
1071
+ loading.id = 'editorLoading';
1072
+ text.className = 'loading-text';
1073
+ text.textContent = message;
1074
+ loading.appendChild(text);
859
1075
  this.elements.editorContainer.classList.remove('is-loading-editor');
860
- this.elements.editorContainer.innerHTML = `
861
- <div class="editor-loading" id="editorLoading">
862
- <span class="loading-text">Failed to load file</span>
863
- </div>`;
1076
+ this.elements.editorContainer.replaceChildren(loading);
864
1077
  }
865
1078
 
866
1079
  /** @this {UiShellContext} */
@@ -873,8 +1086,11 @@ export const uiFeatureShellMethods = {
873
1086
  bindEvents,
874
1087
  clearInitialFileBootstrap,
875
1088
  closeToolbarOverflowMenu,
1089
+ copyPreviewCodeBlock,
876
1090
  copyPreviewHeadingLink,
877
1091
  createPreviewHeadingLinkUrl,
1092
+ focusEditor,
1093
+ formatCurrentDocument,
878
1094
  getStoredLineWrapping,
879
1095
  getStoredVimMode,
880
1096
  handleConnectionChange,
@@ -894,6 +1110,8 @@ export const uiFeatureShellMethods = {
894
1110
  setToolbarOverflowOpen,
895
1111
  showEditorLoadError,
896
1112
  showEditorLoading,
1113
+ syncPreviewCodeCopyButtons,
1114
+ syncPreviewHeadingFoldButtons,
897
1115
  syncPreviewHeadingLinkButtons,
898
1116
  syncVisualViewportBounds,
899
1117
  syncToolbarOverflowVisibility,
@@ -901,5 +1119,6 @@ export const uiFeatureShellMethods = {
901
1119
  syncWrapToggle,
902
1120
  toggleToolbarOverflowMenu,
903
1121
  toggleLineWrapping,
1122
+ unfoldPreviewHeading,
904
1123
  toggleVimMode,
905
1124
  };
@@ -37,8 +37,10 @@ export function bindAppShellElements(doc = document) {
37
37
  displayNameTitle: doc.getElementById('displayNameTitle'),
38
38
  editNameButton: doc.getElementById('editNameBtn'),
39
39
  editorFindButton: doc.getElementById('editorFindBtn'),
40
+ editorFormatButton: doc.getElementById('editorFormatBtn'),
40
41
  editorContainer: doc.getElementById('editorContainer'),
41
42
  exportDocxButton: doc.getElementById('exportDocxBtn'),
43
+ exportHtmlButton: doc.getElementById('exportHtmlBtn'),
42
44
  exportMenuGroup: doc.getElementById('exportMenuGroup'),
43
45
  exportPdfButton: doc.getElementById('exportPdfBtn'),
44
46
  markdownToolbar: doc.getElementById('markdownToolbar'),
@@ -54,12 +56,15 @@ export function bindAppShellElements(doc = document) {
54
56
  gitOperationStatus: doc.getElementById('gitOperationStatus'),
55
57
  lineInfo: doc.getElementById('lineInfo'),
56
58
  mobileViewToggle: doc.getElementById('mobileViewToggle'),
59
+ htmlPreviewMaximizeButton: doc.getElementById('htmlPreviewMaximize'),
57
60
  previewContent: doc.getElementById('previewContent'),
58
61
  previewContainer: doc.getElementById('previewContainer'),
62
+ reviewFileChangesButton: doc.getElementById('reviewFileChangesBtn'),
59
63
  presencePanel: doc.getElementById('presencePanel'),
60
64
  presencePanelList: doc.getElementById('presencePanelList'),
61
65
  presencePanelStatus: doc.getElementById('presencePanelStatus'),
62
66
  searchFilesButton: doc.getElementById('searchFilesBtn'),
67
+ skipToEditor: doc.getElementById('skipToEditor'),
63
68
  toolbarSearchButton: doc.getElementById('toolbarSearchBtn'),
64
69
  shareButton: doc.getElementById('shareBtn'),
65
70
  toastContainer: doc.getElementById('toastContainer'),