collabmd 0.1.30 → 0.1.31

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 (362) hide show
  1. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-tj0_ycIx.js → CodeMirrorEditor-UCMRAMCV-Bg0dawOb.js} +1 -1
  2. package/dist/client/assets/{_basePickBy-B6kIfhzj.js → _basePickBy-Dv0sK1l7.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-Bbn0_sHS.js → _baseUniq-DKYX57ji.js} +1 -1
  4. package/dist/client/assets/{ar-SA-NXDWD63E-BWO5oYxe.js → ar-SA-NXDWD63E-WivLHHDW.js} +1 -1
  5. package/dist/client/assets/{arc-BIqum3oD.js → arc-DrfYGhWk.js} +1 -1
  6. package/dist/client/assets/architecture-PBZL5I3N-DiglIZi9.js +1 -0
  7. package/dist/client/assets/{architectureDiagram-2XIMDMQ5-BPG5b65m.js → architectureDiagram-2XIMDMQ5-kYbOThe4.js} +1 -1
  8. package/dist/client/assets/{az-AZ-MXSORGZV-Cfw6Z5oY.js → az-AZ-MXSORGZV-DOdq1TKC.js} +1 -1
  9. package/dist/client/assets/{bg-BG-O6MV2KSF-CQmG3YpD.js → bg-BG-O6MV2KSF-CYucKuDS.js} +1 -1
  10. package/dist/client/assets/{blockDiagram-WCTKOSBZ-F38TRzI3.js → blockDiagram-WCTKOSBZ-GIgTqnhk.js} +1 -1
  11. package/dist/client/assets/{bn-IN-MMW2ORAC-DZKVshfk.js → bn-BD-T2VJNT7N-2OKWLCYa.js} +1 -1
  12. package/dist/client/assets/{bn-BD-T2VJNT7N-C4S6DZ6o.js → bn-IN-MMW2ORAC-DYr8kqNL.js} +1 -1
  13. package/dist/client/assets/{c4Diagram-IC4MRINW-DHwxcDlQ.js → c4Diagram-IC4MRINW-CkHO1i_L.js} +1 -1
  14. package/dist/client/assets/{ca-ES-MKBCGNOG-Do3aMgyu.js → ca-ES-MKBCGNOG-B9Aeb43I.js} +1 -1
  15. package/dist/client/assets/channel-CgsU9TSN.js +1 -0
  16. package/dist/client/assets/{chunk-4BX2VUAB-BqEY6cCE.js → chunk-4BX2VUAB-2e7V-uuE.js} +1 -1
  17. package/dist/client/assets/{chunk-55IACEB6-039iVf6v.js → chunk-55IACEB6-CpncB3ru.js} +1 -1
  18. package/dist/client/assets/{chunk-7E7YKBS2-BreG0gYL.js → chunk-7E7YKBS2-TdU92i9i.js} +1 -1
  19. package/dist/client/assets/{chunk-7R4GIKGN-BMrp52Pk.js → chunk-7R4GIKGN-mqd2GwMg.js} +2 -2
  20. package/dist/client/assets/{chunk-C72U2L5F-BLB26v5d.js → chunk-C72U2L5F-CJKQWBtz.js} +1 -1
  21. package/dist/client/assets/{chunk-EGIJ26TM-fG-0Yh0k.js → chunk-EGIJ26TM-C4nq20om.js} +1 -1
  22. package/dist/client/assets/{chunk-FMBD7UC4-EWK5Pt4D.js → chunk-FMBD7UC4-CMahlBa_.js} +1 -1
  23. package/dist/client/assets/{chunk-GEFDOKGD-DYHmaq-c.js → chunk-GEFDOKGD-Bs7FmFox.js} +1 -1
  24. package/dist/client/assets/chunk-GLR3WWYH-qQe2O5VQ.js +2 -0
  25. package/dist/client/assets/chunk-HHEYEP7N-DlevL8bq.js +1 -0
  26. package/dist/client/assets/{chunk-JSJVCQXG-B69YGtcQ.js → chunk-JSJVCQXG-DPQ9cPJt.js} +1 -1
  27. package/dist/client/assets/{chunk-KX2RTZJC-tuEC7hg1.js → chunk-KX2RTZJC-BTiOJb7N.js} +1 -1
  28. package/dist/client/assets/{chunk-KYZI473N-D4r5eMJZ.js → chunk-KYZI473N-CTSCuqRb.js} +1 -1
  29. package/dist/client/assets/{chunk-L3YUKLVL-CD9nJYL8.js → chunk-L3YUKLVL-CJZMBtKF.js} +1 -1
  30. package/dist/client/assets/{chunk-MX3YWQON-DqN0TF5Q.js → chunk-MX3YWQON-DQpSwRf6.js} +1 -1
  31. package/dist/client/assets/{chunk-NQ4KR5QH-BBX89uUa.js → chunk-NQ4KR5QH-CMJKI6Oj.js} +1 -1
  32. package/dist/client/assets/{chunk-NU2UP6EN-CGeKI3BV.js → chunk-NU2UP6EN-DlUENSHU.js} +4 -4
  33. package/dist/client/assets/{chunk-O4XLMI2P-DaS3COAu.js → chunk-O4XLMI2P-CcVxZh41.js} +1 -1
  34. package/dist/client/assets/{chunk-OZEHJAEY-BaBXI-8x.js → chunk-OZEHJAEY-DjBZbgu0.js} +1 -1
  35. package/dist/client/assets/{chunk-PQ6SQG4A-BY9_Srs_.js → chunk-PQ6SQG4A-D1AbThjy.js} +1 -1
  36. package/dist/client/assets/{chunk-PU5JKC2W-t0zUh6E3.js → chunk-PU5JKC2W-D_6N6t8f.js} +1 -1
  37. package/dist/client/assets/chunk-QZHKN3VN-CgLPFSk5.js +1 -0
  38. package/dist/client/assets/{chunk-R5LLSJPH-BjSMFnTi.js → chunk-R5LLSJPH-CkjKXM73.js} +1 -1
  39. package/dist/client/assets/{chunk-WL4C6EOR-zSV-8h7F.js → chunk-WL4C6EOR-axcuKSup.js} +1 -1
  40. package/dist/client/assets/{chunk-XIRO2GV7-2tirYN5A.js → chunk-XIRO2GV7-4wqVHjs_.js} +1 -1
  41. package/dist/client/assets/{chunk-XPW4576I-C0GpOUHf.js → chunk-XPW4576I-DJr4_4Yy.js} +1 -1
  42. package/dist/client/assets/{chunk-XZSTWKYB-DDkpyNVE.js → chunk-XZSTWKYB-C8Y_hIKZ.js} +1 -1
  43. package/dist/client/assets/{chunk-YBOYWFTD-CzyyfGQX.js → chunk-YBOYWFTD-CKg4ymFF.js} +1 -1
  44. package/dist/client/assets/{chunk-Z5NKEFVG-Dgem5v98.js → chunk-Z5NKEFVG-HOkYqaKa.js} +1 -1
  45. package/dist/client/assets/classDiagram-VBA2DB6C-BHZpvOxK.js +1 -0
  46. package/dist/client/assets/classDiagram-v2-RAHNMMFH-DA7HMUUs.js +1 -0
  47. package/dist/client/assets/clone-Dgi8Z4IL.js +1 -0
  48. package/dist/client/assets/{cose-bilkent-S5V4N54A-jZzFUguD.js → cose-bilkent-S5V4N54A-DASO2hrk.js} +1 -1
  49. package/dist/client/assets/{cs-CZ-V77HGUP7-DmZRJ2UO.js → cs-CZ-V77HGUP7-BDg-F0CJ.js} +1 -1
  50. package/dist/client/assets/{da-DK-I5RFNTM4-CRIiLQ-G.js → da-DK-I5RFNTM4-wtSQ0Jxa.js} +1 -1
  51. package/dist/client/assets/{dagre-fvYjRtTE.js → dagre-CfB3Fw33.js} +1 -1
  52. package/dist/client/assets/{dagre-KLK3FWXG-CAG8WeES.js → dagre-KLK3FWXG-CC7tq2Ky.js} +1 -1
  53. package/dist/client/assets/{de-DE-DTI4WUSC-MFge9MC3.js → de-CH-WLRDEVBV-C1swvmZy.js} +1 -1
  54. package/dist/client/assets/{de-CH-WLRDEVBV-k728UA4j.js → de-DE-DTI4WUSC-C0L6Nz8X.js} +1 -1
  55. package/dist/client/assets/{diagram-E7M64L7V-Bm5FD0I5.js → diagram-E7M64L7V-CMt7BN5M.js} +1 -1
  56. package/dist/client/assets/{diagram-IFDJBPK2-pqicH-av.js → diagram-IFDJBPK2-BFMBUGpd.js} +1 -1
  57. package/dist/client/assets/{diagram-P4PSJMXO-DwIXO27H.js → diagram-P4PSJMXO-CviA1xXr.js} +1 -1
  58. package/dist/client/assets/dist-8Igu3Ee_2.js +1 -0
  59. package/dist/client/assets/dist-B4uQVR_X.js +1 -0
  60. package/dist/client/assets/{dockerfile-C0qQqxf9.js → dockerfile-D8_6_FRV.js} +1 -1
  61. package/dist/client/assets/{drawio-editor-CTZtMo1J.js → drawio-editor-B4sHHwWJ.js} +1 -1
  62. package/dist/client/assets/{drawioEditor-keSJVTcv.js → drawioEditor-DGpo2hcx.js} +2 -2
  63. package/dist/client/assets/editor-session-BKHEYkbY.js +16 -0
  64. package/dist/client/assets/{el-GR-ZXDJ2OS4-Bbz93mrG.js → el-GR-ZXDJ2OS4-BH0saXds.js} +1 -1
  65. package/dist/client/assets/{en-IQZW2TQM-CZeIyvu2.js → en-IQZW2TQM-CzlcEpq3.js} +1 -1
  66. package/dist/client/assets/{erDiagram-INFDFZHY-DlhPv4az.js → erDiagram-INFDFZHY-DlIf-fb7.js} +1 -1
  67. package/dist/client/assets/{es-ES-DYQHAD43-CReXU-Nn.js → es-ES-DYQHAD43-CyzL9Mni.js} +1 -1
  68. package/dist/client/assets/{eu-ES-QDSYU5Y3-jRpcaWwz.js → eu-ES-QDSYU5Y3-D2-x316S.js} +1 -1
  69. package/dist/client/assets/{excalidraw-editor-CBEWfuhb.js → excalidraw-editor-CHbeNZu6.js} +1 -1
  70. package/dist/client/assets/{excalidraw-mermaid-stub-efoh2lJm.js → excalidraw-mermaid-stub-Bwe-bKcT.js} +1 -1
  71. package/dist/client/assets/{excalidraw-scene-BL-OtvCd.js → excalidraw-scene-BF_bT1OL.js} +8 -8
  72. package/dist/client/assets/excalidrawEditor-BhaTX2Ko.js +2 -0
  73. package/dist/client/assets/export-page-PeexH2QK.js +39 -0
  74. package/dist/client/assets/exportDocument-CtZKWE2c.js +2 -0
  75. package/dist/client/assets/{exportDocument-CtX_4PSk.css → exportDocument-DmV7Gngb.css} +1 -1
  76. package/dist/client/assets/{fa-IR-26LZG4PM-DP8pJ8e3.js → fa-IR-26LZG4PM-D8-trU2x.js} +1 -1
  77. package/dist/client/assets/{factor-2uy-lXe_.js → factor-Cz-hzBGH.js} +1 -1
  78. package/dist/client/assets/{fi-FI-6YS4KDE4-BLUDpNOj.js → fi-FI-6YS4KDE4-CCdRVFDQ.js} +1 -1
  79. package/dist/client/assets/file-kind-DBptLlF_.js +1 -0
  80. package/dist/client/assets/{flowDiagram-PKNHOUZH-BU4MOSq8.js → flowDiagram-PKNHOUZH-C_t-mkwb.js} +1 -1
  81. package/dist/client/assets/{fr-FR-BRLLPTZC-BoZz3Pi8.js → fr-FR-BRLLPTZC-Dqq-O5T_.js} +1 -1
  82. package/dist/client/assets/{ganttDiagram-A5KZAMGK-CbX67lZu.js → ganttDiagram-A5KZAMGK-BtK9Tb--.js} +1 -1
  83. package/dist/client/assets/gitGraph-HDMCJU4V-CT7YfbD3.js +1 -0
  84. package/dist/client/assets/{gitGraphDiagram-K3NZZRJ6-DhyvWcW1.js → gitGraphDiagram-K3NZZRJ6-DULDLGiJ.js} +1 -1
  85. package/dist/client/assets/{gl-ES-OKUZTLYG-CaEvhjDi.js → gl-ES-OKUZTLYG-BK7pbLbm.js} +1 -1
  86. package/dist/client/assets/{graphlib-DSzYgMXB.js → graphlib-BgRST-Qg.js} +1 -1
  87. package/dist/client/assets/{he-IL-26MGYIU7-DYOchgy9.js → he-IL-26MGYIU7-C3BuYKyY.js} +1 -1
  88. package/dist/client/assets/{hi-IN-Q4ZOGTP2-yRs8g46n.js → hi-IN-Q4ZOGTP2-BEvXWXnH.js} +1 -1
  89. package/dist/client/assets/{hu-HU-P2OXPSN5-1skPmtgc.js → hu-HU-P2OXPSN5-BWWZeJNp.js} +1 -1
  90. package/dist/client/assets/{id-ID-2EIKXYN6-iUugQJd9.js → id-ID-2EIKXYN6-DxSKi_aJ.js} +1 -1
  91. package/dist/client/assets/image-XLNPCCAD-CFiKwiWK.js +1 -0
  92. package/dist/client/assets/index-D69HOZHr.css +1 -0
  93. package/dist/client/assets/{index-CywRKxsk.js → index-kPgEYvEX.js} +2 -2
  94. package/dist/client/assets/info-3K5VOQVL-DUpNyDC-.js +1 -0
  95. package/dist/client/assets/{infoDiagram-LFFYTUFH-Bap6MyHX.js → infoDiagram-LFFYTUFH-DFTI0nfs.js} +1 -1
  96. package/dist/client/assets/{isEmpty-C7iPDOO3.js → isEmpty-CVvRj8fj.js} +1 -1
  97. package/dist/client/assets/{ishikawaDiagram-PHBUUO56-DbftskqN.js → ishikawaDiagram-PHBUUO56-DpBuDpC6.js} +1 -1
  98. package/dist/client/assets/{it-IT-4CFKVXI2-a5DFhzuI.js → it-IT-4CFKVXI2-BmA8wW6q.js} +1 -1
  99. package/dist/client/assets/{ja-JP-MAND2Z4V-DwogHVKd.js → ja-JP-MAND2Z4V-CLS1jI9o.js} +1 -1
  100. package/dist/client/assets/javascript-UJe68_xi.js +1 -0
  101. package/dist/client/assets/{journeyDiagram-4ABVD52K-165YoX6B.js → journeyDiagram-4ABVD52K-DDur6iHm.js} +1 -1
  102. package/dist/client/assets/{kaa-HQRTCXTJ-p81XNRfH.js → kaa-HQRTCXTJ-W15DEDPz.js} +1 -1
  103. package/dist/client/assets/{kab-KAB-JKIKKTGH-mV5VzQZc.js → kab-KAB-JKIKKTGH-MLh1inqS.js} +1 -1
  104. package/dist/client/assets/{kanban-definition-K7BYSVSG-MlixoNyx.js → kanban-definition-K7BYSVSG-dA6NPLsg.js} +1 -1
  105. package/dist/client/assets/{kk-KZ-HXQ63ZFC-IIPX0GQv.js → kk-KZ-HXQ63ZFC-BtFrPeLs.js} +1 -1
  106. package/dist/client/assets/{km-KH-PKL3LSGX-D7WQFJuZ.js → km-KH-PKL3LSGX-xO5FyM9T.js} +1 -1
  107. package/dist/client/assets/{ko-KR-KXLREZX3-Bs1oLtJs.js → ko-KR-KXLREZX3-NZFoRybS.js} +1 -1
  108. package/dist/client/assets/{ku-TR-MJ4IER3X-DlxOs6aZ.js → ku-TR-MJ4IER3X-B5eVPIpK.js} +1 -1
  109. package/dist/client/assets/{line-D57TbKb7.js → line-B2GMovaI.js} +1 -1
  110. package/dist/client/assets/{linear-BIf852wI.js → linear-B2dOdA24.js} +1 -1
  111. package/dist/client/assets/{lt-LT-H6WFQ6FJ-xuo-3zKH.js → lt-LT-H6WFQ6FJ-D_7_OeJD.js} +1 -1
  112. package/dist/client/assets/{lv-LV-GOCK6SJW-C7S3M1nr.js → lv-LV-GOCK6SJW-CnpKr0oQ.js} +1 -1
  113. package/dist/client/assets/{main-CB97rY6B.js → main-DSxNTtD-.js} +219 -189
  114. package/dist/client/assets/{mermaid-parser.core-lf87rdG-.js → mermaid-parser.core-B1ogGcR8.js} +2 -2
  115. package/dist/client/assets/{mermaid-runtime-C4a7TrTS.js → mermaid-runtime-Bn8A6DGx.js} +3 -3
  116. package/dist/client/assets/{mindmap-definition-YRQLILUH-_YbQSc4Q.js → mindmap-definition-YRQLILUH-DjQcsPoe.js} +1 -1
  117. package/dist/client/assets/{mr-IN-IXVLDMEQ-BsoowyZT.js → mr-IN-IXVLDMEQ-Pht2X_GK.js} +1 -1
  118. package/dist/client/assets/{my-MM-YG6MYTTD-DCqwN_K_.js → my-MM-YG6MYTTD-Cgq4HhPO.js} +1 -1
  119. package/dist/client/assets/{nb-NO-XGWJISD2-CZ5ytLgj.js → nb-NO-XGWJISD2-Bn_Bk2un.js} +1 -1
  120. package/dist/client/assets/{nl-NL-XVDVCPNC-wADsdb-h.js → nl-NL-XVDVCPNC-YkWSJS94.js} +1 -1
  121. package/dist/client/assets/{nn-NO-EMX5MJX5-D9zIKTL2.js → nn-NO-EMX5MJX5-DhP5eZJ7.js} +1 -1
  122. package/dist/client/assets/{nsis-CUd4RnvJ.js → nsis-QPGhLAeY.js} +1 -1
  123. package/dist/client/assets/{oc-FR-ROEINTVO-BSbBugJB.js → oc-FR-ROEINTVO-D3udMPnr.js} +1 -1
  124. package/dist/client/assets/{ordinal-B0PAtOQ6.js → ordinal-Dz3y_j0K.js} +1 -1
  125. package/dist/client/assets/{pa-IN-ZYN6SUDY-1pFA_3Pb.js → pa-IN-ZYN6SUDY-CR5YzFig.js} +1 -1
  126. package/dist/client/assets/packet-RMMSAZCW-DEwNbIrA.js +1 -0
  127. package/dist/client/assets/percentages-5DKR754L-D7n4T776.js +1 -0
  128. package/dist/client/assets/pie-UPGHQEXC-D5M_lSjo.js +1 -0
  129. package/dist/client/assets/{pieDiagram-SKSYHLDU-CqCgXFom.js → pieDiagram-SKSYHLDU-jhHouFpk.js} +1 -1
  130. package/dist/client/assets/{pl-PL-6VTG7PHC-DyYw0u_z.js → pl-PL-6VTG7PHC-_wZuoIDM.js} +1 -1
  131. package/dist/client/assets/preview-render-compiler-BjLlHmiQ.js +35 -0
  132. package/dist/client/assets/preview-render-compiler-Duy_3IcP.js +1 -0
  133. package/dist/client/assets/{preview-render-worker-BVbVXXPS.js → preview-render-worker-B4dH2yxj.js} +22 -22
  134. package/dist/client/assets/{pt-BR-5YFKRR5G-DJCCBBDl.js → pt-BR-5YFKRR5G-M7gIm2Hi.js} +1 -1
  135. package/dist/client/assets/{pt-PT-GEIXXZ67-BPJd09Ax.js → pt-PT-GEIXXZ67-CcxWpkGj.js} +1 -1
  136. package/dist/client/assets/{pug-BqBF8qF7.js → pug-DkUcLYWt.js} +1 -1
  137. package/dist/client/assets/{quadrantDiagram-337W2JSQ-B8eMuhg4.js → quadrantDiagram-337W2JSQ-CYKgdx7K.js} +1 -1
  138. package/dist/client/assets/quick-switcher-controller-DcyllYpm.js +5 -0
  139. package/dist/client/assets/radar-KQ55EAFF-AU1qh3Bw.js +1 -0
  140. package/dist/client/assets/{requirementDiagram-Z7DCOOCP-B6POvqz4.js → requirementDiagram-Z7DCOOCP-D9SHxoW7.js} +1 -1
  141. package/dist/client/assets/{ro-RO-E2P6TFZI-DWVyTV7V.js → ro-RO-E2P6TFZI-qR9noVzP.js} +1 -1
  142. package/dist/client/assets/{room-COWSP--i.js → room-yJaBAoEU.js} +1 -1
  143. package/dist/client/assets/{ru-RU-YBIIY43T-Dyar7CYM.js → ru-RU-YBIIY43T-CE4S_RX8.js} +1 -1
  144. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-CXRga6Op.js → sankeyDiagram-WA2Y5GQK-CfHe3D6R.js} +1 -1
  145. package/dist/client/assets/{sequenceDiagram-2WXFIKYE-CeSFlFx5.js → sequenceDiagram-2WXFIKYE-CZsMMqAJ.js} +1 -1
  146. package/dist/client/assets/{si-LK-673C2CI2-C61aLrIy.js → si-LK-673C2CI2-Bv6Avh3z.js} +1 -1
  147. package/dist/client/assets/{sk-SK-CKZHQ4AP-BlFwOxRD.js → sk-SK-CKZHQ4AP-Cnlpp55z.js} +1 -1
  148. package/dist/client/assets/{sl-SI-557H2GWM-DcAVW-_t.js → sl-SI-557H2GWM-BfGq7AQF.js} +1 -1
  149. package/dist/client/assets/{stateDiagram-RAJIS63D-DbewhqwJ.js → stateDiagram-RAJIS63D-CoNZjTYV.js} +1 -1
  150. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-1zOw6NmQ.js +1 -0
  151. package/dist/client/assets/subset-shared.chunk-C9HjwTXy.js +1 -0
  152. package/dist/client/assets/{subset-worker.chunk-DVGT6bvR.js → subset-worker.chunk-BSCP6IiC.js} +1 -1
  153. package/dist/client/assets/{sv-SE-XOPKKDWS-BkhfOHzh.js → sv-SE-XOPKKDWS-B2_Vk-sp.js} +1 -1
  154. package/dist/client/assets/{ta-IN-XBH7DQI3-BIfwglZa.js → ta-IN-XBH7DQI3-BXQMZZIx.js} +1 -1
  155. package/dist/client/assets/{th-TH-TOCWH3R4-CkrxqVkf.js → th-TH-TOCWH3R4-C-ZIYMfH.js} +1 -1
  156. package/dist/client/assets/{timeline-definition-YZTLITO2-BXBHNWLQ.js → timeline-definition-YZTLITO2-DSe2mrG8.js} +1 -1
  157. package/dist/client/assets/{tr-TR-GXW6CYY5-CDdvG9rD.js → tr-TR-GXW6CYY5-dl702PMA.js} +1 -1
  158. package/dist/client/assets/treemap-KZPCXAKY-C9UI2fwP.js +1 -0
  159. package/dist/client/assets/{uk-UA-IJKTNUDG-DRHp0lWp.js → uk-UA-IJKTNUDG-CUYQvSSF.js} +1 -1
  160. package/dist/client/assets/{uz-UZ-TBZZEA4V-BIn-VE3Y.js → uz-UZ-TBZZEA4V-B9qw0PXX.js} +1 -1
  161. package/dist/client/assets/{vault-api-client-DIaCC56H.js → vault-api-client-BzHQseMN.js} +1 -1
  162. package/dist/client/assets/vault-utils-5Xr0MXCb.js +1 -0
  163. package/dist/client/assets/{vennDiagram-LZ73GAT5-C1hrSbf2.js → vennDiagram-LZ73GAT5-xSzaIpy1.js} +1 -1
  164. package/dist/client/assets/{vi-VN-MULSGNVB-Du7t5I0v.js → vi-VN-MULSGNVB-DqxZ_sVc.js} +1 -1
  165. package/dist/client/assets/{xychartDiagram-JWTSCODW-DhpWp8LV.js → xychartDiagram-JWTSCODW-C3vA70iJ.js} +1 -1
  166. package/dist/client/assets/{zh-CN-MVX3E32U-RcjS3rjt.js → zh-CN-MVX3E32U-BM0aLuGc.js} +1 -1
  167. package/dist/client/assets/{zh-HK-JNU5RLIE-g8UeEw5v.js → zh-HK-JNU5RLIE-dmG_YD0d.js} +1 -1
  168. package/dist/client/assets/{zh-TW-LENVCA6T-DwV25BqC.js → zh-TW-LENVCA6T-LFgbiOi3.js} +1 -1
  169. package/dist/client/drawio-editor.html +1 -1
  170. package/dist/client/excalidraw-editor.html +1 -1
  171. package/dist/client/export-document.html +3 -3
  172. package/dist/client/index.html +2 -2
  173. package/package.json +2 -1
  174. package/src/client/app/export-document.html +1 -1
  175. package/src/client/application/app-shell/workspace-feature.js +9 -0
  176. package/src/client/application/app-shell-elements.js +1 -0
  177. package/src/client/application/markdown-frontmatter.js +1 -56
  178. package/src/client/application/preview-render-compiler.js +50 -6
  179. package/src/client/application/workspace-chrome-controller.js +25 -19
  180. package/src/client/application/workspace-coordinator.js +9 -0
  181. package/src/client/application/workspace-preview-controller.js +48 -3
  182. package/src/client/bootstrap/collabmd-app-shell.js +26 -2
  183. package/src/client/domain/vault-paths.js +19 -0
  184. package/src/client/export/export-page.js +11 -3
  185. package/src/client/export/export-pipeline.js +77 -2
  186. package/src/client/infrastructure/editor-view-adapter.js +8 -5
  187. package/src/client/infrastructure/vault-api-client.js +54 -0
  188. package/src/client/presentation/app-shell-template.js +12 -0
  189. package/src/client/presentation/backlinks-panel.js +37 -11
  190. package/src/client/presentation/bases-preview-controller.js +444 -0
  191. package/src/client/presentation/file-action-controller.js +43 -0
  192. package/src/client/presentation/file-explorer-view.js +10 -2
  193. package/src/client/presentation/file-tree-state.js +9 -1
  194. package/src/client/presentation/quick-switcher-controller.js +54 -13
  195. package/src/client/styles/export-document.css +12 -0
  196. package/src/client/styles/features/backlinks.css +65 -3
  197. package/src/client/styles/features/preview-markdown.css +209 -0
  198. package/src/client/styles/layout/shell.css +8 -1
  199. package/src/client/styles/layout/view-modes.css +5 -0
  200. package/src/domain/file-kind.js +17 -2
  201. package/src/domain/wiki-link-resolver.js +41 -23
  202. package/src/domain/yaml-frontmatter.js +59 -0
  203. package/src/server/create-app-server.js +11 -2
  204. package/src/server/domain/backlink-index.js +102 -16
  205. package/src/server/domain/bases/base-query-service.js +2101 -0
  206. package/src/server/domain/collaboration/collaboration-document-store.js +13 -2
  207. package/src/server/domain/workspace-state.js +52 -0
  208. package/src/server/infrastructure/http/create-request-handler.js +2 -0
  209. package/src/server/infrastructure/http/create-vault-api-command-handler.js +5 -0
  210. package/src/server/infrastructure/http/create-vault-api-handler.js +2 -0
  211. package/src/server/infrastructure/http/create-vault-api-query-handler.js +66 -0
  212. package/src/server/infrastructure/persistence/path-utils.js +1 -1
  213. package/src/server/infrastructure/persistence/vault-content-adapter.js +6 -0
  214. package/src/server/infrastructure/persistence/vault-file-store.js +14 -0
  215. package/src/server/infrastructure/workspace/file-system-sync-service.js +110 -19
  216. package/src/server/infrastructure/workspace/workspace-mutation-coordinator.js +15 -44
  217. package/dist/client/assets/architecture-PBZL5I3N-iRyVT2GQ.js +0 -1
  218. package/dist/client/assets/channel-s0w88EQN.js +0 -1
  219. package/dist/client/assets/chunk-GLR3WWYH-CQ1LryrI.js +0 -2
  220. package/dist/client/assets/chunk-HHEYEP7N-DOQ0PCdH.js +0 -1
  221. package/dist/client/assets/chunk-QZHKN3VN-B0v4d-CS.js +0 -1
  222. package/dist/client/assets/classDiagram-VBA2DB6C-BQqG4q1b.js +0 -1
  223. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BUKbprX1.js +0 -1
  224. package/dist/client/assets/clone-C-n46MFF.js +0 -1
  225. package/dist/client/assets/dist-BqQjnEWr.js +0 -1
  226. package/dist/client/assets/editor-session-C9l9XwVg.js +0 -16
  227. package/dist/client/assets/excalidrawEditor-Ws-fwGOc.js +0 -2
  228. package/dist/client/assets/export-page-B6xYnwy7.js +0 -39
  229. package/dist/client/assets/exportDocument-8JBw0p8O.js +0 -2
  230. package/dist/client/assets/gitGraph-HDMCJU4V-kkuqHGSM.js +0 -1
  231. package/dist/client/assets/image-XLNPCCAD-B4wZgh-Y.js +0 -1
  232. package/dist/client/assets/index-R4OArFku.css +0 -1
  233. package/dist/client/assets/info-3K5VOQVL-DPN78whf.js +0 -1
  234. package/dist/client/assets/javascript-8DvdgifH.js +0 -1
  235. package/dist/client/assets/packet-RMMSAZCW-BymvQ5cQ.js +0 -1
  236. package/dist/client/assets/percentages-5DKR754L-CiI2D7zA.js +0 -1
  237. package/dist/client/assets/pie-UPGHQEXC-MmzJzWOE.js +0 -1
  238. package/dist/client/assets/preview-render-compiler-TmHpBDlh.js +0 -1
  239. package/dist/client/assets/preview-render-compiler-aYpnXmNm.js +0 -35
  240. package/dist/client/assets/quick-switcher-controller-DplOTsT3.js +0 -5
  241. package/dist/client/assets/radar-KQ55EAFF-CCohASSY.js +0 -1
  242. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-DbW-jVkS.js +0 -1
  243. package/dist/client/assets/subset-shared.chunk-CC_u8ICU.js +0 -1
  244. package/dist/client/assets/treemap-KZPCXAKY-9kxB0uNY.js +0 -1
  245. package/dist/client/assets/vault-utils-BW53lKl1.js +0 -1
  246. /package/dist/client/assets/{apl-QJCYYBkj.js → apl-C1JYSI8J.js} +0 -0
  247. /package/dist/client/assets/{array-DwdVlTkF.js → array-B3agRrCs.js} +0 -0
  248. /package/dist/client/assets/{asciiarmor-DNy0UPqh.js → asciiarmor-DHW75j1s.js} +0 -0
  249. /package/dist/client/assets/{asn1-CNPXj-s7.js → asn1-CQiG40kG.js} +0 -0
  250. /package/dist/client/assets/{asterisk-BwMdLpT2.js → asterisk-BWExh0n4.js} +0 -0
  251. /package/dist/client/assets/{brainfuck-C2gHT8aA.js → brainfuck-CTNFyOLg.js} +0 -0
  252. /package/dist/client/assets/{chunk-3PELD44J-CL87tpFo.js → chunk-3PELD44J-DymL2rGq.js} +0 -0
  253. /package/dist/client/assets/{chunk-A66AFZZU-DuceaGnc.js → chunk-A66AFZZU-BFHL744F.js} +0 -0
  254. /package/dist/client/assets/{chunk-AXZTUZBK-Cxfm7hmm.js → chunk-AXZTUZBK-DuMiJYO9.js} +0 -0
  255. /package/dist/client/assets/{chunk-SRAX5OIU-CC2mobFL.js → chunk-SRAX5OIU-CLVBQRWC.js} +0 -0
  256. /package/dist/client/assets/{clike-D5X7HJpo.js → clike-1_ZsiVV8.js} +0 -0
  257. /package/dist/client/assets/{clojure-BEDKZv_5.js → clojure-D-DYVqu7.js} +0 -0
  258. /package/dist/client/assets/{cmake-Y3shE7av.js → cmake-DtGL-Unu.js} +0 -0
  259. /package/dist/client/assets/{cobol-f-3TLk62.js → cobol-DP4QggbL.js} +0 -0
  260. /package/dist/client/assets/{coffeescript-C0XA9-xa.js → coffeescript-B_7eyHAa.js} +0 -0
  261. /package/dist/client/assets/{commonlisp-BOB6sIEu.js → commonlisp-COlJYiQT.js} +0 -0
  262. /package/dist/client/assets/{crystal-ByNgE_My.js → crystal-I_dE9xG-.js} +0 -0
  263. /package/dist/client/assets/{css-eaI-ENiR.js → css-CmhPNxBE.js} +0 -0
  264. /package/dist/client/assets/{cypher-CQ-dGGSi.js → cypher-DE6I2lIA.js} +0 -0
  265. /package/dist/client/assets/{cytoscape.esm-DBDRhUia.js → cytoscape.esm-Czjc507F.js} +0 -0
  266. /package/dist/client/assets/{d-D9pnu4Cr.js → d-BNkKjn0o.js} +0 -0
  267. /package/dist/client/assets/{defaultLocale-BWgun1yJ.js → defaultLocale-B_FbTTbl.js} +0 -0
  268. /package/dist/client/assets/{diff-z9q33Lo6.js → diff-BWuPUsEo.js} +0 -0
  269. /package/dist/client/assets/{dist-xO1ImhKz.js → dist-BU8uusJX.js} +0 -0
  270. /package/dist/client/assets/{dist-CsYRf4AV.js → dist-x7PIEmJu.js} +0 -0
  271. /package/dist/client/assets/{drawio-room-C592VDk7.js → drawio-room-DEivFyNV.js} +0 -0
  272. /package/dist/client/assets/{dtd-BDizf_te.js → dtd-C6brJFPg.js} +0 -0
  273. /package/dist/client/assets/{dylan-Bk__XCKW.js → dylan-Bft86ZSB.js} +0 -0
  274. /package/dist/client/assets/{ebnf-SzN4Kxtp.js → ebnf-D6ifG44A.js} +0 -0
  275. /package/dist/client/assets/{ecl-5ulxiKbt.js → ecl-M7Iek4lq.js} +0 -0
  276. /package/dist/client/assets/{eiffel-Bhoaqbb6.js → eiffel-DwxtewZF.js} +0 -0
  277. /package/dist/client/assets/{elm-C3je846J.js → elm-B1TncobV.js} +0 -0
  278. /package/dist/client/assets/{erlang-Cgk9SIAz.js → erlang-BDJZNtt8.js} +0 -0
  279. /package/dist/client/assets/{excalidraw-mermaid-stub-B_2dv3Ll.js → excalidraw-mermaid-stub-BZPU4ZhU.js} +0 -0
  280. /package/dist/client/assets/{fcl-dvkZwp9p.js → fcl-BWKK0S4-.js} +0 -0
  281. /package/dist/client/assets/{forth-DmfSa3jN.js → forth-nvhcMz63.js} +0 -0
  282. /package/dist/client/assets/{fortran-BsZAiNnN.js → fortran-BZID-z10.js} +0 -0
  283. /package/dist/client/assets/{gas-DBpKE9ut.js → gas-DjQsZDGE.js} +0 -0
  284. /package/dist/client/assets/{gherkin-CceEbBs7.js → gherkin-S0kHlzux.js} +0 -0
  285. /package/dist/client/assets/{groovy-CxJnDvES.js → groovy-BEKazBrO.js} +0 -0
  286. /package/dist/client/assets/{haskell-CUSb34Xy.js → haskell-C6qH3-aI.js} +0 -0
  287. /package/dist/client/assets/{haxe-6EHO_h-N.js → haxe-BY9d_5nB.js} +0 -0
  288. /package/dist/client/assets/{http-C3qcBpvG.js → http-DG1Y9fpK.js} +0 -0
  289. /package/dist/client/assets/{idl-C95wIO2I.js → idl-B64p3NTJ.js} +0 -0
  290. /package/dist/client/assets/{image-blob-reduce.esm-BaW4gpT9.js → image-blob-reduce.esm-DriR2zT9.js} +0 -0
  291. /package/dist/client/assets/{init-Bjj5fg68.js → init-DtLQcSuO.js} +0 -0
  292. /package/dist/client/assets/{isArrayLikeObject-Cmt1CYnI.js → isArrayLikeObject-BId_dPHM.js} +0 -0
  293. /package/dist/client/assets/{javascript-aWB87b1w.js → javascript-CdiVhQeA.js} +0 -0
  294. /package/dist/client/assets/{jsx-runtime-DiaMmmG6.js → jsx-runtime-C2p7wRmT.js} +0 -0
  295. /package/dist/client/assets/{julia-DF9PPAXG.js → julia-B22G9Bym.js} +0 -0
  296. /package/dist/client/assets/{katex-BPsFnA3D.js → katex-CXYULLWy.js} +0 -0
  297. /package/dist/client/assets/{livescript-CnOyWwUY.js → livescript-CkcuHqeS.js} +0 -0
  298. /package/dist/client/assets/{lua-a0rEq19C.js → lua-kutgyRGY.js} +0 -0
  299. /package/dist/client/assets/{math-BaavbII8.js → math-B-LMBwub.js} +0 -0
  300. /package/dist/client/assets/{mathematica-CKUq0Ojc.js → mathematica-CKVhKnoY.js} +0 -0
  301. /package/dist/client/assets/{mbox-a-u2PLog.js → mbox-DANyzFJ2.js} +0 -0
  302. /package/dist/client/assets/{mirc-BOd43sOX.js → mirc-BVG2S5rO.js} +0 -0
  303. /package/dist/client/assets/{mllike-fHruGivh.js → mllike-C0p7lv48.js} +0 -0
  304. /package/dist/client/assets/{modelica-B0NJqf1C.js → modelica-vJ-Qa9jV.js} +0 -0
  305. /package/dist/client/assets/{mscgen-DJZ33SrF.js → mscgen-vUD-SWGJ.js} +0 -0
  306. /package/dist/client/assets/{mumps-DvMvHTxU.js → mumps-D0KfUTSd.js} +0 -0
  307. /package/dist/client/assets/{nginx-BVAs8laz.js → nginx-DkVceJrH.js} +0 -0
  308. /package/dist/client/assets/{ntriples-DrdyAZU1.js → ntriples-BBuCIfS0.js} +0 -0
  309. /package/dist/client/assets/{octave-_YqJ0g7E.js → octave-BTv2CqSQ.js} +0 -0
  310. /package/dist/client/assets/{oz-k7T3LoMr.js → oz-D8SjVDNU.js} +0 -0
  311. /package/dist/client/assets/{pascal-CftsTvte.js → pascal-T-tfhVyx.js} +0 -0
  312. /package/dist/client/assets/{path-BUmMWM1-.js → path-DIlZIGue.js} +0 -0
  313. /package/dist/client/assets/{perl-CbsLFc7A.js → perl-BDrCkHRd.js} +0 -0
  314. /package/dist/client/assets/{pica-By-YDy_B.js → pica-C1TdTz-C.js} +0 -0
  315. /package/dist/client/assets/{pig-C-jTwMS-.js → pig-BEyI4fPq.js} +0 -0
  316. /package/dist/client/assets/{powershell-DqXLgSHX.js → powershell-DtnFc6GG.js} +0 -0
  317. /package/dist/client/assets/{preview-diagram-utils-Dc83ucbv.js → preview-diagram-utils-COt-IYMD.js} +0 -0
  318. /package/dist/client/assets/{preview-render-profile-DPzmho7I.js → preview-render-profile-CR4dJZrp.js} +0 -0
  319. /package/dist/client/assets/{properties-05jaw55P.js → properties-DWUvbxV9.js} +0 -0
  320. /package/dist/client/assets/{protobuf-DThTsZQN.js → protobuf-CQGoYyfE.js} +0 -0
  321. /package/dist/client/assets/{puppet-DuHxMpoj.js → puppet-Dd-qWO3p.js} +0 -0
  322. /package/dist/client/assets/{python-BiE2VHJI.js → python-CZtTmYkS.js} +0 -0
  323. /package/dist/client/assets/{q-DH46YfNw.js → q-I27iQntV.js} +0 -0
  324. /package/dist/client/assets/{r-DmEm46kJ.js → r-DN_EydfL.js} +0 -0
  325. /package/dist/client/assets/{rough.esm-jZQkcmER.js → rough.esm-DE_lJ5Ge.js} +0 -0
  326. /package/dist/client/assets/{roundRect-CI6UmGg6.js → roundRect-BzEouiv_.js} +0 -0
  327. /package/dist/client/assets/{rpm-DILIIbRB.js → rpm-CjWxLM68.js} +0 -0
  328. /package/dist/client/assets/{ruby-2LcnHEMS.js → ruby-CB34f2Gf.js} +0 -0
  329. /package/dist/client/assets/{runtime-config-CqX_f_Q4.js → runtime-config-CqhchMC4.js} +0 -0
  330. /package/dist/client/assets/{sas-Bn81MKuB.js → sas-Bji4HDQq.js} +0 -0
  331. /package/dist/client/assets/{scheme-B8kPNbgd.js → scheme-C3elI80V.js} +0 -0
  332. /package/dist/client/assets/{shell-CGj6v8kb.js → shell-DUveK2Hb.js} +0 -0
  333. /package/dist/client/assets/{sieve-CfVNFN1K.js → sieve-2ogwMVx4.js} +0 -0
  334. /package/dist/client/assets/{simple-mode-_FSHdiXs.js → simple-mode-pOKc0mfx.js} +0 -0
  335. /package/dist/client/assets/{smalltalk-BpIFyCPt.js → smalltalk-BuGhc6lW.js} +0 -0
  336. /package/dist/client/assets/{solr-B7iFaetn.js → solr-DTxshpm8.js} +0 -0
  337. /package/dist/client/assets/{sparql-COhgMTFK.js → sparql-BOvq0dv7.js} +0 -0
  338. /package/dist/client/assets/{spreadsheet-BzuffEeg.js → spreadsheet-C6Vbtl9-.js} +0 -0
  339. /package/dist/client/assets/{sql-13lT5zDl.js → sql-DDFeQNTK.js} +0 -0
  340. /package/dist/client/assets/{src-E3c2cohN.js → src-Pgt9Gp65.js} +0 -0
  341. /package/dist/client/assets/{stex-BRSfZZYG.js → stex-CEwW0Q_0.js} +0 -0
  342. /package/dist/client/assets/{stylus-fFo0QRk_.js → stylus-D1SZIMDs.js} +0 -0
  343. /package/dist/client/assets/{swift-wb5gyb6a.js → swift-BCxe4-cw.js} +0 -0
  344. /package/dist/client/assets/{tcl-BJA7GgWY.js → tcl-SPk7uiDB.js} +0 -0
  345. /package/dist/client/assets/{textile-BQjiYu-x.js → textile-C48beRus.js} +0 -0
  346. /package/dist/client/assets/{tiddlywiki-D2vUXB6n.js → tiddlywiki-CiImjFLN.js} +0 -0
  347. /package/dist/client/assets/{tiki-BFhpdznG.js → tiki-HkXZ4BIW.js} +0 -0
  348. /package/dist/client/assets/{toml-DN06iQUw.js → toml-BmfpMy1_.js} +0 -0
  349. /package/dist/client/assets/{troff-DuQfjhPH.js → troff-BjbEOT5E.js} +0 -0
  350. /package/dist/client/assets/{ttcn-BCTy6d50.js → ttcn-NA-V4KnY.js} +0 -0
  351. /package/dist/client/assets/{ttcn-cfg-BYnZQqGa.js → ttcn-cfg-TPHncdGN.js} +0 -0
  352. /package/dist/client/assets/{turtle-BvN-Me9x.js → turtle-GBz_E4RG.js} +0 -0
  353. /package/dist/client/assets/{vb-DYk3wW9u.js → vb-C19AQWqO.js} +0 -0
  354. /package/dist/client/assets/{vbscript-BKI61VS6.js → vbscript-CHJk3s95.js} +0 -0
  355. /package/dist/client/assets/{velocity-BrtitHHA.js → velocity-Ya0P4sQU.js} +0 -0
  356. /package/dist/client/assets/{verilog-CjUx3yiL.js → verilog-C4wTycyo.js} +0 -0
  357. /package/dist/client/assets/{vhdl-CPWwYF4V.js → vhdl-Bwndeg44.js} +0 -0
  358. /package/dist/client/assets/{webidl-PiVOzma8.js → webidl-DttrYZRT.js} +0 -0
  359. /package/dist/client/assets/{xquery-CiTzM_oK.js → xquery-CEDTd8qs.js} +0 -0
  360. /package/dist/client/assets/{yacas-4QS9CntY.js → yacas-C7dxlPB0.js} +0 -0
  361. /package/dist/client/assets/{yjs-provider-reset-guard-DWGhQClh.js → yjs-provider-reset-guard-CtERLBID.js} +0 -0
  362. /package/dist/client/assets/{z80-BxidrTKR.js → z80-BqEfFSnA.js} +0 -0
@@ -1,4 +1,5 @@
1
1
  import {
2
+ isBaseFilePath,
2
3
  isMarkdownFilePath,
3
4
  supportsBacklinksForFilePath,
4
5
  } from '../../domain/file-kind.js';
@@ -12,6 +13,7 @@ export class WorkspaceChromeController {
12
13
  onRenderDrawioPreview,
13
14
  onFileOpenError,
14
15
  onFileOpenReady,
16
+ onRenderBasePreview,
15
17
  onRenderExcalidrawPreview,
16
18
  onRenderImagePreview,
17
19
  onSyncWrapToggle,
@@ -24,23 +26,24 @@ export class WorkspaceChromeController {
24
26
  showEditorLoading,
25
27
  stateStore,
26
28
  }) {
27
- this.beginDocumentLoad = beginDocumentLoad;
28
- this.getDisplayName = getDisplayName;
29
- this.loadBacklinks = loadBacklinks;
30
- this.onBeforeFileOpen = onBeforeFileOpen;
31
- this.onRenderDrawioPreview = onRenderDrawioPreview;
32
- this.onFileOpenError = onFileOpenError;
33
- this.onFileOpenReady = onFileOpenReady;
34
- this.onRenderExcalidrawPreview = onRenderExcalidrawPreview;
35
- this.onRenderImagePreview = onRenderImagePreview;
36
- this.onSyncWrapToggle = onSyncWrapToggle;
37
- this.onUpdateActiveFile = onUpdateActiveFile;
38
- this.onUpdateCurrentFile = onUpdateCurrentFile;
39
- this.onUpdateLobbyCurrentFile = onUpdateLobbyCurrentFile;
40
- this.onUpdateVisibleChrome = onUpdateVisibleChrome;
41
- this.onViewModeReset = onViewModeReset;
42
- this.renderPresence = renderPresence;
43
- this.showEditorLoading = showEditorLoading;
29
+ this.beginDocumentLoad = beginDocumentLoad ?? (() => {});
30
+ this.getDisplayName = getDisplayName ?? ((filePath) => filePath);
31
+ this.loadBacklinks = loadBacklinks ?? (() => {});
32
+ this.onBeforeFileOpen = onBeforeFileOpen ?? (() => {});
33
+ this.onRenderDrawioPreview = onRenderDrawioPreview ?? (() => {});
34
+ this.onFileOpenError = onFileOpenError ?? (() => {});
35
+ this.onFileOpenReady = onFileOpenReady ?? (() => {});
36
+ this.onRenderBasePreview = onRenderBasePreview ?? (() => {});
37
+ this.onRenderExcalidrawPreview = onRenderExcalidrawPreview ?? (() => {});
38
+ this.onRenderImagePreview = onRenderImagePreview ?? (() => {});
39
+ this.onSyncWrapToggle = onSyncWrapToggle ?? (() => {});
40
+ this.onUpdateActiveFile = onUpdateActiveFile ?? (() => {});
41
+ this.onUpdateCurrentFile = onUpdateCurrentFile ?? (() => {});
42
+ this.onUpdateLobbyCurrentFile = onUpdateLobbyCurrentFile ?? (() => {});
43
+ this.onUpdateVisibleChrome = onUpdateVisibleChrome ?? (() => {});
44
+ this.onViewModeReset = onViewModeReset ?? (() => {});
45
+ this.renderPresence = renderPresence ?? (() => {});
46
+ this.showEditorLoading = showEditorLoading ?? (() => {});
44
47
  this.stateStore = stateStore;
45
48
  }
46
49
 
@@ -75,16 +78,19 @@ export class WorkspaceChromeController {
75
78
  }
76
79
 
77
80
  finalizeFileOpen({
81
+ isBase = false,
78
82
  isDrawio = false,
79
83
  filePath,
80
84
  isExcalidraw = false,
81
85
  isImage = false,
82
- session = null,
83
86
  supportsBacklinks,
84
87
  }) {
85
88
  if (isExcalidraw) {
86
89
  this.onRenderExcalidrawPreview(filePath);
87
90
  }
91
+ if (isBase || isBaseFilePath(filePath)) {
92
+ this.onRenderBasePreview(filePath);
93
+ }
88
94
  if (isDrawio) {
89
95
  this.onRenderDrawioPreview(filePath);
90
96
  }
@@ -92,7 +98,7 @@ export class WorkspaceChromeController {
92
98
  this.onRenderImagePreview(filePath);
93
99
  }
94
100
  this.onSyncWrapToggle();
95
- if (supportsBacklinks && session) {
101
+ if (supportsBacklinks) {
96
102
  this.loadBacklinks(filePath);
97
103
  }
98
104
  }
@@ -21,6 +21,7 @@ export class WorkspaceCoordinator {
21
21
  getLocalUser,
22
22
  getStoredUserName,
23
23
  getTheme,
24
+ isBaseFile,
24
25
  isDrawioFile,
25
26
  isExcalidrawFile,
26
27
  isImageFile,
@@ -41,6 +42,7 @@ export class WorkspaceCoordinator {
41
42
  onSelectionChange,
42
43
  onSessionAssigned = null,
43
44
  onFileOpenMetric = null,
45
+ onRenderBasePreview,
44
46
  onRenderExcalidrawPreview,
45
47
  onRenderDrawioPreview,
46
48
  onRenderImagePreview,
@@ -66,6 +68,7 @@ export class WorkspaceCoordinator {
66
68
  this.getLocalUser = getLocalUser;
67
69
  this.getStoredUserName = getStoredUserName;
68
70
  this.getTheme = getTheme;
71
+ this.isBaseFile = isBaseFile ?? (() => false);
69
72
  this.isDrawioFile = isDrawioFile ?? (() => false);
70
73
  this.isExcalidrawFile = isExcalidrawFile ?? (() => false);
71
74
  this.isImageFile = isImageFile ?? (() => false);
@@ -86,6 +89,7 @@ export class WorkspaceCoordinator {
86
89
  this.onSelectionChange = onSelectionChange;
87
90
  this.onSessionAssigned = onSessionAssigned;
88
91
  this.onFileOpenMetric = onFileOpenMetric;
92
+ this.onRenderBasePreview = onRenderBasePreview;
89
93
  this.onRenderExcalidrawPreview = onRenderExcalidrawPreview;
90
94
  this.onSyncWrapToggle = onSyncWrapToggle;
91
95
  this.onUpdateActiveFile = onUpdateActiveFile;
@@ -110,6 +114,7 @@ export class WorkspaceCoordinator {
110
114
  onRenderDrawioPreview,
111
115
  onFileOpenError,
112
116
  onFileOpenReady,
117
+ onRenderBasePreview,
113
118
  onRenderExcalidrawPreview,
114
119
  onRenderImagePreview,
115
120
  onSyncWrapToggle,
@@ -164,6 +169,7 @@ export class WorkspaceCoordinator {
164
169
  const currentDrawioMode = this.stateStore.get('currentDrawioMode') ?? null;
165
170
  const isDrawio = this.isDrawioFile(filePath) && drawioMode !== 'text' && this.shouldUseDrawioPreview(filePath);
166
171
  const isExcalidraw = this.isExcalidrawFile(filePath);
172
+ const isBase = this.isBaseFile(filePath);
167
173
  const isImage = this.isImageFile(filePath);
168
174
  const isMermaid = this.isMermaidFile(filePath);
169
175
  const isPlantUml = this.isPlantUmlFile(filePath);
@@ -198,6 +204,7 @@ export class WorkspaceCoordinator {
198
204
  this.chromeController.markFileOpenReady(null);
199
205
  this.chromeController.finalizeFileOpen({
200
206
  filePath,
207
+ isBase,
201
208
  isDrawio,
202
209
  isExcalidraw,
203
210
  isImage,
@@ -221,6 +228,7 @@ export class WorkspaceCoordinator {
221
228
  }
222
229
 
223
230
  this.onContentChange({
231
+ isBase,
224
232
  isMermaid,
225
233
  isPlantUml,
226
234
  });
@@ -259,6 +267,7 @@ export class WorkspaceCoordinator {
259
267
  fileOpenFinalized = true;
260
268
  this.chromeController.finalizeFileOpen({
261
269
  filePath,
270
+ isBase,
262
271
  isExcalidraw,
263
272
  session,
264
273
  supportsBacklinks: chromeState.supportsBacklinks,
@@ -1,4 +1,5 @@
1
1
  import {
2
+ isBaseFilePath,
2
3
  isDiagramFilePath,
3
4
  isMarkdownFilePath,
4
5
  } from '../../domain/file-kind.js';
@@ -7,6 +8,7 @@ import { resolveApiUrl } from '../domain/runtime-paths.js';
7
8
  export class WorkspacePreviewController {
8
9
  constructor({
9
10
  backlinksPanel,
11
+ basesPreview = null,
10
12
  drawioEmbed,
11
13
  elements,
12
14
  excalidrawEmbed,
@@ -14,6 +16,7 @@ export class WorkspacePreviewController {
14
16
  getSession,
15
17
  isDrawioFile,
16
18
  isExcalidrawFile,
19
+ isBaseFile,
17
20
  isImageFile,
18
21
  isMermaidFile,
19
22
  isPlantUmlFile,
@@ -25,6 +28,7 @@ export class WorkspacePreviewController {
25
28
  videoEmbed,
26
29
  }) {
27
30
  this.backlinksPanel = backlinksPanel;
31
+ this.basesPreview = basesPreview ?? { reconcileEmbeds() {}, renderStandalone() {} };
28
32
  this.drawioEmbed = drawioEmbed ?? {
29
33
  detachForCommit() {},
30
34
  hydrateVisibleEmbeds() {},
@@ -40,6 +44,7 @@ export class WorkspacePreviewController {
40
44
  this.getSession = getSession;
41
45
  this.isDrawioFile = isDrawioFile ?? (() => false);
42
46
  this.isExcalidrawFile = isExcalidrawFile ?? (() => false);
47
+ this.isBaseFile = isBaseFile ?? isBaseFilePath;
43
48
  this.isImageFile = isImageFile ?? (() => false);
44
49
  this.isMermaidFile = isMermaidFile ?? (() => false);
45
50
  this.isPlantUmlFile = isPlantUmlFile ?? (() => false);
@@ -78,28 +83,33 @@ export class WorkspacePreviewController {
78
83
  resetPreviewMode() {
79
84
  this.elements.previewContent?.classList.remove('is-drawio-file-preview');
80
85
  this.elements.previewContent?.classList.remove('is-excalidraw-file-preview');
86
+ this.elements.previewContent?.classList.remove('is-base-file-preview');
81
87
  this.elements.previewContent?.classList.remove('is-image-file-preview');
82
88
  this.elements.previewContent?.classList.remove('is-mermaid-file-preview');
83
89
  this.elements.previewContent?.classList.remove('is-plantuml-file-preview');
84
90
  }
85
91
 
86
- syncFileChrome(filePath, { drawioMode = null } = {}) {
92
+ syncFileChrome(filePath, { drawioMode = null, preferPreviewForBase = false } = {}) {
87
93
  const isDrawio = this.isDrawioFile(filePath);
88
94
  const isExcalidraw = this.isExcalidrawFile(filePath);
95
+ const isBase = this.isBaseFile(filePath);
89
96
  const isImage = this.isImageFile(filePath);
90
97
  const isMarkdown = isMarkdownFilePath(filePath);
91
98
  const isMermaid = this.isMermaidFile(filePath);
92
99
  const isPlantUml = this.isPlantUmlFile(filePath);
93
100
  const isDiagramFile = isDiagramFilePath(filePath);
101
+ const usesHeaderBacklinks = isExcalidraw || (isDrawio && drawioMode !== 'text');
102
+
103
+ this.backlinksPanel.setDisplayMode?.(usesHeaderBacklinks ? 'header' : 'dock');
94
104
 
95
105
  this.elements.editorFindButton?.classList.toggle('hidden', !isMarkdown);
96
106
  this.elements.markdownToolbar?.classList.toggle('hidden', !isMarkdown);
97
107
  this.elements.exportMenuGroup?.classList.toggle('hidden', !isMarkdown);
98
- this.elements.outlineToggle?.classList.toggle('hidden', isDiagramFile || isImage);
108
+ this.elements.outlineToggle?.classList.toggle('hidden', isDiagramFile || isImage || isBase);
99
109
  this.elements.previewContent?.classList.toggle('is-mermaid-file-preview', isMermaid);
100
110
  this.elements.previewContent?.classList.toggle('is-plantuml-file-preview', isPlantUml);
101
111
 
102
- if ((isDrawio && drawioMode !== 'text') || isExcalidraw || isImage) {
112
+ if ((isDrawio && drawioMode !== 'text') || isExcalidraw || isImage || (isBase && preferPreviewForBase)) {
103
113
  this.layoutController.setView('preview', { persist: false });
104
114
  this.outlineController.close();
105
115
  this.backlinksPanel.clear();
@@ -228,6 +238,41 @@ export class WorkspacePreviewController {
228
238
  this.schedulePreviewLayoutSyncCallback({ delayMs: 0 });
229
239
  }
230
240
 
241
+ async renderBaseFilePreview(filePath, { source = null } = {}) {
242
+ const previewElement = this.elements.previewContent;
243
+ if (!previewElement) {
244
+ return;
245
+ }
246
+
247
+ this.videoEmbed?.detachForCommit();
248
+ this.drawioEmbed.detachForCommit();
249
+ this.excalidrawEmbed.detachForCommit();
250
+ this.resetPreviewMode();
251
+ previewElement.classList.add('is-base-file-preview');
252
+ const renderHost = this.previewRenderer.ensureRenderHost();
253
+ this.previewRenderer.normalizePreviewChildren(renderHost);
254
+
255
+ if (renderHost) {
256
+ renderHost.replaceChildren();
257
+ renderHost.style.minHeight = '';
258
+ }
259
+
260
+ await this.basesPreview.renderStandalone({
261
+ filePath,
262
+ renderHost,
263
+ source: typeof source === 'string'
264
+ ? source
265
+ : (this.getSession()?.getText?.() ?? null),
266
+ });
267
+
268
+ previewElement.dataset.renderPhase = 'ready';
269
+ this.outlineController.close();
270
+ this.scrollSyncController.setLargeDocumentMode(false);
271
+ this.scrollSyncController.invalidatePreviewBlocks();
272
+ this.videoEmbed?.reconcileEmbeds(previewElement);
273
+ this.schedulePreviewLayoutSyncCallback({ delayMs: 0 });
274
+ }
275
+
231
276
  renderTextFilePreview({ content = '' } = {}) {
232
277
  const previewElement = this.elements.previewContent;
233
278
  if (!previewElement) {
@@ -22,6 +22,7 @@ import { TabActivityLock } from '../infrastructure/tab-activity-lock.js';
22
22
  import { vaultApiClient } from '../infrastructure/vault-api-client.js';
23
23
  import { WorkspaceSyncClient } from '../infrastructure/workspace-sync-client.js';
24
24
  import { BacklinksPanel } from '../presentation/backlinks-panel.js';
25
+ import { BasesPreviewController } from '../presentation/bases-preview-controller.js';
25
26
  import { CommentUiController } from '../presentation/comment-ui-controller.js';
26
27
  import { DrawioEmbedController } from '../presentation/drawio-embed-controller.js';
27
28
  import { ExcalidrawEmbedController } from '../presentation/excalidraw-embed-controller.js';
@@ -185,6 +186,13 @@ export class CollabMdAppShell {
185
186
  this.videoEmbed = new VideoEmbedController({
186
187
  previewElement: this.elements.previewContent,
187
188
  });
189
+ this.basesPreview = new BasesPreviewController({
190
+ getActiveFilePath: () => this.currentFilePath,
191
+ onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
192
+ previewElement: this.elements.previewContent,
193
+ toastController: this.toastController,
194
+ vaultApiClient: this.vaultApiClient,
195
+ });
188
196
  this.imageLightbox = new ImageLightboxController({
189
197
  previewElement: this.elements.previewContent,
190
198
  });
@@ -199,6 +207,7 @@ export class CollabMdAppShell {
199
207
  });
200
208
  this.videoEmbed.reconcileEmbeds(this.elements.previewContent);
201
209
  this.videoEmbed.syncLayout();
210
+ this.basesPreview.reconcileEmbeds(this.elements.previewContent);
202
211
  this.drawioEmbed.reconcileEmbeds(this.elements.previewContent);
203
212
  this.drawioEmbed.syncLayout();
204
213
  this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent, { isLargeDocument: stats.isLargeDocument });
@@ -242,6 +251,7 @@ export class CollabMdAppShell {
242
251
  scrollEditorToLine: (lineNumber, viewportRatio) => this.session?.scrollToLine(lineNumber, viewportRatio),
243
252
  });
244
253
  this.backlinksPanel = new BacklinksPanel({
254
+ headerPanelElement: this.elements.backlinksHeaderPanel,
245
255
  inlinePanelElement: this.elements.backlinksInlinePanel,
246
256
  onFileSelect: (filePath) => this.handleFileSelection(filePath, { closeSidebarOnMobile: true }),
247
257
  panelElement: this.elements.backlinksPanel,
@@ -284,11 +294,13 @@ export class CollabMdAppShell {
284
294
  });
285
295
  this.workspacePreviewController = new WorkspacePreviewController({
286
296
  backlinksPanel: this.backlinksPanel,
297
+ basesPreview: this.basesPreview,
287
298
  drawioEmbed: this.drawioEmbed,
288
299
  elements: this.elements,
289
300
  excalidrawEmbed: this.excalidrawEmbed,
290
301
  getDisplayName: (filePath) => this.getDisplayName(filePath),
291
302
  getSession: () => this.session,
303
+ isBaseFile: (filePath) => this.isBaseFile(filePath),
292
304
  isDrawioFile: (filePath) => this.isDrawioFile(filePath),
293
305
  isExcalidrawFile: (filePath) => this.isExcalidrawFile(filePath),
294
306
  isImageFile: (filePath) => this.isImageFile(filePath),
@@ -374,6 +386,7 @@ export class CollabMdAppShell {
374
386
  getLocalUser: () => this.lobby.getLocalUser(),
375
387
  getStoredUserName: () => this.getStoredUserName(),
376
388
  getTheme: () => this.themeController.getTheme(),
389
+ isBaseFile: (filePath) => this.isBaseFile(filePath),
377
390
  isDrawioFile: (filePath) => this.isDrawioFile(filePath),
378
391
  isExcalidrawFile: (filePath) => this.isExcalidrawFile(filePath),
379
392
  isImageFile: (filePath) => this.isImageFile(filePath),
@@ -397,8 +410,15 @@ export class CollabMdAppShell {
397
410
  this.clearInitialFileBootstrap();
398
411
  },
399
412
  onConnectionChange: (state) => this.handleConnectionChange(state),
400
- onContentChange: ({ isMermaid, isPlantUml }) => {
413
+ onContentChange: ({ isBase, isMermaid, isPlantUml }) => {
401
414
  this.handleCommentEditorContentChange();
415
+ if (isBase) {
416
+ void this.renderBaseFilePreview(this.currentFilePath, {
417
+ source: this.session?.getText?.() ?? '',
418
+ });
419
+ return;
420
+ }
421
+
402
422
  this.previewRenderer.queueRender();
403
423
  if (!isMermaid && !isPlantUml) {
404
424
  this.scheduleBacklinkRefresh();
@@ -422,6 +442,7 @@ export class CollabMdAppShell {
422
442
  this.commentUi.attachSession(session);
423
443
  },
424
444
  onRenderDrawioPreview: (filePath) => this.renderDrawioFilePreview(filePath),
445
+ onRenderBasePreview: (filePath) => this.renderBaseFilePreview(filePath),
425
446
  onRenderExcalidrawPreview: (filePath) => this.renderExcalidrawFilePreview(filePath),
426
447
  onRenderImagePreview: (filePath) => this.renderImageFilePreview(filePath),
427
448
  onSyncWrapToggle: () => this.syncWrapToggle(),
@@ -431,7 +452,10 @@ export class CollabMdAppShell {
431
452
  },
432
453
  onUpdateLobbyCurrentFile: (filePath) => this.lobby.setCurrentFile(filePath),
433
454
  onUpdateVisibleChrome: (filePath, { displayName }) => {
434
- this.syncFileChrome(filePath, { drawioMode: this.currentDrawioMode });
455
+ this.syncFileChrome(filePath, {
456
+ drawioMode: this.currentDrawioMode,
457
+ preferPreviewForBase: this.isBaseFile(filePath),
458
+ });
435
459
  this.syncCommentChrome(filePath);
436
460
  this.syncFileHistoryButton({ filePath, mode: 'editor' });
437
461
  if (this.elements.activeFileName) {
@@ -1,4 +1,5 @@
1
1
  import {
2
+ isBaseFilePath,
2
3
  isDrawioFilePath,
3
4
  isMermaidFilePath,
4
5
  isPlantUmlFilePath,
@@ -47,6 +48,24 @@ export function createMarkdownStarter(filePath) {
47
48
  return `# ${title}\n\n`;
48
49
  }
49
50
 
51
+ export function createBaseStarter(filePath) {
52
+ const normalizedPath = normalizeVaultPathInput(filePath);
53
+ const nextPath = isBaseFilePath(normalizedPath)
54
+ ? normalizedPath
55
+ : `${normalizedPath}.base`;
56
+ return {
57
+ content: [
58
+ 'views:',
59
+ ' - type: table',
60
+ ' name: Table',
61
+ ' order:',
62
+ ' - file.name',
63
+ '',
64
+ ].join('\n'),
65
+ path: nextPath,
66
+ };
67
+ }
68
+
50
69
  export function createMermaidStarter(filePath) {
51
70
  const normalizedPath = normalizeVaultPathInput(filePath);
52
71
  const nextPath = isMermaidFilePath(normalizedPath)
@@ -1,4 +1,10 @@
1
- import { runExportAdapter, postExportPageMessage, prepareExportSnapshot, waitForBootstrapPayload } from './export-pipeline.js';
1
+ import {
2
+ postExportPageMessage,
3
+ prepareExportSnapshot,
4
+ runExportAdapter,
5
+ waitForBootstrapPayload,
6
+ waitForRenderedExportContent,
7
+ } from './export-pipeline.js';
2
8
  import { groupHeadingWithFollowingBlock } from './export-print-layout.js';
3
9
 
4
10
  function setStatus(message) {
@@ -28,13 +34,14 @@ function renderWarnings(snapshot) {
28
34
  function renderSnapshot(snapshot) {
29
35
  const mount = document.getElementById('exportContent');
30
36
  if (!mount) {
31
- return;
37
+ return null;
32
38
  }
33
39
 
34
40
  document.title = `${snapshot.title} — Export`;
35
41
  mount.innerHTML = snapshot.html;
36
42
  groupHeadingWithFollowingBlock(mount);
37
43
  renderWarnings(snapshot);
44
+ return mount;
38
45
  }
39
46
 
40
47
  async function bootstrap() {
@@ -42,7 +49,8 @@ async function bootstrap() {
42
49
  setStatus('Loading export content…');
43
50
  const payload = await waitForBootstrapPayload();
44
51
  const snapshot = await prepareExportSnapshot(payload);
45
- renderSnapshot(snapshot);
52
+ const mount = renderSnapshot(snapshot);
53
+ snapshot.html = await waitForRenderedExportContent(mount);
46
54
  setStatus(payload.action === 'pdf' ? 'Opening print dialog…' : 'Preparing DOCX download…');
47
55
  await runExportAdapter(snapshot, payload.action);
48
56
  setStatus(payload.action === 'pdf' ? 'Print dialog opened.' : 'DOCX download started.');
@@ -23,6 +23,7 @@ const LIGHT_EXPORT_MERMAID_THEME = Object.freeze({
23
23
  });
24
24
  const EXPORT_ASSET_FETCH_TIMEOUT_MS = 10_000;
25
25
  const EXPORT_ASSET_MAX_BYTES = 10 * 1024 * 1024;
26
+ const EXPORT_RENDER_SETTLE_TIMEOUT_MS = 10_000;
26
27
  const VIDEO_POSTER_CAPTURE_TIMEOUT_MS = 10_000;
27
28
  const VIDEO_POSTER_CAPTURE_SEEK_SECONDS = 1;
28
29
 
@@ -48,6 +49,10 @@ function encodeSvgDataUrl(svgMarkup) {
48
49
  return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgMarkup)}`;
49
50
  }
50
51
 
52
+ function waitForAnimationFrame() {
53
+ return new Promise((resolve) => requestAnimationFrame(() => resolve()));
54
+ }
55
+
51
56
  function blobToDataUrl(blob) {
52
57
  return new Promise((resolve, reject) => {
53
58
  const reader = new FileReader();
@@ -177,6 +182,49 @@ async function imageDataUrlToPngDataUrl(dataUrl) {
177
182
  return canvas.toDataURL('image/png');
178
183
  }
179
184
 
185
+ async function waitForImageElement(image, {
186
+ timeoutMs = EXPORT_RENDER_SETTLE_TIMEOUT_MS,
187
+ } = {}) {
188
+ if (!(image instanceof HTMLImageElement)) {
189
+ return;
190
+ }
191
+
192
+ if (!image.getAttribute('src')) {
193
+ return;
194
+ }
195
+
196
+ if (!image.complete) {
197
+ await new Promise((resolve) => {
198
+ let settled = false;
199
+ const cleanup = () => {
200
+ if (settled) {
201
+ return;
202
+ }
203
+ settled = true;
204
+ window.clearTimeout(timeoutId);
205
+ image.removeEventListener('load', handleDone);
206
+ image.removeEventListener('error', handleDone);
207
+ };
208
+ const handleDone = () => {
209
+ cleanup();
210
+ resolve();
211
+ };
212
+ const timeoutId = window.setTimeout(handleDone, timeoutMs);
213
+
214
+ image.addEventListener('load', handleDone, { once: true });
215
+ image.addEventListener('error', handleDone, { once: true });
216
+
217
+ if (image.complete) {
218
+ handleDone();
219
+ }
220
+ });
221
+ }
222
+
223
+ if (typeof image.decode === 'function') {
224
+ await image.decode().catch(() => {});
225
+ }
226
+ }
227
+
180
228
  async function fetchJson(url, init = {}) {
181
229
  const response = await fetch(url, {
182
230
  headers: {
@@ -1322,8 +1370,8 @@ export async function docxAdapter(snapshot) {
1322
1370
  }
1323
1371
 
1324
1372
  export async function printPdfAdapter() {
1325
- await new Promise((resolve) => requestAnimationFrame(() => resolve()));
1326
- await new Promise((resolve) => requestAnimationFrame(() => resolve()));
1373
+ await waitForAnimationFrame();
1374
+ await waitForAnimationFrame();
1327
1375
 
1328
1376
  await new Promise((resolve) => {
1329
1377
  const timeoutId = window.setTimeout(resolve, 1500);
@@ -1337,6 +1385,33 @@ export async function printPdfAdapter() {
1337
1385
  });
1338
1386
  }
1339
1387
 
1388
+ export async function waitForRenderedExportContent(container, {
1389
+ settleFrames = 2,
1390
+ timeoutMs = EXPORT_RENDER_SETTLE_TIMEOUT_MS,
1391
+ } = {}) {
1392
+ if (!container) {
1393
+ return '';
1394
+ }
1395
+
1396
+ const imageWaiters = Array.from(container.querySelectorAll('img')).map((image) => (
1397
+ waitForImageElement(image, { timeoutMs })
1398
+ ));
1399
+ const fontReadyPromise = document.fonts?.ready
1400
+ ? Promise.resolve(document.fonts.ready).catch(() => {})
1401
+ : Promise.resolve();
1402
+
1403
+ await Promise.allSettled([
1404
+ fontReadyPromise,
1405
+ ...imageWaiters,
1406
+ ]);
1407
+
1408
+ for (let index = 0; index < settleFrames; index += 1) {
1409
+ await waitForAnimationFrame();
1410
+ }
1411
+
1412
+ return container.innerHTML;
1413
+ }
1414
+
1340
1415
  export async function runExportAdapter(snapshot, format) {
1341
1416
  if (format === 'pdf') {
1342
1417
  await printPdfAdapter(snapshot);
@@ -10,6 +10,7 @@ import {
10
10
  undo,
11
11
  } from '@codemirror/commands';
12
12
  import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
13
+ import { yaml } from '@codemirror/lang-yaml';
13
14
  import {
14
15
  bracketMatching,
15
16
  defaultHighlightStyle,
@@ -37,6 +38,7 @@ import {
37
38
  } from '@codemirror/view';
38
39
  import { yCollab } from 'y-codemirror.next';
39
40
 
41
+ import { isBaseFilePath, isPlantUmlFilePath } from '../../domain/file-kind.js';
40
42
  import { normalizeCommentQuote } from '../../domain/comment-threads.js';
41
43
  import { createMarkdownToolbarEdit } from '../domain/markdown-formatting.js';
42
44
  import { wikiLinkCompletions } from '../domain/wiki-link-completions.js';
@@ -296,14 +298,15 @@ function createEditorTheme(theme) {
296
298
  }, { dark: theme === 'dark' });
297
299
  }
298
300
 
299
- function createLanguageExtension(filePath) {
300
- if (
301
- typeof filePath === 'string'
302
- && (filePath.toLowerCase().endsWith('.puml') || filePath.toLowerCase().endsWith('.plantuml'))
303
- ) {
301
+ export function createLanguageExtension(filePath) {
302
+ if (isPlantUmlFilePath(filePath)) {
304
303
  return plantUmlLanguage;
305
304
  }
306
305
 
306
+ if (isBaseFilePath(filePath)) {
307
+ return yaml();
308
+ }
309
+
307
310
  return markdown({ base: markdownLanguage, codeLanguages: markdownCodeLanguages });
308
311
  }
309
312
 
@@ -36,6 +36,60 @@ export class VaultApiClient {
36
36
  return parseApiResponse(response, 'Failed to read file');
37
37
  }
38
38
 
39
+ async queryBase({
40
+ activeFilePath = '',
41
+ path = '',
42
+ search = '',
43
+ source = null,
44
+ sourcePath = '',
45
+ view = '',
46
+ } = {}) {
47
+ const response = await fetch(resolveApiUrl('/base/query'), {
48
+ body: JSON.stringify({
49
+ activeFilePath,
50
+ path,
51
+ search,
52
+ source,
53
+ sourcePath,
54
+ view,
55
+ }),
56
+ headers: { 'Content-Type': 'application/json' },
57
+ method: 'POST',
58
+ });
59
+ return parseApiResponse(response, 'Failed to query base');
60
+ }
61
+
62
+ async exportBaseCsv({
63
+ activeFilePath = '',
64
+ path = '',
65
+ search = '',
66
+ source = null,
67
+ sourcePath = '',
68
+ view = '',
69
+ } = {}) {
70
+ const response = await fetch(resolveApiUrl('/base/export'), {
71
+ body: JSON.stringify({
72
+ activeFilePath,
73
+ path,
74
+ search,
75
+ source,
76
+ sourcePath,
77
+ view,
78
+ }),
79
+ headers: { 'Content-Type': 'application/json' },
80
+ method: 'POST',
81
+ });
82
+ if (!response.ok) {
83
+ const payload = await response.json().catch(() => ({}));
84
+ throw new Error(payload.error || 'Failed to export base CSV');
85
+ }
86
+
87
+ return {
88
+ blob: await response.blob(),
89
+ contentDisposition: response.headers.get('content-disposition') || '',
90
+ };
91
+ }
92
+
39
93
  async createFile({ content, path, requestId = null }) {
40
94
  const response = await fetch(resolveApiUrl('/file'), {
41
95
  body: JSON.stringify({ content, path }),
@@ -378,6 +378,18 @@ export function appShellTemplate() {
378
378
  <div class="pane-header">
379
379
  <span class="pane-label">Preview</span>
380
380
  <div class="pane-header-actions">
381
+ <div id="backlinksHeaderPanel" class="backlinks-panel backlinks-panel-header hidden" data-backlinks-variant="header">
382
+ <button type="button" class="backlinks-header" aria-expanded="false">
383
+ <svg class="backlinks-chevron" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
384
+ <polyline points="9 18 15 12 9 6"></polyline>
385
+ </svg>
386
+ <span class="backlinks-toggle">0 Linked Mentions</span>
387
+ <span class="backlinks-count"></span>
388
+ </button>
389
+ <div class="backlinks-body" aria-hidden="true" inert>
390
+ <div class="backlinks-list"></div>
391
+ </div>
392
+ </div>
381
393
  <button class=${buttonClassNames({ variant: 'ghost', size: 'compact', toggle: true, extra: 'hidden' })} id="commentsToggle" aria-label="Toggle comments" title="Toggle comments">
382
394
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
383
395
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>