collabmd 0.1.48 → 0.1.51

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 (482) hide show
  1. package/README.md +15 -608
  2. package/bin/collabmd.js +39 -20
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
  4. package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +1 -0
  5. package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
  6. package/dist/client/assets/{architectureDiagram-5GKGNRK7-I39sYjHI.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +3 -3
  7. package/dist/client/assets/az-AZ-V5EUQD6C-C19OGTT_.js +1 -0
  8. package/dist/client/assets/bg-BG-EXASCMTR-BIt0xWyb.js +5 -0
  9. package/dist/client/assets/{blockDiagram-NRAW4CY4-C6DtJy5Y.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +4 -4
  10. package/dist/client/assets/bn-BD-U4SYNFCO-CdNaPy4Q.js +3 -0
  11. package/dist/client/assets/bn-IN-HKDJIITE-CdNaPy4Q.js +3 -0
  12. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js → browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js} +1 -1
  13. package/dist/client/assets/browser-utils-DbXSMI-6.js +1 -0
  14. package/dist/client/assets/{c4Diagram-UCG6FXSJ-CtWtxS9_.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
  15. package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
  16. package/dist/client/assets/channel-jwdhnPiV.js +1 -0
  17. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
  18. package/dist/client/assets/{chunk-TEH6E4GO-DVayPj-q.js → chunk-4HAMMTFA-Ht-73lsT.js} +20 -20
  19. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
  20. package/dist/client/assets/{chunk-75Z2AOVW-CdFSaPjz.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
  21. package/dist/client/assets/{chunk-CLGD4ZFX-DQLgbQrv.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
  22. package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +127 -0
  23. package/dist/client/assets/{chunk-F27PBJKO-CNHIFhjo.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
  24. package/dist/client/assets/{chunk-GMAD6QVW-CbcBqPM5.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
  25. package/dist/client/assets/{chunk-OBVCFTLP-BJR7u1jh.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
  26. package/dist/client/assets/{chunk-G27WJ6UU-D9-eg537.js → chunk-IMKFNOWR-3F6NhHUP.js} +2 -2
  27. package/dist/client/assets/{chunk-JQ64N6SF-DSFNH4bh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
  28. package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +10 -0
  29. package/dist/client/assets/{chunk-P2QGCYS3-BRpqY32H.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
  30. package/dist/client/assets/{chunk-POPQ4Y6H-Cb4SlVZF.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
  31. package/dist/client/assets/{chunk-PWAF6VOD-Cz8IwBB5.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
  32. package/dist/client/assets/{chunk-RHFEMEQ7-CWY8cf4H.js → chunk-SHT3W25Y-BKaI8jZO.js} +5 -5
  33. package/dist/client/assets/{chunk-SVP7TREG-CyHOmcac.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
  34. package/dist/client/assets/{chunk-LCL6LL3I-DmDkVukh.js → chunk-TICWLB2K-Cpp2z8yK.js} +4 -4
  35. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
  36. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
  37. package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
  38. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
  39. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
  40. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
  41. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
  42. package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
  43. package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
  44. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CdTPi2yO.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
  45. package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
  46. package/dist/client/assets/{dagre-3AP2YEHR-5gtJtd0O.js → dagre-GXQ25YYZ-BSfKCfy7.js} +2 -2
  47. package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
  48. package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
  49. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
  50. package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
  51. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
  52. package/dist/client/assets/{diagram-S7CK7UJ4-BudWz9WU.js → diagram-S7CK7UJ4-D7KaM9yj.js} +2 -2
  53. package/dist/client/assets/{diagram-UQ7AKVKN-3v4rbH-s.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
  54. package/dist/client/assets/diagram-VSXAHHWV-B3-U-Q2E.js +3 -0
  55. package/dist/client/assets/{diagram-VX7I27RA-C_-rj0sw.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
  56. package/dist/client/assets/{diagram-Z3DM3KII-B4yxavgj.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
  57. package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
  58. package/dist/client/assets/dist-B3HdUPsK.js +1 -0
  59. package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
  60. package/dist/client/assets/dist-BIRygGYH.js +1 -0
  61. package/dist/client/assets/dist-BPyOlNLY.js +2 -0
  62. package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
  63. package/dist/client/assets/{dist-Bw3VIE_v.js → dist-B_B4XLmq.js} +1 -1
  64. package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
  65. package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
  66. package/dist/client/assets/{dist-CietwTVS.js → dist-Bx3QkS-3.js} +1 -1
  67. package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
  68. package/dist/client/assets/dist-ByhQbe-x.js +1 -0
  69. package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
  70. package/dist/client/assets/dist-C5NkYKAa.js +1 -0
  71. package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
  72. package/dist/client/assets/dist-CEirJSxk.js +1 -0
  73. package/dist/client/assets/dist-CO0-4CuV.js +39 -0
  74. package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
  75. package/dist/client/assets/{dist-DDUn5zTz.js → dist-CbDyXgCo.js} +1 -1
  76. package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
  77. package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
  78. package/dist/client/assets/dist-CyNrloSI.js +1 -0
  79. package/dist/client/assets/dist-D60_kdpQ.js +1 -0
  80. package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
  81. package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
  82. package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
  83. package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
  84. package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
  85. package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
  86. package/dist/client/assets/{dist-B_yQaEv_.js → dist-gRRhmB-2.js} +3 -3
  87. package/dist/client/assets/dist-kWb2d1CH.js +1 -0
  88. package/dist/client/assets/dist-kiD2GIsD.js +13 -0
  89. package/dist/client/assets/dist-l-56SowH.js +19 -0
  90. package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
  91. package/dist/client/assets/dist-sLzRQQk7.js +1 -0
  92. package/dist/client/assets/{document-formatter-Dxl_a8XO.js → document-formatter-Qdiq9uJs.js} +1 -2
  93. package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +1 -0
  95. package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
  96. package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
  97. package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
  98. package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
  99. package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
  100. package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
  101. package/dist/client/assets/{erDiagram-SSCWMZ5O-C-iy6VkX.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +2 -2
  102. package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
  103. package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
  104. package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
  105. package/dist/client/assets/{excalidraw-scene-BOben2gr.js → excalidraw-scene-6uROebca.js} +1 -1
  106. package/dist/client/assets/{excalidraw-editor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
  107. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
  108. package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
  109. package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
  110. package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
  111. package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
  112. package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
  113. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
  114. package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
  115. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DtKHAbez.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
  116. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-oue8fQ5o.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
  117. package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
  118. package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
  119. package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
  120. package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
  121. package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
  122. package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
  123. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
  124. package/dist/client/assets/index-BAmZnTFV.css +1 -0
  125. package/dist/client/assets/index-mWiw418b.js +1111 -0
  126. package/dist/client/assets/{infoDiagram-RXCK75RN-BMzo6KIn.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
  127. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIM3h287.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
  128. package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
  129. package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
  130. package/dist/client/assets/{journeyDiagram-EYS64GPL-mF6Lh8O-.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +2 -2
  131. package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
  132. package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
  133. package/dist/client/assets/{kanban-definition-3QL26DDD-DLN2NyoR.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +4 -4
  134. package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
  135. package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
  136. package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
  137. package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
  138. package/dist/client/assets/{line-BfTWJmgf.js → line-DSWLHgpx.js} +1 -1
  139. package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
  140. package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
  141. package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
  142. package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
  143. package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
  144. package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
  145. package/dist/client/assets/mermaid.core-D0cMM4Rl.js +10 -0
  146. package/dist/client/assets/{mindmap-definition-FBJOCRG2-CRyHaHTk.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +8 -8
  147. package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
  148. package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
  149. package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
  150. package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
  151. package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
  152. package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
  153. package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
  154. package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +1 -0
  155. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
  156. package/dist/client/assets/{pieDiagram-E7YTZNPT-B5OZPb88.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
  157. package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
  158. package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
  159. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
  160. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
  161. package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
  162. package/dist/client/assets/prod-D5TxmmoB.js +1 -0
  163. package/dist/client/assets/prod-pbFU4TaM.js +145 -0
  164. package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
  165. package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
  166. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Drrw14YH.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
  167. package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
  168. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
  169. package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +1 -0
  170. package/dist/client/assets/{requirementDiagram-EFPCY7ZU-CRZG6mRB.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +2 -2
  171. package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
  172. package/dist/client/assets/room-DX7lIfnu.js +1 -0
  173. package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
  174. package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
  175. package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
  176. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DvarEJpo.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
  177. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B4oWlb-w.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +6 -6
  178. package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
  179. package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
  180. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
  181. package/dist/client/assets/{stateDiagram-HBIQ2CUA-qbHIIqRZ.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
  182. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
  183. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
  184. package/dist/client/assets/{swimlanes-XN3QIQJK-xB6CtUGj.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
  185. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
  186. package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
  187. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-Lj_yTNlY.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
  189. package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
  190. package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
  191. package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
  192. package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
  193. package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
  194. package/dist/client/assets/{vennDiagram-4TSXK5OY-BekRp5Y0.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
  195. package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
  196. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-kdnV_Hdm.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
  197. package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +1 -0
  198. package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
  199. package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
  200. package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DufGwNSB.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
  202. package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
  203. package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
  204. package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
  205. package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
  206. package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
  207. package/dist/client/drawio-editor.html +12 -5
  208. package/dist/client/excalidraw-editor.html +46 -5
  209. package/dist/client/export-document.html +6 -8
  210. package/dist/client/index.html +79 -43
  211. package/package.json +39 -36
  212. package/src/client/app/drawio-editor.html +3 -3
  213. package/src/client/app/excalidraw-editor.html +3 -3
  214. package/src/client/app/export-document.html +2 -2
  215. package/src/client/app/index.html +77 -37
  216. package/src/client/app/main-entry.js +13 -17
  217. package/src/client/application/app-shell/chat-feature.js +7 -22
  218. package/src/client/application/app-shell/comments-feature.js +6 -0
  219. package/src/client/application/app-shell/git-feature.js +23 -5
  220. package/src/client/application/app-shell/presence-feature.js +8 -25
  221. package/src/client/application/app-shell/ui-feature-shell.js +172 -149
  222. package/src/client/application/app-shell/ui-feature-sidebar.js +43 -7
  223. package/src/client/application/app-shell/ui-feature-tab-activity.js +27 -9
  224. package/src/client/application/app-shell/ui-feature-toolbar.js +16 -129
  225. package/src/client/application/app-shell-elements.js +9 -0
  226. package/src/client/application/highlight-theme.js +16 -0
  227. package/src/client/application/preview-render-compiler.js +44 -107
  228. package/src/client/application/preview-render-executor.js +0 -26
  229. package/src/client/application/preview-render-scheduler.js +8 -24
  230. package/src/client/application/preview-renderer.js +26 -9
  231. package/src/client/application/webmcp-diagram-renderer.js +47 -0
  232. package/src/client/application/workspace-coordinator.js +23 -22
  233. package/src/client/application/workspace-route-controller.js +7 -0
  234. package/src/client/bootstrap/collabmd-app-shell.js +148 -35
  235. package/src/client/bootstrap/lazy-collab-clients.js +90 -0
  236. package/src/client/domain/excalidraw-element-link.js +73 -0
  237. package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
  238. package/src/client/domain/excalidraw-scene.js +21 -0
  239. package/src/client/domain/hash-routes.js +13 -0
  240. package/src/client/domain/highlight-runtime.js +47 -0
  241. package/src/client/domain/lobby-chat.js +2 -0
  242. package/src/client/domain/room.js +1 -5
  243. package/src/client/domain/runtime-paths.js +61 -7
  244. package/src/client/domain/vault-utils.js +11 -0
  245. package/src/client/excalidraw-editor.js +155 -14
  246. package/src/client/export/export-host.js +3 -1
  247. package/src/client/export/export-pipeline.js +4 -17
  248. package/src/client/infrastructure/agent-connection-api-client.js +23 -0
  249. package/src/client/infrastructure/auth-client.js +4 -15
  250. package/src/client/infrastructure/browser-preferences-port.js +16 -0
  251. package/src/client/infrastructure/editor-session.js +11 -0
  252. package/src/client/infrastructure/editor-view-adapter.js +56 -8
  253. package/src/client/infrastructure/excalidraw-room-client.js +89 -2
  254. package/src/client/infrastructure/git-api-client.js +39 -33
  255. package/src/client/infrastructure/hosted-api-client.js +60 -0
  256. package/src/client/infrastructure/lobby-presence.js +4 -7
  257. package/src/client/infrastructure/runtime-config.js +14 -2
  258. package/src/client/infrastructure/tab-activity-lock.js +2 -5
  259. package/src/client/infrastructure/vault-api-client.js +33 -26
  260. package/src/client/infrastructure/webmcp-tool-registry.js +297 -0
  261. package/src/client/infrastructure/workspace-sync-client.js +6 -4
  262. package/src/client/presentation/agent-connection-controller.js +255 -0
  263. package/src/client/presentation/backlinks-panel.js +3 -0
  264. package/src/client/presentation/bases-preview-controller.js +27 -18
  265. package/src/client/presentation/comment-markdown-renderer.js +2 -14
  266. package/src/client/presentation/comment-overview-controller.js +1 -2
  267. package/src/client/presentation/comment-ui/comment-ui-card.js +4 -2
  268. package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
  269. package/src/client/presentation/create-menu-presenter.js +19 -16
  270. package/src/client/presentation/excalidraw-embed-controller.js +164 -4
  271. package/src/client/presentation/file-explorer-controller.js +3 -0
  272. package/src/client/presentation/file-explorer-view.js +338 -182
  273. package/src/client/presentation/file-history-view-controller.js +13 -11
  274. package/src/client/presentation/git-diff-view-controller.js +35 -43
  275. package/src/client/presentation/git-panel-controller.js +78 -28
  276. package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
  277. package/src/client/presentation/image-lightbox-controller.js +20 -16
  278. package/src/client/presentation/layout-controller.js +13 -2
  279. package/src/client/presentation/quick-switcher-controller.js +20 -78
  280. package/src/client/presentation/quick-switcher-text-search.js +10 -14
  281. package/src/client/presentation/team-settings-controller.js +228 -0
  282. package/src/client/styles/components/navigation.css +1 -2
  283. package/src/client/styles/deferred-collab.css +5 -0
  284. package/src/client/styles/deferred-git.css +7 -0
  285. package/src/client/styles/deferred-preview.css +6 -0
  286. package/src/client/styles/features/agent-connection.css +202 -0
  287. package/src/client/styles/features/collaboration-chat.css +8 -1
  288. package/src/client/styles/features/collaboration-dialogs.css +16 -1
  289. package/src/client/styles/features/collaboration-presence.css +17 -4
  290. package/src/client/styles/features/diagram-preview.css +0 -15
  291. package/src/client/styles/features/diff-toolbar.css +1 -1
  292. package/src/client/styles/features/media-lightbox.css +12 -3
  293. package/src/client/styles/features/outline.css +4 -2
  294. package/src/client/styles/features/preview-markdown.css +25 -11
  295. package/src/client/styles/features/quick-switcher.css +20 -11
  296. package/src/client/styles/features/team-settings.css +162 -0
  297. package/src/client/styles/foundation/themes.css +2 -0
  298. package/src/client/styles/foundation/tokens.css +2 -2
  299. package/src/client/styles/layout/editor-page.css +25 -24
  300. package/src/client/styles/layout/overlays.css +16 -0
  301. package/src/client/styles/layout/responsive.css +7 -25
  302. package/src/client/styles/layout/shell.css +21 -1
  303. package/src/client/styles/layout/sidebar.css +99 -7
  304. package/src/client/styles/primitives/controls.css +21 -54
  305. package/src/client/styles/style.css +4 -19
  306. package/src/domain/agent-tool-definitions.js +872 -0
  307. package/src/domain/collabmd-content-capabilities.js +149 -0
  308. package/src/domain/collaboration-protocol.js +2 -0
  309. package/src/domain/comment-threads.js +3 -5
  310. package/src/domain/diagram-source.js +50 -0
  311. package/src/domain/editable-content-revision.js +10 -0
  312. package/src/domain/editable-text.js +3 -0
  313. package/src/domain/exact-text-edits.js +69 -0
  314. package/src/domain/excalidraw-agent-scene.js +624 -0
  315. package/src/domain/excalidraw-agent-verification.js +554 -0
  316. package/src/domain/excalidraw-room-codec.js +13 -6
  317. package/src/domain/literal-text-search.js +13 -0
  318. package/src/domain/video-embed.js +76 -0
  319. package/src/server/application/agent-connection-service.js +178 -0
  320. package/src/server/application/agent-content-service.js +841 -0
  321. package/src/server/application/workspace-reconciliation.js +5 -7
  322. package/src/server/config/env.js +147 -6
  323. package/src/server/create-app-server.js +47 -141
  324. package/src/server/domain/bases/base-query-service.js +1 -5
  325. package/src/server/domain/collaboration/collaboration-room.js +121 -25
  326. package/src/server/domain/collaboration/protocol.js +4 -0
  327. package/src/server/domain/hosted-workspace.js +31 -1
  328. package/src/server/domain/markdown-reference-extractor.js +15 -1
  329. package/src/server/domain/ripgrep-search-service.js +68 -21
  330. package/src/server/infrastructure/git/git-service.js +19 -1
  331. package/src/server/infrastructure/git/history-service.js +1 -1
  332. package/src/server/infrastructure/git/local-exclude.js +37 -0
  333. package/src/server/infrastructure/git/parsers.js +19 -17
  334. package/src/server/infrastructure/git/path-utils.js +0 -16
  335. package/src/server/infrastructure/git/status-service.js +1 -1
  336. package/src/server/infrastructure/git/untracked-files.js +12 -21
  337. package/src/server/infrastructure/http/create-agent-api-handler.js +171 -0
  338. package/src/server/infrastructure/http/create-git-api-command-handler.js +32 -0
  339. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
  340. package/src/server/infrastructure/http/create-request-handler.js +123 -26
  341. package/src/server/infrastructure/http/create-static-handler.js +9 -0
  342. package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
  343. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +200 -0
  344. package/src/server/infrastructure/persistence/agent-connection-store.js +120 -0
  345. package/src/server/infrastructure/persistence/pull-backup-store.js +2 -27
  346. package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
  347. package/src/server/infrastructure/persistence/vault-file-store.js +11 -5
  348. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
  349. package/src/server/shared/agent-tool-image.js +22 -0
  350. package/src/server/shared/agent-tool-rate-limiter.js +27 -0
  351. package/src/server/startup/git-remote-bootstrap.js +58 -79
  352. package/src/server/vault-registry.js +251 -0
  353. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +0 -1
  354. package/dist/client/assets/abnfDiagram-VCTEODGH-BNDLzJ7L.js +0 -1
  355. package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
  356. package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
  357. package/dist/client/assets/base-CaIEJUF9.css +0 -1
  358. package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
  359. package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
  360. package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
  361. package/dist/client/assets/browser-utils--H_DkyEF.js +0 -1
  362. package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
  363. package/dist/client/assets/channel-CaoKA_We.js +0 -1
  364. package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
  365. package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +0 -2
  366. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +0 -2
  367. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +0 -127
  368. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +0 -10
  369. package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +0 -41
  370. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +0 -1
  371. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +0 -1
  372. package/dist/client/assets/comment-thread-store-CdcwrObc.js +0 -1
  373. package/dist/client/assets/comment-threads-9J6Em-_y.js +0 -4
  374. package/dist/client/assets/comment-ui-shared-DuoyznXW.js +0 -7
  375. package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
  376. package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
  377. package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
  378. package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
  379. package/dist/client/assets/diagram-VSXAHHWV-CQRVEZR7.js +0 -3
  380. package/dist/client/assets/dist-73RPdcyU.js +0 -1
  381. package/dist/client/assets/dist-BJ1bJs33.js +0 -1
  382. package/dist/client/assets/dist-ByrG2qBA.js +0 -1
  383. package/dist/client/assets/dist-CH-sQu3r.js +0 -1
  384. package/dist/client/assets/dist-CKS_-are.js +0 -1
  385. package/dist/client/assets/dist-D37Hyu3h.js +0 -9
  386. package/dist/client/assets/dist-DZAAWTG-.js +0 -1
  387. package/dist/client/assets/dist-Dir5dDKZ.js +0 -1
  388. package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
  389. package/dist/client/assets/dist-DutPuFmC.js +0 -1
  390. package/dist/client/assets/dist-RKBTaQMb.js +0 -13
  391. package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
  392. package/dist/client/assets/drawio-editor-BVaNNtYp.js +0 -9
  393. package/dist/client/assets/drawioEditor-BkIBlXx0.js +0 -2
  394. package/dist/client/assets/ebnfDiagram-PWID7BFC-OXa8VEp1.js +0 -1
  395. package/dist/client/assets/editor-session-DMyVdHLj.js +0 -54
  396. package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
  397. package/dist/client/assets/embedded-editor-base-B3l6Xy65.css +0 -1
  398. package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
  399. package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
  400. package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +0 -9
  401. package/dist/client/assets/excalidraw-mermaid-stub-BNckbX2n.js +0 -1
  402. package/dist/client/assets/excalidraw-mermaid-stub-DE5FTiZB.js +0 -1
  403. package/dist/client/assets/excalidrawEditor-ChqF_d82.js +0 -2
  404. package/dist/client/assets/export-page-Dyu0XCbu.js +0 -57
  405. package/dist/client/assets/exportDocument-CJBx4Xjx.css +0 -1
  406. package/dist/client/assets/exportDocument-Dgvfa2Sd.js +0 -2
  407. package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
  408. package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
  409. package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
  410. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +0 -1
  411. package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
  412. package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
  413. package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
  414. package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
  415. package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
  416. package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
  417. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +0 -1
  418. package/dist/client/assets/index-CSNIMyOP.css +0 -1
  419. package/dist/client/assets/index-DG3N2Ps-.js +0 -2
  420. package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
  421. package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
  422. package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
  423. package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
  424. package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
  425. package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
  426. package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
  427. package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
  428. package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
  429. package/dist/client/assets/main-D0wCxpVn.js +0 -903
  430. package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
  431. package/dist/client/assets/mermaid.core-BJRLUQZE.js +0 -11
  432. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
  433. package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
  434. package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
  435. package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
  436. package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
  437. package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
  438. package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
  439. package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
  440. package/dist/client/assets/pegDiagram-XKGWAZYB-B31fKPR2.js +0 -1
  441. package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
  442. package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
  443. package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
  444. package/dist/client/assets/preview-render-compiler-CrJIooVD.js +0 -35
  445. package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +0 -1
  446. package/dist/client/assets/preview-render-profile-B4RWYWHt.js +0 -1
  447. package/dist/client/assets/preview-render-worker-_QTxqKvP.js +0 -60
  448. package/dist/client/assets/prod-BiYPMR1i.js +0 -177
  449. package/dist/client/assets/prod-VxdGZ5Ly.js +0 -1
  450. package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
  451. package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
  452. package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +0 -1
  453. package/dist/client/assets/railroadDiagram-O6MQD6OU-BPifP0MB.js +0 -1
  454. package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
  455. package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
  456. package/dist/client/assets/runtime-config-BLrEKVO1.js +0 -1
  457. package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
  458. package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
  459. package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
  460. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +0 -1
  461. package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
  462. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +0 -8
  463. package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
  464. package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
  465. package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
  466. package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
  467. package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
  468. package/dist/client/assets/vault-api-client-BkwdFjx0.js +0 -6
  469. package/dist/client/assets/vault-utils-DvoSftJT.js +0 -22
  470. package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
  471. package/dist/client/assets/yjs-provider-reset-guard-DE0vINDP.js +0 -4
  472. package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
  473. package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
  474. package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
  475. package/src/client/app/drawio-editor-entry.js +0 -1
  476. package/src/client/app/excalidraw-editor-entry.js +0 -1
  477. package/src/client/excalidraw-mermaid-stub.js +0 -7
  478. package/src/client/main.js +0 -16
  479. /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
  480. /package/dist/client/assets/{drawio-editor-UQQ8XHou.css → drawioEditor-UQQ8XHou.css} +0 -0
  481. /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
  482. /package/dist/client/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -132,7 +132,7 @@ export const gitFeature = {
132
132
 
133
133
  button.classList.remove('hidden');
134
134
  if (mode === 'history-preview') {
135
- label.textContent = 'Back to History';
135
+ label.textContent = 'Back to history';
136
136
  button.setAttribute('aria-label', 'Back to file history');
137
137
  button.title = 'Back to file history';
138
138
  return;
@@ -326,6 +326,10 @@ export const gitFeature = {
326
326
  return await this.gitApiClient.stageFile({ path: payload.path, requestId });
327
327
  case 'unstage':
328
328
  return await this.gitApiClient.unstageFile({ path: payload.path, requestId });
329
+ case 'stage-all':
330
+ return await this.gitApiClient.stageAll({ requestId });
331
+ case 'unstage-all':
332
+ return await this.gitApiClient.unstageAll({ requestId });
329
333
  case 'push':
330
334
  return await this.gitApiClient.pushBranch({ requestId });
331
335
  case 'pull':
@@ -534,6 +538,20 @@ export const gitFeature = {
534
538
  });
535
539
  },
536
540
 
541
+ async stageAllGitFiles() {
542
+ await this.runGitActionWithStatus('Staging all changes...', async () => {
543
+ const result = await this.postGitAction('stage-all', {});
544
+ await this.finalizeGitAction({ action: 'stage-all', preferredScope: 'staged', result });
545
+ });
546
+ },
547
+
548
+ async unstageAllGitFiles() {
549
+ await this.runGitActionWithStatus('Unstaging all changes...', async () => {
550
+ const result = await this.postGitAction('unstage-all', {});
551
+ await this.finalizeGitAction({ action: 'unstage-all', preferredScope: 'working-tree', result });
552
+ });
553
+ },
554
+
537
555
  async pushGitBranch() {
538
556
  await this.runGitActionWithStatus('Pushing branch...', async () => {
539
557
  try {
@@ -595,7 +613,7 @@ export const gitFeature = {
595
613
  }
596
614
  this.elements.gitResetFileName.value = filePath;
597
615
  if (this.elements.gitResetSubmit) {
598
- this.elements.gitResetSubmit.textContent = 'Reset File';
616
+ this.elements.gitResetSubmit.textContent = 'Reset file';
599
617
  }
600
618
  this.elements.gitResetSubmit?.toggleAttribute('disabled', false);
601
619
 
@@ -619,10 +637,10 @@ export const gitFeature = {
619
637
 
620
638
  submit?.toggleAttribute('disabled', true);
621
639
  if (submit) {
622
- submit.textContent = 'Resetting...';
640
+ submit.textContent = 'Resetting';
623
641
  }
624
642
  try {
625
- await this.runGitActionWithStatus('Resetting file...', async () => {
643
+ await this.runGitActionWithStatus('Resetting file', async () => {
626
644
  const result = await this.postGitAction('reset-file', { path: filePath });
627
645
  await this.finalizeGitAction({
628
646
  action: 'reset',
@@ -636,7 +654,7 @@ export const gitFeature = {
636
654
  this.toastController.show(error.message || 'Failed to reset file');
637
655
  } finally {
638
656
  if (submit) {
639
- submit.textContent = 'Reset File';
657
+ submit.textContent = 'Reset file';
640
658
  }
641
659
  submit?.toggleAttribute('disabled', false);
642
660
  }
@@ -84,12 +84,10 @@ export const presenceFeature = {
84
84
  const effectiveConnectionState = getConnectedPresenceState(this);
85
85
  const hasUsers = this.globalUsers.length > 0;
86
86
  if (effectiveConnectionState.status !== 'connected') {
87
- this.presencePanelOpen = false;
87
+ this.closePresencePanel();
88
88
  }
89
89
 
90
90
  badge.type = 'button';
91
- badge.setAttribute('aria-controls', 'presencePanel');
92
- badge.setAttribute('aria-expanded', String(this.presencePanelOpen));
93
91
  badge.classList.toggle('is-active', this.presencePanelOpen);
94
92
 
95
93
  if (effectiveConnectionState.status === 'connected') {
@@ -173,12 +171,9 @@ export const presenceFeature = {
173
171
  overflow.className = 'user-avatar user-avatar-button user-avatar-overflow-trigger';
174
172
  overflow.style.backgroundColor = 'var(--color-surface-dynamic)';
175
173
  overflow.style.color = 'var(--color-text-muted)';
176
- overflow.setAttribute('aria-controls', 'presencePanel');
177
- overflow.setAttribute('aria-expanded', String(this.presencePanelOpen));
174
+ overflow.setAttribute('popovertarget', 'presencePanel');
178
175
  overflow.setAttribute('aria-label', `Show ${visibleUsers.length} online users`);
179
- overflow.setAttribute('data-presence-panel-trigger', 'true');
180
176
  overflow.title = `Show ${visibleUsers.length} online users`;
181
- overflow.addEventListener('click', () => this.openPresencePanel());
182
177
  const overflowLabel = document.createElement('span');
183
178
  overflowLabel.className = 'user-avatar-initial';
184
179
  overflowLabel.textContent = `+${visibleUsers.length - MAX_INLINE_AVATARS}`;
@@ -194,29 +189,19 @@ export const presenceFeature = {
194
189
  }
195
190
 
196
191
  this.presencePanelOpen = true;
197
- this.closeChatPanel?.();
198
- this.closeToolbarOverflowMenu?.();
192
+ if (!this.elements.presencePanel?.matches(':popover-open')) {
193
+ this.elements.presencePanel?.showPopover();
194
+ }
199
195
  this.renderAvatars();
200
196
  this.renderPresence();
201
197
  },
202
198
 
203
199
  closePresencePanel() {
204
- if (!this.presencePanelOpen) {
205
- return;
200
+ if (this.elements.presencePanel?.matches(':popover-open')) {
201
+ this.elements.presencePanel.hidePopover();
206
202
  }
207
-
208
203
  this.presencePanelOpen = false;
209
- this.renderAvatars();
210
- this.renderPresence();
211
- },
212
-
213
- togglePresencePanel() {
214
- if (this.presencePanelOpen) {
215
- this.closePresencePanel();
216
- return;
217
- }
218
-
219
- this.openPresencePanel();
204
+ this.renderAvatars?.();
220
205
  },
221
206
 
222
207
  renderPresencePanel() {
@@ -225,8 +210,6 @@ export const presenceFeature = {
225
210
  const status = this.elements.presencePanelStatus;
226
211
  if (!panel || !list) return;
227
212
 
228
- panel.classList.toggle('hidden', !this.presencePanelOpen);
229
- panel.setAttribute('aria-hidden', String(!this.presencePanelOpen));
230
213
  if (!this.presencePanelOpen) {
231
214
  return;
232
215
  }
@@ -1,6 +1,6 @@
1
1
  import { getVaultFileKind, supportsBacklinksForFilePath } from '../../../domain/file-kind.js';
2
2
  import { isPlainQuickSwitcherShortcut } from '../../domain/keyboard-shortcuts.js';
3
- import { createFileRouteHash, isCollabMdHashRoute } from '../../domain/hash-routes.js';
3
+ import { createFileRouteHash, isCollabMdHashRoute, isGitHashRouteType } 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;
@@ -48,14 +48,13 @@ const PREVIEW_HEADING_LINK_ICON = `
48
48
  */
49
49
 
50
50
  /** @this {UiShellContext} */
51
- function initialize() {
51
+ async function initialize() {
52
+ await this.hostedGateController?.initialize();
52
53
  this.initializeExportBridge?.();
53
54
  this.renderMarkdownToolbar?.();
54
55
  this.initializeVisualViewportBinding?.();
55
56
  this.themeController.initialize();
56
57
  this.previewRenderer.applyTheme(this.themeController.getTheme());
57
- this.previewRenderer.scheduleWorkerPrewarm();
58
- this.scheduleEditorSessionPrewarm?.();
59
58
  this.outlineController.initialize();
60
59
  this.layoutController.initialize();
61
60
  this.scrollSyncController.initialize();
@@ -87,17 +86,24 @@ function initialize() {
87
86
  this.syncToolbarOverflowVisibility?.();
88
87
  });
89
88
 
89
+ if (this.runtimeConfig?.gitEnabled !== false) {
90
+ this.gitRepoAvailable = true;
91
+ this.elements.gitSidebarTab?.classList.remove('hidden');
92
+ this.elements.sidebarTabs?.classList.remove('hidden');
93
+ }
94
+
90
95
  this.fileExplorerReadyPromise = this.fileExplorer.refresh().then(() => {
91
96
  this.fileExplorerReady = true;
92
97
  void this.commentsOverview?.refresh?.();
93
- if (this.runtimeConfig?.gitEnabled !== false) {
94
- void this.gitPanel.refresh({ force: true });
98
+ if (isGitHashRouteType(this.navigation.getHashRoute().type)) {
99
+ void this.gitPanel.refresh({ force: false });
95
100
  }
96
101
  if (this.isTabActive) {
97
102
  return this.workspaceRouteController.handleHashChange();
98
103
  }
99
104
  return undefined;
100
105
  });
106
+
101
107
  }
102
108
 
103
109
  /** @this {UiShellContext} */
@@ -247,7 +253,7 @@ function bindDialogEvents() {
247
253
  this.elements.gitResetFileName.value = '';
248
254
  }
249
255
  if (this.elements.gitResetSubmit) {
250
- this.elements.gitResetSubmit.textContent = 'Reset File';
256
+ this.elements.gitResetSubmit.textContent = 'Reset file';
251
257
  }
252
258
  });
253
259
 
@@ -294,13 +300,24 @@ function bindEvents() {
294
300
  this.elements.emptyStateSearchBtn?.addEventListener('click', () => {
295
301
  void this.toggleQuickSwitcher();
296
302
  });
303
+ this.elements.presencePanel?.addEventListener('toggle', (event) => {
304
+ this.presencePanelOpen = event.newState === 'open';
305
+ this.renderAvatars?.();
306
+ this.renderPresence?.();
307
+ });
297
308
 
298
- this.elements.chatToggleButton?.addEventListener('click', () => {
299
- this.closePresencePanel?.();
300
- this.toggleChatPanel();
301
- this.closeToolbarOverflowMenu?.();
309
+ this.elements.chatPanel?.addEventListener('toggle', (event) => {
310
+ this.chatIsOpen = event.newState === 'open';
311
+ if (this.chatIsOpen) {
312
+ this.chatUnreadCount = 0;
313
+ }
314
+ this.renderChat?.({ messagesChanged: this.chatIsOpen, stickToBottom: this.chatIsOpen });
315
+ if (this.chatIsOpen) {
316
+ requestAnimationFrame(() => this.elements.chatInput?.focus());
317
+ }
302
318
  });
303
319
 
320
+
304
321
  this.elements.chatNotificationButton?.addEventListener('click', () => {
305
322
  void this.handleChatNotificationToggle();
306
323
  });
@@ -309,9 +326,6 @@ function bindEvents() {
309
326
  this.toggleChatNotificationMute();
310
327
  });
311
328
 
312
- this.elements.chatCloseButton?.addEventListener('click', () => {
313
- this.closeChatPanel({ restoreFocus: true });
314
- });
315
329
 
316
330
  this.elements.chatForm?.addEventListener('submit', (event) => {
317
331
  event.preventDefault();
@@ -341,10 +355,6 @@ function bindEvents() {
341
355
  this.toggleVimMode();
342
356
  });
343
357
 
344
- this.elements.userCount?.addEventListener('click', (event) => {
345
- event.preventDefault();
346
- this.togglePresencePanel?.();
347
- });
348
358
 
349
359
  this.elements.editorFindButton?.addEventListener('click', () => {
350
360
  this.runEditorCommand?.('openSearch');
@@ -354,11 +364,6 @@ function bindEvents() {
354
364
  void this.formatCurrentDocument();
355
365
  });
356
366
 
357
- this.elements.toolbarOverflowToggle?.addEventListener('click', (event) => {
358
- event.preventDefault();
359
- this.closePresencePanel?.();
360
- this.toggleToolbarOverflowMenu();
361
- });
362
367
 
363
368
  this.elements.toolbarOverflowMenu?.addEventListener('click', (event) => {
364
369
  const button = event.target instanceof Element ? event.target.closest('button') : null;
@@ -367,9 +372,23 @@ function bindEvents() {
367
372
  }
368
373
  });
369
374
 
375
+ this.elements.toolbarOverflowMenu?.addEventListener('toggle', (event) => {
376
+ if (event.newState === 'closed') {
377
+ this.elements.toolbarOverflowMenu.querySelectorAll('details[open]').forEach((detail) => {
378
+ detail.removeAttribute('open');
379
+ });
380
+ }
381
+ });
382
+
370
383
  this.elements.previewContent?.addEventListener('click', (event) => {
371
384
  this.handlePreviewContentClick?.(event);
372
385
  });
386
+ this.elements.previewContent?.addEventListener('pointerover', (event) => {
387
+ this.handlePreviewContentPointerOver?.(event);
388
+ });
389
+ this.elements.previewContent?.addEventListener('focusin', (event) => {
390
+ this.handlePreviewContentPointerOver?.(event);
391
+ });
373
392
 
374
393
  this.elements.sidebarToggle?.addEventListener('click', () => {
375
394
  this.closeToolbarOverflowMenu();
@@ -399,47 +418,16 @@ function bindEvents() {
399
418
  this.setSidebarTab('comments');
400
419
  });
401
420
 
402
- document.addEventListener('pointerdown', (event) => {
403
- this.handleDocumentPointerDown(event);
421
+ this.elements.sidebarTabs?.addEventListener('keydown', (event) => {
422
+ this.handleSidebarTabsKeydown(event);
404
423
  });
405
424
 
425
+
406
426
  document.addEventListener('keydown', (event) => {
407
427
  this.handleDocumentKeydown(event);
408
428
  }, { capture: true });
409
429
  }
410
430
 
411
- /** @this {UiShellContext} */
412
- function handleDocumentPointerDown(event) {
413
- this.handleMarkdownToolbarDocumentPointerDown?.(event);
414
-
415
- const target = event.target instanceof Element ? event.target : null;
416
-
417
- if (
418
- this.toolbarOverflowOpen
419
- && !this.elements.toolbarOverflowMenu?.contains(target)
420
- && !this.elements.toolbarOverflowToggle?.contains(target)
421
- ) {
422
- this.closeToolbarOverflowMenu();
423
- }
424
-
425
- if (
426
- this.presencePanelOpen
427
- && !this.elements.presencePanel?.contains(target)
428
- && !target?.closest?.('[data-presence-panel-trigger="true"]')
429
- ) {
430
- this.closePresencePanel?.();
431
- }
432
-
433
- if (!this.chatIsOpen) {
434
- return;
435
- }
436
-
437
- if (this.elements.chatContainer?.contains(target)) {
438
- return;
439
- }
440
-
441
- this.closeChatPanel({ restoreFocus: false });
442
- }
443
431
 
444
432
  /** @this {UiShellContext} */
445
433
  function handleDocumentKeydown(event) {
@@ -447,20 +435,6 @@ function handleDocumentKeydown(event) {
447
435
  this.stopFollowingUser?.();
448
436
  }
449
437
 
450
- if (event.key === 'Escape' && this.toolbarOverflowOpen) {
451
- this.closeToolbarOverflowMenu();
452
- return;
453
- }
454
-
455
- if (event.key === 'Escape' && this.presencePanelOpen) {
456
- this.closePresencePanel?.();
457
- return;
458
- }
459
-
460
- if (event.key === 'Escape' && this.chatIsOpen) {
461
- this.closeChatPanel({ restoreFocus: true });
462
- return;
463
- }
464
438
 
465
439
  if (isPlainQuickSwitcherShortcut(event)) {
466
440
  event.preventDefault();
@@ -559,6 +533,7 @@ function navigatePreviewHeading(target, headingId, { behavior = 'auto' } = {}) {
559
533
 
560
534
  this.scrollSyncController?.suspendSync?.(250);
561
535
  scrollPreviewToTarget(previewContainer, target, { behavior });
536
+ this.attachPreviewHeadingControls?.(target);
562
537
 
563
538
  const sourceLine = Number.parseInt(target.getAttribute('data-source-line') || '', 10);
564
539
  if (Number.isFinite(sourceLine)) {
@@ -601,7 +576,7 @@ async function copyPreviewHeadingLink(anchorId) {
601
576
 
602
577
  /** @this {UiShellContext} */
603
578
  async function copyPreviewCodeBlock(button) {
604
- const code = button?.closest('.preview-code-block')?.querySelector(':scope > pre > code');
579
+ const code = button?.closest('pre')?.querySelector(':scope > code');
605
580
  if (!(code instanceof HTMLElement)) {
606
581
  return;
607
582
  }
@@ -614,27 +589,107 @@ async function copyPreviewCodeBlock(button) {
614
589
  }
615
590
  }
616
591
 
592
+
593
+ function syncHeadingFoldButtonState(heading, button) {
594
+ if (!(heading instanceof HTMLElement) || !(button instanceof HTMLButtonElement)) {
595
+ return;
596
+ }
597
+
598
+ const headingLabel = getHeadingLinkLabel(heading);
599
+ const collapsed = heading.dataset.previewHeadingCollapsed === 'true';
600
+ heading.setAttribute('aria-expanded', String(!collapsed));
601
+ button.setAttribute('aria-expanded', String(!collapsed));
602
+ button.setAttribute('aria-label', `${collapsed ? 'Expand' : 'Collapse'} ${headingLabel}`);
603
+ button.setAttribute('title', `${collapsed ? 'Expand' : 'Collapse'} section`);
604
+ }
605
+
606
+ /** @this {UiShellContext} */
607
+ function attachPreviewHeadingControls(heading) {
608
+ if (!(heading instanceof HTMLElement) || !/^H[1-6]$/.test(heading.tagName)) {
609
+ return;
610
+ }
611
+
612
+ if (!this._previewHeadingFoldButton) {
613
+ const button = document.createElement('button');
614
+ button.type = 'button';
615
+ button.className = 'ui-icon-button preview-heading-fold-button';
616
+ this._previewHeadingFoldButton = button;
617
+ }
618
+ if (!this._previewHeadingLinkButton) {
619
+ const button = document.createElement('button');
620
+ button.type = 'button';
621
+ button.className = 'ui-icon-button preview-heading-link-button';
622
+ // pi-lens-ignore: no-inner-html-js
623
+ button.innerHTML = PREVIEW_HEADING_LINK_ICON;
624
+ this._previewHeadingLinkButton = button;
625
+ }
626
+
627
+ const foldButton = this._previewHeadingFoldButton;
628
+ const linkButton = this._previewHeadingLinkButton;
629
+
630
+ if (foldButton.parentElement !== heading) {
631
+ heading.prepend(foldButton);
632
+ }
633
+ syncHeadingFoldButtonState(heading, foldButton);
634
+
635
+ if (!heading.id) {
636
+ linkButton.remove();
637
+ return;
638
+ }
639
+
640
+ const headingLabel = getHeadingLinkLabel(heading);
641
+ linkButton.dataset.previewHeadingAnchor = heading.id;
642
+ linkButton.setAttribute('aria-label', `Copy link to ${headingLabel}`);
643
+ linkButton.setAttribute('title', 'Copy link to this section');
644
+ if (linkButton.parentElement !== heading) {
645
+ heading.append(linkButton);
646
+ }
647
+ }
648
+
617
649
  /** @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';
650
+ function attachPreviewCodeCopyButton(pre) {
651
+ if (!(pre instanceof HTMLElement) || pre.tagName !== 'PRE' || !pre.querySelector(':scope > code')) {
652
+ return;
653
+ }
654
+
655
+ if (!this._previewCodeCopyButton) {
656
+ const button = document.createElement('button');
657
+ button.type = 'button';
658
+ button.className = 'ui-button ui-button--secondary ui-button--compact preview-code-copy-button';
659
+ button.setAttribute('aria-label', 'Copy code');
660
+ button.title = 'Copy code';
623
661
  // 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
- });
662
+ button.innerHTML = `${PREVIEW_CODE_COPY_ICON}<span data-preview-code-copy-label>Copy</span>`;
663
+ this._previewCodeCopyButton = button;
664
+ }
665
+
666
+ const button = this._previewCodeCopyButton;
667
+ if (button.parentElement !== pre) {
668
+ pre.append(button);
669
+ }
633
670
  }
634
671
 
672
+ /** @this {UiShellContext} */
673
+ function handlePreviewContentPointerOver(event) {
674
+ if (!(event.target instanceof Element) || !this.elements.previewContent) {
675
+ return;
676
+ }
677
+
678
+ const heading = event.target.closest('h1, h2, h3, h4, h5, h6');
679
+ if (heading instanceof HTMLElement && this.elements.previewContent.contains(heading)) {
680
+ this.attachPreviewHeadingControls(heading);
681
+ }
682
+
683
+ const pre = event.target.closest('pre');
684
+ if (pre instanceof HTMLElement && this.elements.previewContent.contains(pre)) {
685
+ this.attachPreviewCodeCopyButton(pre);
686
+ }
687
+ }
688
+
689
+
635
690
  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)
691
+ const parents = new Set(Array.from(previewContent?.querySelectorAll?.('h1, h2, h3, h4, h5, h6') ?? [])
692
+ .map((heading) => heading.parentElement)
638
693
  .filter(Boolean));
639
694
 
640
695
  parents.forEach((parent) => {
@@ -698,19 +753,12 @@ function syncPreviewHeadingFoldButtons() {
698
753
  return;
699
754
  }
700
755
 
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
756
  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`);
757
+ heading.setAttribute('aria-expanded', String(!collapsed));
758
+ const button = heading.querySelector(':scope > .preview-heading-fold-button');
759
+ if (button instanceof HTMLButtonElement) {
760
+ syncHeadingFoldButtonState(heading, button);
761
+ }
714
762
  });
715
763
 
716
764
  applyPreviewHeadingFolds(this.elements.previewContent);
@@ -718,30 +766,19 @@ function syncPreviewHeadingFoldButtons() {
718
766
 
719
767
  /** @this {UiShellContext} */
720
768
  function syncPreviewHeadingLinkButtons() {
721
- const headings = this.elements.previewContent?.querySelectorAll?.('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]') ?? [];
722
-
723
- Array.from(headings).forEach((heading) => {
724
- if (!(heading instanceof HTMLElement) || !heading.id) {
725
- return;
726
- }
727
-
728
- const headingLabel = getHeadingLinkLabel(heading);
729
- let button = heading.querySelector(':scope > .preview-heading-link-button');
730
- if (!(button instanceof HTMLButtonElement)) {
731
- button = document.createElement('button');
732
- button.type = 'button';
733
- button.className = 'ui-icon-button preview-heading-link-button';
734
- // pi-lens-ignore: no-inner-html-js
735
- button.innerHTML = PREVIEW_HEADING_LINK_ICON;
736
- heading.appendChild(button);
737
- }
769
+ const linkButton = this._previewHeadingLinkButton;
770
+ const heading = linkButton?.parentElement;
771
+ if (!(heading instanceof HTMLElement) || !heading.id) {
772
+ return;
773
+ }
738
774
 
739
- button.dataset.previewHeadingAnchor = heading.id;
740
- button.setAttribute('aria-label', `Copy link to ${headingLabel}`);
741
- button.setAttribute('title', 'Copy link to this section');
742
- });
775
+ const headingLabel = getHeadingLinkLabel(heading);
776
+ linkButton.dataset.previewHeadingAnchor = heading.id;
777
+ linkButton.setAttribute('aria-label', `Copy link to ${headingLabel}`);
778
+ linkButton.setAttribute('title', 'Copy link to this section');
743
779
  }
744
780
 
781
+
745
782
  /** @this {UiShellContext} */
746
783
  function requestPreviewRouteAnchor(anchorId, filePath = this.currentFilePath) {
747
784
  const normalizedAnchor = String(anchorId ?? '').trim();
@@ -883,20 +920,6 @@ function handlePreviewContentClick(event) {
883
920
  this.session?.toggleTaskListItem?.(sourceLine);
884
921
  }
885
922
 
886
- /** @this {UiShellContext} */
887
- function setToolbarOverflowOpen(nextState) {
888
- this.toolbarOverflowOpen = Boolean(nextState);
889
- this.elements.toolbarOverflowToggle?.setAttribute('aria-expanded', String(this.toolbarOverflowOpen));
890
- this.elements.toolbarOverflowToggle?.classList.toggle('active', this.toolbarOverflowOpen);
891
- this.elements.toolbarOverflowToggle?.closest('.toolbar-right')?.classList.toggle('is-overflow-open', this.toolbarOverflowOpen);
892
-
893
- if (!this.toolbarOverflowOpen) {
894
- this.elements.toolbarOverflowMenu?.querySelectorAll('details[open]').forEach((detail) => {
895
- detail.removeAttribute('open');
896
- });
897
- }
898
- }
899
-
900
923
  /** @this {UiShellContext} */
901
924
  function syncToolbarOverflowVisibility() {
902
925
  const toggle = this.elements.toolbarOverflowToggle;
@@ -911,19 +934,17 @@ function syncToolbarOverflowVisibility() {
911
934
 
912
935
  /** @this {UiShellContext} */
913
936
  function closeToolbarOverflowMenu() {
914
- this.setToolbarOverflowOpen(false);
915
- }
916
-
917
- /** @this {UiShellContext} */
918
- function toggleToolbarOverflowMenu() {
919
- this.setToolbarOverflowOpen(!this.toolbarOverflowOpen);
937
+ if (this.elements.toolbarOverflowMenu?.matches(':popover-open')) {
938
+ this.elements.toolbarOverflowMenu.hidePopover();
939
+ }
920
940
  }
921
941
 
922
942
  /** @this {UiShellContext} */
923
943
  function handleThemeChange(theme) {
924
944
  this.previewRenderer.applyTheme(theme);
925
945
  if (
926
- !this.isExcalidrawFile(this.currentFilePath)
946
+ this.currentFilePath
947
+ && !this.isExcalidrawFile(this.currentFilePath)
927
948
  && !this.isImageFile?.(this.currentFilePath)
928
949
  && !this.isPdfFile?.(this.currentFilePath)
929
950
  && !this.isStructurizrWorkspaceFile?.(this.currentFilePath)
@@ -1049,9 +1070,12 @@ function showEditorLoading() {
1049
1070
  if (!this.elements.editorContainer) return;
1050
1071
  this.elements.editorContainer.classList.add('is-loading-editor');
1051
1072
  this.elements.editorContainer.innerHTML = `
1052
- <div class="editor-loading" id="editorLoading">
1053
- <div class="loading-spinner"></div>
1054
- <span class="loading-text">Loading file...</span>
1073
+ <div class="editor-loading" id="editorLoading" role="status" aria-live="polite" aria-label="Loading file…">
1074
+ <div class="skeleton-line skeleton-line--title skeleton-line--break"></div>
1075
+ <div class="skeleton-line skeleton-line--full"></div>
1076
+ <div class="skeleton-line skeleton-line--ninety"></div>
1077
+ <div class="skeleton-line skeleton-line--ninety-five"></div>
1078
+ <div class="skeleton-line skeleton-line--eighty"></div>
1055
1079
  </div>`;
1056
1080
  }
1057
1081
 
@@ -1083,6 +1107,8 @@ function clearInitialFileBootstrap() {
1083
1107
 
1084
1108
  export const uiFeatureShellMethods = {
1085
1109
  applyPendingPreviewRouteAnchor,
1110
+ attachPreviewCodeCopyButton,
1111
+ attachPreviewHeadingControls,
1086
1112
  bindEvents,
1087
1113
  clearInitialFileBootstrap,
1088
1114
  closeToolbarOverflowMenu,
@@ -1095,8 +1121,8 @@ export const uiFeatureShellMethods = {
1095
1121
  getStoredVimMode,
1096
1122
  handleConnectionChange,
1097
1123
  handleDocumentKeydown,
1098
- handleDocumentPointerDown,
1099
1124
  handlePreviewContentClick,
1125
+ handlePreviewContentPointerOver,
1100
1126
  handleThemeChange,
1101
1127
  hideEditorLoading,
1102
1128
  initialize,
@@ -1107,17 +1133,14 @@ export const uiFeatureShellMethods = {
1107
1133
  promptForVersionReload,
1108
1134
  requestPreviewRouteAnchor,
1109
1135
  scheduleBacklinkRefresh,
1110
- setToolbarOverflowOpen,
1111
1136
  showEditorLoadError,
1112
1137
  showEditorLoading,
1113
- syncPreviewCodeCopyButtons,
1114
1138
  syncPreviewHeadingFoldButtons,
1115
1139
  syncPreviewHeadingLinkButtons,
1116
1140
  syncVisualViewportBounds,
1117
1141
  syncToolbarOverflowVisibility,
1118
1142
  syncVimModeToggle,
1119
1143
  syncWrapToggle,
1120
- toggleToolbarOverflowMenu,
1121
1144
  toggleLineWrapping,
1122
1145
  unfoldPreviewHeading,
1123
1146
  toggleVimMode,